PlatformHaiTuoH5.js 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/plat/PlatformHaiTuoH5.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, '41220ca5RFCxL2IQ5Qfron9', 'PlatformHaiTuoH5');
  13. // script/plat/PlatformHaiTuoH5.ts
  14. "use strict";
  15. var __extends = (this && this.__extends) || (function () {
  16. var extendStatics = function (d, b) {
  17. extendStatics = Object.setPrototypeOf ||
  18. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  19. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  20. return extendStatics(d, b);
  21. };
  22. return function (d, b) {
  23. extendStatics(d, b);
  24. function __() { this.constructor = d; }
  25. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  26. };
  27. })();
  28. Object.defineProperty(exports, "__esModule", { value: true });
  29. var gameCfg_1 = require("../common/gameCfg");
  30. var gameMethod_1 = require("../common/gameMethod");
  31. var Xyc_1 = require("../common/Xyc");
  32. var Config_1 = require("../Config");
  33. var EventConst_1 = require("../data/const/EventConst");
  34. var TypeConst_1 = require("../data/const/TypeConst");
  35. var GameDataCenter_1 = require("../data/GameDataCenter");
  36. var GameController_1 = require("../GameController");
  37. var UIHelp_1 = require("../logic/ui/UIHelp");
  38. var EventMng_1 = require("../manager/EventMng");
  39. var PlatformBase_1 = require("./PlatformBase");
  40. var PlatformHaiTuoH5 = /** @class */ (function (_super) {
  41. __extends(PlatformHaiTuoH5, _super);
  42. function PlatformHaiTuoH5() {
  43. var _this = _super.call(this) || this;
  44. cc.game.on(cc.game.EVENT_SHOW, function () {
  45. if (_this.isGoPay) {
  46. _this.isGoPay = false;
  47. if (Config_1.default.paySuccAdokId != null) {
  48. clearInterval(Config_1.default.paySuccAdokId);
  49. Config_1.default.paySuccAdokId = null;
  50. }
  51. Config_1.default.paySuccAdokIndex = 0;
  52. Config_1.default.paySuccAdokId = setInterval(function () {
  53. Config_1.default.paySuccAdokIndex++;
  54. if (Config_1.default.paySuccAdokIndex >= 5) {
  55. clearInterval(Config_1.default.paySuccAdokId);
  56. Config_1.default.paySuccAdokId = null;
  57. }
  58. GameDataCenter_1.default.time.sendAdok();
  59. }, 1000);
  60. }
  61. });
  62. window['DHMiniH5SDK'].setSwitchAccountNotification(function (callbackData) {
  63. console.log("SwitchAccount data=>", JSON.stringify(callbackData));
  64. window['DHMiniH5SDK'].logout(function () {
  65. });
  66. });
  67. window['DHMiniH5SDK'].setLogoutNotification(function () {
  68. GameDataCenter_1.default.sevBack = null;
  69. Config_1.default.inGame = TypeConst_1.InGame.no;
  70. // this.restart()
  71. cc.game.restart();
  72. });
  73. //防沉迷
  74. if (window['DHMiniH5SDK'].isDhApp) {
  75. console.log("注册防沉迷强制下线监听");
  76. window['DHMiniH5SDK'].gamePreventAddiction(function (reponse) {
  77. // 在被强制下线后的回调函数中,理论上游戏应按如下步骤执行相关操作:
  78. // 第一步,清除当前登录的账号角色等信息
  79. // 第二步,重回游戏起始页
  80. // 第三步,再次调用 sdk.login 接口以拉起登录窗口
  81. console.log("触发防沉迷强制下线,游戏重启");
  82. var cb = function () {
  83. GameDataCenter_1.default.sevBack = null;
  84. Config_1.default.inGame = TypeConst_1.InGame.no;
  85. // this.restart()
  86. cc.game.restart();
  87. };
  88. UIHelp_1.default.ShowDialog({
  89. content: "根据国家新闻出版署 《关于防止未成年人沉迷网络游戏的通知》、《关于进一步严格管理切实防止未成年人沉迷网络游戏的通知》的要求,您已超出今日健康体验时限,游戏将强制退出。",
  90. title: "防沉迷调整通知",
  91. txtConfirm: "我知道了",
  92. onlyConfirm: true,
  93. cbConfirm: cb
  94. });
  95. });
  96. }
  97. return _this;
  98. }
  99. PlatformHaiTuoH5.prototype.showLoginView = function () {
  100. var _this = this;
  101. console.log("MiniH5初始化&登录SDK");
  102. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.25, "login");
  103. var packageInfo = gameCfg_1.default.packageInfo.getItem(Config_1.default.pid);
  104. var productCode = packageInfo.params[0]; //QuickSDK后台自动分配
  105. var productKey = packageInfo.params[1]; //QuickSDK后台自动分配
  106. try {
  107. window['DHMiniH5SDK'].login(function (result) {
  108. console.log("login data=", JSON.stringify(result));
  109. // EventMng.emit(LoadEvent.LOAD_MESSAGE, JSON.stringify(result))
  110. if (result.code == 0) {
  111. var data = result.data;
  112. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 0.75, "login");
  113. var params_1 = {
  114. pid: Config_1.default.pid,
  115. param: [data.accountId, data.loginType, data.token]
  116. };
  117. setTimeout(function () {
  118. //电魂sdk漏斗打点
  119. if (window['DHMiniH5SDK']) {
  120. window['DHMiniH5SDK'].analytics.log({
  121. eventId: "420000::GAME_CLIENT_LOGIN_START",
  122. subEventId: "0",
  123. logLevel: "d",
  124. logContent: "游戏客户端开始请求登录游戏服",
  125. accountId: window['DHMiniH5SDK'].userInfo.accountId
  126. }, function (params) {
  127. console.log(params);
  128. });
  129. }
  130. GameController_1.default.network.send(Xyc_1.PlayerLogin.url, params_1, function (result) {
  131. console.log("后段验证返回");
  132. if (result.type != 1) {
  133. if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
  134. GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
  135. }
  136. return;
  137. }
  138. EventMng_1.default.emit(EventConst_1.LoadEvent.LOAD_PROGRESS, 1, "login");
  139. if (result.type == 1 && result.platBack) {
  140. _this.openId = result.platBack.openid;
  141. _this.loginParams = [result.platBack.token];
  142. console.log("后端验证成功", _this.openId);
  143. _this.login();
  144. //电魂sdk漏斗打点
  145. if (window['DHMiniH5SDK']) {
  146. window['DHMiniH5SDK'].analytics.log({
  147. eventId: "450000::GAME_CLIENT_LOGIN_SUCCESS",
  148. subEventId: "0",
  149. logLevel: "d",
  150. logContent: "游戏客户端登录成功",
  151. accountId: window['DHMiniH5SDK'].userInfo.accountId
  152. }, function (params) {
  153. console.log(params);
  154. });
  155. }
  156. }
  157. else {
  158. console.log("PlayerLogin.url 返回数据异常");
  159. if (gameMethod_1.gameMethod.isEmpty(result.win) || gameMethod_1.gameMethod.isEmpty(result.win.msgOut)) {
  160. GameDataCenter_1.default.plat.showErrDialog(TypeConst_1.GameErrCode.errGamePlatLogin);
  161. }
  162. }
  163. });
  164. }, 1000);
  165. }
  166. else {
  167. UIHelp_1.default.ShowTips("登录失败");
  168. // GameDataCenter.plat.instance.restart()
  169. }
  170. });
  171. }
  172. catch (error) {
  173. UIHelp_1.default.ShowTips("----" + error);
  174. // UIHelp.ShowDialog({ content: error })
  175. }
  176. };
  177. PlatformHaiTuoH5.prototype.pay = function (orderId, order10cs, param) {
  178. var _this = this;
  179. var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
  180. this.isGoPay = true;
  181. var serverList = GameDataCenter_1.default.user.serverList;
  182. var serverName = (_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.sid;
  183. for (var _i = 0, serverList_1 = serverList; _i < serverList_1.length; _i++) {
  184. var iterator = serverList_1[_i];
  185. if (iterator.sid == ((_d = (_c = GameDataCenter_1.default.sevBack.userInfo) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.sid)) {
  186. serverName = iterator.name;
  187. break;
  188. }
  189. }
  190. var payData = {
  191. serverId: parseInt((_f = (_e = GameDataCenter_1.default.sevBack.userInfo) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f.sid),
  192. serverName: serverName,
  193. roleId: parseInt((_h = (_g = GameDataCenter_1.default.sevBack.userInfo) === null || _g === void 0 ? void 0 : _g.a) === null || _h === void 0 ? void 0 : _h.uuid),
  194. roleName: (_k = (_j = GameDataCenter_1.default.sevBack.userInfo) === null || _j === void 0 ? void 0 : _j.a) === null || _k === void 0 ? void 0 : _k.name,
  195. roleLevel: (_m = (_l = GameDataCenter_1.default.sevBack.userInfo) === null || _l === void 0 ? void 0 : _l.a) === null || _m === void 0 ? void 0 : _m.level,
  196. productId: param.productId,
  197. productName: param.productName,
  198. productNum: 1,
  199. price: param.price * 100,
  200. currencyType: "CNY",
  201. cpOrderId: orderId,
  202. areaId: Config_1.default.pid,
  203. areaName: Config_1.default.pid,
  204. memo: orderId
  205. };
  206. console.log("拉取支付的参数:", JSON.stringify(payData));
  207. window['DHMiniH5SDK'].payment(payData, function (response) {
  208. var _a, _b;
  209. if (response.code == 0) { // 支付成功
  210. window['DHMiniH5SDK'].analytics.pay({
  211. accountId: window['DHMiniH5SDK'].userInfo.accountId,
  212. roleId: window['DHMiniH5SDK'].userInfo.accountId,
  213. roleLevel: (_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.level,
  214. orderId: orderId,
  215. itemId: param.productId,
  216. payAmount: param.price
  217. }, function (params) {
  218. console.log(params);
  219. });
  220. //电魂sdk漏斗打点
  221. if (window['DHMiniH5SDK']) {
  222. window['DHMiniH5SDK'].analytics.log({
  223. eventId: "510000::GAME_CLIENT_PAY_SUCCESS",
  224. subEventId: "0",
  225. logLevel: "d",
  226. logContent: "发放支付道具至玩家",
  227. accountId: window['DHMiniH5SDK'].userInfo.accountId
  228. }, function (params) {
  229. console.log(params);
  230. });
  231. }
  232. _this.isGoPay = false;
  233. if (Config_1.default.paySuccAdokId != null) {
  234. clearInterval(Config_1.default.paySuccAdokId);
  235. Config_1.default.paySuccAdokId = null;
  236. }
  237. Config_1.default.paySuccAdokIndex = 0;
  238. Config_1.default.paySuccAdokId = setInterval(function () {
  239. Config_1.default.paySuccAdokIndex++;
  240. if (Config_1.default.paySuccAdokIndex >= 5) {
  241. clearInterval(Config_1.default.paySuccAdokId);
  242. Config_1.default.paySuccAdokId = null;
  243. }
  244. GameDataCenter_1.default.time.sendAdok();
  245. }, 1000);
  246. }
  247. else { // 其他,支付失败
  248. }
  249. });
  250. };
  251. // 上报角色数据
  252. PlatformHaiTuoH5.prototype.reportRole = function (event) {
  253. var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
  254. // • 初始化成功后调⽤. • 进⼊区服、创⻆、⻆⾊等级更新、战⼒更新时调⽤.
  255. if (GameDataCenter_1.default.sevBack == null) {
  256. return;
  257. }
  258. if (GameDataCenter_1.default.sevBack.userInfo == null) {
  259. return;
  260. }
  261. console.log("上报角色数据:", event);
  262. var onlineTime = 0;
  263. if (GameDataCenter_1.default.time.onlineTime > 0) {
  264. onlineTime = GameDataCenter_1.default.time.sevTime - GameDataCenter_1.default.time.onlineTime;
  265. }
  266. var isCreateRole = false;
  267. var level = (_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.level;
  268. var type = "";
  269. switch (event) {
  270. case TypeConst_1.ReportRoleType.create:
  271. isCreateRole = true;
  272. type = "CREATE_ROLE";
  273. //电魂sdk漏斗打点
  274. if (window['DHMiniH5SDK']) {
  275. window['DHMiniH5SDK'].analytics.log({
  276. eventId: "450001::GAME_CLIENT_CREATING_A_ROLE",
  277. subEventId: "0",
  278. logLevel: "d",
  279. logContent: "游戏客户端创角成功",
  280. accountId: window['DHMiniH5SDK'].userInfo.accountId
  281. }, function (params) {
  282. console.log(params);
  283. });
  284. }
  285. // window['DHMiniH5SDK'].analytics.register({accountId: window['DHMiniH5SDK'].userInfo.accountId}, params => {
  286. // console.log(params);
  287. // });
  288. break;
  289. case TypeConst_1.ReportRoleType.levelup:
  290. type = "LEVEL_UP";
  291. level++;
  292. break;
  293. case TypeConst_1.ReportRoleType.offline:
  294. break;
  295. case TypeConst_1.ReportRoleType.online:
  296. type = "LOGIN_GAME";
  297. break;
  298. case TypeConst_1.ReportRoleType.other:
  299. break;
  300. default:
  301. break;
  302. }
  303. var power = 1;
  304. if (gameMethod_1.gameMethod.isEmpty(GameDataCenter_1.default.sevBack)) {
  305. power = 1;
  306. }
  307. else {
  308. var eps = gameMethod_1.gameMethod.ep_all(GameDataCenter_1.default.sevBack);
  309. var power1 = gameMethod_1.gameMethod.ep_power(0, eps);
  310. power = power1;
  311. }
  312. var serverName = GameDataCenter_1.default.user.getServerNameBySid((_d = (_c = GameDataCenter_1.default.sevBack.userInfo) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.sid) || ((_f = (_e = GameDataCenter_1.default.sevBack.userInfo) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f.sid);
  313. var roleInfo = {
  314. type: type,
  315. isCreateRole: isCreateRole,
  316. roleCreateTime: (_h = (_g = GameDataCenter_1.default.sevBack.userInfo) === null || _g === void 0 ? void 0 : _g.a) === null || _h === void 0 ? void 0 : _h.regtime,
  317. uid: GameDataCenter_1.default.plat.instance.openId,
  318. username: (_k = (_j = GameDataCenter_1.default.sevBack.userInfo) === null || _j === void 0 ? void 0 : _j.a) === null || _k === void 0 ? void 0 : _k.name,
  319. serverId: (_m = (_l = GameDataCenter_1.default.sevBack.userInfo) === null || _l === void 0 ? void 0 : _l.a) === null || _m === void 0 ? void 0 : _m.sid,
  320. serverName: serverName,
  321. userRoleName: (_p = (_o = GameDataCenter_1.default.sevBack.userInfo) === null || _o === void 0 ? void 0 : _o.a) === null || _p === void 0 ? void 0 : _p.name,
  322. userRoleId: (_r = (_q = GameDataCenter_1.default.sevBack.userInfo) === null || _q === void 0 ? void 0 : _q.a) === null || _r === void 0 ? void 0 : _r.uuid,
  323. userRoleBalance: 0,
  324. vipLevel: 1,
  325. userRoleLevel: level,
  326. gameRolePower: power,
  327. partyId: 0,
  328. partyName: '无',
  329. };
  330. var roleInfoJson = JSON.stringify(roleInfo);
  331. window['DHMiniH5SDK'].analytics.uploadRoleInfo({
  332. type: type,
  333. isCreateRole: isCreateRole,
  334. roleCreateTime: (_t = (_s = GameDataCenter_1.default.sevBack.userInfo) === null || _s === void 0 ? void 0 : _s.a) === null || _t === void 0 ? void 0 : _t.regtime,
  335. serverId: parseInt((_v = (_u = GameDataCenter_1.default.sevBack.userInfo) === null || _u === void 0 ? void 0 : _u.a) === null || _v === void 0 ? void 0 : _v.sid),
  336. serverName: serverName,
  337. roleId: parseInt((_x = (_w = GameDataCenter_1.default.sevBack.userInfo) === null || _w === void 0 ? void 0 : _w.a) === null || _x === void 0 ? void 0 : _x.uuid),
  338. roleName: (_z = (_y = GameDataCenter_1.default.sevBack.userInfo) === null || _y === void 0 ? void 0 : _y.a) === null || _z === void 0 ? void 0 : _z.name,
  339. roleLevel: level,
  340. roleBalance: 0,
  341. vipLevel: 1,
  342. partyId: 0,
  343. partyName: '无',
  344. rolePower: power,
  345. partyRoleId: 1,
  346. }, function (response) {
  347. console.log(response);
  348. });
  349. };
  350. PlatformHaiTuoH5.prototype.openService = function () {
  351. var _a, _b, _c, _d, _e, _f;
  352. if (window['DHMiniH5SDK'].isDhApp) {
  353. window['DHMiniH5SDK'].service({
  354. roleId: parseInt((_b = (_a = GameDataCenter_1.default.sevBack.userInfo) === null || _a === void 0 ? void 0 : _a.a) === null || _b === void 0 ? void 0 : _b.uuid),
  355. nickname: (_d = (_c = GameDataCenter_1.default.sevBack.userInfo) === null || _c === void 0 ? void 0 : _c.a) === null || _d === void 0 ? void 0 : _d.name,
  356. level: (_f = (_e = GameDataCenter_1.default.sevBack.userInfo) === null || _e === void 0 ? void 0 : _e.a) === null || _f === void 0 ? void 0 : _f.level
  357. });
  358. }
  359. };
  360. PlatformHaiTuoH5.prototype.checkMsg = function (str, cb) {
  361. cb();
  362. };
  363. return PlatformHaiTuoH5;
  364. }(PlatformBase_1.default));
  365. exports.default = PlatformHaiTuoH5;
  366. cc._RF.pop();
  367. }
  368. if (nodeEnv) {
  369. __define(__module.exports, __require, __module);
  370. }
  371. else {
  372. __quick_compile_project__.registerModuleFunc(__filename, function () {
  373. __define(__module.exports, __require, __module);
  374. });
  375. }
  376. })();
  377. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvcGxhdC9QbGF0Zm9ybUhhaVR1b0g1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlDQSw2Q0FBd0M7QUFDeEMsbURBQWtEO0FBQ2xELHFDQUE2RDtBQUU3RCxvQ0FBK0I7QUFDL0IsdURBQXFEO0FBQ3JELHFEQUErRjtBQUMvRix5REFBb0Q7QUFDcEQsb0RBQStDO0FBQy9DLDZDQUF3QztBQUN4QyxnREFBMkM7QUFDM0MsK0NBQTBDO0FBRTFDO0lBQThDLG9DQUFZO0lBR3REO1FBQUEsWUFDSSxpQkFBTyxTQXVEVjtRQXRERyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMzQixJQUFJLEtBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2QsS0FBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0JBQ3BCLElBQUksZ0JBQU0sQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFO29CQUM5QixhQUFhLENBQUMsZ0JBQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtvQkFDbkMsZ0JBQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO2lCQUM5QjtnQkFDRCxnQkFBTSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtnQkFDM0IsZ0JBQU0sQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDO29CQUMvQixnQkFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUE7b0JBQ3pCLElBQUksZ0JBQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLEVBQUU7d0JBQzlCLGFBQWEsQ0FBQyxnQkFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBO3dCQUNuQyxnQkFBTSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUE7cUJBQzlCO29CQUNELHdCQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO2dCQUNsQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7YUFDWDtRQUNM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QyxPQUFPLENBQUMsUUFBUSwwQ0FBRSxDQUFDLDBDQUFFLElBQUk7WUFDbEQsU0FBUyxFQUFFLEtBQUs7WUFDaEIsV0FBVyxFQUFFLENBQUM7WUFDZCxRQUFRLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxDQUFDO1lBQ1YsU0FBUyxFQUFFLEdBQUc7WUFDZCxTQUFTLEVBQUUsS0FBSztZQUNoQixXQUFXLEVBQUUsQ0FBQztTQUNqQixFQUFFLFVBQUMsUUFBUTtZQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0Qsc0NBQVcsR0FBWDs7UUFDSSxJQUFJLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDL0IsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQztnQkFDMUIsTUFBTSxFQUFFLFFBQVEsYUFBQyx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLDBDQUFFLENBQUMsMENBQUUsSUFBSSxDQUFDO2dCQUMxRCxRQUFRLGNBQUUsd0JBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSwwQ0FBRSxDQUFDLDBDQUFFLElBQUk7Z0JBQ2xELEtBQUssY0FBRSx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxRQUFRLDBDQUFFLENBQUMsMENBQUUsS0FBSzthQUNuRCxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFDRCxtQ0FBUSxHQUFSLFVBQVMsR0FBVyxFQUFFLEVBQVk7UUFDOUIsRUFBRSxFQUFFLENBQUE7SUFDUixDQUFDO0lBQ0wsdUJBQUM7QUFBRCxDQTNUQSxBQTJUQyxDQTNUNkMsc0JBQVksR0EyVHpEIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBoYWl0dW9oNeeJiOacrCBzZGvphY3nva5cbiAqIFxuXG7lvq7kv6HlhoXot7PovazlhaXlj6PmmK9cblxu5ZyobWFpbi5qc+eahOacgOS4iumdolxud2luZG93Ll9femVyb19fID0ge1xuICAgIFwicGFja2FnZUlEXCI6IFwiMTAxXCIsXG59XG7lnKhvblN0YXJ05Yid5aeL5YyWc2RrXG5cbuW8leWFpVNESzrlnKhodG1s5Lit5re75Yqg5LiA5Liqc2NyaXB05qCH562+5bCx5Y+v5Lul5LqGXG4gICAgPCEtLSAvLyBINeW8leWFpeaWueiIn1NESyAtLT5cbiAgICA8c2NyaXB0IHR5cGU9XCJ0ZXh0L2phdmFzY3JpcHRcIiBzcmM9XCJodGtTZGtfeHh4eHguanNcIj48L3NjcmlwdD5cbiAgICA8c2NyaXB0ID5cbiAgICAgICAgaGl0YWxrT3BlblNESy5pbml0KGZ1bmN0aW9uKHJlcyl7Ly/liJ3lp4vljJZzZGtcbiAgICAgICAgICAgIGlmKHJlcy5yZXRDb2RlIT0wKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliJ3lp4vljJblpLHotKVcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgY29uc29sZS5sb2coXCLliJ3lp4vljJbmiJDlip9cIilcbiAgICAgICAgICAgIC8v6LCD55So55m75b2V5o6l5Y+jXG4gICAgICAgIH0se2dhbWVJZDozMTl9KTsgIC8v5ZCR5rW35ouT55Sz6K+36I635b6XXG4gICAgPC9zY3JpcHQ+XG4gICAgPCEtLSDlvIDlkK92Q29uc29sZSAtLT5cbiAgICA8IS0tIDxzY3JpcHQgc3JjPVwiaHR0cHM6Ly91bnBrZy5jb20vdmNvbnNvbGVAbGF0ZXN0L2Rpc3QvdmNvbnNvbGUubWluLmpzXCI+PC9zY3JpcHQ+XG4gICAgPHNjcmlwdD5cbiAgICAvLyBWQ29uc29sZSDpu5jorqTkvJrmjILovb3liLAgYHdpbmRvdy5WQ29uc29sZWAg5LiKXG4gICAgdmFyIHZDb25zb2xlID0gbmV3IHdpbmRvdy5WQ29uc29sZSgpO1xuICAgIDwvc2NyaXB0PiAtLT5cbiAqL1xuaW1wb3J0IE1pbnQgZnJvbSBcIi4uL3V0aWxzL21pbnRGaWx0ZXIvaW5kZXhcIjtcbmltcG9ydCBHYW1lY2ZnIGZyb20gXCIuLi9jb21tb24vZ2FtZUNmZ1wiO1xuaW1wb3J0IHsgZ2FtZU1ldGhvZCB9IGZyb20gXCIuLi9jb21tb24vZ2FtZU1ldGhvZFwiO1xuaW1wb3J0IHsgUGxheWVyTG9naW4sIFBsYXllckxvZ2luUHJhbSB9IGZyb20gXCIuLi9jb21tb24vWHljXCI7XG5pbXBvcnQgeyBTZXZCYWNrIH0gZnJvbSBcIi4uL2NvbW1vbi9YeXNcIjtcbmltcG9ydCBDb25maWcgZnJvbSBcIi4uL0NvbmZpZ1wiO1xuaW1wb3J0IHsgTG9hZEV2ZW50IH0gZnJvbSBcIi4uL2RhdGEvY29uc3QvRXZlbnRDb25zdFwiO1xuaW1wb3J0IHsgR2FtZUVyckNvZGUsIEluR2FtZSwgUGF5UHJvZHVjdFBhcmFtLCBSZXBvcnRSb2xlVHlwZSB9IGZyb20gXCIuLi9kYXRhL2NvbnN0L1R5cGVDb25zdFwiO1xuaW1wb3J0IEdhbWVEYXRhQ2VudGVyIGZyb20gXCIuLi9kYXRhL0dhbWVEYXRhQ2VudGVyXCI7XG5pbXBvcnQgR2FtZUNvbnRyb2xsZXIgZnJvbSBcIi4uL0dhbWVDb250cm9sbGVyXCI7XG5pbXBvcnQgVUlIZWxwIGZyb20gXCIuLi9sb2dpYy91aS9VSUhlbHBcIjtcbmltcG9ydCBFdmVudE1uZyBmcm9tIFwiLi4vbWFuYWdlci9FdmVudE1uZ1wiO1xuaW1wb3J0IFBsYXRmb3JtQmFzZSBmcm9tIFwiLi9QbGF0Zm9ybUJhc2VcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGxhdGZvcm1IYWlUdW9INSBleHRlbmRzIFBsYXRmb3JtQmFzZSB7XG4gICAgaXNHb1BheTogYm9vbGVhblxuICAgIG1pbnQ6IE1pbnQ7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgY2MuZ2FtZS5vbihjYy5nYW1lLkVWRU5UX1NIT1csICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzR29QYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzR29QYXkgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGlmIChDb25maWcucGF5U3VjY0Fkb2tJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJbmRleCA9IDBcbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXgrK1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPj0gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChDb25maWcucGF5U3VjY0Fkb2tJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnRpbWUuc2VuZEFkb2soKVxuICAgICAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5zZXRTd2l0Y2hBY2NvdW50Tm90aWZpY2F0aW9uKGZ1bmN0aW9uIChjYWxsYmFja0RhdGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU3dpdGNoQWNjb3VudCBkYXRhPT5cIiwgSlNPTi5zdHJpbmdpZnkoY2FsbGJhY2tEYXRhKSlcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5sb2dvdXQoKCkgPT4ge1xuXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLnNldExvZ291dE5vdGlmaWNhdGlvbigoKSA9PiB7XG4gICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5zZXZCYWNrID0gbnVsbFxuICAgICAgICAgICAgQ29uZmlnLmluR2FtZSA9IEluR2FtZS5ub1xuICAgICAgICAgICAgLy8gdGhpcy5yZXN0YXJ0KClcbiAgICAgICAgICAgIGNjLmdhbWUucmVzdGFydCgpXG4gICAgICAgIH0pXG4gICAgICAgIC8v6Ziy5rKJ6L+3XG4gICAgICAgIGlmICh3aW5kb3dbJ0RITWluaUg1U0RLJ10uaXNEaEFwcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLms6jlhozpmLLmsonov7flvLrliLbkuIvnur/nm5HlkKxcIilcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5nYW1lUHJldmVudEFkZGljdGlvbigocmVwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIOWcqOiiq+W8uuWItuS4i+e6v+WQjueahOWbnuiwg+WHveaVsOS4re+8jOeQhuiuuuS4iua4uOaIj+W6lOaMieWmguS4i+atpemqpOaJp+ihjOebuOWFs+aTjeS9nO+8mlxuICAgICAgICAgICAgICAgIC8vIOesrOS4gOatpe+8jOa4hemZpOW9k+WJjeeZu+W9leeahOi0puWPt+inkuiJsuetieS/oeaBr1xuICAgICAgICAgICAgICAgIC8vIOesrOS6jOatpe+8jOmHjeWbnua4uOaIj+i1t+Wni+mhtVxuICAgICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8jOWGjeasoeiwg+eUqCBzZGsubG9naW4g5o6l5Y+j5Lul5ouJ6LW355m75b2V56qX5Y+jXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLop6blj5HpmLLmsonov7flvLrliLbkuIvnur/vvIzmuLjmiI/ph43lkK9cIilcbiAgICAgICAgICAgICAgICBsZXQgY2IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnNldkJhY2sgPSBudWxsXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5pbkdhbWUgPSBJbkdhbWUubm9cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5yZXN0YXJ0KClcbiAgICAgICAgICAgICAgICAgICAgY2MuZ2FtZS5yZXN0YXJ0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgVUlIZWxwLlNob3dEaWFsb2coe1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcIuagueaNruWbveWutuaWsOmXu+WHuueJiOe9siDjgIrlhbPkuo7pmLLmraLmnKrmiJDlubTkurrmsonov7fnvZHnu5zmuLjmiI/nmoTpgJrnn6XjgIvjgIHjgIrlhbPkuo7ov5vkuIDmraXkuKXmoLznrqHnkIbliIflrp7pmLLmraLmnKrmiJDlubTkurrmsonov7fnvZHnu5zmuLjmiI/nmoTpgJrnn6XjgIvnmoTopoHmsYLvvIzmgqjlt7LotoXlh7rku4rml6XlgaXlurfkvZPpqozml7bpmZDvvIzmuLjmiI/lsIblvLrliLbpgIDlh7rjgIJcIixcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwi6Ziy5rKJ6L+36LCD5pW06YCa55+lXCIsXG4gICAgICAgICAgICAgICAgICAgIHR4dENvbmZpcm06IFwi5oiR55+l6YGT5LqGXCIsXG4gICAgICAgICAgICAgICAgICAgIG9ubHlDb25maXJtOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjYkNvbmZpcm06IGNiXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNob3dMb2dpblZpZXcoKTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTWluaUg15Yid5aeL5YyWJueZu+W9lVNES1wiKVxuICAgICAgICBFdmVudE1uZy5lbWl0KExvYWRFdmVudC5MT0FEX1BST0dSRVNTLCAwLjI1LCBcImxvZ2luXCIpXG4gICAgICAgIGxldCBwYWNrYWdlSW5mbyA9IEdhbWVjZmcucGFja2FnZUluZm8uZ2V0SXRlbShDb25maWcucGlkKVxuICAgICAgICB2YXIgcHJvZHVjdENvZGUgPSBwYWNrYWdlSW5mby5wYXJhbXNbMF07ICAgICAgICAvL1F1aWNrU0RL5ZCO5Y+w6Ieq5Yqo5YiG6YWNIFxuICAgICAgICB2YXIgcHJvZHVjdEtleSA9IHBhY2thZ2VJbmZvLnBhcmFtc1sxXTsgICAgICAgIC8vUXVpY2tTREvlkI7lj7Doh6rliqjliIbphY1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5sb2dpbigocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcImxvZ2luIGRhdGE9XCIsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgICAgICAgICAgLy8gRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9NRVNTQUdFLCBKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY29kZSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gcmVzdWx0LmRhdGFcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9QUk9HUkVTUywgMC43NSwgXCJsb2dpblwiKVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zOiBQbGF5ZXJMb2dpblByYW0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwaWQ6IENvbmZpZy5waWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbTogW2RhdGEuYWNjb3VudElkLCBkYXRhLmxvZ2luVHlwZSwgZGF0YS50b2tlbl1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8v55S16a2Cc2Rr5ryP5paX5omT54K5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93WydESE1pbmlINVNESyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLmFuYWx5dGljcy5sb2coe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBcIjQyMDAwMDo6R0FNRV9DTElFTlRfTE9HSU5fU1RBUlRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRXZlbnRJZDogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nQ29udGVudDogXCLmuLjmiI/lrqLmiLfnq6/lvIDlp4vor7fmsYLnmbvlvZXmuLjmiI/mnI1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiB3aW5kb3dbJ0RITWluaUg1U0RLJ10udXNlckluZm8uYWNjb3VudElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEdhbWVDb250cm9sbGVyLm5ldHdvcmsuc2VuZChQbGF5ZXJMb2dpbi51cmwsIHBhcmFtcywgKHJlc3VsdDogU2V2QmFjaykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO5q616aqM6K+B6L+U5ZueXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlICE9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luKSB8fCBnYW1lTWV0aG9kLmlzRW1wdHkocmVzdWx0Lndpbi5tc2dPdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYW1lRGF0YUNlbnRlci5wbGF0LnNob3dFcnJEaWFsb2coR2FtZUVyckNvZGUuZXJyR2FtZVBsYXRMb2dpbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRNbmcuZW1pdChMb2FkRXZlbnQuTE9BRF9QUk9HUkVTUywgMSwgXCJsb2dpblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudHlwZSA9PSAxICYmIHJlc3VsdC5wbGF0QmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5JZCA9IHJlc3VsdC5wbGF0QmFjay5vcGVuaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dpblBhcmFtcyA9IFtyZXN1bHQucGxhdEJhY2sudG9rZW5dXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5ZCO56uv6aqM6K+B5oiQ5YqfXCIsIHRoaXMub3BlbklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2luKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/nlLXprYJzZGvmvI/mlpfmiZPngrlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvd1snREhNaW5pSDVTREsnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLmFuYWx5dGljcy5sb2coe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50SWQ6IFwiNDUwMDAwOjpHQU1FX0NMSUVOVF9MT0dJTl9TVUNDRVNTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRXZlbnRJZDogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nTGV2ZWw6IFwiZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvbnRlbnQ6IFwi5ri45oiP5a6i5oi356uv55m75b2V5oiQ5YqfXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiB3aW5kb3dbJ0RITWluaUg1U0RLJ10udXNlckluZm8uYWNjb3VudElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUGxheWVyTG9naW4udXJsIOi/lOWbnuaVsOaNruW8guW4uFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2FtZU1ldGhvZC5pc0VtcHR5KHJlc3VsdC53aW4pIHx8IGdhbWVNZXRob2QuaXNFbXB0eShyZXN1bHQud2luLm1zZ091dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnBsYXQuc2hvd0VyckRpYWxvZyhHYW1lRXJyQ29kZS5lcnJHYW1lUGxhdExvZ2luKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBVSUhlbHAuU2hvd1RpcHMoXCLnmbvlvZXlpLHotKVcIilcbiAgICAgICAgICAgICAgICAgICAgLy8gR2FtZURhdGFDZW50ZXIucGxhdC5pbnN0YW5jZS5yZXN0YXJ0KClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgVUlIZWxwLlNob3dUaXBzKFwiLS0tLVwiICsgZXJyb3IpXG4gICAgICAgICAgICAvLyBVSUhlbHAuU2hvd0RpYWxvZyh7IGNvbnRlbnQ6IGVycm9yIH0pXG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHBheShvcmRlcklkOiBzdHJpbmcsIG9yZGVyMTBjczogc3RyaW5nLCBwYXJhbTogUGF5UHJvZHVjdFBhcmFtKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNHb1BheSA9IHRydWVcbiAgICAgICAgbGV0IHNlcnZlckxpc3QgPSBHYW1lRGF0YUNlbnRlci51c2VyLnNlcnZlckxpc3RcbiAgICAgICAgbGV0IHNlcnZlck5hbWUgPSBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5zaWRcbiAgICAgICAgZm9yIChjb25zdCBpdGVyYXRvciBvZiBzZXJ2ZXJMaXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlcmF0b3Iuc2lkID09IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnNpZCkge1xuICAgICAgICAgICAgICAgIHNlcnZlck5hbWUgPSBpdGVyYXRvci5uYW1lXG4gICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGF5RGF0YSA9IHtcbiAgICAgICAgICAgIHNlcnZlcklkOiBwYXJzZUludChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5zaWQpLFxuICAgICAgICAgICAgc2VydmVyTmFtZTogc2VydmVyTmFtZSxcbiAgICAgICAgICAgIHJvbGVJZDogcGFyc2VJbnQoR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8udXVpZCksXG4gICAgICAgICAgICByb2xlTmFtZTogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubmFtZSxcbiAgICAgICAgICAgIHJvbGVMZXZlbDogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubGV2ZWwsXG4gICAgICAgICAgICBwcm9kdWN0SWQ6IHBhcmFtLnByb2R1Y3RJZCxcbiAgICAgICAgICAgIHByb2R1Y3ROYW1lOiBwYXJhbS5wcm9kdWN0TmFtZSxcbiAgICAgICAgICAgIHByb2R1Y3ROdW06IDEsXG4gICAgICAgICAgICBwcmljZTogcGFyYW0ucHJpY2UgKiAxMDAsXG4gICAgICAgICAgICBjdXJyZW5jeVR5cGU6IFwiQ05ZXCIsXG4gICAgICAgICAgICBjcE9yZGVySWQ6IG9yZGVySWQsXG4gICAgICAgICAgICBhcmVhSWQ6IENvbmZpZy5waWQsXG4gICAgICAgICAgICBhcmVhTmFtZTogQ29uZmlnLnBpZCxcbiAgICAgICAgICAgIG1lbW86IG9yZGVySWRcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhcIuaLieWPluaUr+S7mOeahOWPguaVsO+8mlwiLCBKU09OLnN0cmluZ2lmeShwYXlEYXRhKSlcbiAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLnBheW1lbnQocGF5RGF0YSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuY29kZSA9PSAwKSB7IC8vIOaUr+S7mOaIkOWKn1xuICAgICAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5hbmFseXRpY3MucGF5KHtcbiAgICAgICAgICAgICAgICAgICAgYWNjb3VudElkOiB3aW5kb3dbJ0RITWluaUg1U0RLJ10udXNlckluZm8uYWNjb3VudElkLFxuICAgICAgICAgICAgICAgICAgICByb2xlSWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHJvbGVMZXZlbDogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVySWQ6IG9yZGVySWQsXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1JZDogcGFyYW0ucHJvZHVjdElkLFxuICAgICAgICAgICAgICAgICAgICBwYXlBbW91bnQ6IHBhcmFtLnByaWNlXG4gICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvL+eUtemtgnNka+a8j+aWl+aJk+eCuVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3dbJ0RITWluaUg1U0RLJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93WydESE1pbmlINVNESyddLmFuYWx5dGljcy5sb2coe1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJZDogXCI1MTAwMDA6OkdBTUVfQ0xJRU5UX1BBWV9TVUNDRVNTXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJFdmVudElkOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvbnRlbnQ6IFwi5Y+R5pS+5pSv5LuY6YGT5YW36Iez546p5a62XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50SWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWRcbiAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmlzR29QYXkgPSBmYWxzZVxuICAgICAgICAgICAgICAgIGlmIChDb25maWcucGF5U3VjY0Fkb2tJZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoQ29uZmlnLnBheVN1Y2NBZG9rSWQpXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJbmRleCA9IDBcbiAgICAgICAgICAgICAgICBDb25maWcucGF5U3VjY0Fkb2tJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXgrK1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlnLnBheVN1Y2NBZG9rSW5kZXggPj0gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChDb25maWcucGF5U3VjY0Fkb2tJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5wYXlTdWNjQWRva0lkID0gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEdhbWVEYXRhQ2VudGVyLnRpbWUuc2VuZEFkb2soKVxuICAgICAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgICB9IGVsc2UgeyAvLyDlhbbku5bvvIzmlK/ku5jlpLHotKVcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLy8g5LiK5oql6KeS6Imy5pWw5o2uXG4gICAgcmVwb3J0Um9sZShldmVudDogUmVwb3J0Um9sZVR5cGUpOiB2b2lkIHtcbiAgICAgICAgLy8g4oCiIOWIneWni+WMluaIkOWKn+WQjuiwg+K9pC4g4oCiIOi/m+K8iuWMuuacjeOAgeWIm+K7huOAgeK7huK+iuetiee6p+abtOaWsOOAgeaImOK8kuabtOaWsOaXtuiwg+K9pC5cbiAgICAgICAgaWYgKEdhbWVEYXRhQ2VudGVyLnNldkJhY2sgPT0gbnVsbCkgeyByZXR1cm4gfVxuICAgICAgICBpZiAoR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbyA9PSBudWxsKSB7IHJldHVybiB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwi5LiK5oql6KeS6Imy5pWw5o2uOlwiLCBldmVudClcbiAgICAgICAgbGV0IG9ubGluZVRpbWUgPSAwXG4gICAgICAgIGlmIChHYW1lRGF0YUNlbnRlci50aW1lLm9ubGluZVRpbWUgPiAwKSB7XG4gICAgICAgICAgICBvbmxpbmVUaW1lID0gR2FtZURhdGFDZW50ZXIudGltZS5zZXZUaW1lIC0gR2FtZURhdGFDZW50ZXIudGltZS5vbmxpbmVUaW1lXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzQ3JlYXRlUm9sZSA9IGZhbHNlXG4gICAgICAgIGxldCBsZXZlbCA9IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LmxldmVsXG4gICAgICAgIGxldCB0eXBlID0gXCJcIlxuICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLmNyZWF0ZTpcbiAgICAgICAgICAgICAgICBpc0NyZWF0ZVJvbGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgdHlwZSA9IFwiQ1JFQVRFX1JPTEVcIlxuICAgICAgICAgICAgICAgIC8v55S16a2Cc2Rr5ryP5paX5omT54K5XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvd1snREhNaW5pSDVTREsnXSkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3dbJ0RITWluaUg1U0RLJ10uYW5hbHl0aWNzLmxvZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudElkOiBcIjQ1MDAwMTo6R0FNRV9DTElFTlRfQ1JFQVRJTkdfQV9ST0xFXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJFdmVudElkOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0xldmVsOiBcImRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ0NvbnRlbnQ6IFwi5ri45oiP5a6i5oi356uv5Yib6KeS5oiQ5YqfXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50SWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWRcbiAgICAgICAgICAgICAgICAgICAgfSwgcGFyYW1zID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3aW5kb3dbJ0RITWluaUg1U0RLJ10uYW5hbHl0aWNzLnJlZ2lzdGVyKHthY2NvdW50SWQ6IHdpbmRvd1snREhNaW5pSDVTREsnXS51c2VySW5mby5hY2NvdW50SWR9LCBwYXJhbXMgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhwYXJhbXMpO1xuICAgICAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLmxldmVsdXA6XG4gICAgICAgICAgICAgICAgdHlwZSA9IFwiTEVWRUxfVVBcIlxuICAgICAgICAgICAgICAgIGxldmVsKytcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUmVwb3J0Um9sZVR5cGUub2ZmbGluZTpcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBSZXBvcnRSb2xlVHlwZS5vbmxpbmU6XG4gICAgICAgICAgICAgICAgdHlwZSA9IFwiTE9HSU5fR0FNRVwiXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFJlcG9ydFJvbGVUeXBlLm90aGVyOlxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3dlciA9IDE7XG4gICAgICAgIGlmIChnYW1lTWV0aG9kLmlzRW1wdHkoR2FtZURhdGFDZW50ZXIuc2V2QmFjaykpIHtcbiAgICAgICAgICAgIHBvd2VyID0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVwcyA9IGdhbWVNZXRob2QuZXBfYWxsKEdhbWVEYXRhQ2VudGVyLnNldkJhY2spO1xuICAgICAgICAgICAgbGV0IHBvd2VyMSA9IGdhbWVNZXRob2QuZXBfcG93ZXIoMCwgZXBzKTtcbiAgICAgICAgICAgIHBvd2VyID0gcG93ZXIxXG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNlcnZlck5hbWUgPSBHYW1lRGF0YUNlbnRlci51c2VyLmdldFNlcnZlck5hbWVCeVNpZChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5zaWQpIHx8IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnNpZDtcbiAgICAgICAgdmFyIHJvbGVJbmZvID0ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGlzQ3JlYXRlUm9sZTogaXNDcmVhdGVSb2xlLFxuICAgICAgICAgICAgcm9sZUNyZWF0ZVRpbWU6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnJlZ3RpbWUsXG4gICAgICAgICAgICB1aWQ6IEdhbWVEYXRhQ2VudGVyLnBsYXQuaW5zdGFuY2Uub3BlbklkLFxuICAgICAgICAgICAgdXNlcm5hbWU6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/Lm5hbWUsXG4gICAgICAgICAgICBzZXJ2ZXJJZDogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8uc2lkLFxuICAgICAgICAgICAgc2VydmVyTmFtZTogc2VydmVyTmFtZSxcbiAgICAgICAgICAgIHVzZXJSb2xlTmFtZTogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ubmFtZSxcbiAgICAgICAgICAgIHVzZXJSb2xlSWQ6IEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnV1aWQsXG4gICAgICAgICAgICB1c2VyUm9sZUJhbGFuY2U6IDAsXG4gICAgICAgICAgICB2aXBMZXZlbDogMSxcbiAgICAgICAgICAgIHVzZXJSb2xlTGV2ZWw6IGxldmVsLFxuICAgICAgICAgICAgZ2FtZVJvbGVQb3dlcjogcG93ZXIsXG4gICAgICAgICAgICBwYXJ0eUlkOiAwLFxuICAgICAgICAgICAgcGFydHlOYW1lOiAn5pegJyxcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgcm9sZUluZm9Kc29uID0gSlNPTi5zdHJpbmdpZnkocm9sZUluZm8pO1xuXG4gICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5hbmFseXRpY3MudXBsb2FkUm9sZUluZm8oe1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGlzQ3JlYXRlUm9sZTogaXNDcmVhdGVSb2xlLCAvLyDku4XliJvlu7rop5LoibLml7bkvKB0cnVlLOabtOaWsOS/oeaBr+aXtuS8oGZhbHNlXG4gICAgICAgICAgICByb2xlQ3JlYXRlVGltZTogR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8ucmVndGltZSwgLy8g6KeS6Imy5Yib5bu65pe26Ze077yM5pe26Ze05oiz57K+56Gu5Yiw56eSXG4gICAgICAgICAgICBzZXJ2ZXJJZDogcGFyc2VJbnQoR2FtZURhdGFDZW50ZXIuc2V2QmFjay51c2VySW5mbz8uYT8uc2lkKSwgLy8g6KeS6Imy5omA5Zyo5ri45oiP5pyN5Yqh5ZmoSURcbiAgICAgICAgICAgIHNlcnZlck5hbWU6IHNlcnZlck5hbWUsIC8vIOinkuiJsuaJgOWcqOa4uOaIj+acjeWKoeWZqOWQjeensFxuICAgICAgICAgICAgcm9sZUlkOiBwYXJzZUludChHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy51dWlkKSwgLy8g6KeS6ImySURcbiAgICAgICAgICAgIHJvbGVOYW1lOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5uYW1lLCAvLyDop5LoibLlkI1cbiAgICAgICAgICAgIHJvbGVMZXZlbDogbGV2ZWwsIC8vIOinkuiJsuetiee6p1xuICAgICAgICAgICAgcm9sZUJhbGFuY2U6IDAsIC8vIOinkuiJsua4uOaIj+WGhei0p+W4geS9meminVxuICAgICAgICAgICAgdmlwTGV2ZWw6IDEsIC8vIOinkuiJslZJUOetiee6p1xuICAgICAgICAgICAgcGFydHlJZDogMCwgLy8g5YWs5LyaL+ekvuWboklEXG4gICAgICAgICAgICBwYXJ0eU5hbWU6ICfml6AnLCAvLyDlhazkvJov56S+5Zui5ZCN56ewXG4gICAgICAgICAgICByb2xlUG93ZXI6IHBvd2VyLCAvLyDop5LoibLmiJjliptcbiAgICAgICAgICAgIHBhcnR5Um9sZUlkOiAxLCAvLyDop5LoibLlnKjluK7mtL7kuK3nmoRJRFxuICAgICAgICB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9wZW5TZXJ2aWNlKCkge1xuICAgICAgICBpZiAod2luZG93WydESE1pbmlINVNESyddLmlzRGhBcHApIHtcbiAgICAgICAgICAgIHdpbmRvd1snREhNaW5pSDVTREsnXS5zZXJ2aWNlKHtcbiAgICAgICAgICAgICAgICByb2xlSWQ6IHBhcnNlSW50KEdhbWVEYXRhQ2VudGVyLnNldkJhY2sudXNlckluZm8/LmE/LnV1aWQpLFxuICAgICAgICAgICAgICAgIG5pY2tuYW1lOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5uYW1lLFxuICAgICAgICAgICAgICAgIGxldmVsOiBHYW1lRGF0YUNlbnRlci5zZXZCYWNrLnVzZXJJbmZvPy5hPy5sZXZlbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2hlY2tNc2coc3RyOiBzdHJpbmcsIGNiOiBGdW5jdGlvbik6IHZvaWQge1xuICAgICAgICBjYigpXG4gICAgfVxufSJdfQ==