消消方块阵换皮表情
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

334 lines
46 KiB

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.unload = exports.update = exports.load = exports.methods = void 0;
const cc_1 = require("cc");
const path_1 = require("path");
const Fs = require('fs');
const Path = require('path');
// 临时在当前模块增加编辑器内的模块为搜索路径,为了能够正常 require 到 cc 模块,后续版本将优化调用方式
module.paths.push((0, path_1.join)(Editor.App.path, 'node_modules'));
// 当前版本需要在 module.paths 修改后才能正常使用 cc 模块
// 并且如果希望正常显示 cc 的定义,需要手动将 engine 文件夹里的 cc.d.ts 添加到插件的 tsconfig 里
// 当前版本的 cc 定义文件可以在当前项目的 temp/declarations/cc.d.ts 找到
// 获取项目路径
const projectPath = Editor.Project.path;
// 定义输出文件路径
const outputPath = cc_1.path.join(projectPath, 'assets', 'res', 'font', 'str.txt');
/**
* @en
* @zh 为扩展的主进程的注册方法
*/
exports.methods = {
log() { },
async printSpineAnim() {
var _a, _b;
let s = cc_1.director.getScene();
let cur = Editor.Selection.getLastSelected("node");
let node = this.getNodeByuuid(s, cur);
let spAnim = node.getComponent(cc_1.sp.Skeleton);
if (!spAnim)
return;
console.log("选中节点包含以下动画:");
//打印所有动画名
let anims = (_b = (_a = spAnim === null || spAnim === void 0 ? void 0 : spAnim.skeletonData) === null || _a === void 0 ? void 0 : _a.getRuntimeData()) === null || _b === void 0 ? void 0 : _b.animations;
anims === null || anims === void 0 ? void 0 : anims.forEach(x => {
console.log("动画名:" + x.name);
});
console.log("选中节点当前动画已复制成功:" + (spAnim === null || spAnim === void 0 ? void 0 : spAnim.animation));
//复制动画名称
Editor.Clipboard.write('text', spAnim === null || spAnim === void 0 ? void 0 : spAnim.animation);
},
async changeNodeName() {
let s = cc_1.director.getScene();
let cur = Editor.Selection.getLastSelected("node");
let node = this.getNodeByuuid(s, cur);
if (!node)
return;
console.log("选中节点:" + node.name);
let name = Editor.Clipboard.read('text');
console.log("剪切板内容:" + name);
//设置node的名字为剪切板内容
node.name = name + "";
},
async uiScript() {
let s = cc_1.director.getScene();
let cur = Editor.Selection.getLastSelected("node");
console.log("选中节点:" + cur);
let node = this.getNodeByuuid(s, cur);
let autoName = "Auto_" + node.name;
let nodes = this.getAllNodes(node, "node");
let funcNames = [];
//console.log("得到的所有节点", nodes);
let str = "";
str +=
`
//*********************
// create by 流云
// 插件自动生成的节点脚本
// 请勿修改(自动生成会覆盖)
// 请通过子类继承使用
// 如何生成可直接调用的UI节点和组件?
// 1.在场景节点树中选中要生成的UI根节点
// 2.点击菜单"tool"->“生成UI脚本” 或者使用快捷键(快捷键:Ctrl+Shift+C)
// 3.点击后会在script/ui/目录中生成一个以选中节点命名的文件夹,文件夹中会生成两个脚本文件,“Auto_”开头的就是本文件,不可修改,另一个是“UI”+选中节点名称命名的脚本文件,可修改,是需要挂载到选中节点的脚本文件,给用户使用的写逻辑的脚本,只会生成一次
// 4.找到第3步描述的“UI”+选中节点名称命名的脚本文件,将其挂载到选中节点上(第一生成需要挂载,后续修改场景,重复生成的时候,该脚本不会再生成,不用担心会覆盖逻辑脚本)
// 下面是类型示例
// 1.按钮,节点名以“btn_”或者“Btn_”开头或者节点添加了Button组件, 例:btn_Close,会生成btn_Close节点和click_btn_Close()方法
// 2.标签,节点名以“lb_”开头, 例:lb_title,会生成lb_title的Label组件
// 3.输入框,节点名以“eb_”开头, 例:eb_input,会生成eb_input的EditBox组件
// 4.滚动视图,节点名以“sv_”开头, 例:sv_list,会生成sv_list的ScrollView组件
// 5.图片,节点名以“img_”或者sp_“”开头, 例:img_Icon,会生成img_Icon的Sprite组件
// 6.普通节点,节点名以“ui_”或者“Ui_”或者“UI_”开头, 例:ui_Content,会生成ui_Content的Node节点
//*********************
import { _decorator, Component, Node, find, Sprite, Label, Button, ScrollView, EditBox, RichText } from 'cc';
import { UIBase } from '../../../mx/module/ui/UIBase';
const { ccclass } = _decorator;
@ccclass('` + autoName + `')
export class ` + autoName + ` extends UIBase {\r\n`;
console.log("得到的所有节点", JSON.stringify(nodes));
for (let i = 0; i < nodes.length; i++) {
let tName = nodes[i].nodeName;
if (nodes.filter((x) => x.nodeName == tName).length > 1) {
tName = nodes[i].path.replace(/\//g, "_");
}
let type = nodes[i].type != "" && nodes[i].type != "Button" ? nodes[i].type : "Node";
str += " " + tName + `:${type};\r\n`;
}
str += ` onLoad(){
super.onLoad();\r\n`;
for (let i = 0; i < nodes.length; i++) {
let tName = nodes[i].nodeName;
if (nodes.filter((x) => x.nodeName == tName).length > 1) {
tName = nodes[i].path.replace(/\//g, "_");
}
if (nodes[i].type == "Button") {
funcNames.push(tName);
}
let lastStr = "";
if (nodes[i].type == "ScrollView") {
lastStr = "?.getComponent(ScrollView)";
}
if (nodes[i].type == "Label") {
lastStr = "?.getComponent(Label)";
}
if (nodes[i].type == "EditBox") {
lastStr = "?.getComponent(EditBox)";
}
if (nodes[i].type == "Sprite") {
lastStr = "?.getComponent(Sprite)";
}
if (nodes[i].type == "Button") {
lastStr = "";
}
if (nodes[i].type == "RichText") {
lastStr = "?.getComponent(RichText)";
}
str += ` this.${tName} = find("${nodes[i].path}",this.node)${lastStr};\r\n`;
}
str += ` }\r\n`;
str += ` onEnable() {\r\n`;
for (let i = 0; i < funcNames.length; i++) {
str += ` this.${funcNames[i]}.on(Node.EventType.TOUCH_END, this.click_${funcNames[i]}, this);\r\n`;
}
str += ` }\r\n`;
str += ` onDisable() {\r\n`;
for (let i = 0; i < funcNames.length; i++) {
str += ` this.${funcNames[i]}.off(Node.EventType.TOUCH_END, this.click_${funcNames[i]}, this);\r\n`;
}
str += ` }\r\n`;
for (let i = 0; i < funcNames.length; i++) {
str += ` click_${funcNames[i]}() {}\r\n`;
}
str += `}`;
Editor.Message.send("asset-db", "create-asset", `db://assets/script/ui/${node.name}/${autoName}.ts`, str, { overwrite: true });
let className = "UI" + node.name;
let path = `db://assets/script/ui/${node.name}/${className}.ts`;
let r = await Editor.Message.request("asset-db", "query-asset-info", path);
console.log("生成成功?", r);
this.extractUsedChars();
if (r)
return;
let comp = node.getComponent(className);
console.log("组件:", comp);
if (!comp) {
str = `
//*********************
// create by 流云
// time: ${new Date().toDateString()}
// desc:
//*********************
import { _decorator, Component, Node , find} from 'cc';
import { ${autoName} } from './${autoName}';
const { ccclass, property } = _decorator;
@ccclass('${className}')
export class ${className} extends ${autoName} {
onLoad(): void {
super.onLoad();
}
onEnable(): void {
super.onEnable();
}
onDisable(): void {
super.onDisable();
}
onInit(): void {
}
}
`;
Editor.Message.send("asset-db", "create-asset", path, str);
}
//node.addComponent(className);
},
getNodeByuuid(root, uuid) {
let node = null;
for (let i = 0; i < root.children.length; i++) {
let c = root.children[i];
if (c.uuid == uuid) {
node = c;
break;
}
}
if (node != null)
return node;
else {
for (let i = 0; i < root.children.length; i++) {
let c = root.children[i];
let n = this.getNodeByuuid(c, uuid);
if (n)
return n;
}
}
},
getAllNodes(root, parentName, path = "") {
let tempArr = [];
for (let i = 0; i < root.children.length; i++) {
let c = root.children[i];
let p = path == "" ? c.name : path + "/" + c.name;
let typ = "";
// let sortComp = c.getComponent(Sorting2D);
// if (sortComp) {
// sortComp.destroy();
// }
if (c.getComponent(cc_1.Label) != null && c.name.indexOf("lb_") >= 0) {
typ = "Label";
}
if (c.getComponent(cc_1.RichText) != null && c.name.indexOf("rt_") >= 0) {
typ = "RichText";
}
if (c.getComponent(cc_1.EditBox) != null && c.name.indexOf("eb_") >= 0) {
typ = "EditBox";
}
if (c.getComponent(cc_1.Sprite) != null && (c.name.indexOf("img_") >= 0 || c.name.indexOf("sp_") >= 0)) {
typ = "Sprite";
}
if (c.getComponent(cc_1.ScrollView) != null && c.name.indexOf("sv_") >= 0) {
typ = "ScrollView";
}
if (c.name.indexOf("ui_") >= 0 || c.name.indexOf("UI_") >= 0 || c.name.indexOf("Ui_") >= 0) {
typ = "Node";
}
if (c.getComponent(cc_1.Button) != null || c.name.indexOf("btn_") >= 0 || c.name.indexOf("Btn_") >= 0) {
typ = "Button";
}
if (!/[\u4e00-\u9fff]/.test(c.name) && !/^\d/.test(c.name) && !/-/.test(c.name) && !/\s/.test(c.name) && (typ == "Button" || typ == "Label" || typ == "Sprite" || typ == "ScrollView" || typ == "Node" || typ == "EditBox" || typ == "RichText"))
tempArr.push({ nodeName: c.name, parentName: parentName, path: p, type: typ });
if (c.children.length > 0) {
let arr = this.getAllNodes(c, c.name, p);
tempArr = tempArr.concat(arr);
}
}
return tempArr;
},
/**
* 获取节点树
* @param {string} filePath 文件路径
* @returns {object}
*/
getNodeTree(filePath) {
// 获取缓存
let cache = this.cache;
if (!cache) {
cache = this.cache = Object.create(null);
}
// 从缓存中读取
if (!cache[filePath]) {
// 将资源数据转为节点树
const data = JSON.parse(Fs.readFileSync(filePath));
cache[filePath] = this.convertToNodeTree(data);
}
},
// 提取所有使用的字符
extractUsedChars() {
const usedChars = new Set();
// 遍历项目中的 assets 目录
const assetsPath = cc_1.path.join(projectPath, 'assets');
if (Fs.existsSync(assetsPath)) {
this.traverseDirectory(assetsPath, usedChars);
}
// 将字符集合转换为字符串
const charsString = Array.from(usedChars).join('');
// 确保输出目录存在
const outputDir = cc_1.path.dirname(outputPath);
if (!Fs.existsSync(outputDir)) {
Fs.mkdirSync(outputDir, { recursive: true });
}
// 写入文件
Fs.writeFileSync(outputPath, charsString);
console.log(`Extracted ${usedChars.size} unique characters to ${outputPath}`);
},
// 遍历目录并提取字符
traverseDirectory(dirPath, usedChars) {
const files = Fs.readdirSync(dirPath);
files.forEach((file) => {
const filePath = cc_1.path.join(dirPath, file);
const stat = Fs.statSync(filePath);
if (stat.isDirectory()) {
// 如果是目录,递归遍历
this.traverseDirectory(filePath, usedChars);
}
else if (stat.isFile()) {
// 如果是文件,读取内容并提取字符
const ext = cc_1.path.extname(file).toLowerCase();
if (ext === '.js' || ext === '.ts' || ext === '.json' || ext === '.fire' || ext === '.prefab' || ext === '.csv' || ext === '.txt') {
try {
const content = Fs.readFileSync(filePath, 'utf-8');
for (let char of content) {
usedChars.add(char);
}
}
catch (err) {
console.warn(`Failed to read file: ${filePath}, error: ${err}`);
}
}
}
});
}
};
/**
* @en Hooks triggered after extension loading is complete
* @zh 扩展加载完成后触发的钩子
*/
const load = function () {
let id = Editor.Selection.getLastSelected("Node");
console.log("选中节点:" + id);
};
exports.load = load;
const update = function () {
let id = Editor.Selection.getLastSelected("Node");
console.log("选中节点:" + id);
};
exports.update = update;
/**
* @en Hooks triggered after extension uninstallation is complete
* @zh 扩展卸载完成后触发的钩子
*/
const unload = function () { };
exports.unload = unload;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zb3VyY2Uvc2NlbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkJBQTJIO0FBQzNILCtCQUE0QjtBQUM1QixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRzdCLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFBLFdBQUksRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0FBRXpELHVDQUF1QztBQUN2QyxpRUFBaUU7QUFDakUscURBQXFEO0FBRXJELFNBQVM7QUFDVCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUV4QyxXQUFXO0FBQ1gsTUFBTSxVQUFVLEdBQUcsU0FBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFHOUU7OztHQUdHO0FBQ1UsUUFBQSxPQUFPLEdBQTRDO0lBQzlELEdBQUcsS0FBSyxDQUFDO0lBQ1QsS0FBSyxDQUFDLGNBQWM7O1FBQ2xCLElBQUksQ0FBQyxHQUFHLGFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQVMsQ0FBQztRQUM5QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87UUFDcEIs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QUM7QUFIVyxRQUFBLElBQUksUUFHZjtBQUVLLE1BQU0sTUFBTSxHQUFHO0lBQ3BCLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQTtBQUhZLFFBQUEsTUFBTSxVQUdsQjtBQUVEOzs7R0FHRztBQUNJLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDO0FBQXpCLFFBQUEsTUFBTSxVQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1dHRvbiwgZGlyZWN0b3IsIEVkaXRCb3gsIExhYmVsLCBOb2RlLCBwYXRoLCBSaWNoVGV4dCwgU2Nyb2xsVmlldywgU29ydGluZzJELCBzcCwgU3ByaXRlLCBVSVJlbmRlcmVyIH0gZnJvbSAnY2MnO1xyXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XHJcbmNvbnN0IEZzID0gcmVxdWlyZSgnZnMnKTtcclxuY29uc3QgUGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuXHJcblxyXG4vLyDkuLTml7blnKjlvZPliY3mqKHlnZflop7liqDnvJbovpHlmajlhoXnmoTmqKHlnZfkuLrmkJzntKLot6/lvoTvvIzkuLrkuobog73lpJ/mraPluLggcmVxdWlyZSDliLAgY2Mg5qih5Z2X77yM5ZCO57ut54mI5pys5bCG5LyY5YyW6LCD55So5pa55byPXHJcbm1vZHVsZS5wYXRocy5wdXNoKGpvaW4oRWRpdG9yLkFwcC5wYXRoLCAnbm9kZV9tb2R1bGVzJykpO1xyXG5cclxuLy8g5b2T5YmN54mI5pys6ZyA6KaB5ZyoIG1vZHVsZS5wYXRocyDkv67mlLnlkI7miY3og73mraPluLjkvb/nlKggY2Mg5qih5Z2XXHJcbi8vIOW5tuS4lOWmguaenOW4jOacm+ato+W4uOaYvuekuiBjYyDnmoTlrprkuYnvvIzpnIDopoHmiYvliqjlsIYgZW5naW5lIOaWh+S7tuWkuemHjOeahCBjYy5kLnRzIOa3u+WKoOWIsOaPkuS7tueahCB0c2NvbmZpZyDph4xcclxuLy8g5b2T5YmN54mI5pys55qEIGNjIOWumuS5ieaWh+S7tuWPr+S7peWcqOW9k+WJjemhueebrueahCB0ZW1wL2RlY2xhcmF0aW9ucy9jYy5kLnRzIOaJvuWIsFxyXG5cclxuLy8g6I635Y+W6aG555uu6Lev5b6EXHJcbmNvbnN0IHByb2plY3RQYXRoID0gRWRpdG9yLlByb2plY3QucGF0aDtcclxuXHJcbi8vIOWumuS5iei+k+WHuuaWh+S7tui3r+W+hFxyXG5jb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKHByb2plY3RQYXRoLCAnYXNzZXRzJywgJ3JlcycsICdmb250JywgJ3N0ci50eHQnKTtcclxuXHJcblxyXG4vKipcclxuICogQGVuXHJcbiAqIEB6aCDkuLrmianlsZXnmoTkuLvov5vnqIvnmoTms6jlhozmlrnms5VcclxuICovXHJcbmV4cG9ydCBjb25zdCBtZXRob2RzOiB7IFtrZXk6IHN0cmluZ106ICguLi5hbnk6IGFueSkgPT4gYW55IH0gPSB7XHJcbiAgbG9nKCkgeyB9LFxyXG4gIGFzeW5jIHByaW50U3BpbmVBbmltKCkge1xyXG4gICAgbGV0IHMgPSBkaXJlY3Rvci5nZXRTY2VuZSgpO1xyXG4gICAgbGV0IGN1ciA9IEVkaXRvci5TZWxlY3Rpb24uZ2V0TGFzdFNlbGVjdGVkKFwibm9kZVwiKTtcclxuICAgIGxldCBub2RlID0gdGhpcy5nZXROb2RlQnl1dWlkKHMsIGN1cikgYXMgTm9kZTtcclxuICAgIGxldCBzcEFuaW0gPSBub2RlLmdldENvbXBvbmVudChzcC5Ta2VsZXRvbik7XHJcbiAgICBpZiAoIXNwQW5pbSkgcmV0dXJuO1xyXG4gICAgY29uc29sZS5sb2coXCLpgInkuK3oioLngrnljIXlkKvku6XkuIvliqjnlLvvvJpcIik7XHJcbiAgICAvL+aJk+WNsOaJgOacieWKqOeUu+WQjVxyXG4gICAgbGV0IGFuaW1zID0gc3BBbmltPy5za2VsZXRvbkRhdGE/LmdldFJ1bnRpbWVEYXRhKCk/LmFuaW1hdGlvbnM7XHJcbiAgICBhbmltcz8uZm9yRWFjaCh4ID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXCLliqjnlLvlkI3vvJpcIiArIHgubmFtZSk7XHJcbiAgICB9KTtcclxuICAgIGNvbnNvbGUubG9nKFwi6YCJ5Lit6IqC54K55b2T5YmN5Yqo55S75bey5aSN5Yi25oiQ5Yqf77yaXCIgKyBzcEFuaW0/LmFuaW1hdGlvbik7XHJcbiAgICAvL+WkjeWItuWKqOeUu+WQjeensFxyXG4gICAgRWRpdG9yLkNsaXBib2FyZC53cml0ZSgndGV4dCcsIHNwQW5pbT8uYW5pbWF0aW9uKTtcclxuICB9LFxyXG4gIGFzeW5jIGNoYW5nZU5vZGVOYW1lKCkge1xyXG4gICAgbGV0IHMgPSBkaXJlY3Rvci5nZXRTY2VuZSgpO1xyXG4gICAgbGV0IGN1ciA9IEVkaXRvci5TZWxlY3Rpb24uZ2V0TGFzdFNlbGVjdGVkKFwibm9kZVwiKTtcclxuICAgIGxldCBub2RlID0gdGhpcy5nZXROb2RlQnl1dWlkKHMsIGN1cikgYXMgTm9kZTtcclxuICAgIGlmICghbm9kZSkgcmV0dXJuO1xyXG4gICAgY29uc29sZS5sb2coXCLpgInkuK3oioLngrnvvJpcIiArIG5vZGUubmFtZSk7XHJcbiAgICBsZXQgbmFtZSA9IEVkaXRvci5DbGlwYm9hcmQucmVhZCgndGV4dCcpO1xyXG4gICAgY29uc29sZS5sb2coXCLliarliIfmnb/lhoXlrrnvvJpcIiArIG5hbWUpO1xyXG4gICAgLy/orr7nva5ub2Rl55qE5ZCN5a2X5Li65Ymq5YiH5p2/5YaF5a65XHJcbiAgICBub2RlLm5hbWUgPSBuYW1lICsgXCJcIjtcclxuICB9LFxyXG4gIGFzeW5jIHVpU2NyaXB0KCkge1xyXG4gICAgbGV0IHMgPSBkaXJlY3Rvci5nZXRTY2VuZSgpO1xyXG4gICAgbGV0IGN1ciA9IEVkaXRvci5TZWxlY3Rpb24uZ2V0TGFzdFNlbGVjdGVkKFwibm9kZVwiKTtcclxuICAgIGNvbnNvbGUubG9nKFwi6YCJ5Lit6IqC54K577yaXCIgKyBjdXIpO1xyXG4gICAgbGV0IG5vZGUgPSB0aGlzLmdldE5vZGVCeXV1aWQocywgY3VyKSBhcyBOb2RlO1xyXG4gICAgbGV0IGF1dG9OYW1lID0gXCJBdXRvX1wiICsgbm9kZS5uYW1lO1xyXG4gICAgbGV0IG5vZGVzID0gdGhpcy5nZXRBbGxOb2Rlcyhub2RlLCBcIm5vZGVcIik7XHJcbiAgICBsZXQgZnVuY05hbWVzID0gW107XHJcbiAgICAvL2NvbnNvbGUubG9nKFwi5b6X5Yiw55qE5omA5pyJ6IqC54K5XCIsIG5vZGVzKTtcclxuICAgIGxldCBzdHIgPSBcIlwiO1xyXG4gICAgc3RyICs9XHJcbiAgICAgIGBcclxuLy8qKioqKioqKioqKioqKioqKioqKipcclxuLy8gY3JlYXRlIGJ5IOa1geS6kVxyXG4vLyDmj5Lku7boh6rliqjnlJ/miJDnmoToioLngrnohJrmnKxcclxuLy8g6K+35Yu/5L+u5pS577yI6Ieq5Yqo55Sf5oiQ5Lya6KaG55uW77yJXHJcbi8vIOivt+mAmui/h+WtkOexu+e7p+aJv+S9v+eUqFxyXG4vLyDlpoLkvZXnlJ/miJDlj6/nm7TmjqXosIPnlKjnmoRVSeiKgueCueWSjOe7hOS7tu+8n1xyXG4vLyAxLuWcqOWcuuaZr+iKgueCueagkeS4remAieS4reimgeeUn+aIkOeahFVJ5qC56IqC54K5XHJcbi8vIDIu54K55Ye76I+c5Y2VXCJ0b29sXCItPuKAnOeUn+aIkFVJ6ISa5pys4oCdICDmiJbogIXkvb/nlKjlv6vmjbfplK4o5b+r5o236ZSu77yaQ3RybCtTaGlmdCtDKVxyXG4vLyAzLueCueWHu+WQjuS8muWcqHNjcmlwdC91aS/nm67lvZXkuK3nlJ/miJDkuIDkuKrku6XpgInkuK3oioLngrnlkb3lkI3nmoTmlofku7blpLnvvIzmlofku7blpLnkuK3kvJrnlJ/miJDkuKTkuKrohJrmnKzmlofku7bvvIzigJxBdXRvX+KAneW8gOWktOeahOWwseaYr+acrOaWh+S7tu+8jOS4jeWPr+S/ruaUue+8jOWPpuS4gOS4quaYr+KAnFVJ4oCdK+mAieS4reiKgueCueWQjeensOWRveWQjeeahOiEmuacrOaWh+S7tu+8jOWPr+S/ruaUue+8jOaYr+mcgOimgeaMgui9veWIsOmAieS4reiKgueCueeahOiEmuacrOaWh+S7tu+8jOe7meeUqOaIt+S9v+eUqOeahOWGmemAu+i+keeahOiEmuacrO+8jOWPquS8mueUn+aIkOS4gOasoVxyXG4vLyA0LuaJvuWIsOesrDPmraXmj4/ov7DnmoTigJxVSeKAnSvpgInkuK3oioLngrnlkI3np7Dlkb3lkI3nmoTohJrmnKzmlofku7bvvIzlsIblhbbmjILovb3liLDpgInkuK3oioLngrnkuIoo56ys5LiA55Sf5oiQ6ZyA6KaB5oyC6L2977yM5ZCO57ut5L+u5pS55Zy65pmv77yM6YeN5aSN55Sf5oiQ55qE5pe25YCZ77yM6K+l6ISa5pys5LiN5Lya5YaN55Sf5oiQ77yM5LiN55So5ouF5b+D5Lya6KaG55uW6YC76L6R6ISa5pysKVxyXG4vLyDkuIvpnaLmmK/nsbvlnovnpLrkvotcclxuLy8gMS7mjInpkq7vvIzoioLngrnlkI3ku6XigJxidG5f4oCd5oiW6ICF4oCcQnRuX+KAneW8gOWktOaIluiAheiKgueCuea3u+WKoOS6hkJ1dHRvbue7hOS7tu+8jCDkvovvvJpidG5fQ2xvc2XvvIzkvJrnlJ/miJBidG5fQ2xvc2XoioLngrnlkoxjbGlja19idG5fQ2xvc2UoKeaWueazlVxyXG4vLyAyLuagh+etvu+8jOiKgueCueWQjeS7peKAnGxiX+KAneW8gOWktO+8jCDkvovvvJpsYl90aXRsZe+8jOS8mueUn+aIkGxiX3RpdGxl55qETGFiZWznu4Tku7ZcclxuLy8gMy7ovpPlhaXmoYbvvIzoioLngrnlkI3ku6XigJxlYl/igJ3lvIDlpLTvvIwg5L6L77yaZWJfaW5wdXTvvIzkvJrnlJ/miJBlYl9pbnB1dOeahEVkaXRCb3jnu4Tku7ZcclxuLy8gNC7mu5rliqjop4blm77vvIzoioLngrnlkI3ku6XigJxzdl/igJ3lvIDlpLTvvIwg5L6L77yac3ZfbGlzdO+8jOS8mueUn+aIkHN2X2xpc3TnmoRTY3JvbGxWaWV357uE5Lu2XHJcbi8vIDUu5Zu+54mH77yM6IqC54K55ZCN5Lul4oCcaW1nX+KAneaIluiAhXNwX+KAnOKAneW8gOWktO+8jCDkvovvvJppbWdfSWNvbu+8jOS8mueUn+aIkGltZ19JY29u55qEU3ByaXRl57uE5Lu2XHJcbi8vIDYu5pmu6YCa6IqC54K577yM6IqC54K55ZCN5Lul4oCcdWlf4oCd5oiW6ICF4oCcVWlf4oCd5oiW6ICF4oCcVUlf4oCd5byA5aS077yMIOS+i++8mnVpX0NvbnRlbnTvvIzkvJrnlJ/miJB1aV9Db250ZW5055qETm9kZeiKgueCuVxyXG4vLyoqKioqKioqKioqKioqKioqKioqKlxyXG5pbXBvcnQgeyBfZGVjb3JhdG9yLCBDb21wb25lbnQsIE5vZGUsIGZpbmQsIFNwcml0ZSwgTGFiZWwsIEJ1dHRvbiwgU2Nyb2xsVmlldywgRWRpdEJveCwgUmljaFRleHQgfSBmcm9tICdjYyc7XHJcbmltcG9ydCB7IFVJQmFzZSB9IGZyb20gJy4uLy4uLy4uL214L21vZHVsZS91aS9VSUJhc2UnO1xyXG5jb25zdCB7IGNjY2xhc3MgfSA9IF9kZWNvcmF0b3I7XHJcblxyXG5AY2NjbGFzcygnYCArIGF1dG9OYW1lICsgYCcpXHJcbmV4cG9ydCBjbGFzcyBgICsgYXV0b05hbWUgKyBgIGV4dGVuZHMgVUlCYXNlIHtcXHJcXG5gO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwi5b6X5Yiw55qE5omA5pyJ6IqC54K5XCIsIEpTT04uc3RyaW5naWZ5KG5vZGVzKSk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCB0TmFtZSA9IG5vZGVzW2ldLm5vZGVOYW1lO1xyXG4gICAgICBpZiAobm9kZXMuZmlsdGVyKCh4OiBhbnkpID0+IHgubm9kZU5hbWUgPT0gdE5hbWUpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICB0TmFtZSA9IG5vZGVzW2ldLnBhdGgucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgdHlwZSA9IG5vZGVzW2ldLnR5cGUgIT0gXCJcIiAmJiBub2Rlc1tpXS50eXBlICE9IFwiQnV0dG9uXCIgPyBub2Rlc1tpXS50eXBlIDogXCJOb2RlXCI7XHJcbiAgICAgIHN0ciArPSBcIiAgXCIgKyB0TmFtZSArIGA6JHt0eXBlfTtcXHJcXG5gO1xyXG4gICAgfVxyXG5cclxuICAgIHN0ciArPSBgICBvbkxvYWQoKXtcclxuICAgIHN1cGVyLm9uTG9hZCgpO1xcclxcbmA7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCB0TmFtZSA9IG5vZGVzW2ldLm5vZGVOYW1lO1xyXG4gICAgICBpZiAobm9kZXMuZmlsdGVyKCh4OiBhbnkpID0+IHgubm9kZU5hbWUgPT0gdE5hbWUpLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICB0TmFtZSA9IG5vZGVzW2ldLnBhdGgucmVwbGFjZSgvXFwvL2csIFwiX1wiKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZXNbaV0udHlwZSA9PSBcIkJ1dHRvblwiKSB7XHJcbiAgICAgICAgZnVuY05hbWVzLnB1c2godE5hbWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBsYXN0U3RyID0gXCJcIjtcclxuICAgICAgaWYgKG5vZGVzW2ldLnR5cGUgPT0gXCJTY3JvbGxWaWV3XCIpIHtcclxuICAgICAgICBsYXN0U3RyID0gXCI/LmdldENvbXBvbmVudChTY3JvbGxWaWV3KVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS50eXBlID09IFwiTGFiZWxcIikge1xyXG4gICAgICAgIGxhc3RTdHIgPSBcIj8uZ2V0Q29tcG9uZW50KExhYmVsKVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS50eXBlID09IFwiRWRpdEJveFwiKSB7XHJcbiAgICAgICAgbGFzdFN0ciA9IFwiPy5nZXRDb21wb25lbnQoRWRpdEJveClcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZXNbaV0udHlwZSA9PSBcIlNwcml0ZVwiKSB7XHJcbiAgICAgICAgbGFzdFN0ciA9IFwiPy5nZXRDb21wb25lbnQoU3ByaXRlKVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlc1tpXS50eXBlID09IFwiQnV0dG9uXCIpIHtcclxuICAgICAgICBsYXN0U3RyID0gXCJcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAobm9kZXNbaV0udHlwZSA9PSBcIlJpY2hUZXh0XCIpIHtcclxuICAgICAgICBsYXN0U3RyID0gXCI/LmdldENvbXBvbmVudChSaWNoVGV4dClcIjtcclxuICAgICAgfVxyXG4gICAgICBzdHIgKz0gYCAgICB0aGlzLiR7dE5hbWV9ID0gZmluZChcIiR7bm9kZXNbaV0ucGF0aH1cIix0aGlzLm5vZGUpJHtsYXN0U3RyfTtcXHJcXG5gO1xyXG4gICAgfVxyXG5cclxuICAgIHN0ciArPSBgICB9XFxyXFxuYDtcclxuXHJcbiAgICBzdHIgKz0gYCAgb25FbmFibGUoKSB7XFxyXFxuYDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnVuY05hbWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHN0ciArPSBgICAgIHRoaXMuJHtmdW5jTmFtZXNbaV19Lm9uKE5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5jbGlja18ke2Z1bmNOYW1lc1tpXX0sIHRoaXMpO1xcclxcbmA7XHJcbiAgICB9XHJcbiAgICBzdHIgKz0gYCAgfVxcclxcbmA7XHJcblxyXG4gICAgc3RyICs9IGAgIG9uRGlzYWJsZSgpIHtcXHJcXG5gO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdW5jTmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgc3RyICs9IGAgICAgdGhpcy4ke2Z1bmNOYW1lc1tpXX0ub2ZmKE5vZGUuRXZlbnRUeXBlLlRPVUNIX0VORCwgdGhpcy5jbGlja18ke2Z1bmNOYW1lc1tpXX0sIHRoaXMpO1xcclxcbmA7XHJcbiAgICB9XHJcbiAgICBzdHIgKz0gYCAgfVxcclxcbmA7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmdW5jTmFtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgc3RyICs9IGAgIGNsaWNrXyR7ZnVuY05hbWVzW2ldfSgpIHt9XFxyXFxuYDtcclxuICAgIH1cclxuXHJcbiAgICBzdHIgKz0gYH1gO1xyXG5cclxuICAgIEVkaXRvci5NZXNzYWdlLnNlbmQoXHJcbiAgICAgIFwiYXNzZXQtZGJcIixcclxuICAgICAgXCJjcmVhdGUtYXNzZXRcIixcclxuICAgICAgYGRiOi8vYXNzZXRzL3NjcmlwdC91aS8ke25vZGUubmFtZX0vJHthdXRvTmFtZX0udHNgLFxyXG4gICAgICBzdHIsXHJcbiAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH1cclxuICAgICk7XHJcblxyXG4gICAgbGV0IGNsYXNzTmFtZSA9IFwiVUlcIiArIG5vZGUubmFtZTtcclxuICAgIGxldCBwYXRoID0gYGRiOi8vYXNzZXRzL3NjcmlwdC91aS8ke25vZGUubmFtZX0vJHtjbGFzc05hbWV9LnRzYDtcclxuICAgIGxldCByID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdChcclxuICAgICAgXCJhc3NldC1kYlwiLFxyXG4gICAgICBcInF1ZXJ5LWFzc2V0LWluZm9cIixcclxuICAgICAgcGF0aFxyXG4gICAgKTtcclxuICAgIGNvbnNvbGUubG9nKFwi55Sf5oiQ5oiQ5Yqf77yfXCIsIHIpO1xyXG4gICAgdGhpcy5leHRyYWN0VXNlZENoYXJzKCk7XHJcbiAgICBpZiAocikgcmV0dXJuO1xyXG4gICAgbGV0IGNvbXAgPSBub2RlLmdldENvbXBvbmVudChjbGFzc05hbWUpO1xyXG4gICAgY29uc29sZS5sb2coXCLnu4Tku7bvvJpcIiwgY29tcCk7XHJcbiAgICBpZiAoIWNvbXApIHtcclxuICAgICAgc3RyID0gYFxyXG4vLyoqKioqKioqKioqKioqKioqKioqKlxyXG4vLyBjcmVhdGUgYnkg5rWB5LqRXHJcbi8vIHRpbWU6ICR7bmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKX1cclxuLy8gZGVzYzogXHJcbi8vKioqKioqKioqKioqKioqKioqKioqXHJcbmltcG9ydCB7IF9kZWNvcmF0b3IsIENvbXBvbmVudCwgTm9kZSAsIGZpbmR9IGZyb20gJ2NjJztcclxuaW1wb3J0IHsgJHthdXRvTmFtZX0gfSBmcm9tICcuLyR7YXV0b05hbWV9JztcclxuY29uc3QgeyBjY2NsYXNzLCBwcm9wZXJ0eSB9ID0gX2RlY29yYXRvcjtcclxuICAgICAgICAgICAgXHJcbkBjY2NsYXNzKCcke2NsYXNzTmFtZX0nKVxyXG5leHBvcnQgY2xhc3MgJHtjbGFzc05hbWV9IGV4dGVuZHMgJHthdXRvTmFtZX0ge1xyXG5cclxuICAgIG9uTG9hZCgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5vbkxvYWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkVuYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5vbkVuYWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uRGlzYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5vbkRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn1cclxuICAgIGA7XHJcbiAgICAgIEVkaXRvci5NZXNzYWdlLnNlbmQoXHJcbiAgICAgICAgXCJhc3NldC1kYlwiLFxyXG4gICAgICAgIFwiY3JlYXRlLWFzc2V0XCIsXHJcbiAgICAgICAgcGF0aCxcclxuICAgICAgICBzdHJcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICAvL25vZGUuYWRkQ29tcG9uZW50KGNsYXNzTmFtZSk7XHJcbiAgfSxcclxuXHJcbiAgZ2V0Tm9kZUJ5dXVpZChyb290OiBOb2RlLCB1dWlkKSB7XHJcbiAgICBsZXQgbm9kZSA9IG51bGw7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvb3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGMgPSByb290LmNoaWxkcmVuW2ldO1xyXG4gICAgICBpZiAoYy51dWlkID09IHV1aWQpIHtcclxuICAgICAgICBub2RlID0gYztcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChub2RlICE9IG51bGwpIHJldHVybiBub2RlO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGxldCBjID0gcm9vdC5jaGlsZHJlbltpXTtcclxuICAgICAgICBsZXQgbiA9IHRoaXMuZ2V0Tm9kZUJ5dXVpZChjLCB1dWlkKTtcclxuICAgICAgICBpZiAobikgcmV0dXJuIG47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG5cclxuICBnZXRBbGxOb2Rlcyhyb290LCBwYXJlbnROYW1lLCBwYXRoID0gXCJcIikge1xyXG4gICAgbGV0IHRlbXBBcnI6IEFycmF5PHt9PiA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb290LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBjOiBOb2RlID0gcm9vdC5jaGlsZHJlbltpXTtcclxuICAgICAgbGV0IHAgPSBwYXRoID09IFwiXCIgPyBjLm5hbWUgOiBwYXRoICsgXCIvXCIgKyBjLm5hbWU7XHJcbiAgICAgIGxldCB0eXAgPSBcIlwiO1xyXG4gICAgICAvLyBsZXQgc29ydENvbXAgPSBjLmdldENvbXBvbmVudChTb3J0aW5nMkQpO1xyXG5cclxuICAgICAgLy8gaWYgKHNvcnRDb21wKSB7XHJcbiAgICAgIC8vICAgc29ydENvbXAuZGVzdHJveSgpO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICBpZiAoYy5nZXRDb21wb25lbnQoTGFiZWwpICE9IG51bGwgJiYgYy5uYW1lLmluZGV4T2YoXCJsYl9cIikgPj0gMCkge1xyXG4gICAgICAgIHR5cCA9IFwiTGFiZWxcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoYy5nZXRDb21wb25lbnQoUmljaFRleHQpICE9IG51bGwgJiYgYy5uYW1lLmluZGV4T2YoXCJydF9cIikgPj0gMCkge1xyXG4gICAgICAgIHR5cCA9IFwiUmljaFRleHRcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoYy5nZXRDb21wb25lbnQoRWRpdEJveCkgIT0gbnVsbCAmJiBjLm5hbWUuaW5kZXhPZihcImViX1wiKSA+PSAwKSB7XHJcbiAgICAgICAgdHlwID0gXCJFZGl0Qm94XCI7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGMuZ2V0Q29tcG9uZW50KFNwcml0ZSkgIT0gbnVsbCAmJiAoYy5uYW1lLmluZGV4T2YoXCJpbWdfXCIpID49IDAgfHwgYy5uYW1lLmluZGV4T2YoXCJzcF9cIikgPj0gMCkpIHtcclxuICAgICAgICB0eXAgPSBcIlNwcml0ZVwiO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjLmdldENvbXBvbmVudChTY3JvbGxWaWV3KSAhPSBudWxsICYmIGMubmFtZS5pbmRleE9mKFwic3ZfXCIpID49IDApIHtcclxuICAgICAgICB0eXAgPSBcIlNjcm9sbFZpZXdcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoYy5uYW1lLmluZGV4T2YoXCJ1aV9cIikgPj0gMCB8fCBjLm5hbWUuaW5kZXhPZihcIlVJX1wiKSA+PSAwIHx8IGMubmFtZS5pbmRleE9mKFwiVWlfXCIpID49IDApIHtcclxuICAgICAgICB0eXAgPSBcIk5vZGVcIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoYy5nZXRDb21wb25lbnQoQnV0dG9uKSAhPSBudWxsIHx8IGMubmFtZS5pbmRleE9mKFwiYnRuX1wiKSA+PSAwIHx8IGMubmFtZS5pbmRleE9mKFwiQnRuX1wiKSA+PSAwKSB7XHJcbiAgICAgICAgdHlwID0gXCJCdXR0b25cIjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIS9bXFx1NGUwMC1cXHU5ZmZmXS8udGVzdChjLm5hbWUpICYmICEvXlxcZC8udGVzdChjLm5hbWUpICYmICEvLS8udGVzdChjLm5hbWUpICYmICEvXFxzLy50ZXN0KGMubmFtZSkgJiYgKHR5cCA9PSBcIkJ1dHRvblwiIHx8IHR5cCA9PSBcIkxhYmVsXCIgfHwgdHlwID09IFwiU3ByaXRlXCIgfHwgdHlwID09IFwiU2Nyb2xsVmlld1wiIHx8IHR5cCA9PSBcIk5vZGVcIiB8fCB0eXAgPT0gXCJFZGl0Qm94XCIgfHwgdHlwID09IFwiUmljaFRleHRcIikpXHJcbiAgICAgICAgdGVtcEFyci5wdXNoKHsgbm9kZU5hbWU6IGMubmFtZSwgcGFyZW50TmFtZTogcGFyZW50TmFtZSwgcGF0aDogcCwgdHlwZTogdHlwIH0pO1xyXG4gICAgICBpZiAoYy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IGFyciA9IHRoaXMuZ2V0QWxsTm9kZXMoYywgYy5uYW1lLCBwKTtcclxuICAgICAgICB0ZW1wQXJyID0gdGVtcEFyci5jb25jYXQoYXJyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXBBcnI7XHJcbiAgfSxcclxuXHJcbiAgLyoqXHJcbiAgICAqIOiOt+WPluiKgueCueagkVxyXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZVBhdGgg5paH5Lu26Lev5b6EXHJcbiAgICAqIEByZXR1cm5zIHtvYmplY3R9XHJcbiAgICAqL1xyXG4gIGdldE5vZGVUcmVlKGZpbGVQYXRoKSB7XHJcbiAgICAvLyDojrflj5bnvJPlrZhcclxuICAgIGxldCBjYWNoZSA9IHRoaXMuY2FjaGUgYXMgYW55O1xyXG4gICAgaWYgKCFjYWNoZSkge1xyXG4gICAgICBjYWNoZSA9IHRoaXMuY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xyXG4gICAgfVxyXG4gICAgLy8g5LuO57yT5a2Y5Lit6K+75Y+WXHJcbiAgICBpZiAoIWNhY2hlW2ZpbGVQYXRoXSkge1xyXG4gICAgICAvLyDlsIbotYTmupDmlbDmja7ovazkuLroioLngrnmoJFcclxuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoRnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoKSk7XHJcbiAgICAgIGNhY2hlW2ZpbGVQYXRoXSA9IHRoaXMuY29udmVydFRvTm9kZVRyZWUoZGF0YSk7XHJcbiAgICB9XHJcbiAgfSxcclxuXHJcblxyXG4gIC8vIOaPkOWPluaJgOacieS9v+eUqOeahOWtl+esplxyXG4gIGV4dHJhY3RVc2VkQ2hhcnMoKSB7XHJcbiAgICBjb25zdCB1c2VkQ2hhcnMgPSBuZXcgU2V0KCk7XHJcblxyXG4gICAgLy8g6YGN5Y6G6aG555uu5Lit55qEIGFzc2V0cyDnm67lvZVcclxuICAgIGNvbnN0IGFzc2V0c1BhdGggPSBwYXRoLmpvaW4ocHJvamVjdFBhdGgsICdhc3NldHMnKTtcclxuICAgIGlmIChGcy5leGlzdHNTeW5jKGFzc2V0c1BhdGgpKSB7XHJcbiAgICAgIHRoaXMudHJhdmVyc2VEaXJlY3RvcnkoYXNzZXRzUGF0aCwgdXNlZENoYXJzKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlsIblrZfnrKbpm4blkIjovazmjaLkuLrlrZfnrKbkuLJcclxuICAgIGNvbnN0IGNoYXJzU3RyaW5nID0gQXJyYXkuZnJvbSh1c2VkQ2hhcnMpLmpvaW4oJycpO1xyXG5cclxuICAgIC8vIOehruS/nei+k+WHuuebruW9leWtmOWcqFxyXG4gICAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5kaXJuYW1lKG91dHB1dFBhdGgpO1xyXG4gICAgaWYgKCFGcy5leGlzdHNTeW5jKG91dHB1dERpcikpIHtcclxuICAgICAgRnMubWtkaXJTeW5jKG91dHB1dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5YaZ5YWl5paH5Lu2XHJcbiAgICBGcy53cml0ZUZpbGVTeW5jKG91dHB1dFBhdGgsIGNoYXJzU3RyaW5nKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhgRXh0cmFjdGVkICR7dXNlZENoYXJzLnNpemV9IHVuaXF1ZSBjaGFyYWN0ZXJzIHRvICR7b3V0cHV0UGF0aH1gKTtcclxuICB9LFxyXG5cclxuICAvLyDpgY3ljobnm67lvZXlubbmj5Dlj5blrZfnrKZcclxuICB0cmF2ZXJzZURpcmVjdG9yeShkaXJQYXRoLCB1c2VkQ2hhcnMpIHtcclxuICAgIGNvbnN0IGZpbGVzID0gRnMucmVhZGRpclN5bmMoZGlyUGF0aCk7XHJcblxyXG4gICAgZmlsZXMuZm9yRWFjaCgoZmlsZTogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRpclBhdGgsIGZpbGUpO1xyXG4gICAgICBjb25zdCBzdGF0ID0gRnMuc3RhdFN5bmMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+ebruW9le+8jOmAkuW9kumBjeWOhlxyXG4gICAgICAgIHRoaXMudHJhdmVyc2VEaXJlY3RvcnkoZmlsZVBhdGgsIHVzZWRDaGFycyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc3RhdC5pc0ZpbGUoKSkge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+aWh+S7tu+8jOivu+WPluWGheWuueW5tuaPkOWPluWtl+esplxyXG4gICAgICAgIGNvbnN0IGV4dCA9IHBhdGguZXh0bmFtZShmaWxlKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGlmIChleHQgPT09ICcuanMnIHx8IGV4dCA9PT0gJy50cycgfHwgZXh0ID09PSAnLmpzb24nIHx8IGV4dCA9PT0gJy5maXJlJyB8fCBleHQgPT09ICcucHJlZmFiJyB8fCBleHQgPT09ICcuY3N2JyB8fCBleHQgPT09ICcudHh0Jykge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoYXIgb2YgY29udGVudCkge1xyXG4gICAgICAgICAgICAgIHVzZWRDaGFycy5hZGQoY2hhcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byByZWFkIGZpbGU6ICR7ZmlsZVBhdGh9LCBlcnJvcjogJHtlcnJ9YCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59O1xyXG5cclxuLyoqXHJcbiAqIEBlbiBIb29rcyB0cmlnZ2VyZWQgYWZ0ZXIgZXh0ZW5zaW9uIGxvYWRpbmcgaXMgY29tcGxldGVcclxuICogQHpoIOaJqeWxleWKoOi9veWujOaIkOWQjuinpuWPkeeahOmSqeWtkFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgbGV0IGlkID0gRWRpdG9yLlNlbGVjdGlvbi5nZXRMYXN0U2VsZWN0ZWQoXCJOb2RlXCIpO1xyXG4gIGNvbnNvbGUubG9nKFwi6YCJ5Lit6IqC54K577yaXCIgKyBpZCk7XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgdXBkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gIGxldCBpZCA9IEVkaXRvci5TZWxlY3Rpb24uZ2V0TGFzdFNlbGVjdGVkKFwiTm9kZVwiKTtcclxuICBjb25zb2xlLmxvZyhcIumAieS4reiKgueCue+8mlwiICsgaWQpO1xyXG59XHJcblxyXG4vKipcclxuICogQGVuIEhvb2tzIHRyaWdnZXJlZCBhZnRlciBleHRlbnNpb24gdW5pbnN0YWxsYXRpb24gaXMgY29tcGxldGVcclxuICogQHpoIOaJqeWxleWNuOi9veWujOaIkOWQjuinpuWPkeeahOmSqeWtkFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHVubG9hZCA9IGZ1bmN0aW9uICgpIHsgfTtcclxuIl19