|
(function() {
|
var nodeEnv = typeof require !== 'undefined' && typeof process !== 'undefined';
|
var __module = nodeEnv ? module : {exports:{}};
|
var __filename = 'preview-scripts/assets/Scripts/mod/battle/skill_act.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, 'eb4f3hW10xIfLrx+mcIDbw1', 'skill_act');
|
// Scripts/mod/battle/skill_act.js
|
|
"use strict";
|
|
// --------------------------------------------------------------------
|
// @author: shiraho@syg.com(必填, 创建模块的人员)
|
// @description:
|
// 战斗播报动作控制
|
// <br/>Create: new Date().toISOString()
|
// --------------------------------------------------------------------
|
var SkillAct = {
|
newPos2Gird: function newPos2Gird(pos, is_left, group, is_real) {
|
if (pos == 0 || pos == null) {
|
message("位置不能为0");
|
}
|
|
if (pos == 31 || pos == 32) {
|
//神器的特殊位置
|
pos = 10;
|
} else if (group == 2) {
|
pos = pos - GIRD_POS_OFFSET;
|
}
|
|
pos = pos - 1; // lua 和js的下表不同
|
|
pos = Math.max(0, pos);
|
|
if (is_left == true) {
|
return Pos2GridLeft[pos];
|
} else {
|
if (is_real) {
|
return Pos2GridRight[pos];
|
} else {
|
return NormalPosGridRight[pos];
|
}
|
}
|
},
|
gridSizeX: function gridSizeX() {
|
return SCREEN_WIDTH / 80;
|
},
|
gridSizeY: function gridSizeY() {
|
return SCREEN_HEIGHT / 80;
|
},
|
// 格子站位转化成场景站位
|
gridPosToScreenPos: function gridPosToScreenPos(pos) {
|
return cc.v2(pos.x * this.gridSizeX(), pos.y * this.gridSizeY());
|
},
|
// 场景坐标转换成格子坐标
|
screenPosToGridPos: function screenPosToGridPos(pos) {
|
return cc.v2(pos.x / this.gridSizeX(), pos.y / this.gridSizeY());
|
},
|
//普通开始回调
|
normalStart: function normalStart(attacker) {
|
return cc.callFunc(function () {
|
this.actStart(attacker);
|
}.bind(this));
|
},
|
//普通结束回调
|
normalFinish: function normalFinish(attacker) {
|
return cc.callFunc(function () {
|
this.actFinish(attacker);
|
}.bind(this));
|
},
|
actStart: function actStart(attacker) {
|
var model = require("battle_controller").getInstance().getModel();
|
|
model.actStart(attacker);
|
},
|
actFinish: function actFinish(attacker) {
|
var model = require("battle_controller").getInstance().getModel();
|
|
model.actFinish(attacker);
|
},
|
// 延迟动作处理
|
addDelay: function addDelay(attacker, delay_time, act, next_delay_time) {
|
if (delay_time == 0 || delay_time == null) {
|
if (next_delay_time == 0 || next_delay_time == null) {
|
return cc.sequence(this.normalStart(attacker), act, this.normalFinish(attacker));
|
} else {
|
return cc.sequence(this.normalStart(attacker), act, cc.delayTime(next_delay_time / 30), this.normalFinish(attacker));
|
}
|
} else {
|
if (next_delay_time == 0 || next_delay_time == null) {
|
return cc.sequence(this.normalStart(attacker), cc.delayTime(delay_time / 30), act, this.normalFinish(attacker));
|
} else {
|
return cc.sequence(this.normalStart(attacker), cc.delayTime(delay_time / 30), act, cc.delayTime(next_delay_time / 30), this.normalFinish(attacker));
|
}
|
}
|
},
|
// 近战攻击移动归位
|
handleAttackerMove: function handleAttackerMove(attacker, is_back) {
|
if (attacker == null || attacker.play_order_index == null || attacker.anime_res == null) {
|
return;
|
}
|
|
var model = require("battle_controller").getInstance().getModel();
|
|
var spine_name = attacker.spine_name;
|
var temp_config = null;
|
var act_config = Config.battle_act_data.data_info[spine_name];
|
|
if (attacker.play_action_name == null || act_config == null || act_config[attacker.anime_res] == null || act_config[attacker.anime_res][attacker.play_action_name] == null) {
|
temp_config = Config.battle_act_data.data_info[0]["action1"]["action1"];
|
} else {
|
temp_config = act_config[attacker.anime_res][attacker.play_action_name];
|
}
|
|
if (temp_config) {
|
if (is_back == true) {
|
model.moveBack(attacker, temp_config.back_delay_time, temp_config.back_move_time, temp_config.back_model_x, null, null, null, null, temp_config.is_move_map);
|
} else {
|
if (temp_config.shadow_time && temp_config.shadow_time != 0) {// 创建分身,暂时不处理了
|
}
|
|
if (temp_config.is_move_area == 1) {
|
model.moveToArea(attacker, temp_config);
|
} else {
|
model.moveTo(attacker, temp_config.move_delay_time, temp_config.move_time, temp_config.move_model_x, temp_config.move_model_y, null, null, 0, 0, temp_config.is_move_map, temp_config.is_reverse, temp_config.is_col_act);
|
}
|
}
|
}
|
},
|
// 具体移动步骤
|
move: function move(attacker, target_pos, delay_time, move_time) {
|
var model = require("battle_controller").getInstance().getModel();
|
|
if (attacker.is_die == false && model.getBuffTag(attacker) == true) {
|
attacker.runAction();
|
}
|
|
var move = cc.moveTo(move_time / 60, target_pos).easing(cc.easeExponentialOut());
|
return this.addDelay(attacker, delay_time, move);
|
},
|
|
/**
|
* 主角动作播放事件
|
* @param {*} attacker BattleRole
|
* @param {*} anima_name 动作名,不同于动作资源名,资源里面可能有多个动作
|
* @param {*} hit_callback
|
* @param {*} finish_callback
|
* @param {*} is_loop
|
* @param {*} is_reverse
|
* @param {*} attack_func
|
* @param {*} anima_res 动作资源名字
|
*/
|
setAnimationWithEvent: function setAnimationWithEvent(attacker, anima_name, hit_callback, finish_callback, is_loop, is_reverse, attack_func, anima_res) {
|
var model = require("battle_controller").getInstance().getModel();
|
|
var callFunc = cc.callFunc(function () {
|
var animationEventFunc = function (event_name) {
|
if (event_name == "hit" || event_name == "Hit" || event_name == "HIT") {
|
if (attacker.hit_time < attacker.hit_num && hit_callback) {
|
hit_callback();
|
attacker.hit_time += 1;
|
}
|
} else if (event_name == "back" || event_name == "Back" || event_name == "BACK") {
|
if (attacker.is_attack == anima_name) {
|
this.handleAttackerMove(attacker, true);
|
attacker.is_attack = null;
|
}
|
} else if (event_name == "attack") {
|
// 攻击点
|
if (attacker.in_area_effect) {
|
attacker.is_area_attack = true;
|
attacker.hit_time += 1;
|
model.areaHurt(attacker);
|
} else if (attack_func) {
|
attack_func();
|
}
|
|
model.attackPoint(attacker);
|
} else if (event_name == "hit_none") {
|
// 无伤害的受击动作
|
model.actHurt(attacker);
|
} else if (event_name == "hit_big") {
|
// 播放受击特效
|
model.actHurt(attacker, true);
|
} else if (event_name == "ready") {
|
// 远程子弹发射点,以及远程出手前动作
|
model.attackReady(attacker);
|
} else if (event_name == "shake_point") {
|
// 震屏点
|
model.playShakeScreen(attacker.shake_id);
|
} else if (event_name == "move") {
|
this.handleAttackerMove(attacker);
|
} else if (event_name.indexOf("hit_num") != -1) {// 多段攻击
|
}
|
}.bind(this);
|
|
var animationCompleteFunc = function (event_animation) {
|
if (event_animation == anima_name) {
|
if (attacker.hit_time < attacker.hit_num && hit_callback) {
|
hit_callback();
|
attacker.hit_time += 1;
|
}
|
|
if (finish_callback) {
|
finish_callback();
|
} else {
|
// 如果是群攻,直接播放完动作之后回到站立,不需要等特效
|
if (attacker.play_stand == 1) {
|
if (attacker.is_real) {
|
this.setAnimation(attacker, PlayerAction.battle_stand, true);
|
} else {
|
this.setAnimation(attacker, PlayerAction.run, true);
|
} // attacker.doStand()
|
|
}
|
|
attacker.is_area_attack = false;
|
this.actFinish(attacker);
|
}
|
|
attacker.setHallowsRound();
|
attacker.in_animation = false;
|
}
|
}.bind(this);
|
|
var callback = function callback() {
|
attacker.hit_time = 0;
|
attacker.hit_num = Math.max(1, attacker.split_hurt || 1); // attacker.current_anime = anima_name
|
// attacker.anima_name = anima_name;
|
|
attacker.in_animation = true;
|
|
if (is_reverse == true) {
|
attacker.reverse(-attacker.obj_type);
|
}
|
};
|
|
attacker.setAnimationActionFunc(animationEventFunc, animationCompleteFunc, anima_name);
|
this.setAnimation(attacker, anima_name, is_loop, callback, anima_res);
|
}.bind(this));
|
return callFunc;
|
},
|
// 设置动作
|
setAnimation: function setAnimation(attacker, anima_name, is_loop, callback, anima_res) {
|
if (anima_name && anima_name.indexOf("E") == -1) {
|
attacker.reverse(attacker.obj_type);
|
attacker.playActionOnce(anima_name, anima_res, is_loop);
|
}
|
|
if (callback) {
|
callback();
|
}
|
},
|
|
/**
|
* 普通近战攻击
|
* @param {*} attacker
|
* @param {*} delay_time
|
* @param {*} anima_name
|
* @param {*} hit_callback
|
* @param {*} start_callback
|
* @param {*} finish_callback
|
* @param {*} is_reverse
|
* @param {*} attack_func
|
* @param {*} anima_res
|
*/
|
attack: function attack(attacker, delay_time, anima_name, hit_callback, start_callback, is_reverse, attack_func, anima_res) {
|
// console.trace();
|
var startfun = null;
|
|
if (start_callback) {
|
startfun = cc.callFunc(start_callback);
|
}
|
|
this.actStart(attacker); // 开始添加一下统计
|
|
attacker.is_attack = anima_name; // 记录一下攻击动作
|
// 播放音效
|
|
if (attacker.shout_trick != "" && attacker.is_real == true) {
|
Utils.playEffectSound(AUDIO_TYPE.BATTLE, attacker.shout_trick);
|
}
|
|
if (startfun == null) {
|
return this.addDelay(attacker, delay_time, this.setAnimationWithEvent(attacker, anima_name, hit_callback, null, false, is_reverse, attack_func, anima_res));
|
} else {
|
return this.addDelay(attacker, delay_time, cc.sequence(startfun, this.setAnimationWithEvent(attacker, anima_name, hit_callback, null, false, is_reverse, attack_func, anima_res)));
|
}
|
},
|
|
/**
|
* 播放范围特效
|
* @param {*} attacker 施法者
|
* @param {*} effect_list 特效列表
|
* @param {*} reverse 是否需要反转.这个也是跟施法者的obj_type一致的
|
* @param {*} is_release 是否播放完释放掉,这个可以有可无,到时候全部对象池回收
|
* @param {*} scene_pos 所处位置
|
* @param {*} hit_callback 打击回调
|
* @param {*} bid 特效ID 非自愿id
|
* @param {*} is_release 特效播放一次完成是否释放
|
*/
|
effectArea: function effectArea(attacker, effect_list, reverse, is_release, scene_pos, hit_callback, bid) {
|
if (is_release == null) {
|
is_release = true;
|
}
|
|
var model = require("battle_controller").getInstance().getModel();
|
|
var battle_scene = model.getBattleScene();
|
|
if (battle_scene == null) {
|
return;
|
} // 2个特效层
|
|
|
var layer = [battle_scene.getBattleEffectLayer(1), battle_scene.getBattleEffectLayer(2)]; // 记录只触发一次hitcallback
|
|
var is_play_effect = false; // 效果
|
|
var effect_config = Config.skill_data.data_get_effect_data[bid]; // 可能因为编译器的问题 这个方法不能写到for循环里面去执行多次,那时候只会被调用一次
|
|
var finish_callback = function (attacker, battle_effect, is_loop) {
|
if (!is_loop) {
|
attacker.in_area_effect = null;
|
model.delBattleEffect(battle_effect);
|
}
|
|
this.actFinish(attacker);
|
}.bind(this); // 创建特效组
|
|
|
for (var index = 0; index < effect_list.length; index++) {
|
// index == 0 是上层特效, 1 是下层特效
|
var element = effect_list[index];
|
|
if (element != "") {
|
var action_name = "";
|
|
if (effect_config) {
|
if (index == 0) {
|
// 上层特效
|
action_name = effect_config.up_action_name;
|
} else if (index == 1) {
|
// 下层特效
|
action_name = effect_config.down_action_name;
|
}
|
|
if (action_name == "") {
|
action_name = PlayerAction.action;
|
}
|
} // 创建特效单位, 这个特效暂时还没有清楚掉,后面要看放在哪里清楚掉,保证能完全回收
|
|
|
if (action_name != "") {
|
var battle_effect = model.addBattleEfffect(layer[index], scene_pos, reverse, element, action_name);
|
|
if (is_release == false) {
|
// 先储存到场景特效里面去
|
model.addSceneBuffEffect(attacker.group, bid, element, battle_effect);
|
}
|
|
this.actStart(attacker);
|
var start_callback = null;
|
|
if (!is_play_effect) {
|
is_play_effect = true;
|
|
start_callback = function () {
|
if (hit_callback) {
|
hit_callback();
|
}
|
}.bind(this);
|
}
|
|
attacker.in_area_effect = true;
|
var act = this.setAnimaWithEventFinish(attacker, action_name, start_callback, finish_callback, battle_effect, !is_release);
|
battle_effect.runAction(act);
|
}
|
}
|
}
|
},
|
|
/**
|
* 播放特效
|
* @param {*} attacker
|
* @param {*} action_name 动作名
|
* @param {*} hit_callback
|
* @param {*} finish_callback
|
* @param {*} battle_effect 对象为BattleEffect
|
* @param {*} is_loop 是否循环
|
*/
|
setAnimaWithEventFinish: function setAnimaWithEventFinish(attacker, action_name, hit_callback, finish_callback, battle_effect, is_loop) {
|
var model = require("battle_controller").getInstance().getModel();
|
|
var callFunc = cc.callFunc(function () {
|
var animationCompleteFunc = function animationCompleteFunc(event_animation) {
|
if (event_animation == action_name) {
|
if (battle_effect.hit_time < battle_effect.hit_num && hit_callback) {
|
hit_callback();
|
battle_effect.hit_time += 1;
|
|
if (attacker.in_area_effect) {
|
attacker.area_hit_time = battle_effect.hit_time;
|
}
|
}
|
|
if (finish_callback) {
|
finish_callback(attacker, battle_effect, is_loop);
|
}
|
}
|
};
|
|
var animationEventFunc = null;
|
|
if (hit_callback) {
|
animationEventFunc = function animationEventFunc(event_name) {
|
if (event_name == "hit" || event_name == "Hit" || event_name == "HIT") {
|
if (battle_effect.hit_time < battle_effect.hit_num && hit_callback) {
|
hit_callback();
|
battle_effect.hit_time += 1;
|
|
if (attacker.in_area_effect) {
|
attacker.area_hit_time = battle_effect.hit_time;
|
}
|
}
|
} else if (event_name == "hit_none") {
|
model.actHurt(attacker);
|
} else if (event_name == "hit_big") {
|
model.actHurt(attacker, true);
|
} else if (event_name == "shake_point") {// 震屏
|
} else if (event_name.indexOf("hit_num") != -1) {// 多段攻击
|
}
|
};
|
}
|
|
battle_effect.hit_time = 0;
|
battle_effect.hit_num = 1;
|
battle_effect.setAnimationActionFunc(animationEventFunc, animationCompleteFunc, action_name);
|
battle_effect.playActionOnce(action_name, null, is_loop);
|
});
|
return callFunc;
|
},
|
|
/**
|
* 播放受击动作
|
* @param {*} attacker
|
* @param {*} target
|
* @param {*} hurt_action
|
* @param {*} play_effect 是否播放音效,因为可能是群攻的时候,只需要播放一次音效
|
*/
|
hurt: function hurt(attacker, target, hurt_action, play_effect) {
|
if (attacker == null || target == null) {
|
return;
|
}
|
|
if (hurt_action == null || hurt_action == "") {
|
hurt_action = PlayerAction.hurt;
|
}
|
|
if (play_effect == null) {
|
play_effect = true;
|
}
|
|
var back_time = 0.02; // 过去时间
|
|
var return_time = 0.05; // 回来时间
|
|
var delay_time = 0.2; // 保持时间
|
|
var off_width = 18 * target.obj_type; // 受击偏移
|
|
target.in_hurt_act = true; // 设置受击状态
|
// 这里做切换状态,没有做被变形判断,如果是被变形了,就需要创建修改
|
// 播放音效,暂时没实现
|
|
if (play_effect == true && attacker.hit_sound != "" && attacker.is_real == true) {
|
Utils.playEffectSound(AUDIO_TYPE.BATTLE, attacker.hit_sound);
|
}
|
|
var animationCompleteFunc = function animationCompleteFunc(event_animation) {
|
if (event_animation == hurt_action) {
|
target.in_hurt_act = false;
|
target.checkIsDied();
|
}
|
};
|
|
target.setAnimationActionFunc(null, animationCompleteFunc, hurt_action);
|
var callFunc = cc.callFunc(function () {
|
if (target.in_hurt_act == true) {
|
target.playActionOnce(hurt_action, null, false);
|
}
|
});
|
var mv_t_1 = cc.moveBy(back_time, -off_width, 0);
|
var delay_time = cc.delayTime(delay_time);
|
var mv_t_2 = cc.moveBy(return_time, off_width, 0);
|
var finishFunc = cc.callFunc(function () {
|
target.is_hurt_play = false;
|
});
|
var act = cc.sequence(callFunc, mv_t_1, delay_time, mv_t_2, finishFunc);
|
target.runAction(act);
|
},
|
// 单位伴随特效,也就是挂在人身上的,包含技能出招特效,和buff特效,和受击特效
|
effectSpineUser: function effectSpineUser(attacker, is_release, x_fix, height, effect_list, target, scale, callback, bid, obj_type) {
|
var _this = this;
|
|
if (effect_list == null || effect_list.length == 0 || bid == null) {
|
return;
|
}
|
|
target = target || attacker;
|
var zoredr_offset = [99, -999];
|
var is_fornt = false;
|
|
if (!height) {
|
height = 60;
|
}
|
|
height = height * attacker.model_height * 0.01;
|
var effect_config = Config.skill_data.data_get_effect_data[bid];
|
|
var _loop = function _loop(index) {
|
var element = effect_list[index];
|
|
if (element != "") {
|
var action_name = "";
|
|
if (effect_config) {
|
if (index == 0) {
|
// 上层特效
|
action_name = effect_config.up_action_name;
|
} else if (index == 1) {
|
// 下层特效
|
action_name = effect_config.down_action_name;
|
}
|
|
if (action_name == "") {
|
action_name = PlayerAction.action;
|
}
|
|
if (action_name != "") {
|
if (index == 0) {} else {
|
height = 0;
|
is_fornt = true;
|
} // 这里有问题 不能这么判断,如果是多段攻击 还是需要的 一个动作没播完 就继续创建一个
|
|
|
battle_effect_object = target.addBattleEfffect(x_fix, height, element, action_name, index, obj_type);
|
|
if (battle_effect_object) {
|
battle_effect = battle_effect_object.object;
|
start_fun = cc.callFunc(function () {
|
if (callback) {
|
callback();
|
}
|
});
|
|
finish_callback = function finish_callback() {
|
if (is_release == true) {
|
target.delBattleEffect(element, action_name); //移除掉一个特效
|
}
|
}; // 这个不知道有啥用,暂时注释掉,保证特效会在目标上面的话,就需要把施法者放到上面来
|
|
|
zorder = target.getLocalZOrder() + zoredr_offset[index];
|
|
if (effect_config.is_fornt == 1) {
|
zorder = attacker.getLocalZOrder() - 999;
|
is_fornt = true;
|
}
|
|
if (is_fornt == false) {
|
attacker.setLocalZOrder(zorder);
|
}
|
|
act = _this.setAnimaWithEventFinish(attacker, action_name, null, finish_callback, battle_effect, !is_release);
|
battle_effect.runAction(cc.sequence(start_fun, act));
|
}
|
}
|
}
|
}
|
};
|
|
for (var index = 0; index < effect_list.length; index++) {
|
var battle_effect_object;
|
var battle_effect;
|
var start_fun;
|
var finish_callback;
|
var zorder;
|
var act;
|
|
_loop(index);
|
}
|
},
|
|
/**
|
* 通用创建延迟接口
|
* @param {*} time
|
*/
|
dt: function dt(time) {
|
return cc.delayTime(time / 60 * 2);
|
},
|
|
/**
|
* 设置旋转角度
|
* @param {*} target
|
* @param {*} pos
|
*/
|
changeRotation: function changeRotation(target, pos) {
|
var scene_pos = target.scene_pos;
|
var temp_x = scene_pos.x - pos.x;
|
var temp_y = scene_pos.y - pos.y;
|
var radian = Math.atan(temp_y / temp_x);
|
var degree = -(radian * (180 / Math.PI));
|
target.setRotation(degree);
|
},
|
// 无动作返回的
|
setNotAnimationWithEvent: function setNotAnimationWithEvent(attacker, hit_callback) {
|
return cc.callFunc(function () {
|
if (hit_callback) {
|
hit_callback();
|
}
|
|
this.actFinish(attacker);
|
}.bind(this));
|
},
|
// 援护者受击动作
|
aid_hurt: function aid_hurt(attacker, target, hurt_action) {
|
var callback = function () {
|
if (!target.is_die) {
|
target.resetBaseInfo();
|
}
|
|
target.in_act = false;
|
this.actFinish(attacker);
|
}.bind(this);
|
|
target.runAction(cc.sequence(cc.callFunc(function () {
|
this.setAnimation(target, hurt_action, false);
|
}.bind(this)), cc.delayTime(0.3), cc.callFunc(function () {
|
callback();
|
}.bind(this))));
|
},
|
|
/**
|
* 无动作并行攻击
|
* @param {*} attacker
|
* @param {*} delay_time
|
* @param {*} hit_callback
|
* @param {*} start_callback
|
* @param {*} is_reverse
|
*/
|
noActAttack: function noActAttack(attacker, delay_time, hit_callback, start_callback, next_delay_time) {
|
var start_fun = null;
|
|
if (start_callback != null) {
|
start_fun = cc.callFunc(function () {
|
start_callback();
|
}.bind(this));
|
}
|
|
;
|
this.actStart(attacker);
|
|
if (start_fun == null) {
|
return this.addDelay(attacker, delay_time, this.setNotAnimationWithEvent(attacker, hit_callback), next_delay_time);
|
} else {
|
return this.addDelay(attacker, delay_time, cc.sequence(start_fun, this.setNotAnimationWithEvent(attacker, hit_callback)), next_delay_time);
|
}
|
},
|
|
/**
|
* 飞行子弹
|
* @param {*} attacker
|
* @param {*} delay_time
|
* @param {*} effect_name
|
* @param {*} move_time
|
* @param {*} hit_callback
|
* @param {*} target_pos 目标位置
|
* @param {*} scale
|
* @param {*} bid
|
* @param {*} x_fix
|
* @param {*} y_fix
|
*/
|
flyItem: function flyItem(attacker, delay_time, effect_name, move_time, hit_callback, start_height, target_pos, scale, bid, x_fix, y_fix) {
|
if (attacker == null || effect_name == null || effect_name == "") {
|
return;
|
}
|
|
var effect_config = Config.skill_data.data_get_effect_data[bid];
|
|
if (effect_config == null) {
|
return;
|
}
|
|
var model = require("battle_controller").getInstance().getModel();
|
|
var battle_scene = model.getBattleScene();
|
|
if (battle_scene == null) {
|
return;
|
}
|
|
var parent = battle_scene.getBattleRoleLayer();
|
var action_name = PlayerAction.action;
|
|
if (effect_config.up_action_name != "") {
|
action_name = effect_config.up_action_name;
|
}
|
|
var dt = this.dt(delay_time);
|
var callFunc = cc.callFunc(function () {
|
this.actStart(attacker); // 这个子弹也需要创建到场景中去.而不能绑在施法者身上,因为会有层级问题
|
|
var base_pos = attacker.scene_pos;
|
var start_pos = cc.v2(base_pos.x, base_pos.y + start_height);
|
var battle_effect = model.addBattleEfffect(parent, start_pos, attacker.obj_type, effect_name, action_name);
|
battle_effect.playActionOnce(action_name, null, true); // 手动播放特效
|
|
var start_fun = cc.callFunc(function () {
|
attacker.in_area_effect = true;
|
}.bind(this));
|
var hit_fun = cc.callFunc(function () {
|
if (hit_callback) {
|
hit_callback();
|
}
|
}.bind(this));
|
var finish_fun = cc.callFunc(function () {
|
attacker.in_area_effect = null;
|
this.actFinish(attacker); // 这里要干掉特效
|
|
model.delBattleEffect(battle_effect);
|
}.bind(this));
|
var y_offset = (target_pos.y - start_pos.y) * Math.abs(x_fix) / (target_pos.x - base_pos.x - x_fix) * attacker.obj_type;
|
var pos_temp = cc.v2(target_pos.x + x_fix, target_pos.y - y_offset);
|
var moveTo = cc.moveTo(move_time / 60, pos_temp);
|
var setZorder = cc.callFunc(function () {
|
battle_effect.setLocalZOrder(720 + target_pos.y + 999);
|
this.changeRotation(battle_effect, pos_temp);
|
}.bind(this));
|
battle_effect.runAction(cc.sequence(start_fun, setZorder, moveTo, hit_fun, finish_fun));
|
}.bind(this));
|
return cc.sequence(dt, callFunc);
|
},
|
// 渐隐播报
|
fadeOut: function fadeOut(attacker, delay_time, time) {
|
var out_time = time / 30; // var act = cc.callFunc(function () {
|
// attacker.runAction(cc.fadeOut(out_time));
|
// }.bind(this));
|
|
var act = cc.fadeOut(out_time);
|
return this.addDelay(attacker, delay_time, act);
|
},
|
// 渐现出来
|
fadeIn: function fadeIn(attacker, delay_time, time) {
|
var in_time = time / 30; // var act = cc.callFunc(function () {
|
// attacker.runAction(cc.fadeIn(in_time));
|
// })
|
|
var act = cc.fadeIn(in_time);
|
return this.addDelay(attacker, delay_time, act);
|
},
|
// 隐藏血条
|
hideUI: function hideUI(attacker, delay_time) {
|
var start_fun = cc.callFunc(function () {
|
attacker.showHpRoot(false);
|
}.bind(this));
|
return this.addDelay(attacker, delay_time, start_fun);
|
},
|
// 显示血条
|
showUI: function showUI(attacker, delay_time) {
|
var start_fun = cc.callFunc(function () {
|
attacker.showHpRoot(true);
|
}.bind(this));
|
return this.addDelay(attacker, delay_time, start_fun);
|
},
|
// 护盾的吸收, 用的是25号字体(height=31)
|
playBuffAbsorbHurt: function playBuffAbsorbHurt(target, absorb_val) {
|
this.playDmgMessage(target, absorb_val, null, false, 0, true);
|
},
|
|
/**
|
* 伤害飘血
|
* @param {*} target
|
* @param {*} dmg
|
* @param {*} effect_hit 是否暴击,为 2的时候暴击
|
* @param {*} is_normal
|
* @param {*} is_buff
|
* @param {*} camp_restrain
|
*/
|
playDmgMessage: function playDmgMessage(target, dmg, effect_hit, is_buff, camp_restrain, is_absorb) {
|
if (dmg == 0 || target == null) return;
|
var font_type = 0; // 使用字体的类型
|
|
if (effect_hit == 2) {
|
// 暴击
|
font_type = 7;
|
} else if (is_absorb == true) {
|
font_type = 25;
|
} else if (dmg > 0) {
|
// 治疗
|
font_type = 2;
|
} else {
|
if (is_buff == true) {
|
font_type = 24;
|
} else if (camp_restrain == 1) {
|
font_type = 27;
|
} else {
|
font_type = 4;
|
}
|
} // 预先加载资源.在创建文字
|
|
|
require("battle_controller").getInstance().getModel().getDmgFontCacheObject(font_type, function (object, res_object) {
|
this.playDmgFontAction(font_type, object, res_object, dmg);
|
}.bind(this, target));
|
},
|
// 创建伤害数字和移动
|
playDmgFontAction: function playDmgFontAction(type, target, res_object, dmg) {
|
if (target == null || target.role == null) return;
|
|
if (target.hurt_delay == null) {
|
target.hurt_delay = 0;
|
}
|
|
var delay_time = target.hurt_delay % 3 / 5; // 因为可能是同一个目标的多次飘血,为了避免掉重叠.所以这个是每一个的延迟.
|
|
target.hurt_delay += 1;
|
var parent_layer = ViewManager.getInstance().getSceneNode(SCENE_TAG.battle); // 存放伤害数字的父节点
|
|
var dmgfont = this.getDmgNode(type);
|
if (dmgfont == null) return;
|
parent_layer.addChild(dmgfont, 10); // 添加深度值
|
|
var world_pos = target.role.convertToWorldSpace(cc.v2(0, 0)); // 单位的节点坐标
|
|
var node_pos = parent_layer.convertToNodeSpace(world_pos); // 转成局部坐标
|
|
var title = dmgfont.getChildByName("title");
|
var title_sp = title.getComponent(cc.Sprite);
|
title_sp.atlas = res_object;
|
|
if (type == 7 || type == 25) {
|
title_sp.spriteFrame = res_object.getSpriteFrame("type" + type + "_extend");
|
} else {
|
if (dmg < 0) {
|
title_sp.spriteFrame = res_object.getSpriteFrame("type" + type + "_sub");
|
} else {
|
title_sp.spriteFrame = res_object.getSpriteFrame("type" + type + "_add");
|
}
|
} // 文字
|
|
|
var label = dmgfont.getChildByName("label");
|
var richText = label.getComponent(cc.RichText);
|
richText.imageAtlas = res_object;
|
var dmg_str = Math.abs(dmg) + "";
|
var total_str = "";
|
|
for (var index = 0; index < dmg_str.length; index++) {
|
var desc = dmg_str[index];
|
|
if (desc == "+") {
|
desc = "add";
|
} else if (desc == "-") {
|
desc = "sub";
|
}
|
|
total_str = total_str + cc.js.formatStr("<img src='type%s_%s'/>", type, desc);
|
}
|
|
richText.string = total_str;
|
var total_width = label.width;
|
|
if (title) {
|
total_width += title.width;
|
label.x = title.width;
|
}
|
|
dmgfont.x = node_pos.x - total_width * 0.5 - SCREEN_WIDTH * 0.5;
|
dmgfont.y = node_pos.y + target.model_height + target.dmg_index * 15 - SCREEN_HEIGHT * 0.5;
|
dmgfont.scale = 0.5;
|
var delay = cc.delayTime(delay_time);
|
var show = cc.fadeIn(0.01);
|
var bigger = cc.scaleTo(Config.battle_act_data.data_get_act_data.hurt_num_scale_time1.val * 0.01 / 60, Config.battle_act_data.data_get_act_data.hurt_num_bigger.val * 0.01 * 0.5);
|
var bigger2 = cc.scaleTo(Config.battle_act_data.data_get_act_data.hurt_num_scale_time2.val * 0.01 / 60, Config.battle_act_data.data_get_act_data.hurt_num_bigger2.val * 0.01);
|
var smaller = cc.scaleTo(Config.battle_act_data.data_get_act_data.hurt_num_scale_time3.val * 0.01 / 60, Config.battle_act_data.data_get_act_data.hurt_num_smaller.val * 0.01);
|
var bigger3 = cc.scaleTo(Config.battle_act_data.data_get_act_data.hurt_num_scale_time4.val * 0.01 / 60, Config.battle_act_data.data_get_act_data.hurt_num_bigger3.val * 0.01);
|
var delay2 = cc.delayTime(Config.battle_act_data.data_get_act_data.hurt_num_delay_time.val * 0.01 / 60);
|
var move = cc.moveBy(Config.battle_act_data.data_get_act_data.hurt_num_move_time.val * 0.01 / 60, 0, Config.battle_act_data.data_get_act_data.hurt_num_move_distance.val * 0.01);
|
var hide = cc.fadeOut(Config.battle_act_data.data_get_act_data.hurt_num_hide_time.val * 0.02 / 60);
|
var deleteDmgNum = cc.callFunc(function () {
|
this.pushBackDmgNode(type, dmgfont);
|
}.bind(this));
|
var change = cc.sequence(bigger, bigger2, smaller, bigger3, delay2, cc.spawn(move, hide));
|
dmgfont.runAction(cc.sequence(delay, show, change, deleteDmgNum));
|
},
|
// 从对象池中获取缓存
|
getDmgNode: function getDmgNode(type) {
|
var battle_pools = require("battle_role_pool").getInstance();
|
|
var pools = battle_pools.getDmgPools(type);
|
var node = null;
|
|
if (pools.size() > 0) {
|
// 只有暴击 的7号数字和吸收伤害的25号需要创建 title
|
node = pools.get();
|
} else {
|
node = new cc.Node();
|
node.setAnchorPoint(0.5, 0.5); // 如果是暴击或者吸收,则显示暴击吸收,否则显示 + 或者 -
|
|
var title = new cc.Node();
|
title.setAnchorPoint(0, 0.5);
|
title.name = "title";
|
node.addChild(title);
|
title.addComponent(cc.Sprite); // 具体伤害数字的富文本
|
|
var font_node = new cc.Node();
|
font_node.setAnchorPoint(0, 0.5);
|
font_node.name = "label";
|
node.addChild(font_node);
|
var font_label = font_node.addComponent(cc.RichText);
|
font_label.lineHeight = 30;
|
font_label.fontSize = 30;
|
}
|
|
return node;
|
},
|
// 回收伤害数字
|
pushBackDmgNode: function pushBackDmgNode(type, dmg) {
|
var battle_pools = require("battle_role_pool").getInstance();
|
|
battle_pools.pushBackDmgPools(type, dmg);
|
},
|
// 黑屏处理
|
blackScreen: function blackScreen(attacker, delay_time, time, begin_fun, end_fun) {
|
var act = cc.sequence(cc.callFunc(begin_fun), cc.delayTime(time / 60), cc.callFunc(end_fun));
|
return cc.sequence(this.dt(delay_time), act);
|
}
|
};
|
module.exports = SkillAct;
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2V0c1xcU2NyaXB0c1xcbW9kXFxiYXR0bGVcXHNraWxsX2FjdC5qcyJdLCJuYW1lcyI6WyJTa2lsbEFjdCIsIm5ld1BvczJHaXJkIiwicG9zIiwiaXNfbGVmdCIsImdyb3VwIiwiaXNfcmVhbCIsIm1lc3NhZ2UiLCJHSVJEX1BPU19PRkZTRVQiLCJNYXRoIiwibWF4IiwiUG9zMkdyaWRMZWZ0IiwiUG9zMkdyaWRSaWdodCIsIk5vcm1hbFBvc0dyaWRSaWdodCIsImdyaWRTaXplWCIsIlNDUkVFTl9XSURUSCIsImdyaWRTaXplWSIsIlNDUkVFTl9IRUlHSFQiLCJncmlkUG9zVG9TY3JlZW5Qb3MiLCJjYyIsInYyIiwieCIsInkiLCJzY3JlZW5Qb3NUb0dyaWRQb3MiLCJub3JtYWxTdGFydCIsImF0dGFja2VyIiwiY2FsbEZ1bmMiLCJhY3RTdGFydCIsImJpbmQiLCJub3JtYWxGaW5pc2giLCJhY3RGaW5pc2giLCJtb2RlbCIsInJlcXVpcmUiLCJnZXRJbnN0YW5jZSIsImdldE1vZGVsIiwiYWRkRGVsYXkiLCJkZWxheV90aW1lIiwiYWN0IiwibmV4dF9kZWxheV90aW1lIiwic2VxdWVuY2UiLCJkZWxheVRpbWUiLCJoYW5kbGVBdHRhY2tlck1vdmUiLCJpc19iYWNrIiwicGxheV9vcmRlcl9pbmRleCIsImFuaW1lX3JlcyIsInNwaW5lX25hbWUiLCJ0ZW1wX2NvbmZpZyIsImFjdF9jb25maWciLCJDb25maWciLCJiYXR0bGVfYWN0X2RhdGEiLCJkYXRhX2luZm8iLCJwbGF5X2FjdGlvbl9uYW1lIiwibW92ZUJhY2siLCJiYWNrX2RlbGF5X3RpbWUiLCJiYWNrX21vdmVfdGltZSIsImJhY2tfbW9kZWxfeCIsImlzX21vdmVfbWFwIiwic2hhZG93X3RpbWUiLCJpc19tb3ZlX2FyZWEiLCJtb3ZlVG9BcmVhIiwibW92ZVRvIiwibW92ZV9kZWxheV90aW1lIiwibW92ZV90aW1lIiwibW92ZV9tb2RlbF94IiwibW92ZV9tb2RlbF95IiwiaXNfcmV2ZXJzZSIsImlzX2NvbF9hY3QiLCJtb3ZlIiwidGFyZ2V0X3BvcyIsImlzX2RpZSIsImdldEJ1ZmZUYWciLCJydW5BY3Rpb24iLCJlYXNpbmciLCJlYXNlRXhwb25lbnRpYWxPdXQiLCJzZXRBbmltYXRpb25XaXRoRXZlbnQiLCJhbmltYV9uYW1lIiwiaGl0X2NhbGxiYWNrIiwiZmluaXNoX2NhbGxiYWNrIiwiaXNfbG9vcCIsImF0dGFja19mdW5jIiwiYW5pbWFfcmVzIiwiYW5pbWF0aW9uRXZlbnRGdW5jIiwiZXZlbnRfbmFtZSIsImhpdF90aW1lIiwiaGl0X251bSIsImlzX2F0dGFjayIsImluX2FyZWFfZWZmZWN0IiwiaXNfYXJlYV9hdHRhY2siLCJhcmVhSHVydCIsImF0dGFja1BvaW50IiwiYWN0SHVydCIsImF0dGFja1JlYWR5IiwicGxheVNoYWtlU2NyZWVuIiwic2hha2VfaWQiLCJpbmRleE9mIiwiYW5pbWF0aW9uQ29tcGxldGVGdW5jIiwiZXZlbnRfYW5pbWF0aW9uIiwicGxheV9zdGFuZCIsInNldEFuaW1hdGlvbiIsIlBsYXllckFjdGlvbiIsImJhdHRsZV9zdGFuZCIsInJ1biIsInNldEhhbGxvd3NSb3VuZCIsImluX2FuaW1hdGlvbiIsImNhbGxiYWNrIiwic3BsaXRfaHVydCIsInJldmVyc2UiLCJvYmpfdHlwZSIsInNldEFuaW1hdGlvbkFjdGlvbkZ1bmMiLCJwbGF5QWN0aW9uT25jZSIsImF0dGFjayIsInN0YXJ0X2NhbGxiYWNrIiwic3RhcnRmdW4iLCJzaG91dF90cmljayIsIlV0aWxzIiwicGxheUVmZmVjdFNvdW5kIiwiQVVESU9fVFlQRSIsIkJBVFRMRSIsImVmZmVjdEFyZWEiLCJlZmZlY3RfbGlzdCIsImlzX3JlbGVhc2UiLCJzY2VuZV9wb3MiLCJiaWQiLCJiYXR0bGVfc2NlbmUiLCJnZXRCYXR0bGVTY2VuZSIsImxheWVyIiwiZ2V0QmF0dGxlRWZmZWN0TGF5ZXIiLCJpc19wbGF5X2VmZmVjdCIsImVmZmVjdF9jb25maWciLCJza2lsbF9kYXRhIiwiZGF0YV9nZXRfZWZmZWN0X2RhdGEiLCJiYXR0bGVfZWZmZWN0IiwiZGVsQmF0dGxlRWZmZWN0IiwiaW5kZXgiLCJsZW5ndGgiLCJlbGVtZW50IiwiYWN0aW9uX25hbWUiLCJ1cF9hY3Rpb25fbmFtZSIsImRvd25fYWN0aW9uX25hbWUiLCJhY3Rpb24iLCJhZGRCYXR0bGVFZmZmZWN0IiwiYWRkU2NlbmVCdWZmRWZmZWN0Iiwic2V0QW5pbWFXaXRoRXZlbnRGaW5pc2giLCJhcmVhX2hpdF90aW1lIiwiaHVydCIsInRhcmdldCIsImh1cnRfYWN0aW9uIiwicGxheV9lZmZlY3QiLCJiYWNrX3RpbWUiLCJyZXR1cm5fdGltZSIsIm9mZl93aWR0aCIsImluX2h1cnRfYWN0IiwiaGl0X3NvdW5kIiwiY2hlY2tJc0RpZWQiLCJtdl90XzEiLCJtb3ZlQnkiLCJtdl90XzIiLCJmaW5pc2hGdW5jIiwiaXNfaHVydF9wbGF5IiwiZWZmZWN0U3BpbmVVc2VyIiwieF9maXgiLCJoZWlnaHQiLCJzY2FsZSIsInpvcmVkcl9vZmZzZXQiLCJpc19mb3JudCIsIm1vZGVsX2hlaWdodCIsImJhdHRsZV9lZmZlY3Rfb2JqZWN0Iiwib2JqZWN0Iiwic3RhcnRfZnVuIiwiem9yZGVyIiwiZ2V0TG9jYWxaT3JkZXIiLCJzZXRMb2NhbFpPcmRlciIsImR0IiwidGltZSIsImNoYW5nZVJvdGF0aW9uIiwidGVtcF94IiwidGVtcF95IiwicmFkaWFuIiwiYXRhbiIsImRlZ3JlZSIsIlBJIiwic2V0Um90YXRpb24iLCJzZXROb3RBbmltYXRpb25XaXRoRXZlbnQiLCJhaWRfaHVydCIsInJlc2V0QmFzZUluZm8iLCJpbl9hY3QiLCJub0FjdEF0dGFjayIsImZseUl0ZW0iLCJlZmZlY3RfbmFtZSIsInN0YXJ0X2hlaWdodCIsInlfZml4IiwicGFyZW50IiwiZ2V0QmF0dGxlUm9sZUxheWVyIiwiYmFzZV9wb3MiLCJzdGFydF9wb3MiLCJoaXRfZnVuIiwiZmluaXNoX2Z1biIsInlfb2Zmc2V0IiwiYWJzIiwicG9zX3RlbXAiLCJzZXRab3JkZXIiLCJmYWRlT3V0Iiwib3V0X3RpbWUiLCJmYWRlSW4iLCJpbl90aW1lIiwiaGlkZVVJIiwic2hvd0hwUm9vdCIsInNob3dVSSIsInBsYXlCdWZmQWJzb3JiSHVydCIsImFic29yYl92YWwiLCJwbGF5RG1nTWVzc2FnZSIsImRtZyIsImVmZmVjdF9oaXQiLCJpc19idWZmIiwiY2FtcF9yZXN0cmFpbiIsImlzX2Fic29yYiIsImZvbnRfdHlwZSIsImdldERtZ0ZvbnRDYWNoZU9iamVjdCIsInJlc19vYmplY3QiLCJwbGF5RG1nRm9udEFjdGlvbiIsInR5cGUiLCJyb2xlIiwiaHVydF9kZWxheSIsInBhcmVudF9sYXllciIsIlZpZXdNYW5hZ2VyIiwiZ2V0U2NlbmVOb2RlIiwiU0NFTkVfVEFHIiwiYmF0dGxlIiwiZG1nZm9udCIsImdldERtZ05vZGUiLCJhZGRDaGlsZCIsIndvcmxkX3BvcyIsImNvbnZlcnRUb1dvcmxkU3BhY2UiLCJub2RlX3BvcyIsImNvbnZlcnRUb05vZGVTcGFjZSIsInRpdGxlIiwiZ2V0Q2hpbGRCeU5hbWUiLCJ0aXRsZV9zcCIsImdldENvbXBvbmVudCIsIlNwcml0ZSIsImF0bGFzIiwic3ByaXRlRnJhbWUiLCJnZXRTcHJpdGVGcmFtZSIsImxhYmVsIiwicmljaFRleHQiLCJSaWNoVGV4dCIsImltYWdlQXRsYXMiLCJkbWdfc3RyIiwidG90YWxfc3RyIiwiZGVzYyIsImpzIiwiZm9ybWF0U3RyIiwic3RyaW5nIiwidG90YWxfd2lkdGgiLCJ3aWR0aCIsImRtZ19pbmRleCIsImRlbGF5Iiwic2hvdyIsImJpZ2dlciIsInNjYWxlVG8iLCJkYXRhX2dldF9hY3RfZGF0YSIsImh1cnRfbnVtX3NjYWxlX3RpbWUxIiwidmFsIiwiaHVydF9udW1fYmlnZ2VyIiwiYmlnZ2VyMiIsImh1cnRfbnVtX3NjYWxlX3RpbWUyIiwiaHVydF9udW1fYmlnZ2VyMiIsInNtYWxsZXIiLCJodXJ0X251bV9zY2FsZV90aW1lMyIsImh1cnRfbnVtX3NtYWxsZXIiLCJiaWdnZXIzIiwiaHVydF9udW1fc2NhbGVfdGltZTQiLCJodXJ0X251bV9iaWdnZXIzIiwiZGVsYXkyIiwiaHVydF9udW1fZGVsYXlfdGltZSIsImh1cnRfbnVtX21vdmVfdGltZSIsImh1cnRfbnVtX21vdmVfZGlzdGFuY2UiLCJoaWRlIiwiaHVydF9udW1faGlkZV90aW1lIiwiZGVsZXRlRG1nTnVtIiwicHVzaEJhY2tEbWdOb2RlIiwiY2hhbmdlIiwic3Bhd24iLCJiYXR0bGVfcG9vbHMiLCJwb29scyIsImdldERtZ1Bvb2xzIiwibm9kZSIsInNpemUiLCJnZXQiLCJOb2RlIiwic2V0QW5jaG9yUG9pbnQiLCJuYW1lIiwiYWRkQ29tcG9uZW50IiwiZm9udF9ub2RlIiwiZm9udF9sYWJlbCIsImxpbmVIZWlnaHQiLCJmb250U2l6ZSIsInB1c2hCYWNrRG1nUG9vbHMiLCJibGFja1NjcmVlbiIsImJlZ2luX2Z1biIsImVuZF9mdW4iLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUlBLFFBQVEsR0FBRztBQUNYQyxFQUFBQSxXQUFXLEVBQUMscUJBQVNDLEdBQVQsRUFBY0MsT0FBZCxFQUF1QkMsS0FBdkIsRUFBOEJDLE9BQTlCLEVBQXNDO0FBQzlDLFFBQUlILEdBQUcsSUFBSSxDQUFQLElBQVlBLEdBQUcsSUFBSSxJQUF2QixFQUE0QjtBQUN4QkksTUFBQUEsT0FBTyxDQUFDLFFBQUQsQ0FBUDtBQUNIOztBQUNELFFBQUdKLEdBQUcsSUFBSSxFQUFQLElBQWFBLEdBQUcsSUFBSSxFQUF2QixFQUEwQjtBQUFRO0FBQzlCQSxNQUFBQSxHQUFHLEdBQUcsRUFBTjtBQUNILEtBRkQsTUFFTyxJQUFJRSxLQUFLLElBQUksQ0FBYixFQUFnQjtBQUNuQkYsTUFBQUEsR0FBRyxHQUFJQSxHQUFHLEdBQUdLLGVBQWI7QUFDSDs7QUFDREwsSUFBQUEsR0FBRyxHQUFHQSxHQUFHLEdBQUcsQ0FBWixDQVQ4QyxDQVNoQzs7QUFDZEEsSUFBQUEsR0FBRyxHQUFHTSxJ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QUFILENBQVlpUixTQUFaLENBQVosRUFBb0N4UixFQUFFLENBQUNxQixTQUFILENBQWFxSSxJQUFJLEdBQUcsRUFBcEIsQ0FBcEMsRUFBNkQxSixFQUFFLENBQUNPLFFBQUgsQ0FBWWtSLE9BQVosQ0FBN0QsQ0FBVjtBQUNBLFdBQU96UixFQUFFLENBQUNvQixRQUFILENBQVksS0FBS3FJLEVBQUwsQ0FBUXhJLFVBQVIsQ0FBWixFQUFpQ0MsR0FBakMsQ0FBUDtBQUNIO0FBMXpCVSxDQUFmO0FBNnpCQXdRLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjdTLFFBQWpCIiwic291cmNlUm9vdCI6Ii8iLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQGF1dGhvcjogc2hpcmFob0BzeWcuY29tKOW/heWhqywg5Yib5bu65qih5Z2X55qE5Lq65ZGYKVxuLy8gQGRlc2NyaXB0aW9uOlxuLy8gICAgICDmiJjmlpfmkq3miqXliqjkvZzmjqfliLZcbi8vIDxici8+Q3JlYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG52YXIgU2tpbGxBY3QgPSB7XG4gICAgbmV3UG9zMkdpcmQ6ZnVuY3Rpb24ocG9zLCBpc19sZWZ0LCBncm91cCwgaXNfcmVhbCl7XG4gICAgICAgIGlmIChwb3MgPT0gMCB8fCBwb3MgPT0gbnVsbCl7XG4gICAgICAgICAgICBtZXNzYWdlKFwi5L2N572u5LiN6IO95Li6MFwiKVxuICAgICAgICB9IFxuICAgICAgICBpZihwb3MgPT0gMzEgfHwgcG9zID09IDMyKXsgICAgICAgLy/npZ7lmajnmoTnibnmrorkvY3nva5cbiAgICAgICAgICAgIHBvcyA9IDEwO1xuICAgICAgICB9IGVsc2UgaWYgKGdyb3VwID09IDIpIHtcbiAgICAgICAgICAgIHBvcyA9IChwb3MgLSBHSVJEX1BPU19PRkZTRVQpICAgXG4gICAgICAgIH1cbiAgICAgICAgcG9zID0gcG9zIC0gMSAvLyBsdWEg5ZKManPnmoTkuIvooajkuI3lkIxcbiAgICAgICAgcG9zID0gTWF0aC5tYXgoMCwgcG9zKTtcbiAgICAgICAgaWYgKGlzX2xlZnQgPT0gdHJ1ZSl7XG4gICAgICAgICAgICByZXR1cm4gUG9zMkdyaWRMZWZ0W3Bvc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNfcmVhbCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFBvczJHcmlkUmlnaHRbcG9zXTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxQb3NHcmlkUmlnaHRbcG9zXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBncmlkU2l6ZVg6ZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIFNDUkVFTl9XSURUSCAvIDgwXG4gICAgfSxcblxuICAgIGdyaWRTaXplWTpmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gU0NSRUVOX0hFSUdIVCAvIDgwXG4gICAgfSxcblxuICAgIC8vIOagvOWtkOermeS9jei9rOWMluaIkOWcuuaZr+ermeS9jVxuICAgIGdyaWRQb3NUb1NjcmVlblBvczpmdW5jdGlvbihwb3Mpe1xuICAgICAgICByZXR1cm4gY2MudjIocG9zLnggKiB0aGlzLmdyaWRTaXplWCgpLCBwb3MueSAqIHRoaXMuZ3JpZFNpemVZKCkpO1xuICAgIH0sXG5cbiAgICAvLyDlnLrmma/lnZDmoIfovazmjaLmiJDmoLzlrZDlnZDmoIdcbiAgICBzY3JlZW5Qb3NUb0dyaWRQb3M6ZnVuY3Rpb24ocG9zKXtcblx0ICAgIHJldHVybiBjYy52Mihwb3MueCAvIHRoaXMuZ3JpZFNpemVYKCksIHBvcy55IC8gdGhpcy5ncmlkU2l6ZVkoKSlcbiAgICB9LFxuXG4gICAgLy/mma7pgJrlvIDlp4vlm57osINcbiAgICBub3JtYWxTdGFydDogZnVuY3Rpb24gKGF0dGFja2VyKSB7XG4gICAgICAgIHJldHVybiBjYy5jYWxsRnVuYygoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5hY3RTdGFydChhdHRhY2tlcilcbiAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICB9LFxuXG4gICAgLy/mma7pgJrnu5PmnZ/lm57osINcbiAgICBub3JtYWxGaW5pc2g6ZnVuY3Rpb24oYXR0YWNrZXIpe1xuICAgICAgICByZXR1cm4gY2MuY2FsbEZ1bmMoKGZ1bmN0aW9uICgpe1xuICAgICAgICAgICAgdGhpcy5hY3RGaW5pc2goYXR0YWNrZXIpXG4gICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgfSxcblxuICAgIGFjdFN0YXJ0OiBmdW5jdGlvbiAoYXR0YWNrZXIpIHtcbiAgICAgICAgdmFyIG1vZGVsID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKVxuICAgICAgICBtb2RlbC5hY3RTdGFydChhdHRhY2tlcilcbiAgICB9LFxuXG4gICAgYWN0RmluaXNoOiBmdW5jdGlvbiAoYXR0YWNrZXIpIHtcbiAgICAgICAgdmFyIG1vZGVsID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKVxuICAgICAgICBtb2RlbC5hY3RGaW5pc2goYXR0YWNrZXIpXG4gICAgfSxcblxuICAgIC8vIOW7tui/n+WKqOS9nOWkhOeQhlxuICAgIGFkZERlbGF5OiBmdW5jdGlvbiAoYXR0YWNrZXIsIGRlbGF5X3RpbWUsIGFjdCwgbmV4dF9kZWxheV90aW1lKXtcbiAgICAgICAgaWYoZGVsYXlfdGltZSA9PSAwIHx8IGRlbGF5X3RpbWUgPT0gbnVsbCl7XG4gICAgICAgICAgICBpZiAobmV4dF9kZWxheV90aW1lID09IDAgfHwgbmV4dF9kZWxheV90aW1lID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2Muc2VxdWVuY2UodGhpcy5ub3JtYWxTdGFydChhdHRhY2tlciksIGFjdCwgdGhpcy5ub3JtYWxGaW5pc2goYXR0YWNrZXIpKTtcbiAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgIHJldHVybiBjYy5zZXF1ZW5jZSh0aGlzLm5vcm1hbFN0YXJ0KGF0dGFja2VyKSwgYWN0LCBjYy5kZWxheVRpbWUobmV4dF9kZWxheV90aW1lIC8gMzApLCAgdGhpcy5ub3JtYWxGaW5pc2goYXR0YWNrZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChuZXh0X2RlbGF5X3RpbWUgPT0gMCB8fCBuZXh0X2RlbGF5X3RpbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjYy5zZXF1ZW5jZSh0aGlzLm5vcm1hbFN0YXJ0KGF0dGFja2VyKSwgY2MuZGVsYXlUaW1lKGRlbGF5X3RpbWUgLyAzMCksIGFjdCwgdGhpcy5ub3JtYWxGaW5pc2goYXR0YWNrZXIpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNjLnNlcXVlbmNlKHRoaXMubm9ybWFsU3RhcnQoYXR0YWNrZXIpLCBjYy5kZWxheVRpbWUoZGVsYXlfdGltZSAvIDMwKSwgYWN0LCBjYy5kZWxheVRpbWUobmV4dF9kZWxheV90aW1lIC8gMzApLCB0aGlzLm5vcm1hbEZpbmlzaChhdHRhY2tlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOi/keaImOaUu+WHu+enu+WKqOW9kuS9jVxuICAgIGhhbmRsZUF0dGFja2VyTW92ZTpmdW5jdGlvbihhdHRhY2tlciwgaXNfYmFjayl7XG4gICAgICAgIGlmIChhdHRhY2tlciA9PSBudWxsIHx8IGF0dGFja2VyLnBsYXlfb3JkZXJfaW5kZXggPT0gbnVsbCB8fCBhdHRhY2tlci5hbmltZV9yZXMgPT0gbnVsbCkgeyByZXR1cm47IH1cbiAgICAgICAgdmFyIG1vZGVsID0gcmVxdWlyZShcImJhdHRsZV9jb250cm9sbGVyXCIpLmdldEluc3RhbmNlKCkuZ2V0TW9kZWwoKSBcbiAgICAgICAgdmFyIHNwaW5lX25hbWUgPSBhdHRhY2tlci5zcGluZV9uYW1lO1xuICAgICAgICB2YXIgdGVtcF9jb25maWcgPSBudWxsO1xuICAgICAgICB2YXIgYWN0X2NvbmZpZyA9IENvbmZpZy5iYXR0bGVfYWN0X2RhdGEuZGF0YV9pbmZvW3NwaW5lX25hbWVdO1xuICAgICAgICBpZiAoYXR0YWNrZXIucGxheV9hY3Rpb25fbmFtZSA9PSBudWxsIHx8IGFjdF9jb25maWcgPT0gbnVsbCB8fCBhY3RfY29uZmlnW2F0dGFja2VyLmFuaW1lX3Jlc10gPT0gbnVsbCB8fCBhY3RfY29uZmlnW2F0dGFja2VyLmFuaW1lX3Jlc11bYXR0YWNrZXIucGxheV9hY3Rpb25fbmFtZV0gPT0gbnVsbCl7XG4gICAgICAgICAgICB0ZW1wX2NvbmZpZyA9IENvbmZpZy5iYXR0bGVfYWN0X2RhdGEuZGF0YV9pbmZvWzBdW1wiYWN0aW9uMVwiXVtcImFjdGlvbjFcIl07XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGVtcF9jb25maWcgPSBhY3RfY29uZmlnW2F0dGFja2VyLmFuaW1lX3Jlc11bYXR0YWNrZXIucGxheV9hY3Rpb25fbmFtZV07XG4gICAgICAgIH1cbiAgICAgICAgaWYodGVtcF9jb25maWcpe1xuICAgICAgICAgICAgaWYgKGlzX2JhY2sgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgbW9kZWwubW92ZUJhY2soYXR0YWNrZXIsIHRlbXBfY29uZmlnLmJhY2tfZGVsYXlfdGltZSwgdGVtcF9jb25maWcuYmFja19tb3ZlX3RpbWUsIHRlbXBfY29uZmlnLmJhY2tfbW9kZWxfeCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgdGVtcF9jb25maWcuaXNfbW92ZV9tYXApXG4gICAgICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgICAgICBpZiAodGVtcF9jb25maWcuc2hhZG93X3RpbWUgJiYgdGVtcF9jb25maWcuc2hhZG93X3RpbWUgIT0gMCl7ICAgICAgICAvLyDliJvlu7rliIbouqss5pqC5pe25LiN5aSE55CG5LqGXG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRlbXBfY29uZmlnLmlzX21vdmVfYXJlYSA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwubW92ZVRvQXJlYShhdHRhY2tlciwgdGVtcF9jb25maWcpO1xuICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICBtb2RlbC5tb3ZlVG8oYXR0YWNrZXIsIHRlbXBfY29uZmlnLm1vdmVfZGVsYXlfdGltZSwgdGVtcF9jb25maWcubW92ZV90aW1lLCB0ZW1wX2NvbmZpZy5tb3ZlX21vZGVsX3gsIHRlbXBfY29uZmlnLm1vdmVfbW9kZWxfeSwgbnVsbCwgbnVsbCwgMCwgMCwgdGVtcF9jb25maWcuaXNfbW92ZV9tYXAsIHRlbXBfY29uZmlnLmlzX3JldmVyc2UsIHRlbXBfY29uZmlnLmlzX2NvbF9hY3QpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIOWFt+S9k+enu+WKqOatpemqpFxuICAgIG1vdmU6ZnVuY3Rpb24oYXR0YWNrZXIsIHRhcmdldF9wb3MsIGRlbGF5X3RpbWUsIG1vdmVfdGltZSl7XG4gICAgICAgIHZhciBtb2RlbCA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCk7XG4gICAgICAgIGlmIChhdHRhY2tlci5pc19kaWUgPT0gZmFsc2UgJiYgbW9kZWwuZ2V0QnVmZlRhZyhhdHRhY2tlcikgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBhdHRhY2tlci5ydW5BY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbW92ZSA9IGNjLm1vdmVUbyhtb3ZlX3RpbWUvNjAsIHRhcmdldF9wb3MpLmVhc2luZyhjYy5lYXNlRXhwb25lbnRpYWxPdXQoKSk7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZERlbGF5KGF0dGFja2VyLCBkZWxheV90aW1lLCBtb3ZlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5Li76KeS5Yqo5L2c5pKt5pS+5LqL5Lu2XG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBCYXR0bGVSb2xlXG4gICAgICogQHBhcmFtIHsqfSBhbmltYV9uYW1lIOWKqOS9nOWQjSzkuI3lkIzkuo7liqjkvZzotYTmupDlkI0s6LWE5rqQ6YeM6Z2i5Y+v6IO95pyJ5aSa5Liq5Yqo5L2cXG4gICAgICogQHBhcmFtIHsqfSBoaXRfY2FsbGJhY2sgXG4gICAgICogQHBhcmFtIHsqfSBmaW5pc2hfY2FsbGJhY2sgXG4gICAgICogQHBhcmFtIHsqfSBpc19sb29wIFxuICAgICAqIEBwYXJhbSB7Kn0gaXNfcmV2ZXJzZSBcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja19mdW5jIFxuICAgICAqIEBwYXJhbSB7Kn0gYW5pbWFfcmVzIOWKqOS9nOi1hOa6kOWQjeWtl1xuICAgICAqL1xuICAgIHNldEFuaW1hdGlvbldpdGhFdmVudDpmdW5jdGlvbihhdHRhY2tlciwgYW5pbWFfbmFtZSwgaGl0X2NhbGxiYWNrLCBmaW5pc2hfY2FsbGJhY2ssIGlzX2xvb3AsIGlzX3JldmVyc2UsIGF0dGFja19mdW5jLCBhbmltYV9yZXMpe1xuICAgICAgICB2YXIgbW9kZWwgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpXG4gICAgICAgIHZhciBjYWxsRnVuYyA9IGNjLmNhbGxGdW5jKChmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIGFuaW1hdGlvbkV2ZW50RnVuYyA9IChmdW5jdGlvbiAoZXZlbnRfbmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChldmVudF9uYW1lID09IFwiaGl0XCIgfHwgZXZlbnRfbmFtZSA9PSBcIkhpdFwiIHx8IGV2ZW50X25hbWUgPT0gXCJISVRcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNrZXIuaGl0X3RpbWUgPCBhdHRhY2tlci5oaXRfbnVtICYmIGhpdF9jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0X2NhbGxiYWNrKClcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFja2VyLmhpdF90aW1lICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihldmVudF9uYW1lID09IFwiYmFja1wiIHx8IGV2ZW50X25hbWUgPT0gXCJCYWNrXCIgfHwgZXZlbnRfbmFtZSA9PSBcIkJBQ0tcIil7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2tlci5pc19hdHRhY2sgPT0gYW5pbWFfbmFtZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUF0dGFja2VyTW92ZShhdHRhY2tlciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5pc19hdHRhY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZXZlbnRfbmFtZSA9PSBcImF0dGFja1wiKXsgICAgICAgICAgICAgICAgICAgLy8g5pS75Ye754K5XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2tlci5pbl9hcmVhX2VmZmVjdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5pc19hcmVhX2F0dGFjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5oaXRfdGltZSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwuYXJlYUh1cnQoYXR0YWNrZXIpO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihhdHRhY2tfZnVuYyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tfZnVuYygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsLmF0dGFja1BvaW50KGF0dGFja2VyKTtcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZihldmVudF9uYW1lID09IFwiaGl0X25vbmVcIil7ICAgICAgICAgICAgICAgICAvLyDml6DkvKTlrrPnmoTlj5flh7vliqjkvZxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwuYWN0SHVydChhdHRhY2tlcik7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZXZlbnRfbmFtZSA9PSBcImhpdF9iaWdcIil7ICAgICAgICAgICAgICAgICAgLy8g5pKt5pS+5Y+X5Ye754m55pWIXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsLmFjdEh1cnQoYXR0YWNrZXIsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGV2ZW50X25hbWUgPT0gXCJyZWFkeVwiKXsgICAgICAgICAgICAgICAgICAgIC8vIOi/nOeoi+WtkOW8ueWPkeWwhOeCuSzku6Xlj4rov5znqIvlh7rmiYvliY3liqjkvZxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWwuYXR0YWNrUmVhZHkoYXR0YWNrZXIpO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGV2ZW50X25hbWUgPT0gXCJzaGFrZV9wb2ludFwiKXsgICAgICAgICAgICAgIC8vIOmch+Wxj+eCuVxuICAgICAgICAgICAgICAgICAgICBtb2RlbC5wbGF5U2hha2VTY3JlZW4oYXR0YWNrZXIuc2hha2VfaWQpO1xuICAgICAgICAgICAgICAgIH1lbHNlIGlmKGV2ZW50X25hbWUgPT0gXCJtb3ZlXCIpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUF0dGFja2VyTW92ZShhdHRhY2tlcik7XG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoZXZlbnRfbmFtZS5pbmRleE9mKFwiaGl0X251bVwiKSAhPSAtMSl7ICAgICAgLy8g5aSa5q615pS75Ye7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdmFyIGFuaW1hdGlvbkNvbXBsZXRlRnVuYyA9IChmdW5jdGlvbihldmVudF9hbmltYXRpb24pe1xuICAgICAgICAgICAgICAgIGlmIChldmVudF9hbmltYXRpb24gPT0gYW5pbWFfbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNrZXIuaGl0X3RpbWUgPCBhdHRhY2tlci5oaXRfbnVtICYmIGhpdF9jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGl0X2NhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5oaXRfdGltZSArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaW5pc2hfY2FsbGJhY2spe1xuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoX2NhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5aaC5p6c5piv576k5pS7LOebtOaOpeaSreaUvuWujOWKqOS9nOS5i+WQjuWbnuWIsOermeeriyzkuI3pnIDopoHnrYnnibnmlYhcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2tlci5wbGF5X3N0YW5kID09IDEpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2tlci5pc19yZWFsKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBbmltYXRpb24oYXR0YWNrZXIsIFBsYXllckFjdGlvbi5iYXR0bGVfc3RhbmQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QW5pbWF0aW9uKGF0dGFja2VyLCBQbGF5ZXJBY3Rpb24ucnVuLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXR0YWNrZXIuZG9TdGFuZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5pc19hcmVhX2F0dGFjayA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdEZpbmlzaChhdHRhY2tlcikgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXR0YWNrZXIuc2V0SGFsbG93c1JvdW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIGF0dGFja2VyLmluX2FuaW1hdGlvbiA9IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuYmluZCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgYXR0YWNrZXIuaGl0X3RpbWUgPSAwO1xuICAgICAgICAgICAgICAgIGF0dGFja2VyLmhpdF9udW0gPSBNYXRoLm1heCgxLCBhdHRhY2tlci5zcGxpdF9odXJ0IHx8IDEpXG4gICAgICAgICAgICAgICAgLy8gYXR0YWNrZXIuY3VycmVudF9hbmltZSA9IGFuaW1hX25hbWVcbiAgICAgICAgICAgICAgICAvLyBhdHRhY2tlci5hbmltYV9uYW1lID0gYW5pbWFfbmFtZTtcbiAgICAgICAgICAgICAgICBhdHRhY2tlci5pbl9hbmltYXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChpc19yZXZlcnNlID09IHRydWUpe1xuICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5yZXZlcnNlKC1hdHRhY2tlci5vYmpfdHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXR0YWNrZXIuc2V0QW5pbWF0aW9uQWN0aW9uRnVuYyhhbmltYXRpb25FdmVudEZ1bmMsIGFuaW1hdGlvbkNvbXBsZXRlRnVuYywgYW5pbWFfbmFtZSk7XG4gICAgICAgICAgICB0aGlzLnNldEFuaW1hdGlvbihhdHRhY2tlciwgYW5pbWFfbmFtZSwgaXNfbG9vcCwgY2FsbGJhY2ssIGFuaW1hX3Jlcyk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpO1xuICAgICAgICByZXR1cm4gY2FsbEZ1bmM7XG4gICAgfSxcblxuICAgIC8vIOiuvue9ruWKqOS9nFxuICAgIHNldEFuaW1hdGlvbjpmdW5jdGlvbihhdHRhY2tlciwgYW5pbWFfbmFtZSwgaXNfbG9vcCwgY2FsbGJhY2ssIGFuaW1hX3Jlcyl7XG4gICAgICAgIGlmIChhbmltYV9uYW1lICYmIGFuaW1hX25hbWUuaW5kZXhPZihcIkVcIikgPT0gLTEgKXtcbiAgICAgICAgICAgIGF0dGFja2VyLnJldmVyc2UoYXR0YWNrZXIub2JqX3R5cGUpO1xuICAgICAgICAgICAgYXR0YWNrZXIucGxheUFjdGlvbk9uY2UoYW5pbWFfbmFtZSwgYW5pbWFfcmVzLCBpc19sb29wKTtcbiAgICAgICAgfVxuICAgICAgICBpZihjYWxsYmFjayl7XG4gICAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICog5pmu6YCa6L+R5oiY5pS75Ye7XG4gICAgICogQHBhcmFtIHsqfSBhdHRhY2tlciBcbiAgICAgKiBAcGFyYW0geyp9IGRlbGF5X3RpbWUgXG4gICAgICogQHBhcmFtIHsqfSBhbmltYV9uYW1lIFxuICAgICAqIEBwYXJhbSB7Kn0gaGl0X2NhbGxiYWNrIFxuICAgICAqIEBwYXJhbSB7Kn0gc3RhcnRfY2FsbGJhY2sgXG4gICAgICogQHBhcmFtIHsqfSBmaW5pc2hfY2FsbGJhY2sgXG4gICAgICogQHBhcmFtIHsqfSBpc19yZXZlcnNlIFxuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrX2Z1bmMgXG4gICAgICogQHBhcmFtIHsqfSBhbmltYV9yZXMgXG4gICAgICovXG4gICAgYXR0YWNrOmZ1bmN0aW9uKGF0dGFja2VyLCBkZWxheV90aW1lLCBhbmltYV9uYW1lLCBoaXRfY2FsbGJhY2ssIHN0YXJ0X2NhbGxiYWNrLCBpc19yZXZlcnNlLCBhdHRhY2tfZnVuYywgYW5pbWFfcmVzKXtcbiAgICAgICAgLy8gY29uc29sZS50cmFjZSgpO1xuICAgICAgICB2YXIgc3RhcnRmdW4gPSBudWxsO1xuICAgICAgICBpZiAoc3RhcnRfY2FsbGJhY2spe1xuICAgICAgICAgICAgc3RhcnRmdW4gPSBjYy5jYWxsRnVuYyhzdGFydF9jYWxsYmFjaylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdFN0YXJ0KGF0dGFja2VyKSAgICAgICAgICAgIC8vIOW8gOWni+a3u+WKoOS4gOS4i+e7n+iuoVxuICAgICAgICBhdHRhY2tlci5pc19hdHRhY2sgPSBhbmltYV9uYW1lOyAgICAvLyDorrDlvZXkuIDkuIvmlLvlh7vliqjkvZxcbiAgICAgICAgLy8g5pKt5pS+6Z+z5pWIXG4gICAgICAgIGlmIChhdHRhY2tlci5zaG91dF90cmljayAhPSBcIlwiICYmIGF0dGFja2VyLmlzX3JlYWwgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgVXRpbHMucGxheUVmZmVjdFNvdW5kKEFVRElPX1RZUEUuQkFUVExFLCBhdHRhY2tlci5zaG91dF90cmljayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ZnVuID09IG51bGwpe1xuXHRcdCAgICByZXR1cm4gdGhpcy5hZGREZWxheShhdHRhY2tlciwgZGVsYXlfdGltZSwgdGhpcy5zZXRBbmltYXRpb25XaXRoRXZlbnQoYXR0YWNrZXIsIGFuaW1hX25hbWUsIGhpdF9jYWxsYmFjaywgbnVsbCwgZmFsc2UsIGlzX3JldmVyc2UsIGF0dGFja19mdW5jLCBhbmltYV9yZXMpKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZERlbGF5KGF0dGFja2VyLCBkZWxheV90aW1lLCBjYy5zZXF1ZW5jZShzdGFydGZ1biwgdGhpcy5zZXRBbmltYXRpb25XaXRoRXZlbnQoYXR0YWNrZXIsIGFuaW1hX25hbWUsIGhpdF9jYWxsYmFjaywgbnVsbCwgZmFsc2UsIGlzX3JldmVyc2UsIGF0dGFja19mdW5jLCBhbmltYV9yZXMpKSlcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmkq3mlL7ojIPlm7TnibnmlYhcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIOaWveazleiAhVxuICAgICAqIEBwYXJhbSB7Kn0gZWZmZWN0X2xpc3Qg54m55pWI5YiX6KGoXG4gICAgICogQHBhcmFtIHsqfSByZXZlcnNlIOaYr+WQpumcgOimgeWPjei9rC7ov5nkuKrkuZ/mmK/ot5/mlr3ms5XogIXnmoRvYmpfdHlwZeS4gOiHtOeahFxuICAgICAqIEBwYXJhbSB7Kn0gaXNfcmVsZWFzZSDmmK/lkKbmkq3mlL7lrozph4rmlL7mjoks6L+Z5Liq5Y+v5Lul5pyJ5Y+v5pegLOWIsOaXtuWAmeWFqOmDqOWvueixoeaxoOWbnuaUtlxuICAgICAqIEBwYXJhbSB7Kn0gc2NlbmVfcG9zIOaJgOWkhOS9jee9rlxuICAgICAqIEBwYXJhbSB7Kn0gaGl0X2NhbGxiYWNrIOaJk+WHu+Wbnuiwg1xuICAgICAqIEBwYXJhbSB7Kn0gYmlkIOeJueaViElEIOmdnuiHquaEv2lkXG4gICAgICogQHBhcmFtIHsqfSBpc19yZWxlYXNlIOeJueaViOaSreaUvuS4gOasoeWujOaIkOaYr+WQpumHiuaUvlxuICAgICAqL1xuICAgIGVmZmVjdEFyZWE6ZnVuY3Rpb24oYXR0YWNrZXIsIGVmZmVjdF9saXN0LCByZXZlcnNlLCBpc19yZWxlYXNlLCBzY2VuZV9wb3MsIGhpdF9jYWxsYmFjaywgYmlkKXtcbiAgICAgICAgaWYgKGlzX3JlbGVhc2UgPT0gbnVsbCl7XG4gICAgICAgICAgICBpc19yZWxlYXNlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBtb2RlbCA9IHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkgXG4gICAgICAgIHZhciBiYXR0bGVfc2NlbmUgPSBtb2RlbC5nZXRCYXR0bGVTY2VuZSgpO1xuICAgICAgICBpZiAoYmF0dGxlX3NjZW5lID09IG51bGwpe1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIDLkuKrnibnmlYjlsYJcbiAgICAgICAgdmFyIGxheWVyID0gW2JhdHRsZV9zY2VuZS5nZXRCYXR0bGVFZmZlY3RMYXllcigxKSwgYmF0dGxlX3NjZW5lLmdldEJhdHRsZUVmZmVjdExheWVyKDIpXTtcbiAgICAgICAgLy8g6K6w5b2V5Y+q6Kem5Y+R5LiA5qyhaGl0Y2FsbGJhY2tcbiAgICAgICAgdmFyIGlzX3BsYXlfZWZmZWN0ID0gZmFsc2U7XG4gICAgICAgIC8vIOaViOaenFxuICAgICAgICBjb25zdCBlZmZlY3RfY29uZmlnID0gQ29uZmlnLnNraWxsX2RhdGEuZGF0YV9nZXRfZWZmZWN0X2RhdGFbYmlkXTtcblxuICAgICAgICAvLyDlj6/og73lm6DkuLrnvJbor5HlmajnmoTpl67popgg6L+Z5Liq5pa55rOV5LiN6IO95YaZ5YiwZm9y5b6q546v6YeM6Z2i5Y675omn6KGM5aSa5qyhLOmCo+aXtuWAmeWPquS8muiiq+iwg+eUqOS4gOasoVxuICAgICAgICB2YXIgZmluaXNoX2NhbGxiYWNrID0gZnVuY3Rpb24gKGF0dGFja2VyLCBiYXR0bGVfZWZmZWN0LCBpc19sb29wKSB7XG4gICAgICAgICAgICBpZiAoIWlzX2xvb3Ape1xuICAgICAgICAgICAgICAgIGF0dGFja2VyLmluX2FyZWFfZWZmZWN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICBtb2RlbC5kZWxCYXR0bGVFZmZlY3QoYmF0dGxlX2VmZmVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFjdEZpbmlzaChhdHRhY2tlcik7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICAvLyDliJvlu7rnibnmlYjnu4RcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVmZmVjdF9saXN0Lmxlbmd0aDsgaW5kZXgrKykgeyAgLy8gaW5kZXggPT0gMCDmmK/kuIrlsYLnibnmlYgsIDEg5piv5LiL5bGC54m55pWIXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZWZmZWN0X2xpc3RbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gXCJcIil7XG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbl9uYW1lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoZWZmZWN0X2NvbmZpZyl7XG4gICAgICAgICAgICAgICAgICAgIGlmKGluZGV4ID09IDApeyAgICAgICAgICAgICAvLyDkuIrlsYLnibnmlYhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9uYW1lID0gZWZmZWN0X2NvbmZpZy51cF9hY3Rpb25fbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoaW5kZXggPT0gMSl7ICAgICAgIC8vIOS4i+WxgueJueaViFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX25hbWUgPSBlZmZlY3RfY29uZmlnLmRvd25fYWN0aW9uX25hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbl9uYW1lID09IFwiXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX25hbWUgPSBQbGF5ZXJBY3Rpb24uYWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIOWIm+W7uueJueaViOWNleS9jSwg6L+Z5Liq54m55pWI5pqC5pe26L+Y5rKh5pyJ5riF5qWa5o6JLOWQjumdouimgeeci+aUvuWcqOWTqumHjOa4healmuaOiSzkv53or4Hog73lrozlhajlm57mlLZcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uX25hbWUgIT0gXCJcIil7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiYXR0bGVfZWZmZWN0ID0gbW9kZWwuYWRkQmF0dGxlRWZmZmVjdChsYXllcltpbmRleF0sIHNjZW5lX3BvcywgcmV2ZXJzZSwgZWxlbWVudCwgYWN0aW9uX25hbWUpXG4gICAgICAgICAgICAgICAgICAgIGlmKGlzX3JlbGVhc2UgPT0gZmFsc2UpeyAgICAvLyDlhYjlgqjlrZjliLDlnLrmma/nibnmlYjph4zpnaLljrtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmFkZFNjZW5lQnVmZkVmZmVjdChhdHRhY2tlci5ncm91cCwgYmlkLCBlbGVtZW50LCBiYXR0bGVfZWZmZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdFN0YXJ0KGF0dGFja2VyKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0X2NhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYoICFpc19wbGF5X2VmZmVjdCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc19wbGF5X2VmZmVjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9jYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGl0X2NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdF9jYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5pbl9hcmVhX2VmZmVjdCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdCA9IHRoaXMuc2V0QW5pbWFXaXRoRXZlbnRGaW5pc2goYXR0YWNrZXIsIGFjdGlvbl9uYW1lLCBzdGFydF9jYWxsYmFjaywgZmluaXNoX2NhbGxiYWNrLCBiYXR0bGVfZWZmZWN0LCAhaXNfcmVsZWFzZSk7XG4gICAgICAgICAgICAgICAgICAgIGJhdHRsZV9lZmZlY3QucnVuQWN0aW9uKGFjdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOaSreaUvueJueaViFxuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrZXIgXG4gICAgICogQHBhcmFtIHsqfSBhY3Rpb25fbmFtZSDliqjkvZzlkI1cbiAgICAgKiBAcGFyYW0geyp9IGhpdF9jYWxsYmFjayBcbiAgICAgKiBAcGFyYW0geyp9IGZpbmlzaF9jYWxsYmFjayBcbiAgICAgKiBAcGFyYW0geyp9IGJhdHRsZV9lZmZlY3Qg5a+56LGh5Li6QmF0dGxlRWZmZWN0XG4gICAgICogQHBhcmFtIHsqfSBpc19sb29wIOaYr+WQpuW+queOr1xuICAgICAqL1xuICAgIHNldEFuaW1hV2l0aEV2ZW50RmluaXNoOmZ1bmN0aW9uKGF0dGFja2VyLCBhY3Rpb25fbmFtZSwgaGl0X2NhbGxiYWNrLCBmaW5pc2hfY2FsbGJhY2ssIGJhdHRsZV9lZmZlY3QsIGlzX2xvb3Ape1xuICAgICAgICB2YXIgbW9kZWwgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpIFxuICAgICAgICB2YXIgY2FsbEZ1bmMgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIGFuaW1hdGlvbkNvbXBsZXRlRnVuYyA9IGZ1bmN0aW9uIChldmVudF9hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnRfYW5pbWF0aW9uID09IGFjdGlvbl9uYW1lKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJhdHRsZV9lZmZlY3QuaGl0X3RpbWUgPCBiYXR0bGVfZWZmZWN0LmhpdF9udW0gJiYgaGl0X2NhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXRfY2FsbGJhY2soKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmF0dGxlX2VmZmVjdC5oaXRfdGltZSArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFja2VyLmluX2FyZWFfZWZmZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNrZXIuYXJlYV9oaXRfdGltZSA9IGJhdHRsZV9lZmZlY3QuaGl0X3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmlzaF9jYWxsYmFjayl7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hfY2FsbGJhY2soYXR0YWNrZXIsIGJhdHRsZV9lZmZlY3QsIGlzX2xvb3ApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFuaW1hdGlvbkV2ZW50RnVuYyA9IG51bGw7XG4gICAgICAgICAgICBpZiAoaGl0X2NhbGxiYWNrKXtcbiAgICAgICAgICAgICAgICBhbmltYXRpb25FdmVudEZ1bmMgPSBmdW5jdGlvbiAoZXZlbnRfbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRfbmFtZSA9PSBcImhpdFwiIHx8IGV2ZW50X25hbWUgPT0gXCJIaXRcIiB8fCBldmVudF9uYW1lID09IFwiSElUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXR0bGVfZWZmZWN0LmhpdF90aW1lIDwgYmF0dGxlX2VmZmVjdC5oaXRfbnVtICYmIGhpdF9jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpdF9jYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdHRsZV9lZmZlY3QuaGl0X3RpbWUgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNrZXIuaW5fYXJlYV9lZmZlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNrZXIuYXJlYV9oaXRfdGltZSA9IGJhdHRsZV9lZmZlY3QuaGl0X3RpbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50X25hbWUgPT0gXCJoaXRfbm9uZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5hY3RIdXJ0KGF0dGFja2VyKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudF9uYW1lID09IFwiaGl0X2JpZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5hY3RIdXJ0KGF0dGFja2VyLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudF9uYW1lID09IFwic2hha2VfcG9pbnRcIil7ICAgICAgICAgICAgICAgLy8g6ZyH5bGPXG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudF9uYW1lLmluZGV4T2YoXCJoaXRfbnVtXCIpICE9IC0xKSB7ICAgICAgLy8g5aSa5q615pS75Ye7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJhdHRsZV9lZmZlY3QuaGl0X3RpbWUgPSAwXG4gICAgICAgICAgICBiYXR0bGVfZWZmZWN0LmhpdF9udW0gPSAxXG4gICAgICAgICAgICBiYXR0bGVfZWZmZWN0LnNldEFuaW1hdGlvbkFjdGlvbkZ1bmMoYW5pbWF0aW9uRXZlbnRGdW5jLCBhbmltYXRpb25Db21wbGV0ZUZ1bmMsIGFjdGlvbl9uYW1lKTtcbiAgICAgICAgICAgIGJhdHRsZV9lZmZlY3QucGxheUFjdGlvbk9uY2UoYWN0aW9uX25hbWUsIG51bGwsIGlzX2xvb3ApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGNhbGxGdW5jO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDmkq3mlL7lj5flh7vliqjkvZxcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFxuICAgICAqIEBwYXJhbSB7Kn0gaHVydF9hY3Rpb24gXG4gICAgICogQHBhcmFtIHsqfSBwbGF5X2VmZmVjdCDmmK/lkKbmkq3mlL7pn7PmlYgs5Zug5Li65Y+v6IO95piv576k5pS755qE5pe25YCZLOWPqumcgOimgeaSreaUvuS4gOasoemfs+aViFxuICAgICAqL1xuICAgIGh1cnQ6ZnVuY3Rpb24oYXR0YWNrZXIsIHRhcmdldCwgaHVydF9hY3Rpb24sIHBsYXlfZWZmZWN0KXtcbiAgICAgICAgaWYoYXR0YWNrZXIgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGh1cnRfYWN0aW9uID09IG51bGwgfHwgaHVydF9hY3Rpb24gPT0gXCJcIil7XG4gICAgICAgICAgICBodXJ0X2FjdGlvbiA9IFBsYXllckFjdGlvbi5odXJ0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYXlfZWZmZWN0ID09IG51bGwpe1xuICAgICAgICAgICAgcGxheV9lZmZlY3QgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB2YXIgYmFja190aW1lID0gMC4wMjsgICAgICAgICAgICAgICAgICAgLy8g6L+H5Y675pe26Ze0XG4gICAgICAgIHZhciByZXR1cm5fdGltZSA9IDAuMDU7ICAgICAgICAgICAgICAgICAvLyDlm57mnaXml7bpl7RcbiAgICAgICAgdmFyIGRlbGF5X3RpbWUgPSAwLjI7ICAgICAgICAgICAgICAgICAgIC8vIOS/neaMgeaXtumXtFxuICAgICAgICB2YXIgb2ZmX3dpZHRoID0gMTggKiB0YXJnZXQub2JqX3R5cGU7ICAgLy8g5Y+X5Ye75YGP56e7XG5cbiAgICAgICAgdGFyZ2V0LmluX2h1cnRfYWN0ID0gdHJ1ZSAgIC8vIOiuvue9ruWPl+WHu+eKtuaAgVxuICAgICAgICAvLyDov5nph4zlgZrliIfmjaLnirbmgIEs5rKh5pyJ5YGa6KKr5Y+Y5b2i5Yik5patLOWmguaenOaYr+iiq+WPmOW9ouS6hizlsLHpnIDopoHliJvlu7rkv67mlLlcbiAgICAgICAgLy8g5pKt5pS+6Z+z5pWILOaaguaXtuayoeWunueOsFxuICAgICAgICBpZiAocGxheV9lZmZlY3QgPT0gdHJ1ZSAmJiBhdHRhY2tlci5oaXRfc291bmQgIT0gXCJcIiAmJiBhdHRhY2tlci5pc19yZWFsID09IHRydWUpe1xuICAgICAgICAgICAgVXRpbHMucGxheUVmZmVjdFNvdW5kKEFVRElPX1RZUEUuQkFUVExFLCBhdHRhY2tlci5oaXRfc291bmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFuaW1hdGlvbkNvbXBsZXRlRnVuYyA9IGZ1bmN0aW9uKGV2ZW50X2FuaW1hdGlvbil7XG4gICAgICAgICAgICBpZiAoZXZlbnRfYW5pbWF0aW9uID09IGh1cnRfYWN0aW9uKXtcbiAgICAgICAgICAgICAgICB0YXJnZXQuaW5faHVydF9hY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0YXJnZXQuY2hlY2tJc0RpZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuc2V0QW5pbWF0aW9uQWN0aW9uRnVuYyhudWxsLCBhbmltYXRpb25Db21wbGV0ZUZ1bmMsIGh1cnRfYWN0aW9uKTtcblxuICAgICAgICB2YXIgY2FsbEZ1bmMgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZih0YXJnZXQuaW5faHVydF9hY3QgPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgICAgdGFyZ2V0LnBsYXlBY3Rpb25PbmNlKGh1cnRfYWN0aW9uLCBudWxsLCBmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdmFyIG12X3RfMSA9IGNjLm1vdmVCeShiYWNrX3RpbWUsIC1vZmZfd2lkdGgsIDApO1xuICAgICAgICB2YXIgZGVsYXlfdGltZSA9IGNjLmRlbGF5VGltZShkZWxheV90aW1lKTtcbiAgICAgICAgdmFyIG12X3RfMiA9IGNjLm1vdmVCeShyZXR1cm5fdGltZSwgb2ZmX3dpZHRoLCAwKTtcbiAgICAgICAgdmFyIGZpbmlzaEZ1bmMgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0YXJnZXQuaXNfaHVydF9wbGF5ID0gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgICAgdmFyIGFjdCA9IGNjLnNlcXVlbmNlKGNhbGxGdW5jLCBtdl90XzEsIGRlbGF5X3RpbWUsIG12X3RfMiwgZmluaXNoRnVuYyk7XG4gICAgICAgIHRhcmdldC5ydW5BY3Rpb24oYWN0KTtcbiAgICB9LFxuXG4gICAgLy8g5Y2V5L2N5Ly06ZqP54m55pWILOS5n+WwseaYr+aMguWcqOS6uui6q+S4iueahCzljIXlkKvmioDog73lh7rmi5vnibnmlYgs5ZKMYnVmZueJueaViCzlkozlj5flh7vnibnmlYhcbiAgICBlZmZlY3RTcGluZVVzZXI6ZnVuY3Rpb24oYXR0YWNrZXIsIGlzX3JlbGVhc2UsIHhfZml4LCBoZWlnaHQsIGVmZmVjdF9saXN0LCB0YXJnZXQsIHNjYWxlLCBjYWxsYmFjaywgYmlkLCBvYmpfdHlwZSl7XG4gICAgICAgIGlmIChlZmZlY3RfbGlzdCA9PSBudWxsIHx8IGVmZmVjdF9saXN0Lmxlbmd0aCA9PSAwIHx8IGJpZCA9PSBudWxsKXtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgYXR0YWNrZXI7XG4gICAgICAgIHZhciB6b3JlZHJfb2Zmc2V0ID0gWzk5LCAtOTk5XVxuICAgICAgICB2YXIgaXNfZm9ybnQgPSBmYWxzZVxuICAgICAgICBpZiAoIWhlaWdodCl7XG4gICAgICAgICAgICBoZWlnaHQgPSA2MDtcbiAgICAgICAgfVxuICAgICAgICBoZWlnaHQgPSBoZWlnaHQgKiBhdHRhY2tlci5tb2RlbF9oZWlnaHQgKiAwLjAxO1xuICAgICAgICBjb25zdCBlZmZlY3RfY29uZmlnID0gQ29uZmlnLnNraWxsX2RhdGEuZGF0YV9nZXRfZWZmZWN0X2RhdGFbYmlkXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGVmZmVjdF9saXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVmZmVjdF9saXN0W2luZGV4XTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IFwiXCIpe1xuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25fbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdF9jb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsgICAgICAgICAgICAgLy8g5LiK5bGC54m55pWIXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbmFtZSA9IGVmZmVjdF9jb25maWcudXBfYWN0aW9uX25hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gMSkgeyAgICAgICAvLyDkuIvlsYLnibnmlYhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9uYW1lID0gZWZmZWN0X2NvbmZpZy5kb3duX2FjdGlvbl9uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25fbmFtZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fbmFtZSA9IFBsYXllckFjdGlvbi5hY3Rpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbl9uYW1lICE9IFwiXCIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5kZXggPT0gMCl7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZm9ybnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g6L+Z6YeM5pyJ6Zeu6aKYIOS4jeiDvei/meS5iOWIpOaWrSzlpoLmnpzmmK/lpJrmrrXmlLvlh7sg6L+Y5piv6ZyA6KaB55qEIOS4gOS4quWKqOS9nOayoeaSreWujCDlsLHnu6fnu63liJvlu7rkuIDkuKpcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBiYXR0bGVfZWZmZWN0X29iamVjdCA9IHRhcmdldC5hZGRCYXR0bGVFZmZmZWN0KHhfZml4LCBoZWlnaHQsIGVsZW1lbnQsIGFjdGlvbl9uYW1lLCBpbmRleCwgb2JqX3R5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhdHRsZV9lZmZlY3Rfb2JqZWN0KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmF0dGxlX2VmZmVjdCA9IGJhdHRsZV9lZmZlY3Rfb2JqZWN0Lm9iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnRfZnVuID0gY2MuY2FsbEZ1bmMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaW5pc2hfY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19yZWxlYXNlID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5kZWxCYXR0bGVFZmZlY3QoZWxlbWVudCwgYWN0aW9uX25hbWUpOyAgICAgICAgICAgLy/np7vpmaTmjonkuIDkuKrnibnmlYhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g6L+Z5Liq5LiN55+l6YGT5pyJ5ZWl55SoLOaaguaXtuazqOmHiuaOiSzkv53or4HnibnmlYjkvJrlnKjnm67moIfkuIrpnaLnmoTor50s5bCx6ZyA6KaB5oqK5pa95rOV6ICF5pS+5Yiw5LiK6Z2i5p2lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHpvcmRlciA9IHRhcmdldC5nZXRMb2NhbFpPcmRlcigpICsgem9yZWRyX29mZnNldFtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZWZmZWN0X2NvbmZpZy5pc19mb3JudCA9PSAxKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgem9yZGVyID0gYXR0YWNrZXIuZ2V0TG9jYWxaT3JkZXIoKS05OTk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2Zvcm50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNfZm9ybnQgPT0gZmFsc2Upe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tlci5zZXRMb2NhbFpPcmRlcih6b3JkZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY3QgPSB0aGlzLnNldEFuaW1hV2l0aEV2ZW50RmluaXNoKGF0dGFja2VyLCBhY3Rpb25fbmFtZSwgbnVsbCwgZmluaXNoX2NhbGxiYWNrLCBiYXR0bGVfZWZmZWN0LCAhaXNfcmVsZWFzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0dGxlX2VmZmVjdC5ydW5BY3Rpb24oY2Muc2VxdWVuY2Uoc3RhcnRfZnVuLCBhY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDpgJrnlKjliJvlu7rlu7bov5/mjqXlj6NcbiAgICAgKiBAcGFyYW0geyp9IHRpbWUgXG4gICAgICovXG4gICAgZHQ6ZnVuY3Rpb24odGltZSl7XG4gICAgICAgIHJldHVybiBjYy5kZWxheVRpbWUodGltZSAvIDYwICogMik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOiuvue9ruaXi+i9rOinkuW6plxuICAgICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFxuICAgICAqIEBwYXJhbSB7Kn0gcG9zIFxuICAgICAqL1xuICAgIGNoYW5nZVJvdGF0aW9uOmZ1bmN0aW9uKHRhcmdldCwgcG9zKXtcbiAgICAgICAgdmFyIHNjZW5lX3BvcyA9IHRhcmdldC5zY2VuZV9wb3M7XG4gICAgICAgIHZhciB0ZW1wX3ggPSBzY2VuZV9wb3MueCAtIHBvcy54O1xuICAgICAgICB2YXIgdGVtcF95ID0gc2NlbmVfcG9zLnkgLSBwb3MueTtcbiAgICAgICAgdmFyIHJhZGlhbiA9IE1hdGguYXRhbih0ZW1wX3kvdGVtcF94KTtcbiAgICAgICAgdmFyIGRlZ3JlZSA9IC0ocmFkaWFuICogKDE4MCAvIE1hdGguUEkpKTtcbiAgICAgICAgdGFyZ2V0LnNldFJvdGF0aW9uKGRlZ3JlZSlcbiAgICB9LFxuXG4gICAgLy8g5peg5Yqo5L2c6L+U5Zue55qEXG4gICAgc2V0Tm90QW5pbWF0aW9uV2l0aEV2ZW50OmZ1bmN0aW9uKGF0dGFja2VyLCBoaXRfY2FsbGJhY2spe1xuICAgICAgICByZXR1cm4gY2MuY2FsbEZ1bmMoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmIChoaXRfY2FsbGJhY2spe1xuICAgICAgICAgICAgICAgIGhpdF9jYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hY3RGaW5pc2goYXR0YWNrZXIpXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIC8vIOaPtOaKpOiAheWPl+WHu+WKqOS9nFxuICAgIGFpZF9odXJ0OiBmdW5jdGlvbiAoYXR0YWNrZXIsIHRhcmdldCwgaHVydF9hY3Rpb24pe1xuICAgICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNfZGllKXtcbiAgICAgICAgICAgICAgICB0YXJnZXQucmVzZXRCYXNlSW5mbygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0YXJnZXQuaW5fYWN0ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFjdEZpbmlzaChhdHRhY2tlcik7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICAgICAgdGFyZ2V0LnJ1bkFjdGlvbihjYy5zZXF1ZW5jZShjYy5jYWxsRnVuYyhmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5zZXRBbmltYXRpb24odGFyZ2V0LCBodXJ0X2FjdGlvbiwgZmFsc2UpXG4gICAgICAgIH0uYmluZCh0aGlzKSksIGNjLmRlbGF5VGltZSgwLjMpLCBjYy5jYWxsRnVuYyhmdW5jdGlvbigpe1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpKSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDml6DliqjkvZzlubbooYzmlLvlh7tcbiAgICAgKiBAcGFyYW0geyp9IGF0dGFja2VyIFxuICAgICAqIEBwYXJhbSB7Kn0gZGVsYXlfdGltZSBcbiAgICAgKiBAcGFyYW0geyp9IGhpdF9jYWxsYmFjayBcbiAgICAgKiBAcGFyYW0geyp9IHN0YXJ0X2NhbGxiYWNrIFxuICAgICAqIEBwYXJhbSB7Kn0gaXNfcmV2ZXJzZSBcbiAgICAgKi9cbiAgICBub0FjdEF0dGFjazpmdW5jdGlvbihhdHRhY2tlciwgZGVsYXlfdGltZSwgaGl0X2NhbGxiYWNrLCBzdGFydF9jYWxsYmFjaywgbmV4dF9kZWxheV90aW1lKXtcbiAgICAgICAgdmFyIHN0YXJ0X2Z1biA9IG51bGw7XG4gICAgICAgIGlmIChzdGFydF9jYWxsYmFjayAhPSBudWxsKXtcbiAgICAgICAgICAgIHN0YXJ0X2Z1biA9IGNjLmNhbGxGdW5jKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgc3RhcnRfY2FsbGJhY2soKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWN0U3RhcnQoYXR0YWNrZXIpO1xuXG4gICAgICAgIGlmIChzdGFydF9mdW4gPT0gbnVsbCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGREZWxheShhdHRhY2tlciwgZGVsYXlfdGltZSwgdGhpcy5zZXROb3RBbmltYXRpb25XaXRoRXZlbnQoYXR0YWNrZXIsIGhpdF9jYWxsYmFjayksIG5leHRfZGVsYXlfdGltZSk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkRGVsYXkoYXR0YWNrZXIsIGRlbGF5X3RpbWUsIGNjLnNlcXVlbmNlKHN0YXJ0X2Z1biwgdGhpcy5zZXROb3RBbmltYXRpb25XaXRoRXZlbnQoYXR0YWNrZXIsIGhpdF9jYWxsYmFjaykpLCBuZXh0X2RlbGF5X3RpbWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIOmjnuihjOWtkOW8uVxuICAgICAqIEBwYXJhbSB7Kn0gYXR0YWNrZXIgXG4gICAgICogQHBhcmFtIHsqfSBkZWxheV90aW1lIFxuICAgICAqIEBwYXJhbSB7Kn0gZWZmZWN0X25hbWUgXG4gICAgICogQHBhcmFtIHsqfSBtb3ZlX3RpbWUgXG4gICAgICogQHBhcmFtIHsqfSBoaXRfY2FsbGJhY2sgXG4gICAgICogQHBhcmFtIHsqfSB0YXJnZXRfcG9zIOebruagh+S9jee9rlxuICAgICAqIEBwYXJhbSB7Kn0gc2NhbGUgXG4gICAgICogQHBhcmFtIHsqfSBiaWQgXG4gICAgICogQHBhcmFtIHsqfSB4X2ZpeCBcbiAgICAgKiBAcGFyYW0geyp9IHlfZml4IFxuICAgICAqL1xuICAgIGZseUl0ZW06IGZ1bmN0aW9uIChhdHRhY2tlciwgZGVsYXlfdGltZSwgZWZmZWN0X25hbWUsIG1vdmVfdGltZSwgaGl0X2NhbGxiYWNrLCBzdGFydF9oZWlnaHQsIHRhcmdldF9wb3MsIHNjYWxlLCBiaWQsIHhfZml4LCB5X2ZpeCl7XG4gICAgICAgIGlmIChhdHRhY2tlciA9PSBudWxsIHx8IGVmZmVjdF9uYW1lID09IG51bGwgfHwgZWZmZWN0X25hbWUgPT0gXCJcIil7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBlZmZlY3RfY29uZmlnID0gQ29uZmlnLnNraWxsX2RhdGEuZGF0YV9nZXRfZWZmZWN0X2RhdGFbYmlkXTtcbiAgICAgICAgaWYgKGVmZmVjdF9jb25maWcgPT0gbnVsbCl7IHJldHVybjsgfVxuICAgICAgICB2YXIgbW9kZWwgPSByZXF1aXJlKFwiYmF0dGxlX2NvbnRyb2xsZXJcIikuZ2V0SW5zdGFuY2UoKS5nZXRNb2RlbCgpXG4gICAgICAgIHZhciBiYXR0bGVfc2NlbmUgPSBtb2RlbC5nZXRCYXR0bGVTY2VuZSgpO1xuICAgICAgICBpZiAoYmF0dGxlX3NjZW5lID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGFyZW50ID0gYmF0dGxlX3NjZW5lLmdldEJhdHRsZVJvbGVMYXllcigpXG5cbiAgICAgICAgdmFyIGFjdGlvbl9uYW1lID0gUGxheWVyQWN0aW9uLmFjdGlvbjtcbiAgICAgICAgaWYgKGVmZmVjdF9jb25maWcudXBfYWN0aW9uX25hbWUgIT0gXCJcIil7XG4gICAgICAgICAgICBhY3Rpb25fbmFtZSA9IGVmZmVjdF9jb25maWcudXBfYWN0aW9uX25hbWVcbiAgICAgICAgfVxuICAgICAgICB2YXIgZHQgPSB0aGlzLmR0KGRlbGF5X3RpbWUpO1xuICAgICAgICB2YXIgY2FsbEZ1bmMgPSBjYy5jYWxsRnVuYygoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIHRoaXMuYWN0U3RhcnQoYXR0YWNrZXIpO1xuICAgICAgICAgICAgLy8g6L+Z5Liq5a2Q5by55Lmf6ZyA6KaB5Yib5bu65Yiw5Zy65pmv5Lit5Y67LuiAjOS4jeiDvee7keWcqOaWveazleiAhei6q+S4iizlm6DkuLrkvJrmnInlsYLnuqfpl67pophcbiAgICAgICAgICAgIHZhciBiYXNlX3BvcyA9IGF0dGFja2VyLnNjZW5lX3BvcztcbiAgICAgICAgICAgIHZhciBzdGFydF9wb3MgPSBjYy52MihiYXNlX3Bvcy54LCBiYXNlX3Bvcy55ICsgc3RhcnRfaGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBiYXR0bGVfZWZmZWN0ID0gbW9kZWwuYWRkQmF0dGxlRWZmZmVjdChwYXJlbnQsIHN0YXJ0X3BvcywgYXR0YWNrZXIub2JqX3R5cGUsIGVmZmVjdF9uYW1lLCBhY3Rpb25fbmFtZSk7XG4gICAgICAgICAgICBiYXR0bGVfZWZmZWN0LnBsYXlBY3Rpb25PbmNlKGFjdGlvbl9uYW1lLCBudWxsLCB0cnVlKTsgICAgICAgLy8g5omL5Yqo5pKt5pS+54m55pWIXG5cbiAgICAgICAgICAgIHZhciBzdGFydF9mdW4gPSBjYy5jYWxsRnVuYygoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGF0dGFja2VyLmluX2FyZWFfZWZmZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICB2YXIgaGl0X2Z1biA9IGNjLmNhbGxGdW5jKChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhpdF9jYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICBoaXRfY2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAgICAgdmFyIGZpbmlzaF9mdW4gPSBjYy5jYWxsRnVuYygoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGF0dGFja2VyLmluX2FyZWFfZWZmZWN0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdEZpbmlzaChhdHRhY2tlcik7XG4gICAgICAgICAgICAgICAgLy8g6L+Z6YeM6KaB5bmy5o6J54m55pWIXG4gICAgICAgICAgICAgICAgbW9kZWwuZGVsQmF0dGxlRWZmZWN0KGJhdHRsZV9lZmZlY3QpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgICAgIHZhciB5X29mZnNldCA9ICh0YXJnZXRfcG9zLnkgLSBzdGFydF9wb3MueSkgKiBNYXRoLmFicyh4X2ZpeCkgLyAodGFyZ2V0X3Bvcy54IC0gYmFzZV9wb3MueCAtIHhfZml4KSAqIGF0dGFja2VyLm9ial90eXBlO1xuICAgICAgICAgICAgdmFyIHBvc190ZW1wID0gY2MudjIodGFyZ2V0X3Bvcy54ICsgeF9maXgsIHRhcmdldF9wb3MueSAtIHlfb2Zmc2V0KTtcbiAgICAgICAgICAgIHZhciBtb3ZlVG8gPSBjYy5tb3ZlVG8obW92ZV90aW1lLzYwLCBwb3NfdGVtcCk7XG4gICAgICAgICAgICB2YXIgc2V0Wm9yZGVyID0gY2MuY2FsbEZ1bmMoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgYmF0dGxlX2VmZmVjdC5zZXRMb2NhbFpPcmRlcig3MjArdGFyZ2V0X3Bvcy55Kzk5OSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VSb3RhdGlvbihiYXR0bGVfZWZmZWN0LCBwb3NfdGVtcCk7XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgYmF0dGxlX2VmZmVjdC5ydW5BY3Rpb24oY2Muc2VxdWVuY2Uoc3RhcnRfZnVuLCBzZXRab3JkZXIsIG1vdmVUbywgaGl0X2Z1biwgZmluaXNoX2Z1bikpO1xuICAgICAgICB9KS5iaW5kKHRoaXMpKTtcbiAgICAgICAgcmV0dXJuIGNjLnNlcXVlbmNlKGR0LCBjYWxsRnVuYyk7XG4gICAgfSxcblxuICAgIC8vIOa4kOmakOaSreaKpVxuICAgIGZhZGVPdXQ6ZnVuY3Rpb24oYXR0YWNrZXIsIGRlbGF5X3RpbWUsIHRpbWUpe1xuICAgICAgICB2YXIgb3V0X3RpbWUgPSB0aW1lIC8gMzA7XG4gICAgICAgIC8vIHZhciBhY3QgPSBjYy5jYWxsRnVuYyhmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vICAgICBhdHRhY2tlci5ydW5BY3Rpb24oY2MuZmFkZU91dChvdXRfdGltZSkpOyBcbiAgICAgICAgLy8gfS5iaW5kKHRoaXMpKTtcbiAgICAgICAgdmFyIGFjdCA9IGNjLmZhZGVPdXQob3V0X3RpbWUpXG4gICAgICAgIHJldHVybiB0aGlzLmFkZERlbGF5KGF0dGFja2VyLCBkZWxheV90aW1lLCBhY3QpO1xuICAgIH0sXG5cbiAgICAvLyDmuJDnjrDlh7rmnaVcbiAgICBmYWRlSW46ZnVuY3Rpb24oYXR0YWNrZXIsIGRlbGF5X3RpbWUsIHRpbWUpe1xuICAgICAgICB2YXIgaW5fdGltZSA9IHRpbWUgLyAzMDtcbiAgICAgICAgLy8gdmFyIGFjdCA9IGNjLmNhbGxGdW5jKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gICAgIGF0dGFja2VyLnJ1bkFjdGlvbihjYy5mYWRlSW4oaW5fdGltZSkpOyAgIFxuICAgICAgICAvLyB9KVxuICAgICAgICB2YXIgYWN0ID0gY2MuZmFkZUluKGluX3RpbWUpXG4gICAgICAgIHJldHVybiB0aGlzLmFkZERlbGF5KGF0dGFja2VyLCBkZWxheV90aW1lLCBhY3QpO1xuICAgIH0sXG5cbiAgICAvLyDpmpDol4/ooYDmnaFcbiAgICBoaWRlVUk6ZnVuY3Rpb24oYXR0YWNrZXIsIGRlbGF5X3RpbWUpe1xuICAgICAgICB2YXIgc3RhcnRfZnVuID0gY2MuY2FsbEZ1bmMoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBhdHRhY2tlci5zaG93SHBSb290KGZhbHNlKTtcbiAgICAgICAgfSkuYmluZCh0aGlzKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRGVsYXkoYXR0YWNrZXIsIGRlbGF5X3RpbWUsIHN0YXJ0X2Z1bik7XG4gICAgfSxcblxuICAgIC8vIOaYvuekuuihgOadoVxuICAgIHNob3dVSTpmdW5jdGlvbihhdHRhY2tlciwgZGVsYXlfdGltZSl7XG4gICAgICAgIHZhciBzdGFydF9mdW4gPSBjYy5jYWxsRnVuYygoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGF0dGFja2VyLnNob3dIcFJvb3QodHJ1ZSk7XG4gICAgICAgIH0pLmJpbmQodGhpcykpXG4gICAgICAgIHJldHVybiB0aGlzLmFkZERlbGF5KGF0dGFja2VyLCBkZWxheV90aW1lLCBzdGFydF9mdW4pO1xuICAgIH0sXG5cbiAgICAvLyDmiqTnm77nmoTlkLjmlLYsIOeUqOeahOaYrzI15Y+35a2X5L2TKGhlaWdodD0zMSlcbiAgICBwbGF5QnVmZkFic29yYkh1cnQ6IGZ1bmN0aW9uICh0YXJnZXQsIGFic29yYl92YWwpe1xuICAgICAgICB0aGlzLnBsYXlEbWdNZXNzYWdlKHRhcmdldCwgYWJzb3JiX3ZhbCwgbnVsbCwgZmFsc2UsIDAsIHRydWUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiDkvKTlrrPpo5jooYBcbiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBcbiAgICAgKiBAcGFyYW0geyp9IGRtZyBcbiAgICAgKiBAcGFyYW0geyp9IGVmZmVjdF9oaXQg5piv5ZCm5pq05Ye7LOS4uiAy55qE5pe25YCZ5pq05Ye7XG4gICAgICogQHBhcmFtIHsqfSBpc19ub3JtYWwgXG4gICAgICogQHBhcmFtIHsqfSBpc19idWZmIFxuICAgICAqIEBwYXJhbSB7Kn0gY2FtcF9yZXN0cmFpbiBcbiAgICAgKi9cbiAgICBwbGF5RG1nTWVzc2FnZTpmdW5jdGlvbih0YXJnZXQsIGRtZywgZWZmZWN0X2hpdCwgaXNfYnVmZiwgY2FtcF9yZXN0cmFpbiwgaXNfYWJzb3JiKXtcbiAgICAgICAgaWYgKGRtZyA9PSAwIHx8IHRhcmdldCA9PSBudWxsKSByZXR1cm47XG4gICAgICAgIHZhciBmb250X3R5cGUgPSAwICAgICAgIC8vIOS9v+eUqOWtl+S9k+eahOexu+Wei1xuICAgICAgICBpZiAoZWZmZWN0X2hpdCA9PSAyKXsgICAvLyDmmrTlh7tcbiAgICAgICAgICAgIGZvbnRfdHlwZSA9IDc7XG4gICAgICAgIH1lbHNlIGlmIChpc19hYnNvcmIgPT0gdHJ1ZSl7XG4gICAgICAgICAgICBmb250X3R5cGUgPSAyNTtcbiAgICAgICAgfWVsc2UgaWYgKGRtZyA+IDApeyAgICAgLy8g5rK755aXXG4gICAgICAgICAgICBmb250X3R5cGUgPSAyO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGlmIChpc19idWZmID09IHRydWUpe1xuICAgICAgICAgICAgICAgIGZvbnRfdHlwZSA9IDI0O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjYW1wX3Jlc3RyYWluID09IDEpe1xuICAgICAgICAgICAgICAgIGZvbnRfdHlwZSA9IDI3O1xuICAgICAgICAgICAgfSBlbHNle1xuICAgICAgICAgICAgICAgIGZvbnRfdHlwZSA9IDRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyDpooTlhYjliqDovb3otYTmupAu5Zyo5Yib5bu65paH5a2XXG4gICAgICAgIHJlcXVpcmUoXCJiYXR0bGVfY29udHJvbGxlclwiKS5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKCkuZ2V0RG1nRm9udENhY2hlT2JqZWN0KGZvbnRfdHlwZSwgZnVuY3Rpb24ob2JqZWN0LCByZXNfb2JqZWN0KXtcbiAgICAgICAgICAgIHRoaXMucGxheURtZ0ZvbnRBY3Rpb24oZm9udF90eXBlLCBvYmplY3QsIHJlc19vYmplY3QsIGRtZylcbiAgICAgICAgfS5iaW5kKHRoaXMsIHRhcmdldCkpO1xuICAgIH0sXG5cbiAgICAvLyDliJvlu7rkvKTlrrPmlbDlrZflkoznp7vliqhcbiAgICBwbGF5RG1nRm9udEFjdGlvbjpmdW5jdGlvbih0eXBlLCB0YXJnZXQsIHJlc19vYmplY3QsIGRtZyl7XG4gICAgICAgIGlmKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldC5yb2xlID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKHRhcmdldC5odXJ0X2RlbGF5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHRhcmdldC5odXJ0X2RlbGF5ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGVsYXlfdGltZSA9ICh0YXJnZXQuaHVydF9kZWxheSAlIDMpIC8gNTsgICAgICAgLy8g5Zug5Li65Y+v6IO95piv5ZCM5LiA5Liq55uu5qCH55qE5aSa5qyh6aOY6KGALOS4uuS6humBv+WFjeaOiemHjeWPoC7miYDku6Xov5nkuKrmmK/mr4/kuIDkuKrnmoTlu7bov58uXG4gICAgICAgIHRhcmdldC5odXJ0X2RlbGF5ICs9IDE7XG5cbiAgICAgICAgdmFyIHBhcmVudF9sYXllciA9IFZpZXdNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0U2NlbmVOb2RlKFNDRU5FX1RBRy5iYXR0bGUpOyAgICAvLyDlrZjmlL7kvKTlrrPmlbDlrZfnmoTniLboioLngrlcbiAgICAgICAgdmFyIGRtZ2ZvbnQgPSB0aGlzLmdldERtZ05vZGUodHlwZSk7XG4gICAgICAgIGlmKGRtZ2ZvbnQgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBwYXJlbnRfbGF5ZXIuYWRkQ2hpbGQoZG1nZm9udCwgMTApOyAgICAgICAgICAgICAgICAgLy8g5re75Yqg5rex5bqm5YC8XG5cbiAgICAgICAgdmFyIHdvcmxkX3BvcyA9IHRhcmdldC5yb2xlLmNvbnZlcnRUb1dvcmxkU3BhY2UoY2MudjIoMCwgMCkpOyAgICAgICAgICAgICAgICAgICAgLy8g5Y2V5L2N55qE6IqC54K55Z2Q5qCHXG4gICAgICAgIHZhciBub2RlX3BvcyA9IHBhcmVudF9sYXllci5jb252ZXJ0VG9Ob2RlU3BhY2Uod29ybGRfcG9zKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIOi9rOaIkOWxgOmDqOWdkOagh1xuXG4gICAgICAgIHZhciB0aXRsZSA9IGRtZ2ZvbnQuZ2V0Q2hpbGRCeU5hbWUoXCJ0aXRsZVwiKTtcbiAgICAgICAgdmFyIHRpdGxlX3NwID0gdGl0bGUuZ2V0Q29tcG9uZW50KGNjLlNwcml0ZSk7XG4gICAgICAgIHRpdGxlX3NwLmF0bGFzID0gcmVzX29iamVjdDtcblxuICAgICAgICBpZih0eXBlID09IDcgfHwgdHlwZSA9PSAyNSkge1xuICAgICAgICAgICAgdGl0bGVfc3Auc3ByaXRlRnJhbWUgPSByZXNfb2JqZWN0LmdldFNwcml0ZUZyYW1lKFwidHlwZVwiICsgdHlwZSArIFwiX2V4dGVuZFwiKTtcbiAgICAgICAgfWVsc2Uge1xuICAgICAgICAgICAgaWYgKGRtZyA8IDApIHtcbiAgICAgICAgICAgICAgICB0aXRsZV9zcC5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3QuZ2V0U3ByaXRlRnJhbWUoXCJ0eXBlXCIgKyB0eXBlICsgXCJfc3ViXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aXRsZV9zcC5zcHJpdGVGcmFtZSA9IHJlc19vYmplY3QuZ2V0U3ByaXRlRnJhbWUoXCJ0eXBlXCIgKyB0eXBlICsgXCJfYWRkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g5paH5a2XXG4gICAgICAgIHZhciBsYWJlbCA9IGRtZ2ZvbnQuZ2V0Q2hpbGRCeU5hbWUoXCJsYWJlbFwiKTtcbiAgICAgICAgdmFyIHJpY2hUZXh0ID0gbGFiZWwuZ2V0Q29tcG9uZW50KGNjLlJpY2hUZXh0KTtcbiAgICAgICAgcmljaFRleHQuaW1hZ2VBdGxhcyA9IHJlc19vYmplY3Q7XG4gICAgICAgIHZhciBkbWdfc3RyID0gTWF0aC5hYnMoZG1nKSArIFwiXCI7XG4gICAgICAgIHZhciB0b3RhbF9zdHIgPSBcIlwiXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkbWdfc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgdmFyIGRlc2MgPSBkbWdfc3RyW2luZGV4XTtcbiAgICAgICAgICAgIGlmIChkZXNjID09IFwiK1wiKXtcbiAgICAgICAgICAgICAgICBkZXNjID0gXCJhZGRcIjtcbiAgICAgICAgICAgIH1lbHNlIGlmKGRlc2MgPT0gXCItXCIpe1xuICAgICAgICAgICAgICAgIGRlc2MgPSBcInN1YlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG90YWxfc3RyID0gdG90YWxfc3RyICsgY2MuanMuZm9ybWF0U3RyKFwiPGltZyBzcmM9J3R5cGUlc18lcycvPlwiLCB0eXBlLCBkZXNjKVxuICAgICAgICB9XG4gICAgICAgIHJpY2hUZXh0LnN0cmluZyA9IHRvdGFsX3N0cjtcbiAgICAgICAgdmFyIHRvdGFsX3dpZHRoID0gbGFiZWwud2lkdGg7XG4gICAgICAgIGlmICh0aXRsZSl7XG4gICAgICAgICAgICB0b3RhbF93aWR0aCArPSB0aXRsZS53aWR0aDtcbiAgICAgICAgICAgIGxhYmVsLnggPSB0aXRsZS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICBkbWdmb250LnggPSBub2RlX3Bvcy54IC0gdG90YWxfd2lkdGggKiAwLjUgLSBTQ1JFRU5fV0lEVEggKiAwLjU7XG4gICAgICAgIGRtZ2ZvbnQueSA9IG5vZGVfcG9zLnkgKyB0YXJnZXQubW9kZWxfaGVpZ2h0ICsgdGFyZ2V0LmRtZ19pbmRleCAqIDE1IC0gU0NSRUVOX0hFSUdIVCAqIDAuNTtcbiAgICAgICAgZG1nZm9udC5zY2FsZSA9IDAuNTtcbiAgICAgICAgXG4gICAgICAgIHZhciBkZWxheSA9IGNjLmRlbGF5VGltZShkZWxheV90aW1lKTtcbiAgICAgICAgdmFyIHNob3cgPSBjYy5mYWRlSW4oMC4wMSk7XG4gICAgICAgIHZhciBiaWdnZXIgPSBjYy5zY2FsZVRvKENvbmZpZy5iYXR0bGVfYWN0X2RhdGEuZGF0YV9nZXRfYWN0X2RhdGEuaHVydF9udW1fc2NhbGVfdGltZTEudmFsICogMC4wMSAvIDYwLCBDb25maWcuYmF0dGxlX2FjdF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhLmh1cnRfbnVtX2JpZ2dlci52YWwgKiAwLjAxICogMC41KTtcbiAgICAgICAgdmFyIGJpZ2dlcjIgPSBjYy5zY2FsZVRvKENvbmZpZy5iYXR0bGVfYWN0X2RhdGEuZGF0YV9nZXRfYWN0X2RhdGEuaHVydF9udW1fc2NhbGVfdGltZTIudmFsICogMC4wMSAvIDYwLCBDb25maWcuYmF0dGxlX2FjdF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhLmh1cnRfbnVtX2JpZ2dlcjIudmFsICogMC4wMSk7XG4gICAgICAgIHZhciBzbWFsbGVyID0gY2Muc2NhbGVUbyhDb25maWcuYmF0dGxlX2FjdF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhLmh1cnRfbnVtX3NjYWxlX3RpbWUzLnZhbCAqIDAuMDEgLyA2MCwgQ29uZmlnLmJhdHRsZV9hY3RfZGF0YS5kYXRhX2dldF9hY3RfZGF0YS5odXJ0X251bV9zbWFsbGVyLnZhbCAqIDAuMDEpO1xuICAgICAgICB2YXIgYmlnZ2VyMyA9IGNjLnNjYWxlVG8oQ29uZmlnLmJhdHRsZV9hY3RfZGF0YS5kYXRhX2dldF9hY3RfZGF0YS5odXJ0X251bV9zY2FsZV90aW1lNC52YWwgKiAwLjAxIC8gNjAsIENvbmZpZy5iYXR0bGVfYWN0X2RhdGEuZGF0YV9nZXRfYWN0X2RhdGEuaHVydF9udW1fYmlnZ2VyMy52YWwgKiAwLjAxKTtcbiAgICAgICAgdmFyIGRlbGF5MiA9IGNjLmRlbGF5VGltZShDb25maWcuYmF0dGxlX2FjdF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhLmh1cnRfbnVtX2RlbGF5X3RpbWUudmFsICogMC4wMSAvIDYwKTtcbiAgICAgICAgdmFyIG1vdmUgPSBjYy5tb3ZlQnkoQ29uZmlnLmJhdHRsZV9hY3RfZGF0YS5kYXRhX2dldF9hY3RfZGF0YS5odXJ0X251bV9tb3ZlX3RpbWUudmFsICogMC4wMSAvIDYwLCAwLCBDb25maWcuYmF0dGxlX2FjdF9kYXRhLmRhdGFfZ2V0X2FjdF9kYXRhLmh1cnRfbnVtX21vdmVfZGlzdGFuY2UudmFsICogMC4wMSlcbiAgICAgICAgdmFyIGhpZGUgPSBjYy5mYWRlT3V0KENvbmZpZy5iYXR0bGVfYWN0X2RhdGEuZGF0YV9nZXRfYWN0X2RhdGEuaHVydF9udW1faGlkZV90aW1lLnZhbCAqIDAuMDIgLyA2MCk7XG4gICAgICAgIHZhciBkZWxldGVEbWdOdW0gPSBjYy5jYWxsRnVuYyhmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGhpcy5wdXNoQmFja0RtZ05vZGUodHlwZSwgZG1nZm9udCk7XG4gICAgICAgIH0uYmluZCh0aGlzKSlcbiAgICAgICAgdmFyIGNoYW5nZSA9IGNjLnNlcXVlbmNlKGJpZ2dlciwgYmlnZ2VyMiwgc21hbGxlciwgYmlnZ2VyMywgZGVsYXkyLCBjYy5zcGF3bihtb3ZlLCBoaWRlKSlcbiAgICAgICAgZG1nZm9udC5ydW5BY3Rpb24oY2Muc2VxdWVuY2UoZGVsYXksIHNob3csIGNoYW5nZSwgZGVsZXRlRG1nTnVtKSk7XG4gICAgfSxcblxuICAgIC8vIOS7juWvueixoeaxoOS4reiOt+WPlue8k+WtmFxuICAgIGdldERtZ05vZGU6ZnVuY3Rpb24odHlwZSl7XG4gICAgICAgIHZhciBiYXR0bGVfcG9vbHMgPSByZXF1aXJlKFwiYmF0dGxlX3JvbGVfcG9vbFwiKS5nZXRJbnN0YW5jZSgpO1xuICAgICAgICB2YXIgcG9vbHMgPSBiYXR0bGVfcG9vbHMuZ2V0RG1nUG9vbHModHlwZSk7XG4gICAgICAgIHZhciBub2RlID0gbnVsbDtcbiAgICAgICAgaWYgKHBvb2xzLnNpemUoKSA+IDApIHsgICAgIC8vIOWPquacieaatOWHuyDnmoQ35Y+35pWw5a2X5ZKM5ZC45pS25Lyk5a6z55qEMjXlj7fpnIDopoHliJvlu7ogdGl0bGVcbiAgICAgICAgICAgIG5vZGUgPSBwb29scy5nZXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5vZGUgPSBuZXcgY2MuTm9kZSgpO1xuICAgICAgICAgICAgbm9kZS5zZXRBbmNob3JQb2ludCgwLjUsIDAuNSk7XG5cbiAgICAgICAgICAgIC8vIOWmguaenOaYr+aatOWHu+aIluiAheWQuOaUtizliJnmmL7npLrmmrTlh7vlkLjmlLYs5ZCm5YiZ5pi+56S6ICsg5oiW6ICFIC1cbiAgICAgICAgICAgIHZhciB0aXRsZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICB0aXRsZS5zZXRBbmNob3JQb2ludCgwLCAwLjUpO1xuICAgICAgICAgICAgdGl0bGUubmFtZSA9IFwidGl0bGVcIjtcbiAgICAgICAgICAgIG5vZGUuYWRkQ2hpbGQodGl0bGUpO1xuICAgICAgICAgICAgdGl0bGUuYWRkQ29tcG9uZW50KGNjLlNwcml0ZSk7XG5cbiAgICAgICAgICAgIC8vIOWFt+S9k+S8pOWus+aVsOWtl+eahOWvjOaWh+acrFxuICAgICAgICAgICAgdmFyIGZvbnRfbm9kZSA9IG5ldyBjYy5Ob2RlKCk7XG4gICAgICAgICAgICBmb250X25vZGUuc2V0QW5jaG9yUG9pbnQoMCwgMC41KTtcbiAgICAgICAgICAgIGZvbnRfbm9kZS5uYW1lID0gXCJsYWJlbFwiO1xuICAgICAgICAgICAgbm9kZS5hZGRDaGlsZChmb250X25vZGUpO1xuICAgICAgICAgICAgdmFyIGZvbnRfbGFiZWwgPSBmb250X25vZGUuYWRkQ29tcG9uZW50KGNjLlJpY2hUZXh0KTtcbiAgICAgICAgICAgIGZvbnRfbGFiZWwubGluZUhlaWdodCA9IDMwO1xuICAgICAgICAgICAgZm9udF9sYWJlbC5mb250U2l6ZSA9IDMwO1xuXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfSxcblxuICAgIC8vIOWbnuaUtuS8pOWus+aVsOWtl1xuICAgIHB1c2hCYWNrRG1nTm9kZTpmdW5jdGlvbih0eXBlLCBkbWcpe1xuICAgICAgICB2YXIgYmF0dGxlX3Bvb2xzID0gcmVxdWlyZShcImJhdHRsZV9yb2xlX3Bvb2xcIikuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgYmF0dGxlX3Bvb2xzLnB1c2hCYWNrRG1nUG9vbHModHlwZSwgZG1nKTtcbiAgICB9LFxuXG4gICAgLy8g6buR5bGP5aSE55CGXG4gICAgYmxhY2tTY3JlZW46ZnVuY3Rpb24oYXR0YWNrZXIsIGRlbGF5X3RpbWUsIHRpbWUsIGJlZ2luX2Z1biwgZW5kX2Z1bil7XG4gICAgICAgIHZhciBhY3QgPSBjYy5zZXF1ZW5jZShjYy5jYWxsRnVuYyhiZWdpbl9mdW4pLCBjYy5kZWxheVRpbWUodGltZSAvIDYwKSwgY2MuY2FsbEZ1bmMoZW5kX2Z1bikpXG4gICAgICAgIHJldHVybiBjYy5zZXF1ZW5jZSh0aGlzLmR0KGRlbGF5X3RpbWUpLCBhY3QpXG4gICAgfSxcblxufTtcbm1vZHVsZS5leHBvcnRzID0gU2tpbGxBY3Q7Il19
|