TableView.js 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/game/component/TableView.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, '9a31drXM+9NCKYkF9D78zlF', 'TableView');
  13. // script/game/component/TableView.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. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31. else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  32. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33. };
  34. Object.defineProperty(exports, "__esModule", { value: true });
  35. var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
  36. /** 动态加载的滚动列表
  37. * - 滑动列表动态加载
  38. * - 支持多种类型预制体混合滚动
  39. * - item脚本需要有函数 setItemData 用于接收数据
  40. * - 多个prefab混合时,要为每条item指定 pfbType
  41. * - item、content锚点y需要为1其他为0.5
  42. * @author 薛鸿潇
  43. */
  44. var TableView = /** @class */ (function (_super) {
  45. __extends(TableView, _super);
  46. function TableView() {
  47. var _this = _super !== null && _super.apply(this, arguments) || this;
  48. _this.pre_item = [];
  49. /** 间距 */
  50. _this.itemInterval = 0;
  51. /** 数据 */
  52. _this.itemData = null;
  53. /** 滚动列表组件 */
  54. _this.scrollView = null;
  55. /** item预制体组 */
  56. _this.item = null;
  57. /** 滑动列表的内容节点 */
  58. _this.content = null;
  59. /** 列表高 */
  60. _this.layerHeight = null;
  61. /** ? */
  62. _this.firstItemIndex = 0;
  63. _this.lastItemIndex = 0;
  64. _this.firstItemData = {};
  65. _this.lastItemData = {};
  66. _this.itemArr = [];
  67. _this.itemNode = [];
  68. _this.itemPosMap = new Map();
  69. _this.initItemData = true;
  70. _this.count = 0;
  71. _this.itemCanMoveDown = null;
  72. _this.itemCanMoveUp = null;
  73. _this.lastResetItemInfoHeight = null;
  74. _this.lastResetItemIndex = null;
  75. return _this;
  76. }
  77. TableView.prototype.onLoad = function () {
  78. this.initPro();
  79. // 测试
  80. // let itemData = [];
  81. // for (let i = 0; i < 20; i++) {
  82. // let test_data = {
  83. // pfbType: 0,
  84. // }
  85. // itemData.push(test_data);
  86. // }
  87. // this.init(itemData);
  88. };
  89. TableView.prototype.initPro = function () {
  90. this.scrollView = this.node.getComponent(cc.ScrollView);
  91. this.content = this.scrollView.content;
  92. this.item = this.pre_item;
  93. this.layerHeight = this.node.height;
  94. for (var i = 0; i < this.item.length; i++) {
  95. this.itemNode[i] = cc.instantiate(this.item[i]);
  96. }
  97. this.node.on('srollview-init', this.init, this);
  98. };
  99. /**
  100. * @param itemData 列表数据
  101. * @param isSkipInit 跳过初始化
  102. * @returns
  103. */
  104. TableView.prototype.init = function (itemData, isSkipInit) {
  105. if (isSkipInit === void 0) { isSkipInit = false; }
  106. if (!itemData[0]) {
  107. return false;
  108. }
  109. this.itemData = itemData; //item数据
  110. this.firstItemIndex = 0;
  111. this.lastItemIndex = 0;
  112. this.firstItemData = {};
  113. this.lastItemData = {};
  114. this.itemArr = [];
  115. this.itemPosMap = new Map();
  116. this.initItemData = true;
  117. this.count = 0;
  118. if (isSkipInit)
  119. return;
  120. // this.itemNode = [];
  121. // for (let i = 0; i < this.item.length; i++) {
  122. // this.itemNode[i] = cc.instantiate(this.item[i]);
  123. // }
  124. // cc.log(this.testTime(0));// 消耗计时
  125. this.initItem();
  126. this.getItemPos(0);
  127. this.scrollView.node.on('scrolling', this.callback, this);
  128. // cc.log('tableView结束:' + this.testTime());
  129. };
  130. /**
  131. * 刷新列表
  132. * 仅更新data数据
  133. */
  134. TableView.prototype.updateList = function () {
  135. };
  136. TableView.prototype.getItemPos = function (index) {
  137. var item_data_count = this.itemData.length;
  138. for (var i = index; i < item_data_count; i++) {
  139. var obj = {};
  140. var y = void 0;
  141. if (i === 0) {
  142. obj.startPos = 0;
  143. }
  144. else {
  145. obj.startPos = this.itemPosMap.get(i - 1).endPos;
  146. }
  147. var j = this.itemData[i].pfbType || 0;
  148. obj.endPos = obj.startPos + this.itemNode[j].height + this.itemInterval;
  149. this.itemPosMap.set(i, obj);
  150. }
  151. if (item_data_count > 0) {
  152. this.updateContentHeigh(this.itemPosMap.get(item_data_count - 1).endPos);
  153. }
  154. };
  155. /**
  156. * 实例化所有用到的item,控制实例化item的数目,暂定超出两个
  157. */
  158. TableView.prototype.initItem = function () {
  159. var j = 0;
  160. for (var i = 0; i < this.itemData.length; i++) {
  161. if (this.content.height > this.layerHeight) {
  162. j++;
  163. if (j > 2) {
  164. break;
  165. }
  166. }
  167. var y = 0;
  168. if (i > 0) {
  169. y = this.itemArr[i - 1].y - this.itemArr[i - 1].height - this.itemInterval; // 下一条目纵坐标
  170. }
  171. this.addItemNode(i, y);
  172. this.updateContentHeigh(this.itemArr[i].height - y);
  173. }
  174. };
  175. /**
  176. * 添加条目节点
  177. * @param i 编号
  178. * @param y 坐标y
  179. */
  180. TableView.prototype.addItemNode = function (i, y) {
  181. var pfbType = this.itemData[i].pfbType || 0;
  182. var item = cc.instantiate(this.itemNode[pfbType]);
  183. item.parent = this.content;
  184. item.pfbType = pfbType;
  185. item.index = i;
  186. if (i === 0) {
  187. item.y = 0;
  188. }
  189. else {
  190. item.y = y;
  191. }
  192. item.x = 0;
  193. //对item赋值
  194. var comp_script = item.getComponent(item.name);
  195. comp_script && comp_script.setItemData(this.itemData[i], this);
  196. this.itemArr.push(item);
  197. // cc.log('生成itemNode' + i);
  198. };
  199. /**
  200. * 更新centent高
  201. * @param num
  202. */
  203. TableView.prototype.updateContentHeigh = function (num) {
  204. this.content.height = num > this.layerHeight ? num : this.layerHeight;
  205. // cc.log('滚动条高度:', this.content.height);
  206. };
  207. /**
  208. * 触摸滚动条的函数回调
  209. * @param event
  210. * @param eventType
  211. * @returns
  212. */
  213. TableView.prototype.callback = function (event, eventType) {
  214. // cc.log(event && event.type || eventType)
  215. if (this.content.height > this.layerHeight) {
  216. var firstItemPos = this.scrollView.getScrollOffset().y;
  217. var lastItemPos = firstItemPos + this.layerHeight;
  218. if (firstItemPos < 0)
  219. return;
  220. if (this.initItemData) {
  221. // cc.log('111:%o', this.itemPosMap)
  222. this.initItemData = false;
  223. this.updateFirstItemIndex();
  224. this.itemCanMoveDown = true;
  225. this.updateLastItemIndex();
  226. this.itemCanMoveDown = false;
  227. }
  228. //超出边界直接返回.
  229. //滚动条向上滑动可能会触发的函数
  230. if (firstItemPos > this.firstItemData.endPos) {
  231. if (this.lastItemIndex + 1 < this.itemData.length) {
  232. this.updateFirstItemIndex();
  233. }
  234. this.count++;
  235. }
  236. if (lastItemPos > this.lastItemData.endPos) {
  237. if (this.lastItemIndex + 1 < this.itemData.length) {
  238. this.itemCanMoveDown = true;
  239. this.updateLastItemIndex();
  240. this.itemCanMoveDown = false;
  241. }
  242. }
  243. //滚动条向下滑动可能会触发的函数
  244. if (lastItemPos < this.lastItemData.startPos) {
  245. this.updateLastItemIndex();
  246. this.count--;
  247. }
  248. if (firstItemPos < this.firstItemData.startPos) {
  249. this.itemCanMoveUp = true;
  250. this.updateFirstItemIndex();
  251. this.itemCanMoveUp = false;
  252. }
  253. }
  254. };
  255. TableView.prototype.updateFirstItemIndex = function () {
  256. var num = this.firstItemIndex;
  257. if (this.itemCanMoveUp && num > this.getItemIndex()[0] && num > 0) {
  258. this.itemMoveUp(this.firstItemIndex - 1);
  259. }
  260. this.updateItemIndex();
  261. };
  262. TableView.prototype.updateLastItemIndex = function () {
  263. var num = this.lastItemIndex;
  264. if (this.itemCanMoveDown && num < this.getItemIndex()[1] && num + 1 < this.itemData.length) {
  265. this.itemMoveDown(this.lastItemIndex + 1);
  266. }
  267. this.updateItemIndex();
  268. };
  269. TableView.prototype.updateItemIndex = function () {
  270. //cc.log(this.firstItemIndex, this.lastItemIndex, this.itemArr, this.itemData)
  271. };
  272. /**
  273. * 得到滚动条此时状态下应有的itemNode元素,包括滚动条上方一个,滚动条下方一个
  274. * @returns
  275. */
  276. TableView.prototype.getItemIndex = function () {
  277. var _this = this;
  278. var firstItemPos = this.scrollView.getScrollOffset().y;
  279. var lastItemPos = firstItemPos + this.layerHeight;
  280. var arr = [];
  281. this.itemPosMap.forEach(function (value, key) {
  282. var status1 = value.startPos <= firstItemPos && value.endPos > firstItemPos;
  283. var status2 = value.startPos >= firstItemPos && value.endPos < lastItemPos;
  284. var status3 = value.startPos <= lastItemPos && value.endPos > lastItemPos;
  285. if (status1) {
  286. _this.firstItemData.startPos = value.startPos;
  287. _this.firstItemData.endPos = value.endPos;
  288. _this.firstItemIndex = key;
  289. arr.push(key);
  290. }
  291. if (status3) {
  292. _this.lastItemData.startPos = value.startPos;
  293. _this.lastItemData.endPos = value.endPos;
  294. _this.lastItemIndex = key;
  295. arr.push(key);
  296. }
  297. });
  298. return arr;
  299. };
  300. /**
  301. * 滚动到顶部【滚动条顺序是从上到下开始遍历】
  302. * @param num
  303. * @returns
  304. */
  305. TableView.prototype.itemMoveUp = function (num) {
  306. if (num < 0 || this.lastItemIndex + 1 < num || num + 1 > this.itemData.length) {
  307. return;
  308. }
  309. if (!this.hasItem(num)) {
  310. this.itemMove(num, -this.itemPosMap.get(num).startPos);
  311. }
  312. num++;
  313. return this.itemMoveUp(num);
  314. };
  315. /** 滚动到底部 */
  316. TableView.prototype.itemMoveDown = function (num) {
  317. if (num < 0 || this.firstItemIndex - 1 > num || num + 1 > this.itemData.length) {
  318. return;
  319. }
  320. if (!this.hasItem(num)) {
  321. this.itemMove(num, -this.itemPosMap.get(num).startPos);
  322. }
  323. num--;
  324. return this.itemMoveDown(num);
  325. };
  326. /**
  327. * 判断指定index位置是否存在itemNode
  328. * @param index 节点下标
  329. * @returns
  330. */
  331. TableView.prototype.hasItem = function (index) {
  332. for (var i = 0; i < this.itemArr.length; i++) {
  333. if (this.itemArr[i].index === index) {
  334. return true;
  335. }
  336. }
  337. return false;
  338. };
  339. /**
  340. * 移动条目
  341. * 逻辑判断,第一种情况,修改itemArr数组的某个对象,第二种情况实例化一个新itemNode
  342. * @param index 条目节点标记
  343. * @param y
  344. * @returns
  345. */
  346. TableView.prototype.itemMove = function (index, y) {
  347. for (var i = 0; i < this.itemArr.length; i++) {
  348. //index存在-1的情况,类似于在缓存池里的item.
  349. var status1 = this.itemArr[i].index < this.firstItemIndex - 1 ? true : false;
  350. var status2 = this.itemArr[i].index > this.lastItemIndex + 1 ? true : false;
  351. var status3 = this.itemArr[i].pfbType === this.itemData[index].pfbType;
  352. //cc.log('item的索引', this.firstItemIndex, this.lastItemIndex)
  353. if (status1 && status3 || status2 && status3) {
  354. //cc.log(i, index, this.itemArr, this.content.height);
  355. //给item赋值还有设置位置
  356. this.itemArr[i].index = index;
  357. this.itemArr[i].y = y;
  358. var comp_script = this.itemArr[i].getComponent(this.itemArr[i].name);
  359. comp_script && comp_script.setItemData(this.itemData[index], this);
  360. return;
  361. }
  362. }
  363. this.addItemNode(index, y);
  364. };
  365. /**
  366. * 得到相关位置的排序index
  367. * 方法待验证,可能有问题
  368. * @param pos 坐标
  369. * @returns
  370. */
  371. TableView.prototype.getPosIndex = function (pos) {
  372. for (var _i = 0, _a = this.itemPosMap.entries(); _i < _a.length; _i++) {
  373. var _b = _a[_i], key = _b[0], value = _b[1];
  374. if (value.endPos > pos && value.startPos <= pos) {
  375. return key;
  376. }
  377. }
  378. };
  379. /**
  380. * 添加条目
  381. * @param obj 数据对象
  382. * @returns
  383. */
  384. TableView.prototype.addItem = function (obj) {
  385. this.itemData.push(obj);
  386. this.getItemPos(this.itemData.length - 1);
  387. var endPos = this.itemPosMap.get(this.itemData.length - 1).endPos;
  388. if (endPos - this.layerHeight > 0) {
  389. var startPos = endPos - this.layerHeight;
  390. //得到当前的firstItemIndex;
  391. for (var i = this.itemData.length - 1; i >= 0; i--) {
  392. if (this.itemPosMap.get(i).endPos > startPos && this.itemPosMap.get(i).startPos <= startPos) {
  393. this.firstItemIndex = i;
  394. }
  395. }
  396. this.scrollView.scrollToBottom();
  397. this.lastItemIndex = this.itemData.length - 1;
  398. var num = this.firstItemIndex - 1 > 0 ? (this.firstItemIndex - 1) : 0;
  399. this.itemMoveUp(num);
  400. return true;
  401. }
  402. else {
  403. this.firstItemIndex = 0;
  404. this.lastItemIndex = this.itemData.length - 1;
  405. this.itemMoveUp(this.firstItemIndex);
  406. return false;
  407. }
  408. };
  409. /**
  410. * 清理条目
  411. */
  412. TableView.prototype.clearItem = function () {
  413. this.itemData = [];
  414. this.itemPosMap.clear();
  415. this.scrollView.scrollToTop();
  416. this.content.height = 0;
  417. for (var i in this.itemArr) {
  418. // this.itemArr[i].index = -1;
  419. // this.itemArr[i].y = 3000;
  420. this.itemArr[i].destroy();
  421. }
  422. };
  423. /**
  424. * 删除指定条目
  425. * @param i 节点.index
  426. * @returns
  427. */
  428. TableView.prototype.deleteItem = function (i) {
  429. this.itemData.splice(i, 1);
  430. var item_data_count = this.itemData.length;
  431. if (item_data_count <= 0)
  432. return;
  433. this.getItemPos(item_data_count - 1);
  434. //改变this.itemArr的内容
  435. for (var j = 0; j < this.itemArr.length; j++) {
  436. if (this.itemArr[j].index === i) {
  437. this.itemArr[j].index = -1;
  438. this.itemArr[j].y = 3000;
  439. }
  440. if (this.itemArr[j].index > i) {
  441. var num = this.itemArr[j].index;
  442. this.itemArr[j].y = -this.itemPosMap.get(num - 1).startPos;
  443. this.itemArr[j].index = num - 1;
  444. }
  445. }
  446. this.updateContentHeigh(this.itemPosMap.get(this.itemData.length - 1).endPos);
  447. if (!this.lastItemIndex)
  448. this.getItemIndex(); // 初始化时没有初始化此值,会导致为0.不能创建新的item,此处校验
  449. this.itemMoveUp(this.firstItemIndex); //
  450. };
  451. /**
  452. * 重置指定item
  453. * @param index 节点下标
  454. * @param item_data 新的数据
  455. */
  456. TableView.prototype.resetItemData = function (index, item_data) {
  457. for (var i = 0; i < this.itemArr.length; i++) {
  458. if (this.itemArr[i].index === index) {
  459. if (item_data)
  460. this.itemData[i] = item_data;
  461. var comp_script = this.itemArr[i].getComponent(this.itemArr[i].name);
  462. comp_script && comp_script.setItemData(this.itemData[index], this);
  463. break;
  464. }
  465. }
  466. };
  467. /**
  468. * 重置条目大小
  469. * @param index 节点下标
  470. * @param infoHeight 新的高度
  471. */
  472. TableView.prototype.resetItemSize = function (index, infoHeight) {
  473. var func = (function (index, infoHeight) {
  474. for (var i = 0; i < this.itemArr.length; i++) {
  475. if (this.itemArr[i].index > index) {
  476. this.itemArr[i].y -= infoHeight;
  477. }
  478. }
  479. for (var _i = 0, _a = this.itemPosMap.entries(); _i < _a.length; _i++) {
  480. var _b = _a[_i], key = _b[0], value = _b[1];
  481. if (key === index) {
  482. value.endPos += infoHeight;
  483. }
  484. if (key > index) {
  485. value.endPos += infoHeight;
  486. value.startPos += infoHeight;
  487. }
  488. }
  489. this.lastResetItemInfoHeight = infoHeight;
  490. this.lastResetItemIndex = index;
  491. }).bind(this);
  492. if (this.lastResetItemIndex !== null && this.lastResetItemInfoHeight) {
  493. if (this.lastResetItemIndex === index) {
  494. func(this.lastResetItemIndex, -this.lastResetItemInfoHeight);
  495. this.lastResetItemIndex = null;
  496. this.lastResetItemInfoHeight = 0;
  497. }
  498. else {
  499. func(this.lastResetItemIndex, -this.lastResetItemInfoHeight);
  500. func(index, infoHeight);
  501. }
  502. }
  503. else {
  504. func(index, infoHeight);
  505. }
  506. this.itemMoveUp(this.firstItemIndex);
  507. this.updateContentHeigh(this.itemPosMap.get(this.itemData.length - 1).endPos);
  508. };
  509. __decorate([
  510. property({ type: [cc.Prefab] })
  511. ], TableView.prototype, "pre_item", void 0);
  512. __decorate([
  513. property({ displayName: '间距' })
  514. ], TableView.prototype, "itemInterval", void 0);
  515. TableView = __decorate([
  516. ccclass
  517. ], TableView);
  518. return TableView;
  519. }(cc.Component));
  520. exports.default = TableView;
  521. cc._RF.pop();
  522. }
  523. if (nodeEnv) {
  524. __define(__module.exports, __require, __module);
  525. }
  526. else {
  527. __quick_compile_project__.registerModuleFunc(__filename, function () {
  528. __define(__module.exports, __require, __module);
  529. });
  530. }
  531. })();
  532. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcc2NyaXB0XFxnYW1lXFxjb21wb25lbnRcXFRhYmxlVmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDTSxJQUFBLEtBQXdCLEVBQUUsQ0FBQyxVQUFVLEVBQW5DLE9BQU8sYUFBQSxFQUFFLFFBQVEsY0FBa0IsQ0FBQztBQUU1Qzs7Ozs7OztFQU9FO0FBRUY7SUFBdUMsNkJBQVk7SUFBbkQ7UUFBQSxxRUFvZUM7UUFqZVcsY0FBUSxHQUFnQixFQUFFLENBQUM7UUFDbkMsU0FBUztRQUVELGtCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBRWpDLFNBQVM7UUFDRCxjQUFRLEdBQVEsSUFBSSxDQUFDO1FBQzdCLGFBQWE7UUFDTCxnQkFBVSxHQUFrQixJQUFJLENBQUM7UUFDekMsZUFBZTtRQUNQLFVBQUksR0FBZSxJQUFJLENBQUM7UUFDaEMsZ0JBQWdCO1FBQ1IsYUFBTyxHQUFRLElBQUksQ0FBQztRQUM1QixVQUFVO1FBQ0YsaUJBQVcsR0FBUSxJQUFJLENBQUM7UUFDaEMsUUFBUTtRQUNBLG9CQUFjLEdBQVcsQ0FBQyxDQUFDO1FBQzNCLG1CQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLG1CQUFhLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLGtCQUFZLEdBQVEsRUFBRSxDQUFDO1FBQ3ZCLGFBQU8sR0FBZSxFQUFFLENBQUM7UUFDekIsY0FBUSxHQUFlLEVBQUUsQ0FBQztRQUMxQixnQkFBVSxHQUFRLElBQUksR0FBRyxFQUFFLENBQUM7UUFDNUIsa0JBQVksR0FBWSxJQUFJLENBQUM7UUFDN0IsV0FBSyxHQUFXLENBQUMsQ0FBQztRQUNsQixxQkFBZSxHQUFZLElBQUksQ0FBQztRQUNoQyxtQkFBYSxHQUFZLElBQUksQ0FBQztRQXlaOUIsNkJBQXVCLEdBQVEsSUFBSSxDQUFDO1FBQ3BDLHdCQUFrQixHQUFRLElBQUksQ0FBQzs7SUE2QzNDLENBQUM7SUFyY0csMEJBQU0sR0FBTjtRQUNJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLEtBQUs7UUFDTCxxQkFBcUI7UUFDckIsaUNBQWlDO1FBQ2pDLHdCQUF3QjtRQUN4QixzQkFBc0I7UUFDdEIsUUFBUTtRQUNSLGdDQUFnQztRQUNoQyxJQUFJO1FBQ0osdUJBQXVCO0lBQzNCLENBQUM7SUFFTywyQkFBTyxHQUFmO1FBQ0ksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx3QkFBSSxHQUFYLFVBQVksUUFBb0IsRUFBRSxVQUEyQjtRQUEzQiwyQkFBQSxFQUFBLGtCQUEyQjtRQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2QsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxDQUFDLFFBQVE7UUFDbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxVQUFVO1lBQUUsT0FBTztRQUN2QixzQkFBc0I7UUFDdEIsK0NBQStDO1FBQy9DLHVEQUF1RDtRQUN2RCxJQUFJO1FBQ0osbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxRCw0Q0FBNEM7SUFDaEQsQ0FBQztJQUVEOzs7TUFHRTtJQUNNLDhCQUFVLEdBQWxCO0lBRUEsQ0FBQztJQUVPLDhCQUFVLEdBQWxCLFVBQW1CLEtBQWE7UUFDNUIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLGVBQWUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxJQUFJLEdBQUcsR0FBUSxFQUFFLENBQUE7WUFDakIsSUFBSSxDQUFDLFNBQUEsQ0FBQztZQUNOLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDVCxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQzthQUNwQjtpQkFBTTtnQkFDSCxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7YUFDcEQ7WUFDRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7WUFDdEMsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDeEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QsSUFBSSxlQUFlLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUU7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyw0QkFBUSxHQUFoQjtRQUNJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMzQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3hDLENBQUMsRUFBRSxDQUFBO2dCQUNILElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDUCxNQUFNO2lCQUNUO2FBQ0o7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1AsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBLFVBQVU7YUFDeEY7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLCtCQUFXLEdBQW5CLFVBQW9CLENBQVMsRUFBRSxDQUFTO1FBQ3BDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDVCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO2FBQU07WUFDSCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDWCxTQUFTO1FBQ1QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsV0FBVyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4Qiw0QkFBNEI7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNLLHNDQUFrQixHQUExQixVQUEyQixHQUFXO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdEUseUNBQXlDO0lBQzdDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLDRCQUFRLEdBQWhCLFVBQWlCLEtBQUssRUFBRSxTQUFTO1FBQzdCLDJDQUEyQztRQUMzQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDeEMsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxXQUFXLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFDbEQsSUFBSSxZQUFZLEdBQUcsQ0FBQztnQkFBRSxPQUFPO1lBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDbkIsb0NBQW9DO2dCQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7YUFDaEM7WUFFRCxXQUFXO1lBQ1gsaUJBQWlCO1lBQ2pCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFO2dCQUMxQyxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO29CQUMvQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztpQkFDL0I7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2hCO1lBQ0QsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hDLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO29CQUM1QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7aUJBQ2hDO2FBQ0o7WUFDRCxpQkFBaUI7WUFDakIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDaEI7WUFDRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQzthQUM5QjtTQUVKO0lBRUwsQ0FBQztJQUVPLHdDQUFvQixHQUE1QjtRQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDOUIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRTtZQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUNPLHVDQUFtQixHQUEzQjtRQUNJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4RixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDN0M7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVPLG1DQUFlLEdBQXZCO1FBQ0ksOEVBQThFO0lBQ2xGLENBQUM7SUFFRDs7O09BR0c7SUFDSyxnQ0FBWSxHQUFwQjtRQUFBLGlCQXNCQztRQXJCRyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLFdBQVcsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNsRCxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEtBQUssRUFBRSxHQUFHO1lBQy9CLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1lBQzVFLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksWUFBWSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQzNFLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksV0FBVyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQzFFLElBQUksT0FBTyxFQUFFO2dCQUNULEtBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7Z0JBQzdDLEtBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQ3pDLEtBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDO2dCQUMxQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pCO1lBQ0QsSUFBSSxPQUFPLEVBQUU7Z0JBQ1QsS0FBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDNUMsS0FBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsS0FBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDakI7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw4QkFBVSxHQUFsQixVQUFtQixHQUFXO1FBQzFCLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUMzRSxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsR0FBRyxFQUFFLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELFlBQVk7SUFDSixnQ0FBWSxHQUFwQixVQUFxQixHQUFXO1FBQzVCLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUM1RSxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzFEO1FBQ0QsR0FBRyxFQUFFLENBQUM7UUFDTixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSywyQkFBTyxHQUFmLFVBQWdCLEtBQWE7UUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO2dCQUNqQyxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssNEJBQVEsR0FBaEIsVUFBaUIsS0FBYSxFQUFFLENBQVM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLDZCQUE2QjtZQUM3QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDN0UsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzVFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3ZFLDREQUE0RDtZQUM1RCxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRTtnQkFDMUMsc0RBQXNEO2dCQUN0RCxlQUFlO2dCQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRSxXQUFXLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNuRSxPQUFPO2FBQ1Y7U0FDSjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLCtCQUFXLEdBQWxCLFVBQW1CLEdBQVk7UUFDM0IsS0FBeUIsVUFBeUIsRUFBekIsS0FBQSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUF6QixjQUF5QixFQUF6QixJQUF5QixFQUFFO1lBQTNDLElBQUEsV0FBWSxFQUFYLEdBQUcsUUFBQSxFQUFFLEtBQUssUUFBQTtZQUNoQixJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksR0FBRyxFQUFFO2dCQUM3QyxPQUFPLEdBQUcsQ0FBQzthQUNkO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLDJCQUFPLEdBQWQsVUFBZSxHQUFRO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ2xFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLElBQUksUUFBUSxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3pDLHNCQUFzQjtZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNoRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsRUFBRTtvQkFDekYsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7aUJBQzNCO2FBQ0o7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzlDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixPQUFPLElBQUksQ0FBQztTQUNmO2FBQU07WUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUVMLENBQUM7SUFFRDs7T0FFRztJQUNJLDZCQUFTLEdBQWhCO1FBQ0ksSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDeEIsOEJBQThCO1lBQzlCLDRCQUE0QjtZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSw4QkFBVSxHQUFqQixVQUFrQixDQUFTO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUM3QyxJQUFJLGVBQWUsSUFBSSxDQUFDO1lBQUUsT0FBTztRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVyQyxtQkFBbUI7UUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7Z0JBQzNCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQzNELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7YUFDbkM7U0FDSjtRQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQSxvQ0FBb0M7UUFDakYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQSxFQUFFO0lBQzNDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksaUNBQWEsR0FBcEIsVUFBcUIsS0FBYSxFQUFFLFNBQWU7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFO2dCQUNqQyxJQUFJLFNBQVM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7Z0JBQzVDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3JFLFdBQVcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ25FLE1BQU07YUFDVDtTQUNKO0lBQ0wsQ0FBQztJQUlEOzs7O09BSUc7SUFDSSxpQ0FBYSxHQUFwQixVQUFxQixLQUFhLEVBQUUsVUFBa0I7UUFDbEQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssRUFBRSxVQUFVO1lBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUU7b0JBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztpQkFDbkM7YUFDSjtZQUVELEtBQXlCLFVBQXlCLEVBQXpCLEtBQUEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBekIsY0FBeUIsRUFBekIsSUFBeUIsRUFBRTtnQkFBM0MsSUFBQSxXQUFZLEVBQVgsR0FBRyxRQUFBLEVBQUUsS0FBSyxRQUFBO2dCQUNoQixJQUFJLEdBQUcsS0FBSyxLQUFLLEVBQUU7b0JBQ2YsS0FBSyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUM7aUJBQzlCO2dCQUNELElBQUksR0FBRyxHQUFHLEtBQUssRUFBRTtvQkFDYixLQUFLLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQztvQkFDM0IsS0FBSyxDQUFDLFFBQVEsSUFBSSxVQUFVLENBQUM7aUJBQ2hDO2FBQ0o7WUFDRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsVUFBVSxDQUFDO1lBQzFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNsRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsS0FBSyxLQUFLLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztnQkFDL0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQzthQUNwQztpQkFBTTtnQkFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBRTdELElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDM0I7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztTQUMzQjtRQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBOWREO1FBREMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7K0NBQ0c7SUFHbkM7UUFEQyxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7bURBQ0M7SUFOaEIsU0FBUztRQUQ3QixPQUFPO09BQ2EsU0FBUyxDQW9lN0I7SUFBRCxnQkFBQztDQXBlRCxBQW9lQyxDQXBlc0MsRUFBRSxDQUFDLFNBQVMsR0FvZWxEO2tCQXBlb0IsU0FBUyIsImZpbGUiOiIiLCJzb3VyY2VSb290IjoiLyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5jb25zdCB7IGNjY2xhc3MsIHByb3BlcnR5IH0gPSBjYy5fZGVjb3JhdG9yO1xyXG5cclxuLyoqIOWKqOaAgeWKoOi9veeahOa7muWKqOWIl+ihqFxyXG4gKiAtIOa7keWKqOWIl+ihqOWKqOaAgeWKoOi9vVxyXG4gKiAtIOaUr+aMgeWkmuenjeexu+Wei+mihOWItuS9k+a3t+WQiOa7muWKqCBcclxuICogLSBpdGVt6ISa5pys6ZyA6KaB5pyJ5Ye95pWwIHNldEl0ZW1EYXRhIOeUqOS6juaOpeaUtuaVsOaNrlxyXG4gKiAtIOWkmuS4qnByZWZhYua3t+WQiOaXtu+8jOimgeS4uuavj+adoWl0ZW3mjIflrpogcGZiVHlwZVxyXG4gKiAtIGl0ZW3jgIFjb250ZW506ZSa54K5eemcgOimgeS4ujHlhbbku5bkuLowLjVcclxuICogQGF1dGhvciDolpvpuL/mvYdcclxuKi9cclxuQGNjY2xhc3NcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGFibGVWaWV3IGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcclxuXHJcbiAgICBAcHJvcGVydHkoeyB0eXBlOiBbY2MuUHJlZmFiXSB9KVxyXG4gICAgcHJpdmF0ZSBwcmVfaXRlbTogY2MuUHJlZmFiW10gPSBbXTtcclxuICAgIC8qKiDpl7Tot50gKi9cclxuICAgIEBwcm9wZXJ0eSh7IGRpc3BsYXlOYW1lOiAn6Ze06LedJyB9KVxyXG4gICAgcHJpdmF0ZSBpdGVtSW50ZXJ2YWw6IG51bWJlciA9IDA7XHJcblxyXG4gICAgLyoqIOaVsOaNriAqL1xyXG4gICAgcHJpdmF0ZSBpdGVtRGF0YTogYW55ID0gbnVsbDtcclxuICAgIC8qKiDmu5rliqjliJfooajnu4Tku7YgKi9cclxuICAgIHByaXZhdGUgc2Nyb2xsVmlldzogY2MuU2Nyb2xsVmlldyA9IG51bGw7XHJcbiAgICAvKiogaXRlbemihOWItuS9k+e7hCAqL1xyXG4gICAgcHJpdmF0ZSBpdGVtOiBBcnJheTxhbnk+ID0gbnVsbDtcclxuICAgIC8qKiDmu5HliqjliJfooajnmoTlhoXlrrnoioLngrkgKi9cclxuICAgIHByaXZhdGUgY29udGVudDogYW55ID0gbnVsbDtcclxuICAgIC8qKiDliJfooajpq5ggKi9cclxuICAgIHByaXZhdGUgbGF5ZXJIZWlnaHQ6IGFueSA9IG51bGw7XHJcbiAgICAvKiog77yfICovXHJcbiAgICBwcml2YXRlIGZpcnN0SXRlbUluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBsYXN0SXRlbUluZGV4OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBmaXJzdEl0ZW1EYXRhOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgbGFzdEl0ZW1EYXRhOiBhbnkgPSB7fTtcclxuICAgIHByaXZhdGUgaXRlbUFycjogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBpdGVtTm9kZTogQXJyYXk8YW55PiA9IFtdO1xyXG4gICAgcHJpdmF0ZSBpdGVtUG9zTWFwOiBhbnkgPSBuZXcgTWFwKCk7XHJcbiAgICBwcml2YXRlIGluaXRJdGVtRGF0YTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwcml2YXRlIGNvdW50OiBudW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBpdGVtQ2FuTW92ZURvd246IGJvb2xlYW4gPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBpdGVtQ2FuTW92ZVVwOiBib29sZWFuID0gbnVsbDtcclxuXHJcbiAgICBvbkxvYWQoKSB7XHJcbiAgICAgICAgdGhpcy5pbml0UHJvKCk7XHJcbiAgICAgICAgLy8g5rWL6K+VXHJcbiAgICAgICAgLy8gbGV0IGl0ZW1EYXRhID0gW107XHJcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIGxldCB0ZXN0X2RhdGEgPSB7XHJcbiAgICAgICAgLy8gICAgICAgICBwZmJUeXBlOiAwLFxyXG4gICAgICAgIC8vICAgICB9XHJcbiAgICAgICAgLy8gICAgIGl0ZW1EYXRhLnB1c2godGVzdF9kYXRhKTtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gdGhpcy5pbml0KGl0ZW1EYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQcm8oKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3ID0gdGhpcy5ub2RlLmdldENvbXBvbmVudChjYy5TY3JvbGxWaWV3KTtcclxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLnNjcm9sbFZpZXcuY29udGVudDtcclxuICAgICAgICB0aGlzLml0ZW0gPSB0aGlzLnByZV9pdGVtO1xyXG4gICAgICAgIHRoaXMubGF5ZXJIZWlnaHQgPSB0aGlzLm5vZGUuaGVpZ2h0O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU5vZGVbaV0gPSBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1baV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5vZGUub24oJ3Nyb2xsdmlldy1pbml0JywgdGhpcy5pbml0LCB0aGlzKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gaXRlbURhdGEg5YiX6KGo5pWw5o2uXHJcbiAgICAgKiBAcGFyYW0gaXNTa2lwSW5pdCDot7Pov4fliJ3lp4vljJZcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaW5pdChpdGVtRGF0YTogQXJyYXk8YW55PiwgaXNTa2lwSW5pdDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCFpdGVtRGF0YVswXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLml0ZW1EYXRhID0gaXRlbURhdGE7IC8vaXRlbeaVsOaNrlxyXG4gICAgICAgIHRoaXMuZmlyc3RJdGVtSW5kZXggPSAwO1xyXG4gICAgICAgIHRoaXMubGFzdEl0ZW1JbmRleCA9IDA7XHJcbiAgICAgICAgdGhpcy5maXJzdEl0ZW1EYXRhID0ge307XHJcbiAgICAgICAgdGhpcy5sYXN0SXRlbURhdGEgPSB7fTtcclxuICAgICAgICB0aGlzLml0ZW1BcnIgPSBbXTtcclxuICAgICAgICB0aGlzLml0ZW1Qb3NNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5pbml0SXRlbURhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgICAgIGlmIChpc1NraXBJbml0KSByZXR1cm47XHJcbiAgICAgICAgLy8gdGhpcy5pdGVtTm9kZSA9IFtdO1xyXG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuaXRlbU5vZGVbaV0gPSBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1baV0pO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBjYy5sb2codGhpcy50ZXN0VGltZSgwKSk7Ly8g5raI6ICX6K6h5pe2XHJcbiAgICAgICAgdGhpcy5pbml0SXRlbSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0SXRlbVBvcygwKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFZpZXcubm9kZS5vbignc2Nyb2xsaW5nJywgdGhpcy5jYWxsYmFjaywgdGhpcyk7XHJcbiAgICAgICAgLy8gY2MubG9nKCd0YWJsZVZpZXfnu5PmnZ86JyArIHRoaXMudGVzdFRpbWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFxyXG4gICAgICog5Yi35paw5YiX6KGoIFxyXG4gICAgICog5LuF5pu05pawZGF0YeaVsOaNrlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlTGlzdCgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJdGVtUG9zKGluZGV4OiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgaXRlbV9kYXRhX2NvdW50ID0gdGhpcy5pdGVtRGF0YS5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgaXRlbV9kYXRhX2NvdW50OyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge31cclxuICAgICAgICAgICAgbGV0IHk7XHJcbiAgICAgICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICBvYmouc3RhcnRQb3MgPSAwO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgb2JqLnN0YXJ0UG9zID0gdGhpcy5pdGVtUG9zTWFwLmdldChpIC0gMSkuZW5kUG9zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBqID0gdGhpcy5pdGVtRGF0YVtpXS5wZmJUeXBlIHx8IDA7XHJcbiAgICAgICAgICAgIG9iai5lbmRQb3MgPSBvYmouc3RhcnRQb3MgKyB0aGlzLml0ZW1Ob2RlW2pdLmhlaWdodCArIHRoaXMuaXRlbUludGVydmFsO1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1Qb3NNYXAuc2V0KGksIG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtX2RhdGFfY291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29udGVudEhlaWdoKHRoaXMuaXRlbVBvc01hcC5nZXQoaXRlbV9kYXRhX2NvdW50IC0gMSkuZW5kUG9zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlrp7kvovljJbmiYDmnInnlKjliLDnmoRpdGVt77yM5o6n5Yi25a6e5L6L5YyWaXRlbeeahOaVsOebru+8jOaaguWumui2heWHuuS4pOS4qlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGluaXRJdGVtKCkge1xyXG4gICAgICAgIGxldCBqID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbURhdGEubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudC5oZWlnaHQgPiB0aGlzLmxheWVySGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICBqKytcclxuICAgICAgICAgICAgICAgIGlmIChqID4gMikge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICAgICAgaWYgKGkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB5ID0gdGhpcy5pdGVtQXJyW2kgLSAxXS55IC0gdGhpcy5pdGVtQXJyW2kgLSAxXS5oZWlnaHQgLSB0aGlzLml0ZW1JbnRlcnZhbDsvLyDkuIvkuIDmnaHnm67nurXlnZDmoIdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmFkZEl0ZW1Ob2RlKGksIHkpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbnRlbnRIZWlnaCh0aGlzLml0ZW1BcnJbaV0uaGVpZ2h0IC0geSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg5p2h55uu6IqC54K5XHJcbiAgICAgKiBAcGFyYW0gaSDnvJblj7dcclxuICAgICAqIEBwYXJhbSB5IOWdkOagh3lcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBhZGRJdGVtTm9kZShpOiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBwZmJUeXBlID0gdGhpcy5pdGVtRGF0YVtpXS5wZmJUeXBlIHx8IDA7XHJcbiAgICAgICAgbGV0IGl0ZW0gPSBjYy5pbnN0YW50aWF0ZSh0aGlzLml0ZW1Ob2RlW3BmYlR5cGVdKTtcclxuICAgICAgICBpdGVtLnBhcmVudCA9IHRoaXMuY29udGVudDtcclxuICAgICAgICBpdGVtLnBmYlR5cGUgPSBwZmJUeXBlO1xyXG4gICAgICAgIGl0ZW0uaW5kZXggPSBpO1xyXG4gICAgICAgIGlmIChpID09PSAwKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ueSA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXRlbS55ID0geTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXRlbS54ID0gMDtcclxuICAgICAgICAvL+WvuWl0ZW3otYvlgLxcclxuICAgICAgICBsZXQgY29tcF9zY3JpcHQgPSBpdGVtLmdldENvbXBvbmVudChpdGVtLm5hbWUpO1xyXG4gICAgICAgIGNvbXBfc2NyaXB0ICYmIGNvbXBfc2NyaXB0LnNldEl0ZW1EYXRhKHRoaXMuaXRlbURhdGFbaV0sIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuaXRlbUFyci5wdXNoKGl0ZW0pO1xyXG4gICAgICAgIC8vIGNjLmxvZygn55Sf5oiQaXRlbU5vZGUnICsgaSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICog5pu05pawY2VudGVudOmrmFxyXG4gICAgICogQHBhcmFtIG51bSAgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdXBkYXRlQ29udGVudEhlaWdoKG51bTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5jb250ZW50LmhlaWdodCA9IG51bSA+IHRoaXMubGF5ZXJIZWlnaHQgPyBudW0gOiB0aGlzLmxheWVySGVpZ2h0O1xyXG4gICAgICAgIC8vIGNjLmxvZygn5rua5Yqo5p2h6auY5bqmOicsIHRoaXMuY29udGVudC5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6Kem5pG45rua5Yqo5p2h55qE5Ye95pWw5Zue6LCDXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgXHJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY2FsbGJhY2soZXZlbnQsIGV2ZW50VHlwZSkge1xyXG4gICAgICAgIC8vIGNjLmxvZyhldmVudCAmJiBldmVudC50eXBlIHx8IGV2ZW50VHlwZSlcclxuICAgICAgICBpZiAodGhpcy5jb250ZW50LmhlaWdodCA+IHRoaXMubGF5ZXJIZWlnaHQpIHtcclxuICAgICAgICAgICAgbGV0IGZpcnN0SXRlbVBvcyA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55O1xyXG4gICAgICAgICAgICBsZXQgbGFzdEl0ZW1Qb3MgPSBmaXJzdEl0ZW1Qb3MgKyB0aGlzLmxheWVySGVpZ2h0O1xyXG4gICAgICAgICAgICBpZiAoZmlyc3RJdGVtUG9zIDwgMCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pbml0SXRlbURhdGEpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNjLmxvZygnMTExOiVvJywgdGhpcy5pdGVtUG9zTWFwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0SXRlbURhdGEgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlyc3RJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUNhbk1vdmVEb3duID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTGFzdEl0ZW1JbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtQ2FuTW92ZURvd24gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy/otoXlh7rovrnnlYznm7TmjqXov5Tlm54uXHJcbiAgICAgICAgICAgIC8v5rua5Yqo5p2h5ZCR5LiK5ruR5Yqo5Y+v6IO95Lya6Kem5Y+R55qE5Ye95pWwXHJcbiAgICAgICAgICAgIGlmIChmaXJzdEl0ZW1Qb3MgPiB0aGlzLmZpcnN0SXRlbURhdGEuZW5kUG9zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0SXRlbUluZGV4ICsgMSA8IHRoaXMuaXRlbURhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaXJzdEl0ZW1JbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChsYXN0SXRlbVBvcyA+IHRoaXMubGFzdEl0ZW1EYXRhLmVuZFBvcykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubGFzdEl0ZW1JbmRleCArIDEgPCB0aGlzLml0ZW1EYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbUNhbk1vdmVEb3duID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxhc3RJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1DYW5Nb3ZlRG93biA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8v5rua5Yqo5p2h5ZCR5LiL5ruR5Yqo5Y+v6IO95Lya6Kem5Y+R55qE5Ye95pWwXHJcbiAgICAgICAgICAgIGlmIChsYXN0SXRlbVBvcyA8IHRoaXMubGFzdEl0ZW1EYXRhLnN0YXJ0UG9zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUxhc3RJdGVtSW5kZXgoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY291bnQtLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmlyc3RJdGVtUG9zIDwgdGhpcy5maXJzdEl0ZW1EYXRhLnN0YXJ0UG9zKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1DYW5Nb3ZlVXAgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaXJzdEl0ZW1JbmRleCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtQ2FuTW92ZVVwID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUZpcnN0SXRlbUluZGV4KCkge1xyXG4gICAgICAgIGxldCBudW0gPSB0aGlzLmZpcnN0SXRlbUluZGV4O1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1DYW5Nb3ZlVXAgJiYgbnVtID4gdGhpcy5nZXRJdGVtSW5kZXgoKVswXSAmJiBudW0gPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU1vdmVVcCh0aGlzLmZpcnN0SXRlbUluZGV4IC0gMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlSXRlbUluZGV4KCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIHVwZGF0ZUxhc3RJdGVtSW5kZXgoKSB7XHJcbiAgICAgICAgbGV0IG51bSA9IHRoaXMubGFzdEl0ZW1JbmRleDtcclxuICAgICAgICBpZiAodGhpcy5pdGVtQ2FuTW92ZURvd24gJiYgbnVtIDwgdGhpcy5nZXRJdGVtSW5kZXgoKVsxXSAmJiBudW0gKyAxIDwgdGhpcy5pdGVtRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5pdGVtTW92ZURvd24odGhpcy5sYXN0SXRlbUluZGV4ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlSXRlbUluZGV4KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVJdGVtSW5kZXgoKSB7XHJcbiAgICAgICAgLy9jYy5sb2codGhpcy5maXJzdEl0ZW1JbmRleCwgdGhpcy5sYXN0SXRlbUluZGV4LCB0aGlzLml0ZW1BcnIsIHRoaXMuaXRlbURhdGEpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvpfliLDmu5rliqjmnaHmraTml7bnirbmgIHkuIvlupTmnInnmoRpdGVtTm9kZeWFg+e0oCzljIXmi6zmu5rliqjmnaHkuIrmlrnkuIDkuKos5rua5Yqo5p2h5LiL5pa55LiA5LiqXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRJdGVtSW5kZXgoKSB7XHJcbiAgICAgICAgbGV0IGZpcnN0SXRlbVBvcyA9IHRoaXMuc2Nyb2xsVmlldy5nZXRTY3JvbGxPZmZzZXQoKS55O1xyXG4gICAgICAgIGxldCBsYXN0SXRlbVBvcyA9IGZpcnN0SXRlbVBvcyArIHRoaXMubGF5ZXJIZWlnaHQ7XHJcbiAgICAgICAgbGV0IGFyciA9IFtdO1xyXG4gICAgICAgIHRoaXMuaXRlbVBvc01hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXMxID0gdmFsdWUuc3RhcnRQb3MgPD0gZmlyc3RJdGVtUG9zICYmIHZhbHVlLmVuZFBvcyA+IGZpcnN0SXRlbVBvcztcclxuICAgICAgICAgICAgbGV0IHN0YXR1czIgPSB2YWx1ZS5zdGFydFBvcyA+PSBmaXJzdEl0ZW1Qb3MgJiYgdmFsdWUuZW5kUG9zIDwgbGFzdEl0ZW1Qb3M7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXMzID0gdmFsdWUuc3RhcnRQb3MgPD0gbGFzdEl0ZW1Qb3MgJiYgdmFsdWUuZW5kUG9zID4gbGFzdEl0ZW1Qb3M7XHJcbiAgICAgICAgICAgIGlmIChzdGF0dXMxKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0SXRlbURhdGEuc3RhcnRQb3MgPSB2YWx1ZS5zdGFydFBvcztcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RJdGVtRGF0YS5lbmRQb3MgPSB2YWx1ZS5lbmRQb3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0SXRlbUluZGV4ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goa2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoc3RhdHVzMykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0SXRlbURhdGEuc3RhcnRQb3MgPSB2YWx1ZS5zdGFydFBvcztcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEl0ZW1EYXRhLmVuZFBvcyA9IHZhbHVlLmVuZFBvcztcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEl0ZW1JbmRleCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKGtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBhcnI7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmu5rliqjliLDpobbpg6jjgJDmu5rliqjmnaHpobrluo/mmK/ku47kuIrliLDkuIvlvIDlp4vpgY3ljobjgJFcclxuICAgICAqIEBwYXJhbSBudW0gXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpdGVtTW92ZVVwKG51bTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKG51bSA8IDAgfHwgdGhpcy5sYXN0SXRlbUluZGV4ICsgMSA8IG51bSB8fCBudW0gKyAxID4gdGhpcy5pdGVtRGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuaGFzSXRlbShudW0pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU1vdmUobnVtLCAtdGhpcy5pdGVtUG9zTWFwLmdldChudW0pLnN0YXJ0UG9zKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbnVtKys7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbU1vdmVVcChudW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiDmu5rliqjliLDlupXpg6ggKi9cclxuICAgIHByaXZhdGUgaXRlbU1vdmVEb3duKG51bTogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKG51bSA8IDAgfHwgdGhpcy5maXJzdEl0ZW1JbmRleCAtIDEgPiBudW0gfHwgbnVtICsgMSA+IHRoaXMuaXRlbURhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc0l0ZW0obnVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1Nb3ZlKG51bSwgLXRoaXMuaXRlbVBvc01hcC5nZXQobnVtKS5zdGFydFBvcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG51bS0tO1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1Nb3ZlRG93bihudW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5Yik5pat5oyH5a6aaW5kZXjkvY3nva7mmK/lkKblrZjlnKhpdGVtTm9kZVxyXG4gICAgICogQHBhcmFtIGluZGV4IOiKgueCueS4i+agh1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFzSXRlbShpbmRleDogbnVtYmVyKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZW1BcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUFycltpXS5pbmRleCA9PT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOenu+WKqOadoeebrlxyXG4gICAgICog6YC76L6R5Yik5patLOesrOS4gOenjeaDheWGtSzkv67mlLlpdGVtQXJy5pWw57uE55qE5p+Q5Liq5a+56LGhLOesrOS6jOenjeaDheWGteWunuS+i+WMluS4gOS4quaWsGl0ZW1Ob2RlXHJcbiAgICAgKiBAcGFyYW0gaW5kZXgg5p2h55uu6IqC54K55qCH6K6wXHJcbiAgICAgKiBAcGFyYW0geSBcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGl0ZW1Nb3ZlKGluZGV4OiBudW1iZXIsIHk6IG51bWJlcikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pdGVtQXJyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vaW5kZXjlrZjlnKgtMeeahOaDheWGtSznsbvkvLzkuo7lnKjnvJPlrZjmsaDph4znmoRpdGVtLlxyXG4gICAgICAgICAgICBsZXQgc3RhdHVzMSA9IHRoaXMuaXRlbUFycltpXS5pbmRleCA8IHRoaXMuZmlyc3RJdGVtSW5kZXggLSAxID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgICAgICBsZXQgc3RhdHVzMiA9IHRoaXMuaXRlbUFycltpXS5pbmRleCA+IHRoaXMubGFzdEl0ZW1JbmRleCArIDEgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBzdGF0dXMzID0gdGhpcy5pdGVtQXJyW2ldLnBmYlR5cGUgPT09IHRoaXMuaXRlbURhdGFbaW5kZXhdLnBmYlR5cGU7XHJcbiAgICAgICAgICAgIC8vY2MubG9nKCdpdGVt55qE57Si5byVJywgdGhpcy5maXJzdEl0ZW1JbmRleCwgdGhpcy5sYXN0SXRlbUluZGV4KVxyXG4gICAgICAgICAgICBpZiAoc3RhdHVzMSAmJiBzdGF0dXMzIHx8IHN0YXR1czIgJiYgc3RhdHVzMykge1xyXG4gICAgICAgICAgICAgICAgLy9jYy5sb2coaSwgaW5kZXgsIHRoaXMuaXRlbUFyciwgdGhpcy5jb250ZW50LmhlaWdodCk7XHJcbiAgICAgICAgICAgICAgICAvL+e7mWl0ZW3otYvlgLzov5jmnInorr7nva7kvY3nva5cclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUFycltpXS5pbmRleCA9IGluZGV4O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtQXJyW2ldLnkgPSB5O1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbXBfc2NyaXB0ID0gdGhpcy5pdGVtQXJyW2ldLmdldENvbXBvbmVudCh0aGlzLml0ZW1BcnJbaV0ubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb21wX3NjcmlwdCAmJiBjb21wX3NjcmlwdC5zZXRJdGVtRGF0YSh0aGlzLml0ZW1EYXRhW2luZGV4XSwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRJdGVtTm9kZShpbmRleCwgeSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDlvpfliLDnm7jlhbPkvY3nva7nmoTmjpLluo9pbmRleFxyXG4gICAgICog5pa55rOV5b6F6aqM6K+B77yM5Y+v6IO95pyJ6Zeu6aKYXHJcbiAgICAgKiBAcGFyYW0gcG9zIOWdkOagh1xyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQb3NJbmRleChwb3M6IGNjLlZlYzIpIHtcclxuICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5pdGVtUG9zTWFwLmVudHJpZXMoKSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuZW5kUG9zID4gcG9zICYmIHZhbHVlLnN0YXJ0UG9zIDw9IHBvcykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIOa3u+WKoOadoeebrlxyXG4gICAgICogQHBhcmFtIG9iaiDmlbDmja7lr7nosaFcclxuICAgICAqIEByZXR1cm5zIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYWRkSXRlbShvYmo6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaXRlbURhdGEucHVzaChvYmopO1xyXG4gICAgICAgIHRoaXMuZ2V0SXRlbVBvcyh0aGlzLml0ZW1EYXRhLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIGxldCBlbmRQb3MgPSB0aGlzLml0ZW1Qb3NNYXAuZ2V0KHRoaXMuaXRlbURhdGEubGVuZ3RoIC0gMSkuZW5kUG9zO1xyXG4gICAgICAgIGlmIChlbmRQb3MgLSB0aGlzLmxheWVySGVpZ2h0ID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRQb3MgPSBlbmRQb3MgLSB0aGlzLmxheWVySGVpZ2h0O1xyXG4gICAgICAgICAgICAvL+W+l+WIsOW9k+WJjeeahGZpcnN0SXRlbUluZGV4O1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5pdGVtRGF0YS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbVBvc01hcC5nZXQoaSkuZW5kUG9zID4gc3RhcnRQb3MgJiYgdGhpcy5pdGVtUG9zTWFwLmdldChpKS5zdGFydFBvcyA8PSBzdGFydFBvcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RJdGVtSW5kZXggPSBpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVmlldy5zY3JvbGxUb0JvdHRvbSgpO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RJdGVtSW5kZXggPSB0aGlzLml0ZW1EYXRhLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIGxldCBudW0gPSB0aGlzLmZpcnN0SXRlbUluZGV4IC0gMSA+IDAgPyAodGhpcy5maXJzdEl0ZW1JbmRleCAtIDEpIDogMDtcclxuICAgICAgICAgICAgdGhpcy5pdGVtTW92ZVVwKG51bSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyc3RJdGVtSW5kZXggPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RJdGVtSW5kZXggPSB0aGlzLml0ZW1EYXRhLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbU1vdmVVcCh0aGlzLmZpcnN0SXRlbUluZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDmuIXnkIbmnaHnm65cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFySXRlbSgpIHtcclxuICAgICAgICB0aGlzLml0ZW1EYXRhID0gW107XHJcbiAgICAgICAgdGhpcy5pdGVtUG9zTWFwLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5zY3JvbGxWaWV3LnNjcm9sbFRvVG9wKCk7XHJcbiAgICAgICAgdGhpcy5jb250ZW50LmhlaWdodCA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLml0ZW1BcnIpIHtcclxuICAgICAgICAgICAgLy8gdGhpcy5pdGVtQXJyW2ldLmluZGV4ID0gLTE7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuaXRlbUFycltpXS55ID0gMzAwMDtcclxuICAgICAgICAgICAgdGhpcy5pdGVtQXJyW2ldLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDliKDpmaTmjIflrprmnaHnm65cclxuICAgICAqIEBwYXJhbSBpIOiKgueCuS5pbmRleFxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWxldGVJdGVtKGk6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuaXRlbURhdGEuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1fZGF0YV9jb3VudCA9IHRoaXMuaXRlbURhdGEubGVuZ3RoO1xyXG4gICAgICAgIGlmIChpdGVtX2RhdGFfY291bnQgPD0gMCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZ2V0SXRlbVBvcyhpdGVtX2RhdGFfY291bnQgLSAxKTtcclxuXHJcbiAgICAgICAgLy/mlLnlj5h0aGlzLml0ZW1BcnLnmoTlhoXlrrlcclxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbUFyci5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtQXJyW2pdLmluZGV4ID09PSBpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1BcnJbal0uaW5kZXggPSAtMTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUFycltqXS55ID0gMzAwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtQXJyW2pdLmluZGV4ID4gaSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG51bSA9IHRoaXMuaXRlbUFycltqXS5pbmRleDtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbUFycltqXS55ID0gLXRoaXMuaXRlbVBvc01hcC5nZXQobnVtIC0gMSkuc3RhcnRQb3M7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1BcnJbal0uaW5kZXggPSBudW0gLSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEhlaWdoKHRoaXMuaXRlbVBvc01hcC5nZXQodGhpcy5pdGVtRGF0YS5sZW5ndGggLSAxKS5lbmRQb3MpO1xyXG4gICAgICAgIGlmICghdGhpcy5sYXN0SXRlbUluZGV4KSB0aGlzLmdldEl0ZW1JbmRleCgpOy8vIOWIneWni+WMluaXtuayoeacieWIneWni+WMluatpOWAvO+8jOS8muWvvOiHtOS4ujAu5LiN6IO95Yib5bu65paw55qEaXRlbe+8jOatpOWkhOagoemqjFxyXG4gICAgICAgIHRoaXMuaXRlbU1vdmVVcCh0aGlzLmZpcnN0SXRlbUluZGV4KTsvL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICog6YeN572u5oyH5a6aaXRlbVxyXG4gICAgICogQHBhcmFtIGluZGV4IOiKgueCueS4i+agh1xyXG4gICAgICogQHBhcmFtIGl0ZW1fZGF0YSDmlrDnmoTmlbDmja5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0SXRlbURhdGEoaW5kZXg6IG51bWJlciwgaXRlbV9kYXRhPzogYW55KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLml0ZW1BcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUFycltpXS5pbmRleCA9PT0gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtX2RhdGEpIHRoaXMuaXRlbURhdGFbaV0gPSBpdGVtX2RhdGE7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29tcF9zY3JpcHQgPSB0aGlzLml0ZW1BcnJbaV0uZ2V0Q29tcG9uZW50KHRoaXMuaXRlbUFycltpXS5uYW1lKTtcclxuICAgICAgICAgICAgICAgIGNvbXBfc2NyaXB0ICYmIGNvbXBfc2NyaXB0LnNldEl0ZW1EYXRhKHRoaXMuaXRlbURhdGFbaW5kZXhdLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbGFzdFJlc2V0SXRlbUluZm9IZWlnaHQ6IGFueSA9IG51bGw7XHJcbiAgICBwcml2YXRlIGxhc3RSZXNldEl0ZW1JbmRleDogYW55ID0gbnVsbDtcclxuICAgIC8qKlxyXG4gICAgICog6YeN572u5p2h55uu5aSn5bCPXHJcbiAgICAgKiBAcGFyYW0gaW5kZXgg6IqC54K55LiL5qCHXHJcbiAgICAgKiBAcGFyYW0gaW5mb0hlaWdodCDmlrDnmoTpq5jluqZcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlc2V0SXRlbVNpemUoaW5kZXg6IG51bWJlciwgaW5mb0hlaWdodDogbnVtYmVyKSB7XHJcbiAgICAgICAgbGV0IGZ1bmMgPSAoZnVuY3Rpb24gKGluZGV4LCBpbmZvSGVpZ2h0KSB7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaXRlbUFyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbUFycltpXS5pbmRleCA+IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pdGVtQXJyW2ldLnkgLT0gaW5mb0hlaWdodDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuaXRlbVBvc01hcC5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuZW5kUG9zICs9IGluZm9IZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoa2V5ID4gaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5lbmRQb3MgKz0gaW5mb0hlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zdGFydFBvcyArPSBpbmZvSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFJlc2V0SXRlbUluZm9IZWlnaHQgPSBpbmZvSGVpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLmxhc3RSZXNldEl0ZW1JbmRleCA9IGluZGV4O1xyXG4gICAgICAgIH0pLmJpbmQodGhpcyk7XHJcbiAgICAgICAgaWYgKHRoaXMubGFzdFJlc2V0SXRlbUluZGV4ICE9PSBudWxsICYmIHRoaXMubGFzdFJlc2V0SXRlbUluZm9IZWlnaHQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubGFzdFJlc2V0SXRlbUluZGV4ID09PSBpbmRleCkge1xyXG4gICAgICAgICAgICAgICAgZnVuYyh0aGlzLmxhc3RSZXNldEl0ZW1JbmRleCwgLXRoaXMubGFzdFJlc2V0SXRlbUluZm9IZWlnaHQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UmVzZXRJdGVtSW5kZXggPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UmVzZXRJdGVtSW5mb0hlaWdodCA9IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmdW5jKHRoaXMubGFzdFJlc2V0SXRlbUluZGV4LCAtdGhpcy5sYXN0UmVzZXRJdGVtSW5mb0hlaWdodCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZnVuYyhpbmRleCwgaW5mb0hlaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmdW5jKGluZGV4LCBpbmZvSGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pdGVtTW92ZVVwKHRoaXMuZmlyc3RJdGVtSW5kZXgpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlQ29udGVudEhlaWdoKHRoaXMuaXRlbVBvc01hcC5nZXQodGhpcy5pdGVtRGF0YS5sZW5ndGggLSAxKS5lbmRQb3MpO1xyXG4gICAgfVxyXG5cclxuXHJcbn0iXX0=