{"remainingRequest":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\eslint-loader\\index.js??ref--13-0!D:\\jenkins\\workspace\\xcjy-fvue\\src\\hotent-ui-util.js","dependencies":[{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\src\\hotent-ui-util.js","mtime":1741314105159},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\babel.config.js","mtime":1741314102158},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\xcjy-fvue\\node_modules\\eslint-loader\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS94Y2p5LWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3RvQ29uc3VtYWJsZUFycmF5LmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UveGNqeS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RTcHJlYWQyLmpzIjsKaW1wb3J0IF90eXBlb2YgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UveGNqeS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90eXBlb2YuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmNvbmNhdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXguanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5Lm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5yZWR1Y2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNwbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuZXZlcnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLm1hcC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLnJlZHVjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLml0ZXJhdG9yLnNvbWUuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5tYXAuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuaXMtaW50ZWdlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm51bWJlci5wYXJzZS1pbnQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudmFsdWVzLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmRvdC1hbGwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3kuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudGVzdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQuZGlmZmVyZW5jZS52Mi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC5pbnRlcnNlY3Rpb24udjIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQuaXMtZGlzam9pbnQtZnJvbS52Mi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnNldC5pcy1zdWJzZXQtb2YudjIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQuaXMtc3VwZXJzZXQtb2YudjIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQuc3ltbWV0cmljLWRpZmZlcmVuY2UudjIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zZXQudW5pb24udjIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy50cmltLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuaXRlcmF0b3IuanMiOwp2YXIgdXRpbHMgPSB7CiAgLyoqDQogICAqIOWQiOW5tg0KICAgKi8KICBkZWVwTWVyZ2U6IGZ1bmN0aW9uIChfZGVlcE1lcmdlKSB7CiAgICBmdW5jdGlvbiBkZWVwTWVyZ2UoX3gsIF94MikgewogICAgICByZXR1cm4gX2RlZXBNZXJnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgfQogICAgZGVlcE1lcmdlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gX2RlZXBNZXJnZS50b1N0cmluZygpOwogICAgfTsKICAgIHJldHVybiBkZWVwTWVyZ2U7CiAgfShmdW5jdGlvbiAodGFyZ2V0LCBtZXJnZWQpIHsKICAgIGZvciAodmFyIGtleSBpbiBtZXJnZWQpIHsKICAgICAgaWYgKHRhcmdldFtrZXldICYmICgwLCBfdHlwZW9mMlsiZGVmYXVsdCJdKSh0YXJnZXRba2V5XSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgZGVlcE1lcmdlKHRhcmdldFtrZXldLCBtZXJnZWRba2V5XSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKCgwLCBfdHlwZW9mMlsiZGVmYXVsdCJdKShtZXJnZWRba2V5XSkgPT09ICdvYmplY3QnKSB7CiAgICAgICAgdGFyZ2V0W2tleV0gPSAoMCwgZGVlcENsb25lKShtZXJnZWRba2V5XSwgdHJ1ZSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgdGFyZ2V0W2tleV0gPSBtZXJnZWRba2V5XTsKICAgIH0KICAgIHJldHVybiB0YXJnZXQ7CiAgfSksCiAgLyoqDQogICAqIOagueaNruWtl+WFuOe8lueggeiOt+WPluWtl+WFuOaVsOaNrg0KICAgKi8KICBnZXREaWN0SXRlbXNGcm9tQ2FjaGU6IGZ1bmN0aW9uIGdldERpY3RJdGVtc0Zyb21DYWNoZShkaWN0Q29kZSkgewogICAgaWYgKCFkaWN0Q29kZSkgewogICAgICByZXR1cm4gJ+Wtl+WFuENvZGXkuI3og73kuLrnqbohJzsKICAgIH0KICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdkaWN0X2RhdGEnKSkgewogICAgICB2YXIgZGljdF9kYXRhID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdkaWN0X2RhdGEnKSk7CiAgICAgIGlmIChkaWN0X2RhdGFbZGljdENvZGVdKSB7CiAgICAgICAgdmFyIGRpc3RJdGVtID0gZGljdF9kYXRhW2RpY3RDb2RlXTsKICAgICAgICByZXR1cm4gZGlzdEl0ZW07CiAgICAgIH0KICAgIH0KICB9LAogIC8qKg0KICAgKiDmt7Hmi7fotJ0NCiAgICovCiAgZGVlcENsb25lOiBmdW5jdGlvbiBkZWVwQ2xvbmUoZGF0YSkgewogICAgdmFyIHR5cGUgPSB1dGlscy5nZXRUeXBlKGRhdGEpOwogICAgdmFyIG9iajsKICAgIGlmICh0eXBlID09PSAiYXJyYXkiKSB7CiAgICAgIG9iaiA9IFtdOwogICAgfSBlbHNlIGlmICh0eXBlID09PSAib2JqZWN0IikgewogICAgICBvYmogPSB7fTsKICAgIH0gZWxzZSB7CiAgICAgIC8v5LiN5YaN5YW35pyJ5LiL5LiA5bGC5qyhCiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgaWYgKHR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBvYmoucHVzaCh1dGlscy5kZWVwQ2xvbmUoZGF0YVtpXSkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7CiAgICAgICAgb2JqW2tleV0gPSB1dGlscy5kZWVwQ2xvbmUoZGF0YVtrZXldKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG9iajsKICB9LAogIGdldFR5cGU6IGZ1bmN0aW9uIGdldFR5cGUob2JqKSB7CiAgICAvL3Rvc3RyaW5n5Lya6L+U5Zue5a+55bqU5LiN5ZCM55qE5qCH562+55qE5p6E6YCg5Ye95pWwCiAgICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgdmFyIG1hcCA9IHsKICAgICAgIltvYmplY3QgQm9vbGVhbl0iOiAiYm9vbGVhbiIsCiAgICAgICJbb2JqZWN0IE51bWJlcl0iOiAibnVtYmVyIiwKICAgICAgIltvYmplY3QgU3RyaW5nXSI6ICJzdHJpbmciLAogICAgICAiW29iamVjdCBGdW5jdGlvbl0iOiAiZnVuY3Rpb24iLAogICAgICAiW29iamVjdCBBcnJheV0iOiAiYXJyYXkiLAogICAgICAiW29iamVjdCBEYXRlXSI6ICJkYXRlIiwKICAgICAgIltvYmplY3QgUmVnRXhwXSI6ICJyZWdFeHAiLAogICAgICAiW29iamVjdCBVbmRlZmluZWRdIjogInVuZGVmaW5lZCIsCiAgICAgICJbb2JqZWN0IE51bGxdIjogIm51bGwiLAogICAgICAiW29iamVjdCBPYmplY3RdIjogIm9iamVjdCIKICAgIH07CiAgICBpZiAob2JqIGluc3RhbmNlb2YgRWxlbWVudCkgewogICAgICByZXR1cm4gImVsZW1lbnQiOwogICAgfQogICAgcmV0dXJuIG1hcFt0b1N0cmluZy5jYWxsKG9iaildOwogIH0sCiAgaXNFbXB0eTogZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewogICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICIiKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PSBPYmplY3QpIHsKICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT0gMDsKICAgIH0gZWxzZSBpZiAodmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA9PSAwOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0sCiAgLy8g6Kej5p6QVVJM5Zyw5Z2A77yM5aaC5p6cdXJs5Zyw5Z2A5YyF5ZCr5LqGJHtmb3Jtfei/meagt+eahOWNoOS9jeespu+8jOS8muaMieeFp3Nzby5qc+S4remFjee9rueahOWvueW6lOacjeWKoeeahOWcsOWdgOabv+aNouOAggogIHBhcnNlVXJsOiBmdW5jdGlvbiBwYXJzZVVybCh1cmwpIHsKICAgIGlmICh1cmwgPT09ICIiKSByZXR1cm47CiAgICB2YXIgY3R4ID0gd2luZG93LmNvbnRleHQsCiAgICAgIHJlZyA9IC9eKFwkXHsoXHcrKVx9KVwvLiokLzsKICAgIHZhciBtYXRjaCA9IHJlZy5leGVjKHVybCk7CiAgICBpZiAobWF0Y2ggIT0gbnVsbCkgewogICAgICB2YXIgbmFtZSA9IG1hdGNoWzJdLAogICAgICAgIG1jID0gbWF0Y2hbMV0sCiAgICAgICAgdmFsID0gY3R4W25hbWVdOwogICAgICBpZiAoIXZhbCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiVGhlICciICsgbmFtZSArICInIGluIHVybDoiICsgdXJsICsgIiBkb2VzIG5vdCBkZWZpbmVkIGluIGNvbnRleHQgcHJvdmlkZXIuIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKG1jLCB2YWwpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHVybDsKICAgIH0KICB9LAogIC8vIOS9v+eUqGN0eOWvueixoeS4reeahOWAvOabv+aNouaOiWV4cOS4reaJgOacieeahCR7a2V5fQogIHBhcnNlRXhwOiBmdW5jdGlvbiBwYXJzZUV4cChleHAsIGN0eCkgewogICAgaWYgKCFleHAgfHwgZXhwLmNvbnN0cnVjdG9yICE9IFN0cmluZykgcmV0dXJuIGV4cDsKICAgIGN0eCA9IGN0eCB8fCB7fTsKICAgIHZhciByZWcgPSAvKFwkXHsoXHcrKVx9KS8sCiAgICAgIG1hdGNoID0gbnVsbCwKICAgICAgY291bnQgPSAwOwogICAgd2hpbGUgKG1hdGNoID0gcmVnLmV4ZWMoZXhwKSkgewogICAgICBjb3VudCsrOwogICAgICAvLyDpgb/lhY3mrbvlvqrnjq8KICAgICAgaWYgKGNvdW50ID4gOTk5KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKICAgICAgICBleHAgPSBleHAucmVwbGFjZShtYXRjaFsxXSwgY3R4Lmhhc093blByb3BlcnR5KG1hdGNoWzJdKSA/IGN0eFttYXRjaFsyXV0gOiAiIik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBleHA7CiAgfSwKICAvLyDojrflj5bpmo/mnLrnmoTlkI3np7AKICBnZXROYW1lOiBmdW5jdGlvbiBnZXROYW1lKCkgewogICAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCAxMCk7CiAgfSwKICAvLyDojrflj5bmjqfku7bmmK/lkKblj6/nvJbovpEKICBnZXRXcml0ZWFibGU6IGZ1bmN0aW9uIGdldFdyaXRlYWJsZShwZXJtaXNzaW9uKSB7CiAgICBpZiAocGVybWlzc2lvbiA9PT0gJ24nIHx8IHBlcm1pc3Npb24gPT09ICdyJykgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9LAogIC8vIOWQiOW5tumqjOivgeinhOWImSjlpoLmnpxydWxlc+WSjGFwcGVuZFJ1bGVz5Z2H5Li65a2X56ym5Liy5qC85byP77yM5ZCI5bm25ZCO5LuN5Li65a2X56ym5Liy5qC85byP77yb5aaC5p6c5YW25Lit5LiA5Liq5Li6T2JqZWN05qC85byP77yM5ZCI5bm25ZCO5Li6T2JqZWN05qC85byP44CCKQogIG1lcmdlVmFsaWRhdGU6IGZ1bmN0aW9uIG1lcmdlVmFsaWRhdGUocnVsZXMsIGFwcGVuZFJ1bGVzKSB7CiAgICBpZiAoIWFwcGVuZFJ1bGVzIHx8IGFwcGVuZFJ1bGVzLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgYXBwZW5kUnVsZXMuY29uc3RydWN0b3IgIT09IFN0cmluZykgewogICAgICByZXR1cm4gcnVsZXM7CiAgICB9CiAgICB2YXIgcnVsZXNUeXBlSXNTdHJpbmcgPSB0cnVlLAogICAgICBhcHBlbmRUeXBlSXNTdHJpbmcgPSBhcHBlbmRSdWxlcy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nLAogICAgICBmaW5hbFR5cGVJc1N0cmluZyA9IHRydWU7CiAgICBpZiAocnVsZXMgPT09IHVuZGVmaW5lZCB8fCBydWxlcyA9PT0gbnVsbCkgewogICAgICBydWxlc1R5cGVJc1N0cmluZyA9IGFwcGVuZFR5cGVJc1N0cmluZzsKICAgICAgcnVsZXMgPSBhcHBlbmRUeXBlSXNTdHJpbmcgPyAiIiA6IHt9OwogICAgfSBlbHNlIGlmIChydWxlcy5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0IHx8IHJ1bGVzLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKICAgICAgcnVsZXNUeXBlSXNTdHJpbmcgPSBydWxlcy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nOwogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgInJ1bGVzXHU3Njg0XHU3QzdCXHU1NzhCXHU0RTNBIi5jb25jYXQoX3R5cGVvZihydWxlcyksICJcdUZGMENcdTUzRUFcdTgwRkRcdTRFM0FPYmplY3RcdTdDN0JcdTU3OEJcdTYyMTZTdHJpbmdcdTdDN0JcdTU3OEJcdTMwMDIiKTsKICAgIH0KICAgIGZpbmFsVHlwZUlzU3RyaW5nID0gcnVsZXNUeXBlSXNTdHJpbmcgJiYgYXBwZW5kVHlwZUlzU3RyaW5nOwogICAgLy8g5LuN54S25LulU3RyaW5n5qC85byPCiAgICBpZiAoZmluYWxUeXBlSXNTdHJpbmcpIHsKICAgICAgdmFyIHJ1bGVBcnkgPSB1dGlscy5zdHJpbmdTcGxpdChydWxlcywgInwiKTsKICAgICAgdmFyIGFwcGVuZEFyeSA9IHV0aWxzLnN0cmluZ1NwbGl0KGFwcGVuZFJ1bGVzLCAifCIpOwogICAgICB2YXIgcnVsZU9iaiA9IHt9LAogICAgICAgIGFwcGVuZE9iaiA9IHt9OwogICAgICBydWxlQXJ5LmZvckVhY2goZnVuY3Rpb24gKHIpIHsKICAgICAgICB2YXIgayA9IHV0aWxzLnN0cmluZ1NwbGl0KHIsICI6IilbMF07CiAgICAgICAgcnVsZU9ialtrXSA9IHI7CiAgICAgIH0pOwogICAgICBhcHBlbmRBcnkuZm9yRWFjaChmdW5jdGlvbiAoYSkgewogICAgICAgIHZhciBrID0gdXRpbHMuc3RyaW5nU3BsaXQoYSwgIjoiKVswXTsKICAgICAgICBhcHBlbmRPYmpba10gPSBhOwogICAgICB9KTsKICAgICAgLy8g5aaC5p6c5pen6KeE5YiZ5Lit5a2Y5Zyo5LiO6L+95Yqg6KeE5YiZ5Lit55qE5ZCM5ZCN6KeE5YiZ77yM5YiZ5L2/55So6L+95Yqg6KeE5YiZ6KaG55uW5pen6KeE5YiZ44CCCiAgICAgIHZhciBtZXJnZU9iaiA9IE9iamVjdC5hc3NpZ24ocnVsZU9iaiwgYXBwZW5kT2JqKTsKICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMobWVyZ2VPYmopLmpvaW4oInwiKTsKICAgIH0KICAgIC8vIOi9rOaNouS4uk9iamVjdOagvOW8jwogICAgZWxzZSB7CiAgICAgIHZhciBfcnVsZU9iaiA9IHt9LAogICAgICAgIF9hcHBlbmRPYmogPSB7fTsKICAgICAgaWYgKHJ1bGVzVHlwZUlzU3RyaW5nKSB7CiAgICAgICAgX3J1bGVPYmogPSB1dGlscy52YWxpZGF0ZVN0cmluZzJPYmplY3QocnVsZXMpOwogICAgICB9IGVsc2UgewogICAgICAgIF9ydWxlT2JqID0gX29iamVjdFNwcmVhZCh7fSwgcnVsZXMpOwogICAgICB9CiAgICAgIGlmIChhcHBlbmRUeXBlSXNTdHJpbmcpIHsKICAgICAgICBfYXBwZW5kT2JqID0gdXRpbHMudmFsaWRhdGVTdHJpbmcyT2JqZWN0KGFwcGVuZFJ1bGVzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBfYXBwZW5kT2JqID0gX29iamVjdFNwcmVhZCh7fSwgYXBwZW5kUnVsZXMpOwogICAgICB9CiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKF9ydWxlT2JqLCBfYXBwZW5kT2JqKTsKICAgIH0KICB9LAogIC8vIOWHj+WwkeagoemqjOinhOWImQogIHJlZHVjZVZhbGlkYXRlOiBmdW5jdGlvbiByZWR1Y2VWYWxpZGF0ZShydWxlcywgcmVkdWNlUnVsZXMpIHsKICAgIGlmICghcnVsZXMgfHwgIXJlZHVjZVJ1bGVzIHx8IHJlZHVjZVJ1bGVzLmNvbnN0cnVjdG9yICE9PSBPYmplY3QgJiYgcmVkdWNlUnVsZXMuY29uc3RydWN0b3IgIT09IFN0cmluZykgewogICAgICByZXR1cm4gcnVsZXM7CiAgICB9CiAgICAvLyDopoHlh4/lsJHnmoTmoKHpqozop4TliJnnmoTlkI3np7Dpm4blkIgKICAgIHZhciByZWR1Y2VSdWxlTmFtZXMgPSBbXTsKICAgIGlmIChyZWR1Y2VSdWxlcy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7CiAgICAgIHZhciByZWR1Y2VSdWxlT2JqID0gdXRpbHMudmFsaWRhdGVTdHJpbmcyT2JqZWN0KHJlZHVjZVJ1bGVzKTsKICAgICAgcmVkdWNlUnVsZU5hbWVzID0gT2JqZWN0LmtleXMocmVkdWNlUnVsZU9iaik7CiAgICB9IGVsc2UgewogICAgICByZWR1Y2VSdWxlTmFtZXMgPSBPYmplY3Qua2V5cyhyZWR1Y2VSdWxlcyk7CiAgICB9CiAgICBpZiAocnVsZXMuY29uc3RydWN0b3IgPT09IE9iamVjdCkgewogICAgICBPYmplY3Qua2V5cyhydWxlcykuZm9yRWFjaChmdW5jdGlvbiAoaykgewogICAgICAgIGlmIChyZWR1Y2VSdWxlTmFtZXMuc29tZShmdW5jdGlvbiAobikgewogICAgICAgICAgcmV0dXJuIG4gPT0gazsKICAgICAgICB9KSkgewogICAgICAgICAgZGVsZXRlIHJ1bGVzW2tdOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBydWxlczsKICAgIH0gZWxzZSBpZiAocnVsZXMuY29uc3RydWN0b3IgPT09IFN0cmluZykgewogICAgICB2YXIgcnVsZUFyeSA9IHV0aWxzLnN0cmluZ1NwbGl0KHJ1bGVzLCAifCIpOwogICAgICB2YXIgblJ1bGVBcnkgPSBydWxlQXJ5LnJlZHVjZShmdW5jdGlvbiAoYXJ5LCByKSB7CiAgICAgICAgdmFyIG5hbWUgPSB1dGlscy5zdHJpbmdTcGxpdChyLCAiOiIpWzBdOwogICAgICAgIGlmIChyZWR1Y2VSdWxlTmFtZXMuZXZlcnkoZnVuY3Rpb24gKG0pIHsKICAgICAgICAgIHJldHVybiBtICE9IG5hbWU7CiAgICAgICAgfSkpIHsKICAgICAgICAgIGFyeS5wdXNoKHIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJ5OwogICAgICB9LCBbXSk7CiAgICAgIHJldHVybiBuUnVsZUFyeS5qb2luKCJ8Iik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAicnVsZXNcdTc2ODRcdTdDN0JcdTU3OEJcdTRFM0EiLmNvbmNhdChfdHlwZW9mKHJ1bGVzKSwgIlx1RkYwQ1x1NTNFQVx1ODBGRFx1NEUzQU9iamVjdFx1N0M3Qlx1NTc4Qlx1NjIxNlN0cmluZ1x1N0M3Qlx1NTc4Qlx1MzAwMiIpOwogICAgfQogIH0sCiAgLy8g5a2X56ym5Liy5qC85byP55qE5qCh6aqM6KeE5YiZ6L2s5Li65a+56LGh5qC85byPCiAgdmFsaWRhdGVTdHJpbmcyT2JqZWN0OiBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZzJPYmplY3QocnVsZSkgewogICAgaWYgKCFydWxlIHx8IHJ1bGUuY29uc3RydWN0b3IgIT09IFN0cmluZykgewogICAgICByZXR1cm4gcnVsZTsKICAgIH0KICAgIHZhciBvYmogPSB7fTsKICAgIHZhciBhcnkgPSB1dGlscy5zdHJpbmdTcGxpdChydWxlLCAnfCcpOwogICAgYXJ5LmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgICAgdmFyIHJlZ0FuZEFyZ3MgPSB1dGlscy5zdHJpbmdTcGxpdChtLCAnOicpOwogICAgICBpZiAocmVnQW5kQXJncy5sZW5ndGggPT0gMSkgewogICAgICAgIG9ialtyZWdBbmRBcmdzWzBdXSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAocmVnQW5kQXJncy5sZW5ndGggPiAxKSB7CiAgICAgICAgdmFyIGFyZ3MgPSB1dGlscy5zdHJpbmdTcGxpdChyZWdBbmRBcmdzWzFdLCAiLCIpOwogICAgICAgIG9ialtyZWdBbmRBcmdzWzBdXSA9IGFyZ3M7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIG9iajsKICB9LAogIC8vIOWtl+espuS4snN0cuaMieeFp3NlcOWIhuWJsuS4uuaVsOe7hO+8jOW5tua4heeQhuaOieaVsOe7hOe7k+aenOS4reeahOepuueZvemhueOAggogIHN0cmluZ1NwbGl0OiBmdW5jdGlvbiBzdHJpbmdTcGxpdChzdHIsIHNlcCkgewogICAgaWYgKCFzdHIgfHwgc3RyLmNvbnN0cnVjdG9yICE9PSBTdHJpbmcgfHwgIXNlcCB8fCBzZXAuY29uc3RydWN0b3IgIT09IFN0cmluZykgewogICAgICByZXR1cm4gW107CiAgICB9CiAgICB2YXIgYXJ5ID0gc3RyLnNwbGl0KHNlcCk7CiAgICBhcnkgPSBhcnkubWFwKGZ1bmN0aW9uIChwKSB7CiAgICAgIHJldHVybiBwLnRyaW0oKTsKICAgIH0pOwogICAgYXJ5ID0gYXJ5LnRyaW0oKTsKICAgIHJldHVybiBhcnk7CiAgfSwKICAvLyDojrflj5bmjqfku7bmmK/lkKbmt7vliqDlv4XloavmoKHpqowKICBhZGRSZXF1aXJlZE9yTm90OiBmdW5jdGlvbiBhZGRSZXF1aXJlZE9yTm90KHBlcm1pc3Npb24sIHZhbGlkYXRlKSB7CiAgICBpZiAocGVybWlzc2lvbiAhPT0gJ2InKSB7CiAgICAgIHJldHVybiB2YWxpZGF0ZTsKICAgIH0KICAgIGlmICh2YWxpZGF0ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbGlkYXRlID09PSBudWxsKSB7CiAgICAgIHZhbGlkYXRlID0gIiI7CiAgICB9CiAgICByZXR1cm4gdXRpbHMubWVyZ2VWYWxpZGF0ZSgicmVxdWlyZWQiLCB2YWxpZGF0ZSk7CiAgfSwKICAvLyDmoLzlvI/ljJbml6XmnJ/ml7bpl7QKICBmb3JtYXREYXRlOiBmdW5jdGlvbiBmb3JtYXREYXRlKHZhbHVlLCB0eXBlKSB7CiAgICB2YXIgZGF0ZSA9IG51bGw7CiAgICBpZiAoIXZhbHVlKSB7CiAgICAgIHJldHVybiBkYXRlOwogICAgfQogICAgaWYgKHZhbHVlLmNvbnN0cnVjdG9yID09IERhdGUgJiYgIWlzTmFOKHZhbHVlLmdldFRpbWUoKSkpIHsKICAgICAgZGF0ZSA9IHZhbHVlOwogICAgfSBlbHNlIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PSBTdHJpbmcgfHwgdmFsdWUuY29uc3RydWN0b3IgPT0gTnVtYmVyKSB7CiAgICAgIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyAi5qC85byP5YyW5pel5pyf5pe277yM5Lyg5YWl55qE5pWw5o2u5qC85byP5LiN5q2j56Gu44CCIjsKICAgIH0KICAgIHZhciB5ID0gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgdmFyIE1NID0gZGF0ZS5nZXRNb250aCgpICsgMTsKICAgIE1NID0gTU0gPCAxMCA/ICcwJyArIE1NIDogTU07CiAgICB2YXIgZCA9IGRhdGUuZ2V0RGF0ZSgpOwogICAgZCA9IGQgPCAxMCA/ICcwJyArIGQgOiBkOwogICAgdmFyIGggPSBkYXRlLmdldEhvdXJzKCk7CiAgICBoID0gaCA8IDEwID8gJzAnICsgaCA6IGg7CiAgICB2YXIgbSA9IGRhdGUuZ2V0TWludXRlcygpOwogICAgbSA9IG0gPCAxMCA/ICcwJyArIG0gOiBtOwogICAgdmFyIHMgPSBkYXRlLmdldFNlY29uZHMoKTsKICAgIHMgPSBzIDwgMTAgPyAnMCcgKyBzIDogczsKICAgIGlmICh0eXBlID09ICd5ZWFyJykgewogICAgICByZXR1cm4geTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAneWVhck1vbnRoJykgewogICAgICByZXR1cm4geSArICctJyArIE1NOwogICAgfSBlbHNlIGlmICh0eXBlID09ICdkYXRlJykgewogICAgICByZXR1cm4geSArICctJyArIE1NICsgJy0nICsgZDsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZGF0ZVRpbWUnKSB7CiAgICAgIHJldHVybiB5ICsgJy0nICsgTU0gKyAnLScgKyBkICsgJyAnICsgaCArICc6JyArIG0gKyAnOicgKyBzOwogICAgfQogIH0sCiAgLy8g5qC85byP5YyW5pel5pyfIAogIGZvcm1hdERhdGVZZWFyOiBmdW5jdGlvbiBmb3JtYXREYXRlWWVhcih2YWx1ZSkgewogICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7CiAgICB2YXIgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIHZhciBNTSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7CiAgICBNTSA9IE1NIDwgMTAgPyAnMCcgKyBNTSA6IE1NOwogICAgdmFyIGQgPSBkYXRlLmdldERhdGUoKTsKICAgIGQgPSBkIDwgMTAgPyAnMCcgKyBkIDogZDsKICAgIHJldHVybiB5ICsgJy0nICsgTU0gKyAnLScgKyBkOwogIH0sCiAgLy8g5pel5pyfMeaYr+WQpuaXqeS6juaXpeacnzIKICBkYXRlSXNCZWZvcmU6IGZ1bmN0aW9uIGRhdGVJc0JlZm9yZShkYXRlT25lLCBkYXRlVHdvLCBjYW5FcXVhbHMpIHsKICAgIGlmICghZGF0ZU9uZSB8fCAhZGF0ZVR3bykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZhciBkYXRlMSA9IG5ldyBEYXRlKGRhdGVPbmUpLmdldFRpbWUoKSB8fCBuZXcgRGF0ZShuZXcgRGF0ZSgpLmZvcm1hdCgieXl5eS1NTS1kZCIpICsgIiAiICsgZGF0ZU9uZSkuZ2V0VGltZSgpOwogICAgdmFyIGRhdGUyID0gbmV3IERhdGUoZGF0ZVR3bykuZ2V0VGltZSgpIHx8IG5ldyBEYXRlKG5ldyBEYXRlKCkuZm9ybWF0KCJ5eXl5LU1NLWRkIikgKyAiICIgKyBkYXRlVHdvKS5nZXRUaW1lKCk7CiAgICBpZiAoIWNhbkVxdWFscykgewogICAgICAvL+Wkp+S6juOAgnYyPnYxIOOAggogICAgICBpZiAoZGF0ZTIgPiBkYXRlMSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy/lpKfkuo7nrYnkuo7jgIJ2Mj49djEg44CC5Y+q6KaBdjHkuI3lpKfkuo52MuWNs+WPrwogICAgICBpZiAoZGF0ZTEgPiBkYXRlMikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogIH0sCiAgLy8g5pel5pyf6K6h566X77yM5LiN5Lyg5Y2V5L2N5pe277yM6buY6K6k5LulJ+WkqSfkuLrljZXkvY3orqHnrpcKICBkYXRlQ2FsYzogZnVuY3Rpb24gZGF0ZUNhbGMoc3RhcnREYXRlLCBlbmREYXRlLCBvcCkgewogICAgaWYgKCFzdGFydERhdGUgfHwgIWVuZERhdGUgfHwgc3RhcnREYXRlLmxlbmd0aCA9PSAwIHx8IGVuZERhdGUubGVuZ3RoID09IDApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoIW9wIHx8IG9wLmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICBvcCA9ICJkYXkiOwogICAgfQogICAgdmFyIG9wQXJ5ID0gWyd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnXTsKICAgIGlmIChvcEFyeS5pbmRleE9mKG9wKSA9PSAtMSkgewogICAgICB0aHJvdyAiXHU4QkExXHU3Qjk3XHU2NUU1XHU2NzFGXHU3Njg0XHU1MzU1XHU0RjREXHU1M0VBXHU4MEZEXHU0RUNFIi5jb25jYXQob3BBcnksICJcdTRFMkRcdTkwMDlcdTYyRTkiKTsKICAgIH0KICAgIHZhciBkYXRlMSA9IG5ldyBEYXRlKERhdGUucGFyc2Uoc3RhcnREYXRlLnJlcGxhY2UoLy0vZywgIi8iKSkpLmdldFRpbWUoKTsKICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKERhdGUucGFyc2UoZW5kRGF0ZS5yZXBsYWNlKC8tL2csICIvIikpKS5nZXRUaW1lKCk7CiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0ZTEpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGRhdGUyKSkgewogICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsKICAgICAgdmFyIG5vd1N0ciA9IG5vdy5nZXRGdWxsWWVhcigpICsgJy8nICsgKG5vdy5nZXRNb250aCgpICsgMSkgKyAnLycgKyBub3cuZ2V0RGF0ZSgpOwogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0ZTEpKSB7CiAgICAgICAgZGF0ZTEgPSBuZXcgRGF0ZSgiIi5jb25jYXQobm93U3RyLCAiICIpLmNvbmNhdChzdGFydERhdGUpKS5nZXRUaW1lKCk7CiAgICAgIH0KICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRhdGUxKSkgewogICAgICAgIGRhdGUyID0gbmV3IERhdGUoIiIuY29uY2F0KG5vd1N0ciwgIiAiKS5jb25jYXQoZW5kRGF0ZSkpLmdldFRpbWUoKTsKICAgICAgfQogICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoZGF0ZTEpIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGRhdGUyKSkgewogICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICB9CiAgICB2YXIgcmVzID0gMDsKICAgIHZhciBkYXlzID0gZGF0ZTIgLSBkYXRlMTsKICAgIHN3aXRjaCAob3ApIHsKICAgICAgY2FzZSAieWVhciI6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjAgKiA2MCAqIDI0ICogMzAgKiAxMikpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtb250aCI6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjAgKiA2MCAqIDI0ICogMzApKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiZGF5IjoKICAgICAgICByZXMgPSBwYXJzZUludChkYXlzIC8gKDEwMDAgKiA2MCAqIDYwICogMjQpKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiaG91ciI6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvICgxMDAwICogNjAgKiA2MCkpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJtaW51dGUiOgogICAgICAgIHJlcyA9IHBhcnNlSW50KGRheXMgLyAoMTAwMCAqIDYwKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgInNlY29uZCI6CiAgICAgICAgcmVzID0gcGFyc2VJbnQoZGF5cyAvIDEwMDApOwogICAgfQogICAgcmV0dXJuIHJlczsKICB9LAogIG5lc3QydGlsZTogZnVuY3Rpb24gbmVzdDJ0aWxlKGFyciwgY2hpbGRyZW5LZXksIG9idGFpbkNoaWxkcmVuKSB7CiAgICB2YXIgX3JlZjsKICAgIGlmICghY2hpbGRyZW5LZXkpIHsKICAgICAgY2hpbGRyZW5LZXkgPSAiY2hpbGRyZW4iOwogICAgfQogICAgcmV0dXJuIChfcmVmID0gW10pLmNvbmNhdC5hcHBseShfcmVmLCBfdG9Db25zdW1hYmxlQXJyYXkoYXJyLm1hcChmdW5jdGlvbiAoaXRlbSkgewogICAgICB2YXIgX3JlZjI7CiAgICAgIHZhciBfaXRlbSA9IF9vYmplY3RTcHJlYWQoe30sIGl0ZW0pOwogICAgICBpZiAob2J0YWluQ2hpbGRyZW4gPT0gdW5kZWZpbmVkIHx8IG9idGFpbkNoaWxkcmVuID09IGZhbHNlKSB7CiAgICAgICAgZGVsZXRlIF9pdGVtW2NoaWxkcmVuS2V5XTsKICAgICAgfQogICAgICByZXR1cm4gKF9yZWYyID0gW10pLmNvbmNhdC5hcHBseShfcmVmMiwgW19pdGVtXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KHV0aWxzLm5lc3QydGlsZShpdGVtW2NoaWxkcmVuS2V5XSkpKSk7CiAgICB9KSkpOwogIH0sCiAgLy8g5bmz6ZO657uT5p6E6L2s5bWM5aWX57uT5p6ECiAgdGlsZTJuZXN0OiBmdW5jdGlvbiB0aWxlMm5lc3QoYXJyYXksIGtleSwgcEtleSwgY2hpbGRyZW5LZXkpIHsKICAgIGlmICghYXJyYXkgfHwgYXJyYXkuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIC8vIOWkjeWItuS4gOS7ve+8jOmBv+WFjeS/ruaUueWOn+Wni+aVsOe7hAogICAgdmFyIGFyeSA9IF90b0NvbnN1bWFibGVBcnJheShhcnJheSk7CiAgICBrZXkgPSBrZXkgfHwgImlkIjsKICAgIHBLZXkgPSBwS2V5IHx8ICJwYXJlbnRJZCI7CiAgICBjaGlsZHJlbktleSA9IGNoaWxkcmVuS2V5IHx8ICJjaGlsZHJlbiI7CiAgICAvLyDlrprkuYnkuIDkuKrlvoXnp7vpmaTmlbDnu4QKICAgIHZhciBhcnkycmVtb3ZlID0gW107CiAgICBhcnkubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGlmIChpdGVtW2tleV0gIT09IGl0ZW1bcEtleV0pIHsKICAgICAgICAvLyDmib7niLboioLngrkKICAgICAgICB2YXIgcCA9IGFyeS5maWx0ZXIoZnVuY3Rpb24gKGMpIHsKICAgICAgICAgIHJldHVybiBjW2tleV0gPT09IGl0ZW1bcEtleV07CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHAgJiYgcC5sZW5ndGggPT0gMSkgewogICAgICAgICAgcFswXVtjaGlsZHJlbktleV0gPSBwWzBdW2NoaWxkcmVuS2V5XSB8fCBbXTsKICAgICAgICAgIC8vIOWwhuWtkOiKgueCueaUvuWIsOeItuiKgueCueS4rQogICAgICAgICAgcFswXVtjaGlsZHJlbktleV0ucHVzaChpdGVtKTsKICAgICAgICAgIGFyeTJyZW1vdmUucHVzaChpdGVtW2tleV0pOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICAvLyDpgY3ljobnp7vpmaTlvoXliKDpmaTlr7nosaEKICAgIGFyeTJyZW1vdmUubWFwKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgIGFyeSA9IGFyeS5maWx0ZXIoZnVuY3Rpb24gKGMpIHsKICAgICAgICByZXR1cm4gY1trZXldICE9PSBpdGVtOwogICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIGFyeTsKICB9LAogIC8vIOiOt+WPluaOp+S7tuaJgOWcqOihqOWNleWvueW6lOeahOWunuS+i+WvueixoQogIGdldE9ubGluZUZvcm1JbnN0YW5jZTogZnVuY3Rpb24gZ2V0T25saW5lRm9ybUluc3RhbmNlKGluc3RhbmNlKSB7CiAgICBpZiAoaW5zdGFuY2UgPT0gaW5zdGFuY2UuJHJvb3QpIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfQogICAgaWYgKCFpbnN0YW5jZSkgewogICAgICB0aHJvdyAiVnVlQ29tcG9uZW505a6e5L6L5Li656m6LiI7CiAgICB9CiAgICBpZiAoaW5zdGFuY2UuaGFzT3duUHJvcGVydHkoIndhdGNoTWFwIikpIHsKICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfSBlbHNlIGlmIChpbnN0YW5jZS4kcGFyZW50KSB7CiAgICAgIHJldHVybiB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoaW5zdGFuY2UuJHBhcmVudCk7CiAgICB9CiAgfSwKICAvLyDojrflj5blrZDooajmr4/kuIDooYzmiYDlnKjnmoTkvZznlKjln5/lhYPntKDlj4rntKLlvJUKICBnZXRTdWJTY29wZUVsQW5kSW5kZXg6IGZ1bmN0aW9uIGdldFN1YlNjb3BlRWxBbmRJbmRleChlbCkgewogICAgdmFyIHN1YlNjb3BlRWwgPSB1dGlscy5nZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwsICJkYXRhLXN1Ym5hbWUiKTsKICAgIGlmICghc3ViU2NvcGVFbCkgewogICAgICByZXR1cm4gewogICAgICAgIHN1YlNjb3BlRWw6IG51bGwsCiAgICAgICAgaW5kZXg6IG51bGwKICAgICAgfTsKICAgIH0KICAgIHZhciBpbmRleCA9IHN1YlNjb3BlRWwuZGF0YXNldFsiaW5kZXgiXTsKICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHRocm93ICLopoHorqHnrpfnmoTlrZDooajooYzmnKrojrflj5bliLBpbmRleOWxnuaApy4iOwogICAgfQogICAgaW5kZXggPSBOdW1iZXIucGFyc2VJbnQoaW5kZXgpOwogICAgcmV0dXJuIHsKICAgICAgc3ViU2NvcGVFbDogc3ViU2NvcGVFbCwKICAgICAgaW5kZXg6IGluZGV4CiAgICB9OwogIH0sCiAgLy8g5Zyo5a2Q6KGo5oyH5a6a6KGM5Lit6YCa6L+Hdi1tb2RlbOihqOi+vuW8j+iOt+WPlmlucHV05a+55bqU55qEdnVl5a6e5L6LCiAgZ2V0U3ViSW5wdXRTY29wZUJ5TW9kZWxFeHByZXNzaW9uOiBmdW5jdGlvbiBnZXRTdWJJbnB1dFNjb3BlQnlNb2RlbEV4cHJlc3Npb24oc3ViU2NvcGVFbCwgZXhwcmVzc2lvbikgewogICAgdmFyIGlucHV0QXJ5ID0gc3ViU2NvcGVFbC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpbnB1dHMiKTsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgZm9yICh2YXIgaSA9IDAsIGM7IGMgPSBpbnB1dEFyeVtpKytdOykgewogICAgICB2YXIgZXhwcmVzc2lvbk5hbWUgPSBjLl9fdnVlX18uJHZub2RlLmRhdGEubW9kZWwuZXhwcmVzc2lvbjsKICAgICAgLy8g5YW85a65ZnJvbnTnq6/kvb/nlKgKICAgICAgaWYgKGMuX192dWVfXy4kdm5vZGUgJiYgYy5fX3Z1ZV9fLiR2bm9kZS5jb21wb25lbnRPcHRpb25zICYmIGMuX192dWVfXy4kdm5vZGUuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEgJiYgYy5fX3Z1ZV9fLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YS5tb2RlbEV4cHJlc3Npb24pIHsKICAgICAgICBleHByZXNzaW9uTmFtZSA9IGMuX192dWVfXy4kdm5vZGUuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGEubW9kZWxFeHByZXNzaW9uOwogICAgICB9CiAgICAgIGlmIChjICYmIGMuX192dWVfXyAmJiBjLl9fdnVlX18uJHZub2RlLmRhdGEubW9kZWwgJiYgZXhwcmVzc2lvbk5hbWUgPT09IGV4cHJlc3Npb24pIHsKICAgICAgICByZXN1bHQgPSBjLl9fdnVlX187CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfSwKICAvLyDojrflj5blnKjnur/ooajljZXnmoRqc29u5qC85byP5a2X56ym5Liy55qE6KGo5Y2V5pWw5o2uKHZhbGlkYXRl5Y+C5pWw5Yaz5a6a5piv5ZCm6ZyA6KaB5a+56KGo5Y2V6L+b6KGM6aqM6K+BKQogIHZhbGlkYXRlRm9ybTogZnVuY3Rpb24gdmFsaWRhdGVGb3JtKGluc3RhbmNlLCBzY29wZU5hbWUpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgIGluc3RhbmNlLiRyb290LiR2YWxpZGF0b3IudmFsaWRhdGVBbGwoc2NvcGVOYW1lKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHsKICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlamVjdChpbnN0YW5jZS4kcm9vdC4kdmFsaWRhdG9yLmVycm9ycy5pdGVtcyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwogIH0sCiAgLy8g6I635Y+W5oyH5a6aZG9t5YWD57Sg55qE54i257qn5Lit5YW35pyJ5oyH5a6a5bGe5oCn55qEZG9t5YWD57SgCiAgZ2V0UGFyZW50RWxlbWVudEJ5QXR0cmlidXRlOiBmdW5jdGlvbiBnZXRQYXJlbnRFbGVtZW50QnlBdHRyaWJ1dGUoZWwsIGF0dHJpYnV0ZSkgewogICAgaWYgKGVsID09PSBudWxsIHx8IGVsID09PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZSB8fCB0eXBlb2YgZWwuaGFzQXR0cmlidXRlICE9ICdmdW5jdGlvbicpIHsKICAgICAgdGhyb3cgIuS8oOWFpeeahOWFg+e0oGVs5LiN6IO95Li656m65LiU5b+F6aG75Li6SFRNTEh0bWxFbGVtZW5057G75Z6LLiI7CiAgICB9CiAgICBpZiAoIWF0dHJpYnV0ZSB8fCBhdHRyaWJ1dGUuY29uc3RydWN0b3IgIT09IFN0cmluZykgewogICAgICB0aHJvdyAi5Lyg5YWl55qE5bGe5oCnYXR0cmlidXRl5LiN6IO95Li656m65LiU5b+F6aG75Li6U3RyaW5n57G75Z6LLiI7CiAgICB9CiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSkpIHsKICAgICAgcmV0dXJuIGVsOwogICAgfSBlbHNlIGlmIChlbC50YWdOYW1lID09PSAnSFRNTCcpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdXRpbHMuZ2V0UGFyZW50RWxlbWVudEJ5QXR0cmlidXRlKGVsLnBhcmVudEVsZW1lbnQsIGF0dHJpYnV0ZSk7CiAgICB9CiAgfSwKICAvLyDku47niLbnuqdkb23lhYPntKDkuK3ojrflj5bmjIflrprlsZ7mgKfnmoTlgLwKICBnZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQ6IGZ1bmN0aW9uIGdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudChlbCwgYXR0cmlidXRlKSB7CiAgICB2YXIgcEVsID0gdXRpbHMuZ2V0UGFyZW50RWxlbWVudEJ5QXR0cmlidXRlKGVsLCBhdHRyaWJ1dGUpOwogICAgaWYgKHBFbCAmJiBwRWwuZ2V0QXR0cmlidXRlICYmIHBFbC5nZXRBdHRyaWJ1dGUuY29uc3RydWN0b3IgPT09IEZ1bmN0aW9uKSB7CiAgICAgIHJldHVybiBwRWwuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9LAogIC8vIOWwhuWtkOihqOWxnuaAp+i3r+W+hOi9rOaNouS4uuWujOaVtOeahOWxnuaAp+i3r+W+hO+8jOS+i+Wmgu+8mml0ZW0ubmFtZSA9PiBkYXRhLnN1YlswXS5uYW1lCiAgZ2V0V2hvbGVQYXRoT2ZTdWI6IGZ1bmN0aW9uIGdldFdob2xlUGF0aE9mU3ViKHN1YlBhdGgsIG1haW5QYXRoLCBpbmRleCkgewogICAgaWYgKCFzdWJQYXRoIHx8ICFtYWluUGF0aCB8fCBpbmRleCA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzSW50ZWdlcihpbmRleCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgbWF0Y2ggPSBzdWJQYXRoLnNwbGl0KCcuJyk7CiAgICBpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkgewogICAgICByZXR1cm4gIiIuY29uY2F0KG1haW5QYXRoLCAiWyIpLmNvbmNhdChpbmRleCwgIl0uIikuY29uY2F0KG1hdGNoW21hdGNoLmxlbmd0aCAtIDFdKTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0sCiAgLy8g6YCa6L+H6Lev5b6E5Y+W5b6X5a+56LGh5Lit55qE5bGe5oCnCiAgZ2V0VmFsdWVCeVBhdGg6IGZ1bmN0aW9uIGdldFZhbHVlQnlQYXRoKG9iaiwgcGF0aCwgc3ViSW5kZXgpIHsKICAgIGlmICghb2JqIHx8ICFwYXRoIHx8IHBhdGguY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKCEvXlx3Py4qW1x3fFxdXSQvLnRlc3QocGF0aCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICB2YXIgcGF0aEFyeSA9IHBhdGguc3BsaXQoIi4iKTsKICAgIGlmIChwYXRoQXJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgIHJldHVybiBvYmpbcGF0aF07CiAgICB9IGVsc2UgaWYgKHBhdGhBcnkubGVuZ3RoID4gMSkgewogICAgICB2YXIgcmV0ID0gb2JqOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAocmV0ID09PSBudWxsIHx8IHJldCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIGtleSA9IHBhdGhBcnlbaV07CiAgICAgICAgdmFyIG1hdGNoID0gL14oXHcrKVxbKFxkKylcXSQvLmV4ZWMoa2V5KTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgIHJldCA9IHJldFttYXRjaFsxXV1bbWF0Y2hbMl1dOwogICAgICAgIH0gZWxzZSBpZiAocmV0ICYmIHJldC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgICBpZiAoc3ViSW5kZXggIT0gbnVsbCAmJiBzdWJJbmRleCAhPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgdmFyIHByZUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHN1YkluZGV4KTsKICAgICAgICAgICAgaWYgKCFpc05hTihwcmVJbmRleCkpIHsKICAgICAgICAgICAgICBpbmRleCA9IHByZUluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXQgPSByZXRbaW5kZXhdW2tleV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldCA9IHJldFtrZXldOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfSwKICAvLyDpgJrov4fot6/lvoTorr7nva7lr7nosaHkuK3nmoTlsZ7mgKcKICBzZXRWYWx1ZUJ5UGF0aDogZnVuY3Rpb24gc2V0VmFsdWVCeVBhdGgob2JqLCBwYXRoLCB2YWx1ZSwgc3ViSW5kZXgpIHsKICAgIGlmICghb2JqIHx8ICFwYXRoIHx8IHBhdGguY29uc3RydWN0b3IgIT0gU3RyaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICghL15cdz8uKltcd3xcXV0kLy50ZXN0KHBhdGgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBwYXRoQXJ5ID0gcGF0aC5zcGxpdCgiLiIpOwogICAgaWYgKHBhdGhBcnkubGVuZ3RoID09IDEpIHsKICAgICAgb2JqW3BhdGhdID0gdmFsdWU7CiAgICB9IGVsc2UgaWYgKHBhdGhBcnkubGVuZ3RoID4gMSkgewogICAgICB2YXIgcmV0ID0gb2JqOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIga2V5ID0gcGF0aEFyeVtpXTsKICAgICAgICB2YXIgbWF0Y2ggPSAvXihcdyspXFsoXGQrKVxdJC8uZXhlYyhrZXkpOwogICAgICAgIGlmIChpID09IHBhdGhBcnkubGVuZ3RoIC0gMSkgewogICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldFttYXRjaFsxXV1bbWF0Y2hbMl1dID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgaWYgKHJldCAmJiByZXQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7CiAgICAgICAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgICAgICAgIGlmIChzdWJJbmRleCAhPSBudWxsICYmIHN1YkluZGV4ICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIHZhciBwcmVJbmRleCA9IE51bWJlci5wYXJzZUludChzdWJJbmRleCk7CiAgICAgICAgICAgICAgaWYgKCFpc05hTihwcmVJbmRleCkpIHsKICAgICAgICAgICAgICAgIGluZGV4ID0gcHJlSW5kZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldFtpbmRleF1ba2V5XSA9IHZhbHVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldCA9IHJldFttYXRjaFsxXV1bbWF0Y2hbMl1dOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0ID0gcmV0W2tleV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSwKICAvKioNCiAgKiDlsIblrZfnrKbkuLLovazkuLpqc29u5a+56LGh44CCDQogICogQHBhcmFtIGpzb25TdHINCiAgKiBAcGFyYW0gdHlwZSAg5Y+v5LiN5aGr5YaZcGFyc2VUb0pzb24NCiAgKiBAcmV0dXJucw0KICAqLwogIHBhcnNlVG9Kc29uOiBmdW5jdGlvbiBwYXJzZVRvSnNvbihqc29uU3RyLCB0eXBlKSB7CiAgICB0eXBlID0gdHlwZSB8fCAxOwogICAgaWYgKCFqc29uU3RyIHx8IGpzb25TdHIgPT09ICIiIHx8IHR5cGUgPiAzKSByZXR1cm4gbnVsbDsKICAgIHRyeSB7CiAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgMToKICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb25TdHIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgcmV0dXJuIGV2YWwoIigiLmNvbmNhdChqc29uU3RyLCAiKSIpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICB0aHJvdyAi6Kej5p6QanNvbuWvueixoemUmeivryI7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSBjYXRjaCAoZSkgewogICAgICByZXR1cm4gdXRpbHMucGFyc2VUb0pzb24oanNvblN0ciwgdHlwZSArIDEpOwogICAgfQogIH0sCiAgLyoqDQogICog5bCG5pWw5a2X6L2s5o2i5oiQ5Lq65ZCN5biB5aSn5YaZ44CCDQogICogDQogICogQHBhcmFtIGN1cnJlbmN5RGlnaXRzDQogICogQHJldHVybnMNCiAgKi8KICBjb252ZXJ0Q3VycmVuY3k6IGZ1bmN0aW9uIGNvbnZlcnRDdXJyZW5jeShjdXJyZW5jeURpZ2l0cykgewogICAgdmFyIE1BWElNVU1fTlVNQkVSID0gOTk5OTk5OTk5OTkuOTk7CiAgICB2YXIgQ05fWkVSTyA9ICLpm7YiOwogICAgdmFyIENOX09ORSA9ICLlo7kiOwogICAgdmFyIENOX1RXTyA9ICLotLAiOwogICAgdmFyIENOX1RIUkVFID0gIuWPgSI7CiAgICB2YXIgQ05fRk9VUiA9ICLogoYiOwogICAgdmFyIENOX0ZJVkUgPSAi5LyNIjsKICAgIHZhciBDTl9TSVggPSAi6ZmGIjsKICAgIHZhciBDTl9TRVZFTiA9ICLmn5IiOwogICAgdmFyIENOX0VJR0hUID0gIuaNjCI7CiAgICB2YXIgQ05fTklORSA9ICLnjpYiOwogICAgdmFyIENOX1RFTiA9ICLmi74iOwogICAgdmFyIENOX0hVTkRSRUQgPSAi5L2wIjsKICAgIHZhciBDTl9USE9VU0FORCA9ICLku58iOwogICAgdmFyIENOX1RFTl9USE9VU0FORCA9ICLkuIciOwogICAgdmFyIENOX0hVTkRSRURfTUlMTElPTiA9ICLkur8iOwogICAgdmFyIENOX1NZTUJPTCA9ICIiOwogICAgdmFyIENOX0RPTExBUiA9ICLlhYMiOwogICAgdmFyIENOX1RFTl9DRU5UID0gIuinkiI7CiAgICB2YXIgQ05fQ0VOVCA9ICLliIYiOwogICAgdmFyIENOX0lOVEVHRVIgPSAi5pW0IjsKICAgIHZhciBpbnRlZ3JhbDsKICAgIHZhciBkZWNpbWFsOwogICAgdmFyIG91dHB1dENoYXJhY3RlcnM7CiAgICB2YXIgcGFydHM7CiAgICB2YXIgZGlnaXRzLCByYWRpY2VzLCBiaWdSYWRpY2VzLCBkZWNpbWFsczsKICAgIHZhciB6ZXJvQ291bnQ7CiAgICB2YXIgaSwgcCwgZDsKICAgIHZhciBxdW90aWVudCwgbW9kdWx1czsKICAgIGN1cnJlbmN5RGlnaXRzID0gY3VycmVuY3lEaWdpdHMudG9TdHJpbmcoKTsKICAgIGlmIChjdXJyZW5jeURpZ2l0cyA9PSAiIikgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBpZiAoY3VycmVuY3lEaWdpdHMubWF0Y2goL1teLC5cZF0vKSAhPSBudWxsKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIGlmIChjdXJyZW5jeURpZ2l0cy5tYXRjaCgvXigoXGR7MSwzfSgsXGR7M30pKiguKChcZHszfSwpKlxkezEsM30pKT8pfChcZCsoLlxkKyk/KSkkLykgPT0gbnVsbCkgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgICBjdXJyZW5jeURpZ2l0cyA9IGN1cnJlbmN5RGlnaXRzLnJlcGxhY2UoLywvZywgIiIpOwogICAgY3VycmVuY3lEaWdpdHMgPSBjdXJyZW5jeURpZ2l0cy5yZXBsYWNlKC9eMCsvLCAiIik7CiAgICBpZiAoTnVtYmVyKGN1cnJlbmN5RGlnaXRzKSA+IE1BWElNVU1fTlVNQkVSKSB7CiAgICAgIHJldHVybiAiIjsKICAgIH0KICAgIHBhcnRzID0gY3VycmVuY3lEaWdpdHMuc3BsaXQoIi4iKTsKICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CiAgICAgIGludGVncmFsID0gcGFydHNbMF07CiAgICAgIGRlY2ltYWwgPSBwYXJ0c1sxXTsKICAgICAgZGVjaW1hbCA9IGRlY2ltYWwuc3Vic3RyKDAsIDIpOwogICAgfSBlbHNlIHsKICAgICAgaW50ZWdyYWwgPSBwYXJ0c1swXTsKICAgICAgZGVjaW1hbCA9ICIiOwogICAgfQogICAgZGlnaXRzID0gbmV3IEFycmF5KENOX1pFUk8sIENOX09ORSwgQ05fVFdPLCBDTl9USFJFRSwgQ05fRk9VUiwgQ05fRklWRSwgQ05fU0lYLCBDTl9TRVZFTiwgQ05fRUlHSFQsIENOX05JTkUpOwogICAgcmFkaWNlcyA9IG5ldyBBcnJheSgiIiwgQ05fVEVOLCBDTl9IVU5EUkVELCBDTl9USE9VU0FORCk7CiAgICBiaWdSYWRpY2VzID0gbmV3IEFycmF5KCIiLCBDTl9URU5fVEhPVVNBTkQsIENOX0hVTkRSRURfTUlMTElPTik7CiAgICBkZWNpbWFscyA9IG5ldyBBcnJheShDTl9URU5fQ0VOVCwgQ05fQ0VOVCk7CiAgICBvdXRwdXRDaGFyYWN0ZXJzID0gIiI7CiAgICBpZiAoTnVtYmVyKGludGVncmFsKSA+IDApIHsKICAgICAgemVyb0NvdW50ID0gMDsKICAgICAgZm9yIChpID0gMDsgaSA8IGludGVncmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcCA9IGludGVncmFsLmxlbmd0aCAtIGkgLSAxOwogICAgICAgIGQgPSBpbnRlZ3JhbC5zdWJzdHIoaSwgMSk7CiAgICAgICAgcXVvdGllbnQgPSBwIC8gNDsKICAgICAgICBtb2R1bHVzID0gcCAlIDQ7CiAgICAgICAgaWYgKGQgPT0gIjAiKSB7CiAgICAgICAgICB6ZXJvQ291bnQrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHplcm9Db3VudCA+IDApIHsKICAgICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbMF07CiAgICAgICAgICB9CiAgICAgICAgICB6ZXJvQ291bnQgPSAwOwogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBkaWdpdHNbTnVtYmVyKGQpXSArIHJhZGljZXNbbW9kdWx1c107CiAgICAgICAgfQogICAgICAgIGlmIChtb2R1bHVzID09IDAgJiYgemVyb0NvdW50IDwgNCkgewogICAgICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBiaWdSYWRpY2VzW3F1b3RpZW50XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBDTl9ET0xMQVI7CiAgICB9CiAgICBpZiAoZGVjaW1hbCAhPSAiIikgewogICAgICBmb3IgKGkgPSAwOyBpIDwgZGVjaW1hbC5sZW5ndGg7IGkrKykgewogICAgICAgIGQgPSBkZWNpbWFsLnN1YnN0cihpLCAxKTsKICAgICAgICBpZiAoZCAhPSAiMCIpIHsKICAgICAgICAgIG91dHB1dENoYXJhY3RlcnMgKz0gZGlnaXRzW051bWJlcihkKV0gKyBkZWNpbWFsc1tpXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChvdXRwdXRDaGFyYWN0ZXJzID09ICIiKSB7CiAgICAgIG91dHB1dENoYXJhY3RlcnMgPSBDTl9aRVJPICsgQ05fRE9MTEFSOwogICAgfQogICAgaWYgKGRlY2ltYWwgPT0gIiIpIHsKICAgICAgb3V0cHV0Q2hhcmFjdGVycyArPSBDTl9JTlRFR0VSOwogICAgfQogICAgb3V0cHV0Q2hhcmFjdGVycyA9IENOX1NZTUJPTCArIG91dHB1dENoYXJhY3RlcnM7CiAgICByZXR1cm4gb3V0cHV0Q2hhcmFjdGVyczsKICB9LAogIC8qKg0KICAgKiDpgJrov4duYW1l6I635Y+W6aG16Z2idXJs5Zyw5Z2A5Y+C5pWwDQogICAqIEBwYXJhbSBuYW1lDQogICAqIEByZXR1cm5zDQogICAqIA0KICAgKi8KICBnZXRVcmxLZXk6IGZ1bmN0aW9uIGdldFVybEtleShuYW1lKSB7CiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KChuZXcgUmVnRXhwKCdbP3wmXScgKyBuYW1lICsgJz0nICsgJyhbXiY7XSs/KSgmfCN8O3wkKScpLmV4ZWMobG9jYXRpb24uaHJlZikgfHwgWywgIiJdKVsxXS5yZXBsYWNlKC9cKy9nLCAnJTIwJykpIHx8IG51bGw7CiAgfSwKICAvLyDov5Tlm57osIPmlbTpobrluo/lkI7nmoTmlbDnu4QgcGFydO+8muaVsOe7hOS4reeahOS4gOS4quaIluWkmuS4quWFg+e0oO+8jCBkaXJlY3TvvJrosIPmlbTnmoTmlrnlkJEgIHVw77ya5ZCR5LiKICBkb3du77ya5ZCR5LiLCiAgYXJyYXlNb3ZlOiBmdW5jdGlvbiBhcnJheU1vdmUoYXJ5LCBwYXJ0LCBkaXJlY3QpIHsKICAgIGRpcmVjdCA9IGRpcmVjdCB8fCAiZG93biI7CiAgICBpZiAoIXBhcnQgfHwgcGFydC5jb25zdHJ1Y3RvciAhPT0gT2JqZWN0ICYmIHBhcnQuY29uc3RydWN0b3IgIT09IEFycmF5KSB7CiAgICAgIHJldHVybiBhcnk7CiAgICB9CiAgICBpZiAocGFydC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7CiAgICAgIHBhcnQgPSBbcGFydF07CiAgICB9CiAgICBpZiAoZGlyZWN0ID09ICJ1cCIpIHsKICAgICAgcGFydC5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICAgICAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YobSwgMSk7CiAgICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgICAgdmFyIG5ld0FyeSA9IF90b0NvbnN1bWFibGVBcnJheShhcnkpOwogICAgICAgICAgbmV3QXJ5W2luZGV4IC0gMV0gPSBhcnlbaW5kZXhdOwogICAgICAgICAgbmV3QXJ5W2luZGV4XSA9IGFyeVtpbmRleCAtIDFdOwogICAgICAgICAgYXJ5ID0gbmV3QXJ5OwogICAgICAgIH0KICAgICAgfSk7CiAgICB9IGVsc2UgaWYgKGRpcmVjdCA9PSAiZG93biIpIHsKICAgICAgZm9yICh2YXIgaSA9IHBhcnQubGVuZ3RoIC0gMSwgbTsgbSA9IHBhcnRbaS0tXTspIHsKICAgICAgICB2YXIgaW5kZXggPSBhcnkuaW5kZXhPZihtLCAwKTsKICAgICAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCA8IGFyeS5sZW5ndGggLSAxKSB7CiAgICAgICAgICB2YXIgbmV3QXJ5ID0gX3RvQ29uc3VtYWJsZUFycmF5KGFyeSk7CiAgICAgICAgICBuZXdBcnlbaW5kZXggKyAxXSA9IGFyeVtpbmRleF07CiAgICAgICAgICBuZXdBcnlbaW5kZXhdID0gYXJ5W2luZGV4ICsgMV07CiAgICAgICAgICBhcnkgPSBuZXdBcnk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gYXJ5OwogIH0sCiAgLy8g6YCa6L+H6YWN572u5Lit5oyH5a6a55qEa2V55omA5a+55bqU55qE5bGe5oCn6Lev5b6E5Zyo5b2T5YmN6KGo5Y2V5Lit6I635Y+W5a+55bqU55qE5YC877yM5pSv5oyB6YCa6L+HZGF0YS5tYWluLm5hbWUg5oiW6ICF5pivIGl0ZW0ubmFtZeadpeWIhuWIq+iOt+WPluS4u+ihqOaVsOaNruWPiuWtkOihqOaVsOaNrueahOaDheWGtQogIGdldFZhbHVlQnlDb25maWdLZXk6IGZ1bmN0aW9uIGdldFZhbHVlQnlDb25maWdLZXkoaW5zdCwgY29uZmlnLCBrZXkpIHsKICAgIGlmICghY29uZmlnLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgdGhyb3cgImNvbmZpZ1x1NUJGOVx1OEM2MVx1NEUyRFx1NjcyQVx1NjI3RVx1NTIzMFx1NUM1RVx1NjAyNyIuY29uY2F0KGtleSk7CiAgICB9CiAgICB2YXIga2V5UGF0aCA9IGNvbmZpZ1trZXldOwogICAgLy8g6I635Y+W5b2T5YmN57uE5Lu25omA5Zyo55qE6KGo5Y2VCiAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoaW5zdC4kcGFyZW50KTsKICAgIC8vIOiOt+WPluW9k+WJjee7hOS7tuaYr+WQpuWcqOWtkOihqOS4reeahOafkOS4gOihjAogICAgdmFyIF91dGlscyRnZXRTdWJTY29wZUVsQSA9IHV0aWxzLmdldFN1YlNjb3BlRWxBbmRJbmRleChpbnN0LiRlbCksCiAgICAgIHN1YlNjb3BlRWwgPSBfdXRpbHMkZ2V0U3ViU2NvcGVFbEEuc3ViU2NvcGVFbCwKICAgICAgaW5kZXggPSBfdXRpbHMkZ2V0U3ViU2NvcGVFbEEuaW5kZXg7CiAgICBpZiAoc3ViU2NvcGVFbCkgewogICAgICAvL+WIpOaWreaYr+WQpuacieWtmeihqAogICAgICB2YXIgcGF0aHMgPSBzdWJTY29wZUVsLmRhdGFzZXRbInN1Ym5hbWUiXTsKICAgICAgaWYgKHBhdGhzLnNwbGl0KCIuIikubGVuZ3RoID09IDQgJiYgcGF0aHMuaW5kZXhPZigiWyIpID09IC0xKSB7CiAgICAgICAgLy/lrZnooajlm57loavot6/lvoQKICAgICAgICBwYXRocyA9IHBhdGhzLnNwbGl0KCIuIilbMF0gKyAiLiIgKyBwYXRocy5zcGxpdCgiLiIpWzFdICsgIi4iICsgcGF0aHMuc3BsaXQoIi4iKVsyXSArICJbIiArIHBhcnNlSW50KHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudChpbnN0LiRlbCwgInN1Yi1pbmRleCIpKSArICJdIiArICIuIiArIHBhdGhzLnNwbGl0KCIuIilbM107CiAgICAgIH0KICAgICAgLy8g5bCGaXRlbS5uYW1l6L+Z5qC355qE6Lev5b6E5pu/5o2i5Li6ZGF0YS5zdWJbMF0ubmFtZei/meagt+eahOWFqOi3r+W+hOagvOW8jwogICAgICB2YXIgd2hvbGVLZXlQYXRoID0gdXRpbHMuZ2V0V2hvbGVQYXRoT2ZTdWIoa2V5UGF0aCwgcGF0aHMsIGluZGV4KTsKICAgICAgcmV0dXJuIHV0aWxzLmdldFZhbHVlQnlQYXRoKGZvcm1JbnN0LCB3aG9sZUtleVBhdGgpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHV0aWxzLmdldFZhbHVlQnlQYXRoKGZvcm1JbnN0LCBrZXlQYXRoKTsKICAgIH0KICB9LAogIC8vIOmAmui/h+mFjee9ruS4reaMh+WumueahGtleeadpeiuvue9ruWAvOWIsOWvueW6lOeahOWxnuaAp+i3r+W+hOS4iu+8jOaUr+aMgeiuvue9ruS4u+ihqOaVsOaNrmRhdGEubWFpbi5uYW1lIOaIluiuvue9ruWtkOihqOaVsOaNrml0ZW0ubmFtZQogIHNldFZhbHVlQnlDb25maWdLZXk6IGZ1bmN0aW9uIHNldFZhbHVlQnlDb25maWdLZXkoaW5zdCwgY29uZmlnLCBrZXksIHZhbHVlKSB7CiAgICBpZiAoIWNvbmZpZy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBrZXlQYXRoID0gY29uZmlnW2tleV07CiAgICAvLyDojrflj5blvZPliY3nu4Tku7bmiYDlnKjnmoTooajljZUKICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShpbnN0LiRwYXJlbnQpOwogICAgLy8g6I635Y+W5b2T5YmN57uE5Lu25piv5ZCm5Zyo5a2Q6KGo5Lit55qE5p+Q5LiA6KGMCiAgICB2YXIgX3V0aWxzJGdldFN1YlNjb3BlRWxBMiA9IHV0aWxzLmdldFN1YlNjb3BlRWxBbmRJbmRleChpbnN0LiRlbCksCiAgICAgIHN1YlNjb3BlRWwgPSBfdXRpbHMkZ2V0U3ViU2NvcGVFbEEyLnN1YlNjb3BlRWwsCiAgICAgIGluZGV4ID0gX3V0aWxzJGdldFN1YlNjb3BlRWxBMi5pbmRleDsKICAgIGlmIChzdWJTY29wZUVsKSB7CiAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5a2Z6KGoCiAgICAgIHZhciBwYXRocyA9IHN1YlNjb3BlRWwuZGF0YXNldFsic3VibmFtZSJdOwogICAgICBpZiAocGF0aHMuc3BsaXQoIi4iKS5sZW5ndGggPT0gNCAmJiBwYXRocy5pbmRleE9mKCJbIikgPT0gLTEpIHsKICAgICAgICAvL+WtmeihqOWbnuWhq+i3r+W+hAogICAgICAgIHBhdGhzID0gcGF0aHMuc3BsaXQoIi4iKVswXSArICIuIiArIHBhdGhzLnNwbGl0KCIuIilbMV0gKyAiLiIgKyBwYXRocy5zcGxpdCgiLiIpWzJdICsgIlsiICsgcGFyc2VJbnQodXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KGluc3QuJGVsLCAic3ViLWluZGV4IikpICsgIl0iICsgIi4iICsgcGF0aHMuc3BsaXQoIi4iKVszXTsKICAgICAgfQogICAgICAvLyDlsIZpdGVtLm5hbWXov5nmoLfnmoTot6/lvoTmm7/mjaLkuLpkYXRhLnN1YlswXS5uYW1l6L+Z5qC355qE5YWo6Lev5b6E5qC85byPCiAgICAgIHZhciB3aG9sZUtleVBhdGggPSB1dGlscy5nZXRXaG9sZVBhdGhPZlN1YihrZXlQYXRoLCBwYXRocywgaW5kZXgpOwogICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChmb3JtSW5zdCwgd2hvbGVLZXlQYXRoLCB2YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChmb3JtSW5zdCwga2V5UGF0aCwgdmFsdWUpOwogICAgfQogIH0sCiAgLy8g5Yik5pat5Lik5Liq5a+56LGh5piv5ZCm55u4562J77yIcHJvcHPkuLrlsZ7mgKfmlbDnu4TvvIzmnInkvKDlhaXml7bvvIzlj6rmr5Tlr7nkvKDlhaXnmoTlsZ7mgKfmmK/lkKbnm7jnrYnvvIkKICBvYmplY3RFcXVhbHM6IGZ1bmN0aW9uIG9iamVjdEVxdWFscyhvYmoxLCBvYmoyLCBwcm9wcykgewogICAgaWYgKCFwcm9wcyB8fCBwcm9wcy5jb25zdHJ1Y3RvciAhPT0gQXJyYXkpIHsKICAgICAgcHJvcHMgPSBbXTsKICAgIH0KICAgIGlmICghb2JqMSB8fCAhb2JqMikgewogICAgICByZXR1cm4gb2JqMSA9PT0gb2JqMjsKICAgIH0KICAgIGZvciAodmFyIHByb3BOYW1lIGluIG9iajEpIHsKICAgICAgaWYgKHByb3BzLmxlbmd0aCA+IDAgJiYgcHJvcHMuaW5kZXhPZihwcm9wTmFtZSkgPT09IC0xKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9iajEuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpICE9IG9iajIuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IGVsc2UgaWYgKF90eXBlb2Yob2JqMVtwcm9wTmFtZV0pICE9IF90eXBlb2Yob2JqMltwcm9wTmFtZV0pKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBvYmoyKSB7CiAgICAgIGlmIChwcm9wcy5sZW5ndGggPiAwICYmIHByb3BzLmluZGV4T2YocHJvcE5hbWUpID09PSAtMSkgewogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChvYmoxLmhhc093blByb3BlcnR5KHByb3BOYW1lKSAhPSBvYmoyLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChfdHlwZW9mKG9iajFbcHJvcE5hbWVdKSAhPSBfdHlwZW9mKG9iajJbcHJvcE5hbWVdKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoIW9iajEuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKG9iajFbcHJvcE5hbWVdIGluc3RhbmNlb2YgQXJyYXkgJiYgb2JqMltwcm9wTmFtZV0gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgIGlmICghdXRpbHMuYXJyYXlFcXVhbHMob2JqMVtwcm9wTmFtZV0sIG9iajJbcHJvcE5hbWVdKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChvYmoxW3Byb3BOYW1lXSBpbnN0YW5jZW9mIE9iamVjdCAmJiBvYmoyW3Byb3BOYW1lXSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIGlmICghdXRpbHMub2JqZWN0RXF1YWxzKG9iajFbcHJvcE5hbWVdLCBvYmoyW3Byb3BOYW1lXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAob2JqMVtwcm9wTmFtZV0gIT0gb2JqMltwcm9wTmFtZV0pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0sCiAgLy8g5Yik5pat5Lik5Liq5pWw57uE5piv5ZCm55u4562J77yM5pSv5oyB5pWw57uE5Lit5YWD57Sg5Li65a+56LGh5pe255qE5rex5bqm5a+55q+UCiAgYXJyYXlFcXVhbHM6IGZ1bmN0aW9uIGFycmF5RXF1YWxzKGFyeTEsIGFyeTIpIHsKICAgIGlmICghYXJ5MSB8fCAhYXJ5MikgewogICAgICByZXR1cm4gYXJ5MSA9PT0gYXJ5MjsKICAgIH0KICAgIGlmIChhcnkxLmxlbmd0aCAhPSBhcnkyLmxlbmd0aCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGFyeTEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIGlmIChhcnkxW2ldIGluc3RhbmNlb2YgQXJyYXkgJiYgYXJ5MltpXSBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgaWYgKCF1dGlscy5hcnJheUVxdWFscyhhcnkxW2ldLCBhcnkyW2ldKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChhcnkxW2ldIGluc3RhbmNlb2YgT2JqZWN0ICYmIGFyeTJbaV0gaW5zdGFuY2VvZiBPYmplY3QpIHsKICAgICAgICBpZiAoIXV0aWxzLm9iamVjdEVxdWFscyhhcnkxW2ldLCBhcnkyW2ldKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChhcnkxW2ldICE9IGFyeTJbaV0pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0sCiAgLy8g5Lul56ys5LiA6KGM5paH5pys55qE57yp6L+b56m65qC85pWw5Li65Z+65YeG77yM5ZCO57ut55qE5q+P5LiA6KGM6YO95Y675o6J6L+Z5Liq5Z+65YeG5omA5a+55bqU55qE56m65qC844CCCiAgdHJpbUVhY2hMaW5lOiBmdW5jdGlvbiB0cmltRWFjaExpbmUodGV4dCkgewogICAgaWYgKCF0ZXh0IHx8IHRleHQuY29uc3RydWN0b3IgIT0gU3RyaW5nIHx8IHRleHQuaW5kZXhPZigiXG4iKSA9PSAtMSkgewogICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIHZhciBhcnkgPSB0ZXh0LnNwbGl0KCJcbiIpLAogICAgICB0b3RlbSA9IDA7CiAgICByZXR1cm4gYXJ5LnJlZHVjZShmdW5jdGlvbiAocHJldiwgY3VyLCBpbmRleCkgewogICAgICBpZiAoaW5kZXggPT0gMSkgewogICAgICAgIHZhciBtYXRjaCA9IC9eKFxzKykuKiQvLmV4ZWMoY3VyKTsKICAgICAgICBtYXRjaCAmJiBtYXRjaC5sZW5ndGggPT0gMiAmJiAodG90ZW0gPSBtYXRjaFsxXS5sZW5ndGgpOwogICAgICB9CiAgICAgIHJldHVybiBwcmV2ICsgIlxuIiArIGN1ci5zbGljZSh0b3RlbSwgY3VyLmxlbmd0aCk7CiAgICB9KTsKICB9LAogIC8vIOiOt+WPluWtl+espuS4sueahOWTiOW4jOe8lueggQogIGhhc2hDb2RlOiBmdW5jdGlvbiBoYXNoQ29kZSh0ZXh0KSB7CiAgICB2YXIgaGFzaCA9IDAsCiAgICAgIGNoYXI7CiAgICBpZiAodGV4dC5sZW5ndGggPT0gMCkgcmV0dXJuIGhhc2g7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgY2hhciA9IHRleHQuY2hhckNvZGVBdChpKTsKICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIGNoYXI7CiAgICAgIGhhc2ggPSBoYXNoICYgaGFzaDsKICAgIH0KICAgIHJldHVybiBoYXNoOwogIH0KfTsKCi8vIOWcqOaVsOe7hOS4iuaJqeWxleS4gOS4quWIoOmZpOaMh+WumumhueeahOaWueazlQpBcnJheS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGl0ZW0pIHsKICB2YXIgaW5kZXggPSB0aGlzLmZpbmRJbmRleChmdW5jdGlvbiAodikgewogICAgcmV0dXJuIHYgPT09IGl0ZW07CiAgfSk7CiAgaWYgKGluZGV4ID4gLTEpIHsKICAgIHRoaXMuc3BsaWNlKGluZGV4LCAxKTsKICB9Cn07CgovLyDmuIXnqbrmlbDnu4QKQXJyYXkucHJvdG90eXBlLmVtcHR5ID0gZnVuY3Rpb24gKCkgewogIHRoaXMuc3BsaWNlKDAsIHRoaXMubGVuZ3RoKTsKfTsKCi8vIOWcqOaVsOe7hOS4iuaJqeWxleS4gOS4quWOu+mHjeeahOaWueazlQpBcnJheS5wcm90b3R5cGUudW5pcXVlID0gZnVuY3Rpb24gKGFyZykgewogIHZhciByZXMgPSBuZXcgTWFwKCk7CiAgcmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7CiAgICBpZiAoYXJnKSB7CiAgICAgIHJldHVybiAhcmVzLmhhcyhtW2FyZ10pICYmIHJlcy5zZXQobVthcmddLCAxKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAhcmVzLmhhcyhtKSAmJiByZXMuc2V0KG0sIDEpOwogICAgfQogIH0pOwp9OwoKLy8g5Y676Zmk5pWw57uE5Lit55qE56m65a2X56ym5Liy6YCJ6aG5CkFycmF5LnByb3RvdHlwZS50cmltID0gZnVuY3Rpb24gKCkgewogIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbiAobSkgewogICAgcmV0dXJuIG0gIT09ICcnOwogIH0pOwp9OwoKLy8g5oyJ54Wn5pWw57uE5Lit55qE5oyH5a6aa2V55bCG5pWw57uE6L+b6KGM5YiG57uECkFycmF5LnByb3RvdHlwZS5ncm91cEJ5S2V5ID0gZnVuY3Rpb24gKGtleSkgewogIHZhciByZXMgPSB7fTsKICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgIHZhciBncm91cCA9IHJlc1ttW2tleV1dOwogICAgaWYgKCFncm91cCkgewogICAgICBncm91cCA9IFtdOwogICAgICByZXNbbVtrZXldXSA9IGdyb3VwOwogICAgfQogICAgZ3JvdXAucHVzaChtKTsKICB9KTsKICByZXR1cm4gcmVzOwp9OwoKLy8g5oyJ54Wn5pWw57uE5Lit55qE5oyH5a6aa2V55bCG5pWw57uE6L+b6KGM5YiG57uECkFycmF5LnByb3RvdHlwZS5ncm91cEJ5S2V5ID0gZnVuY3Rpb24gKGtleSkgewogIHZhciByZXMgPSB7fTsKICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKG0pIHsKICAgIHZhciBncm91cCA9IHJlc1ttW2tleV1dOwogICAgaWYgKCFncm91cCkgewogICAgICBncm91cCA9IFtdOwogICAgICByZXNbbVtrZXldXSA9IGdyb3VwOwogICAgfQogICAgZ3JvdXAucHVzaChtKTsKICB9KTsKICByZXR1cm4gcmVzOwp9OwoKLy8g5bCG5pWw57uE5a+56LGh5Lit55qE5p+Q5LiA5Liq5bGe5oCn5YC85Y2V54us5oq95Y+W5Ye65p2l5oiQ5Li65LiA5Liq5paw55qE5pWw57uEICBbe2lkOicxJyxuYW1lOifoi7nmnpwnfSx7aWQ6JzInLG5hbWU6J+mmmeiViSd9XS5leHRyYWN0QnlLZXkoImlkIikgPT0+IFsnMScsJzInXQpBcnJheS5wcm90b3R5cGUuZXh0cmFjdEJ5S2V5ID0gZnVuY3Rpb24gKGtleSkgewogIHZhciBzZXQgPSBuZXcgU2V0KCk7CiAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uIChtKSB7CiAgICBpZiAoa2V5ICYmIG1ba2V5XSkgewogICAgICBzZXQuYWRkKG1ba2V5XSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIEFycmF5LmZyb20oc2V0KTsKfTsKCi8qKg0KICog5pel5pyf5qC85byP5YyW44CCDQogKiDml6XmnJ/moLzlvI/vvJoNCiAqIHl5eXnvvIx5eSDlubTku70NCiAqIE1NIOWkp+WGmeihqOekuuaciOS7vQ0KICogZGQg6KGo56S65pel5pyfDQogKiBoaCDooajnpLrlsI/ml7YNCiAqIG1tIOihqOekuuWIhumSnw0KICogc3Mg6KGo56S656eSDQogKiBxICDooajnpLrlraPluqYNCiAqIOWunuS+i+WmguS4i++8mg0KICogdmFyIG5vdyA9IG5ldyBEYXRlKCk7IA0KICogdmFyIG5vd1N0ciA9IG5vdy5mb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsgDQogKi8KRGF0ZS5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCkgewogIHZhciBvID0gewogICAgIk0rIjogdGhpcy5nZXRNb250aCgpICsgMSwKICAgIC8vbW9udGggCiAgICAiZCsiOiB0aGlzLmdldERhdGUoKSwKICAgIC8vZGF5IAogICAgImgrIjogdGhpcy5nZXRIb3VycygpLAogICAgLy9ob3VyIAogICAgIkgrIjogdGhpcy5nZXRIb3VycygpLAogICAgLy9ob3VyCiAgICAibSsiOiB0aGlzLmdldE1pbnV0ZXMoKSwKICAgIC8vbWludXRlIAogICAgInMrIjogdGhpcy5nZXRTZWNvbmRzKCksCiAgICAvL3NlY29uZCAKICAgICJxKyI6IE1hdGguZmxvb3IoKHRoaXMuZ2V0TW9udGgoKSArIDMpIC8gMyksCiAgICAvL3F1YXJ0ZXIgCiAgICAiUyI6IHRoaXMuZ2V0TWlsbGlzZWNvbmRzKCkgLy9taWxsaXNlY29uZCAKICB9OwogIGlmICgvKHkrKS8udGVzdChmb3JtYXQpKSB7CiAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShSZWdFeHAuJDEsICh0aGlzLmdldEZ1bGxZZWFyKCkgKyAiIikuc3Vic3RyKDQgLSBSZWdFeHAuJDEubGVuZ3RoKSk7CiAgfQogIGZvciAodmFyIGsgaW4gbykgewogICAgaWYgKG5ldyBSZWdFeHAoIigiICsgayArICIpIikudGVzdChmb3JtYXQpKSB7CiAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFJlZ0V4cC4kMSwgUmVnRXhwLiQxLmxlbmd0aCA9PSAxID8gb1trXSA6ICgiMDAiICsgb1trXSkuc3Vic3RyKCgiIiArIG9ba10pLmxlbmd0aCkpOwogICAgfQogIH0KICByZXR1cm4gZm9ybWF0Owp9OwpleHBvcnQgZGVmYXVsdCB1dGlsczs="},null]}