{"remainingRequest":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\ljzc-fvue\\src\\hotent-ui-util.js","dependencies":[{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\src\\hotent-ui-util.js","mtime":1701311301256},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\babel.config.js","mtime":1701311296006},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9sanpjLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvbGp6Yy1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIjsKaW1wb3J0IF90eXBlb2YgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvbGp6Yy1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5rZXlzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkucHVzaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZXJyb3IuY2F1c2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5qb2luLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnZhbHVlcy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnJlZHVjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLmlzLWludGVnZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5jb25jYXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLnRlc3QuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZG90LWFsbC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3kuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc2V0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZnJvbS5qcyI7CnZhciB1dGlscyA9IHsKICAvKioNCiAgICog5ZCI5bm2DQogICAqLwogIGRlZXBNZXJnZTogZnVuY3Rpb24gKF9kZWVwTWVyZ2UpIHsKICAgIGZ1bmN0aW9uIGRlZXBNZXJnZShfeCwgX3gyKSB7CiAgICAgIHJldHVybiBfZGVlcE1lcmdlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICB9CiAgICBkZWVwTWVyZ2UudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBfZGVlcE1lcmdlLnRvU3RyaW5nKCk7CiAgICB9OwogICAgcmV0dXJuIGRlZXBNZXJnZTsKICB9KGZ1bmN0aW9uICh0YXJnZXQsIG1lcmdlZCkgewogICAgZm9yICh2YXIga2V5IGluIG1lcmdlZCkgewogICAgICBpZiAodGFyZ2V0W2tleV0gJiYgKDAsIF90eXBlb2YyWyJkZWZhdWx0Il0pKHRhcmdldFtrZXldKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICBkZWVwTWVyZ2UodGFyZ2V0W2tleV0sIG1lcmdlZFtrZXldKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoKDAsIF90eXBlb2YyWyJkZWZhdWx0Il0pKG1lcmdlZFtrZXldKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICB0YXJnZXRba2V5XSA9ICgwLCBkZWVwQ2xvbmUpKG1lcmdlZFtrZXldLCB0cnVlKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB0YXJnZXRba2V5XSA9IG1lcmdlZFtrZXldOwogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9KSwKICAvKioNCiAgICog5qC55o2u5a2X5YW457yW56CB6I635Y+W5a2X5YW45pWw5o2uDQogICAqLwogIGdldERpY3RJdGVtc0Zyb21DYWNoZTogZnVuY3Rpb24gZ2V0RGljdEl0ZW1zRnJvbUNhY2hlKGRpY3RDb2RlKSB7CiAgICBpZiAoIWRpY3RDb2RlKSB7CiAgICAgIHJldHVybiAn5a2X5YW4Q29kZeS4jeiDveS4uuepuiEnOwogICAgfQogICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2RpY3RfZGF0YScpKSB7CiAgICAgIHZhciBkaWN0X2RhdGEgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2RpY3RfZGF0YScpKTsKICAgICAgaWYgKGRpY3RfZGF0YVtkaWN0Q29kZV0pIHsKICAgICAgICB2YXIgZGlzdEl0ZW0gPSBkaWN0X2RhdGFbZGljdENvZGVdOwogICAgICAgIHJldHVybiBkaXN0SXRlbTsKICAgICAgfQogICAgfQogIH0sCiAgLyoqDQogICAqIOa3seaLt+i0nQ0KICAgKi8KICBkZWVwQ2xvbmU6IGZ1bmN0aW9uIGRlZXBDbG9uZShkYXRhKSB7CiAgICB2YXIgdHlwZSA9IHV0aWxzLmdldFR5cGUoZGF0YSk7CiAgICB2YXIgb2JqOwogICAgaWYgKHR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgb2JqID0gW107CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgIG9iaiA9IHt9OwogICAgfSBlbHNlIHsKICAgICAgLy/kuI3lho3lhbfmnInkuIvkuIDlsYLmrKEKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CiAgICBpZiAodHlwZSA9PT0gImFycmF5IikgewogICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZGF0YS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgIG9iai5wdXNoKHV0aWxzLmRlZXBDbG9uZShkYXRhW2ldKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgZm9yICh2YXIga2V5IGluIGRhdGEpIHsKICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmRlZXBDbG9uZShkYXRhW2tleV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gb2JqOwogIH0sCiAgZ2V0VHlwZTogZnVuY3Rpb24gZ2V0VHlwZShvYmopIHsKICAgIC8vdG9zdHJpbmfkvJrov5Tlm57lr7nlupTkuI3lkIznmoTmoIfnrb7nmoTmnoTpgKDlh73mlbAKICAgIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICB2YXIgbWFwID0gewogICAgICAiW29iamVjdCBCb29sZWFuXSI6ICJib29sZWFuIiwKICAgICAgIltvYmplY3QgTnVtYmVyXSI6ICJudW1iZXIiLAogICAgICAiW29iamVjdCBTdHJpbmddIjogInN0cmluZyIsCiAgICAgICJbb2JqZWN0IEZ1bmN0aW9uXSI6ICJmdW5jdGlvbiIsCiAgICAgICJbb2JqZWN0IEFycmF5XSI6ICJhcnJheSIsCiAgICAgICJbb2JqZWN0IERhdGVdIjogImRhdGUiLAogICAgICAiW29iamVjdCBSZWdFeHBdIjogInJlZ0V4cCIsCiAgICAgICJbb2JqZWN0IFVuZGVmaW5lZF0iOiAidW5kZWZpbmVkIiwKICAgICAgIltvYmplY3QgTnVsbF0iOiAibnVsbCIsCiAgICAgICJbb2JqZWN0IE9iamVjdF0iOiAib2JqZWN0IgogICAgfTsKICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7CiAgICAgIHJldHVybiAiZWxlbWVudCI7CiAgICB9CiAgICByZXR1cm4gbWFwW3RvU3RyaW5nLmNhbGwob2JqKV07CiAgfSwKICBpc0VtcHR5OiBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gIiIpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IE9iamVjdCkgewogICAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PSAwOwogICAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSkgewogICAgICByZXR1cm4gdmFsdWUubGVuZ3RoID09IDA7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfSwKICAvLyDop6PmnpBVUkzlnLDlnYDvvIzlpoLmnpx1cmzlnLDlnYDljIXlkKvkuoYke2Zvcm196L+Z5qC355qE5Y2g5L2N56ym77yM5Lya5oyJ54Wnc3NvLmpz5Lit6YWN572u55qE5a+55bqU5pyN5Yqh55qE5Zyw5Z2A5pu/5o2i44CCCiAgcGFyc2VVcmw6IGZ1bmN0aW9uIHBhcnNlVXJsKHVybCkgewogICAgaWYgKHVybCA9PT0gIiIpIHJldHVybjsKICAgIHZhciBjdHggPSB3aW5kb3cuY29udGV4dCwKICAgICAgcmVnID0gL14oXCRceyhcdyspXH0pXC8uKiQvOwogICAgdmFyIG1hdGNoID0gcmVnLmV4ZWModXJsKTsKICAgIGlmIChtYXRjaCAhPSBudWxsKSB7CiAgICAgIHZhciBuYW1lID0gbWF0Y2hbMl0sCiAgICAgICAgbWMgPSBtYXRjaFsxXSwKICAgICAgICB2YWwgPSBjdHhbbmFtZV07CiAgICAgIGlmICghdmFsKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUaGUgJyIgKyBuYW1lICsgIicgaW4gdXJsOiIgKyB1cmwgKyAiIGRvZXMgbm90IGRlZmluZWQgaW4gY29udGV4dCBwcm92aWRlci4iKTsKICAgICAgfQogICAgICByZXR1cm4gdXJsLnJlcGxhY2UobWMsIHZhbCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdXJsOwogICAgfQogIH0sCiAgLy8g5L2/55SoY3R45a+56LGh5Lit55qE5YC85pu/5o2i5o6JZXhw5Lit5omA5pyJ55qEJHtrZXl9CiAgcGFyc2VFeHA6IGZ1bmN0aW9uIHBhcnNlRXhwKGV4cCwgY3R4KSB7CiAgICBpZiAoIWV4cCB8fCBleHAuY29uc3RydWN0b3IgIT0gU3RyaW5nKSByZXR1cm4gZXhwOwogICAgY3R4ID0gY3R4IHx8IHt9OwogICAgdmFyIHJlZyA9IC8oXCRceyhcdyspXH0pLywKICAgICAgbWF0Y2ggPSBudWxsLAogICAgICBjb3VudCA9IDA7CiAgICB3aGlsZSAobWF0Y2ggPSByZWcuZXhlYyhleHApKSB7CiAgICAgIGNvdW50Kys7CiAgICAgIC8vIOmBv+WFjeatu+W+queOrwogICAgICBpZiAoY291bnQgPiA5OTkpIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewogICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKG1hdGNoWzFdLCBjdHguaGFzT3duUHJvcGVydHkobWF0Y2hbMl0pID8gY3R4W21hdGNoWzJdXSA6ICIiKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGV4cDsKICB9LAogIC8vIOiOt+WPlumaj+acuueahOWQjeensAogIGdldE5hbWU6IGZ1bmN0aW9uIGdldE5hbWUoKSB7CiAgICByZXR1cm4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDEwKTsKICB9LAogIC8vIOiOt+WPluaOp+S7tuaYr+WQpuWPr+e8lui+kQogIGdldFdyaXRlYWJsZTogZnVuY3Rpb24gZ2V0V3JpdGVhYmxlKHBlcm1pc3Npb24pIHsKICAgIGlmIChwZXJtaXNzaW9uID09PSAnbicgfHwgcGVybWlzc2lvbiA9PT0gJ3InKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0sCiAgLy8g5ZCI5bm26aqM6K+B6KeE5YiZKOWmguaenHJ1bGVz5ZKMYXBwZW5kUnVsZXPlnYfkuLrlrZfnrKbkuLLmoLzlvI/vvIzlkIjlubblkI7ku43kuLrlrZfnrKbkuLLmoLzlvI/vvJvlpoLmnpzlhbbkuK3kuIDkuKrkuLpPYmplY3TmoLzlvI/vvIzlkIjlubblkI7kuLpPYmplY3TmoLzlvI/jgIIpCiAgbWVyZ2VWYWxpZGF0ZTogZnVuY3Rpb24gbWVyZ2VWYWxpZGF0ZShydWxlcywgYXBwZW5kUnVsZXMpIHsKICAgIGlmICghYXBwZW5kUnVsZXMgfHwgYXBwZW5kUnVsZXMuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiBhcHBlbmRSdWxlcy5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBydWxlczsKICAgIH0KICAgIHZhciBydWxlc1R5cGVJc1N0cmluZyA9IHRydWUsCiAgICAgIGFwcGVuZFR5cGVJc1N0cmluZyA9IGFwcGVuZFJ1bGVzLmNvbnN0cnVjdG9yID09PSBTdHJpbmcsCiAgICAgIGZpbmFsVHlwZUlzU3RyaW5nID0gdHJ1ZTsKICAgIGlmIChydWxlcyA9PT0gdW5kZWZpbmVkIHx8IHJ1bGVzID09PSBudWxsKSB7CiAgICAgIHJ1bGVzVHlwZUlzU3RyaW5nID0gYXBwZW5kVHlwZUlzU3RyaW5nOwogICAgICBydWxlcyA9IGFwcGVuZFR5cGVJc1N0cmluZyA/ICIiIDoge307CiAgICB9IGVsc2UgaWYgKHJ1bGVzLmNvbnN0cnVjdG9yID09PSBPYmplY3QgfHwgcnVsZXMuY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICBydWxlc1R5cGVJc1N0cmluZyA9IHJ1bGVzLmNvbnN0cnVjdG9yID09PSBTdHJpbmc7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAicnVsZXNcdTc2ODRcdTdDN0JcdTU3OEJcdTRFM0EiLmNvbmNhdChfdHlwZW9mKHJ1bGVzKSwgIlx1RkYwQ1x1NTNFQVx1ODBGRFx1NEUzQU9iamVjdFx1N0M3Qlx1NTc4Qlx1NjIxNlN0cmluZ1x1N0M3Qlx1NTc4Qlx1MzAwMiIpOwogICAgfQogICAgZmluYWxUeXBlSXNTdHJpbmcgPSBydWxlc1R5cGVJc1N0cmluZyAmJiBhcHBlbmRUeXBlSXNTdHJpbmc7CiAgICAvLyDku43nhLbku6VTdHJpbmfmoLzlvI8KICAgIGlmIChmaW5hbFR5cGVJc1N0cmluZykgewogICAgICB2YXIgcnVsZUFyeSA9IHV0aWxzLnN0cmluZ1NwbGl0KHJ1bGVzLCAifCIpOwogICAgICB2YXIgYXBwZW5kQXJ5ID0gdXRpbHMuc3RyaW5nU3BsaXQoYXBwZW5kUnVsZXMsICJ8Iik7CiAgICAgIHZhciBydWxlT2JqID0ge30sCiAgICAgICAgYXBwZW5kT2JqID0ge307CiAgICAgIHJ1bGVBcnkuZm9yRWFjaChmdW5jdGlvbiAocikgewogICAgICAgIHZhciBrID0gdXRpbHMuc3RyaW5nU3BsaXQociwgIjoiKVswXTsKICAgICAgICBydWxlT2JqW2tdID0gcjsKICAgICAgfSk7CiAgICAgIGFwcGVuZEFyeS5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgdmFyIGsgPSB1dGlscy5zdHJpbmdTcGxpdChhLCAiOiIpWzBdOwogICAgICAgIGFwcGVuZE9ialtrXSA9IGE7CiAgICAgIH0pOwogICAgICAvLyDlpoLmnpzml6fop4TliJnkuK3lrZjlnKjkuI7ov73liqDop4TliJnkuK3nmoTlkIzlkI3op4TliJnvvIzliJnkvb/nlKjov73liqDop4TliJnopobnm5bml6fop4TliJnjgIIKICAgICAgdmFyIG1lcmdlT2JqID0gT2JqZWN0LmFzc2lnbihydWxlT2JqLCBhcHBlbmRPYmopOwogICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhtZXJnZU9iaikuam9pbigifCIpOwogICAgfQogICAgLy8g6L2s5o2i5Li6T2JqZWN05qC85byPCiAgICBlbHNlIHsKICAgICAgdmFyIF9ydWxlT2JqID0ge30sCiAgICAgICAgX2FwcGVuZE9iaiA9IHt9OwogICAgICBpZiAocnVsZXNUeXBlSXNTdHJpbmcpIHsKICAgICAgICBfcnVsZU9iaiA9IHV0aWxzLnZhbGlkYXRlU3RyaW5nMk9iamVjdChydWxlcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgX3J1bGVPYmogPSBfb2JqZWN0U3ByZWFkKHt9LCBydWxlcyk7CiAgICAgIH0KICAgICAgaWYgKGFwcGVuZFR5cGVJc1N0cmluZykgewogICAgICAgIF9hcHBlbmRPYmogPSB1dGlscy52YWxpZGF0ZVN0cmluZzJPYmplY3QoYXBwZW5kUnVsZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIF9hcHBlbmRPYmogPSBfb2JqZWN0U3ByZWFkKHt9LCBhcHBlbmRSdWxlcyk7CiAgICAgIH0KICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oX3J1bGVPYmosIF9hcHBlbmRPYmopOwogICAgfQogIH0sCiAgLy8g5YeP5bCR5qCh6aqM6KeE5YiZCiAgcmVkdWNlVmFsaWRhdGU6IGZ1bmN0aW9uIHJlZHVjZVZhbGlkYXRlKHJ1bGVzLCByZWR1Y2VSdWxlcykgewogICAgaWYgKCFydWxlcyB8fCAhcmVkdWNlUnVsZXMgfHwgcmVkdWNlUnVsZXMuY29uc3RydWN0b3IgIT09IE9iamVjdCAmJiByZWR1Y2VSdWxlcy5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBydWxlczsKICAgIH0KICAgIC8vIOimgeWHj+WwkeeahOagoemqjOinhOWImeeahOWQjeensOmbhuWQiAogICAgdmFyIHJlZHVjZVJ1bGVOYW1lcyA9IFtdOwogICAgaWYgKHJlZHVjZVJ1bGVzLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgdmFyIHJlZHVjZVJ1bGVPYmogPSB1dGlscy52YWxpZGF0ZVN0cmluZzJPYmplY3QocmVkdWNlUnVsZXMpOwogICAgICByZWR1Y2VSdWxlTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2VSdWxlT2JqKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlZHVjZVJ1bGVOYW1lcyA9IE9iamVjdC5rZXlzKHJlZHVjZVJ1bGVzKTsKICAgIH0KICAgIGlmIChydWxlcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgICAgIE9iamVjdC5rZXlzKHJ1bGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7CiAgICAgICAgaWYgKHJlZHVjZVJ1bGVOYW1lcy5zb21lKGZ1bmN0aW9uIChuKSB7CiAgICAgICAgICByZXR1cm4gbiA9PSBrOwogICAgICAgIH0pKSB7CiAgICAgICAgICBkZWxldGUgcnVsZXNba107CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHJ1bGVzOwogICAgfSBlbHNlIGlmIChydWxlcy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7CiAgICAgIHZhciBydWxlQXJ5ID0gdXRpbHMuc3RyaW5nU3BsaXQocnVsZXMsICJ8Iik7CiAgICAgIHZhciBuUnVsZUFyeSA9IHJ1bGVBcnkucmVkdWNlKGZ1bmN0aW9uIChhcnksIHIpIHsKICAgICAgICB2YXIgbmFtZSA9IHV0aWxzLnN0cmluZ1NwbGl0KHIsICI6IilbMF07CiAgICAgICAgaWYgKHJlZHVjZVJ1bGVOYW1lcy5ldmVyeShmdW5jdGlvbiAobSkgewogICAgICAgICAgcmV0dXJuIG0gIT0gbmFtZTsKICAgICAgICB9KSkgewogICAgICAgICAgYXJ5LnB1c2gocik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnk7CiAgICAgIH0sIFtdKTsKICAgICAgcmV0dXJuIG5SdWxlQXJ5LmpvaW4oInwiKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICJydWxlc1x1NzY4NFx1N0M3Qlx1NTc4Qlx1NEUzQSIuY29uY2F0KF90eXBlb2YocnVsZXMpLCAiXHVGRjBDXHU1M0VBXHU4MEZEXHU0RTNBT2JqZWN0XHU3QzdCXHU1NzhCXHU2MjE2U3RyaW5nXHU3QzdCXHU1NzhCXHUzMDAyIik7CiAgICB9CiAgfSwKICAvLyDlrZfnrKbkuLLmoLzlvI/nmoTmoKHpqozop4TliJnovazkuLrlr7nosaHmoLzlvI8KICB2YWxpZGF0ZVN0cmluZzJPYmplY3Q6IGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nMk9iamVjdChydWxlKSB7CiAgICBpZiAoIXJ1bGUgfHwgcnVsZS5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBydWxlOwogICAgfQogICAgdmFyIG9iaiA9IHt9OwogICAgdmFyIGFyeSA9IHV0aWxzLnN0cmluZ1NwbGl0KHJ1bGUsICd8Jyk7CiAgICBhcnkuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgICB2YXIgcmVnQW5kQXJncyA9IHV0aWxzLnN0cmluZ1NwbGl0KG0sICc6Jyk7CiAgICAgIGlmIChyZWdBbmRBcmdzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgb2JqW3JlZ0FuZEFyZ3NbMF1dID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChyZWdBbmRBcmdzLmxlbmd0aCA+IDEpIHsKICAgICAgICB2YXIgYXJncyA9IHV0aWxzLnN0cmluZ1NwbGl0KHJlZ0FuZEFyZ3NbMV0sICIsIik7CiAgICAgICAgb2JqW3JlZ0FuZEFyZ3NbMF1dID0gYXJnczsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gb2JqOwogIH0sCiAgLy8g5a2X56ym5Liyc3Ry5oyJ54Wnc2Vw5YiG5Ymy5Li65pWw57uE77yM5bm25riF55CG5o6J5pWw57uE57uT5p6c5Lit55qE56m655m96aG544CCCiAgc3RyaW5nU3BsaXQ6IGZ1bmN0aW9uIHN0cmluZ1NwbGl0KHN0ciwgc2VwKSB7CiAgICBpZiAoIXN0ciB8fCBzdHIuY29uc3RydWN0b3IgIT09IFN0cmluZyB8fCAhc2VwIHx8IHNlcC5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIHZhciBhcnkgPSBzdHIuc3BsaXQoc2VwKTsKICAgIGFyeSA9IGFyeS5tYXAoZnVuY3Rpb24gKHApIHsKICAgICAgcmV0dXJuIHAudHJpbSgpOwogICAgfSk7CiAgICBhcnkgPSBhcnkudHJpbSgpOwogICAgcmV0dXJuIGFyeTsKICB9LAogIC8vIOiOt+WPluaOp+S7tuaYr+WQpua3u+WKoOW/heWhq+agoemqjAogIGFkZFJlcXVpcmVkT3JOb3Q6IGZ1bmN0aW9uIGFkZFJlcXVpcmVkT3JOb3QocGVybWlzc2lvbiwgdmFsaWRhdGUpIHsKICAgIGlmIChwZXJtaXNzaW9uICE9PSAnYicpIHsKICAgICAgcmV0dXJuIHZhbGlkYXRlOwogICAgfQogICAgaWYgKHZhbGlkYXRlID09PSB1bmRlZmluZWQgfHwgdmFsaWRhdGUgPT09IG51bGwpIHsKICAgICAgdmFsaWRhdGUgPSAiIjsKICAgIH0KICAgIHJldHVybiB1dGlscy5tZXJnZVZhbGlkYXRlKCJyZXF1aXJlZCIsIHZhbGlkYXRlKTsKICB9LAogIC8vIOagvOW8j+WMluaXpeacn+aXtumXtAogIGZvcm1hdERhdGU6IGZ1bmN0aW9uIGZvcm1hdERhdGUodmFsdWUsIHR5cGUpIHsKICAgIHZhciBkYXRlID0gbnVsbDsKICAgIGlmICghdmFsdWUpIHsKICAgICAgcmV0dXJuIGRhdGU7CiAgICB9CiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gRGF0ZSAmJiAhaXNOYU4odmFsdWUuZ2V0VGltZSgpKSkgewogICAgICBkYXRlID0gdmFsdWU7CiAgICB9IGVsc2UgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IFN0cmluZyB8fCB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBOdW1iZXIpIHsKICAgICAgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93ICLmoLzlvI/ljJbml6XmnJ/ml7bvvIzkvKDlhaXnmoTmlbDmja7moLzlvI/kuI3mraPnoa7jgIIiOwogICAgfQogICAgdmFyIHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICB2YXIgTU0gPSBkYXRlLmdldE1vbnRoKCkgKyAxOwogICAgTU0gPSBNTSA8IDEwID8gJzAnICsgTU0gOiBNTTsKICAgIHZhciBkID0gZGF0ZS5nZXREYXRlKCk7CiAgICBkID0gZCA8IDEwID8gJzAnICsgZCA6IGQ7CiAgICB2YXIgaCA9IGRhdGUuZ2V0SG91cnMoKTsKICAgIGggPSBoIDwgMTAgPyAnMCcgKyBoIDogaDsKICAgIHZhciBtID0gZGF0ZS5nZXRNaW51dGVzKCk7CiAgICBtID0gbSA8IDEwID8gJzAnICsgbSA6IG07CiAgICB2YXIgcyA9IGRhdGUuZ2V0U2Vjb25kcygpOwogICAgcyA9IHMgPCAxMCA/ICcwJyArIHMgOiBzOwogICAgaWYgKHR5cGUgPT0gJ3llYXInKSB7CiAgICAgIHJldHVybiB5OwogICAgfSBlbHNlIGlmICh0eXBlID09ICd5ZWFyTW9udGgnKSB7CiAgICAgIHJldHVybiB5ICsgJy0nICsgTU07CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2RhdGUnKSB7CiAgICAgIHJldHVybiB5ICsgJy0nICsgTU0gKyAnLScgKyBkOwogICAgfSBlbHNlIGlmICh0eXBlID09ICdkYXRlVGltZScpIHsKICAgICAgcmV0dXJuIHkgKyAnLScgKyBNTSArICctJyArIGQgKyAnICcgKyBoICsgJzonICsgbSArICc6JyArIHM7CiAgICB9CiAgfSwKICAvLyDmoLzlvI/ljJbml6XmnJ8gCiAgZm9ybWF0RGF0ZVllYXI6IGZ1bmN0aW9uIGZvcm1hdERhdGVZZWFyKHZhbHVlKSB7CiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTsKICAgIHZhciB5ID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgdmFyIE1NID0gZGF0ZS5nZXRNb250aCgpICsgMTsKICAgIE1NID0gTU0gPCAxMCA/ICcwJyArIE1NIDogTU07CiAgICB2YXIgZCA9IGRhdGUuZ2V0RGF0ZSgpOwogICAgZCA9IGQgPCAxMCA/ICcwJyArIGQgOiBkOwogICAgcmV0dXJuIHkgKyAnLScgKyBNTSArICctJyArIGQ7CiAgfSwKICAvLyDml6XmnJ8x5piv5ZCm5pep5LqO5pel5pyfMgogIGRhdGVJc0JlZm9yZTogZnVuY3Rpb24gZGF0ZUlzQmVmb3JlKGRhdGVPbmUsIGRhdGVUd28sIGNhbkVxdWFscykgewogICAgaWYgKCFkYXRlT25lIHx8ICFkYXRlVHdvKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgdmFyIGRhdGUxID0gbmV3IERhdGUoZGF0ZU9uZSkuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCJ5eXl5LU1NLWRkIikgKyAiICIgKyBkYXRlT25lKS5nZXRUaW1lKCk7CiAgICB2YXIgZGF0ZTIgPSBuZXcgRGF0ZShkYXRlVHdvKS5nZXRUaW1lKCkgfHwgbmV3IERhdGUobmV3IERhdGUoKS5mb3JtYXQoInl5eXktTU0tZGQiKSArICIgIiArIGRhdGVUd28pLmdldFRpbWUoKTsKICAgIGlmICghY2FuRXF1YWxzKSB7CiAgICAgIC8v5aSn5LqO44CCdjI+djEg44CCCiAgICAgIGlmIChkYXRlMiA+IGRhdGUxKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvL+Wkp+S6juetieS6juOAgnYyPj12MSDjgILlj6ropoF2MeS4jeWkp+S6jnYy5Y2z5Y+vCiAgICAgIGlmIChkYXRlMSA+IGRhdGUyKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgfSwKICAvLyDml6XmnJ/orqHnrpfvvIzkuI3kvKDljZXkvY3ml7bvvIzpu5jorqTku6Un5aSpJ+S4uuWNleS9jeiuoeeulwogIGRhdGVDYWxjOiBmdW5jdGlvbiBkYXRlQ2FsYyhzdGFydERhdGUsIGVuZERhdGUsIG9wKSB7CiAgICBpZiAoIXN0YXJ0RGF0ZSB8fCAhZW5kRGF0ZSB8fCBzdGFydERhdGUubGVuZ3RoID09IDAgfHwgZW5kRGF0ZS5sZW5ndGggPT0gMCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmICghb3AgfHwgb3AuY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgIG9wID0gImRheSI7CiAgICB9CiAgICB2YXIgb3BBcnkgPSBbJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCddOwogICAgaWYgKG9wQXJ5LmluZGV4T2Yob3ApID09IC0xKSB7CiAgICAgIHRocm93ICJcdThCQTFcdTdCOTdcdTY1RTVcdTY3MUZcdTc2ODRcdTUzNTVcdTRGNERcdTUzRUFcdTgwRkRcdTRFQ0UiLmNvbmNhdChvcEFyeSwgIlx1NEUyRFx1OTAwOVx1NjJFOSIpOwogICAgfQogICAgdmFyIGRhdGUxID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzdGFydERhdGUucmVwbGFjZSgvLS9nLCAiLyIpKSkuZ2V0VGltZSgpOwogICAgdmFyIGRhdGUyID0gbmV3IERhdGUoRGF0ZS5wYXJzZShlbmREYXRlLnJlcGxhY2UoLy0vZywgIi8iKSkpLmdldFRpbWUoKTsKICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRlMSkgfHwgIU51bWJlci5pc0ludGVnZXIoZGF0ZTIpKSB7CiAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgbm93U3RyID0gbm93LmdldEZ1bGxZZWFyKCkgKyAnLycgKyAobm93LmdldE1vbnRoKCkgKyAxKSArICcvJyArIG5vdy5nZXREYXRlKCk7CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRlMSkpIHsKICAgICAgICBkYXRlMSA9IG5ldyBEYXRlKCIiLmNvbmNhdChub3dTdHIsICIgIikuY29uY2F0KHN0YXJ0RGF0ZSkpLmdldFRpbWUoKTsKICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0ZTEpKSB7CiAgICAgICAgZGF0ZTIgPSBuZXcgRGF0ZSgiIi5jb25jYXQobm93U3RyLCAiICIpLmNvbmNhdChlbmREYXRlKSkuZ2V0VGltZSgpOwogICAgICB9CiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihkYXRlMSkgfHwgIU51bWJlci5pc0ludGVnZXIoZGF0ZTIpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0KICAgIHZhciByZXMgPSAwOwogICAgdmFyIGRheXMgPSBkYXRlMiAtIGRhdGUxOwogICAgc3dpdGNoIChvcCkgewogICAgICBjYXNlICJ5ZWFyIjoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiAzMCAqIDEyKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIm1vbnRoIjoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQgKiAzMCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJkYXkiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJob3VyIjoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIm1pbnV0ZSI6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjApKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAic2Vjb25kIjoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gMTAwMCk7CiAgICB9CiAgICByZXR1cm4gcmVzOwogIH0sCiAgbmVzdDJ0aWxlOiBmdW5jdGlvbiBuZXN0MnRpbGUoYXJyLCBjaGlsZHJlbktleSwgb2J0YWluQ2hpbGRyZW4pIHsKICAgIHZhciBfcmVmOwogICAgaWYgKCFjaGlsZHJlbktleSkgewogICAgICBjaGlsZHJlbktleSA9ICJjaGlsZHJlbiI7CiAgICB9CiAgICByZXR1cm4gKF9yZWYgPSBbXSkuY29uY2F0LmFwcGx5KF9yZWYsIF90b0NvbnN1bWFibGVBcnJheShhcnIubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIHZhciBfcmVmMjsKICAgICAgdmFyIF9pdGVtID0gX29iamVjdFNwcmVhZCh7fSwgaXRlbSk7CiAgICAgIGlmIChvYnRhaW5DaGlsZHJlbiA9PSB1bmRlZmluZWQgfHwgb2J0YWluQ2hpbGRyZW4gPT0gZmFsc2UpIHsKICAgICAgICBkZWxldGUgX2l0ZW1bY2hpbGRyZW5LZXldOwogICAgICB9CiAgICAgIHJldHVybiAoX3JlZjIgPSBbXSkuY29uY2F0LmFwcGx5KF9yZWYyLCBbX2l0ZW1dLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkodXRpbHMubmVzdDJ0aWxlKGl0ZW1bY2hpbGRyZW5LZXldKSkpKTsKICAgIH0pKSk7CiAgfSwKICAvLyDlubPpk7rnu5PmnoTovazltYzlpZfnu5PmnoQKICB0aWxlMm5lc3Q6IGZ1bmN0aW9uIHRpbGUybmVzdChhcnJheSwga2V5LCBwS2V5LCBjaGlsZHJlbktleSkgewogICAgaWYgKCFhcnJheSB8fCBhcnJheS5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgcmV0dXJuIGFycmF5OwogICAgfQogICAgLy8g5aSN5Yi25LiA5Lu977yM6YG/5YWN5L+u5pS55Y6f5aeL5pWw57uECiAgICB2YXIgYXJ5ID0gX3RvQ29uc3VtYWJsZUFycmF5KGFycmF5KTsKICAgIGtleSA9IGtleSB8fCAiaWQiOwogICAgcEtleSA9IHBLZXkgfHwgInBhcmVudElkIjsKICAgIGNoaWxkcmVuS2V5ID0gY2hpbGRyZW5LZXkgfHwgImNoaWxkcmVuIjsKICAgIC8vIOWumuS5ieS4gOS4quW+heenu+mZpOaVsOe7hAogICAgdmFyIGFyeTJyZW1vdmUgPSBbXTsKICAgIGFyeS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgaWYgKGl0ZW1ba2V5XSAhPT0gaXRlbVtwS2V5XSkgewogICAgICAgIC8vIOaJvueItuiKgueCuQogICAgICAgIHZhciBwID0gYXJ5LmZpbHRlcihmdW5jdGlvbiAoYykgewogICAgICAgICAgcmV0dXJuIGNba2V5XSA9PT0gaXRlbVtwS2V5XTsKICAgICAgICB9KTsKICAgICAgICBpZiAocCAmJiBwLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBwWzBdW2NoaWxkcmVuS2V5XSA9IHBbMF1bY2hpbGRyZW5LZXldIHx8IFtdOwogICAgICAgICAgLy8g5bCG5a2Q6IqC54K55pS+5Yiw54i26IqC54K55LitCiAgICAgICAgICBwWzBdW2NoaWxkcmVuS2V5XS5wdXNoKGl0ZW0pOwogICAgICAgICAgYXJ5MnJlbW92ZS5wdXNoKGl0ZW1ba2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICAgIC8vIOmBjeWOhuenu+mZpOW+heWIoOmZpOWvueixoQogICAgYXJ5MnJlbW92ZS5tYXAoZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgYXJ5ID0gYXJ5LmZpbHRlcihmdW5jdGlvbiAoYykgewogICAgICAgIHJldHVybiBjW2tleV0gIT09IGl0ZW07CiAgICAgIH0pOwogICAgfSk7CiAgICByZXR1cm4gYXJ5OwogIH0sCiAgLy8g6I635Y+W5o6n5Lu25omA5Zyo6KGo5Y2V5a+55bqU55qE5a6e5L6L5a+56LGhCiAgZ2V0T25saW5lRm9ybUluc3RhbmNlOiBmdW5jdGlvbiBnZXRPbmxpbmVGb3JtSW5zdGFuY2UoaW5zdGFuY2UpIHsKICAgIGlmIChpbnN0YW5jZSA9PSBpbnN0YW5jZS4kcm9vdCkgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9CiAgICBpZiAoIWluc3RhbmNlKSB7CiAgICAgIHRocm93ICJWdWVDb21wb25lbnTlrp7kvovkuLrnqbouIjsKICAgIH0KICAgIGlmIChpbnN0YW5jZS5oYXNPd25Qcm9wZXJ0eSgid2F0Y2hNYXAiKSkgewogICAgICByZXR1cm4gaW5zdGFuY2U7CiAgICB9IGVsc2UgaWYgKGluc3RhbmNlLiRwYXJlbnQpIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0YW5jZS4kcGFyZW50KTsKICAgIH0KICB9LAogIC8vIOiOt+WPluWtkOihqOavj+S4gOihjOaJgOWcqOeahOS9nOeUqOWfn+WFg+e0oOWPiue0ouW8lQogIGdldFN1YlNjb3BlRWxBbmRJbmRleDogZnVuY3Rpb24gZ2V0U3ViU2NvcGVFbEFuZEluZGV4KGVsKSB7CiAgICB2YXIgc3ViU2NvcGVFbCA9IHV0aWxzLmdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbCwgImRhdGEtc3VibmFtZSIpOwogICAgaWYgKCFzdWJTY29wZUVsKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgc3ViU2NvcGVFbDogbnVsbCwKICAgICAgICBpbmRleDogbnVsbAogICAgICB9OwogICAgfQogICAgdmFyIGluZGV4ID0gc3ViU2NvcGVFbC5kYXRhc2V0WyJpbmRleCJdOwogICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHsKICAgICAgdGhyb3cgIuimgeiuoeeul+eahOWtkOihqOihjOacquiOt+WPluWIsGluZGV45bGe5oCnLiI7CiAgICB9CiAgICBpbmRleCA9IE51bWJlci5wYXJzZUludChpbmRleCk7CiAgICByZXR1cm4gewogICAgICBzdWJTY29wZUVsOiBzdWJTY29wZUVsLAogICAgICBpbmRleDogaW5kZXgKICAgIH07CiAgfSwKICAvLyDlnKjlrZDooajmjIflrprooYzkuK3pgJrov4d2LW1vZGVs6KGo6L6+5byP6I635Y+WaW5wdXTlr7nlupTnmoR2dWXlrp7kvosKICBnZXRTdWJJbnB1dFNjb3BlQnlNb2RlbEV4cHJlc3Npb246IGZ1bmN0aW9uIGdldFN1YklucHV0U2NvcGVCeU1vZGVsRXhwcmVzc2lvbihzdWJTY29wZUVsLCBleHByZXNzaW9uKSB7CiAgICB2YXIgaW5wdXRBcnkgPSBzdWJTY29wZUVsLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImlucHV0cyIpOwogICAgdmFyIHJlc3VsdCA9IG51bGw7CiAgICBmb3IgKHZhciBpID0gMCwgYzsgYyA9IGlucHV0QXJ5W2krK107KSB7CiAgICAgIHZhciBleHByZXNzaW9uTmFtZSA9IGMuX192dWVfXy4kdm5vZGUuZGF0YS5tb2RlbC5leHByZXNzaW9uOwogICAgICAvLyDlhbzlrrlmcm9udOerr+S9v+eUqAogICAgICBpZiAoYy5fX3Z1ZV9fLiR2bm9kZSAmJiBjLl9fdnVlX18uJHZub2RlLmNvbXBvbmVudE9wdGlvbnMgJiYgYy5fX3Z1ZV9fLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YSAmJiBjLl9fdnVlX18uJHZub2RlLmNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhLm1vZGVsRXhwcmVzc2lvbikgewogICAgICAgIGV4cHJlc3Npb25OYW1lID0gYy5fX3Z1ZV9fLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YS5tb2RlbEV4cHJlc3Npb247CiAgICAgIH0KICAgICAgaWYgKGMgJiYgYy5fX3Z1ZV9fICYmIGMuX192dWVfXy4kdm5vZGUuZGF0YS5tb2RlbCAmJiBleHByZXNzaW9uTmFtZSA9PT0gZXhwcmVzc2lvbikgewogICAgICAgIHJlc3VsdCA9IGMuX192dWVfXzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9LAogIC8vIOiOt+WPluWcqOe6v+ihqOWNleeahGpzb27moLzlvI/lrZfnrKbkuLLnmoTooajljZXmlbDmja4odmFsaWRhdGXlj4LmlbDlhrPlrprmmK/lkKbpnIDopoHlr7nooajljZXov5vooYzpqozor4EpCiAgdmFsaWRhdGVGb3JtOiBmdW5jdGlvbiB2YWxpZGF0ZUZvcm0oaW5zdGFuY2UsIHNjb3BlTmFtZSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgaW5zdGFuY2UuJHJvb3QuJHZhbGlkYXRvci52YWxpZGF0ZUFsbChzY29wZU5hbWUpLnRoZW4oZnVuY3Rpb24gKHJlc3VsdCkgewogICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgIHJlc29sdmUocmVzdWx0KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVqZWN0KGluc3RhbmNlLiRyb290LiR2YWxpZGF0b3IuZXJyb3JzLml0ZW1zKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfSwKICAvLyDojrflj5bmjIflrppkb23lhYPntKDnmoTniLbnuqfkuK3lhbfmnInmjIflrprlsZ7mgKfnmoRkb23lhYPntKAKICBnZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGU6IGZ1bmN0aW9uIGdldFBhcmVudEVsZW1lbnRCeUF0dHJpYnV0ZShlbCwgYXR0cmlidXRlKSB7CiAgICBpZiAoZWwgPT09IG51bGwgfHwgZWwgPT09IHVuZGVmaW5lZCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICghZWwuaGFzQXR0cmlidXRlIHx8IHR5cGVvZiBlbC5oYXNBdHRyaWJ1dGUgIT0gJ2Z1bmN0aW9uJykgewogICAgICB0aHJvdyAi5Lyg5YWl55qE5YWD57SgZWzkuI3og73kuLrnqbrkuJTlv4XpobvkuLpIVE1MSHRtbEVsZW1lbnTnsbvlnosuIjsKICAgIH0KICAgIGlmICghYXR0cmlidXRlIHx8IGF0dHJpYnV0ZS5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7CiAgICAgIHRocm93ICLkvKDlhaXnmoTlsZ7mgKdhdHRyaWJ1dGXkuI3og73kuLrnqbrkuJTlv4XpobvkuLpTdHJpbmfnsbvlnosuIjsKICAgIH0KICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgaWYgKGVsLnRhZ05hbWUgPT09ICdIVE1MJykgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwucGFyZW50RWxlbWVudCwgYXR0cmlidXRlKTsKICAgIH0KICB9LAogIC8vIOS7jueItue6p2RvbeWFg+e0oOS4reiOt+WPluaMh+WumuWxnuaAp+eahOWAvAogIGdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudDogZnVuY3Rpb24gZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KGVsLCBhdHRyaWJ1dGUpIHsKICAgIHZhciBwRWwgPSB1dGlscy5nZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwsIGF0dHJpYnV0ZSk7CiAgICBpZiAocEVsICYmIHBFbC5nZXRBdHRyaWJ1dGUgJiYgcEVsLmdldEF0dHJpYnV0ZS5jb25zdHJ1Y3RvciA9PT0gRnVuY3Rpb24pIHsKICAgICAgcmV0dXJuIHBFbC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgLy8g5bCG5a2Q6KGo5bGe5oCn6Lev5b6E6L2s5o2i5Li65a6M5pW055qE5bGe5oCn6Lev5b6E77yM5L6L5aaC77yaaXRlbS5uYW1lID0+IGRhdGEuc3ViWzBdLm5hbWUKICBnZXRXaG9sZVBhdGhPZlN1YjogZnVuY3Rpb24gZ2V0V2hvbGVQYXRoT2ZTdWIoc3ViUGF0aCwgbWFpblBhdGgsIGluZGV4KSB7CiAgICBpZiAoIXN1YlBhdGggfHwgIW1haW5QYXRoIHx8IGluZGV4ID09PSBudWxsIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGluZGV4KSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBtYXRjaCA9IHN1YlBhdGguc3BsaXQoJy4nKTsKICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7CiAgICAgIHJldHVybiAiIi5jb25jYXQobWFpblBhdGgsICJbIikuY29uY2F0KGluZGV4LCAiXS4iKS5jb25jYXQobWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV0pOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSwKICAvLyDpgJrov4fot6/lvoTlj5blvpflr7nosaHkuK3nmoTlsZ7mgKcKICBnZXRWYWx1ZUJ5UGF0aDogZnVuY3Rpb24gZ2V0VmFsdWVCeVBhdGgob2JqLCBwYXRoLCBzdWJJbmRleCkgewogICAgaWYgKCFvYmogfHwgIXBhdGggfHwgcGF0aC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIS9eXHc/LipbXHd8XF1dJC8udGVzdChwYXRoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBwYXRoQXJ5ID0gcGF0aC5zcGxpdCgiLiIpOwogICAgaWYgKHBhdGhBcnkubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIG9ialtwYXRoXTsKICAgIH0gZWxzZSBpZiAocGF0aEFyeS5sZW5ndGggPiAxKSB7CiAgICAgIHZhciByZXQgPSBvYmo7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyeS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChyZXQgPT09IG51bGwgfHwgcmV0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIga2V5ID0gcGF0aEFyeVtpXTsKICAgICAgICB2YXIgbWF0Y2ggPSAvXihcdyspXFsoXGQrKVxdJC8uZXhlYyhrZXkpOwogICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgcmV0ID0gcmV0W21hdGNoWzFdXVttYXRjaFsyXV07CiAgICAgICAgfSBlbHNlIGlmIChyZXQgJiYgcmV0LmNvbnN0cnVjdG9yID09PSBBcnJheSkgewogICAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICAgIGlmIChzdWJJbmRleCAhPSBudWxsICYmIHN1YkluZGV4ICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICB2YXIgcHJlSW5kZXggPSBOdW1iZXIucGFyc2VJbnQoc3ViSW5kZXgpOwogICAgICAgICAgICBpZiAoIWlzTmFOKHByZUluZGV4KSkgewogICAgICAgICAgICAgIGluZGV4ID0gcHJlSW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldCA9IHJldFtpbmRleF1ba2V5XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0ID0gcmV0W2tleV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9LAogIC8vIOmAmui/h+i3r+W+hOiuvue9ruWvueixoeS4reeahOWxnuaApwogIHNldFZhbHVlQnlQYXRoOiBmdW5jdGlvbiBzZXRWYWx1ZUJ5UGF0aChvYmosIHBhdGgsIHZhbHVlLCBzdWJJbmRleCkgewogICAgaWYgKCFvYmogfHwgIXBhdGggfHwgcGF0aC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKCEvXlx3Py4qW1x3fFxdXSQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIHBhdGhBcnkgPSBwYXRoLnNwbGl0KCIuIik7CiAgICBpZiAocGF0aEFyeS5sZW5ndGggPT0gMSkgewogICAgICBvYmpbcGF0aF0gPSB2YWx1ZTsKICAgIH0gZWxzZSBpZiAocGF0aEFyeS5sZW5ndGggPiAxKSB7CiAgICAgIHZhciByZXQgPSBvYmo7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyeS5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBrZXkgPSBwYXRoQXJ5W2ldOwogICAgICAgIHZhciBtYXRjaCA9IC9eKFx3KylcWyhcZCspXF0kLy5leGVjKGtleSk7CiAgICAgICAgaWYgKGkgPT0gcGF0aEFyeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0W21hdGNoWzFdXVttYXRjaFsyXV0gPSB2YWx1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICYmIHJldC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICAgICAgaWYgKHN1YkluZGV4ICE9IG51bGwgJiYgc3ViSW5kZXggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgdmFyIHByZUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHN1YkluZGV4KTsKICAgICAgICAgICAgICBpZiAoIWlzTmFOKHByZUluZGV4KSkgewogICAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0W2luZGV4XVtrZXldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXRba2V5XSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0ID0gcmV0W21hdGNoWzFdXVttYXRjaFsyXV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXQgPSByZXRba2V5XTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9LAogIC8qKg0KICAqIOWwhuWtl+espuS4sui9rOS4umpzb27lr7nosaHjgIINCiAgKiBAcGFyYW0ganNvblN0cg0KICAqIEBwYXJhbSB0eXBlICDlj6/kuI3loavlhplwYXJzZVRvSnNvbg0KICAqIEByZXR1cm5zDQogICovCiAgcGFyc2VUb0pzb246IGZ1bmN0aW9uIHBhcnNlVG9Kc29uKGpzb25TdHIsIHR5cGUpIHsKICAgIHR5cGUgPSB0eXBlIHx8IDE7CiAgICBpZiAoIWpzb25TdHIgfHwganNvblN0ciA9PT0gIiIgfHwgdHlwZSA+IDMpIHJldHVybiBudWxsOwogICAgdHJ5IHsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblN0cik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICByZXR1cm4gZXZhbCgiKCIuY29uY2F0KGpzb25TdHIsICIpIikpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHRocm93ICLop6PmnpBqc29u5a+56LGh6ZSZ6K+vIjsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiB1dGlscy5wYXJzZVRvSnNvbihqc29uU3RyLCB0eXBlICsgMSk7CiAgICB9CiAgfSwKICAvKioNCiAgKiDlsIbmlbDlrZfovazmjaLmiJDkurrlkI3luIHlpKflhpnjgIINCiAgKiANCiAgKiBAcGFyYW0gY3VycmVuY3lEaWdpdHMNCiAgKiBAcmV0dXJucw0KICAqLwogIGNvbnZlcnRDdXJyZW5jeTogZnVuY3Rpb24gY29udmVydEN1cnJlbmN5KGN1cnJlbmN5RGlnaXRzKSB7CiAgICB2YXIgTUFYSU1VTV9OVU1CRVIgPSA5OTk5OTk5OTk5OS45OTsKICAgIHZhciBDTl9aRVJPID0gIumbtiI7CiAgICB2YXIgQ05fT05FID0gIuWjuSI7CiAgICB2YXIgQ05fVFdPID0gIui0sCI7CiAgICB2YXIgQ05fVEhSRUUgPSAi5Y+BIjsKICAgIHZhciBDTl9GT1VSID0gIuiChiI7CiAgICB2YXIgQ05fRklWRSA9ICLkvI0iOwogICAgdmFyIENOX1NJWCA9ICLpmYYiOwogICAgdmFyIENOX1NFVkVOID0gIuafkiI7CiAgICB2YXIgQ05fRUlHSFQgPSAi5o2MIjsKICAgIHZhciBDTl9OSU5FID0gIueOliI7CiAgICB2YXIgQ05fVEVOID0gIuaLviI7CiAgICB2YXIgQ05fSFVORFJFRCA9ICLkvbAiOwogICAgdmFyIENOX1RIT1VTQU5EID0gIuS7nyI7CiAgICB2YXIgQ05fVEVOX1RIT1VTQU5EID0gIuS4hyI7CiAgICB2YXIgQ05fSFVORFJFRF9NSUxMSU9OID0gIuS6vyI7CiAgICB2YXIgQ05fU1lNQk9MID0gIiI7CiAgICB2YXIgQ05fRE9MTEFSID0gIuWFgyI7CiAgICB2YXIgQ05fVEVOX0NFTlQgPSAi6KeSIjsKICAgIHZhciBDTl9DRU5UID0gIuWIhiI7CiAgICB2YXIgQ05fSU5URUdFUiA9ICLmlbQiOwogICAgdmFyIGludGVncmFsOwogICAgdmFyIGRlY2ltYWw7CiAgICB2YXIgb3V0cHV0Q2hhcmFjdGVyczsKICAgIHZhciBwYXJ0czsKICAgIHZhciBkaWdpdHMsIHJhZGljZXMsIGJpZ1JhZGljZXMsIGRlY2ltYWxzOwogICAgdmFyIHplcm9Db3VudDsKICAgIHZhciBpLCBwLCBkOwogICAgdmFyIHF1b3RpZW50LCBtb2R1bHVzOwogICAgY3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0cy50b1N0cmluZygpOwogICAgaWYgKGN1cnJlbmN5RGlnaXRzID09ICIiKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmIChjdXJyZW5jeURpZ2l0cy5tYXRjaCgvW14sLlxkXS8pICE9IG51bGwpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgaWYgKGN1cnJlbmN5RGlnaXRzLm1hdGNoKC9eKChcZHsxLDN9KCxcZHszfSkqKC4oKFxkezN9LCkqXGR7MSwzfSkpPyl8KFxkKyguXGQrKT8pKSQvKSA9PSBudWxsKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHMucmVwbGFjZSgvLC9nLCAiIik7CiAgICBjdXJyZW5jeURpZ2l0cyA9IGN1cnJlbmN5RGlnaXRzLnJlcGxhY2UoL14wKy8sICIiKTsKICAgIGlmIChOdW1iZXIoY3VycmVuY3lEaWdpdHMpID4gTUFYSU1VTV9OVU1CRVIpIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogICAgcGFydHMgPSBjdXJyZW5jeURpZ2l0cy5zcGxpdCgiLiIpOwogICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgaW50ZWdyYWwgPSBwYXJ0c1swXTsKICAgICAgZGVjaW1hbCA9IHBhcnRzWzFdOwogICAgICBkZWNpbWFsID0gZGVjaW1hbC5zdWJzdHIoMCwgMik7CiAgICB9IGVsc2UgewogICAgICBpbnRlZ3JhbCA9IHBhcnRzWzBdOwogICAgICBkZWNpbWFsID0gIiI7CiAgICB9CiAgICBkaWdpdHMgPSBuZXcgQXJyYXkoQ05fWkVSTywgQ05fT05FLCBDTl9UV08sIENOX1RIUkVFLCBDTl9GT1VSLCBDTl9GSVZFLCBDTl9TSVgsIENOX1NFVkVOLCBDTl9FSUdIVCwgQ05fTklORSk7CiAgICByYWRpY2VzID0gbmV3IEFycmF5KCIiLCBDTl9URU4sIENOX0hVTkRSRUQsIENOX1RIT1VTQU5EKTsKICAgIGJpZ1JhZGljZXMgPSBuZXcgQXJyYXkoIiIsIENOX1RFTl9USE9VU0FORCwgQ05fSFVORFJFRF9NSUxMSU9OKTsKICAgIGRlY2ltYWxzID0gbmV3IEFycmF5KENOX1RFTl9DRU5ULCBDTl9DRU5UKTsKICAgIG91dHB1dENoYXJhY3RlcnMgPSAiIjsKICAgIGlmIChOdW1iZXIoaW50ZWdyYWwpID4gMCkgewogICAgICB6ZXJvQ291bnQgPSAwOwogICAgICBmb3IgKGkgPSAwOyBpIDwgaW50ZWdyYWwubGVuZ3RoOyBpKyspIHsKICAgICAgICBwID0gaW50ZWdyYWwubGVuZ3RoIC0gaSAtIDE7CiAgICAgICAgZCA9IGludGVncmFsLnN1YnN0cihpLCAxKTsKICAgICAgICBxdW90aWVudCA9IHAgLyA0OwogICAgICAgIG1vZHVsdXMgPSBwICUgNDsKICAgICAgICBpZiAoZCA9PSAiMCIpIHsKICAgICAgICAgIHplcm9Db3VudCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoemVyb0NvdW50ID4gMCkgewogICAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGRpZ2l0c1swXTsKICAgICAgICAgIH0KICAgICAgICAgIHplcm9Db3VudCA9IDA7CiAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGRpZ2l0c1tOdW1iZXIoZCldICsgcmFkaWNlc1ttb2R1bHVzXTsKICAgICAgICB9CiAgICAgICAgaWYgKG1vZHVsdXMgPT0gMCAmJiB6ZXJvQ291bnQgPCA0KSB7CiAgICAgICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IGJpZ1JhZGljZXNbcXVvdGllbnRdOwogICAgICAgIH0KICAgICAgfQogICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IENOX0RPTExBUjsKICAgIH0KICAgIGlmIChkZWNpbWFsICE9ICIiKSB7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWNpbWFsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZCA9IGRlY2ltYWwuc3Vic3RyKGksIDEpOwogICAgICAgIGlmIChkICE9ICIwIikgewogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbTnVtYmVyKGQpXSArIGRlY2ltYWxzW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKG91dHB1dENoYXJhY3RlcnMgPT0gIiIpIHsKICAgICAgb3V0cHV0Q2hhcmFjdGVycyA9IENOX1pFUk8gKyBDTl9ET0xMQVI7CiAgICB9CiAgICBpZiAoZGVjaW1hbCA9PSAiIikgewogICAgICBvdXRwdXRDaGFyYWN0ZXJzICs9IENOX0lOVEVHRVI7CiAgICB9CiAgICBvdXRwdXRDaGFyYWN0ZXJzID0gQ05fU1lNQk9MICsgb3V0cHV0Q2hhcmFjdGVyczsKICAgIHJldHVybiBvdXRwdXRDaGFyYWN0ZXJzOwogIH0sCiAgLyoqDQogICAqIOmAmui/h25hbWXojrflj5bpobXpnaJ1cmzlnLDlnYDlj4LmlbANCiAgICogQHBhcmFtIG5hbWUNCiAgICogQHJldHVybnMNCiAgICogDQogICAqLwogIGdldFVybEtleTogZnVuY3Rpb24gZ2V0VXJsS2V5KG5hbWUpIHsKICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoKG5ldyBSZWdFeHAoJ1s/fCZdJyArIG5hbWUgKyAnPScgKyAnKFteJjtdKz8pKCZ8I3w7fCQpJykuZXhlYyhsb2NhdGlvbi5ocmVmKSB8fCBbLCAiIl0pWzFdLnJlcGxhY2UoL1wrL2csICclMjAnKSkgfHwgbnVsbDsKICB9LAogIC8vIOi/lOWbnuiwg+aVtOmhuuW6j+WQjueahOaVsOe7hCBwYXJ077ya5pWw57uE5Lit55qE5LiA5Liq5oiW5aSa5Liq5YWD57Sg77yMIGRpcmVjdO+8muiwg+aVtOeahOaWueWQkSAgdXDvvJrlkJHkuIogIGRvd27vvJrlkJHkuIsKICBhcnJheU1vdmU6IGZ1bmN0aW9uIGFycmF5TW92ZShhcnksIHBhcnQsIGRpcmVjdCkgewogICAgZGlyZWN0ID0gZGlyZWN0IHx8ICJkb3duIjsKICAgIGlmICghcGFydCB8fCBwYXJ0LmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgcGFydC5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgcmV0dXJuIGFyeTsKICAgIH0KICAgIGlmIChwYXJ0LmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKICAgICAgcGFydCA9IFtwYXJ0XTsKICAgIH0KICAgIGlmIChkaXJlY3QgPT0gInVwIikgewogICAgICBwYXJ0LmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgICAgICB2YXIgaW5kZXggPSBhcnkuaW5kZXhPZihtLCAxKTsKICAgICAgICBpZiAoaW5kZXggPiAwKSB7CiAgICAgICAgICB2YXIgbmV3QXJ5ID0gX3RvQ29uc3VtYWJsZUFycmF5KGFyeSk7CiAgICAgICAgICBuZXdBcnlbaW5kZXggLSAxXSA9IGFyeVtpbmRleF07CiAgICAgICAgICBuZXdBcnlbaW5kZXhdID0gYXJ5W2luZGV4IC0gMV07CiAgICAgICAgICBhcnkgPSBuZXdBcnk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0gZWxzZSBpZiAoZGlyZWN0ID09ICJkb3duIikgewogICAgICBmb3IgKHZhciBpID0gcGFydC5sZW5ndGggLSAxLCBtOyBtID0gcGFydFtpLS1dOykgewogICAgICAgIHZhciBpbmRleCA9IGFyeS5pbmRleE9mKG0sIDApOwogICAgICAgIGlmIChpbmRleCA+IC0xICYmIGluZGV4IDwgYXJ5Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgIHZhciBuZXdBcnkgPSBfdG9Db25zdW1hYmxlQXJyYXkoYXJ5KTsKICAgICAgICAgIG5ld0FyeVtpbmRleCArIDFdID0gYXJ5W2luZGV4XTsKICAgICAgICAgIG5ld0FyeVtpbmRleF0gPSBhcnlbaW5kZXggKyAxXTsKICAgICAgICAgIGFyeSA9IG5ld0FyeTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhcnk7CiAgfSwKICAvLyDpgJrov4fphY3nva7kuK3mjIflrprnmoRrZXnmiYDlr7nlupTnmoTlsZ7mgKfot6/lvoTlnKjlvZPliY3ooajljZXkuK3ojrflj5blr7nlupTnmoTlgLzvvIzmlK/mjIHpgJrov4dkYXRhLm1haW4ubmFtZSDmiJbogIXmmK8gaXRlbS5uYW1l5p2l5YiG5Yir6I635Y+W5Li76KGo5pWw5o2u5Y+K5a2Q6KGo5pWw5o2u55qE5oOF5Ya1CiAgZ2V0VmFsdWVCeUNvbmZpZ0tleTogZnVuY3Rpb24gZ2V0VmFsdWVCeUNvbmZpZ0tleShpbnN0LCBjb25maWcsIGtleSkgewogICAgaWYgKCFjb25maWcuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICB0aHJvdyAiY29uZmlnXHU1QkY5XHU4QzYxXHU0RTJEXHU2NzJBXHU2MjdFXHU1MjMwXHU1QzVFXHU2MDI3Ii5jb25jYXQoa2V5KTsKICAgIH0KICAgIHZhciBrZXlQYXRoID0gY29uZmlnW2tleV07CiAgICAvLyDojrflj5blvZPliY3nu4Tku7bmiYDlnKjnmoTooajljZUKICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0LiRwYXJlbnQpOwogICAgLy8g6I635Y+W5b2T5YmN57uE5Lu25piv5ZCm5Zyo5a2Q6KGo5Lit55qE5p+Q5LiA6KGMCiAgICB2YXIgX3V0aWxzJGdldFN1YlNjb3BlRWxBID0gdXRpbHMuZ2V0U3ViU2NvcGVFbEFuZEluZGV4KGluc3QuJGVsKSwKICAgICAgc3ViU2NvcGVFbCA9IF91dGlscyRnZXRTdWJTY29wZUVsQS5zdWJTY29wZUVsLAogICAgICBpbmRleCA9IF91dGlscyRnZXRTdWJTY29wZUVsQS5pbmRleDsKICAgIGlmIChzdWJTY29wZUVsKSB7CiAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5a2Z6KGoCiAgICAgIHZhciBwYXRocyA9IHN1YlNjb3BlRWwuZGF0YXNldFsic3VibmFtZSJdOwogICAgICBpZiAocGF0aHMuc3BsaXQoIi4iKS5sZW5ndGggPT0gNCAmJiBwYXRocy5pbmRleE9mKCJbIikgPT0gLTEpIHsKICAgICAgICAvL+WtmeihqOWbnuWhq+i3r+W+hAogICAgICAgIHBhdGhzID0gcGF0aHMuc3BsaXQoIi4iKVswXSArICIuIiArIHBhdGhzLnNwbGl0KCIuIilbMV0gKyAiLiIgKyBwYXRocy5zcGxpdCgiLiIpWzJdICsgIlsiICsgcGFyc2VJbnQodXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KGluc3QuJGVsLCAic3ViLWluZGV4IikpICsgIl0iICsgIi4iICsgcGF0aHMuc3BsaXQoIi4iKVszXTsKICAgICAgfQogICAgICAvLyDlsIZpdGVtLm5hbWXov5nmoLfnmoTot6/lvoTmm7/mjaLkuLpkYXRhLnN1YlswXS5uYW1l6L+Z5qC355qE5YWo6Lev5b6E5qC85byPCiAgICAgIHZhciB3aG9sZUtleVBhdGggPSB1dGlscy5nZXRXaG9sZVBhdGhPZlN1YihrZXlQYXRoLCBwYXRocywgaW5kZXgpOwogICAgICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVCeVBhdGgoZm9ybUluc3QsIHdob2xlS2V5UGF0aCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdXRpbHMuZ2V0VmFsdWVCeVBhdGgoZm9ybUluc3QsIGtleVBhdGgpOwogICAgfQogIH0sCiAgLy8g6YCa6L+H6YWN572u5Lit5oyH5a6a55qEa2V55p2l6K6+572u5YC85Yiw5a+55bqU55qE5bGe5oCn6Lev5b6E5LiK77yM5pSv5oyB6K6+572u5Li76KGo5pWw5o2uZGF0YS5tYWluLm5hbWUg5oiW6K6+572u5a2Q6KGo5pWw5o2uaXRlbS5uYW1lCiAgc2V0VmFsdWVCeUNvbmZpZ0tleTogZnVuY3Rpb24gc2V0VmFsdWVCeUNvbmZpZ0tleShpbnN0LCBjb25maWcsIGtleSwgdmFsdWUpIHsKICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgdmFyIGtleVBhdGggPSBjb25maWdba2V5XTsKICAgIC8vIOiOt+WPluW9k+WJjee7hOS7tuaJgOWcqOeahOihqOWNlQogICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKGluc3QuJHBhcmVudCk7CiAgICAvLyDojrflj5blvZPliY3nu4Tku7bmmK/lkKblnKjlrZDooajkuK3nmoTmn5DkuIDooYwKICAgIHZhciBfdXRpbHMkZ2V0U3ViU2NvcGVFbEEyID0gdXRpbHMuZ2V0U3ViU2NvcGVFbEFuZEluZGV4KGluc3QuJGVsKSwKICAgICAgc3ViU2NvcGVFbCA9IF91dGlscyRnZXRTdWJTY29wZUVsQTIuc3ViU2NvcGVFbCwKICAgICAgaW5kZXggPSBfdXRpbHMkZ2V0U3ViU2NvcGVFbEEyLmluZGV4OwogICAgaWYgKHN1YlNjb3BlRWwpIHsKICAgICAgLy/liKTmlq3mmK/lkKbmnInlrZnooagKICAgICAgdmFyIHBhdGhzID0gc3ViU2NvcGVFbC5kYXRhc2V0WyJzdWJuYW1lIl07CiAgICAgIGlmIChwYXRocy5zcGxpdCgiLiIpLmxlbmd0aCA9PSA0ICYmIHBhdGhzLmluZGV4T2YoIlsiKSA9PSAtMSkgewogICAgICAgIC8v5a2Z6KGo5Zue5aGr6Lev5b6ECiAgICAgICAgcGF0aHMgPSBwYXRocy5zcGxpdCgiLiIpWzBdICsgIi4iICsgcGF0aHMuc3BsaXQoIi4iKVsxXSArICIuIiArIHBhdGhzLnNwbGl0KCIuIilbMl0gKyAiWyIgKyBwYXJzZUludCh1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQoaW5zdC4kZWwsICJzdWItaW5kZXgiKSkgKyAiXSIgKyAiLiIgKyBwYXRocy5zcGxpdCgiLiIpWzNdOwogICAgICB9CiAgICAgIC8vIOWwhml0ZW0ubmFtZei/meagt+eahOi3r+W+hOabv+aNouS4umRhdGEuc3ViWzBdLm5hbWXov5nmoLfnmoTlhajot6/lvoTmoLzlvI8KICAgICAgdmFyIHdob2xlS2V5UGF0aCA9IHV0aWxzLmdldFdob2xlUGF0aE9mU3ViKGtleVBhdGgsIHBhdGhzLCBpbmRleCk7CiAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKGZvcm1JbnN0LCB3aG9sZUtleVBhdGgsIHZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKGZvcm1JbnN0LCBrZXlQYXRoLCB2YWx1ZSk7CiAgICB9CiAgfSwKICAvLyDliKTmlq3kuKTkuKrlr7nosaHmmK/lkKbnm7jnrYnvvIhwcm9wc+S4uuWxnuaAp+aVsOe7hO+8jOacieS8oOWFpeaXtu+8jOWPquavlOWvueS8oOWFpeeahOWxnuaAp+aYr+WQpuebuOetie+8iQogIG9iamVjdEVxdWFsczogZnVuY3Rpb24gb2JqZWN0RXF1YWxzKG9iajEsIG9iajIsIHByb3BzKSB7CiAgICBpZiAoIXByb3BzIHx8IHByb3BzLmNvbnN0cnVjdG9yICE9PSBBcnJheSkgewogICAgICBwcm9wcyA9IFtdOwogICAgfQogICAgaWYgKCFvYmoxIHx8ICFvYmoyKSB7CiAgICAgIHJldHVybiBvYmoxID09PSBvYmoyOwogICAgfQogICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gb2JqMSkgewogICAgICBpZiAocHJvcHMubGVuZ3RoID4gMCAmJiBwcm9wcy5pbmRleE9mKHByb3BOYW1lKSA9PT0gLTEpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAob2JqMS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgIT0gb2JqMi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAoX3R5cGVvZihvYmoxW3Byb3BOYW1lXSkgIT0gX3R5cGVvZihvYmoyW3Byb3BOYW1lXSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGZvciAodmFyIHByb3BOYW1lIGluIG9iajIpIHsKICAgICAgaWYgKHByb3BzLmxlbmd0aCA+IDAgJiYgcHJvcHMuaW5kZXhPZihwcm9wTmFtZSkgPT09IC0xKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9iajEuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpICE9IG9iajIuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgaWYgKF90eXBlb2Yob2JqMVtwcm9wTmFtZV0pICE9IF90eXBlb2Yob2JqMltwcm9wTmFtZV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmICghb2JqMS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAob2JqMVtwcm9wTmFtZV0gaW5zdGFuY2VvZiBBcnJheSAmJiBvYmoyW3Byb3BOYW1lXSBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgaWYgKCF1dGlscy5hcnJheUVxdWFscyhvYmoxW3Byb3BOYW1lXSwgb2JqMltwcm9wTmFtZV0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG9iajFbcHJvcE5hbWVdIGluc3RhbmNlb2YgT2JqZWN0ICYmIG9iajJbcHJvcE5hbWVdIGluc3RhbmNlb2YgT2JqZWN0KSB7CiAgICAgICAgaWYgKCF1dGlscy5vYmplY3RFcXVhbHMob2JqMVtwcm9wTmFtZV0sIG9iajJbcHJvcE5hbWVdKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvYmoxW3Byb3BOYW1lXSAhPSBvYmoyW3Byb3BOYW1lXSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfSwKICAvLyDliKTmlq3kuKTkuKrmlbDnu4TmmK/lkKbnm7jnrYnvvIzmlK/mjIHmlbDnu4TkuK3lhYPntKDkuLrlr7nosaHml7bnmoTmt7Hluqblr7nmr5QKICBhcnJheUVxdWFsczogZnVuY3Rpb24gYXJyYXlFcXVhbHMoYXJ5MSwgYXJ5MikgewogICAgaWYgKCFhcnkxIHx8ICFhcnkyKSB7CiAgICAgIHJldHVybiBhcnkxID09PSBhcnkyOwogICAgfQogICAgaWYgKGFyeTEubGVuZ3RoICE9IGFyeTIubGVuZ3RoKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJ5MS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgaWYgKGFyeTFbaV0gaW5zdGFuY2VvZiBBcnJheSAmJiBhcnkyW2ldIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICBpZiAoIXV0aWxzLmFycmF5RXF1YWxzKGFyeTFbaV0sIGFyeTJbaV0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGFyeTFbaV0gaW5zdGFuY2VvZiBPYmplY3QgJiYgYXJ5MltpXSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIGlmICghdXRpbHMub2JqZWN0RXF1YWxzKGFyeTFbaV0sIGFyeTJbaV0pKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGFyeTFbaV0gIT0gYXJ5MltpXSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfSwKICAvLyDku6XnrKzkuIDooYzmlofmnKznmoTnvKnov5vnqbrmoLzmlbDkuLrln7rlh4bvvIzlkI7nu63nmoTmr4/kuIDooYzpg73ljrvmjonov5nkuKrln7rlh4bmiYDlr7nlupTnmoTnqbrmoLzjgIIKICB0cmltRWFjaExpbmU6IGZ1bmN0aW9uIHRyaW1FYWNoTGluZSh0ZXh0KSB7CiAgICBpZiAoIXRleHQgfHwgdGV4dC5jb25zdHJ1Y3RvciAhPSBTdHJpbmcgfHwgdGV4dC5pbmRleE9mKCJcbiIpID09IC0xKSB7CiAgICAgIHJldHVybiB0ZXh0OwogICAgfQogICAgdmFyIGFyeSA9IHRleHQuc3BsaXQoIlxuIiksCiAgICAgIHRvdGVtID0gMDsKICAgIHJldHVybiBhcnkucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXIsIGluZGV4KSB7CiAgICAgIGlmIChpbmRleCA9PSAxKSB7CiAgICAgICAgdmFyIG1hdGNoID0gL14oXHMrKS4qJC8uZXhlYyhjdXIpOwogICAgICAgIG1hdGNoICYmIG1hdGNoLmxlbmd0aCA9PSAyICYmICh0b3RlbSA9IG1hdGNoWzFdLmxlbmd0aCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByZXYgKyAiXG4iICsgY3VyLnNsaWNlKHRvdGVtLCBjdXIubGVuZ3RoKTsKICAgIH0pOwogIH0sCiAgLy8g6I635Y+W5a2X56ym5Liy55qE5ZOI5biM57yW56CBCiAgaGFzaENvZGU6IGZ1bmN0aW9uIGhhc2hDb2RlKHRleHQpIHsKICAgIHZhciBoYXNoID0gMCwKICAgICAgY2hhcjsKICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAwKSByZXR1cm4gaGFzaDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICBjaGFyID0gdGV4dC5jaGFyQ29kZUF0KGkpOwogICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgY2hhcjsKICAgICAgaGFzaCA9IGhhc2ggJiBoYXNoOwogICAgfQogICAgcmV0dXJuIGhhc2g7CiAgfQp9OwoKLy8g5Zyo5pWw57uE5LiK5omp5bGV5LiA5Liq5Yig6Zmk5oyH5a6a6aG555qE5pa55rOVCkFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoaXRlbSkgewogIHZhciBpbmRleCA9IHRoaXMuZmluZEluZGV4KGZ1bmN0aW9uICh2KSB7CiAgICByZXR1cm4gdiA9PT0gaXRlbTsKICB9KTsKICBpZiAoaW5kZXggPiAtMSkgewogICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpOwogIH0KfTsKCi8vIOa4heepuuaVsOe7hApBcnJheS5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7CiAgdGhpcy5zcGxpY2UoMCwgdGhpcy5sZW5ndGgpOwp9OwoKLy8g5Zyo5pWw57uE5LiK5omp5bGV5LiA5Liq5Y676YeN55qE5pa55rOVCkFycmF5LnByb3RvdHlwZS51bmlxdWUgPSBmdW5jdGlvbiAoYXJnKSB7CiAgdmFyIHJlcyA9IG5ldyBNYXAoKTsKICByZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24gKG0pIHsKICAgIGlmIChhcmcpIHsKICAgICAgcmV0dXJuICFyZXMuaGFzKG1bYXJnXSkgJiYgcmVzLnNldChtW2FyZ10sIDEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICFyZXMuaGFzKG0pICYmIHJlcy5zZXQobSwgMSk7CiAgICB9CiAgfSk7Cn07CgovLyDljrvpmaTmlbDnu4TkuK3nmoTnqbrlrZfnrKbkuLLpgInpobkKQXJyYXkucHJvdG90eXBlLnRyaW0gPSBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7CiAgICByZXR1cm4gbSAhPT0gJyc7CiAgfSk7Cn07CgovLyDmjInnhafmlbDnu4TkuK3nmoTmjIflrpprZXnlsIbmlbDnu4Tov5vooYzliIbnu4QKQXJyYXkucHJvdG90eXBlLmdyb3VwQnlLZXkgPSBmdW5jdGlvbiAoa2V5KSB7CiAgdmFyIHJlcyA9IHt9OwogIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgdmFyIGdyb3VwID0gcmVzW21ba2V5XV07CiAgICBpZiAoIWdyb3VwKSB7CiAgICAgIGdyb3VwID0gW107CiAgICAgIHJlc1ttW2tleV1dID0gZ3JvdXA7CiAgICB9CiAgICBncm91cC5wdXNoKG0pOwogIH0pOwogIHJldHVybiByZXM7Cn07CgovLyDmjInnhafmlbDnu4TkuK3nmoTmjIflrpprZXnlsIbmlbDnu4Tov5vooYzliIbnu4QKQXJyYXkucHJvdG90eXBlLmdyb3VwQnlLZXkgPSBmdW5jdGlvbiAoa2V5KSB7CiAgdmFyIHJlcyA9IHt9OwogIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgdmFyIGdyb3VwID0gcmVzW21ba2V5XV07CiAgICBpZiAoIWdyb3VwKSB7CiAgICAgIGdyb3VwID0gW107CiAgICAgIHJlc1ttW2tleV1dID0gZ3JvdXA7CiAgICB9CiAgICBncm91cC5wdXNoKG0pOwogIH0pOwogIHJldHVybiByZXM7Cn07CgovLyDlsIbmlbDnu4Tlr7nosaHkuK3nmoTmn5DkuIDkuKrlsZ7mgKflgLzljZXni6zmir3lj5blh7rmnaXmiJDkuLrkuIDkuKrmlrDnmoTmlbDnu4QgIFt7aWQ6JzEnLG5hbWU6J+iLueaenCd9LHtpZDonMicsbmFtZTon6aaZ6JWJJ31dLmV4dHJhY3RCeUtleSgiaWQiKSA9PT4gWycxJywnMiddCkFycmF5LnByb3RvdHlwZS5leHRyYWN0QnlLZXkgPSBmdW5jdGlvbiAoa2V5KSB7CiAgdmFyIHNldCA9IG5ldyBTZXQoKTsKICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgIGlmIChrZXkgJiYgbVtrZXldKSB7CiAgICAgIHNldC5hZGQobVtrZXldKTsKICAgIH0KICB9KTsKICByZXR1cm4gQXJyYXkuZnJvbShzZXQpOwp9OwoKLyoqDQogKiDml6XmnJ/moLzlvI/ljJbjgIINCiAqIOaXpeacn+agvOW8j++8mg0KICogeXl5ee+8jHl5IOW5tOS7vQ0KICogTU0g5aSn5YaZ6KGo56S65pyI5Lu9DQogKiBkZCDooajnpLrml6XmnJ8NCiAqIGhoIOihqOekuuWwj+aXtg0KICogbW0g6KGo56S65YiG6ZKfDQogKiBzcyDooajnpLrnp5INCiAqIHEgIOihqOekuuWto+W6pg0KICog5a6e5L6L5aaC5LiL77yaDQogKiB2YXIgbm93ID0gbmV3IERhdGUoKTsgDQogKiB2YXIgbm93U3RyID0gbm93LmZvcm1hdCgieXl5eS1NTS1kZCBoaDptbTpzcyIpOyANCiAqLwpEYXRlLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiAoZm9ybWF0KSB7CiAgdmFyIG8gPSB7CiAgICAiTSsiOiB0aGlzLmdldE1vbnRoKCkgKyAxLAogICAgLy9tb250aCAKICAgICJkKyI6IHRoaXMuZ2V0RGF0ZSgpLAogICAgLy9kYXkgCiAgICAiaCsiOiB0aGlzLmdldEhvdXJzKCksCiAgICAvL2hvdXIgCiAgICAiSCsiOiB0aGlzLmdldEhvdXJzKCksCiAgICAvL2hvdXIKICAgICJtKyI6IHRoaXMuZ2V0TWludXRlcygpLAogICAgLy9taW51dGUgCiAgICAicysiOiB0aGlzLmdldFNlY29uZHMoKSwKICAgIC8vc2Vjb25kIAogICAgInErIjogTWF0aC5mbG9vcigodGhpcy5nZXRNb250aCgpICsgMykgLyAzKSwKICAgIC8vcXVhcnRlciAKICAgICJTIjogdGhpcy5nZXRNaWxsaXNlY29uZHMoKSAvL21pbGxpc2Vjb25kIAogIH07CiAgaWYgKC8oeSspLy50ZXN0KGZvcm1hdCkpIHsKICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFJlZ0V4cC4kMSwgKHRoaXMuZ2V0RnVsbFllYXIoKSArICIiKS5zdWJzdHIoNCAtIFJlZ0V4cC4kMS5sZW5ndGgpKTsKICB9CiAgZm9yICh2YXIgayBpbiBvKSB7CiAgICBpZiAobmV3IFJlZ0V4cCgiKCIgKyBrICsgIikiKS50ZXN0KGZvcm1hdCkpIHsKICAgICAgZm9ybWF0ID0gZm9ybWF0LnJlcGxhY2UoUmVnRXhwLiQxLCBSZWdFeHAuJDEubGVuZ3RoID09IDEgPyBvW2tdIDogKCIwMCIgKyBvW2tdKS5zdWJzdHIoKCIiICsgb1trXSkubGVuZ3RoKSk7CiAgICB9CiAgfQogIHJldHVybiBmb3JtYXQ7Cn07CmV4cG9ydCBkZWZhdWx0IHV0aWxzOw=="},null]}