ImportExport
6.0.8
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 6 patch level 8.
Build for OTRS::ITSM 6 patch level 7.
Build for OTRS::ITSM 6 patch level 6.
Build for OTRS::ITSM 6 patch level 5.
Build for OTRS::ITSM 6 patch level 4.
Build for OTRS::ITSM 6 patch level 3.
Build for OTRS::ITSM 6 patch level 2.
Build for OTRS::ITSM 6.
Build for OTRS::ITSM 6 rc1.
Build for OTRS::ITSM 6 beta3.
Build for OTRS::ITSM 6 beta2.
Build for OTRS::ITSM 6 beta1.
The ImportExport package.
Das ImportExport Paket.
El paquete ImportExport.
Az ImportExport csomag.
6.0.x
</br>
<strong>ATTENTION</strong>
</br>
</br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from these tables will be irrevocably lost!
</br>
</br>
((enjoy))</br>
</br>
</br>
<strong>ACHTUNG</strong>
</br>
</br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
</br>
</br>
((enjoy))</br>
</br>
<br/>
<strong>ATENCIÓN</strong>
<br/>
<br/>
Si usted desinstala este paquete, todas las tablas de la base de datos que se crearon durante la instalación
del mismo, se eliminarán. ¡La totalidad de los datos que contenían dichas tablas, se perderá irrevocablemente!
<br/>
<br/>
((enjoy))<br/>
<br/>
</br>
<strong>FIGYELEM</strong>
</br>
</br>
Ha eltávolítja ezt a csomagot, akkor a telepítés során létrehozott összes adatbázistábla törlésre kerül.
Az ezekben a táblákban lévő összes adat visszavonhatatlanul el fog veszni!
</br>
</br>
((enjoy))</br>
</br>
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeInstall();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# discard internally stored object, so that the next access to object creates them newly
$Kernel::OM->ObjectsDiscard(
Objects => [$CodeModule],
ForcePackageReload => 1,
);
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromBefore_2_0_3();
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
$Kernel::OM->Get($CodeModule)->CodeUpgradeFromLowerThan_4_0_91();
2018-06-06 16:17:06
opms.otrs.com
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uWpmXEhISEhIiJMbBYCeJmevuHmASVr13N/ff/To0X//+99d3R3PExsbK62h3u2USiUz4wCPQHQJAICfsKo3AHQjNw8qybq2xjksZWZm9kS1L774Yk9UC6Dbse4SAAA/kW6EOnyKEADA5SIiIhQ2IiIiXN0vALgZkbuEm8sLL7wg/xcAbJG7BACe4tKlS67uAgDgR54UXdLr9YcOHTp16pRWq21ubu7bt+/AgQNHjhw5YcIEPz8/eTfHAwcvvPCC1c6+vr79+/e/5ZZb7r777sDAQKv9TSbT4cOHi4qKqqqqWlpa+vTpM3DgwKFDh44ZM2bQoEEONlpeXv7tt9+eP3++oaHB399/6NChEydOHDJkiCO97cJbAIBOIboEAABuTr34l3j7g+qVQ3Y+j4kunT9//oMPPqivr5dLGhoaGhoazp8/f+DAgUWLFjkSoOmQwWDQarVarfbYsWPLli2zfGCQXq//3//937KyMrmkqamprKysrKwsPz/fwX+O//73v7/66it5/nl9fX1RUVFRURH/mgHATZhMJkF0CQAAwNP0+uiYmw/NM6JLZWVl77zzjtFojIyMvPvuu4cMGeLv79/U1HThwoUDBw5oNJp33nnn17/+dXR0tGjrjHf4l5DfamhoKCsr+/zzz2tqavbu3fvAAw/I+/z73/8uKysLCAi45557br311sDAQIPBcPny5XPnzhUVFTkyioKCgn//+99eXl6TJ08eN25caGhoc3NzaWnpt99+6/ipcPN/TwDg6chdAgAA6JW4m+5RHhBdMhqNH330kdFovPPOO+fMmSOvtBoYGDh69OhRo0b961//OnLkyIcffrh8+XJvb+8baSsgIGDUqFH9+vV76623SktLLd86fvy4EGLBggUjRoyQSry9vaOjo6Ojo6dOndphzQ0NDXv27BFCzJ49e9y4cXJzt99+++23334jfQYAdCOiSwAAdBej0XiDN2gAPIUHRJe+//57nU4XFhY2e/Zs24f4eHl5zZ49W6PRSNPZ7rzzzhtvUVpEqaWlxbKwrq5OCBETE9O1Oo8eParX62NiYuTQUk+QYrF//OMfDx8+XFhYePnyZYPB8Mc//lEIodFojhw58sMPP9TU1CgUipCQkJEjR06ZMsXf39+2hhdeeOHIkSMFBQVardbLyysmJiYxMVE6LUePHpXKzWZzTExMUlKS7ZpTNTU1arX67NmztbW1Pj4+KpVq0qRJo0aNknf47//+b51O99hjj6lUKqkkLy/v6NGjQog77rhj/vz5UuHFixezs7NDQ0PT09PlY8vKytRqdVlZWVNTk7+//+DBgydPniylrTlyHmy1tLR8/PHHJSUlXl5eKSkpEydO7ORZB9CrEF0CcHNSKBTy6g29Rl5eXmpqamBg4B133LFv3z5Xd8eNSF9z3fsXf/7559euXSu9NpvN5eXldXV1qampx44dk/fZv3//m2++2dDQ8M9//tPX13fr1q3SlX975VbVwvlu/PZQvjUrLCw8fPjw5cuXFQpFVFTUlClThg8fbtXcjdzryXlJlglKnU1W+uSTTw4dOhQcHPzoo49aLsRcX1//5ptv1tbWTpgw4f777/fEoTmBB0SXSkpKhBAJCQnthb29vb0nTZr0ySeflJSUdEt06eLFi0KI4OBgy8KgoKCrV6+eOXNm9OjRXajz7NmzQoixY8feePc69Omnnx46dMiqcNOmTZably9fvnz5cnFx8W9/+9t+/fpZ7bxr1y7L+XqnT58+f/78b3/724KCgu+++04uP3v2bHl5+WOPPaZUKi0Lt27dqtfrpc3W1tZz586dO3fu5z//+b333isVDh8+vLCw8Ny5c3J06dy5c1YvhBBS+tiwYcPkkoKCgp07d1ouXFVcXHzixIn7779//PjxjpwHKzU1Ne+9915VVVW/fv0efPBBy7YA3JxsrwacwGw2V1ZWent7h4WFEdgC0KNUKpV0rWulU4GGxsZG2wvInhYUFCT93Ou41NRUyziFc3Shn85nNpu79+vm9OnTNTU18uaxY8dKS0vnzp1rtYTIo48+evDgQWlxW7VanZycLK2r2165EKKmpqa0tNQl386Q3cjtoWTnzp0FBQXyZmlp6blz52bOnGn503633+t1QUpKSlVV1YULF7Zt2/arX/1KCkEYjcatW7fW1tYOHjw4JSXFQ4fmBB4QXaqoqBDXhxhsSe9Ke96IxsbG8+fPf/7550IIqwlrY8eOzc/P//jjj8+ePTty5MioqKiAgADHa66qqhJCxMTEHD9+XK1WV1VVeXt7h4eHjxs37s477+zeD/fDhw9Pnjw5Li5OqVTK2V5Dhw4dP3784MGDAwMD9Xp9RUXF3r17NRpNfn7+9OnTrWooKCi4++674+LigoODL126tH37dq1W++6779bW1tqW5+fnz507VzqwtrZ227Zter3+9ttvnzx58oABA5qamo4fP75v3779+/ePGDFCWnx92LBhUnRp8uTJQojLly/X1tYGBgaazeba2trLly8PHDhQXIs0yX/6ysrKXbt2mc3mcePGTZkypX///jqdLj8//8iRIzt37oyJiQkPD+/wPFj64Ycftm3b1tjYGB4e/stf/tJyEXcAcCaTySRdRlt9jgFAt6usrLQq2blz56xZs4RFgEm6NH311VdXr179+eefnzhx4r/+67/eeeed+fPna7XamTNnHjp0KDw8/MEHH3zllVekMFN4eHhra2t1dbUQQqlU+vr6Xrp0Sa7qiy+++OUvfzl48OCPPvpIuho0GAz/7//9v7y8PLPZPG/evLVr10rPgJb2r6mpefrpp7dt2/a73/1u/fr1Up319fXyNXOHsbAhQ4ZcuHBBCLFgwQLLQzrVrp3zIIRYvnz57t27y8vLJ0+evGrVqnvuuafDfsbHxwshLO/G22R1uNVmm+22d96am5ufffbZ999/38vLa926dX/+859PnTolN7R37960tLSqqirLGFyn6pdt2rQpOTlZ3hw7dmybP6u3tLTIl9yTJ09uaGiwXy6ESExMzM7Ofvnll+2fNPSoLt8eWtYwfvz4u+++OyQk5OrVq19//XVhYeFnn302dOjQsLAw0R33evIT4W8kqcfb2zs1NfXNN9+8cOHCzp07Z8+eLYT49NNPy8rKQkJCUlNTbVNePGVoTtDGLbe7aWxsFDaZRFakd6U9u+CFa1555ZWtW7fqdLrbb7/95z//ueU+06ZNu+OOO1pbWw8fPvyPf/xj/fr1r776qhRscqSJpqYmIURRUdEHH3yg0WgMBkNzc/OFCxe2b9/+wQcfOP5j0Qs2bPeZOHFicnLywIEDLUMqS5cuvf3220NCQry9vf39/UeMGLFo0SIhhOUXjOzuu+9OSkoaMGCAr69vdHT0zJkzhRA6na7Ncstso2+++aalpeWOO+544IEHVCqVn59fSEjI5MmT77vvPmHxVSoFjM6fP280GoVFFEkqlzaNRuP58+eFRXTp22+/NZlMsbGxc+fOHTBggLe394ABA+bNm3fLLbcYjcZvvvnGkfMgO3To0DvvvNPY2Dhy5Eir5wMCgJNJH4ZtflgBQE+bOXOm1bWotGk0Gjdv3jxr1qyioqLN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i2NjY1tbW99///1jx47dyMAB4EYwMw5Ab2WV/oPeKjY21moJnu6iVCqZGdcLWN3E7dixo6SkxPImrlvu9aR0of/7v/9zPBJtq7KyUrpJl54EFxMTk5SUZDab//nPf1o9ddHjhtbTPCB3SQgRExOTlpa2bdu2iooKKZpjKSAg4MEHH4yJienGFm+77bbQ0NArV66UlJRIEUqtVqvVaqWl9Wy7N23aNPsVKhSKhQsXvvXWW/X19Xl5eZZv3XHHHdLy3j1n2rRp//jHP86cOSM9000SHx//3XffdW9DQUFBDz300NatW0tKSqQpb3YMHz5citdGRETID3cMCAgIDw+XflWzXNJbCDFo0KCUlJSdO3cePnzY8pcfhUIxc+ZMKYLWKT4+PqmpqR988MHJkyc//vjjlpYWz12fH0C3MBgMNTU10pNindku0SUAvRXrMd88MjMze6LaF198sSeqhZNNnDixoKDA6iZuxowZ8lzdbrnXGz16dH5+/mefffbZZ59JJVbLeLe3qrdcrtfrP/zww9bW1vHjx//sZz+TChMSEi5cuFBcXLxt27bf/OY3VlOC3GRo7sAzoktCiCFDhqSnpx86dKikpESr1TY3N/ft2zcsLCw2NnbChAndnh7m5eV111137dy588CBA1J06fHHHz958uT58+erqqqkZ5/169cvIiJizJgxd9xxhyO3BEql8j//8z/z8/NLSkpqa2t9fX0HDRo0fvz47prQZ8ett9760EMP7d+//+LFi15eXmFhYePHj4+Li+v26JIQIjo6+ve//730l7p8+bL0pIwBAwbceuutVhleMTExUoKfVRRp+PDhly5d8vHxsUodFEJMnDgxIiLi4MGDFy5caGpq8vf3Hzx48OTJk7scW/T29l60aNFHH310/PjxTz75pLm52fZRkQBuHgaD4erVq9KnljPbJboEAF0QEREhLVxiSf6dEoD7mDlzZnh4eGFh4eXLlxUKRVRU1JQpU0aMGGG5z43f6/3iF78wm83FxcVXr15tb9Vm+z799NPLly+Hh4fPmDHDsnzu3LmXLl2qrKz89NNP586d64lDc4IbeiIpAAC9iV6vr62t9fHx6aH0/vZcvHixvr4+PDxcXgAS6Ky4uLijR4+67RUnXCI/Pz89Pb2wsNDVHQF6SkJCQmZmZmJioqs7gnZJKTZumGhz43rx0LrGY3KX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fX19FotlWKdcvHjRuzEAgLdEqR0AAHgoKipKr9c3NTVdffXV9vFHO3fufOWVV8aMGSOE2LZt23XXXffkk08qu5555hn7N34DnutosLzAiy+++Nprr+Xk5Aghnn322W9/+9tXfiFGo3HHjh0lJSV9fX29vb3x8fF5eXm//vWv7Qd88MEHLk4fM2bM1Vdf7XHrp0+fvpKkGAYky7LJZBJCxMXFqR2L91VVVU2ePFntKADAE59//rnSgzn+R698JfDUU09t2rTpzTff7O3tXbRo0e7duxcuXKgc0NzcXFRU9Mknn2RkZNxxxx2//e1vExIShBC5ubn19fU5OTl1dXVCiNGjR587d+6qq646f/68UueJEyfuuOOO+vr6BQsW/P73v09MTFQq7O7uvvfeeysrK00mU15e3r59+5KTkx2DaWtrW7t27YEDB+6+++5nnnlGCHHNNdfU1taKr47pdv01xpDXJYRYsWLFn/70p9TU1C1btixatMjxxAGDd31dA95e+1l79+594oknTp48KYTYt2+fEkZPT8+aNWsOHDgwZsyYP/7xjxMnThzyugAEJsYuAQhWr7zyytGjR6dMmTJ+/Hj7MKJz585NnDhRkiRJkkaOHHnhwgX78Y4pmAHPdZSVlTVgzqW+vn7s2LHK9jXXXOO4S6/XDzjcaUi9vb3t7e1Wq9X+vMhymAhk3/rWt4qKitSOAgA8MWnSpP6ZC6XEarXu3r37e9/73n/913/t3LmzuLjYfsC6deu2bdtmNptra2tnz569bt06pbyuru7MmTM/+MEPDAaDzWYrKSmpq6s7f/68vc5jx44dPXq0o6Nj6tSpDz/8sL3CjRs3bty48fz5842NjevWrdu4caNTMN///vdvuukmvV6vpJaEEGfOnFF2yQ5cX+yQ1yWEeO655xoaGl588cUf/ehHTicOGLzr6xrw9trPevPNNw8ePGgymfbt22cPY/369TqdrqGhoaKi4siRI4LUEhC8ZAAIbHFxcUajUdlWBoQ77rXZbG+88cbIkSOVjxMmTPjyyy/7VzJgd+d0rqM77rhjz549/U//2te+duLECWW7qqrKsdrdu3cvWbLE7cty1traunHjxoSEhJiYmNTU1J6eHo+rgupsNltNTU1NTY3ValU7FoSLBx98MD09Xe0oAP/Jysqqqanx7Nz+TwX2EiGEzWZzOsbpt02d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vf/++8OHD3/33XeVU1u3bi0tLd29e3d7e/vu3btLS0u3b9+uXjVq1Kjdu3d7PJ64u3esp6NgMDhlypSXXnpJefniiy9OnTo1GAz2dklIDysMAQAAAAAYEtRthiRJ+vjjj6+++mqlvbGxsaCg4JNPPhk7dqzactlll507d07pvH379ltuuUU5tW3btp/97GcffPCBEOLaa69dsmTJbbfdppwqLy9/9tln//jHPypX7d27d+rUqR3vHtvSsUi1T0NDw7XXXvurX/1KCDF//vw//elPBQUF6oW9VBLSw/sIAAAAAMCQEJsuRSIRnU4Xe6pji9q5paUlOztbaW9paRk5cqSybs7pdJ48eTInJ0c9dfHFFzc3NytX+Xy+jIyMjgMmaYnzySefzJ8/32AwvP7662ry1aslIT3suwQAAAAAwJATGyQlajlPsTlOev785z87HI5AIHD27Nl+UhI6RboEAAAAAACS2bdvn3r84YcffvWrX1WOL7vssr1798ae+spXvpJoEIPBEIlEUr/pp59++uMf//jtt99+6623vvvd7548eVLzkpAI6RIAAAAAAEjmkUce+fDDD91u9wcffPC9733vhz/8odL++OOPP/roox988IF6aunSpYkGGT58+HvvvReNRlO5o8fjmTdv3s9+9rOLL754/Pjx/+///b+5c+f6/X4NS0ISrDAEAAAAAGBIiN1KqcstkGI7v/zyy2vXrj1z5kxZWdmTTz65aNEitdu6deuUUyNGjFi6dOl3vvOdRANu3br18ccfP3v2bCQSUUfuWKRy6r777tPr9a+88orafvfdd1sslk2bNvVqSUgP6RIAAAAAAEioH2593Q9LGuJYGQcAAAAAAID0kS4BAAAAAAAgfcwlAwAAAAAAQPqYuwQAAAAAAID0kS4BAAAAAAAgfaRLAAAAAAAASB/pEgAAAAAAANJHugQAAAAAwJBz5syZyspK5djtdp8+fVo5DgQCTU1NQgiPx1NVVVVVVVVXVxd7YWznpqamo0ePJhm50w4YfPjOOAAAAAAAhpbt27f//e9/b25uvvDCC+fOnfv973//iiuuMJvNt95663/+5382NjZu27bt448//p//+R+fz3fw4MGdO3cqF9bW1qqdr7/++pUrV06aNOnkyZPr1q3rOPLkyZM7dsCgRLoEAAAAAMBQ1N7e/uCDD06aNGnMmDH/9m//NmfOnK1btwohbrvttm3btil9fvnLXxoMhrvuukt5+eKLL6qdFy9efOLEiQULFjz00EO/+tWvOo589913J+qAQYaVcQAAAAAADDmyLD/xxBNLlixpbGzMz89P1K28vHz27NmnTp36+OOPfT5fbOexY8ceOHDg0UcfnTVrltohduTYDn30VNAI6RIAAAAAAEPO448/fscdd1x55ZUlJSU1NTVCCEmS4vqcOHGitLQ0IyOjpqbm6NGjfr8/tvOmTZu+//3vv/7661u3blU7xI4c26HvHxB9yaB1AQAAAAAAoE/94he/2LNnTyAQOHTo0De/+c0HHnjgD3/4w80339zc3LxixYq///3vzzzzzLJly1555ZVvfetbQogpU6ZMmTJFCDF37ly185gxY9asWTNq1KgLLrhA7RA78owZM9QO2j4vehv7LgEAAAAAMKTJsuz3+y0WS3c7h8Nhn89nt9sTde6yAwaH/w/RBIPnLF0HVwAAAABJRU5ErkJggg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkZyYW1ld29yayI+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5JbXBvcnRFeHBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5JbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGl0bGUiIFRyYW5zbGF0YWJsZT0iMSI+SW1wb3J0L0V4cG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hdkJhck5hbWUiPkFkbWluPC9JdGVtPgogICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZG1pbkltcG9ydEV4cG9ydCMjIzAwMS1JbXBvcnRFeHBvcnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TG9hZGVyIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6TG9hZGVyPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNTUyI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkltcG9ydEV4cG9ydC5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5JVFNNLkFkbWluLkltcG9ydEV4cG9ydC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpOYXZpZ2F0aW9uIyMjQWRtaW5JbXBvcnRFeHBvcnQjIyMwMDEtSW1wb3J0RXhwb3J0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1haW4gbWVudSBpdGVtIHJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpNYWluTWVudTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxEZWZhdWx0SXRlbSBWYWx1ZVR5cGU9IkZyb250ZW5kTmF2aWdhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok5hdmlnYXRpb25Nb2R1bGUjIyNBZG1pbkltcG9ydEV4cG9ydCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BZG1pbiBhcmVhIG5hdmlnYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6QWRtaW5PdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyOjpNb2R1bGVBZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5JbXBvcnQvRXhwb3J0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+QWRtaW5pc3RyYXRpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5NYW5hZ2UgaW1wb3J0IGFuZCBleHBvcnQgb2Ygb2JqZWN0cy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25CaWciPmZhLWFycm93cy1oPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uU21hbGwiPjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24jIyNDU1YiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Rm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6SW1wb3J0RXhwb3J0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5DU1Y8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3NfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0ltcG9ydC9FeHBvcnQgU3Byw6F2YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ1phaMOhaml0IEltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdaYWjDoWppdCBFeHBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDMgb2YgNSAtIEVkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ09tZXppdCBFeHBvcnQgdnlobGVkw6F2w6Fuw61tJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFjZSBvIEltcG9ydHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdaZHJvam92w70gU291Ym9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnWsOhem5hbcWvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICfDmnNwxJvFoW7Emyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdEdXBsaWNpdG7DrSBqbcOpbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZGVkIFRlbXBsYXRlSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnT2RkxJtsb3ZhxI0gU2xvdXBjxa8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWzDoXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU3TFmWVkbsOtayAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRHZvanRlxI1rYSAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1RlxI1rYSAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdabmFrb3bDoSBzYWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnU2xvdXBlYyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGFfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0ltcG9ydC9Fa3BvcnQgc3R5cmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ1N0YXJ0IGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdTdGFydCBla3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDMgb2YgNSAtIEVkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0JlZ3LDpm5zIGVrcG9ydCBwci4gc8O4Z25pbmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0IGluZm9ybWF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnS2lsZGUgZmlsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1NlbWlrb2xvbiAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnS29sb24gKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW5rdHVtICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ1RlZ25zw6Z0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnS29sb25uZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRWtwb3J0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0ltcG9ydC9FeHBvcnQtVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnRXJzdGVsbGVuIGVpbmVyIFZvcmxhZ2UgenVtIEltcG9ydGllcmVuIHVuZCBFeHBvcnRpZXJlbiB2b24gT2JqZWt0LUluZm9ybWF0aW9uZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0ltcG9ydCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0V4cG9ydCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdTY2hyaXR0IDEgdm9uIDUgLSBBbGxnZW1laW5lIEluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ05hbWUgd2lyZCBiZW7DtnRpZ3QhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYmpla3QgaXN0IGVyZm9yZGVybGljaCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ0Zvcm1hdCBpc3QgZXJmb3JkZXJsaWNoISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnU2Nocml0dCAyIHZvbiA1IC0gT2JqZWt0LUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDMgb2YgNSAtIEVkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnU2Nocml0dCAzIHZvbiA1IC0gRm9ybWF0aW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHJlcXVpcmVkISd9ID0gJ3dpcmQgYmVuw7Z0aWd0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ1NjaHJpdHQgNCB2b24gNSAtIE1hcHBpbmctSW5mb3JtYXRpb25lbiBiZWFyYmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdLZWluZSBNYXBwaW5nLUVsZW1lbnRlIGdlZnVuZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnTWFwcGluZy1FbGVtZW50IGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNSBvZiA1IC0gRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdTY2hyaXR0IDUgdm9uIDUgLSBTdWNoLUluZm9ybWF0aW9uZW4gYmVhcmJlaXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0V4cG9ydCBwZXIgU3VjaGUgZWluc2NocsOkbmtlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnQtSW5mb3JtYXRpb25lbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ1F1ZWxsLURhdGVpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnRGF0ZW5zw6R0emUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ0VyZm9sZ3JlaWNoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ0RvcHBlbHRlIE5hbWVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnWnVsZXR6dCB2ZXJhcmJlaXRldGUgWmVpbGUgZGVyIEltcG9ydC1EYXRlaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnS2VpbiBCYWNrZW5kIGbDvHIgZGFzIE9iamVrdCB2ZXJmw7xnYmFyISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICdLZWluIEJhY2tlbmQgZsO8ciBkYXMgRm9ybWF0IHZlcmbDvGdiYXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICdWb3JsYWdlIG5pY2h0IHZlcmbDvGdiYXIhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJ0RlaSBWb3JsYWdlIGtvbm50ZSBuaWNodCBlcnN0ZWxsdCBvZGVyIGFrdHVhbGlzaWVydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ0RpZSBJRCBkZXIgVm9ybGFnZSB3aXJkIGJlbsO2dGlndCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ0ZlaGxlciBhdWZnZXRyZXRlbi4gSW1wb3J0aWVyZW4gdW5tw7ZnbGljaCEgRsO8ciBEZXRhaWxzIHNpZWhlIFN5c2xvZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ0ZlaGxlciBhdWZnZXRyZXRlbi4gRXhwb3J0aWVyZW4gdW5tw7ZnbGljaCEgRsO8ciBEZXRhaWxzIHNpZWhlIFN5c2xvZy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJ1ZvcmxhZ2VubGlzdGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAnWmFobCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ1phaGwgZ3LDtsOfZXIgYWxzIE51bGwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJ0dhbnp6YWhsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ0dhbnp6YWhsIGdyw7bDn2VyIGFscyBOdWxsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJ0VsZW1lbnQgZXJmb3JkZXJsaWNoLCBiaXR0ZSBmw7xnZW4gU2llIERhdGVuIGVpbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJ1VuZ8O8bHRpZ2UgRGF0ZW4sIGJpdHRlIGdlYmVuIFNpZSBlaW4gZ8O8bHRpZ2VzICVzIGVpbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgbm90IGZvdW5kISd9ID0gJ0Zvcm1hdCBuaWNodCBnZWZ1bmRlbiEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU3BhbHRlbnRyZW5uZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhdG9yIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdTZW1pY29sb24gKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0RvcHBlbHB1bmt0ICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVua3QgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJ0tvbW1hICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnWmVpY2hlbnNhdHonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ01pdCBTcGFsdGVuw7xiZXJzY2hyaWZ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnU3BhbHRlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnRm9ybWF0LUJhY2tlbmQgTW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBJbXBvcnQvRXhwb3J0IE1vZHVscy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydGllcmVuIHVuZCBFeHBvcnRpZXJlbiB2b24gT2JqZWt0LUluZm9ybWF0aW9uZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIEltcG9ydGFjacOzbi9FeHBvcnRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NyZWFyIHVuYSBwbGFudGlsbGEgcGFyYSBpbXBvcnRhciB5IGV4cG9ydGFyIGluZm9ybWFjaW9uIGRlbCBvYmpldG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0luaWNpYXIgSW1wb3J0YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0luaWNpYXIgRXhwb3J0YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdQYXNvIDEgZGUgNSAtIEVkaXRhciBpbmZvcm1hY2nDs24gY29tw7puJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnwqFTZSByZXF1aWVyZSBOb21icmUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICfCoURlYmUgZXNwZWNpZmljYXIgT2JqZXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnwqFEZWJlIGVzcGVjaWZpY2FyIEZvcm1hdG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdQYXNvIDIgZGUgNSAtIEVkaXRhciBpbmZvcm1hY2nDs24gZGUgb2JqZXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdQYXNvIDMgZGUgNSAtIEVkaXRhciBpbmZvcm1hY2nDs24gZGUgZm9ybWF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICfCoWVzIHJlcXVlcmlkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdQYXNvIDQgZGUgNSAtIEVkaXRhciBpbmZvcm1hY2nDs24gZGUgbWFwZW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ05vIHNlIGVuY29udHJhcm9uIGVsZW1lbnRvcyBkZSBtYXBlby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0HDsWFkaXIgTWFwZW8gZGUgRWxlbWVudG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNSBvZiA1IC0gRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdQYXNvIDUgZGUgNSAtIEVkaXRhciBpbmZvcm1hY2nDs24gZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nDs24gcG9yIGLDunNxdWVkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnRhciBpbmZvcm1hY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdBcmNoaXZvIG9yaWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICdSZXN1bWVuIGRlIGltcG9ydGFjacOzbiBkZSAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnUmVnaXN0cm9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICfDiXhpdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnTm9tYnJlcyBkdXBsaWNhZG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnw5psdGltYSBuw7ptZXJvIGRlIGzDrW5lYSBwcm9jZXNhZGEgZGVsIGFyY2hpdm8gaW1wb3J0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJ8KhTm8gc2UgZW5jb250csOzIG5pbmfDum4gb2JqZXRvIGJhY2tlbmQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJ05vIHNlIGVuY29udHLDsyBuaW5nw7puIGZvcm1hdG8gYmFja2VuZCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJ8KhUGxhbnRpbGxhIG5vIGVuY29udHJhZGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJ8KhTm8gc2UgcHVlZGUgaW5zZXJ0YXIvYWN0dWFsaXphciBsYSBwbGFudGlsbGEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ1NlIG5lY2VzaXRhIElEUGxhbnRpbGxhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnT2N1cnJpw7MgdW4gZXJyb3IhLiBJbXBvc2libGUgaW1wb3J0YXIhIFZlYSBTeXNsb2cgcGFyYSBkZXRhbGxlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ09jdXJyacOzIHVuIGVycm9yIS4gSW1wb3NpYmxlIGV4cG9ydGFyISBWZWEgU3lzbG9nIHBhcmEgZGV0YWxsZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICdMaXN0YSBkZSBwbGFudGlsbGFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJ07Dum1lcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICduw7ptZXJvIG1heW9yIHF1ZSBjZXJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXInfSA9ICdlbnRlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnRW50ZXJvIG1heW8gcXVlIGNlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnRWxlbWVudG8gcmVxdWVyaWRvLCBwb3IgZmF2b3IgaW5zZXJ0YXIgZGF0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICdEYXRvcyBubyB2w6FsaWRvLCBwb3IgZmF2b3IgaW5zZXJ0ZSB1biAlcyB2w6FsaWRvICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgbm90IGZvdW5kISd9ID0gJ8KhRm9ybWF0byBubyBlbmNvbnRyYWRvISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmFkb3IgZGUgQ29sdW1uYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGFkb3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1B1bnRvIHkgQ29tYSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRG9zIHB1bnRvcyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICdDb21hICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnSnVlZ28gZGUgY2FyYWN0ZXJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnSW5jbHVpciBDYWJlY2VyYSBkZSBsYSBDb2x1bW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbHVtbmEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdSZWdpc3RybyBkZSBtw7NkdWxvIGRlIGZvcm1hdG8gYmFja2VuZCBwYXJhIGVsIG3Ds2R1bG8gaW1wb3J0L2V4cG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydGFyIHkgZXhwb3J0YXIgaW5mb3JtYWNpw7NuIGRlIG9iamV0b3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRhci9FeHBvcnRhcic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfTVhfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIEltcG9ydGFjacOzbi9FeHBvcnRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NyZWFyIHVuYSBwbGFudGlsbGEgcGFyYSBpbXBvcnRhciB5IGV4cG9ydGFyIGluZm9ybWFjacOzbiBkZSBvYmpldG9zLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdJbmljaWFyIEltcG9ydGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdJbmljaWFyIEV4cG9ydGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnUGFzbyAxIGRlIDUgLSBFZGl0YXIgbGEgaW5mb3JtYWNpw7NuIGNvbcO6bic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ0VzIHJlcXVlcmlkbyB1biBub21icmUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdFcyByZXF1ZXJpZG8gdW4gb2JqZXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnRXMgcmVxdWVyaWRvIHVuIGZvcm1hdG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdQYXNvIDIgZGUgNSAtIEVkaXRhciBsYSBpbmZvcm1hY2nDs24gZGVsIG9iamV0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDMgb2YgNSAtIEVkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnUGFzbyAzIGRlIDUgLSBFZGl0YXIgbGEgaW5mb3JtYWNpw7NuIGRlIGZvcm1hdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnZXMgcmVxdWVyaWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ1Bhc28gNCBkZSA1IC0gRWRpdGFyIGxhIGluZm9ybWFjacOzbiBkZSBtYXBlbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnTm8gc2UgaGFuIGVuY29udHJhZG8gbWFwYXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdBZ3JlZ2FyIHVuIEVsZW1lbnRvIGRlIE1hcGVvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNSBvZiA1IC0gRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICdQYXNvIDUgZGUgNSAtIEVkaXRhciBpbmZvcm1hY2nDs24gZGUgYsO6c3F1ZWRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBsYSBleHBvcnRhY2nDs24gYSBsYSBiw7pzcXVlZGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYWNpw7NuIGRlIGltcG9ydGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0FyY2hpdm8gRnVlbnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJ1Jlc3VtZW4gZGUgaW1wb3J0YWNpw7NuIHBhcmEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ1JlZ2lzdHJvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnw4l4aXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ05vbWJyZXMgZHVwbGljYWRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ8OabHRpbW8gbsO6bWVybyBkZSBsw61uZWEgcHJvY2VzYWRhIGRlbCBhcmNoaXZvIGEgaW1wb3J0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdBY2VwdGFyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnwqFObyBzZSBlbmNvbnRyw7MgdW4gXCdiYWNrZW5kXCcgcGFyYSBlbCBvYmpldG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJ8KhTm8gc2UgZW5jb250csOzIHVuIFwnYmFja2VuZFwnIHBhcmEgZWwgZm9ybWF0byEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJ8KhTm8gc2UgZW5jb250csOzIGxhIHBsYW50aWxsYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnwqFObyBmdWUgcG9zaWJsZSBpbnNlcnRhci9hY3R1YWxpemFyIGxhIHBsYW50aWxsYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZGVkIFRlbXBsYXRlSUQhJ30gPSAnwqFTZSBuZWNlc2l0YSBcJ1RlbXBsYXRlSURcJyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ0hhIG9jdXJyaWRvIHVuIGVycm9yLiDCoUltcG9zaWJsZSBkZSBJbXBvcnRhcsKhIFJldmlzZSBsYXMgdHJhemFzIGRlbCBzaXN0ZW1hIHBhcmEgb2J0ZW5lciBsb3MgZGV0YWxsZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICdIYSBvY3VycmlkbyB1biBlcnJvci4gwqFJbXBvc2libGUgZGUgRXhwb3J0YXLCoSBSZXZpc2UgbGFzIHRyYXphcyBkZWwgc2lzdGVtYSBwYXJhIG9idGVuZXIgbG9zIGRldGFsbGVzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnTGlzdGEgZGUgUGxhbnRpbGxhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICduw7ptZXJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnbsO6bWVybyBtYXlvciBhIGNlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJ2VudGVybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICdlbnRlcm8gbWF5b3IgYSBjZXJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJ0VsZW1lbnRvIHJlcXVlcmlkbywgcG9yIGZhdm9yIGluc2VydGUgZWwgZGF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJ0RhdG9zIGludsOhbGlkb3MsIHBvciBmYXZvciBvZXN0ZSB1biAlcyB2w6FsaWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnwqFObyBzZSBlbmNvbnRyw7MgZWwgRm9ybWF0byEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU2VwYXJhZG9yIGRlIENvbHVtbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhZG9yIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQdW50byB5IGNvbWEgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0RvcyBQdW50b3MgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW50byAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAnQ29tYSAoLCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0Nvbmp1bnRvIGRlIENhcmFjdGVyZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ0luY2x1aXIgQ2FiZWNlcmEgZGUgQ29sdW1uYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ2FsdW1uYSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdG8gZGVsIG3Ds2R1bG8gYWRtaW5pc3RyYXRpdm8gZGUgcmVnaXN0cm8gcGFyYSBlbCBtw7NkdWxvIGRlIGltcG9ydGFjacOzbi9leHBvcnRhY2nDs24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnRhciB5IGV4cG9ydGFyIGluZm9ybWFjacOzbiBkZSB1biBvYmpldG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRhci9FeHBvcnRhcic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZmFfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ9mF2K/bjNix24zYqiDZiNix2YjYry/Ytdiv2YjYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn2LPYp9iu2Kog2YLYp9mE2KjbjCDYqNix2KfbjCDZiNix2YjYryDZiCDYtdiv2YjYsSDYp9i32YTYp9i52KfYqiDYotio2KzaqdiqJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ9i02LHZiNi5INi52YXZhNuM2KfYqiDZiNix2YjYryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICfYtNix2YjYuSDYudmF2YTbjNin2Kog2LXYr9mI2LEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAn2KLYqNis2qnYqiDZhdmI2LHYryDZhtuM2KfYsiDYp9iz2KohJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICfZgtin2YTYqOKAjNio2YbYr9uMINmF2YjYsdivINmG24zYp9iyINin2LPYqiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDMgb2YgNSAtIEVkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAn2YfbjNqGINi52YbYtdixINmG2q/Yp9i02KrbjCDbjNin2YHYqiDZhti02K8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICfYp9mB2LLZiNiv2YYg2LnZhti12LEg2Ybar9in2LTYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAn2YXYrdiv2YjYr9iz2KfYstuMINi52YXZhNuM2KfYqiDYtdiv2YjYsSDYqNmHINin2LLYp9uMINis2LPYqtis2YgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAn2YjYsdmI2K8g2KfYt9mE2KfYudin2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICfZgdin24zZhCDZhdmG2KjYuSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ9iq2KfbjNuM2K8nOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ9is2K/Yp9qp2YbZhtiv2Ycg2LPYqtmI2YbigIzZh9inJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ9is2K/ZiNmEINiz2KfYsiAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAn2LPZhduMINqp2KfZhNmGICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICfYr9mI2YbZgti32YcgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICfZhtmC2LfZhyAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICfaqdiv2KjZhtiv24wg2KfYt9mE2KfYudin2KonOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICfYs9iq2YjZhic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ9mC2KfZhNio4oCM2KjZhtiv24wg2KvYqNiqINmF2KfamNmI2YQg2KjYsdin24wg2YXYp9qY2YjZhCDZiNix2YjYry/Ytdiv2YjYsSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn2YjYsdmI2K8g2Ygg2LXYr9mI2LEg2KfYt9mE2KfYudin2Kog2KLYqNis2qnYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAn2YjYsdmI2K8v2LXYr9mI2LEnOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZnJfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpb24gZGUgbFwnaW1wb3J0YXRpb24vZXhwb3J0YXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0Nyw6llciB1biBtb2TDqGxlIHBvdXIgaW1wb3J0ZXIgZXQgZXhwb3J0ZXIgbGVzIGluZm9ybWF0aW9ucyBkXCdvYmpldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdEw6ltYXJyZXIgbFwnaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0TDqW1hcnJlciBsXCdleHBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ8OJdGFwZSAxIHN1ciA1IC0gw4lkaXRlciBsZXMgaW5mb3JtYXRpb24gY29tbXVuZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdVbiBub20gZXN0IHJlcXVpcyAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdVbiBvYmpldCBlc3QgcmVxdWlzICEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ1VuIGZvcm1hdCBlc3QgcmVxdWlzICEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ8OJdGFwZSAyIHN1ciA1IC0gw4lkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIGxcJ29iamV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICfDiXRhcGUgMyBzdXIgNSAtIMOJZGl0ZXIgbGVzIGluZm9ybWF0aW9ucyBkdSBmb3JtYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnZXN0IHJlcXVpcyAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnw4l0YXBlIDQgc3VyIDUgLSDDiWRpdGVyIGxlcyBpbmZvcm1hdGlvbnMgZGUgbWFwcGFnZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnQXVjdW4gw6lsw6ltZW50IGRlIG1hcHBhZ2UgdHJvdXbDqS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0Fqb3V0ZXIgdW4gw6lsw6ltZW50IGRlIG1hcHBhZ2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ8OJdGFwZSA1IHN1ciA1IC0gw4lkaXRlciBsZXMgaW5mb3JtYXRpb25zIGRlIHJlY2hlcmNoZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1Jlc3RyZWluZHJlIGxcJ2V4cG9ydGF0aW9uIHBhciByZWNoZXJjaGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYXRpb25zIGRcJ2ltcG9ydGF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnRmljaGllciBzb3VyY2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnSW1wb3J0ZXIgbGUgcsOpc3Vtw6kgcG91ciAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnRW5yZWdpc3RyZW1lbnRzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdSw6l1c3NpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ05vbXMgZW4gZG91YmxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnTnVtw6lybyBkZSBsYSBkZXJuacOocmUgbGlnbmUgdHJhaXTDqWUgZGFucyBsZSBmaWNoaWVyIGRcJ2ltcG9ydGF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICdBdWN1biBvYmpldCAiYmFja2VuZCIgblwnYSDDqXTDqSB0cm91dsOpICEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnQXVjdW4gZm9ybWF0ICJiYWNrZW5kIiBuXCdhIMOpdMOpIHRyb3V2w6kgISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnTW9kw6hsZSBub24gdHJvdXbDqSAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJ0ltcG9zc2libGUgZFwnaW5zw6lyZXIgb3UgbWV0dHJlIMOgIGpvdXIgbGUgbW9kw6hsZSAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ0xcJ0lEIGR1IG1vZMOobGUgZXN0IHJlcXVpcyAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICdVbmUgZXJyZXVyIGVzdCBzdXJ2ZW51ZSwgaW1wb3J0YXRpb24gaW1wb3NzaWJsZSAhIFBvdXIgcGx1cyBkZSBkw6l0YWlscywgY29uc3VsdGV6IGxlIGpvdXJuYWwgZOKAmcOpdsOpbmVtZW50cyBzeXN0w6htZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ1VuZSBlcnJldXIgZXN0IHN1cnZlbnVlLCBleHBvcnRhdGlvbiBpbXBvc3NpYmxlICEgUG91ciBwbHVzIGRlIGTDqXRhaWxzLCBjb25zdWx0ZXogbGUgam91cm5hbCBk4oCZw6l2w6luZW1lbnRzIHN5c3TDqG1lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnTGlzdGUgZGVzIG1vZMOobGVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJ25vbWJyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ25vbWJyZSBwbHVzIGdyYW5kIHF1ZSB6w6lybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnZW50aWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ2VudGllciBwbHVzIGdyYW5kIHF1ZSB6w6lybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICfDiWzDqW1lbnQgcmVxdWlzLCB2ZXVpbGxleiBlbnRyZXIgZGVzIGRvbm7DqWVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAnRG9ubsOpZXMgaW52YWxpZGVzLiBWZXVpbGxleiBpbnPDqXJlciB1bmUgJXMgdmFsaWRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnRm9ybWF0IG5vbiB0cm91dsOpICEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnU8OpcGFyYXRldXIgZGUgY29sb25uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0aW9uIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQb2ludCB2aXJndWxlICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEZXV4IHBvaW50cyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1BvaW50ICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICdWaXJndWxlICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnSmV1IGRlIGNhcmFjdMOocmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICdJbmNsdXJlIGxlcyBlbi10w6p0ZXMgZGUgY29sb25uZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ29sb25uZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0VucmVnaXN0cmVtZW50IGR1IG1vZHVsZSAiRm9ybWF0IGJhY2tlbmQiIHBvdXIgbGUgbW9kdWxlIGRcJ2ltcG9ydGF0aW9uL2V4cG9ydGF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnRlciBldCBleHBvcnRlciBkZXMgaW5mb3JtYXRpb25zIGRcJ29iamV0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRlci9FeHBvcnRlcic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Z2xfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ1hlc3Rpw7NuIGRhIGltcG9ydGFjacOzbi9leHBvcnRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NyZWFyIHVuIG1vZGVsbyBwYXJhIGltcG9ydGFyIGUgZXhwb3J0YXIgYSBpbmZvcm1hY2nDs24gc29icmUgb3Mgb2J4ZWN0b3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0luaWNpYXIgYSBpbXBvcnRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnSW5pY2lhciBhIGV4cG9ydGFjacOzbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnUmVxdcOtcmVzZSB1biBub21lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnUmVxdcOtcmVzZSB1biBvYnhlY3RvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnUmVxdcOtcmVzZSB1biBmb3JtYXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnRSBuZWNlc2FyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdFbGVtZW50b3MgZG8gbWFwYSBub24gYXRvcGFkb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0VuZ2FkaXIgZWxlbWVudG8gZGUgbWFwZW8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1Jlc3RyaW54aXIgYSBleHBvcnRhY2nDs24gZGEgYnVzY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYWNpw7NuIGRlIGltcG9ydGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnRmljaGVpcm8gb3JpeGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICdSZXhpc3Ryb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ0NvcnJlY3RvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ05vbWVzIGR1cGxpY2Fkb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICdOw7ptZXJvIGRhIGRlcnJhZGVpcmEgbGnDsWEgcHJvY2VzYWRhIGRvIGFycXVpdm8gaW1wb3J0YXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdBY2VwdGFyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgbm90IGZvdW5kISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmFkb3IgZGUgY29sdW1uYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhY2nDs24gKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1B1bnRvIGUgY29tYSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnRG91cyBwdW50b3MgOic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVudG8gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnQ29ueHVudG8gZGUgY2FyYWN0ZXJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnSW5jbHXDrXIgYXMgY2FiZWNlaXJhcyBkYXMgY29sdW1uYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ29sdW1uYSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ03Ds2R1bG8gZGUgcmV4aXN0cm8gZG8gZm9ybWF0byBkZSBiYWNrZW5kIHBhcmEgbyBtw7NkdWxvIGltcG9ydGFyL2V4cG9ydGFyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbmZvcm1hY2nDs24gcGFyYSBpbXBvcnRhciBlIGV4cG9ydGFyIG8gb2J4ZXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRhY2nDs24vRXhwb3J0YWNpw7NuJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aHVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0ltcG9ydMOhbMOhcy9leHBvcnTDoWzDoXMga2V6ZWzDqXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ1NhYmxvbiBsw6l0cmVob3rDoXNhIG9iamVrdHVtaW5mb3Jtw6FjacOzayBpbXBvcnTDoWzDoXPDoWhveiDDqXMgZXhwb3J0w6Fsw6Fzw6Fob3ouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0ltcG9ydMOhbMOhcyBpbmTDrXTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0V4cG9ydMOhbMOhcyBpbmTDrXTDoXNhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcxLiBsw6lww6lzIGF6IDUtYsWRbCAtIGvDtnrDtnMgaW5mb3Jtw6FjacOzayBzemVya2VzenTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnQSBuw6l2IGvDtnRlbGV6xZEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdBeiBvYmpla3R1bSBrw7Z0ZWxlesWRISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnQSBmb3Jtw6F0dW0ga8O2dGVsZXrFkSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJzIuIGzDqXDDqXMgYXogNS1ixZFsIC0gb2JqZWt0dW1pbmZvcm3DoWNpw7NrIHN6ZXJrZXN6dMOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJzMuIGzDqXDDqXMgYXogNS1ixZFsIC0gZm9ybcOhdHVtaW5mb3Jtw6FjacOzayBzemVya2VzenTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHJlcXVpcmVkISd9ID0gJ2vDtnRlbGV6xZEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnNC4gbMOpcMOpcyBheiA1LWLFkWwgLSBsZWvDqXBlesOpc2kgaW5mb3Jtw6FjacOzayBzemVya2VzenTDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdOZW0gdGFsw6FsaGF0w7NrIHTDqXJrw6lwZWxlbWVrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnTGVrw6lwZXrDqXNpIGVsZW1layBob3p6w6FhZMOhc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJzUuIGzDqXDDqXMgYXogNS1ixZFsIC0ga2VyZXPDqXNpIGluZm9ybcOhY2nDs2sgc3plcmtlc3p0w6lzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0V4cG9ydMOhbMOhcyBrb3Jsw6F0b3rDoXNhIGtlcmVzw6lzZW5rw6ludCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnTDoWzDoXNpIGluZm9ybcOhY2nDs2snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdGb3Jyw6FzZsOhamwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnJXMgaW1wb3J0w6Fsw6FzaSDDtnNzemVnesOpc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ1Jla29yZG9rJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdTaWtlcmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ05ldmVrIGtldHTFkXrDqXNlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnQXogaW1wb3J0ZsOhamwgdXRvbHPDsyBmZWxkb2xnb3pvdHQgc29yc3rDoW1hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT0snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICdOZW0gdGFsw6FsaGF0w7Mgb2JqZWt0dW0taMOhdHTDqXJwcm9ncmFtISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICdOZW0gdGFsw6FsaGF0w7MgZm9ybcOhdHVtLWjDoXR0w6lycHJvZ3JhbSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJ1NhYmxvbiBuZW0gdGFsw6FsaGF0w7MhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJ05lbSBsZWhldCBiZXN6w7pybmkgdmFneSBmcmlzc8OtdGVuaSBhIHNhYmxvbnQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ1NhYmxvbi1hem9ub3PDrXTDsyBzesO8a3PDqWdlcyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ0hpYmEgdMO2cnTDqW50LiBBeiBpbXBvcnTDoWzDoXMgbGVoZXRldGxlbiEgTsOpenplIG1lZyBhIHJlbmRzemVybmFwbMOzdCBhIHLDqXN6bGV0ZWvDqXJ0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnSGliYSB0w7ZydMOpbnQuIEF6IGV4cG9ydMOhbMOhcyBsZWhldGV0bGVuISBOw6l6emUgbWVnIGEgcmVuZHN6ZXJuYXBsw7N0IGEgcsOpc3psZXRla8OpcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICdTYWJsb25saXN0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICdzesOhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ251bGzDoW7DoWwgbmFneW9iYiBzesOhbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnZWfDqXN6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ251bGzDoW7DoWwgbmFneW9iYiBlZ8Opc3onOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnRWxlbSBzesO8a3PDqWdlcywgc3rDunJqb24gYmUgYWRhdG9rYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICfDiXJ2w6lueXRlbGVuIGFkYXRvaywgZWd5IMOpcnbDqW55ZXMgJXMgYmVzesO6csOhc2Egc3rDvGtzw6lnZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICdGb3Jtw6F0dW0gbmVtIHRhbMOhbGhhdMOzISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdPc3psb3BlbHbDoWxhc3p0w7MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWzDoXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUG9udG9zdmVzc3rFkSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnS2V0dMWRc3BvbnQgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQb250ICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICdWZXNzesWRICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnS2FyYWt0ZXJrw6lzemxldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnT3N6bG9wZmVqbMOpY2VrIGZlbHbDqXRlbGUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnT3N6bG9wJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnRm9ybcOhdHVtIGjDoXR0w6lycHJvZ3JhbSBtb2R1bCByZWdpc3p0csOhY2nDsyBheiBpbXBvcnTDoWzDoXMvZXhwb3J0w6Fsw6FzIG1vZHVsaG96Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnT2JqZWt0dW1pbmZvcm3DoWNpw7NrIGltcG9ydMOhbMOhc2Egw6lzIGV4cG9ydMOhbMOhc2EuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnTDoWzDoXMvZXhwb3J0w6Fsw6FzJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aWRfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ01hbmFqYW1lbiBJbXBvci9Fa3Nwb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0J1YXQgc2VidWFoIHRlbXBsYXRlIHVudHVrIG1lbmdpbXBvciBkYW4gZWtzcG9yIG9ieWVrIGluZm9ybWFzaS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnTXVsYWkgSW1wb3InOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnTXVsYWkgRWtzcG9yJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdOYW1hIGRpYnV0dWhrYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYnllayBkaWJ1dHVoa2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnRm9ybWF0IGRpYnV0dWhrYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICdkaWJ1dHVoa2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnVGlkYWsgZGl0ZW11a2FuIGVsZW1lbiBwZXRhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnVGFtYmFoIEVsZW1lbiBQZW1ldGFhbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnQmF0YXMgZWtzcG9yIHBlciBwZW5jYXJpYW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYXNpIGltcG9yICc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0JlcmthcyBTdW1iZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICdEYXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdCZXJoYXNpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdOYW1hIGR1cGxpa2F0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnTm9tb3IgYmFyaXMgdGVyYWtoaXIgYmVya2FzIGltcG9yIHlhbmcgZGlwcm9zZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZGVkIFRlbXBsYXRlSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnUGVtaXNhaCBLb2xvbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWIgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1RpdGlra29tYSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnVGl0aWtkdWEgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdUaXRpayAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdLYXJha3Rlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnU2VydGFrYW4gS2VwYWxhIEtvbG9tJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0tvbG9tJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnRm9ybWF0IG1vZHVsIHBlbmRhZnRhcmFuIGJhY2tlbmQgdW50dWsgbW9kdWwgaW1wb3IvZWtzcG9yLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW5mb3JtYXNpIG9ieWVrIGltcG9yIGRhbiBla3Nwb3IuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvci9Fa3Nwb3InOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6aXRfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpb25lIEltcG9ydGF6aW9uZS9Fc3BvcnRhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NyZWEgdW4gdGVtcGxhdGUgcGVyIGltcG9ydGFyZSBlZCBlc3BvcnRhcmUgbGUgaW5mb3JtYXppb25pIGRlZ2xpIG9nZ2V0dGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0luaXppYSBJbXBvcnRhemlvbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnSW5pemlhIEVzcG9ydGF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnU3RlcCAxIGRpIDUgLSBNb2RpZmljYSBpbmZvcm1hemlvbmkgY29tdW5pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAnSWwgbm9tZSDDqCBvYmJsaWdhdG9yaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdMXCdvZ2dldHRvIMOoIG9iYmxpZ2F0b3JpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ0lsIGZvcm1hdG8gw6ggb2JibGlnYXRvcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnU3RlcCAyIGRpIDUgLSBNb2RpZmljYSBpbmZvcm1hemlvbmkgb2dnZXR0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDMgb2YgNSAtIEVkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAnU3RlcCAzIGRpIDUgLSBNb2RpZmljYSBpbmZvcm1hemlvbmkgZm9ybWF0byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICfDqCBvYmJsaWdhdG9yaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnU3RlcCA0IGRpIDUgLSBNb2RpZmljYSBpbmZvcm1hemlvbmkgbWFwcGF0dXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdOZXNzdW4gZWxlbWVudG8gbWFwcGEgdHJvdmF0by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0FnZ2l1bmdpIHVuIGVsZW1lbnRvIGRpIG1hcHBhdHVyYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ1N0ZXAgNSBkaSA1IC0gTW9kaWZpY2EgaW5mb3JtYXppb25pIGRpIHJpY2VyY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmluZ2VyZSBlc3BvcnRhemlvbmUgcGVyIHJpY2VyY2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0YXJlIGluZm9ybWF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0FyY2hpdmlvIG9yaWdpbmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnSW1wb3J0YSByaWVwaWxvZ28gcGVyICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICdWb2NpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdTdWNjZXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdEdXBsaWNhIGkgbm9taSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ051bWVybyBkZWxsXCd1bHRpbWEgcmlnYSBwcm9jZXNzYXRhIGRlbCBmaWxlIGRhIGltcG9ydGFyZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnTmVzc3VuIG9nZ2V0dG8gZGkgYmFja2VuZCB0cm92YXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICdOZXNzdW4gZm9ybWF0byBkaSBiYWNrZW5kIHRyb3ZhdG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICdNb2RlbGxvIG5vbiB0cm92YXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICdOb24gw6ggcG9zc2liaWxlIGluc2VyaXJlL21vZGlmaWNhcmUgdGVtcGxhdGUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ05lY2Vzc2FyaW8gVGVtcGxhdGVJRCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ0Vycm9yZSByaXNjb250cmF0by4gSW1wb3NzaWJpbGUgaW1wb3J0YXJlISBMZWdnaSBpIFN5c2xvZyBwZXIgdWx0ZXJpb3JpIGRldHRhZ2xpLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnRXJyb3JlIHJpc2NvbnRyYXRvLiBJbXBvc3NpYmlsZSBlc3BvcnRhcmUhIExlZ2dpIGkgU3lzbG9nIHBlciB1bHRlcmlvcmkgZGV0dGFnbGkuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICdMaXN0YSBNb2RlbGxpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJ251bWVybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ251bWVybyBwacO5IGdyYW5kZSBkaSB6ZXJvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXInfSA9ICdpbnRlcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnaW50ZXJvIHBpw7kgZ3JhbmRlIGRpIHplcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnRWxlbWVudG8gcmljaGllc3RvLCBpbnNlcmlzY2kgZGF0aSBnZW50aWxtZW50ZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJ0RhdGkgbm9uIHZhbGlkaSwgaW5zZXJpc2NpIHVuICVzIHZhbGlkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgbm90IGZvdW5kISd9ID0gJ0Zvcm1hdG8gbm9uIHRyb3ZhdG8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NlcGFyYXRvcmUgZGkgY29sb25uYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3JlIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQdW50byBlIHZpcmdvbGEgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0R1ZSBwdW50aSAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1B1bnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICdWaXJnb2xhICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnQ2hhcnNldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnSW5jbHVkaSBsZSBDb2xvbm5lIGRpIEludGVzdGF6aW9uZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdDb2xvbm5hJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnUmVnaXN0cmF6aW9uZSBkZWwgbW9kdWxvIGRpIGJhY2tlbmQgZGVsIGZvcm1hdG8gcGVyIGlsIG1vZHVsbyBkaSBpbXBvcnRhemlvbmUvZXNwb3J0YXppb25lLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW1wb3J0YSBlZCBlc3BvcnRhIGxlIGluZm9ybWF6aW9uaSBzdWxsXCdvZ2dldHRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0YXJlL0VzcG9ydGFyZSc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6amFfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ+OCpOODs+ODneODvOODiC/jgqjjgq/jgrnjg53jg7zjg4jjga7nrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ+OCquODluOCuOOCp+OCr+ODiOOBruOCpOODs+ODneODvOODiOODu+OCqOOCr+OCueODneODvOODiOeUqOOBruODhuODs+ODl+ODrOODvOODiOOCkuS9nOaIkOOBmeOCiyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICfjgqTjg7Pjg53jg7zjg4jplovlp4snOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAn44Ko44Kv44K544Od44O844OI6ZaL5aeLJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICdTdGVwIDEgb2YgNSAtIOWfuuacrOaDheWgseOBruioreWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ+WQjeensOOBr+W/hemgiOOBp+OBmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ+OCquODluOCuOOCp+OCr+ODiOOBr+W/hemgiOOBp+OBmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ+ODleOCqeODvOODnuODg+ODiOOBr+W/hemgiOOBp+OBmSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ1N0ZXAgMiBvZiA1IC0g44Kq44OW44K444Kn44Kv44OI5oOF5aCx44Gu6Kit5a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICdTdGVwIDMgb2YgNSAtIOODleOCqeODvOODnuODg+ODiOaDheWgseOBruioreWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICflv4XpoIjjgafjgZknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdTdGVwIDQgb2YgNSAtIOODnuODg+ODlOODs+OCsOaDheWgseOBruioreWumic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAn44Oe44OD44OU44Oz44Kw6KaB57Sg44GM6KaL44Gk44GL44KK44G+44Gb44KT44Gn44GX44GfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICfjg57jg4Pjg5Tjg7PjgrDopoHntKDjga7ov73liqAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ1N0ZXAgNSBvZiA1IC0g5qSc57Si5oOF5aCx44Gu6Kit5a6aJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAn5qSc57Si44GC44Gf44KK44Gu5Ye65Yqb44KS5Yi26ZmQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ+aDheWgseOCkuOCpOODs+ODneODvOODiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ+OCveODvOOCueODleOCoeOCpOODqyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICclc+OBruOCpOODs+ODneODvOODiOODu+OCteODnuODquODvCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAn44Os44Kz44O844OJJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICfmiJDlip8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAn5ZCN5YmN44GM6YeN6KSH44GX44Gm44GE44G+44GZJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAn6Kqt44G/6L6844G/5riI44G/44OV44Kh44Kk44Or44Gu5pyA57WC5a6f6KGM6KGM5pWwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICfmjIflrprjgZXjgozjgZ/jgqrjg5bjgrjjgqfjgq/jg4jjga7jg5Djg4Pjgq/jgqjjg7Pjg4njgYzopovjgaTjgYvjgorjgb7jgZvjgpPvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAn5oyH5a6a44GV44KM44Gf44OV44Kp44O844Oe44OD44OI44Gu44OQ44OD44Kv44Ko44Oz44OJ44GM6KaL44Gk44GL44KK44G+44Gb44KT77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICfjg4bjg7Pjg5fjg6zjg7zjg4jjgYzopovjgaTjgYvjgorjgb7jgZvjgpPvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAn44OG44Oz44OX44Os44O844OI44Gu5oy/5YWl44O75pu05paw44GM44Gn44GN44G+44Gb44KT77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ+ODhuODs+ODl+ODrOODvOODiElE44Gu5YWl5Yqb44GM5b+F6KaB44Gn44GZ77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICfjgqTjg7Pjg53jg7zjg4jjgYzlh7rmnaXjgb7jgZvjgpPvvIjjgqjjg6njg7zjgYznmbrnlJ/jgZfjgb7jgZfjgZ/jgILoqbPntLDjga/jgrfjgrnjg4bjg6Djg63jgrDjgpLjgZTnorroqo3jgY/jgaDjgZXjgYTvvInvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ+OCqOOCr+OCueODneODvOODiOOBjOWHuuadpeOBvuOBm+OCk++8iOOCqOODqeODvOOBjOeZuueUn+OBl+OBvuOBl+OBn+OAguips+e0sOOBr+OCt+OCueODhuODoOODreOCsOOCkuOBlOeiuuiqjeOBj+OBoOOBleOBhO+8ie+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAn44OG44Oz44OX44Os44O844OI44O744Oq44K544OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJ+aVsOWApCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJzDku6XkuIrjga7mlbDlgKQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJ+aVtOaVsOWApCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcw5Lul5LiK44Gu5pW05pWw5YCkJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJ+ODh+ODvOOCv+OCkuWFpeWKm+OBmeOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJ+eEoeWKueOBquODh+ODvOOCv+OBp+OBmeOAguacieWKueOBqiAlcyDjgpLlhaXlipvjgZfjgabjgY/jgaDjgZXjgYTjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICfmjIflrprjgZXjgozjgZ/jg5Xjgqnjg7zjg57jg4Pjg4jjgYzopovjgaTjgYvjgorjgb7jgZvjgpPvvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAn5qGB44Gu44K744OR44Os44O844K/JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ+OCv+ODliAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAn44K744Of44Kz44Ot44OzICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICfjgrPjg63jg7MgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICfjg4njg4Pjg4goLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAn44Kr44Oz44OeICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAn44Kt44Oj44Op44Kv44K/44K744OD44OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICfjg5jjg4Pjg4Dmg4XloLHjgpLlkKvjgoAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAn5qGBJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnaW1wb3J0L2V4cG9ydOODouOCuOODpeODvOODq+OBruODkOODg+OCr+OCqOODs+ODieODouOCuOODpeODvOODq+OCkueZu+mMsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn44Kq44OW44K444Kn44Kv44OI5oOF5aCx44Gu44Kk44Oz44Od44O844OI44O744Ko44Kv44K544Od44O844OIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICfjgqTjg7Pjg53jg7zjg4gv44Ko44Kv44K544Od44O844OIJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bWtfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ID0gJ0HDsWFkaXIgcGxhbnRpbGxhIGRlIG1hcGVvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdKdWVnbyBkZSBjYXJhY3RlcmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0RvcyBwdW50b3MgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbHVtbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NlcGFyYWRvciBkZSBDb2x1bW5hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW50byAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1B1bnRvIHkgQ29tYSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVGFidWxhZG9yIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICdJbmNsdWlyIENhYmVjZXJhIGRlIGxhIENvbHVtbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAnSW1wb3J0YXIgcmVzdW1lbiBwYXJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICdSZWdpc3Ryb3MgaW1wb3J0YWRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFeHBvcnRlZCByZWNvcmRzJ30gPSAnUmVnaXN0cm9zIGV4cG9ydGFkb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ1JlZ2lzdHJvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTa2lwcGVkJ30gPSAnU2FsdGFkbyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3Rpw7NuIGRlIEltcG9ydGFjacOzbi9FeHBvcnRhY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NyZWFyIHVuYSBwbGFudGlsbGEgcGFyYSBpbXBvcnRhciB5IGV4cG9ydGFyIGluZm9ybWFjaW9uIGRlbCBvYmpldG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0luaWNpYXIgSW1wb3J0YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0luaWNpYXIgRXhwb3J0YWNpw7NuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdFbCBub21icmUgZXMgcmVxdWVyaWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICfCoURlYmUgZXNwZWNpZmljYXIgT2JqZXRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAnwqFEZWJlIGVzcGVjaWZpY2FyIEZvcm1hdG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnwqFlcyByZXF1ZXJpZG8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdObyBzZSBlbmNvbnRyYXJvbiBlbGVtZW50b3MgZGUgbWFwZW8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdBw7FhZGlyIE1hcGVvIGRlIEVsZW1lbnRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnUmVzdHJpbmdpciBleHBvcnRhY2nDs24gcG9yIGLDunNxdWVkYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnRhciBpbmZvcm1hY2nDs24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdBcmNoaXZvIG9yaWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnw4l4aXRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCd9ID0gJ0ZyYWNhc2Fkbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdOb21icmVzIGR1cGxpY2Fkb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICfDmmx0aW1hIG7Dum1lcm8gZGUgbMOtbmVhIHByb2Nlc2FkYSBkZWwgYXJjaGl2byBpbXBvcnRhcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdSZWdpc3RybyBkZSBtw7NkdWxvIGRlIGZvcm1hdG8gYmFja2VuZCBwYXJhIGVsIG3Ds2R1bG8gaW1wb3J0L2V4cG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydGFyIHkgZXhwb3J0YXIgaW5mb3JtYWNpw7NuIGRlIG9iamV0b3MuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnRhci9FeHBvcnRhcic7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bXNfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ1Blbmd1cnVzYW4gSW1wb3J0L0Vrc3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0NpcHRhIHRlbXBsYXQgdW50dWsgaW1wb3J0IGRhbiBla3Nwb3J0IGluZm9ybWFzaSBvYmplay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnTXVsYSBpbXBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnTXVsYSBla3Nwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdOYW1hIGRpa2VoZW5kYWtpISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZWsgYWRhbGFoIGRpcGVybHVrYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYXQgYWRhbGFoIGRpcGVybHVrYW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICdkaXBlcmx1a2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnVGlhZGEgZWxlbWVuIHBldGEgZGl0ZW11aS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ1RhbWJhaCBlbGVtZW4gcGV0YSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnRGlsYXJhbmcgZWtzcG9ydCBwZXIgY2FyaWFuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0luZm9ybWFzaSBpbXBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdTdW1iZXIgZmFpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ1Jla29kLXJla29kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdCZXJqYXlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ01lbnlhbGluIG5hbWEtbmFtYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ05vbWJvciBiYXJpcyB0ZXJha2hpciBkaXByb3NlcyBmYWlsIGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgbm90IGZvdW5kISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdLb2x1bSBwZW1pc2FoJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnU2VtaWtvbG9uICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdUaXRpayBiZXJ0aW5kaWggKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdUaXRpayAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdTZXQga2FyYWt0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ1Rlcm1hc3VrIEtvbHVtIEtlcGFsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdLb2x1bSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdCBiYWNrZW5kIG1vZHVsIHBlbmRhZnRhcmFuIHVudHVrIG1vZHVsIGltcG9ydC9la3Nwb3J0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW5mb3JtYXNpIG9iamVrIGltcG9ydCBkYW4gZWtzcG9ydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9Fa3Nwb3J0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmJfTk9fSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0FkbWluaXN0cmFzam9uIGF2IEltcG9ydC9Fa3Nwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdPcHByZXR0IGVuIG1hbCBmb3Igw6UgZWtzcG9ydGVyZSBvZyBpbXBvcnRlcmUgaW5mb3JtYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnU3RhcnQgaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ1N0YXJ0IGVrc3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ05hdm4gZXIgcMOla3JldmQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYmpla3QgZXIgcMOla3JldmQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYXQgZXIgcMOla3JldmQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICdlciBww6VrcmV2ZCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ0luZ2VuIGVsZW1lbnRlciBmdW5uZXQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdMZWdnIHRpbCBtYXBwaW5nLWVsZW1lbnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0JlZ3JlbnMgZWtzcG9ydCBwZXIgc8O4ayc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnQtaW5mb3JtYXNqb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdLaWxkZWZpbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ1JhZGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdWZWxseWtrZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnRHVwbGlrYXRlIG5hdm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICdTaXN0ZSBwcm9zZXNzZXJ0ZSBsaW5qZW51bW1lciBhdiBpbXBvcnRmaWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZGVkIFRlbXBsYXRlSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnS29sb25uZXNlcGFyYXRvcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ1NlbWlrb2xvbiAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnS29sb24gKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW5rdHVtICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ1RlZ25zZXR0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICdJbmtsdWRlciBrb2xvbm5lb3ZlcnNrcmlmdGVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0tvbG9ubmUnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdCYWtzaWRlbW9kdWwtcmVnaXN0cmVyaW5nIGZvciBmb3JtYXRldCB0aWwgaW1wb3J0L2Vrc3BvcnQtbW9kdWxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW5mb3JtYXNqb24gZm9yIGltcG9ydC0gb2cgZWtzcG9ydC1vYmpla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9Fa3Nwb3J0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6bmxfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0ltcG9ydC9FeHBvcnQgYmVoZWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnSW1wb3J0IHN0YXJ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnRXhwb3J0IHN0YXJ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZWN0IGlzIHZlcnBsaWNodC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ0Zvcm1hYXQgaXMgdmVycGxpY2h0Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnaXMgdmVycGxpY2h0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnR2VlbiBlbGVtZW50ZW4gZ2V2b25kZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0JlcGVyayBleHBvcnQgdG90IHpvZWtvcGRyYWNodCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbXBvcnQtaW5mb3JtYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0Jyb25iZXN0YW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdTdWNjZXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT0snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ0tvbG9tc2NoZWlkaW5nc3Rla2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnUHVudGtvbW1hICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEdWJiZWxlIHB1bnQgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdQdW50ICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0thcmFrdGVyc2V0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnS29sb20nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0ltcG9ydCBlbiBleHBvcnQgb2JqZWN0aW5mb3JtYXRpZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0L0V4cG9ydCc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ1phcnrEhWR6YW5pZSBJbXBvcnRlbS9FeHBvcnRlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnVXR3w7NyeiBzemFibG9uIGRvIGltcG9ydHUgaSBla3Nwb3J0dSBkYW55Y2ggb2JpZWt0w7N3Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdSb3pwb2N6bmlqIGltcG9ydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdSb3pwb2N6bmlqIGVrc3BvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ05hendhIGplc3Qgd3ltYWdhbmEhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYmlla3QgamVzdCB3eW1hZ2FueSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ0Zvcm1hdCBqZXN0IHd5bWFnYW55ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnamVzdCB3eW1hZ2FuYSh5KSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ05pZSB6bmFsZXppb25vIGVsZW1lbnTDs3cgbWFweS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ0RvZGFqIGVsZW1lbnQgbWFwb3dhbmlhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNSBvZiA1IC0gRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdPZ3JhbmljeiBla3Nwb3J0IHByemV6IHd5c3p1a2FuaWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW1wb3J0dWogaW5mb3JtYWNqZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ1BsaWsgxbpyw7NkxYJvd3knOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnUG9kc3Vtb3dhbmllIGltcG9ydHUgZGxhICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICdSZWtvcmR5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdQb3dvZHplbmllJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ0R1cGxpa2F0eSBuYXp3JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnTnIgb3N0YW5pZWogcHJ6ZXR3b3J6b25laiBsaW5paSBwbGlrdSBpbXBvcnRvd2Vnbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgbm90IGZvdW5kISd9ID0gJyc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmF0b3Iga29sdW1ueSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJ1bGF0b3IgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ8WacmVkbmlrICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEd3Vrcm9wZWsgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdLcm9wa2EgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJ1ByemVjaW5layAoLCknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0tvZG93YW5pZSAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ1VtaWXFm8SHIG5hZ8WCw7N3a2kga29sdW1uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0tvbHVtbmEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICdNb2R1xYIgZm9ybWF0b3dhbmlhIGJhY2tlbmQgZGxhIG1vZHXFgnUgaW1wb3J0L2Vrc3BvcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnR1aiBpIGVrc3BvcnR1aiBpbmZvcm1hY2plIG9iaWVrdMOzdy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydC9la3Nwb3J0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZGUgSW1wb3J0YcOnw6NvL0V4cG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnQ3JpYXIgdW0gbW9kZWxvIHBhcmEgaW1wb3J0YXIgZSBleHBvcnRhciBpbmZvcm1hw6fDtWVzIGRlIG9iamV0by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnSW5pY2lhciBJbXBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnSW5pY2lhciBFeHBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ1Bhc3NvIDEgZGUgNSAtIEVkaXRhciBpbmZvcm1hw6fDtWVzIGNvbXVucyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ05vbWUgw6kgb2JyaWdhdMOzcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZXRvIMOpIG9icmlnYXTDs3JpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ08gZm9ybWF0byDDqSBvYnJpZ2F0w7NyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdQYXNzbyAyIGRlIDUgLSBFZGl0YXIgaW5mb3JtYcOnw7VlcyBkbyBvYmpldG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ1Bhc3NvIDMgZGUgNSAtIEVkaXRhciBpbmZvcm1hw6fDtWVzIGRlIGZvcm1hdG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnw6kgb2JyaWdhdMOzcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJ1Bhc3NvIDQgZGUgNSAtIEVkaXRhciBpbmZvcm1hw6fDtWVzIGRlIG1hcGVhbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ07Do28gaMOhIGVsZW1lbnRvcyBtYXBhIGVuY29udHJhZG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdBZGljaW9uYXIgZWxlbWVudG8gZGUgbWFwZWFtZW50byc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnUGFzc28gNSBkZSA1IC0gRWRpdGFyIGluZm9ybWHDp8O1ZXMgZGUgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdSZXN0cmluZ2lyIGV4cG9ydGHDp8OjbyBwb3IgcGVzcXVpc2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnSW5mb3JtYcOnw7VlcyBkZSBpbXBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdBcnF1aXZvIGRlIE9yaWdlbSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICdSZXN1bW8gZGUgaW1wb3J0YcOnw6NvIHBhcmEgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ1JlZ2lzdHJvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnU3VjZXNzbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdOb21lcyBkdXBsaWNhZG9zJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnw5psdGltbyBuw7ptZXJvIGRlIGxpbmhhIHByb2Nlc3NhZGEgZG8gYXJxdWl2byBkZSBpbXBvcmF0YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICdOZW5odW0gb2JqZXRvIGJhY2tlbmQgZW5jb250cmFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnTmVuaHVtIGZvcm1hdG8gYmFja2VuZCBlbmNvbnRyYWRvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnTW9kZWxvIG7Do28gZW5jb250cmFkbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnTsOjbyDDqSBwb3Nzw612ZWwgaW5zZXJpci9hdHVhbGl6YXIgbW9kZWxvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICdOZWNlc3PDoXJpbyBUZW1wbGF0ZUlEISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnT2NvcnJldSB1bSBlcnJvLiBGb2kgaW1wb3Nzw612ZWwgcmVhbGl6YXIgYSBpbXBvcnRhw6fDo28hIFZlcmlmaXF1ZSBvIFN5c2xvZyBwYXJhIG1haXMgZGV0YWxoZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICdPY29ycmV1IHVtIGVycm8uIEZvaSBpbXBvc3PDrXZlbCByZWFsaXphciBhIGV4cG9ydGHDp8OjbyEgVmVyaWZpcXVlIG8gU3lzbG9nIHBhcmEgbWFpcyBkZXRhbGhlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJ0xpc3RhIGRlIG1vZGVsb3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAnbsO6bWVybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ27Dum1lcm8gbWFpb3IgcXVlIHplcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJ2ludGVpcm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnaW50ZWlybyBtYWlvciBxdWUgemVybyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICdFbGVtZW50byBuZWNlc3PDoXJpbywgcG9yIGZhdm9yIGluc2lyYSBvIGRhZG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICdEYWRvIGludsOhbGlkbywgcG9yIGZhdm9yIGluc2lyYSB1bSAlcyB2w6FsaWRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnRm9ybWF0byBuw6NvIGVuY29udHJhZG8hJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NlcGFyYWRvciBkZSBDb2x1bmFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYcOnw6NvIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQb250byBlIFbDrXJndWxhICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb2lzIFBvbnRvcyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1BvbnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICdWaXJndWxhICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnQ29kaWZpY2HDp8OjbyBkZSBDYXJhY3RlcmVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICdJbmNsdWlyIENhYmXDp2FsaG9zIGRlIENvbHVuYXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAnQ29sdW5hJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnRm9ybWF0byBkZSByZWdpc3RybyBiYWNrZW5kIGRvIG3Ds2R1bG8gZGUgaW1wb3J0YcOnw6NvIC8gZXhwb3J0YcOnw6NvIG3Ds2R1bG8uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdJbXBvcnRhciBlIGV4cG9ydGFyIGluZm9ybWHDp8O1ZXMgZGUgb2JqZXRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnSW1wb3J0YcOnw6NvL0V4cG9ydGHDp8Ojbyc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cm9fSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgbWFwcGluZyB0ZW1wbGF0ZSd9ID0gJ+WinuWKoOaYoOWwhOaooeeJiCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAn5a2X56ym6ZuGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ+WGkuWPtyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAn5YiXJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICfliJfliIbpmpTnrKYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ+WPpeWPtyAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ+WIhuWPtyAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnVEFC6ZSuIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnfSA9ICfljIXmi6zliJfmoIfpopgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yJ30gPSAn5a+85YWl5oC757uTJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydGVkIHJlY29yZHMnfSA9ICflr7zlhaXorrDlvZUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXhwb3J0ZWQgcmVjb3Jkcyd9ID0gJ+WvvOWHuuiusOW9lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAn6K6w5b2VJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NraXBwZWQnfSA9ICfot7Pov4fnmoQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluSW1wb3J0RXhwb3J0CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQnfSA9ICflr7zlhaUv5a+85Ye6566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfliJvlu7rmqKHmnb/lr7zlhaXlkozlr7zlh7rlr7nosaHkv6Hmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAn5byA5aeL5a+85YWlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ+W8gOWni+WvvOWHuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAn5ZG95ZCN5piv5b+F6ZyA55qE77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICflr7nosaHmmK/lv4XpnIDnmoTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ+agvOW8j+aYr+W/hemcgOeahO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHJlcXVpcmVkISd9ID0gJ+aYr+W/hemcgOeahO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAn5rKh5pyJ5om+5Yiw5pig5bCE55qE5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICfmt7vliqDmmKDlsITlrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ+aMieaQnOe0oumZkOWItuWvvOWHuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICflr7zlhaXkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICfmupDmlofku7YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ+aIkOWKnyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQnfSA9ICflpLHotKUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAn6YeN5aSN55qE5ZCN56ewJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAn5a+85YWl5paH5Lu25pyA5ZCO5aSE55CG55qE6KGM5pWwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAn56Gu5a6aJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICfkuLrlr7zlhaUv5a+85Ye65qih5Z2X55qE5qC85byP5ZCO56uv5qih5Z2X5rOo5YaM44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICflr7zlhaXlkozlr7zlh7rlr7nosaHkv6Hmga/jgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ+WvvOWFpS/lr7zlh7onOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0dlc3TDo28gZGUgSW1wb3J0YcOnw6NvL0V4cG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnQ3JpYXIgdW0gbW9kZWxvIHBhcmEgaW1wb3J0YXIgZSBleHBvcnRhciBpbmZvcm1hw6fDtWVzIGRlIG9iamV0by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAnSW5pY2lhciBJbXBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAnSW5pY2lhciBFeHBvcnRhw6fDo28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ05vbWUgw6kgb2JyaWdhdMOzcmlvISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZXRvIMOpIG9icmlnYXTDs3JpbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ08gZm9ybWF0byDDqSBvYnJpZ2F0w7NyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICfDqSBvYnJpZ2F0w7NyaW8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnUGFzc28gNCBkZSA1IC0gRWRpdGFyIGluZm9ybWHDp8OjbyBkZSBtYXBlYW1lbnRvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICdOw6NvIGjDoSBlbGVtZW50b3MgbWFwYSBlbmNvbnRyYWRvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnQWRpY2lvbmFyIGVsZW1lbnRvIGRlIG1hcGVhbWVudG8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ1Bhc3NvIDUgZGUgNSAtIEVkaXRhciBpbmZvcm1hw6fDo28gZGUgcHJvY3VyYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1Jlc3RyaW5naXIgZXhwb3J0YcOnw6NvIHBvciBwZXNxdWlzYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdJbmZvcm1hw6fDtWVzIGRlIGltcG9ydGHDp8Ojbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTb3VyY2UgRmlsZSd9ID0gJ0FycXVpdm8gZGUgT3JpZ2VtJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnUmVnaXN0b3MnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ1N1Y2Vzc28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAnTm9tZXMgZHVwbGljYWRvcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ8OabHRpbW8gbsO6bWVybyBkZSBsaW5oYSBwcm9jZXNzYWRhIGRvIGFycXVpdm8gZGUgaW1wb3J0YcOnw6NvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnT2NvcnJldSB1bSBlcnJvLkltcG9ydGHDp8OjbyBpbXBvc3PDrXZlbCFWZXJpZmljYXIgU3lzbG9nIHBhcmEgZGV0YWxoZXMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICdPY29ycmV1IHVtIGVycm8uRXhwb3J0YcOnw6NvIGltcG9zc8OtdmVsIVZlcmlmaWNhciBTeXNsb2cgcGFyYSBkZXRhbGhlcy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ1NlcGFyYWRvciBkZSBDb2x1bmFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYcOnw6NvIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdQb250byBlIFbDrXJndWxhICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEb2lzIFBvbnRvcyAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ1BvbnRvICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ0NvZGlmaWNhw6fDo28gZGUgQ2FyYWN0ZXJlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnSW5jbHVpciBDYWJlw6dhbGhvcyBkZSBDb2x1bmFzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0NvbHVuYSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdGFyIG3Ds2R1bG8gZGUgcmVnaXN0byBiYWNrZW5kIGRvIG3Ds2R1bG8gZGUgaW1wb3J0YcOnw6NvIC8gZXhwb3J0YcOnw6NvLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW1wb3J0YXIgZSBleHBvcnRhciBpbmZvcm1hw6fDtWVzIGRlIG9iamV0by4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ0ltcG9ydGFyL0V4cG9ydGFyJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INCY0LzQv9C+0YDRgtC+0Lwv0K3QutGB0L/QvtGA0YLQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfQodC+0LfQtNCw0LnRgtC1INGI0LDQsdC70L7QvSDQtNC70Y8g0LjQvNC/0L7RgNGC0LAg0Lgg0Y3QutGB0L/QvtGA0YLQsCDQuNC90YTQvtGA0LzQsNGG0LjQuCDQvtCx0YrQtdC60YLQvtCyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ9Cd0LDRh9Cw0YLRjCDQuNC80L/QvtGA0YInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAn0J3QsNGH0LDRgtGMINGN0LrRgdC/0L7RgNGCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICfQqNCw0LMgMSDQuNC3IDUgLSDQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQvtCx0YnRg9GOINC40L3RhNC+0YDQvNCw0YbQuNGOJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAn0KLRgNC10LHRg9C10YLRgdGPINC40LzRjyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ9Ce0LHRitC10LrRgiDQvtCx0Y/Qt9Cw0YLQtdC70LXQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ9Ck0L7RgNC80LDRgiDQvtCx0Y/Qt9Cw0YLQtdC70LXQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbid9ID0gJ9Co0LDQsyAyINC40LcgNSAtINCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC40L3RhNC+0YDQvNCw0YbQuNGOINC+0LEg0L7QsdGK0LXQutGC0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ9Co0LDQsyAzINC40LcgNSAtINCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINGE0L7RgNC80LDRgiDQuNC90YTQvtGA0LzQsNGG0LjQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICfQvtCx0Y/Qt9Cw0YLQtdC70LXQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICfQqNCw0LMgNCDQuNC3IDUgLSDQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCDQuNC90YTQvtGA0LzQsNGG0LjRjiDRgdC+0L/QvtGB0YLQsNCy0LvQtdC90LjRjyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAn0J3QtdGCINGN0LvQtdC80LXQvdGC0L7QsiDRgdC+0L/QvtGB0YLQsNCy0LvQtdC90LjRjy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ9CU0L7QsdCw0LLRjNGC0LUg0Y3Qu9C10LzQtdC90YIg0YHQvtC/0L7RgdGC0LDQstC70LXQvdC40Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJ9Co0LDQsyA1INC40LcgNSAtINCg0LXQtNCw0LrRgtC40YDQvtCy0LDRgtGMINC40L3RhNC+0YDQvNCw0YbQuNGOINC/0L7QuNGB0LrQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ9Ce0LPRgNCw0L3QuNGH0LjRgtGMINGN0LrRgdC/0L7RgNGCINC/0L7QuNGB0LrQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ9CY0L3RhNC+0YDQvNCw0YbQuNGPINC+0LEg0LjQvNC/0L7RgNGC0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICfQmNGB0YXQvtC00L3Ri9C5INGE0LDQudC7JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJ9CY0LzQv9C+0YDRgiDRgdC+0LTQtdGA0LbQsNC90LjRjyDQtNC70Y8gJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ9CX0LDQv9C40YHQtdC5JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICfQo9GB0L/QtdGI0L3Qvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICfQlNGD0LHQu9C40YDRg9GO0YnQuNC1INC40LzQtdC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICfQndC+0LzQtdGAINC/0L7RgdC70LXQtNC90LXQuSDQvtCx0YDQsNCx0L7RgtCw0L3QvdC+0Lkg0YHRgtGA0L7QutC4INC40LzQv9C+0YDRgtC40YDRg9C10LzQvtCz0L4g0YTQsNC50LvQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ09rJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZG1pbkltcG9ydEV4cG9ydC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJ30gPSAn0J7QsdGK0LXQutGCINC90LUg0L3QsNC50LTQtdC9ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICfQkdGN0LrRjdC90LQg0L3QtSDQvdCw0LnQtNC10L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICfQqNCw0LHQu9C+0L0g0L3QtSDQvdCw0LnQtNC10L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhblwndCBpbnNlcnQvdXBkYXRlIHRlbXBsYXRlISd9ID0gJ9Cd0LXQstC+0LfQvNC+0LbQvdC+INC00L7QsdCw0LLQuNGC0Ywv0L7QsdC90L7QstC40YLRjCDRiNCw0LHQu9C+0L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ9Ci0YDQtdCx0YPQtdGC0YHRjyBJRCDQqNCw0LHQu9C+0L3QsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ9Ce0YjQuNCx0LrQsC4g0JjQvNC/0L7RgNGCINC90LXQstC+0LfQvNC+0LbQtdC9ISDQodC80L7RgtGA0Lgg0L/QvtC00YDQvtCx0L3QvtGB0YLQuCDQsiBTeXNsb2cuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICfQntGI0LjQsdC60LAuINCt0LrRgdC/0L7RgNGCINC90LXQstC+0LfQvNC+0LbQtdC9ISDQodC80L7RgtGA0Lgg0L/QvtC00YDQvtCx0L3QvtGB0YLQuCDQsiBTeXNsb2cuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICfQodC/0LjRgdC+0Log0YjQsNCx0LvQvtC90L7Qsic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICfQvdC+0LzQtdGAJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAn0L3QvtC80LXRgCDQsdC+0LvRjNGI0LUg0L3Rg9C70Y8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJ9GG0LXQu9C+0LUg0YfQuNGB0LvQvic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICfRhtC10LvQvtC1INGH0LjRgdC70L4g0LHQvtC70YzRiNC1INC90YPQu9GPJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YSd9ID0gJ9Ce0LHRj9C30LDRgtC10LvRjNC90YvQtSDRjdC70LXQvNC10L3Rgiwg0L/QvtC20LDQu9GD0LnRgdGC0LAg0LLQstC10LTQuNGC0LUg0LTQsNC90L3Ri9C1Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJ9Cd0LXQstC10YDQvdGL0LUg0LTQsNC90L3Ri9C1LCDQv9C+0LbQsNC70YPQudGB0YLQsCwg0YPQutCw0LbQuNGC0LUg0LLQtdGA0L3Ri9C1ICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAn0KTQvtGA0LzQsNGCINC90LUg0L3QsNC50LTQtdC9ISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICfQoNCw0LfQtNC10LvQuNGC0LXQu9GMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ9Ci0LDQsdGD0LvRj9GG0LjRjyAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAn0KLQvtGH0LrQsCDRgSDQt9Cw0L/Rj9GC0L7QuSAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAn0JTQstC+0LXRgtC+0YfQuNC1ICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAn0KLQvtGH0LrQsCAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAn0JfQsNC/0Y/RgtCw0Y8gKCwpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICfQmtC+0LTQuNGA0L7QstC60LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ9CS0LrQu9GO0YfQuNGC0Ywg0LfQsNCz0L7Qu9C+0LLQutC4INGB0YLQvtC70LHRhtC+0LInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uJ30gPSAn0KHRgtC+0LvQsdC10YYgJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiDQtNC70Y8g0LzQvtC00YPQu9GPIGltcG9ydC9leHBvcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfQmNC80L/QvtGA0YIg0Lgg0Y3QutGB0L/QvtGA0YIg0LjQvdGE0L7RgNC80LDRhtC40Lgg0L7QsSDQvtCx0YrQtdC60YLQsNGFJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICfQmNC80L/QvtGA0YIv0K3QutGB0L/QvtGA0YInOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfQ3lybF9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAn0KPQstC+0Lcv0JjQt9Cy0L7QtyDRg9C/0YDQsNCy0ZnQsNGa0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ9Ca0YDQtdC40YDQsNGYINGI0LDQsdC70L7QvSDQt9CwINGD0LLQvtC3INC4INC40LfQstC+0Lcg0LjQvdGE0L7RgNC80LDRhtC40ZjQsCDQviDQvtCx0ZjQtdC60YLRgy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAn0J/QvtGH0L3QuCDRg9Cy0L7Qtyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICfQn9C+0YfQvdC4INC40LfQstC+0LcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJ9Ca0L7RgNCw0LogMSDQvtC0IDUgLSDQo9GA0LXQtNC4INC30LDRmNC10LTQvdC40YfQutC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICfQmNC80LUg0ZjQtSDQvtCx0LDQstC10LfQvdC+ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAn0J7QsdGY0LXQutGCINGY0LUg0L7QsdCw0LLQtdC30LDQvSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ9Ck0L7RgNC80LDRgiDRmNC1INC+0LHQsNCy0LXQt9Cw0L0hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICfQmtC+0YDQsNC6IDIg0L7QtCA1IC0g0KPRgNC10LTQuCDQuNC90YTQvtGA0LzQsNGG0LjRmNC1INC+INC+0LHRmNC10LrRgtGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICfQmtC+0YDQsNC6IDMg0L7QtCA1IC0g0KPRgNC10LTQuCDQuNC90YTQvtGA0LzQsNGG0LjRmNC1INC+INGE0L7RgNC80LDRgtGDJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2lzIHJlcXVpcmVkISd9ID0gJ9GY0LUg0L7QsdCw0LLQtdC30L3QviEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICfQmtC+0YDQsNC6IDQg0L7QtCA1IC0g0KPRgNC10LTQuCDQuNC90YTQvtGA0LzQsNGG0LjRmNC1INC+INC80LDQv9C40YDQsNGa0YMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ9Cd0LjRmNC10LTQsNC9INC10LvQtdC80LXQvdGCINC80LDQv9C1INC90LjRmNC1INC/0YDQvtC90LDRktC10L0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICfQlNC+0LTQsNGYINC10LvQtdC80LXQvdGCINC30LAg0LzQsNC/0LjRgNCw0ZrQtSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAn0JrQvtGA0LDQuiA1INC+0LQgNSAtINCj0YDQtdC00Lgg0LjQvdGE0L7RgNC80LDRhtC40ZjQtSDQt9CwINC/0YDQtdGC0YDQsNCz0YMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfQntCz0YDQsNC90LjRh9C10ZrQtSDQuNC30LLQvtC30LAg0L/QviDQv9GA0LXRgtGA0LDQt9C4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ9Cj0LLQvtC3INC40L3RhNC+0YDQvNCw0YbQuNGY0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICfQmNC30LLQvtGA0L3QsCDQtNCw0YLQvtGC0LXQutCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJ9Cg0LXQt9C40LzQtSDRg9Cy0L7Qt9CwINC30LAgJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ9CX0LDQv9C40YHQuCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAn0KPRgdC/0LXRiNC90L4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAn0JTRg9C/0LvQuNC60LDRgiDQuNC80LXQvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAn0JHRgNC+0Zgg0L/QvtGB0LvQtdC00ZrQtSDQvtCx0YDQsNGS0LXQvdC1INC70LjQvdC40ZjQtSDRg9Cy0LXQt9C10L3QtSDQtNCw0YLQvtGC0LXQutC1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAn0KMg0YDQtdC00YMnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICfQndC40ZjQtSDQv9GA0L7QvdCw0ZLQtdC9INC/0L7Qt9Cw0LTQuNC90YHQutC4INC80L7QtNGD0Lsg0L7QsdGY0LXQutGC0LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kISd9ID0gJ9Cd0LjRmNC1INC/0YDQvtC90LDRktC10L0g0L/QvtC30LDQtNC40L3RgdC60Lgg0LzQvtC00YPQuyDRhNC+0YDQvNCw0YLQsCEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJ9Co0LDQsdC70L7QvSDQvdC40ZjQtSDQv9GA0L7QvdCw0ZLQtdC9ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICfQqNCw0LHQu9C+0L0g0YHQtSDQvdC1INC80L7QttC1INGD0L3QtdGC0Lgv0LDQttGD0YDQuNGA0LDRgtC4ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICfQn9C+0YLRgNC10LHQsNC9INCY0JQg0YjQsNCx0LvQvtC90LAhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICfQlNC+0LPQvtC00LjQu9CwINGB0LUg0LPRgNC10YjQutCwLiDQo9Cy0L7QtyDRmNC1INC90LXQvNC+0LPRg9GbISDQl9CwINC00LXRgtCw0ZnQtSDQv9C+0LPQu9C10LTQsNGY0YLQtSDRgyDRgdC40YHRgtC10LzRgdC60Lgg0LTQvdC10LLQvdC40LouJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICfQlNC+0LPQvtC00LjQu9CwINGB0LUg0LPRgNC10YjQutCwLiDQmNC30LLQvtC3INGY0LUg0L3QtdC80L7Qs9GD0ZshINCX0LAg0LTQtdGC0LDRmdC1INC/0L7Qs9C70LXQtNCw0ZjRgtC1INGDINGB0LjRgdGC0LXQvNGB0LrQuCDQtNC90LXQstC90LjQui4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJ9Cb0LjRgdGC0LAg0YjQsNCx0LvQvtC90LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAn0LHRgNC+0ZgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICfQsdGA0L7RmCDQstC10ZvQuCDQvtC0INC90YPQu9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXInfSA9ICfRhtC10L4g0LHRgNC+0ZgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAn0YbQtdC+INCx0YDQvtGYINCy0LXRm9C4INC+0LQg0L3Rg9C70LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAn0J3QtdC+0L/RhdC+0LTQsNC9INC10LvQtdC80LXQvdGCLCDQvNC+0LvQuNC80L4g0YPQvdC10YHQuNGC0LUg0L/QvtC00LDRgtC60LUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICfQndC10LjRgdC/0YDQsNCy0L3QuCDQv9C+0LTQsNGG0LgsINGD0L3QtdGB0LXRgtC1INCy0LDQttC10ZvQuCAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgbm90IGZvdW5kISd9ID0gJ9Ck0L7RgNC80LDRgiDQvdC40ZjQtSDQv9GA0L7QvdCw0ZLQtdC9ISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICfQodC10L/QsNGA0LDRgtC+0YAg0LrQvtC70L7QvdCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ9Ci0LDQsdGD0LvQsNGC0L7RgCAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAn0KLQsNGH0LrQsCDQuCDQt9Cw0L/QtdGC0LAgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ9CU0LLQvtGC0LDRh9C60LAgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICfQotCw0YfQutCwICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICfQl9Cw0YDQtdC3ICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAn0JrQsNGA0LDQutGC0LXRgNGB0LXRgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAn0KPQutGZ0YPRh9C4INC90LDRgdC70L7QstC1INC60L7Qu9C+0L3QsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICfQmtC+0LvQvtC90LAnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgYmFja2VuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgaW1wb3J0L2V4cG9ydCBtb2R1bGUuJ30gPQogICAgICAgICfQpNC+0YDQvNCw0YIg0YDQtdCz0LjRgdGC0YDQsNGG0LjRmNC1IOKAnmJhY2tlbmTigJ0g0LzQvtC00YPQu9CwINC30LAg0YPQstC+0Lcv0LjQt9Cy0L7QtyDQvNC+0LTRg9C7Lic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn0JjQvdGE0L7RgNC80LDRhtC40ZjQtSDQviDRg9Cy0L7Qt9GDINC4INC40LfQstC+0LfRgyDQvtCx0ZjQtdC60LDRgtCwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICfQo9Cy0L7Qty/QmNC30LLQvtC3JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3JfTGF0bl9JbXBvcnRFeHBvcnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkltcG9ydEV4cG9ydAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCBNYW5hZ2VtZW50J30gPSAnVXZvei9JenZveiB1cHJhdmxqYW5qZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnS3JlaXJhaiDFoWFibG9uIHphIHV2b3ogaSBpenZveiBpbmZvcm1hY2lqYSBvIG9iamVrdHUuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ1BvxI1uaSB1dm96JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ1BvxI1uaSBpenZveic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnS29yYWsgMSBvZCA1IC0gVXJlZGkgemFqZWRuacSNa2UgaW5mb3JtYWNpamUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdJbWUgamUgb2JhdmV6bm8hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICdPYmpla3QgamUgb2JhdmV6YW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdGb3JtYXQgamUgb2JhdmV6YW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICdLb3JhayAyIG9kIDUgLSBVcmVkaSBpbmZvcm1hY2lqZSBvIG9iamVrdHUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJ0tvcmFrIDMgb2QgNSAtIFVyZWRpIGluZm9ybWFjaWplIG8gZm9ybWF0dSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICdqZSBvYmF2ZXpubyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICdLb3JhayA0IG9kIDUgLSBVcmVkaSBpbmZvcm1hY2lqZSBvIG1hcGlyYW5qdSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnTmlqZWRhbiBlbGVtZW50IG1hcGUgbmlqZSBwcm9uYcSRZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdEb2RhaiBlbGVtZW50IHphIG1hcGlyYW5qZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnS29yYWsgNSBvZCA1IC0gVXJlZGkgaW5mb3JtYWNpamUgemEgcHJldHJhZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICdPZ3JhbmnEjWVuamUgaXp2b3phIHBvIHByZXRyYXppJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ1V2b3ogaW5mb3JtYWNpamEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICdJenZvcm5hIGRhdG90ZWthJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJ1JlemltZSB1dm96YSB6YSAlcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnWmFwaXNpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICdVc3BlxaFubyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdEdXBsaWthdCBpbWVuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ0Jyb2ogcG9zbGVkbmplIG9icmHEkWVuZSBsaW5pamUgdXZlemVuZSBkYXRvdGVrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ1UgcmVkdSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJ05pamUgcHJvbmHEkWVuIHBvemFkaW5za2kgbW9kdWwgb2JqZWt0YSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnTmlqZSBwcm9uYcSRZW4gcG96YWRpbnNraSBtb2R1bCBmb3JtYXRhISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBub3QgZm91bmQhJ30gPSAnxaBhYmxvbiBuaWplIHByb25hxJFlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnxaBhYmxvbiBzZSBuZSBtb8W+ZSB1bmV0aS9hxb51cmlyYXRpISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOZWVkZWQgVGVtcGxhdGVJRCEnfSA9ICdQb3RyZWJhbiBJRCDFoWFibG9uYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ0RvZ29kaWxhIHNlIGdyZcWha2EuIFV2b3ogamUgbmVtb2d1xIchIFphIGRldGFsamUgcG9nbGVkYWp0ZSB1IHNpc3RlbXNraSBkbmV2bmlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnRG9nb2RpbGEgc2UgZ3JlxaFrYS4gSXp2b3ogamUgbmVtb2d1xIchIFphIGRldGFsamUgcG9nbGVkYWp0ZSB1IHNpc3RlbXNraSBkbmV2bmlrLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnTGlzdGEgxaFhYmxvbmEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAnYnJvaic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ2Jyb2ogdmXEh2kgb2QgbnVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnY2VvIGJyb2onOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAnY2VvIGJyb2ogdmXEh2kgb2QgbnVsYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICdOZW9waG9kYW4gZWxlbWVudCwgbW9saW1vIHVuZXNpdGUgcG9kYXRrZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbnZhbGlkIGRhdGEsIHBsZWFzZSBpbnNlcnQgYSB2YWxpZCAlcyd9ID0gJ05laXNwcmF2bmkgcG9kYWNpLCB1bmVzZXRlIHZhxb5lxIdpICVzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnRm9ybWF0IG5pamUgcHJvbmHEkWVuISc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL1N5c3RlbS9JbXBvcnRFeHBvcnQvRm9ybWF0QmFja2VuZC9DU1YucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbiBTZXBhcmF0b3InfSA9ICdTZXBhcmF0b3Iga29sb25hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RhYnVsYXRvciAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAnVGHEjWthIGkgemFwZXRhICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICdEdm90YcSNa2EgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdUYcSNa2EgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJ1phcmV6ICgsKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnS2FyYWt0ZXJzZXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ1VrbGp1xI1pIG5hc2xvdmUga29sb25hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0tvbG9uYSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ0Zvcm1hdCByZWdpc3RyYWNpamUg4oCeYmFja2VuZOKAnSBtb2R1bGEgemEgdXZvei9penZveiBtb2R1bC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ0luZm9ybWFjaWplIG8gdXZvenUgaSBpenZvenUgb2JqZWthdGEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0L0V4cG9ydCd9ID0gJ1V2b3ovSXp2b3onOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICk7Cgp9CgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3ZfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ0hhbnRlcmluZyBhdiBJbXBvcnQvRXhwb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdTa2FwYSBlbiBtYWxsIGbDtnIgYXR0IGltcG9ydGVyYSBvY2ggZXhwb3J0ZXJhIG9iamVrdGluZm9ybWF0aW9uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICdTdGFydGEgaW1wb3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ1N0YXJ0YSBleHBvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAxIG9mIDUgLSBFZGl0IGNvbW1vbiBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkISd9ID0gJ05hbW4ga3LDpHZzISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAnT2JqZWt0IGtyw6R2cyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ0Zvcm1hdCBrcsOkdnMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICdrcsOkdnMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBpbmZvcm1hdGlvbid9ID0gJ0ltcG9ydGluZm9ybWF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnS8OkbGxmaWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICdQb3N0ZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ0x5Y2thZCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICdVcHByZXBhIG5hbW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICdPayc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZGVkIFRlbXBsYXRlSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnS29sdW1uLWF2c2tpbGphcmUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdTZW1pa29sb24gKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0tvbG9uICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAnUHVua3QgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnVGVja2Vua29kbmluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0tvbHVtbic7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnSW1wb3J0ZXJhIG9jaCBleHBvcnRlcmEgb2JqZWt0aW5mb3JtYXRpb24uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdJbXBvcnQvRXhwb3J0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6c3dfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ1VzaW1hbWl6aSB3YSBrdWxldGEvSGFtaXNoYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnVGVuZ2VuZXphIGtpb2xlem8ga3VsZXRhIG5hIGt1aGFtaXNoYSB0YWFyaWZhIHphIGtpcGVuZ2VlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0FuemEga3VsZXRhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ0FuemEga3VoYW1pc2hhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdKaW5hIGxpbmFoaXRhamlrYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ0tpcGVuZ2VlIGtpbmFoaXRhamlrYSEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ1VtYml6byB1bmFoaXRhamlrYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAnSW5haGl0YWppa2EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ0hha3VuYSBlbGVtZW50aSB6aWxpem9wYXRpa2FuYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAnT25nZXphIGVsZW1lbnRpIHphIGt1d2VrYSByYW1hbmknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ1p1aWEgdWhhbWlzaGFqaSBrd2Ega2lsYSB1dGFmdXRhamknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAnTGV0YSB0YWFyaWZhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnRmFpbGkgbGEgY2hhbnpvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAnS3VtYnVrdW1idSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnTWFmYW5pa2lvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ0ppbmEgbGltZWppcnVkaWE6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnTmFtYmEgeWEgbXN0YXJpIHVuYW9rYXRpa2EgbWNoYWthdG8gd2EgbXdpc2hvIHdhIGZhaWxpIGxpbGlsb2xldHdhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnU2F3YSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZGVkIFRlbXBsYXRlSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnS2l0ZW5nYW5pc2hpIHNhZnUgd2ltYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICdUYWJvIChUQUIpJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbWljb2xvbiAoOyknfSA9ICdBbGFtYSB5YSBudWt0YSBta2F0byAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAnQ29sb24gKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdOdWt0YSAoLiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29tbWEgKCwpJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXJzZXQnfSA9ICdTZXRpIHlhIGhlcnVmaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAnQW1iYXRpc2hhIHZpY2h3YSB2eWEgaGFiYXJpIHZ5YSBzYWZ1d2ltYSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4nfSA9ICdTYWZ1d2ltYSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ1VtYml6YSB1c2FqaWxpIHdhIG1vZHVsaSB3YSBtYXppbmdpcmEgeWEgbnl1bWEga3dhIGFqaWxpIHlhIG1vZHVsaSB5YSBrdWxldGEva3VoYW1pc2hhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICdMZXRhIG5hIGhhbWlzaGEgdGFhcmlmYSB6YSBraXBlbmdlZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAnTGV0YS9IYW1pc2hhJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6dGhfVEhfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ+C4geC4suC4o+C4iOC4seC4lOC4geC4suC4oyDguJnguLPguYDguILguYnguLIv4Liq4LmI4LiH4Lit4Lit4LiBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhIHRlbXBsYXRlIHRvIGltcG9ydCBhbmQgZXhwb3J0IG9iamVjdCBpbmZvcm1hdGlvbi4nfSA9ICfguKrguKPguYnguLLguIfguYHguKHguYjguYHguJrguJrguYDguJ7guLfguYjguK3guJnguLPguYDguILguYnguLLguYHguKXguLDguKrguYjguIfguK3guK3guIHguILguYnguK3guKHguLnguKXguK3guK3guJrguYDguIjguIHguJXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgSW1wb3J0J30gPSAn4LmA4Lij4Li04LmI4Lih4LiZ4Liz4LmA4LiC4LmJ4LiyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEV4cG9ydCd9ID0gJ+C5gOC4o+C4tOC5iOC4oeC4quC5iOC4h+C4reC4reC4gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAn4LiV4LmJ4Lit4LiH4Lij4Liw4Lia4Li44LiK4Li34LmI4LitISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPYmplY3QgaXMgcmVxdWlyZWQhJ30gPSAn4LiV4LmJ4Lit4LiH4Lij4Liw4Lia4Li44Lit4Lit4Lia4LmA4LiI4LiB4LiV4LmMISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAn4LiV4LmJ4Lit4LiH4Lij4Liw4Lia4Li44Lij4Li54Lib4LmB4Lia4LiaISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaXMgcmVxdWlyZWQhJ30gPSAn4LiV4LmJ4Lit4LiH4Lij4Liw4Lia4Li4ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAn4LmE4Lih4LmI4Lie4Lia4Lit4LiH4LiE4LmM4Lib4Lij4Liw4LiB4Lit4Lia4LmB4Lic4LiZ4LiX4Li14LmIJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICfguYDguJ7guLTguYjguKHguK3guIfguITguYzguJvguKPguLDguIHguK3guJrguILguK3guIfguIHguLLguKPguJfguLPguYHguJzguJnguJfguLXguYgnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ+C4geC4suC4o+C4iOC4s+C4geC4seC4lOC4geC4suC4o+C4quC5iOC4h+C4reC4reC4geC4leC4suC4oeC4geC4suC4o+C4hOC5ieC4meC4q+C4sic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICfguILguYnguK3guKHguLnguKXguJnguLPguYDguILguYnguLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICfguYHguKvguKXguYjguIfguYTguJ/guKXguYwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1JlY29yZHMnfSA9ICfguIHguLLguKPguJrguLHguJnguJfguLbguIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ+C4hOC4p+C4suC4oeC4quC4s+C5gOC4o+C5h+C4iCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXBsaWNhdGUgbmFtZXMnfSA9ICfguIrguLfguYjguK3guIvguYnguLMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUnfSA9ICfguKvguKHguLLguKLguYDguKXguILguILguK3guIfguIHguLLguKPguJvguKPguLDguKHguKfguKXguITguKPguLHguYnguIfguKrguLjguJTguJfguYnguLLguKLguILguK3guIfguIHguLLguKPguJnguLPguYTguJ/guKXguYzguYDguILguYnguLInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2snfSA9ICfguYLguK3guYDguIQnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ+C4leC4seC4p+C4hOC4seC5iOC4meC4hOC4reC4peC4seC4oeC4meC5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICfguJXguLHguKfguJfguLPguJXguLLguKPguLLguIco4LmB4LiX4LmH4LiaKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAn4LmA4LiE4Lij4Li34LmI4Lit4LiH4Lir4Lih4Liy4Lii4Lit4Lix4LiS4Lig4Liy4LiEKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ+C5gOC4hOC4o+C4t+C5iOC4reC4h+C4q+C4oeC4suC4ouC4l+C4p+C4tOC4oOC4suC4hCAoOiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG90ICguKSd9ID0gJ+C4iOC4uOC4lCguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ+C5gOC4i+C4leC4hOC4suC5gOC4o+C4geC5gOC4leC4reC4o+C5jCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAn4Lij4Lin4Lih4LiX4Lix4LmJ4LiH4Liq4LmI4Lin4LiZ4Lir4Lix4Lin4LiC4Lit4LiH4LiE4Lit4Lil4Lix4Lih4LiZ4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ+C4hOC4reC4peC4seC4oeC4meC5jCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ+C4o+C4ueC4m+C5geC4muC4muC4geC4suC4o+C4peC4h+C4l+C4sOC5gOC4muC4teC4ouC4meC5guC4oeC4lOC4ueC4pSBiYWNrZW5kIOC4quC4s+C4q+C4o+C4seC4muC5guC4oeC4lOC4ueC4peC4geC4suC4o+C4meC4s+C5gOC4guC5ieC4siAvIOC4quC5iOC4h+C4reC4reC4gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn4LiB4Liy4Lij4LiZ4Liz4LmA4LiC4LmJ4Liy4Lir4Lij4Li34Lit4Liq4LmI4LiH4Lit4Lit4LiB4LiC4LmJ4Lit4Lih4Li54Lil4Lit4Lit4Lia4LmA4LiI4LiB4LiV4LmMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICfguIHguLLguKPguJnguLPguYDguILguYnguLIv4Liq4LmI4LiH4Lit4Lit4LiBJzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6dmlfVk5fSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ1F14bqjbiBsw70gTmjhuq1wL1h14bqldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYSB0ZW1wbGF0ZSB0byBpbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnVOG6oW8gbeG7mXQgbeG6q3UgxJHhu4Mgbmjhuq1wIHbDoCB4deG6pXQgdGjDtG5nIHRpbiDEkeG7kWkgdMaw4bujbmcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IEltcG9ydCd9ID0gJ0Lhuq90IMSR4bqndSBuaOG6rXAgdsOgbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBFeHBvcnQnfSA9ICdC4bqvdCDEkeG6p3UgeHXhuqV0IHJhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICdZw6p1IGPhuqd1IHBo4bqjaSBjw7MgdMOqbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ1nDqnUgY+G6p3UgcGjhuqNpIGPDsyDEkeG7kWkgdMaw4bujbmchJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBpcyByZXF1aXJlZCEnfSA9ICdZw6p1IGPhuqd1IHBo4bqjaSBjw7MgxJHhu4tuaCBk4bqhbmchJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICdsw6AgYuG6r3QgYnXhu5ljISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDQgb2YgNSAtIEVkaXQgbWFwcGluZyBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBtYXAgZWxlbWVudHMgZm91bmQuJ30gPSAnS2jDtG5nIHTDrG0gdGjhuqV5IMSR4buRaSB0xrDhu6NuZyBtYXAuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBNYXBwaW5nIEVsZW1lbnQnfSA9ICdUaMOqbSDEkeG7kWkgdMaw4bujbmcgbWFwcGluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Jlc3RyaWN0IGV4cG9ydCBwZXIgc2VhcmNoJ30gPSAnR2nhu5tpIGjhuqFuIGThu68gbGnhu4d1IHh14bqldCBt4buXaSBs4bqnbiB0w6xtIGtp4bq/bSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICdUaMO0bmcgdGluIG5o4bqtcCB2w6BvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAnVOG7h3Agbmd14buTbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgc3VtbWFyeSBmb3IgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ0LhuqNuIGdoaSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAnVGjDoG5oIGPDtG5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ1Ryw7luZyB0w6puJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAnRMOybmcgY3Xhu5FpIGPDuW5nIMSRxrDhu6NjIHjhu60gbMO9IHRyb25nIHThu4dwIG5o4bqtcCB2w6BvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnxJDhu5NuZyDDvSc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmVlZGVkIFRlbXBsYXRlSUQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBJbXBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEV4cG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUZW1wbGF0ZSBMaXN0J30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbGVtZW50IHJlcXVpcmVkLCBwbGVhc2UgaW5zZXJ0IGRhdGEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBkYXRhLCBwbGVhc2UgaW5zZXJ0IGEgdmFsaWQgJXMnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICcnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAnUGjDom4gY8OhY2ggY+G7mXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGFidWxhdG9yIChUQUIpJ30gPSAnQuG7mSBs4bqtcCBi4bqjbmcgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ0ThuqV1IGNo4bqlbSBwaOG6qXkgKDspJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbG9uICg6KSd9ID0gJ0ThuqV1IGhhaSBjaOG6pW0gKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICdE4bqldSBjaOG6pW0gKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGFyc2V0J30gPSAnQuG7mSBtw6Mga8O9IHThu7EnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW5jbHVkZSBDb2x1bW4gSGVhZGVycyd9ID0gJ0fhu5NtIHRpw6p1IMSR4buBIGPhu5l0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ0Phu5l0JzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWxlLid9ID0KICAgICAgICAnxJDEg25nIGvDvSBtw7QtxJF1biDEkeG7i25oIGThuqFuZyBu4buBbiBjaG8gbcO0LcSRdW4gbmjhuq1wL3h14bqldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAnVGjDtG5nIHRpbiBuaOG6rXAgdsOgIHh14bqldCDEkeG7kWkgdMaw4bujbmcuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICdOaOG6rXAvWHXhuqV0JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfQ05fSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ+WvvOWFpS/lr7zlh7rnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ+WIm+W7uuaooeadv+WvvOWFpeWSjOWvvOWHuuWvueixoeS/oeaBr+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICflvIDlp4vlr7zlhaUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAn5byA5aeL5a+85Ye6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICfmraXpqqQgMS81IC0g57yW6L6R6YCa55So5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQhJ30gPSAn5ZG95ZCN5piv5b+F6ZyA55qE77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09iamVjdCBpcyByZXF1aXJlZCEnfSA9ICflr7nosaHmmK/lv4XpnIDnmoTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IGlzIHJlcXVpcmVkISd9ID0gJ+agvOW8j+aYr+W/hemcgOeahO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDIgb2YgNSAtIEVkaXQgb2JqZWN0IGluZm9ybWF0aW9uJ30gPSAn5q2l6aqkIDIvNSAtIOe8lui+keebruagh+S/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDMgb2YgNSAtIEVkaXQgZm9ybWF0IGluZm9ybWF0aW9uJ30gPSAn5q2l6aqkIDMvNSAtIOe8lui+keagvOW8j+S/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICfmmK/lv4XpnIDnmoTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICfmraXpqqQgNC81IC0g57yW6L6R5pig5bCE5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG1hcCBlbGVtZW50cyBmb3VuZC4nfSA9ICfmsqHmnInmib7liLDmmKDlsITnmoTlrZfmrrUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIE1hcHBpbmcgRWxlbWVudCd9ID0gJ+a3u+WKoOaYoOWwhOWtl+autSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGVwIDUgb2YgNSAtIEVkaXQgc2VhcmNoIGluZm9ybWF0aW9uJ30gPSAn5q2l6aqkIDUvNSAtIOe8lui+keaQnOe0ouS/oeaBryc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ+aMieaQnOe0oumZkOWItuWvvOWHuic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgaW5mb3JtYXRpb24nfSA9ICflr7zlhaXkv6Hmga8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU291cmNlIEZpbGUnfSA9ICfmupDmlofku7YnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IHN1bW1hcnkgZm9yICVzJ30gPSAnJXPnmoTlr7zlhaXmkZjopoEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVjb3Jkcyd9ID0gJ+iusOW9lSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdWNjZXNzJ30gPSAn5oiQ5YqfJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0R1cGxpY2F0ZSBuYW1lcyd9ID0gJ+mHjeWkjeeahOWQjeensCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZSd9ID0gJ+WvvOWFpeaWh+S7tuacgOWQjuWkhOeQhueahOihjOaVsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPayd9ID0gJ+ehruWumic7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWRtaW5JbXBvcnRFeHBvcnQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIG9iamVjdCBiYWNrZW5kIGZvdW5kISd9ID0gJ+ayoeacieaJvuWIsOWvueixoeeahOWQjuerr++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnfSA9ICfmsqHmnInmib7liLDmoLzlvI/nmoTlkI7nq6/vvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgbm90IGZvdW5kISd9ID0gJ+ayoeacieaJvuWIsOaooeadv++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnfSA9ICfkuI3og73mj5LlhaUv5pu05paw5qih5p2/77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJ+mcgOimgVRlbXBsYXRlSUTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRXJyb3Igb2NjdXJyZWQuIEltcG9ydCBpbXBvc3NpYmxlISBTZWUgU3lzbG9nIGZvciBkZXRhaWxzLid9ID0gJ+WHuueOsOmUmeivr+OAguS4jeiDveWvvOWFpe+8geafpeeci1N5c2xvZ+iOt+WPluivpue7huS/oeaBr+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAn5Ye6546w6ZSZ6K+v44CC5LiN6IO95a+85Ye677yB5p+l55yLU3lzbG9n6I635Y+W6K+m57uG5L+h5oGv44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIExpc3QnfSA9ICfmqKHmnb/muIXljZUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyJ30gPSAn5pWw5a2XJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J251bWJlciBiaWdnZXIgdGhhbiB6ZXJvJ30gPSAn5pWw5a2X5aSn5LqOMCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyJ30gPSAn5pW05pWwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybyd9ID0gJ+aVtOaVsOWkp+S6jjAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAn6ZyA6KaB5YWD57Sg77yM6K+35o+S5YWl5pWw5o2uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAn5peg5pWI55qE5pWw5o2u77yM6K+35o+S5YWl5LiA5Liq5pyJ5pWI55qEJXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRm9ybWF0IG5vdCBmb3VuZCEnfSA9ICfmsqHmnInmib7liLDmoLzlvI/vvIEnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L0Zvcm1hdEJhY2tlbmQvQ1NWLnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2x1bW4gU2VwYXJhdG9yJ30gPSAn5YiX5YiG6ZqU56ymJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RhYnVsYXRvciAoVEFCKSd9ID0gJ1RBQumUriAoVEFCKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZW1pY29sb24gKDspJ30gPSAn5YiG5Y+3ICg7KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb2xvbiAoOiknfSA9ICflhpLlj7cgKDopJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RvdCAoLiknfSA9ICflj6Xlj7cgKC4pJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbW1hICgsKSd9ID0gJ+mAl+WPt++8iCzvvIknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ+Wtl+espumbhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAn5YyF5ous5YiX5qCH6aKYJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ+WIlyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJ+S4uuWvvOWFpS/lr7zlh7rmqKHlnZfnmoTmoLzlvI/lkI7nq6/mqKHlnZfms6jlhozjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ+WvvOWFpeWSjOWvvOWHuuWvueixoeS/oeaBr+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQvRXhwb3J0J30gPSAn5a+85YWlL+WvvOWHuic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6emhfVFdfSW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5JbXBvcnRFeHBvcnQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQgTWFuYWdlbWVudCd9ID0gJ+WwjuWFpS/lsI7lh7rnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLid9ID0gJ+WJteW7uuaooeadv+WwjuWFpeWSjOWwjuWHuuWwjeixoeS/oeaBr+OAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBJbXBvcnQnfSA9ICfplovlp4vlsI7lhaUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RhcnQgRXhwb3J0J30gPSAn6ZaL5aeL5bCO5Ye6JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMSBvZiA1IC0gRWRpdCBjb21tb24gaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZCEnfSA9ICflkI3nqLHmmK/lv4XpnIDnmoTvvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2JqZWN0IGlzIHJlcXVpcmVkISd9ID0gJ+WwjeixoeaYr+W/hemcgOeahO+8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGb3JtYXQgaXMgcmVxdWlyZWQhJ30gPSAn5qC85byP5piv5b+F6ZyA55qEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgMiBvZiA1IC0gRWRpdCBvYmplY3QgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCAzIG9mIDUgLSBFZGl0IGZvcm1hdCBpbmZvcm1hdGlvbid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpcyByZXF1aXJlZCEnfSA9ICflv4XpnIDnmoQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3RlcCA0IG9mIDUgLSBFZGl0IG1hcHBpbmcgaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gbWFwIGVsZW1lbnRzIGZvdW5kLid9ID0gJ+aykuacieaJvuWIsOaYoOWwhOeahOWtl+autSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgTWFwcGluZyBFbGVtZW50J30gPSAn5re75Yqg5pig5bCE5a2X5q61JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0ZXAgNSBvZiA1IC0gRWRpdCBzZWFyY2ggaW5mb3JtYXRpb24nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2gnfSA9ICfpmZDliLblsI7lh7rmr4/lgIvmkJzlsIsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW1wb3J0IGluZm9ybWF0aW9uJ30gPSAn5bCO5YWl5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NvdXJjZSBGaWxlJ30gPSAn5rqQ5paH5Lu2JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydCBzdW1tYXJ5IGZvciAlcyd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvcmRzJ30gPSAn57SA6YyEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N1Y2Nlc3MnfSA9ICfmiJDlip8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHVwbGljYXRlIG5hbWVzJ30gPSAn6YeN6KSH55qE5ZCN56ixJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xhc3QgcHJvY2Vzc2VkIGxpbmUgbnVtYmVyIG9mIGltcG9ydCBmaWxlJ30gPSAn5bCO5YWl5paH5Lu25pyA5b6M6JmV55CG55qE6KGM5pW4JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09rJ30gPSAnT2snOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FkbWluSW1wb3J0RXhwb3J0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlbXBsYXRlIG5vdCBmb3VuZCEnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FuXCd0IGluc2VydC91cGRhdGUgdGVtcGxhdGUhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05lZWRlZCBUZW1wbGF0ZUlEISd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVtcGxhdGUgTGlzdCd9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydudW1iZXInfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnbnVtYmVyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnaW50ZWdlcid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydpbnRlZ2VyIGJpZ2dlciB0aGFuIHplcm8nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRWxlbWVudCByZXF1aXJlZCwgcGxlYXNlIGluc2VydCBkYXRhJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBub3QgZm91bmQhJ30gPSAnJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvU3lzdGVtL0ltcG9ydEV4cG9ydC9Gb3JtYXRCYWNrZW5kL0NTVi5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sdW1uIFNlcGFyYXRvcid9ID0gJ+WIl+WIhumalOespic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUYWJ1bGF0b3IgKFRBQiknfSA9ICfliLbooajpjbUgKFRBQiknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VtaWNvbG9uICg7KSd9ID0gJ+WIhuiZnyAoOyknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sb24gKDopJ30gPSAn5YaS6JmfICg6KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEb3QgKC4pJ30gPSAn5Y+l6JmfICguKSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb21tYSAoLCknfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2hhcnNldCd9ID0gJ+Wtl+espumbhic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmNsdWRlIENvbHVtbiBIZWFkZXJzJ30gPSAn5YyF5ous5YiX5qiZ6aGMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbHVtbid9ID0gJ+WIlyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zvcm1hdCBiYWNrZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBpbXBvcnQvZXhwb3J0IG1vZHVsZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbXBvcnQgYW5kIGV4cG9ydCBvYmplY3QgaW5mb3JtYXRpb24uJ30gPSAn5bCO5YWl5ZKM5bCO5Ye65bCN6LGh5L+h5oGvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ltcG9ydC9FeHBvcnQnfSA9ICflsI7lhaUv5bCO5Ye6JzsKCgogICAgcHVzaCBAeyAkU2VsZi0+e0phdmFTY3JpcHRTdHJpbmdzfSAvLyBbXSB9LCAoCiAgICApOwoKfQoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChjb21tb24pCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MScgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YTsKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAkU2F2ZUNvbnRpbnVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1Ym1pdE5leHQnICk7CgogICAgICAgIGlmICggISRTYXZlQ29udGludWUgKSB7CgogICAgICAgICAgICAjIGlmIG5lZWRlZCBuZXcgZm9ybQogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQxKAogICAgICAgICAgICAgICAgICAgIE5ldyA9PiAxLAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgdGVtcGxhdGUgaWQKICAgICAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICAgICAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGVkaXQKICAgICAgICAgICAgaWYgKCAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MSggJVBhcmFtLCAleyRUZW1wbGF0ZURhdGF9ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgc2F2ZSAmIGNvbnRpbnVlCiAgICAgICAgbXkgJVNlcnZlckVycm9yOwoKICAgICAgICAjIGdldCBhbGwgZGF0YSBmb3IgcGFyYW1zIGFuZCBjaGVjayBmb3IgZXJyb3JzCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ29tbWVudCBPYmplY3QgRm9ybWF0IE5hbWUgVmFsaWRJRCBUZW1wbGF0ZUlEKSkgewogICAgICAgICAgICAkVGVtcGxhdGVEYXRhLT57JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBpcyBhIG5ldyB0ZW1wbGF0ZT8KICAgICAgICBteSAkTmV3OwogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJE5ldyA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBmaWVsZHMKICAgICAgICAjIGZvciBuZXcgdGVtcGxhdGVzCiAgICAgICAgaWYgKCROZXcpIHsKCiAgICAgICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9ye09iamVjdH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntGb3JtYXR9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgZm9yIGFsbCB0ZW1wbGF0ZXMKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57TmFtZX0gKSB7CiAgICAgICAgICAgICRTZXJ2ZXJFcnJvcntOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHNvbWUgZXJyb3IKICAgICAgICBpZiAoICRTZXJ2ZXJFcnJvcntGb3JtYXR9IHx8ICRTZXJ2ZXJFcnJvcntPYmplY3R9IHx8ICRTZXJ2ZXJFcnJvcntOYW1lfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDEoCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciA9PiBcJVNlcnZlckVycm9yLAogICAgICAgICAgICAgICAgTmV3ICAgICAgICAgPT4gJE5ldywKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdG8gZGF0YWJhc2UKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgaWYgKCROZXcpIHsKICAgICAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDYW5cJ3QgaW5zZXJ0L3VwZGF0ZSB0ZW1wbGF0ZSEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDI7VGVtcGxhdGVJRD0kVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBlZGl0IChvYmplY3QpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0MicgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVJRCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkZWQgVGVtcGxhdGVJRCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFN1Ym1pdE5leHQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3VibWl0TmV4dCcgKTsKCiAgICAgICAgaWYgKCAhJFN1Ym1pdE5leHQgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQyKCBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGVtcGxhdGUgc3RhcnRzIGhlcmUKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkT2JqZWN0QXR0cmlidXRlTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CgogICAgICAgIG15ICRFcnJvciA9IDA7CiAgICAgICAgbXkgJVNlcnZlckVycm9yOwogICAgICAgIG15ICVEYXRhVHlwZUVycm9yOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZCBhbmQgaXMgbm90IHRoZXJlCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFNlcnZlckVycm9yeyAkSXRlbS0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgJEVycm9yID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlVmFsdWVzeyAkSXRlbS0+e0tleX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGxvb2sgZm9yIHJlZ2V4cCBmb3IgZGF0YSB0eXBlIGFsbG93ZWQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0lucHV0fS0+e1JlZ2V4fQogICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgISRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID1+ICRJdGVtLT57SW5wdXR9LT57UmVnZXh9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAkRGF0YVR5cGVFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAkRXJyb3IgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlbG9hZCB3aXRoIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoJEVycm9yKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+X01hc2tUZW1wbGF0ZUVkaXQyKAogICAgICAgICAgICAgICAgU2VydmVyRXJyb3IgICAgICA9PiBcJVNlcnZlckVycm9yLAogICAgICAgICAgICAgICAgRGF0YVR5cGVFcnJvciAgICA9PiBcJURhdGFUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZURhdGFGb3JtID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2F2ZSB0aGUgb2JqZWN0IGRhdGEKICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgT2JqZWN0RGF0YSA9PiBcJUF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MztUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoZm9ybWF0KQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDMnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTmVlZGVkIFRlbXBsYXRlSUQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRTdWJtaXROZXh0ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1N1Ym1pdE5leHQnICk7CgogICAgICAgIGlmICggISRTdWJtaXROZXh0ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9NYXNrVGVtcGxhdGVFZGl0MyggVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHN0YXJ0aW5nIGhlcmUKCiAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkRm9ybWF0QXR0cmlidXRlTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICAgICAgbXkgJEZvcm1hdERhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBteSAkRXJyb3IgPSAwOwogICAgICAgIG15ICVTZXJ2ZXJFcnJvcjsKCiAgICAgICAgIyBnZXQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIGZvcm0KICAgICAgICBteSAlQXR0cmlidXRlVmFsdWVzOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEZvcm1hdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgZm9ybSBkYXRhCiAgICAgICAgICAgICRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICBJdGVtID0+ICRJdGVtLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZWxvYWQgZm9ybSBpZiB2YWx1ZSBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRJdGVtLT57Rm9ybX0tPntJbnZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRTZXJ2ZXJFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgICRFcnJvciA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVsb2FkIHdpdGggc2VydmVyIGVycm9ycwogICAgICAgIGlmICgkRXJyb3IpIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5fTWFza1RlbXBsYXRlRWRpdDMoCiAgICAgICAgICAgICAgICBTZXJ2ZXJFcnJvciA9PiBcJVNlcnZlckVycm9yLAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNhdmUgdGhlIGZvcm1hdCBkYXRhCiAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gXCVBdHRyaWJ1dGVWYWx1ZXMsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDQ7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIGVkaXQgKG1hcHBpbmcpCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnVGVtcGxhdGVFZGl0NCcgKSB7CgogICAgICAgICMgZ2V0IG9iamVjdCBsaXN0CiAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RMaXN0KCk7CgogICAgICAgIGlmICggISRPYmplY3RMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIG9iamVjdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmb3JtYXQgbGlzdAogICAgICAgIG15ICRGb3JtYXRMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0TGlzdCgpOwoKICAgICAgICBpZiAoICEkRm9ybWF0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBmb3JtYXQgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBPYmplY3RPcHRpb25TdHJnCiAgICAgICAgbXkgJE9iamVjdE9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRPYmplY3RMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ09iamVjdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvblN0cmcgPT4gJE9iamVjdE9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBGb3JtYXRPcHRpb25TdHJnID0+ICRGb3JtYXRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJXskVGVtcGxhdGVEYXRhfSwKICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJE9iamVjdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e09iamVjdH0gfSwKICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdMaXN0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkTWFwcGluZ09iamVjdEF0dHJpYnV0ZXMgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBoZWFkZXJzIGZvciBvYmplY3QgYW5kIGFkZCBjb21tb24gaGVhZGVycwogICAgICAgIG15IEBIZWFkZXJzOwoKICAgICAgICBmb3IgbXkgJEhlYWRlciAoIEB7JE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzfSApIHsKICAgICAgICAgICAgcHVzaCBASGVhZGVycywgJEhlYWRlci0+e05hbWV9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRDb21tb25IZWFkZXIgKCAnQ29sdW1uJywgJ1VwJywgJ0Rvd24nLCAnRGVsZXRlJyApIHsKICAgICAgICAgICAgcHVzaCBASGVhZGVycywgJENvbW1vbkhlYWRlcjsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSGVhZGVyIChASGVhZGVycykgewoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRUYWJsZUhlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBIZWFkZXIgPT4gJEhlYWRlciwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRvIHVzZSBpbiBjb2xzcGFuIGZvciAnbm8gZGF0YSBmb3VuZCcgbWVzc2FnZQogICAgICAgIG15ICRIZWFkZXJDb3VudGVyID0gQEhlYWRlcnM7CgogICAgICAgIG15ICRFbXB0eU1hcCAgICAgICAgICAgID0gMTsKICAgICAgICBteSAkQXR0cmlidXRlUm93Q291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAkRW1wdHlNYXAgPSAwOwoKICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YUdldCgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkTWFwcGluZ0lELAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgZm9ybWF0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXREYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFHZXQoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgICAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgIEl0ZW0gICA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBQcmVmaXggPT4gJ09iamVjdDo6JyAuICRBdHRyaWJ1dGVSb3dDb3VudGVyIC4gJzo6JywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJE1hcHBpbmdPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9LAogICAgICAgICAgICAgICAgICAgIElEICAgICA9PiAkSXRlbS0+e0tleX0gLiAkQXR0cmlidXRlUm93Q291bnRlciwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0NENvbHVtbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgPT4gJ09iamVjdDo6JyAuICRBdHRyaWJ1dGVSb3dDb3VudGVyIC4gJzo6JyAuICRJdGVtLT57S2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJnID0+ICRJbnB1dFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgID0+ICRBdHRyaWJ1dGVSb3dDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBvdXRwdXQgY29sdW1uIGNvdW50ZXIKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDRNYXBOdW1iZXJDb2x1bW4nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyID0+ICRBdHRyaWJ1dGVSb3dDb3VudGVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGhpZGUgdGhlIHVwIGJ1dHRvbiBmb3IgZmlyc3QgZWxlbWVudCBhbmQgZG93biBidXR0b24gZm9yIHRoZSBsYXN0IGVsZW1lbnQKICAgICAgICAgICAgbXkgJFVwQmxvY2s7CiAgICAgICAgICAgIG15ICREb3duQmxvY2s7CiAgICAgICAgICAgIG15ICROdW1iZXJPZkVsZW1lbnRzID0gQHskTWFwcGluZ0xpc3R9OwoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlUm93Q291bnRlciA9PSAwICkgewogICAgICAgICAgICAgICAgJFVwQmxvY2sgPSAnVGVtcGxhdGVFZGl0NE5vVXBCdXR0b24nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFVwQmxvY2sgPSAnVGVtcGxhdGVFZGl0NFVwQnV0dG9uJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGlzIGlzIHRoZSBsYXN0IGVsZW1lbnQKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlUm93Q291bnRlciA9PSAoICROdW1iZXJPZkVsZW1lbnRzIC0gMSApICkgewogICAgICAgICAgICAgICAgJERvd25CbG9jayA9ICdUZW1wbGF0ZUVkaXQ0Tm9Eb3duQnV0dG9uJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREb3duQmxvY2sgPSAnVGVtcGxhdGVFZGl0NERvd25CdXR0b24nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVwIGJ1dHRvbiBibG9jawogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFVwQmxvY2ssCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG93biBidXR0b24gYmxvY2sKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICREb3duQmxvY2ssCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRBdHRyaWJ1dGVSb3dDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhbiBlbXB0eSBsaXN0CiAgICAgICAgaWYgKCRFbXB0eU1hcCkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDROb01hcEZvdW5kJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbHVtbnMgPT4gJEhlYWRlckNvdW50ZXIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAobWFwcGluZykKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZVNhdmU0JyApIHsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgaWQKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICBteSAlU3VibWl0ID0gKAogICAgICAgICAgICBTdWJtaXROZXh0ID0+ICdUZW1wbGF0ZUVkaXQ1JywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0MycsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDQnLAogICAgICAgICAgICBNYXBwaW5nQWRkID0+ICdUZW1wbGF0ZUVkaXQ0JywKICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYWN0aW9uCiAgICAgICAgbXkgJFN1YmFjdGlvbiAgICA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICBteSAkU3VibWl0QnV0dG9uID0gJyc7CgogICAgICAgIFBBUkFNOgogICAgICAgIGZvciBteSAkU3VibWl0S2V5ICggc29ydCBrZXlzICVTdWJtaXQgKSB7CiAgICAgICAgICAgIG5leHQgUEFSQU0gaWYgISRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRTdWJtaXRLZXkgKTsKCiAgICAgICAgICAgICRTdWJhY3Rpb24gICAgPSAkU3VibWl0eyRTdWJtaXRLZXl9OwogICAgICAgICAgICAkU3VibWl0QnV0dG9uID0gJFN1Ym1pdEtleTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICAgICAgbXkgJE1hcHBpbmdMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlIHZhbHVlcwogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyRNYXBwaW5nT2JqZWN0QXR0cmlidXRlc30gKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgb2JqZWN0IGZvcm0gZGF0YQogICAgICAgICAgICAgICAgJE9iamVjdEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ID0+ICdPYmplY3Q6OicgLiAkQ291bnRlciAuICc6OicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFwlT2JqZWN0QXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZSB2YWx1ZXMKICAgICAgICAgICAgbXkgJUZvcm1hdEF0dHJpYnV0ZVZhbHVlczsKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHskTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXN9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IGZvcm1hdCBmb3JtIGRhdGEKICAgICAgICAgICAgICAgICRGb3JtYXRBdHRyaWJ1dGVWYWx1ZXN7ICRJdGVtLT57S2V5fSB9ID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgSXRlbSAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIFByZWZpeCA9PiAnRm9ybWF0OjonIC4gJENvdW50ZXIgLiAnOjonLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzYXZlIHRoZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICAgICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBNYXBwaW5nRm9ybWF0RGF0YSA9PiBcJUZvcm1hdEF0dHJpYnV0ZVZhbHVlcywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBNQVBQSU5HSUQ6CiAgICAgICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICAgICAjIGRlbGV0ZSB0aGlzIG1hcHBpbmcgcm93CiAgICAgICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gIk1hcHBpbmdEZWxldGU6OiRNYXBwaW5nSUQiICkgKSB7CiAgICAgICAgICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtb3ZlIG1hcHBpbmcgZGF0YSByb3cgdXAKICAgICAgICAgICAgaWYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAiTWFwcGluZ1VwOjokTWFwcGluZ0lEIiApICkgewogICAgICAgICAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ1VwKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBtb3ZlIG1hcHBpbmcgZGF0YSByb3cgZG93bgogICAgICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICJNYXBwaW5nRG93bjo6JE1hcHBpbmdJRCIgKSApIHsKICAgICAgICAgICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdEb3duKAogICAgICAgICAgICAgICAgICAgIE1hcHBpbmdJRCAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IE1BUFBJTkdJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICBpZiAoICRTdWJtaXRCdXR0b24gZXEgJ01hcHBpbmdBZGQnICkgewogICAgICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nQWRkKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249JFN1YmFjdGlvbjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgZWRpdCAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlRWRpdDUnICkgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgT2JqZWN0T3B0aW9uU3RyZwogICAgICAgIG15ICRPYmplY3RPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkT2JqZWN0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPYmplY3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgRm9ybWF0T3B0aW9uU3RyZwogICAgICAgIG15ICRGb3JtYXRPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRm9ybWF0TGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdGb3JtYXQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3RPcHRpb25TdHJnID0+ICRPYmplY3RPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgRm9ybWF0T3B0aW9uU3RyZyA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgICAgICMgZ2V0IHNlYXJjaCBkYXRhCiAgICAgICAgbXkgJFNlYXJjaERhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgcmVzY3JpY3QgZXhwb3J0IHN0cmluZwogICAgICAgIG15ICRSZXN0cmljdEV4cG9ydFN0cmcgPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgICAgIEl0ZW0gPT4gewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1Jlc3RyaWN0RXhwb3J0JywKICAgICAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICdDaGVja2JveCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBWYWx1ZSA9PiBzY2FsYXIga2V5cyAleyRTZWFyY2hEYXRhfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICBSZXN0cmljdEV4cG9ydFN0cmcgPT4gJFJlc3RyaWN0RXhwb3J0U3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBzZWFyY2ggYXR0cmlidXRlcwogICAgICAgIG15ICRTZWFyY2hBdHRyaWJ1dGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICAgICAgZm9yIG15ICRJdGVtICggQHskU2VhcmNoQXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gID0+ICRJdGVtLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFNlYXJjaERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGF0dHJpYnV0ZSByb3cKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQ1RWxlbWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJEl0ZW0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgICAgIElEICAgICAgICA9PiAkSXRlbS0+e0tleX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVtcGxhdGUgc2F2ZSAoc2VhcmNoKQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1RlbXBsYXRlU2F2ZTUnICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBpZAogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgIG15ICVTdWJtaXQgPSAoCiAgICAgICAgICAgIFN1Ym1pdE5leHQgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgU3VibWl0QmFjayA9PiAnVGVtcGxhdGVFZGl0NCcsCiAgICAgICAgICAgIFJlbG9hZCAgICAgPT4gJ1RlbXBsYXRlRWRpdDUnLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhY3Rpb24KICAgICAgICBteSAkU3ViYWN0aW9uID0gJFN1Ym1pdHtSZWxvYWR9OwoKICAgICAgICBQQVJBTToKICAgICAgICBmb3IgbXkgJFN1Ym1pdEtleSAoIHNvcnQga2V5cyAlU3VibWl0ICkgewogICAgICAgICAgICBuZXh0IFBBUkFNIGlmICEkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkU3VibWl0S2V5ICk7CgogICAgICAgICAgICAkU3ViYWN0aW9uID0gJFN1Ym1pdHskU3VibWl0S2V5fTsKICAgICAgICAgICAgbGFzdCBQQVJBTTsKICAgICAgICB9CgogICAgICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggcmVzdHJpY3Rpb25zCiAgICAgICAgaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3RyaWN0RXhwb3J0JyApICkgewoKICAgICAgICAgICAgIyBkZWxldGUgYWxsIHNlYXJjaCBkYXRhCiAgICAgICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249JFN1YmFjdGlvbjtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlYXJjaCBhdHRyaWJ1dGVzCiAgICAgICAgbXkgJFNlYXJjaEF0dHJpYnV0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hBdHRyaWJ1dGVzR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gZm9ybQogICAgICAgIG15ICVBdHRyaWJ1dGVWYWx1ZXM7CiAgICAgICAgZm9yIG15ICRJdGVtICggQHskU2VhcmNoQXR0cmlidXRlTGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCBmb3JtIGRhdGEKICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlc3sgJEl0ZW0tPntLZXl9IH0gPSAkTGF5b3V0T2JqZWN0LT5JbXBvcnRFeHBvcnRGb3JtRGF0YUdldCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbG9hZCBmb3JtIGlmIHZhbHVlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntGb3JtfS0+e0ludmFsaWR9ICkgewogICAgICAgICAgICAgICAgJFN1YmFjdGlvbiA9ICRTdWJtaXR7UmVsb2FkfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRoZSBzZWFyY2ggZGF0YQogICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBTZWFyY2hEYXRhID0+IFwlQXR0cmlidXRlVmFsdWVzLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj0kU3ViYWN0aW9uO1RlbXBsYXRlSUQ9JFRlbXBsYXRlSUQiLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZSBkZWxldGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZURlbGV0ZScgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGlkCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBkZWxldGUgdGVtcGxhdGUgZnJvbSBkYXRhYmFzZQogICAgICAgICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlRGVsZXRlKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHJlZGlyZWN0IHRvIG92ZXJ2aWV3CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGltcG9ydCBpbmZvcm1hdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydEluZm9ybWF0aW9uJyApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJE9iamVjdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gb2JqZWN0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvcm1hdCBsaXN0CiAgICAgICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgogICAgICAgIGlmICggISRGb3JtYXRMaXN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGZvcm1hdCBiYWNrZW5kIGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVGVtcGxhdGVEYXRhID0ge307CiAgICAgICAgJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RlbXBsYXRlSUQnICk7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgbm90IGZvdW5kIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntPYmplY3R9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIGdlbmVyYXRlIEZvcm1hdE9wdGlvblN0cmcKICAgICAgICBteSAkRm9ybWF0T3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEZvcm1hdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnRm9ybWF0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgT2JqZWN0T3B0aW9uU3RyZyA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvblN0cmcgPT4gJEZvcm1hdE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydEluZm9ybWF0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRUZW1wbGF0ZURhdGF9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGltcG9ydAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0ltcG9ydCcgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSB7fTsKICAgICAgICAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVtcGxhdGVJRCcgKTsKCiAgICAgICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgICAgICRUZW1wbGF0ZURhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVEYXRhLT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNvdXJjZSBmaWxlCiAgICAgICAgbXkgJVNvdXJjZUZpbGUgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CgogICAgICAgICRTb3VyY2VGaWxle0NvbnRlbnR9IHx8PSAnJzsKCiAgICAgICAgIyBpbXBvcnQgZGF0YQogICAgICAgIG15ICRSZXN1bHQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5JbXBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFwkU291cmNlRmlsZXtDb250ZW50fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdFcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIG91dHB1dCBpbXBvcnQgcmVzdWx0cwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICV7JFJlc3VsdH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIHJldHVybiBjb2RlcyBhbmQgY29sbGVjdCB0aGUgZHVwbGljYXRlIG5hbWVzCiAgICAgICAgbXkgQER1cGxpY2F0ZU5hbWVzOwogICAgICAgIFJFVFVSTkNPREU6CiAgICAgICAgZm9yIG15ICRSZXRDb2RlICggc29ydCBrZXlzICV7ICRSZXN1bHQtPntSZXRDb2RlfSB9ICkgewoKICAgICAgICAgICAgIyBqdXN0IGdldCB0aGUgZHVwbGljYXRlIG5hbWUKICAgICAgICAgICAgaWYgKCAkUmV0Q29kZSA9fiBteyBcQSBEdXBsaWNhdGVOYW1lIFxzKyAoLispIH14bXMgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEdXBsaWNhdGVOYW1lcywgJDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRSZXN1bHRSZXR1cm5Db2RlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuQ29kZU5hbWUgID0+ICRSZXRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Db2RlQ291bnQgPT4gJFJlc3VsdC0+e1JldENvZGV9LT57JFJldENvZGV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBkdXBsaWNhdGUgbmFtZXMgaWYgbmVjY2Vzc2FyeQogICAgICAgIGlmIChARHVwbGljYXRlTmFtZXMpIHsKCiAgICAgICAgICAgIG15ICREdXBsaWNhdGVOYW1lc1N0cmluZyA9IGpvaW4gJywgJywgQER1cGxpY2F0ZU5hbWVzOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbXBvcnRSZXN1bHREdXBsaWNhdGVOYW1lcycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGVOYW1lcyA9PiAkRHVwbGljYXRlTmFtZXNTdHJpbmcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgbGFzdCBwcm9jZXNzZWQgbGluZSBtdW1iZXIgb2YgaW1wb3J0IGZpbGUKICAgICAgICBpZiAoICRSZXN1bHQtPntGYWlsZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExhc3RMaW5lTnVtYmVyID0+ICRSZXN1bHQtPntDb3VudGVyfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHN0YXJ0IG91dHB1dAogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluSW1wb3J0RXhwb3J0JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZXhwb3J0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRXhwb3J0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRlbXBsYXRlRGF0YSA9IHt9OwogICAgICAgICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZW1wbGF0ZUlEJyApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICAgICAgJFRlbXBsYXRlRGF0YSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlR2V0KAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBleHBvcnQgZGF0YQogICAgICAgIG15ICRSZXN1bHQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5FeHBvcnQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkUmVzdWx0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yIG9jY3VycmVkLiBFeHBvcnQgaW1wb3NzaWJsZSEgU2VlIFN5c2xvZyBmb3IgZGV0YWlscy4nKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJEZpbGVDb250ZW50ID0gam9pbiAiXG4iLCBAeyAkUmVzdWx0LT57RGVzdGluYXRpb25Db250ZW50fSB9OwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAnRXhwb3J0LmNzdicsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2NzdicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRGaWxlQ29udGVudCwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkFkZCcgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwoKICAgICAgICBteSAkRW1wdHlEYXRhYmFzZSA9IDE7CgogICAgICAgIENMQVNTOgogICAgICAgIGZvciBteSAkT2JqZWN0ICggc29ydCB7ICRPYmplY3RMaXN0LT57JGF9IGNtcCAkT2JqZWN0TGlzdC0+eyRifSB9IGtleXMgJXskT2JqZWN0TGlzdH0gKSB7CgogICAgICAgICAgICAjIGdldCB0ZW1wbGF0ZSBsaXN0CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgICAgICAgICBPYmplY3QgPT4gJE9iamVjdCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkVGVtcGxhdGVMaXN0IHx8IHJlZiAkVGVtcGxhdGVMaXN0IG5lICdBUlJBWScgfHwgIUB7JFRlbXBsYXRlTGlzdH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IENMQVNTOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRW1wdHlEYXRhYmFzZSA9IDA7CgogICAgICAgICAgICAjIG91dHB1dCBsaXN0CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgPT4gJE9iamVjdExpc3QtPnskT2JqZWN0fSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJFRlbXBsYXRlSUQgKCBAeyRUZW1wbGF0ZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICAgICAgICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCByb3cKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7JFRlbXBsYXRlRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdE5hbWUgPT4gJEZvcm1hdExpc3QtPnsgJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgICA9PiAkVmFsaWRMaXN0eyAkVGVtcGxhdGVEYXRhLT57VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYW4gZW1wdHkgbGlzdAogICAgICAgIGlmICgkRW1wdHlEYXRhYmFzZSkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGlzdAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgTGlzdCcpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJyApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgc3RhcnQgdGVtcGxhdGUgb3V0cHV0CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2tUZW1wbGF0ZUVkaXQxIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVNlcnZlckVycm9yOwogICAgaWYgKCAkUGFyYW17U2VydmVyRXJyb3J9ICkgewogICAgICAgICVTZXJ2ZXJFcnJvciA9ICV7ICRQYXJhbXtTZXJ2ZXJFcnJvcn0gfTsKICAgIH0KCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25PdmVydmlldycgKTsKCiAgICAjIGdlbmVyYXRlIFZhbGlkT3B0aW9uU3RyZwogICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgIG15ICRWYWxpZE9wdGlvblN0cmcgID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICk7CgogICAgbXkgJENsYXNzID0gJyBWYWxpZGF0ZV9SZXF1aXJlZCAnOwoKICAgIGlmICggJFNlcnZlckVycm9ye05hbWV9ICkgewogICAgICAgICRDbGFzcyAuPSAnU2VydmVyRXJyb3InOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDEnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICBOYW1lQ2xhc3MgICAgICAgPT4gJENsYXNzLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdFZGl0T2JqZWN0Rm9ybWF0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBPYmplY3ROYW1lID0+ICRQYXJhbXtPYmplY3R9LAogICAgICAgICAgICAgICAgRm9ybWF0TmFtZSA9PiAkUGFyYW17Rm9ybWF0fSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte05ld30gKSB7CgogICAgICAgICMgZ2V0IEltcG9ydEV4cG9ydCBvYmplY3QKICAgICAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwoKICAgICAgICAjIGdldCBvYmplY3QgbGlzdAogICAgICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKICAgICAgICBpZiAoICEkT2JqZWN0TGlzdCApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBvYmplY3QgYmFja2VuZCBmb3VuZCEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZm9ybWF0IGxpc3QKICAgICAgICBteSAkRm9ybWF0TGlzdCA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdExpc3QoKTsKCiAgICAgICAgaWYgKCAhJEZvcm1hdExpc3QgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gZm9ybWF0IGJhY2tlbmQgZm91bmQhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRDbGFzcyA9ICcgVmFsaWRhdGVfUmVxdWlyZWQgJzsKCiAgICAgICAgaWYgKCAkU2VydmVyRXJyb3J7T2JqZWN0fSApIHsKICAgICAgICAgICAgJENsYXNzIC49ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIE9iamVjdE9wdGlvblN0cmcKICAgICAgICBteSAkT2JqZWN0T3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJE9iamVjdExpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnT2JqZWN0JywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtPYmplY3R9IHx8ICcnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkQ2xhc3MgLiAnIE1vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJENsYXNzID0gJyBWYWxpZGF0ZV9SZXF1aXJlZCAnOwogICAgICAgIGlmICggJFNlcnZlckVycm9ye0Zvcm1hdH0gKSB7CiAgICAgICAgICAgICRDbGFzcyAuPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBGb3JtYXRPcHRpb25TdHJnCiAgICAgICAgbXkgJEZvcm1hdE9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRGb3JtYXRMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0Zvcm1hdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17Rm9ybWF0fSB8fCAnJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJENsYXNzIC4gJyBNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOZXdPYmplY3RGb3JtYXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE9iamVjdE9wdGlvbiA9PiAkT2JqZWN0T3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEZvcm1hdE9wdGlvbiA9PiAkRm9ybWF0T3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9NYXNrVGVtcGxhdGVFZGl0MiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVTZXJ2ZXJFcnJvcjsKICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSApIHsKICAgICAgICAlU2VydmVyRXJyb3IgPSAleyAkUGFyYW17U2VydmVyRXJyb3J9IH07CiAgICB9CgogICAgbXkgJURhdGFUeXBlRXJyb3I7CiAgICBpZiAoICRQYXJhbXtEYXRhVHlwZUVycm9yfSApIHsKICAgICAgICAlRGF0YVR5cGVFcnJvciA9ICV7ICRQYXJhbXtEYXRhVHlwZUVycm9yfSB9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJFRlbXBsYXRlSUQ7CiAgICBpZiAoICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRQYXJhbXtUZW1wbGF0ZUlEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkZWQgVGVtcGxhdGVJRCEnKSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBJbXBvcnRFeHBvcnQgb2JqZWN0CiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGE7CiAgICAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdCYWNrVVJMJywKICAgICAgICBWYWx1ZSA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MTtUZW1wbGF0ZUlEPSRUZW1wbGF0ZUlEIiwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdCYXNlTGluaycsCiAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdUZW1wbGF0ZU92ZXJ2aWV3JywKICAgICAgICBWYWx1ZSA9PiAxLAogICAgKTsKCiAgICAjIG91dHB1dCBvdmVydmlldwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CgogICAgIyBvdXRwdXQgbGlzdAogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnVGVtcGxhdGVFZGl0MicsCiAgICAgICAgRGF0YSA9PiAkVGVtcGxhdGVEYXRhLAogICAgKTsKCiAgICAjIGdldCBvYmplY3QgYXR0cmlidXRlcwogICAgbXkgJE9iamVjdEF0dHJpYnV0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBvYmplY3QgZGF0YQogICAgbXkgJE9iamVjdERhdGEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGphdmFzY3JpcHQgdmFsaWRhdGlvbiBjbGFzcyBwZXIgZGF0YXR5cGUKICAgIG15ICVKU0NsYXNzOwogICAgbXkgJVByZWRlZmluZWRFcnJvck1lc3NhZ2VzOwoKICAgICRKU0NsYXNze051bWJlcn0gICAgICAgICAgICAgICAgPSAnVmFsaWRhdGVfTnVtYmVyJzsKICAgICRKU0NsYXNze051bWJlckJpZ2dlclRoYW5aZXJvfSAgPSAnVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm8nOwogICAgJEpTQ2xhc3N7SW50ZWdlcn0gICAgICAgICAgICAgICA9ICdWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyJzsKICAgICRKU0NsYXNze0ludGVnZXJCaWdnZXJUaGFuWmVyb30gPSAnVmFsaWRhdGVfTnVtYmVySW50ZWdlckJpZ2dlclRoYW5aZXJvJzsKCiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7TnVtYmVyfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnbnVtYmVyJyk7CiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7TnVtYmVyQmlnZ2VyVGhhblplcm99CiAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ251bWJlciBiaWdnZXIgdGhhbiB6ZXJvJyk7CiAgICAkUHJlZGVmaW5lZEVycm9yTWVzc2FnZXN7SW50ZWdlcn0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2ludGVnZXInKTsKICAgICRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3tJbnRlZ2VyQmlnZ2VyVGhhblplcm99CiAgICAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2ludGVnZXIgYmlnZ2VyIHRoYW4gemVybycpOwoKICAgICMgb3V0cHV0IG9iamVjdCBhdHRyaWJ1dGVzCiAgICBmb3IgbXkgJEl0ZW0gKCBAeyRPYmplY3RBdHRyaWJ1dGVMaXN0fSApIHsKCiAgICAgICAgbXkgJENsYXNzID0gJyAnOwogICAgICAgIG15ICRWYWx1ZTsKCiAgICAgICAgbXkgJERhdGFUeXBlRXJyb3I7CiAgICAgICAgbXkgJEVycm9yTWVzc2FnZTsKCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e1JlcXVpcmVkfSApIHsKICAgICAgICAgICAgJENsYXNzICAgICAgICA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICRFcnJvck1lc3NhZ2UgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0VsZW1lbnQgcmVxdWlyZWQsIHBsZWFzZSBpbnNlcnQgZGF0YScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkSXRlbS0+e0lucHV0fS0+e0RhdGFUeXBlfSApIHsKICAgICAgICAgICAgJENsYXNzIC49ICIgJEpTQ2xhc3N7ICRJdGVtLT57SW5wdXR9LT57RGF0YVR5cGV9IH0iOwogICAgICAgICAgICAkRXJyb3JNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgJ0ludmFsaWQgZGF0YSwgcGxlYXNlIGluc2VydCBhIHZhbGlkICVzJywKICAgICAgICAgICAgICAgICRQcmVkZWZpbmVkRXJyb3JNZXNzYWdlc3sgJEl0ZW0tPntJbnB1dH0tPntEYXRhVHlwZX0gfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZGF0YSBmcm9tIGZvcm0gb3IgZnJvbSBkYXRhYmFzZQogICAgICAgICMgU2VydmVyRXJyb3IgPSBzaG93IHRoZSB3cm9uZyBkYXRhIGluIGZvcm0KICAgICAgICAjICFTZXJ2ZXJFcnJvciA9IHNob3cgZGF0YWJhc2UgZGF0YSBvciBuZXcgZmllbGRzCgogICAgICAgIGlmICggJFBhcmFte1NlcnZlckVycm9yfSB8fCAkUGFyYW17RGF0YVR5cGVFcnJvcn0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRQYXJhbXtUZW1wbGF0ZURhdGFGb3JtfS0+eyAkSXRlbS0+e0tleX0gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRPYmplY3REYXRhLT57ICRJdGVtLT57S2V5fSB9OwogICAgICAgIH0KCiAgICAgICAgIyBlcnJvciBhcmVhCgogICAgICAgICMgcHJlcGFyZSBkaWZmZXJlbnQgZGF0YSAmIG1lc3NhZ2UgcGVyIGVycm9yCiAgICAgICAgaWYgKCAkU2VydmVyRXJyb3J7ICRJdGVtLT57TmFtZX0gfSB8fCAkRGF0YVR5cGVFcnJvcnsgJEl0ZW0tPntOYW1lfSB9ICkgewogICAgICAgICAgICAkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBmb3JtIGlucHV0CiAgICAgICAgbXkgJElucHV0U3RyaW5nID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgICAgICBJdGVtICA9PiAkSXRlbSwKICAgICAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJyBNb2Rlcm5pemUnLAogICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBpZAogICAgICAgIG15ICRJRDsKICAgICAgICBpZiAoICRJdGVtLT57UHJlZml4fSApIHsKICAgICAgICAgICAgJElEID0gIiRJdGVtLT57UHJlZml4fSRJdGVtLT57S2V5fSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkSUQgPSAkSXRlbS0+e0tleX07CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhdHRyaWJ1dGUgcm93CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDJFbGVtZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgIElucHV0U3RyZyAgICA9PiAkSW5wdXRTdHJpbmcsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICAgPT4gJElELAogICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRFcnJvck1lc3NhZ2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBoZWFkZXIgYW5kIG5hdmJhcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzdGFydCB0ZW1wbGF0ZSBvdXRwdXQKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgcmV0dXJuICRPdXRwdXQ7Cgp9CgpzdWIgX01hc2tUZW1wbGF0ZUVkaXQzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVNlcnZlckVycm9yOwogICAgaWYgKCAkUGFyYW17U2VydmVyRXJyb3J9ICkgewogICAgICAgICVTZXJ2ZXJFcnJvciA9ICV7ICRQYXJhbXtTZXJ2ZXJFcnJvcn0gfTsKICAgIH0KCiAgICBteSAkVGVtcGxhdGVJRDsKICAgIGlmICggJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRUZW1wbGF0ZUlEID0gJFBhcmFte1RlbXBsYXRlSUR9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgaWYgKCAhJFRlbXBsYXRlSUQgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIG5vdCBmb3VuZCEnKSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBJbXBvcnRFeHBvcnQgb2JqZWN0CiAgICBteSAkSW1wb3J0RXhwb3J0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpOwoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGE7CiAgICAkVGVtcGxhdGVEYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJFRlbXBsYXRlRGF0YS0+e1RlbXBsYXRlSUR9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdUZW1wbGF0ZSBub3QgZm91bmQhJyksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte0JhY2tVUkx9ID0gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07U3ViYWN0aW9uPVRlbXBsYXRlRWRpdDI7VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCI7CgogICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICMgb3V0cHV0IGxpc3QKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDMnLAogICAgICAgIERhdGEgPT4gJFRlbXBsYXRlRGF0YSwKICAgICk7CgogICAgIyBnZXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgIG15ICRGb3JtYXRBdHRyaWJ1dGVMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJEZvcm1hdERhdGEgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0Zvcm1hdCBub3QgZm91bmQhJyksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBvdXRwdXQgZm9ybWF0IGF0dHJpYnV0ZXMKICAgIGZvciBteSAkSXRlbSAoIEB7JEZvcm1hdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAjIGJ1aWxkIGlkCiAgICAgICAgbXkgJElEOwogICAgICAgIGlmICggJEl0ZW0tPntQcmVmaXh9ICkgewogICAgICAgICAgICAkSUQgPSAiJEl0ZW0tPntQcmVmaXh9JEl0ZW0tPntLZXl9IjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRJRCA9ICIkSXRlbS0+e0tleX0iOwogICAgICAgIH0KCiAgICAgICAgbXkgJENsYXNzID0gJyAnOwogICAgICAgIGlmICggJEl0ZW0tPntJbnB1dH0tPntSZXF1aXJlZH0gKSB7CiAgICAgICAgICAgICRDbGFzcyA9ICdWYWxpZGF0ZV9SZXF1aXJlZCAnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU2VydmVyRXJyb3J7ICRJdGVtLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgJENsYXNzIC49ICcgU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgZm9ybSBpbnB1dAogICAgICAgIG15ICRJbnB1dFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgKICAgICAgICAgICAgSXRlbSAgPT4gJEl0ZW0sCiAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcyAuICcgTW9kZXJuaXplJywKICAgICAgICAgICAgVmFsdWUgPT4gJEZvcm1hdERhdGEtPnsgJEl0ZW0tPntLZXl9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgYXR0cmlidXRlIHJvdwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUZW1wbGF0ZUVkaXQzRWxlbWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICRJdGVtLT57TmFtZX0gfHwgJycsCiAgICAgICAgICAgICAgICBJbnB1dFN0cmcgPT4gJElucHV0U3RyaW5nLAogICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICRJRCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCByZXF1aXJlZCBub3RpY2UKICAgICAgICBpZiAoICRJdGVtLT57SW5wdXR9LT57UmVxdWlyZWR9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e05hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkltcG9ydEV4cG9ydCcsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKCn0KCjE7Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0Q2hlY2tib3g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRDaGVja2JveCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgY2hlY2tib3ggZWxlbWVudHMgaW4gaW1wb3J0L2V4cG9ydC4KCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0Q2hlY2tib3gtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBGb3JtSW5wdXRDcmVhdGUoKQoKQ3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICAgICBWYWx1ZSAgPT4gJ1ZhbHVlJywgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRDaGVja2VkID0gJFBhcmFte1ZhbHVlfSA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKCiAgICByZXR1cm4KICAgICAgICBxcXs8aW5wdXQgaWQ9IiRQYXJhbXtQcmVmaXh9JFBhcmFte0l0ZW19LT57S2V5fSIgdHlwZT0iY2hlY2tib3giIG5hbWU9IiRQYXJhbXtQcmVmaXh9JFBhcmFte0l0ZW19LT57S2V5fSIgJENoZWNrZWQgLz59Owp9Cgo9aGVhZDIgRm9ybURhdGFHZXQoKQoKR2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRQYXJhbSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIHJldHVybiAkRm9ybURhdGE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0VFQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SW1wb3J0RXhwb3J0OjpMYXlvdXRUVCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBmb3IgZGlzcGxheSBDPFRUPiBjb2RlCgo9Y3V0Cgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnQ6OkxheW91dFRULT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRm9ybUlucHV0Q3JlYXRlKCkKCkNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybUlucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e0RhdGF9Owp9Cgo9aGVhZDIgRm9ybURhdGFHZXQoKQoKR2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0U2VsZWN0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0U2VsZWN0aW9uIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBsYXlvdXQgZnVuY3Rpb25zIGZvciBzZWxlY3Rpb24gZWxlbWVudHMKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0U2VsZWN0aW9uLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgRm9ybUlucHV0Q3JlYXRlKCkKCkNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtSW5wdXRDcmVhdGUoCiAgICAgICAgSXRlbSAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCA9PiAnUHJlZml4OjonLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsdWUgID0+ICdWYWx1ZScsICAgICAjIChvcHRpb25hbCkKICAgICAgICBDbGFzcyAgPT4gJ01vZGVybml6ZScgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CiAgICAkUGFyYW17VmFsdWV9ICB8fD0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gJiYgJFBhcmFte1ZhbHVlfSA9fiBteyAjIyMjIyB9eG1zICkgewogICAgICAgIG15IEBWYWx1ZXMgPSBzcGxpdCAnIyMjIyMnLCAkUGFyYW17VmFsdWV9OwogICAgICAgICRQYXJhbXtWYWx1ZX0gPSBcQFZhbHVlczsKICAgIH0KCiAgICAjIGdlbmVyYXRlIG9wdGlvbiBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyktPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIElEICAgICAgICAgICA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICRQYXJhbXtDbGFzc30sCiAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57RGF0YX0gfHwge30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgVHJhbnNsYXRpb24gID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSwKICAgICAgICBUcmVlVmlldyAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJlZVZpZXd9IHx8IDAsCiAgICAgICAgUG9zc2libGVOb25lID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1Bvc3NpYmxlTm9uZX0sCiAgICAgICAgTXVsdGlwbGUgICAgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e011bHRpcGxlfSwKICAgICAgICBTaXplICAgICAgICAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0sCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aGVhZDIgRm9ybURhdGFHZXQoKQoKR2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBARm9ybURhdGFzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLT5HZXRBcnJheSgKICAgICAgICBQYXJhbSA9PiAkUGFyYW17UHJlZml4fSAuICRQYXJhbXtJdGVtfS0+e0tleX0sCiAgICApOwoKICAgIG15ICRGb3JtRGF0YSA9IGpvaW4gJyMjIyMjJywgQEZvcm1EYXRhczsKCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0VGV4dDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJbXBvcnRFeHBvcnQ6OkxheW91dFRleHQgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGxheW91dCBmdW5jdGlvbnMgZm9yIHRleHQgZWxlbWVudHMKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0VGV4dC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEZvcm1JbnB1dENyZWF0ZSgpCgpDcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gICAgID0+ICRJdGVtUmVmLAogICAgICAgIFByZWZpeCAgID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICAgICBWYWx1ZSAgICA9PiAnVmFsdWUnLCAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVhZG9ubHkgPT4gMSwgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBGb3JtSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFBhcmFte1ByZWZpeH0gfHw9ICcnOwoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKICAgIG15ICRTaXplID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNDA7CiAgICBteSAkU2l6ZUNsYXNzOwogICAgaWYgKCAkU2l6ZSA8IDE1ICkgewogICAgICAgICRTaXplQ2xhc3MgPSAnVzEwcGMnOwogICAgfQogICAgZWxzaWYgKCAkU2l6ZSA8IDM1ICkgewogICAgICAgICRTaXplQ2xhc3MgPSAnVzMzcGMnOwogICAgfQogICAgZWxzaWYgKCAkU2l6ZSA8IDUwICkgewogICAgICAgICRTaXplQ2xhc3MgPSAnVzUwcGMnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNpemVDbGFzcyA9ICdXNzVwYyc7CiAgICB9CgogICAgIyBwcmVwYXJlIGRhdGEKICAgIG15ICRJRCA9ICggJFBhcmFte1ByZWZpeH0gfHwgJycgKSAuICggJFBhcmFte0l0ZW19LT57S2V5fSApOwogICAgbXkgJE5hbWUgPSAoICRQYXJhbXtQcmVmaXh9IHx8ICcnICkgLiAoICRQYXJhbXtOYW1lfSB8fCAkSUQgKTsKICAgIG15ICRDbGFzcyA9ICggJFNpemVDbGFzcyB8fCAnJyApIC4gKCAkUGFyYW17Q2xhc3N9IHx8ICcnICk7CgogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgaWQ9XCIkSURcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCIkTmFtZVwiIGNsYXNzPVwiJENsYXNzXCIgIjsKCiAgICBpZiAoJFZhbHVlKSB7CgogICAgICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAjIHRyYW5zbGF0ZQogICAgICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJFZhbHVlKTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkVmFsdWUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkVmFsdWUsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJFN0cmluZyAuPSAidmFsdWU9XCIkVmFsdWVcIiAiOwogICAgfQoKICAgICMgYWRkIG1heGltdW0gbGVuZ3RoCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH0gKSB7CiAgICAgICAgJFN0cmluZyAuPSAibWF4bGVuZ3RoPVwiJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofVwiICI7CiAgICB9CgogICAgIyBhZGQgcmVhZG9ubHkKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVhZG9ubHl9ICkgewogICAgICAgICRTdHJpbmcgLj0gJ3JlYWRvbmx5PSJyZWFkb25seSIgJzsKICAgIH0KCiAgICAkU3RyaW5nIC49ICIvPiAiOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aGVhZDIgRm9ybURhdGFHZXQoKQoKR2V0IGZvcm0gZGF0YQoKICAgIG15ICRGb3JtRGF0YSA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBJdGVtICAgPT4gJEl0ZW1SZWYsCiAgICAgICAgUHJlZml4ID0+ICdQcmVmaXg6OicsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0l0ZW19ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkUGFyYW17UHJlZml4fSB8fD0gJyc7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkRm9ybURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyktPkdldFBhcmFtKAogICAgICAgIFBhcmFtID0+ICRQYXJhbXtQcmVmaXh9IC4gJFBhcmFte0l0ZW19LT57S2V5fSwKICAgICk7CgogICAgIyByZWdleCBjaGVjawogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWdleH0gJiYgJEZvcm1EYXRhICF+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZ2V4fSApIHsKCiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgcmV0dXJuICRGb3JtRGF0YTsKICAgIH0KCiAgICByZXR1cm4gJEZvcm1EYXRhIGlmICRGb3JtRGF0YTsKICAgIHJldHVybiAkRm9ybURhdGEgaWYgISRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfTsKCiAgICAjIHNldCBpbnZhbGlkIHBhcmFtCiAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+e0ludmFsaWR9ID0gMTsKCiAgICByZXR1cm4gJEZvcm1EYXRhOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDo6SW1wb3J0RXhwb3J0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQ6OkltcG9ydEV4cG9ydAoKPWN1dAoKPWhlYWQyIEltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSgpCgpSZXR1cm5zIGEgaW5wdXQgZmllbGQgaHRtbCBzdHJpbmcKCiAgICBteSAkU3RyaW5nID0gJExheW91dE9iamVjdC0+SW1wb3J0RXhwb3J0Rm9ybUlucHV0Q3JlYXRlKAogICAgICAgIEl0ZW0gID0+ICRJdGVtUmVmLAogICAgICAgIFZhbHVlID0+ICdWYWx1ZScsICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydEV4cG9ydEZvcm1JbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fSW1wb3J0RXhwb3J0TG9hZExheW91dEJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntUeXBlfSwKICAgICk7CgogICAgcmV0dXJuICcnIGlmICEkQmFja2VuZE9iamVjdDsKCiAgICAjIGxvb2t1cCBpdGVtIHZhbHVlCiAgICBteSAkU3RyaW5nID0gJEJhY2tlbmRPYmplY3QtPkZvcm1JbnB1dENyZWF0ZSglUGFyYW0pOwoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aGVhZDIgSW1wb3J0RXhwb3J0Rm9ybURhdGFHZXQoKQoKUmV0dXJucyB0aGUgdmFsdWVzIGZyb20gdGhlIGh0bWwgZm9ybSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YSA9ICRMYXlvdXRPYmplY3QtPkltcG9ydEV4cG9ydEZvcm1EYXRhR2V0KAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydEV4cG9ydEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJEZvcm1EYXRhID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KCVQYXJhbSk7CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKPWhlYWQyIF9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgpCgpUbyBsb2FkIGEgaW1wb3J0L2V4cG9ydCBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCiAgICBteSAkQmFja2VuZCA9ICRMYXlvdXRPYmplY3QtPl9JbXBvcnRFeHBvcnRMb2FkTGF5b3V0QmFja2VuZCgKICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgKTsKCkFuIGluc3RhbmNlIG9mIHRoZSBsb2FkZWQgYmFja2VuZCBtb2R1bGUgaXMgcmV0dXJuZWQuCgo9Y3V0CgpzdWIgX0ltcG9ydEV4cG9ydExvYWRMYXlvdXRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICBpZiAoICEkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkltcG9ydEV4cG9ydDo6TGF5b3V0JFBhcmFte1R5cGV9IjsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRQYXJhbXtUeXBlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICApOwoKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBiYWNrZW5kIG1vZHVsZSAkUGFyYW17VHlwZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJEJhY2tlbmRPYmplY3Q7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3IikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJGaXJzdCI+CiAgICA8aDE+WyUgVHJhbnNsYXRlKCJJbXBvcnQvRXhwb3J0IE1hbmFnZW1lbnQiKSB8IGh0bWwgJV08L2gxPgoKICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkFjdGlvbnMiKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249VGVtcGxhdGVFZGl0MSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtcGx1cy1zcXVhcmUiPjwvaT5bJSBUcmFuc2xhdGUoIkFkZCB0ZW1wbGF0ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2E+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkFkZCIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJOb3RlIikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQ3JlYXRlIGEgdGVtcGxhdGUgdG8gaW1wb3J0IGFuZCBleHBvcnQgb2JqZWN0IGluZm9ybWF0aW9uLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3TGlzdCIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuT2JqZWN0TmFtZSkgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiTnVtYmVyIikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiRm9ybWF0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoIlZhbGlkaXR5IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj5bJSBUcmFuc2xhdGUoIkRlbGV0ZSIpIHwgaHRtbCAlXTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+WyUgVHJhbnNsYXRlKCJTdGFydCBJbXBvcnQiKSB8IGh0bWwgJV08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlslIFRyYW5zbGF0ZSgiU3RhcnQgRXhwb3J0IikgfCBodG1sICVdPC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIFslIElGIERhdGEuVmFsaWRJRCAhPSAxJV1jbGFzcz0iSW52YWxpZCJbJSBFTkQgJV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9IkFzQmxvY2siIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQxO1RlbXBsYXRlSUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OdW1iZXIgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBEYXRhLk5hbWUgfCBodG1sICVdPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5bJSBUcmFuc2xhdGUoRGF0YS5Gb3JtYXROYW1lKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlslIFRyYW5zbGF0ZShEYXRhLlZhbGlkKSB8IGh0bWwgJV08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1UZW1wbGF0ZURlbGV0ZTtUZW1wbGF0ZUlEPVslIERhdGEuVGVtcGxhdGVJRCB8IHVyaSAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgaWQ9IkRlbGV0ZVRlbXBsYXRlSURbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiBjbGFzcz0iZmEgZmEtdHJhc2gtbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1JbXBvcnRJbmZvcm1hdGlvbjtUZW1wbGF0ZUlEPVslIERhdGEuVGVtcGxhdGVJRCB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSW1wb3J0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249RXhwb3J0O1RlbXBsYXRlSUQ9WyUgRGF0YS5UZW1wbGF0ZUlEIHwgdXJpICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFeHBvcnQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgpbJSBSZW5kZXJCbG9ja0VuZCgiT3ZlcnZpZXdMaXN0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld0xpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0MSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJTdGVwIDEgb2YgNSAtIEVkaXQgY29tbW9uIGluZm9ybWF0aW9uIikgfCBodG1sICVdOjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJUZW1wbGF0ZUVkaXQxIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlSUQgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IjEiIC8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5hbWUiPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+Cgo8IS0tIFZhbGlkYXRlX1JlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJOYW1lIiBjbGFzcz0iWyUgRGF0YS5OYW1lQ2xhc3MgJV0iIHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIHZhbHVlPSJbJSBEYXRhLk5hbWUgfCBodG1sICVdIiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk5hbWUgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIk5hbWUgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiTmV3T2JqZWN0Rm9ybWF0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iT2JqZWN0Ij5bJSBUcmFuc2xhdGUoIk9iamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PYmplY3RPcHRpb24gJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik9iamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJPYmplY3QgaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJPYmplY3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiT2JqZWN0IGlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkZvcm1hdCI+WyUgVHJhbnNsYXRlKCJGb3JtYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRm9ybWF0T3B0aW9uICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGb3JtYXRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiRm9ybWF0IGlzIHJlcXVpcmVkISIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRm9ybWF0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIkZvcm1hdCBpcyByZXF1aXJlZCEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTmV3T2JqZWN0Rm9ybWF0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiRWRpdE9iamVjdEZvcm1hdCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9iamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBEYXRhLk9iamVjdE5hbWUgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iT2JqZWN0IiB2YWx1ZT0iWyUgRGF0YS5PYmplY3QgfCBodG1sICVdIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRm9ybWF0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlslIERhdGEuRm9ybWF0TmFtZSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtYXQiIHZhbHVlPSJbJSBEYXRhLkZvcm1hdCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE9iamVjdEZvcm1hdCIpICVdCgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJWYWxpZElEIj5bJSBUcmFuc2xhdGUoIlZhbGlkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVmFsaWRPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDb21tZW50Ij5bJSBUcmFuc2xhdGUoIkNvbW1lbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJDb21tZW50IiB0eXBlPSJ0ZXh0IiBuYW1lPSJDb21tZW50IiB2YWx1ZT0iWyUgRGF0YS5Db21tZW50IHwgaHRtbCAlXSIgc2l6ZT0iNTAiIG1heGxlbmd0aD0iMjAwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCI+PHNwYW4+WyUgVHJhbnNsYXRlKCJOZXh0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV07U3ViYWN0aW9uPSdPdmVydmlldyciPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQxIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDIiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3RlcCAyIG9mIDUgLSBFZGl0IG9iamVjdCBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVFZGl0MiIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iMSIgLz4KCiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJPYmplY3QiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5PYmplY3QgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQyRWxlbWVudCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlslIERhdGEuSUQgJV0iPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5JbnB1dFN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlslIERhdGEuSUQgJV1FcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLkVycm9yTWVzc2FnZSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLklEICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5FcnJvck1lc3NhZ2UpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDJFbGVtZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJCYWNrIENhbGxGb3JBY3Rpb24iIHR5cGU9ImJ1dHRvbiIgbmFtZT0iQmFjayIgPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFjayIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIk5leHQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0MiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQzIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlN0ZXAgMyBvZiA1IC0gRWRpdCBmb3JtYXQgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlRWRpdDMiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IlslIERhdGEuVGVtcGxhdGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3VibWl0TmV4dCIgdmFsdWU9IjEiIC8+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRm9ybWF0IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRm9ybWF0IHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0M0VsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLklEICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW5wdXRTdHJnICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iWyUgRGF0YS5JRCAlXUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIFslIFRyYW5zbGF0ZSgiaXMgcmVxdWlyZWQhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJbJSBEYXRhLklEICVdU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0gWyUgVHJhbnNsYXRlKCJpcyByZXF1aXJlZCEiKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDNFbGVtZW50UmVxdWlyZWQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDNFbGVtZW50IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJCYWNrIENhbGxGb3JBY3Rpb24iIHR5cGU9ImJ1dHRvbiIgbmFtZT0iQmFjayIgPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFjayIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIk5leHQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0MyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIlN0ZXAgNCBvZiA1IC0gRWRpdCBtYXBwaW5nIGluZm9ybWF0aW9uIikgfCBodG1sICVdOjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1hcEhlYWRlclJvdyBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTmFtZSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIk9iamVjdCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk9iamVjdE5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJGb3JtYXQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Gb3JtYXROYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlRlbXBsYXRlU2F2ZTQiIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGVtcGxhdGVJRCIgdmFsdWU9IlslIERhdGEuVGVtcGxhdGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTWFwcGluZ0FkZCIgdmFsdWU9IiIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iIiAvPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDRUYWJsZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJDZW50ZXIiPlslIFRyYW5zbGF0ZShEYXRhLkhlYWRlcikgfCBodG1sICVdPC90aD4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDRUYWJsZUhlYWRlciIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDROb01hcEZvdW5kIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iWyUgRGF0YS5Db2x1bW5zICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJObyBtYXAgZWxlbWVudHMgZm91bmQuIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0Tm9NYXBGb3VuZCIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NENvbHVtbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLklucHV0U3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0Q29sdW1uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NE1hcE51bWJlckNvbHVtbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNvdW50ZXIgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NE1hcE51bWJlckNvbHVtbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDZW50ZXIiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUZW1wbGF0ZUVkaXQ0VXBCdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJBcnJvd1VwInR5cGU9InN1Ym1pdCIgbmFtZT0iTWFwcGluZ1VwOjpbJSBEYXRhLk1hcHBpbmdJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlVwIikgfCBodG1sICVdIj4gWyUgVHJhbnNsYXRlKCJVcCIpIHwgaHRtbCAlXSA8L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDRVcEJ1dHRvbiIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDROb1VwQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dVcCIgdHlwZT0ic3VibWl0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPiBbJSBUcmFuc2xhdGUoIlVwIikgfCBodG1sICVdPC9idXR0b24+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0Tm9VcEJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkNlbnRlciI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDREb3duQnV0dG9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQXJyb3dEb3duIiB0eXBlPSJzdWJtaXQiIG5hbWU9Ik1hcHBpbmdEb3duOjpbJSBEYXRhLk1hcHBpbmdJRCB8IGh0bWwgJV0iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIkRvd24iKSB8IGh0bWwgJV0iPiBbJSBUcmFuc2xhdGUoIkRvd24iKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDREb3duQnV0dG9uIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NE5vRG93bkJ1dHRvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkFycm93RG93biIgdHlwZT0ic3VibWl0IiBkaXNhYmxlZD0iZGlzYWJsZWQiPiBbJSBUcmFuc2xhdGUoIkRvd24iKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDROb0Rvd25CdXR0b24iKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgY2xhc3M9IkRlbGV0ZUNvbHVtbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS10cmFzaC1vIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJEZWxldGUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iTWFwcGluZ0RlbGV0ZTo6WyUgRGF0YS5NYXBwaW5nSUQgfCBodG1sICVdIiB2YWx1ZT0iIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIlRlbXBsYXRlRWRpdDRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVzEwMHBjIFNwYWNpbmdUb3BTbWFsbCBMZWZ0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQbHVzIiBpZD0iTWFwcGluZ0FkZEJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJNYXBwaW5nQWRkQnV0dG9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJBZGQiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1wbHVzLXNxdWFyZSI+PC9pPlslIFRyYW5zbGF0ZSgiQWRkIE1hcHBpbmcgRWxlbWVudCIpIHwgaHRtbCAlXTwvc3Bhbj4gPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJCYWNrIENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IlN1Ym1pdEJhY2siPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFjayIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiIG5hbWU9IlN1Ym1pdE5leHRCdXR0b24iIGlkPSJTdWJtaXROZXh0QnV0dG9uIiB2YWx1ZT0iMSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJOZXh0IikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ0IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRlbXBsYXRlRWRpdDUiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZSgiU3RlcCA1IG9mIDUgLSBFZGl0IHNlYXJjaCBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iVGVtcGxhdGVTYXZlNSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUZW1wbGF0ZUlEIiB2YWx1ZT0iWyUgRGF0YS5UZW1wbGF0ZUlEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJtaXROZXh0IiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlRlbXBsYXRlIE5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVzdHJpY3RFeHBvcnQiPlslIFRyYW5zbGF0ZSgiUmVzdHJpY3QgZXhwb3J0IHBlciBzZWFyY2giKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ0JvdHRvbSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc3RyaWN0RXhwb3J0U3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGVtcGxhdGVFZGl0NUVsZW1lbnQiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJbJSBEYXRhLklEICVdIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuSW5wdXRTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGVtcGxhdGVFZGl0NUVsZW1lbnQiKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJCYWNrIENhbGxGb3JBY3Rpb24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iU3VibWl0QmFjayIgdmFsdWU9IlN1Ym1pdEJhY2siPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFjayIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0Ij48c3Bhbj5bJSBUcmFuc2xhdGUoIkZpbmlzaCIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJUZW1wbGF0ZUVkaXQ1IikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkltcG9ydEluZm9ybWF0aW9uIikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkltcG9ydCBpbmZvcm1hdGlvbiIpIHwgaHRtbCAlXTo8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iIC8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSW1wb3J0IiAvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRlbXBsYXRlSUQiIHZhbHVlPSJbJSBEYXRhLlRlbXBsYXRlSUQgfCBodG1sICVdIiAvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTb3VyY2VGaWxlIj5bJSBUcmFuc2xhdGUoIk5hbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU291cmNlRmlsZSI+WyUgVHJhbnNsYXRlKCJTb3VyY2UgRmlsZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgbmFtZT0iU291cmNlRmlsZSIgc2l6ZT0iNDAiIGNsYXNzPSJmaXhlZCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSBDYWxsRm9yQWN0aW9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlN0YXJ0IEltcG9ydCIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTdGFydCBJbXBvcnQiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiSW1wb3J0SW5mb3JtYXRpb24iKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+Cgo8L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlldyIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbXBvcnRSZXN1bHQiKSAlXQo8ZGl2IGNsYXNzPSJNYWluQm94IEFyaWFSb2xlTWFpbiI+CiAgICA8ZGl2IGNsYXNzPSJXNTBwYyBTcGFjaW5nVG9wTGFyZ2UgU3BhY2luZ0JvdHRvbUxhcmdlIENlbnRlckJveCI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIkltcG9ydCBzdW1tYXJ5IGZvciAlcyIsIERhdGEuT2JqZWN0KSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJPdmVydmlldyIvPgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIlJlY29yZHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ291bnRlciB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiU3VjY2VzcyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN1Y2Nlc3MgfCBodG1sICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkltcG9ydFJlc3VsdFJldHVybkNvZGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKFslIFRyYW5zbGF0ZShEYXRhLlJldHVybkNvZGVOYW1lKSB8IGh0bWwgJV06IFslIERhdGEuUmV0dXJuQ29kZUNvdW50IHwgaHRtbCAlXSkKWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdFJldHVybkNvZGUiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiRmFpbGVkIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj5bJSBEYXRhLkZhaWxlZCB8IGh0bWwgJV08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiSW1wb3J0UmVzdWx0RHVwbGljYXRlTmFtZXMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJEdXBsaWNhdGUgbmFtZXMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPlslIERhdGEuRHVwbGljYXRlTmFtZXMgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdER1cGxpY2F0ZU5hbWVzIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiTGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPlslIERhdGEuTGFzdExpbmVOdW1iZXIgfCBodG1sICVdPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdExhc3RMaW5lTnVtYmVyIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iQ2VudGVyIFNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkgQ2FsbEZvckFjdGlvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJPayIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiT2siKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiT2siKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkltcG9ydFJlc3VsdCIpICVdCg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCAtIGltcG9ydCwgZXhwb3J0IGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgaW1wb3J0IGFuZCBleHBvcnQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgVGVtcGxhdGVMaXN0KCkKClJldHVybiBhIGxpc3Qgb2YgdGVtcGxhdGVzIGFzIGFycmF5IHJlZmVyZW5jZQoKICAgIG15ICRUZW1wbGF0ZUxpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgT2JqZWN0ID0+ICdUaWNrZXQnLCAgIyAob3B0aW9uYWwpCiAgICAgICAgRm9ybWF0ID0+ICdDU1YnICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgc3FsIHN0cmluZwogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSAxPTEgJzsKICAgIG15IEBCSU5EOwoKICAgIGlmICggJFBhcmFte09iamVjdH0gKSB7CiAgICAgICAgJFNRTCAuPSAnQU5EIGltZXhwb3J0X29iamVjdCA9ID8gJzsKICAgICAgICBwdXNoIEBCSU5ELCBcJFBhcmFte09iamVjdH07CiAgICB9CiAgICBpZiAoICRQYXJhbXtGb3JtYXR9ICkgewogICAgICAgICRTUUwgLj0gJ0FORCBpbWV4cG9ydF9mb3JtYXQgPSA/ICc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtGb3JtYXR9OwogICAgfQoKICAgICMgYWRkIG9yZGVyIG9wdGlvbgogICAgJFNRTCAuPSAnT1JERVIgQlkgaWQnOwoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFRlbXBsYXRlTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQFRlbXBsYXRlTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBUZW1wbGF0ZUxpc3Q7Cn0KCj1oZWFkMiBUZW1wbGF0ZUdldCgpCgpHZXQgYSBpbXBvcnQgZXhwb3J0IHRlbXBsYXRlCgpSZXR1cm4KICAgICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH0KICAgICRUZW1wbGF0ZURhdGF7TnVtYmVyfQogICAgJFRlbXBsYXRlRGF0YXtPYmplY3R9CiAgICAkVGVtcGxhdGVEYXRhe0Zvcm1hdH0KICAgICRUZW1wbGF0ZURhdGF7TmFtZX0KICAgICRUZW1wbGF0ZURhdGF7VmFsaWRJRH0KICAgICRUZW1wbGF0ZURhdGF7Q29tbWVudH0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlVGltZX0KICAgICRUZW1wbGF0ZURhdGF7Q3JlYXRlQnl9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZVRpbWV9CiAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fQoKICAgIG15ICRUZW1wbGF0ZURhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9LT57ICRQYXJhbXtUZW1wbGF0ZUlEfSB9OwoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCwgaW1leHBvcnRfb2JqZWN0LCBpbWV4cG9ydF9mb3JtYXQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVUZW1wbGF0ZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVEYXRhe1RlbXBsYXRlSUR9ID0gJFJvd1swXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe09iamVjdH0gICAgID0gJFJvd1sxXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0Zvcm1hdH0gICAgID0gJFJvd1syXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe05hbWV9ICAgICAgID0gJFJvd1szXTsKICAgICAgICAkVGVtcGxhdGVEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1s0XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NvbW1lbnR9ICAgID0gJFJvd1s1XSB8fCAnJzsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZVRpbWV9ID0gJFJvd1s2XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s3XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZVRpbWV9ID0gJFJvd1s4XTsKICAgICAgICAkVGVtcGxhdGVEYXRhe0NoYW5nZUJ5fSAgID0gJFJvd1s5XTsKCiAgICAgICAgJFRlbXBsYXRlRGF0YXtOdW1iZXJ9ID0gc3ByaW50ZiAiJTA2ZCIsICRUZW1wbGF0ZURhdGF7VGVtcGxhdGVJRH07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfSA9IFwlVGVtcGxhdGVEYXRhOwoKICAgIHJldHVybiBcJVRlbXBsYXRlRGF0YTsKfQoKPWhlYWQyIFRlbXBsYXRlQWRkKCkKCkFkZCBhIG5ldyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlCgogICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgICAgICBPYmplY3QgID0+ICdUaWNrZXQnLAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFRlbXBsYXRlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEZvcm1hdCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBnZXQgQ2hlY2tJdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgRm9ybWF0KSkgewogICAgICAgICRDaGVja0l0ZW1PYmplY3QtPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkQ2hlY2tJdGVtT2JqZWN0LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGZpbmQgZXhpdGluZyB0ZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpbWV4cG9ydF9vYmplY3QgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte09iamVjdH0sIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROb0FkZDsKICAgIHdoaWxlICggJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgdGVtcGxhdGUsIGlmIHRlbXBsYXRlIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgIGlmICgkTm9BZGQpIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IHRlbXBsYXRlISBUZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyB0ZW1wbGF0ZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfdGVtcGxhdGUgJwogICAgICAgICAgICAuICcoaW1leHBvcnRfb2JqZWN0LCBpbWV4cG9ydF9mb3JtYXQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSBWQUxVRVMgJwogICAgICAgICAgICAuICcoPywgPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtGb3JtYXR9LCBcJFBhcmFte05hbWV9LCBcJFBhcmFte1ZhbGlkSUR9LAogICAgICAgICAgICBcJFBhcmFte0NvbW1lbnR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IHRlbXBsYXRlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIGltZXhwb3J0X29iamVjdCA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17T2JqZWN0fSwgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJFRlbXBsYXRlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkVGVtcGxhdGVJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRUZW1wbGF0ZUlEOwp9Cgo9aGVhZDIgVGVtcGxhdGVVcGRhdGUoKQoKVXBkYXRlIGEgZXhpc3RpbmcgaW1wb3J0L2V4cG9ydCB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVVcGRhdGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGVtcGxhdGUgTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICAkUGFyYW17Q29tbWVudH0gfHw9ICcnOwoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyktPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHRoZSBvYmplY3Qgb2YgdGhpcyB0ZW1wbGF0ZSBpZAogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaW1leHBvcnRfb2JqZWN0IEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRPYmplY3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0ID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkT2JqZWN0ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHVwZGF0ZSB0ZW1wbGF0ZSBiZWNhdXNlIGl0IGhhc24ndCBiZWVuIGZvdW5kISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgdGVtcGxhdGUgd2l0aCBzYW1lIG5hbWUKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfdGVtcGxhdGUgV0hFUkUgaW1leHBvcnRfb2JqZWN0ID0gPyBBTkQgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRPYmplY3QsIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAxOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJFJvd1swXSApIHsKICAgICAgICAgICAgJFVwZGF0ZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRVcGRhdGUgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIHRlbXBsYXRlISBUZW1wbGF0ZSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIG9iamVjdC4iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcmVzZXQgY2FjaGUKICAgIGRlbGV0ZSAkU2VsZi0+e0NhY2hlfS0+e1RlbXBsYXRlR2V0fS0+eyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIHVwZGF0ZSB0ZW1wbGF0ZQogICAgcmV0dXJuICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdVUERBVEUgaW1leHBvcnRfdGVtcGxhdGUgU0VUIG5hbWUgPSA/LCcKICAgICAgICAgICAgLiAndmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKICAgICAgICAgICAgLiAnY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17TmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBdLAogICAgKTsKfQoKPWhlYWQyIFRlbXBsYXRlRGVsZXRlKCkKCkRlbGV0ZSBleGlzdGluZyBpbXBvcnQvZXhwb3J0IHRlbXBsYXRlcwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBUZW1wbGF0ZURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkUGFyYW17VGVtcGxhdGVJRH0gPSBbICRQYXJhbXtUZW1wbGF0ZUlEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte1RlbXBsYXRlSUR9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnVGVtcGxhdGVJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHNlYXJjaCBkYXRhCiAgICAkU2VsZi0+U2VhcmNoRGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBhbGwgbWFwcGluZyBkYXRhCiAgICBmb3IgbXkgJFRlbXBsYXRlSUQgKCBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfSApIHsKICAgICAgICAkU2VsZi0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBkYXRhCiAgICAkU2VsZi0+Rm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgZGF0YQogICAgJFNlbGYtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57VGVtcGxhdGVHZXR9OwoKICAgICMgZGVsZXRlIHRlbXBsYXRlcwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSBpbWV4cG9ydF90ZW1wbGF0ZSBXSEVSRSBpZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWhlYWQyIE9iamVjdExpc3QoKQoKUmV0dXJuIGEgbGlzdCBvZiBhdmFpbGFibGUgb2JqZWN0cyBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRPYmplY3RMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKPWN1dAoKc3ViIE9iamVjdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcKICAgIG15ICRNb2R1bGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiAgICByZXR1cm4gaWYgISRNb2R1bGVMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTW9kdWxlTGlzdCBuZSAnSEFTSCc7CgogICAgIyBjcmVhdGUgdGhlIG9iamVjdCBsaXN0CiAgICBteSAkT2JqZWN0TGlzdCA9IHt9OwogICAgZm9yIG15ICRNb2R1bGUgKCBzb3J0IGtleXMgJXskTW9kdWxlTGlzdH0gKSB7CiAgICAgICAgJE9iamVjdExpc3QtPnskTW9kdWxlfSA9ICRNb2R1bGVMaXN0LT57JE1vZHVsZX0tPntOYW1lfTsKICAgIH0KCiAgICByZXR1cm4gJE9iamVjdExpc3Q7Cn0KCj1oZWFkMiBPYmplY3RBdHRyaWJ1dGVzR2V0KCkKCkdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntPYmplY3R9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIG9iamVjdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWhlYWQyIE9iamVjdERhdGFHZXQoKQoKR2V0IHRoZSBvYmplY3QgZGF0YSBmcm9tIGEgdGVtcGxhdGUKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBkYXRhX2tleSwgZGF0YV92YWx1ZSBGUk9NIGltZXhwb3J0X29iamVjdCBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJU9iamVjdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVPYmplY3REYXRhOwp9Cgo9aGVhZDIgT2JqZWN0RGF0YVNhdmUoKQoKU2F2ZSB0aGUgb2JqZWN0IGRhdGEgb2YgYSB0ZW1wbGF0ZQoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YVNhdmUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgT2JqZWN0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBPYmplY3REYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtPYmplY3REYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnT2JqZWN0RGF0YSBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBleGlzdGluZyBvYmplY3QgZGF0YQogICAgJFNlbGYtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgREFUQUtFWToKICAgIGZvciBteSAkRGF0YUtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17T2JqZWN0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtPYmplY3REYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgcm93CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X29iamVjdCAnCiAgICAgICAgICAgICAgICAuICcodGVtcGxhdGVfaWQsIGRhdGFfa2V5LCBkYXRhX3ZhbHVlKSBWQUxVRVMgJwogICAgICAgICAgICAgICAgLiAnKD8sID8sID8pJywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgT2JqZWN0RGF0YURlbGV0ZSgpCgpEZWxldGUgdGhlIGV4aXN0aW5nIG9iamVjdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk9iamVjdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBUZW1wbGF0ZUlEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIXJlZiAkUGFyYW17VGVtcGxhdGVJRH0gKSB7CiAgICAgICAgJFBhcmFte1RlbXBsYXRlSUR9ID0gWyAkUGFyYW17VGVtcGxhdGVJRH0gXTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZW1wbGF0ZUlEfSBuZSAnQVJSQVknICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RlbXBsYXRlSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkVGVtcGxhdGVJRFN0cmluZyA9IGpvaW4gcXssIH0sIG1hcCB7Jz8nfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17VGVtcGxhdGVJRH0gfTsKCiAgICAjIGRlbGV0ZSB0ZW1wbGF0ZXMKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfb2JqZWN0IFdIRVJFIHRlbXBsYXRlX2lkIElOICggJFRlbXBsYXRlSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgRm9ybWF0TGlzdCgpCgpSZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1hdExpc3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7Cgo9Y3V0CgpzdWIgRm9ybWF0TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZwogICAgbXkgJE1vZHVsZUxpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKICAgIHJldHVybiBpZiAhJE1vZHVsZUxpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRNb2R1bGVMaXN0IG5lICdIQVNIJzsKCiAgICAjIGNyZWF0ZSB0aGUgZm9ybWF0IGxpc3QKICAgIG15ICRGb3JtYXRMaXN0ID0ge307CiAgICBmb3IgbXkgJE1vZHVsZSAoIHNvcnQga2V5cyAleyRNb2R1bGVMaXN0fSApIHsKICAgICAgICAkRm9ybWF0TGlzdC0+eyRNb2R1bGV9ID0gJE1vZHVsZUxpc3QtPnskTW9kdWxlfS0+e05hbWV9OwogICAgfQoKICAgIHJldHVybiAkRm9ybWF0TGlzdDsKfQoKPWhlYWQyIEZvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKR2V0IHRoZSBhdHRyaWJ1dGVzIG9mIGEgZm9ybWF0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXRBdHRyaWJ1dGVzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhCiAgICBteSAkVGVtcGxhdGVEYXRhID0gJFNlbGYtPlRlbXBsYXRlR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdGVtcGxhdGUgZGF0YQogICAgaWYgKCAhJFRlbXBsYXRlRGF0YSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBiYWNrZW5kCiAgICBteSAkQmFja2VuZCA9ICRLZXJuZWw6Ok9NLT5HZXQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OicgLiAkVGVtcGxhdGVEYXRhLT57Rm9ybWF0fQogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kOwoKICAgICMgZ2V0IGFuIGF0dHJpYnV0ZSBsaXN0IG9mIHRoZSBmb3JtYXQKICAgIG15ICRBdHRyaWJ1dGVzID0gJEJhY2tlbmQtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1oZWFkMiBGb3JtYXREYXRhR2V0KCkKCkdldCB0aGUgZm9ybWF0IGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJEZvcm1hdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9mb3JtYXQgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVGb3JtYXREYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEZvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybWF0RGF0YTsKfQoKPWhlYWQyIEZvcm1hdERhdGFTYXZlKCkKClNhdmUgdGhlIGZvcm1hdCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIEZvcm1hdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRm9ybWF0RGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17Rm9ybWF0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Zvcm1hdERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEKICAgICRTZWxmLT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0Zvcm1hdERhdGF9IH0gKSB7CgogICAgICAgIG15ICREYXRhVmFsdWUgPSAkUGFyYW17Rm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9mb3JtYXQgJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZvcm1hdERhdGFEZWxldGUoKQoKRGVsZXRlIHRoZSBleGlzdGluZyBmb3JtYXQgZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtYXREYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X2Zvcm1hdCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWhlYWQyIE1hcHBpbmdMaXN0KCkKClJldHVybiBhIGxpc3Qgb2YgbWFwcGluZyBkYXRhIGlkcyBzb3J0ZWQgYnkgcG9zaXRpb24gYXMgYXJyYXkgcmVmZXJlbmNlCgogICAgbXkgJE1hcHBpbmdMaXN0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/IE9SREVSIEJZIHBvc2l0aW9uJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBNYXBwaW5nTGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQE1hcHBpbmdMaXN0LCAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiBcQE1hcHBpbmdMaXN0Owp9Cgo9aGVhZDIgTWFwcGluZ0FkZCgpCgpBZGQgYSBuZXcgbWFwcGluZyBkYXRhIHJvdwoKICAgIG15ICRNYXBwaW5nSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nQWRkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGZpbmQgbWF4aW11bSBwb3NpdGlvbgogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbWF4KHBvc2l0aW9uKSBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VGVtcGxhdGVJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICROZXdQb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRSb3dbMF0gKSB7CiAgICAgICAgICAgICROZXdQb3NpdGlvbiA9ICRSb3dbMF07CiAgICAgICAgICAgICROZXdQb3NpdGlvbisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGluc2VydCBhIG5ldyBtYXBwaW5nIGRhdGEgcm93CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnSU5TRVJUIElOVE8gaW1leHBvcnRfbWFwcGluZyAodGVtcGxhdGVfaWQsIHBvc2l0aW9uKSBWQUxVRVMgKD8sID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSwgXCROZXdQb3NpdGlvbiBdLAogICAgKTsKCiAgICAjIGZpbmQgaWQgb2YgbmV3IG1hcHBpbmcgZGF0YSByb3cKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8gQU5EIHBvc2l0aW9uID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJE5ld1Bvc2l0aW9uIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTWFwcGluZ0lEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE1hcHBpbmdJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRNYXBwaW5nSUQ7Cn0KCj1oZWFkMiBNYXBwaW5nRGVsZXRlKCkKCkRlbGV0ZSBleGlzdGluZyBtYXBwaW5nIGRhdGEgcm93cwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0RlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZUlEID0+IDMyMSwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMzIxLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgREIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte01hcHBpbmdJRH0gKSB7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIG9iamVjdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICAgICAkU2VsZi0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIG9uZSBtYXBwaW5nIHJvdwogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmcgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgICAgICk7CgogICAgICAgICMgcmVidWlsZCBtYXBwaW5nIHBvc2l0aW9ucwogICAgICAgICRTZWxmLT5NYXBwaW5nUG9zaXRpb25SZWJ1aWxkKAogICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGdldCBtYXBwaW5nIGxpc3QKICAgICAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkTWFwcGluZ0lEICggQHskTWFwcGluZ0xpc3R9ICkgewoKICAgICAgICAgICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgICAgICAgICAkU2VsZi0+TWFwcGluZ09iamVjdERhdGFEZWxldGUoCiAgICAgICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPk1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGRlbGV0ZSBhbGwgbWFwcGluZyByb3dzIG9mIHRoaXMgdGVtcGxhdGUKICAgICAgICByZXR1cm4gJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZyBXSEVSRSB0ZW1wbGF0ZV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgICAgICk7CiAgICB9Cn0KCj1oZWFkMiBNYXBwaW5nVXAoKQoKTW92ZSBhbiBtYXBwaW5nIGRhdGEgcm93IHVwCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nVXAoCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nVXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxIGlmICRQYXJhbXtNYXBwaW5nSUR9ID09ICRNYXBwaW5nTGlzdC0+WzBdOwoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuIDEgaWYgISRQb3NpdGlvbjsKCiAgICBteSAkUG9zaXRpb25VcHBlciA9ICRQb3NpdGlvbiAtIDE7CgogICAgIyB1cGRhdGUgcG9zaXRpb25zCiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uLCBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBvc2l0aW9uVXBwZXIgXSwKICAgICk7CiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQb3NpdGlvblVwcGVyLCBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBNYXBwaW5nRG93bigpCgpNb3ZlIGFuIG1hcHBpbmcgZGF0YSByb3cgZG93bgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Rvd24oCiAgICAgICAgTWFwcGluZ0lEICA9PiAxMjMsCiAgICAgICAgVGVtcGxhdGVJRCA9PiAzMjEsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRG93biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG1hcHBpbmcgZGF0YSBsaXN0CiAgICBteSAkTWFwcGluZ0xpc3QgPSAkU2VsZi0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte01hcHBpbmdJRH0gPT0gJE1hcHBpbmdMaXN0LT5bLTFdOwoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgcG9zaXRpb24gRlJPTSBpbWV4cG9ydF9tYXBwaW5nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRQb3NpdGlvbjsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQb3NpdGlvbiA9ICRSb3dbMF07CiAgICB9CgogICAgbXkgJFBvc2l0aW9uRG93biA9ICRQb3NpdGlvbiArIDE7CgogICAgIyB1cGRhdGUgcG9zaXRpb25zCiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgdGVtcGxhdGVfaWQgPSA/IEFORCBwb3NpdGlvbiA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uLCBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJFBvc2l0aW9uRG93biBdLAogICAgKTsKICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGltZXhwb3J0X21hcHBpbmcgU0VUIHBvc2l0aW9uID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBvc2l0aW9uRG93biwgXCRQYXJhbXtNYXBwaW5nSUR9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgTWFwcGluZ1Bvc2l0aW9uUmVidWlsZCgpCgpSZWJ1aWxkIHRoZSBwb3NpdGlvbnMgb2YgYSBtYXBwaW5nIGxpc3QKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdQb3NpdGlvblJlYnVpbGQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nUG9zaXRpb25SZWJ1aWxkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPk1hcHBpbmdMaXN0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgdXBkYXRlIHBvc2l0aW9uCiAgICBteSAkQ291bnRlciA9IDA7CiAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ1VQREFURSBpbWV4cG9ydF9tYXBwaW5nIFNFVCBwb3NpdGlvbiA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ291bnRlciwgXCRNYXBwaW5nSUQgXSwKICAgICAgICApOwogICAgICAgICRDb3VudGVyKys7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgpCgpHZXQgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGJhY2tlbmQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntPYmplY3R9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gYXR0cmlidXRlIGxpc3Qgb2YgdGhlIG9iamVjdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+TWFwcGluZ09iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBdHRyaWJ1dGVzOwp9Cgo9aGVhZDIgTWFwcGluZ09iamVjdERhdGFEZWxldGUoKQoKRGVsZXRlIHRoZSBleGlzdGluZyBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgIG9yCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gWzEsNDQsMTY2LDVdLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0RGF0YURlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte01hcHBpbmdJRH0gKSB7CiAgICAgICAgJFBhcmFte01hcHBpbmdJRH0gPSBbICRQYXJhbXtNYXBwaW5nSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17TWFwcGluZ0lEfSBuZSAnQVJSQVknICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdJRCBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBvciBhIHN0cmluZyEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSB0ZW1wbGF0ZSBpZCBzdHJpbmcKICAgIG15ICRNYXBwaW5nSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGNyZWF0ZSBhbmQgYWRkIGJpbmQgcGFyYW1ldGVycwogICAgbXkgQEJJTkQgPSBtYXAgeyBcJF8gfSBAeyAkUGFyYW17TWFwcGluZ0lEfSB9OwoKICAgICMgZGVsZXRlIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAiREVMRVRFIEZST00gaW1leHBvcnRfbWFwcGluZ19vYmplY3QgV0hFUkUgbWFwcGluZ19pZCBJTiAoICRNYXBwaW5nSURTdHJpbmcgKSIsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwp9Cgo9aGVhZDIgTWFwcGluZ09iamVjdERhdGFTYXZlKCkKClNhdmUgdGhlIG9iamVjdCBkYXRhIG9mIGEgbWFwcGluZwoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ09iamVjdERhdGFTYXZlKAogICAgICAgIE1hcHBpbmdJRCAgICAgICAgID0+IDEyMywKICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiAkSGFzaFJlZiwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nT2JqZWN0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgTWFwcGluZ09iamVjdERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte01hcHBpbmdPYmplY3REYXRhfSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTWFwcGluZ09iamVjdERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgb2JqZWN0IG1hcHBpbmcgZGF0YQogICAgJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhRGVsZXRlKAogICAgICAgIE1hcHBpbmdJRCA9PiAkUGFyYW17TWFwcGluZ0lEfSwKICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte01hcHBpbmdPYmplY3REYXRhfSB9ICkgewoKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte01hcHBpbmdPYmplY3REYXRhfS0+eyREYXRhS2V5fTsKCiAgICAgICAgbmV4dCBEQVRBS0VZIGlmICFkZWZpbmVkICREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YVZhbHVlOwoKICAgICAgICAjIGluc2VydCBvbmUgbWFwcGluZyBvYmplY3Qgcm93CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGltZXhwb3J0X21hcHBpbmdfb2JqZWN0ICcKICAgICAgICAgICAgICAgIC4gJyhtYXBwaW5nX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0sIFwkRGF0YUtleSwgXCREYXRhVmFsdWUgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgTWFwcGluZ09iamVjdERhdGFHZXQoKQoKR2V0IHRoZSBvYmplY3QgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkT2JqZWN0RGF0YVJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgIE1hcHBpbmdJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE1hcHBpbmdPYmplY3REYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE1hcHBpbmdJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9tYXBwaW5nX29iamVjdCBXSEVSRSBtYXBwaW5nX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TWFwcGluZ0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVNYXBwaW5nT2JqZWN0RGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRNYXBwaW5nT2JqZWN0RGF0YXsgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgIH0KCiAgICByZXR1cm4gXCVNYXBwaW5nT2JqZWN0RGF0YTsKfQoKPWhlYWQyIE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkKCkdldCB0aGUgYXR0cmlidXRlcyBvZiBhbiBmb3JtYXQgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRTZWxmLT5UZW1wbGF0ZUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEKICAgIGlmICggISRUZW1wbGF0ZURhdGEgfHwgISRUZW1wbGF0ZURhdGEtPntGb3JtYXR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRlbXBsYXRlIHdpdGggSUQgJFBhcmFte1RlbXBsYXRlSUR9IGlzIGluY29tcGxldGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZAogICAgbXkgJEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZDsKCiAgICAjIGdldCBhbiBhdHRyaWJ1dGUgbGlzdCBvZiB0aGUgZm9ybWF0CiAgICBteSAkQXR0cmlidXRlcyA9ICRCYWNrZW5kLT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWhlYWQyIE1hcHBpbmdGb3JtYXREYXRhRGVsZXRlKCkKCkRlbGV0ZSB0aGUgZXhpc3RpbmcgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRUcnVlID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdERhdGFEZWxldGUoCiAgICAgICAgTWFwcGluZ0lEID0+IFsxLDQ0LDE2Niw1XSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhcmVmICRQYXJhbXtNYXBwaW5nSUR9ICkgewogICAgICAgICRQYXJhbXtNYXBwaW5nSUR9ID0gWyAkUGFyYW17TWFwcGluZ0lEfSBdOwogICAgfQogICAgZWxzaWYgKCByZWYgJFBhcmFte01hcHBpbmdJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdNYXBwaW5nSUQgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2Ugb3IgYSBzdHJpbmchJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgdGVtcGxhdGUgaWQgc3RyaW5nCiAgICBteSAkTWFwcGluZ0lEU3RyaW5nID0gam9pbiBxeywgfSwgbWFwIHsnPyd9IEB7ICRQYXJhbXtNYXBwaW5nSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte01hcHBpbmdJRH0gfTsKCiAgICAjIGRlbGV0ZSBtYXBwaW5nIGZvcm1hdCBkYXRhCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X21hcHBpbmdfZm9ybWF0IFdIRVJFIG1hcHBpbmdfaWQgSU4gKCAkTWFwcGluZ0lEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWhlYWQyIE1hcHBpbmdGb3JtYXREYXRhU2F2ZSgpCgpTYXZlIHRoZSBmb3JtYXQgZGF0YSBvZiBhIG1hcHBpbmcKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdGb3JtYXREYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTWFwcGluZ0Zvcm1hdERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTWFwcGluZ0lEIE1hcHBpbmdGb3JtYXREYXRhIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ01hcHBpbmdGb3JtYXREYXRhIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIGZvcm1hdCBtYXBwaW5nIGRhdGEKICAgICRTZWxmLT5NYXBwaW5nRm9ybWF0RGF0YURlbGV0ZSgKICAgICAgICBNYXBwaW5nSUQgPT4gJFBhcmFte01hcHBpbmdJRH0sCiAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICBEQVRBS0VZOgogICAgZm9yIG15ICREYXRhS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0gfSApIHsKCiAgICAgICAgbXkgJERhdGFWYWx1ZSA9ICRQYXJhbXtNYXBwaW5nRm9ybWF0RGF0YX0tPnskRGF0YUtleX07CgogICAgICAgIG5leHQgREFUQUtFWSBpZiAhZGVmaW5lZCAkRGF0YUtleTsKICAgICAgICBuZXh0IERBVEFLRVkgaWYgIWRlZmluZWQgJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIG1hcHBpbmcgZm9ybWF0IHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9tYXBwaW5nX2Zvcm1hdCAnCiAgICAgICAgICAgICAgICAuICcobWFwcGluZ19pZCwgZGF0YV9rZXksIGRhdGFfdmFsdWUpIFZBTFVFUyAoPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtNYXBwaW5nSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIE1hcHBpbmdGb3JtYXREYXRhR2V0KCkKCkdldCB0aGUgZm9ybWF0IGRhdGEgb2YgYSBtYXBwaW5nCgogICAgbXkgJE9iamVjdERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0RGF0YUdldCgKICAgICAgICBNYXBwaW5nSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBNYXBwaW5nRm9ybWF0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhNYXBwaW5nSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBEQiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGRhdGFfa2V5LCBkYXRhX3ZhbHVlIEZST00gaW1leHBvcnRfbWFwcGluZ19mb3JtYXQgV0hFUkUgbWFwcGluZ19pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte01hcHBpbmdJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlTWFwcGluZ0Zvcm1hdERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkTWFwcGluZ0Zvcm1hdERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlTWFwcGluZ0Zvcm1hdERhdGE7Cn0KCj1oZWFkMiBTZWFyY2hBdHRyaWJ1dGVzR2V0KCkKCkdldCB0aGUgc2VhcmNoIGF0dHJpYnV0ZXMgb2YgYSBvYmplY3QgYmFja2VuZCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUZW1wbGF0ZSB3aXRoIElEICRQYXJhbXtUZW1wbGF0ZUlEfSBpcyBpbmNvbXBsZXRlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntPYmplY3R9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmQ7CgogICAgIyBnZXQgYW4gc2VhcmNoIGF0dHJpYnV0ZSBsaXN0IG9mIGFuIG9iamVjdAogICAgbXkgJEF0dHJpYnV0ZXMgPSAkQmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1oZWFkMiBTZWFyY2hEYXRhR2V0KCkKCkdldCB0aGUgc2VhcmNoIGRhdGEgZnJvbSBhIHRlbXBsYXRlCgogICAgbXkgJFNlYXJjaERhdGFSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IERCIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgZGF0YV9rZXksIGRhdGFfdmFsdWUgRlJPTSBpbWV4cG9ydF9zZWFyY2ggV0hFUkUgdGVtcGxhdGVfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUZW1wbGF0ZUlEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZWFyY2hEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlYXJjaERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuIFwlU2VhcmNoRGF0YTsKfQoKPWhlYWQyIFNlYXJjaERhdGFTYXZlKCkKClNhdmUgdGhlIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFNlYXJjaERhdGEgPT4gJEhhc2hSZWYsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhU2F2ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgU2VhcmNoRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlYXJjaERhdGEgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBkZWxldGUgZXhpc3Rpbmcgc2VhcmNoIGRhdGEKICAgICRTZWxmLT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIERBVEFLRVk6CiAgICBmb3IgbXkgJERhdGFLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte1NlYXJjaERhdGF9IH0gKSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICBteSAkRGF0YVZhbHVlID0gJFBhcmFte1NlYXJjaERhdGF9LT57JERhdGFLZXl9OwoKICAgICAgICBuZXh0IERBVEFLRVkgaWYgISREYXRhS2V5OwogICAgICAgIG5leHQgREFUQUtFWSBpZiAhJERhdGFWYWx1ZTsKCiAgICAgICAgIyBpbnNlcnQgb25lIHJvdwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBpbWV4cG9ydF9zZWFyY2ggJwogICAgICAgICAgICAgICAgLiAnKHRlbXBsYXRlX2lkLCBkYXRhX2tleSwgZGF0YV92YWx1ZSkgVkFMVUVTICg/LCA/LCA/KScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1RlbXBsYXRlSUR9LCBcJERhdGFLZXksIFwkRGF0YVZhbHVlIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFNlYXJjaERhdGFEZWxldGUoKQoKRGVsZXRlIHRoZSBleGlzdGluZyBzZWFyY2ggZGF0YSBvZiBhIHRlbXBsYXRlCgogICAgbXkgJFRydWUgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5TZWFyY2hEYXRhRGVsZXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICBteSAkVHJ1ZSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiBbMSw0NCwxNjYsNV0sCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hEYXRhRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbG9nIG9iamVjdAogICAgbXkgJExvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFyZWYgJFBhcmFte1RlbXBsYXRlSUR9ICkgewogICAgICAgICRQYXJhbXtUZW1wbGF0ZUlEfSA9IFsgJFBhcmFte1RlbXBsYXRlSUR9IF07CiAgICB9CiAgICBlbHNpZiAoIHJlZiAkUGFyYW17VGVtcGxhdGVJRH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUZW1wbGF0ZUlEIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIG9yIGEgc3RyaW5nIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRlbXBsYXRlIGlkIHN0cmluZwogICAgbXkgJFRlbXBsYXRlSURTdHJpbmcgPSBqb2luIHF7LCB9LCBtYXAgeyc/J30gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBjcmVhdGUgYW5kIGFkZCBiaW5kIHBhcmFtZXRlcnMKICAgIG15IEBCSU5EID0gbWFwIHsgXCRfIH0gQHsgJFBhcmFte1RlbXBsYXRlSUR9IH07CgogICAgIyBkZWxldGUgdGVtcGxhdGVzCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gIkRFTEVURSBGUk9NIGltZXhwb3J0X3NlYXJjaCBXSEVSRSB0ZW1wbGF0ZV9pZCBJTiAoICRUZW1wbGF0ZUlEU3RyaW5nICkiLAogICAgICAgIEJpbmQgPT4gXEBCSU5ELAogICAgKTsKfQoKPWhlYWQyIEV4cG9ydCgpCgpFeHBvcnQgZnVuY3Rpb24KCiAgICBteSAkUmVzdWx0UmVmID0gJEltcG9ydEV4cG9ydE9iamVjdC0+RXhwb3J0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgpyZXR1cm5zIHNvbWV0aGluZyBsaWtlCgogICAgJFJlc3VsdFJlZiA9IHsKICAgICAgICBTdWNjZXNzICAgPT4gMiwKICAgICAgICBGYWlsZWQgICAgPT4gMCwKICAgICAgICBEZXN0aW5hdGlvbkNvbnRlbnQgPT4gWwogICAgICAgICAgICBbICdBdHRyXzFhJywgJ0F0dHJfMWInLCAnQXR0cl8xYycsIF0sCiAgICAgICAgICAgIFsgJ0F0dHJfMmEnLCAnQXR0cl8yYicsICdBdHRyXzNjJywgXSwKICAgICAgICBdLAogICAgfTsKCj1jdXQKCnN1YiBFeHBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkT2JqZWN0QmFja2VuZDsKCiAgICAjIGxvYWQgZm9ybWF0IGJhY2tlbmQKICAgIG15ICRGb3JtYXRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBnZXQgZXhwb3J0IGRhdGEKICAgIG15ICRFeHBvcnREYXRhID0gJE9iamVjdEJhY2tlbmQtPkV4cG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgZm9ybWF0IGRhdGEKICAgIG15ICRGb3JtYXREYXRhID0gJFNlbGYtPkZvcm1hdERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBpZiBjb2x1bW4gaGVhZGVycyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGV4cG9ydAogICAgaWYgKCAkRm9ybWF0RGF0YS0+e0luY2x1ZGVDb2x1bW5IZWFkZXJzfSApIHsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMgKHRoZSBuYW1lIG9mIHRoZSBjb2x1bW5zKQogICAgICAgIG15ICRNYXBwaW5nT2JqZWN0QXR0cmlidXRlcyA9ICRTZWxmLT5NYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBsb29rdXAgaGFzaCBmb3IgdGhlIG9iamVjdCBhdHRyaWJ1dGUgbmFtZXMKICAgICAgICBteSAlQXR0cmlidXRlTG9va3VwID0gbWFwIHsgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9IH0gQHsgJE1hcHBpbmdPYmplY3RBdHRyaWJ1dGVzLT5bMF0tPntJbnB1dH0tPntEYXRhfSB9OwoKICAgICAgICAjIGdldCBtYXBwaW5nIGRhdGEgbGlzdAogICAgICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT5NYXBwaW5nTGlzdCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIGNvbHVtbiBuYW1lcwogICAgICAgIG15IEBDb2x1bW5OYW1lczsKICAgICAgICBmb3IgbXkgJE1hcHBpbmdJRCAoIEB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICAgICAgbXkgJE1hcHBpbmdPYmplY3REYXRhID0gJFNlbGYtPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICAgICAgTWFwcGluZ0lEID0+ICRNYXBwaW5nSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCB0aGUgY29sdW1uIG5hbWUKICAgICAgICAgICAgbXkgJENvbHVtbk5hbWUgPSAkQXR0cmlidXRlTG9va3VweyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH07CgogICAgICAgICAgICBwdXNoIEBDb2x1bW5OYW1lcywgJENvbHVtbk5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBjb2x1bW4gaGVhZGVycyBhcyBmaXJzdCByb3cKICAgICAgICB1bnNoaWZ0IEB7JEV4cG9ydERhdGF9LCBcQENvbHVtbk5hbWVzOwogICAgfQoKICAgIG15ICVSZXN1bHQgPSAoCiAgICAgICAgU3VjY2VzcyAgICAgICAgICAgID0+IDAsCiAgICAgICAgRmFpbGVkICAgICAgICAgICAgID0+IDAsCiAgICAgICAgRGVzdGluYXRpb25Db250ZW50ID0+IFtdLAogICAgKTsKCiAgICBFWFBPUlREQVRBUk9XOgogICAgZm9yIG15ICRFeHBvcnREYXRhUm93ICggQHskRXhwb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXhwb3J0IG9uZSByb3cKICAgICAgICBteSAkRGVzdGluYXRpb25Db250ZW50Um93ID0gJEZvcm1hdEJhY2tlbmQtPkV4cG9ydERhdGFTYXZlKAogICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiAkRXhwb3J0RGF0YVJvdywKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFkZWZpbmVkICREZXN0aW5hdGlvbkNvbnRlbnRSb3cgKSB7CiAgICAgICAgICAgICRSZXN1bHR7RmFpbGVkfSsrOwogICAgICAgICAgICBuZXh0IEVYUE9SVERBVEFST1c7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCByb3cgdG8gZGVzdGluYXRpb24gY29udGVudAogICAgICAgIHB1c2ggQHsgJFJlc3VsdHtEZXN0aW5hdGlvbkNvbnRlbnR9IH0sICREZXN0aW5hdGlvbkNvbnRlbnRSb3c7CiAgICAgICAgJFJlc3VsdHtTdWNjZXNzfSsrOwogICAgfQoKICAgICMgbG9nIHJlc3VsdAogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJFeHBvcnQgb2YgJFJlc3VsdHtGYWlsZWR9IHJlY29yZHMgKCRUZW1wbGF0ZURhdGEtPntPYmplY3R9KTogZmFpbGVkISIsCiAgICApOwogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJFeHBvcnQgb2YgJFJlc3VsdHtTdWNjZXNzfSByZWNvcmRzICgkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSk6IHN1Y2Nlc3NmdWwhIiwKICAgICk7CgogICAgcmV0dXJuIFwlUmVzdWx0Owp9Cgo9aGVhZDIgSW1wb3J0KCkKCkltcG9ydCBmdW5jdGlvbgoKICAgIG15ICRSZXN1bHRSZWYgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5JbXBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIERpc2FibGUgdGhlIGNhY2hlIGZvciBmYXN0ZXIgaW1wb3J0LgogICAgJENhY2hlT2JqZWN0LT5Db25maWd1cmUoCiAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMCwKICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCBsb2cgb2JqZWN0CiAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgIG15ICRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0ZW1wbGF0ZSBkYXRhCiAgICBpZiAoICEkVGVtcGxhdGVEYXRhIHx8ICEkVGVtcGxhdGVEYXRhLT57T2JqZWN0fSB8fCAhJFRlbXBsYXRlRGF0YS0+e0Zvcm1hdH0gKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGVtcGxhdGUgd2l0aCBJRCAkUGFyYW17VGVtcGxhdGVJRH0gaXMgaW5jb21wbGV0ZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9hZCBvYmplY3QgYmFja2VuZAogICAgbXkgJE9iamVjdEJhY2tlbmQgPSAkS2VybmVsOjpPTS0+R2V0KAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjonIC4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0KICAgICk7CgogICAgcmV0dXJuIGlmICEkT2JqZWN0QmFja2VuZDsKCiAgICAjIGxvYWQgZm9ybWF0IGJhY2tlbmQKICAgIG15ICRGb3JtYXRCYWNrZW5kID0gJEtlcm5lbDo6T00tPkdldCgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6JyAuICRUZW1wbGF0ZURhdGEtPntGb3JtYXR9CiAgICApOwoKICAgIHJldHVybiBpZiAhJEZvcm1hdEJhY2tlbmQ7CgogICAgIyBnZXQgaW1wb3J0IGRhdGEKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkUGFyYW17U291cmNlQ29udGVudH0sCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkSW1wb3J0RGF0YTsKCiAgICAjIGdldCBmb3JtYXQgZGF0YQogICAgbXkgJEZvcm1hdERhdGEgPSAkU2VsZi0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGlmIGNvbHVtbiBoZWFkZXJzIGFyZSBhY3RpdmF0ZWQsIHRoZSBmaXJzdCByb3cgbXVzdCBiZSByZW1vdmVkCiAgICBpZiAoICRGb3JtYXREYXRhLT57SW5jbHVkZUNvbHVtbkhlYWRlcnN9ICkgewogICAgICAgIHNoaWZ0IEB7JEltcG9ydERhdGF9OwogICAgfQoKICAgICMgTnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBhbmQgbm90IHN1Y2Nlc3NmdWxseSBpbXBvcnRlZCByb3dzCiAgICBteSAlUmVzdWx0ID0gKAogICAgICAgIE9iamVjdCAgPT4gJFRlbXBsYXRlRGF0YS0+e09iamVjdH0sCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgIEZhaWxlZCAgPT4gMCwKICAgICAgICBSZXRDb2RlID0+IHt9LAogICAgICAgIENvdW50ZXIgPT4gMCwKICAgICk7CiAgICBJTVBPUlREQVRBUk9XOgogICAgZm9yIG15ICRJbXBvcnREYXRhUm93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICRSZXN1bHR7Q291bnRlcn0rKzsKCiAgICAgICAgIyBpbXBvcnQgYSBzaW5nbGUgcm93CiAgICAgICAgbXkgKCAkSUQsICRSZXRDb2RlICkgPSAkT2JqZWN0QmFja2VuZC0+SW1wb3J0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgICAgICBJbXBvcnREYXRhUm93ID0+ICRJbXBvcnREYXRhUm93LAogICAgICAgICAgICBDb3VudGVyICAgICAgID0+ICRSZXN1bHR7Q291bnRlcn0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJElEICkgewoKICAgICAgICAgICAgIyBjb3VudCBEdXBsaWNhdGVOYW1lIGVudHJpZXMgYXMgZXJyb3JzCiAgICAgICAgICAgIGlmICggJFJldENvZGUgJiYgJFJldENvZGUgPX4gbXsgXEEgRHVwbGljYXRlTmFtZSB9eG1zICkgewogICAgICAgICAgICAgICAgJFJlc3VsdHtSZXRDb2RlfS0+eyRSZXRDb2RlfSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRSZXN1bHR7RmFpbGVkfSsrOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFJlc3VsdHtSZXRDb2RlfS0+eyRSZXRDb2RlfSsrOwogICAgICAgICAgICAkUmVzdWx0e1N1Y2Nlc3N9Kys7CiAgICAgICAgfQogICAgfQoKICAgICMgbG9nIHJlc3VsdAogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgIkltcG9ydCBvZiAkUmVzdWx0e0NvdW50ZXJ9ICRSZXN1bHR7T2JqZWN0fSByZWNvcmRzOiAiCiAgICAgICAgICAgIC4gIiRSZXN1bHR7RmFpbGVkfSBmYWlsZWQsICRSZXN1bHR7U3VjY2Vzc30gc3VjY2VlZGVkIiwKICAgICk7CiAgICBmb3IgbXkgJFJldENvZGUgKCBzb3J0IGtleXMgJXsgJFJlc3VsdHtSZXRDb2RlfSB9ICkgewogICAgICAgIG15ICRDb3VudCA9ICRSZXN1bHR7UmV0Q29kZX0tPnskUmV0Q29kZX0gfHwgMDsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiSW1wb3J0IG9mICRSZXN1bHR7Q291bnRlcn0gJFJlc3VsdHtPYmplY3R9IHJlY29yZHM6ICRDb3VudCAkUmV0Q29kZSIsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggJFJlc3VsdHtGYWlsZWR9ICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMYXN0IHByb2Nlc3NlZCBsaW5lIG51bWJlciBvZiBpbXBvcnQgZmlsZTogJFJlc3VsdHtDb3VudGVyfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIENsZWFudXAgdGhlIGNhY2hlIGFmdGVyIGltcG9ydC4KICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgpOwoKICAgIHJldHVybiBcJVJlc3VsdDsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6Q1NWOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YgLSBpbXBvcnQvZXhwb3J0IGJhY2tlbmQgZm9yIENTVgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgZnVuY3Rpb25zIHRvIGltcG9ydCBhbmQgZXhwb3J0IGEgY3N2IGZvcm1hdAoKPWN1dAoKPWhlYWQyIG5ldygpCgpDcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkSW1wb3J0RXhwb3J0Q1NWQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmQ6OkNTVicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCdUZXh0OjpDU1YnKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNQQU4gbW9kdWxlIFRleHQ6OkNTViBpcyByZXF1aXJlZCB0byB1c2UgdGhlIENTViBpbXBvcnQvZXhwb3J0IG1vZHVsZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVmaW5lIGF2YWlsYWJsZSBzZXBhcmF0b3JzCiAgICAkU2VsZi0+e0F2YWlsYWJsZVNlcGFyYXRvcnN9ID0gewogICAgICAgIFRhYnVsYXRvciA9PiAiXHQiLAogICAgICAgIFNlbWljb2xvbiA9PiAnOycsCiAgICAgICAgQ29sb24gICAgID0+ICc6JywKICAgICAgICBEb3QgICAgICAgPT4gJy4nLAogICAgICAgIENvbW1hICAgICA9PiAnLCcsCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEZvcm1hdEF0dHJpYnV0ZXNHZXQoKQoKR2V0IHRoZSBmb3JtYXQgYXR0cmlidXRlcyBvZiBhIGZvcm1hdCBhcyBhcnJheS9oYXNoIHJlZmVyZW5jZQoKICAgIG15ICRBdHRyaWJ1dGVzID0gJEZvcm1hdEJhY2tlbmQtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGFyYXRvcicsCiAgICAgICAgICAgIE5hbWUgID0+IFRyYW5zbGF0YWJsZSgnQ29sdW1uIFNlcGFyYXRvcicpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGFidWxhdG9yID0+IFRyYW5zbGF0YWJsZSgnVGFidWxhdG9yIChUQUIpJyksCiAgICAgICAgICAgICAgICAgICAgU2VtaWNvbG9uID0+IFRyYW5zbGF0YWJsZSgnU2VtaWNvbG9uICg7KScpLAogICAgICAgICAgICAgICAgICAgIENvbG9uICAgICA9PiBUcmFuc2xhdGFibGUoJ0NvbG9uICg6KScpLAogICAgICAgICAgICAgICAgICAgIERvdCAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0RvdCAoLiknKSwKICAgICAgICAgICAgICAgICAgICBDb21tYSAgICAgPT4gVHJhbnNsYXRhYmxlKCdDb21tYSAoLCknKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDaGFyc2V0JywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdDaGFyc2V0JyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gJ1VURi04JywKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gMjAsCiAgICAgICAgICAgICAgICBSZWFkb25seSAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0luY2x1ZGVDb2x1bW5IZWFkZXJzJywKICAgICAgICAgICAgTmFtZSAgPT4gVHJhbnNsYXRhYmxlKCdJbmNsdWRlIENvbHVtbiBIZWFkZXJzJyksCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAwID0+IFRyYW5zbGF0YWJsZSgnTm8nKSwKICAgICAgICAgICAgICAgICAgICAxID0+IFRyYW5zbGF0YWJsZSgnWWVzJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1oZWFkMiBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgpCgpHZXQgdGhlIG1hcHBpbmcgYXR0cmlidXRlcyBvZiBhbiBmb3JtYXQgYXMgYXJyYXkvaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQXR0cmlidXRlcyA9ICRGb3JtYXRCYWNrZW5kLT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3QKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdDb2x1bW4nLAogICAgICAgICAgICBOYW1lICA9PiBUcmFuc2xhdGFibGUoJ0NvbHVtbicpLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAnVFQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJycsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlczsKfQoKPWhlYWQyIEltcG9ydERhdGFHZXQoKQoKR2V0IGltcG9ydCBkYXRhIGFzIEM8MkQtYXJyYXk+IHJlZmVyZW5jZQoKICAgIG15ICRJbXBvcnREYXRhID0gJEZvcm1hdEJhY2tlbmQtPkltcG9ydERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAxMjMsCiAgICAgICAgU291cmNlQ29udGVudCA9PiAkU3RyaW5nUmVmLCAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnREYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gW10gaWYgIWRlZmluZWQgJFBhcmFte1NvdXJjZUNvbnRlbnR9OwoKICAgICMgY2hlY2sgc291cmNlIGNvbnRlbnQKICAgIGlmICggcmVmICRQYXJhbXtTb3VyY2VDb250ZW50fSBuZSAnU0NBTEFSJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvdXJjZUNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAkQ2hhcnNldCBuZSAnVVRGLTgnICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIGNoYXJzZXQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0uIENoYXJzZXQgbXVzdCBiZSBVVEYtOCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHNlcGFyYXRvcgogICAgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IHx8PSAnJzsKICAgIG15ICRTZXBhcmF0b3IgPSAkU2VsZi0+e0F2YWlsYWJsZVNlcGFyYXRvcnN9LT57ICRGb3JtYXREYXRhLT57Q29sdW1uU2VwYXJhdG9yfSB9IHx8ICcnOwoKICAgICMgY2hlY2sgdGhlIHNlcGFyYXRvcgogICAgaWYgKCAhJFNlcGFyYXRvciApIHsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBzZXBhcmF0b3IgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBwYXJzZXIgb2JqZWN0CiAgICBteSAkUGFyc2VPYmplY3QgPSBUZXh0OjpDU1YtPm5ldygKICAgICAgICB7CiAgICAgICAgICAgIHF1b3RlX2NoYXIgICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBlc2NhcGVfY2hhciAgICAgICAgID0+ICciJywKICAgICAgICAgICAgc2VwX2NoYXIgICAgICAgICAgICA9PiAkU2VwYXJhdG9yLAogICAgICAgICAgICBlb2wgICAgICAgICAgICAgICAgID0+ICcnLAogICAgICAgICAgICBhbHdheXNfcXVvdGUgICAgICAgID0+IDEsCiAgICAgICAgICAgIGJpbmFyeSAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAga2VlcF9tZXRhX2luZm8gICAgICA9PiAwLAogICAgICAgICAgICBhbGxvd19sb29zZV9xdW90ZXMgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX2VzY2FwZXMgPT4gMCwKICAgICAgICAgICAgYWxsb3dfd2hpdGVzcGFjZSAgICA9PiAwLAogICAgICAgICAgICBibGFua19pc191bmRlZiAgICAgID0+IDAsCiAgICAgICAgICAgIHZlcmJhdGltICAgICAgICAgICAgPT4gMCwKICAgICAgICB9CiAgICApOwoKICAgICMgY3JlYXRlIGFuIGluIG1lbW9yeSB0ZW1wIGZpbGUgYW5kIG9wZW4gaXQKICAgIG15ICRGaWxlQ29udGVudCA9ICcnOwogICAgb3BlbiBteSAkRkgsICcrPCcsIFwkRmlsZUNvbnRlbnQ7ICAgICMjIG5vIGNyaXRpYwoKICAgICMgd3JpdGUgc291cmNlIGNvbnRlbnQKICAgIHByaW50ICRGSCAkeyAkUGFyYW17U291cmNlQ29udGVudH0gfTsKCiAgICAjIHJld2luZCBmaWxlIGhhbmRsZQogICAgc2VlayAkRkgsIDAsIDA7CgogICAgIyBwYXJzZSB0aGUgY29udGVudAogICAgbXkgJExpbmVDb3VudCA9IDE7CiAgICBteSBASW1wb3J0RGF0YTsKCiAgICAjIGl0IGlzIGltcG9ydGFudCB0byB1c2UgdGhpcyBzeW50YXggIndoaWxlICggIWVvZigkRkgpICkiCiAgICAjIGFzIHRoZSBDUEFOIG1vZHVsZSBUZXh0OjpDU1ZfWFMgbWlnaHQgc2hvdyBlcnJvcnMgaWYgdGhlCiAgICAjIGdldGxpbmUgY2FsbCBpcyB3aXRoaW4gdGhlIHdoaWxlIHRlc3QKICAgICMgaGF2ZSBhIGxvb2sgYXQgaHR0cDovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTkyNzAKICAgIHdoaWxlICggIWVvZigkRkgpICkgewogICAgICAgIG15ICRDb2x1bW4gPSAkUGFyc2VPYmplY3QtPmdldGxpbmUoJEZIKTsKICAgICAgICBwdXNoIEBJbXBvcnREYXRhLCAkQ29sdW1uOwogICAgICAgICRMaW5lQ291bnQrKzsKICAgIH0KCiAgICAjIGVycm9yIGhhbmRsaW5nCiAgICBteSAoICRQYXJzZUVycm9yQ29kZSwgJFBhcnNlRXJyb3JTdHJpbmcgKSA9ICRQYXJzZU9iamVjdC0+ZXJyb3JfZGlhZygpOwogICAgaWYgKCRQYXJzZUVycm9yQ29kZSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW1wb3J0RXJyb3IgYXQgbGluZSAkTGluZUNvdW50LCAiCiAgICAgICAgICAgICAgICAuICJFcnJvckNvZGU6ICRQYXJzZUVycm9yQ29kZSAnJFBhcnNlRXJyb3JTdHJpbmcnICIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNsb3NlIHRoZSBpbiBtZW1vcnkgZmlsZSBoYW5kbGUKICAgIGNsb3NlICRGSDsKCiAgICAjIHNldCB1dGY4IGZsYWcKICAgIGZvciBteSAkUm93IChASW1wb3J0RGF0YSkgewogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JFJvd30gKSB7CiAgICAgICAgICAgIEVuY29kZTo6X3V0Zjhfb24oJENlbGwpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBJbXBvcnREYXRhOwp9Cgo9aGVhZDIgRXhwb3J0RGF0YVNhdmUoKQoKRXhwb3J0IG9uZSByb3cgb2YgdGhlIGV4cG9ydCBkYXRhCgogICAgbXkgJERlc3RpbmF0aW9uQ29udGVudCA9ICRGb3JtYXRCYWNrZW5kLT5FeHBvcnREYXRhU2F2ZSgKICAgICAgICBUZW1wbGF0ZUlEICAgID0+IDEyMywKICAgICAgICBFeHBvcnREYXRhUm93ID0+ICRBcnJheVJlZiwKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFTYXZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFRlbXBsYXRlSUQgRXhwb3J0RGF0YVJvdyBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZXhwb3J0IGRhdGEgcm93CiAgICBpZiAoIHJlZiAkUGFyYW17RXhwb3J0RGF0YVJvd30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0V4cG9ydERhdGFSb3cgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm1hdCBkYXRhCiAgICBteSAkRm9ybWF0RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+Rm9ybWF0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGZvcm1hdCBkYXRhCiAgICBpZiAoICEkRm9ybWF0RGF0YSB8fCByZWYgJEZvcm1hdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gZm9ybWF0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNoYXJzZXQKICAgIG15ICRDaGFyc2V0ID0gJEZvcm1hdERhdGEtPntDaGFyc2V0fSB8fD0gJyc7CgogICAgIyBjaGVjayB0aGUgY2hhcnNldAogICAgaWYgKCAkQ2hhcnNldCBuZSAnVVRGLTgnICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIGNoYXJzZXQgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0uIENoYXJzZXQgbXVzdCBiZSBVVEYtOCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGNvbHVtbm4gc2VwYXJhdG9yCiAgICAkRm9ybWF0RGF0YS0+e0NvbHVtblNlcGFyYXRvcn0gfHw9ICcnOwogICAgbXkgJFNlcGFyYXRvciA9ICRTZWxmLT57QXZhaWxhYmxlU2VwYXJhdG9yc30tPnsgJEZvcm1hdERhdGEtPntDb2x1bW5TZXBhcmF0b3J9IH0gfHwgJyc7CgogICAgIyBjaGVjayB0aGUgc2VwYXJhdG9yCiAgICBpZiAoICEkU2VwYXJhdG9yICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHZhbGlkIHNlcGFyYXRvciBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHBhcnNlciBvYmplY3QKICAgIG15ICRQYXJzZU9iamVjdCA9IFRleHQ6OkNTVi0+bmV3KAogICAgICAgIHsKICAgICAgICAgICAgcXVvdGVfY2hhciAgICAgICAgICA9PiAnIicsCiAgICAgICAgICAgIGVzY2FwZV9jaGFyICAgICAgICAgPT4gJyInLAogICAgICAgICAgICBzZXBfY2hhciAgICAgICAgICAgID0+ICRTZXBhcmF0b3IsCiAgICAgICAgICAgIGVvbCAgICAgICAgICAgICAgICAgPT4gJycsCiAgICAgICAgICAgIGFsd2F5c19xdW90ZSAgICAgICAgPT4gMSwKICAgICAgICAgICAgYmluYXJ5ICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBrZWVwX21ldGFfaW5mbyAgICAgID0+IDAsCiAgICAgICAgICAgIGFsbG93X2xvb3NlX3F1b3RlcyAgPT4gMCwKICAgICAgICAgICAgYWxsb3dfbG9vc2VfZXNjYXBlcyA9PiAwLAogICAgICAgICAgICBhbGxvd193aGl0ZXNwYWNlICAgID0+IDAsCiAgICAgICAgICAgIGJsYW5rX2lzX3VuZGVmICAgICAgPT4gMCwKICAgICAgICAgICAgdmVyYmF0aW0gICAgICAgICAgICA9PiAwLAogICAgICAgIH0KICAgICk7CgogICAgaWYgKCAhJFBhcnNlT2JqZWN0LT5jb21iaW5lKCBAeyAkUGFyYW17RXhwb3J0RGF0YVJvd30gfSApICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbWJpbmUgdGhlIGV4cG9ydCBkYXRhIHRvIGEgc3RyaW5nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIENTViBzdHJpbmcKICAgIG15ICRTdHJpbmcgPSAkUGFyc2VPYmplY3QtPnN0cmluZygpOwoKICAgICMgc2V0IHV0ZjggZmxhZwogICAgRW5jb2RlOjpfdXRmOF9vbigkU3RyaW5nKTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpJbXBvcnRFeHBvcnQ6OkltcG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ1RoZSB0b29sIGZvciBpbXBvcnRpbmcgY29uZmlnIGl0ZW1zJyk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0ZW1wbGF0ZS1udW1iZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJTcGVjaWZ5IGEgdGVtcGxhdGUgbnVtYmVyIHRvIGJlIGltcG9lcnRlZC4iLAogICAgICAgIFJlcXVpcmVkICAgID0+IDEsCiAgICAgICAgSGFzVmFsdWUgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci9cZCsvc214LAogICAgKTsKICAgICRTZWxmLT5BZGRBcmd1bWVudCgKICAgICAgICBOYW1lICAgICAgICA9PiAnc291cmNlJywKICAgICAgICBEZXNjcmlwdGlvbiA9PiAiU3BlY2lmeSB0aGUgcGF0aCB0byB0aGUgZmlsZSB3aGljaCBjb250YWluaW5nIHRoZSBjb25maWcgaXRlbSBkYXRhIGZvciBpbXBvcnRpbmcuIiwKICAgICAgICBSZXF1aXJlZCAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyLy4qL3NteCwKICAgICk7CgogICAgcmV0dXJuOwp9CgpzdWIgUHJlUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNvdXJjZVBhdGggPSAkU2VsZi0+R2V0QXJndW1lbnQoJ3NvdXJjZScpOwogICAgaWYgKCAkU291cmNlUGF0aCAmJiAhLXIgJFNvdXJjZVBhdGggKSB7CiAgICAgICAgZGllICJGaWxlICRTb3VyY2VQYXRoIGRvZXMgbm90IGV4aXN0LCBjYW4gbm90IGJlIHJlYWQuXG4iOwogICAgfQoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPkdldE9wdGlvbigndGVtcGxhdGUtbnVtYmVyJyk7CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiVGVtcGxhdGUgJFRlbXBsYXRlSUQgbm90IGZvdW5kIS5cbiIpOwogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJFeHBvcnQgYWJvcnRlZC4uXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+SW1wb3J0aW5nIGNvbmZpZyBpdGVtcy4uLjwveWVsbG93PlxuIik7CiAgICAkU2VsZi0+UHJpbnQoICI8eWVsbG93PiIgLiAoICc9JyB4IDY5ICkgLiAiPC95ZWxsb3c+XG4iICk7CgogICAgbXkgJFNvdXJjZUNvbnRlbnQ7CiAgICBteSAkU291cmNlRmlsZSA9ICRTZWxmLT5HZXRBcmd1bWVudCgnc291cmNlJyk7CgogICAgaWYgKCRTb3VyY2VGaWxlKSB7CgogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5SZWFkIEZpbGUgJFNvdXJjZUZpbGUuPC95ZWxsb3c+XG4iKTsKCiAgICAgICAgIyByZWFkIHNvdXJjZSBmaWxlCiAgICAgICAgJFNvdXJjZUNvbnRlbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNvdXJjZUZpbGUsCiAgICAgICAgICAgIFJlc3VsdCAgID0+ICdTQ0FMQVInLAogICAgICAgICAgICBNb2RlICAgICA9PiAnYmlubW9kZScsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFNvdXJjZUNvbnRlbnQgKSB7CiAgICAgICAgICAgICRTZWxmLT5QcmludEVycm9yKCJDYW4ndCByZWFkIGZpbGUgJFNvdXJjZUZpbGUuXG5JbXBvcnQgYWJvcnRlZC5cbiIpIGlmICEkU291cmNlQ29udGVudDsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZUVycm9yKCk7CiAgICAgICAgfQoKICAgIH0KCiAgICAjIGltcG9ydCBkYXRhCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydCcpLT5JbXBvcnQoCiAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBTb3VyY2VDb250ZW50ID0+ICRTb3VyY2VDb250ZW50LAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7CgogICAgaWYgKCAhJFJlc3VsdCApIHsKICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiXG5FcnJvciBvY2N1cnJlZC4gSW1wb3J0IGltcG9zc2libGUhIFNlZSB0aGUgT1RSUyBsb2cgZm9yIGRldGFpbHMuXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAjIHByaW50IHJlc3VsdAogICAgJFNlbGYtPlByaW50KCJcbjxncmVlbj5JbXBvcnQgb2YgJFJlc3VsdC0+e0NvdW50ZXJ9ICRSZXN1bHQtPntPYmplY3R9IHJlY29yZHM6PC9ncmVlbj5cbiIpOwogICAgJFNlbGYtPlByaW50KCAiPGdyZWVuPiIgLiAoICctJyB4IDY5ICkgLiAiPC9ncmVlbj5cbiIgKTsKICAgICRTZWxmLT5QcmludCgiPGdyZWVuPlN1Y2Nlc3M6ICRSZXN1bHQtPntTdWNjZXNzfSBzdWNjZWVkZWQ8L2dyZWVuPlxuIik7CiAgICBpZiAoICRSZXN1bHQtPntGYWlsZWR9ICkgewogICAgICAgICRTZWxmLT5QcmludEVycm9yKCIkUmVzdWx0LT57RmFpbGVkfSBmYWlsZWQuXG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkVycm9yOiAkUmVzdWx0LT57RmFpbGVkfSBmYWlsZWQuPC9ncmVlbj5cbiIpOwogICAgfQoKICAgIGZvciBteSAkUmV0Q29kZSAoIHNvcnQga2V5cyAleyAkUmVzdWx0LT57UmV0Q29kZX0gfSApIHsKICAgICAgICBteSAkQ291bnQgPSAkUmVzdWx0LT57UmV0Q29kZX0tPnskUmV0Q29kZX0gfHwgMDsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5JbXBvcnQgb2YgJFJlc3VsdC0+e0NvdW50ZXJ9ICRSZXN1bHQtPntPYmplY3R9IHJlY29yZHM6ICRDb3VudCAkUmV0Q29kZTwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGlmICggJFJlc3VsdC0+e0ZhaWxlZH0gKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+TGFzdCBwcm9jZXNzZWQgbGluZSBudW1iZXIgb2YgaW1wb3J0IGZpbGU6ICRSZXN1bHQtPntDb3VudGVyfTwvZ3JlZW4+XG4iKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5JbXBvcnQgY29tcGxldGUuPC9ncmVlbj5cbiIpOwogICAgJFNlbGYtPlByaW50KCAiPGdyZWVuPiIgLiAoICctJyB4IDY5ICkgLiAiPC9ncmVlbj5cbiIgKTsKICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRvbmUuPC9ncmVlbj5cbiIpOwoKICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVPaygpOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkNvbW1hbmQ6OkFkbWluOjpJVFNNOjpJbXBvcnRFeHBvcnQ6OkV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpTeXN0ZW06OkNvbnNvbGU6OkJhc2VDb21tYW5kKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0JywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ1RoZSB0b29sIGZvciBleHBvcnRpbmcgY29uZmlnIGl0ZW1zJyk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICd0ZW1wbGF0ZS1udW1iZXInLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJTcGVjaWZ5IGEgdGVtcGxhdGUgbnVtYmVyIHRvIGJlIGV4cG9ydGVkLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyL1xkKy9zbXgsCiAgICApOwogICAgJFNlbGYtPkFkZEFyZ3VtZW50KAogICAgICAgIE5hbWUgICAgICAgID0+ICdkZXN0aW5hdGlvbicsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gIlNwZWNpZnkgdGhlIHBhdGggdG8gYSBmaWxlIHdoZXJlIGNvbmZpZyBpdGVtIGRhdGEgc2hvdWxkIGJlIGV4cG9ydGVkLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMSwKICAgICAgICBWYWx1ZVJlZ2V4ICA9PiBxci8uKi9zbXgsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPkdldE9wdGlvbigndGVtcGxhdGUtbnVtYmVyJyk7CgogICAgIyBnZXQgdGVtcGxhdGUgZGF0YQogICAgbXkgJFRlbXBsYXRlRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+VGVtcGxhdGVHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgIGlmICggISRUZW1wbGF0ZURhdGEtPntUZW1wbGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+UHJpbnRFcnJvcigiVGVtcGxhdGUgJFRlbXBsYXRlSUQgbm90IGZvdW5kIS5cbiIpOwogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJFeHBvcnQgYWJvcnRlZC4uXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+RXhwb3J0aW5nIGNvbmZpZyBpdGVtcy4uLjwveWVsbG93PlxuIik7CiAgICAkU2VsZi0+UHJpbnQoICI8eWVsbG93PiIgLiAoICc9JyB4IDY5ICkgLiAiPC95ZWxsb3c+XG4iICk7CgogICAgIyBleHBvcnQgZGF0YQogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKS0+RXhwb3J0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBpZiAoICEkUmVzdWx0ICkgewogICAgICAgICRTZWxmLT5QcmludEVycm9yKCJFcnJvciBvY2N1cnJlZC4gRXhwb3J0IGltcG9zc2libGUhIFNlZSBTeXNsb2cgZm9yIGRldGFpbHMuXG4iKTsKICAgICAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKICAgIH0KCiAgICAkU2VsZi0+UHJpbnQoICI8Z3JlZW4+IiAuICggJy0nIHggNjkgKSAuICI8L2dyZWVuPlxuIiApOwogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+U3VjY2VzczogJFJlc3VsdC0+e1N1Y2Nlc3N9IHN1Y2NlZWRlZDwvZ3JlZW4+XG4iKTsKICAgIGlmICggJFJlc3VsdC0+e0ZhaWxlZH0gKSB7CiAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIiRSZXN1bHQtPntGYWlsZWR9IGZhaWxlZC5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RXJyb3I6ICRSZXN1bHQtPntGYWlsZWR9IGZhaWxlZC48L2dyZWVuPlxuIik7CiAgICB9CgogICAgbXkgJERlc3RpbmF0aW9uRmlsZSA9ICRTZWxmLT5HZXRBcmd1bWVudCgnZGVzdGluYXRpb24nKTsKCiAgICBpZiAoJERlc3RpbmF0aW9uRmlsZSkgewoKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSBqb2luICJcbiIsIEB7ICRSZXN1bHQtPntEZXN0aW5hdGlvbkNvbnRlbnR9IH07CgogICAgICAgICMgc2F2ZSBkZXN0aW5hdGlvbiBjb250ZW50IHRvIGZpbGUKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkZpbGVXcml0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJERlc3RpbmF0aW9uRmlsZSwKICAgICAgICAgICAgQ29udGVudCAgPT4gXCRGaWxlQ29udGVudCwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50RXJyb3IoIkNhbid0IHdyaXRlIGZpbGUgJERlc3RpbmF0aW9uRmlsZS5cbkV4cG9ydCBhYm9ydGVkLlxuIik7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+RXhpdENvZGVFcnJvcigpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RmlsZSAkRGVzdGluYXRpb25GaWxlIHNhdmVkLjwvZ3JlZW4+XG4iKTsKCiAgICB9CgogICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RXhwb3J0IGNvbXBsZXRlLjwvZ3JlZW4+XG4iKTsKICAgICRTZWxmLT5QcmludCggIjxncmVlbj4iIC4gKCAnLScgeCA2OSApIC4gIjwvZ3JlZW4+XG4iICk7CiAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Eb25lLjwvZ3JlZW4+XG4iKTsKCiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKfQoKMTsKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7CgojIGdldCBuZWVkZWQgb2JqZWN0cwpteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKbXkgJFVzZXJPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7Cm15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7Cm15ICRIZWxwZXIgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9CiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+IDAsCiAgICApOwoKICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gMiApIHsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHVzZXJzIGZvciB0aGUgdGVzdHMKICAgICAgICBteSAkVXNlcklEID0gJFVzZXJPYmplY3QtPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0ltcG9ydEV4cG9ydCcgLiAkQ291bnRlciwKICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnVW5pdFRlc3QnLAogICAgICAgICAgICBVc2VyTG9naW4gICAgID0+ICdVbml0VGVzdC1JbXBvcnRFeHBvcnQtJyAuICRDb3VudGVyIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtSW1wb3J0RXhwb3J0LScgLiAkQ291bnRlciAuICdAbG9jYWxob3N0JywKICAgICAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDaGFuZ2VVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAVXNlcklEcywgJFVzZXJJRDsKICAgIH0KCiAgICAjIHJlc3RvcmUgb3JpZ2luYWwgZW1haWwgY2hlY2sgcGFyYW0KCiAgICAkQ29uZmlnT2JqZWN0LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSB0ZW1wbGF0ZSBuYW1lcwpteSBAVGVtcGxhdGVOYW1lOwoKZm9yIG15ICRDb3VudGVyICggMSAuLiA1ICkgewoKICAgIHB1c2ggQFRlbXBsYXRlTmFtZSwgJ1VuaXRUZXN0JyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7Cn0KCiMgY3JlYXRlIG5lZWRlZCByYW5kb20gb2JqZWN0IG5hbWVzCm15IEBPYmplY3ROYW1lOwpwdXNoIEBPYmplY3ROYW1lLCAnVW5pdFRlc3QnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKCiMgY3JlYXRlIG5lZWRlZCBmb3JtYXQgbmFtZXMKbXkgQEZvcm1hdE5hbWUgPSAoJ0NTVicpOwoKIyBnZXQgb3JpZ2luYWwgdGVtcGxhdGUgbGlzdCBmb3IgbGF0ZXIgY2hlY2tzIChhbGwgZWxlbWVudHMpCm15ICRUZW1wbGF0ZUxpc3QxQWxsID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgVXNlcklEID0+IDEsCik7CgojIGdldCBvcmlnaW5hbCB0ZW1wbGF0ZSBsaXN0IGZvciBsYXRlciBjaGVja3MgKGFsbCBlbGVtZW50cykKbXkgJFRlbXBsYXRlTGlzdDFPYmplY3QgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSXRlbURhdGEgPSBbCgogICAgIyB0aGlzIHRlbXBsYXRlIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgICAgICAgICBGb3JtYXQgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICA9PiAkVGVtcGxhdGVOYW1lWzBdLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgdGVtcGxhdGUgaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgb25lIHRlc3QgYmVmb3JlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICA9PiAkRm9ybWF0TmFtZVswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50JywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICRGb3JtYXROYW1lWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBOT1QgdXBkYXRlZCAodGVtcGxhdGUgdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMScsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSB0ZW1wbGF0ZSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKHRlbXBsYXRlIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFMycsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJ1Rlc3RDb21tZW50IFVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzFdIC4gJ1VQREFURTMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAyLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdENvbW1lbnQgVVBEQVRFMycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkICh0ZW1wbGF0ZSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICRUZW1wbGF0ZU5hbWVbMV0gLiAnVVBEQVRFNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFRlbXBsYXRlTmFtZVsxXSAuICdVUERBVEU0JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5IChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBPYmplY3QgID0+ICIgXHQgXG4gXHIgIiAuICRPYmplY3ROYW1lWzBdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBGb3JtYXQgID0+ICIgXHQgXG4gXHIgIiAuICRGb3JtYXROYW1lWzBdIC4gIiBcdCBcbiBcciAiLAogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgIiAuICRUZW1wbGF0ZU5hbWVbMl0gLiAiIFx0IFxuIFxyICIsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAiIFx0IFxuIFxyIFRlc3QgQ29tbWVudCBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBPYmplY3QgICA9PiAkT2JqZWN0TmFtZVswXSwKICAgICAgICAgICAgRm9ybWF0ICAgPT4gJEZvcm1hdE5hbWVbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRUZW1wbGF0ZU5hbWVbMl0sCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHRlbXBsYXRlIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICIgXHQgXG4gXHIgIiAuICRUZW1wbGF0ZU5hbWVbMl0gLiAiVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBVcGRhdGVHZXQgPT4gewogICAgICAgICAgICBOYW1lICAgICA9PiAkVGVtcGxhdGVOYW1lWzJdIC4gJ1VQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyB0ZW1wbGF0ZSBtdXN0IGJlIGluc2VydGVkIHN1Y2Nlc3NmdWxseSAoVW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgT2JqZWN0ICA9PiAnIMaVIMaYICcgLiAkT2JqZWN0TmFtZVswXSAuICcgxrUgxrsgJywKICAgICAgICAgICAgRm9ybWF0ICA9PiAnIMeTIMejICcgLiAkRm9ybWF0TmFtZVswXSAuICcgx6Ugx64gJywKICAgICAgICAgICAgTmFtZSAgICA9PiAnIMe3IMicICcgLiAkVGVtcGxhdGVOYW1lWzNdIC4gJyDIniDIoCAnLAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDRoCDRpCBUZXN0Q29tbWVudDUgz6AgzqkgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgT2JqZWN0ICAgPT4gJ8aVxpgnIC4gJE9iamVjdE5hbWVbMF0gLiAnxrXGuycsCiAgICAgICAgICAgIEZvcm1hdCAgID0+ICfHk8ejJyAuICRGb3JtYXROYW1lWzBdIC4gJ8elx64nLAogICAgICAgICAgICBOYW1lICAgICA9PiAnx7cgyJwgJyAuICRUZW1wbGF0ZU5hbWVbM10gLiAnIMieIMigJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMiwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ9GgINGkIFRlc3RDb21tZW50NSDPoCDOqScsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15IEBBZGRlZFRlbXBsYXRlSURzOwoKVEVNUExBVEU6CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IHRlbXBsYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCggJXsgJEl0ZW0tPntBZGR9IH0gKTsKCiAgICAgICAgaWYgKCRUZW1wbGF0ZUlEKSB7CiAgICAgICAgICAgIHB1c2ggQEFkZGVkVGVtcGxhdGVJRHMsICRUZW1wbGF0ZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVBZGQoKSAtIFRlbXBsYXRlS2V5OiAkVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSggJFRlbXBsYXRlSUQsICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlQWRkKCkiICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAjIGdldCB0ZW1wbGF0ZSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgdGVtcGxhdGUgd2FzIGFkZGVkCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRJdGVtLT57QWRkfS0+e1VzZXJJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEgYWZ0ZXIgY3JlYXRpb24gb2YgdGVtcGxhdGUKICAgICAgICBmb3IgbXkgJFRlbXBsYXRlQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkVGVtcGxhdGVHZXQtPnskVGVtcGxhdGVBdHRyaWJ1dGV9IHx8ICcnLAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlR2V0KCkgLSAkVGVtcGxhdGVBdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IHRlbXBsYXRlIGlkIHZhcmlhYmxlCiAgICAgICAgaWYgKCAhJEFkZGVkVGVtcGxhdGVJRHNbLTFdICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBJVEVNIElEIEdJVkVOLiBQbGVhc2UgYWRkIGEgdGVtcGxhdGUgZmlyc3QuIgogICAgICAgICAgICApOwogICAgICAgICAgICBsYXN0IFRFTVBMQVRFOwogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIHRlbXBsYXRlCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkQWRkZWRUZW1wbGF0ZUlEc1stMV0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZW1wbGF0ZSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlVXBkYXRlKCkgLSBUZW1wbGF0ZUtleTogJEFkZGVkVGVtcGxhdGVJRHNbLTFdIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRVcGRhdGVTdWNlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJFRlbXBsYXRlR2V0ID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVHZXQoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJEFkZGVkVGVtcGxhdGVJRHNbLTFdLAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRJdGVtLT57VXBkYXRlfS0+e1VzZXJJRH0gfHwgMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIHRlbXBsYXRlIGRhdGEgYWZ0ZXIgdXBkYXRlCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJFRlbXBsYXRlR2V0LT57JFRlbXBsYXRlQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57VXBkYXRlR2V0fS0+eyRUZW1wbGF0ZUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUdldCgpIC0gJFRlbXBsYXRlQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9Cn0KY29udGludWUgewoKICAgICMgaW5jcmVtZW50IHRoZSBjb3VudGVyCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBUZW1wbGF0ZUxpc3QgdGVzdCAxIChjaGVjayBhcnJheSByZWZlcmVuY2VzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBhcnJheSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICByZWYgJFRlbXBsYXRlTGlzdDFBbGwgZXEgJ0FSUkFZJyAmJiByZWYgJFRlbXBsYXRlTGlzdDFPYmplY3QgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IFRlbXBsYXRlTGlzdCgpIC0gYXJyYXkgcmVmZXJlbmNlcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVMaXN0IHRlc3QgMiAobGlzdCBtdXN0IGJlIGVtcHR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGxpc3QgbXVzdCBiZSBhbiBlbXB0eSBsaXN0CiRTZWxmLT5UcnVlKAogICAgc2NhbGFyIEB7JFRlbXBsYXRlTGlzdDFPYmplY3R9IGVxIDAsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGVtcHR5IGxpc3QiLAopOwoKJFRlc3RDb3VudCsrOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFRlbXBsYXRlTGlzdCB0ZXN0IDIgKGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcykKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVMaXN0MiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlRlbXBsYXRlTGlzdCgKICAgIFVzZXJJRCA9PiAxLAopOwoKIyBsaXN0IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRUZW1wbGF0ZUxpc3QyIGVxICdBUlJBWScsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGFycmF5IHJlZmVyZW5jZSIsCik7CgpteSAkVGVtcGxhdGVMaXN0Q291bnQgPSBzY2FsYXIgQHskVGVtcGxhdGVMaXN0Mn0gLSBzY2FsYXIgQHskVGVtcGxhdGVMaXN0MUFsbH07CgojIGNoZWNrIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcwokU2VsZi0+VHJ1ZSgKICAgICRUZW1wbGF0ZUxpc3RDb3VudCBlcSBzY2FsYXIgQEFkZGVkVGVtcGxhdGVJRHMsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZUxpc3QoKSAtIGNvcnJlY3QgbnVtYmVyIG9mIG5ldyBpdGVtcyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAxIChhZGQgb25lIHRlbXBsYXRlIGFuZCBkZWxldGUgaXQpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGFkZCBhIHRlc3QgdGVtcGxhdGUKbXkgJFRlbXBsYXRlRGVsZXRlSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUFkZCgKICAgIE9iamVjdCAgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBGb3JtYXQgID0+ICRGb3JtYXROYW1lWzBdLAogICAgTmFtZSAgICA9PiAkVGVtcGxhdGVOYW1lWzRdLAogICAgVmFsaWRJRCA9PiAxLAogICAgVXNlcklEICA9PiAxLAopOwoKIyBnZXQgdGVtcGxhdGUgbGlzdCB3aXRoIGFsbCBlbGVtZW50cwpteSAkVGVtcGxhdGVEZWxldGUxTGlzdDIgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5UZW1wbGF0ZUxpc3QoCiAgICBPYmplY3QgPT4gJE9iamVjdE5hbWVbMF0sCiAgICBVc2VySUQgPT4gMSwKKTsKCiMgbGlzdCBtdXN0IGhhdmUgb25lIGVsZW1lbnQgbW9yZQokU2VsZi0+VHJ1ZSgKICAgIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0MX0gZXEgKCBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDJ9ICkgLSAxLAogICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSAtIG51bWJlciBvZiBsaXN0ZWQgZWxlbWVudHMiLAopOwoKIyBkZWxldGUgdGhlIG5ldyB0ZW1wbGF0ZQpteSAkVGVtcGxhdGVEZWxldGUxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZURlbGV0ZUlELAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBsaXN0IG11c3QgYmUgc3VjY2Vzc2Z1bAokU2VsZi0+VHJ1ZSgKICAgICRUZW1wbGF0ZURlbGV0ZTEsCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIiwKKTsKCiMgZ2V0IHRlbXBsYXRlIGxpc3Qgd2l0aCBhbGwgZWxlbWVudHMKbXkgJFRlbXBsYXRlRGVsZXRlMUxpc3QzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVMaXN0KAogICAgT2JqZWN0ID0+ICRPYmplY3ROYW1lWzBdLAogICAgVXNlcklEID0+IDEsCik7CgojIGxpc3QgbXVzdCBoYXZlIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgZWxlbWVudHMKJFNlbGYtPlRydWUoCiAgICBzY2FsYXIgQHskVGVtcGxhdGVEZWxldGUxTGlzdDF9IGVxIHNjYWxhciBAeyRUZW1wbGF0ZURlbGV0ZTFMaXN0M30sCiAgICAiVGVzdCAkVGVzdENvdW50OiBUZW1wbGF0ZURlbGV0ZSgpIC0gbnVtYmVyIG9mIGxpc3RlZCBlbGVtZW50cyIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgVGVtcGxhdGVEZWxldGUgdGVzdCAyIChkZWxldGUgYWxsIHVuaXQgdGVzdCB0ZW1wbGF0ZXMpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkVGVtcGxhdGVJRCAoQEFkZGVkVGVtcGxhdGVJRHMpIHsKCiAgICAjIGRlbGV0ZSB0aGUgdGVtcGxhdGUKICAgIG15ICRTdWNjZXNzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKICAgICMgY2hlY2sgc3VjY2VzcwogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogVGVtcGxhdGVEZWxldGUoKSBUZW1wbGF0ZUlEICRUZW1wbGF0ZUlEIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgT2JqZWN0TGlzdCB0ZXN0IDEgKGNoZWNrIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBkZWZpbmUgdGVzdCBsaXN0Cm15ICRPYmplY3RMaXN0MVRlc3RMaXN0ID0gewogICAgVW5pdFRlc3QxID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlVuaXRUZXN0MScsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMScsCiAgICB9LAogICAgVW5pdFRlc3QyID0+IHsKICAgICAgICBNb2R1bGUgPT4gJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmQ6OlVuaXRUZXN0MicsCiAgICAgICAgTmFtZSAgID0+ICdVbml0IFRlc3QgMicsCiAgICB9LAp9OwoKIyBnZXQgb3JpZ2luYWwgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3RPcmcgPQogICAgJENvbmZpZ09iamVjdC0+R2V0KCdJbXBvcnRFeHBvcnQ6Ok9iamVjdEJhY2tlbmRSZWdpc3RyYXRpb24nKTsKCiMgc2V0IHRlc3QgbGlzdAokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRPYmplY3RMaXN0MVRlc3RMaXN0LAopOwoKIyBnZXQgb2JqZWN0IGxpc3QKbXkgJE9iamVjdExpc3QxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0TGlzdCgpOwoKIyBsaXN0IG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgIHJlZiAkT2JqZWN0TGlzdDEgZXEgJ0hBU0gnLAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gaGFzaCByZWZlcmVuY2UiLAopOwoKIyBjaGVjayB0aGUgbGlzdApLRVk6CmZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JE9iamVjdExpc3QxfSApIHsKCiAgICBpZiAoICEkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9ICkgewogICAgICAgICRPYmplY3RMaXN0MVRlc3RMaXN0LT57RHVtbXl9ID0gMTsKICAgIH0KCiAgICBuZXh0IEtFWSBpZiAkT2JqZWN0TGlzdDEtPnskS2V5fSBuZSAkT2JqZWN0TGlzdDFUZXN0TGlzdC0+eyRLZXl9LT57TmFtZX07CgogICAgZGVsZXRlICRPYmplY3RMaXN0MVRlc3RMaXN0LT57JEtleX07Cn0KCiRTZWxmLT5UcnVlKAogICAgISV7JE9iamVjdExpc3QxVGVzdExpc3R9LAogICAgIlRlc3QgJFRlc3RDb3VudDogT2JqZWN0TGlzdCgpIC0gY29udGVudCBpcyB2YWxpZCIsCik7CgojIHJlc3RvcmUgb3JpZ2luYWwgb2JqZWN0IGxpc3QKJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0ltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZFJlZ2lzdHJhdGlvbicsCiAgICBWYWx1ZSA9PiAkT2JqZWN0TGlzdE9yZywKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRMaXN0IHRlc3QgMSAoY2hlY2sgZ2VuZXJhbCBmdW5jdGlvbmFsaXR5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGRlZmluZSB0ZXN0IGxpc3QKbXkgJEZvcm1hdExpc3QxVGVzdExpc3QgPSB7CiAgICBVbml0VGVzdDEgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QxJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAxJywKICAgIH0sCiAgICBVbml0VGVzdDIgPT4gewogICAgICAgIE1vZHVsZSA9PiAnS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZDo6VW5pdFRlc3QyJywKICAgICAgICBOYW1lICAgPT4gJ1VuaXQgVGVzdCAyJywKICAgIH0sCn07CgojIGdldCBvcmlnaW5hbCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdE9yZyA9CiAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0ltcG9ydEV4cG9ydDo6Rm9ybWF0QmFja2VuZFJlZ2lzdHJhdGlvbicpOwoKIyBzZXQgdGVzdCBsaXN0CiRDb25maWdPYmplY3QtPlNldCgKICAgIEtleSAgID0+ICdJbXBvcnRFeHBvcnQ6OkZvcm1hdEJhY2tlbmRSZWdpc3RyYXRpb24nLAogICAgVmFsdWUgPT4gJEZvcm1hdExpc3QxVGVzdExpc3QsCik7CgojIGdldCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgojIGxpc3QgbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlCiRTZWxmLT5UcnVlKAogICAgcmVmICRGb3JtYXRMaXN0MSBlcSAnSEFTSCcsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBoYXNoIHJlZmVyZW5jZSIsCik7CgojIGNoZWNrIHRoZSBsaXN0CktFWToKZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskRm9ybWF0TGlzdDF9ICkgewoKICAgIGlmICggISRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0gKSB7CiAgICAgICAgJEZvcm1hdExpc3QxVGVzdExpc3QtPntEdW1teX0gPSAxOwogICAgfQoKICAgIG5leHQgS0VZIGlmICRGb3JtYXRMaXN0MS0+eyRLZXl9IG5lICRGb3JtYXRMaXN0MVRlc3RMaXN0LT57JEtleX0tPntOYW1lfTsKCiAgICBkZWxldGUgJEZvcm1hdExpc3QxVGVzdExpc3QtPnskS2V5fTsKfQoKJFNlbGYtPlRydWUoCiAgICAhJXskRm9ybWF0TGlzdDFUZXN0TGlzdH0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBjb250ZW50IGlzIHZhbGlkIiwKKTsKCiMgcmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgbGlzdAokQ29uZmlnT2JqZWN0LT5TZXQoCiAgICBLZXkgICA9PiAnSW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kUmVnaXN0cmF0aW9uJywKICAgIFZhbHVlID0+ICRGb3JtYXRMaXN0T3JnLAopOwoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyBxdygkU2VsZik7Cgp1c2UgRGF0YTo6RHVtcGVyOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJE1haW5PYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwpteSAkSW1wb3J0RXhwb3J0T2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKbXkgJEZvcm1hdEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpGb3JtYXRCYWNrZW5kOjpDU1YnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBtYWtlIHByZXBhcmF0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBob21lIGRpcmVjdG9yeQokU2VsZi0+e0hvbWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdIb21lJyk7CgojIGFkZCBzb21lIHRlc3QgdGVtcGxhdGVzIGZvciBsYXRlciBjaGVja3MKbXkgQFRlbXBsYXRlSURzOwpmb3IgKCAxIC4uIDMwICkgewoKICAgIG15ICRSYW5kb21JRCA9ICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CgogICAgIyBhZGQgYSB0ZXN0IHRlbXBsYXRlIGZvciBsYXRlciBjaGVja3MKICAgIG15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICAgICAgT2JqZWN0ICA9PiAnVW5pdFRlc3QnIC4gJFJhbmRvbUlELAogICAgICAgIEZvcm1hdCAgPT4gJ0NTVicsCiAgICAgICAgTmFtZSAgICA9PiAnVW5pdFRlc3QnIC4gJFJhbmRvbUlELAogICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgIHB1c2ggQFRlbXBsYXRlSURzLCAkVGVtcGxhdGVJRDsKfQoKbXkgJFRlc3RDb3VudCA9IDE7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0TGlzdCB0ZXN0IDEgKGNoZWNrIENTViBpdGVtKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgbGlzdApteSAkRm9ybWF0TGlzdDEgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRMaXN0KCk7CgojIGNoZWNrIGZvcm1hdCBsaXN0CiRTZWxmLT5UcnVlKAogICAgJEZvcm1hdExpc3QxICYmIHJlZiAkRm9ybWF0TGlzdDEgZXEgJ0hBU0gnICYmICRGb3JtYXRMaXN0MS0+e0NTVn0sCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRMaXN0KCkgLSBDU1YgZXhpc3RzIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBGb3JtYXRBdHRyaWJ1dGVzR2V0IHRlc3QgMSAoY2hlY2sgYXR0cmlidXRlIGhhc2gpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgZ2V0IGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZm9ybWF0IGF0dHJpYnV0ZSByZWZlcmVuY2UKJFNlbGYtPlRydWUoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRGb3JtYXRBdHRyaWJ1dGVzR2V0MSBlcSAnQVJSQVknLAogICAgIlRlc3QgJFRlc3RDb3VudDogRm9ybWF0QXR0cmlidXRlc0dldCgpIC0gY2hlY2sgYXJyYXkgcmVmZXJlbmNlIiwKKTsKCiMgZGVmaW5lIHRoZSByZWZlcmVuY2UgaGFzaApteSAkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtblNlcGFyYXRvcicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbiBTZXBhcmF0b3InLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUYWJ1bGF0b3IgPT4gJ1RhYnVsYXRvciAoVEFCKScsCiAgICAgICAgICAgICAgICBTZW1pY29sb24gPT4gJ1NlbWljb2xvbiAoOyknLAogICAgICAgICAgICAgICAgQ29sb24gICAgID0+ICdDb2xvbiAoOiknLAogICAgICAgICAgICAgICAgRG90ICAgICAgID0+ICdEb3QgKC4pJywKICAgICAgICAgICAgICAgIENvbW1hICAgICA9PiAnQ29tbWEgKCwpJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUmVxdWlyZWQgICAgID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICB9LAogICAgfSwKICAgIHsKICAgICAgICBLZXkgICA9PiAnQ2hhcnNldCcsCiAgICAgICAgTmFtZSAgPT4gJ0NoYXJzZXQnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICdUZXh0JywKICAgICAgICAgICAgVmFsdWVEZWZhdWx0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDIwLAogICAgICAgICAgICBNYXhMZW5ndGggICAgPT4gMjAsCiAgICAgICAgICAgIFJlYWRvbmx5ICAgICA9PiAxLAogICAgICAgIH0sCiAgICB9LAogICAgewogICAgICAgIEtleSAgID0+ICdJbmNsdWRlQ29sdW1uSGVhZGVycycsCiAgICAgICAgTmFtZSAgPT4gJ0luY2x1ZGUgQ29sdW1uIEhlYWRlcnMnLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAwID0+ICdObycsCiAgICAgICAgICAgICAgICAxID0+ICdZZXMnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgfSwKICAgIH0sCl07CgokU2VsZi0+SXNEZWVwbHkoCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDEsCiAgICAkRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UsCiAgICAiVGVzdCAkVGVzdENvdW50OiBGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBhdHRyaWJ1dGVzIG9mIHRoZSByb3cgYXJlIGlkZW50aWNhbCIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBmb3JtYXQgYXR0cmlidXRlcwpteSAkRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXRBdHRyaWJ1dGVzR2V0KAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRHNbLTFdICsgMSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgZmFsc2UgcmV0dXJuCiRTZWxmLT5GYWxzZSgKICAgICRGb3JtYXRBdHRyaWJ1dGVzR2V0MiwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQgdGVzdCAxIChjaGVjayBhdHRyaWJ1dGUgaGFzaCkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKIyBnZXQgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlcwpteSAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1swXSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiMgY2hlY2sgbWFwcGluZyBmb3JtYXQgYXR0cmlidXRlIHJlZmVyZW5jZQokU2VsZi0+VHJ1ZSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgJiYgcmVmICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEgZXEgJ0FSUkFZJywKICAgICJUZXN0ICRUZXN0Q291bnQ6IE1hcHBpbmdGb3JtYXRBdHRyaWJ1dGVzR2V0KCkgLSBjaGVjayBhcnJheSByZWZlcmVuY2UiLAopOwoKIyBkZWZpbmUgdGhlIHJlZmVyZW5jZSBoYXNoCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDFSZWZlcmVuY2UgPSBbCiAgICB7CiAgICAgICAgS2V5ICAgPT4gJ0NvbHVtbicsCiAgICAgICAgTmFtZSAgPT4gJ0NvbHVtbicsCiAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICBUeXBlICAgICA9PiAnVFQnLAogICAgICAgICAgICBEYXRhICAgICA9PiAnJywKICAgICAgICAgICAgUmVxdWlyZWQgPT4gMCwKICAgICAgICB9LAogICAgfSwKXTsKCiRTZWxmLT5Jc0RlZXBseSgKICAgICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDEsCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQxUmVmZXJlbmNlLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGF0dHJpYnV0ZXMgb2YgdGhlIHJvdyBhcmUgaWRlbnRpY2FsIiwKKTsKCiRUZXN0Q291bnQrKzsKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCB0ZXN0IDIgKGNoZWNrIHdpdGggbm9uIGV4aXN0aW5nIHRlbXBsYXRlKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGdldCBtYXBwaW5nIGZvcm1hdCBhdHRyaWJ1dGVzCm15ICRNYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldDIgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nRm9ybWF0QXR0cmlidXRlc0dldCgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWy0xXSArIDEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGNoZWNrIGZhbHNlIHJldHVybgokU2VsZi0+RmFsc2UoCiAgICAkTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQyLAogICAgIlRlc3QgJFRlc3RDb3VudDogTWFwcGluZ0Zvcm1hdEF0dHJpYnV0ZXNHZXQoKSAtIGNoZWNrIGZhbHNlIHJldHVybiIsCik7CgokVGVzdENvdW50Kys7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgZGVmaW5lIGdlbmVyYWwgSW1wb3J0RGF0YUdldCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSW1wb3J0RGF0YVRlc3RzID0gWwoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgSW1wb3J0RGF0YUdldCBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gc291cmNlIGNvbnRlbnQgYXJlIGdpdmVuIChlbXB0eSBhcnJheSByZWZlcmVuY2UgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgbXVzdCBiZSBhIHNjYWxhciByZWZlcmVuY2UgKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gW10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBzb3VyY2UgY29udGVudCBtdXN0IGJlIGEgc2NhbGFyIHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzFdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiB7fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHNvdXJjZSBjb250ZW50IG11c3QgYmUgYSBzY2FsYXIgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gZXhpc3RpbmcgdGVtcGxhdGUgaWQgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY29sdW1uIFNlcGFyYXRvciBhbmQgY2hhcnNldCBhcmUgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gXGRvIHsnRHVtbXknfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjaGFyc2V0IGlzIGdpdmVuIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEdW1teScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7J0R1bW15J30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBpbnZhbGlkIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0R1bW15JywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzJdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geydEdW1teSd9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiBidXQgc291cmNlIGNvbnRlbnQgaXMgZW1wdHkgKGVtcHR5IGFycmF5IHJlZmVyZW5jZSBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzNdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiBcZG8geycnfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gW10sCiAgICB9LAoKICAgICMgc291cmNlIGNvbnRlbnQgaXMgb25seSBhIHN0cmluZyB3aXRoIHNwYWNlcyAob25lIGNlbGwgYXJyYXkgd2l0aCB0aGUgc3BhY2VzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+IFxkbyB7JyAgJ30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWycgICddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBUYWJ1bGF0b3IgaXMgdXNlZCBhcyBTZXBhcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbJ1JvdzEtQ29sMTtSb3cxLUNvbDI7Um93MS1Db2wzJ10sCiAgICAgICAgICAgIFsnUm93Mi1Db2wxO1JvdzItQ29sMjtSb3cyLUNvbDMnXSwKICAgICAgICAgICAgWydSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMyddLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4sIGJ1dCBTZW1pY29sb24gaXMgdXNlZCBhcyBTZXBhcmF0b3IgKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU1TRXhjZWwtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbIlJvdzEtQ29sMVx0Um93MS1Db2wyXHRSb3cxLUNvbDMiXSwKICAgICAgICAgICAgWyJSb3cyLUNvbDFcdFJvdzItQ29sMlx0Um93Mi1Db2wzIl0sCiAgICAgICAgICAgIFsiUm93My1Db2wxXHRSb3czLUNvbDJcdFJvdzMtQ29sMyJdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAxLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICdSb3cyLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzMtQ29sMScsICdSb3czLUNvbDInLCAnUm93My1Db2wzJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDEtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzVdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgIFsgJ1JvdzItQ29sMScsICdSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgJ1JvdzMtQ29sMycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU1TRXhjZWwtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMi1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzZdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAiXG5UZXN0IDEgLSAxIiwgJ1Rlc3QgMSAtIDInLCAgICJUZXN0IDFcbi0gMyIsICAnVGVzdCBcblx0XHJccycgXSwKICAgICAgICAgICAgWyAiVGVzdCAyIFxuLSAxIiwgIlRlXG5zdCAyIC0gMiIsICJUZXN0IDIgLSAzXG4iLCAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKG5ld2xpbmUgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDItT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1RhYnVsYXRvcicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtVGFidWxhdG9yLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbNl0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICJcblRlc3QgMSAtIDEiLCAiVGVzdCAxIC0gMiIsICAgIlRlc3QgMVxuLSAzIiwgICdUZXN0IFxuXHRcclxzJyBdLAogICAgICAgICAgICBbICJUZXN0IDIgXG4tIDEiLCAiVGVcbnN0IDIgLSAyIiwgIlRlc3QgMiAtIDNcbiIsICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDAyLU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s2XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgIlxuVGVzdCAxIC0gMSIsICJUZXN0IDEgLSAyIiwgICAiVGVzdCAxXG4tIDMiLCAgJ1Rlc3QgXG5cdFxyXHMnIF0sCiAgICAgICAgICAgIFsgIlRlc3QgMiBcbi0gMSIsICJUZVxuc3QgMiAtIDIiLCAiVGVzdCAyIC0gM1xuIiwgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDMtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s3XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJyBdLAogICAgICAgICAgICBbICcgICAgVGVzdCcsICcnLCAgICAgJ1Rlc3QnIF0sCiAgICAgICAgICAgIFsgJycsICAgICAgICAgJycsICAgICAnICcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwMy1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbN10sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcgXSwKICAgICAgICAgICAgWyAnICAgIFRlc3QnLCAnJywgICAgICdUZXN0JyBdLAogICAgICAgICAgICBbICcnLCAgICAgICAgICcnLCAgICAgJyAnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtTVNFeGNlbC1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNC1NU0V4Y2VsLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzhdLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnVGVzdDs6X8KwXiEiwqckJSYvKCk9P8K0YCorVGVzdCcsICc+PEB+XCd9e1tdXFwnIF0sCiAgICAgICAgICAgIFsgJyIiOzs6Oi4uLS1fXyMjJywgICAgICAgICAgICAgICAgICAnJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwZWNpYWwgY2hhcmFjdGVyIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICdUZXN0OzpfwrBeISLCpyQlJi8oKT0/wrRgKitUZXN0JywgJz48QH5cJ317W11cXCcgXSwKICAgICAgICAgICAgWyAnIiI7Ozo6Li4tLV9fIyMnLCAgICAgICAgICAgICAgICAgICcnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDQtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA0LU9wZW5PZmZpY2UtQ29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s4XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1Rlc3Q7Ol/CsF4hIsKnJCUmLygpPT/CtGAqK1Rlc3QnLCAnPjxAflwnfXtbXVxcJyBdLAogICAgICAgICAgICBbICciIjs7OjouLi0tX18jIycsICAgICAgICAgICAgICAgICAgJycgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1NU0V4Y2VsLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbgogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDUtTVNFeGNlbC1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s5XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8O8w7bDpMOfJywgJ8Ocw5bDhCcgXSwKICAgICAgICAgICAgWyAnw5/DpMO2w7wnLCAnw4TDlsOcJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4KICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU291cmNlRmlsZSAgICA9PiAnSW1wb3J0RXhwb3J0Rm9ybWF0Q1NWMDA1LU9wZW5PZmZpY2UtU2VtaWNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLVRhYnVsYXRvci5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzldLAogICAgICAgICAgICAgICAgU291cmNlQ29udGVudCA9PiAnU291cmNlRmlsZScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VJbXBvcnREYXRhID0+IFsKICAgICAgICAgICAgWyAnw7zDtsOkw58nLCAnw5zDlsOEJyBdLAogICAgICAgICAgICBbICfDn8Okw7bDvCcsICfDhMOWw5wnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbgogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNS1PcGVuT2ZmaWNlLUNvbG9uLmNzdicsCiAgICAgICAgICAgIEltcG9ydERhdGFHZXQgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbOV0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfDvMO2w6TDnycsICfDnMOWw4QnIF0sCiAgICAgICAgICAgIFsgJ8Ofw6TDtsO8JywgJ8OEw5bDnCcgXSwKICAgICAgICBdLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlSW1wb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNvdXJjZUZpbGUgICAgPT4gJ0ltcG9ydEV4cG9ydEZvcm1hdENTVjAwNi1PcGVuT2ZmaWNlLVNlbWljb2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1UYWJ1bGF0b3IuY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1sxMF0sCiAgICAgICAgICAgICAgICBTb3VyY2VDb250ZW50ID0+ICdTb3VyY2VGaWxlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZUltcG9ydERhdGEgPT4gWwogICAgICAgICAgICBbICfKqSDKrCDKricsICAgICAnIMqhIMukIM6MICcgXSwKICAgICAgICAgICAgWyAnICDOlyDPlyDPoCAgJywgJ86GIM6bIM6eJyBdLAogICAgICAgIF0sCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VJbXBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDYtT3Blbk9mZmljZS1Db2xvbi5jc3YnLAogICAgICAgICAgICBJbXBvcnREYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzEwXSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ8qpIMqsIMquJywgICAgICcgyqEgy6QgzowgJyBdLAogICAgICAgICAgICBbICcgIM6XIM+XIM+gICAnLCAnzoYgzpsgzp4nIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDctT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJ1JvdzItQ29sMicsICAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnMFJvdzMtQ29sMicsICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoY2hlY2sgdGhlIHBhcnNlZCBjb250ZW50KQogICAgewogICAgICAgIFNvdXJjZUltcG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBTb3VyY2VGaWxlICAgID0+ICdJbXBvcnRFeHBvcnRGb3JtYXRDU1YwMDgtT3Blbk9mZmljZS1TZW1pY29sb24uY3N2JywKICAgICAgICAgICAgSW1wb3J0RGF0YUdldCA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1s1XSwKICAgICAgICAgICAgICAgIFNvdXJjZUNvbnRlbnQgPT4gJ1NvdXJjZUZpbGUnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlSW1wb3J0RGF0YSA9PiBbCiAgICAgICAgICAgIFsgJ1JvdzEtQ29sMScsICdSb3cxLUNvbDInLCAgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgWyAnUm93Mi1Db2wxJywgJzBSb3cyLUNvbDInLCAnUm93Mi1Db2wzJyBdLAogICAgICAgICAgICBbICdSb3czLUNvbDEnLCAnUm93My1Db2wyJywgICdSb3czLUNvbDMnIF0sCiAgICAgICAgXSwKICAgIH0sCgpdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIEltcG9ydERhdGFHZXQgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskSW1wb3J0RGF0YVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZUltcG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZUltcG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgSW1wb3J0RGF0YUdldAogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9ICkgewogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fSA9IHt9OwogICAgfQoKICAgICMgc2V0IHNvdXJjZSBjb250ZW50CiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e1NvdXJjZUZpbGV9CiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57U291cmNlQ29udGVudH0KICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntTb3VyY2VDb250ZW50fSBlcSAnU291cmNlRmlsZScKICAgICAgICApCiAgICB7CgogICAgICAgIG15ICRTb3VyY2VGaWxlID0gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e1NvdXJjZUZpbGV9OwoKICAgICAgICAjIHJlYWQgc291cmNlIGZpbGUKICAgICAgICBteSAkU291cmNlQ29udGVudCA9ICRNYWluT2JqZWN0LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJFNlbGYtPntIb21lfSAuICcvc2NyaXB0cy90ZXN0L3NhbXBsZS9JbXBvcnRFeHBvcnQvJyAuICRTb3VyY2VGaWxlLAogICAgICAgICAgICBSZXN1bHQgICA9PiAnU0NBTEFSJywKICAgICAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgICAgICk7CgogICAgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntJbXBvcnREYXRhR2V0fS0+e1NvdXJjZUNvbnRlbnR9ID0gJFNvdXJjZUNvbnRlbnQ7CiAgICB9CgogICAgIyBzZXQgdGhlIGZvcm1hdCBkYXRhCiAgICBpZiAoCiAgICAgICAgJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9CiAgICAgICAgJiYgcmVmICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAmJiAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0tPntUZW1wbGF0ZUlEfQogICAgICAgICkKICAgIHsKCiAgICAgICAgIyBzYXZlIGZvcm1hdCBkYXRhCiAgICAgICAgJEltcG9ydEV4cG9ydE9iamVjdC0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0ltcG9ydERhdGFHZXR9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gJFRlc3QtPntTb3VyY2VJbXBvcnREYXRhfS0+e0Zvcm1hdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpbXBvcnQgZGF0YQogICAgbXkgJEltcG9ydERhdGEgPSAkRm9ybWF0QmFja2VuZE9iamVjdC0+SW1wb3J0RGF0YUdldCgKICAgICAgICAleyAkVGVzdC0+e1NvdXJjZUltcG9ydERhdGF9LT57SW1wb3J0RGF0YUdldH0gfSwKICAgICk7CgogICAgaWYgKCAhJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSApIHsKCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkSW1wb3J0RGF0YSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICBpZiAoIHJlZiAkSW1wb3J0RGF0YSBuZSAnQVJSQVknICkgewoKICAgICAgICAjIGNoZWNrIGFycmF5IHJlZmVyZW5jZQogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAwLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJbXBvcnREYXRhR2V0KCkgLSByZXR1cm4gdmFsdWUgaXMgYW4gYXJyYXkgcmVmZXJlbmNlIiwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgIyBjaGVjayBudW1iZXIgb2Ygcm93cwogICAgJFNlbGYtPklzKAogICAgICAgIHNjYWxhciBAeyRJbXBvcnREYXRhfSwKICAgICAgICBzY2FsYXIgQHsgJFRlc3QtPntSZWZlcmVuY2VJbXBvcnREYXRhfSB9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEltcG9ydERhdGFHZXQoKSAtIHNhbWUgbnVtYmVyIG9mIHJvd3MiLAogICAgKTsKCiAgICAjIGNoZWNrIGNvbnRlbnQgb2YgaW1wb3J0IGRhdGEKICAgIG15ICRDb3VudGVyUm93ID0gMDsKICAgIFJPVzoKICAgIGZvciBteSAkSW1wb3J0Um93ICggQHskSW1wb3J0RGF0YX0gKSB7CgogICAgICAgICMgZXh0cmFjdCByZWZlcmVuY2Ugcm93CiAgICAgICAgbXkgJFJlZmVyZW5jZVJvdyA9ICRUZXN0LT57UmVmZXJlbmNlSW1wb3J0RGF0YX0tPlskQ291bnRlclJvd107CgogICAgICAgIGlmICggcmVmICRJbXBvcnRSb3cgbmUgJ0FSUkFZJyB8fCByZWYgJFJlZmVyZW5jZVJvdyBuZSAnQVJSQVknICkgewoKICAgICAgICAgICAgIyBjaGVjayBhcnJheSByZWZlcmVuY2UKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gaW1wb3J0IHJvdyBhbmQgcmVmZXJlbmNlIHJvdyBtYXRjaGVkIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVEVTVDsKICAgICAgICB9CgogICAgICAgICMgIyBwcmludCB0aGUgZmlsZSBuYW1lCiAgICAgICAgIyAkU2VsZi0+VHJ1ZSgKICAgICAgICAjICAgICAxLAogICAgICAgICMgICAgICRUZXN0LT57U291cmNlSW1wb3J0RGF0YX0tPntTb3VyY2VGaWxlfSwKICAgICAgICAjICk7CgogICAgICAgICMgY2hlY2sgbnVtYmVyIG9mIGNvbHVtbnMKICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgIHNjYWxhciBAeyRJbXBvcnRSb3d9LAogICAgICAgICAgICBzY2FsYXIgQHskUmVmZXJlbmNlUm93fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpIC0gc2FtZSBudW1iZXIgb2YgY29sdW1ucyIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgIGZvciBteSAkQ2VsbCAoIEB7JEltcG9ydFJvd30gKSB7CgogICAgICAgICAgICAjIHNldCBjb250ZW50IGlmIHZhbHVlcyBhcmUgdW5kZWYKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ2VsbCApIHsKICAgICAgICAgICAgICAgICRDZWxsID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRSZWZlcmVuY2VSb3ctPlskQ291bnRlckNvbHVtbl0gKSB7CiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dID0gJ1VOREVGLXVuaXR0ZXN0JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBjZWxsIGRhdGEKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJENlbGwsCiAgICAgICAgICAgICAgICAkUmVmZXJlbmNlUm93LT5bJENvdW50ZXJDb2x1bW5dLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSW1wb3J0RGF0YUdldCgpICIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ291bnRlckNvbHVtbisrOwogICAgICAgIH0KCiAgICAgICAgJENvdW50ZXJSb3crKzsKICAgIH0KfQpjb250aW51ZSB7CiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCBFeHBvcnREYXRhU2F2ZSB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkRXhwb3J0RGF0YVRlc3RzID0gWwoKICAgICMgRXhwb3J0RGF0YVNhdmUgZG9lc24ndCBjb250YWlucyBhbGwgZGF0YSAoY2hlY2sgcmVxdWlyZWQgYXR0cmlidXRlcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBFeHBvcnREYXRhU2F2ZSBkb2Vzbid0IGNvbnRhaW5zIGFsbCBkYXRhIChjaGVjayByZXF1aXJlZCBhdHRyaWJ1dGVzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIHJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgcm93IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIChjaGVjayByZXR1cm4gZmFsc2UpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIwXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4ge30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBleGlzdGluZyB0ZW1wbGF0ZSBpZCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1stMV0gKyAxLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJ0R1bW15J10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyBubyBjb2x1bW4gU2VwYXJhdG9yIGFuZCBjaGFyc2V0IGFyZSBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIG5vIGNvbHVtbiBTZXBhcmF0b3IgaXMgZ2l2ZW4gKGNoZWNrIHJldHVybiBmYWxzZSkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDaGFyc2V0ID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgbm8gY2hhcnNldCBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnRHVtbXknXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIGludmFsaWQgY29sdW1uIFNlcGFyYXRvciBpcyBnaXZlbiAoY2hlY2sgcmV0dXJuIGZhbHNlKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnRHVtbXknLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIxXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWydEdW1teSddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIG9uZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKG9uZSBlbXB0eSBjZWxsIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWycnXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSBvbmUgY2VsbHMgd2l0aCBlbXB0eSBzdHJpbmdzIChvbmUgZW1wdHkgY2VsbCBtdXN0IGJlIHJldHVybmVkKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsnJ10sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgb25lIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAob25lIGVtcHR5IGNlbGwgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbJyddLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciIicsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgc3RyaW5ncyAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI7IiI7IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlwiXCJcdFwiXCJcdFwiXCIiLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcnLCAnJywgJycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiI6IiI6IiInLAogICAgfSwKCiAgICAjIGV4cG9ydCBkYXRhIGFyZSB0aHJlZSBjZWxscyB3aXRoIGVtcHR5IHN0cmluZ3MgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnJywgJycsICcnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIiLiIiLiIiJywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnOyIiOycsCiAgICB9LAoKICAgICMgZXhwb3J0IGRhdGEgYXJlIHRocmVlIGNlbGxzIHdpdGggZW1wdHkgYW5kIHVuZGVmIGNvbnRlbnQgKHRocmVlIGVtcHR5IGNlbGxzIG11c3QgYmUgcmV0dXJuZWQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIyXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyB1bmRlZiwgJycsIHVuZGVmIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlx0XCJcIlx0IiwKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0NvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syMl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgdW5kZWYsICcnLCB1bmRlZiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICc6IiI6JywKICAgIH0sCgogICAgIyBleHBvcnQgZGF0YSBhcmUgdGhyZWUgY2VsbHMgd2l0aCBlbXB0eSBhbmQgdW5kZWYgY29udGVudCAodGhyZWUgZW1wdHkgY2VsbHMgbXVzdCBiZSByZXR1cm5lZCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjJdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbIHVuZGVmLCAnJywgdW5kZWYgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnLiIiLicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKGNoZWNrIHRoZSBwYXJzZWQgY29udGVudCkKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ1NlbWljb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb21tYScsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSIsIlJvdzEtQ29sMiIsIlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gIlwiUm93MS1Db2wxXCJcdFwiUm93MS1Db2wyXCJcdFwiUm93MS1Db2wzXCIiLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjNdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICdSb3cxLUNvbDEnLCAnUm93MS1Db2wyJywgJ1JvdzEtQ29sMycgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChjaGVjayB0aGUgcGFyc2VkIGNvbnRlbnQpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzIzXSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnUm93MS1Db2wxJywgJ1JvdzEtQ29sMicsICdSb3cxLUNvbDMnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyJSb3cxLUNvbDEiLiJSb3cxLUNvbDIiLiJSb3cxLUNvbDMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdTZW1pY29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiBxcXsiXG5UZXN0IDEiOyJUZXN0IFxuIDIiOyJUZXN0IDMgXFxuXFx0XFxyXFxzIjsiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI0XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAiXG5UZXN0IDEiLCAiVGVzdCBcbiAyIiwgJ1Rlc3QgMyBcblx0XHJccycsICJUZXN0IDRcbiIgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PgogICAgICAgICAgICBxcXsiXG5UZXN0IDEiXHQiVGVzdCBcbiAyIlx0IlRlc3QgMyBcXG5cXHRcXHJcXHMiXHQiVGVzdCA0XG4ifSwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAobmV3bGluZSBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSI6IlRlc3QgXG4gMiI6IlRlc3QgMyBcXG5cXHRcXHJcXHMiOiJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChuZXdsaW5lIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICJcblRlc3QgMSIsICJUZXN0IFxuIDIiLCAnVGVzdCAzIFxuXHRcclxzJywgIlRlc3QgNFxuIiBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+IHFxeyJcblRlc3QgMSIuIlRlc3QgXG4gMiIuIlRlc3QgMyBcXG5cXHRcXHJcXHMiLiJUZXN0IDRcbiJ9LAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciICBUZXN0ICAiOyIgICAgIjsiVGVzdCAgIjsiICAgIFRlc3QiOyIiOyJUZXN0IjsiIjsiICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGFjZXMgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnVGFidWxhdG9yJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNF0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyAgVGVzdCAgJywgJyAgICAnLCAnVGVzdCAgJywgJyAgICBUZXN0JywgJycsICdUZXN0JywgJycsICcgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICJcIiAgVGVzdCAgXCJcdFwiICAgIFwiXHRcIlRlc3QgIFwiXHRcIiAgICBUZXN0XCJcdFwiXCJcdFwiVGVzdFwiXHRcIlwiXHRcIiBcIiIsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKHNwYWNlcyBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdDb2xvbicsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICI6IiAgICBUZXN0IjoiIjoiVGVzdCI6IiI6IiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BhY2VzIGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjRdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcgIFRlc3QgICcsICcgICAgJywgJ1Rlc3QgICcsICcgICAgVGVzdCcsICcnLCAnVGVzdCcsICcnLCAnICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiAgVGVzdCAgIi4iICAgICIuIlRlc3QgICIuIiAgICBUZXN0Ii4iIi4iVGVzdCIuIiIuIiAiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNV0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsKICAgICAgICAgICAgICAgICAgICAnVGVzdDs6X14hIiQlJi8oKT0/YCorVGVzdCcsCiAgICAgICAgICAgICAgICAgICAgJz48QH5cJ317W11cXCcsCiAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgJyIiOzs6Oi4uLS1fXyMjJwogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+CiAgICAgICAgICAgICciVGVzdDs6X14hIiIkJSYvKCk9P2AqK1Rlc3QiOyI+PEB+XCd9e1tdXCI7IiI7IiIiIiI7Ozo6Li4tLV9fIyMiJwogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCInCiAgICAgICAgICAgIC4gIlx0IgogICAgICAgICAgICAuICciPjxAflwnfXtbXVxcIicKICAgICAgICAgICAgLiAiXHQiCiAgICAgICAgICAgIC4gJyIiJwogICAgICAgICAgICAuICJcdCIKICAgICAgICAgICAgLiAnIiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCI6Ij48QH5cJ317W11cIjoiIjoiIiIiIjs7OjouLi0tX18jIyInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdEb3QnLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI1XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWwogICAgICAgICAgICAgICAgICAgICdUZXN0OzpfXiEiJCUmLygpPT9gKitUZXN0JywKICAgICAgICAgICAgICAgICAgICAnPjxAflwnfXtbXVxcJywKICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAnIiI7Ozo6Li4tLV9fIyMnCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4KICAgICAgICAgICAgJyJUZXN0OzpfXiEiIiQlJi8oKT0/YCorVGVzdCIuIj48QH5cJ317W11cXCIuIiIuIiIiIiI7Ozo6Li4tLV9fIyMiJywKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgIENoYXJzZXQgICAgICAgICA9PiAnVVRGLTgnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBFeHBvcnREYXRhU2F2ZSA9PiB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEICAgID0+ICRUZW1wbGF0ZUlEc1syNl0sCiAgICAgICAgICAgICAgICBFeHBvcnREYXRhUm93ID0+IFsgJyDRqiDRrCDRsicsICfRryDRtCDRvycsICfSgiDSiiDSliAnIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBSZWZlcmVuY2VEZXN0aW5hdGlvbkNvbnRlbnQgPT4gJyIg0aog0awg0bIiOyLRryDRtCDRvyI7ItKCINKKINKWICInLAogICAgfSwKCiAgICAjIGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIGdpdmVuIChVVEYtOCBjaGVja3MpCiAgICB7CiAgICAgICAgU291cmNlRXhwb3J0RGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgQ29sdW1uU2VwYXJhdG9yID0+ICdUYWJ1bGF0b3InLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAiXCIg0aog0awg0bJcIlx0XCLRryDRtCDRv1wiXHRcItKCINKKINKWIFwiIiwKICAgIH0sCgogICAgIyBhbGwgcmVxdWlyZWQgdmFsdWVzIGFyZSBnaXZlbiAoVVRGLTggY2hlY2tzKQogICAgewogICAgICAgIFNvdXJjZUV4cG9ydERhdGEgPT4gewogICAgICAgICAgICBGb3JtYXREYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnQ29sb24nLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgID0+ICdVVEYtOCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEV4cG9ydERhdGFTYXZlID0+IHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlSUQgICAgPT4gJFRlbXBsYXRlSURzWzI2XSwKICAgICAgICAgICAgICAgIEV4cG9ydERhdGFSb3cgPT4gWyAnINGqINGsINGyJywgJ9GvING0ING/JywgJ9KCINKKINKWICcgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIFJlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudCA9PiAnIiDRqiDRrCDRsiI6ItGvING0ING/Ijoi0oIg0oog0pYgIicsCiAgICB9LAoKICAgICMgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgZ2l2ZW4gKFVURi04IGNoZWNrcykKICAgIHsKICAgICAgICBTb3VyY2VFeHBvcnREYXRhID0+IHsKICAgICAgICAgICAgRm9ybWF0RGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDb2x1bW5TZXBhcmF0b3IgPT4gJ0RvdCcsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRXhwb3J0RGF0YVNhdmUgPT4gewogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICA9PiAkVGVtcGxhdGVJRHNbMjZdLAogICAgICAgICAgICAgICAgRXhwb3J0RGF0YVJvdyA9PiBbICcg0aog0awg0bInLCAn0a8g0bQg0b8nLCAn0oIg0oog0pYgJyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgUmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50ID0+ICciINGqINGsINGyIi4i0a8g0bQg0b8iLiLSgiDSiiDSliAiJywKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgRXhwb3J0RGF0YVNhdmUgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKVEVTVDoKZm9yIG15ICRUZXN0ICggQHskRXhwb3J0RGF0YVRlc3RzfSApIHsKCiAgICAjIGNoZWNrIFNvdXJjZUV4cG9ydERhdGEgYXR0cmlidXRlCiAgICBpZiAoICEkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IHx8IHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9IG5lICdIQVNIJyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5vIFNvdXJjZUV4cG9ydERhdGEgZm91bmQgZm9yIHRoaXMgdGVzdC4iCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgRXhwb3J0RGF0YVNhdmUKICAgIGlmICggISRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntFeHBvcnREYXRhU2F2ZX0gKSB7CiAgICAgICAgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSA9IHt9OwogICAgfQoKICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgaWYgKAogICAgICAgICRUZXN0LT57U291cmNlRXhwb3J0RGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICYmIHJlZiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57Rm9ybWF0RGF0YX0gZXEgJ0hBU0gnCiAgICAgICAgJiYgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e1RlbXBsYXRlSUR9CiAgICAgICAgKQogICAgewoKICAgICAgICAjIHNhdmUgZm9ybWF0IGRhdGEKICAgICAgICAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhU2F2ZSgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVzdC0+e1NvdXJjZUV4cG9ydERhdGF9LT57RXhwb3J0RGF0YVNhdmV9LT57VGVtcGxhdGVJRH0sCiAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0Zvcm1hdERhdGF9LAogICAgICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBleHBvcnQgZGF0YSByb3cKICAgIG15ICRFeHBvcnRTdHJpbmcgPSAkRm9ybWF0QmFja2VuZE9iamVjdC0+RXhwb3J0RGF0YVNhdmUoCiAgICAgICAgJXsgJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfSB9LAogICAgKTsKCiAgICBpZiAoICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRFeHBvcnRTdHJpbmcsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEV4cG9ydERhdGFTYXZlKCkgLSByZXR1cm4gZmFsc2UiCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBURVNUOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJEV4cG9ydFN0cmluZyApIHsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICFkZWZpbmVkICRUZXN0LT57UmVmZXJlbmNlRGVzdGluYXRpb25Db250ZW50fSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSAtIHJldHVybiBmYWxzZSIKICAgICAgICApOwoKICAgICAgICBuZXh0IFRFU1Q7CiAgICB9CgogICAgaWYgKCAhJFRlc3QtPntTb3VyY2VFeHBvcnREYXRhfS0+e0V4cG9ydERhdGFTYXZlfS0+e0V4cG9ydERhdGFSb3d9ICkgewoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgZGVmaW5lZCAkRXhwb3J0U3RyaW5nLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBFeHBvcnREYXRhU2F2ZSgpIC0gcmV0dXJuIGZhbHNlIgogICAgICAgICk7CgogICAgICAgIG5leHQgVEVTVDsKICAgIH0KCiAgICAjIGNoZWNrIHRoZSBleHBvcnQgc3RyaW5nCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEV4cG9ydFN0cmluZywKICAgICAgICAkVGVzdC0+e1JlZmVyZW5jZURlc3RpbmF0aW9uQ29udGVudH0sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogRXhwb3J0RGF0YVNhdmUoKSIsCiAgICApOwp9CmNvbnRpbnVlIHsKICAgICRUZXN0Q291bnQrKzsKfQoKIyBjbGVhbnVwIGlzIGRvbmUgYnkgUmVzdG9yZURhdGFiYXNlLgoKMTsK
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwp1c2UgRmlsZTo6UGF0aCBxdyhybXRyZWUpOwoKIyBnZXQgbmVlZGVkIG9iamVjdHMKbXkgJENvbW1hbmRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6SW1wb3J0RXhwb3J0OjpJbXBvcnQnKTsKbXkgJEltcG9ydEV4cG9ydE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJbXBvcnRFeHBvcnQnKTsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCiMgdGVzdCBjb21tYW5kIHdpdGhvdXQgLS10ZW1wbGF0ZS1udW1iZXIgb3B0aW9uCm15ICRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIk5vIC0tdGVtcGxhdGUtbnVtYmVyICAtIGV4aXQgY29kZSIsCik7CgojIGFkZCB0ZXN0IHRlbXBsYXRlCm15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgTmFtZSAgICA9PiAnVGVtcGxhdGUnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVJRCwKICAgICJJbXBvcnQvRXhwb3J0IHRlbXBsYXRlIGlzIGNyZWF0ZWQgLSAkVGVtcGxhdGVJRCIsCik7CgojIGdldCAnSGFyZHdhcmUnIGNhdGFsb2cgY2xhc3MgSUQKbXkgJENvbmZpZ0l0ZW1EYXRhUmVmID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1HZXQoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgTmFtZSAgPT4gJ0hhcmR3YXJlJywKKTsKbXkgJEhhcmR3YXJlQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiMgZ2V0IG9iamVjdCBkYXRhIGZvciB0ZXN0IHRlbXBsYXRlCm15ICVUZW1wbGF0ZVJlZiA9ICgKICAgICdDbGFzc0lEJyAgPT4gJEhhcmR3YXJlQ29uZmlnSXRlbUlELAogICAgJ0NvdW50TWF4JyA9PiAxMCwKKTsKbXkgJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5PYmplY3REYXRhU2F2ZSgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBPYmplY3REYXRhID0+IFwlVGVtcGxhdGVSZWYsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRTdWNjZXNzLAogICAgIk9iamVjdERhdGEgZm9yIHRlc3QgdGVtcGxhdGUgaXMgYWRkZWQiLAopOwoKIyBhZGQgdGhlIGZvcm1hdCBkYXRhIG9mIHRoZSB0ZXN0IHRlbXBsYXRlCm15ICVGb3JtYXREYXRhID0gKAogICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJ1VURi04JywKICAgIENvbHVtblNlcGFyYXRvciAgICAgID0+ICdDb21tYScsCiAgICBJbmNsdWRlQ29sdW1uSGVhZGVycyA9PiAxLAopOwokU3VjY2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkZvcm1hdERhdGFTYXZlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIEZvcm1hdERhdGEgPT4gXCVGb3JtYXREYXRhLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJGb3JtYXREYXRhIGZvciB0ZXN0IHRlbXBsYXRlIGlzIGFkZGVkIiwKKTsKCiMgc2F2ZSB0aGUgc2VhcmNoIGRhdGEgb2YgYSB0ZW1wbGF0ZQpteSAlU2VhcmNoRGF0YSA9ICgKICAgIE5hbWUgPT4gJ1Rlc3RDb25maWdJdGVtKicsCik7CiRTdWNjZXNzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+U2VhcmNoRGF0YVNhdmUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgU2VhcmNoRGF0YSA9PiBcJVNlYXJjaERhdGEsCiAgICBVc2VySUQgICAgID0+IDEsCik7CgojIGFkZCBtYXBwaW5nIGRhdGEgZm9yIHRlc3QgdGVtcGxhdGUKZm9yIG15ICRPYmplY3REYXRhVmFsdWUgKHF3KCBOYW1lIERlcGxTdGF0ZSBJbmNpU3RhdGUgKSkgewoKICAgIG15ICRNYXBwaW5nSUQgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nQWRkKAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgKTsKCiAgICBteSAlTWFwcGluZ09iamVjdERhdGEgPSAoIEtleSA9PiAkT2JqZWN0RGF0YVZhbHVlICk7CiAgICBteSAkU3VjY2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPk1hcHBpbmdPYmplY3REYXRhU2F2ZSgKICAgICAgICBNYXBwaW5nSUQgICAgICAgICA9PiAkTWFwcGluZ0lELAogICAgICAgIE1hcHBpbmdPYmplY3REYXRhID0+IFwlTWFwcGluZ09iamVjdERhdGEsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgIk9iamVjdERhdGEgZm9yIHRlc3QgdGVtcGxhdGUgaXMgbWFwcGVkIC0gJE9iamVjdERhdGFWYWx1ZSIsCiAgICApOwp9CgojIG1ha2UgZGlyZWN0b3J5IGZvciBleHBvcnQgZmlsZQpteSAkU291cmNlUGF0aAogICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0hvbWUnKSAuICIvc2NyaXB0cy90ZXN0L3NhbXBsZS9JbXBvcnRFeHBvcnQvVGVtcGxhdGVFeHBvcnQuY3N2IjsKCiMgdGVzdCBjb21tYW5kIHdpdGggd3JvbmcgdGVtcGxhdGUgbnVtYmVyCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS10ZW1wbGF0ZS1udW1iZXInLCAkSGVscGVyLT5HZXRSYW5kb21JRCgpLCAkU291cmNlUGF0aCAuICdUZW1wbGF0ZUV4cG9ydC5jc3YnICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIkNvbW1hbmQgd2l0aCB3cm9uZyB0ZW1wbGF0ZSBudW1iZXIgLSBleGl0IGNvZGUiLAopOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aG91dCBTb3VyY2UgYXJndW1lbnQKJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoICctLXRlbXBsYXRlLW51bWJlcicsICRUZW1wbGF0ZUlEICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIk5vIFNvdXJjZSBhcmd1bWVudCAtIGV4aXQgY29kZSIsCik7CgojIHRlc3QgY29tbWFuZCB3aXRoIC0tdGVtcGxhdGUtbnVtYmVyIG9wdGlvbiBhbmQgU291cmNlIGFyZ3VtZW50CiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS10ZW1wbGF0ZS1udW1iZXInLCAkVGVtcGxhdGVJRCwgJFNvdXJjZVBhdGggKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDAsCiAgICAiT3B0aW9uIC0gLS10ZW1wbGF0ZS1udW1iZXIgb3B0aW9uIGFuZCBTb3VyY2UgYXJndW1lbnQiLAopOwoKIyBnZXQgY29uZmlnIGl0ZW0gSURzCm15ICRDb25maWdJdGVtSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyktPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgIE5hbWUgPT4gJ1Rlc3RDb25maWdJdGVtKicKKTsKbXkgJE51bUNvbmZpZ0l0ZW1JbXBvcnRlZCA9IHNjYWxhciBAeyRDb25maWdJdGVtSURzfTsKCiMgY2hlY2sgaWYgdGhlIGNvbmZpZyBpdGVtcyBhcmUgaW1wb3J0ZWQKJFNlbGYtPlRydWUoCiAgICAkTnVtQ29uZmlnSXRlbUltcG9ydGVkLAogICAgIlRoZXJlIGFyZSAkTnVtQ29uZmlnSXRlbUltcG9ydGVkIGltcG9ydGVkIGNvbmZpZyBpdGVtcyIsCik7CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UuCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMjIG5vIGNyaXRpYyAoTW9kdWxlczo6UmVxdWlyZUV4cGxpY2l0UGFja2FnZSkKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnVzZSB2YXJzIChxdygkU2VsZikpOwp1c2UgRmlsZTo6UGF0aCBxdyhta3BhdGggcm10cmVlKTsKCiMgZ2V0IG5lZWRlZCBvYmplY3RzCm15ICRDb21tYW5kT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpBZG1pbjo6SVRTTTo6SW1wb3J0RXhwb3J0OjpFeHBvcnQnKTsKbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7Cm15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKIyBnZXQgaGVscGVyIG9iamVjdAokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aG91dCAtLXRlbXBsYXRlLW51bWJlciBvcHRpb24KbXkgJEV4aXRDb2RlID0gJENvbW1hbmRPYmplY3QtPkV4ZWN1dGUoKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiTm8gLS10ZW1wbGF0ZS1udW1iZXIgIC0gZXhpdCBjb2RlIiwKKTsKCiMgZ2V0ICdIYXJkd2FyZScgY2F0YWxvZyBjbGFzcyBJRApteSAkQ29uZmlnSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgTmFtZSAgPT4gJ0hhcmR3YXJlJywKKTsKbXkgJEhhcmR3YXJlQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1EYXRhUmVmLT57SXRlbUlEfTsKCiMgZ2V0ICdQcm9kdWN0aW9uJyBkZXBsb3ltZW50IHN0YXRlIElEcwpteSAkUHJvZHVjdGlvbkRlcGxTdGF0ZURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgIE5hbWUgID0+ICdQcm9kdWN0aW9uJywKKTsKbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCA9ICRQcm9kdWN0aW9uRGVwbFN0YXRlRGF0YVJlZi0+e0l0ZW1JRH07CgpteSBAQ29uZmlnSXRlbUlEczsKCiMgYWRkIHRlc3QgY29uZmlnIGl0ZW1zCmZvciAoIDEgLi4gMTAgKSB7CgogICAgIyBjcmVhdGUgQ29uZmlnSXRlbSBudW1iZXIKICAgIG15ICRDb25maWdJdGVtTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1OdW1iZXJDcmVhdGUoCiAgICAgICAgVHlwZSAgICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU01Db25maWdJdGVtOjpOdW1iZXJHZW5lcmF0b3InKSwKICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBhZGQgdGVzdCBDb25maWdJdGVtCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgTnVtYmVyICA9PiAkQ29uZmlnSXRlbU51bWJlciwKICAgICAgICBDbGFzc0lEID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDb25maWdJdGVtSUQsCiAgICAgICAgIkNvbmZpZyBpdGVtIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbUlEIiwKICAgICk7CgogICAgbXkgJENvbmZpZ0l0ZW1OYW1lID0gJ1Rlc3RDb25maWdJdGVtJyAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICBteSAkVmVyc2lvbklEICAgICAgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkFkZCgKICAgICAgICBOYW1lICAgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgICAgIERlcGxTdGF0ZUlEICA9PiAkUHJvZHVjdGlvbkRlcGxTdGF0ZUlELAogICAgICAgIEluY2lTdGF0ZUlEICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkVmVyc2lvbklELAogICAgICAgICJWZXJzaW9uIGZvciBjb25maWcgaXRlbSAkQ29uZmlnSXRlbUlEIGlzIGNyZWF0ZWQgLSAkQ29uZmlnSXRlbU5hbWUiLAogICAgKTsKCiAgICBwdXNoIEBDb25maWdJdGVtSURzLCAkQ29uZmlnSXRlbUlEOwp9CgojIGdldCBJbXBvcnRFeHBvcnQgb2JqZWN0Cm15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7CgojIGFkZCB0ZXN0IHRlbXBsYXRlCm15ICRUZW1wbGF0ZUlEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+VGVtcGxhdGVBZGQoCiAgICBPYmplY3QgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICBGb3JtYXQgID0+ICdDU1YnLAogICAgTmFtZSAgICA9PiAnVGVtcGxhdGUnIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKSwKICAgIFZhbGlkSUQgPT4gMSwKICAgIENvbW1lbnQgPT4gJ0NvbW1lbnQnLAogICAgVXNlcklEICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkVGVtcGxhdGVJRCwKICAgICJJbXBvcnQvRXhwb3J0IHRlbXBsYXRlIGlzIGNyZWF0ZWQgLSAkVGVtcGxhdGVJRCIsCik7CgojIGdldCBvYmplY3QgZGF0YSBmb3IgdGVzdCB0ZW1wbGF0ZQpteSAlVGVtcGxhdGVSZWYgPSAoCiAgICAnQ2xhc3NJRCcgID0+ICRIYXJkd2FyZUNvbmZpZ0l0ZW1JRCwKICAgICdDb3VudE1heCcgPT4gMTAsCik7Cm15ICRTdWNjZXNzID0gJEltcG9ydEV4cG9ydE9iamVjdC0+T2JqZWN0RGF0YVNhdmUoCiAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgT2JqZWN0RGF0YSA9PiBcJVRlbXBsYXRlUmVmLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJPYmplY3REYXRhIGZvciB0ZXN0IHRlbXBsYXRlIGlzIGFkZGVkIiwKKTsKCiMgYWRkIHRoZSBmb3JtYXQgZGF0YSBvZiB0aGUgdGVzdCB0ZW1wbGF0ZQpteSAlRm9ybWF0RGF0YSA9ICgKICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICdVVEYtOCcsCiAgICBDb2x1bW5TZXBhcmF0b3IgICAgICA9PiAnQ29tbWEnLAogICAgSW5jbHVkZUNvbHVtbkhlYWRlcnMgPT4gMSwKKTsKJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5Gb3JtYXREYXRhU2F2ZSgKICAgIFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICBGb3JtYXREYXRhID0+IFwlRm9ybWF0RGF0YSwKICAgIFVzZXJJRCAgICAgPT4gMSwKKTsKCiRTZWxmLT5UcnVlKAogICAgJFN1Y2Nlc3MsCiAgICAiRm9ybWF0RGF0YSBmb3IgdGVzdCB0ZW1wbGF0ZSBpcyBhZGRlZCIsCik7CgojIHNhdmUgdGhlIHNlYXJjaCBkYXRhIG9mIGEgdGVtcGxhdGUKbXkgJVNlYXJjaERhdGEgPSAoCiAgICBOYW1lID0+ICdUZXN0Q29uZmlnSXRlbSonLAopOwokU3VjY2VzcyA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPlNlYXJjaERhdGFTYXZlKAogICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgIFNlYXJjaERhdGEgPT4gXCVTZWFyY2hEYXRhLAogICAgVXNlcklEICAgICA9PiAxLAopOwoKIyBhZGQgbWFwcGluZyBkYXRhIGZvciB0ZXN0IHRlbXBsYXRlCmZvciBteSAkT2JqZWN0RGF0YVZhbHVlIChxdyggTmFtZSBEZXBsU3RhdGUgSW5jaVN0YXRlICkpIHsKCiAgICBteSAkTWFwcGluZ0lEID0gJEltcG9ydEV4cG9ydE9iamVjdC0+TWFwcGluZ0FkZCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJU1hcHBpbmdPYmplY3REYXRhID0gKCBLZXkgPT4gJE9iamVjdERhdGFWYWx1ZSApOwogICAgbXkgJFN1Y2Nlc3MgPSAkSW1wb3J0RXhwb3J0T2JqZWN0LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiBcJU1hcHBpbmdPYmplY3REYXRhLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRTdWNjZXNzLAogICAgICAgICJPYmplY3REYXRhIGZvciB0ZXN0IHRlbXBsYXRlIGlzIG1hcHBlZCAtICRPYmplY3REYXRhVmFsdWUiLAogICAgKTsKfQoKIyBtYWtlIGRpcmVjdG9yeSBmb3IgZXhwb3J0IGZpbGUKbXkgJERlc3RpbmF0aW9uUGF0aCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnSG9tZScpIC4gIi92YXIvdG1wL0ltcG9ydEV4cG9ydC8iOwpta3BhdGgoIFskRGVzdGluYXRpb25QYXRoXSwgMCwgMDc3MCApOyAgICAjIyBubyBjcml0aWMKCiMgdGVzdCBjb21tYW5kIHdpdGggd3JvbmcgdGVtcGxhdGUgbnVtYmVyCiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKAogICAgJy0tdGVtcGxhdGUtbnVtYmVyJywKICAgICRIZWxwZXItPkdldFJhbmRvbU51bWJlcigpLAogICAgJERlc3RpbmF0aW9uUGF0aCAuICdUZW1wbGF0ZUV4cG9ydC5jc3YnCik7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAxLAogICAgIkNvbW1hbmQgd2l0aCB3cm9uZyB0ZW1wbGF0ZSBudW1iZXIgLSBleGl0IGNvZGUiLAopOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aG91dCBkZXN0aW5hdGlvbiBhcmd1bWVudAokRXhpdENvZGUgPSAkQ29tbWFuZE9iamVjdC0+RXhlY3V0ZSggJy0tdGVtcGxhdGUtbnVtYmVyJywgJFRlbXBsYXRlSUQgKTsKCiRTZWxmLT5JcygKICAgICRFeGl0Q29kZSwKICAgIDEsCiAgICAiTm8gZGVzdGluYXRpb24gYXJndW1lbnQgLSBleGl0IGNvZGUiLAopOwoKIyB0ZXN0IGNvbW1hbmQgd2l0aCAtLXRlbXBsYXRlLW51bWJlciBvcHRpb24gYW5kIGRlc3RpbmF0aW9uIGFyZ3VtZW50CiRFeGl0Q29kZSA9ICRDb21tYW5kT2JqZWN0LT5FeGVjdXRlKCAnLS10ZW1wbGF0ZS1udW1iZXInLCAkVGVtcGxhdGVJRCwgJERlc3RpbmF0aW9uUGF0aCAuICdUZW1wbGF0ZUV4cG9ydC5jc3YnICk7CgokU2VsZi0+SXMoCiAgICAkRXhpdENvZGUsCiAgICAwLAogICAgIk9wdGlvbiAtIC0tdGVtcGxhdGUtbnVtYmVyIG9wdGlvbiBhbmQgZGVzdGluYXRpb24gYXJndW1lbnQiLAopOwoKIyByZW1vdmUgdGVzdCBkZXN0aW5hdGlvbiBwYXRoCiRTdWNjZXNzID0gcm10cmVlKCBbJERlc3RpbmF0aW9uUGF0aF0gKTsKJFNlbGYtPlRydWUoCiAgICAkU3VjY2VzcywKICAgICJUZXN0IGRpcmVjdG9yeSBkZWxldGVkIC0gJERlc3RpbmF0aW9uUGF0aCIsCik7CgojIGNsZWFudXAgaXMgZG9uZSBieSBSZXN0b3JlRGF0YWJhc2UuCgoxOwo=
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7Cgp1c2UgdmFycyAocXcoJFNlbGYpKTsKCiMgZ2V0IHNlbGVuaXVtIG9iamVjdApteSAkU2VsZW5pdW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OlNlbGVuaXVtJyk7CgokU2VsZW5pdW0tPlJ1blRlc3QoCiAgICBzdWIgewoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRIZWxwZXIgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyk7CiAgICAgICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgICAgICMgZ2V0ICdMb2NhdGlvbicgY2F0YWxvZyBjbGFzcyBJRHMKICAgICAgICBteSAkQ29uZmlnSXRlbURhdGFSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgIE5hbWUgID0+ICdMb2NhdGlvbicsCiAgICAgICAgKTsKICAgICAgICBteSAkTG9jYXRpb25Db25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbURhdGFSZWYtPntJdGVtSUR9OwoKICAgICAgICAjIGdldCAnUHJvZHVjdGlvbicgZGVwbG95bWVudCBzdGF0ZSBJRAogICAgICAgIG15ICREZXBsU3RhdGVEYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICAgICAgTmFtZSAgPT4gJ1Byb2R1Y3Rpb24nLAogICAgICAgICk7CiAgICAgICAgbXkgJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCA9ICREZXBsU3RhdGVEYXRhUmVmLT57SXRlbUlEfTsKCiAgICAgICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBjcmVhdGUgQ29uZmlnSXRlbSBudW1iZXIKICAgICAgICBteSAkQ29uZmlnSXRlbU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06Ok51bWJlckdlbmVyYXRvcicpLAogICAgICAgICAgICBDbGFzc0lEID0+ICRMb2NhdGlvbkNvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJENvbmZpZ0l0ZW1OdW1iZXIsCiAgICAgICAgICAgICJDb25maWdJdGVtIG51bWJlciBpcyBjcmVhdGVkIC0gJENvbmZpZ0l0ZW1OdW1iZXIiLAogICAgICAgICk7CgogICAgICAgICMgYWRkICdMb2NhdGlvbicgdGVzdCBDb25maWdJdGVtCiAgICAgICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICBOdW1iZXIgID0+ICRDb25maWdJdGVtTnVtYmVyLAogICAgICAgICAgICBDbGFzc0lEID0+ICRMb2NhdGlvbkNvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAiQ29uZmlnSXRlbSAnTG9jYXRpb24nIGlzIGNyZWF0ZWQgLSBJRCAkQ29uZmlnSXRlbUlEIiwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBhIG5ldyB2ZXJzaW9uCiAgICAgICAgbXkgJFZlcnNpb25OYW1lID0gIlNlbGVuaXVtIiAuICRIZWxwZXItPkdldFJhbmRvbUlEKCk7CiAgICAgICAgbXkgJFZlcnNpb25JRCAgID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BZGQoCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkVmVyc2lvbk5hbWUsCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAxLAogICAgICAgICAgICBEZXBsU3RhdGVJRCAgPT4gJFByb2R1Y3Rpb25EZXBsU3RhdGVJRCwKICAgICAgICAgICAgSW5jaVN0YXRlSUQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFZlcnNpb25JRCwKICAgICAgICAgICAgIlRlc3QgdmVyc2lvbiBvZiB0aGUgQ29uZmlnSXRlbSBpcyBjcmVhdGVkIC0gSUQgJFZlcnNpb25JRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgdGVzdCB1c2VyIGFuZCBsb2dpbgogICAgICAgIG15ICRUZXN0VXNlckxvZ2luID0gJEhlbHBlci0+VGVzdFVzZXJDcmVhdGUoCiAgICAgICAgICAgIEdyb3VwcyA9PiBbICdhZG1pbicsICdpdHNtLWNvbmZpZ2l0ZW0nIF0sCiAgICAgICAgKSB8fCBkaWUgIkRpZCBub3QgZ2V0IHRlc3QgdXNlciI7CgogICAgICAgICRTZWxlbml1bS0+TG9naW4oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFVzZXIgICAgID0+ICRUZXN0VXNlckxvZ2luLAogICAgICAgICAgICBQYXNzd29yZCA9PiAkVGVzdFVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFkbWluSW1wb3J0RXhwb3J0IHNjcmVlbgogICAgICAgIG15ICRTY3JpcHRBbGlhcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2NyaXB0QWxpYXMnKTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZG1pbkltcG9ydEV4cG9ydCIpOwoKICAgICAgICAjIGNoZWNrIHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIGNsaWNrIG9uICdBZGQgdGVtcGxhdGUnCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYVtjb250YWlucyhcQGhyZWYsIFwnQWN0aW9uPUFkbWluSW1wb3J0RXhwb3J0O1N1YmFjdGlvbj1UZW1wbGF0ZUVkaXQnICldIikKICAgICAgICAgICAgLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgYW5kIGlucHV0IHN0ZXAgMSBvZiA1IHNjcmVlbgogICAgICAgIGZvciBteSAkU3RlcE9uZUlEICgKICAgICAgICAgICAgcXcoTmFtZSBPYmplY3QgRm9ybWF0IFZhbGlkSUQgQ29tbWVudCkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEVsZW1lbnQgPSAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiMkU3RlcE9uZUlEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KICAgICAgICBteSAkSW1wb3J0RXhwb3J0TmFtZSA9ICJJbXBvcnRFeHBvcnQiIC4gJEhlbHBlci0+R2V0UmFuZG9tSUQoKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNOYW1lIiwgJ2NzcycgKS0+c2VuZF9rZXlzKCRJbXBvcnRFeHBvcnROYW1lKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNPYmplY3QnKS52YWwoJ0lUU01Db25maWdJdGVtJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0Zvcm1hdCcpLnZhbCgnQ1NWJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNDb21tZW50IiwgJ2NzcycgKS0+c2VuZF9rZXlzKCdTZWxlbml1bVRlc3QnKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBjbGFzcz0nUHJpbWFyeSBDYWxsRm9yQWN0aW9uJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgYW5kIGlucHV0IHN0ZXAgMiBvZiA1IHNjcmVlbgogICAgICAgIGZvciBteSAkU3RlcFR3b0lEICgKICAgICAgICAgICAgcXcoQ2xhc3NJRCBDb3VudE1heCBFbXB0eUZpZWxkc0xlYXZlVGhlT2xkVmFsdWVzKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRTdGVwVHdvSUQiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQogICAgICAgICRTZWxlbml1bS0+ZXhlY3V0ZV9zY3JpcHQoCiAgICAgICAgICAgICJcJCgnI0NsYXNzSUQnKS52YWwoJyRMb2NhdGlvbkNvbmZpZ0l0ZW1JRCcpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7IgogICAgICAgICk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAY2xhc3M9J1ByaW1hcnkgQ2FsbEZvckFjdGlvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNoZWNrIGFuZCBpbnB1dCBzdGVwIDMgb2YgNSBzY3JlZW4KICAgICAgICBmb3IgbXkgJFN0ZXBUaHJlZUlEICgKICAgICAgICAgICAgcXcoQ29sdW1uU2VwYXJhdG9yIENoYXJzZXQgSW5jbHVkZUNvbHVtbkhlYWRlcnMpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjJFN0ZXBUaHJlZUlEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KAogICAgICAgICAgICAiXCQoJyNDb2x1bW5TZXBhcmF0b3InKS52YWwoJ0NvbW1hJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEBjbGFzcz0nUHJpbWFyeSBDYWxsRm9yQWN0aW9uJ11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgYW5kIGlucHV0IHN0ZXAgNCBvZiA1IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI01hcHBpbmdBZGRCdXR0b24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgZm9yIG15ICRTdGVwRm91cklEICgKICAgICAgICAgICAgcXcoS2V5IElkZW50aWZpZXIpCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi4vLypbXEBpZD0nT2JqZWN0OjowOjokU3RlcEZvdXJJRCddIik7CgogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFN0ZXBGb3VyQ2xhc3MgKAogICAgICAgICAgICBxdyhBcnJvd1VwIEFycm93RG93biBEZWxldGVDb2x1bW4pCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIuJFN0ZXBGb3VyQ2xhc3MiLCAnY3NzJyApOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZW5hYmxlZCgpOwogICAgICAgICAgICAkRWxlbWVudC0+aXNfZGlzcGxheWVkKCk7CiAgICAgICAgfQogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUiLCAgICAgICAgICAgICAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGhlYWQgdHIgdGgiLCAnY3NzJyApOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAidGFibGUgdGJvZHkgdHIgdGQiLCAnY3NzJyApOwoKICAgICAgICAjIHNlbGVjdCAnTnVtYmVyJyBtYXBwaW5nIGVsZW1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLi8vKltcQGlkPSdPYmplY3Q6OjA6OktleSddL29wdGlvblsyXSIpLT5jbGljaygpOwoKICAgICAgICAjIGFkZCBhbmQgc2VsZWN0ICdOYW1lJyBtYXBwaW5nIGVsZW1lbnQKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNNYXBwaW5nQWRkQnV0dG9uIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCIuLy8qW1xAaWQ9J09iamVjdDo6MTo6S2V5J10vb3B0aW9uWzNdIiktPmNsaWNrKCk7CgogICAgICAgICMgYWRkIGFuZCBzZWxlY3QgJ0RlcGxveW1lbnQgU3RhdGUnIG1hcHBpbmcgZWxlbWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI01hcHBpbmdBZGRCdXR0b24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi4vLypbXEBpZD0nT2JqZWN0OjoyOjpLZXknXS9vcHRpb25bNF0iKS0+Y2xpY2soKTsKCiAgICAgICAgIyBhZGQgYW5kIHNlbGVjdCAnSW5jaWRlbnQgU3RhdGUnIG1hcHBpbmcgZWxlbWVudAogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI01hcHBpbmdBZGRCdXR0b24iLCAnY3NzJyApLT5WZXJpZmllZENsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi4vLypbXEBpZD0nT2JqZWN0OjozOjpLZXknXS9vcHRpb25bNV0iKS0+Y2xpY2soKTsKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNTdWJtaXROZXh0QnV0dG9uIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGNoZWNrIHN0ZXAgNSBvZiA1IHNjcmVlbgogICAgICAgIGZvciBteSAkU3RlcEZvdXJJRCAoCiAgICAgICAgICAgIHF3KFJlc3RyaWN0RXhwb3J0IE51bWJlciBOYW1lIERlcGxTdGF0ZUlEcyBJbmNpU3RhdGVJRHMgVHlwZSBQaG9uZTEgUGhvbmUyCiAgICAgICAgICAgIEZheCBFLU1haWwgQWRkcmVzcyBOb3RlKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRWxlbWVudCA9ICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiIyRTdGVwRm91cklEIiwgJ2NzcycgKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2VuYWJsZWQoKTsKICAgICAgICAgICAgJEVsZW1lbnQtPmlzX2Rpc3BsYXllZCgpOwogICAgICAgIH0KCiAgICAgICAgIyBzZWFyY2ggQ29uZmlnSXRlbSBieSBudW1iZXIgYW5kIGRlcGxveW1lbnQgc3RhdGUKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCggIiNSZXN0cmljdEV4cG9ydCIsICdjc3MnICktPmNsaWNrKCk7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjTnVtYmVyIiwgICAgICAgICAnY3NzJyApLT5zZW5kX2tleXMoJENvbmZpZ0l0ZW1OdW1iZXIpOwogICAgICAgICRTZWxlbml1bS0+ZmluZF9lbGVtZW50KCAiI05hbWUiLCAgICAgICAgICAgJ2NzcycgKS0+c2VuZF9rZXlzKCRWZXJzaW9uTmFtZSk7CiAgICAgICAgJFNlbGVuaXVtLT5leGVjdXRlX3NjcmlwdCgKICAgICAgICAgICAgIlwkKCcjRGVwbFN0YXRlSURzJykudmFsKCckUHJvZHVjdGlvbkRlcGxTdGF0ZUlEJykudHJpZ2dlcigncmVkcmF3LklucHV0RmllbGQnKS50cmlnZ2VyKCdjaGFuZ2UnKTsiCiAgICAgICAgKTsKICAgICAgICAkU2VsZW5pdW0tPmV4ZWN1dGVfc2NyaXB0KCJcJCgnI0luY2lTdGF0ZUlEcycpLnZhbCgnMScpLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJykudHJpZ2dlcignY2hhbmdlJyk7Iik7CiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vYnV0dG9uW1xAY2xhc3M9J1ByaW1hcnkgQ2FsbEZvckFjdGlvbiddW1xAdHlwZT0nc3VibWl0J10iKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgICAgIG15ICRJbXBvcnRFeHBvcnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0Jyk7CiAgICAgICAgbXkgJERCT2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGdldCBUZW1wbGF0ZUlEIG9mIGNyZWF0ZWQgdGVzdCB0ZW1wbGF0ZQogICAgICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGltZXhwb3J0X3RlbXBsYXRlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJEltcG9ydEV4cG9ydE5hbWUgXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkVGVtcGxhdGVJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFRlbXBsYXRlSUQgPSAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBuYXZpZ2F0ZSB0byB0ZXN0IGNyZWF0ZWQgQ29uZmlnSXRlbSBhbmQgdmVyaWZ5IGl0CiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZEdldCgiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Q29uZmlnSXRlbUlEPSRDb25maWdJdGVtSUQiKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICRWZXJzaW9uTmFtZSApID4gLTEsCiAgICAgICAgICAgICJUZXN0IENvbmZpZ0l0ZW0gbmFtZSAkVmVyc2lvbk5hbWUgLSBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBleHBvcnQgY3JlYXRlZCB0ZXN0IHRlbXBsYXRlCiAgICAgICAgbXkgJEV4cG9ydFJlc3VsdFJlZiA9ICRJbXBvcnRFeHBvcnRPYmplY3QtPkV4cG9ydCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkVGVtcGxhdGVJRCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZGVsZXRlIGNyZWF0ZWQgdGVzdCBDb25maWdJdGVtLCBzbyBpdCBjYW4gYmUgaW1wb3J0ZWQgYmFjawogICAgICAgICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENhY2hlICAgICAgICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgQ29uZmlnSXRlbSBpcyBkZWxldGVkCiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAkQ29uZmlnSXRlbSwKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgZGVsZXRlZCAtIElEICRDb25maWdJdGVtSUQiLAogICAgICAgICk7CgogICAgICAgICMgcmVmcmVzaCBzY3JlZW4gYW5kIHZlcmlmeSB0aGF0IHRlc3QgQ29uZmlnSXRlbSBkb2VzIG5vdCBleGlzdCBhbnltb3JlCiAgICAgICAgJFNlbGVuaXVtLT5WZXJpZmllZFJlZnJlc2goKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICJDYW5cJ3Qgc2hvdyBpdGVtLCBubyBhY2Nlc3MgcmlnaHRzIGZvciBDb25maWdJdGVtIGFyZSBnaXZlbiEiICkgPiAtMSwKICAgICAgICAgICAgIlRlc3QgQ29uZmlnSXRlbSBuYW1lICRWZXJzaW9uTmFtZSBpcyBub3QgZm91bmQiLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG1haW4gb2JqZWN0CiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICAjIGNyZWF0ZSB0ZXN0IEV4cG9ydGVkIGZpbGUgdG8gYSBzeXN0ZW0KICAgICAgICBteSAkRXhwb3J0RmlsZU5hbWUgPSAiSVRTTUV4cG9ydCIgLiAkSGVscGVyLT5HZXRSYW5kb21JRCgpIC4gIi5jc3YiOwogICAgICAgIG15ICRFeHBvcnRMb2NhdGlvbiA9ICRDb25maWdPYmplY3QtPkdldCgnSG9tZScpIC4gIi92YXIvdG1wLyIgLiAkRXhwb3J0RmlsZU5hbWU7CiAgICAgICAgbXkgJFN1Y2Nlc3MgICAgICAgID0gJE1haW5PYmplY3QtPkZpbGVXcml0ZSgKICAgICAgICAgICAgTG9jYXRpb24gICA9PiAkRXhwb3J0TG9jYXRpb24sCiAgICAgICAgICAgIENvbnRlbnQgICAgPT4gXCRFeHBvcnRSZXN1bHRSZWYtPntEZXN0aW5hdGlvbkNvbnRlbnR9LT5bMF0sCiAgICAgICAgICAgIE1vZGUgICAgICAgPT4gJ3V0ZjgnLAogICAgICAgICAgICBUeXBlICAgICAgID0+ICdBdHRhY2htZW50JywKICAgICAgICAgICAgUGVybWlzc2lvbiA9PiAnNjY0JywKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkV4cG9ydCBmaWxlICRFeHBvcnRGaWxlTmFtZSAnJEV4cG9ydExvY2F0aW9uJyBpcyBjcmVhdGVkIiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIEFkbWluSW1wb3J0RXhwb3J0IHNjcmVlbgogICAgICAgICRTZWxlbml1bS0+VmVyaWZpZWRHZXQoIiR7U2NyaXB0QWxpYXN9aW5kZXgucGw/QWN0aW9uPUFkbWluSW1wb3J0RXhwb3J0Iik7CgogICAgICAgICMgY2xpY2sgb24gJ0ltcG9ydCcKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9hW2NvbnRhaW5zKFxAaHJlZiwgXCdTdWJhY3Rpb249SW1wb3J0SW5mb3JtYXRpb247VGVtcGxhdGVJRD0kVGVtcGxhdGVJRCcgKV0iKQogICAgICAgICAgICAtPlZlcmlmaWVkQ2xpY2soKTsKCiAgICAgICAgIyBzZWxlY3QgRXhwb3J0ZWQgZmlsZSBhbmQgc3RhcnQgaW1wb3J0aW5nCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoIi8vaW5wdXRbY29udGFpbnMoXEBuYW1lLCBcJ1NvdXJjZUZpbGUnICldIiktPnNlbmRfa2V5cygkRXhwb3J0TG9jYXRpb24pOwoKICAgICAgICAkU2VsZW5pdW0tPmZpbmRfZWxlbWVudCgiLy9idXR0b25bXEB2YWx1ZT0nU3RhcnQgSW1wb3J0J11bXEB0eXBlPSdzdWJtaXQnXSIpLT5WZXJpZmllZENsaWNrKCk7CgogICAgICAgICMgY2hlY2sgZm9yIGV4cGVjdGVkIG91dGNvbWUKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgaW5kZXgoICRTZWxlbml1bS0+Z2V0X3BhZ2Vfc291cmNlKCksICcoQ3JlYXRlZDogMSknICkgPiAtMSwKICAgICAgICAgICAgIkltcG9ydCB0ZXN0IENvbmZpZ0l0ZW0gLSBzdWNjZXNzIiwKICAgICAgICApOwoKICAgICAgICAjIG5hdmlnYXRlIHRvIGltcG9ydGVkIHRlc3QgY3JlYXRlZCBDb25maWdJdGVtIGFuZCB2ZXJpZnkgaXQKICAgICAgICBteSAkSW1wb3J0ZWRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbUlEICsgMTsKICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KAogICAgICAgICAgICAiJHtTY3JpcHRBbGlhc31pbmRleC5wbD9BY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Q29uZmlnSXRlbUlEPSRJbXBvcnRlZENvbmZpZ0l0ZW1JRCIKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICBpbmRleCggJFNlbGVuaXVtLT5nZXRfcGFnZV9zb3VyY2UoKSwgJFZlcnNpb25OYW1lICkgPiAtMSwKICAgICAgICAgICAgIlRlc3QgQ29uZmlnSXRlbSBuYW1lICRWZXJzaW9uTmFtZSBpcyBmb3VuZCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBuYXZpZ2F0ZSB0byBBZG1pbkltcG9ydEV4cG9ydCBzY3JlZW4KICAgICAgICAkU2VsZW5pdW0tPlZlcmlmaWVkR2V0KCIke1NjcmlwdEFsaWFzfWluZGV4LnBsP0FjdGlvbj1BZG1pbkltcG9ydEV4cG9ydCIpOwoKICAgICAgICAjIGNsaWNrIHRvIGRlbGV0ZSB0ZXN0IHRlbXBsYXRlCiAgICAgICAgJFNlbGVuaXVtLT5maW5kX2VsZW1lbnQoICIjRGVsZXRlVGVtcGxhdGVJRCRUZW1wbGF0ZUlEIiwgJ2NzcycgKS0+VmVyaWZpZWRDbGljaygpOwoKICAgICAgICAjIGRlbGV0ZSB0ZXN0IGltcG9ydGVkIENvbmZpZ0l0ZW0KICAgICAgICAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJEltcG9ydGVkQ29uZmlnSXRlbUlELAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAkU3VjY2VzcywKICAgICAgICAgICAgIkNvbmZpZ0l0ZW0gaXMgZGVsZXRlZCAtIElEICRJbXBvcnRlZENvbmZpZ0l0ZW1JRCIsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgdGVzdCBFeHBvcnRlZCBmaWxlIGZyb20gc3lzdGVtCiAgICAgICAgJFN1Y2Nlc3MgPSAkTWFpbk9iamVjdC0+RmlsZURlbGV0ZSgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJEV4cG9ydExvY2F0aW9uLAogICAgICAgICAgICBUeXBlICAgICA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICJFeHBvcnQgZmlsZSAkRXhwb3J0RmlsZU5hbWUgaXMgZGVsZXRlZCIsCiAgICAgICAgKTsKCiAgICB9Cik7CgoxOwo=
Um93MS1Db2wxO1JvdzEtQ29sMjtSb3cxLUNvbDMNClJvdzItQ29sMTtSb3cyLUNvbDI7Um93Mi1Db2wzDQpSb3czLUNvbDE7Um93My1Db2wyO1JvdzMtQ29sMw0K
Um93MS1Db2wxCVJvdzEtQ29sMglSb3cxLUNvbDMNClJvdzItQ29sMQlSb3cyLUNvbDIJUm93Mi1Db2wzDQpSb3czLUNvbDEJUm93My1Db2wyCVJvdzMtQ29sMw0K
IlJvdzEtQ29sMSI6IlJvdzEtQ29sMiI6IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOiJSb3cyLUNvbDIiOiJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjoiUm93My1Db2wyIjoiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiUm93My1Db2wyIjsiUm93My1Db2wzIg0K
IlJvdzEtQ29sMSIJIlJvdzEtQ29sMiIJIlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiCSJSb3cyLUNvbDIiCSJSb3cyLUNvbDMiDQoiUm93My1Db2wxIgkiUm93My1Db2wyIgkiUm93My1Db2wzIg0K
IgpUZXN0IDEgLSAxIjtUZXN0IDEgLSAyOyJUZXN0IDEKLSAzIjtUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiOyJUZQpzdCAyIC0gMiI7IlRlc3QgMiAtIDMKIjsNCg==
IgpUZXN0IDEgLSAxIglUZXN0IDEgLSAyCSJUZXN0IDEKLSAzIglUZXN0IFxuXHRcclxzDQoiVGVzdCAyIAotIDEiCSJUZQpzdCAyIC0gMiIJIlRlc3QgMiAtIDMKIgkNCg==
IgpUZXN0IDEgLSAxIjoiVGVzdCAxIC0gMiI6IlRlc3QgMQotIDMiOiJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjoiVGUKc3QgMiAtIDIiOiJUZXN0IDIgLSAzCiI6DQo=
IgpUZXN0IDEgLSAxIjsiVGVzdCAxIC0gMiI7IlRlc3QgMQotIDMiOyJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIjsiVGUKc3QgMiAtIDIiOyJUZXN0IDIgLSAzCiI7DQo=
IgpUZXN0IDEgLSAxIgkiVGVzdCAxIC0gMiIJIlRlc3QgMQotIDMiCSJUZXN0IFxuXHRcclxzIg0KIlRlc3QgMiAKLSAxIgkiVGUKc3QgMiAtIDIiCSJUZXN0IDIgLSAzCiIJDQo=
ICBUZXN0ICA7ICAgIDtUZXN0ICANCiAgICBUZXN0OztUZXN0DQo7OyANCg==
ICBUZXN0ICAJICAgIAlUZXN0ICANCiAgICBUZXN0CQlUZXN0DQoJCSANCg==
IiAgVGVzdCAgIjoiICAgICI6IlRlc3QgICINCiIgICAgVGVzdCI6OiJUZXN0Ig0KOjoiICINCg==
IiAgVGVzdCAgIjsiICAgICI7IlRlc3QgICINCiIgICAgVGVzdCI7OyJUZXN0Ig0KOzsiICINCg==
IiAgVGVzdCAgIgkiICAgICIJIlRlc3QgICINCiIgICAgVGVzdCIJCSJUZXN0Ig0KCQkiICINCg==
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0Ijs+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyI7DQo=
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0Igk+PEB+J317W11cDQoiIiIiIjs7OjouLi0tX18jIyIJDQo=
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0IjoiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjoNCg==
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0IjsiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIjsNCg==
IlRlc3Q7Ol/CsF4hIiLCpyQlJi8oKT0/wrRgKitUZXN0IgkiPjxAfid9e1tdXCINCiIiIiIiOzs6Oi4uLS1fXyMjIgkNCg==
w7zDtsOkw587w5zDlsOEDQrDn8Okw7bDvDvDhMOWw5wNCg==
w7zDtsOkw58Jw5zDlsOEDQrDn8Okw7bDvAnDhMOWw5wNCg==
IsO8w7bDpMOfIjoiw5zDlsOEIg0KIsOfw6TDtsO8Ijoiw4TDlsOcIg0K
IsO8w7bDpMOfIjsiw5zDlsOEIg0KIsOfw6TDtsO8Ijsiw4TDlsOcIg0K
IsO8w7bDpMOfIgkiw5zDlsOEIg0KIsOfw6TDtsO8Igkiw4TDlsOcIg0K
IsqpIMqsIMquIjsiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOyLOhiDOmyDOniINCg==
IsqpIMqsIMquIjoiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiOiLOhiDOmyDOniINCg==
IsqpIMqsIMquIgkiIMqhIMukIM6MICINCiIgIM6XIM+XIM+gICAiCSLOhiDOmyDOniINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyJSb3cyLUNvbDIiOyJSb3cyLUNvbDMiDQoiUm93My1Db2wxIjsiMFJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
IlJvdzEtQ29sMSI7IlJvdzEtQ29sMiI7IlJvdzEtQ29sMyINCiJSb3cyLUNvbDEiOyIwUm93Mi1Db2wyIjsiUm93Mi1Db2wzIg0KIlJvdzMtQ29sMSI7IlJvdzMtQ29sMiI7IlJvdzMtQ29sMyINCg==
Ik5hbWUiLCJEZXBsb3ltZW50IFN0YXRlIiwiSW5jaWRlbnQgU3RhdGUiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1MTQ3OTYyMzc2IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIgoiVGVzdENvbmZpZ0l0ZW10ZXN0MTQzNTg1Njg5NTE0MTgwMjc3IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIgoiVGVzdENvbmZpZ0l0ZW10ZXN0MTQzNTg1Njg5NTE4MDg3MzMxMCIsIlByb2R1Y3Rpb24iLCJPcGVyYXRpb25hbCIKIlRlc3RDb25maWdJdGVtdGVzdDE0MzU4NTY4OTU1MTM5MjQ0MzkiLCJQcm9kdWN0aW9uIiwiT3BlcmF0aW9uYWwiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1MzAwNzMwMzMiLCJQcm9kdWN0aW9uIiwiT3BlcmF0aW9uYWwiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1NDkzMjczNjg4IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIgoiVGVzdENvbmZpZ0l0ZW10ZXN0MTQzNTg1Njg5NTE4ODIxNjA2NSIsIlByb2R1Y3Rpb24iLCJPcGVyYXRpb25hbCIKIlRlc3RDb25maWdJdGVtdGVzdDE0MzU4NTY4OTU5ODY2OTMzOSIsIlByb2R1Y3Rpb24iLCJPcGVyYXRpb25hbCIKIlRlc3RDb25maWdJdGVtdGVzdDE0MzU4NTY4OTU2MjE5MTAwODYiLCJQcm9kdWN0aW9uIiwiT3BlcmF0aW9uYWwiCiJUZXN0Q29uZmlnSXRlbXRlc3QxNDM1ODU2ODk1NTQ0MTk2NzI0IiwiUHJvZHVjdGlvbiIsIk9wZXJhdGlvbmFsIg==
IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OkltcG9ydEV4cG9ydDsgICAgIyMgbm8gY3JpdGljCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJywKKTsKCj1oZWFkMSBOQU1FCgp2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0IC0gY29kZSB0byBleGVjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1jdXQKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKICAgIGxvY2FsICRLZXJuZWw6Ok9NID0gS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXItPm5ldygpOwogICAgbXkgJENvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCd2YXI6OnBhY2thZ2VzZXR1cDo6SW1wb3J0RXhwb3J0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgYWx3YXlzIGRpc2NhcmQgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIHBhY2thZ2UgY29kZSBpcyBleGVjdXRlZCwKICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIG5ld2x5LCBzbyB0aGF0IGl0CiAgICAjIHdpbGwgdXNlIHRoZSByZWNlbnRseSB3cml0dGVuIG5ldyBjb25maWcgZnJvbSB0aGUgcGFja2FnZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDb2RlSW5zdGFsbCgpCgpSdW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlUmVpbnN0YWxsKCkKClJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVcGdyYWRlKCkKClJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVcGdyYWRlRnJvbUJlZm9yZV8yXzBfMygpCgpUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXhlY3V0ZWQgaWYgdGhlIGluc3RhbGxlZCBtb2R1bGUgdmVyc2lvbiBpcyBzbWFsbGVyIHRoYW4gMi4wLjMuCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZUZyb21CZWZvcmVfMl8wXzMoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZUZyb21CZWZvcmVfMl8wXzMgeyAgICAjIyBubyBjcml0aWMKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBmaXggYSB0eXBvIGluIHRoZSBkYXRhYmFzZQogICAgJFNlbGYtPl9GaXhEYXRhYmFzZVR5cG8oKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfOTEoKQoKVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGlmIHRoZSBpbnN0YWxsZWQgbW9kdWxlIHZlcnNpb24gaXMgc21hbGxlciB0aGFuIDQuMC45MS4KCm15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGVGcm9tTG93ZXJUaGFuXzRfMF85MSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlRnJvbUxvd2VyVGhhbl80XzBfOTEgeyAgICAjIyBubyBjcml0aWMKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGFuZ2UgY29uZmlndXJhdGlvbnMgdG8gbWF0Y2ggdGhlIG5ldyBtb2R1bGUgbG9jYXRpb24uCiAgICAkU2VsZi0+X01pZ3JhdGVDb25maWdzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX0ZpeERhdGFiYXNlVHlwbygpCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fRml4RGF0YWJhc2VUeXBvKCk7Cgo9Y3V0CgpzdWIgX0ZpeERhdGFiYXNlVHlwbyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZml4IHRoZSBDb2x1bW5TZXBlcmF0b3IgdHlwbyAoY29ycmVjdCBpcyBDb2x1bW5TZXBhcmF0b3IpCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgPT4gIlVQREFURSBpbWV4cG9ydF9mb3JtYXQgIgogICAgICAgICAgICAuICJTRVQgZGF0YV9rZXkgPSAnQ29sdW1uU2VwYXJhdG9yJyAiCiAgICAgICAgICAgIC4gIldIRVJFIGRhdGFfa2V5ID0gJ0NvbHVtblNlcGVyYXRvciciLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9NaWdyYXRlQ29uZmlncygpCgpjaGFuZ2UgY29uZmlndXJhdGlvbnMgdG8gbWF0Y2ggdGhlIG5ldyBtb2R1bGUgbG9jYXRpb24uCgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5fTWlncmF0ZUNvbmZpZ3MoKTsKCj1jdXQKCnN1YiBfTWlncmF0ZUNvbmZpZ3MgewoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnJyk7CgogICAgbXkgQE5ld1NldHRpbmdzOwoKICAgICMgbWlncmF0ZSBOYXZCYXIgbW9kdWxlcwogICAgIyBnZXQgc2V0dGluZyBjb250ZW50IGZvciBOYXZCYXIgbW9kdWxlcwogICAgbXkgJFNldHRpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpOYXZpZ2F0aW9uTW9kdWxlJyk7CgogICAgIyB1cGRhdGUgbW9kdWxlIGxvY2F0aW9uCiAgICAkU2V0dGluZy0+eydBZG1pbkltcG9ydEV4cG9ydCd9LT57TW9kdWxlfSA9ICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyOjpNb2R1bGVBZG1pbiI7CgogICAgIyBCdWlsZCBuZXcgc2V0dGluZy4KICAgIHB1c2ggQE5ld1NldHRpbmdzLCB7CiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Zyb250ZW5kOjpOYXZpZ2F0aW9uTW9kdWxlIyMjQWRtaW5JbXBvcnRFeHBvcnQnLAogICAgICAgIEVmZmVjdGl2ZVZhbHVlID0+ICRTZXR0aW5nLT57J0FkbWluSW1wb3J0RXhwb3J0J30sCiAgICB9OwoKICAgICMgV3JpdGUgbmV3IHNldHRpbmcuCiAgICAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nc1NldCgKICAgICAgICBVc2VySUQgICA9PiAxLAogICAgICAgIENvbW1lbnRzID0+ICdJbXBvcnRFeHBvcnQgLSBwYWNrYWdlIHNldHVwIGZ1bmN0aW9uOiBfTWlncmF0ZUNvbmZpZ3MnLAogICAgICAgIFNldHRpbmdzID0+IFxATmV3U2V0dGluZ3MsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cg==
Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDAxLTIwMTggT1RSUyBBRywgaHR0cDovL290cnMuY29tLwovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgSVRTTSA9IElUU00gfHwge307CklUU00uQWRtaW4gPSBJVFNNLkFkbWluIHx8IHt9OwoKCi8qKgogKiBAbmFtZXNwYWNlIEFkbWluCiAqIEBhdXRob3IgT1RSUyBBRwogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgYmVoYXZpb3VycyBmb3IgSVRTTSBTZXJ2aWNlIFpvb20uCiAqLwogSVRTTS5BZG1pbi5JbXBvcnRFeHBvcnQgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQWRtaW4uSW1wb3J0RXhwb3J0CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGFjdGlvbnMgZm9yIElUU00gU2VydmljZSBab29tLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24oKSB7CgogICAgICAgIHZhciAkTmV4dEJ1dHRvbiwgJEZpcnN0Q29sdW1uOwoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdUZW1wbGF0ZUVkaXQ0JykpIHsKCiAgICAgICAgICAgIC8vIGZpbmQgdGhlIG5leHQgYnV0dG9uIGFuZCBnZXQgdGhlIGZpcnN0IGNvbHVtbiBkcm9wZG93bgogICAgICAgICAgICAkTmV4dEJ1dHRvbiA9ICQoImJ1dHRvbi5QcmltYXJ5W25hbWU9J1N1Ym1pdE5leHRCdXR0b24nXSIpLmZpcnN0KCk7CiAgICAgICAgICAgICRGaXJzdENvbHVtbiA9ICQoJyNPYmplY3RcXDpcXDowXFw6XFw6S2V5Jyk7CgogICAgICAgICAgICAvLyBoYW5kbGUgY2hhbmdlcyB0byB0aGUgZmlyc3QgY29sdW1uIHNlbGVjdG9yCiAgICAgICAgICAgICRGaXJzdENvbHVtbi5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbHVtbiB3aXRoIGEgdmFsdWUKICAgICAgICAgICAgICAgIGlmICgkRmlyc3RDb2x1bW4udmFsKCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgICAgICROZXh0QnV0dG9uLnJlbW92ZUF0dHIoImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhZGQgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZQogICAgICAgICAgICAgICAgICAgICROZXh0QnV0dG9uLmF0dHIoImRpc2FibGVkIiwgImRpc2FibGVkIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UnKTsKCiAgICAgICAgICAgIC8vIHNldCB0aGUgaGlkZGVuIGZpZWxkIHRvIGRlbGV0ZSB0aGlzIGNvbHVtbiBhbmQgc3VibWl0IHRoZSBmb3JtCiAgICAgICAgICAgICQoJy5EZWxldGVDb2x1bW4nKS51bmJpbmQoJ2NsaWNrJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgndGQnKS5maW5kKCdpbnB1dFt0eXBlPSJoaWRkZW4iXScpLnZhbCgxKTsKICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJCgnI01hcHBpbmdBZGRCdXR0b24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9TWFwcGluZ0FkZF0nKS52YWwoJzEnKTsKICAgICAgICAgICAgICAgICQoJ2lucHV0W25hbWU9U3VibWl0TmV4dF0nKS52YWwoJzAnKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkKCcjU3VibWl0TmV4dEJ1dHRvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1NYXBwaW5nQWRkXScpLnZhbCgnMCcpOwogICAgICAgICAgICAgICAgJCgnaW5wdXRbbmFtZT1TdWJtaXROZXh0XScpLnZhbCgnMScpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ1RlbXBsYXRlT3ZlcnZpZXcnKSkgewoKICAgICAgICAgICAgJCgnYnV0dG9uLkJhY2snKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyBDb3JlLkNvbmZpZy5HZXQoJ0JhY2tVUkwnKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkTWV0aG9kKCJWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybyIsIGZ1bmN0aW9uKFZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgTnVtYmVyID0gcGFyc2VJbnQoVmFsdWUsIDEwKTsKICAgICAgICAgICAgICAgIGlmIChpc05hTihOdW1iZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChOdW1iZXIgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRNZXRob2QoIlZhbGlkYXRlX051bWJlckludGVnZXIiLCBmdW5jdGlvbihWYWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIChWYWx1ZS5tYXRjaCgvXlswLTldKyQvKSkgPyB0cnVlIDogZmFsc2U7CgogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRSdWxlKCJWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybyIsIHsgVmFsaWRhdGVfTnVtYmVyQmlnZ2VyVGhhblplcm86IHRydWUgfSk7CiAgICAgICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5BZGRSdWxlKCJWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyIiwgeyBWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyOiB0cnVlIH0pOwogICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuQWRkUnVsZSgiVmFsaWRhdGVfTnVtYmVySW50ZWdlckJpZ2dlclRoYW5aZXJvIiwgeyBWYWxpZGF0ZV9OdW1iZXJJbnRlZ2VyOiB0cnVlLCBWYWxpZGF0ZV9OdW1iZXJCaWdnZXJUaGFuWmVybzogdHJ1ZSB9KTsKCiAgICAgICAgfQoKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShJVFNNLkFkbWluLkltcG9ydEV4cG9ydCB8fCB7fSkpOwo=
LyoqCiAqIEBwcm9qZWN0ICAgICBPVFJTIChodHRwOi8vd3d3Lm90cnMub3JnKSAtIEFnZW50IEZyb250ZW5kCiAqIEBjb3B5cmlnaHQgICBPVFJTIEFHCiAqIEBsaWNlbnNlICAgICBBR1BMIChodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQpCiAqLwoKLyoqCiAqIEBwYWNrYWdlICAgICBTa2luICJEZWZhdWx0IgogKiBAc2VjdGlvbiAgICAgSW1wb3J0IEV4cG9ydCBTY3JlZW4KICovCgpAbWVkaWEgc2NyZWVuLHByb2plY3Rpb24sdHYsaGFuZGhlbGQgewoKLyoqCiAqIEBzdWJzZWN0aW9uCiAqLwoKCi5NYXBIZWFkZXJSb3cgbGFiZWwgewogICAgY29sb3I6ICM5MjkyOTI7Cn0KCi5NYXBIZWFkZXJSb3cgLkhlYWRlciwKLk1hcEhlYWRlclJvdyAuRmllbGQgewogICAgZGlzcGxheTogaW5saW5lOwogICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgcGFkZGluZy1sZWZ0OiAycHg7Cn0KCmJ1dHRvbi5BcnJvd1VwLApidXR0b24uQXJyb3dEb3duIHsKICAgIGhlaWdodDogMTZweDsKICAgIHdpZHRoOiAxNnB4OwogICAgcGFkZGluZzogMXB4OwogICAgbWFyZ2luLXRvcDogMDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKICAgIGJvcmRlci1zdHlsZTogbm9uZTsKICAgIHRleHQtaW5kZW50OiAtOTk5OXB4OwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKYnV0dG9uLkFycm93VXA6YWN0aXZlLApidXR0b24uQXJyb3dEb3duOmFjdGl2ZSB7CiAgICBtYXJnaW4tdG9wOiAxcHg7CiAgICBtYXJnaW4tYm90dG9tOiAwOwp9CgpidXR0b24uQXJyb3dVcFtkaXNhYmxlZD0iZGlzYWJsZWQiXTphY3RpdmUsCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl06YWN0aXZlIHsKICAgIG1hcmdpbi10b3A6IDBweDsKICAgIG1hcmdpbi1ib3R0b206IDFweDsKfQoKYnV0dG9uLkFycm93VXAgewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXAucG5nKTsKfQoKYnV0dG9uLkFycm93VXBbZGlzYWJsZWQ9ImRpc2FibGVkIl0gewogICAgYmFja2dyb3VuZDogdXJsKC4uL2ltZy9pY29ucy9pbXBvcnRleHBvcnRfYXJyb3dfdXBfZGlzYWJsZWQucG5nKTsKICAgIGN1cnNvcjogZGVmYXVsdDsKfQoKYnV0dG9uLkFycm93RG93biB7CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duLnBuZyk7Cn0KCmJ1dHRvbi5BcnJvd0Rvd25bZGlzYWJsZWQ9ImRpc2FibGVkIl17CiAgICBiYWNrZ3JvdW5kOiB1cmwoLi4vaW1nL2ljb25zL2ltcG9ydGV4cG9ydF9hcnJvd19kb3duX2Rpc2FibGVkLnBuZyk7CiAgICBjdXJzb3I6IGRlZmF1bHQ7Cn0KCn0gLyogZW5kIEBtZWRpYSAqLwo=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZlJREFUeNqkUztLA0EQnr3bvEhhI9FC09gJInJiZbAQREHUWhTtbK8ULEWwFVLZaJE/YKWFgn2SQgxBgjYSIoYkEsxxuec6c/FxCXmAGZjbmdmZ7+a1TAgBw5AEQxL3K7OnjxAMhyEQCkEgGARJllfJ7jrOjWWaYBkGmM0mPBzOdAdoIyF2MFD9lkfxmxqYgT/Ysix1fzOukHp59apCq1epgT0QFGya6u56XMnnG0C8vTahkI3u+gJ4wYah7m1NKcWiBrregFqtArlcCTaWxhW66wRpKwEdEjTW5EUmS/riXEzhXMB9upSFdMnzYYwl/KXwjgwOsHEgXBds285oQgYHAQ1dB875PJMkmkz/Jjq2DbqmeXJFDoHDwAMwUI9Eo/0BtHod9EbjVy/zKDgugIkARHSy52uUFroDFM9WgI9NQ2T5qJUBj2AJfwD63QnY73mUznuPkRy022MwcfNsJnlMMtlawYMXadItP8Wst1yhmmz9SVQLBbTRUn0iv1CrfpyZ/zXiiOgYQY72WHDq5QfGuF0B/kNfAgwAlIbWNoRkTzIAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEigB30KkogAAAMpJREFUKM+lkT0OAWEQhp/9ESJKF5FPK1oSCQfYXvvVDuAcCola5w5sKdkL6EQhYv+NYpddSyi8xUwxT2bemTGE7zJ/1LGzNKNBnRrWANJNTEjAvAzkclINtFm+dQAQJ9ZjBWstFIhZlCM9Uh4eQxVpcSqAOKGeqAM+J/b0VfhE8hFRT1i40FEWWxfA6GVjckCmKTeSXcoNH7trYlVNJlwBQQiAZhU4c8k6IfiAT+sVOD52AQJ4xsJk6VrRp1PHWXJXgOGWAePvb94BXKRFykgCmkUAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAZBJREFUeNrEU79Lw0AUfpemhZI4CIpCJ92cHE4HJ0HEQcFRQdShIJ0E/5SCOBSkgxZE7CS4iIt06NIMnVxUcKhWCJb+iPl1l/gu1ppKKkIHH1zu3r33ffnu3Tvi+z4MYxIMaXLYWcy/9taEkBxOtOtqqDTzFbtNT0QTeIyFXbq5kgoIzq9rf1PgOk5fsNVyQZTo5/5AgqauQ1JVe75puuB5AI5lfe91OvidiiYwms0gOakogd9ovYPjuuCY5ifYMMC17cEKhDEEGO02yLIMNYsB9wjYSMCwPh7nvx8BK51DzZSjbo5E9biCBBAQoFW6ORpOmegi2nYJEyhNr9EHPOo9qvXAB3V1iY4mAF7OrjS83tLARkJwwbWsbPmoqCkJCXQmwRuPQVyW4Clf1ERM5IQxJNzK6vwWSmcQm1nfxv2Dsb0dyjHcOD4Vf87yu8uCVb2AMKaPAJPEJK5gRF7Y3yCTs7uBsnr1hJUPi7gUd9j2Q6AognEcKRwxMr08FxA83lS6KaLXnxHjRRL8y2v8EGAAqEvNnH+aSSAAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IArs4c6QAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH2goUEig6bklNhgAAAMlJREFUKM+lkT0KAjEQhb9IFEE9TToP4BU8gq2exG23FAKCYCmIra25iYL4w/6asVhddlW0cJo3yXy8CS9K+F6NH3N0IVMAVIgBnIwAJlXgVogZGNh8ckgfxzNS9jXgQAeACE8MwLUOnIjpACcyYuBa+uinVc4ZzQVPRI5/XSGhN54cQYhhB+IYVYBkK2ZojkR4+qbNyqltLSixSTBzLRIyNEuXBGJfkhSbBtb16LJwaTmuPBLEZszHoIKmfcvhieR70Ovqnfr7N++lLlCSshf+TwAAAABJRU5ErkJggg==