LongPressButton.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. (function() {
  2. var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
  3. var __module = nodeEnv ? module : {exports:{}};
  4. var __filename = 'preview-scripts/assets/script/utils/LongPressButton.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, '8d78fVbUK1N/pK7gUvjkYGI', 'LongPressButton');
  13. // script/utils/LongPressButton.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 gameMethod_1 = require("../common/gameMethod");
  36. var EventConst_1 = require("../data/const/EventConst");
  37. var EventMng_1 = require("../manager/EventMng");
  38. var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
  39. var LongPressButton = /** @class */ (function (_super) {
  40. __extends(LongPressButton, _super);
  41. function LongPressButton() {
  42. var _this = _super !== null && _super.apply(this, arguments) || this;
  43. _this.timerInterval = 0.2; //设置长按的间隔,默认0.2秒
  44. _this.keepTime = 0; //当次长按时长
  45. _this.passTime = 0;
  46. _this.bLongPress = false; // 是否长按状态
  47. _this.bGray = false;
  48. _this.bInterrupt = false;
  49. _this.bClick = false;
  50. _this._IsAllowlongPress = true; // 是否允许长按
  51. return _this;
  52. }
  53. Object.defineProperty(LongPressButton.prototype, "IsAllowlongPress", {
  54. get: function () {
  55. return this._IsAllowlongPress;
  56. },
  57. set: function (bAllowlongPress) {
  58. this._IsAllowlongPress = bAllowlongPress;
  59. },
  60. enumerable: false,
  61. configurable: true
  62. });
  63. LongPressButton.prototype.onEnable = function () {
  64. this.node.on(fgui.Event.TOUCH_BEGIN, this.onTouchStart, this);
  65. this.node.on(fgui.Event.TOUCH_MOVE, this.onTouchMove, this);
  66. this.node.on(fgui.Event.TOUCH_END, this.onTouchEnd, this);
  67. };
  68. LongPressButton.prototype.onDisable = function () {
  69. // 清理事件监听
  70. this.node.off(fgui.Event.TOUCH_BEGIN, this.onTouchStart, this);
  71. this.node.off(fgui.Event.TOUCH_MOVE, this.onTouchMove, this);
  72. this.node.off(fgui.Event.TOUCH_END, this.onTouchEnd, this);
  73. EventMng_1.default.emit(EventConst_1.UserEvent.BTNTOUCHDISABLE);
  74. };
  75. LongPressButton.prototype.onchangeState = function (bGray) {
  76. if (bGray && this.bGray != bGray) {
  77. if (this.bClick && this.grayClickCallback) {
  78. this.grayClickCallback();
  79. }
  80. this.bGray = true;
  81. this.unschedule(this.longPressDown);
  82. this.clearTime();
  83. }
  84. this.bGray = bGray;
  85. };
  86. // 长按事件
  87. LongPressButton.prototype.longPressDown = function () {
  88. this.bLongPress = true;
  89. if (this.bPalyAni) {
  90. this.ShowAni();
  91. }
  92. };
  93. LongPressButton.prototype.onTouchStart = function (event) {
  94. if (this.bGray) {
  95. if (this.grayClickCallback) {
  96. this.grayClickCallback();
  97. }
  98. return;
  99. }
  100. this.bClick = true;
  101. this.passTime = 0;
  102. this.keepTime = 0;
  103. this.bInterrupt = false;
  104. this.bCallback = true;
  105. this.unschedule(this.longPressDown);
  106. if (this._IsAllowlongPress) {
  107. this.scheduleOnce(this.longPressDown, 0.2);
  108. }
  109. };
  110. LongPressButton.prototype.onTouchMove = function (event) {
  111. if (this.bLongPress && !gameMethod_1.gameMethod.isEmpty(this.gButton)) {
  112. // 使用hitTest方法判断触摸点是否在组件范围内
  113. if (!this.gButton.hitTest(event.pos)) {
  114. this.onTouchEnd(null);
  115. this.bInterrupt = true;
  116. }
  117. }
  118. };
  119. LongPressButton.prototype.onTouchEnd = function (event) {
  120. if (this.bInterrupt) {
  121. // console.log("中断事件,不在相应");
  122. return;
  123. }
  124. this.unschedule(this.longPressDown);
  125. this.clearTime();
  126. EventMng_1.default.emit(EventConst_1.UserEvent.BTNTOUCHEND);
  127. };
  128. LongPressButton.prototype.update = function (dt) {
  129. this.passTime += dt;
  130. this.keepTime += dt;
  131. // 触摸计时
  132. if (this.bLongPress) {
  133. if (this.passTime > this.timerInterval) {
  134. this.handleLongPress(false);
  135. this.passTime = 0;
  136. }
  137. }
  138. };
  139. LongPressButton.prototype.clearTime = function () {
  140. if (this.bClick && this.bCallback) {
  141. this.handleLongPress(true);
  142. }
  143. this.passTime = 0;
  144. this.keepTime = 0;
  145. this.bLongPress = false;
  146. this.bClick = false;
  147. this.StopAni();
  148. };
  149. // 长按事件回调
  150. LongPressButton.prototype.handleLongPress = function (bEnd) {
  151. if (this.callbackFunc && !this.bGray) {
  152. this.callbackFunc(bEnd, this.bGray, this.bLongPress);
  153. }
  154. };
  155. LongPressButton.prototype.setCallback = function (callbackFunc, gButton, grayClickCallback) {
  156. this.callbackFunc = callbackFunc;
  157. this.grayClickCallback = grayClickCallback;
  158. this.gButton = gButton;
  159. };
  160. LongPressButton.prototype.SetLongData = function (data) {
  161. this.callbackFunc = data === null || data === void 0 ? void 0 : data.callbackFunc;
  162. this.grayClickCallback = data === null || data === void 0 ? void 0 : data.grayClickCallback;
  163. this.gButton = data === null || data === void 0 ? void 0 : data.gButton;
  164. this.scale = (data === null || data === void 0 ? void 0 : data.scale) || 1;
  165. this.targetScale = this.scale * 0.9;
  166. this.aniTime = (data === null || data === void 0 ? void 0 : data.aniTime) || 0.15;
  167. this.bPalyAni = (data === null || data === void 0 ? void 0 : data.bPalyAni) || false;
  168. };
  169. LongPressButton.prototype.interrupt = function (bCallback) {
  170. if (bCallback === void 0) { bCallback = true; }
  171. this.bCallback = bCallback;
  172. this.passTime = 0;
  173. this.keepTime = 0;
  174. this.bLongPress = false;
  175. this.bClick = false;
  176. this.StopAni();
  177. };
  178. LongPressButton.prototype.ShowAni = function () {
  179. this.StopAni();
  180. this.PlayAni();
  181. };
  182. LongPressButton.prototype.PlayAni = function () {
  183. cc.tween(this.gButton.node).to(this.aniTime, { scale: this.targetScale }).to(this.aniTime, { scale: this.scale }).union().repeatForever().start();
  184. };
  185. LongPressButton.prototype.StopAni = function () {
  186. cc.Tween.stopAllByTarget(this.gButton.node);
  187. this.gButton.node.scale = this.scale;
  188. };
  189. // 是否处于点击状态
  190. LongPressButton.prototype.IsClickState = function () {
  191. return this.bClick;
  192. };
  193. // 是否处于点击状态
  194. LongPressButton.prototype.IsLongClickState = function () {
  195. return this.bLongPress;
  196. };
  197. __decorate([
  198. property(cc.Float)
  199. ], LongPressButton.prototype, "timerInterval", void 0);
  200. LongPressButton = __decorate([
  201. ccclass
  202. ], LongPressButton);
  203. return LongPressButton;
  204. }(cc.Component));
  205. exports.default = LongPressButton;
  206. cc._RF.pop();
  207. }
  208. if (nodeEnv) {
  209. __define(__module.exports, __require, __module);
  210. }
  211. else {
  212. __quick_compile_project__.registerModuleFunc(__filename, function () {
  213. __define(__module.exports, __require, __module);
  214. });
  215. }
  216. })();
  217. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0cy9zY3JpcHQvdXRpbHMvTG9uZ1ByZXNzQnV0dG9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1EQUFrRDtBQUNsRCx1REFBcUQ7QUFDckQsZ0RBQTJDO0FBWXJDLElBQUEsS0FBc0IsRUFBRSxDQUFDLFVBQVUsRUFBbEMsT0FBTyxhQUFBLEVBQUUsUUFBUSxjQUFpQixDQUFDO0FBRTFDO0lBQTZDLG1DQUFZO0lBQXpEO1FBQUEscUVBK0tDO1FBN0tHLG1CQUFhLEdBQVUsR0FBRyxDQUFDLENBQUMsZ0JBQWdCO1FBS3JDLGNBQVEsR0FBVSxDQUFDLENBQUMsQ0FBQyxRQUFRO1FBQzVCLGNBQVEsR0FBVSxDQUFDLENBQUM7UUFDcEIsZ0JBQVUsR0FBVyxLQUFLLENBQUMsQ0FBQyxTQUFTO1FBQ3JDLFdBQUssR0FBVyxLQUFLLENBQUM7UUFDdEIsZ0JBQVUsR0FBVyxLQUFLLENBQUM7UUFDM0IsWUFBTSxHQUFXLEtBQUssQ0FBQztRQU92Qix1QkFBaUIsR0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTOztJQTRKdkQsQ0FBQztJQTFKRyxzQkFBSSw2Q0FBZ0I7YUFHcEI7WUFDSSxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUNsQyxDQUFDO2FBTEQsVUFBcUIsZUFBdUI7WUFDeEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGVBQWUsQ0FBQztRQUM3QyxDQUFDOzs7T0FBQTtJQUtTLGtDQUFRLEdBQWxCO1FBQ0ksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVE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LE9BQU87T0FDYSxlQUFlLENBK0tuQztJQUFELHNCQUFDO0NBL0tELEFBK0tDLENBL0s0QyxFQUFFLENBQUMsU0FBUyxHQStLeEQ7a0JBL0tvQixlQUFlIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2FtZU1ldGhvZCB9IGZyb20gXCIuLi9jb21tb24vZ2FtZU1ldGhvZFwiO1xuaW1wb3J0IHsgVXNlckV2ZW50IH0gZnJvbSBcIi4uL2RhdGEvY29uc3QvRXZlbnRDb25zdFwiO1xuaW1wb3J0IEV2ZW50TW5nIGZyb20gXCIuLi9tYW5hZ2VyL0V2ZW50TW5nXCI7XG5cblxuZXhwb3J0IGludGVyZmFjZSBMb25nUHJlc3NCdXR0b25QYXJhbSB7XG5cdHNjYWxlPzogbnVtYmVyO1xuICAgIGFuaVRpbWU/Om51bWJlcjtcblx0Z0J1dHRvbj86Zmd1aS5HQnV0dG9uO1xuICAgIGJQYWx5QW5pPzpib29sZWFuO1xuXHRjYWxsYmFja0Z1bmM/OihiRW5kOmJvb2xlYW4sYkdyYXk6Ym9vbGVhbixiTG9uZ1ByZXNzPzpib29sZWFuKT0+dm9pZDtcbiAgICBncmF5Q2xpY2tDYWxsYmFjaz86KCk9PnZvaWRcbn1cblxuY29uc3Qge2NjY2xhc3MsIHByb3BlcnR5fSA9IGNjLl9kZWNvcmF0b3I7XG5AY2NjbGFzc1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1ByZXNzQnV0dG9uIGV4dGVuZHMgY2MuQ29tcG9uZW50IHtcbiAgICBAcHJvcGVydHkoY2MuRmxvYXQpXG4gICAgdGltZXJJbnRlcnZhbDpudW1iZXIgPSAwLjI7IC8v6K6+572u6ZW/5oyJ55qE6Ze06ZqU77yM6buY6K6kMC4y56eSXG5cbiAgICBjYWxsYmFja0Z1bmM6KGJFbmQ6Ym9vbGVhbixiR3JheTpib29sZWFuLGJMb25nUHJlc3M/OmJvb2xlYW4pPT52b2lkIDsgLy8g6ZW/5oyJ5oyJ6ZKu55qE5Zue6LCD5Ye95pWwXG4gICAgZ3JheUNsaWNrQ2FsbGJhY2s6KCk9PnZvaWQ7XG5cbiAgICBwdWJsaWMga2VlcFRpbWU6bnVtYmVyID0gMDsgLy/lvZPmrKHplb/mjInml7bplb9cbiAgICBwcml2YXRlIHBhc3NUaW1lOm51bWJlciA9IDA7XG4gICAgcHJpdmF0ZSBiTG9uZ1ByZXNzOmJvb2xlYW4gPSBmYWxzZTsgLy8g5piv5ZCm6ZW/5oyJ54q25oCBXG4gICAgcHJpdmF0ZSBiR3JheTpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBiSW50ZXJydXB0OmJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGJDbGljazpib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBnQnV0dG9uOmZndWkuR0J1dHRvbjtcbiAgICBwcml2YXRlIHNjYWxlOm51bWJlcjtcbiAgICBwcml2YXRlIHRhcmdldFNjYWxlOm51bWJlcjtcbiAgICBwcml2YXRlIGFuaVRpbWU6bnVtYmVyO1xuICAgIHByaXZhdGUgYlBhbHlBbmk6Ym9vbGVhbjsgIC8vIOaYr+WQpuaSreaUvumVv+aMieWKqOeUu1xuICAgIHByaXZhdGUgYkNhbGxiYWNrOmJvb2xlYW47IC8vIOS4reaWreS6i+S7tuaYr+WQpumcgOimgeWbnuiwg+ebuOW6lFxuICAgIHByaXZhdGUgX0lzQWxsb3dsb25nUHJlc3M6Ym9vbGVhbiA9IHRydWU7IC8vIOaYr+WQpuWFgeiuuOmVv+aMiVxuXG4gICAgc2V0IElzQWxsb3dsb25nUHJlc3MoYkFsbG93bG9uZ1ByZXNzOmJvb2xlYW4pe1xuICAgICAgICB0aGlzLl9Jc0FsbG93bG9uZ1ByZXNzID0gYkFsbG93bG9uZ1ByZXNzO1xuICAgIH1cbiAgICBnZXQgSXNBbGxvd2xvbmdQcmVzcygpe1xuICAgICAgICByZXR1cm4gdGhpcy5fSXNBbGxvd2xvbmdQcmVzcztcbiAgICB9XG4gICAgXG4gICAgcHJvdGVjdGVkIG9uRW5hYmxlKCkge1xuICAgICAgICB0aGlzLm5vZGUub24oZmd1aS5FdmVudC5UT1VDSF9CRUdJTiwgdGhpcy5vblRvdWNoU3RhcnQsIHRoaXMpO1xuICAgICAgICB0aGlzLm5vZGUub24oZmd1aS5FdmVudC5UT1VDSF9NT1ZFLCB0aGlzLm9uVG91Y2hNb3ZlLCB0aGlzKTtcbiAgICAgICAgdGhpcy5ub2RlLm9uKGZndWkuRXZlbnQuVE9VQ0hfRU5ELCB0aGlzLm9uVG91Y2hFbmQsIHRoaXMpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkRpc2FibGUoKSB7XG4gICAgICAgIC8vIOa4heeQhuS6i+S7tuebkeWQrFxuICAgICAgICB0aGlzLm5vZGUub2ZmKGZndWkuRXZlbnQuVE9VQ0hfQkVHSU4sIHRoaXMub25Ub3VjaFN0YXJ0LCB0aGlzKTtcbiAgICAgICAgdGhpcy5ub2RlLm9mZihmZ3VpLkV2ZW50LlRPVUNIX01PVkUsIHRoaXMub25Ub3VjaE1vdmUsIHRoaXMpO1xuICAgICAgICB0aGlzLm5vZGUub2ZmKGZndWkuRXZlbnQuVE9VQ0hfRU5ELCB0aGlzLm9uVG91Y2hFbmQsIHRoaXMpO1xuICAgICAgICBFdmVudE1uZy5lbWl0KFVzZXJFdmVudC5CVE5UT1VDSERJU0FCTEUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbmNoYW5nZVN0YXRlKGJHcmF5OmJvb2xlYW4pe1xuICAgICAgICBpZiAoYkdyYXkgJiYgdGhpcy5iR3JheSAhPSBiR3JheSl7XG4gICAgICAgICAgICBpZiAodGhpcy5iQ2xpY2sgJiYgdGhpcy5ncmF5Q2xpY2tDYWxsYmFjayl7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmF5Q2xpY2tDYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5iR3JheSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnVuc2NoZWR1bGUodGhpcy5sb25nUHJlc3NEb3duKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJUaW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iR3JheSA9IGJHcmF5O1xuICAgIH1cblxuICAgIC8vIOmVv+aMieS6i+S7tlxuXHRwcml2YXRlIGxvbmdQcmVzc0Rvd24oKSB7XG4gICAgICAgIHRoaXMuYkxvbmdQcmVzcyA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmJQYWx5QW5pKXtcbiAgICAgICAgICAgIHRoaXMuU2hvd0FuaSgpO1xuICAgICAgICB9XG4gICAgfVxuIFxuICAgIHByaXZhdGUgb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmJHcmF5KXtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyYXlDbGlja0NhbGxiYWNrKXtcbiAgICAgICAgICAgICAgICB0aGlzLmdyYXlDbGlja0NhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iQ2xpY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhc3NUaW1lID0gMDtcbiAgICAgICAgdGhpcy5rZWVwVGltZSA9IDBcbiAgICAgICAgdGhpcy5iSW50ZXJydXB0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkNhbGxiYWNrID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLnVuc2NoZWR1bGUodGhpcy5sb25nUHJlc3NEb3duKTtcbiAgICAgICAgaWYgKHRoaXMuX0lzQWxsb3dsb25nUHJlc3Mpe1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU9uY2UodGhpcy5sb25nUHJlc3NEb3duLDAuMilcbiAgICAgICAgfVxuICAgIH1cbiBcbiAgICBwcml2YXRlIG9uVG91Y2hNb3ZlKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmJMb25nUHJlc3MgJiYgIWdhbWVNZXRob2QuaXNFbXB0eSh0aGlzLmdCdXR0b24pKXtcbiAgICAgICAgICAgIC8vIOS9v+eUqGhpdFRlc3Tmlrnms5XliKTmlq3op6bmkbjngrnmmK/lkKblnKjnu4Tku7bojIPlm7TlhoVcbiAgICAgICAgICAgIGlmICghdGhpcy5nQnV0dG9uLmhpdFRlc3QoZXZlbnQucG9zKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub3VjaEVuZChudWxsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJJbnRlcnJ1cHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuIFxuICAgIHByaXZhdGUgb25Ub3VjaEVuZChldmVudCkge1xuICAgICAgICBpZiAodGhpcy5iSW50ZXJydXB0KXtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Lit5pat5LqL5Lu277yM5LiN5Zyo55u45bqUXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudW5zY2hlZHVsZSh0aGlzLmxvbmdQcmVzc0Rvd24pO1xuICAgICAgICB0aGlzLmNsZWFyVGltZSgpO1xuICAgICAgICBFdmVudE1uZy5lbWl0KFVzZXJFdmVudC5CVE5UT1VDSEVORCk7XG4gICAgfVxuXG4gICAgdXBkYXRlKGR0KSB7XG4gICAgICAgIHRoaXMucGFzc1RpbWUgKz0gZHQ7XG4gICAgICAgIHRoaXMua2VlcFRpbWUgKz0gZHRcbiAgICAgICAgLy8g6Kem5pG46K6h5pe2XG4gICAgICAgIGlmICh0aGlzLmJMb25nUHJlc3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhc3NUaW1lID4gdGhpcy50aW1lckludGVydmFsKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUxvbmdQcmVzcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXNzVGltZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHVibGljIGNsZWFyVGltZSgpe1xuICAgICAgICBpZiAodGhpcy5iQ2xpY2sgJiYgdGhpcy5iQ2FsbGJhY2spe1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVMb25nUHJlc3ModHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXNzVGltZSA9IDA7XG4gICAgICAgIHRoaXMua2VlcFRpbWUgPSAwXG4gICAgICAgIHRoaXMuYkxvbmdQcmVzcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJDbGljayA9IGZhbHNlO1xuICAgICAgICB0aGlzLlN0b3BBbmkoKTtcbiAgICB9XG5cbiAgICAvLyDplb/mjInkuovku7blm57osINcbiAgICBwcml2YXRlIGhhbmRsZUxvbmdQcmVzcyhiRW5kOmJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2tGdW5jICYmICF0aGlzLmJHcmF5KXtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tGdW5jKGJFbmQsdGhpcy5iR3JheSx0aGlzLmJMb25nUHJlc3MpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldENhbGxiYWNrKGNhbGxiYWNrRnVuYzooYkVuZDpib29sZWFuLGJHcmF5OmJvb2xlYW4pPT52b2lkLGdCdXR0b24/OmZndWkuR0J1dHRvbixncmF5Q2xpY2tDYWxsYmFjaz86KCk9PnZvaWQpe1xuICAgICAgICB0aGlzLmNhbGxiYWNrRnVuYyA9IGNhbGxiYWNrRnVuYztcbiAgICAgICAgdGhpcy5ncmF5Q2xpY2tDYWxsYmFjayA9IGdyYXlDbGlja0NhbGxiYWNrO1xuICAgICAgICB0aGlzLmdCdXR0b24gPSBnQnV0dG9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBTZXRMb25nRGF0YShkYXRhOkxvbmdQcmVzc0J1dHRvblBhcmFtKXtcbiAgICAgICAgdGhpcy5jYWxsYmFja0Z1bmMgPSBkYXRhPy5jYWxsYmFja0Z1bmM7XG4gICAgICAgIHRoaXMuZ3JheUNsaWNrQ2FsbGJhY2sgPSBkYXRhPy5ncmF5Q2xpY2tDYWxsYmFjaztcbiAgICAgICAgdGhpcy5nQnV0dG9uID0gZGF0YT8uZ0J1dHRvbjtcbiAgICAgICAgdGhpcy5zY2FsZSA9IGRhdGE/LnNjYWxlIHx8IDE7XG4gICAgICAgIHRoaXMudGFyZ2V0U2NhbGUgPSB0aGlzLnNjYWxlICogMC45O1xuICAgICAgICB0aGlzLmFuaVRpbWUgPSBkYXRhPy5hbmlUaW1lIHx8IDAuMTU7XG4gICAgICAgIHRoaXMuYlBhbHlBbmkgPSBkYXRhPy5iUGFseUFuaSB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW50ZXJydXB0KGJDYWxsYmFjazpib29sZWFuID0gdHJ1ZSl7XG4gICAgICAgIHRoaXMuYkNhbGxiYWNrID0gYkNhbGxiYWNrO1xuICAgICAgICB0aGlzLnBhc3NUaW1lID0gMDtcbiAgICAgICAgdGhpcy5rZWVwVGltZSA9IDBcbiAgICAgICAgdGhpcy5iTG9uZ1ByZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYkNsaWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuU3RvcEFuaSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBTaG93QW5pKCl7XG4gICAgICAgIHRoaXMuU3RvcEFuaSgpO1xuICAgICAgICB0aGlzLlBsYXlBbmkoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBQbGF5QW5pKCl7XG4gICAgICAgIGNjLnR3ZWVuKHRoaXMuZ0J1dHRvbi5ub2RlKS50byh0aGlzLmFuaVRpbWUse3NjYWxlOnRoaXMudGFyZ2V0U2NhbGV9KS50byh0aGlzLmFuaVRpbWUse3NjYWxlOnRoaXMuc2NhbGV9KS51bmlvbigpLnJlcGVhdEZvcmV2ZXIoKS5zdGFydCgpO1xuICAgIH1cbiAgICBwcml2YXRlIFN0b3BBbmkoKXtcbiAgICAgICAgY2MuVHdlZW4uc3RvcEFsbEJ5VGFyZ2V0KHRoaXMuZ0J1dHRvbi5ub2RlKVxuICAgICAgICB0aGlzLmdCdXR0b24ubm9kZS5zY2FsZSA9IHRoaXMuc2NhbGU7XG4gICAgfVxuICAgIC8vIOaYr+WQpuWkhOS6jueCueWHu+eKtuaAgVxuICAgIHB1YmxpYyBJc0NsaWNrU3RhdGUoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuYkNsaWNrO1xuICAgIH1cbiAgICAvLyDmmK/lkKblpITkuo7ngrnlh7vnirbmgIFcbiAgICBwdWJsaWMgSXNMb25nQ2xpY2tTdGF0ZSgpe1xuICAgICAgICByZXR1cm4gdGhpcy5iTG9uZ1ByZXNzO1xuICAgIH1cbn0iXX0=