gameMethod.js 397 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/common/gameMethod.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, '759dfgRoXNKsKzb4lS9Dfkm', 'gameMethod');
  13. // script/common/gameMethod.ts
  14. "use strict";
  15. Object.defineProperty(exports, "__esModule", { value: true });
  16. exports.SeedRand = exports.gameMethod = void 0;
  17. var gameCfg_1 = require("./gameCfg");
  18. var gezi = [
  19. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
  20. 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
  21. ];
  22. var GameMethod = /** @class */ (function () {
  23. function GameMethod() {
  24. }
  25. /**
  26. * 钻石购买金币获得道具公式
  27. * @param id 配置表档位ID
  28. * @param level 角色等级
  29. */
  30. GameMethod.prototype.shopCoinItem = function (id, level) {
  31. var cfg = gameCfg_1.default.shopCoin.getItem(id);
  32. if (cfg == null) {
  33. return [1, 2, 1];
  34. }
  35. var count = cfg.rate * Math.min(10 + Math.floor(level / 10), 50);
  36. return [1, 2, count];
  37. };
  38. /**
  39. * 两个对象合并
  40. * @param obj1 from object
  41. * @param obj2 to object
  42. * @return obj2
  43. */
  44. GameMethod.prototype.objMerge = function (obj1, obj2) {
  45. obj1 = typeof obj1 != "object" ? {} : obj1;
  46. obj2 = typeof obj2 != "object" ? {} : obj2;
  47. for (var key in obj2) {
  48. if (obj1[key] == null) {
  49. obj1[key] = obj2[key];
  50. continue;
  51. }
  52. if (typeof obj2[key] == "object") {
  53. this.objMerge(obj1[key], obj2[key]);
  54. continue;
  55. }
  56. obj1[key] = obj2[key];
  57. }
  58. return obj1; //然后在把复制好的对象给return出去
  59. };
  60. /**
  61. * 两个对象合并 值相加
  62. */
  63. GameMethod.prototype.objMergeNum = function (_eps1, _eps2) {
  64. var eps = this.objCopy(_eps1);
  65. var ep2 = this.objCopy(_eps2);
  66. for (var key in ep2) {
  67. if (eps[key] == null) {
  68. eps[key] = 0;
  69. }
  70. eps[key] += ep2[key];
  71. }
  72. return eps;
  73. };
  74. /**
  75. * 数组合并
  76. */
  77. GameMethod.prototype.addArr = function (arr1, arr2) {
  78. var _arr1 = JSON.parse(JSON.stringify(arr1));
  79. var _arr2 = JSON.parse(JSON.stringify(arr2));
  80. for (var _i = 0, _arr2_1 = _arr2; _i < _arr2_1.length; _i++) {
  81. var arr = _arr2_1[_i];
  82. _arr1.push(arr);
  83. }
  84. return _arr1;
  85. };
  86. /**
  87. * 业务判空 以下情况返回true
  88. * 字符串 : 空字符的为空
  89. * 数值: 0 为空 负数不为空
  90. * 数组: 长度为0
  91. * 对象: 没有节点
  92. * 布尔型 false
  93. */
  94. GameMethod.prototype.isEmpty = function (value) {
  95. if (value == null) {
  96. return true;
  97. }
  98. switch (typeof value) {
  99. case "string":
  100. if (value.length == null || value.length <= 0) {
  101. return true;
  102. }
  103. break;
  104. case "object":
  105. if (Object.keys(value).length > 0) {
  106. return false;
  107. }
  108. return true;
  109. case "number":
  110. if (value == 0) {
  111. return true;
  112. }
  113. break;
  114. case "boolean":
  115. if (value == false) {
  116. return true;
  117. }
  118. break;
  119. }
  120. return false;
  121. };
  122. /**
  123. * 通用深拷贝函数。
  124. * @param obj from object
  125. * @return obj2
  126. */
  127. GameMethod.prototype.objCopy = function (obj) {
  128. return JSON.parse(JSON.stringify(obj));
  129. };
  130. /**
  131. * 相同kind 和 itemid 数组合并
  132. */
  133. GameMethod.prototype.mergeArr = function (arrs) {
  134. var resObj = {};
  135. for (var _i = 0, arrs_1 = arrs; _i < arrs_1.length; _i++) {
  136. var arr = arrs_1[_i];
  137. if (resObj[arr[0]] == null) {
  138. resObj[arr[0]] = {};
  139. }
  140. if (resObj[arr[0]][arr[1]] == null) {
  141. resObj[arr[0]][arr[1]] = 0;
  142. }
  143. resObj[arr[0]][arr[1]] += arr[2];
  144. }
  145. var resArr = [];
  146. for (var kind in resObj) {
  147. for (var id in resObj[kind]) {
  148. resArr.push([parseInt(kind), parseInt(id), resObj[kind][id]]);
  149. }
  150. }
  151. return resArr;
  152. };
  153. // 判断字符长度
  154. GameMethod.prototype.getStrCharacterLength = function (str) {
  155. var patternChinese = new RegExp("[\u4E00-\u9FA5]+"); // 中文
  156. var leng = 0;
  157. for (var index = 0; index < str.length; index++) {
  158. if (patternChinese.test(str[index])) {
  159. leng += 2;
  160. }
  161. else {
  162. leng += 1;
  163. }
  164. }
  165. return leng;
  166. };
  167. /**
  168. * 随机数
  169. * @param min
  170. * @param max
  171. */
  172. GameMethod.prototype.rand = function (min, max) {
  173. return Math.round((max - min + 1) * Math.random() - 0.5) + min;
  174. };
  175. //判断uuid是否npc
  176. GameMethod.prototype.isNpc = function (fuuid) {
  177. if (Number(fuuid) < 10000) {
  178. return true;
  179. }
  180. return false;
  181. };
  182. GameMethod.prototype.hdDiZiModelRate = function (out, data, actDiZiList) {
  183. var rate = 0;
  184. var zRate = 0;
  185. for (var pzid in out.tree.list) {
  186. if (!data.list[pzid]) {
  187. console.error("hd_cfg_err:hdQiYuanModelRate: \u65E0\u6548\u7684\u54C1\u8D28ID " + pzid);
  188. continue;
  189. }
  190. for (var ygzid = 1; ygzid <= out.tree.list[pzid].open; ygzid++) {
  191. var _rate = 0;
  192. var _zRate = 0;
  193. var dzid = out.tree.list[pzid].dzList[ygzid];
  194. if (!dzid || !actDiZiList[dzid]) {
  195. _rate += Number(data.make["2"].item[0]);
  196. _zRate += Number(data.make["2"].zItem[0]);
  197. continue;
  198. }
  199. var dzInfo = actDiZiList[dzid];
  200. var cfgDzInfo = gameCfg_1.default.huobanBase.getItem(dzInfo.id);
  201. if (!cfgDzInfo) {
  202. continue;
  203. }
  204. var dzpinzhi = cfgDzInfo.pinzhi;
  205. // 等级加成
  206. for (var _i = 0, _a = data.make[dzpinzhi.toString()].levelItem; _i < _a.length; _i++) {
  207. var chanchu = _a[_i];
  208. if (chanchu[0] <= dzInfo.level && dzInfo.level <= chanchu[1]) {
  209. _rate += Number(chanchu[2]);
  210. break;
  211. }
  212. }
  213. for (var _b = 0, _c = data.make[dzpinzhi.toString()].levelZItem; _b < _c.length; _b++) {
  214. var chanchu = _c[_b];
  215. if (chanchu[0] <= dzInfo.level && dzInfo.level <= chanchu[1]) {
  216. _zRate += Number(chanchu[2]);
  217. break;
  218. }
  219. }
  220. // 星级加成
  221. for (var _d = 0, _e = data.make[dzpinzhi.toString()].starItem; _d < _e.length; _d++) {
  222. var chanchu = _e[_d];
  223. if (chanchu[0] <= dzInfo.star && dzInfo.star <= chanchu[1]) {
  224. _rate += Number(chanchu[2]);
  225. break;
  226. }
  227. }
  228. for (var _f = 0, _g = data.make[dzpinzhi.toString()].starZItem; _f < _g.length; _f++) {
  229. var chanchu = _g[_f];
  230. if (chanchu[0] <= dzInfo.star && dzInfo.star <= chanchu[1]) {
  231. _zRate += Number(chanchu[2]);
  232. break;
  233. }
  234. }
  235. if (Number(cfgDzInfo.liupai) === Number(pzid)) {
  236. _rate *= Number(data.make[dzpinzhi.toString()].item[2]);
  237. _zRate *= Number(data.make[dzpinzhi.toString()].zItem[2]);
  238. }
  239. else {
  240. _rate *= Number(data.make[dzpinzhi.toString()].item[1]);
  241. _zRate *= Number(data.make[dzpinzhi.toString()].zItem[1]);
  242. }
  243. rate += _rate;
  244. zRate += _zRate;
  245. }
  246. }
  247. return { rate: rate, zRate: zRate };
  248. };
  249. //根据速度和 当前XX 计算出当前总积分 兽灵
  250. GameMethod.prototype.hdDiZiModelTotol = function (out, data, rate, zRate, nowTime) {
  251. //过了多长时间
  252. var dtime = nowTime - out.tree.s_time;
  253. //根据速度 掉落
  254. //现在改为限制产出时间,而不是限制产出数量
  255. dtime = Math.min(dtime, data.tree.scoreTimeMax);
  256. var score = Math.round((rate * dtime) / 3600);
  257. var totol = score + out.tree.s_num;
  258. var zScore = Math.round((zRate * dtime) / 3600);
  259. var zTotal = zScore + out.tree.z_num;
  260. // if (totol > data.tree.scoreMax) {
  261. // //实际产出
  262. // let sj = data.tree.scoreMax - out.tree.s_num;
  263. // //实际产出 所需时间
  264. // dtime = Math.round((sj / rate) * 3600);
  265. // //获得的总产出
  266. // totol = data.tree.scoreMax;
  267. // }
  268. //根据速率 结算
  269. return {
  270. totol: totol,
  271. zTotal: zTotal,
  272. dtime: dtime,
  273. };
  274. };
  275. /**
  276. * 计算心魔积分范围
  277. */
  278. GameMethod.prototype.hdShouLingScore = function (xmId, cfg, actShouLing, gzids) {
  279. if (actShouLing === void 0) { actShouLing = {}; }
  280. if (gzids === void 0) { gzids = []; }
  281. var shoulingCfg = cfg.shouling[xmId];
  282. if (shoulingCfg == null) {
  283. console.error("xmId_err :" + xmId);
  284. return [0, 0];
  285. }
  286. //初始积分: 心魔积分
  287. var scores = [shoulingCfg.score[0], shoulingCfg.score[1]];
  288. for (var i = 0; i < gzids.length; i++) {
  289. var gzid = gzids[i];
  290. var addOne = exports.gameMethod.hdShouLingScoreOne(cfg, actShouLing, gzid);
  291. scores[0] += addOne[0];
  292. scores[1] += addOne[1];
  293. }
  294. return scores;
  295. };
  296. /**
  297. * 心魔计算 一个宠物加的积分
  298. */
  299. GameMethod.prototype.hdShouLingScoreOne = function (cfg, slinfo, gzid) {
  300. //初始积分: 心魔积分
  301. var sadd = [0, 0];
  302. //是否存在
  303. if (slinfo[gzid] == null) {
  304. console.error("fzInfo_null :" + gzid);
  305. return sadd;
  306. }
  307. //获取法阵等级配置
  308. var cfgsl = gameCfg_1.default.shoulingInfo.getItem(slinfo[gzid].slid);
  309. if (cfgsl == null) {
  310. console.error("cfgsl_null :" + gzid);
  311. return sadd;
  312. }
  313. //等级积分累加
  314. if (cfg.sMath[cfgsl.pinzhi.toString()] != null) {
  315. //[积分价值,积分下限,积分上限,系数下限,系数上限]
  316. var pzcfg = cfg.sMath[cfgsl.pinzhi.toString()];
  317. //积分价值
  318. sadd[0] += pzcfg.xishu[0];
  319. sadd[1] += pzcfg.xishu[0];
  320. //积分上下限
  321. sadd[0] += pzcfg.xishu[1];
  322. sadd[1] += pzcfg.xishu[2];
  323. //积分系数 * 等级(saveId)
  324. sadd[0] += slinfo[gzid].level * pzcfg.xishu[3];
  325. sadd[1] += slinfo[gzid].level * pzcfg.xishu[4];
  326. //积分系数 * 星级(saveId)
  327. sadd[0] += slinfo[gzid].star * pzcfg.xishu[5];
  328. sadd[1] += slinfo[gzid].star * pzcfg.xishu[6];
  329. }
  330. return sadd;
  331. };
  332. /**
  333. * 计算灵脉积分产出
  334. */
  335. GameMethod.prototype.lingMaiScore = function (jingjieId, chenghaoId) {
  336. var cfgBase = gameCfg_1.default.mathInfo.getItem("lingmai_base_score");
  337. if (cfgBase == null || cfgBase.pram == null || cfgBase.pram.count == null) {
  338. return 0;
  339. }
  340. //计算境界加成
  341. var jingjieAdd = 0;
  342. var jingjieCfg = gameCfg_1.default.jingjieStep.getItem(jingjieId);
  343. if (jingjieCfg != null) {
  344. jingjieAdd = jingjieCfg.lmjc;
  345. }
  346. //计算称号加成
  347. var titleAdd = 0;
  348. var titleCfg = gameCfg_1.default.chenghaoInfo.getItem(chenghaoId);
  349. if (titleCfg != null) {
  350. titleAdd = titleCfg.jc;
  351. }
  352. //初始积分: 心魔积分
  353. var scores = Math.round(cfgBase.pram.count * (1 + jingjieAdd / 100) * (1 + titleAdd / 100));
  354. return scores;
  355. };
  356. //--------------属性计算 (主角基础属性 ) -------------------------
  357. // (天赋数值+装备数值+基础属性)*(1+百分比加成)=面板属性
  358. /**
  359. * 属性合并
  360. */
  361. GameMethod.prototype.ep_merge = function (_eps1, _eps2) {
  362. var eps = this.objCopy(_eps1);
  363. var ep2 = this.objCopy(_eps2);
  364. for (var key in ep2) {
  365. if (eps[key] == null) {
  366. eps[key] = 0;
  367. }
  368. eps[key] += ep2[key];
  369. }
  370. eps.hp = eps.hp_max || 0;
  371. return eps;
  372. };
  373. /**
  374. * {[key:string]:number} 属性合并 _eps2的key _eps1没有就不加
  375. */
  376. GameMethod.prototype.ep_mergeKv_has = function (_eps1, _eps2) {
  377. var eps = this.objCopy(_eps1);
  378. var ep2 = this.objCopy(_eps2);
  379. for (var key in ep2) {
  380. if (eps[key] == null) {
  381. continue;
  382. }
  383. eps[key] += ep2[key];
  384. }
  385. eps["hp"] = eps["hp_max"]; //不要删
  386. return eps;
  387. };
  388. /**
  389. * {[key:string]:number} 属性合并 x 系数
  390. */
  391. GameMethod.prototype.ep_KvRate = function (_eps1, rate) {
  392. var eps = this.objCopy(_eps1);
  393. for (var key in eps) {
  394. eps[key] = Math.floor(eps[key] * rate);
  395. }
  396. return eps;
  397. };
  398. /**
  399. * 属性初始化
  400. */
  401. GameMethod.prototype.ep_init = function () {
  402. var eps = {};
  403. var userEpPool = gameCfg_1.default.userEp.pool;
  404. for (var key in userEpPool) {
  405. eps[userEpPool[key].key] = 0;
  406. }
  407. return eps;
  408. };
  409. /**
  410. * 角色基础属性
  411. */
  412. GameMethod.prototype.ep_user = function () {
  413. var eps = {};
  414. var userEpPool = gameCfg_1.default.userEp.pool;
  415. for (var key in userEpPool) {
  416. eps[userEpPool[key].key] = userEpPool[key].initEp;
  417. }
  418. return eps;
  419. };
  420. /**
  421. * 属性展示总属性
  422. */
  423. GameMethod.prototype.ep_all_base = function (sevBack) {
  424. //属性初始化
  425. var eps = this.ep_init();
  426. //+角色基础属性
  427. eps = this.ep_merge(eps, this.ep_user());
  428. //后端记录的属性
  429. if (sevBack.actEps != null && sevBack.actEps.a != null) {
  430. for (var kid in sevBack.actEps.a) {
  431. eps = exports.gameMethod.ep_merge(eps, sevBack.actEps.a[kid]);
  432. }
  433. }
  434. eps["hp"] = Math.round(eps["hp"]);
  435. eps["atk"] = Math.round(eps["atk"]);
  436. eps["def"] = Math.round(eps["def"]);
  437. return exports.gameMethod.objCopy(eps);
  438. };
  439. /**
  440. * 属性展示总属性 (面板属性)
  441. * 面板属性 = 角色基础属性
  442. */
  443. GameMethod.prototype.ep_all = function (sevBack) {
  444. var eps = this.ep_all_base(sevBack);
  445. //攻速
  446. eps.speed += Math.floor((eps.speed * eps.speed_per) / 10000);
  447. //攻击
  448. eps.atk += Math.floor((eps.atk * eps.atk_per) / 10000);
  449. eps.atk += Math.floor((eps.atk * eps.finally_atk_per) / 10000);
  450. //防御
  451. eps.def += Math.floor((eps.def * eps.def_per) / 10000);
  452. eps.def += Math.floor((eps.def * eps.finally_def_per) / 10000);
  453. //血量
  454. eps.hp_max += Math.floor((eps.hp_max * eps.hp_max_per) / 10000);
  455. eps.hp_max += Math.floor((eps.hp_max * eps.finally_hp_max_per) / 10000);
  456. eps.hp = eps.hp_max;
  457. //攻速
  458. eps.speed_per = 0;
  459. //攻击
  460. eps.atk_per = 0;
  461. eps.finally_atk_per = 0;
  462. //防御
  463. eps.def_per = 0;
  464. eps.finally_def_per = 0;
  465. //血量
  466. eps.hp_max_per = 0;
  467. eps.finally_hp_max_per = 0;
  468. return exports.gameMethod.objCopy(eps);
  469. };
  470. /**
  471. * 属性展示总属性 (面板属性)
  472. * 面板属性 = 角色基础属性
  473. */
  474. GameMethod.prototype.ep_all_fight = function (eps) {
  475. eps = exports.gameMethod.objCopy(eps);
  476. //攻速
  477. eps.speed += Math.floor((eps.speed * eps.speed_per) / 10000);
  478. //攻击
  479. eps.atk += Math.floor((eps.atk * eps.atk_per) / 10000);
  480. eps.atk += Math.floor((eps.atk * eps.finally_atk_per) / 10000);
  481. eps.atk += eps.finally_atk;
  482. //防御
  483. eps.def += Math.floor((eps.def * eps.def_per) / 10000);
  484. eps.def += Math.floor((eps.def * eps.finally_def_per) / 10000);
  485. eps.def += eps.finally_def;
  486. //血量
  487. eps.hp_max += Math.floor((eps.hp_max * eps.hp_max_per) / 10000);
  488. eps.hp_max += Math.floor((eps.hp_max * eps.finally_hp_max_per) / 10000);
  489. eps.hp_max += eps.finally_hp_max;
  490. eps.hp = eps.hp_max;
  491. //攻速
  492. eps.speed_per = 0;
  493. //攻击
  494. eps.atk_per = 0;
  495. eps.finally_atk_per = 0;
  496. eps.finally_atk = 0;
  497. //防御
  498. eps.def_per = 0;
  499. eps.finally_def_per = 0;
  500. eps.finally_def = 0;
  501. //血量
  502. eps.hp_max_per = 0;
  503. eps.finally_hp_max_per = 0;
  504. eps.finally_hp_max = 0;
  505. return eps;
  506. };
  507. /**
  508. * 属性展示总属性 (面板属性)显示最终属性
  509. */
  510. GameMethod.prototype.ep_all_zz = function (eps) {
  511. eps = exports.gameMethod.objCopy(eps);
  512. //攻击
  513. var atk = eps.atk;
  514. atk += eps.atk_per ? Math.floor((atk * eps.atk_per) / 10000) : 0;
  515. atk += eps.finally_atk_per ? Math.floor((atk * eps.finally_atk_per) / 10000) : 0;
  516. atk += eps.finally_atk;
  517. //防御
  518. var def = eps.def;
  519. def += eps.def_per ? Math.floor((def * eps.def_per) / 10000) : 0;
  520. def += eps.finally_def_per ? Math.floor((def * eps.finally_def_per) / 10000) : 0;
  521. def += eps.finally_def;
  522. //血量
  523. var hp_max = eps.hp_max;
  524. hp_max += eps.hp_max_per ? Math.floor((hp_max * eps.hp_max_per) / 10000) : 0;
  525. hp_max += eps.finally_hp_max_per ? Math.floor((hp_max * eps.finally_hp_max_per) / 10000) : 0;
  526. hp_max += eps.finally_hp_max;
  527. return {
  528. "finally_atk": atk,
  529. "finally_def": def,
  530. "finally_hp_max": hp_max,
  531. };
  532. };
  533. /**
  534. * 主角战斗属性
  535. */
  536. GameMethod.prototype.ep_fight = function (sevBack) {
  537. var eps = this.ep_all(sevBack);
  538. //攻速
  539. eps.speed_per = 0;
  540. //攻击
  541. eps.atk_per = 0;
  542. eps.finally_atk_per = 0;
  543. //防御
  544. eps.def_per = 0;
  545. eps.finally_def_per = 0;
  546. //血量
  547. eps.hp_max_per = 0;
  548. eps.finally_hp_max_per = 0;
  549. return eps;
  550. };
  551. /**
  552. * 弟子战斗属性
  553. * @param dzInfo 弟子信息
  554. * @param eps 主角属性
  555. * @returns
  556. */
  557. GameMethod.prototype.ep_fight_dizi = function (dzInfo, epsAll) {
  558. var dzEps = exports.gameMethod.ep_init(); //初始化属性
  559. var cfgdz = gameCfg_1.default.huobanBase.getItem(dzInfo.id);
  560. if (cfgdz == null) {
  561. return dzEps;
  562. }
  563. var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString());
  564. if (cfgZhongZu == null) {
  565. return dzEps;
  566. }
  567. dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps);
  568. for (var key in cfgZhongZu.inherit_attr) {
  569. //继承主角属性
  570. dzEps[key] += Math.floor((epsAll[key] * cfgZhongZu.inherit_attr[key]) / 10000);
  571. }
  572. for (var key in cfgZhongZu.inherit_attr_hide) {
  573. //继承主角属性
  574. dzEps[key] += Math.floor((epsAll[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000);
  575. }
  576. dzEps.hp = dzEps.hp_max;
  577. return dzEps;
  578. };
  579. /**
  580. * 阵法
  581. */
  582. GameMethod.prototype.ep_zhenfa = function (actZhenfa) {
  583. var eps = {};
  584. var chuanKeys = Object.keys(actZhenfa.chuan);
  585. for (var i = 0; i < chuanKeys.length; i++) {
  586. var buwei = chuanKeys[i];
  587. //装备属性
  588. eps = this.ep_merge(eps, actZhenfa.chuan[buwei].eps);
  589. //附魔属性
  590. var addEps = {};
  591. for (var _i = 0, _a = actZhenfa.chuan[buwei].fmEps; _i < _a.length; _i++) {
  592. var fmEps = _a[_i];
  593. if (addEps[fmEps[0]] == null) {
  594. addEps[fmEps[0]] = 0;
  595. }
  596. addEps[fmEps[0]] += fmEps[1];
  597. }
  598. // 洗练属性
  599. for (var posId in actZhenfa.chuan[buwei].xilianEps) {
  600. if (actZhenfa.chuan[buwei].xilianEps[posId].id == null || actZhenfa.chuan[buwei].xilianEps[posId].id == "") {
  601. continue;
  602. }
  603. var xilian_c = gameCfg_1.default.zhenfaXilianWord.getItem(actZhenfa.chuan[buwei].xilianEps[posId].id);
  604. if (xilian_c != null) {
  605. eps = this.ep_merge(eps, xilian_c.attr);
  606. }
  607. }
  608. eps = this.ep_merge(eps, addEps);
  609. }
  610. return eps;
  611. };
  612. /**
  613. * 阵法
  614. */
  615. GameMethod.prototype.ep_zhenfa_list = function (actZhenfa) {
  616. var eps = {};
  617. // 阵法New
  618. var keys = Object.keys(actZhenfa.zfList);
  619. for (var i = 0; i < keys.length; i++) {
  620. var zfBase = gameCfg_1.default.zfxtZfbase.getItem(keys[i]);
  621. if (zfBase != null) {
  622. var zfShengji = gameCfg_1.default.zfxtZfshengji.getItem(zfBase.pinzhi, actZhenfa.zfList[keys[i]].level.toString());
  623. if (zfShengji != null) {
  624. eps = this.ep_merge(eps, zfShengji.attr);
  625. }
  626. }
  627. }
  628. return eps;
  629. };
  630. /**
  631. * 大帝古字
  632. */
  633. GameMethod.prototype.ep_dadiguzi = function (actDadiGuzi, mfList) {
  634. var eps = {};
  635. var keys = Object.keys(actDadiGuzi.mpList[actDadiGuzi.mpXhid]);
  636. for (var i = 0; i < keys.length; i++) {
  637. var buwei = keys[i];
  638. if (exports.gameMethod.isEmpty(actDadiGuzi.mpList[actDadiGuzi.mpXhid][buwei]) == true) {
  639. continue;
  640. }
  641. eps = this.ep_merge(eps, actDadiGuzi.mpList[actDadiGuzi.mpXhid][buwei].eps);
  642. }
  643. //上阵列表
  644. var szMfids = [];
  645. var mfZhanKeys = Object.keys(actDadiGuzi.mfZhan);
  646. for (var i = 0; i < mfZhanKeys.length; i++) {
  647. var _type = mfZhanKeys[i];
  648. if (actDadiGuzi.mfZhan[_type] == "") {
  649. continue;
  650. }
  651. szMfids.push(actDadiGuzi.mfZhan[_type]);
  652. }
  653. //仙法 + 铭文
  654. var mfListKeys = Object.keys(mfList);
  655. for (var i = 0; i < mfListKeys.length; i++) {
  656. var mfid = mfListKeys[i];
  657. var cfgXfInfo = gameCfg_1.default.dadiguziXfinfo.getItem(mfid);
  658. if (cfgXfInfo == null) {
  659. continue;
  660. }
  661. var cfg = gameCfg_1.default.dadiguziXflv.getItem(cfgXfInfo.pinzhi.toString(), mfList[mfid].level.toString());
  662. if (cfg != null) {
  663. if (eps["hp_max"] == null) {
  664. eps["hp_max"] = 0;
  665. }
  666. if (eps["atk"] == null) {
  667. eps["atk"] = 0;
  668. }
  669. if (eps["def"] == null) {
  670. eps["def"] = 0;
  671. }
  672. eps["hp_max"] += cfg.hp_max;
  673. eps["atk"] += cfg.atk;
  674. eps["def"] += cfg.def;
  675. }
  676. if (szMfids.indexOf(mfid) == -1) {
  677. continue; //没上阵 不加铭文属性
  678. }
  679. for (var _i = 0, _a = mfList[mfid].mwLock; _i < _a.length; _i++) {
  680. var mwid = _a[_i];
  681. if (mwid == null || mwid == "") {
  682. continue;
  683. }
  684. var cfgMw = gameCfg_1.default.dadiguziMingwen.getItem(mwid);
  685. if (cfgMw != null) {
  686. eps = this.ep_merge(eps, cfgMw.eps);
  687. }
  688. }
  689. }
  690. //图鉴
  691. var tjlistKeys = Object.keys(actDadiGuzi.tjlist);
  692. for (var i = 0; i < tjlistKeys.length; i++) {
  693. var _key = tjlistKeys[i];
  694. var cfgtjNew = gameCfg_1.default.dadiguziXftj.getItem(_key, actDadiGuzi.tjlist[_key].toString());
  695. if (cfgtjNew == null) {
  696. continue;
  697. }
  698. eps = this.ep_merge(eps, cfgtjNew.eps);
  699. }
  700. return eps;
  701. };
  702. /**
  703. * 计算弟子全局属性 弟子加成只有突破属性和图鉴加成
  704. */
  705. GameMethod.prototype.ep_dizi_base = function (actDiZi, actDiZiList) {
  706. var eps = {};
  707. var dzListKeys = Object.keys(actDiZiList);
  708. for (var i = 0; i < dzListKeys.length; i++) {
  709. var dzid = dzListKeys[i];
  710. //计算弟子阶级属性
  711. var dizi = actDiZiList[dzid];
  712. // let num = dizi.level % 5;
  713. var diZiStar_c = gameCfg_1.default.huobanStar.getItem(dzid, dizi.star.toString());
  714. if (diZiStar_c != null) {
  715. for (var i_1 = 0; i_1 <= Number(diZiStar_c.star); i_1++) {
  716. var cfgStep = gameCfg_1.default.huobanStar.getItem(dzid, i_1.toString());
  717. if (cfgStep != null) {
  718. var stepEps = cfgStep.attr;
  719. eps = this.ep_merge(eps, stepEps);
  720. }
  721. }
  722. }
  723. }
  724. //计算弟子图鉴属性
  725. var tujianKeys = Object.keys(actDiZi.tujian);
  726. for (var i = 0; i < tujianKeys.length; i++) {
  727. var tujianKey = tujianKeys[i];
  728. var diziTuJian_c = gameCfg_1.default.huobanTujian.getItem(tujianKey, actDiZi.tujian[tujianKey].toString());
  729. if (diziTuJian_c == null) {
  730. continue;
  731. }
  732. eps = this.ep_merge(eps, diziTuJian_c.attr);
  733. }
  734. //皮肤属性
  735. for (var i = 0; i < dzListKeys.length; i++) {
  736. var dzid = dzListKeys[i];
  737. var dizi = actDiZiList[dzid];
  738. if (!actDiZiList[dzid].skins) {
  739. continue;
  740. }
  741. for (var key in actDiZiList[dzid].skins) {
  742. var level = actDiZiList[dzid].skins[key].level;
  743. var skinCfg = gameCfg_1.default.huobanSkinlevel.getItem(key, level.toString());
  744. if (skinCfg) {
  745. eps = this.ep_merge(eps, skinCfg.levelEps);
  746. }
  747. }
  748. }
  749. return eps;
  750. };
  751. GameMethod.prototype.ep_shouling_shengxiao = function (actShouLingList) {
  752. var shoulingList = {};
  753. var gzList = {};
  754. var listKeys = Object.keys(actShouLingList);
  755. for (var i = 0; i < listKeys.length; i++) {
  756. var index = listKeys[i];
  757. if (actShouLingList[index] != null && exports.gameMethod.isEmpty(actShouLingList[index].slid) == false) {
  758. var slid = actShouLingList[index].slid;
  759. var eps = this.ep_shouling_gezi(actShouLingList[index]);
  760. var zhanli = eps["hp_max_per"];
  761. var existingZhanli = shoulingList[slid];
  762. if (existingZhanli === undefined || zhanli > existingZhanli) {
  763. shoulingList[slid] = zhanli;
  764. gzList[slid] = index;
  765. }
  766. }
  767. }
  768. var gzIdlist = [];
  769. var gzListKeys = Object.keys(gzList);
  770. for (var i = 0; i < gzListKeys.length; i++) {
  771. gzIdlist.push(gzList[gzListKeys[i]]);
  772. }
  773. return gzIdlist;
  774. };
  775. /**
  776. * 计算兽灵总属性加成
  777. */
  778. GameMethod.prototype.ep_shouling = function (actShouLingList, actShouLing, jiuxiao) {
  779. if (jiuxiao === void 0) { jiuxiao = 0; }
  780. var eps = {};
  781. //计算兽灵属性总加成(不包含技能)
  782. var shoulingList = {};
  783. var gzList = {};
  784. //遍历出最高属性的兽灵的格子id
  785. var listKeys = Object.keys(actShouLingList);
  786. for (var i = 0; i < listKeys.length; i++) {
  787. var index = listKeys[i];
  788. if (actShouLingList[index] != null && exports.gameMethod.isEmpty(actShouLingList[index].slid) == false) {
  789. var slid = actShouLingList[index].slid;
  790. var eps_1 = this.ep_shouling_gezi(actShouLingList[index]);
  791. var zhanli = eps_1["hp_max_per"];
  792. var existingZhanli = shoulingList[slid];
  793. if (existingZhanli === undefined || zhanli > existingZhanli) {
  794. shoulingList[slid] = zhanli;
  795. gzList[slid] = index;
  796. }
  797. }
  798. }
  799. var gzListKeys = Object.keys(gzList);
  800. for (var i = 0; i < gzListKeys.length; i++) {
  801. var gz = gzListKeys[i];
  802. if (exports.gameMethod.isEmpty(gzList[gz]) == false) {
  803. eps = this.ep_merge(eps, this.ep_shouling_gezi(actShouLingList[gzList[gz]], jiuxiao));
  804. }
  805. }
  806. //羁绊属性加成
  807. var jiban = actShouLing.jiban;
  808. var jibanKeys = Object.keys(actShouLing.jiban);
  809. for (var i = 0; i < jibanKeys.length; i++) {
  810. var jbid = jibanKeys[i];
  811. if (exports.gameMethod.isEmpty(jiban[jbid].level)) {
  812. continue;
  813. }
  814. var cfgJiBan = gameCfg_1.default.shoulingJiban.getItem(jbid, jiban[jbid].level.toString());
  815. if (cfgJiBan == null || cfgJiBan.eps == null) {
  816. continue;
  817. }
  818. eps = this.ep_merge(eps, cfgJiBan.eps);
  819. }
  820. //上阵兽灵被动属性加成
  821. var useGzIdKeys = Object.keys(actShouLing.useGzId);
  822. for (var i = 0; i < useGzIdKeys.length; i++) {
  823. var useGzId = useGzIdKeys[i];
  824. var skBdeps = {};
  825. var gzid = actShouLing.useGzId[useGzId];
  826. if (gzid == null || gzid == "") {
  827. continue;
  828. }
  829. var shouling = actShouLingList[gzid];
  830. if (shouling == null) {
  831. continue;
  832. }
  833. var cfg = gameCfg_1.default.shoulingInfo.getItem(shouling.slid);
  834. if (cfg == null) {
  835. continue;
  836. }
  837. var pinzhiCfg = gameCfg_1.default.shoulingPinzhi.getItem(cfg.pinzhi);
  838. if (pinzhiCfg == null) {
  839. continue;
  840. }
  841. //主站
  842. if (useGzId == "0") {
  843. var skBdKeys = Object.keys(shouling.skBd);
  844. for (var i_2 = 0; i_2 < skBdKeys.length; i_2++) {
  845. var caoId = skBdKeys[i_2];
  846. var skill = shouling.skBd[caoId];
  847. var cfgEffect = gameCfg_1.default.shoulingBeidong.getItem(skill.skillId.toString());
  848. if (cfgEffect == null) {
  849. continue;
  850. }
  851. var newEps = {};
  852. newEps[cfgEffect.type] = cfgEffect.esp[skill.lv - 1];
  853. skBdeps = this.ep_merge(skBdeps, newEps);
  854. }
  855. }
  856. else {
  857. var skBdKeys = Object.keys(shouling.skBd);
  858. for (var i_3 = 0; i_3 < skBdKeys.length; i_3++) {
  859. var caoId = skBdKeys[i_3];
  860. var skill = shouling.skBd[caoId];
  861. var cfgEffect = gameCfg_1.default.shoulingBeidong.getItem(skill.skillId.toString());
  862. if (cfgEffect == null) {
  863. continue;
  864. }
  865. var newEps = {};
  866. newEps[cfgEffect.type] = cfgEffect.esp[skill.lv - 1];
  867. var bdEps = exports.gameMethod.objCopy(newEps);
  868. var bdEpsKeys = Object.keys(bdEps);
  869. for (var i_4 = 0; i_4 < bdEpsKeys.length; i_4++) {
  870. var key = bdEpsKeys[i_4];
  871. bdEps[key] = Math.round((bdEps[key] * pinzhiCfg.skOdds) / 100);
  872. }
  873. skBdeps = this.ep_merge(skBdeps, bdEps);
  874. }
  875. }
  876. eps = this.ep_merge(eps, skBdeps);
  877. }
  878. return eps;
  879. };
  880. /**
  881. * 单个道友的属性
  882. */
  883. GameMethod.prototype.ep_daoyou = function (daoyou) {
  884. var eps = {};
  885. for (var one in daoyou.daoyouMap) {
  886. var dyid = daoyou.daoyouMap[one].did;
  887. var level = daoyou.daoyouMap[one].favorLv;
  888. var skkills = daoyou.daoyouMap[one].skill;
  889. //计算等级属性加成
  890. for (var i = 1; i <= level; i++) {
  891. var cfg = gameCfg_1.default.daoyouFavorLv.getItem(dyid, i.toString());
  892. if (cfg != null) {
  893. eps = this.ep_merge(eps, cfg.eps);
  894. }
  895. }
  896. //计算技能属性加成
  897. for (var _i = 0, skkills_1 = skkills; _i < skkills_1.length; _i++) {
  898. var sk = skkills_1[_i];
  899. var cfgSkill = gameCfg_1.default.daoyouSkillLv.getItem(sk.toString());
  900. if (cfgSkill != null) {
  901. var cfgSkillType = gameCfg_1.default.daoyouSkillType.getItem(cfgSkill.sid);
  902. if (cfgSkillType != null && cfgSkillType.type == 2) {
  903. for (var _a = 0, _b = Object.keys(cfgSkillType.param); _a < _b.length; _a++) {
  904. var key = _b[_a];
  905. var num = cfgSkill.value[Object.keys(cfgSkillType.param).indexOf(key)];
  906. cfgSkillType.param[key] = num;
  907. }
  908. eps = this.ep_merge(eps, cfgSkillType.param);
  909. }
  910. }
  911. }
  912. }
  913. return eps;
  914. };
  915. /**
  916. * 单个法宝的属性
  917. */
  918. GameMethod.prototype.ep_fabao = function (actFaBao) {
  919. var eps = {};
  920. for (var _i = 0, _a = Object.values(actFaBao.fabaoList); _i < _a.length; _i++) {
  921. var fabao = _a[_i];
  922. // 基础属性
  923. var cfgFbInfo = gameCfg_1.default.fabaoInfo.getItem(fabao.fbId);
  924. if (cfgFbInfo != null) {
  925. eps = this.ep_merge(eps, cfgFbInfo.attributes);
  926. }
  927. // 升级属性
  928. for (var _b = 0, _c = Object.values(gameCfg_1.default.fabaoUplevel.pool); _b < _c.length; _b++) {
  929. var cfg = _c[_b];
  930. if (cfg.id.toString() === fabao.fbId && cfg.level <= fabao.level) {
  931. eps = this.ep_merge(eps, cfg.attributes);
  932. }
  933. }
  934. // 升星属性
  935. for (var _d = 0, _e = Object.values(gameCfg_1.default.fabaoUpstar.pool); _d < _e.length; _d++) {
  936. var cfg = _e[_d];
  937. if (cfg.id.toString() === fabao.fbId && cfg.level <= fabao.star) {
  938. eps = this.ep_merge(eps, cfg.attributes);
  939. }
  940. }
  941. }
  942. return eps;
  943. };
  944. /**
  945. * 法宝羁绊的属性
  946. */
  947. GameMethod.prototype.ep_fabaoJiban = function (actFaBao) {
  948. var eps = {};
  949. var jibanListKeys = Object.keys(actFaBao.jibanList);
  950. for (var i = 0; i < jibanListKeys.length; i++) {
  951. var jbId = jibanListKeys[i];
  952. // 羁绊属性
  953. var cfgJbInfo = gameCfg_1.default.fabaoJiban.getItem(jbId, actFaBao.jibanList.star.toString());
  954. if (cfgJbInfo !== null) {
  955. eps = this.ep_merge(eps, cfgJbInfo.attributes);
  956. }
  957. }
  958. return eps;
  959. };
  960. /**
  961. * 当前境界的属性
  962. */
  963. GameMethod.prototype.ep_jingjie = function (actJingJie, jingjieId) {
  964. var eps = {};
  965. //突破后获得属性
  966. var pool = gameCfg_1.default.jingjieStep.pool;
  967. var maxLv = 0;
  968. for (var key in pool) {
  969. //境界属性(目标型)
  970. if (Number(jingjieId) == Number(pool[key].id)) {
  971. eps = this.ep_merge(eps, pool[key].tp_eps);
  972. }
  973. var addCount = 0;
  974. for (var i = maxLv + 1; i <= pool[key].maxlv; i++) {
  975. if (i > actJingJie.level) {
  976. break;
  977. }
  978. var cfg = gameCfg_1.default.jingjieLevel.getItem(i.toString());
  979. if (cfg == null) {
  980. continue;
  981. }
  982. //等级获得属性(目标型)
  983. if (i == actJingJie.level) {
  984. eps = this.ep_merge(eps, cfg.eps);
  985. }
  986. if (i == actJingJie.level) {
  987. addCount += Math.round(actJingJie.exp / cfg.exp[2]);
  988. }
  989. else {
  990. addCount += Math.round(cfg.needExp / cfg.exp[2]);
  991. }
  992. }
  993. //因为属性是3次一个循环
  994. // 计算每个 eps 的执行次数
  995. var eps1Count = Math.floor((addCount + 2) / 3); // eps1 应用的次数
  996. var eps2Count = Math.floor((addCount + 1) / 3); // eps2 应用的次数
  997. var eps3Count = Math.floor(addCount / 3); // eps3 应用的次数
  998. eps = this.ep_merge(eps, this.ep_KvRate(pool[key].eps1, eps1Count));
  999. eps = this.ep_merge(eps, this.ep_KvRate(pool[key].eps2, eps2Count));
  1000. eps = this.ep_merge(eps, this.ep_KvRate(pool[key].eps3, eps3Count));
  1001. maxLv = pool[key].maxlv;
  1002. if (maxLv >= actJingJie.level) {
  1003. break;
  1004. }
  1005. }
  1006. return eps;
  1007. };
  1008. /**
  1009. * 世家秘术
  1010. *
  1011. */
  1012. GameMethod.prototype.ep_clubMiShu = function (actClubMiShu) {
  1013. var eps = {};
  1014. // 世家筋骨
  1015. var jinGuKeys = Object.keys(actClubMiShu.jinGu);
  1016. for (var i = 0; i < jinGuKeys.length; i++) {
  1017. var type = jinGuKeys[i];
  1018. var lv = actClubMiShu.jinGu[type];
  1019. var cfg = gameCfg_1.default.clubMiShuJinGu.getItem(type, lv.toString());
  1020. if (cfg != null) {
  1021. eps = this.ep_merge(eps, cfg.eps);
  1022. }
  1023. }
  1024. // 世家秘术筋骨筋骨全等级达到 ,额外加成属性
  1025. var minLvKey = Object.keys(actClubMiShu.jinGu).reduce(function (pre, cur) {
  1026. if (actClubMiShu.jinGu[cur] < actClubMiShu.jinGu[pre]) {
  1027. return cur;
  1028. }
  1029. return pre;
  1030. });
  1031. var minLv1 = actClubMiShu.jinGu[minLvKey];
  1032. // 0,10,20,30...
  1033. var JinGuJc = gameCfg_1.default.clubMiShuJinGuJc.getItem((Math.floor(minLv1 / 10) * 10).toString());
  1034. if (JinGuJc != null) {
  1035. eps = this.ep_merge(eps, JinGuJc.eps);
  1036. }
  1037. // 世家经络
  1038. var jlList = actClubMiShu.jllist;
  1039. for (var jlid in jlList) {
  1040. var cfgJl = gameCfg_1.default.clubMiShuJingluo.getItem(jlid, jlList[jlid].level.toString());
  1041. if (cfgJl != null) {
  1042. eps = this.ep_merge(eps, cfgJl.addEp);
  1043. }
  1044. }
  1045. var cfgJlQ = gameCfg_1.default.clubMiShuJlquality.getItem(actClubMiShu.curJlQuality.toString());
  1046. if (cfgJlQ != null) {
  1047. eps = this.ep_merge(eps, cfgJlQ.qualityEp);
  1048. }
  1049. return eps;
  1050. };
  1051. /**
  1052. * 世家圣兵
  1053. *
  1054. */
  1055. GameMethod.prototype.ep_clubShengB = function (actClubShengB) {
  1056. var _a;
  1057. var eps = {};
  1058. // 获取当前方案的所有位置的词条
  1059. for (var posId in actClubShengB.plan[actClubShengB.curPlan]) {
  1060. // 获取词条配置
  1061. var cfg = gameCfg_1.default.clubShengBWord.getItem(actClubShengB.plan[actClubShengB.curPlan][posId].id);
  1062. if (cfg != null) {
  1063. // 算一下第一个属性的值
  1064. var n = cfg.attr[Object.keys(cfg.attr)[0]] + actClubShengB.plan[actClubShengB.curPlan][posId].range;
  1065. eps = this.ep_merge(eps, (_a = {}, _a[Object.keys(cfg.attr)[0]] = n, _a));
  1066. }
  1067. }
  1068. return eps;
  1069. };
  1070. /**
  1071. * 宗门-门徒
  1072. *
  1073. */
  1074. GameMethod.prototype.eps_zongMen_mentu = function (mentu, jiuxiao) {
  1075. var _a, _b;
  1076. if (jiuxiao === void 0) { jiuxiao = 0; }
  1077. var mentu_eps = {};
  1078. if (!mentu.basicAttr) {
  1079. return mentu_eps;
  1080. }
  1081. mentu_eps = mentu.basicAttr;
  1082. var _mentu = (_b = (_a = mentu.married) === null || _a === void 0 ? void 0 : _a[Object.keys(mentu.married)[0]]) === null || _b === void 0 ? void 0 : _b.mentuInfo;
  1083. if (_mentu && _mentu.basicAttr) {
  1084. // _mentu.basicAttr的值最多不超过mentu.basicAttr的300%
  1085. for (var key in _mentu.basicAttr) {
  1086. if (mentu.basicAttr[key] == null) {
  1087. mentu.basicAttr[key] = 0;
  1088. }
  1089. if (_mentu.basicAttr[key] == null) {
  1090. _mentu.basicAttr[key] = 0;
  1091. }
  1092. var nCfg = gameCfg_1.default.mathInfo.getItem("zongMen_add_basicAttr_limit");
  1093. if (nCfg != null && nCfg.pram != null && nCfg.pram.count != null) {
  1094. _mentu.basicAttr[key] = Math.min(Math.floor(mentu.basicAttr[key] * nCfg.pram.count), _mentu.basicAttr[key]);
  1095. }
  1096. }
  1097. mentu_eps = this.ep_merge(mentu_eps, _mentu.basicAttr);
  1098. }
  1099. return this.ep_KvRate(mentu_eps, 1 + jiuxiao);
  1100. };
  1101. /**
  1102. * 宗门
  1103. *
  1104. */
  1105. GameMethod.prototype.ep_zongMen = function (_actZongMenMentuLs1, _actZongMenMentuLs2, _actZongMen, showBasicAttr, jiuxiao) {
  1106. var _a, _b;
  1107. var _c, _d;
  1108. if (showBasicAttr === void 0) { showBasicAttr = true; }
  1109. if (jiuxiao === void 0) { jiuxiao = 0; }
  1110. // 记录基础
  1111. var eps = {};
  1112. // 记录委任的特殊属性
  1113. var speEps = {};
  1114. // 拷贝一份数据
  1115. var actZongMenMentuLs1 = exports.gameMethod.objCopy(_actZongMenMentuLs1);
  1116. var actZongMenMentuLs2 = exports.gameMethod.objCopy(_actZongMenMentuLs2);
  1117. var actZongMen = exports.gameMethod.objCopy(_actZongMen);
  1118. // 获取宗门等级配置
  1119. var zm_cfg = gameCfg_1.default.zongMenInfo.getItem(actZongMen.level.toString());
  1120. if (zm_cfg == null)
  1121. return eps;
  1122. // 委任加属性
  1123. for (var id in actZongMen.appointPos) {
  1124. var mentuId = actZongMen.appointPos[id].mentuId;
  1125. // 获取未结好的门徒信息
  1126. var mentu = actZongMen.mentu[mentuId] || actZongMenMentuLs1[mentuId];
  1127. // 如果获取不到门徒信息,说明是已经结好的门徒,从已结好的门徒列表中获取
  1128. // --------------------------------已经结好的门徒Start--------------------------------
  1129. if (mentu == null) {
  1130. // 结好的门徒有两个门徒,需要分别计算 一个是自己,一个是配偶
  1131. // 1. 特殊属性
  1132. //自己
  1133. mentu = actZongMenMentuLs2[mentuId];
  1134. if (mentu == null)
  1135. continue;
  1136. var speAttr1 = mentu.speAttr || [];
  1137. // 配偶
  1138. var _mentu = (_d = (_c = mentu.married) === null || _c === void 0 ? void 0 : _c[Object.keys(mentu.married)[0]]) === null || _d === void 0 ? void 0 : _d.mentuInfo;
  1139. var speAttr2 = (_mentu === null || _mentu === void 0 ? void 0 : _mentu.speAttr) || [];
  1140. for (var _i = 0, _e = speAttr1.concat(speAttr2); _i < _e.length; _i++) {
  1141. var attrId = _e[_i];
  1142. var cfg_1 = gameCfg_1.default.zongMenSpeAttr.getItem(attrId);
  1143. if (cfg_1 != null) {
  1144. if (cfg_1 != null) {
  1145. var _f = Object.entries(cfg_1.attr)[0], attrKey = _f[0], attrValue = _f[1];
  1146. var EpsObj = (_a = {}, _a[attrKey] = attrValue, _a);
  1147. speEps = this.ep_merge(speEps, EpsObj);
  1148. }
  1149. }
  1150. }
  1151. // 2. 出师属性
  1152. var graduateAttr1 = mentu.graduateAttr || {};
  1153. var graduateAttr2 = (_mentu === null || _mentu === void 0 ? void 0 : _mentu.graduateAttr) || {};
  1154. // 先确定值-graduateAttr2不超过graduateAttr1的x倍
  1155. var nCfg = gameCfg_1.default.mathInfo.getItem("zongMen_add_graduateAttr_limit");
  1156. if (nCfg != null && nCfg.pram != null && nCfg.pram.count != null) {
  1157. var value = graduateAttr1[Object.keys(graduateAttr1)[0]];
  1158. graduateAttr2[Object.keys(graduateAttr2)[0]] = Math.min(value * nCfg.pram.count, graduateAttr2[Object.keys(graduateAttr2)[0]]);
  1159. }
  1160. // 根据委任的位置id获取加成配置
  1161. var cfg = gameCfg_1.default.zongMenAppointPos.getItem(id);
  1162. if (cfg == null)
  1163. continue;
  1164. for (var key in graduateAttr1) {
  1165. graduateAttr1[key] = Math.floor(graduateAttr1[key] * (1 + cfg.add / 100));
  1166. }
  1167. speEps = this.ep_merge(speEps, graduateAttr1);
  1168. for (var key in graduateAttr2) {
  1169. graduateAttr2[key] = Math.floor(graduateAttr2[key] * (1 + cfg.add / 100));
  1170. }
  1171. speEps = this.ep_merge(speEps, graduateAttr2);
  1172. }
  1173. // --------------------------------已经结好的门徒End--------------------------------
  1174. // --------------------------------未结好的门徒Start--------------------------------
  1175. else {
  1176. // 特殊属性
  1177. var speAttr = mentu.speAttr || [];
  1178. for (var _g = 0, speAttr_1 = speAttr; _g < speAttr_1.length; _g++) {
  1179. var attrId = speAttr_1[_g];
  1180. var cfg_2 = gameCfg_1.default.zongMenSpeAttr.getItem(attrId);
  1181. if (cfg_2 != null) {
  1182. var _h = Object.entries(cfg_2.attr)[0], attrKey = _h[0], attrValue = _h[1];
  1183. var EpsObj = (_b = {}, _b[attrKey] = attrValue, _b);
  1184. speEps = this.ep_merge(speEps, EpsObj);
  1185. }
  1186. }
  1187. var graduateAttr = mentu.graduateAttr || {};
  1188. // 根据id获取配置
  1189. var cfg = gameCfg_1.default.zongMenAppointPos.getItem(id);
  1190. if (cfg == null)
  1191. continue;
  1192. for (var key in graduateAttr) {
  1193. graduateAttr[key] = Math.floor(graduateAttr[key] * (1 + cfg.add / 100));
  1194. }
  1195. speEps = this.ep_merge(speEps, graduateAttr);
  1196. }
  1197. // --------------------------------未结好的门徒End--------------------------------
  1198. }
  1199. // 每个门徒的基础属性全部加起来给主角
  1200. if (showBasicAttr) {
  1201. for (var id in actZongMen.mentu) {
  1202. eps = this.ep_merge(eps, this.eps_zongMen_mentu(actZongMen.mentu[id], jiuxiao));
  1203. }
  1204. for (var id in actZongMenMentuLs1) {
  1205. eps = this.ep_merge(eps, this.eps_zongMen_mentu(actZongMenMentuLs1[id], jiuxiao));
  1206. }
  1207. for (var id in actZongMenMentuLs2) {
  1208. eps = this.ep_merge(eps, this.eps_zongMen_mentu(actZongMenMentuLs2[id], jiuxiao));
  1209. }
  1210. }
  1211. // 每一条委任的特殊属性都不能超过配置的最大值 zm_cfg.maxSpeAttrAdd
  1212. for (var key in speEps) {
  1213. speEps[key] = Math.min(speEps[key], zm_cfg.maxSpeAttrAdd);
  1214. }
  1215. eps = this.ep_merge(eps, speEps);
  1216. return eps;
  1217. };
  1218. /**
  1219. * 道纹
  1220. * 镶嵌道纹的基础属性 + 词条属性 + 解封等级的属性 + 套装buff
  1221. */
  1222. GameMethod.prototype.ep_daowen = function (actDaoWen, actDdaoWenList) {
  1223. var eps_zhu = this.ep_daowen_zhu(actDaoWen, actDdaoWenList); //主属性
  1224. var eps_other = this.ep_daowen_other(actDaoWen, actDdaoWenList);
  1225. ; //副属性
  1226. return this.ep_merge(eps_zhu, eps_other);
  1227. };
  1228. /**
  1229. * 道纹
  1230. * 镶嵌道纹的主属性
  1231. */
  1232. GameMethod.prototype.ep_daowen_zhu = function (actDaoWen, actDdaoWenList) {
  1233. var eps_zhu = {}; //主属性
  1234. var real_dc = actDaoWen.dc || "1";
  1235. if (actDaoWen.dcs[real_dc] != null) {
  1236. var slotKeys = Object.keys(actDaoWen.dcs[real_dc].slot);
  1237. for (var i = 0; i < slotKeys.length; i++) {
  1238. var slot = slotKeys[i];
  1239. var iid = actDaoWen.dcs[real_dc].slot[slot];
  1240. var stone = actDdaoWenList[iid.toString()];
  1241. if (stone == null) {
  1242. continue;
  1243. }
  1244. var base_eps_c = gameCfg_1.default.daowenZhushuxing.getItem(stone.baseEps.sxid, stone.baseEps.level.toString());
  1245. if (base_eps_c != null) {
  1246. eps_zhu = this.ep_merge(eps_zhu, base_eps_c.eps);
  1247. }
  1248. }
  1249. }
  1250. return eps_zhu;
  1251. };
  1252. /**
  1253. * 道纹
  1254. * 镶嵌道纹的其他属性
  1255. */
  1256. GameMethod.prototype.ep_daowen_other = function (actDaoWen, actDdaoWenList) {
  1257. var eps_fu = {}; //副属性
  1258. var eps_level = {}; //解封等级属性
  1259. var real_dc = actDaoWen.dc || "1";
  1260. if (actDaoWen.dcs[real_dc] != null) {
  1261. var slotKeys = Object.keys(actDaoWen.dcs[real_dc].slot);
  1262. for (var i = 0; i < slotKeys.length; i++) {
  1263. var slot = slotKeys[i];
  1264. var iid = actDaoWen.dcs[real_dc].slot[slot];
  1265. var stone = actDdaoWenList[iid.toString()];
  1266. if (stone == null) {
  1267. continue;
  1268. }
  1269. //词条属性
  1270. var fuEpsKeys = Object.keys(stone.fuEps);
  1271. for (var i_5 = 0; i_5 < fuEpsKeys.length; i_5++) {
  1272. var eps_id = fuEpsKeys[i_5];
  1273. var ct_info_c = gameCfg_1.default.daowenFushuxing.getItem(eps_id, stone.fuEps[eps_id].pinzhi.toString(), stone.fuEps[eps_id].level.toString());
  1274. if (ct_info_c != null) {
  1275. eps_fu = this.ep_merge(eps_fu, ct_info_c.eps);
  1276. }
  1277. }
  1278. }
  1279. }
  1280. //解封等级的属性
  1281. var level = actDaoWen.unlockLevel;
  1282. var unlock_level_c = gameCfg_1.default.daowenUnlock_level.getItem(level.toString());
  1283. if (unlock_level_c != null) {
  1284. eps_level = this.ep_merge(eps_level, unlock_level_c.eps); //镶嵌效果
  1285. }
  1286. return this.ep_merge(eps_fu, eps_level);
  1287. };
  1288. /**
  1289. * 计算兽灵单个格子属性加成
  1290. */
  1291. GameMethod.prototype.ep_shouling_gezi = function (actShouLingOne, jiuxiao) {
  1292. if (jiuxiao === void 0) { jiuxiao = 0; }
  1293. var eps = {};
  1294. if (actShouLingOne == null || actShouLingOne.slid == "") {
  1295. return eps;
  1296. }
  1297. var slid = actShouLingOne.slid;
  1298. var cfgInfo = gameCfg_1.default.shoulingInfo.getItem(slid);
  1299. if (cfgInfo == null) {
  1300. return eps;
  1301. }
  1302. var cfgPinzhi = gameCfg_1.default.shoulingPinzhi.getItem(cfgInfo.pinzhi);
  1303. if (cfgPinzhi == null) {
  1304. return eps;
  1305. }
  1306. //兽灵基础属性
  1307. eps = this.ep_merge(eps, cfgPinzhi.eps);
  1308. //九霄天枢对兽灵基本属性加成
  1309. if (jiuxiao > 0) {
  1310. eps = this.ep_KvRate(eps, 1 + jiuxiao);
  1311. }
  1312. //升级属性加成
  1313. var level = actShouLingOne.level;
  1314. var levelEps = {};
  1315. for (var i = 1; i <= level; i++) {
  1316. var lv = gameCfg_1.default.shoulingLevel.getItem(cfgPinzhi.id, i.toString());
  1317. if (lv == null) {
  1318. continue;
  1319. }
  1320. levelEps = this.ep_merge(levelEps, lv.levelEps);
  1321. }
  1322. eps = this.ep_merge(eps, levelEps);
  1323. //计算升星属性加成
  1324. var star = actShouLingOne.star;
  1325. var starEps = {};
  1326. for (var index = star; index >= 0; index--) {
  1327. var star_c = gameCfg_1.default.shoulingStar.getItem(cfgPinzhi.id, index.toString());
  1328. if (star_c == null) {
  1329. continue;
  1330. }
  1331. starEps = this.ep_merge(starEps, star_c.starEps);
  1332. }
  1333. eps = this.ep_merge(eps, starEps);
  1334. //计算觉醒属性加成
  1335. var stepEps = {};
  1336. var step = actShouLingOne.step;
  1337. var jueXingCfg = gameCfg_1.default.shoulingJuexing.getItem(step.toString());
  1338. if (jueXingCfg) {
  1339. stepEps = this.ep_merge(stepEps, jueXingCfg.eps);
  1340. }
  1341. eps = this.ep_merge(eps, stepEps);
  1342. //皮肤属性
  1343. var skinEps = {};
  1344. if (actShouLingOne.skins == null) {
  1345. return eps;
  1346. }
  1347. for (var skinId in actShouLingOne.skins) {
  1348. var skin = actShouLingOne.skins[skinId];
  1349. var skinCfg = gameCfg_1.default.shoulingLevel.getItem(skinId, skin.level.toString());
  1350. if (skinCfg) {
  1351. skinEps = this.ep_merge(skinEps, skinCfg.levelEps);
  1352. }
  1353. }
  1354. eps = this.ep_merge(eps, skinEps);
  1355. return eps;
  1356. };
  1357. /**
  1358. * 计算异象属性加成
  1359. */
  1360. GameMethod.prototype.ep_yixiang = function (actYiXiang) {
  1361. var eps = {};
  1362. //计算升级升阶异象属性
  1363. var cfg = gameCfg_1.default.yixiangLevel.getItem(actYiXiang.id.toString());
  1364. if (cfg == null) {
  1365. return eps;
  1366. }
  1367. var cfgJieJi = gameCfg_1.default.yixiangJieji.getItem(cfg.step.toString());
  1368. if (cfgJieJi == null) {
  1369. return eps;
  1370. }
  1371. eps = this.ep_merge(eps, cfg.ep0);
  1372. eps = this.ep_merge(eps, cfgJieJi.ep1);
  1373. //计算上阵异象属性
  1374. var cfgStep = gameCfg_1.default.yixiangStep.getItem(actYiXiang.hh, cfg.step.toString());
  1375. if (cfgStep == null) {
  1376. return eps;
  1377. }
  1378. // 计算化形属性
  1379. for (var id in actYiXiang.hxData) {
  1380. var cfgHx = gameCfg_1.default.yixiangHuaxing.getItem(id, actYiXiang.hxData[id].level.toString());
  1381. if (cfgHx != null) {
  1382. eps = this.ep_merge(eps, cfgHx.levelEps);
  1383. }
  1384. }
  1385. eps = this.ep_merge(eps, cfgStep.ep);
  1386. return eps;
  1387. };
  1388. /**
  1389. * 计算皮肤属性加成
  1390. */
  1391. GameMethod.prototype.ep_pifu = function (actPifu) {
  1392. var eps = {};
  1393. for (var key in actPifu.list) {
  1394. var pifu = actPifu.list[key];
  1395. if (!pifu) {
  1396. continue;
  1397. }
  1398. if (!pifu.level) {
  1399. pifu.level = 1;
  1400. }
  1401. //计算皮肤属性属性
  1402. var cfg = gameCfg_1.default.skinSkinlevel.getItem(key.toString(), pifu.level.toString());
  1403. if (cfg == null) {
  1404. continue;
  1405. }
  1406. eps = this.ep_merge(eps, cfg.levelEps);
  1407. }
  1408. return eps;
  1409. };
  1410. /**
  1411. * 计算洞天道童属性加成
  1412. */
  1413. GameMethod.prototype.ep_dongtian = function (actDongTian) {
  1414. var eps = {};
  1415. //计算道童等级属性加成
  1416. var xlLvKeys = Object.keys(actDongTian.xlLv);
  1417. for (var i = 0; i < xlLvKeys.length; i++) {
  1418. var type = xlLvKeys[i];
  1419. var cfg = gameCfg_1.default.dongtianXlLv.getItem(type, actDongTian.xlLv[type].toString());
  1420. if (cfg == null) {
  1421. continue;
  1422. }
  1423. eps = this.ep_merge(eps, cfg.eps);
  1424. }
  1425. var cfgStep = gameCfg_1.default.dongtianXlStep.getItem(actDongTian.xlStep.toString());
  1426. if (cfgStep == null) {
  1427. return eps;
  1428. }
  1429. var epsKeys = Object.keys(eps);
  1430. for (var i = 0; i < epsKeys.length; i++) {
  1431. var key = epsKeys[i];
  1432. eps[key] *= cfgStep.eps / 10000;
  1433. }
  1434. return eps;
  1435. };
  1436. /**
  1437. * 计算药田属性加成
  1438. */
  1439. GameMethod.prototype.ep_yaotian = function (actYaoTianEps) {
  1440. var eps = {};
  1441. for (var key in actYaoTianEps) {
  1442. eps[key] = Math.floor(actYaoTianEps[key]);
  1443. }
  1444. return eps;
  1445. };
  1446. /**
  1447. * 计算称号属性加成
  1448. */
  1449. GameMethod.prototype.ep_chenghao = function (actChenghao) {
  1450. var eps = {};
  1451. for (var id in actChenghao.list) {
  1452. var cfg = gameCfg_1.default.chenghaoShuxing.getItem(id);
  1453. if (cfg != null) {
  1454. eps = this.ep_merge(eps, cfg.eps);
  1455. }
  1456. }
  1457. return eps;
  1458. };
  1459. // /**
  1460. // * 分别统计主角和弟子的的战斗属性
  1461. // */
  1462. GameMethod.prototype.ep_userAndDiZi = function (sevBack) {
  1463. var _a, _b, _c, _d, _e, _f, _g, _h;
  1464. var allEps = {};
  1465. var userBase = exports.gameMethod.ep_all_base(sevBack);
  1466. allEps["user"] = userBase;
  1467. var userEps = exports.gameMethod.ep_all_fight(userBase);
  1468. for (var gzid in (_b = (_a = sevBack.actDiZi) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.shangZhen) {
  1469. var eps = {};
  1470. var dzId = (_d = (_c = sevBack.actDiZi) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.shangZhen[gzid];
  1471. if (dzId == null || dzId == "") {
  1472. continue;
  1473. }
  1474. var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId);
  1475. var dizi = (_f = (_e = sevBack.actDiZiList) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f[dzId];
  1476. if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) {
  1477. continue;
  1478. }
  1479. var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString());
  1480. if (cfgZhongZu == null) {
  1481. continue;
  1482. }
  1483. //计算弟子升级属性
  1484. var levelEps = {};
  1485. for (var i = 1; i <= dizi.level; i++) {
  1486. var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString());
  1487. if (diziLevel == null) {
  1488. continue;
  1489. }
  1490. levelEps = this.ep_merge(levelEps, diziLevel.attr);
  1491. }
  1492. //九霄天枢对弟子基础属性加成
  1493. for (var hdcid in sevBack.hdJiuXiaoTianShu) {
  1494. // 检查属性是否存在
  1495. if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) {
  1496. continue;
  1497. }
  1498. var jiuxiao = (_h = (_g = sevBack.hdJiuXiaoTianShu) === null || _g === void 0 ? void 0 : _g[hdcid]) === null || _h === void 0 ? void 0 : _h.a;
  1499. if (!jiuxiao) {
  1500. continue;
  1501. }
  1502. // 检查伙伴属性加成是否大于0
  1503. if (jiuxiao.huoBanEps > 0) {
  1504. var rate = 1 + (jiuxiao.huoBanEps / 100);
  1505. levelEps = this.ep_KvRate(levelEps, rate);
  1506. }
  1507. }
  1508. eps = this.ep_merge(eps, levelEps);
  1509. //计算弟子升星的基础属性加成
  1510. var starEps = {};
  1511. for (var i = 1; i <= dizi.star; i++) {
  1512. var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString());
  1513. if (diziStar == null) {
  1514. continue;
  1515. }
  1516. starEps = this.ep_merge(starEps, diziStar.attr2);
  1517. }
  1518. eps = this.ep_merge(eps, starEps);
  1519. //计算弟子境界属性
  1520. var jingjieEps = {};
  1521. for (var i = 1; i <= dizi.jingjie; i++) {
  1522. var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString());
  1523. if (diziJingjie == null) {
  1524. continue;
  1525. }
  1526. jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr);
  1527. }
  1528. eps = this.ep_merge(eps, jingjieEps);
  1529. var dzEps = exports.gameMethod.ep_init(); //初始化属性
  1530. dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps);
  1531. for (var key in cfgZhongZu.inherit_attr) {
  1532. //继承主角属性
  1533. dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr[key]) / 10000);
  1534. }
  1535. for (var key in cfgZhongZu.inherit_attr_hide) {
  1536. //继承主角属性
  1537. dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000);
  1538. }
  1539. eps = exports.gameMethod.ep_merge(eps, dzEps);
  1540. allEps[dzId + "_" + cfgdz.dzName] = eps;
  1541. }
  1542. return allEps;
  1543. };
  1544. /**
  1545. * 计算角色总战力
  1546. * jiuxiao: 对弟子基础属性加成
  1547. */
  1548. GameMethod.prototype.ep_power_all = function (sevBack, ep_all_base) {
  1549. var _a, _b, _c, _d, _e, _f, _g, _h;
  1550. if (ep_all_base === void 0) { ep_all_base = {}; }
  1551. var userBase = {};
  1552. if (exports.gameMethod.isEmpty(ep_all_base) == false) {
  1553. userBase = ep_all_base;
  1554. }
  1555. else {
  1556. userBase = exports.gameMethod.ep_all_base(sevBack);
  1557. }
  1558. var userEps = exports.gameMethod.ep_all_fight(userBase);
  1559. var diziPower = 0;
  1560. for (var gzid in (_b = (_a = sevBack.actDiZi) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.shangZhen) {
  1561. var diziEps = {};
  1562. var dzId = (_d = (_c = sevBack.actDiZi) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.shangZhen[gzid];
  1563. if (dzId == null || dzId == "") {
  1564. continue;
  1565. }
  1566. var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId);
  1567. var dizi = (_f = (_e = sevBack.actDiZiList) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f[dzId];
  1568. if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) {
  1569. continue;
  1570. }
  1571. var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString());
  1572. if (cfgZhongZu == null) {
  1573. continue;
  1574. }
  1575. //计算弟子升级属性
  1576. var levelEps = {};
  1577. for (var i = 1; i <= dizi.level; i++) {
  1578. var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString());
  1579. if (diziLevel == null) {
  1580. continue;
  1581. }
  1582. levelEps = this.ep_merge(levelEps, diziLevel.attr);
  1583. }
  1584. //九霄天枢对弟子基础属性加成
  1585. for (var hdcid in sevBack.hdJiuXiaoTianShu) {
  1586. // 检查属性是否存在
  1587. if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) {
  1588. continue;
  1589. }
  1590. var jiuxiao = (_h = (_g = sevBack.hdJiuXiaoTianShu) === null || _g === void 0 ? void 0 : _g[hdcid]) === null || _h === void 0 ? void 0 : _h.a;
  1591. if (!jiuxiao) {
  1592. continue;
  1593. }
  1594. // 检查伙伴属性加成是否大于0
  1595. if (jiuxiao.huoBanEps > 0) {
  1596. var rate = 1 + (jiuxiao.huoBanEps / 100);
  1597. levelEps = this.ep_KvRate(levelEps, rate);
  1598. }
  1599. }
  1600. diziEps = this.ep_merge(diziEps, levelEps);
  1601. //计算弟子升星的基础属性加成
  1602. var starEps = {};
  1603. for (var i = 1; i <= dizi.star; i++) {
  1604. var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString());
  1605. if (diziStar == null) {
  1606. continue;
  1607. }
  1608. starEps = this.ep_merge(starEps, diziStar.attr2);
  1609. }
  1610. diziEps = this.ep_merge(diziEps, starEps);
  1611. //计算弟子境界属性
  1612. var jingjieEps = {};
  1613. for (var i = 1; i <= dizi.jingjie; i++) {
  1614. var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString());
  1615. if (diziJingjie == null) {
  1616. continue;
  1617. }
  1618. jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr);
  1619. }
  1620. diziEps = this.ep_merge(diziEps, jingjieEps);
  1621. var dzEps = exports.gameMethod.ep_init(); //初始化属性
  1622. dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps);
  1623. for (var key in cfgZhongZu.inherit_attr) {
  1624. //继承主角属性
  1625. dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr[key]) / 10000);
  1626. }
  1627. for (var key in cfgZhongZu.inherit_attr_hide) {
  1628. //继承主角属性
  1629. dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000);
  1630. }
  1631. diziEps = this.ep_merge(diziEps, dzEps);
  1632. diziPower += exports.gameMethod.ep_power(0, diziEps);
  1633. }
  1634. // 兽灵战力
  1635. var slPower = 0;
  1636. if (sevBack.actShouLing != null && sevBack.actShouLingList != null && sevBack.actShouLing.a && sevBack.actShouLingList.a) {
  1637. var useGzIdKeys = Object.keys(sevBack.actShouLing.a.useGzId);
  1638. for (var i = 0; i < useGzIdKeys.length; i++) {
  1639. var useGzId = useGzIdKeys[i];
  1640. var gzid = sevBack.actShouLing.a.useGzId[useGzId];
  1641. if (gzid == null || gzid == "") {
  1642. continue;
  1643. }
  1644. var shouling = sevBack.actShouLingList.a[gzid];
  1645. if (shouling == null) {
  1646. continue;
  1647. }
  1648. /*let cfg = Gamecfg.shoulingInfo.getItem(shouling.slid);
  1649. if (cfg == null) {
  1650. continue;
  1651. }
  1652. let pinzhiCfg = Gamecfg.shoulingPinzhi.getItem(cfg.pinzhi);
  1653. if (pinzhiCfg == null) {
  1654. continue;
  1655. }*/
  1656. //主战
  1657. if (useGzId == "0") {
  1658. var skill = shouling.sk;
  1659. var step = shouling.step;
  1660. var skillCfg = gameCfg_1.default.spellSkill.getItem(skill.skillId, skill.lv.toString(), step.toString());
  1661. if (skillCfg == null) {
  1662. continue;
  1663. }
  1664. slPower += skillCfg.zhanli;
  1665. }
  1666. else {
  1667. // 助战位
  1668. var skill = shouling.sk;
  1669. var step = shouling.step;
  1670. var skillCfg = gameCfg_1.default.spellSkill.getItem(skill.skillId, skill.lv.toString(), step.toString());
  1671. if (skillCfg == null) {
  1672. continue;
  1673. }
  1674. slPower += skillCfg.zhanli;
  1675. }
  1676. }
  1677. }
  1678. return diziPower + exports.gameMethod.ep_power(0, userBase) + slPower;
  1679. };
  1680. GameMethod.prototype.ep_power_dizi = function (sevBack, dzId) {
  1681. var _a, _b, _c, _d;
  1682. var userEps = exports.gameMethod.ep_all(sevBack);
  1683. var diziEps = {};
  1684. if (dzId == null || dzId == "") {
  1685. return 0;
  1686. }
  1687. var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId);
  1688. var dizi = (_b = (_a = sevBack.actDiZiList) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b[dzId];
  1689. if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) {
  1690. return 0;
  1691. }
  1692. var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString());
  1693. if (cfgZhongZu == null) {
  1694. return 0;
  1695. }
  1696. //计算弟子升级属性
  1697. var levelEps = {};
  1698. for (var i = 1; i <= dizi.level; i++) {
  1699. var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString());
  1700. if (diziLevel == null) {
  1701. continue;
  1702. }
  1703. levelEps = this.ep_merge(levelEps, diziLevel.attr);
  1704. }
  1705. //九霄天枢对弟子基础属性加成
  1706. for (var hdcid in sevBack.hdJiuXiaoTianShu) {
  1707. // 检查属性是否存在
  1708. if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) {
  1709. continue;
  1710. }
  1711. var jiuxiao = (_d = (_c = sevBack.hdJiuXiaoTianShu) === null || _c === void 0 ? void 0 : _c[hdcid]) === null || _d === void 0 ? void 0 : _d.a;
  1712. if (!jiuxiao) {
  1713. continue;
  1714. }
  1715. // 检查伙伴属性加成是否大于0
  1716. if (jiuxiao.huoBanEps > 0) {
  1717. var rate = 1 + (jiuxiao.huoBanEps / 100);
  1718. levelEps = this.ep_KvRate(levelEps, rate);
  1719. }
  1720. }
  1721. diziEps = this.ep_merge(diziEps, levelEps);
  1722. //计算弟子升星的基础属性加成
  1723. var starEps = {};
  1724. for (var i = 1; i <= dizi.star; i++) {
  1725. var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString());
  1726. if (diziStar == null) {
  1727. continue;
  1728. }
  1729. starEps = this.ep_merge(starEps, diziStar.attr2);
  1730. }
  1731. diziEps = this.ep_merge(diziEps, starEps);
  1732. //计算弟子境界属性
  1733. var jingjieEps = {};
  1734. for (var i = 1; i <= dizi.jingjie; i++) {
  1735. var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString());
  1736. if (diziJingjie == null) {
  1737. continue;
  1738. }
  1739. jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr);
  1740. }
  1741. diziEps = this.ep_merge(diziEps, jingjieEps);
  1742. var dzEps = exports.gameMethod.ep_init(); //初始化属性
  1743. dzEps = exports.gameMethod.ep_merge(dzEps, cfgdz.eps);
  1744. for (var key in cfgZhongZu.inherit_attr) {
  1745. //继承主角属性
  1746. dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr[key]) / 10000);
  1747. }
  1748. for (var key in cfgZhongZu.inherit_attr_hide) {
  1749. //继承主角属性
  1750. dzEps[key] += Math.floor((userEps[key] * cfgZhongZu.inherit_attr_hide[key]) / 10000);
  1751. }
  1752. diziEps = this.ep_merge(diziEps, dzEps);
  1753. return exports.gameMethod.ep_power(0, diziEps);
  1754. };
  1755. /**
  1756. * 计算阵法更换的战力变化值 (弃用)
  1757. */
  1758. GameMethod.prototype.ep_power_zhenfa = function (sevBack, linshi) {
  1759. //原本的战力
  1760. var initPower = this.ep_power_all(sevBack);
  1761. var newSevBack = exports.gameMethod.objCopy(sevBack);
  1762. if (newSevBack.actZhenfa == null || newSevBack.actZhenfa.a == null) {
  1763. return 0;
  1764. }
  1765. var cfgpf = gameCfg_1.default.zhenfaPifu.getItem(linshi.pfid);
  1766. if (cfgpf == null) {
  1767. return 0;
  1768. }
  1769. if (newSevBack.actZhenfa.a.chuan[cfgpf.buwei] == null) {
  1770. newSevBack.actZhenfa.a.chuan[cfgpf.buwei] = {
  1771. pfid: "",
  1772. level: 0,
  1773. eps: {},
  1774. fmLv: 0,
  1775. fmBd: 0,
  1776. fmEps: [],
  1777. fmZhBd: [],
  1778. fmZhls: [],
  1779. pinzhi: "",
  1780. };
  1781. }
  1782. newSevBack.actZhenfa.a.chuan[cfgpf.buwei].pfid = linshi.pfid;
  1783. newSevBack.actZhenfa.a.chuan[cfgpf.buwei].level = linshi.level;
  1784. newSevBack.actZhenfa.a.chuan[cfgpf.buwei].eps = linshi.eps;
  1785. newSevBack.actZhenfa.a.chuan[cfgpf.buwei].pinzhi = linshi.pinzhi;
  1786. var newPower = this.ep_power_all(newSevBack);
  1787. return newPower - initPower;
  1788. };
  1789. /**
  1790. * 计算阵法更换的战力变化值
  1791. */
  1792. GameMethod.prototype.ep_power_zhenfaNew = function (sevBack, linshi) {
  1793. if (sevBack.actZhenfaNew == null || sevBack.actZhenfaNew.a == null || sevBack.actZhenfaNew.a.chuan == null) {
  1794. return 0;
  1795. }
  1796. var cfgpf = gameCfg_1.default.zhenfaPifu.getItem(linshi.pfid);
  1797. if (cfgpf == null) {
  1798. return 0;
  1799. }
  1800. var oldCeps = {};
  1801. if (sevBack.actZhenfaNew.a.chuan[cfgpf.buwei] != null) {
  1802. oldCeps = sevBack.actZhenfaNew.a.chuan[cfgpf.buwei].eps;
  1803. }
  1804. //原本的战力
  1805. var initPower = this.ep_power_all(sevBack);
  1806. var ep_base = this.ep_all_base(sevBack);
  1807. for (var key in oldCeps) {
  1808. ep_base[key] -= oldCeps[key];
  1809. }
  1810. for (var key in linshi.eps) {
  1811. ep_base[key] += linshi.eps[key];
  1812. }
  1813. var newPower = this.ep_power_all(sevBack, ep_base);
  1814. return newPower - initPower;
  1815. };
  1816. /**
  1817. * 计算已经穿戴的装备属性
  1818. */
  1819. GameMethod.prototype.ep_power_zhenfaNew_chuan = function (sevBack, buwei) {
  1820. if (sevBack.actZhenfaNew == null || sevBack.actZhenfaNew.a == null || sevBack.actZhenfaNew.a.chuan == null) {
  1821. return 0;
  1822. }
  1823. //原本的战力
  1824. var initPower = this.ep_power_all(sevBack);
  1825. var oldCeps = {};
  1826. if (sevBack.actZhenfaNew.a.chuan[buwei] != null) {
  1827. var chuan = sevBack.actZhenfaNew.a.chuan[buwei];
  1828. oldCeps = this.ep_merge(oldCeps, chuan.eps);
  1829. for (var _i = 0, _a = chuan.fmEps; _i < _a.length; _i++) {
  1830. var fmEps = _a[_i];
  1831. if (oldCeps[fmEps[0]] == null) {
  1832. oldCeps[fmEps[0]] = 0;
  1833. }
  1834. oldCeps[fmEps[0]] += fmEps[1];
  1835. }
  1836. // 洗练属性
  1837. for (var posId in chuan.xilianEps) {
  1838. if (chuan.xilianEps[posId].id == null || chuan.xilianEps[posId].id == "") {
  1839. continue;
  1840. }
  1841. var xilian_c = gameCfg_1.default.zhenfaXilianWord.getItem(chuan.xilianEps[posId].id);
  1842. if (xilian_c != null) {
  1843. oldCeps = this.ep_merge(oldCeps, xilian_c.attr);
  1844. }
  1845. }
  1846. }
  1847. var ep_base = this.ep_all_base(sevBack);
  1848. for (var key in oldCeps) {
  1849. ep_base[key] -= oldCeps[key];
  1850. }
  1851. var newPower = this.ep_power_all(sevBack, ep_base);
  1852. return newPower - initPower;
  1853. };
  1854. /**
  1855. * 计算阵法更换的战力变化值
  1856. */
  1857. GameMethod.prototype.ep_power_guzi = function (sevBack, linshi) {
  1858. //原本的战力
  1859. var oldCeps = {};
  1860. if (sevBack.actDadiGuzi != null &&
  1861. sevBack.actDadiGuzi.a != null &&
  1862. sevBack.actDadiGuzi.a.mpList != null &&
  1863. sevBack.actDadiGuzi.a.mpXhid != null &&
  1864. sevBack.actDadiGuzi.a.mpList[sevBack.actDadiGuzi.a.mpXhid] != null &&
  1865. sevBack.actDadiGuzi.a.mpList[sevBack.actDadiGuzi.a.mpXhid][linshi.buwei] != null) {
  1866. oldCeps = sevBack.actDadiGuzi.a.mpList[sevBack.actDadiGuzi.a.mpXhid][linshi.buwei].eps;
  1867. }
  1868. var ep_base = this.ep_all_base(sevBack);
  1869. var ep_base2 = exports.gameMethod.objCopy(ep_base);
  1870. ep_base.atk += Math.floor((ep_base.atk * ep_base.atk_per) / 10000);
  1871. ep_base.def += Math.floor((ep_base.def * ep_base.def_per) / 10000);
  1872. ep_base.hp_max += Math.floor((ep_base.hp_max * ep_base.hp_max_per) / 10000);
  1873. ep_base.hp = ep_base.hp_max;
  1874. var initPower = this.ep_power(0, ep_base);
  1875. for (var key in oldCeps) {
  1876. ep_base2[key] -= oldCeps[key];
  1877. }
  1878. for (var key in linshi.eps) {
  1879. ep_base2[key] += linshi.eps[key];
  1880. }
  1881. ep_base2.atk += Math.floor((ep_base2.atk * ep_base2.atk_per) / 10000);
  1882. ep_base2.def += Math.floor((ep_base2.def * ep_base2.def_per) / 10000);
  1883. ep_base2.hp_max += Math.floor((ep_base2.hp_max * ep_base2.hp_max_per) / 10000);
  1884. ep_base2.hp = ep_base2.hp_max;
  1885. var newPower = this.ep_power(0, ep_base2);
  1886. return newPower - initPower;
  1887. };
  1888. // 计算门徒的战力
  1889. GameMethod.prototype.ep_power_mentu = function (mentu) {
  1890. var power = 0;
  1891. // 基础属性
  1892. power += this.ep_power(0, mentu.basicAttr);
  1893. // 特殊属性
  1894. if (mentu.speAttr != null) {
  1895. for (var _i = 0, _a = mentu.speAttr; _i < _a.length; _i++) {
  1896. var id = _a[_i];
  1897. var specialCfg = gameCfg_1.default.zongMenSpeAttr.getItem(id + "");
  1898. if (specialCfg == null) {
  1899. continue;
  1900. }
  1901. power += this.ep_power(0, specialCfg.attr);
  1902. }
  1903. }
  1904. return power;
  1905. };
  1906. /**
  1907. * 属性转化成战力
  1908. * @param type 默认 0默认 1怪物
  1909. * @param eps 属性消息
  1910. * @returns
  1911. */
  1912. GameMethod.prototype.ep_power = function (type, _eps) {
  1913. var eps = exports.gameMethod.ep_init();
  1914. eps = exports.gameMethod.ep_merge(eps, _eps);
  1915. eps = exports.gameMethod.ep_all_fight(eps);
  1916. var power = 0;
  1917. var cfgEpPool = gameCfg_1.default.userEp.pool;
  1918. for (var key in cfgEpPool) {
  1919. var rpKey = cfgEpPool[key].key;
  1920. if (eps[rpKey] == null || typeof eps[rpKey] != "number") {
  1921. continue;
  1922. }
  1923. var xishu = 0;
  1924. switch (type) {
  1925. case 1:
  1926. if (exports.gameMethod.isEmpty(cfgEpPool[key].momPower) == true) {
  1927. continue;
  1928. }
  1929. xishu = cfgEpPool[key].momPower;
  1930. break;
  1931. default:
  1932. if (exports.gameMethod.isEmpty(cfgEpPool[key].power) == true) {
  1933. continue;
  1934. }
  1935. xishu = cfgEpPool[key].power;
  1936. break;
  1937. }
  1938. var addPower = Math.floor(xishu * eps[rpKey]);
  1939. power += addPower;
  1940. }
  1941. return power;
  1942. };
  1943. //获取药田吃药加成的属性
  1944. GameMethod.prototype.eps_yaofang = function (count, danyao, yx, eps) {
  1945. var needCount = count;
  1946. var shiyong = {};
  1947. while (needCount > 0) {
  1948. //要降级
  1949. if (danyao.shiyong + needCount >= yx[0] && danyao.naiyao > yx[2]) {
  1950. needCount -= yx[0] - danyao.shiyong;
  1951. //记录食用
  1952. shiyong[danyao.naiyao] = yx[0] - danyao.shiyong;
  1953. danyao.shiyong = 0;
  1954. danyao.naiyao -= yx[1];
  1955. danyao.naiyao = Math.max(danyao.naiyao, yx[2]);
  1956. }
  1957. else {
  1958. if (danyao.naiyao == 100) {
  1959. //耐药等于最低的时候不加shiyong数量只加count数量
  1960. shiyong[danyao.naiyao] = needCount;
  1961. needCount -= needCount;
  1962. }
  1963. else {
  1964. danyao.shiyong += needCount;
  1965. //记录食用
  1966. shiyong[danyao.naiyao] = needCount;
  1967. needCount -= needCount;
  1968. }
  1969. }
  1970. }
  1971. var epsAll = {};
  1972. for (var naiyao in shiyong) {
  1973. //遍历食用加属性
  1974. for (var key in eps) {
  1975. if (epsAll[key] == null) {
  1976. epsAll[key] = 0;
  1977. }
  1978. epsAll[key] += (eps[key] * shiyong[naiyao] * Number(naiyao)) / 10000;
  1979. }
  1980. }
  1981. for (var key in epsAll) {
  1982. epsAll[key] = Math.floor(epsAll[key]);
  1983. }
  1984. return epsAll;
  1985. };
  1986. //计算弟子战斗自身属性(不包括继承主角的属性)
  1987. GameMethod.prototype.ep_diziEps = function (sevBack, dzId) {
  1988. var _a, _b, _c, _d;
  1989. var diziEps = exports.gameMethod.ep_init(); //初始化属性
  1990. if (dzId == null || dzId == "") {
  1991. return diziEps;
  1992. }
  1993. var cfgdz = gameCfg_1.default.huobanBase.getItem(dzId);
  1994. var dizi = (_b = (_a = sevBack.actDiZiList) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b[dzId];
  1995. if (cfgdz == null || dizi == null || cfgdz.zhanli == 0) {
  1996. return diziEps;
  1997. }
  1998. //弟子基础属性
  1999. diziEps = this.ep_merge(diziEps, cfgdz.eps);
  2000. var cfgZhongZu = gameCfg_1.default.huobanZhongzu.getItem(cfgdz.pinzhi, cfgdz.zhongzu.toString());
  2001. if (cfgZhongZu == null) {
  2002. return diziEps;
  2003. }
  2004. //计算弟子升级属性
  2005. var levelEps = {};
  2006. for (var i = 1; i <= dizi.level; i++) {
  2007. var diziLevel = gameCfg_1.default.huobanShengji.getItem(cfgdz.pinzhi, i.toString());
  2008. if (diziLevel == null) {
  2009. continue;
  2010. }
  2011. levelEps = this.ep_merge(levelEps, diziLevel.attr);
  2012. }
  2013. //九霄天枢对弟子基础属性加成
  2014. for (var hdcid in sevBack.hdJiuXiaoTianShu) {
  2015. // 检查属性是否存在
  2016. if (!Object.prototype.hasOwnProperty.call(sevBack.hdJiuXiaoTianShu, hdcid)) {
  2017. continue;
  2018. }
  2019. var jiuxiao = (_d = (_c = sevBack.hdJiuXiaoTianShu) === null || _c === void 0 ? void 0 : _c[hdcid]) === null || _d === void 0 ? void 0 : _d.a;
  2020. if (!jiuxiao) {
  2021. continue;
  2022. }
  2023. // 检查伙伴属性加成是否大于0
  2024. if (jiuxiao.huoBanEps > 0) {
  2025. var rate = 1 + (jiuxiao.huoBanEps / 100);
  2026. levelEps = this.ep_KvRate(levelEps, rate);
  2027. }
  2028. }
  2029. diziEps = this.ep_merge(diziEps, levelEps);
  2030. //计算弟子升星的基础属性加成
  2031. var starEps = {};
  2032. for (var i = 1; i <= dizi.star; i++) {
  2033. var diziStar = gameCfg_1.default.huobanStar.getItem(cfgdz.id, i.toString());
  2034. if (diziStar == null) {
  2035. continue;
  2036. }
  2037. starEps = this.ep_merge(starEps, diziStar.attr2);
  2038. }
  2039. diziEps = this.ep_merge(diziEps, starEps);
  2040. //计算弟子境界属性
  2041. var jingjieEps = {};
  2042. for (var i = 1; i <= dizi.jingjie; i++) {
  2043. var diziJingjie = gameCfg_1.default.huobanTupo.getItem(cfgdz.pinzhi, i.toString());
  2044. if (diziJingjie == null) {
  2045. continue;
  2046. }
  2047. jingjieEps = this.ep_merge(jingjieEps, diziJingjie.attr);
  2048. }
  2049. diziEps = this.ep_merge(diziEps, jingjieEps);
  2050. return diziEps;
  2051. };
  2052. //获取模块的属性加成
  2053. GameMethod.prototype.ep_act = function (sevBack, key) {
  2054. var eps = this.ep_init();
  2055. if (sevBack.actEps != null && sevBack.actEps.a != null && sevBack.actEps.a[key] != null) {
  2056. eps = exports.gameMethod.ep_merge(eps, sevBack.actEps.a[key]);
  2057. }
  2058. return eps;
  2059. };
  2060. /**
  2061. * 解析洞天 矿车数据
  2062. * @param carInfo
  2063. * @param now
  2064. * @returns edtime //离结束 还有多长时间 (0 已完成 )(未开始 -1)
  2065. * @returns win //胜利方是谁 0守方 1攻方 (未开始默认0)
  2066. * @returns nowpos nowpos, //当前位置
  2067. */
  2068. GameMethod.prototype.getDongTianCar = function (carInfo, now) {
  2069. if (carInfo.stime <= 0) {
  2070. //未启动
  2071. return {
  2072. edtime: -1,
  2073. win: 0,
  2074. nowpos: carInfo.dpos,
  2075. };
  2076. }
  2077. //获取矿车配置
  2078. var carCfg = gameCfg_1.default.dongtianCar.getItem(carInfo.id);
  2079. if (carCfg == null) {
  2080. console.error("dongtianCar_err:" + carInfo.id);
  2081. return {
  2082. edtime: -1,
  2083. win: 0,
  2084. nowpos: carInfo.dpos,
  2085. };
  2086. }
  2087. var dnum = 0; //胜利方多出来的人数
  2088. var pow = 1; //胜利方状态值
  2089. var leng = carInfo.dpos; //距离(本方距离)
  2090. var win = 0;
  2091. var fevCard = false; //胜利方是否有终生卡
  2092. //人数对比
  2093. if (carInfo.he.knum.length > carInfo.my.knum.length) {
  2094. //进攻方胜利
  2095. dnum = carInfo.he.knum.length - carInfo.my.knum.length;
  2096. pow = carInfo.he.pow;
  2097. leng = carCfg.lengs[2] - carInfo.dpos; //反向距离
  2098. win = 1; //进攻方胜利
  2099. fevCard = carInfo.he.fevCard; //终生卡
  2100. }
  2101. else {
  2102. //防守方胜利
  2103. dnum = carInfo.my.knum.length - carInfo.he.knum.length;
  2104. pow = carInfo.my.pow;
  2105. fevCard = carInfo.my.fevCard; //终生卡
  2106. }
  2107. //如果人数 <= 0 (防守方胜利 系数0.7) 就当防守方有0.7个人
  2108. dnum = Math.max(dnum, 0.7);
  2109. //哥布林速度系数
  2110. var wkVel = 1;
  2111. var cfgMath = gameCfg_1.default.mathInfo.getItem("dongtian_wkVel");
  2112. if (cfgMath == null || cfgMath.pram.count == null) {
  2113. console.error("dongtian_wkVel");
  2114. }
  2115. else {
  2116. wkVel = cfgMath.pram.count;
  2117. }
  2118. var tilixs = 200; //根据体力获得系数
  2119. //总速度
  2120. var vel = (dnum * wkVel * tilixs) / 100;
  2121. //终生卡 速度加成 +5%
  2122. var sdadd = 10000;
  2123. if (fevCard) {
  2124. sdadd += 1500;
  2125. }
  2126. vel = (vel * sdadd) / 10000;
  2127. //总的需要时间 计算公式
  2128. var allTime = Math.ceil(leng / vel);
  2129. //经过时间
  2130. var dtime = now - carInfo.stime;
  2131. if (dtime >= allTime) {
  2132. //已完成
  2133. return {
  2134. edtime: 0,
  2135. win: win,
  2136. nowpos: win ? carCfg.lengs[2] : 0,
  2137. };
  2138. }
  2139. else {
  2140. //未完成 计算 当前位置偏移量
  2141. var dpos = dtime * vel;
  2142. //当前位置
  2143. var nowpos = carInfo.dpos;
  2144. if (win > 0) {
  2145. nowpos += dpos;
  2146. nowpos = Math.floor(nowpos); //进攻方胜利 取余偏向防守方(小值)
  2147. }
  2148. else {
  2149. nowpos -= dpos;
  2150. nowpos = Math.ceil(nowpos); //防守方胜利 取余偏向进攻方(大值)
  2151. }
  2152. return {
  2153. edtime: allTime - dtime,
  2154. win: win,
  2155. nowpos: nowpos,
  2156. };
  2157. }
  2158. };
  2159. /**
  2160. * 章节挂机计算
  2161. * @param actZhangjie 章节信息
  2162. * @param newTime 现在时间
  2163. * @param zflevel 阵法等级
  2164. * @returns
  2165. */
  2166. GameMethod.prototype.guajiItems = function (_actZhangjie, newTime, zflevel) {
  2167. var actZhangjie = this.objCopy(_actZhangjie);
  2168. var items = []; //挂机奖励(总)
  2169. var zy_items = []; //挂机奖励(金币/玩家经验/阵法经验)
  2170. var dj_items = []; //挂机奖励(道具)
  2171. var cfgzj = gameCfg_1.default.zhangjieInfo.getItem(actZhangjie.zjid);
  2172. if (cfgzj == null) {
  2173. return {
  2174. actZhangjie: actZhangjie,
  2175. items: items,
  2176. zy_items: zy_items,
  2177. dj_items: dj_items,
  2178. };
  2179. }
  2180. for (var _i = 0, _a = cfgzj.gjRwd_zy; _i < _a.length; _i++) {
  2181. var item = _a[_i];
  2182. var cAt = newTime - actZhangjie.gjtime;
  2183. cAt = Math.min(cAt, actZhangjie.gjMax * 3600); //8小时上限
  2184. var count = Math.floor(cAt / (item[3] / item[2]));
  2185. if (count > 0) {
  2186. items.push([item[0], item[1], count]);
  2187. zy_items.push([item[0], item[1], count]);
  2188. }
  2189. }
  2190. for (var _b = 0, _c = cfgzj.gjRwd_dj; _b < _c.length; _b++) {
  2191. var item = _c[_b];
  2192. if (item[4] != null && item[4] > zflevel) {
  2193. continue; //未达到阵法等级
  2194. }
  2195. if (actZhangjie.gjRwd_dj[item[0].toString()] == null) {
  2196. actZhangjie.gjRwd_dj[item[0].toString()] = {};
  2197. }
  2198. if (actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] == null) {
  2199. actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] = 0;
  2200. }
  2201. var cAt = newTime - actZhangjie.gjtime;
  2202. cAt = Math.min(cAt, actZhangjie.gjMax * 3600) + actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()];
  2203. //获得一个道具 需要多长时间
  2204. var oneTime = item[3] / item[2];
  2205. var count = Math.floor(cAt / oneTime);
  2206. if (count > 0) {
  2207. items.push([item[0], item[1], count]);
  2208. dj_items.push([item[0], item[1], count]);
  2209. actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] = 0;
  2210. }
  2211. actZhangjie.gjRwd_dj[item[0].toString()][item[1].toString()] = Math.floor(cAt % oneTime);
  2212. }
  2213. actZhangjie.gjtime = newTime;
  2214. return {
  2215. actZhangjie: actZhangjie,
  2216. // items: gameMethod.mergeArr(items),
  2217. items: items,
  2218. zy_items: exports.gameMethod.mergeArr(zy_items),
  2219. dj_items: exports.gameMethod.mergeArr(dj_items),
  2220. };
  2221. };
  2222. //异或加解密
  2223. GameMethod.prototype.xorEncrypt = function (str, x, key) {
  2224. if (x === void 0) { x = true; }
  2225. if (key === void 0) { key = "zgyx2024888"; }
  2226. if (!x) {
  2227. return str;
  2228. }
  2229. var result = [];
  2230. for (var i = 0; i < str.length; i++) {
  2231. var charCode = str.charCodeAt(i) ^ key.charCodeAt(i % key.length);
  2232. result.push(String.fromCharCode(charCode));
  2233. }
  2234. return result.join("");
  2235. };
  2236. // 用随机种子获取太初古矿地图
  2237. GameMethod.prototype.getGuKuangMap = function (randNum, cs) {
  2238. var geziCp = Object.values(gezi);
  2239. var map = []; // 地图数据
  2240. var sendRand = new SeedRand(randNum);
  2241. sendRand.random();
  2242. geziCp = sendRand.arrayShuffle(geziCp);
  2243. var index = 1;
  2244. var tcInfo;
  2245. var tsInfo;
  2246. var tcInfoLast;
  2247. var tsInfoLast;
  2248. while (index > 0) {
  2249. var tcInfo2 = void 0;
  2250. var tsInfo2 = void 0;
  2251. if (tcInfo == null) {
  2252. tcInfo2 = gameCfg_1.default.taichuInfo.getItem(index.toString());
  2253. }
  2254. if (tsInfo == null) {
  2255. tsInfo2 = gameCfg_1.default.taichuTs.getItem(index.toString());
  2256. }
  2257. if (tcInfo2 && tcInfo2.cs[0] <= cs && tcInfo2.cs[1] >= cs) {
  2258. tcInfo = tcInfo2;
  2259. }
  2260. else if (tcInfo2) {
  2261. tcInfoLast = tcInfo2;
  2262. }
  2263. if (tsInfo2 && tsInfo2.cs[0] <= cs && tsInfo2.cs[1] >= cs) {
  2264. tsInfo = tsInfo2;
  2265. }
  2266. else if (tsInfo2) {
  2267. tsInfoLast = tsInfo2;
  2268. }
  2269. if (tcInfo && tsInfo) {
  2270. index = -1;
  2271. }
  2272. else if (tcInfo2 == null && tsInfo2 == null && tcInfoLast && tsInfoLast) {
  2273. tcInfo = exports.gameMethod.objCopy(tcInfoLast);
  2274. tsInfo = exports.gameMethod.objCopy(tsInfoLast);
  2275. var ts_cs_min = tsInfo.cs[0];
  2276. var ts_cs_max = tsInfo.cs[1];
  2277. var cha = 0;
  2278. while (ts_cs_max + cha < cs) {
  2279. cha = ts_cs_max - ts_cs_min;
  2280. ts_cs_min = ts_cs_max + 1;
  2281. ts_cs_max = ts_cs_min + cha;
  2282. cha = 0;
  2283. }
  2284. tsInfo.cs = [ts_cs_min, ts_cs_max];
  2285. index = -1;
  2286. }
  2287. else {
  2288. index++;
  2289. }
  2290. }
  2291. if (tcInfo == null || tsInfo == null) {
  2292. return map;
  2293. }
  2294. var jlCs = [];
  2295. for (var i = tsInfo.cs[0]; i <= tsInfo.cs[1]; i++) {
  2296. jlCs.push(i);
  2297. }
  2298. var jlC = sendRand.getRandArr2(jlCs, 1).result[0]; // 当前层数区间 奖励层所在层数
  2299. var itemCount = {}; // 地块id:[格子数组]
  2300. var sd = tcInfo.sd;
  2301. for (var i = 0; i < sd.length; i++) {
  2302. var result = sendRand.getRandArr2(geziCp, sd[i][1]);
  2303. geziCp = result.arr;
  2304. itemCount[sd[i][0].toString()] = result.result;
  2305. }
  2306. var jlcNum = null; // 奖励层所在行数 0-5
  2307. if (jlC == cs) {
  2308. jlcNum = sendRand.getRandArr2([0, 1, 2, 3, 4, 5], 1).result[0];
  2309. }
  2310. var itemCountKeys = Object.keys(itemCount);
  2311. var mapLine = [];
  2312. var isHas = false;
  2313. var tilesInfo101 = gameCfg_1.default.taichuTiles.getItem("1");
  2314. var tilesInfo301 = gameCfg_1.default.taichuTiles.getItem("301");
  2315. var line = 0; // 第几行
  2316. for (var i = 0; i < gezi.length; i++) {
  2317. line = Math.floor(i / 6) + 1;
  2318. // 开始绘制地图
  2319. if (i % 6 == 0 && mapLine.length > 0) {
  2320. map.push(mapLine);
  2321. mapLine = [];
  2322. }
  2323. isHas = false;
  2324. var zuojiaInfo = gameCfg_1.default.taichuZuojia.getItem(cs.toString(), line.toString());
  2325. if (zuojiaInfo != null) {
  2326. isHas = true;
  2327. for (var _i = 0, _a = zuojiaInfo.item; _i < _a.length; _i++) {
  2328. var id = _a[_i];
  2329. var tilesInfo = gameCfg_1.default.taichuTiles.getItem(id.toString());
  2330. if (tilesInfo != null) {
  2331. mapLine.push({
  2332. id: tilesInfo.id,
  2333. hp: tilesInfo.hp,
  2334. item: tilesInfo.itme,
  2335. icon: tilesInfo.icon,
  2336. });
  2337. }
  2338. else {
  2339. mapLine.push({
  2340. id: "",
  2341. hp: 0,
  2342. item: [],
  2343. icon: "",
  2344. });
  2345. }
  2346. }
  2347. i += 5;
  2348. }
  2349. else {
  2350. for (var k = 0; k < itemCountKeys.length; k++) {
  2351. if (itemCount[itemCountKeys[k]].indexOf(i) != -1) {
  2352. var tilesInfo = gameCfg_1.default.taichuTiles.getItem(itemCountKeys[k]);
  2353. if (tilesInfo != null) {
  2354. mapLine.push({
  2355. id: itemCountKeys[k],
  2356. hp: tilesInfo.hp,
  2357. item: tilesInfo.itme,
  2358. icon: tilesInfo.icon,
  2359. });
  2360. isHas = true;
  2361. break;
  2362. }
  2363. }
  2364. }
  2365. }
  2366. if (!isHas) {
  2367. if (cs == 1 && i < 6) {
  2368. if (tilesInfo101 != null) {
  2369. mapLine.push({
  2370. id: "1",
  2371. hp: 1,
  2372. item: [],
  2373. icon: tilesInfo101.icon,
  2374. });
  2375. }
  2376. }
  2377. else {
  2378. if (tilesInfo101 && map.length > 0 && map[map.length - 1][mapLine.length].hp == 0) {
  2379. // 如果上一层是空格 加一个木块
  2380. mapLine.push({
  2381. id: tilesInfo101.id,
  2382. hp: tilesInfo101.hp,
  2383. item: tilesInfo101.itme,
  2384. icon: tilesInfo101.icon,
  2385. });
  2386. }
  2387. else {
  2388. mapLine.push({
  2389. id: "",
  2390. hp: 0,
  2391. item: [],
  2392. icon: "",
  2393. });
  2394. }
  2395. }
  2396. }
  2397. }
  2398. if (mapLine.length > 0) {
  2399. map.push(mapLine);
  2400. }
  2401. if (jlcNum != null) {
  2402. var len = tsInfo.sd.length;
  2403. if (len != 12) {
  2404. return map;
  2405. }
  2406. for (var i = 0; i < tsInfo.sd.length; i++) {
  2407. if (i % 6 == 0 && i != 0) {
  2408. jlcNum += 1;
  2409. }
  2410. if (tilesInfo301 != null) {
  2411. map[jlcNum][i % 6] =
  2412. tsInfo.sd[i].length == 1
  2413. ? {
  2414. id: "301",
  2415. hp: 0,
  2416. item: [],
  2417. icon: i == 0 ? tilesInfo301.icon : "",
  2418. }
  2419. : {
  2420. id: "301",
  2421. hp: 1,
  2422. item: [tsInfo.sd[i]],
  2423. icon: i == 0 ? tilesInfo301.icon : "",
  2424. };
  2425. }
  2426. }
  2427. // 奖励层下一层 整行不能为空
  2428. for (var i = 0; i < 6; i++) {
  2429. if (i % 6 == 0) {
  2430. jlcNum += 1;
  2431. }
  2432. if (map[jlcNum][i % 6].hp <= 0 && tilesInfo101 != null) {
  2433. // 转成石头
  2434. map[jlcNum][i % 6] = {
  2435. id: tilesInfo101.id,
  2436. hp: tilesInfo101.hp,
  2437. item: tilesInfo101.itme,
  2438. icon: tilesInfo101.icon,
  2439. };
  2440. }
  2441. }
  2442. }
  2443. return map;
  2444. };
  2445. /**
  2446. * 根据玩家选的流派推荐阵容
  2447. * @param type 玩家预选流派
  2448. * @returns
  2449. */
  2450. GameMethod.prototype.tuijian = function (sevBack, type) {
  2451. var _this = this;
  2452. //用于记录哪些位置被使用了
  2453. var gezi = ["1", "2", "3", "4", "5", "6", "7", "8", "9"];
  2454. var tuijian = {};
  2455. //先筛选出符合要求的弟子id列表
  2456. var dzList1 = []; //前排
  2457. var dzList2 = []; //中排
  2458. var dzList3 = []; //后排
  2459. var wanbian1 = []; //万变流前排
  2460. var wanbian2 = []; //万变流中排
  2461. var wanbian3 = []; //万变流后排
  2462. var other1 = []; //其他前排
  2463. var other2 = []; //其他中排
  2464. var other3 = []; //其他后排
  2465. var actDiZiList = {};
  2466. if (sevBack.actDiZiList != null && sevBack.actDiZiList.a != null) {
  2467. actDiZiList = sevBack.actDiZiList.a;
  2468. }
  2469. for (var dzid in actDiZiList) {
  2470. var cfg = gameCfg_1.default.huobanBase.getItem(actDiZiList[dzid].id);
  2471. if (cfg == null || cfg.show == 0) {
  2472. continue;
  2473. }
  2474. //不是预选流派和万变流不符合条件
  2475. if (cfg.liupai != type && cfg.liupai != "5") {
  2476. if (cfg.dingwei == "1") {
  2477. other1.push(dzid);
  2478. }
  2479. else if (cfg.dingwei == "2") {
  2480. other2.push(dzid);
  2481. }
  2482. else if (cfg.dingwei == "3") {
  2483. other3.push(dzid);
  2484. }
  2485. }
  2486. if (cfg.dingwei == "1" && cfg.liupai == type) {
  2487. dzList1.push(dzid);
  2488. }
  2489. else if (cfg.dingwei == "2" && cfg.liupai == type) {
  2490. dzList2.push(dzid);
  2491. }
  2492. else if (cfg.dingwei == "3" && cfg.liupai == type) {
  2493. dzList3.push(dzid);
  2494. }
  2495. else if (cfg.dingwei == "1" && cfg.liupai == "5") {
  2496. wanbian1.push(dzid);
  2497. }
  2498. else if (cfg.dingwei == "2" && cfg.liupai == "5") {
  2499. wanbian2.push(dzid);
  2500. }
  2501. else if (cfg.dingwei == "3" && cfg.liupai == "5") {
  2502. wanbian3.push(dzid);
  2503. }
  2504. }
  2505. var push1 = 0; //记录前排放了几个弟子
  2506. var push2 = 0; //记录中排放了几个弟子
  2507. var push3 = 0; //记录后排放了几个弟子
  2508. //选出1个前排3个中排2个后排 优先选本流派,然后选万变流,否则选所有弟子里面战力最高的
  2509. if (dzList1.length > 0) {
  2510. //如果是只有一个就直接进去
  2511. if (dzList1.length == 1) {
  2512. tuijian["1"] = dzList1[0];
  2513. var index = gezi.indexOf("1");
  2514. if (index > -1) {
  2515. gezi.splice(index, 1);
  2516. }
  2517. push1 += 1;
  2518. }
  2519. else {
  2520. var maxPower = 0;
  2521. for (var _i = 0, dzList1_1 = dzList1; _i < dzList1_1.length; _i++) {
  2522. var dzid = dzList1_1[_i];
  2523. var power = this.ep_power_dizi(sevBack, dzid);
  2524. if (power > maxPower) {
  2525. maxPower = power;
  2526. tuijian["1"] = dzid;
  2527. var index = gezi.indexOf("1");
  2528. if (index > -1) {
  2529. gezi.splice(index, 1);
  2530. }
  2531. push1 += 1;
  2532. }
  2533. }
  2534. }
  2535. }
  2536. else if (wanbian1.length > 0 && push1 < 1) {
  2537. //没有就遍历万变流
  2538. //如果是只有一个就直接进去
  2539. if (wanbian1.length == 1) {
  2540. tuijian["1"] = wanbian1[0];
  2541. var index = gezi.indexOf("1");
  2542. if (index > -1) {
  2543. gezi.splice(index, 1);
  2544. }
  2545. push1 += 1;
  2546. }
  2547. else {
  2548. var maxPower = 0;
  2549. for (var _a = 0, wanbian1_1 = wanbian1; _a < wanbian1_1.length; _a++) {
  2550. var dzid = wanbian1_1[_a];
  2551. var power = this.ep_power_dizi(sevBack, dzid);
  2552. if (power > maxPower) {
  2553. maxPower = power;
  2554. tuijian["1"] = dzid;
  2555. var index = gezi.indexOf("1");
  2556. if (index > -1) {
  2557. gezi.splice(index, 1);
  2558. }
  2559. push1 += 1;
  2560. }
  2561. }
  2562. }
  2563. }
  2564. //放中排的
  2565. if (dzList2.length > 0) {
  2566. //如果是小于等于3个就直接放进去
  2567. if (dzList2.length <= 3) {
  2568. var xb = 4;
  2569. for (var i = 0; i < dzList2.length; i++) {
  2570. tuijian[(xb + i).toString()] = dzList2[i];
  2571. var index = gezi.indexOf((xb + i).toString());
  2572. if (index > -1) {
  2573. gezi.splice(index, 1);
  2574. }
  2575. push2 += 1;
  2576. }
  2577. }
  2578. else {
  2579. var needDzid = dzList2
  2580. .map(function (dzid) {
  2581. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2582. })
  2583. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2584. .slice(0, 3) // 选出战力最高的三个弟子
  2585. .map(function (item) { return item.dzid; }); // 只取 dzid
  2586. var xb = 4;
  2587. for (var i = 0; i < 3; i++) {
  2588. tuijian[(xb + i).toString()] = needDzid[i];
  2589. var index = gezi.indexOf((xb + i).toString());
  2590. if (index > -1) {
  2591. gezi.splice(index, 1);
  2592. }
  2593. push2 += 1;
  2594. }
  2595. }
  2596. }
  2597. else if (wanbian2.length > 0 && push2 < 3) {
  2598. //弟子不满足3个就遍历万变流
  2599. var needDzid = wanbian2
  2600. .map(function (dzid) {
  2601. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2602. })
  2603. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2604. .slice(0, 3 - push2) // 选出战力最高的需要的弟子数量
  2605. .map(function (item) { return item.dzid; }); // 只取 dzid
  2606. var xb = 4 + push2;
  2607. var cs = 2 - push3;
  2608. cs = Math.min(cs, wanbian2.length);
  2609. for (var i = 0; i < cs; i++) {
  2610. tuijian[(xb + i).toString()] = needDzid[i];
  2611. var index = gezi.indexOf((xb + i).toString());
  2612. if (index > -1) {
  2613. gezi.splice(index, 1);
  2614. }
  2615. push2 += 1;
  2616. }
  2617. }
  2618. //放后排的
  2619. if (dzList3.length > 0) {
  2620. //如果是小于等于2个就直接放进去
  2621. if (dzList3.length <= 2) {
  2622. var xb = 7;
  2623. for (var i = 0; i < dzList3.length; i++) {
  2624. tuijian[(xb + i).toString()] = dzList3[i];
  2625. var index = gezi.indexOf((xb + i).toString());
  2626. if (index > -1) {
  2627. gezi.splice(index, 1);
  2628. }
  2629. push3 += 1;
  2630. }
  2631. }
  2632. else {
  2633. var needDzid = dzList3
  2634. .map(function (dzid) {
  2635. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2636. })
  2637. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2638. .slice(0, 2) // 选出战力最高的2个弟子
  2639. .map(function (item) { return item.dzid; }); // 只取 dzid
  2640. var xb = 7;
  2641. for (var i = 0; i < 2; i++) {
  2642. tuijian[(xb + i).toString()] = needDzid[i];
  2643. var index = gezi.indexOf((xb + i).toString());
  2644. if (index > -1) {
  2645. gezi.splice(index, 1);
  2646. }
  2647. push3 += 1;
  2648. }
  2649. }
  2650. }
  2651. else if (wanbian3.length > 0 && push3 < 2) {
  2652. //弟子不满足2个就遍历万变流
  2653. var needDzid = wanbian3
  2654. .map(function (dzid) {
  2655. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2656. })
  2657. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2658. .slice(0, 2 - push3) // 选出战力最高的需要的弟子数量
  2659. .map(function (item) { return item.dzid; }); // 只取 dzid
  2660. var xb = 7 + push3;
  2661. var cs = 2 - push3;
  2662. cs = Math.min(cs, wanbian3.length);
  2663. for (var i = 0; i < cs; i++) {
  2664. tuijian[(xb + i).toString()] = needDzid[i];
  2665. var index = gezi.indexOf((xb + i).toString());
  2666. if (index > -1) {
  2667. gezi.splice(index, 1);
  2668. }
  2669. push3 += 1;
  2670. }
  2671. }
  2672. //如果遍历同派和万变流都没有符合的就优先从同站位最高战力里面拿
  2673. if (push1 < 1) {
  2674. //选择的流派和万变流都没有前排弟子就从其他前排弟子里面拿战力最高的
  2675. var needDzid = other1
  2676. .map(function (dzid) {
  2677. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2678. })
  2679. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2680. .slice(0, 1) // 选出战力最高的需要的弟子数量
  2681. .map(function (item) { return item.dzid; }); // 只取 dzid
  2682. var xb = 1;
  2683. var cs = Math.min(1, other1.length);
  2684. for (var i = 0; i < cs; i++) {
  2685. tuijian[(xb + i).toString()] = needDzid[i];
  2686. var index = gezi.indexOf((xb + i).toString());
  2687. if (index > -1) {
  2688. gezi.splice(index, 1);
  2689. }
  2690. //把用掉的弟子剔除
  2691. var index1 = other1.indexOf(needDzid[i]);
  2692. if (index1 > -1) {
  2693. other1.splice(index, 1);
  2694. }
  2695. }
  2696. }
  2697. if (push2 < 3) {
  2698. //选择的流派和万变流都没有前排弟子就从其他前排弟子里面拿战力最高的
  2699. var needDzid = other2
  2700. .map(function (dzid) {
  2701. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2702. })
  2703. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2704. .slice(0, 3 - push2) // 选出战力最高的需要的弟子数量
  2705. .map(function (item) { return item.dzid; }); // 只取 dzid
  2706. var xb = 4 + push2;
  2707. var cs = Math.min(3 - push2, other2.length);
  2708. for (var i = 0; i < cs; i++) {
  2709. tuijian[(xb + i).toString()] = needDzid[i];
  2710. var index = gezi.indexOf((xb + i).toString());
  2711. if (index > -1) {
  2712. gezi.splice(index, 1);
  2713. }
  2714. //把用掉的弟子剔除
  2715. var index1 = other2.indexOf(needDzid[i]);
  2716. if (index1 > -1) {
  2717. other2.splice(index, 1);
  2718. }
  2719. }
  2720. }
  2721. if (push3 < 2) {
  2722. //选择的流派和万变流都没有前排弟子就从其他前排弟子里面拿战力最高的
  2723. var needDzid = other3
  2724. .map(function (dzid) {
  2725. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2726. })
  2727. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2728. .slice(0, 2 - push3) // 选出战力最高的需要的弟子数量
  2729. .map(function (item) { return item.dzid; }); // 只取 dzid
  2730. var xb = 7 + push3;
  2731. var cs = Math.min(2 - push3, other3.length);
  2732. for (var i = 0; i < cs; i++) {
  2733. tuijian[(xb + i).toString()] = needDzid[i];
  2734. var index = gezi.indexOf((xb + i).toString());
  2735. if (index > -1) {
  2736. gezi.splice(index, 1);
  2737. }
  2738. //把用掉的弟子剔除
  2739. var index1 = other3.indexOf(needDzid[i]);
  2740. if (index1 > -1) {
  2741. other3.splice(index, 1);
  2742. }
  2743. }
  2744. }
  2745. //如果还是不足6个弟子就直接拿战力最高的前几个从空位开始放
  2746. if (Object.keys(tuijian).length < 6) {
  2747. //把其余的弟子合并
  2748. var other = this.addArr(other1, other2);
  2749. other = this.addArr(other, other3);
  2750. var needDzid = other
  2751. .map(function (dzid) {
  2752. return { dzid: dzid, power: _this.ep_power_dizi(sevBack, dzid) };
  2753. })
  2754. .sort(function (a, b) { return b.power - a.power; }) // 按战力从大到小排序
  2755. .slice(0, 6 - Object.keys(tuijian).length) // 选出战力最高的需要的弟子数量
  2756. .map(function (item) { return item.dzid; }); // 只取 dzid
  2757. for (var i = 0; i < needDzid.length; i++) {
  2758. //这个时候用掉的格子都已经删掉了,所以直接取就可以了
  2759. tuijian[gezi[i]] = needDzid[i];
  2760. }
  2761. }
  2762. return tuijian;
  2763. };
  2764. GameMethod.prototype.getSeedRand = function (seed) {
  2765. return new SeedRand(seed);
  2766. };
  2767. return GameMethod;
  2768. }());
  2769. //输出
  2770. exports.gameMethod = new GameMethod();
  2771. //种子随机
  2772. var SeedRand = /** @class */ (function () {
  2773. function SeedRand(seed) {
  2774. this.seed = seed;
  2775. }
  2776. /**
  2777. * 核心方法 输出一个小数
  2778. */
  2779. SeedRand.prototype.random = function () {
  2780. this.seed = (this.seed * 9301 + 49297) % 233280;
  2781. return this.seed / 233280.0;
  2782. };
  2783. SeedRand.prototype.random2 = function (seed) {
  2784. seed = (seed * 9301 + 49297) % 233280;
  2785. return seed / 233280.0;
  2786. };
  2787. /**
  2788. * 按照范围获取一个随机数
  2789. */
  2790. SeedRand.prototype.rand = function (min, max) {
  2791. var _rd = Math.round((max - min + 1) * this.random() - 0.5) + min;
  2792. return _rd;
  2793. };
  2794. /**
  2795. * 随机排列一个数组
  2796. */
  2797. SeedRand.prototype.arrayShuffle = function (arr) {
  2798. var len = arr.length;
  2799. for (var i = 0; i < len - 1; i++) {
  2800. var index = this.rand(0, len - i - 1);
  2801. var temp = arr[index];
  2802. arr[index] = arr[len - i - 1];
  2803. arr[len - i - 1] = temp;
  2804. }
  2805. return arr;
  2806. };
  2807. /**
  2808. * 随机获取数组元素
  2809. */
  2810. SeedRand.prototype.getRandArr = function (_arr, num) {
  2811. var arr = exports.gameMethod.objCopy(_arr);
  2812. var result = [];
  2813. num = Math.min(num, arr.length);
  2814. for (var i = 0; i < num; i++) {
  2815. var ran = Math.floor(this.random() * (arr.length - i));
  2816. result.push(arr[ran]);
  2817. arr[ran] = arr[arr.length - i - 1];
  2818. }
  2819. return result;
  2820. };
  2821. /**
  2822. * 随机获取数组元素 seed、_arr、num不变 随机出的数据完全一致
  2823. */
  2824. SeedRand.prototype.getRandArr2 = function (_arr, num) {
  2825. var arr = exports.gameMethod.objCopy(_arr);
  2826. var result = [];
  2827. num = Math.min(num, arr.length);
  2828. var seed = this.random2(this.seed);
  2829. for (var i = 0; i < num; i++) {
  2830. seed = this.random2(seed);
  2831. var ran = Math.floor(seed * arr.length);
  2832. result.push(arr[ran]);
  2833. arr.splice(ran, 1);
  2834. }
  2835. return { result: result, arr: arr };
  2836. };
  2837. return SeedRand;
  2838. }());
  2839. exports.SeedRand = SeedRand;
  2840. cc._RF.pop();
  2841. }
  2842. if (nodeEnv) {
  2843. __define(__module.exports, __require, __module);
  2844. }
  2845. else {
  2846. __quick_compile_project__.registerModuleFunc(__filename, function () {
  2847. __define(__module.exports, __require, __module);
  2848. });
  2849. }
  2850. })();
  2851. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvY29tbW9uL2dhbWVNZXRob2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EscUNBQWdDO0FBRWhDLElBQU0sSUFBSSxHQUFhO0lBQ25CLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtJQUNoSixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7Q0FDN0QsQ0FBQztBQUVGO0lBQUE7SUFveUZBLENBQUM7SUFueUZHOzs7O09BSUc7SUFDSCxpQ0FBWSxHQUFaLFVBQWEsRUFBVSxFQUFFLEtBQWE7UUFDbEMsSUFBSSxHQUFHLEdBQUcsaUJBQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNiLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMs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LElBQVMsRUFBRSxHQUFXO1FBQ2pDLElBQUksR0FBRyxHQUFRLGtCQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksTUFBTSxHQUFRLEVBQUUsQ0FBQztRQUNyQixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUNMLGVBQUM7QUFBRCxDQXRFQSxBQXNFQyxJQUFBO0FBdEVZLDRCQUFRIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgWHlzIGZyb20gXCIuL1h5c1wiO1xuaW1wb3J0IEdhbWVjZmcgZnJvbSBcIi4vZ2FtZUNmZ1wiO1xuXG5jb25zdCBnZXppOiBudW1iZXJbXSA9IFtcbiAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsXG4gICAgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1Myxcbl07XG5cbmNsYXNzIEdhbWVNZXRob2Qge1xuICAgIC8qKlxuICAgICAqIOmSu+efs+i0reS5sOmHkeW4geiOt+W+l+mBk+WFt+WFrOW8j1xuICAgICAqIEBwYXJhbSBpZCDphY3nva7ooajmoaPkvY1JRFxuICAgICAqIEBwYXJhbSBsZXZlbCDop5LoibLnrYnnuqdcbiAgICAgKi9cbiAgICBzaG9wQ29pbkl0ZW0oaWQ6IHN0cmluZywgbGV2ZWw6IG51bWJlcik6IFh5cy5LaW5kSXRlbSB7XG4gICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnNob3BDb2luLmdldEl0ZW0oaWQpO1xuICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBbMSwgMiwgMV07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvdW50ID0gY2ZnLnJhdGUgKiBNYXRoLm1pbigxMCArIE1hdGguZmxvb3IobGV2ZWwgLyAxMCksIDUwKTtcbiAgICAgICAgcmV0dXJuIFsxLCAyLCBjb3VudF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Lik5Liq5a+56LGh5ZCI5bm2XG4gICAgICogQHBhcmFtIG9iajEgZnJvbSBvYmplY3RcbiAgICAgKiBAcGFyYW0gb2JqMiB0byBvYmplY3RcbiAgICAgKiBAcmV0dXJuIG9iajJcbiAgICAgKi9cbiAgICBvYmpNZXJnZShvYmoxOiBhbnksIG9iajI6IGFueSkge1xuICAgICAgICBvYmoxID0gdHlwZW9mIG9iajEgIT0gXCJvYmplY3RcIiA/IHt9IDogb2JqMTtcbiAgICAgICAgb2JqMiA9IHR5cGVvZiBvYmoyICE9IFwib2JqZWN0XCIgPyB7fSA6IG9iajI7XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgICAgICAgaWYgKG9iajFba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmoyW2tleV0gPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHRoaXMub2JqTWVyZ2Uob2JqMVtrZXldLCBvYmoyW2tleV0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iajE7IC8v54S25ZCO5Zyo5oqK5aSN5Yi25aW955qE5a+56LGh57uZcmV0dXJu5Ye65Y67XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOS4pOS4quWvueixoeWQiOW5tiDlgLznm7jliqBcbiAgICAgKi9cbiAgICBvYmpNZXJnZU51bShfZXBzMTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgX2VwczI6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMxKTtcbiAgICAgICAgbGV0IGVwMjogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMyKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXAyKSB7XG4gICAgICAgICAgICBpZiAoZXBzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwc1trZXldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwc1trZXldICs9IGVwMltrZXldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5pWw57uE5ZCI5bm2XG4gICAgICovXG4gICAgYWRkQXJyKGFycjE6IGFueVtdLCBhcnIyOiBhbnlbXSkge1xuICAgICAgICBsZXQgX2FycjEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFycjEpKTtcbiAgICAgICAgbGV0IF9hcnIyID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcnIyKSk7XG4gICAgICAgIGZvciAoY29uc3QgYXJyIG9mIF9hcnIyKSB7XG4gICAgICAgICAgICBfYXJyMS5wdXNoKGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9hcnIxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4muWKoeWIpOepuiDku6XkuIvmg4XlhrXov5Tlm550cnVlXG4gICAgICog5a2X56ym5LiyIDog56m65a2X56ym55qE5Li656m6XG4gICAgICog5pWw5YC8OiAwIOS4uuepuiDotJ/mlbDkuI3kuLrnqbpcbiAgICAgKiDmlbDnu4Q6IOmVv+W6puS4ujBcbiAgICAgKiDlr7nosaE6IOayoeacieiKgueCuVxuICAgICAqIOW4g+WwlOWeiyBmYWxzZVxuICAgICAqL1xuICAgIGlzRW1wdHkodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09IG51bGwgfHwgdmFsdWUubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmAmueUqOa3seaLt+i0neWHveaVsOOAglxuICAgICAqIEBwYXJhbSBvYmogZnJvbSBvYmplY3RcbiAgICAgKiBAcmV0dXJuIG9iajJcbiAgICAgKi9cbiAgICBvYmpDb3B5PFQ+KG9iajogVCk6IFQge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAg55u45ZCMa2luZCDlkowgaXRlbWlkIOaVsOe7hOWQiOW5tlxuICAgICAqL1xuICAgIG1lcmdlQXJyKGFycnM6IFh5cy5LaW5kSXRlbVtdKSB7XG4gICAgICAgIGxldCByZXNPYmo6IHsgW2tpbmQ6IG51bWJlcl06IHsgW2l0ZW1pZDogbnVtYmVyXTogbnVtYmVyIH0gfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGFyciBvZiBhcnJzKSB7XG4gICAgICAgICAgICBpZiAocmVzT2JqW2FyclswXV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJlc09ialthcnJbMF1dID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzT2JqW2FyclswXV1bYXJyWzFdXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzT2JqW2FyclswXV1bYXJyWzFdXSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNPYmpbYXJyWzBdXVthcnJbMV1dICs9IGFyclsyXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzQXJyID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2luZCBpbiByZXNPYmopIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gcmVzT2JqW2tpbmRdKSB7XG4gICAgICAgICAgICAgICAgcmVzQXJyLnB1c2goW3BhcnNlSW50KGtpbmQpLCBwYXJzZUludChpZCksIHJlc09ialtraW5kXVtpZF1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzQXJyO1xuICAgIH1cblxuICAgIC8vIOWIpOaWreWtl+espumVv+W6plxuICAgIGdldFN0ckNoYXJhY3Rlckxlbmd0aChzdHI6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGxldCBwYXR0ZXJuQ2hpbmVzZSA9IG5ldyBSZWdFeHAoXCJbXFx1NEUwMC1cXHU5RkE1XStcIik7IC8vIOS4reaWh1xuICAgICAgICBsZXQgbGVuZyA9IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBpZiAocGF0dGVybkNoaW5lc2UudGVzdChzdHJbaW5kZXhdKSkge1xuICAgICAgICAgICAgICAgIGxlbmcgKz0gMjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGVuZyArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsZW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmaj+acuuaVsFxuICAgICAqIEBwYXJhbSBtaW5cbiAgICAgKiBAcGFyYW0gbWF4XG4gICAgICovXG4gICAgcmFuZChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKG1heCAtIG1pbiArIDEpICogTWF0aC5yYW5kb20oKSAtIDAuNSkgKyBtaW47XG4gICAgfVxuXG4gICAgLy/liKTmlq11dWlk5piv5ZCmbnBjXG4gICAgaXNOcGMoZnV1aWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoTnVtYmVyKGZ1dWlkKSA8IDEwMDAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhkRGlaaU1vZGVsUmF0ZShvdXQ6IFh5cy5IZERpWmlPdXQsIGRhdGE6IFh5cy5IZERpWmlEYXRhLCBhY3REaVppTGlzdDogeyBbZHppZDogc3RyaW5nXTogWHlzLkFjdERpWmlfSW5mbyB9KSB7XG4gICAgICAgIGxldCByYXRlID0gMDtcbiAgICAgICAgbGV0IHpSYXRlID0gMDtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcHppZCBpbiBvdXQudHJlZS5saXN0KSB7XG4gICAgICAgICAgICBpZiAoIWRhdGEubGlzdFtwemlkXSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGhkX2NmZ19lcnI6aGRRaVl1YW5Nb2RlbFJhdGU6IOaXoOaViOeahOWTgei0qElEICR7cHppZH1gKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgeWd6aWQgPSAxOyB5Z3ppZCA8PSBvdXQudHJlZS5saXN0W3B6aWRdLm9wZW47IHlnemlkKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgX3JhdGUgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBfelJhdGUgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBkemlkID0gb3V0LnRyZWUubGlzdFtwemlkXS5kekxpc3RbeWd6aWRdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghZHppZCB8fCAhYWN0RGlaaUxpc3RbZHppZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgX3JhdGUgKz0gTnVtYmVyKGRhdGEubWFrZVtcIjJcIl0uaXRlbVswXSk7XG4gICAgICAgICAgICAgICAgICAgIF96UmF0ZSArPSBOdW1iZXIoZGF0YS5tYWtlW1wiMlwiXS56SXRlbVswXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZHpJbmZvID0gYWN0RGlaaUxpc3RbZHppZF07XG4gICAgICAgICAgICAgICAgbGV0IGNmZ0R6SW5mbyA9IEdhbWVjZmcuaHVvYmFuQmFzZS5nZXRJdGVtKGR6SW5mby5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjZmdEekluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCBkenBpbnpoaSA9IGNmZ0R6SW5mby5waW56aGk7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8g562J57qn5Yqg5oiQXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbmNodSBvZiBkYXRhLm1ha2VbZHpwaW56aGkudG9TdHJpbmcoKV0ubGV2ZWxJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuY2h1WzBdIDw9IGR6SW5mby5sZXZlbCAmJiBkekluZm8ubGV2ZWwgPD0gY2hhbmNodVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JhdGUgKz0gTnVtYmVyKGNoYW5jaHVbMl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2hhbmNodSBvZiBkYXRhLm1ha2VbZHpwaW56aGkudG9TdHJpbmcoKV0ubGV2ZWxaSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmNodVswXSA8PSBkekluZm8ubGV2ZWwgJiYgZHpJbmZvLmxldmVsIDw9IGNoYW5jaHVbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF96UmF0ZSArPSBOdW1iZXIoY2hhbmNodVsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyDmmJ/nuqfliqDmiJBcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGFuY2h1IG9mIGRhdGEubWFrZVtkenBpbnpoaS50b1N0cmluZygpXS5zdGFySXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmNodVswXSA8PSBkekluZm8uc3RhciAmJiBkekluZm8uc3RhciA8PSBjaGFuY2h1WzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF0ZSArPSBOdW1iZXIoY2hhbmNodVsyXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjaGFuY2h1IG9mIGRhdGEubWFrZVtkenBpbnpoaS50b1N0cmluZygpXS5zdGFyWkl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5jaHVbMF0gPD0gZHpJbmZvLnN0YXIgJiYgZHpJbmZvLnN0YXIgPD0gY2hhbmNodVsxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3pSYXRlICs9IE51bWJlcihjaGFuY2h1WzJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKE51bWJlcihjZmdEekluZm8ubGl1cGFpKSA9PT0gTnVtYmVyKHB6aWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yYXRlICo9IE51bWJlcihkYXRhLm1ha2VbZHpwaW56aGkudG9TdHJpbmcoKV0uaXRlbVsyXSk7XG4gICAgICAgICAgICAgICAgICAgIF96UmF0ZSAqPSBOdW1iZXIoZGF0YS5tYWtlW2R6cGluemhpLnRvU3RyaW5nKCldLnpJdGVtWzJdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfcmF0ZSAqPSBOdW1iZXIoZGF0YS5tYWtlW2R6cGluemhpLnRvU3RyaW5nKCldLml0ZW1bMV0pO1xuICAgICAgICAgICAgICAgICAgICBfelJhdGUgKj0gTnVtYmVyKGRhdGEubWFrZVtkenBpbnpoaS50b1N0cmluZygpXS56SXRlbVsxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhdGUgKz0gX3JhdGU7XG4gICAgICAgICAgICAgICAgelJhdGUgKz0gX3pSYXRlO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiB7IHJhdGUsIHpSYXRlIH07XG4gICAgfVxuXG4gICAgXG4gICAgLy/moLnmja7pgJ/luqblkowg5b2T5YmNWFgg6K6h566X5Ye65b2T5YmN5oC756ev5YiGICDlhb3ngbVcbiAgICBoZERpWmlNb2RlbFRvdG9sKG91dDogWHlzLkhkRGlaaU91dCwgZGF0YTogWHlzLkhkRGlaaURhdGEsIHJhdGU6IG51bWJlciwgelJhdGU6IG51bWJlciwgbm93VGltZTogbnVtYmVyKSB7XG4gICAgICAgIC8v6L+H5LqG5aSa6ZW/5pe26Ze0XG4gICAgICAgIGxldCBkdGltZSA9IG5vd1RpbWUgLSBvdXQudHJlZS5zX3RpbWU7XG4gICAgICAgIC8v5qC55o2u6YCf5bqmIOaOieiQvVxuICAgICAgICAvL+eOsOWcqOaUueS4uumZkOWItuS6p+WHuuaXtumXtO+8jOiAjOS4jeaYr+mZkOWItuS6p+WHuuaVsOmHj1xuICAgICAgICBkdGltZSA9IE1hdGgubWluKGR0aW1lLCBkYXRhLnRyZWUuc2NvcmVUaW1lTWF4KTtcbiAgICAgICAgbGV0IHNjb3JlID0gTWF0aC5yb3VuZCgocmF0ZSAqIGR0aW1lKSAvIDM2MDApO1xuICAgICAgICBsZXQgdG90b2wgPSBzY29yZSArIG91dC50cmVlLnNfbnVtO1xuICAgICAgICBjb25zdCB6U2NvcmUgPSBNYXRoLnJvdW5kKCh6UmF0ZSAqIGR0aW1lKSAvIDM2MDApO1xuICAgICAgICBsZXQgelRvdGFsID0gelNjb3JlICsgb3V0LnRyZWUuel9udW07XG4gICAgICAgIC8vIGlmICh0b3RvbCA+IGRhdGEudHJlZS5zY29yZU1heCkge1xuICAgICAgICAvLyAgICAgLy/lrp7pmYXkuqflh7pcbiAgICAgICAgLy8gICAgIGxldCBzaiA9IGRhdGEudHJlZS5zY29yZU1heCAtIG91dC50cmVlLnNfbnVtO1xuICAgICAgICAvLyAgICAgLy/lrp7pmYXkuqflh7og5omA6ZyA5pe26Ze0XG4gICAgICAgIC8vICAgICBkdGltZSA9IE1hdGgucm91bmQoKHNqIC8gcmF0ZSkgKiAzNjAwKTtcbiAgICAgICAgLy8gICAgIC8v6I635b6X55qE5oC75Lqn5Ye6XG4gICAgICAgIC8vICAgICB0b3RvbCA9IGRhdGEudHJlZS5zY29yZU1heDtcbiAgICAgICAgLy8gfVxuICAgICAgICAvL+agueaNrumAn+eOhyDnu5PnrpdcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRvdG9sOiB0b3RvbCwgLy/lvZPliY3mgLvkuqflh7pcbiAgICAgICAgICAgIHpUb3RhbDogelRvdGFsLCAvL+i1t+a6kOS5i+W+geaAu+S6p+WHulxuICAgICAgICAgICAgZHRpbWU6IGR0aW1lLCAvL+acrOasoeiuoeeulyDlrp7pmYXkuqflh7rml7bplb9cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflv4PprZTnp6/liIbojIPlm7RcbiAgICAgKi9cbiAgICBoZFNob3VMaW5nU2NvcmUoXG4gICAgICAgIHhtSWQ6IHN0cmluZyxcbiAgICAgICAgY2ZnOiBYeXMuSGRTaG91TGluZ0RhdGEsXG4gICAgICAgIGFjdFNob3VMaW5nOiB7IFtnemlkOiBzdHJpbmddOiBPbWl0PFh5cy5BY3RTaG91TGluZ19MaXN0T25lLCAnc2snPiB9ID0ge30sXG4gICAgICAgIGd6aWRzOiBzdHJpbmdbXSA9IFtdXG4gICAgKTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGxldCBzaG91bGluZ0NmZyA9IGNmZy5zaG91bGluZ1t4bUlkXTtcbiAgICAgICAgaWYgKHNob3VsaW5nQ2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHhtSWRfZXJyIDoke3htSWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gWzAsIDBdO1xuICAgICAgICB9XG4gICAgICAgIC8v5Yid5aeL56ev5YiGOiDlv4PprZTnp6/liIZcbiAgICAgICAgbGV0IHNjb3JlczogW251bWJlciwgbnVtYmVyXSA9IFtzaG91bGluZ0NmZy5zY29yZVswXSwgc2hvdWxpbmdDZmcuc2NvcmVbMV1dO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGd6aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgZ3ppZCA9IGd6aWRzW2ldO1xuICAgICAgICAgICAgbGV0IGFkZE9uZSA9IGdhbWVNZXRob2QuaGRTaG91TGluZ1Njb3JlT25lKGNmZywgYWN0U2hvdUxpbmcsIGd6aWQpO1xuICAgICAgICAgICAgc2NvcmVzWzBdICs9IGFkZE9uZVswXTtcbiAgICAgICAgICAgIHNjb3Jlc1sxXSArPSBhZGRPbmVbMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNjb3JlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICog5b+D6a2U6K6h566XIOS4gOS4quWuoOeJqeWKoOeahOenr+WIhlxuICAgICAqL1xuICAgIGhkU2hvdUxpbmdTY29yZU9uZShjZmc6IFh5cy5IZFNob3VMaW5nRGF0YSwgc2xpbmZvOiB7IFtnemlkOiBzdHJpbmddOiBPbWl0PFh5cy5BY3RTaG91TGluZ19MaXN0T25lLCAnc2snPiB9LCBnemlkOiBzdHJpbmcpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgICAgICAgLy/liJ3lp4vnp6/liIY6IOW/g+mtlOenr+WIhlxuICAgICAgICBsZXQgc2FkZDogW251bWJlciwgbnVtYmVyXSA9IFswLCAwXTtcblxuICAgICAgICAvL+aYr+WQpuWtmOWcqFxuICAgICAgICBpZiAoc2xpbmZvW2d6aWRdID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGZ6SW5mb19udWxsIDoke2d6aWR9YCk7XG4gICAgICAgICAgICByZXR1cm4gc2FkZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v6I635Y+W5rOV6Zi1562J57qn6YWN572uXG4gICAgICAgIGxldCBjZmdzbCA9IEdhbWVjZmcuc2hvdWxpbmdJbmZvLmdldEl0ZW0oc2xpbmZvW2d6aWRdLnNsaWQpO1xuICAgICAgICBpZiAoY2Znc2wgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgY2Znc2xfbnVsbCA6JHtnemlkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHNhZGQ7XG4gICAgICAgIH1cblxuICAgICAgICAvL+etiee6p+enr+WIhue0r+WKoFxuICAgICAgICBpZiAoY2ZnLnNNYXRoW2NmZ3NsLnBpbnpoaS50b1N0cmluZygpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvL1vnp6/liIbku7flgLws56ev5YiG5LiL6ZmQLOenr+WIhuS4iumZkCzns7vmlbDkuIvpmZAs57O75pWw5LiK6ZmQXVxuICAgICAgICAgICAgbGV0IHB6Y2ZnID0gY2ZnLnNNYXRoW2NmZ3NsLnBpbnpoaS50b1N0cmluZygpXTtcbiAgICAgICAgICAgIC8v56ev5YiG5Lu35YC8XG4gICAgICAgICAgICBzYWRkWzBdICs9IHB6Y2ZnLnhpc2h1WzBdO1xuICAgICAgICAgICAgc2FkZFsxXSArPSBwemNmZy54aXNodVswXTtcbiAgICAgICAgICAgIC8v56ev5YiG5LiK5LiL6ZmQXG4gICAgICAgICAgICBzYWRkWzBdICs9IHB6Y2ZnLnhpc2h1WzFdO1xuICAgICAgICAgICAgc2FkZFsxXSArPSBwemNmZy54aXNodVsyXTtcbiAgICAgICAgICAgIC8v56ev5YiG57O75pWwICog562J57qnKHNhdmVJZClcbiAgICAgICAgICAgIHNhZGRbMF0gKz0gc2xpbmZvW2d6aWRdLmxldmVsICogcHpjZmcueGlzaHVbM107XG4gICAgICAgICAgICBzYWRkWzFdICs9IHNsaW5mb1tnemlkXS5sZXZlbCAqIHB6Y2ZnLnhpc2h1WzRdO1xuICAgICAgICAgICAgLy/np6/liIbns7vmlbAgKiDmmJ/nuqcoc2F2ZUlkKVxuICAgICAgICAgICAgc2FkZFswXSArPSBzbGluZm9bZ3ppZF0uc3RhciAqIHB6Y2ZnLnhpc2h1WzVdO1xuICAgICAgICAgICAgc2FkZFsxXSArPSBzbGluZm9bZ3ppZF0uc3RhciAqIHB6Y2ZnLnhpc2h1WzZdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzYWRkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+eBteiEieenr+WIhuS6p+WHulxuICAgICAqL1xuICAgIGxpbmdNYWlTY29yZShqaW5namllSWQ6IHN0cmluZywgY2hlbmdoYW9JZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGNmZ0Jhc2UgPSBHYW1lY2ZnLm1hdGhJbmZvLmdldEl0ZW0oXCJsaW5nbWFpX2Jhc2Vfc2NvcmVcIik7XG4gICAgICAgIGlmIChjZmdCYXNlID09IG51bGwgfHwgY2ZnQmFzZS5wcmFtID09IG51bGwgfHwgY2ZnQmFzZS5wcmFtLmNvdW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/orqHnrpflooPnlYzliqDmiJBcbiAgICAgICAgbGV0IGppbmdqaWVBZGQgPSAwO1xuICAgICAgICBsZXQgamluZ2ppZUNmZyA9IEdhbWVjZmcuamluZ2ppZVN0ZXAuZ2V0SXRlbShqaW5namllSWQpO1xuICAgICAgICBpZiAoamluZ2ppZUNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICBqaW5namllQWRkID0gamluZ2ppZUNmZy5sbWpjO1xuICAgICAgICB9XG4gICAgICAgIC8v6K6h566X56ew5Y+35Yqg5oiQXG4gICAgICAgIGxldCB0aXRsZUFkZCA9IDA7XG4gICAgICAgIGxldCB0aXRsZUNmZyA9IEdhbWVjZmcuY2hlbmdoYW9JbmZvLmdldEl0ZW0oY2hlbmdoYW9JZCk7XG4gICAgICAgIGlmICh0aXRsZUNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aXRsZUFkZCA9IHRpdGxlQ2ZnLmpjO1xuICAgICAgICB9XG4gICAgICAgIC8v5Yid5aeL56ev5YiGOiDlv4PprZTnp6/liIZcbiAgICAgICAgbGV0IHNjb3JlcyA9IE1hdGgucm91bmQoY2ZnQmFzZS5wcmFtLmNvdW50ICogKDEgKyBqaW5namllQWRkIC8gMTAwKSAqICgxICsgdGl0bGVBZGQgLyAxMDApKTtcbiAgICAgICAgcmV0dXJuIHNjb3JlcztcbiAgICB9XG4gICAgLy8tLS0tLS0tLS0tLS0tLeWxnuaAp+iuoeeulyDvvIjkuLvop5Lln7rnoYDlsZ7mgKcg77yJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyDvvIjlpKnotYvmlbDlgLwr6KOF5aSH5pWw5YC8K+WfuuehgOWxnuaAp++8iSrvvIgxK+eZvuWIhuavlOWKoOaIkO+8iT3pnaLmnb/lsZ7mgKdcblxuICAgIC8qKlxuICAgICAqIOWxnuaAp+WQiOW5tlxuICAgICAqL1xuICAgIGVwX21lcmdlKF9lcHMxOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LCBfZXBzMjogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiBhbnkgPSB0aGlzLm9iakNvcHkoX2VwczEpO1xuICAgICAgICBsZXQgZXAyOiBhbnkgPSB0aGlzLm9iakNvcHkoX2VwczIpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlcDIpIHtcbiAgICAgICAgICAgIGlmIChlcHNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXBzW2tleV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzW2tleV0gKz0gZXAyW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZXBzLmhwID0gZXBzLmhwX21heCB8fCAwO1xuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHtba2V5OnN0cmluZ106bnVtYmVyfSDlsZ7mgKflkIjlubYgX2VwczLnmoRrZXkgX2VwczHmsqHmnInlsLHkuI3liqBcbiAgICAgKi9cbiAgICBlcF9tZXJnZUt2X2hhcyhfZXBzMTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgX2VwczI6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMxKTtcbiAgICAgICAgbGV0IGVwMjogYW55ID0gdGhpcy5vYmpDb3B5KF9lcHMyKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXAyKSB7XG4gICAgICAgICAgICBpZiAoZXBzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzW2tleV0gKz0gZXAyW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgZXBzW1wiaHBcIl0gPSBlcHNbXCJocF9tYXhcIl07IC8v5LiN6KaB5YigXG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICoge1trZXk6c3RyaW5nXTpudW1iZXJ9IOWxnuaAp+WQiOW5tiB4IOezu+aVsFxuICAgICAqL1xuICAgIGVwX0t2UmF0ZShfZXBzMTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSwgcmF0ZTogbnVtYmVyKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IGFueSA9IHRoaXMub2JqQ29weShfZXBzMSk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVwcykge1xuICAgICAgICAgICAgZXBzW2tleV0gPSBNYXRoLmZsb29yKGVwc1trZXldICogcmF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlsZ7mgKfliJ3lp4vljJZcbiAgICAgKi9cbiAgICBlcF9pbml0KCk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiBhbnkgPSB7fTtcbiAgICAgICAgbGV0IHVzZXJFcFBvb2wgPSBHYW1lY2ZnLnVzZXJFcC5wb29sO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB1c2VyRXBQb29sKSB7XG4gICAgICAgICAgICBlcHNbdXNlckVwUG9vbFtrZXldLmtleV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6KeS6Imy5Z+656GA5bGe5oCnXG4gICAgICovXG4gICAgZXBfdXNlcigpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBsZXQgdXNlckVwUG9vbCA9IEdhbWVjZmcudXNlckVwLnBvb2w7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHVzZXJFcFBvb2wpIHtcbiAgICAgICAgICAgIGVwc1t1c2VyRXBQb29sW2tleV0ua2V5XSA9IHVzZXJFcFBvb2xba2V5XS5pbml0RXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG4gICAgLyoqXG4gICAgICog5bGe5oCn5bGV56S65oC75bGe5oCnXG4gICAgICovXG4gICAgZXBfYWxsX2Jhc2Uoc2V2QmFjazogWHlzLlNldkJhY2spOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgLy/lsZ7mgKfliJ3lp4vljJZcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHRoaXMuZXBfaW5pdCgpO1xuICAgICAgICAvLyvop5LoibLln7rnoYDlsZ7mgKdcbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBfdXNlcigpKTtcblxuICAgICAgICAvL+WQjuerr+iusOW9leeahOWxnuaAp1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RFcHMgIT0gbnVsbCAmJiBzZXZCYWNrLmFjdEVwcy5hICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2lkIGluIHNldkJhY2suYWN0RXBzLmEpIHtcbiAgICAgICAgICAgICAgICBlcHMgPSBnYW1lTWV0aG9kLmVwX21lcmdlKGVwcywgc2V2QmFjay5hY3RFcHMuYVtraWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVwc1tcImhwXCJdID0gTWF0aC5yb3VuZChlcHNbXCJocFwiXSk7XG4gICAgICAgIGVwc1tcImF0a1wiXSA9IE1hdGgucm91bmQoZXBzW1wiYXRrXCJdKTtcbiAgICAgICAgZXBzW1wiZGVmXCJdID0gTWF0aC5yb3VuZChlcHNbXCJkZWZcIl0pO1xuICAgICAgICByZXR1cm4gZ2FtZU1ldGhvZC5vYmpDb3B5KGVwcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5bGe5oCn5bGV56S65oC75bGe5oCnIO+8iOmdouadv+WxnuaAp++8iVxuICAgICAqIOmdouadv+WxnuaApyA9IOinkuiJsuWfuuehgOWxnuaAp1xuICAgICAqL1xuICAgIGVwX2FsbChzZXZCYWNrOiBYeXMuU2V2QmFjayk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzID0gdGhpcy5lcF9hbGxfYmFzZShzZXZCYWNrKTtcbiAgICAgICAgLy/mlLvpgJ9cbiAgICAgICAgZXBzLnNwZWVkICs9IE1hdGguZmxvb3IoKGVwcy5zcGVlZCAqIGVwcy5zcGVlZF9wZXIpIC8gMTAwMDApO1xuICAgICAgICAvL+aUu+WHu1xuICAgICAgICBlcHMuYXRrICs9IE1hdGguZmxvb3IoKGVwcy5hdGsgKiBlcHMuYXRrX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5hdGsgKz0gTWF0aC5mbG9vcigoZXBzLmF0ayAqIGVwcy5maW5hbGx5X2F0a19wZXIpIC8gMTAwMDApO1xuICAgICAgICAvL+mYsuW+oVxuICAgICAgICBlcHMuZGVmICs9IE1hdGguZmxvb3IoKGVwcy5kZWYgKiBlcHMuZGVmX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5kZWYgKz0gTWF0aC5mbG9vcigoZXBzLmRlZiAqIGVwcy5maW5hbGx5X2RlZl9wZXIpIC8gMTAwMDApO1xuICAgICAgICAvL+ihgOmHj1xuICAgICAgICBlcHMuaHBfbWF4ICs9IE1hdGguZmxvb3IoKGVwcy5ocF9tYXggKiBlcHMuaHBfbWF4X3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5ocF9tYXggKz0gTWF0aC5mbG9vcigoZXBzLmhwX21heCAqIGVwcy5maW5hbGx5X2hwX21heF9wZXIpIC8gMTAwMDApO1xuICAgICAgICBlcHMuaHAgPSBlcHMuaHBfbWF4O1xuXG4gICAgICAgIC8v5pS76YCfXG4gICAgICAgIGVwcy5zcGVlZF9wZXIgPSAwO1xuICAgICAgICAvL+aUu+WHu1xuICAgICAgICBlcHMuYXRrX3BlciA9IDBcbiAgICAgICAgZXBzLmZpbmFsbHlfYXRrX3BlciA9IDBcbiAgICAgICAgLy/pmLLlvqFcbiAgICAgICAgZXBzLmRlZl9wZXIgPSAwXG4gICAgICAgIGVwcy5maW5hbGx5X2RlZl9wZXIgPSAwO1xuICAgICAgICAvL+ihgOmHj1xuICAgICAgICBlcHMuaHBfbWF4X3BlciA9IDA7XG4gICAgICAgIGVwcy5maW5hbGx5X2hwX21heF9wZXIgPSAwO1xuXG4gICAgICAgIHJldHVybiBnYW1lTWV0aG9kLm9iakNvcHkoZXBzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlsZ7mgKflsZXnpLrmgLvlsZ7mgKcg77yI6Z2i5p2/5bGe5oCn77yJXG4gICAgICog6Z2i5p2/5bGe5oCnID0g6KeS6Imy5Z+656GA5bGe5oCnXG4gICAgICovXG4gICAgZXBfYWxsX2ZpZ2h0KGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBlcHMgPSBnYW1lTWV0aG9kLm9iakNvcHkoZXBzKVxuICAgICAgICAvL+aUu+mAn1xuICAgICAgICBlcHMuc3BlZWQgKz0gTWF0aC5mbG9vcigoZXBzLnNwZWVkICogZXBzLnNwZWVkX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIC8v5pS75Ye7XG4gICAgICAgIGVwcy5hdGsgKz0gTWF0aC5mbG9vcigoZXBzLmF0ayAqIGVwcy5hdGtfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBzLmF0ayArPSBNYXRoLmZsb29yKChlcHMuYXRrICogZXBzLmZpbmFsbHlfYXRrX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5hdGsgKz0gZXBzLmZpbmFsbHlfYXRrXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGVwcy5kZWYgKz0gTWF0aC5mbG9vcigoZXBzLmRlZiAqIGVwcy5kZWZfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBzLmRlZiArPSBNYXRoLmZsb29yKChlcHMuZGVmICogZXBzLmZpbmFsbHlfZGVmX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5kZWYgKz0gZXBzLmZpbmFsbHlfZGVmXG4gICAgICAgIC8v6KGA6YePXG4gICAgICAgIGVwcy5ocF9tYXggKz0gTWF0aC5mbG9vcigoZXBzLmhwX21heCAqIGVwcy5ocF9tYXhfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBzLmhwX21heCArPSBNYXRoLmZsb29yKChlcHMuaHBfbWF4ICogZXBzLmZpbmFsbHlfaHBfbWF4X3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwcy5ocF9tYXggKz0gZXBzLmZpbmFsbHlfaHBfbWF4XG4gICAgICAgIGVwcy5ocCA9IGVwcy5ocF9tYXg7XG5cbiAgICAgICAgLy/mlLvpgJ9cbiAgICAgICAgZXBzLnNwZWVkX3BlciA9IDA7XG4gICAgICAgIC8v5pS75Ye7XG4gICAgICAgIGVwcy5hdGtfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9hdGtfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9hdGsgPSAwXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGVwcy5kZWZfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9kZWZfcGVyID0gMDtcbiAgICAgICAgZXBzLmZpbmFsbHlfZGVmID0gMDtcbiAgICAgICAgLy/ooYDph49cbiAgICAgICAgZXBzLmhwX21heF9wZXIgPSAwO1xuICAgICAgICBlcHMuZmluYWxseV9ocF9tYXhfcGVyID0gMDtcbiAgICAgICAgZXBzLmZpbmFsbHlfaHBfbWF4ID0gMDtcblxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWxnuaAp+WxleekuuaAu+WxnuaApyDvvIjpnaLmnb/lsZ7mgKfvvInmmL7npLrmnIDnu4jlsZ7mgKdcbiAgICAgKi9cbiAgICBlcF9hbGxfenooZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9KTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGVwcyA9IGdhbWVNZXRob2Qub2JqQ29weShlcHMpXG4gICAgICAgIC8v5pS75Ye7XG4gICAgICAgIGxldCBhdGs6bnVtYmVyID0gZXBzLmF0a1xuICAgICAgICBhdGsgKz0gZXBzLmF0a19wZXI/IE1hdGguZmxvb3IoKGF0ayAqIGVwcy5hdGtfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBhdGsgKz0gZXBzLmZpbmFsbHlfYXRrX3Blcj9NYXRoLmZsb29yKChhdGsgKiBlcHMuZmluYWxseV9hdGtfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBhdGsgKz0gZXBzLmZpbmFsbHlfYXRrXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGxldCBkZWY6bnVtYmVyID0gZXBzLmRlZlxuICAgICAgICBkZWYgKz0gZXBzLmRlZl9wZXI/IE1hdGguZmxvb3IoKGRlZiAqIGVwcy5kZWZfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBkZWYgKz0gZXBzLmZpbmFsbHlfZGVmX3Blcj9NYXRoLmZsb29yKChkZWYgKiBlcHMuZmluYWxseV9kZWZfcGVyKSAvIDEwMDAwKTowO1xuICAgICAgICBkZWYgKz0gZXBzLmZpbmFsbHlfZGVmXG4gICAgICAgIC8v6KGA6YePXG4gICAgICAgIGxldCBocF9tYXg6bnVtYmVyID0gZXBzLmhwX21heFxuICAgICAgICBocF9tYXggKz0gZXBzLmhwX21heF9wZXI/TWF0aC5mbG9vcigoaHBfbWF4ICogZXBzLmhwX21heF9wZXIpIC8gMTAwMDApOjA7XG4gICAgICAgIGhwX21heCArPSBlcHMuZmluYWxseV9ocF9tYXhfcGVyP01hdGguZmxvb3IoKGhwX21heCAqIGVwcy5maW5hbGx5X2hwX21heF9wZXIpIC8gMTAwMDApOjA7XG4gICAgICAgIGhwX21heCArPSBlcHMuZmluYWxseV9ocF9tYXhcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFwiZmluYWxseV9hdGtcIjphdGssXG4gICAgICAgICAgICBcImZpbmFsbHlfZGVmXCI6ZGVmLFxuICAgICAgICAgICAgXCJmaW5hbGx5X2hwX21heFwiOmhwX21heCxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog5Li76KeS5oiY5paX5bGe5oCnXG4gICAgICovXG4gICAgZXBfZmlnaHQoc2V2QmFjazogWHlzLlNldkJhY2spOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwcyA9IHRoaXMuZXBfYWxsKHNldkJhY2spO1xuICAgICAgICAvL+aUu+mAn1xuICAgICAgICBlcHMuc3BlZWRfcGVyID0gMDtcbiAgICAgICAgLy/mlLvlh7tcbiAgICAgICAgZXBzLmF0a19wZXIgPSAwXG4gICAgICAgIGVwcy5maW5hbGx5X2F0a19wZXIgPSAwXG4gICAgICAgIC8v6Ziy5b6hXG4gICAgICAgIGVwcy5kZWZfcGVyID0gMFxuICAgICAgICBlcHMuZmluYWxseV9kZWZfcGVyID0gMDtcbiAgICAgICAgLy/ooYDph49cbiAgICAgICAgZXBzLmhwX21heF9wZXIgPSAwO1xuICAgICAgICBlcHMuZmluYWxseV9ocF9tYXhfcGVyID0gMDtcbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIOW8n+WtkOaImOaWl+WxnuaAp1xuICAgICAqIEBwYXJhbSBkekluZm8g5byf5a2Q5L+h5oGvXG4gICAgICogQHBhcmFtIGVwcyDkuLvop5LlsZ7mgKdcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIGVwX2ZpZ2h0X2RpemkoZHpJbmZvOiBYeXMuQWN0RGlaaV9JbmZvLCBlcHNBbGw6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGR6RXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7IC8v5Yid5aeL5YyW5bGe5oCnXG4gICAgICAgIGxldCBjZmdkeiA9IEdhbWVjZmcuaHVvYmFuQmFzZS5nZXRJdGVtKGR6SW5mby5pZCk7XG4gICAgICAgIGlmIChjZmdkeiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZHpFcHM7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNmZ1pob25nWnUgPSBHYW1lY2ZnLmh1b2Jhblpob25nenUuZ2V0SXRlbShjZmdkei5waW56aGksIGNmZ2R6Lnpob25nenUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBkekVwcztcbiAgICAgICAgfVxuICAgICAgICBkekVwcyA9IGdhbWVNZXRob2QuZXBfbWVyZ2UoZHpFcHMsIGNmZ2R6LmVwcyk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyKSB7XG4gICAgICAgICAgICAvL+e7p+aJv+S4u+inkuWxnuaAp1xuICAgICAgICAgICAgZHpFcHNba2V5XSArPSBNYXRoLmZsb29yKChlcHNBbGxba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyX2hpZGUpIHtcbiAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKGVwc0FsbFtrZXldICogY2ZnWmhvbmdadS5pbmhlcml0X2F0dHJfaGlkZVtrZXldKSAvIDEwMDAwKTtcbiAgICAgICAgfVxuICAgICAgICBkekVwcy5ocCA9IGR6RXBzLmhwX21heDtcbiAgICAgICAgcmV0dXJuIGR6RXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmYteazlVxuICAgICAqL1xuICAgIGVwX3poZW5mYShhY3RaaGVuZmE6IFh5cy5BY3RaaGVuZmFOZXcpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBjb25zdCBjaHVhbktleXMgPSBPYmplY3Qua2V5cyhhY3RaaGVuZmEuY2h1YW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNodWFuS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgYnV3ZWkgPSBjaHVhbktleXNbaV07XG4gICAgICAgICAgICAvL+ijheWkh+WxnuaAp1xuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGFjdFpoZW5mYS5jaHVhbltidXdlaV0uZXBzKTtcbiAgICAgICAgICAgIC8v6ZmE6a2U5bGe5oCnXG4gICAgICAgICAgICBsZXQgYWRkRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZtRXBzIG9mIGFjdFpoZW5mYS5jaHVhbltidXdlaV0uZm1FcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWRkRXBzW2ZtRXBzWzBdXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZEVwc1tmbUVwc1swXV0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhZGRFcHNbZm1FcHNbMF1dICs9IGZtRXBzWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDmtJfnu4PlsZ7mgKdcbiAgICAgICAgICAgIGZvciAoY29uc3QgcG9zSWQgaW4gYWN0WmhlbmZhLmNodWFuW2J1d2VpXS54aWxpYW5FcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0WmhlbmZhLmNodWFuW2J1d2VpXS54aWxpYW5FcHNbcG9zSWRdLmlkID09IG51bGwgfHwgYWN0WmhlbmZhLmNodWFuW2J1d2VpXS54aWxpYW5FcHNbcG9zSWRdLmlkID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCB4aWxpYW5fYyA9IEdhbWVjZmcuemhlbmZhWGlsaWFuV29yZC5nZXRJdGVtKGFjdFpoZW5mYS5jaHVhbltidXdlaV0ueGlsaWFuRXBzW3Bvc0lkXS5pZCk7XG4gICAgICAgICAgICAgICAgaWYgKHhpbGlhbl9jICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHhpbGlhbl9jLmF0dHIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGFkZEVwcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmYteazlVxuICAgICAqL1xuICAgIGVwX3poZW5mYV9saXN0KGFjdFpoZW5mYTogWHlzLkFjdFpoZW5mYU5ldyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8vIOmYteazlU5ld1xuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGFjdFpoZW5mYS56Zkxpc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCB6ZkJhc2UgPSBHYW1lY2ZnLnpmeHRaZmJhc2UuZ2V0SXRlbShrZXlzW2ldKTtcbiAgICAgICAgICAgIGlmICh6ZkJhc2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCB6ZlNoZW5namkgPSBHYW1lY2ZnLnpmeHRaZnNoZW5namkuZ2V0SXRlbSh6ZkJhc2UucGluemhpLCBhY3RaaGVuZmEuemZMaXN0W2tleXNbaV1dLmxldmVsLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmICh6ZlNoZW5namkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgemZTaGVuZ2ppLmF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWkp+W4neWPpOWtl1xuICAgICAqL1xuICAgIGVwX2RhZGlndXppKGFjdERhZGlHdXppOiBYeXMuQWN0RGFkaUd1emksIG1mTGlzdDogeyBbbWZpZDogc3RyaW5nXTogWHlzLm1mSW5mbyB9KTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGFjdERhZGlHdXppLm1wTGlzdFthY3REYWRpR3V6aS5tcFhoaWRdKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBidXdlaSA9IGtleXNbaV07XG4gICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGFjdERhZGlHdXppLm1wTGlzdFthY3REYWRpR3V6aS5tcFhoaWRdW2J1d2VpXSkgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGFjdERhZGlHdXppLm1wTGlzdFthY3REYWRpR3V6aS5tcFhoaWRdW2J1d2VpXS5lcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/kuIrpmLXliJfooahcbiAgICAgICAgbGV0IHN6TWZpZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGNvbnN0IG1mWmhhbktleXMgPSBPYmplY3Qua2V5cyhhY3REYWRpR3V6aS5tZlpoYW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1mWmhhbktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IF90eXBlID0gbWZaaGFuS2V5c1tpXTtcbiAgICAgICAgICAgIGlmIChhY3REYWRpR3V6aS5tZlpoYW5bX3R5cGVdID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN6TWZpZHMucHVzaChhY3REYWRpR3V6aS5tZlpoYW5bX3R5cGVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8v5LuZ5rOVICsg6ZOt5paHXG4gICAgICAgIGNvbnN0IG1mTGlzdEtleXMgPSBPYmplY3Qua2V5cyhtZkxpc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1mTGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG1maWQgPSBtZkxpc3RLZXlzW2ldO1xuICAgICAgICAgICAgbGV0IGNmZ1hmSW5mbyA9IEdhbWVjZmcuZGFkaWd1emlYZmluZm8uZ2V0SXRlbShtZmlkKTtcbiAgICAgICAgICAgIGlmIChjZmdYZkluZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcuZGFkaWd1emlYZmx2LmdldEl0ZW0oY2ZnWGZJbmZvLnBpbnpoaS50b1N0cmluZygpLCBtZkxpc3RbbWZpZF0ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXBzW1wiaHBfbWF4XCJdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzW1wiaHBfbWF4XCJdID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVwc1tcImF0a1wiXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVwc1tcImF0a1wiXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlcHNbXCJkZWZcIl0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHNbXCJkZWZcIl0gPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVwc1tcImhwX21heFwiXSArPSBjZmcuaHBfbWF4O1xuICAgICAgICAgICAgICAgIGVwc1tcImF0a1wiXSArPSBjZmcuYXRrO1xuICAgICAgICAgICAgICAgIGVwc1tcImRlZlwiXSArPSBjZmcuZGVmO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc3pNZmlkcy5pbmRleE9mKG1maWQpID09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8v5rKh5LiK6Zi1IOS4jeWKoOmTreaWh+WxnuaAp1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBtd2lkIG9mIG1mTGlzdFttZmlkXS5td0xvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAobXdpZCA9PSBudWxsIHx8IG13aWQgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNmZ013ID0gR2FtZWNmZy5kYWRpZ3V6aU1pbmd3ZW4uZ2V0SXRlbShtd2lkKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnTXcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnTXcuZXBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL+WbvumJtFxuICAgICAgICBjb25zdCB0amxpc3RLZXlzID0gT2JqZWN0LmtleXMoYWN0RGFkaUd1emkudGpsaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0amxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBfa2V5ID0gdGpsaXN0S2V5c1tpXTtcbiAgICAgICAgICAgIGxldCBjZmd0ak5ldyA9IEdhbWVjZmcuZGFkaWd1emlYZnRqLmdldEl0ZW0oX2tleSwgYWN0RGFkaUd1emkudGpsaXN0W19rZXldLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKGNmZ3RqTmV3ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmd0ak5ldy5lcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflvJ/lrZDlhajlsYDlsZ7mgKcg5byf5a2Q5Yqg5oiQ5Y+q5pyJ56qB56C05bGe5oCn5ZKM5Zu+6Ym05Yqg5oiQXG4gICAgICovXG4gICAgZXBfZGl6aV9iYXNlKGFjdERpWmk6IFh5cy5BY3REaVppLCBhY3REaVppTGlzdDogeyBbZGl6aTogc3RyaW5nXTogWHlzLkFjdERpWmlfSW5mb30pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBjb25zdCBkekxpc3RLZXlzID0gT2JqZWN0LmtleXMoYWN0RGlaaUxpc3QpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR6TGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGR6aWQgPSBkekxpc3RLZXlzW2ldO1xuICAgICAgICAgICAgLy/orqHnrpflvJ/lrZDpmLbnuqflsZ7mgKdcbiAgICAgICAgICAgIGxldCBkaXppID0gYWN0RGlaaUxpc3RbZHppZF07XG4gICAgICAgICAgICAvLyBsZXQgbnVtID0gZGl6aS5sZXZlbCAlIDU7XG4gICAgICAgICAgICBjb25zdCBkaVppU3Rhcl9jID0gR2FtZWNmZy5odW9iYW5TdGFyLmdldEl0ZW0oZHppZCwgZGl6aS5zdGFyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKGRpWmlTdGFyX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IE51bWJlcihkaVppU3Rhcl9jLnN0YXIpOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2ZnU3RlcCA9IEdhbWVjZmcuaHVvYmFuU3Rhci5nZXRJdGVtKGR6aWQsIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjZmdTdGVwICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGVwRXBzID0gY2ZnU3RlcC5hdHRyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHN0ZXBFcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/orqHnrpflvJ/lrZDlm77pibTlsZ7mgKdcbiAgICAgICAgY29uc3QgdHVqaWFuS2V5cyA9IE9iamVjdC5rZXlzKGFjdERpWmkudHVqaWFuKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0dWppYW5LZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB0dWppYW5LZXkgPSB0dWppYW5LZXlzW2ldO1xuICAgICAgICAgICAgY29uc3QgZGl6aVR1Smlhbl9jID0gR2FtZWNmZy5odW9iYW5UdWppYW4uZ2V0SXRlbSh0dWppYW5LZXksIGFjdERpWmkudHVqaWFuW3R1amlhbktleV0udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoZGl6aVR1Smlhbl9jID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBkaXppVHVKaWFuX2MuYXR0cik7XG4gICAgICAgIH1cblxuICAgICAgICAvL+earuiCpOWxnuaAp1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR6TGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGR6aWQgPSBkekxpc3RLZXlzW2ldO1xuICAgICAgICAgICAgbGV0IGRpemkgPSBhY3REaVppTGlzdFtkemlkXTtcbiAgICAgICAgICAgIGlmKCFhY3REaVppTGlzdFtkemlkXS5za2lucyl7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhY3REaVppTGlzdFtkemlkXS5za2lucykge1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGFjdERpWmlMaXN0W2R6aWRdLnNraW5zW2tleV0ubGV2ZWw7XG4gICAgICAgICAgICAgICAgbGV0IHNraW5DZmcgPSBHYW1lY2ZnLmh1b2JhblNraW5sZXZlbC5nZXRJdGVtKGtleSwgbGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYoc2tpbkNmZyl7XG4gICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBza2luQ2ZnLmxldmVsRXBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgZXBfc2hvdWxpbmdfc2hlbmd4aWFvKGFjdFNob3VMaW5nTGlzdDogeyBbZ3ppZDogc3RyaW5nXTogWHlzLkFjdFNob3VMaW5nX0xpc3RPbmUgfSkge1xuICAgICAgICBsZXQgc2hvdWxpbmdMaXN0OiB7IFtzbGlkOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBsZXQgZ3pMaXN0OiB7IFtzbGlkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICBjb25zdCBsaXN0S2V5cyA9IE9iamVjdC5rZXlzKGFjdFNob3VMaW5nTGlzdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdEtleXNbaV07XG4gICAgICAgICAgICBpZiAoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSAhPSBudWxsICYmIGdhbWVNZXRob2QuaXNFbXB0eShhY3RTaG91TGluZ0xpc3RbaW5kZXhdLnNsaWQpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpZCA9IGFjdFNob3VMaW5nTGlzdFtpbmRleF0uc2xpZDtcbiAgICAgICAgICAgICAgICBjb25zdCBlcHMgPSB0aGlzLmVwX3Nob3VsaW5nX2dlemkoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSk7XG4gICAgICAgICAgICAgICAgY29uc3QgemhhbmxpID0gZXBzW1wiaHBfbWF4X3BlclwiXTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1poYW5saSA9IHNob3VsaW5nTGlzdFtzbGlkXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdaaGFubGkgPT09IHVuZGVmaW5lZCB8fCB6aGFubGkgPiBleGlzdGluZ1poYW5saSkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGluZ0xpc3Rbc2xpZF0gPSB6aGFubGk7XG4gICAgICAgICAgICAgICAgICAgIGd6TGlzdFtzbGlkXSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgZ3pJZGxpc3Q6IGFueVtdID0gW107XG4gICAgICAgIGxldCBnekxpc3RLZXlzID0gT2JqZWN0LmtleXMoZ3pMaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnekxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBneklkbGlzdC5wdXNoKGd6TGlzdFtnekxpc3RLZXlzW2ldXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGd6SWRsaXN0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+WFveeBteaAu+WxnuaAp+WKoOaIkFxuICAgICAqL1xuICAgIGVwX3Nob3VsaW5nKGFjdFNob3VMaW5nTGlzdDogeyBbZ3ppZDogc3RyaW5nXTogWHlzLkFjdFNob3VMaW5nX0xpc3RPbmUgfSwgYWN0U2hvdUxpbmc6IFh5cy5BY3RTaG91TGluZywgaml1eGlhbzogbnVtYmVyID0gMCk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8v6K6h566X5YW954G15bGe5oCn5oC75Yqg5oiQKOS4jeWMheWQq+aKgOiDvSlcbiAgICAgICAgbGV0IHNob3VsaW5nTGlzdDogeyBbc2xpZDogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgbGV0IGd6TGlzdDogeyBbc2xpZDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICAgICAgLy/pgY3ljoblh7rmnIDpq5jlsZ7mgKfnmoTlhb3ngbXnmoTmoLzlrZBpZFxuICAgICAgICBjb25zdCBsaXN0S2V5cyA9IE9iamVjdC5rZXlzKGFjdFNob3VMaW5nTGlzdCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdEtleXNbaV07XG4gICAgICAgICAgICBpZiAoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSAhPSBudWxsICYmIGdhbWVNZXRob2QuaXNFbXB0eShhY3RTaG91TGluZ0xpc3RbaW5kZXhdLnNsaWQpID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xpZCA9IGFjdFNob3VMaW5nTGlzdFtpbmRleF0uc2xpZDtcbiAgICAgICAgICAgICAgICBjb25zdCBlcHMgPSB0aGlzLmVwX3Nob3VsaW5nX2dlemkoYWN0U2hvdUxpbmdMaXN0W2luZGV4XSk7XG4gICAgICAgICAgICAgICAgY29uc3QgemhhbmxpID0gZXBzW1wiaHBfbWF4X3BlclwiXTtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1poYW5saSA9IHNob3VsaW5nTGlzdFtzbGlkXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdaaGFubGkgPT09IHVuZGVmaW5lZCB8fCB6aGFubGkgPiBleGlzdGluZ1poYW5saSkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGluZ0xpc3Rbc2xpZF0gPSB6aGFubGk7XG4gICAgICAgICAgICAgICAgICAgIGd6TGlzdFtzbGlkXSA9IGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnekxpc3RLZXlzID0gT2JqZWN0LmtleXMoZ3pMaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnekxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBneiA9IGd6TGlzdEtleXNbaV07XG4gICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGd6TGlzdFtnel0pID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBfc2hvdWxpbmdfZ2V6aShhY3RTaG91TGluZ0xpc3RbZ3pMaXN0W2d6XV0sIGppdXhpYW8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+e+gee7iuWxnuaAp+WKoOaIkFxuICAgICAgICBsZXQgamliYW4gPSBhY3RTaG91TGluZy5qaWJhbjtcbiAgICAgICAgY29uc3QgamliYW5LZXlzID0gT2JqZWN0LmtleXMoYWN0U2hvdUxpbmcuamliYW4pO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGppYmFuS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgamJpZCA9IGppYmFuS2V5c1tpXTtcbiAgICAgICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoamliYW5bamJpZF0ubGV2ZWwpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnSmlCYW4gPSBHYW1lY2ZnLnNob3VsaW5nSmliYW4uZ2V0SXRlbShqYmlkLCBqaWJhbltqYmlkXS5sZXZlbC50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChjZmdKaUJhbiA9PSBudWxsIHx8IGNmZ0ppQmFuLmVwcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnSmlCYW4uZXBzKTtcbiAgICAgICAgfVxuICAgICAgICAvL+S4iumYteWFveeBteiiq+WKqOWxnuaAp+WKoOaIkFxuICAgICAgICBjb25zdCB1c2VHeklkS2V5cyA9IE9iamVjdC5rZXlzKGFjdFNob3VMaW5nLnVzZUd6SWQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZUd6SWRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VHeklkID0gdXNlR3pJZEtleXNbaV07XG4gICAgICAgICAgICBsZXQgc2tCZGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgbGV0IGd6aWQgPSBhY3RTaG91TGluZy51c2VHeklkW3VzZUd6SWRdO1xuICAgICAgICAgICAgaWYgKGd6aWQgPT0gbnVsbCB8fCBnemlkID09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzaG91bGluZyA9IGFjdFNob3VMaW5nTGlzdFtnemlkXTtcbiAgICAgICAgICAgIGlmIChzaG91bGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5zaG91bGluZ0luZm8uZ2V0SXRlbShzaG91bGluZy5zbGlkKTtcbiAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHBpbnpoaUNmZyA9IEdhbWVjZmcuc2hvdWxpbmdQaW56aGkuZ2V0SXRlbShjZmcucGluemhpKTtcbiAgICAgICAgICAgIGlmIChwaW56aGlDZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/kuLvnq5lcbiAgICAgICAgICAgIGlmICh1c2VHeklkID09IFwiMFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2tCZEtleXMgPSBPYmplY3Qua2V5cyhzaG91bGluZy5za0JkKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNrQmRLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjYW9JZCA9IHNrQmRLZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2tpbGwgPSBzaG91bGluZy5za0JkW2Nhb0lkXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ0VmZmVjdCA9IEdhbWVjZmcuc2hvdWxpbmdCZWlkb25nLmdldEl0ZW0oc2tpbGwuc2tpbGxJZC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ0VmZmVjdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3RXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgICAgICAgICAgICAgIG5ld0Vwc1tjZmdFZmZlY3QudHlwZV0gPSBjZmdFZmZlY3QuZXNwW3NraWxsLmx2IC0gMV07XG4gICAgICAgICAgICAgICAgICAgIHNrQmRlcHMgPSB0aGlzLmVwX21lcmdlKHNrQmRlcHMsIG5ld0Vwcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBza0JkS2V5cyA9IE9iamVjdC5rZXlzKHNob3VsaW5nLnNrQmQpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tCZEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhb0lkID0gc2tCZEtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBza2lsbCA9IHNob3VsaW5nLnNrQmRbY2FvSWRdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2ZnRWZmZWN0ID0gR2FtZWNmZy5zaG91bGluZ0JlaWRvbmcuZ2V0SXRlbShza2lsbC5za2lsbElkLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnRWZmZWN0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgbmV3RXBzW2NmZ0VmZmVjdC50eXBlXSA9IGNmZ0VmZmVjdC5lc3Bbc2tpbGwubHYgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJkRXBzID0gZ2FtZU1ldGhvZC5vYmpDb3B5KG5ld0Vwcyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiZEVwc0tleXMgPSBPYmplY3Qua2V5cyhiZEVwcyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmRFcHNLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gYmRFcHNLZXlzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmRFcHNba2V5XSA9IE1hdGgucm91bmQoKGJkRXBzW2tleV0gKiBwaW56aGlDZmcuc2tPZGRzKSAvIDEwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2tCZGVwcyA9IHRoaXMuZXBfbWVyZ2Uoc2tCZGVwcywgYmRFcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBza0JkZXBzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5Y2V5Liq6YGT5Y+L55qE5bGe5oCnXG4gICAgICovXG4gICAgZXBfZGFveW91KGRhb3lvdTogWHlzLkFjdERhb3lvdSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IG9uZSBpbiBkYW95b3UuZGFveW91TWFwKSB7XG4gICAgICAgICAgICBsZXQgZHlpZCA9IGRhb3lvdS5kYW95b3VNYXBbb25lXS5kaWQ7XG4gICAgICAgICAgICBsZXQgbGV2ZWwgPSBkYW95b3UuZGFveW91TWFwW29uZV0uZmF2b3JMdjtcbiAgICAgICAgICAgIGxldCBza2tpbGxzID0gZGFveW91LmRhb3lvdU1hcFtvbmVdLnNraWxsO1xuICAgICAgICAgICAgLy/orqHnrpfnrYnnuqflsZ7mgKfliqDmiJBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5kYW95b3VGYXZvckx2LmdldEl0ZW0oZHlpZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZy5lcHMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v6K6h566X5oqA6IO95bGe5oCn5Yqg5oiQXG4gICAgICAgICAgICBmb3IgKGxldCBzayBvZiBza2tpbGxzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNmZ1NraWxsID0gR2FtZWNmZy5kYW95b3VTa2lsbEx2LmdldEl0ZW0oc2sudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGNmZ1NraWxsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNmZ1NraWxsVHlwZSA9IEdhbWVjZmcuZGFveW91U2tpbGxUeXBlLmdldEl0ZW0oY2ZnU2tpbGwuc2lkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZ1NraWxsVHlwZSAhPSBudWxsICYmIGNmZ1NraWxsVHlwZS50eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyhjZmdTa2lsbFR5cGUucGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IGNmZ1NraWxsLnZhbHVlW09iamVjdC5rZXlzKGNmZ1NraWxsVHlwZS5wYXJhbSkuaW5kZXhPZihrZXkpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZmdTa2lsbFR5cGUucGFyYW1ba2V5XSA9IG51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdTa2lsbFR5cGUucGFyYW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOWNleS4quazleWuneeahOWxnuaAp1xuICAgICAqL1xuICAgIGVwX2ZhYmFvKGFjdEZhQmFvOiBYeXMuQWN0RmFCYW8pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGZhYmFvIG9mIE9iamVjdC52YWx1ZXMoYWN0RmFCYW8uZmFiYW9MaXN0KSkge1xuICAgICAgICAgICAgLy8g5Z+656GA5bGe5oCnXG4gICAgICAgICAgICBsZXQgY2ZnRmJJbmZvID0gR2FtZWNmZy5mYWJhb0luZm8uZ2V0SXRlbShmYWJhby5mYklkKTtcbiAgICAgICAgICAgIGlmIChjZmdGYkluZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdGYkluZm8uYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDljYfnuqflsZ7mgKdcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2ZnIG9mIE9iamVjdC52YWx1ZXMoR2FtZWNmZy5mYWJhb1VwbGV2ZWwucG9vbCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnLmlkLnRvU3RyaW5nKCkgPT09IGZhYmFvLmZiSWQgJiYgY2ZnLmxldmVsIDw9IGZhYmFvLmxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcuYXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5Y2H5pif5bGe5oCnXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNmZyBvZiBPYmplY3QudmFsdWVzKEdhbWVjZmcuZmFiYW9VcHN0YXIucG9vbCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2ZnLmlkLnRvU3RyaW5nKCkgPT09IGZhYmFvLmZiSWQgJiYgY2ZnLmxldmVsIDw9IGZhYmFvLnN0YXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDms5Xlrp3nvoHnu4rnmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBlcF9mYWJhb0ppYmFuKGFjdEZhQmFvOiBYeXMuQWN0RmFCYW8pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwcyA9IHt9O1xuICAgICAgICBjb25zdCBqaWJhbkxpc3RLZXlzID0gT2JqZWN0LmtleXMoYWN0RmFCYW8uamliYW5MaXN0KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBqaWJhbkxpc3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBqYklkID0gamliYW5MaXN0S2V5c1tpXTtcbiAgICAgICAgICAgIC8vIOe+gee7iuWxnuaAp1xuICAgICAgICAgICAgbGV0IGNmZ0piSW5mbyA9IEdhbWVjZmcuZmFiYW9KaWJhbi5nZXRJdGVtKGpiSWQsIGFjdEZhQmFvLmppYmFuTGlzdC5zdGFyLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKGNmZ0piSW5mbyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdKYkluZm8uYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDlvZPliY3looPnlYznmoTlsZ7mgKdcbiAgICAgKi9cbiAgICBlcF9qaW5namllKGFjdEppbmdKaWU6IFh5cy5BY3RKaW5nSmllLCBqaW5namllSWQ6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgICAgICAgLy/nqoHnoLTlkI7ojrflvpflsZ7mgKdcbiAgICAgICAgbGV0IHBvb2wgPSBHYW1lY2ZnLmppbmdqaWVTdGVwLnBvb2xcbiAgICAgICAgbGV0IG1heEx2Om51bWJlciA9IDBcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcG9vbCkge1xuICAgICAgICAgICAgLy/looPnlYzlsZ7mgKco55uu5qCH5Z6LKVxuICAgICAgICAgICAgaWYoTnVtYmVyKGppbmdqaWVJZCkgPT0gTnVtYmVyKHBvb2xba2V5XS5pZCkpe1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBwb29sW2tleV0udHBfZXBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhZGRDb3VudCA9IDBcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBtYXhMdisxOyBpIDw9IHBvb2xba2V5XS5tYXhsdjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYoaSA+IGFjdEppbmdKaWUubGV2ZWwpe1xuICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5qaW5namllTGV2ZWwuZ2V0SXRlbShpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy/nrYnnuqfojrflvpflsZ7mgKco55uu5qCH5Z6LKVxuICAgICAgICAgICAgICAgIGlmKGkgPT0gYWN0SmluZ0ppZS5sZXZlbCl7XG4gICAgICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcuZXBzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYoaSA9PSBhY3RKaW5nSmllLmxldmVsKXtcbiAgICAgICAgICAgICAgICAgICAgYWRkQ291bnQgKz0gTWF0aC5yb3VuZChhY3RKaW5nSmllLmV4cCAvY2ZnLmV4cFsyXSk7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGFkZENvdW50ICs9IE1hdGgucm91bmQoY2ZnLm5lZWRFeHAgL2NmZy5leHBbMl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v5Zug5Li65bGe5oCn5pivM+asoeS4gOS4quW+queOr1xuICAgICAgICAgICAgLy8g6K6h566X5q+P5LiqIGVwcyDnmoTmiafooYzmrKHmlbBcbiAgICAgICAgICAgIGNvbnN0IGVwczFDb3VudCA9IE1hdGguZmxvb3IoKGFkZENvdW50ICsgMikgLyAzKTsgLy8gZXBzMSDlupTnlKjnmoTmrKHmlbBcbiAgICAgICAgICAgIGNvbnN0IGVwczJDb3VudCA9IE1hdGguZmxvb3IoKGFkZENvdW50ICsgMSkgLyAzKTsgLy8gZXBzMiDlupTnlKjnmoTmrKHmlbBcbiAgICAgICAgICAgIGNvbnN0IGVwczNDb3VudCA9IE1hdGguZmxvb3IoYWRkQ291bnQgLyAzKTsgLy8gZXBzMyDlupTnlKjnmoTmrKHmlbBcblxuICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBfS3ZSYXRlKHBvb2xba2V5XS5lcHMxLGVwczFDb3VudCkpOyBcbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCB0aGlzLmVwX0t2UmF0ZShwb29sW2tleV0uZXBzMixlcHMyQ291bnQpKTsgXG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgdGhpcy5lcF9LdlJhdGUocG9vbFtrZXldLmVwczMsZXBzM0NvdW50KSk7IFxuXG4gICAgICAgICAgICBtYXhMdiA9IHBvb2xba2V5XS5tYXhsdlxuICAgICAgICAgICAgaWYobWF4THYgPj0gYWN0SmluZ0ppZS5sZXZlbCl7XG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOS4luWutuenmOacr1xuICAgICAqXG4gICAgICovXG4gICAgZXBfY2x1Yk1pU2h1KGFjdENsdWJNaVNodTogWHlzLkFjdENsdWJNaVNodSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8vIOS4luWutueti+mqqFxuICAgICAgICBjb25zdCBqaW5HdUtleXMgPSBPYmplY3Qua2V5cyhhY3RDbHViTWlTaHUuamluR3UpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGppbkd1S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGppbkd1S2V5c1tpXTtcbiAgICAgICAgICAgIGxldCBsdiA9IGFjdENsdWJNaVNodS5qaW5HdVt0eXBlXTtcbiAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLmNsdWJNaVNodUppbkd1LmdldEl0ZW0odHlwZSwgbHYudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnLmVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8g5LiW5a6256eY5pyv562L6aqo562L6aqo5YWo562J57qn6L6+5YiwICzpop3lpJbliqDmiJDlsZ7mgKdcbiAgICAgICAgbGV0IG1pbkx2S2V5ID0gT2JqZWN0LmtleXMoYWN0Q2x1Yk1pU2h1Lmppbkd1KS5yZWR1Y2UoKHByZSwgY3VyKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0Q2x1Yk1pU2h1Lmppbkd1W2N1cl0gPCBhY3RDbHViTWlTaHUuamluR3VbcHJlXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJlO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IG1pbkx2MSA9IGFjdENsdWJNaVNodS5qaW5HdVttaW5MdktleV07XG4gICAgICAgIC8vIDAsMTAsMjAsMzAuLi5cbiAgICAgICAgbGV0IEppbkd1SmMgPSBHYW1lY2ZnLmNsdWJNaVNodUppbkd1SmMuZ2V0SXRlbSgoTWF0aC5mbG9vcihtaW5MdjEgLyAxMCkgKiAxMCkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChKaW5HdUpjICE9IG51bGwpIHtcbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBKaW5HdUpjLmVwcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDkuJblrrbnu4/nu5xcbiAgICAgICAgbGV0IGpsTGlzdCA9IGFjdENsdWJNaVNodS5qbGxpc3Q7XG4gICAgICAgIGZvciAobGV0IGpsaWQgaW4gamxMaXN0KSB7XG4gICAgICAgICAgICBsZXQgY2ZnSmwgPSBHYW1lY2ZnLmNsdWJNaVNodUppbmdsdW8uZ2V0SXRlbShqbGlkLCBqbExpc3RbamxpZF0ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnSmwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdKbC5hZGRFcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNmZ0psUSA9IEdhbWVjZmcuY2x1Yk1pU2h1SmxxdWFsaXR5LmdldEl0ZW0oYWN0Q2x1Yk1pU2h1LmN1ckpsUXVhbGl0eS50b1N0cmluZygpKTtcbiAgICAgICAgaWYgKGNmZ0psUSAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnSmxRLnF1YWxpdHlFcCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDkuJblrrblnKPlhbVcbiAgICAgKlxuICAgICAqL1xuICAgIGVwX2NsdWJTaGVuZ0IoYWN0Q2x1YlNoZW5nQjogWHlzLkFjdENsdWJTaGVuZ0IpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAvLyDojrflj5blvZPliY3mlrnmoYjnmoTmiYDmnInkvY3nva7nmoTor43mnaFcbiAgICAgICAgZm9yIChsZXQgcG9zSWQgaW4gYWN0Q2x1YlNoZW5nQi5wbGFuW2FjdENsdWJTaGVuZ0IuY3VyUGxhbl0pIHtcbiAgICAgICAgICAgIC8vIOiOt+WPluivjeadoemFjee9rlxuICAgICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcuY2x1YlNoZW5nQldvcmQuZ2V0SXRlbShhY3RDbHViU2hlbmdCLnBsYW5bYWN0Q2x1YlNoZW5nQi5jdXJQbGFuXVtwb3NJZF0uaWQpO1xuICAgICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8g566X5LiA5LiL56ys5LiA5Liq5bGe5oCn55qE5YC8XG4gICAgICAgICAgICAgICAgbGV0IG4gPSBjZmcuYXR0cltPYmplY3Qua2V5cyhjZmcuYXR0cilbMF1dICsgYWN0Q2x1YlNoZW5nQi5wbGFuW2FjdENsdWJTaGVuZ0IuY3VyUGxhbl1bcG9zSWRdLnJhbmdlO1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCB7IFtPYmplY3Qua2V5cyhjZmcuYXR0cilbMF1dOiBuIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAgLyoqXG4gICAgICog5a6X6ZeoLemXqOW+klxuICAgICAqXG4gICAgICovXG4gICAgIGVwc196b25nTWVuX21lbnR1KG1lbnR1OiBYeXMubWVudHUsIGppdXhpYW86IG51bWJlciA9IDApe1xuICAgICAgICBsZXQgbWVudHVfZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmKCFtZW50dS5iYXNpY0F0dHIpe1xuICAgICAgICAgICAgcmV0dXJuIG1lbnR1X2Vwc1xuICAgICAgICB9XG4gICAgICAgIG1lbnR1X2VwcyA9IG1lbnR1LmJhc2ljQXR0clxuICAgICAgICBsZXQgX21lbnR1ID0gbWVudHUubWFycmllZD8uW09iamVjdC5rZXlzKG1lbnR1Lm1hcnJpZWQpWzBdXT8ubWVudHVJbmZvO1xuICAgICAgICBpZiAoX21lbnR1ICYmIF9tZW50dS5iYXNpY0F0dHIpIHtcbiAgICAgICAgICAgIC8vIF9tZW50dS5iYXNpY0F0dHLnmoTlgLzmnIDlpJrkuI3otoXov4dtZW50dS5iYXNpY0F0dHLnmoQzMDAlXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBfbWVudHUuYmFzaWNBdHRyKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lbnR1LmJhc2ljQXR0cltrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVudHUuYmFzaWNBdHRyW2tleV0gPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoX21lbnR1LmJhc2ljQXR0cltrZXldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgX21lbnR1LmJhc2ljQXR0cltrZXldID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IG5DZmcgPSBHYW1lY2ZnLm1hdGhJbmZvLmdldEl0ZW0oXCJ6b25nTWVuX2FkZF9iYXNpY0F0dHJfbGltaXRcIik7XG4gICAgICAgICAgICAgICAgaWYgKG5DZmcgIT0gbnVsbCAmJiBuQ2ZnLnByYW0gIT0gbnVsbCAmJiBuQ2ZnLnByYW0uY291bnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBfbWVudHUuYmFzaWNBdHRyW2tleV0gPSBNYXRoLm1pbiggTWF0aC5mbG9vcihtZW50dS5iYXNpY0F0dHJba2V5XSAqIG5DZmcucHJhbS5jb3VudCksIF9tZW50dS5iYXNpY0F0dHJba2V5XSApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1lbnR1X2VwcyA9IHRoaXMuZXBfbWVyZ2UobWVudHVfZXBzLCBfbWVudHUuYmFzaWNBdHRyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5lcF9LdlJhdGUobWVudHVfZXBzLCAxICsgaml1eGlhbyk7XG4gICAgIH1cbiAgICAgICAgXG4gICAgLyoqXG4gICAgICog5a6X6ZeoXG4gICAgICpcbiAgICAgKi9cbiAgICBlcF96b25nTWVuKFxuICAgICAgICBfYWN0Wm9uZ01lbk1lbnR1THMxOiB7IFtpZDogc3RyaW5nXTogWHlzLm1lbnR1IH0sXG4gICAgICAgIF9hY3Rab25nTWVuTWVudHVMczI6IHsgW2lkOiBzdHJpbmddOiBYeXMubWVudHUgfSxcbiAgICAgICAgX2FjdFpvbmdNZW46IFh5cy5BY3Rab25nTWVuLHNob3dCYXNpY0F0dHI6Ym9vbGVhbiA9IHRydWUsXG4gICAgICAgIGppdXhpYW86IG51bWJlciA9IDBcbiAgICApOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgLy8g6K6w5b2V5Z+656GAXG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICAgICAgICAvLyDorrDlvZXlp5Tku7vnmoTnibnmrorlsZ7mgKdcbiAgICAgICAgbGV0IHNwZUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG4gICAgICAgIC8vIOaLt+i0neS4gOS7veaVsOaNrlxuICAgICAgICBsZXQgYWN0Wm9uZ01lbk1lbnR1THMxID0gZ2FtZU1ldGhvZC5vYmpDb3B5KF9hY3Rab25nTWVuTWVudHVMczEpO1xuICAgICAgICBsZXQgYWN0Wm9uZ01lbk1lbnR1THMyID0gZ2FtZU1ldGhvZC5vYmpDb3B5KF9hY3Rab25nTWVuTWVudHVMczIpO1xuICAgICAgICBsZXQgYWN0Wm9uZ01lbiA9IGdhbWVNZXRob2Qub2JqQ29weShfYWN0Wm9uZ01lbik7XG4gICAgICAgIC8vIOiOt+WPluWul+mXqOetiee6p+mFjee9rlxuICAgICAgICBsZXQgem1fY2ZnID0gR2FtZWNmZy56b25nTWVuSW5mby5nZXRJdGVtKGFjdFpvbmdNZW4ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICh6bV9jZmcgPT0gbnVsbCkgcmV0dXJuIGVwcztcblxuICAgICAgICAvLyDlp5Tku7vliqDlsZ7mgKdcbiAgICAgICAgZm9yIChjb25zdCBpZCBpbiBhY3Rab25nTWVuLmFwcG9pbnRQb3MpIHtcbiAgICAgICAgICAgIGxldCBtZW50dUlkID0gYWN0Wm9uZ01lbi5hcHBvaW50UG9zW2lkXS5tZW50dUlkO1xuICAgICAgICAgICAgLy8g6I635Y+W5pyq57uT5aW955qE6Zeo5b6S5L+h5oGvXG4gICAgICAgICAgICBsZXQgbWVudHUgPSBhY3Rab25nTWVuLm1lbnR1W21lbnR1SWRdIHx8IGFjdFpvbmdNZW5NZW50dUxzMVttZW50dUlkXTtcbiAgICAgICAgICAgIC8vIOWmguaenOiOt+WPluS4jeWIsOmXqOW+kuS/oeaBr++8jOivtOaYjuaYr+W3sue7j+e7k+WlveeahOmXqOW+ku+8jOS7juW3sue7k+WlveeahOmXqOW+kuWIl+ihqOS4reiOt+WPllxuICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3lt7Lnu4/nu5Plpb3nmoTpl6jlvpJTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICBpZiAobWVudHUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIOe7k+WlveeahOmXqOW+kuacieS4pOS4qumXqOW+ku+8jOmcgOimgeWIhuWIq+iuoeeulyDkuIDkuKrmmK/oh6rlt7HvvIzkuIDkuKrmmK/phY3lgbZcbiAgICAgICAgICAgICAgICAvLyAxLiDnibnmrorlsZ7mgKdcbiAgICAgICAgICAgICAgICAvL+iHquW3sVxuICAgICAgICAgICAgICAgIG1lbnR1ID0gYWN0Wm9uZ01lbk1lbnR1THMyW21lbnR1SWRdO1xuICAgICAgICAgICAgICAgIGlmIChtZW50dSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgc3BlQXR0cjEgPSBtZW50dS5zcGVBdHRyIHx8IFtdO1xuICAgICAgICAgICAgICAgIC8vIOmFjeWBtlxuXG4gICAgICAgICAgICAgICAgbGV0IF9tZW50dSA9IG1lbnR1Lm1hcnJpZWQ/LltPYmplY3Qua2V5cyhtZW50dS5tYXJyaWVkKVswXV0/Lm1lbnR1SW5mbztcbiAgICAgICAgICAgICAgICBsZXQgc3BlQXR0cjIgPSBfbWVudHU/LnNwZUF0dHIgfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHJJZCBvZiBzcGVBdHRyMS5jb25jYXQoc3BlQXR0cjIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnpvbmdNZW5TcGVBdHRyLmdldEl0ZW0oYXR0cklkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ZnICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgW2F0dHJLZXksIGF0dHJWYWx1ZV0gPSBPYmplY3QuZW50cmllcyhjZmcuYXR0cilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXBzT2JqID0geyBbYXR0cktleV06IGF0dHJWYWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZUVwcyA9IHRoaXMuZXBfbWVyZ2Uoc3BlRXBzLCBFcHNPYmopO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gMi4g5Ye65biI5bGe5oCnXG5cbiAgICAgICAgICAgICAgICBsZXQgZ3JhZHVhdGVBdHRyMSA9IG1lbnR1LmdyYWR1YXRlQXR0ciB8fCB7fTtcbiAgICAgICAgICAgICAgICBsZXQgZ3JhZHVhdGVBdHRyMiA9IF9tZW50dT8uZ3JhZHVhdGVBdHRyIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgLy8g5YWI56Gu5a6a5YC8LWdyYWR1YXRlQXR0cjLkuI3otoXov4dncmFkdWF0ZUF0dHIx55qEeOWAjVxuICAgICAgICAgICAgICAgIGxldCBuQ2ZnID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiem9uZ01lbl9hZGRfZ3JhZHVhdGVBdHRyX2xpbWl0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChuQ2ZnICE9IG51bGwgJiYgbkNmZy5wcmFtICE9IG51bGwgJiYgbkNmZy5wcmFtLmNvdW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZ3JhZHVhdGVBdHRyMVtPYmplY3Qua2V5cyhncmFkdWF0ZUF0dHIxKVswXV1cbiAgICAgICAgICAgICAgICAgICAgZ3JhZHVhdGVBdHRyMltPYmplY3Qua2V5cyhncmFkdWF0ZUF0dHIyKVswXV0gPSBNYXRoLm1pbih2YWx1ZSAqIG5DZmcucHJhbS5jb3VudCwgZ3JhZHVhdGVBdHRyMltPYmplY3Qua2V5cyhncmFkdWF0ZUF0dHIyKVswXV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIOagueaNruWnlOS7u+eahOS9jee9rmlk6I635Y+W5Yqg5oiQ6YWN572uXG4gICAgICAgICAgICAgICAgbGV0IGNmZyA9IEdhbWVjZmcuem9uZ01lbkFwcG9pbnRQb3MuZ2V0SXRlbShpZCk7XG4gICAgICAgICAgICAgICAgaWYgKGNmZyA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBncmFkdWF0ZUF0dHIxKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYWR1YXRlQXR0cjFba2V5XSA9IE1hdGguZmxvb3IoZ3JhZHVhdGVBdHRyMVtrZXldICogKDEgKyBjZmcuYWRkIC8gMTAwKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3BlRXBzID0gdGhpcy5lcF9tZXJnZShzcGVFcHMsIGdyYWR1YXRlQXR0cjEpO1xuXG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBncmFkdWF0ZUF0dHIyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYWR1YXRlQXR0cjJba2V5XSA9IE1hdGguZmxvb3IoZ3JhZHVhdGVBdHRyMltrZXldICogKDEgKyBjZmcuYWRkIC8gMTAwKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3BlRXBzID0gdGhpcy5lcF9tZXJnZShzcGVFcHMsIGdyYWR1YXRlQXR0cjIpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t5bey57uP57uT5aW955qE6Zeo5b6SRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3mnKrnu5Plpb3nmoTpl6jlvpJTdGFydC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDnibnmrorlsZ7mgKdcbiAgICAgICAgICAgICAgICBsZXQgc3BlQXR0ciA9IG1lbnR1LnNwZUF0dHIgfHwgW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdHRySWQgb2Ygc3BlQXR0cikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy56b25nTWVuU3BlQXR0ci5nZXRJdGVtKGF0dHJJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjZmcgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IFthdHRyS2V5LCBhdHRyVmFsdWVdID0gT2JqZWN0LmVudHJpZXMoY2ZnLmF0dHIpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXBzT2JqID0geyBbYXR0cktleV06IGF0dHJWYWx1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3BlRXBzID0gdGhpcy5lcF9tZXJnZShzcGVFcHMsIEVwc09iaik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGdyYWR1YXRlQXR0ciA9IG1lbnR1LmdyYWR1YXRlQXR0ciB8fCB7fTtcbiAgICAgICAgICAgICAgICAvLyDmoLnmja5pZOiOt+WPlumFjee9rlxuICAgICAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLnpvbmdNZW5BcHBvaW50UG9zLmdldEl0ZW0oaWQpO1xuICAgICAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZ3JhZHVhdGVBdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyYWR1YXRlQXR0cltrZXldID0gTWF0aC5mbG9vcihncmFkdWF0ZUF0dHJba2V5XSAqICgxICsgY2ZnLmFkZCAvIDEwMCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNwZUVwcyA9IHRoaXMuZXBfbWVyZ2Uoc3BlRXBzLCBncmFkdWF0ZUF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS3mnKrnu5Plpb3nmoTpl6jlvpJFbmQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5q+P5Liq6Zeo5b6S55qE5Z+656GA5bGe5oCn5YWo6YOo5Yqg6LW35p2l57uZ5Li76KeSXG4gICAgICAgIGlmKHNob3dCYXNpY0F0dHIpe1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBpbiBhY3Rab25nTWVuLm1lbnR1KSB7XG4gICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBzX3pvbmdNZW5fbWVudHUoYWN0Wm9uZ01lbi5tZW50dVtpZF0sIGppdXhpYW8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgaW4gYWN0Wm9uZ01lbk1lbnR1THMxKSB7XG4gICAgICAgICAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHRoaXMuZXBzX3pvbmdNZW5fbWVudHUoYWN0Wm9uZ01lbk1lbnR1THMxW2lkXSwgaml1eGlhbykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIGFjdFpvbmdNZW5NZW50dUxzMikge1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCB0aGlzLmVwc196b25nTWVuX21lbnR1KGFjdFpvbmdNZW5NZW50dUxzMltpZF0sIGppdXhpYW8pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8g5q+P5LiA5p2h5aeU5Lu755qE54m55q6K5bGe5oCn6YO95LiN6IO96LaF6L+H6YWN572u55qE5pyA5aSn5YC8IHptX2NmZy5tYXhTcGVBdHRyQWRkXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNwZUVwcykge1xuICAgICAgICAgICAgc3BlRXBzW2tleV0gPSBNYXRoLm1pbihzcGVFcHNba2V5XSwgem1fY2ZnLm1heFNwZUF0dHJBZGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHNwZUVwcyk7XG5cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpgZPnurlcbiAgICAgKiDplbbltYzpgZPnurnnmoTln7rnoYDlsZ7mgKcgKyDor43mnaHlsZ7mgKcgKyDop6PlsIHnrYnnuqfnmoTlsZ7mgKcgKyDlpZfoo4VidWZmXG4gICAgICovXG4gICAgZXBfZGFvd2VuKGFjdERhb1dlbjogWHlzLkFjdERhb1dlbiwgYWN0RGRhb1dlbkxpc3Q6IHsgW2lpZDogc3RyaW5nXTogWHlzLkRhb1dlbl9TdG9uZSB9KTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHNfemh1OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gdGhpcy5lcF9kYW93ZW5femh1KGFjdERhb1dlbiwgYWN0RGRhb1dlbkxpc3QpOyAvL+S4u+WxnuaAp1xuICAgICAgICBsZXQgZXBzX290aGVyOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gdGhpcy5lcF9kYW93ZW5fb3RoZXIoYWN0RGFvV2VuLCBhY3REZGFvV2VuTGlzdCk7OyAvL+WJr+WxnuaAp1xuICAgICAgICByZXR1cm4gdGhpcy5lcF9tZXJnZShlcHNfemh1LCBlcHNfb3RoZXIpO1xuICAgIH1cblxuICAgIFxuICAgIC8qKlxuICAgICAqIOmBk+e6uVxuICAgICAqIOmVtuW1jOmBk+e6ueeahOS4u+WxnuaAp1xuICAgICAqL1xuICAgIGVwX2Rhb3dlbl96aHUoYWN0RGFvV2VuOiBYeXMuQWN0RGFvV2VuLCBhY3REZGFvV2VuTGlzdDogeyBbaWlkOiBzdHJpbmddOiBYeXMuRGFvV2VuX1N0b25lIH0pOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwc196aHU6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTsgLy/kuLvlsZ7mgKdcbiAgICAgICAgXG4gICAgICAgIGxldCByZWFsX2RjID0gYWN0RGFvV2VuLmRjIHx8IFwiMVwiO1xuICAgICAgICBpZiAoYWN0RGFvV2VuLmRjc1tyZWFsX2RjXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90S2V5cyA9IE9iamVjdC5rZXlzKGFjdERhb1dlbi5kY3NbcmVhbF9kY10uc2xvdCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNsb3RLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2xvdCA9IHNsb3RLZXlzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBpaWQgPSBhY3REYW9XZW4uZGNzW3JlYWxfZGNdLnNsb3Rbc2xvdF07XG4gICAgICAgICAgICAgICAgbGV0IHN0b25lID0gYWN0RGRhb1dlbkxpc3RbaWlkLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgICAgIGlmIChzdG9uZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VfZXBzX2MgPSBHYW1lY2ZnLmRhb3dlblpodXNodXhpbmcuZ2V0SXRlbShzdG9uZS5iYXNlRXBzLnN4aWQsIHN0b25lLmJhc2VFcHMubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGJhc2VfZXBzX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlcHNfemh1ID0gdGhpcy5lcF9tZXJnZShlcHNfemh1LCBiYXNlX2Vwc19jLmVwcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHNfemh1O1xuICAgIH1cblxuICAgIFxuICAgIC8qKlxuICAgICAqIOmBk+e6uVxuICAgICAqIOmVtuW1jOmBk+e6ueeahOWFtuS7luWxnuaAp1xuICAgICAqL1xuICAgIGVwX2Rhb3dlbl9vdGhlcihhY3REYW9XZW46IFh5cy5BY3REYW9XZW4sIGFjdERkYW9XZW5MaXN0OiB7IFtpaWQ6IHN0cmluZ106IFh5cy5EYW9XZW5fU3RvbmUgfSk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzX2Z1OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307IC8v5Ymv5bGe5oCnXG4gICAgICAgIGxldCBlcHNfbGV2ZWw6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTsgLy/op6PlsIHnrYnnuqflsZ7mgKdcblxuICAgICAgICBsZXQgcmVhbF9kYyA9IGFjdERhb1dlbi5kYyB8fCBcIjFcIjtcbiAgICAgICAgaWYgKGFjdERhb1dlbi5kY3NbcmVhbF9kY10gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2xvdEtleXMgPSBPYmplY3Qua2V5cyhhY3REYW9XZW4uZGNzW3JlYWxfZGNdLnNsb3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbG90S2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBzbG90S2V5c1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgaWlkID0gYWN0RGFvV2VuLmRjc1tyZWFsX2RjXS5zbG90W3Nsb3RdO1xuICAgICAgICAgICAgICAgIGxldCBzdG9uZSA9IGFjdERkYW9XZW5MaXN0W2lpZC50b1N0cmluZygpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3RvbmUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL+ivjeadoeWxnuaAp1xuICAgICAgICAgICAgICAgIGNvbnN0IGZ1RXBzS2V5cyA9IE9iamVjdC5rZXlzKHN0b25lLmZ1RXBzKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZ1RXBzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcHNfaWQgPSBmdUVwc0tleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN0X2luZm9fYyA9IEdhbWVjZmcuZGFvd2VuRnVzaHV4aW5nLmdldEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgICAgICBlcHNfaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9uZS5mdUVwc1tlcHNfaWRdLnBpbnpoaS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RvbmUuZnVFcHNbZXBzX2lkXS5sZXZlbC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdF9pbmZvX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXBzX2Z1ID0gdGhpcy5lcF9tZXJnZShlcHNfZnUsIGN0X2luZm9fYy5lcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy/op6PlsIHnrYnnuqfnmoTlsZ7mgKdcbiAgICAgICAgbGV0IGxldmVsID0gYWN0RGFvV2VuLnVubG9ja0xldmVsO1xuICAgICAgICBjb25zdCB1bmxvY2tfbGV2ZWxfYyA9IEdhbWVjZmcuZGFvd2VuVW5sb2NrX2xldmVsLmdldEl0ZW0obGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICh1bmxvY2tfbGV2ZWxfYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcHNfbGV2ZWwgPSB0aGlzLmVwX21lcmdlKGVwc19sZXZlbCwgdW5sb2NrX2xldmVsX2MuZXBzKTsgLy/plbbltYzmlYjmnpxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmVwX21lcmdlKGVwc19mdSwgZXBzX2xldmVsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflhb3ngbXljZXkuKrmoLzlrZDlsZ7mgKfliqDmiJBcbiAgICAgKi9cbiAgICBlcF9zaG91bGluZ19nZXppKGFjdFNob3VMaW5nT25lOiBYeXMuQWN0U2hvdUxpbmdfTGlzdE9uZSwgaml1eGlhbzogbnVtYmVyID0gMCk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChhY3RTaG91TGluZ09uZSA9PSBudWxsIHx8IGFjdFNob3VMaW5nT25lLnNsaWQgPT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIGVwcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgc2xpZCA9IGFjdFNob3VMaW5nT25lLnNsaWQ7XG4gICAgICAgIGxldCBjZmdJbmZvID0gR2FtZWNmZy5zaG91bGluZ0luZm8uZ2V0SXRlbShzbGlkKTtcbiAgICAgICAgaWYgKGNmZ0luZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVwcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZnUGluemhpID0gR2FtZWNmZy5zaG91bGluZ1BpbnpoaS5nZXRJdGVtKGNmZ0luZm8ucGluemhpKTtcblxuICAgICAgICBpZiAoY2ZnUGluemhpID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlcHM7XG4gICAgICAgIH1cbiAgICAgICAgLy/lhb3ngbXln7rnoYDlsZ7mgKdcbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZ1BpbnpoaS5lcHMpO1xuXG4gICAgICAgIC8v5Lmd6ZyE5aSp5p6i5a+55YW954G15Z+65pys5bGe5oCn5Yqg5oiQXG4gICAgICAgIGlmKGppdXhpYW8gPiAwKXtcbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfS3ZSYXRlKGVwcywgMSArIGppdXhpYW8pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy/ljYfnuqflsZ7mgKfliqDmiJBcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBhY3RTaG91TGluZ09uZS5sZXZlbDtcbiAgICAgICAgbGV0IGxldmVsRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxldmVsOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBsdiA9IEdhbWVjZmcuc2hvdWxpbmdMZXZlbC5nZXRJdGVtKGNmZ1BpbnpoaS5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChsdiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXZlbEVwcyA9IHRoaXMuZXBfbWVyZ2UobGV2ZWxFcHMsIGx2LmxldmVsRXBzKTtcbiAgICAgICAgfVxuICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAvL+iuoeeul+WNh+aYn+WxnuaAp+WKoOaIkFxuICAgICAgICBjb25zdCBzdGFyID0gYWN0U2hvdUxpbmdPbmUuc3RhcjtcbiAgICAgICAgbGV0IHN0YXJFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFyOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG4gICAgICAgICAgICBsZXQgc3Rhcl9jID0gR2FtZWNmZy5zaG91bGluZ1N0YXIuZ2V0SXRlbShjZmdQaW56aGkuaWQsIGluZGV4LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgaWYgKHN0YXJfYyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFyRXBzID0gdGhpcy5lcF9tZXJnZShzdGFyRXBzLCBzdGFyX2Muc3RhckVwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHN0YXJFcHMpO1xuXG4gICAgICAgIC8v6K6h566X6KeJ6YaS5bGe5oCn5Yqg5oiQXG4gICAgICAgIGxldCBzdGVwRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGNvbnN0IHN0ZXAgPSBhY3RTaG91TGluZ09uZS5zdGVwO1xuICAgICAgICBsZXQganVlWGluZ0NmZyA9IEdhbWVjZmcuc2hvdWxpbmdKdWV4aW5nLmdldEl0ZW0oc3RlcC50b1N0cmluZygpKTtcbiAgICAgICAgaWYoanVlWGluZ0NmZyl7XG4gICAgICAgICAgICBzdGVwRXBzID0gdGhpcy5lcF9tZXJnZShzdGVwRXBzLCBqdWVYaW5nQ2ZnLmVwcyk7XG4gICAgICAgIH1cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIHN0ZXBFcHMpO1xuXG4gICAgICAgIC8v55qu6IKk5bGe5oCnXG4gICAgICAgIGxldCBza2luRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChhY3RTaG91TGluZ09uZS5za2lucyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZXBzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IHNraW5JZCBpbiBhY3RTaG91TGluZ09uZS5za2lucykge1xuICAgICAgICAgICAgbGV0IHNraW4gPSBhY3RTaG91TGluZ09uZS5za2luc1tza2luSWRdO1xuICAgICAgICAgICAgbGV0IHNraW5DZmcgPSBHYW1lY2ZnLnNob3VsaW5nTGV2ZWwuZ2V0SXRlbShza2luSWQsIHNraW4ubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoc2tpbkNmZykge1xuICAgICAgICAgICAgICAgIHNraW5FcHMgPSB0aGlzLmVwX21lcmdlKHNraW5FcHMsIHNraW5DZmcubGV2ZWxFcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBza2luRXBzKTtcbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpflvILosaHlsZ7mgKfliqDmiJBcbiAgICAgKi9cbiAgICBlcF95aXhpYW5nKGFjdFlpWGlhbmc6IFh5cy5BY3RZaVhpYW5nKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgLy/orqHnrpfljYfnuqfljYfpmLblvILosaHlsZ7mgKdcbiAgICAgICAgY29uc3QgY2ZnID0gR2FtZWNmZy55aXhpYW5nTGV2ZWwuZ2V0SXRlbShhY3RZaVhpYW5nLmlkLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlcHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2ZnSmllSmkgPSBHYW1lY2ZnLnlpeGlhbmdKaWVqaS5nZXRJdGVtKGNmZy5zdGVwLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnSmllSmkgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVwcztcbiAgICAgICAgfVxuICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnLmVwMCk7XG4gICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdKaWVKaS5lcDEpO1xuICAgICAgICAvL+iuoeeul+S4iumYteW8guixoeWxnuaAp1xuICAgICAgICBjb25zdCBjZmdTdGVwID0gR2FtZWNmZy55aXhpYW5nU3RlcC5nZXRJdGVtKGFjdFlpWGlhbmcuaGgsIGNmZy5zdGVwLnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnU3RlcCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZXBzO1xuICAgICAgICB9XG4gICAgICAgIC8vIOiuoeeul+WMluW9ouWxnuaAp1xuICAgICAgICBmb3IobGV0IGlkIGluIGFjdFlpWGlhbmcuaHhEYXRhKXtcbiAgICAgICAgICAgIGxldCBjZmdIeCA9IEdhbWVjZmcueWl4aWFuZ0h1YXhpbmcuZ2V0SXRlbShpZCxhY3RZaVhpYW5nLmh4RGF0YVtpZF0ubGV2ZWwudG9TdHJpbmcoKSlcbiAgICAgICAgICAgIGlmKGNmZ0h4ICE9IG51bGwpe1xuICAgICAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmdIeC5sZXZlbEVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZXBzID0gdGhpcy5lcF9tZXJnZShlcHMsIGNmZ1N0ZXAuZXApO1xuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+earuiCpOWxnuaAp+WKoOaIkFxuICAgICAqL1xuICAgIGVwX3BpZnUoYWN0UGlmdTogWHlzLkFjdFBpZnUpOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9IHtcbiAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhY3RQaWZ1Lmxpc3QpIHtcbiAgICAgICAgICAgIGxldCBwaWZ1ID0gYWN0UGlmdS5saXN0W2tleV07XG4gICAgICAgICAgICBpZighcGlmdSl7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZighcGlmdS5sZXZlbCl7XG4gICAgICAgICAgICAgICAgcGlmdS5sZXZlbCA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL+iuoeeul+earuiCpOWxnuaAp+WxnuaAp1xuICAgICAgICAgICAgY29uc3QgY2ZnID0gR2FtZWNmZy5za2luU2tpbmxldmVsLmdldEl0ZW0oa2V5LnRvU3RyaW5nKCksIHBpZnUubGV2ZWwudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcubGV2ZWxFcHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X5rSe5aSp6YGT56ul5bGe5oCn5Yqg5oiQXG4gICAgICovXG4gICAgZXBfZG9uZ3RpYW4oYWN0RG9uZ1RpYW46IFh5cy5BY3REb25nVGlhbik6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIC8v6K6h566X6YGT56ul562J57qn5bGe5oCn5Yqg5oiQXG4gICAgICAgIGNvbnN0IHhsTHZLZXlzID0gT2JqZWN0LmtleXMoYWN0RG9uZ1RpYW4ueGxMdik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeGxMdktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB4bEx2S2V5c1tpXTtcbiAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLmRvbmd0aWFuWGxMdi5nZXRJdGVtKHR5cGUsIGFjdERvbmdUaWFuLnhsTHZbdHlwZV0udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoY2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBjZmcuZXBzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZnU3RlcCA9IEdhbWVjZmcuZG9uZ3RpYW5YbFN0ZXAuZ2V0SXRlbShhY3REb25nVGlhbi54bFN0ZXAudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChjZmdTdGVwID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBlcHM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXBzS2V5cyA9IE9iamVjdC5rZXlzKGVwcyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXBzS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gZXBzS2V5c1tpXTtcbiAgICAgICAgICAgIGVwc1trZXldICo9IGNmZ1N0ZXAuZXBzIC8gMTAwMDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVwcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfoja/nlLDlsZ7mgKfliqDmiJBcbiAgICAgKi9cbiAgICBlcF95YW90aWFuKGFjdFlhb1RpYW5FcHM6IFh5cy5BY3RZYW9UaWFuRXBzKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGFjdFlhb1RpYW5FcHMpIHtcbiAgICAgICAgICAgIGVwc1trZXldID0gTWF0aC5mbG9vcihhY3RZYW9UaWFuRXBzW2tleV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlcHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X56ew5Y+35bGe5oCn5Yqg5oiQXG4gICAgICovXG4gICAgZXBfY2hlbmdoYW8oYWN0Q2hlbmdoYW86IFh5cy5BY3RDaGVuZ2hhbyk6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0ge1xuICAgICAgICBsZXQgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvcihsZXQgaWQgaW4gYWN0Q2hlbmdoYW8ubGlzdCl7XG4gICAgICAgICAgICBsZXQgY2ZnID0gR2FtZWNmZy5jaGVuZ2hhb1NodXhpbmcuZ2V0SXRlbShpZClcbiAgICAgICAgICAgIGlmKGNmZyAhPSBudWxsKXtcbiAgICAgICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgY2ZnLmVwcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8vIC8qKlxuICAgIC8vICAqIOWIhuWIq+e7n+iuoeS4u+inkuWSjOW8n+WtkOeahOeahOaImOaWl+WxnuaAp1xuICAgIC8vICAqL1xuICAgIGVwX3VzZXJBbmREaVppKHNldkJhY2s6IFh5cy5TZXZCYWNrKSB7XG4gICAgICAgIGxldCBhbGxFcHM6IGFueSA9IHt9O1xuICAgICAgICBsZXQgdXNlckJhc2UgPSBnYW1lTWV0aG9kLmVwX2FsbF9iYXNlKHNldkJhY2spO1xuICAgICAgICBhbGxFcHNbXCJ1c2VyXCJdID0gdXNlckJhc2VcbiAgICAgICAgbGV0IHVzZXJFcHMgPSBnYW1lTWV0aG9kLmVwX2FsbF9maWdodCh1c2VyQmFzZSk7XG5cbiAgICAgICAgZm9yIChsZXQgZ3ppZCBpbiBzZXZCYWNrLmFjdERpWmk/LmE/LnNoYW5nWmhlbikge1xuICAgICAgICAgICAgbGV0IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgbGV0IGR6SWQgPSBzZXZCYWNrLmFjdERpWmk/LmE/LnNoYW5nWmhlbltnemlkXTtcbiAgICAgICAgICAgIGlmIChkeklkID09IG51bGwgfHwgZHpJZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnZHogPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShkeklkKTtcbiAgICAgICAgICAgIGxldCBkaXppID0gc2V2QmFjay5hY3REaVppTGlzdD8uYT8uW2R6SWRdO1xuICAgICAgICAgICAgaWYgKGNmZ2R6ID09IG51bGwgfHwgZGl6aSA9PSBudWxsIHx8IGNmZ2R6LnpoYW5saSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnWmhvbmdadSA9IEdhbWVjZmcuaHVvYmFuWmhvbmd6dS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgY2ZnZHouemhvbmd6dS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v6K6h566X5byf5a2Q5Y2H57qn5bGe5oCnXG4gICAgICAgICAgICBsZXQgbGV2ZWxFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkubGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpemlMZXZlbCA9IEdhbWVjZmcuaHVvYmFuU2hlbmdqaS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aUxldmVsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldmVsRXBzID0gdGhpcy5lcF9tZXJnZShsZXZlbEVwcywgZGl6aUxldmVsLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAvL+S5nemchOWkqeaeouWvueW8n+WtkOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICAgICAgZm9yIChjb25zdCBoZGNpZCBpbiBzZXZCYWNrLmhkSml1WGlhb1RpYW5TaHUpIHtcbiAgICAgICAgICAgICAgICAvLyDmo4Dmn6XlsZ7mgKfmmK/lkKblrZjlnKhcbiAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXZCYWNrLmhkSml1WGlhb1RpYW5TaHUsIGhkY2lkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGppdXhpYW8gPSBzZXZCYWNrLmhkSml1WGlhb1RpYW5TaHU/LltoZGNpZF0/LmE7XG4gICAgICAgICAgICAgICAgaWYgKCFqaXV4aWFvKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyDmo4Dmn6XkvJnkvLTlsZ7mgKfliqDmiJDmmK/lkKblpKfkuo4wXG4gICAgICAgICAgICAgICAgaWYgKGppdXhpYW8uaHVvQmFuRXBzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmF0ZSA9IDEgKyAoaml1eGlhby5odW9CYW5FcHMgLyAxMDApO1xuICAgICAgICAgICAgICAgICAgICBsZXZlbEVwcyA9IHRoaXMuZXBfS3ZSYXRlKGxldmVsRXBzLCByYXRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAgICAgLy/orqHnrpflvJ/lrZDljYfmmJ/nmoTln7rnoYDlsZ7mgKfliqDmiJBcbiAgICAgICAgICAgIGxldCBzdGFyRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLnN0YXI7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpemlTdGFyID0gR2FtZWNmZy5odW9iYW5TdGFyLmdldEl0ZW0oY2ZnZHouaWQsIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpemlTdGFyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0YXJFcHMgPSB0aGlzLmVwX21lcmdlKHN0YXJFcHMsIGRpemlTdGFyLmF0dHIyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVwcyA9IHRoaXMuZXBfbWVyZ2UoZXBzLCBzdGFyRXBzKTtcbiAgICAgICAgICAgIC8v6K6h566X5byf5a2Q5aKD55WM5bGe5oCnXG4gICAgICAgICAgICBsZXQgamluZ2ppZUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGl6aS5qaW5namllOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXppSmluZ2ppZSA9IEdhbWVjZmcuaHVvYmFuVHVwby5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aUppbmdqaWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgamluZ2ppZUVwcyA9IHRoaXMuZXBfbWVyZ2UoamluZ2ppZUVwcywgZGl6aUppbmdqaWUuYXR0cik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlcHMgPSB0aGlzLmVwX21lcmdlKGVwcywgamluZ2ppZUVwcyk7XG4gICAgICAgICAgICBsZXQgZHpFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSBnYW1lTWV0aG9kLmVwX2luaXQoKTsgLy/liJ3lp4vljJblsZ7mgKdcbiAgICAgICAgICAgIGR6RXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShkekVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyKSB7XG4gICAgICAgICAgICAgICAgLy/nu6fmib/kuLvop5LlsZ7mgKdcbiAgICAgICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2ZnWmhvbmdadS5pbmhlcml0X2F0dHJfaGlkZSkge1xuICAgICAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICAgICAgZHpFcHNba2V5XSArPSBNYXRoLmZsb29yKCh1c2VyRXBzW2tleV0gKiBjZmdaaG9uZ1p1LmluaGVyaXRfYXR0cl9oaWRlW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShlcHMsIGR6RXBzKTtcbiAgICAgICAgICAgIGFsbEVwc1tgJHtkeklkfV8ke2NmZ2R6LmR6TmFtZX1gXSA9IGVwcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsRXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+inkuiJsuaAu+aImOWKm1xuICAgICAqIGppdXhpYW86IOWvueW8n+WtkOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAqL1xuICAgIGVwX3Bvd2VyX2FsbChzZXZCYWNrOiBYeXMuU2V2QmFjaywgZXBfYWxsX2Jhc2U6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fSkge1xuICAgICAgICBsZXQgdXNlckJhc2U6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShlcF9hbGxfYmFzZSkgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHVzZXJCYXNlID0gZXBfYWxsX2Jhc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2VyQmFzZSA9IGdhbWVNZXRob2QuZXBfYWxsX2Jhc2Uoc2V2QmFjayk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVzZXJFcHMgPSBnYW1lTWV0aG9kLmVwX2FsbF9maWdodCh1c2VyQmFzZSlcblxuICAgICAgICBsZXQgZGl6aVBvd2VyOiBudW1iZXIgPSAwO1xuICAgICAgICBmb3IgKGxldCBnemlkIGluIHNldkJhY2suYWN0RGlaaT8uYT8uc2hhbmdaaGVuKSB7XG4gICAgICAgICAgICBsZXQgZGl6aUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICAgICAgbGV0IGR6SWQgPSBzZXZCYWNrLmFjdERpWmk/LmE/LnNoYW5nWmhlbltnemlkXTtcbiAgICAgICAgICAgIGlmIChkeklkID09IG51bGwgfHwgZHpJZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnZHogPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShkeklkKTtcbiAgICAgICAgICAgIGxldCBkaXppID0gc2V2QmFjay5hY3REaVppTGlzdD8uYT8uW2R6SWRdO1xuICAgICAgICAgICAgaWYgKGNmZ2R6ID09IG51bGwgfHwgZGl6aSA9PSBudWxsIHx8IGNmZ2R6LnpoYW5saSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2ZnWmhvbmdadSA9IEdhbWVjZmcuaHVvYmFuWmhvbmd6dS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgY2ZnZHouemhvbmd6dS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8v6K6h566X5byf5a2Q5Y2H57qn5bGe5oCnXG4gICAgICAgICAgICBsZXQgbGV2ZWxFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkubGV2ZWw7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpemlMZXZlbCA9IEdhbWVjZmcuaHVvYmFuU2hlbmdqaS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aUxldmVsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldmVsRXBzID0gdGhpcy5lcF9tZXJnZShsZXZlbEVwcywgZGl6aUxldmVsLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/kuZ3pnITlpKnmnqLlr7nlvJ/lrZDln7rnoYDlsZ7mgKfliqDmiJBcbiAgICAgICAgICAgIGZvciAoY29uc3QgaGRjaWQgaW4gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1KSB7XG4gICAgICAgICAgICAgICAgLy8g5qOA5p+l5bGe5oCn5piv5ZCm5a2Y5ZyoXG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1LCBoZGNpZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBqaXV4aWFvID0gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1Py5baGRjaWRdPy5hO1xuICAgICAgICAgICAgICAgIGlmICghaml1eGlhbykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8g5qOA5p+l5LyZ5Ly05bGe5oCn5Yqg5oiQ5piv5ZCm5aSn5LqOMFxuICAgICAgICAgICAgICAgIGlmIChqaXV4aWFvLmh1b0JhbkVwcyA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJhdGUgPSAxICsgKGppdXhpYW8uaHVvQmFuRXBzIC8gMTAwKTtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX0t2UmF0ZShsZXZlbEVwcywgcmF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgbGV2ZWxFcHMpO1xuXG4gICAgICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+aYn+eahOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICAgICAgbGV0IHN0YXJFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuc3RhcjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl6aVN0YXIgPSBHYW1lY2ZnLmh1b2JhblN0YXIuZ2V0SXRlbShjZmdkei5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGl6aVN0YXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhckVwcyA9IHRoaXMuZXBfbWVyZ2Uoc3RhckVwcywgZGl6aVN0YXIuYXR0cjIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgc3RhckVwcyk7XG4gICAgICAgICAgICAvL+iuoeeul+W8n+WtkOWig+eVjOWxnuaAp1xuICAgICAgICAgICAgbGV0IGppbmdqaWVFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuamluZ2ppZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGl6aUppbmdqaWUgPSBHYW1lY2ZnLmh1b2JhblR1cG8uZ2V0SXRlbShjZmdkei5waW56aGksIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGRpemlKaW5namllID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGppbmdqaWVFcHMgPSB0aGlzLmVwX21lcmdlKGppbmdqaWVFcHMsIGRpemlKaW5namllLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgamluZ2ppZUVwcyk7XG4gICAgICAgICAgICBsZXQgZHpFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSBnYW1lTWV0aG9kLmVwX2luaXQoKTsgLy/liJ3lp4vljJblsZ7mgKdcbiAgICAgICAgICAgIGR6RXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShkekVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyKSB7XG4gICAgICAgICAgICAgICAgLy/nu6fmib/kuLvop5LlsZ7mgKdcbiAgICAgICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2ZnWmhvbmdadS5pbmhlcml0X2F0dHJfaGlkZSkge1xuICAgICAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICAgICAgZHpFcHNba2V5XSArPSBNYXRoLmZsb29yKCh1c2VyRXBzW2tleV0gKiBjZmdaaG9uZ1p1LmluaGVyaXRfYXR0cl9oaWRlW2tleV0pIC8gMTAwMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgZHpFcHMpO1xuICAgICAgICAgICAgZGl6aVBvd2VyICs9IGdhbWVNZXRob2QuZXBfcG93ZXIoMCwgZGl6aUVwcyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5YW954G15oiY5YqbXG4gICAgICAgIGxldCBzbFBvd2VyOiBudW1iZXIgPSAwO1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RTaG91TGluZyAhPSBudWxsICYmIHNldkJhY2suYWN0U2hvdUxpbmdMaXN0ICE9IG51bGwgJiYgc2V2QmFjay5hY3RTaG91TGluZy5hICYmIHNldkJhY2suYWN0U2hvdUxpbmdMaXN0LmEpIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZUd6SWRLZXlzID0gT2JqZWN0LmtleXMoc2V2QmFjay5hY3RTaG91TGluZy5hLnVzZUd6SWQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VHeklkS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZUd6SWQgPSB1c2VHeklkS2V5c1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZ3ppZCA9IHNldkJhY2suYWN0U2hvdUxpbmcuYS51c2VHeklkW3VzZUd6SWRdO1xuICAgICAgICAgICAgICAgIGlmIChnemlkID09IG51bGwgfHwgZ3ppZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgc2hvdWxpbmcgPSBzZXZCYWNrLmFjdFNob3VMaW5nTGlzdC5hW2d6aWRdO1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGluZyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKmxldCBjZmcgPSBHYW1lY2ZnLnNob3VsaW5nSW5mby5nZXRJdGVtKHNob3VsaW5nLnNsaWQpO1xuICAgICAgICAgICAgICAgIGlmIChjZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBpbnpoaUNmZyA9IEdhbWVjZmcuc2hvdWxpbmdQaW56aGkuZ2V0SXRlbShjZmcucGluemhpKTtcbiAgICAgICAgICAgICAgICBpZiAocGluemhpQ2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSovXG4gICAgICAgICAgICAgICAgLy/kuLvmiJhcbiAgICAgICAgICAgICAgICBpZiAodXNlR3pJZCA9PSBcIjBcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2tpbGwgPSBzaG91bGluZy5zaztcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0ZXAgID0gc2hvdWxpbmcuc3RlcFxuICAgICAgICAgICAgICAgICAgICBsZXQgc2tpbGxDZmcgPSBHYW1lY2ZnLnNwZWxsU2tpbGwuZ2V0SXRlbShza2lsbC5za2lsbElkLCBza2lsbC5sdi50b1N0cmluZygpLCBzdGVwLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbGxDZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2xQb3dlciArPSBza2lsbENmZy56aGFubGk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yqp5oiY5L2NXG4gICAgICAgICAgICAgICAgICAgIGxldCBza2lsbCA9IHNob3VsaW5nLnNrO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3RlcCA9IHNob3VsaW5nLnN0ZXBcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNraWxsQ2ZnID0gR2FtZWNmZy5zcGVsbFNraWxsLmdldEl0ZW0oc2tpbGwuc2tpbGxJZCwgc2tpbGwubHYudG9TdHJpbmcoKSwgc3RlcC50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNraWxsQ2ZnID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNsUG93ZXIgKz0gc2tpbGxDZmcuemhhbmxpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGl6aVBvd2VyICsgZ2FtZU1ldGhvZC5lcF9wb3dlcigwLCB1c2VyQmFzZSkgKyBzbFBvd2VyO1xuICAgIH1cblxuICAgIGVwX3Bvd2VyX2Rpemkoc2V2QmFjazogWHlzLlNldkJhY2ssIGR6SWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgdXNlckVwcyA9IGdhbWVNZXRob2QuZXBfYWxsKHNldkJhY2spO1xuICAgICAgICBsZXQgZGl6aUVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBpZiAoZHpJZCA9PSBudWxsIHx8IGR6SWQgPT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNmZ2R6ID0gR2FtZWNmZy5odW9iYW5CYXNlLmdldEl0ZW0oZHpJZCk7XG4gICAgICAgIGxldCBkaXppID0gc2V2QmFjay5hY3REaVppTGlzdD8uYT8uW2R6SWRdO1xuICAgICAgICBpZiAoY2ZnZHogPT0gbnVsbCB8fCBkaXppID09IG51bGwgfHwgY2ZnZHouemhhbmxpID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjZmdaaG9uZ1p1ID0gR2FtZWNmZy5odW9iYW5aaG9uZ3p1LmdldEl0ZW0oY2ZnZHoucGluemhpLCBjZmdkei56aG9uZ3p1LnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAoY2ZnWmhvbmdadSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+e6p+WxnuaAp1xuICAgICAgICBsZXQgbGV2ZWxFcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZGl6aS5sZXZlbDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXppTGV2ZWwgPSBHYW1lY2ZnLmh1b2JhblNoZW5namkuZ2V0SXRlbShjZmdkei5waW56aGksIGkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICBpZiAoZGl6aUxldmVsID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldmVsRXBzID0gdGhpcy5lcF9tZXJnZShsZXZlbEVwcywgZGl6aUxldmVsLmF0dHIpO1xuICAgICAgICB9XG4gICAgICAgIC8v5Lmd6ZyE5aSp5p6i5a+55byf5a2Q5Z+656GA5bGe5oCn5Yqg5oiQXG4gICAgICAgIGZvciAoY29uc3QgaGRjaWQgaW4gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1KSB7XG4gICAgICAgICAgICAvLyDmo4Dmn6XlsZ7mgKfmmK/lkKblrZjlnKhcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldkJhY2suaGRKaXVYaWFvVGlhblNodSwgaGRjaWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaml1eGlhbyA9IHNldkJhY2suaGRKaXVYaWFvVGlhblNodT8uW2hkY2lkXT8uYTtcbiAgICAgICAgICAgIGlmICghaml1eGlhbykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5qOA5p+l5LyZ5Ly05bGe5oCn5Yqg5oiQ5piv5ZCm5aSn5LqOMFxuICAgICAgICAgICAgaWYgKGppdXhpYW8uaHVvQmFuRXBzID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByYXRlID0gMSArIChqaXV4aWFvLmh1b0JhbkVwcyAvIDEwMCk7XG4gICAgICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX0t2UmF0ZShsZXZlbEVwcywgcmF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+aYn+eahOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICBsZXQgc3RhckVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLnN0YXI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl6aVN0YXIgPSBHYW1lY2ZnLmh1b2JhblN0YXIuZ2V0SXRlbShjZmdkei5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppU3RhciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFyRXBzID0gdGhpcy5lcF9tZXJnZShzdGFyRXBzLCBkaXppU3Rhci5hdHRyMik7XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgc3RhckVwcyk7XG4gICAgICAgIC8v6K6h566X5byf5a2Q5aKD55WM5bGe5oCnXG4gICAgICAgIGxldCBqaW5namllRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuamluZ2ppZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXppSmluZ2ppZSA9IEdhbWVjZmcuaHVvYmFuVHVwby5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppSmluZ2ppZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqaW5namllRXBzID0gdGhpcy5lcF9tZXJnZShqaW5namllRXBzLCBkaXppSmluZ2ppZS5hdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBkaXppRXBzID0gdGhpcy5lcF9tZXJnZShkaXppRXBzLCBqaW5namllRXBzKTtcbiAgICAgICAgbGV0IGR6RXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7IC8v5Yid5aeL5YyW5bGe5oCnXG4gICAgICAgIGR6RXBzID0gZ2FtZU1ldGhvZC5lcF9tZXJnZShkekVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY2ZnWmhvbmdadS5pbmhlcml0X2F0dHIpIHtcbiAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyW2tleV0pIC8gMTAwMDApO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyX2hpZGUpIHtcbiAgICAgICAgICAgIC8v57un5om/5Li76KeS5bGe5oCnXG4gICAgICAgICAgICBkekVwc1trZXldICs9IE1hdGguZmxvb3IoKHVzZXJFcHNba2V5XSAqIGNmZ1pob25nWnUuaW5oZXJpdF9hdHRyX2hpZGVba2V5XSkgLyAxMDAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgZHpFcHMpO1xuICAgICAgICByZXR1cm4gZ2FtZU1ldGhvZC5lcF9wb3dlcigwLCBkaXppRXBzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfpmLXms5Xmm7TmjaLnmoTmiJjlipvlj5jljJblgLwgKOW8g+eUqClcbiAgICAgKi9cbiAgICBlcF9wb3dlcl96aGVuZmEoc2V2QmFjazogWHlzLlNldkJhY2ssIGxpbnNoaTogeyBwZmlkOiBzdHJpbmc7IGxldmVsOiBudW1iZXI7IGVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfTsgcGluemhpOiBzdHJpbmcgfSk6IG51bWJlciB7XG4gICAgICAgIC8v5Y6f5pys55qE5oiY5YqbXG4gICAgICAgIGNvbnN0IGluaXRQb3dlciA9IHRoaXMuZXBfcG93ZXJfYWxsKHNldkJhY2spO1xuICAgICAgICBsZXQgbmV3U2V2QmFjayA9IGdhbWVNZXRob2Qub2JqQ29weShzZXZCYWNrKTtcbiAgICAgICAgaWYgKG5ld1NldkJhY2suYWN0WmhlbmZhID09IG51bGwgfHwgbmV3U2V2QmFjay5hY3RaaGVuZmEuYSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZncGYgPSBHYW1lY2ZnLnpoZW5mYVBpZnUuZ2V0SXRlbShsaW5zaGkucGZpZCk7XG4gICAgICAgIGlmIChjZmdwZiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0gPSB7XG4gICAgICAgICAgICAgICAgcGZpZDogXCJcIixcbiAgICAgICAgICAgICAgICBsZXZlbDogMCxcbiAgICAgICAgICAgICAgICBlcHM6IHt9LFxuICAgICAgICAgICAgICAgIGZtTHY6IDAsXG4gICAgICAgICAgICAgICAgZm1CZDogMCxcbiAgICAgICAgICAgICAgICBmbUVwczogW10sXG4gICAgICAgICAgICAgICAgZm1aaEJkOiBbXSxcbiAgICAgICAgICAgICAgICBmbVpobHM6IFtdLFxuICAgICAgICAgICAgICAgIHBpbnpoaTogXCJcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0ucGZpZCA9IGxpbnNoaS5wZmlkO1xuICAgICAgICBuZXdTZXZCYWNrLmFjdFpoZW5mYS5hLmNodWFuW2NmZ3BmLmJ1d2VpXS5sZXZlbCA9IGxpbnNoaS5sZXZlbDtcbiAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0uZXBzID0gbGluc2hpLmVwcztcbiAgICAgICAgbmV3U2V2QmFjay5hY3RaaGVuZmEuYS5jaHVhbltjZmdwZi5idXdlaV0ucGluemhpID0gbGluc2hpLnBpbnpoaTtcbiAgICAgICAgY29uc3QgbmV3UG93ZXIgPSB0aGlzLmVwX3Bvd2VyX2FsbChuZXdTZXZCYWNrKTtcblxuICAgICAgICByZXR1cm4gbmV3UG93ZXIgLSBpbml0UG93ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6K6h566X6Zi15rOV5pu05o2i55qE5oiY5Yqb5Y+Y5YyW5YC8XG4gICAgICovXG4gICAgZXBfcG93ZXJfemhlbmZhTmV3KHNldkJhY2s6IFh5cy5TZXZCYWNrLCBsaW5zaGk6IHsgcGZpZDogc3RyaW5nOyBsZXZlbDogbnVtYmVyOyBlcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07IHBpbnpoaTogc3RyaW5nIH0pOiBudW1iZXIge1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RaaGVuZmFOZXcgPT0gbnVsbCB8fCBzZXZCYWNrLmFjdFpoZW5mYU5ldy5hID09IG51bGwgfHwgc2V2QmFjay5hY3RaaGVuZmFOZXcuYS5jaHVhbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZncGYgPSBHYW1lY2ZnLnpoZW5mYVBpZnUuZ2V0SXRlbShsaW5zaGkucGZpZCk7XG4gICAgICAgIGlmIChjZmdwZiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2xkQ2VwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBpZiAoc2V2QmFjay5hY3RaaGVuZmFOZXcuYS5jaHVhbltjZmdwZi5idXdlaV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgb2xkQ2VwcyA9IHNldkJhY2suYWN0WmhlbmZhTmV3LmEuY2h1YW5bY2ZncGYuYnV3ZWldLmVwcztcbiAgICAgICAgfVxuICAgICAgICAvL+WOn+acrOeahOaImOWKm1xuICAgICAgICBjb25zdCBpbml0UG93ZXIgPSB0aGlzLmVwX3Bvd2VyX2FsbChzZXZCYWNrKTtcbiAgICAgICAgbGV0IGVwX2Jhc2UgPSB0aGlzLmVwX2FsbF9iYXNlKHNldkJhY2spO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlW2tleV0gLT0gb2xkQ2Vwc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxpbnNoaS5lcHMpIHtcbiAgICAgICAgICAgIGVwX2Jhc2Vba2V5XSArPSBsaW5zaGkuZXBzW2tleV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UG93ZXIgPSB0aGlzLmVwX3Bvd2VyX2FsbChzZXZCYWNrLCBlcF9iYXNlKTtcbiAgICAgICAgcmV0dXJuIG5ld1Bvd2VyIC0gaW5pdFBvd2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOiuoeeul+W3sue7j+epv+aItOeahOijheWkh+WxnuaAp1xuICAgICAqL1xuICAgIGVwX3Bvd2VyX3poZW5mYU5ld19jaHVhbihzZXZCYWNrOiBYeXMuU2V2QmFjaywgYnV3ZWk6c3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHNldkJhY2suYWN0WmhlbmZhTmV3ID09IG51bGwgfHwgc2V2QmFjay5hY3RaaGVuZmFOZXcuYSA9PSBudWxsIHx8IHNldkJhY2suYWN0WmhlbmZhTmV3LmEuY2h1YW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgLy/ljp/mnKznmoTmiJjliptcbiAgICAgICAgY29uc3QgaW5pdFBvd2VyID0gdGhpcy5lcF9wb3dlcl9hbGwoc2V2QmFjayk7XG4gICAgICAgIGxldCBvbGRDZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChzZXZCYWNrLmFjdFpoZW5mYU5ldy5hLmNodWFuW2J1d2VpXSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgY2h1YW4gPSBzZXZCYWNrLmFjdFpoZW5mYU5ldy5hLmNodWFuW2J1d2VpXVxuICAgICAgICAgICAgb2xkQ2VwcyA9IHRoaXMuZXBfbWVyZ2Uob2xkQ2VwcywgY2h1YW4uZXBzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZm1FcHMgb2YgY2h1YW4uZm1FcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAob2xkQ2Vwc1tmbUVwc1swXV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvbGRDZXBzW2ZtRXBzWzBdXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9sZENlcHNbZm1FcHNbMF1dICs9IGZtRXBzWzFdO1xuICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgLy8g5rSX57uD5bGe5oCnXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBvc0lkIGluIGNodWFuLnhpbGlhbkVwcykge1xuICAgICAgICAgICAgICAgIGlmIChjaHVhbi54aWxpYW5FcHNbcG9zSWRdLmlkID09IG51bGwgfHwgY2h1YW4ueGlsaWFuRXBzW3Bvc0lkXS5pZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgeGlsaWFuX2MgPSBHYW1lY2ZnLnpoZW5mYVhpbGlhbldvcmQuZ2V0SXRlbShjaHVhbi54aWxpYW5FcHNbcG9zSWRdLmlkKTtcbiAgICAgICAgICAgICAgICBpZiAoeGlsaWFuX2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBvbGRDZXBzID0gdGhpcy5lcF9tZXJnZShvbGRDZXBzLCB4aWxpYW5fYy5hdHRyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVwX2Jhc2UgPSB0aGlzLmVwX2FsbF9iYXNlKHNldkJhY2spO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlW2tleV0gLT0gb2xkQ2Vwc1trZXldO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1Bvd2VyID0gdGhpcy5lcF9wb3dlcl9hbGwoc2V2QmFjaywgZXBfYmFzZSk7XG4gICAgICAgIHJldHVybiBuZXdQb3dlciAtIGluaXRQb3dlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDorqHnrpfpmLXms5Xmm7TmjaLnmoTmiJjlipvlj5jljJblgLxcbiAgICAgKi9cbiAgICBlcF9wb3dlcl9ndXppKHNldkJhY2s6IFh5cy5TZXZCYWNrLCBsaW5zaGk6IFh5cy5saXNoaUdaSW5mbyk6IG51bWJlciB7XG4gICAgICAgIC8v5Y6f5pys55qE5oiY5YqbXG4gICAgICAgIGxldCBvbGRDZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNldkJhY2suYWN0RGFkaUd1emkgIT0gbnVsbCAmJlxuICAgICAgICAgICAgc2V2QmFjay5hY3REYWRpR3V6aS5hICE9IG51bGwgJiZcbiAgICAgICAgICAgIHNldkJhY2suYWN0RGFkaUd1emkuYS5tcExpc3QgIT0gbnVsbCAmJlxuICAgICAgICAgICAgc2V2QmFjay5hY3REYWRpR3V6aS5hLm1wWGhpZCAhPSBudWxsICYmXG4gICAgICAgICAgICBzZXZCYWNrLmFjdERhZGlHdXppLmEubXBMaXN0W3NldkJhY2suYWN0RGFkaUd1emkuYS5tcFhoaWRdICE9IG51bGwgJiZcbiAgICAgICAgICAgIHNldkJhY2suYWN0RGFkaUd1emkuYS5tcExpc3Rbc2V2QmFjay5hY3REYWRpR3V6aS5hLm1wWGhpZF1bbGluc2hpLmJ1d2VpXSAhPSBudWxsXG4gICAgICAgICkge1xuICAgICAgICAgICAgb2xkQ2VwcyA9IHNldkJhY2suYWN0RGFkaUd1emkuYS5tcExpc3Rbc2V2QmFjay5hY3REYWRpR3V6aS5hLm1wWGhpZF1bbGluc2hpLmJ1d2VpXS5lcHM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZXBfYmFzZSA9IHRoaXMuZXBfYWxsX2Jhc2Uoc2V2QmFjayk7XG4gICAgICAgIGxldCBlcF9iYXNlMiA9IGdhbWVNZXRob2Qub2JqQ29weShlcF9iYXNlKTtcbiAgICAgICAgZXBfYmFzZS5hdGsgKz0gTWF0aC5mbG9vcigoZXBfYmFzZS5hdGsgKiBlcF9iYXNlLmF0a19wZXIpIC8gMTAwMDApO1xuICAgICAgICBlcF9iYXNlLmRlZiArPSBNYXRoLmZsb29yKChlcF9iYXNlLmRlZiAqIGVwX2Jhc2UuZGVmX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwX2Jhc2UuaHBfbWF4ICs9IE1hdGguZmxvb3IoKGVwX2Jhc2UuaHBfbWF4ICogZXBfYmFzZS5ocF9tYXhfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBfYmFzZS5ocCA9IGVwX2Jhc2UuaHBfbWF4O1xuICAgICAgICBjb25zdCBpbml0UG93ZXIgPSB0aGlzLmVwX3Bvd2VyKDAsIGVwX2Jhc2UpO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvbGRDZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlMltrZXldIC09IG9sZENlcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBsaW5zaGkuZXBzKSB7XG4gICAgICAgICAgICBlcF9iYXNlMltrZXldICs9IGxpbnNoaS5lcHNba2V5XTtcbiAgICAgICAgfVxuICAgICAgICBlcF9iYXNlMi5hdGsgKz0gTWF0aC5mbG9vcigoZXBfYmFzZTIuYXRrICogZXBfYmFzZTIuYXRrX3BlcikgLyAxMDAwMCk7XG4gICAgICAgIGVwX2Jhc2UyLmRlZiArPSBNYXRoLmZsb29yKChlcF9iYXNlMi5kZWYgKiBlcF9iYXNlMi5kZWZfcGVyKSAvIDEwMDAwKTtcbiAgICAgICAgZXBfYmFzZTIuaHBfbWF4ICs9IE1hdGguZmxvb3IoKGVwX2Jhc2UyLmhwX21heCAqIGVwX2Jhc2UyLmhwX21heF9wZXIpIC8gMTAwMDApO1xuICAgICAgICBlcF9iYXNlMi5ocCA9IGVwX2Jhc2UyLmhwX21heDtcbiAgICAgICAgY29uc3QgbmV3UG93ZXIgPSB0aGlzLmVwX3Bvd2VyKDAsIGVwX2Jhc2UyKTtcblxuICAgICAgICByZXR1cm4gbmV3UG93ZXIgLSBpbml0UG93ZXI7XG4gICAgfVxuXG4gICAgLy8g6K6h566X6Zeo5b6S55qE5oiY5YqbXG4gICAgZXBfcG93ZXJfbWVudHUobWVudHU6IFh5cy5tZW50dSkge1xuICAgICAgICBsZXQgcG93ZXIgPSAwO1xuXG4gICAgICAgIC8vIOWfuuehgOWxnuaAp1xuICAgICAgICBwb3dlciArPSB0aGlzLmVwX3Bvd2VyKDAsIG1lbnR1LmJhc2ljQXR0cik7XG5cbiAgICAgICAgLy8g54m55q6K5bGe5oCnXG4gICAgICAgIGlmIChtZW50dS5zcGVBdHRyICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgbWVudHUuc3BlQXR0cikge1xuICAgICAgICAgICAgICAgIGxldCBzcGVjaWFsQ2ZnID0gR2FtZWNmZy56b25nTWVuU3BlQXR0ci5nZXRJdGVtKGlkICsgXCJcIik7XG4gICAgICAgICAgICAgICAgaWYgKHNwZWNpYWxDZmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcG93ZXIgKz0gdGhpcy5lcF9wb3dlcigwLCBzcGVjaWFsQ2ZnLmF0dHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvd2VyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOWxnuaAp+i9rOWMluaIkOaImOWKm1xuICAgICAqIEBwYXJhbSB0eXBlIOm7mOiupCAgMOm7mOiupCAgMeaAqueJqVxuICAgICAqIEBwYXJhbSBlcHMg5bGe5oCn5raI5oGvXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBlcF9wb3dlcih0eXBlOiBudW1iZXIsIF9lcHM6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gfCBhbnkpOiBudW1iZXIge1xuICAgICAgICBsZXQgZXBzID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7XG4gICAgICAgIGVwcyA9IGdhbWVNZXRob2QuZXBfbWVyZ2UoZXBzLCBfZXBzKTtcbiAgICAgICAgZXBzID0gZ2FtZU1ldGhvZC5lcF9hbGxfZmlnaHQoZXBzKVxuXG4gICAgICAgIGxldCBwb3dlcjogbnVtYmVyID0gMDtcbiAgICAgICAgbGV0IGNmZ0VwUG9vbCA9IEdhbWVjZmcudXNlckVwLnBvb2w7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGNmZ0VwUG9vbCkge1xuICAgICAgICAgICAgbGV0IHJwS2V5ID0gY2ZnRXBQb29sW2tleV0ua2V5O1xuICAgICAgICAgICAgaWYgKGVwc1tycEtleV0gPT0gbnVsbCB8fCB0eXBlb2YgZXBzW3JwS2V5XSAhPSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgeGlzaHUgPSAwO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VwUG9vbFtrZXldLm1vbVBvd2VyKSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aXNodSA9IGNmZ0VwUG9vbFtrZXldLm1vbVBvd2VyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KGNmZ0VwUG9vbFtrZXldLnBvd2VyKSA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4aXNodSA9IGNmZ0VwUG9vbFtrZXldLnBvd2VyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBhZGRQb3dlciA9IE1hdGguZmxvb3IoeGlzaHUgKiBlcHNbcnBLZXldKTtcbiAgICAgICAgICAgIHBvd2VyICs9IGFkZFBvd2VyO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3dlcjtcbiAgICB9XG5cbiAgICAvL+iOt+WPluiNr+eUsOWQg+iNr+WKoOaIkOeahOWxnuaAp1xuICAgIGVwc195YW9mYW5nKGNvdW50OiBudW1iZXIsIGRhbnlhbzogeyBuYWl5YW86IG51bWJlcjsgc2hpeW9uZzogbnVtYmVyIH0sIHl4OiBudW1iZXJbXSwgZXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9KSB7XG4gICAgICAgIGxldCBuZWVkQ291bnQgPSBjb3VudDtcbiAgICAgICAgbGV0IHNoaXlvbmc6IGFueSA9IHt9O1xuICAgICAgICB3aGlsZSAobmVlZENvdW50ID4gMCkge1xuICAgICAgICAgICAgLy/opoHpmY3nuqdcbiAgICAgICAgICAgIGlmIChkYW55YW8uc2hpeW9uZyArIG5lZWRDb3VudCA+PSB5eFswXSAmJiBkYW55YW8ubmFpeWFvID4geXhbMl0pIHtcbiAgICAgICAgICAgICAgICBuZWVkQ291bnQgLT0geXhbMF0gLSBkYW55YW8uc2hpeW9uZztcbiAgICAgICAgICAgICAgICAvL+iusOW9lemjn+eUqFxuICAgICAgICAgICAgICAgIHNoaXlvbmdbZGFueWFvLm5haXlhb10gPSB5eFswXSAtIGRhbnlhby5zaGl5b25nO1xuICAgICAgICAgICAgICAgIGRhbnlhby5zaGl5b25nID0gMDtcbiAgICAgICAgICAgICAgICBkYW55YW8ubmFpeWFvIC09IHl4WzFdO1xuICAgICAgICAgICAgICAgIGRhbnlhby5uYWl5YW8gPSBNYXRoLm1heChkYW55YW8ubmFpeWFvLCB5eFsyXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChkYW55YW8ubmFpeWFvID09IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAvL+iAkOiNr+etieS6juacgOS9jueahOaXtuWAmeS4jeWKoHNoaXlvbmfmlbDph4/lj6rliqBjb3VudOaVsOmHj1xuICAgICAgICAgICAgICAgICAgICBzaGl5b25nW2Rhbnlhby5uYWl5YW9dID0gbmVlZENvdW50O1xuICAgICAgICAgICAgICAgICAgICBuZWVkQ291bnQgLT0gbmVlZENvdW50O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhbnlhby5zaGl5b25nICs9IG5lZWRDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgLy/orrDlvZXpo5/nlKhcbiAgICAgICAgICAgICAgICAgICAgc2hpeW9uZ1tkYW55YW8ubmFpeWFvXSA9IG5lZWRDb3VudDtcbiAgICAgICAgICAgICAgICAgICAgbmVlZENvdW50IC09IG5lZWRDb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGVwc0FsbDogYW55ID0ge307XG4gICAgICAgIGZvciAobGV0IG5haXlhbyBpbiBzaGl5b25nKSB7XG4gICAgICAgICAgICAvL+mBjeWOhumjn+eUqOWKoOWxnuaAp1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGVwcykge1xuICAgICAgICAgICAgICAgIGlmIChlcHNBbGxba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGVwc0FsbFtrZXldID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXBzQWxsW2tleV0gKz0gKGVwc1trZXldICogc2hpeW9uZ1tuYWl5YW9dICogTnVtYmVyKG5haXlhbykpIC8gMTAwMDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGVwc0FsbCkge1xuICAgICAgICAgICAgZXBzQWxsW2tleV0gPSBNYXRoLmZsb29yKGVwc0FsbFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzQWxsO1xuICAgIH1cblxuICAgIC8v6K6h566X5byf5a2Q5oiY5paX6Ieq6Lqr5bGe5oCn77yI5LiN5YyF5ous57un5om/5Li76KeS55qE5bGe5oCn77yJXG4gICAgZXBfZGl6aUVwcyhzZXZCYWNrOiBYeXMuU2V2QmFjaywgZHpJZDogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBkaXppRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0gZ2FtZU1ldGhvZC5lcF9pbml0KCk7IC8v5Yid5aeL5YyW5bGe5oCnXG4gICAgICAgIGlmIChkeklkID09IG51bGwgfHwgZHpJZCA9PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGl6aUVwcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgY2ZnZHogPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShkeklkKTtcbiAgICAgICAgbGV0IGRpemkgPSBzZXZCYWNrLmFjdERpWmlMaXN0Py5hPy5bZHpJZF07XG4gICAgICAgIGlmIChjZmdkeiA9PSBudWxsIHx8IGRpemkgPT0gbnVsbCB8fCBjZmdkei56aGFubGkgPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGRpemlFcHM7XG4gICAgICAgIH1cbiAgICAgICAgLy/lvJ/lrZDln7rnoYDlsZ7mgKdcbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgY2ZnZHouZXBzKTtcbiAgICAgICAgbGV0IGNmZ1pob25nWnUgPSBHYW1lY2ZnLmh1b2Jhblpob25nenUuZ2V0SXRlbShjZmdkei5waW56aGksIGNmZ2R6Lnpob25nenUudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmIChjZmdaaG9uZ1p1ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBkaXppRXBzO1xuICAgICAgICB9XG4gICAgICAgIC8v6K6h566X5byf5a2Q5Y2H57qn5bGe5oCnXG4gICAgICAgIGxldCBsZXZlbEVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLmxldmVsOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRpemlMZXZlbCA9IEdhbWVjZmcuaHVvYmFuU2hlbmdqaS5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppTGV2ZWwgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX21lcmdlKGxldmVsRXBzLCBkaXppTGV2ZWwuYXR0cik7XG4gICAgICAgIH1cbiAgICAgICAvL+S5nemchOWkqeaeouWvueW8n+WtkOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgIGZvciAoY29uc3QgaGRjaWQgaW4gc2V2QmFjay5oZEppdVhpYW9UaWFuU2h1KSB7XG4gICAgICAgICAgICAvLyDmo4Dmn6XlsZ7mgKfmmK/lkKblrZjlnKhcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldkJhY2suaGRKaXVYaWFvVGlhblNodSwgaGRjaWQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaml1eGlhbyA9IHNldkJhY2suaGRKaXVYaWFvVGlhblNodT8uW2hkY2lkXT8uYTtcbiAgICAgICAgICAgIGlmICghaml1eGlhbykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g5qOA5p+l5LyZ5Ly05bGe5oCn5Yqg5oiQ5piv5ZCm5aSn5LqOMFxuICAgICAgICAgICAgaWYgKGppdXhpYW8uaHVvQmFuRXBzID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByYXRlID0gMSArIChqaXV4aWFvLmh1b0JhbkVwcyAvIDEwMCk7XG4gICAgICAgICAgICAgICAgbGV2ZWxFcHMgPSB0aGlzLmVwX0t2UmF0ZShsZXZlbEVwcywgcmF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgbGV2ZWxFcHMpO1xuICAgICAgICAvL+iuoeeul+W8n+WtkOWNh+aYn+eahOWfuuehgOWxnuaAp+WKoOaIkFxuICAgICAgICBsZXQgc3RhckVwczogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBkaXppLnN0YXI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGl6aVN0YXIgPSBHYW1lY2ZnLmh1b2JhblN0YXIuZ2V0SXRlbShjZmdkei5pZCwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppU3RhciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGFyRXBzID0gdGhpcy5lcF9tZXJnZShzdGFyRXBzLCBkaXppU3Rhci5hdHRyMik7XG4gICAgICAgIH1cbiAgICAgICAgZGl6aUVwcyA9IHRoaXMuZXBfbWVyZ2UoZGl6aUVwcywgc3RhckVwcyk7XG4gICAgICAgIC8v6K6h566X5byf5a2Q5aKD55WM5bGe5oCnXG4gICAgICAgIGxldCBqaW5namllRXBzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGRpemkuamluZ2ppZTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBkaXppSmluZ2ppZSA9IEdhbWVjZmcuaHVvYmFuVHVwby5nZXRJdGVtKGNmZ2R6LnBpbnpoaSwgaS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmIChkaXppSmluZ2ppZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqaW5namllRXBzID0gdGhpcy5lcF9tZXJnZShqaW5namllRXBzLCBkaXppSmluZ2ppZS5hdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBkaXppRXBzID0gdGhpcy5lcF9tZXJnZShkaXppRXBzLCBqaW5namllRXBzKTtcbiAgICAgICAgcmV0dXJuIGRpemlFcHM7XG4gICAgfVxuXG4gICAgLy/ojrflj5bmqKHlnZfnmoTlsZ7mgKfliqDmiJBcbiAgICBlcF9hY3Qoc2V2QmFjazogWHlzLlNldkJhY2ssIGtleTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB7XG4gICAgICAgIGxldCBlcHMgPSB0aGlzLmVwX2luaXQoKTtcbiAgICAgICAgaWYgKHNldkJhY2suYWN0RXBzICE9IG51bGwgJiYgc2V2QmFjay5hY3RFcHMuYSAhPSBudWxsICYmIHNldkJhY2suYWN0RXBzLmFba2V5XSAhPSBudWxsKSB7XG4gICAgICAgICAgICBlcHMgPSBnYW1lTWV0aG9kLmVwX21lcmdlKGVwcywgc2V2QmFjay5hY3RFcHMuYVtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXBzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOino+aekOa0nuWkqSDnn7/ovabmlbDmja5cbiAgICAgKiBAcGFyYW0gY2FySW5mb1xuICAgICAqIEBwYXJhbSBub3dcbiAgICAgKiBAcmV0dXJucyBlZHRpbWUgLy/nprvnu5PmnZ8g6L+Y5pyJ5aSa6ZW/5pe26Ze0ICgwIOW3suWujOaIkCApKOacquW8gOWniyAtMSlcbiAgICAgKiBAcmV0dXJucyB3aW4gLy/og5zliKnmlrnmmK/osIEgMOWuiOaWuSAx5pS75pa5ICjmnKrlvIDlp4vpu5jorqQwKVxuICAgICAqIEByZXR1cm5zIG5vd3BvcyBub3dwb3MsIC8v5b2T5YmN5L2N572uXG4gICAgICovXG4gICAgZ2V0RG9uZ1RpYW5DYXIoY2FySW5mbzogWHlzLkFjdERvbmdUaWFuX0NhckluZm8gfCBhbnksIG5vdzogbnVtYmVyKTogWHlzLkFjdERvbmdUaWFuX0NhcnNob3cge1xuICAgICAgICBpZiAoY2FySW5mby5zdGltZSA8PSAwKSB7XG4gICAgICAgICAgICAvL+acquWQr+WKqFxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlZHRpbWU6IC0xLCAvL+emu+e7k+adnyDov5jmnInlpJrplb/ml7bpl7RcbiAgICAgICAgICAgICAgICB3aW46IDAsIC8v6IOc5Yip5pa55piv6LCBIDDlrojmlrkgMeaUu+aWuSAo5pyq5byA5aeL6buY6K6kMClcbiAgICAgICAgICAgICAgICBub3dwb3M6IGNhckluZm8uZHBvcywgLy/lvZPliY3kvY3nva5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgLy/ojrflj5bnn7/ovabphY3nva5cbiAgICAgICAgbGV0IGNhckNmZyA9IEdhbWVjZmcuZG9uZ3RpYW5DYXIuZ2V0SXRlbShjYXJJbmZvLmlkKTtcbiAgICAgICAgaWYgKGNhckNmZyA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBkb25ndGlhbkNhcl9lcnI6JHtjYXJJbmZvLmlkfWApO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBlZHRpbWU6IC0xLCAvL+emu+e7k+adnyDov5jmnInlpJrplb/ml7bpl7RcbiAgICAgICAgICAgICAgICB3aW46IDAsIC8v6IOc5Yip5pa55piv6LCBIDDlrojmlrkgMeaUu+aWuSAo5pyq5byA5aeL6buY6K6kMClcbiAgICAgICAgICAgICAgICBub3dwb3M6IGNhckluZm8uZHBvcywgLy/lvZPliY3kvY3nva5cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZG51bSA9IDA7IC8v6IOc5Yip5pa55aSa5Ye65p2l55qE5Lq65pWwXG4gICAgICAgIGxldCBwb3cgPSAxOyAvL+iDnOWIqeaWueeKtuaAgeWAvFxuICAgICAgICBsZXQgbGVuZyA9IGNhckluZm8uZHBvczsgLy/ot53nprso5pys5pa56Led56a7KVxuICAgICAgICBsZXQgd2luOiAwIHwgMSA9IDA7XG4gICAgICAgIGxldCBmZXZDYXJkOiBib29sZWFuID0gZmFsc2U7IC8v6IOc5Yip5pa55piv5ZCm5pyJ57uI55Sf5Y2hXG4gICAgICAgIC8v5Lq65pWw5a+55q+UXG4gICAgICAgIGlmIChjYXJJbmZvLmhlLmtudW0ubGVuZ3RoID4gY2FySW5mby5teS5rbnVtLmxlbmd0aCkge1xuICAgICAgICAgICAgLy/ov5vmlLvmlrnog5zliKlcbiAgICAgICAgICAgIGRudW0gPSBjYXJJbmZvLmhlLmtudW0ubGVuZ3RoIC0gY2FySW5mby5teS5rbnVtLmxlbmd0aDtcbiAgICAgICAgICAgIHBvdyA9IGNhckluZm8uaGUucG93O1xuICAgICAgICAgICAgbGVuZyA9IGNhckNmZy5sZW5nc1syXSAtIGNhckluZm8uZHBvczsgLy/lj43lkJHot53nprtcbiAgICAgICAgICAgIHdpbiA9IDE7IC8v6L+b5pS75pa56IOc5YipXG4gICAgICAgICAgICBmZXZDYXJkID0gY2FySW5mby5oZS5mZXZDYXJkOyAvL+e7iOeUn+WNoVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy/pmLLlrojmlrnog5zliKlcbiAgICAgICAgICAgIGRudW0gPSBjYXJJbmZvLm15LmtudW0ubGVuZ3RoIC0gY2FySW5mby5oZS5rbnVtLmxlbmd0aDtcbiAgICAgICAgICAgIHBvdyA9IGNhckluZm8ubXkucG93O1xuICAgICAgICAgICAgZmV2Q2FyZCA9IGNhckluZm8ubXkuZmV2Q2FyZDsgLy/nu4jnlJ/ljaFcbiAgICAgICAgfVxuICAgICAgICAvL+WmguaenOS6uuaVsCA8PSAwICjpmLLlrojmlrnog5zliKkg57O75pWwMC43KSAg5bCx5b2T6Ziy5a6I5pa55pyJMC435Liq5Lq6XG4gICAgICAgIGRudW0gPSBNYXRoLm1heChkbnVtLCAwLjcpO1xuXG4gICAgICAgIC8v5ZOl5biD5p6X6YCf5bqm57O75pWwXG4gICAgICAgIGxldCB3a1ZlbCA9IDE7XG4gICAgICAgIGxldCBjZmdNYXRoID0gR2FtZWNmZy5tYXRoSW5mby5nZXRJdGVtKFwiZG9uZ3RpYW5fd2tWZWxcIik7XG4gICAgICAgIGlmIChjZmdNYXRoID09IG51bGwgfHwgY2ZnTWF0aC5wcmFtLmNvdW50ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYGRvbmd0aWFuX3drVmVsYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3a1ZlbCA9IGNmZ01hdGgucHJhbS5jb3VudDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdGlsaXhzID0gMjAwOyAvL+agueaNruS9k+WKm+iOt+W+l+ezu+aVsFxuXG4gICAgICAgIC8v5oC76YCf5bqmXG4gICAgICAgIGxldCB2ZWwgPSAoZG51bSAqIHdrVmVsICogdGlsaXhzKSAvIDEwMDtcbiAgICAgICAgLy/nu4jnlJ/ljaEg6YCf5bqm5Yqg5oiQICs1JVxuICAgICAgICBsZXQgc2RhZGQgPSAxMDAwMDtcbiAgICAgICAgaWYgKGZldkNhcmQpIHtcbiAgICAgICAgICAgIHNkYWRkICs9IDE1MDA7XG4gICAgICAgIH1cbiAgICAgICAgdmVsID0gKHZlbCAqIHNkYWRkKSAvIDEwMDAwO1xuXG4gICAgICAgIC8v5oC755qE6ZyA6KaB5pe26Ze0IOiuoeeul+WFrOW8j1xuICAgICAgICBsZXQgYWxsVGltZSA9IE1hdGguY2VpbChsZW5nIC8gdmVsKTtcblxuICAgICAgICAvL+e7j+i/h+aXtumXtFxuICAgICAgICBsZXQgZHRpbWUgPSBub3cgLSBjYXJJbmZvLnN0aW1lO1xuICAgICAgICBpZiAoZHRpbWUgPj0gYWxsVGltZSkge1xuICAgICAgICAgICAgLy/lt7LlrozmiJBcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZWR0aW1lOiAwLCAvL+emu+e7k+adnyDov5jmnInlpJrplb/ml7bpl7QgKOacquW8gOWniyAtMSlcbiAgICAgICAgICAgICAgICB3aW46IHdpbiwgLy/og5zliKnmlrnmmK/osIEgMOWuiOaWuSAx5pS75pa5ICjmnKrlvIDlp4vpu5jorqQwKVxuICAgICAgICAgICAgICAgIG5vd3Bvczogd2luID8gY2FyQ2ZnLmxlbmdzWzJdIDogMCwgLy/lvZPliY3kvY3nva4g6Ziy5a6I5pa56IOc5YipIOWwseaYrzAg6L+b5pS75pa56IOc5YipIOWwseaYr+acgOWkp+WAvFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8v5pyq5a6M5oiQIOiuoeeulyDlvZPliY3kvY3nva7lgY/np7vph49cbiAgICAgICAgICAgIGxldCBkcG9zID0gZHRpbWUgKiB2ZWw7XG4gICAgICAgICAgICAvL+W9k+WJjeS9jee9rlxuICAgICAgICAgICAgbGV0IG5vd3BvcyA9IGNhckluZm8uZHBvcztcbiAgICAgICAgICAgIGlmICh3aW4gPiAwKSB7XG4gICAgICAgICAgICAgICAgbm93cG9zICs9IGRwb3M7XG4gICAgICAgICAgICAgICAgbm93cG9zID0gTWF0aC5mbG9vcihub3dwb3MpOyAvL+i/m+aUu+aWueiDnOWIqSDlj5bkvZnlgY/lkJHpmLLlrojmlrko5bCP5YC8KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub3dwb3MgLT0gZHBvcztcbiAgICAgICAgICAgICAgICBub3dwb3MgPSBNYXRoLmNlaWwobm93cG9zKTsgLy/pmLLlrojmlrnog5zliKkg5Y+W5L2Z5YGP5ZCR6L+b5pS75pa5KOWkp+WAvClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZWR0aW1lOiBhbGxUaW1lIC0gZHRpbWUsIC8v56a757uT5p2fIOi/mOacieWkmumVv+aXtumXtCAo5pyq5byA5aeLIC0xKVxuICAgICAgICAgICAgICAgIHdpbjogd2luLCAvL+iDnOWIqeaWueaYr+iwgSAw5a6I5pa5IDHmlLvmlrkgKOacquW8gOWni+m7mOiupDApXG4gICAgICAgICAgICAgICAgbm93cG9zOiBub3dwb3MsIC8v5b2T5YmN5L2N572uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog56ug6IqC5oyC5py66K6h566XXG4gICAgICogQHBhcmFtIGFjdFpoYW5namllIOeroOiKguS/oeaBr1xuICAgICAqIEBwYXJhbSBuZXdUaW1lIOeOsOWcqOaXtumXtFxuICAgICAqIEBwYXJhbSB6ZmxldmVsIOmYteazleetiee6p1xuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZ3VhamlJdGVtcyhcbiAgICAgICAgX2FjdFpoYW5namllOiBYeXMuQWN0WmhhbmdqaWUsXG4gICAgICAgIG5ld1RpbWU6IG51bWJlcixcbiAgICAgICAgemZsZXZlbDogbnVtYmVyXG4gICAgKTogeyBpdGVtczogWHlzLktpbmRJdGVtW107IHp5X2l0ZW1zOiBYeXMuS2luZEl0ZW1bXTsgZGpfaXRlbXM6IFh5cy5LaW5kSXRlbVtdOyBhY3RaaGFuZ2ppZTogWHlzLkFjdFpoYW5namllIH0ge1xuICAgICAgICBsZXQgYWN0WmhhbmdqaWU6IFh5cy5BY3RaaGFuZ2ppZSA9IHRoaXMub2JqQ29weShfYWN0WmhhbmdqaWUpO1xuICAgICAgICBsZXQgaXRlbXM6IFh5cy5LaW5kSXRlbVtdID0gW107IC8v5oyC5py65aWW5YqxKOaAuylcbiAgICAgICAgbGV0IHp5X2l0ZW1zOiBYeXMuS2luZEl0ZW1bXSA9IFtdOyAvL+aMguacuuWlluWKse+8iOmHkeW4gS/njqnlrrbnu4/pqowv6Zi15rOV57uP6aqM77yJXG4gICAgICAgIGxldCBkal9pdGVtczogWHlzLktpbmRJdGVtW10gPSBbXTsgLy/mjILmnLrlpZblirHvvIjpgZPlhbfvvIlcbiAgICAgICAgbGV0IGNmZ3pqID0gR2FtZWNmZy56aGFuZ2ppZUluZm8uZ2V0SXRlbShhY3RaaGFuZ2ppZS56amlkKTtcbiAgICAgICAgaWYgKGNmZ3pqID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0WmhhbmdqaWU6IGFjdFpoYW5namllLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgICAgICAgICB6eV9pdGVtczogenlfaXRlbXMsXG4gICAgICAgICAgICAgICAgZGpfaXRlbXM6IGRqX2l0ZW1zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2ZnemouZ2pSd2RfenkpIHtcbiAgICAgICAgICAgIGxldCBjQXQ6IG51bWJlciA9IG5ld1RpbWUgLSBhY3RaaGFuZ2ppZS5nanRpbWU7XG4gICAgICAgICAgICBjQXQgPSBNYXRoLm1pbihjQXQsIGFjdFpoYW5namllLmdqTWF4ICogMzYwMCk7IC8vOOWwj+aXtuS4iumZkFxuICAgICAgICAgICAgbGV0IGNvdW50ID0gTWF0aC5mbG9vcihjQXQgLyAoaXRlbVszXSAvIGl0ZW1bMl0pKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFtpdGVtWzBdLCBpdGVtWzFdLCBjb3VudF0pO1xuICAgICAgICAgICAgICAgIHp5X2l0ZW1zLnB1c2goW2l0ZW1bMF0sIGl0ZW1bMV0sIGNvdW50XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2ZnemouZ2pSd2RfZGopIHtcbiAgICAgICAgICAgIGlmIChpdGVtWzRdICE9IG51bGwgJiYgaXRlbVs0XSA+IHpmbGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy/mnKrovr7liLDpmLXms5XnrYnnuqdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3RaaGFuZ2ppZS5nalJ3ZF9kaltpdGVtWzBdLnRvU3RyaW5nKCldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhY3RaaGFuZ2ppZS5nalJ3ZF9kaltpdGVtWzBdLnRvU3RyaW5nKCldID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWN0WmhhbmdqaWUuZ2pSd2RfZGpbaXRlbVswXS50b1N0cmluZygpXVtpdGVtWzFdLnRvU3RyaW5nKCldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhY3RaaGFuZ2ppZS5nalJ3ZF9kaltpdGVtWzBdLnRvU3RyaW5nKCldW2l0ZW1bMV0udG9TdHJpbmcoKV0gPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNBdDogbnVtYmVyID0gbmV3VGltZSAtIGFjdFpoYW5namllLmdqdGltZTtcbiAgICAgICAgICAgIGNBdCA9IE1hdGgubWluKGNBdCwgYWN0WmhhbmdqaWUuZ2pNYXggKiAzNjAwKSArIGFjdFpoYW5namllLmdqUndkX2RqW2l0ZW1bMF0udG9TdHJpbmcoKV1baXRlbVsxXS50b1N0cmluZygpXTtcblxuICAgICAgICAgICAgLy/ojrflvpfkuIDkuKrpgZPlhbcg6ZyA6KaB5aSa6ZW/5pe26Ze0XG4gICAgICAgICAgICBsZXQgb25lVGltZSA9IGl0ZW1bM10gLyBpdGVtWzJdO1xuICAgICAgICAgICAgbGV0IGNvdW50ID0gTWF0aC5mbG9vcihjQXQgLyBvbmVUaW1lKTtcbiAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFtpdGVtWzBdLCBpdGVtWzFdLCBjb3VudF0pO1xuICAgICAgICAgICAgICAgIGRqX2l0ZW1zLnB1c2goW2l0ZW1bMF0sIGl0ZW1bMV0sIGNvdW50XSk7XG4gICAgICAgICAgICAgICAgYWN0WmhhbmdqaWUuZ2pSd2RfZGpbaXRlbVswXS50b1N0cmluZygpXVtpdGVtWzFdLnRvU3RyaW5nKCldID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdFpoYW5namllLmdqUndkX2RqW2l0ZW1bMF0udG9TdHJpbmcoKV1baXRlbVsxXS50b1N0cmluZygpXSA9IE1hdGguZmxvb3IoY0F0ICUgb25lVGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgYWN0WmhhbmdqaWUuZ2p0aW1lID0gbmV3VGltZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFjdFpoYW5namllOiBhY3RaaGFuZ2ppZSxcbiAgICAgICAgICAgIC8vIGl0ZW1zOiBnYW1lTWV0aG9kLm1lcmdlQXJyKGl0ZW1zKSxcbiAgICAgICAgICAgIGl0ZW1zOiBpdGVtcyxcbiAgICAgICAgICAgIHp5X2l0ZW1zOiBnYW1lTWV0aG9kLm1lcmdlQXJyKHp5X2l0ZW1zKSxcbiAgICAgICAgICAgIGRqX2l0ZW1zOiBnYW1lTWV0aG9kLm1lcmdlQXJyKGRqX2l0ZW1zKSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvL+W8guaIluWKoOino+WvhlxuICAgIHhvckVuY3J5cHQoc3RyOiBzdHJpbmcsIHg6Ym9vbGVhbiA9IHRydWUsIGtleTogc3RyaW5nID0gXCJ6Z3l4MjAyNDg4OFwiKSB7XG4gICAgICAgIGlmKCF4KXtcbiAgICAgICAgICAgIHJldHVybiBzdHJcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlID0gc3RyLmNoYXJDb2RlQXQoaSkgXiBrZXkuY2hhckNvZGVBdChpICUga2V5Lmxlbmd0aCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICAgIH1cblxuICAgIC8vIOeUqOmaj+acuuenjeWtkOiOt+WPluWkquWIneWPpOefv+WcsOWbvlxuICAgIGdldEd1S3VhbmdNYXAocmFuZE51bTogbnVtYmVyLCBjczogbnVtYmVyKTogeyBpZDogc3RyaW5nOyBocDogbnVtYmVyOyBpdGVtOiBudW1iZXJbXVtdOyBpY29uOiBzdHJpbmcgfVtdW10ge1xuICAgICAgICBsZXQgZ2V6aUNwOiBudW1iZXJbXSA9IE9iamVjdC52YWx1ZXMoZ2V6aSk7XG4gICAgICAgIGxldCBtYXA6IHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBocDogbnVtYmVyO1xuICAgICAgICAgICAgaXRlbTogbnVtYmVyW11bXTtcbiAgICAgICAgICAgIGljb246IHN0cmluZztcbiAgICAgICAgfVtdW10gPSBbXTsgLy8g5Zyw5Zu+5pWw5o2uXG4gICAgICAgIGxldCBzZW5kUmFuZCA9IG5ldyBTZWVkUmFuZChyYW5kTnVtKTtcbiAgICAgICAgc2VuZFJhbmQucmFuZG9tKCk7XG4gICAgICAgIGdlemlDcCA9IHNlbmRSYW5kLmFycmF5U2h1ZmZsZShnZXppQ3ApO1xuICAgICAgICBsZXQgaW5kZXggPSAxO1xuICAgICAgICBsZXQgdGNJbmZvO1xuICAgICAgICBsZXQgdHNJbmZvO1xuICAgICAgICBsZXQgdGNJbmZvTGFzdDtcbiAgICAgICAgbGV0IHRzSW5mb0xhc3Q7XG4gICAgICAgIHdoaWxlIChpbmRleCA+IDApIHtcbiAgICAgICAgICAgIGxldCB0Y0luZm8yO1xuICAgICAgICAgICAgbGV0IHRzSW5mbzI7XG4gICAgICAgICAgICBpZiAodGNJbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0Y0luZm8yID0gR2FtZWNmZy50YWljaHVJbmZvLmdldEl0ZW0oaW5kZXgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHNJbmZvID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0c0luZm8yID0gR2FtZWNmZy50YWljaHVUcy5nZXRJdGVtKGluZGV4LnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRjSW5mbzIgJiYgdGNJbmZvMi5jc1swXSA8PSBjcyAmJiB0Y0luZm8yLmNzWzFdID49IGNzKSB7XG4gICAgICAgICAgICAgICAgdGNJbmZvID0gdGNJbmZvMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGNJbmZvMikge1xuICAgICAgICAgICAgICAgIHRjSW5mb0xhc3QgPSB0Y0luZm8yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRzSW5mbzIgJiYgdHNJbmZvMi5jc1swXSA8PSBjcyAmJiB0c0luZm8yLmNzWzFdID49IGNzKSB7XG4gICAgICAgICAgICAgICAgdHNJbmZvID0gdHNJbmZvMjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHNJbmZvMikge1xuICAgICAgICAgICAgICAgIHRzSW5mb0xhc3QgPSB0c0luZm8yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRjSW5mbyAmJiB0c0luZm8pIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0Y0luZm8yID09IG51bGwgJiYgdHNJbmZvMiA9PSBudWxsICYmIHRjSW5mb0xhc3QgJiYgdHNJbmZvTGFzdCkge1xuICAgICAgICAgICAgICAgIHRjSW5mbyA9IGdhbWVNZXRob2Qub2JqQ29weSh0Y0luZm9MYXN0KTtcbiAgICAgICAgICAgICAgICB0c0luZm8gPSBnYW1lTWV0aG9kLm9iakNvcHkodHNJbmZvTGFzdCk7XG4gICAgICAgICAgICAgICAgbGV0IHRzX2NzX21pbiA9IHRzSW5mby5jc1swXTtcbiAgICAgICAgICAgICAgICBsZXQgdHNfY3NfbWF4ID0gdHNJbmZvLmNzWzFdO1xuICAgICAgICAgICAgICAgIGxldCBjaGEgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0c19jc19tYXggKyBjaGEgPCBjcykge1xuICAgICAgICAgICAgICAgICAgICBjaGEgPSB0c19jc19tYXggLSB0c19jc19taW47XG4gICAgICAgICAgICAgICAgICAgIHRzX2NzX21pbiA9IHRzX2NzX21heCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHRzX2NzX21heCA9IHRzX2NzX21pbiArIGNoYTtcbiAgICAgICAgICAgICAgICAgICAgY2hhID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdHNJbmZvLmNzID0gW3RzX2NzX21pbiwgdHNfY3NfbWF4XTtcbiAgICAgICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0Y0luZm8gPT0gbnVsbCB8fCB0c0luZm8gPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgamxDczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRzSW5mby5jc1swXTsgaSA8PSB0c0luZm8uY3NbMV07IGkrKykge1xuICAgICAgICAgICAgamxDcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBqbEMgPSBzZW5kUmFuZC5nZXRSYW5kQXJyMihqbENzLCAxKS5yZXN1bHRbMF07IC8vIOW9k+WJjeWxguaVsOWMuumXtCDlpZblirHlsYLmiYDlnKjlsYLmlbBcbiAgICAgICAgbGV0IGl0ZW1Db3VudDogeyBbaXRlbWlkOiBzdHJpbmddOiBudW1iZXJbXSB9ID0ge307IC8vIOWcsOWdl2lkOlvmoLzlrZDmlbDnu4RdXG4gICAgICAgIGxldCBzZCA9IHRjSW5mby5zZDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHNlbmRSYW5kLmdldFJhbmRBcnIyKGdlemlDcCwgc2RbaV1bMV0pO1xuICAgICAgICAgICAgZ2V6aUNwID0gcmVzdWx0LmFycjtcbiAgICAgICAgICAgIGl0ZW1Db3VudFtzZFtpXVswXS50b1N0cmluZygpXSA9IHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGpsY051bTogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIOWlluWKseWxguaJgOWcqOihjOaVsCAwLTVcbiAgICAgICAgaWYgKGpsQyA9PSBjcykge1xuICAgICAgICAgICAgamxjTnVtID0gc2VuZFJhbmQuZ2V0UmFuZEFycjIoWzAsIDEsIDIsIDMsIDQsIDVdLCAxKS5yZXN1bHRbMF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGl0ZW1Db3VudEtleXMgPSBPYmplY3Qua2V5cyhpdGVtQ291bnQpO1xuICAgICAgICBsZXQgbWFwTGluZToge1xuICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgIGhwOiBudW1iZXI7XG4gICAgICAgICAgICBpdGVtOiBudW1iZXJbXVtdO1xuICAgICAgICAgICAgaWNvbjogc3RyaW5nO1xuICAgICAgICB9W10gPSBbXTtcbiAgICAgICAgbGV0IGlzSGFzID0gZmFsc2U7XG4gICAgICAgIGxldCB0aWxlc0luZm8xMDEgPSBHYW1lY2ZnLnRhaWNodVRpbGVzLmdldEl0ZW0oXCIxXCIpO1xuICAgICAgICBsZXQgdGlsZXNJbmZvMzAxID0gR2FtZWNmZy50YWljaHVUaWxlcy5nZXRJdGVtKFwiMzAxXCIpO1xuICAgICAgICBsZXQgbGluZSA9IDA7IC8vIOesrOWHoOihjFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdlemkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxpbmUgPSBNYXRoLmZsb29yKGkgLyA2KSArIDE7XG4gICAgICAgICAgICAvLyDlvIDlp4vnu5jliLblnLDlm75cbiAgICAgICAgICAgIGlmIChpICUgNiA9PSAwICYmIG1hcExpbmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG1hcC5wdXNoKG1hcExpbmUpO1xuICAgICAgICAgICAgICAgIG1hcExpbmUgPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzSGFzID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgenVvamlhSW5mbyA9IEdhbWVjZmcudGFpY2h1WnVvamlhLmdldEl0ZW0oY3MudG9TdHJpbmcoKSwgbGluZS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIGlmICh6dW9qaWFJbmZvICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpc0hhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWQgb2YgenVvamlhSW5mby5pdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0aWxlc0luZm8gPSBHYW1lY2ZnLnRhaWNodVRpbGVzLmdldEl0ZW0oaWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGluZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGlsZXNJbmZvLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwOiB0aWxlc0luZm8uaHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogdGlsZXNJbmZvLml0bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcExpbmUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGkgKz0gNTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBpdGVtQ291bnRLZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQ291bnRbaXRlbUNvdW50S2V5c1trXV0uaW5kZXhPZihpKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGVzSW5mbyA9IEdhbWVjZmcudGFpY2h1VGlsZXMuZ2V0SXRlbShpdGVtQ291bnRLZXlzW2tdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExpbmUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtQ291bnRLZXlzW2tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocDogdGlsZXNJbmZvLmhwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiB0aWxlc0luZm8uaXRtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNIYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0hhcykge1xuICAgICAgICAgICAgICAgIGlmIChjcyA9PSAxICYmIGkgPCA2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8xMDEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGluZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIxXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvMTAxLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlc0luZm8xMDEgJiYgbWFwLmxlbmd0aCA+IDAgJiYgbWFwW21hcC5sZW5ndGggLSAxXVttYXBMaW5lLmxlbmd0aF0uaHAgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5LiK5LiA5bGC5piv56m65qC8IOWKoOS4gOS4quacqOWdl1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGluZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGlsZXNJbmZvMTAxLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhwOiB0aWxlc0luZm8xMDEuaHAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogdGlsZXNJbmZvMTAxLml0bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogdGlsZXNJbmZvMTAxLmljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcExpbmUucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXBMaW5lLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1hcC5wdXNoKG1hcExpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChqbGNOdW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGxlbiA9IHRzSW5mby5zZC5sZW5ndGg7XG4gICAgICAgICAgICBpZiAobGVuICE9IDEyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHNJbmZvLnNkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgJSA2ID09IDAgJiYgaSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGpsY051bSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGlsZXNJbmZvMzAxICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbWFwW2psY051bV1baSAlIDZdID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRzSW5mby5zZFtpXS5sZW5ndGggPT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIzMDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBpID09IDAgPyB0aWxlc0luZm8zMDEuaWNvbiA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogXCIzMDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHA6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IFt0c0luZm8uc2RbaV1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBpID09IDAgPyB0aWxlc0luZm8zMDEuaWNvbiA6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDlpZblirHlsYLkuIvkuIDlsYIg5pW06KGM5LiN6IO95Li656m6XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpICUgNiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGpsY051bSArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobWFwW2psY051bV1baSAlIDZdLmhwIDw9IDAgJiYgdGlsZXNJbmZvMTAxICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8g6L2s5oiQ55+z5aS0XG4gICAgICAgICAgICAgICAgICAgIG1hcFtqbGNOdW1dW2kgJSA2XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aWxlc0luZm8xMDEuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBocDogdGlsZXNJbmZvMTAxLmhwLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbTogdGlsZXNJbmZvMTAxLml0bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiB0aWxlc0luZm8xMDEuaWNvbixcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLnmja7njqnlrrbpgInnmoTmtYHmtL7mjqjojZDpmLXlrrlcbiAgICAgKiBAcGFyYW0gdHlwZSDnjqnlrrbpooTpgInmtYHmtL5cbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHR1aWppYW4oc2V2QmFjazogWHlzLlNldkJhY2ssIHR5cGU6IHN0cmluZykge1xuICAgICAgICAvL+eUqOS6juiusOW9leWTquS6m+S9jee9ruiiq+S9v+eUqOS6hlxuICAgICAgICBsZXQgZ2V6aTogc3RyaW5nW10gPSBbXCIxXCIsIFwiMlwiLCBcIjNcIiwgXCI0XCIsIFwiNVwiLCBcIjZcIiwgXCI3XCIsIFwiOFwiLCBcIjlcIl07XG4gICAgICAgIGxldCB0dWlqaWFuOiB7IFtnemlkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICAgICAgICAvL+WFiOetm+mAieWHuuespuWQiOimgeaxgueahOW8n+WtkGlk5YiX6KGoXG4gICAgICAgIGxldCBkekxpc3QxOiBhbnlbXSA9IFtdOyAvL+WJjeaOklxuICAgICAgICBsZXQgZHpMaXN0MjogYW55W10gPSBbXTsgLy/kuK3mjpJcbiAgICAgICAgbGV0IGR6TGlzdDM6IGFueVtdID0gW107IC8v5ZCO5o6SXG4gICAgICAgIGxldCB3YW5iaWFuMTogYW55W10gPSBbXTsgLy/kuIflj5jmtYHliY3mjpJcbiAgICAgICAgbGV0IHdhbmJpYW4yOiBhbnlbXSA9IFtdOyAvL+S4h+WPmOa1geS4reaOklxuICAgICAgICBsZXQgd2FuYmlhbjM6IGFueVtdID0gW107IC8v5LiH5Y+Y5rWB5ZCO5o6SXG4gICAgICAgIGxldCBvdGhlcjE6IGFueVtdID0gW107IC8v5YW25LuW5YmN5o6SXG4gICAgICAgIGxldCBvdGhlcjI6IGFueVtdID0gW107IC8v5YW25LuW5Lit5o6SXG4gICAgICAgIGxldCBvdGhlcjM6IGFueVtdID0gW107IC8v5YW25LuW5ZCO5o6SXG4gICAgICAgIGxldCBhY3REaVppTGlzdDogYW55ID0ge307XG4gICAgICAgIGlmIChzZXZCYWNrLmFjdERpWmlMaXN0ICE9IG51bGwgJiYgc2V2QmFjay5hY3REaVppTGlzdC5hICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFjdERpWmlMaXN0ID0gc2V2QmFjay5hY3REaVppTGlzdC5hO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGR6aWQgaW4gYWN0RGlaaUxpc3QpIHtcbiAgICAgICAgICAgIGxldCBjZmcgPSBHYW1lY2ZnLmh1b2JhbkJhc2UuZ2V0SXRlbShhY3REaVppTGlzdFtkemlkXS5pZCk7XG4gICAgICAgICAgICBpZiAoY2ZnID09IG51bGwgfHwgY2ZnLnNob3cgPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy/kuI3mmK/pooTpgInmtYHmtL7lkozkuIflj5jmtYHkuI3nrKblkIjmnaHku7ZcbiAgICAgICAgICAgIGlmIChjZmcubGl1cGFpICE9IHR5cGUgJiYgY2ZnLmxpdXBhaSAhPSBcIjVcIikge1xuICAgICAgICAgICAgICAgIGlmIChjZmcuZGluZ3dlaSA9PSBcIjFcIikge1xuICAgICAgICAgICAgICAgICAgICBvdGhlcjEucHVzaChkemlkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmZy5kaW5nd2VpID09IFwiMlwiKSB7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyMi5wdXNoKGR6aWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnLmRpbmd3ZWkgPT0gXCIzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3RoZXIzLnB1c2goZHppZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNmZy5kaW5nd2VpID09IFwiMVwiICYmIGNmZy5saXVwYWkgPT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIGR6TGlzdDEucHVzaChkemlkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnLmRpbmd3ZWkgPT0gXCIyXCIgJiYgY2ZnLmxpdXBhaSA9PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgZHpMaXN0Mi5wdXNoKGR6aWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjZmcuZGluZ3dlaSA9PSBcIjNcIiAmJiBjZmcubGl1cGFpID09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBkekxpc3QzLnB1c2goZHppZCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNmZy5kaW5nd2VpID09IFwiMVwiICYmIGNmZy5saXVwYWkgPT0gXCI1XCIpIHtcbiAgICAgICAgICAgICAgICB3YW5iaWFuMS5wdXNoKGR6aWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjZmcuZGluZ3dlaSA9PSBcIjJcIiAmJiBjZmcubGl1cGFpID09IFwiNVwiKSB7XG4gICAgICAgICAgICAgICAgd2FuYmlhbjIucHVzaChkemlkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ZnLmRpbmd3ZWkgPT0gXCIzXCIgJiYgY2ZnLmxpdXBhaSA9PSBcIjVcIikge1xuICAgICAgICAgICAgICAgIHdhbmJpYW4zLnB1c2goZHppZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHB1c2gxID0gMDsgLy/orrDlvZXliY3mjpLmlL7kuoblh6DkuKrlvJ/lrZBcbiAgICAgICAgbGV0IHB1c2gyID0gMDsgLy/orrDlvZXkuK3mjpLmlL7kuoblh6DkuKrlvJ/lrZBcbiAgICAgICAgbGV0IHB1c2gzID0gMDsgLy/orrDlvZXlkI7mjpLmlL7kuoblh6DkuKrlvJ/lrZBcbiAgICAgICAgLy/pgInlh7ox5Liq5YmN5o6SM+S4quS4reaOkjLkuKrlkI7mjpIg5LyY5YWI6YCJ5pys5rWB5rS+77yM54S25ZCO6YCJ5LiH5Y+Y5rWB77yM5ZCm5YiZ6YCJ5omA5pyJ5byf5a2Q6YeM6Z2i5oiY5Yqb5pyA6auY55qEXG4gICAgICAgIGlmIChkekxpc3QxLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5piv5Y+q5pyJ5LiA5Liq5bCx55u05o6l6L+b5Y67XG4gICAgICAgICAgICBpZiAoZHpMaXN0MS5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgIHR1aWppYW5bXCIxXCJdID0gZHpMaXN0MVswXTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoXCIxXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaDEgKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1heFBvd2VyID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkemlkIG9mIGR6TGlzdDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvd2VyID0gdGhpcy5lcF9wb3dlcl9kaXppKHNldkJhY2ssIGR6aWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG93ZXIgPiBtYXhQb3dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4UG93ZXIgPSBwb3dlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aWppYW5bXCIxXCJdID0gZHppZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZihcIjFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2gxICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FuYmlhbjEubGVuZ3RoID4gMCAmJiBwdXNoMSA8IDEpIHtcbiAgICAgICAgICAgIC8v5rKh5pyJ5bCx6YGN5Y6G5LiH5Y+Y5rWBXG4gICAgICAgICAgICAvL+WmguaenOaYr+WPquacieS4gOS4quWwseebtOaOpei/m+WOu1xuICAgICAgICAgICAgaWYgKHdhbmJpYW4xLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgdHVpamlhbltcIjFcIl0gPSB3YW5iaWFuMVswXTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoXCIxXCIpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaDEgKz0gMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG1heFBvd2VyID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBkemlkIG9mIHdhbmJpYW4xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwb3dlciA9IHRoaXMuZXBfcG93ZXJfZGl6aShzZXZCYWNrLCBkemlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvd2VyID4gbWF4UG93ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heFBvd2VyID0gcG93ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0dWlqaWFuW1wiMVwiXSA9IGR6aWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXppLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoMSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v5pS+5Lit5o6S55qEXG4gICAgICAgIGlmIChkekxpc3QyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8v5aaC5p6c5piv5bCP5LqO562J5LqOM+S4quWwseebtOaOpeaUvui/m+WOu1xuICAgICAgICAgICAgaWYgKGR6TGlzdDIubGVuZ3RoIDw9IDMpIHtcbiAgICAgICAgICAgICAgICBsZXQgeGIgPSA0O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZHpMaXN0Mi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gZHpMaXN0MltpXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gZ2V6aS5pbmRleE9mKCh4YiArIGkpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V6aS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHB1c2gyICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBkekxpc3QyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGR6aWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIucG93ZXIgLSBhLnBvd2VyKSAvLyDmjInmiJjlipvku47lpKfliLDlsI/mjpLluo9cbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIDMpIC8vIOmAieWHuuaImOWKm+acgOmrmOeahOS4ieS4quW8n+WtkFxuICAgICAgICAgICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmR6aWQpOyAvLyDlj6rlj5YgZHppZFxuICAgICAgICAgICAgICAgIGxldCB4YiA9IDQ7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHVpamlhblsoeGIgKyBpKS50b1N0cmluZygpXSA9IG5lZWREemlkW2ldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoKHhiICsgaSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXppLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcHVzaDIgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAod2FuYmlhbjIubGVuZ3RoID4gMCAmJiBwdXNoMiA8IDMpIHtcbiAgICAgICAgICAgIC8v5byf5a2Q5LiN5ruh6LazM+S4quWwsemBjeWOhuS4h+WPmOa1gVxuICAgICAgICAgICAgbGV0IG5lZWREemlkID0gd2FuYmlhbjJcbiAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDMgLSBwdXNoMikgLy8g6YCJ5Ye65oiY5Yqb5pyA6auY55qE6ZyA6KaB55qE5byf5a2Q5pWw6YePXG4gICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5kemlkKTsgLy8g5Y+q5Y+WIGR6aWRcbiAgICAgICAgICAgIGxldCB4YiA9IDQgKyBwdXNoMjtcbiAgICAgICAgICAgIGxldCBjcyA9IDIgLSBwdXNoMztcbiAgICAgICAgICAgIGNzID0gTWF0aC5taW4oY3MsIHdhbmJpYW4yLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gZ2V6aS5pbmRleE9mKCh4YiArIGkpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHVzaDIgKz0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL+aUvuWQjuaOkueahFxuICAgICAgICBpZiAoZHpMaXN0My5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL+WmguaenOaYr+Wwj+S6juetieS6jjLkuKrlsLHnm7TmjqXmlL7ov5vljrtcbiAgICAgICAgICAgIGlmIChkekxpc3QzLmxlbmd0aCA8PSAyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHhiID0gNztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGR6TGlzdDMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdHVpamlhblsoeGIgKyBpKS50b1N0cmluZygpXSA9IGR6TGlzdDNbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZigoeGIgKyBpKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwdXNoMyArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5lZWREemlkID0gZHpMaXN0M1xuICAgICAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkemlkLCBwb3dlcjogdGhpcy5lcF9wb3dlcl9kaXppKHNldkJhY2ssIGR6aWQpIH07XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZSgwLCAyKSAvLyDpgInlh7rmiJjlipvmnIDpq5jnmoQy5Liq5byf5a2QXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uZHppZCk7IC8vIOWPquWPliBkemlkXG4gICAgICAgICAgICAgICAgbGV0IHhiID0gNztcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZigoeGIgKyBpKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwdXNoMyArPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh3YW5iaWFuMy5sZW5ndGggPiAwICYmIHB1c2gzIDwgMikge1xuICAgICAgICAgICAgLy/lvJ/lrZDkuI3mu6HotrMy5Liq5bCx6YGN5Y6G5LiH5Y+Y5rWBXG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSB3YW5iaWFuM1xuICAgICAgICAgICAgICAgIC5tYXAoKGR6aWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZHppZCwgcG93ZXI6IHRoaXMuZXBfcG93ZXJfZGl6aShzZXZCYWNrLCBkemlkKSB9O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIucG93ZXIgLSBhLnBvd2VyKSAvLyDmjInmiJjlipvku47lpKfliLDlsI/mjpLluo9cbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgMiAtIHB1c2gzKSAvLyDpgInlh7rmiJjlipvmnIDpq5jnmoTpnIDopoHnmoTlvJ/lrZDmlbDph49cbiAgICAgICAgICAgICAgICAubWFwKChpdGVtKSA9PiBpdGVtLmR6aWQpOyAvLyDlj6rlj5YgZHppZFxuICAgICAgICAgICAgbGV0IHhiID0gNyArIHB1c2gzO1xuICAgICAgICAgICAgbGV0IGNzID0gMiAtIHB1c2gzO1xuICAgICAgICAgICAgY3MgPSBNYXRoLm1pbihjcywgd2FuYmlhbjMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3M7IGkrKykge1xuICAgICAgICAgICAgICAgIHR1aWppYW5bKHhiICsgaSkudG9TdHJpbmcoKV0gPSBuZWVkRHppZFtpXTtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoKHhiICsgaSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V6aS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwdXNoMyArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8v5aaC5p6c6YGN5Y6G5ZCM5rS+5ZKM5LiH5Y+Y5rWB6YO95rKh5pyJ56ym5ZCI55qE5bCx5LyY5YWI5LuO5ZCM56uZ5L2N5pyA6auY5oiY5Yqb6YeM6Z2i5ou/XG4gICAgICAgIGlmIChwdXNoMSA8IDEpIHtcbiAgICAgICAgICAgIC8v6YCJ5oup55qE5rWB5rS+5ZKM5LiH5Y+Y5rWB6YO95rKh5pyJ5YmN5o6S5byf5a2Q5bCx5LuO5YW25LuW5YmN5o6S5byf5a2Q6YeM6Z2i5ou/5oiY5Yqb5pyA6auY55qEXG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBvdGhlcjFcbiAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDEpIC8vIOmAieWHuuaImOWKm+acgOmrmOeahOmcgOimgeeahOW8n+WtkOaVsOmHj1xuICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uZHppZCk7IC8vIOWPquWPliBkemlkXG4gICAgICAgICAgICBsZXQgeGIgPSAxO1xuICAgICAgICAgICAgbGV0IGNzID0gTWF0aC5taW4oMSwgb3RoZXIxLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG5cbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBnZXppLmluZGV4T2YoKHhiICsgaSkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V6aS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL+aKiueUqOaOieeahOW8n+WtkOWJlOmZpFxuICAgICAgICAgICAgICAgIGxldCBpbmRleDEgPSBvdGhlcjEuaW5kZXhPZihuZWVkRHppZFtpXSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4MSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyMS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocHVzaDIgPCAzKSB7XG4gICAgICAgICAgICAvL+mAieaLqeeahOa1gea0vuWSjOS4h+WPmOa1gemDveayoeacieWJjeaOkuW8n+WtkOWwseS7juWFtuS7luWJjeaOkuW8n+WtkOmHjOmdouaLv+aImOWKm+acgOmrmOeahFxuICAgICAgICAgICAgbGV0IG5lZWREemlkID0gb3RoZXIyXG4gICAgICAgICAgICAgICAgLm1hcCgoZHppZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkemlkLCBwb3dlcjogdGhpcy5lcF9wb3dlcl9kaXppKHNldkJhY2ssIGR6aWQpIH07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYi5wb3dlciAtIGEucG93ZXIpIC8vIOaMieaImOWKm+S7juWkp+WIsOWwj+aOkuW6j1xuICAgICAgICAgICAgICAgIC5zbGljZSgwLCAzIC0gcHVzaDIpIC8vIOmAieWHuuaImOWKm+acgOmrmOeahOmcgOimgeeahOW8n+WtkOaVsOmHj1xuICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0uZHppZCk7IC8vIOWPquWPliBkemlkXG4gICAgICAgICAgICBsZXQgeGIgPSA0ICsgcHVzaDI7XG4gICAgICAgICAgICBsZXQgY3MgPSBNYXRoLm1pbigzIC0gcHVzaDIsIG90aGVyMi5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdHVpamlhblsoeGIgKyBpKS50b1N0cmluZygpXSA9IG5lZWREemlkW2ldO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGdlemkuaW5kZXhPZigoeGIgKyBpKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBnZXppLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8v5oqK55So5o6J55qE5byf5a2Q5YmU6ZmkXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4MSA9IG90aGVyMi5pbmRleE9mKG5lZWREemlkW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXgxID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgb3RoZXIyLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwdXNoMyA8IDIpIHtcbiAgICAgICAgICAgIC8v6YCJ5oup55qE5rWB5rS+5ZKM5LiH5Y+Y5rWB6YO95rKh5pyJ5YmN5o6S5byf5a2Q5bCx5LuO5YW25LuW5YmN5o6S5byf5a2Q6YeM6Z2i5ou/5oiY5Yqb5pyA6auY55qEXG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBvdGhlcjNcbiAgICAgICAgICAgICAgICAubWFwKChkemlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGR6aWQsIHBvd2VyOiB0aGlzLmVwX3Bvd2VyX2Rpemkoc2V2QmFjaywgZHppZCkgfTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBiLnBvd2VyIC0gYS5wb3dlcikgLy8g5oyJ5oiY5Yqb5LuO5aSn5Yiw5bCP5o6S5bqPXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIDIgLSBwdXNoMykgLy8g6YCJ5Ye65oiY5Yqb5pyA6auY55qE6ZyA6KaB55qE5byf5a2Q5pWw6YePXG4gICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5kemlkKTsgLy8g5Y+q5Y+WIGR6aWRcbiAgICAgICAgICAgIGxldCB4YiA9IDcgKyBwdXNoMztcbiAgICAgICAgICAgIGxldCBjcyA9IE1hdGgubWluKDIgLSBwdXNoMywgb3RoZXIzLmxlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0dWlqaWFuWyh4YiArIGkpLnRvU3RyaW5nKCldID0gbmVlZER6aWRbaV07XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gZ2V6aS5pbmRleE9mKCh4YiArIGkpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlemkuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy/miornlKjmjonnmoTlvJ/lrZDliZTpmaRcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXgxID0gb3RoZXIzLmluZGV4T2YobmVlZER6aWRbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleDEgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICBvdGhlcjMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy/lpoLmnpzov5jmmK/kuI3otrM25Liq5byf5a2Q5bCx55u05o6l5ou/5oiY5Yqb5pyA6auY55qE5YmN5Yeg5Liq5LuO56m65L2N5byA5aeL5pS+XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyh0dWlqaWFuKS5sZW5ndGggPCA2KSB7XG4gICAgICAgICAgICAvL+aKiuWFtuS9meeahOW8n+WtkOWQiOW5tlxuICAgICAgICAgICAgbGV0IG90aGVyOiBhbnlbXSA9IHRoaXMuYWRkQXJyKG90aGVyMSwgb3RoZXIyKTtcbiAgICAgICAgICAgIG90aGVyID0gdGhpcy5hZGRBcnIob3RoZXIsIG90aGVyMyk7XG4gICAgICAgICAgICBsZXQgbmVlZER6aWQgPSBvdGhlclxuICAgICAgICAgICAgICAgIC5tYXAoKGR6aWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZHppZCwgcG93ZXI6IHRoaXMuZXBfcG93ZXJfZGl6aShzZXZCYWNrLCBkemlkKSB9O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGIucG93ZXIgLSBhLnBvd2VyKSAvLyDmjInmiJjlipvku47lpKfliLDlsI/mjpLluo9cbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgNiAtIE9iamVjdC5rZXlzKHR1aWppYW4pLmxlbmd0aCkgLy8g6YCJ5Ye65oiY5Yqb5pyA6auY55qE6ZyA6KaB55qE5byf5a2Q5pWw6YePXG4gICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS5kemlkKTsgLy8g5Y+q5Y+WIGR6aWRcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmVlZER6aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL+i/meS4quaXtuWAmeeUqOaOieeahOagvOWtkOmDveW3sue7j+WIoOaOieS6hu+8jOaJgOS7peebtOaOpeWPluWwseWPr+S7peS6hlxuICAgICAgICAgICAgICAgIHR1aWppYW5bZ2V6aVtpXV0gPSBuZWVkRHppZFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHVpamlhbjtcbiAgICB9XG5cbiAgICBnZXRTZWVkUmFuZChzZWVkOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTZWVkUmFuZChzZWVkKTtcbiAgICB9XG59XG5cbi8v6L6T5Ye6XG5leHBvcnQgbGV0IGdhbWVNZXRob2Q6IEdhbWVNZXRob2QgPSBuZXcgR2FtZU1ldGhvZCgpO1xuXG4vL+enjeWtkOmaj+aculxuZXhwb3J0IGNsYXNzIFNlZWRSYW5kIHtcbiAgICBzZWVkOiBudW1iZXI7XG4gICAgY29uc3RydWN0b3Ioc2VlZDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2VlZCA9IHNlZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5qC45b+D5pa55rOVIOi+k+WHuuS4gOS4quWwj+aVsFxuICAgICAqL1xuICAgIHJhbmRvbSgpOiBudW1iZXIge1xuICAgICAgICB0aGlzLnNlZWQgPSAodGhpcy5zZWVkICogOTMwMSArIDQ5Mjk3KSAlIDIzMzI4MDtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VlZCAvIDIzMzI4MC4wO1xuICAgIH1cbiAgICByYW5kb20yKHNlZWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHNlZWQgPSAoc2VlZCAqIDkzMDEgKyA0OTI5NykgJSAyMzMyODA7XG4gICAgICAgIHJldHVybiBzZWVkIC8gMjMzMjgwLjA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog5oyJ54Wn6IyD5Zu06I635Y+W5LiA5Liq6ZqP5py65pWwXG4gICAgICovXG4gICAgcmFuZChtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBsZXQgX3JkID0gTWF0aC5yb3VuZCgobWF4IC0gbWluICsgMSkgKiB0aGlzLnJhbmRvbSgpIC0gMC41KSArIG1pbjtcbiAgICAgICAgcmV0dXJuIF9yZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDpmo/mnLrmjpLliJfkuIDkuKrmlbDnu4RcbiAgICAgKi9cbiAgICBhcnJheVNodWZmbGUoYXJyOiBhbnlbXSkge1xuICAgICAgICBsZXQgbGVuID0gYXJyLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMucmFuZCgwLCBsZW4gLSBpIC0gMSk7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IGFycltpbmRleF07XG4gICAgICAgICAgICBhcnJbaW5kZXhdID0gYXJyW2xlbiAtIGkgLSAxXTtcbiAgICAgICAgICAgIGFycltsZW4gLSBpIC0gMV0gPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6ZqP5py66I635Y+W5pWw57uE5YWD57SgXG4gICAgICovXG4gICAgZ2V0UmFuZEFycjxUPihfYXJyOiBUW10sIG51bTogbnVtYmVyKTogVFtdIHtcbiAgICAgICAgbGV0IGFyciA9IGdhbWVNZXRob2Qub2JqQ29weShfYXJyKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgICBudW0gPSBNYXRoLm1pbihudW0sIGFyci5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bTsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcmFuID0gTWF0aC5mbG9vcih0aGlzLnJhbmRvbSgpICogKGFyci5sZW5ndGggLSBpKSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnJbcmFuXSk7XG4gICAgICAgICAgICBhcnJbcmFuXSA9IGFyclthcnIubGVuZ3RoIC0gaSAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIOmaj+acuuiOt+WPluaVsOe7hOWFg+e0oCBzZWVk44CBX2FycuOAgW51beS4jeWPmCDpmo/mnLrlh7rnmoTmlbDmja7lrozlhajkuIDoh7RcbiAgICAgKi9cbiAgICBnZXRSYW5kQXJyMjxUPihfYXJyOiBUW10sIG51bTogbnVtYmVyKSB7XG4gICAgICAgIGxldCBhcnI6IFRbXSA9IGdhbWVNZXRob2Qub2JqQ29weShfYXJyKTtcbiAgICAgICAgbGV0IHJlc3VsdDogVFtdID0gW107XG4gICAgICAgIG51bSA9IE1hdGgubWluKG51bSwgYXJyLmxlbmd0aCk7XG4gICAgICAgIGxldCBzZWVkID0gdGhpcy5yYW5kb20yKHRoaXMuc2VlZCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICAgICAgICAgIHNlZWQgPSB0aGlzLnJhbmRvbTIoc2VlZCk7XG4gICAgICAgICAgICBsZXQgcmFuID0gTWF0aC5mbG9vcihzZWVkICogYXJyLmxlbmd0aCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChhcnJbcmFuXSk7XG4gICAgICAgICAgICBhcnIuc3BsaWNlKHJhbiwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiByZXN1bHQsIGFycjogYXJyIH07XG4gICAgfVxufVxuIl19