difenduandada
2024-12-31 34abe6963b344c882358274957f4b992456fee40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
 
                (function() {
                    var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
                    var __module = nodeEnv ? module : {exports:{}};
                    var __filename = 'preview-scripts/assets/Scripts/common/viewclass.js';
                    var __require = nodeEnv ? function (request) {
                        return cc.require(request);
                    } : function (request) {
                        return __quick_compile_project__.require(request, __filename);
                    };
                    function __define (exports, require, module) {
                        if (!nodeEnv) {__quick_compile_project__.registerModule(__filename, module);}"use strict";
cc._RF.push(module, 'd63b5L717NIk7RrUbhm1PXP', 'viewclass');
// Scripts/common/viewclass.js
 
"use strict";
 
var LoaderManager = require("loadermanager");
 
window.ViewClass = cc.Class({
  "extends": BaseClass,
  ctor: function ctor() {
    this.active_status = true;
    this.base_view_event_list = {};
    this.res_list = {};
    this.update_timers = {};
    this.parent = null;
    this.ticks = {};
    this.rleasePrefab = true;
  },
 
  /**
   * 递归获取子节点
   * @Author   Zhx
   * @DateTime 2017-12-06
   * @param    {[type]}   parent 父节点
   * @param    {[type]}   uiName 子节点名称
   * @return   {[type]}          [description]
   */
  seekChild: function seekChild(parent, uiName, component) {
    if (!parent || !(typeof parent == "string") && !(parent instanceof cc.Node)) return;
 
    if (typeof parent == "string") {
      if (uiName && cc.js.isChildClassOf(uiName, cc.Component)) component = uiName;
      uiName = parent;
      parent = this.root_wnd;
    }
 
    if (uiName && cc.js.isChildClassOf(uiName, cc.Component)) component = uiName;
    if (parent.name === uiName) return parent;
    var childrens = parent.getChildren();
 
    for (var index in childrens) {
      var resultNode = this.seekChild(childrens[index], uiName, component);
 
      if (resultNode) {
        if (component) return resultNode.getComponent(component);
        return resultNode;
      }
    }
  },
  // 加载资源
  loadRes: function loadRes(path, callback) {
    if (this.res_list[path]) {
      if (this.root_wnd && this.root_wnd.isValid) {
        callback(this.res_list[path]);
      } else {
        console.log("节点已销毁", this.prefabPath);
      }
 
      return;
    } else {
      LoaderManager.getInstance().loadRes(path, function (res_object) {
        if (!this.isCache && (this.is_close || this["delete"])) {
          return;
        }
 
        if (!(res_object instanceof cc.Node)) this.res_list[path] = res_object;
 
        if (this.root_wnd && this.root_wnd.isValid) {
          callback(res_object);
        } else {
          console.log("节点已销毁", this.prefabPath);
        }
      }.bind(this));
    }
  },
  setParent: function setParent(parent) {
    this.parent = parent;
  },
  deleteMe: function deleteMe() {
    // this.iss
    cc.log("deleteMe", this.prefabPath);
    this.removeGlobalEvent();
 
    if (this.root_wnd && !this.isCache) {
      // this.root_wnd.destroyAllChildren();
      this.root_wnd.destroy();
      this.root_wnd = null;
    }
 
    if (this.mainloop_timer) gcore.Timer.del(this.mainloop_timer);
 
    for (var timer_i in this.update_timers) {
      if (this.update_timers[timer_i]) gcore.Timer.del(this.update_timers[timer_i]["timer"]);
      this.update_timers[timer_i] = null;
    } // LoaderManager.getInstance().deleteRes(this.prefabPath);
 
 
    for (var key in this.res_list) {
      LoaderManager.getInstance().releaseRes(key);
    }
 
    if (!this.isCache) {
      if (this.rleasePrefab) LoaderManager.getInstance().releasePrefab(this.prefabPath);
    }
  },
 
  /**
   * 添加通用监听事件
   * @param {*} eveny_type 
   * @param {*} callback 
   */
  addGlobalEvent: function addGlobalEvent(event_type, callback) {
    if (!event_type) return;
 
    if (!this.base_view_event_list[event_type]) {
      this.base_view_event_list[event_type] = gcore.GlobalEvent.bind(event_type, function () {
        if (callback) {
          for (var _len = arguments.length, value = new Array(_len), _key = 0; _key < _len; _key++) {
            value[_key] = arguments[_key];
          }
 
          callback.apply(this, value);
        }
      }.bind(this));
      return this.base_view_event_list[event_type];
    }
  },
  removeGlobalEvent: function removeGlobalEvent(event_hand) {
    if (!event_hand) {
      for (var key in this.base_view_event_list) {
        if (this.base_view_event_list[key]) gcore.GlobalEvent.unbind(this.base_view_event_list[key]);
      }
 
      this.base_view_event_list = null;
    } else {
      if (this.base_view_event_list[event_hand]) {
        gcore.GlobalEvent.unbind(this.base_view_event_list[event_hand]);
        delete this.base_view_event_list[event_hand];
      }
    }
  },
  startUpdate: function startUpdate(times, update_cb, interval) {
    times = times > 0 ? times : -1;
    interval = interval || 100;
 
    if (times > 0) {
      if (update_cb) {
        var timer_count = 0;
        var timer_index = null;
 
        for (var timer_i in this.update_timers) {
          if (!this.update_timers[timer_i]) {
            timer_index = timer_i;
            break;
          }
 
          timer_count += 1;
        }
 
        if (!timer_index) timer_index = "udpatetimer_" + timer_count;
        this.update_timers[timer_index] = {};
        this.update_timers[timer_index]["finish"] = 0;
        this.update_timers[timer_index]["times"] = times;
        this.update_timers[timer_index]["timer"] = gcore.Timer.set(function (callback, timer_index) {
          if (callback) callback(this.update_timers[timer_index]["finish"]);
 
          if (this.update_timers[timer_index]) {
            this.update_timers[timer_index]["finish"] += 1;
 
            if (this.update_timers[timer_index]["finish"] == this.update_timers[timer_index]["times"]) {
              gcore.Timer.del(this.update_timers[timer_index]["timer"]);
              this.update_timers[timer_index] = null;
            }
          }
        }.bind(this, update_cb, timer_index), interval, times);
        return this.update_timers[timer_index]["timer"];
      }
    } else {
      if (!this.mainloop_timer) {
        this.mainloop_timer = gcore.Timer.set(function () {
          if (this.update) this.update(200 / 1000);
        }.bind(this), 200, -1);
        return this.mainloop_timer;
      }
    }
  },
  stopUpdate: function stopUpdate(timer_hander) {
    if (timer_hander) {
      for (var timer_i in this.update_timers) {
        if (this.update_timers[timer_i] && this.update_timers[timer_i]["timer"] === timer_hander) {
          gcore.Timer.del(this.update_timers[timer_i]["timer"]);
          this.update_timers[timer_i] = null;
        }
      }
    } else {
      if (this.mainloop_timer) {
        gcore.Timer.del(this.mainloop_timer);
        this.mainloop_timer = null;
      }
    }
  },
  isOpen: function isOpen() {
    if (this.root_wnd && this.root_wnd.active) return true;
    return false;
  },
  addTicket: function addTicket(cf, interval, index) {
    interval = typeof parseInt(interval) == "number" ? interval * 1000 : 0;
    var tick_id = gcore.Timer.set(function (cb) {
      if (cb) cb();
    }.bind(this, cf), interval, 1);
    if (index) this.ticks[index] = tick_id;
  },
  delTicker: function delTicker(index) {
    if (this.ticks[index]) {
      gcore.Timer.del(this.ticks[index]);
      delete this.ticks[index];
    }
  },
  hasTicket: function hasTicket(index) {
    return !!this.ticks[index];
  },
  seekChildByTag: function seekChildByTag(parent, tag) {
    if (!parent) return;
 
    if (parent.ui_tag === tag) {
      return parent;
    }
 
    var childrens = parent.getChildren();
 
    for (var index in childrens) {
      var resultNode = this.seekChildByTag(childrens[index], tag);
      if (resultNode) return resultNode;
    }
  }
});
 
cc._RF.pop();
                    }
                    if (nodeEnv) {
                        __define(__module.exports, __require, __module);
                    }
                    else {
                        __quick_compile_project__.registerModuleFunc(__filename, function () {
                            __define(__module.exports, __require, __module);
                        });
                    }
                })();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcY29tbW9uXFx2aWV3Y2xhc3MuanMiXSwibmFtZXMiOlsiTG9hZGVyTWFuYWdlciIsInJlcXVpcmUiLCJ3aW5kb3ciLCJWaWV3Q2xhc3MiLCJjYyIsIkNsYXNzIiwiQmFzZUNsYXNzIiwiY3RvciIsImFjdGl2ZV9zdGF0dXMiLCJiYXNlX3ZpZXdfZXZlbnRfbGlzdCIsInJlc19saXN0IiwidXBkYXRlX3RpbWVycyIsInBhcmVudCIsInRpY2tzIiwicmxlYXNlUHJlZmFiIiwic2Vla0NoaWxkIiwidWlOYW1lIiwiY29tcG9uZW50IiwiTm9kZSIsImpzIiwiaXNDaGlsZENsYXNzT2YiLCJDb21wb25lbnQiLCJyb290X3duZCIsIm5hbWUiLCJjaGlsZHJlbnMiLCJnZXRDaGlsZHJlbiIsImluZGV4IiwicmVzdWx0Tm9kZSIsImdldENvbXBvbmVudCIsImxvYWRSZXMiLCJwYXRoIiwiY2FsbGJhY2siLCJpc1ZhbGlkIiwiY29uc29sZSIsImxvZyIsInByZWZhYlBhdGgiLCJnZXRJbnN0YW5jZSIsInJlc19vYmplY3QiLCJpc0NhY2hlIiwiaXNfY2xvc2UiLCJiaW5kIiwic2V0UGFyZW50IiwiZGVsZXRlTWUiLCJyZW1vdmVHbG9iYWxFdmVudCIsImRlc3Ryb3kiLCJtYWlubG9vcF90aW1lciIsImdjb3JlIiwiVGltZXIiLCJkZWwiLCJ0aW1lcl9pIiwia2V5IiwicmVsZWFzZVJlcyIsInJlbGVhc2VQcmVmYWIiLCJhZGRHbG9iYWxFdmVudCIsImV2ZW50X3R5cGUiLCJHbG9iYWxFdmVudCIsInZhbHVlIiwiYXBwbHkiLCJldmVudF9oYW5kIiwidW5iaW5kIiwic3RhcnRVcGRhdGUiLCJ0aW1lcyIsInVwZGF0ZV9jYiIsImludGVydmFsIiwidGltZXJfY291bnQiLCJ0aW1lcl9pbmRleCIsInNldCIsInVwZGF0ZSIsInN0b3BVcGRhdGUiLCJ0aW1lcl9oYW5kZXIiLCJpc09wZW4iLCJhY3RpdmUiLCJhZGRUaWNrZXQiLCJjZiIsInBhcnNlSW50IiwidGlja19pZCIsImNiIiwiZGVsVGlja2VyIiwiaGFzVGlja2V0Iiwic2Vla0NoaWxkQnlUYWciLCJ0YWciLCJ1aV90YWciXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsYUFBYSxHQUFHQyxPQUFPLENBQUMsZUFBRCxDQUEzQjs7QUFDQUMsTUFBTSxDQUFDQyxTQUFQLEdBQW1CQyxFQUFFLENBQUNDLEtBQUgsQ0FBUztBQUN4QixhQUFTQyxTQURlO0FBR3hCQyxFQUFBQSxJQUFJLEVBQUUsZ0JBQVc7QUFDYixTQUFLQyxhQUFMLEdBQXFCLElBQXJCO0FBQ0EsU0FBS0Msb0JBQUwsR0FBNEIsRUFBNUI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsU0FBS0MsYUFBTCxHQUFxQixFQUFyQjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxJQUFkO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLEVBQWI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLElBQXBCO0FBQ0gsR0FYdUI7O0FBYXhCOzs7Ozs7OztBQVFBQyxFQUFBQSxTQUFTLEVBQUUsbUJBQVNILE1BQVQsRUFBaUJJLE1BQWpCLEVBQXlCQyxTQUF6QixFQUFvQztBQUMzQyxRQUFJLENBQUNMLE1BQUQsSUFBWSxFQUFFLE9BQU9BLE1BQVAsSUFBaUIsUUFBbkIsS0FBZ0MsRUFBRUEsTUFBTSxZQUFZUixFQUFFLENBQUNjLElBQXZCLENBQWhELEVBQStFOztBQUUvRSxRQUFJLE9BQU9OLE1BQVAsSUFBaUIsUUFBckIsRUFBK0I7QUFDM0IsVUFBSUksTUFBTSxJQUFJWixFQUFFLENBQUNlLEVBQUgsQ0FBTUMsY0FBTixDQUFxQkosTUFBckIsRUFBNkJaLEVBQUUsQ0FBQ2lCLFNBQWhDLENBQWQsRUFDSUosU0FBUyxHQUFHRCxNQUFaO0FBQ0pBLE1BQUFBLE1BQU0sR0FBR0osTUFBVDtBQUNBQSxNQUFBQSxNQUFNLEdBQUcsS0FBS1UsUUFBZDtBQUNIOztBQUVELFFBQUlOLE1BQU0sSUFBS1osRUFBRSxDQUFDZSxFQUFI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QWxCLEVBQTZCO0FBQ3pCLFVBQUlHLFVBQVUsR0FBRyxLQUFLb0QsY0FBTCxDQUFvQnZELFNBQVMsQ0FBQ0UsS0FBRCxDQUE3QixFQUFzQ3NELEdBQXRDLENBQWpCO0FBQ0EsVUFBSXJELFVBQUosRUFBZ0IsT0FBT0EsVUFBUDtBQUNuQjtBQUNKO0FBN091QixDQUFULENBQW5CIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgTG9hZGVyTWFuYWdlciA9IHJlcXVpcmUoXCJsb2FkZXJtYW5hZ2VyXCIpO1xyXG53aW5kb3cuVmlld0NsYXNzID0gY2MuQ2xhc3Moe1xyXG4gICAgZXh0ZW5kczogQmFzZUNsYXNzLFxyXG5cclxuICAgIGN0b3I6IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlX3N0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5iYXNlX3ZpZXdfZXZlbnRfbGlzdCA9IHt9O1xyXG4gICAgICAgIHRoaXMucmVzX2xpc3QgPSB7fTtcclxuICAgICAgICB0aGlzLnVwZGF0ZV90aW1lcnMgPSB7fTtcclxuICAgICAgICB0aGlzLnBhcmVudCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy50aWNrcyA9IHt9O1xyXG4gICAgICAgIHRoaXMucmxlYXNlUHJlZmFiID0gdHJ1ZTtcclxuICAgIH0sXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiDpgJLlvZLojrflj5blrZDoioLngrlcclxuICAgICAqIEBBdXRob3IgICBaaHhcclxuICAgICAqIEBEYXRlVGltZSAyMDE3LTEyLTA2XHJcbiAgICAgKiBAcGFyYW0gICAge1t0eXBlXX0gICBwYXJlbnQg54i26IqC54K5XHJcbiAgICAgKiBAcGFyYW0gICAge1t0eXBlXX0gICB1aU5hbWUg5a2Q6IqC54K55ZCN56ewXHJcbiAgICAgKiBAcmV0dXJuICAge1t0eXBlXX0gICAgICAgICAgW2Rlc2NyaXB0aW9uXVxyXG4gICAgICovXHJcbiAgICBzZWVrQ2hpbGQ6IGZ1bmN0aW9uKHBhcmVudCwgdWlOYW1lLCBjb21wb25lbnQpIHtcclxuICAgICAgICBpZiAoIXBhcmVudCB8fCAoISh0eXBlb2YgcGFyZW50ID09IFwic3RyaW5nXCIpICYmICEocGFyZW50IGluc3RhbmNlb2YgY2MuTm9kZSkpKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50ID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgaWYgKHVpTmFtZSAmJiBjYy5qcy5pc0NoaWxkQ2xhc3NPZih1aU5hbWUsIGNjLkNvbXBvbmVudCkpXHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSB1aU5hbWU7IFxyXG4gICAgICAgICAgICB1aU5hbWUgPSBwYXJlbnQ7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IHRoaXMucm9vdF93bmQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodWlOYW1lICYmIChjYy5qcy5pc0NoaWxkQ2xhc3NPZih1aU5hbWUsIGNjLkNvbXBvbmVudCkpKVxyXG4gICAgICAgICAgICBjb21wb25lbnQgPSB1aU5hbWU7XHJcbiAgICAgICAgaWYgKHBhcmVudC5uYW1lID09PSB1aU5hbWUpXHJcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XHJcblxyXG4gICAgICAgIHZhciBjaGlsZHJlbnMgPSBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTtcclxuICAgICAgICBmb3IgKHZhciBpbmRleCBpbiBjaGlsZHJlbnMpIHtcclxuICAgICAgICAgICAgdmFyIHJlc3VsdE5vZGUgPSB0aGlzLnNlZWtDaGlsZChjaGlsZHJlbnNbaW5kZXhdLCB1aU5hbWUsIGNvbXBvbmVudCk7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHROb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50KSByZXR1cm4gcmVzdWx0Tm9kZS5nZXRDb21wb25lbnQoY29tcG9uZW50KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHROb2RlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICAvLyDliqDovb3otYTmupBcclxuICAgIGxvYWRSZXM6ZnVuY3Rpb24ocGF0aCwgY2FsbGJhY2spe1xyXG4gICAgICAgIGlmKHRoaXMucmVzX2xpc3RbcGF0aF0pe1xyXG4gICAgICAgICAgICBpZih0aGlzLnJvb3Rfd25kICYmIHRoaXMucm9vdF93bmQuaXNWYWxpZCl7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh0aGlzLnJlc19saXN0W3BhdGhdKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6IqC54K55bey6ZSA5q+BXCIsdGhpcy5wcmVmYWJQYXRoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5sb2FkUmVzKHBhdGgsZnVuY3Rpb24ocmVzX29iamVjdCl7XHJcbiAgICAgICAgICAgICAgICBpZighdGhpcy5pc0NhY2hlICYmICh0aGlzLmlzX2Nsb3NlIHx8IHRoaXMuZGVsZXRlKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCEocmVzX29iamVjdCBpbnN0YW5jZW9mIGNjLk5vZGUpKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzX2xpc3RbcGF0aF0gPSByZXNfb2JqZWN0XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMucm9vdF93bmQgJiYgdGhpcy5yb290X3duZC5pc1ZhbGlkKXtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhyZXNfb2JqZWN0KVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLoioLngrnlt7LplIDmr4FcIix0aGlzLnByZWZhYlBhdGgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSkgICAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHNldFBhcmVudDogZnVuY3Rpb24ocGFyZW50KSB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlbGV0ZU1lOiBmdW5jdGlvbigpIHtcclxuICAgICAgICAvLyB0aGlzLmlzc1xyXG4gICAgICAgIGNjLmxvZyhcImRlbGV0ZU1lXCIsdGhpcy5wcmVmYWJQYXRoKVxyXG4gICAgICAgIHRoaXMucmVtb3ZlR2xvYmFsRXZlbnQoKTtcclxuICAgICAgICBpZih0aGlzLnJvb3Rfd25kICYmICF0aGlzLmlzQ2FjaGUpe1xyXG4gICAgICAgICAgICAvLyB0aGlzLnJvb3Rfd25kLmRlc3Ryb3lBbGxDaGlsZHJlbigpO1xyXG4gICAgICAgICAgICB0aGlzLnJvb3Rfd25kLmRlc3Ryb3koKTtcclxuICAgICAgICAgICAgdGhpcy5yb290X3duZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5tYWlubG9vcF90aW1lcilcclxuICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMubWFpbmxvb3BfdGltZXIpO1xyXG5cclxuICAgICAgICBmb3IgKHZhciB0aW1lcl9pIGluIHRoaXMudXBkYXRlX3RpbWVycyl7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaV0pXHJcbiAgICAgICAgICAgICAgICBnY29yZS5UaW1lci5kZWwodGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2ldW1widGltZXJcIl0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2ldID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIExvYWRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5kZWxldGVSZXModGhpcy5wcmVmYWJQYXRoKTtcclxuICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLnJlc19saXN0KXtcclxuICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VSZXMoa2V5KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzQ2FjaGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmxlYXNlUHJlZmFiKVxyXG4gICAgICAgICAgICAgICAgTG9hZGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VQcmVmYWIodGhpcy5wcmVmYWJQYXRoKTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICog5re75Yqg6YCa55So55uR5ZCs5LqL5Lu2XHJcbiAgICAgKiBAcGFyYW0geyp9IGV2ZW55X3R5cGUgXHJcbiAgICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrIFxyXG4gICAgICovXHJcbiAgICBhZGRHbG9iYWxFdmVudDogZnVuY3Rpb24gKGV2ZW50X3R5cGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKCFldmVudF90eXBlKSByZXR1cm5cclxuICAgICAgICBpZiAoIXRoaXMuYmFzZV92aWV3X2V2ZW50X2xpc3RbZXZlbnRfdHlwZV0pIHtcclxuICAgICAgICAgICAgdGhpcy5iYXNlX3ZpZXdfZXZlbnRfbGlzdFtldmVudF90eXBlXSA9IGdjb3JlLkdsb2JhbEV2ZW50LmJpbmQoZXZlbnRfdHlwZSwgKGZ1bmN0aW9uICguLi52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgdmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5iYXNlX3ZpZXdfZXZlbnRfbGlzdFtldmVudF90eXBlXTtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIHJlbW92ZUdsb2JhbEV2ZW50OmZ1bmN0aW9uKGV2ZW50X2hhbmQpe1xyXG4gICAgICAgIGlmICghZXZlbnRfaGFuZCkge1xyXG4gICAgICAgICAgICBmb3IodmFyIGtleSBpbiB0aGlzLmJhc2Vfdmlld19ldmVudF9saXN0KXtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJhc2Vfdmlld19ldmVudF9saXN0W2tleV0pXHJcbiAgICAgICAgICAgICAgICAgICAgZ2NvcmUuR2xvYmFsRXZlbnQudW5iaW5kKHRoaXMuYmFzZV92aWV3X2V2ZW50X2xpc3Rba2V5XSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5iYXNlX3ZpZXdfZXZlbnRfbGlzdCA9IG51bGw7ICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYmFzZV92aWV3X2V2ZW50X2xpc3RbZXZlbnRfaGFuZF0pIHtcclxuICAgICAgICAgICAgICAgIGdjb3JlLkdsb2JhbEV2ZW50LnVuYmluZCh0aGlzLmJhc2Vfdmlld19ldmVudF9saXN0W2V2ZW50X2hhbmRdKTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmJhc2Vfdmlld19ldmVudF9saXN0W2V2ZW50X2hhbmRdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzdGFydFVwZGF0ZTogZnVuY3Rpb24odGltZXMsIHVwZGF0ZV9jYiwgaW50ZXJ2YWwpIHtcclxuICAgICAgICB0aW1lcyA9IHRpbWVzID4gMCA/IHRpbWVzIDogLTE7XHJcbiAgICAgICAgaW50ZXJ2YWwgPSBpbnRlcnZhbCB8fCAxMDA7XHJcbiAgICAgICAgaWYgKHRpbWVzID4gMCkge1xyXG4gICAgICAgICAgICBpZiAodXBkYXRlX2NiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdGltZXJfY291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgdmFyIHRpbWVyX2luZGV4ID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHRpbWVyX2kgaW4gdGhpcy51cGRhdGVfdGltZXJzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaV0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXJfaW5kZXggPSB0aW1lcl9pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGltZXJfY291bnQgKz0gMTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoIXRpbWVyX2luZGV4KVxyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVyX2luZGV4ID0gXCJ1ZHBhdGV0aW1lcl9cIiArIHRpbWVyX2NvdW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaW5kZXhdID0ge307XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaW5kZXhdW1wiZmluaXNoXCJdID0gMDtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlX3RpbWVyc1t0aW1lcl9pbmRleF1bXCJ0aW1lc1wiXSA9IHRpbWVzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2luZGV4XVtcInRpbWVyXCJdID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uIChjYWxsYmFjaywgdGltZXJfaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2luZGV4XVtcImZpbmlzaFwiXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXBkYXRlX3RpbWVyc1t0aW1lcl9pbmRleF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2luZGV4XVtcImZpbmlzaFwiXSArPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2luZGV4XVtcImZpbmlzaFwiXSA9PSB0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaW5kZXhdW1widGltZXNcIl0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaW5kZXhdW1widGltZXJcIl0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2luZGV4XSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcywgdXBkYXRlX2NiLCB0aW1lcl9pbmRleCksIGludGVydmFsLCB0aW1lcyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVfdGltZXJzW3RpbWVyX2luZGV4XVtcInRpbWVyXCJdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm1haW5sb29wX3RpbWVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5sb29wX3RpbWVyID0gZ2NvcmUuVGltZXIuc2V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy51cGRhdGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKDIwMC8xMDAwKTtcclxuICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSwgMjAwLCAtMSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWlubG9vcF90aW1lcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgc3RvcFVwZGF0ZTogZnVuY3Rpb24odGltZXJfaGFuZGVyKSB7XHJcbiAgICAgICAgaWYgKHRpbWVyX2hhbmRlcikge1xyXG4gICAgICAgICAgICBmb3IgKHZhciB0aW1lcl9pIGluIHRoaXMudXBkYXRlX3RpbWVycykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudXBkYXRlX3RpbWVyc1t0aW1lcl9pXSAmJiB0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaV1bXCJ0aW1lclwiXSA9PT0gdGltZXJfaGFuZGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMudXBkYXRlX3RpbWVyc1t0aW1lcl9pXVtcInRpbWVyXCJdKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZV90aW1lcnNbdGltZXJfaV0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubWFpbmxvb3BfdGltZXIpIHtcclxuICAgICAgICAgICAgICAgIGdjb3JlLlRpbWVyLmRlbCh0aGlzLm1haW5sb29wX3RpbWVyKTsgICBcclxuICAgICAgICAgICAgICAgIHRoaXMubWFpbmxvb3BfdGltZXIgPSBudWxsOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgaXNPcGVuOiBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5yb290X3duZCAmJiB0aGlzLnJvb3Rfd25kLmFjdGl2ZSlcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlIFxyXG4gICAgfSwgXHJcblxyXG4gICAgYWRkVGlja2V0OiBmdW5jdGlvbihjZiwgaW50ZXJ2YWwsIGluZGV4KSB7XHJcbiAgICAgICAgaW50ZXJ2YWwgPSAodHlwZW9mIHBhcnNlSW50KGludGVydmFsKSA9PSBcIm51bWJlclwiKSA/IGludGVydmFsICogMTAwMCA6IDA7XHJcbiAgICAgICAgdmFyIHRpY2tfaWQgPSBnY29yZS5UaW1lci5zZXQoZnVuY3Rpb24oY2IpIHtcclxuICAgICAgICAgICAgaWYgKGNiKVxyXG4gICAgICAgICAgICAgICAgY2IoKTtcclxuICAgICAgICB9LmJpbmQodGhpcywgY2YpLCBpbnRlcnZhbCwgMSk7XHJcbiAgICAgICAgaWYgKGluZGV4KVxyXG4gICAgICAgICAgICB0aGlzLnRpY2tzW2luZGV4XSA9IHRpY2tfaWQ7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlbFRpY2tlcjogZnVuY3Rpb24oaW5kZXgpIHtcclxuICAgICAgICBpZiAodGhpcy50aWNrc1tpbmRleF0pIHtcclxuICAgICAgICAgICAgZ2NvcmUuVGltZXIuZGVsKHRoaXMudGlja3NbaW5kZXhdKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMudGlja3NbaW5kZXhdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9LFxyXG5cclxuICAgIGhhc1RpY2tldDogZnVuY3Rpb24oaW5kZXgpIHtcclxuICAgICAgICByZXR1cm4gISF0aGlzLnRpY2tzW2luZGV4XVxyXG4gICAgfSxcclxuXHJcblxyXG4gICAgc2Vla0NoaWxkQnlUYWc6IGZ1bmN0aW9uKHBhcmVudCwgdGFnKSB7XHJcbiAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybjtcclxuICAgICAgICBpZiAocGFyZW50LnVpX3RhZyA9PT0gdGFnKSB7ICAgICAgICAgIFxyXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgY2hpbGRyZW5zID0gcGFyZW50LmdldENoaWxkcmVuKCk7XHJcbiAgICAgICAgZm9yICh2YXIgaW5kZXggaW4gY2hpbGRyZW5zKSB7XHJcbiAgICAgICAgICAgIHZhciByZXN1bHROb2RlID0gdGhpcy5zZWVrQ2hpbGRCeVRhZyhjaGlsZHJlbnNbaW5kZXhdLCB0YWcpO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0Tm9kZSkgcmV0dXJuIHJlc3VsdE5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuXHJcbn0pIl19