PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XNEMvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CjxodG1sPgo8aGVhZD4KCiAgICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CgogICAgPHRpdGxlPk9wZW5PZmZpY2Uub3JnIENvbmZlcmVuY2UgMjAwNjwvdGl0bGU+CgogICAgPCEtLSBJbmNsdWRlIHRoZSBjb21tb24gQ1NTIHN0eWxlc2hlZXQgLS0+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJkZWZhdWx0LmNzcyIgLz4KICAKICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgLm5vdGUgLm5hbWUgewogICAgICAgICAgICBjb2xvcjogIzAzMjM2MDsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogc21hbGxlcjsKICAgICAgICB9CgogICAgICAgIC5ub3RlIC5uYW1lIGEgewogICAgICAgICAgICBjb2xvcjogIzAzMjM2MDsKICAgICAgICB9CgogICAgICAgIC5ub3RlIC5pbmZvIHsKICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDAuNWVtOwogICAgICAgICAgICBmb250LXNpemU6IHNtYWxsZXI7CiAgICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2NyaXB0IHNyYz0iaHR0cDovL21hcHMuZ29vZ2xlLmNvbS9tYXBzP2ZpbGU9YXBpJmFtcDt2PTImYW1wO2tleT1BQlFJQUFBQWt1elphZnVNOEdHXzRDTUVuVjFUbXhTQ05hWHlmdVpyMFV3ekl4cU9VZzFnT2p3cFloVEtHemtqOEJmZlJ3QnRPNFMwUkFWWXJTd1h6QSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCiAgICAvLzwhW0NEQVRBWwogICAgCiAgICB2YXIgbWFya2VycyA9IG5ldyBPYmplY3QoKTsKICAgIHZhciBtYXA7CgogICAgLy8gQ3JlYXRlIHRoZSAiSG90ZWwiIG1hcmtlciBpY29uCiAgICB2YXIgaG90ZWwgPSBuZXcgR0ljb24oKTsKICAgIGhvdGVsLmltYWdlID0gImltZy9ob3RlbC5naWYiOwogICAgaG90ZWwuaWNvblNpemUgPSBuZXcgR1NpemUoMjAsIDIwKTsKICAgIGhvdGVsLmljb25BbmNob3IgPSBuZXcgR1BvaW50KDEwLCAxMCk7CiAgICBob3RlbC5pbmZvV2luZG93QW5jaG9yID0gbmV3IEdQb2ludCgxMCwgMTApOwogICAgICAgCiAgICAvLyBDcmVhdGUgdGhlICJsb2dvYWoiIG1hcmtlciBpY29uCiAgICB2YXIgbG9nb2FqID0gbmV3IEdJY29uKCk7CiAgICBsb2dvYWouaW1hZ2UgPSAiaW1nL2xvZ29hai5naWYiOwogICAgbG9nb2FqLmljb25TaXplID0gbmV3IEdTaXplKDIwLCAyMCk7CiAgICBsb2dvYWouaWNvbkFuY2hvciA9IG5ldyBHUG9pbnQoMTAsIDEwKTsKICAgIGxvZ29hai5pbmZvV2luZG93QW5jaG9yID0gbmV3IEdQb2ludCgxMCwgMTApOwogICAgICAgIAogICAgLy8gQ3JlYXRlIHRoZSAiUmVzdG8iIG1hcmtlciBpY29uCiAgICB2YXIgcmVzdG8gPSBuZXcgR0ljb24oKTsKICAgIHJlc3RvLmltYWdlID0gImltZy9yZXN0by5naWYiOwogICAgcmVzdG8uaWNvblNpemUgPSBuZXcgR1NpemUoMjAsIDIwKTsKICAgIHJlc3RvLmljb25BbmNob3IgPSBuZXcgR1BvaW50KDEwLCAxMCk7CiAgICByZXN0by5pbmZvV2luZG93QW5jaG9yID0gbmV3IEdQb2ludCgxMCwgMTApOwoKICAgIC8vIERlZmluaXRpb24gb2YgSG90ZWwgTWFya2VyCiAgICBmdW5jdGlvbiBIb3RlbChpZCwgcG9pbnQsIG5hbWUsIGFkZHJlc3MsIGNpdHksIG9wdF9waG9uZSwgb3B0X3VybCwgb3B0X2ljb24pIHsKICAgICAgICBHTWFya2VyLmNhbGwodGhpcywgcG9pbnQsIG9wdF9pY29uIHx8IGhvdGVsKTsKCiAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKICAgICAgICB0aGlzLmNpdHkgPSBjaXR5OwogICAgICAgIHRoaXMucGhvbmUgPSBvcHRfcGhvbmU7CiAgICAgICAgdGhpcy51cmwgPSBvcHRfdXJsOwoKICAgICAgICB0aGlzLmNsaWNraGFuZGxlciA9IEdFdmVudC5hZGRMaXN0ZW5lcih0aGlzLCAnY2xpY2snLCB0aGlzLm9wZW5JbmZvV2luZG93KTsKICAgIH0KCiAgICBIb3RlbC5wcm90b3R5cGUgPSBuZXcgR01hcmtlcihuZXcgR0xhdExuZygwLCAwKSk7CgogICAgSG90ZWwucHJvdG90eXBlLm9wZW5JbmZvV2luZG93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRleHQgPSAnPGRpdiBjbGFzcz0ibm90ZSI+JzsKICAgICAgICB0ZXh0ID0gdGV4dCArICc8cCBjbGFzcz0ibmFtZSI+JzsKCiAgICAgICAgaWYgKHRoaXMudXJsKSB7CiAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgJzxhIGhyZWY9IicgKyB0aGlzLnVybCArICciPic7CiAgICAgICAgfQogICAgICAgIHRleHQgKz0gdGhpcy5uYW1lOwogICAgICAgIGlmICh0aGlzLnVybCkgewogICAgICAgICAgICB0ZXh0ID0gdGV4dCArICc8L2E+JzsKICAgICAgICB9CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPC9wPic7CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPHAgY2xhc3M9ImluZm8iPjxzdHJvbmc+QWRyZXNzZTogPC9zdHJvbmc+JyArIAogICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzICsgJzxiciAvPicgKyB0aGlzLmNpdHkgKyAnPC9wPic7CiAgICAgICAgICAgIAogICAgICAgIGlmICh0aGlzLnBob25lKSB7CiAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgJzxwIGNsYXNzPSJpbmZvIj48c3Ryb25nPlQmZWFjdXRlO2wmZWFjdXRlO2hvbmU6IDwvc3Ryb25nPicgKwogICAgICAgICAgICAgICAgICAgIHRoaXMucGhvbmUgKyAnPC9wPic7CiAgICAgICAgfQogICAgICAgIHRleHQgPSB0ZXh0ICsgJzwvZGl2Pic7CgogICAgICAgIHRoaXMub3BlbkluZm9XaW5kb3dIdG1sKHRleHQpOwogICAgfQogICAgICAgIAogICAgLy8gRGVmaW5pdGlvbiBvZiBSZXN0byBNYXJrZXIKICAgIGZ1bmN0aW9uIFJlc3RvKGlkLCBwb2ludCwgbmFtZSwgZGVzY3JpcHRpb24pIHsKICAgICAgICBHTWFya2VyLmNhbGwodGhpcywgcG9pbnQsIHJlc3RvKTsKCiAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwoKICAgICAgICB0aGlzLmNsaWNraGFuZGxlciA9IEdFdmVudC5hZGRMaXN0ZW5lcih0aGlzLCAnY2xpY2snLCB0aGlzLm9wZW5JbmZvV2luZG93KTsKICAgIH0KCiAgICBSZXN0by5wcm90b3R5cGUgPSBuZXcgR01hcmtlcihuZXcgR0xhdExuZygwLCAwKSk7CgogICAgUmVzdG8ucHJvdG90eXBlLm9wZW5JbmZvV2luZG93ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHRleHQgPSAnPGRpdiBjbGFzcz0ibm90ZSI+JzsKICAgICAgICB0ZXh0ID0gdGV4dCArICc8cCBjbGFzcz0ibmFtZSI+JyArIHRoaXMubmFtZSArICc8L3A+JzsKICAgICAgICB0ZXh0ID0gdGV4dCArICc8cCBjbGFzcz0iaW5mbyI+JyArIHRoaXMuZGVzY3JpcHRpb24gKyAnPC9wPic7CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPC9kaXY+JzsKCiAgICAgICAgdGhpcy5vcGVuSW5mb1dpbmRvd0h0bWwodGV4dCk7CiAgICB9CiAgICAgICAgCiAgICAvLyBDcmVhdGUgdGhlICJQZW9wbGUiIG1hcmtlciBpY29uCiAgICB2YXIgcGVvcGxlID0gbmV3IEdJY29uKCk7CiAgICBwZW9wbGUuaW1hZ2UgPSAiaW1nL3Blb3BsZS5wbmciOwogICAgcGVvcGxlLmljb25TaXplID0gbmV3IEdTaXplKDUwLCA1MCk7CiAgICBwZW9wbGUuaWNvbkFuY2hvciA9IG5ldyBHUG9pbnQoMjUsIDI1KTsKICAgIHBlb3BsZS5pbmZvV2luZG93QW5jaG9yID0gbmV3IEdQb2ludCgyNSwgMjUpOwogICAgICAgIAogICAgLy8gRGVmaW5pdGlvbiBvZiBQZW9wbGUgTWFya2VyCiAgICBmdW5jdGlvbiBQZW9wbGUoaWQsIHBvaW50LCB0aXRsZSwgZGVzY3JpcHRpb24pIHsKICAgICAgICBHTWFya2VyLmNhbGwodGhpcywgcG9pbnQsIHBlb3BsZSk7CgogICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CiAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwoKICAgICAgICB0aGlzLmNsaWNraGFuZGxlciA9IEdFdmVudC5hZGRMaXN0ZW5lcih0aGlzLCAnY2xpY2snLCB0aGlzLm9wZW5JbmZvV2luZG93KTsKICAgIH0KCiAgICBQZW9wbGUucHJvdG90eXBlID0gbmV3IEdNYXJrZXIobmV3IEdMYXRMbmcoMCwgMCkpOwoKICAgIFBlb3BsZS5wcm90b3R5cGUub3BlbkluZm9XaW5kb3cgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdGV4dCA9ICc8ZGl2IGNsYXNzPSJub3RlIj4nOwogICAgICAgIHRleHQgPSB0ZXh0ICsgJzxwIGNsYXNzPSJuYW1lIj4nICsgdGhpcy50aXRsZSArICc8L3A+JzsKICAgICAgICB0ZXh0ID0gdGV4dCArICc8cCBjbGFzcz0iaW5mbyI+JyArIHRoaXMuZGVzY3JpcHRpb24gKyAnPC9wPic7CiAgICAgICAgdGV4dCA9IHRleHQgKyAnPC9kaXY+JzsKCiAgICAgICAgdGhpcy5vcGVuSW5mb1dpbmRvd0h0bWwodGV4dCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkTWFya2VyKG1hcmtlcikgewogICAgICAgIGlmIChtYXJrZXIpIHsKICAgICAgICAgICAgbWFya2Vyc1ttYXJrZXIuaWRdID0gbWFya2VyOwogICAgICAgICAgICBtYXAuYWRkT3ZlcmxheShtYXJrZXIpOwogICAgICAgIH0KICAgIH0KCgogICAgZnVuY3Rpb24gbG9hZCgpIHsKICAgICAgaWYgKEdCcm93c2VySXNDb21wYXRpYmxlKCkpIHsKICAgICAgICAKICAgICAgICBtYXAgPSBuZXcgR01hcDIoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1hcCIpKTsKCiAgICAgICAgLy8gQ2VudGVyIHRvIHZpZXcgcXVpdGUgYWxsIHRoZSBtYXAKICAgICAgICBtYXAuc2V0Q2VudGVyKG5ldyBHTGF0TG5nKDQ1Ljc3NjUwLCA0Ljg1NTk1KSwgMTMpOwogICAgICAgIG1hcC5hZGRDb250cm9sKG5ldyBHTGFyZ2VNYXBDb250cm9sKCkpOwogICAgICAgIG1hcC5hZGRDb250cm9sKG5ldyBHT3ZlcnZpZXdNYXBDb250cm9sKCkpOwogICAgICAgIG1hcC5hZGRDb250cm9sKG5ldyBHTWFwVHlwZUNvbnRyb2woKSk7CgoKICAgICAgICAvLyBDb25mZXJlbmNlcyBQbGFjZQogICAgICAgIGFkZE1hcmtlcihuZXcgUGVvcGxlKCJtYWluIiwgbmV3IEdMYXRMbmcoNDUuNzg0MzYzLCA0Ljg4Mjg5MSksIAogICAgICAgICAgICAiTGlldSBwcmluY2lwYWwgZGVzIGNvbmYmZWFjdXRlO3JlbmNlcyIsCiAgICAgICAgICAgICJDJ2VzdCBpY2kgcXVlIHNlIHRpZW5kcm9udCBsZXMgZGlmZulyZW50cyBmaWxzIGV0IHN0YW5kcy4iKSk7CgogICAgICAgIGFkZE1hcmtlcihuZXcgUGVvcGxlKCJjYXBlbGxlIiwgbmV3IEdMYXRMbmcoNDUuNzgzNTMsIDQuODgxMjkpLAogICAgICAgICAgICAiTGlldSBkZSBjb25m6XJlbmNlIHBs6W5pZXJlcyIsCiAgICAgICAgICAgICJUb3V0ZXMgbGVzIGNvbmbpcmVuY2VzIHBs6W5p6HJlcyBhdXJvbnQgbGlldSBkYW5zIGwnYW1waGkgQ2FwZWxsZS4iKSk7CgogICAgICAgIC8vIFJlc3RhdXJhbnRzCiAgICAgICAgYWRkTWFya2VyKG5ldyBSZXN0bygicnUiLCBuZXcgR0xhdExuZyg0NS43ODA3OSwgNC44NzYwNDEpLAogICAgICAgICAgICAiUmVzdGF1cmFudCBVbml2ZXJzaXRhaXJlIiwKICAgICAgICAgICAgIkljaSB2b3VzIGF0dGVuZHMgdW4gcmVwYXMgY2hhdWQuIikpOwogICAgICAgIAogICAgICAgIGFkZE1hcmtlcihuZXcgUmVzdG8oInNhbmR3aWNoZXMiLCBuZXcgR0xhdExuZyg0NS43ODQ1NDYsIDQuODgyODExKSwKICAgICAgICAgICAgIlNhbmR3aWNoZXMiLAogICAgICAgICAgICAiUG91ciBwcmVuZHJlIGRlcyBzYW5kd2ljaGVzIGV0IG1hbmdlciByYXBpZGVtZW50LiIpKTsKCiAgICAgICAgLy8gSG90ZWxzCiAgICAgICAgYWRkTWFya2VyKG5ldyBIb3RlbCgiaW5zYV9oIiwgbmV3IEdMYXRMbmcoNDUuNzg0ODMsIDQuODc0NDUzKSwKICAgICAgICAgICAgIklOU0EgYiZhY2lyYzt0aW1lbnQgSCIsCiAgICAgICAgICAgICIyMCwgYXZlbnVlIEFsYmVydCBFaW5zdGVpbiIsCiAgICAgICAgICAgICI2OTEwMCBWaWxsZXVyYmFubmUiLAogICAgICAgICAgICBudWxsLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbl9mci5odG1sI2luc2EiKSk7CiAgICAgICAgCiAgICAgICAgYWRkTWFya2VyKG5ldyBIb3RlbCgiaW5zYV9mIiwgbmV3IEdMYXRMbmcoNDUuNzg0Mjg0LCA0Ljg3MTcwNiksCiAgICAgICAgICAgICJJTlNBIGImYWNpcmM7dGltZW50IEYiLAogICAgICAgICAgICAiMjAsIGF2ZW51ZSBBbGJlcnQgRWluc3RlaW4iLAogICAgICAgICAgICAiNjkxMDAgVmlsbGV1cmJhbm5lIiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb25fZnIuaHRtbCNpbnNhIikpOwoKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJ5b3VndGhob3RlbCIsIG5ldyBHTGF0TG5nKDQ1Ljc2MDMwNzcsIDQuODI0NDU3KSwKICAgICAgICAgICAgIkF1YmVyZ2UgZGUgamV1bmVzc2UiLAogICAgICAgICAgICAiNDEtNDUsIG1vbnRlZSBkdSBDaGVtaW4gTmV1ZiIsCiAgICAgICAgICAgICI2OTAwNSBMeW9uIiwKICAgICAgICAgICAgIiszMyAoMCk0IDc4IDE1IDA1IDUwIiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb25fZnIuaHRtbCN5b3VndGhob3RlbCIsCiAgICAgICAgICAgIGxvZ29haikpOwoKICAgICAgICAvLyBFdGFwIEhvdGVsIFZpbGxldXJiYW5uZQogICAgICAgIGFkZE1hcmtlcihuZXcgSG90ZWwoImhvdGVsMyIsIG5ldyBHTGF0TG5nKDQ1Ljc4MjI2LCA0Ljg5MDcwNyksIAogICAgICAgICAgICAiRXRhcCBIb3RlbCBWaWxsZXVyYmFubmUiLCAKICAgICAgICAgICAgIjMgcnVlIDggbWFpIDE5NDUiLAogICAgICAgICAgICAiNjkxMDAgVmlsbGV1cmJhbm5lIiwKICAgICAgICAgICAgIiszMyAoMCk4IDkyIDY4IDA5IDQxIiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb25fZnIuaHRtbCNob3RlbDMiKSk7CgogICAgICAgIC8vIEV0YXAgSG90ZWwgQ2FsdWlyZQogICAgICAgIGFkZE1hcmtlcihuZXcgSG90ZWwoImhvdGVsMiIsIG5ldyBHTGF0TG5nKDQ1Ljc5MDQsIDQuODU4NCksIAogICAgICAgICAgICAiRXRhcCBIb3RlbCBDYWx1aXJlIGV0IEN1aXJlIiwKICAgICAgICAgICAgIjE1NCBncmFuZGUgcnVlIFN0IENsYWlyIiwKICAgICAgICAgICAgIjY5MzAwIENhbHVpcmUgZXQgQ3VpcmUiLAogICAgICAgICAgICAiKzMzICgwKTggOTIgNjggMDQgOTEiLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbl9mci5odG1sI2hvdGVsMiIpKTsKICAgICAgICAKICAgICAgICAvLyBIb2xpZGF5IElubiBWaWxsZXVyYmFubmUKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJob3RlbDQiLCBuZXcgR0xhdExuZyg0NS43NzkwLCA0Ljg3NDIpLAogICAgICAgICAgICAiSG9saWRheSBJbm4gVmlsbGV1cmJhbm5lIiwKICAgICAgICAgICAgIjEzMCBib3VsZXZhcmQgMTEgbm92ZW1icmUgMTkxOCIsCiAgICAgICAgICAgICI2OTEwMCBWaWxsZXVyYmFubmUiLAogICAgICAgICAgICAiKzMzICgwKTQgNzggODkgOTUgOTUiLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbl9mci5odG1sI2hvdGVsNCIpKTsKICAgICAgICAKICAgICAgICAvLyBNZXJjdXJlIENoYXJwZW5uZXMKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJob3RlbDUiLCBuZXcgR0xhdExuZyg0NS43NzEwLCA0Ljg2MzMpLAogICAgICAgICAgICAiIEgmb2NpcmM7dGVsIE1lcmN1cmUgTHlvbiBDaGFycGVubmVzIiwKICAgICAgICAgICAgIjcgcGxhY2UgQ2hhcmxlcyBIZXJudSIsCiAgICAgICAgICAgICI2OTEwMCBWaWxsZXVyYmFubmUiLAogICAgICAgICAgICAiKzMzICgwKTQgNzIgNDQgNDYgNDYiLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbl9mci5odG1sI2hvdGVsNSIpKTsKCiAgICAgICAgLy8gSG90ZWwgZGVzIGNvbmdyZXMKICAgICAgICBhZGRNYXJrZXIobmV3IEhvdGVsKCJob3RlbDEiLCBuZXcgR0xhdExuZyg0NS43NzcyLCA0Ljg2MTgpLCAKICAgICAgICAgICAgIkgmb2NpcmM7dGVsIGRlcyBDb25nciZlZ3JhdmU7cyIsCiAgICAgICAgICAgICJwbGFjZSBSaXZpJmVncmF2ZTtyZSIsCiAgICAgICAgICAgICI2OTEwMCBWaWxsZXVyYmFubmUiLAogICAgICAgICAgICAiKzMzICgwKTQgNzIgNjkgMTYgMTYiLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbl9mci5odG1sI2hvdGVsMSIpKTsKICAgICAgICAKICAgICAgICAvLyBIb3RlbCBicml0YW5pYQogICAgICAgIGFkZE1hcmtlcihuZXcgSG90ZWwoImhvdGVsNiIsIG5ldyBHTGF0TG5nKDQ1Ljc2ODcyLCA0Ljg1NzA4MyksIAogICAgICAgICAgICAiSCZvY2lyYzt0ZWwgQnJpdGFuaWEiLAogICAgICAgICAgICAiNyBydWUgUHJvZi4gV2VpbGwiLAogICAgICAgICAgICAiNjkwMDYgTHlvbiIsCiAgICAgICAgICAgICIrMzMgKDApNCA3OCA1MiA4NiA1MiIsCiAgICAgICAgICAgICJhY2NvbW1vZGF0aW9uX2ZyLmh0bWwjaG90ZWw2IikpOwogICAgICAgICAgICAKICAgICAgICAvLyBDYW1waW5nCiAgICAgICAgYWRkTWFya2VyKG5ldyBIb3RlbCgiY2FtcGluZyIsIG5ldyBHTGF0TG5nKDQ1LjgxOTc2LCA0Ljc2MTQ1NzQpLAogICAgICAgICAgICAiQ2FtcGluZyBJbnRlcm5hdGlvbmFsIiwKICAgICAgICAgICAgIlBvcnRlIGRlIEx5b24iLAogICAgICAgICAgICAiNjk1NzAgRGFyZGlsbHkiLAogICAgICAgICAgICAiKzMzICgwKTQgNzggMzUgNjQgNTUiLAogICAgICAgICAgICAiYWNjb21tb2RhdGlvbl9mci5odG1sI2NhbXBpbmciKSk7CgogICAgICAgIC8vIENlbnRyZSBpbnRlcm5hdGlvbmFsIGRlIHPpam91cgogICAgICAgIGFkZE1hcmtlcihuZXcgSG90ZWwoImNpcyIsIG5ldyBHTGF0TG5nKDQ1LjcyOTcxNSwgNC44Njc2OTQzKSwKICAgICAgICAgICAgIkNlbnRyZSBJbnRlcm5hdC4gZGUgcyZlYWN1dGU7am91ciIsCiAgICAgICAgICAgICIxMDMsIEJkIGRlcyAmRWFjdXRlO3RhdHMtVW5pcyIsCiAgICAgICAgICAgICI2OTAwOCBMeW9uIiwKICAgICAgICAgICAgIiszMyAoMCk0IDM3IDkwIDQyIDQyIiwKICAgICAgICAgICAgImFjY29tbW9kYXRpb25fZnIuaHRtbCNjaXMiKSk7CgogICAgICAgIC8vIE9wZW4gdGhlIG1hcmtlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXNoCiAgICAgICAgdmFyIGhhc2ggPSBsb2NhdGlvbi5oYXNoOwogICAgICAgIGlmIChoYXNoKSB7CiAgICAgICAgICAgIGhhc2ggPSBoYXNoLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgdmFyIG1hcmtlciA9IG1hcmtlcnNbaGFzaF07CgogICAgICAgICAgICBpZiAobWFya2VyKSB7CiAgICAgICAgICAgICAgICBtYXJrZXIub3BlbkluZm9XaW5kb3coKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vXV0+CiAgICA8L3NjcmlwdD4KPC9oZWFkPgoKPGJvZHkgb25sb2FkPSJsb2FkKCkiIG9udW5sb2FkPSJHVW5sb2FkKCkiPgoKPGRpdiBpZD0iY29udGVudCI+CgoJPGRpdiBpZD0ibG9nbyI+CiAgICAgICAgPGEgaHJlZj0iL2NvbmZlcmVuY2UvaW5kZXguaHRtbCI+CiAgICAgICAgICAgIDxpbWcgc3R5bGU9ImJvcmRlcjogMHB4IHNvbGlkIiAKICAgICAgICAgICAgICAgIHNyYz0iT09vQ29uTHlvbi5wbmciIAogICAgICAgICAgICAgICAgYWx0PSJPcGVuT2ZmaWNlLm9yZyBDb25mZXJlbmNlcyBsb2dvIiAvPgogICAgICAgIDwvYT4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InRpdGxlIj4KICAgICAgICA8aDM+T3Blbk9mZmljZS5vcmcgQ29uZmVyZW5jZSAoT09vQ29uIDIwMDYpPC9oMz4KICAgICAgICA8cD5DYXJ0ZTwvcD4KICAgIDwvZGl2PgoKICAgIDxub3NjcmlwdD4KICAgICAgICA8aDM+UHJvYmwmZWdyYXZlO21lIGRlIEphdmFzY3JpcHQ8L2gzPgoKICAgICAgICA8cD5Qb3VyIHZpc3VhbGlzZXIgbGEgY2FydGUgZGUgY2V0dGUgcGFnZSwgdm91cyBkZXZleiBhdm9pciB1biBuYXZpZ2F0ZXVyIAogICAgICAgIHN1cHBvcnRhbnQgbGUgamF2YXNjcmlwdCBvdSBhY3RpdmVyIGxlIGphdmFzY3JpcHQgZGFucyBsZXMgcHImZWFjdXRlO2YmZWFjdXRlO3JlbmNlcyBkZQogICAgICAgIHZvdHJlIG5hdmlnYXRldXIuPC9wPgogICAgPC9ub3NjcmlwdD4KICAgIDxkaXYgaWQ9Im1hcCIgc3R5bGU9IndpZHRoOiA2MDBweDsgaGVpZ2h0OiA0MDBweDsgdGV4dC1hbGlnbjpjZW50ZXIiPjwvZGl2PiAgICAKICAgCjwvZGl2PgoKPCEtLSBSaWdodCBtZW51IC0tPgo8ZGl2IGlkPSJtZW51Ij4KCTxwIGlkPSJsYW5nTGluZSI+CgkJPGEgY2xhc3M9ImxhbmciIGhyZWY9Im1hcC5odG1sIj5FbjwvYT4gLQoJCTxzcGFuIGNsYXNzPSJ0aGlzTGFuZyI+RnI8L3NwYW4+Cgk8L3A+CiAgICA8aDM+UXUnZXN0IHF1ZSBPT29Db248L2gzPgogICAgICAgIDxwPjxhIGhyZWY9ImluZGV4X2ZyLmh0bWwiPkFjY3VlaWw8L2E+PC9wPgogICAgPGgzPkNvbW1lbnQgcGFydGljaXBlcjwvaDM+CiAgICAgICAgPHA+PGEgaHJlZj0ic3BvbnNvcnNoaXAuaHRtbCI+U3BvbnNvcnM8L2E+PC9wPgogICAgICAgIDxwPjxhIGhyZWY9InJlZ2lzdHJhdGlvbl9mci5odG1sIj5JbnNjcmlwdGlvbjwvYT48L3A+CiAgICA8aDM+SW5mb3JtYXRpb25zPC9oMz4KICAgICAgICA8cD48YSBocmVmPSJ0cmF2ZWxfZnIuaHRtbCI+Vm95YWdlPC9hPjwvcD4KICAgICAgICA8cD48YSBocmVmPSJhY2NvbW1vZGF0aW9uX2ZyLmh0bWwiPkgmZWFjdXRlO2JlcmdlbWVudDwvYT48L3A+CiAgICAgICAgPHA+Q2FydGU8L3A+CiAgICA8aDM+UHJvZ3JhbW1lPC9oMz4KICAgICAgICA8cD48YSBocmVmPSJzY2hlZHVsZS5odG1sIj5SJmVhY3V0ZTtzdW0mZWFjdXRlOzwvYT48L3A+CiAgICAgICAgPHA+PGEgaHJlZj0ic2NoZWR1bGUvbW9uZGF5Lmh0bWwiPkx1bmRpPC9hPjwvcD4KICAgICAgICA8cD48YSBocmVmPSJzY2hlZHVsZS90dWVzZGF5Lmh0bWwiPk1hcmRpPC9hPjwvcD4KICAgICAgICA8cD48YSBocmVmPSJzY2hlZHVsZS93ZWRuZXNkYXkuaHRtbCI+TWVyY3JlZGk8L2E+PC9wPgoKPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4KCg==