IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQppbXBvcnQgdW5pdHRlc3QKaW1wb3J0IHNobGV4Cgpmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoKdHJ5OgogICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCgoKIyBUaGUgb3JpZ2luYWwgdGVzdCBkYXRhIHNldCB3YXMgZnJvbSBzaGVsbHdvcmRzLCBieSBIYXJ0bXV0IEdvZWJlbC4KCmRhdGEgPSByIiIieHx4fApmb28gYmFyfGZvb3xiYXJ8CiBmb28gYmFyfGZvb3xiYXJ8CiBmb28gYmFyIHxmb298YmFyfApmb28gICBiYXIgICAgYmxhICAgICBmYXNlbHxmb298YmFyfGJsYXxmYXNlbHwKeCB5ICB6ICAgICAgICAgICAgICB4eHh4fHh8eXx6fHh4eHh8Clx4IGJhcnxcfHh8YmFyfApcIHggYmFyfFx8eHxiYXJ8ClwgYmFyfFx8YmFyfApmb28gXHggYmFyfGZvb3xcfHh8YmFyfApmb28gXCB4IGJhcnxmb298XHx4fGJhcnwKZm9vIFwgYmFyfGZvb3xcfGJhcnwKZm9vICJiYXIiIGJsYXxmb298ImJhciJ8YmxhfAoiZm9vIiAiYmFyIiAiYmxhInwiZm9vInwiYmFyInwiYmxhInwKImZvbyIgYmFyICJibGEifCJmb28ifGJhcnwiYmxhInwKImZvbyIgYmFyIGJsYXwiZm9vInxiYXJ8YmxhfApmb28gJ2JhcicgYmxhfGZvb3wnYmFyJ3xibGF8Cidmb28nICdiYXInICdibGEnfCdmb28nfCdiYXInfCdibGEnfAonZm9vJyBiYXIgJ2JsYSd8J2Zvbyd8YmFyfCdibGEnfAonZm9vJyBiYXIgYmxhfCdmb28nfGJhcnxibGF8CmJsdXJiIGZvbyJiYXIiYmFyImZhc2VsIiBiYXp8Ymx1cmJ8Zm9vImJhciJiYXIiZmFzZWwifGJhenwKYmx1cmIgZm9vJ2JhcidiYXInZmFzZWwnIGJhenxibHVyYnxmb28nYmFyJ2JhcidmYXNlbCd8YmF6fAoiInwiInwKJyd8Jyd8CmZvbyAiIiBiYXJ8Zm9vfCIifGJhcnwKZm9vICcnIGJhcnxmb298Jyd8YmFyfApmb28gIiIgIiIgIiIgYmFyfGZvb3wiInwiInwiInxiYXJ8CmZvbyAnJyAnJyAnJyBiYXJ8Zm9vfCcnfCcnfCcnfGJhcnwKXCIifFx8IiJ8CiJcInwiXCJ8CiJmb29cIGJhciJ8ImZvb1wgYmFyInwKImZvb1xcIGJhciJ8ImZvb1xcIGJhciJ8CiJmb29cXCBiYXJcInwiZm9vXFwgYmFyXCJ8CiJmb29cXCIgYmFyXCIifCJmb29cXCJ8YmFyfFx8IiJ8CiJmb29cXCBiYXJcIiBkZmFkZiJ8ImZvb1xcIGJhclwifGRmYWRmInwKImZvb1xcXCBiYXJcIiBkZmFkZiJ8ImZvb1xcXCBiYXJcInxkZmFkZiJ8CiJmb29cXFx4IGJhclwiIGRmYWRmInwiZm9vXFxceCBiYXJcInxkZmFkZiJ8CiJmb29ceCBiYXJcIiBkZmFkZiJ8ImZvb1x4IGJhclwifGRmYWRmInwKXCcnfFx8Jyd8Cidmb29cIGJhcid8J2Zvb1wgYmFyJ3wKJ2Zvb1xcIGJhcid8J2Zvb1xcIGJhcid8CiJmb29cXFx4IGJhclwiIGRmJ2FcICdkZid8ImZvb1xcXHggYmFyXCJ8ZGYnYXxcfCdkZid8ClwiZm9vInxcfCJmb28ifApcImZvbyJceHxcfCJmb28ifFx8eHwKImZvb1x4InwiZm9vXHgifAoiZm9vXCAifCJmb29cICJ8CmZvb1wgeHh8Zm9vfFx8eHh8CmZvb1wgeFx4fGZvb3xcfHh8XHx4fApmb29cIHhceFwiInxmb298XHx4fFx8eHxcfCIifAoiZm9vXCB4XHgifCJmb29cIHhceCJ8CiJmb29cIHhceFxcInwiZm9vXCB4XHhcXCJ8CiJmb29cIHhceFxcIiJmb29iYXIifCJmb29cIHhceFxcInwiZm9vYmFyInwKImZvb1wgeFx4XFwiXCcnImZvb2JhciJ8ImZvb1wgeFx4XFwifFx8Jyd8ImZvb2JhciJ8CiJmb29cIHhceFxcIlwnImZvJ29iYXIifCJmb29cIHhceFxcInxcfCciZm8nfG9iYXIifAoiZm9vXCB4XHhcXCJcJyJmbydvYmFyIiAnZG9uJ1wnJ3QnfCJmb29cIHhceFxcInxcfCciZm8nfG9iYXIifCdkb24nfFx8Jyd8dCd8Cidmb29cIGJhcid8J2Zvb1wgYmFyJ3wKJ2Zvb1xcIGJhcid8J2Zvb1xcIGJhcid8CmZvb1wgYmFyfGZvb3xcfGJhcnwKZm9vI2JhclxuYmF6fGZvb2JhenwKOi0pIDstKXw6fC18KXw7fC18KXwK4ent8/p84XzpfO1883z6fAoiIiIKCnBvc2l4X2RhdGEgPSByIiIieHx4fApmb28gYmFyfGZvb3xiYXJ8CiBmb28gYmFyfGZvb3xiYXJ8CiBmb28gYmFyIHxmb298YmFyfApmb28gICBiYXIgICAgYmxhICAgICBmYXNlbHxmb298YmFyfGJsYXxmYXNlbHwKeCB5ICB6ICAgICAgICAgICAgICB4eHh4fHh8eXx6fHh4eHh8Clx4IGJhcnx4fGJhcnwKXCB4IGJhcnwgeHxiYXJ8ClwgYmFyfCBiYXJ8CmZvbyBceCBiYXJ8Zm9vfHh8YmFyfApmb28gXCB4IGJhcnxmb298IHh8YmFyfApmb28gXCBiYXJ8Zm9vfCBiYXJ8CmZvbyAiYmFyIiBibGF8Zm9vfGJhcnxibGF8CiJmb28iICJiYXIiICJibGEifGZvb3xiYXJ8YmxhfAoiZm9vIiBiYXIgImJsYSJ8Zm9vfGJhcnxibGF8CiJmb28iIGJhciBibGF8Zm9vfGJhcnxibGF8CmZvbyAnYmFyJyBibGF8Zm9vfGJhcnxibGF8Cidmb28nICdiYXInICdibGEnfGZvb3xiYXJ8YmxhfAonZm9vJyBiYXIgJ2JsYSd8Zm9vfGJhcnxibGF8Cidmb28nIGJhciBibGF8Zm9vfGJhcnxibGF8CmJsdXJiIGZvbyJiYXIiYmFyImZhc2VsIiBiYXp8Ymx1cmJ8Zm9vYmFyYmFyZmFzZWx8YmF6fApibHVyYiBmb28nYmFyJ2JhcidmYXNlbCcgYmF6fGJsdXJifGZvb2JhcmJhcmZhc2VsfGJhenwKIiJ8fAonJ3x8CmZvbyAiIiBiYXJ8Zm9vfHxiYXJ8CmZvbyAnJyBiYXJ8Zm9vfHxiYXJ8CmZvbyAiIiAiIiAiIiBiYXJ8Zm9vfHx8fGJhcnwKZm9vICcnICcnICcnIGJhcnxmb298fHx8YmFyfApcInwifAoiXCIifCJ8CiJmb29cIGJhciJ8Zm9vXCBiYXJ8CiJmb29cXCBiYXIifGZvb1wgYmFyfAoiZm9vXFwgYmFyXCIifGZvb1wgYmFyInwKImZvb1xcIiBiYXJcInxmb29cfGJhciJ8CiJmb29cXCBiYXJcIiBkZmFkZiJ8Zm9vXCBiYXIiIGRmYWRmfAoiZm9vXFxcIGJhclwiIGRmYWRmInxmb29cXCBiYXIiIGRmYWRmfAoiZm9vXFxceCBiYXJcIiBkZmFkZiJ8Zm9vXFx4IGJhciIgZGZhZGZ8CiJmb29ceCBiYXJcIiBkZmFkZiJ8Zm9vXHggYmFyIiBkZmFkZnwKXCd8J3wKJ2Zvb1wgYmFyJ3xmb29cIGJhcnwKJ2Zvb1xcIGJhcid8Zm9vXFwgYmFyfAoiZm9vXFxceCBiYXJcIiBkZidhXCAnZGYifGZvb1xceCBiYXIiIGRmJ2FcICdkZnwKXCJmb298ImZvb3wKXCJmb29ceHwiZm9veHwKImZvb1x4Inxmb29ceHwKImZvb1wgInxmb29cIHwKZm9vXCB4eHxmb28geHh8CmZvb1wgeFx4fGZvbyB4eHwKZm9vXCB4XHhcInxmb28geHgifAoiZm9vXCB4XHgifGZvb1wgeFx4fAoiZm9vXCB4XHhcXCJ8Zm9vXCB4XHhcfAoiZm9vXCB4XHhcXCIiZm9vYmFyInxmb29cIHhceFxmb29iYXJ8CiJmb29cIHhceFxcIlwnImZvb2JhciJ8Zm9vXCB4XHhcJ2Zvb2JhcnwKImZvb1wgeFx4XFwiXCciZm8nb2JhciJ8Zm9vXCB4XHhcJ2ZvJ29iYXJ8CiJmb29cIHhceFxcIlwnImZvJ29iYXIiICdkb24nXCcndCd8Zm9vXCB4XHhcJ2ZvJ29iYXJ8ZG9uJ3R8CiJmb29cIHhceFxcIlwnImZvJ29iYXIiICdkb24nXCcndCcgXFx8Zm9vXCB4XHhcJ2ZvJ29iYXJ8ZG9uJ3R8XHwKJ2Zvb1wgYmFyJ3xmb29cIGJhcnwKJ2Zvb1xcIGJhcid8Zm9vXFwgYmFyfApmb29cIGJhcnxmb28gYmFyfApmb28jYmFyXG5iYXp8Zm9vfGJhenwKOi0pIDstKXw6LSl8Oy0pfArh6e3z+nzh6e3z+nwKIiIiCgpjbGFzcyBTaGxleFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuZGF0YSA9IFt4LnNwbGl0KCJ8IilbOi0xXQogICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiBkYXRhLnNwbGl0bGluZXMoKV0KICAgICAgICBzZWxmLnBvc2l4X2RhdGEgPSBbeC5zcGxpdCgifCIpWzotMV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gcG9zaXhfZGF0YS5zcGxpdGxpbmVzKCldCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5kYXRhOgogICAgICAgICAgICBpdGVtWzBdID0gaXRlbVswXS5yZXBsYWNlKHIiXG4iLCAiXG4iKQogICAgICAgIGZvciBpdGVtIGluIHNlbGYucG9zaXhfZGF0YToKICAgICAgICAgICAgaXRlbVswXSA9IGl0ZW1bMF0ucmVwbGFjZShyIlxuIiwgIlxuIikKCiAgICBkZWYgc3BsaXRUZXN0KHNlbGYsIGRhdGEsIGNvbW1lbnRzKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZGF0YSkpOgogICAgICAgICAgICBsID0gc2hsZXguc3BsaXQoZGF0YVtpXVswXSwgY29tbWVudHM9Y29tbWVudHMpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgZGF0YVtpXVsxOl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyAhPSAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2ldWzBdLCBsLCBkYXRhW2ldWzE6XSkpCgogICAgZGVmIG9sZFNwbGl0KHNlbGYsIHMpOgogICAgICAgIHJldCA9IFtdCiAgICAgICAgbGV4ID0gc2hsZXguc2hsZXgoU3RyaW5nSU8ocykpCiAgICAgICAgdG9rID0gbGV4LmdldF90b2tlbigpCiAgICAgICAgd2hpbGUgdG9rOgogICAgICAgICAgICByZXQuYXBwZW5kKHRvaykKICAgICAgICAgICAgdG9rID0gbGV4LmdldF90b2tlbigpCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiB0ZXN0U3BsaXRQb3NpeChzZWxmKToKICAgICAgICAiIiJUZXN0IGRhdGEgc3BsaXR0aW5nIHdpdGggcG9zaXggcGFyc2VyIiIiCiAgICAgICAgc2VsZi5zcGxpdFRlc3Qoc2VsZi5wb3NpeF9kYXRhLCBjb21tZW50cz1UcnVlKQoKICAgIGRlZiB0ZXN0Q29tcGF0KHNlbGYpOgogICAgICAgICIiIlRlc3QgY29tcGF0aWJpbGl0eSBpbnRlcmZhY2UiIiIKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5kYXRhKSk6CiAgICAgICAgICAgIGwgPSBzZWxmLm9sZFNwbGl0KHNlbGYuZGF0YVtpXVswXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBzZWxmLmRhdGFbaV1bMTpdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMgIT0gJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5kYXRhW2ldWzBdLCBsLCBzZWxmLmRhdGFbaV1bMTpdKSkKCiMgQWxsb3cgdGhpcyB0ZXN0IHRvIGJlIHVzZWQgd2l0aCBvbGQgc2hsZXgucHkKaWYgbm90IGdldGF0dHIoc2hsZXgsICJzcGxpdCIsIE5vbmUpOgogICAgZm9yIG1ldGhuYW1lIGluIGRpcihTaGxleFRlc3QpOgogICAgICAgIGlmIG1ldGhuYW1lLnN0YXJ0c3dpdGgoInRlc3QiKSBhbmQgbWV0aG5hbWUgIT0gInRlc3RDb21wYXQiOgogICAgICAgICAgICBkZWxhdHRyKFNobGV4VGVzdCwgbWV0aG5hbWUpCgpkZWYgdGVzdF9tYWluKCk6CiAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFNobGV4VGVzdCkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0X21haW4oKQo=