GeneralCatalog
3.3.10
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 3.3.10.
Build for OTRS::ITSM 3.3.9.
Build for OTRS::ITSM 3.3.8.
Build for OTRS::ITSM 3.3.7.
Build for OTRS::ITSM 3.3.6.
Build for OTRS::ITSM 3.3.5.
Build for OTRS::ITSM 3.3.4.
Build for OTRS::ITSM 3.3.3.
Build for OTRS::ITSM 3.3.2.
Build for OTRS::ITSM 3.3.1.
Build for OTRS::ITSM 3.3.0 rc1.
Build for OTRS::ITSM 3.3.0 beta5.
Build for OTRS::ITSM 3.3.0 beta4.
Build for OTRS::ITSM 3.3.0 beta3.
Build for OTRS::ITSM 3.3.0 beta2.
Build for OTRS::ITSM 3.3.0 beta1.
The General Catalog package.
Das General Catalog Paket.
El paquete General Catalog.
3.3.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 this table 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 creadas durante la instalación serán borradas.
¡Todos los datos de esas tablas serán irrevocablemente perdidos!.
<br/>
<br/>
((enjoy))<br/>
<br/>
# define function name
my $FunctionName = 'CodeUpgrade';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2014-10-31 13:07:57
opms.otrs.com
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aGh46qmnIpHIhRde+MUvfjG2PDc3d+TIkSNHjrzggguef/75FFbYocLh8KJFixobG88555xZs2bFkoGsrKzCwsLCwsLp06d349NPf2mRH61bt+7AgQODBw/+8pe/HPsTicnIyPjyl79cUlISHXTWLlljdDKjurq6+IUff/xxEAQjR45s+/Fjoh2mmjXUabu3FO2d9K//+q9r1qx59913KysrGxoa/vVf/zUIgpKSkrVr1+7YsWP//v2hUKhfv34TJ0684IILcnNzWx7h7rvvXrt27apVqyoqKjIyMkaOHDlz5szop/ree+9Fl0cikZEjR37pS19qOXXU/v37ly1btnXr1qqqqqysrGHDhp177rmnnHJKbIP//b//94EDB2677bZhw4ZFlzz11FPvvfdeEARTpky5/PLLowvLysrmzp07YMCA73znO7F9d+3atWzZsl27dtXW1ubm5o4aNWr69OnRTzKZz6Glurq6xYsXb9q0KSMj49JLL506depxfuoAkEg4HA6CoOUlEAA9zdq1a6urq0eNGhUfHsXr3bv3FVdc0XL5Me+wgrhbuffee++dd96J3sqNGjUqdivXugO25e6ymWgyMHTo0PjwKF5OTs7s2bNjb5NpJTZAJ36kTux16+qMSubGMwiCLVu2LF26tKysLBKJFBQUnH322WeffXYXHVKXFvnRpk2bgiD4q7/6q6P1LcrMzDz33HOfffbZTZs2tUt+VFZWFgRB37594xeecMIJBw8eLCoqmjRpUtubiNqzZ08QBCeeeGJKdj+a5557bvXq1c0WPvDAA/FvKysrKysrN2zYMGfOnLy8vGYbL1my5J133om93bJlS3Fx8Zw5c1atWrVy5crY8q1bt+7evfu2224bOHBg/MKFCxfW19dH3zY2Nm7fvn379u2f//znL7rooujCk0466d13392+fXssP9q+fXuzF0EQRHuQjR07NrZk1apVzz//fOypgocOHdqwYcPGjRv/5m/+5uyzz07mc2hm//79jz32WHl5eV5e3tVXXx3fFgC0i6ampkB+BEAQbNmyJQiC4/3FOpk7rJgXX3xx+fLl8S0WFxffdtttgwYNat0B2353GRNLBpL8/8TWtdIuR0jyxnPFihUvvPBC7G1paWlpaWn0Nr8rSov8qLS0NPhsCtBSdG10y7aITjz24osvBkFwxhlnxK+aPHnyW2+9tXjx4q1bt06cOHH48OFtmdo9OnnTCy+8EAqFPv/5z3fy7omtWbNm+vTpZ5111sCBA2P/MseMGXP22WePGjUqPz+/vr6+tLT0tddeKykpeeutty6++OJmR1i1atX5559/1lln9e3b96OPPnr66acrKioeeeSRqqqqlsvfeuutr371q9Edq6qqnnjiifr6+jPOOGP69OmDBg2qra394IMPXn/99TfffHPcuHHRWdLHjh0bzY+mT58eBEFlZWVVVVV+fn4kEqmqqqqsrCwoKAj+K0uK/eXs2bNnyZIlkUjkc5/73AUXXNC/f/8DBw689dZba9euff7550eOHNksiTvi5xBvx44dTzzxRE1NzYknnvi3f/u38bOtA0B7ifY/auMIfQC6gWiycFxjYpK8w4p55513ZsyY8bnPfS4/P3/Pnj1PP/303r1733rrrVi/nuM9YNvvLmOi/TySf3BWMq3Ensl+xM4+raszyRvPPXv2vPTSS0EQTJ06dfr06X379q2qqlq2bNmqVauSPMF0kxb5UU1NTdCiN1Az0bXRLVuh5d/KGWec0SyX+cIXvlBVVfXee++tWbNmzZo10UbHjBkzZcqU2IxIx9vW4MGDr7vuuokTJ6Zk96MtmTp16l//9V83W3jTTTfFXufm5o4bN66goODXv/715s2bW/7LOf/882fOnBl9PWLEiFmzZv3+978/cODAjBkzWi6P7zG0YsWKurq6+DFoOTk506dPz8zMXLJkycqVK2P5URAExcXF4XA4MzMzlhNFIpH169dv3769oKAgHA4XFxcHcfnRO++809TUNGHChFhcNWjQoNmzZx86dKioqGjFihVf+cpXjvk5xKxevfr5559vamqaOHHiFVdc0atXr6NtCQBtof8RAFHRG978/PxmyxPc5SV5hxUzY8aM2OC4UaNGXXbZZQ8//PCOHTtiGxzvAdt+dxlTXV0dBMEJJ5xwtA3apZW2HyHJG8+VK1c2NTVNmjQpNp3xgAEDLrvssurq6g0bNiR5jmklLfKjztevX78LL7yw2Q99mZmZl19++fTp09evX19cXLxnz56qqqp169atW7du0qRJV155ZSt+GNy/f//q1av79evXckBpJ+x+NOecc07LhdEodNu2bQcOHIj1VAyCIP65iTFnnXVW/NvCwsIEy6MTS0UVFRUFQXDuuec2O+Bpp522ZMmSXbt2Rd/m5+efeOKJ5eXlJSUlo0aNih+ntn79+m3btk2dOnX37t0NDQ0nnnhi7D+v0TjpggsuaHbwGTNmFBUVxf83McHnEPXcc89FU+ELLrhg5syZoVDoaFsC0J3s37//8OHD/fr1S7Lfe7vQ/wiAVkvyDium2YQww4cPD1p1yxbT9rvLVmt7K607QpI3ntEX0SE18c477zz5Uevl5eVVVVVVVVXFz5LTTFVVVXTL1jURTWcbGxvLy8tffvnl7du3P/LII9/61reys7ObbTlkyJDo03MjkchHH320YcOGFStWbNiwoaCgoOVQzwRt1dbWHjx48IMPPnjnnXceeOCBG264YcyYMZ22e2Itx2FVVFQ8+OCDtbW1LTdubGxsubB///7xb2N9c464PHpZHLV///4gCObNmxcEQWywaOx1NG+OGjt2bHl5+bZt20aOHBn9h3fSSSdFN9uxY0ckEmk5+VH0j2Tw4MHNqo32Hoz/b2JUgvFo0fDoi1/84oUXXni0bQDofmpra6urq9sygL0V9D8CICp6a/zxxx83u1U54tzPUcnfYUW14y1bVNvvLmP69Olz8ODBlqd/RK1upe1HSPLGM7pZ/MRSUdHJWLqitMiPCgsLq6qqtm/fniA/io5givVzaZ3oY/+uv/76+++/v6KiYsWKFTNmzDjaxqFQaOjQoUOHDh02bNjChQvXrVuXZH4UlZubm5ubO3To0FGjRj3yyCMvv/zynDlzOm33xFqmZq+88kptbe3w4cNnzpw5ZMiQ3NzcjIyMxsbGX/ziF0c8wtH64xyzn070PzrRC+WW4v+zNXbs2HfeeWf79u0TJ06sra0dOHBg9L90AwYM2L9/f1lZWfRP4qSTTkrcYgItP4eYMWPG7Nix45133hk/fnw0kgegJ4j+/1QndzvV/wiAqGHDhlVVVRUXFyc/9Wryd1hR7XjLFtX2u8uYYcOGHTx4MMnTb3Ur7XiEniYt8qOJEyd++OGHK1asOPPMM4948RQOh6NP+zqumYCOJjs7++KLL/7DH/6wYsWK8847LyvrGB/C+PHjgyP1XklStINMeXl5SnZPUrSDz1VXXRX/D3Xv3r3t3lC/fv327t17++23t0xhmxkzZkxGRsbu3bujk/DH+hmddNJJa9as2bRpU0lJSUZGRvzg2759++7bt6+iomLUqFHxh4p+eskPow2C4Gtf+9pjjz22bdu2hx9++G//9m+T7PwFQFeXkvxI/yMAoiZOnLhp06Z33nln8uTJSf7/QvJ3WElq+wFbfXcZSwaSOf2238O2+ghJ3nhGN9u7d++IESPiN6usrEy+yLSSFlcqkydP7t+/f0VFxZ///OeWMWdTU9Of//znioqK/v37N3tiWquNHz++sLCwurp67dq1x9x49+7dwZHmMEtSdPhoqnZPUjRFbhalLVu2rN0bmjBhQhAES5cuPeaWvXv3HjZsWDgcXrFiRRDXzygaJK1YsSIcDg8bNqx3796xXaJZUsuDv/3220EQHFcGlJ2dff31148fP76uru4Pf/jD5s2bk98XgK5L/yMAUmjy5Ml9+/YtKyuLPsknmV2Sv8NKUtsP2Oq7y2gysGfPnqOdfn19/Z/+9KfjbSW6TV1dXXvVmeSNZ/RFywMuX778mE2kp7TIjzIzM6OzU69du3bevHkffPDBoUOHwuFwdFry+fPnr127NrZNezV6/vnnB0GwfPny2JDO3/3ud6+++mpRUdHBgwcbGxsbGhr27du3bNmyJ598MgiCSZMmJT7gvHnzVq5cuWfPnrq6ukgkUl9fv2fPntdff/2Pf/xjEASf+9znmm0fe45g63ZvX9Epn55++umKioqGhoby8vKnn376vffea/eGpk+fnpeX9+677z722GNbt279+OOPm5qaDh8+XFpaumzZsrlz58ZvHI2KDh8+HAqFYv8Ix44dGwqFov/4mw1eO/fcczMyMjZt2vTnP/9537594XB43759Tz/99JYtWzIzM1vOAJdYVlbWddddN2HChMbGxscff/z9999vy4kD0CVEr1b1PwIgJbKysq6++urMzMzVq1fff//977777t69exsaGpqammpqarZt2/b000832+W47rCS0fYDtvruMjMz86qrrsrKylq9evW8efPWrVt38ODBcDhcV1dXVlb2l7/85T//8z9jXUCSb6Vfv35BEPy///f/4mfIbkudSd54Tps2LSMjY8OGDc8///z+/fvD4fD+/fuff/75Ljp5dpAm49eCIBg5cuTf/d3fPfHEE6WlpdG8Jl6fPn2uvvrqkSNHtmOLp5566oABA/bu3btp06ZTTjklCIKKioqKioq33nrriOV94QtfSHzA3bt3R3sqtTR58uSWc7O37+5t9IUvfOHRRx8tKiqKdneKmjZt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ySWXXHTRRaFQKCcn56mnnkqwduXKlfFrL7jggr1797b7KcDRyI8AgO4vNris4+4fovmR8Wt0nNGjR6e6hHYzefLkSCTS+e0e8QY+SamqObH0rCoNddqn9M///M9///d/H3tbWlp6yy23LF++/Ac/+EFlZWXL7efMmbNgwYLXXnstEom88cYbN9xwQ4K1v/nNb+LXfvOb3/zhD3/YQScCLbnEAQC6v46enKgTxsfBzp07U11Cl1dWVpbqEujOtm7dumbNmvnz58eWFBYWPvjggwl2ycjIGDx4cPT19OnTq6urE6ytq6uLX/u1r33tnnvu2bp167hx49rnBCAh/Y8AgO6vE/KjnJyczMzMjAwXV3S2efPmjR07Nj8//5prrjl48GCzcTrPPPPMueeem5eXN2nSpMWLF8fvGN3y0KFDs2fPzsnJaTl2JsG+QdyAoAULFpx66ql9+/b9+c9/Hlt733333XrrrYWFhcOHD58zZ8727dvb63yXL19+6aWX9uvXLzc3d8aMGa+++uqECROO2e748eOj1YbiNDtyW2p+/PHHP/e5z/Xp0+ess8564oknmq1N/B215XwTS3BGTz31VE5OTigUys3NPeeccxYvXnz66acnuTZq2rRp06ZNS7KSmGYffsvvIvG3kPiv7pif1ZYtW6ZPn56VldXyr70t7cbMnTv31ltvPa4PpLy8vNVrgyC4+eab586de1wtQutFAAC6u8rKys2bN5eXl6e6EEjWrFmzFi5cGL/kiJfuTzzxxAUXXFBUVFRfX79+/fo777wzfrPHH3/8+uuv37ZtW11d3fr162fOnPnCCy80O+Y3vvGNN998s6mpafHixdnZ2cnvG9392muvveKKK9asWVNfX79kyZLYqqKiouiLysrKH/3oRyeddFLL4ltxM/Liiy+eccYZL7zwwt69e+vr64uLi3/3u98NHDgwyXYTt9jqmh977LGrrrqquro6EolUV1dfddVV8d9d4u+ojeeb+LwSnFF2dvbixYsjkUg4HC4vL1+wYMHgwYOTXBt1zjnnnHPOOUmeSLwZM2YsXbo0+nrp0qWf//znk6w56mh/dcf8rIIg+Ju/+Zv169e3/GtvS7vxzjjjjA8++OBoJ37ErykUCiXYpuXaSy65JH7J+++/f/rppx+tRWhf8iMAoPvbs2fP5s2b9+7dm+pCIFmx/KjllD2F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4HfN+jUAABCBePQBEKF27949YcKEzMxM+bDbjXizsrLuvffeffv29X5oALon54+io6OD3zXr14Dwxv+7AaBT5I8ARKj33ntv9uzZflXJz8/fv39/QHo/ceJEaWlpQJoCIpOC+SPmHwG9Sn4Xm9JRAAA88egDQHkej4muw8OHD48dO1an091+++0bNmyQTzqdzhUrVqSnp992221PPvmk0Wh01Vq9evWQIUPkP+o6revu888//973vtexU6vV+vOf//w73/nOwIEDV65c6V7l+9///smTJ2/xZk+cOHH//fdPnjx57Nixt9gUEMkUzx/x9y2CL9Reb5+SktIbzXY7I7i39SyAXhoNAAgd5I8AhK558+YtW7bs+vXrR48e/cc//iGf/M///M8jR458/PHHVVVVNputqKjIdf0nn3zy6aefyktLOq3r7vLly4MGDep4/g9/+MM333xz5syZzz///ODBg+5FKSndvzKLAAAgAElEQVQp9fX1Pb6dsrKy733vez/84Q+PHz/+85//PDk5ucdNARHObrc7nU5RFBXZ/4j1a1DKt99+q3QI/6KhoUHpEEIIowEg7AX7lSUA4Du1Wl1fX9/Y2Dh06FDXHKL169fv3bs3PT1dEIRVq1aNHz/+j3/8o1z05z//2fXrX6d13XX16+K77767f//+1NRUQRDWrFkzatSoW7+RY8eO/epXv/riiy8sFovT6VSr1Y2NjQsXLpRLv/rqq/Lyci/VBw4cyF+qgDun02m320VR1Gg0we/darUKgqDRaPg/ZuiYMmXKmjVrlI5CMSdOnFi+fHlZWZnVar333nv/4z/+4+mnn/7mm2/kUvl/qJIkbd68+Q9/+ENdXd3SpUtffvlluXT//v2///3vv/rqq9tvv33FihU/+clP3FsuLi4+derUwYMHRVGcMWPGSy+9JP/3NyMjo6qqSvjXRKrHf1i9t9wts9n89NNP79q1Kzk5+Te/+Y38H01Xd66+5DMZGRkVFRWuujk5OYIg9GDKcEVFxfDhwzvei6ujmzdvPv744wcOHBAEwWAw5OXlCb6NBgCEAfJHAELX3r17X3311VdeeeW2227785//PH36dEEQamtrs7KyXNe4b0EydOhQ73XdDRo0qL6+PiMjw+N8XV3dsGHD5M8epfX19Z1OWepWUlKSPNsoKipKnjSRlpYWGxsrl964cePa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GAyGQqFQKOT3+yUmBAAAAABgENAfYbyYptlqtXRdb7Va3W63t53OCAAAAACA1dAfYSzYtl0ul93maOl2n88XCoXc5ogVsgEAAAAAWBH9EcZFuVx2F8P2eDzuOKNgMOjx8L8AAAAAAACnwZtnjAVVVZPJpMfjCQaDPp9PdhwAAAAAAIaJ4o7IAIaaruv5fF5V1R07dsjOAgAAAADAqGH8EUaBqqq6riuK4jiOoiiy4wAAAAAAMFIYf4ThYBiGEKLP1LNarRYMBr1e7zaGAgAAAABgLPDAKQwox3FarVaxWDx58uThw4ePHTtWKpX6HB+LxSiPAAAAAOAMPf7449ddd90znvGMSCQSDoef/vSnv/vd73788ceXHaaswWoHh8Phc88998Ybb1xYWDg1QLvd/tjHPvbSl740kUh4PJ50On3hhRfecsstP//5z08bful915VwjTftnfiWt7zl1Lu/5S1vOfXKq3n00UdvvPHG8847LxQKBQKBpz71qdddd93s7OxpTzzDczeM8UcYIJZl6UvYtt3bpapqJBKZnJyUGA8AAAAARtudd955yy23WJa1bLumabfffvu+fft6W9ZSkfQKh9UOnpycfOihh/bs2dPbksvlLr744kOHDvW/4GrcG7mHrT3h2m/qXlNRFL/fPz8/n0gkersqlcr09HSn03GPX2PUZeLx+He/+90LLrhg687dMMYfQbJOp1OtVhcXF48dO3bkyJG5ublSqdRqtWzb1jQtEolkMpldu3bt3buX8ggAAAAAts7f//3ff+ADH7Bt+5prrvnxj39cr9ebzebDDz/8jne8w7btm2+++ZOf/GTvYOf39dl46im5XO7+++/fu3fv4uLiX/3VXy09Zt++fYcOHdqxY8fnPve548ePdzqdSqXy0EMP3X777c997nPX9eWsPeF6b3rxxRfrun7vvfcu3fhP//RPuq5fcskla4z3nOc850Mf+tDBgwdLpVKn0/nlL3956aWXVqvV973vfVt67oYx/gjbrc8gIyGEz+cLBoOBQCAQCPRZ7QgAAAAAsImOHz9+zjnnGIbxj//4j29/+9uX7f3c5z539dVX+3y+w4cP79y589TTlw78WePeBx988A/+4A+y2ezi4mJvYzqdLpVKDz300Ete8pINfBV9YvTZtfabuhe599573/zmN19wwQU//elPe7suuOCCxx577J//+Z+vvPLK1W7U34kTJ3bt2hUMBlut1naeu0aMP8K2On78+LJBRqqqhkKhVCq1Y8eOs88+e/fu3dlsNhaLUR4BAAAAwLa56667DMO44oorTi2PhBBvf/vbL7/8csMw7rrrrs2643nnnSeEqFarSzc2m00hxFOf+tTNustarPemb3zjG1Op1KOPPvqzn/3M3fLYY4899thjqVTqT/7kTzYcw+PxCCEymcw2n7tG9EfYVqqqCiG8Xm80Gs1ms2edddbZZ5+9Y8eOdDodCoXcvQAAAACAbfatb31LCHHttdeudoC769vf/vZm3fHRRx8VQiwbzXT++ecLIa655pr//d//3awbndZ6b+r3+931sz/72c+6W9wXf/Znf+b3+zcQwLKs3/zmN+6f8HXXXbdt564L89ewaSzLqtVq3W43m82udky321VVVdO07QwGAAAAAOgvlUqVy+VisZhKpVY8oFAoZDKZdDpdKBRO3buu+WuFQuHgwYM33njj0aNH9+/ff+utt/aOPHjw4Kte9Spd14UQe/fufd7znvfsZz/7oosu+sM//MO1vJHc2Py1td+0d5Gf//znz3ve85LJ5NzcnBBienq6Uqn8/Oc/f+5zn9v/j2K1YEKIHTt27Nu374YbbljjiWd47nrRH2HTWJZ15MgRIcTevXtpiAAAAABgiHi9XtM0u92uOxPqVN1u1+fzeTyebrd76t619EenuvLKK7/whS94vd6lG3/961/ffvvt999/f71e723cuXPnJz7xicsvv7z/V7Gx/mjtN116kRe+8IU/+clP7r33Xsdx3vKWt7zwhS98+OGHT3uj1YIJITwez0UXXXTbbbetfe2nMzl3veiPsFaO43Q6HSFEIBBY7Zh8Pu/1emOxGDPRAAAAAGCIbMP4o2V27tz51a9+1Z07dirLsn71q18dOnTo4Ycf/s///M/f/va3iqLcd999b3jDG/p8FRvuj9Z406UXueuuu9797ndfcskljuN897vfveuuu975zneu8UbLmKY5Nzf3wAMP7N+/v1qtfuMb37j00ku34dx1oT/Cqmzbbrfbuq53Op1Op2OaphAiHA7PzMzIjgYAAAAA2EwvetGLHnnkkW9+85uvfOUrVzzgm9/85qtf/eoXvehFP/7xj0/du/b5a91u94knnrjtttu++MUvZjKZX/7yl5OTk/2z2bZ9yy23fOQjH1n2yLN1xVhvrbPiTZdepFqtzszMtNttIUQwGJyfn4/FYhu40VLf+MY3XvOa17zgBS945JFHtvPctWCQCH7Htm1d16vVai6XW/qgtGaz6ZZHmqYxsAgAAAAARo87aOUzn/nMage4u858bIvX633a0572+c9//tWvfnU+n7/llltOe4qqqjfffLMQ4tChQ2d497U77U3j8fgVV1zhOI7jOG9605vc8ugMXXTRRX3uuHXnrgVdwFgzTbPVapXL5fn5+WPHjh0+fPj48eO5XK5areq67jiOx+MJh8OpVGpmZmbPnj179+6dmpqSnRoAAAAAsMne9a53eb3eL3/5y1/60pdO3fvFL37x3/7t33w+37ve9a5NuZ2iKJ/85Cc9Hs8XvvCF3/zmN6c93n0yWiQS2ZS7r9Fpb3rNNdcse3GGfvjDHwoh+jyTaovOXYuVl8XCaCsWi+6sNMuylu3yer3+JwUCAZbBBgAAAIBxcNZZZ91xxx033XTTVVdddfDgwWuvvfbcc89VFOXQoUOf+cxn3MFHH/nIR3bt2rVZd3za05529dVX33PPPbfccsuXv/xld+O555572WWXXXTRRc961rOy2azjOPPz81//+tdvu+02IcRrXvOazbr7Uhu+6UUXXbThRYFe/vKXX3PNNRdeeOHOnTtN0zx58uT9999/xx13CCH+9E//tHfYirPh1nju5mL9o3F07NgxwzCEEIqiBAKBXlvk9XpXWxUfAAAAADDybrvttv3799u2vWy7qqof/vCHP/jBD6524trXP1pqbm7unHPO0XX94YcffsELXiBWf1KbEOKZz3zmd7/73f5zYja2/tHab7qWtY3WuP7Raje9+OKLH3jggVAo1Odqazx3c9EfjZput1ur1RRFWW3NfCFEtVoVQri1EYURAAAAAKDn0KFDn/70p7/zne+cPHnScZydO3defPHF73nPe84999w+Z22sPxJCfOADH7jzzjsvvfTSb33rW0KI//mf/7n//vsPHDhw6NChXC7nOE46nXbHB73jHe/o8zTw096oz66133QT+6NHHnnkS1/60ve+973Dhw+bpjkxMXH++ee/+c1vvvLKK5euO7zi1dZ47uaiPxo1nU5ndnZW07S9e/fKzgIAAAAAAEYB6x8NDdu2DcPodDrdbjcYDIbD4RUP8/l8sVjM5/M5jsPYIgAAAAAAcObojwZUt9s1DMMtjAzD6Ha7SyegOo6zWn+kKMrk5OR2xQQAAAAAAKOP/mggWJZl/D7TNE89zOPx+Hw+n8+3RathAQAAAAAAnIr+SA7Lsur1eq8tsizr1GN6bVGPpmnbHxUAAAAAAIw5+iM5LMvK5/NLtyxri/x+/9atmg4AAAAAALB29Edbol6vNxqNcDgci8VWPMDr9UYiEa/X2yuMaIsAAAAAAMBgoj/aoP5PNzMMo9FoaJq2Wn+kKMr09PSWpQMAAAAAANg09Een5ziOaZruA9F6v3a73T179ng8K/8BhsNhTdMCgcA2RwUAAAAAANh0zJn6PY7jGIbRbDbL5XIulzt58uTRo0cPHz589OjRkydP5vP5SqXSarW63a4Qwv11RYFAIJFI0B8BAAAAAIbIT3/607e97W179uwJBALBYPDpT3/61Vdf/cMf/lB2LiGE6DMHSAjxX//1X6973esymYzX652amrr88su//e1vb9vdx4HiOI7sDNK4zz5zBxO5L0zTXPFIRVF8Pp/3STwNDQAAAAAwYj7xiU/cfffdH/zgB1/xildMTk6Wy+Xvfe97d95552OPPTYI1YGirNpg7N+//2tf+9qtt9564YUXBgKBn/3sZ3feeee///u/94/d54JnePBIGuuvf3FxsVarLduoqmqvJOoVRqvNUwMAAAAAYAQcOHDguuuu++///u9ly/jatn3TTTd9/OMflxWsZ7UG55vf/Oa+ffseeuihYDC4dPuHPvSh/fv3b+CCZ37wSBrZ+WuWZR0/fvyJJ57oc4zf7w8EAtFoNJVKTU1N7dq1a+/evWefffZZZ501PT2dTqdjsVgwGKQ8AgAAAACMto9//OP79+8/9RlQqqouLY+++tWvnn/++X6//ylPecpnP/vZ3nZFUe69994LLrggEAhMTk6+9a1vLRaLazzrxS9+cSQS6U3xOXny5PXXXx+NRvfs2bNv3z5d1/sn/9SnPrV///5l5ZEQolcerXhBdz6a8qTeWWu5+913333OOef4fL5zzjnnM5/5zNJd99xzz549e3w+31Of+tS77757lGa9DV9/ZFmWruuNRqNSqTSbzdUO0zSt0+m4616vdkwikdi1a9fU1FQ6nY5Go4FAgClpAAAAAIAx9NBDD73iFa/of8yDDz541VVX7du3L5/P/+u//uvtt9/+9a9/vbf3tttu+9jHPlYoFB577DHbtt/znves5axbb731jjvuyOVylmW5Wy688MLnP//58/Pz3/ve944dO3brrbf2T/WjH/3oZS97WZ8DVrygO5jIeVL/g5e67777/t//+3/33HNPsVi85557PvShDz3wwAPurv/4j/+44447Pv/5z5dKpX/4h3+44447+icfLgM6/qr3yDPTNJe9WBo4Go1OTU2tdpFWq6Vpms/nG6XCDwAAAACATef1etvt9rL5N7130+478Ve+8pXvfOc7r7jiCnfjj3/84+uvv/6RRx5xj3z00UfPP/98d1cul3vWs55VKBROe9aBAwf6tD/lcvkFL3jB4cOHxeozyFZMfiYX7H/whRde+P73v/+yyy5zj7nvvvv+7u/+zl1i/KKLLtq3b9/rXvc6d9cDDzzw+te/fjBblw2Q3B+5zzvrNUS9nmi1daxdHo/HXZMoGAzG4/FtSwsAAAAAwEjKZrO/+tWvstnsqbt61Ukmk3EroR5N09z374qiWJalqup6z2q320ufXV4qlf7mb/7ma1/72tzcXKfTWXbwig1GJpN5/PHHJyYmVvy61nXBtRycSqUOHz6cTCbdU8rl8tlnn10qldxdR44cSSQSvV2pVGpk+iPJ89c6nc7s7Ozc3Fw+ny+Xy41GQ9d19+9GVVWfzxcOh+PxeDqdnpqa2rlz5549e84555w9e/bs3LlzamqK8ggAAAAAgDP3kpe85Dvf+U7/YxqNRr1ed5ZYOvhjaXm09rOWlkdCiLe97W2maX7jG9+oVCqO4zQajd68ttW8+MUvPnDgwGp713XBDdx9fGztytC5XK5er09MTKxW9HiWcIcUub96PB6WIgIAAAAAYHvccMMN11133atf/epUKrXaMc9//vN/+tOfvvzlL1/Xldd11oEDB44fP97rEE5baQkhrr/++r/8y798zWtes2wJ7Q9/+MN//dd/3eeCHo/Hsqyl5cNa7v7MZz7zwIEDb3jDG9zf/uAHP3jWs57lvn72s5/9wx/+sDd/7cEHH1zDVzw01jr+yLIswzBarVatViuXy/l8fn5+/sSJE8ePH+9/om3bfSajeTyePXv27Nq1a3p6emJiIpFIhMNhv99PeQQAAAAAwLa59NJLr7rqquc///n33HPPE088YRhGvV7/9a9//dGPfrR3zK233nrTTTcdOHCg0Wg0m83vfOc7f/zHf3zaK6/rrPPOO++jH/1oqVSqVCpf/vKX//zP//y01/+jP/qj1772tS972cu+9rWvVatVXdd/9KMfXXbZZe7z1/pc8Kyzzvr2t79t2/a67n7TTTfdcMMN3//+9xuNxve///33vve9N998s7tr3759N9xww8GDB5vN5sGDB2+44YbThh8iv5vsZ1mWZVm95Yfc170tfSbsnXPOOastUO2e6PF4WMEaAAAAAIABd+DAgU996lMPPvhgPp/3+Xy7d+9+1atedc011zznOc9xD/jBD35w6623Pvzww7Ztv+QlL7nlllsuueQSsdJaQku3rP2so0ePvuc97zl48KCu6894xjNuvPHGq666yj2m/3LXX//61z/1qU89/PDD1Wo1nU5feOGF11133SWXXNLngl/5ylduuumm2dlZy7LcLWu8+1133fWxj33s2LFju3fvvvnmm6+99tpejLvvvvuOO+6Ym5vbvXv39ddfv2/fPncdpRGgOI4zOztrGMZpl3RSVbU3s6w36UzTtEAgQD0EAAAAAADQ89BDD1199dWPP/647CCbwyOEcNevEkIoirK0GFr2erWlsAAAAAAAAPDWt7715ptv3rt37y9/+ct3vetdV199texEm8YjhJiamlIURdM0Vh0CAAAAAADYmEsvvfTKK688cuTI7t27r7322ve+972yE22afrMHAQAAAAAAAKakAQAAAAAAoB/6IwAAAAAAAPRDfwQAAAAAAIB+6I8AAAAAAADQD/0RAAAAAAD4nWPHjh0/ftx93Wg0jh496r7udDrFYlEI4TjO4cOHDx8+vOzE3gHLTuxZ8WoYCh7ZAQAAAAAAwKD46le/+otf/KJUKu3Zs+eKK6543/ved9555/n9/te//vUf/ehH8/n8/fdXGRI0AAABpElEQVTf/4tf/OJb3/pWLpfzeDy33367e+Jvf/vb3gHz8/O9E//iL/7CPWDpxqVXk/e1Yh0Ux3FkZwAAAAAAAAOkVqu9+93vfulLX3ruuee+4hWveOMb3/iVr3xFCHHZZZe5jY9t27Ozs7feeuvnPve5pSe6B3z6059edqIQ4tSNvath8DF/DQAAAAAA/I7jOPv27Xv/+9+fz+czmcyKx9x3330f+MAHXvva1x45cuQnP/lJu91eunfpib0D+lwNg4/+CAAAAAAA/M5NN930pje96XnPe96OHTvm5uaEEIqiLDvm8ssv/5d/+ZcvfelLc3Nzv/71r3VdX7p36Ym9A/pcDYNP+9u//VvZGQD8/3bu2ARCGArjeBfJFCELSAbQGaxTOIYLOEaaDJCMkS2yQxCCaOcVBxaHclx1Fv9f+XjfB2+BBwAAAACP4JwLIazrmnO21s7znFLq+14pNU1TSmnbtmVZvPcxRmOMtbZtWyllKeVcGMfxDA7D8F7QWl+2dV3376PxHf+PAAAAAADAteM49n2XUn7Ma61CiKZpfgreteH5Xp3af/dqpvfQAAAAAElFTkSuQmCC
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIxLjAiIGluaXQ9IkZyYW1ld29yayI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5HZW5lcmFsQ2F0YWxvZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+R2VuZXJhbCBDYXRhbG9nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lIFRyYW5zbGF0YWJsZT0iMSI+R2VuZXJhbCBDYXRhbG9nPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkNyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+VGlja2V0PC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjQ29tbWVudDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+UGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5HZW5lcmFsQ2F0YWxvZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlczwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGFiZWwiPkNvbW1lbnQyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjIj5EZWZpbmUgdGhlIGdlbmVyYWwgY2F0YWxvZyBjb21tZW50IDIuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGV4dEFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHMiPjUwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSb3dzIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5QZXJtaXNzaW9uczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+RGVmaW5lIHRoZSBncm91cCB3aXRoIHBlcm1pc3Npb25zLjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQmxvY2siPlBlcm1pc3Npb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsYXNzIj5JVFNNOjpDb25maWdJdGVtOjpDbGFzczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlZktleSI+UGVybWlzc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9Ck0YPQvdC60YbQuNC+0L3QsNC70L3QvtGB0YInOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn0KPQv9GA0LDQstC70LXQvdC40LUg0L3QsCDQvtGB0L3QvtCy0L3QuNGPINC60LDRgtCw0LvQvtCzJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfQlNC+0LHQsNCy0Lgg0LXQu9C10LzQtdC90YIg0LrRitC8INC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfQlNC+0LHQsNCy0Lgg0LrQu9Cw0YEg0LIg0LrQsNGC0LDQu9C+0LPQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn0JrQu9Cw0YHQvtCy0LUg0LIg0LrQsNGC0LDQu9C+0LPQsCc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn0J7RgdC90L7QstC10L0g0LrQsNGC0LDQu9C+0LMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmNzX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjaW9uYWxpdGEnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnU3Byw6F2YSBIbGF2bsOtaG8gS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ1DDuGlkYXQgUG9sb8W4a3UgS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdQw7hpZGF0IFTDuMOtZHUgS2F0YWxvZ3UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ1TDuMOtZHkgS2F0YWxvZ3UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0hsYXZuw60gS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmN0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGl0YXQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGnDsyBkZWwgY2F0w6BsZWcgZ2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnQWZlZ2lyIGFydGljbGUgZGUgY2F0w6BsZWcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZmVnaXIgY2xhc3NlIGRlIGNhdMOgbGVnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzc2UgZGUgY2F0w6FsZWcnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoGxlZyBnZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlbmVyYWwgS2F0YWxvZyBNYW5hZ2VtZW50JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdUaWxmw7hqIGthdGFsb2cgcG9zdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ1RpbGbDuGogS2F0YWxvZyBrbGFzc2UnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2cgS2xhc3NlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdHZW5lcmFsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdMOkdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsLUthdGFsb2ctVmVyd2FsdHVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnS2F0YWxvZy1FaW50cmFnIGhpbnp1ZsO8Z2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnS2F0YWxvZy1LbGFzc2UgaGluenVmw7xnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2ctS2xhc3NlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICdHZW5lcmFsLUthdGFsb2cgZXJzdGVsbGVuIHVuZCB2ZXJ3YWx0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdGcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXIgQWRtaW5HZW5lcmFsQ2F0YWxvZyBLb25maWd1cmF0aW9uIGltIEFkbWluLUJlcmVpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dlbmVyYWwtS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldGVyIGbDvHIgZGVuIEJlaXNwaWVsLUtvbW1lbnRhciAyIGRlciBHZW5lcmFsLUthdGFsb2ctQXR0cmlidXRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXJhbWV0ZXIgZsO8ciBkaWUgenVncmlmZnNiZXJlY2h0aWd0ZSBHcnVwcGUgZGVyIEdlbmVyYWwtS2F0YWxvZy1BdHRyaWJ1dGUuJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIE5hbWUhJ30gPSAnRWluZSBLYXRhbG9nLUtsYXNzZSBiZW7DtnRpZ3QgZWluZW4gTmFtZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uISd9ID0gJ0VpbmUgR2VuZXJhbC1LYXRhbG9nLUtsYXNzZSBiZW7DtnRpZ3QgZWluZSBCZXNjaGVyZWlidW5nISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0thdGFsb2ctS2xhc3NlIGlzdCBlcmZvcmRlcmxpY2guJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnRGVyIE5hbWUgaXN0IGVyZm9yZGVybGljaC4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGlkYWQnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGnDs24gZGVsIENhdMOhbG9nbyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBw7FhZGlyIEVsZW1lbnRvIGFsIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0HDsWFkaXIgQ2xhc2UgYWwgQ2F0w6Fsb2dvJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzZSBkZSBDYXTDoWxvZ28nOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0NhdMOhbG9nbyBHZW5lcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDoW1ldHJvcyBwYXJhIGVsIGVqZW1wbG8gY29tZW50YXJpbyAyIGRlIGxvcyBhdHJpYnV0b3MgZGVsIGNhdMOhbG9nbyBnZW5lcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICdQYXLDoW1ldHJvcyBwYXJhIGxvcyBwZXJtaXNvcyBkZSBlamVtcGxvIGRlIGxvcyBhdHJpYnV0b3MgZGVsIGNhdMOhbG9nbyBnZW5lcmFsLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZhX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9qp2KfYsdqp2LHYr9uMJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9mF2K/bjNix24zYqiDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg24zaqSDZgtmE2YUg2YHZh9ix2LPYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ9in2LbYp9mB2Ycg2qnYsdiv2YYg2qnZhNin2LMg2YHZh9ix2LPYqtuMJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICfZgdmH2LHYs9iqINqp2YTYp9iz24wnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ9iz2KfYrtiqINmIINmF2K/bjNix24zYqiDZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJ9ir2KjYqiDZhdin2pjZiNmEINio2LHYp9uMINm+24zaqdix2KjZhtiv24wg2YHZh9ix2LPYqiDYudmF2YjZhduMINiv2LEg2KjYrti0INmF2K/bjNix24zYqic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICfZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ9m+2KfYsdin2YXYqtix2YfYp9uM24wg2KjYsdin24wg2KrZiNi224zYrSDZhtmF2YjZhtmHINuyINmF2LHYqNmI2Lcg2KjZhyDZiNuM2pjar9uM4oCM2YfYp9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICfZvtin2LHYp9mF2KrYsdmH2KfbjNuMINio2LHYp9uMINqv2LHZiNmH4oCM2YfYp9uMINiv2LPYqtix2LPbjCDZhtmF2YjZhtmHINmF2LHYqNmI2Lcg2KjZhyDZiNuM2pjar9uM4oCM2YfYp9uMINmB2YfYsdiz2Kog2LnZhdmI2YXbjCc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0ZvbmN0aW9ubmFsaXTDqSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0aW9uIGR1IENhdGFsb2d1ZSBHw6luw6lyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0Fqb3V0ZXIgdW4gRWxlbWVudCBhdSBDYXRhbG9ndWUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBam91dGVyIHVuZSBDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdDbGFzc2UgZGUgQ2F0YWxvZ3VlJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXRhbG9ndWUgR8OpbsOpcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bnppb25hbGl0w6AnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbmUgZGVsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZ2dpdW5naSBFbGVtZW50byBhbCBDYXRhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ0FnZ2l1bmdpIENsYXNzZSBhbCBDYXRhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRpIENhdGFsb2dvJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXRhbG9nbyBHZW5lcmFsZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9qYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJyc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfkuIDoiKzjgqvjgr/jg63jgrDnrqHnkIYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ+OCq+OCv+ODreOCsOmgheebruOCkui/veWKoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ID0gJ+OCq+OCv+ODreOCsOOCr+ODqeOCueOCkui/veWKoCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9tc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om1zX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmdzaSc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdLYXRhbG9nIFBlbmd1cnVzYW4gR2VuZXJhbCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gPSAnVGFtYmFoYW4gSXRlbSBLYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnVGFtYmFoIEtlbGFzIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0tlbGFzIEthdGFsb2cnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ0NpcHRhIGRhbiB1cnVzIEthdGFsb2cgR2VuZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdLYXRhbG9nIEdlbmVyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdLZWxhcyBrYXRhbG9nIHBlcmx1IG1lbXB1bnlhaSBuYW1hISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdLZWxhcyBrYXRhbG9nIHBlcmx1IG1lbXB1bnlhaSBwZW5qZWxhc2FuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0tlbGFzIGthdGFsb2cgYWRhbGFoIGRpcGVybHVrYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnTmFtYSBkaXBlcmx1a2FuLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9uYl9OT19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5iX05PX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtzam9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0FkbWluaXN0cmFzam9uIGF2IEdlbmVyZWxsIEthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgSXRlbSd9ID0gJ0xlZ2cgdGlsIGthdGFsb2dvYmpla3QnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdMZWdnIHRpbCBrYXRhbG9nLWtsYXNzZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnS2F0YWxvZy1rbGFzc2UnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGUgYW5kIG1hbmFnZSB0aGUgR2VuZXJhbCBDYXRhbG9nLid9ID0gJ09wcHJldHQgb2cgYWRtaW5pc3Ryw6lyIGRlbiBnZW5lcmVsbGUga2F0YWxvZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdGb3JzaWRlbW9kdWwtcmVnaXN0cmVyaW5nIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nLW9wcHNldHQgaSBhZG1pbi1kZWxlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAnR2VuZXJlbGwgS2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJlIGZvciBla3NlbXBlbGtvbW1lbnRhciAyIGkgYXR0cmlidXR0ZW5lIGZvciBnZW5lcmVsbCBrYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRlcmUgZm9yIHRpbGdhbmdzZ3J1cHBlLWVrc2VtcGVsIGkgYXR0cmlidXR0ZW5lIGZvciBnZW5lcmVsbCBrYXRhbG9nLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBOYW1lISd9ID0gJ0VuIGthdGFsb2drbGFzc2UgbcOlIGhhIGV0IG5hdm4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgZGVzY3JpcHRpb24hJ30gPSAnRW4ga2F0YWxvZy1rbGFzc2UgbcOlIGhhIGVuIGJlc2tyaXZlbHNlISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzIGlzIHJlcXVpcmVkLid9ID0gJ0thdGFsb2drbGFzc2UgZXIgcMOla3JldmQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05hbWUgaXMgcmVxdWlyZWQuJ30gPSAnTmF2biBlciBww6VrcmV2ZC4nOwoKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Om5sX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmN0aW9uYWxpdGVpdCc7CgogICAgIyBUZW1wbGF0ZTogQWRtaW5HZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdDYXRhbG9ndXMgQmVoZWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdDYXRhbG9ndXMtaXRlbSB0b2V2b2VnZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdDYXRhbG9ndXMta2xhc3NlIHRvZXZvZWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2F0YWxvZ3VzIGtsYXNzZSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQWFubWFrZW4gZW4gYmVoZXJlbiB2YW4gaXRlbXMgaW4gZGUgY2F0YWxvZ3VzLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5HZW5lcmFsQ2F0YWxvZyBjb25maWd1cmF0aW9uIGluIHRoZSBhZG1pbiBhcmVhLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0NhdGFsb2d1cyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmtjam9uYWxub8WbxIcnOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnWmFyesSFZHphbmllIGthdGFsb2dpZW0gZ8WCw7N3bnltJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdEb2RhaiBlbGVtZW50IGthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnRG9kYWoga2xhc8SZIGthdGFsb2d1JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MnfSA9ICdLbGFzYSBrYXRhbG9ndSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnVXR3w7NyeiBpIHphcnrEhWR6YWoga2F0YWxvZ2llbSBnxYLDs3dueW0uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdSZWplc3RyYWNqYSBtb2R1xYJ1IGZyb250ZW5kIGRvIGtvbmZpZ3VyYWNqaSBtb2R1xYJ1IEFkbWluR2VuZXJhbENhdGFsb2cgdyBwYW5lbHUgYWRtaW5pc3RyYXRvcmEuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0thdGFsb2cgZ8WCw7N3bnknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcmFtZXRyeSBkbyBwcnp5a8WCYWRvd2VnbyBrb21lbnRhcnphIDIgYXRyeWJ1dMOzdyBrYXRhbG9ndSBnZW5lcmFsbmVnby4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJ5IGRsYSBwcnp5a8WCYWRvd3ljaCBncnVwIHVwcmF3bmllxYQgYXRyeWJ1dMOzdyBrYXRhbG9ndSBnxYLDs3duZWdvLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBOYW1lISd9ID0gJ0tsYXNhIGthdGFsb2d1IHBvd2lubmEgbWllxIcgbmF6d8SZISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdLbGFzYSBrYXRhbG9ndSBwb3dpbm5hIG1pZcSHIG9waXMhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MgaXMgcmVxdWlyZWQuJ30gPSAnS2xhc2Ega2F0YWxvZ3UgamVzdCB3eW1hZ2FuYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZC4nfSA9ICdOYXp3YSBqZXN0IHd5bWFnYW5hLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X0JSX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbGlkYWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlcmVuY2lhbWVudG8gZG8gQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZGljaW9uYXIgSXRlbSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRvIENhdMOhbG9nbyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQ3JpYXIgZSBnZXJlbmNpYXIgbyBDYXTDoWxvZ28gR2VyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdNw7NkdWxvIGRlIHJlZ2lzdG8gZGEgaW50ZXJmYWNlIHBhcmEgYSBjb25maWd1cmHDp8OjbyBBZG1pbkdlbmVyYWxDYXRhbG9nIG5hIMOhcmVhIGFkbWluaXN0cmF0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoWxvZ28gR2VyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcsOibWV0cm9zIHBhcmEgbyBjb21lbnTDoXJpbyBkZSBleGVtcGxvIDIgZG9zIGF0cmlidXRvcyBkbyBjYXTDoWxvZ28gZ2VyYWwuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJ1BhcsOibWV0cm9zIHBhcmEgb3MgZ3J1cG9zIGRlIHBlcm1pc3PDo28gZGUgZXhlbXBsbyBkb3MgYXRyaWJ1dG9zIGRvIGNhdMOhbG9nbyBnZXJhbC4nOwoKICAgICMKICAgICMgT0JTT0xFVEUgRU5UUklFUyBGT1IgUkVGRVJFTkNFLCBETyBOT1QgVFJBTlNMQVRFIQogICAgIwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQSBDYXRhbG9nIENsYXNzIHNob3VsZCBoYXZlIGEgTmFtZSEnfSA9ICdVbWEgQ2xhc3NlIGRlIENhdMOhbG9nbyBkZXZlIHRlciB1bSBub21lISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBkZXNjcmlwdGlvbiEnfSA9ICdVbWEgQ2xhc3NlIGRlIENhdMOhbG9nbyBkZXZlIHRlciB1bWEgZGVzY3Jpw6fDo28hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhdGFsb2cgQ2xhc3MgaXMgcmVxdWlyZWQuJ30gPSAnQSBDbGFzc2UgZGUgQ2F0w6Fsb2dvIMOpIG9icmlnYXTDs3JpYS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTmFtZSBpcyByZXF1aXJlZC4nfSA9ICdPIG5vbWUgw6kgb2JyaWdhdMOzcmlvLic7Cgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9QVF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDEyIEZDQ04gLSBSdWkgRnJhbmNpc2NvIDxydWkuZnJhbmNpc2NvQGZjY24ucHQ+CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnB0X1BUX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmNpb25hbEFudGlndWlkYWRlJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3TDo28gZG8gQ2F0w6Fsb2dvIEdlcmFsJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdBZGljaW9uYXIgSXRlbSBhbyBDYXTDoWxvZ28nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICdBZGljaW9uYXIgQ2xhc3NlIGFvIENhdMOhbG9nbyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAnQ2xhc3NlIGRvIENhdMOhbG9nbyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnQ3JpYXIgZSBnZXJpciBvIENhdMOhbG9nbyBHZXJhbC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9ICdNw7NkdWxvIGRlIHJlZ2lzdG8gZGEgaW50ZXJmYWNlIHBhcmEgYSBjb25maWd1cmHDp8OjbyBBZG1pbkdlbmVyYWxDYXRhbG9nIG5hIMOhcmVhIGFkbWluaXN0cmF0aXZhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cnfSA9ICdDYXTDoWxvZ28gR2VyYWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgY29tbWVudCAyIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9ICdQYXLDom1ldHJvcyBwYXJhIG8gY29tZW50w6FyaW8gZGUgZXhlbXBsbyAyIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBwZXJtaXNzaW9uIGdyb3VwcyBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPSAnUGFyw6JtZXRyb3MgcGFyYSBvcyBncnVwb3MgZGUgcGVybWlzc8OjbyBkZSBleGVtcGxvIGRvcyBhdHJpYnV0b3MgZG8gY2F0w6Fsb2dvIGdlcmFsLic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBIENhdGFsb2cgQ2xhc3Mgc2hvdWxkIGhhdmUgYSBOYW1lISd9ID0gJ1VtYSBDbGFzc2UgZGUgQ2F0w6Fsb2dvIGRldmUgdGVyIHVtIG5vbWUhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgQ2F0YWxvZyBDbGFzcyBzaG91bGQgaGF2ZSBhIGRlc2NyaXB0aW9uISd9ID0gJ1VtYSBDbGFzc2UgZGUgQ2F0w6Fsb2dvIGRldmUgdGVyIHVtYSBkZXNjcmnDp8OjbyEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyBpcyByZXF1aXJlZC4nfSA9ICdBIENsYXNzZSBkZSBDYXTDoWxvZ28gw6kgb2JyaWdhdMOzcmlhLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOYW1lIGlzIHJlcXVpcmVkLid9ID0gJ08gbm9tZSDDqSBvYnJpZ2F0w7NyaW8uJzsKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDEzIFl1cml5IEtvbGVzbmlrb3YgPHlua29sZXNuaWtvdiBhdCBnbWFpbC5jb20+CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnJ1X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ9Ck0YPQvdC60YbQuNC+0L3QsNC70YzQvdC+0YHRgtGMJzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Cj0L/RgNCw0LLQu9C10L3QuNC1INCe0LHRidC40Lwg0LrQsNGC0LDQu9C+0LPQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDRjdC70LXQvNC10L3RgtCwINC60LDRgtCw0LvQvtCz0LAnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfQlNC+0LHQsNCy0LvQtdC90LjQtSDQutC70LDRgdGB0LAg0LrQsNGC0LDQu9C+0LPQsCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYXRhbG9nIENsYXNzJ30gPSAn0JrQu9Cw0YHRgSDQutCw0YLQsNC70L7Qs9CwJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIGFuZCBtYW5hZ2UgdGhlIEdlbmVyYWwgQ2F0YWxvZy4nfSA9ICfQodC+0LfQtNCw0L3QuNC1INC4INGD0L/RgNCw0LLQu9C10L3QuNC1INCe0LHRidC40Lwg0LrQsNGC0LDQu9C+0LPQvtC8JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICdNb2R1bGUgcmVnaXN0cmF0aW9uINC00LvRjyDQutC+0L3RhNC40LPRg9GA0LDRhtC40LggQWRtaW5HZW5lcmFsQ2F0YWxvZyDQsiDQv9Cw0L3QtdC70Lgg0LDQtNC80LjQvdC40YHRgtGA0LDRgtC+0YDQsC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn0J7QsdGJ0LjQuSDQutCw0YLQsNC70L7Qsyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAn0JTQvtCx0LDQstC70LXQvdC40LUg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90L7Qs9C+INC60L7QvNC80LXQvdGC0LDRgNC40Y8g0Log0LDRgtGA0LjQsdGD0YLQsNC8INCe0LHRidC10LPQviDQutCw0YLQsNC70L7Qs9CwJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIHRoZSBnZW5lcmFsIGNhdGFsb2cgYXR0cmlidXRlcy4nfSA9CiAgICAgICAgJyc7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9zdl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnN2X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBQUFHZW5lcmFsQ2F0YWxvZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnVuY3Rpb25hbGl0eSd9ID0gJ0Z1bmt0aW9uYWxpdGV0JzsKCiAgICAjIFRlbXBsYXRlOiBBZG1pbkdlbmVyYWxDYXRhbG9nCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0hhbnRlcmEgZ3J1bmRrYXRhbG9nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICdMw6RnZyB0aWxsIGthdGFsb2dwb3N0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIENsYXNzJ30gPSAnTMOkZ2cgdGlsbCBrbGFzcyBpIGthdGFsb2cnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ0thdGFsb2drbGFzcyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAnU2thcGEgb2NoIGhhbnRlcmEgZ3J1bmRrYXRhbG9nZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS4nfSA9CiAgICAgICAgJ1JlZ2lzdHJlcmluZyBhdiBmcm9udGVuZG1vZHVsIGbDtnIgQWRtaW5HZW5lcmFsQ2F0YWxvZy1pbnN0w6RsbG5pbmdhciBpIGFkbWluYXJlYW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyd9ID0gJ0dydW5ka2F0YWxvZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJhciBmw7ZyIGV4ZW1wZWxrb21tZW50YXIgMiBpIGF0dHJpYnV0ZW4gZsO2ciBncnVuZGthdGFsb2dlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnUGFyYW1ldHJhciBmw7ZyIGV4ZW1wZWwgcMOlIGJlaMO2cmlnaGV0c2VncnVwcGVyIGkgZ3J1bmRrYXRhbG9nZW5zIGF0dHJpYnV0Lic7CgogICAgIwogICAgIyBPQlNPTEVURSBFTlRSSUVTIEZPUiBSRUZFUkVOQ0UsIERPIE5PVCBUUkFOU0xBVEUhCiAgICAjCgp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBDb3B5cmlnaHQgKEMpIDIwMTMgTWljaGFlbCBTaGkgPG1pY3NoaSBhdCAxNjMuY29tPgojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICflip/og70nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn55uu5b2V566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfmt7vliqDnm67lvZXpobnnm64nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfmt7vliqDmlrDnm67lvZXnsbsnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ+ebruW9leexuyc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAn5Yib5bu65ZKM566h55CG55uu5b2VJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn55uu5b2VJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9UV19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRyYW5zbGF0aW9uIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBDb3B5cmlnaHQgKEMpIDIwMTMgTWljaGFlbCBTaGkgPG1pY3NoaSBhdCAxNjMuY29tPgojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9UV19HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBUZW1wbGF0ZTogQUFBR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Z1bmN0aW9uYWxpdHknfSA9ICflip/og70nOwoKICAgICMgVGVtcGxhdGU6IEFkbWluR2VuZXJhbENhdGFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn55uu6YyE566h55CGJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FkZCBDYXRhbG9nIEl0ZW0nfSA9ICfmt7vliqDnm67pjITpoIXnm64nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSA9ICfmt7vliqDmlrDnm67pjITpoZ7liKUnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2F0YWxvZyBDbGFzcyd9ID0gJ+ebrumMhOmhnuWIpSc7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBhbmQgbWFuYWdlIHRoZSBHZW5lcmFsIENhdGFsb2cuJ30gPSAn5Ym15bu65ZKM566h55CG55uu6YyEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBBZG1pbkdlbmVyYWxDYXRhbG9nIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGFkbWluIGFyZWEuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnR2VuZXJhbCBDYXRhbG9nJ30gPSAn55uu6YyEJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIGNvbW1lbnQgMiBvZiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGFyYW1ldGVycyBmb3IgdGhlIGV4YW1wbGUgcGVybWlzc2lvbiBncm91cHMgb2YgdGhlIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLid9ID0KICAgICAgICAnJzsKCiAgICAjCiAgICAjIE9CU09MRVRFIEVOVFJJRVMgRk9SIFJFRkVSRU5DRSwgRE8gTk9UIFRSQU5TTEFURSEKICAgICMKCn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KENvbmZpZ09iamVjdCBQYXJhbU9iamVjdCBMb2dPYmplY3QgTGF5b3V0T2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBsaXN0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUxpc3QnICkgewogICAgICAgIG15ICRDbGFzcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApIHx8ICcnOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBjbGFzcwogICAgICAgIGlmICggISRDbGFzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXZhaWxhYmlsaXR5IGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGl0ZW0gbGlzdAogICAgICAgIG15ICRJdGVtSURMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGxpc3QKICAgICAgICBpZiAoICEkSXRlbUlETGlzdCB8fCAhJXskSXRlbUlETGlzdH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQgeyAkSXRlbUlETGlzdC0+eyRhfSBjbXAgJEl0ZW1JRExpc3QtPnskYn0gfSBrZXlzICV7JEl0ZW1JRExpc3R9ICkgewoKICAgICAgICAgICAgIyBnZXQgaXRlbSBkYXRhCiAgICAgICAgICAgIG15ICRJdGVtRGF0YSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBvdmVydmlldyBpdGVtIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SXRlbUxpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskSXRlbURhdGF9LAogICAgICAgICAgICAgICAgICAgIFZhbGlkID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZEl0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIEFjdGlvbk92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjYXRhbG9nIGl0ZW0gZWRpdAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0l0ZW1FZGl0JyApIHsKICAgICAgICBteSAlSXRlbURhdGE7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgICRJdGVtRGF0YXtJdGVtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiSXRlbUlEIiApOwoKICAgICAgICAjIGFkZCBhIG5ldyBjYXRhbG9nIGl0ZW0KICAgICAgICBpZiAoICRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnICkgewoKICAgICAgICAgICAgIyBnZXQgY2xhc3MKICAgICAgICAgICAgJEl0ZW1EYXRhe0NsYXNzfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkNsYXNzIiApOwoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldwogICAgICAgICAgICBpZiAoICEkSXRlbURhdGF7Q2xhc3N9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGVkaXQgYW4gZXhpc3RpbmcgY2F0YWxvZyBpdGVtCiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICBpZiAoICEkSXRlbURhdGFSZWYgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAlSXRlbURhdGEgPSAleyRJdGVtRGF0YVJlZn07CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgVmFsaWRPcHRpb25TdHJnCiAgICAgICAgbXkgJVZhbGlkTGlzdCAgICAgICAgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICAgICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICAgICAgbXkgJFZhbGlkT3B0aW9uU3RyZyAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdWYWxpZElEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVZhbGlkTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkSXRlbURhdGF7VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFZhbGlkT3B0aW9uU3RyZyA9PiAkVmFsaWRPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBlYWNoIHByZWZlcmVuY2VzIHNldHRpbmcKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAoKTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CgogICAgICAgIElURU06CiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKCiAgICAgICAgICAgICMgc2tpcCBpdGVtcyB0aGF0IGRvbid0IGJlbG9uZyB0byB0aGUgY2xhc3MKICAgICAgICAgICAgaWYgKCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57Q2xhc3N9ICYmICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30gbmUgJEl0ZW1EYXRhe0NsYXNzfSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaW5kIG91dHB1dCBtb2R1bGUKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljJzsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjcmVhdGUgb2JqZWN0IGZvciB0aGlzIHByZWZlcmVuY2VzIGl0ZW0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2hvdyBhbGwgcGFyYW1ldGVycwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIEdlbmVyYWxDYXRhbG9nRGF0YSA9PiB7ICVJdGVtRGF0YSwgJVBhcmFtIH0gKTsKICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgcmVmKCAkUGFyYW1JdGVtLT57RGF0YX0gKSBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICAgICB8fCByZWYoICRQcmVmZXJlbmNlc3skSXRlbX0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW1JdGVtLT57J09wdGlvbid9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbUl0ZW0tPntCbG9ja30gfHwgJFByZWZlcmVuY2VzeyRJdGVtfS0+e0Jsb2NrfSB8fCAnT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJXsgJFByZWZlcmVuY2VzeyRJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAjIG91dHB1dCBJdGVtRWRpdENsYXNzQWRkCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzQWRkJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NFeGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUVkaXRDbGFzc0V4aXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRJdGVtRGF0YXtDbGFzc30sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBBY3Rpb25PdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIFZhbGlkSUQgQ29tbWVudCkpIHsKICAgICAgICAgICAgJEl0ZW1EYXRheyRQYXJhbX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApIHx8ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmFtZSBwYXJhbSwgbmFtZSBtdXN0IGJlIG5vdCBlbXB0eSwgYnV0IG51bWJlciB6ZXJvICgwKSBpcyBhbGxvd2VkCiAgICAgICAgJEl0ZW1EYXRhe05hbWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmFtZScgKTsKCiAgICAgICAgIyBjaGVjayBjbGFzcwogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHRvIGRhdGFiYXNlCiAgICAgICAgbXkgJFN1Y2Nlc3M7CiAgICAgICAgbXkgJEl0ZW1JRCA9ICRJdGVtRGF0YXtJdGVtSUR9OwogICAgICAgIGlmICggJEl0ZW1EYXRhe0l0ZW1JRH0gZXEgJ05FVycgKSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICAgICAlSXRlbURhdGEsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkSXRlbUlEID0gJFN1Y2Nlc3M7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJEdDRGF0YSAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoIEl0ZW1JRCA9PiAkSXRlbUlEICk7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gKCk7CiAgICAgICAgbXkgJE5vdGUgICAgICAgID0gJyc7CgogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVQcmVmZXJlbmNlcyApIHsKICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skSXRlbX0tPntNb2R1bGV9CiAgICAgICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljJzsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEl0ZW19LAogICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKCBHZW5lcmFsQ2F0YWxvZ0RhdGEgPT4gJEdDRGF0YSApOwogICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtID0gKCk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJFBhcmFtSXRlbS0+e05hbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbUlEICAgPT4gJEdDRGF0YS0+e0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdCB0byBvdmVydmlldyBjbGFzcyBsaXN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1JdGVtTGlzdDtDbGFzcz0kSXRlbURhdGF7Q2xhc3N9IgogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3MnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwoKICAgICAgICBmb3IgbXkgJENsYXNzICggQHskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3NMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEFjdGlvbkFkZENsYXNzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWN0aW9uQWRkQ2xhc3MnLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlciBhbmQgbmF2YmFyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBjcmVhdGUgb3V0cHV0IHN0cmluZwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5HZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIGZvb3RlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQKICAgICAgICBQYXJhbU9iamVjdCBDb25maWdJdGVtIEdlbmVyYWxDYXRhbG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBkaWUgIkdvdCBubyAkT2JqZWN0ISIgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApOwogICAgfQoKICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUGFyYW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAUGFyYW1zID0gKCk7CiAgICBteSAkR2V0UGFyYW0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSApOwoKICAgIGlmICggIWRlZmluZWQoJEdldFBhcmFtKSApIHsKICAgICAgICAkR2V0UGFyYW0KICAgICAgICAgICAgPSBkZWZpbmVkKCAkUGFyYW17R2VuZXJhbENhdGFsb2dEYXRhfS0+eyAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gfSApCiAgICAgICAgICAgID8gJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0KICAgICAgICAgICAgOiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57RGF0YVNlbGVjdGVkfTsKICAgIH0KCiAgICBpZiAoICEoIGRlZmluZWQgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSAmJiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9ICkgKSB7CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSA9ICdUZXh0JzsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gZXEgJ1Blcm1pc3Npb24nICkgewogICAgICAgICRQYXJhbXtEYXRhfSAgICAgICAgID0geyAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICkgfTsKICAgICAgICAkUGFyYW17UG9zc2libGVOb25lfSA9IDE7CiAgICAgICAgJFBhcmFte0Jsb2NrfSAgICAgICAgPSAnT3B0aW9uJzsKICAgIH0KCiAgICBwdXNoKAogICAgICAgIEBQYXJhbXMsCiAgICAgICAgewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICByZXR1cm4gQFBhcmFtczsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtHZXRQYXJhbX0gfSApIHsKICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17R2V0UGFyYW19LT57JEtleX0gfTsKICAgICAgICBmb3IgbXkgJFZhbHVlIChAQXJyYXkpIHsKCiAgICAgICAgICAgICMgcHJlZiB1cGRhdGUgZGIKICAgICAgICAgICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkVmFsdWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TWVzc2FnZX0gPSAnUHJlZmVyZW5jZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJzsKICAgIHJldHVybiAxOwp9CgpzdWIgRXJyb3IgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntFcnJvcn0gfHwgJyc7Cn0KCnN1YiBNZXNzYWdlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57TWVzc2FnZX0gfHwgJyc7Cn0KCjE7Cg==
IyAtLQojIEFBQUdlbmVyYWxDYXRhbG9nLmR0bCAtICRUZXh0IHZhcmlhYmxlIGZpbGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIENvbW1vbgokVGV4dHsiRnVuY3Rpb25hbGl0eSJ9Cg==
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTQgT1RSUyBBRywgaHR0cDovL290cnMuY29tLwojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxPiRUZXh0eyJHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJBY3Rpb25zIn08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0nQ29udGVudCc+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZEl0ZW0tLT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSIkUURhdGF7IkNsYXNzIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iQ2FsbEZvckFjdGlvbiBQbHVzIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiRUZXh0eyJBZGQgQ2F0YWxvZyBJdGVtIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS1kdGw6YmxvY2s6QWN0aW9uQWRkSXRlbS0tPgo8IS0tZHRsOmJsb2NrOkFjdGlvbkFkZENsYXNzLS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9Ik5FVyIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3MiIHZhbHVlPSJORVciLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUGx1cyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4kVGV4dHsiQWRkIENhdGFsb2cgQ2xhc3MifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgPC9saT4KPCEtLWR0bDpibG9jazpBY3Rpb25BZGRDbGFzcy0tPgo8IS0tZHRsOmJsb2NrOkFjdGlvbk92ZXJ2aWV3LS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9IiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+JFRleHR7IkdvIHRvIG92ZXJ2aWV3In08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS1kdGw6YmxvY2s6QWN0aW9uT3ZlcnZpZXctLT4KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzcyAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiTGlzdCJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgPHRib2R5Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzTGlzdCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBc0Jsb2NrIiAgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249SXRlbUxpc3Q7Q2xhc3M9JExRRGF0YXsiQ2xhc3MifSI+JFFEYXRheyJDbGFzcyJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0NsYXNzIC0tPgoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdJdGVtIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJMaXN0In08L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CgogICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJEYXRhVGFibGUiPgogICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJXNjBwYyI+JFFEYXRheyJDbGFzcyJ9PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iQ2VudGVyIj4kVGV4dHsiVmFsaWQifTwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1N1YmFjdGlvbj1JdGVtRWRpdDtJdGVtSUQ9JExRRGF0YXsiSXRlbUlEIn0iPiRRRGF0YXsiTmFtZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQ2VudGVyIj4kVGV4dHsiJERhdGF7IlZhbGlkIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpPdmVydmlld0l0ZW0gLS0+Cgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiSXRlbSJ9ICRUZXh0eyJFZGl0In06PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBjbGFzcz0iVmFsaWRhdGUiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbVNhdmUiLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSIkUURhdGF7Ikl0ZW1JRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDbGFzc0RzYyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJDbGFzcyIgaWQ9IkNsYXNzRHNjIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIGNsYXNzPSJXNTBwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgbWF4bGVuZ3RoPSIxMDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDbGFzc0RzY0Vycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2xhc3NEc2NTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzQWRkIC0tPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0V4aXN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJOYW1lIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiRUZXh0eyJOYW1lIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiBpZD0iTmFtZSIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQiIG1heGxlbmd0aD0iMTAwIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iJFFEYXRheyJTZWxlY3RlZElEIn0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIxMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIGlkPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBjbGFzcz0iVzUwcGMiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW5wdXQgLS0+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iJFFEYXRheyJOYW1lIn0iIGlkPSIkUURhdGF7Ik5hbWUifSIgcm93cz0iJFFEYXRheyJSb3dzIn0iIGNvbHM9IiRRRGF0YXsiQ29scyJ9Ij4kUURhdGF7IlNlbGVjdGVkSUQifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06PGJyLz48ZW0+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9lbT48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiT3B0aW9uIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3B0aW9uIC0tPgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IiRRRGF0YXsiTmFtZSJ9Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJERhdGF7IktleSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSIkUURhdGF7Ik5hbWUifSIgaWQ9IiRRRGF0YXsiTmFtZSJ9IiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgY2xhc3M9ImZpeGVkIi8+PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiI+JFFEYXRheyJGaWxlbmFtZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7Ik5hbWUifSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiREYXRheyJLZXkifSJ9OiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiBpZD0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIiIGNsYXNzPSJXNTBwYyIvPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpQYXNzd29yZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVmFsaWRJRCI+JFRleHR7IlZhbGlkIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJWYWxpZE9wdGlvblN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iQ29tbWVudCI+JFRleHR7IkNvbW1lbnQifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNvbW1lbnQiIGlkPSJDb21tZW50IiB2YWx1ZT0iJFFEYXRheyJDb21tZW50In0iIGNsYXNzPSJXNTBwYyIgbWF4bGVuZ3RoPSIyMDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iUHJpbWFyeSIgdHlwZT0ic3VibWl0IiBpZD0iU3VibWl0IiB2YWx1ZT0iJFRleHR7IlN1Ym1pdCJ9Ij4kVGV4dHsiU3VibWl0In08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUZXh0eyJvciJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9Ij4kVGV4dHsiQ2FuY2VsIn08L2E+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdCAtLT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDE0IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLmNvbS8KIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2FjaGVJbnRlcm5hbDsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cgLSBnZW5lcmFsIGNhdGFsb2cgbGliCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBnZW5lcmFsIGNhdGFsb2cgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBsb2FkIGdlbmVyYXRvciBwcmVmZXJlbmNlcyBtb2R1bGUKICAgIG15ICRHZW5lcmF0b3JNb2R1bGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzTW9kdWxlJykKICAgICAgICB8fCAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCJzsKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJhdG9yTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fSA9ICRHZW5lcmF0b3JNb2R1bGUtPm5ldyglUGFyYW0pOwogICAgfQoKICAgICMgY3JlYXRlIENhY2hlSW50ZXJuYWwgb2JqZWN0CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWwtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICBUeXBlID0+ICdHZW5lcmFsQ2F0YWxvZycsCiAgICAgICAgVFRMICA9PiA2MCAqIDYwICogMywKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDbGFzc0xpc3QoKQoKcmV0dXJuIGFuIGFycmF5IHJlZmVyZW5jZSBvZiBhbGwgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzZXMKCiAgICBteSAkQXJyYXlSZWYgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzTGlzdCgpOwoKPWN1dAoKc3ViIENsYXNzTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVChnZW5lcmFsX2NhdGFsb2dfY2xhc3MpICcKICAgICAgICAgICAgLiAnRlJPTSBnZW5lcmFsX2NhdGFsb2cgT1JERVIgQlkgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ2xhc3NMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBDbGFzc0xpc3QsICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICBteSAkQ2FjaGVLZXkgPSAnQ2xhc3NMaXN0JzsKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBDbGFzc0xpc3QsCiAgICApOwoKICAgIHJldHVybiBcQENsYXNzTGlzdDsKfQoKPWl0ZW0gQ2xhc3NSZW5hbWUoKQoKcmVuYW1lIGEgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCgogICAgbXkgJFRydWUgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICdJVFNNOjpDb25maWdJdGVtOjpTdGF0ZScsCiAgICAgICAgQ2xhc3NOZXcgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKPWN1dAoKc3ViIENsYXNzUmVuYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzT2xkIENsYXNzTmV3KSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc09sZCBDbGFzc05ldykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAkUGFyYW17Q2xhc3NOZXd9IGVxICRQYXJhbXtDbGFzc09sZH07CgogICAgIyBjaGVjayBpZiBuZXcgY2xhc3MgbmFtZSBhbHJlYWR5IGV4aXN0cwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q2xhc3NOZXd9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQWxyZWFkeUV4aXN0cyA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBbHJlYWR5RXhpc3RzID0gMTsKICAgIH0KCiAgICBpZiAoJEFscmVhZHlFeGlzdHMpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHJlbmFtZSBjbGFzcyAkUGFyYW17Q2xhc3NPbGR9ISBOZXcgY2xhc3NuYW1lIGFscmVhZHkgZXhpc3RzLiIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgIyByZW5hbWUgZ2VuZXJhbCBjYXRhbG9nIGNsYXNzCiAgICByZXR1cm4gJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnVVBEQVRFIGdlbmVyYWxfY2F0YWxvZyBTRVQgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyAnCiAgICAgICAgICAgIC4gJ1dIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NsYXNzTmV3fSwgXCRQYXJhbXtDbGFzc09sZH0gXSwKICAgICk7Cn0KCj1pdGVtIEl0ZW1MaXN0KCkKCnJldHVybnMgYSBsaXN0IGFzIGEgaGFzaCByZWZlcmVuY2Ugb2Ygb25lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRIYXNoUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBWYWxpZCAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKICAgICAgICBQcmVmZXJlbmNlcyAgID0+IHsgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IHt9CiAgICAgICAgICAgIFBlcm1pc3Npb24gPT4gMiwgICAgICAgICAgICAgICAgICAgICAjIG9yIHdoYXRldmVyIHByZWZlcmVuY2VzIGNhbiBiZSB1c2VkCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ2xhc3MhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkUGFyYW17VmFsaWR9ID0gMTsKICAgIH0KCiAgICBteSAkUHJlZmVyZW5jZXNDYWNoZUtleSA9ICcnOwogICAgbXkgJFByZWZlcmVuY2VzVGFibGUgICAgPSAnJzsKICAgIG15ICRQcmVmZXJlbmNlc1doZXJlICAgID0gJyc7CiAgICBteSBAUHJlZmVyZW5jZXNCaW5kOwoKICAgICMgaGFuZGxlIGdpdmVuIHByZWZlcmVuY2VzCiAgICBpZiAoIGV4aXN0cyAkUGFyYW17UHJlZmVyZW5jZXN9ICYmIHJlZiAkUGFyYW17UHJlZmVyZW5jZXN9IGVxICdIQVNIJyApIHsKCiAgICAgICAgJFByZWZlcmVuY2VzVGFibGUgPSAnLCBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMnOwogICAgICAgIG15IEBXaGVyZXM7CgogICAgICAgICMgYWRkIGFsbCBwcmVmZXJlbmNlcyBnaXZlbiB0byB3aGVyZS1jbGF1c2UKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkUGFyYW17UHJlZmVyZW5jZXN9IH0gKSB7CgogICAgICAgICAgICBpZiAoIHJlZiggJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9ICkgbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSA9IFsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFdoZXJlcywgJyhwcmVmX2tleSA9ID8gQU5EIHByZWZfdmFsdWUgSU4gKCcKICAgICAgICAgICAgICAgIC4gam9pbiggJywgJywgbWFwIHsnPyd9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9ICkKICAgICAgICAgICAgICAgIC4gJykpJzsKCiAgICAgICAgICAgIHB1c2ggQFByZWZlcmVuY2VzQmluZCwgXCRLZXksIG1hcCB7IFwkXyB9IEB7ICRQYXJhbXtQcmVmZXJlbmNlc30tPnskS2V5fSB9OwoKICAgICAgICAgICAgIyBhZGQgZnVuY3Rpb25hbGl0eSBsaXN0IHRvIGNhY2hlIGtleQogICAgICAgICAgICAkUHJlZmVyZW5jZXNDYWNoZUtleSAuPSAnIyMjIycgaWYgJFByZWZlcmVuY2VzQ2FjaGVLZXk7CiAgICAgICAgICAgICRQcmVmZXJlbmNlc0NhY2hlS2V5IC49IGpvaW4gcXsjIyMjfSwgJEtleSwgbWFwIHskX30gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH07CiAgICAgICAgfQoKICAgICAgICAkUHJlZmVyZW5jZXNXaGVyZQogICAgICAgICAgICA9ICdBTkQgZ2VuZXJhbF9jYXRhbG9nLmlkID0gZ2VuZXJhbF9jYXRhbG9nX3ByZWZlcmVuY2VzLmdlbmVyYWxfY2F0YWxvZ19pZCc7CiAgICAgICAgJFByZWZlcmVuY2VzV2hlcmUgLj0gJyBBTkQgJyAuIGpvaW4gJyBBTkQgJywgQFdoZXJlczsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIGdlbmVyYWxfY2F0YWxvZyAkUHJlZmVyZW5jZXNUYWJsZSAiCiAgICAgICAgLiAiV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyAkUHJlZmVyZW5jZXNXaGVyZSAiOwogICAgbXkgQEJJTkQgPSAoIFwkUGFyYW17Q2xhc3N9LCBAUHJlZmVyZW5jZXNCaW5kICk7CgogICAgIyBhZGQgdmFsaWQgc3RyaW5nIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgdmFsaWRfaWQgPSAxICc7CiAgICB9CgogICAgIyBjcmVhdGUgY2FjaGUga2V5CiAgICBteSAkQ2FjaGVLZXkKICAgICAgICA9ICdJdGVtTGlzdDo6JyAuICRQYXJhbXtDbGFzc30gLiAnIyMjIycgLiAkUGFyYW17VmFsaWR9IC4gJyMjIyMnIC4gJFByZWZlcmVuY2VzQ2FjaGVLZXk7CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgIG15ICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkdldCggS2V5ID0+ICRDYWNoZUtleSApOwogICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQklORCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICElRGF0YSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNsYXNzICRQYXJhbXtDbGFzc30gbm90IGZvdW5kIGluIGRhdGFiYXNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICk7CgogICAgcmV0dXJuIFwlRGF0YTsKfQoKPWl0ZW0gSXRlbUdldCgpCgpnZXQgaXRlbSBhdHRyaWJ1dGVzCgogICAgbXkgJEl0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgIEl0ZW1JRCA9PiAzLAogICAgKTsKCiAgICBvcgoKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgTmFtZSAgPT4gJ1VuZGVycGlubmluZyBDb250cmFjdCcsCiAgICApOwoKcmV0dXJucwoKICAgIG15ICRJdGVtID0gewogICAgICAgICdJdGVtSUQnICAgICA9PiAnMjMnLAogICAgICAgICdDbGFzcycgICAgICA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgJ05hbWUnICAgICAgID0+ICdVbmRlcnBpbm5pbmcgQ29udHJhY3QnCiAgICAgICAgJ0NvbW1lbnQnICAgID0+ICdTb21lIENvbW1lbnQnLAogICAgICAgICdWYWxpZElEJyAgICA9PiAnMScsCiAgICAgICAgJ0NyZWF0ZVRpbWUnID0+ICcyMDEyLTAxLTEyIDA5OjM2OjI0JywKICAgICAgICAnQ3JlYXRlQnknICAgPT4gJzEnLAogICAgICAgICdDaGFuZ2VUaW1lJyA9PiAnMjAxMi0wMS0xMiAwOTozNjoyNCcsCiAgICAgICAgJ0NoYW5nZUJ5JyAgID0+ICcxJywKICAgIH07Cgo9Y3V0CgpzdWIgSXRlbUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbUlEfSAmJiAoICEkUGFyYW17Q2xhc3N9IHx8ICRQYXJhbXtOYW1lfSBlcSAnJyApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBJdGVtSUQgT1IgQ2xhc3MgYW5kIE5hbWUhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHNxbCBzdHJpbmcKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBnZW5lcmFsX2NhdGFsb2dfY2xhc3MsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgJwogICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgJzsKICAgIG15IEBCSU5EOwoKICAgICMgYWRkIG9wdGlvbnMgdG8gc3FsIHN0cmluZwogICAgaWYgKCAkUGFyYW17Q2xhc3N9ICYmICRQYXJhbXtOYW1lfSBuZSAnJyApIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6Q2xhc3M6OicgLiAkUGFyYW17Q2xhc3N9IC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgIyBhZGQgY2xhc3MgYW5kIG5hbWUgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2dlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JzsKICAgICAgICBwdXNoIEBCSU5ELCAoIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9ICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBpZiByZXN1bHQgaXMgYWxyZWFkeSBjYWNoZWQKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnSXRlbUdldDo6SXRlbUlEOjonIC4gJFBhcmFte0l0ZW1JRH07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgYWRkIGl0ZW0gaWQgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2lkID0gPyc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtJdGVtSUR9OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQklORCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVJdGVtRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gICAgID0gJFJvd1swXTsKICAgICAgICAkSXRlbURhdGF7Q2xhc3N9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRJdGVtRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJEl0ZW1EYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1szXTsKICAgICAgICAkSXRlbURhdGF7Q29tbWVudH0gICAgPSAkUm93WzRdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s2XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzddOwogICAgICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOF07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICEkSXRlbURhdGF7SXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0l0ZW0gbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCggSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9ICk7CgogICAgIyBtZXJnZSBoYXNoCiAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgJUl0ZW1EYXRhID0gKCAlSXRlbURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpDbGFzczo6JyAuICRJdGVtRGF0YXtDbGFzc30gLiAnOjonIC4gJEl0ZW1EYXRhe05hbWV9LAogICAgICAgIFZhbHVlID0+IFwlSXRlbURhdGEsCiAgICApOwogICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdJdGVtR2V0OjpJdGVtSUQ6OicgLiAkSXRlbURhdGF7SXRlbUlEfSwKICAgICAgICBWYWx1ZSA9PiBcJUl0ZW1EYXRhLAogICAgKTsKCiAgICByZXR1cm4gXCVJdGVtRGF0YTsKfQoKPWl0ZW0gSXRlbUFkZCgpCgphZGQgYSBuZXcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkSXRlbUlEID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtQWRkKAogICAgICAgIENsYXNzICAgICAgICAgPT4gJ0lUU006OlNlcnZpY2U6OlR5cGUnLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5hbWUgbXVzdCBiZSBub3QgZW1wdHksIGJ1dCBudW1iZXIgemVybyAoMCkgaXMgYWxsb3dlZAogICAgaWYgKCAkUGFyYW17TmFtZX0gZXEgJycgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE5hbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTm9BZGQ7CiAgICB3aGlsZSAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgaXRlbSwgaWYgaXRlbSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgIyBpbnNlcnQgbmV3IGl0ZW0KICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnKGdlbmVyYWxfY2F0YWxvZ19jbGFzcywgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgaXRlbQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJEl0ZW1JRDsKfQoKPWl0ZW0gSXRlbVVwZGF0ZSgpCgp1cGRhdGUgYW4gZXhpc3RpbmcgZ2VuZXJhbCBjYXRhbG9nIGl0ZW0KCiAgICBteSAkVHJ1ZSA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgICAgICAgID0+IDEyMywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdJdGVtIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgID0+ICdDb21tZW50JywgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVXNlcklEICAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBJdGVtVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEl0ZW1JRCBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuYW1lIG11c3QgYmUgbm90IGVtcHR5LCBidXQgbnVtYmVyIHplcm8gKDApIGlzIGFsbG93ZWQKICAgIGlmICggJFBhcmFte05hbWV9IGVxICcnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBOYW1lISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZXQgZGVmYXVsdCB2YWx1ZXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENvbW1lbnQpKSB7CiAgICAgICAgJFBhcmFteyRBcmd1bWVudH0gfHw9ICcnOwogICAgfQoKICAgICMgY2xlYW51cCBnaXZlbiBwYXJhbXMKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KENsYXNzKSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsU3BhY2VzICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNsYXNzIG9mIGl0ZW0KICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRDbGFzczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENsYXNzID0gJFJvd1swXTsKICAgIH0KCiAgICBpZiAoICEkQ2xhc3MgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgaXRlbSEgR2VuZXJhbCBjYXRhbG9nIGl0ZW0gbm90IGZvdW5kIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGZpbmQgZXhpdGluZyBpdGVtIHdpdGggc2FtZSBuYW1lCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGlkIEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gQU5EIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkQ2xhc3MsIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRVcGRhdGUgPSAxOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBpZiAoICRQYXJhbXtJdGVtSUR9IG5lICRSb3dbMF0gKSB7CiAgICAgICAgICAgICRVcGRhdGUgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkVXBkYXRlICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5DbGVhblVwKCk7CgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUICcKICAgICAgICAgICAgLiAnbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoKQoKc2V0IEdlbmVyYWxDYXRhbG9nIHByZWZlcmVuY2VzCgogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgS2V5ICAgID0+ICdVc2VyQ29tbWVudCcsCiAgICAgICAgVmFsdWUgID0+ICdzb21lIGNvbW1lbnQnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkNsZWFuVXAoKTsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoQF8pOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KCkKCmdldCBHZW5lcmFsQ2F0YWxvZyBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRRdWV1ZU9iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KEBfKTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cvUHJlZmVyZW5jZXNEQi5wbSAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREIgLSBzb21lIHByZWZlcmVuY2VzIGZ1bmN0aW9ucyBmb3IgZ2VuZXJhbCBjYXRhbG9nCgo9aGVhZDEgU1lOT1BTSVMKCnNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQjsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEdyb3VwT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIHByZWZlcmVuY2VzIHRhYmxlIGRhdGEKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gICAgICA9ICdnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSAgID0gJ3ByZWZfa2V5JzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZVZhbHVlfSA9ICdwcmVmX3ZhbHVlJzsKICAgICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ICA9ICdnZW5lcmFsX2NhdGFsb2dfaWQnOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgpCgpTZXQgcHJlZmVyZW5jZXMgZm9yIGFuIGl0ZW0KCiAgICAkUHJlZmVyZW5jZXNPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMzQsCiAgICAgICAgS2V5ICAgID0+ICdGdW5jdGlvbmFsaXR5JywKICAgICAgICBWYWx1ZSAgPT4gJ29wZXJhdGlvbmFsJywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSXRlbUlEIEtleSBWYWx1ZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkKCAkUGFyYW17JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZGVsZXRlIG9sZCBkYXRhCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIkRFTEVURSBGUk9NICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gV0hFUkUgIgogICAgICAgICAgICAuICIkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVHY0lEfSA9ID8gQU5EICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUtleX0gPSA/IiwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte0tleX0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBpbnNlcnQgbmV3IGRhdGEKICAgIHJldHVybiAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICJJTlNFUlQgSU5UTyAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9ICgkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVHY0lEfSwgIgogICAgICAgICAgICAuICIgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSwgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9KSAiCiAgICAgICAgICAgIC4gIiBWQUxVRVMgKD8sID8sID8pIiwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtJdGVtSUR9LAogICAgICAgICAgICBcJFBhcmFte0tleX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsdWV9LAogICAgICAgIF0sCiAgICApOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KCkKCkdldCBhbGwgUHJlZmVyZW5jZXMgZm9yIGFuIGl0ZW0KCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkUHJlZmVyZW5jZXNPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcXVldWUgcHJlZmVyZW5jZXMgYXJlIGF2YWlsYWJsZQogICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgcHJlZmVyZW5jZXMKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSwgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ICIKICAgICAgICAgICAgLiAiIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVHY0lEfSA9ID8iLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0l0ZW1JRH0gXSwKICAgICk7CgogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgcmV0dXJuIGRhdGEKICAgIHJldHVybiAlRGF0YTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0dlbmVyYWxDYXRhbG9nJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUdlbmVyYWxDYXRhbG9nLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBjbGFzc2VzCm15IEBDbGFzc1JhbmQ7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgcHVzaCBAQ2xhc3NSYW5kLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgc3RvcmUgb3JpZ2luYWwgZ2VuZXJhbCBjYXRhbG9nIHBlcm1pc3Npb24gcHJlZmVyZW5jZXMgc2V0dGluZwpteSAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnOwppZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpLT57UGVybWlzc2lvbnN9Owp9CgojIGVuYWJsZSBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nIHdpdGggYSBkdW1teSB0cnVlIHZhbHVlCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAxLAopOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIGRlZmluZSBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRJdGVtRGF0YSA9IFsKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW0xJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgPT4gJ1Rlc3RJdGVtMicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtMycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5CiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIEFkZEdldCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTQnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBIZWxsbyA9PiAnV29ybGQnLAogICAgICAgICAgICBDb2xvciA9PiAnUmVkJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ1JlZCcsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIHByZWZlcmVuY2VzIG9mIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSBzZXQKICAgIHsKICAgICAgICBQcmVmZXJlbmNlc1NldCA9PiB7CiAgICAgICAgICAgIEhlbGxvID0+ICdOZXdXb3JsZCcsCiAgICAgICAgICAgIENvbG9yID0+ICdCbHVlJywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgSGVsbG8gPT4gJ05ld1dvcmxkJywKICAgICAgICAgICAgQ29sb3IgPT4gJ0JsdWUnLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdUZXN0SXRlbTVVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gIiBcdCBcbiBcciBVbml0IFRlc3QgOjogVGVzdCBDbGFzcyBcdCBcbiBcciAiIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyIFRlc3QgSXRlbSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3QgSXRlbScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIM+SIM+hIFRlc3QgSXRlbSDGqSDPniAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDPoCDQryBUZXN0IENvbW1lbnQg0awg0aAgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3PCqScgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnz5Igz6EgVGVzdCBJdGVtIMapIM+eJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ8+gINCvIFRlc3QgQ29tbWVudCDRrCDRoCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ID0+ICcgVGVzdCBDb21tZW50INGZINGSIFVQREFURTEgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50INGZINGSIFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChhIHNlY29uZCBpdGVtIHdpdGggRnVuY3Rpb25hbGl0eSAndGVzdDEnKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2V0IGZ1bmN0aW9uYWxpdHkgdG8gJycpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02VVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW1QcmVmZXJlbmNlcycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBUZXN0ICA9PiAnaGVsbG8gd29ybGQnLAogICAgICAgICAgICBHcm91cCA9PiAzMywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICAgICAgUHJlZmVyZW5jZXNHZXQgPT4gewogICAgICAgICAgICBUZXN0ID0+ICdoZWxsbycsCiAgICAgICAgICAgIFNpemUgPT4gMzgsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGFzIGFuIGVtcHR5IG5hbWUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICcnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGFkZGVkLCB0aGUgbnVtYmVyIHplcm8gKDApIGlzIGFsbG93ZWQgYXMgbmFtZQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnMCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJzAnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIHN1Y2Vzc2Z1bGx5ICh1cGRhdGluZyBuYW1lIHRvIG51bWJlciB6ZXJvICgwKSApCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnMCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJzAnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBub3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseQogICAgIyAoZW1wdHkgc3RyaW5nIGFzIG5hbWUgaXMgbm90IGFsbG93ZWQgKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LApdOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIHJ1biBnZW5lcmFsIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCm15ICRUZXN0Q291bnQgPSAxOwpteSAkTGFzdEFkZGVkSXRlbUlEOwpteSAlQWRkZWRJdGVtQ291bnRlcjsKCmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKCiAgICBpZiAoICRJdGVtLT57QWRkfSApIHsKCiAgICAgICAgIyBhZGQgbmV3IGl0ZW0KICAgICAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgICAgICV7ICRJdGVtLT57QWRkfSB9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgYWRkZWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdAogICAgICAgIGlmICggJEl0ZW0tPntBZGRHZXR9ICkgewoKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkSXRlbUlELAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUFkZCgpIC0gSXRlbUtleTogJEl0ZW1JRCIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJEl0ZW1JRCkgewoKICAgICAgICAgICAgICAgICMgc2V0IGxhc3QgaXRlbSBpZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgJExhc3RBZGRlZEl0ZW1JRCA9ICRJdGVtSUQ7CgogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIGFkZGVkIGl0ZW0gY291bnRlcgogICAgICAgICAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7ICRJdGVtLT57QWRkR2V0fS0+e0NsYXNzfSB9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgaXRlbSBkYXRhIHRvIGNoZWNrIHRoZSB2YWx1ZXMgYWZ0ZXIgY3JlYXRpb24gb2YgaXRlbSB1c2luZyBJdGVtSWQgYW5kIFVzZXJJRAogICAgICAgIG15ICRJdGVtR2V0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntBZGR9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgZm9yIG15ICRJdGVtQXR0cmlidXRlICggc29ydCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldC0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRJdGVtQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1HZXQoKSAtIFVzaW5nIEl0ZW1JRCBhbmQgVXNlcklEIC0gJEl0ZW1BdHRyaWJ1dGUgIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0gdXNpbmcgQ2xhc3MgYW5kIE5hbWUKICAgICAgICAkSXRlbUdldCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KAogICAgICAgICAgICBDbGFzcyA9PiAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30sCiAgICAgICAgICAgIE5hbWUgID0+ICRJdGVtLT57QWRkR2V0fS0+e05hbWV9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBzb3J0IGtleXMgJXsgJEl0ZW0tPntBZGRHZXR9IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5JcygKICAgICAgICAgICAgICAgICRJdGVtR2V0LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntBZGRHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gVXNpbmcgQ2xhc3MgYW5kIE5hbWUgLSAkSXRlbUF0dHJpYnV0ZSAiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57VXBkYXRlfSApIHsKCiAgICAgICAgIyBjaGVjayBsYXN0IGl0ZW0gaWQgdmFyYWlibGUKICAgICAgICBpZiAoICEkTGFzdEFkZGVkSXRlbUlEICkgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogTk8gTEFTVCBJVEVNIElEIEdJVkVOIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIHRoZSBpdGVtCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtVXBkYXRlKAogICAgICAgICAgICAleyAkSXRlbS0+e1VwZGF0ZX0gfSwKICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBpdGVtIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBvciBub3QKICAgICAgICBpZiAoICRJdGVtLT57VXBkYXRlR2V0fSApIHsKICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbVVwZGF0ZSgpIC0gSXRlbUtleTogJExhc3RBZGRlZEl0ZW1JRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjZXNzLAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbVVwZGF0ZSgpIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGl0ZW0gZGF0YSB0byBjaGVjayB0aGUgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGUKICAgICAgICBteSAkSXRlbUdldDIgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRMYXN0QWRkZWRJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e1VwZGF0ZX0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIHVwZGF0ZQogICAgICAgIGZvciBteSAkSXRlbUF0dHJpYnV0ZSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e1VwZGF0ZUdldH0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAgICAgJEl0ZW1HZXQyLT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57JEl0ZW1BdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUdldCgpIC0gJEl0ZW1BdHRyaWJ1dGUiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9ICkgewoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkSXRlbS0+e1ByZWZlcmVuY2VzU2V0fSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9LT57JEtleX0sCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc1NldCgpIC0gJEtleSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgcHJlZmVyZW5jZXMKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gKSB7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9IH0gKSB7CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0tPnskS2V5fSBlcSAkUHJlZmVyZW5jZXN7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFByZWZlcmVuY2VzR2V0KCkgLSAkS2V5IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IFByZWZlcmVuY2VzR2V0KCkgLSAkS2V5IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgbWFrZSBwcmVwYXJhdGlvbnMgZm9yIGxhdGVyIHRlc3RzCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCBhcnJheXMKbXkgJUV4aXN0aW5nQ2xhc3Nlc1RtcDsKSVRFTToKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewogICAgbmV4dCBJVEVNIGlmICEkSXRlbS0+e0FkZEdldH0tPntDbGFzc307CiAgICAkRXhpc3RpbmdDbGFzc2VzVG1weyAkSXRlbS0+e0FkZEdldH0tPntDbGFzc30gfSA9IDE7Cn0KbXkgQEV4aXN0aW5nQ2xhc3NlcyA9IHNvcnQga2V5cyAlRXhpc3RpbmdDbGFzc2VzVG1wOwoKbXkgJUV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1wOwpJVEVNOgpmb3IgbXkgJEl0ZW0gKCBAeyRJdGVtRGF0YX0gKSB7CiAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPntGdW5jdGlvbmFsaXR5fSB8fD0gJyc7CiAgICAkRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXB7ICRJdGVtLT57VXBkYXRlR2V0fS0+e0Z1bmN0aW9uYWxpdHl9IH0gPSAxOwp9Cm15IEBFeGlzdGluZ0Z1bmN0aW9uYWxpdGllcyA9IHNvcnQga2V5cyAlRXhpc3RpbmdGdW5jdGlvbmFsaXRpZXNUbXA7CgpteSBATm9uRXhpc3RpbmdDbGFzc2VzID0gKCAnVW5pdFRlc3Q6Ok5vRXhpc3RpbmdDbGFzczEnLCAnVW5pdFRlc3Q6Ok5vRXhpc3RpbmdDbGFzczInICk7CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NMaXN0IHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkQ2xhc3NMaXN0MSA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc0xpc3QoKTsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkQ2xhc3NDb3VudCA9IDA7CiAgICBpZiAoICRDbGFzc0xpc3QxICYmIHJlZiAkQ2xhc3NMaXN0MSBlcSAnQVJSQVknICkgewogICAgICAgICRDbGFzc0NvdW50ID0gZ3JlcCB7ICRfIGVxICRDbGFzcyB9IEB7JENsYXNzTGlzdDF9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkQ2xhc3NDb3VudCwKICAgICAgICAxLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzTGlzdCgpIC0gJENsYXNzIGxpc3RlZCIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChATm9uRXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgJEl0ZW1MaXN0LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSAkQ2xhc3Mgbm90IGV4aXN0cyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIEl0ZW1MaXN0IHRlc3QgMgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBteSAkTGlzdENvdW50ID0gJ05VTEwnOwogICAgaWYgKCBkZWZpbmVkICRJdGVtTGlzdCAmJiByZWYgJEl0ZW1MaXN0IGVxICdIQVNIJyApIHsKICAgICAgICAkTGlzdENvdW50ID0ga2V5cyAleyRJdGVtTGlzdH07CiAgICB9CgogICAgJFNlbGYtPklzKAogICAgICAgICRMaXN0Q291bnQsCiAgICAgICAgJEFkZGVkSXRlbUNvdW50ZXJ7JENsYXNzfSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gJENsYXNzIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCAzIC0gSXRlbSBMaXN0IHdpdGggcHJlZmVyZW5jZXMgKHNpbmdsZSBoYXNoIGVudHJ5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgbXkgJENsYXNzICAgID0gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXTsKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEhlbGxvID0+ICdXb3JsZCcsCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgJExpc3RDb3VudCA9ICdOVUxMJzsKICAgIGlmICggZGVmaW5lZCAkSXRlbUxpc3QgJiYgcmVmICRJdGVtTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgJExpc3RDb3VudCA9IGtleXMgJXskSXRlbUxpc3R9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkTGlzdENvdW50LAogICAgICAgIDEsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSBwcmVmZXJlbmNlcyAoc2luZ2xlIGhhc2ggZW50cnkpIC0gJENsYXNzIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgSXRlbUxpc3QgdGVzdCA0IC0gSXRlbSBMaXN0IHdpdGggcHJlZmVyZW5jZXMgKGFycmF5KQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgp7CgogICAgbXkgJENsYXNzICAgID0gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXTsKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbG9yID0+IFsgJ1JlZCcsICdCbHVlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRMaXN0Q291bnQgPSAnTlVMTCc7CiAgICBpZiAoIGRlZmluZWQgJEl0ZW1MaXN0ICYmIHJlZiAkSXRlbUxpc3QgZXEgJ0hBU0gnICkgewogICAgICAgICRMaXN0Q291bnQgPSBrZXlzICV7JEl0ZW1MaXN0fTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExpc3RDb3VudCwKICAgICAgICAyLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgcHJlZmVyZW5jZXMgKGFycmF5KSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFByZWZlcmVuY2VzIHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkSXRlbUlEID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1BZGQoCiAgICAgICAgQ2xhc3MgICA9PiAkQ2xhc3MsCiAgICAgICAgTmFtZSAgICA9PiAnSXRlbSBQcmVmZXJlbmNlcycsCiAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgS2V5ICAgID0+ICdVbml0VGVzdFByZWYnLAogICAgICAgIFZhbHVlICA9PiAnMScsCiAgICApOwoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBVbml0VGVzdFByZWYgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJEl0ZW1MaXN0LT57JEl0ZW1JRH0sCiAgICAgICAgJ0l0ZW0gUHJlZmVyZW5jZXMnLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1MaXN0KCkgLSBDbGFzcyAkQ2xhc3MgUHJlZmVyZW5jZXMgbWF0Y2giLAogICAgKTsKCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICBLZXkgICAgPT4gJ1VuaXRUZXN0UHJlZicsCiAgICAgICAgVmFsdWUgID0+ICcyJywKICAgICk7CgogICAgJEl0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIFVuaXRUZXN0UHJlZiA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkSXRlbUxpc3QsCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtIENsYXNzICRDbGFzcyBQcmVmZXJlbmNlcyBub3QgbWF0Y2ggYWZ0ZXIgUHJlZmVyZW5jZXNTZXQgQ2hhbmdlIgogICAgKTsKCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICBJdGVtSUQgID0+ICRJdGVtSUQsCiAgICAgICAgTmFtZSAgICA9PiAnSXRlbSBQcmVmZXJlbmNlcycsCiAgICAgICAgVmFsaWRJRCA9PiAyLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgUHJlZmVyZW5jZXMgdGVzdCAyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCj1wb2QKCm15ICVGdW5jdGlvbmFsaXR5TGlzdDE7Cm1hcCB7ICRGdW5jdGlvbmFsaXR5TGlzdDF7JF99ID0gMSB9IEBFeGlzdGluZ0Z1bmN0aW9uYWxpdGllczsKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkRnVuY3Rpb25hbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+RnVuY3Rpb25hbGl0eUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkRnVuY3Rpb25hbGl0eUxpc3QgJiYgcmVmICRGdW5jdGlvbmFsaXR5TGlzdCBlcSAnQVJSQVknLAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkgLSByZXR1cm4gYSBhcnJheSByZWZlcmVuY2UiLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uYWxpdHkgKCBAeyRGdW5jdGlvbmFsaXR5TGlzdH0gKSB7CiAgICAgICAgZGVsZXRlICRGdW5jdGlvbmFsaXR5TGlzdDF7JEZ1bmN0aW9uYWxpdHl9OwogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKJFNlbGYtPlRydWUoCiAgICAha2V5cyAlRnVuY3Rpb25hbGl0eUxpc3QxLAogICAgIlRlc3QgJFRlc3RDb3VudDogRnVuY3Rpb25hbGl0eUxpc3QoKSIsCik7CgokVGVzdENvdW50Kys7Cgo9Y3V0CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAxIChjaGVjayBub3JtYWwgcmVuYW1lKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzLAogICAgICAgIENsYXNzTmV3ID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICk7CgogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gUmVuYW1lIGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIG15ICROZXdJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgaWYgKAogICAgICAgICEkT2xkSXRlbUxpc3QKICAgICAgICB8fCAhJE5ld0l0ZW1MaXN0CiAgICAgICAgfHwgcmVmICRPbGRJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICB8fCByZWYgJE5ld0l0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBJdGVtTGlzdCBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBPTERLRVk6CiAgICBmb3IgbXkgJE9sZEtleSAoIHNvcnQga2V5cyAleyRPbGRJdGVtTGlzdH0gKSB7CgogICAgICAgIGlmICggIWV4aXN0cyAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fSApIHsKICAgICAgICAgICAgJE5ld0l0ZW1MaXN0LT57RmFpbGVkRHVtbXl9ID0gMTsKICAgICAgICAgICAgbmV4dCBPTERLRVk7CiAgICAgICAgfQoKICAgICAgICBuZXh0IE9MREtFWSBpZiAkT2xkSXRlbUxpc3QtPnskT2xkS2V5fSBuZSAkTmV3SXRlbUxpc3QtPnskT2xkS2V5fTsKCiAgICAgICAgZGVsZXRlICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICFrZXlzICV7JE5ld0l0ZW1MaXN0fSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIiwKICAgICk7CgogICAgJFRlc3RDb3VudCsrOwp9CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgQ2xhc3NSZW5hbWUgdGVzdCAyIChjaGVjayBzdHJpbmcgY2xlYW5lciBmdW5jdGlvbikKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcyAuICdSRU5BTUUxJywKICAgICAgICBDbGFzc05ldyA9PiAnICcgLiAkQ2xhc3MgLiAiUkUgTkEgTUUgMiBcbiBcciBcdCAiLAogICAgKTsKCiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+RmFsc2UoCiAgICAgICAgICAgIDEsCiAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkgLSBSZW5hbWUgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgbXkgJE5ld0l0ZW1MaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcyAuICdSRU5BTUUyJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgISRPbGRJdGVtTGlzdAogICAgICAgIHx8ICEkTmV3SXRlbUxpc3QKICAgICAgICB8fCByZWYgJE9sZEl0ZW1MaXN0IG5lICdIQVNIJwogICAgICAgIHx8IHJlZiAkTmV3SXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIEl0ZW1MaXN0IGZhaWxlZCIsCiAgICAgICAgKTsKICAgICAgICBuZXh0IENMQVNTOwogICAgfQoKICAgIE9MREtFWToKICAgIGZvciBteSAkT2xkS2V5ICggc29ydCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGlkZW50aWNhbCBuYW1lIHRlc3QpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gb2xkbmFtZSBhbmQgbmV3bmFtZSBpZGVudGljYWwiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDMgKG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBjbGVhbnVwCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgcmVzdG9yZSBvcmlnaW5hbCBnZW5lcmFsIGNhdGFsb2cgcGVybWlzc2lvbiBwcmVmZXJlbmNlcyBzZXR0aW5nCiRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgS2V5ICAgPT4gJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucycsCiAgICBWYWx1ZSA9PiAkR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1Blcm1pc3Npb25zT3JnLAopOwoKMTsK
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxNCBPVFJTIEFHLCBodHRwOi8vb3Rycy5jb20vCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsgICAgIyMgbm8gY3JpdGljCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgo9aGVhZDEgTkFNRQoKR2VuZXJhbENhdGFsb2cucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6R2VuZXJhbENhdGFsb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgWE1MT2JqZWN0ICAgID0+ICRYTUxPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFhNTE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBDb2RlSW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlSW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVJbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBtaWdyYXRlICdmdW5jdGlvbmFsaXR5JyB0byBleHRlcm5hbCB0YWJsZQogICAgIyB0aGlzIGlzIG9ubHkgbmVjY2VzYXJ5IGluIENvZGVVcGdyYWRlLCBmb3IgbmV3IGluc3RhbGxhdGlvbnMgdGhpcyBpcyBkb25lCiAgICAjIGluIHRoZSBwYWNrYWdlIElUU01Db3JlIGR1cmluZyBDb2RlSW5zdGFsbAogICAgJFNlbGYtPl9NaWdyYXRlRnVuY3Rpb25hbGl0eSgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX01pZ3JhdGVGdW5jdGlvbmFsaXR5KCkKCj1jdXQKCnN1YiBfTWlncmF0ZUZ1bmN0aW9uYWxpdHkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFNFTEVDVCBhbGwgZnVuY3Rpb25hbGl0eSB2YWx1ZXMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBmdW5jdGlvbmFsaXR5IEZST00gZ2VuZXJhbF9jYXRhbG9nJywKICAgICk7CgogICAgbXkgQExpc3Q7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG5leHQgUk9XIGlmICEkUm93WzFdOwoKICAgICAgICBwdXNoIEBMaXN0LCBcQFJvdzsKICAgIH0KCiAgICAjIHNhdmUgZW50cmllcyBpbiBuZXcgdGFibGUKICAgIGZvciBteSAkRW50cnkgKEBMaXN0KSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4KICAgICAgICAgICAgICAgICdJTlNFUlQgSU5UTyBnZW5lcmFsX2NhdGFsb2dfcHJlZmVyZW5jZXMoIGdlbmVyYWxfY2F0YWxvZ19pZCwgcHJlZl9rZXksIHByZWZfdmFsdWUgKScKICAgICAgICAgICAgICAgIC4gJyBWQUxVRVMoID8sIFwnRnVuY3Rpb25hbGl0eVwnLCA/ICknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRFbnRyeS0+WzBdLCBcJEVudHJ5LT5bMV0gXSwKICAgICAgICApOwogICAgfQoKICAgICMgZHJvcCBjb2x1bW4gZnVuY3Rpb25hbGl0eQogICAgbXkgKCREcm9wKSA9ICRTZWxmLT57REJPYmplY3R9LT5TUUxQcm9jZXNzb3IoCiAgICAgICAgRGF0YWJhc2UgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2dlbmVyYWxfY2F0YWxvZycsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnRW5kJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICREcm9wLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQK