https://ipfs.io/ipfs/QmTRLSUTVgr3ZQmS6RGeGt1zHXawEJQP7ue7YLqTUCV3Lo
sha256
655152c88d82d3d081283033da357dab8f224ff272b9ae87b349fc8c9dc70c81 files.html
base64
PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cDovL3N2Z2ljb25zLnNwYXJray5mci9zdmdpY29ucy5jc3MiLz4KICAgIDxzdHlsZT4KICAgICAgKiB7CiAgICAgICAgb3ZlcnNjcm9sbC1iZWhhdmlvci15OiBjb250YWluOwogICAgICB9CiAgICAgIAogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB3aWR0aDogMTAwdnc7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTm90byBTZXJpZiI7CiAgICAgIH0KICAgICAgCiAgICAgIC5wbGFjZWhvbGRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBwYWRkaW5nOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IDFlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnlkaXNwbGF5LCAKICAgICAgI2hlYWRlciB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MsIAogICAgICAjcHJpdmtleSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDE4ZW07CiAgICAgICAgYmFja2dyb3VuZDogIzExMTsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywKICAgICAgI2xvZ3MgewogICAgICAgIGhlaWdodDogNmVtOwogICAgICB9CiAgICAgIAogICAgICAjbG9ncyB7CiAgICAgICAgaGVpZ2h0OiA4ZW07CiAgICAgICAgb3ZlcmZsb3c6IHNjcm9sbDsKICAgICAgICBmb250LXNpemU6IC44ZW07CiAgICAgIH0KICAgICAgCiAgICAgIHNlbGVjdCB7CiAgICAgICAgd2lkdGg6IDRlbTsKICAgICAgfQogICAgICAKICAgICAgI3JlbGF5cywgCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogLjVlbTsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSAudGV4dCwgCiAgICAgICNoZWFkZXIgYSwKICAgICAgI21lZGlhLWNvbnRhaW5lciB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgYSwgCiAgICAgIGZvcm0sIAogICAgICAjcXVlcnlkaXNwbGF5IHsKICAgICAgICB6LWluZGV4OiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAzMGVtKSB7CiAgICAgICAgI2hlYWRlciAudGl0bGUgewogICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9ybSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIAogICAgICAjcXVlcnkgewogICAgICAgIHdpZHRoOiA2ZW07CiAgICAgIH0KICAgICAgCiAgICAgICNsb2FkaW5nIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDBweDsKICAgICAgICBsZWZ0OiAzMGVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAKICAgICAgI21lZGlhLWNvbnRhaW5lciB2aWRlbyB7CiAgICAgICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBoZWlnaHQ6IDEwMCUgIWltcG9ydGFudDsKICAgICAgICBtYXJnaW4tdG9wOiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgCiAgICAgIC50eXBlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICB3aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICBhIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgICAKICAgICAgI3F1ZXJ5ZGlzcGxheSwKICAgICAgYS5idXR0b24sCiAgICAgIGlucHV0LnN1Ym1pdCB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KICAgICAgCiAgICAgICNoZWFkZXIgI3F1ZXJ5ZGlzcGxheSB7CiAgICAgICAgcGFkZGluZzogMCAxZW07CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjcXVlcnlkaXNwbGF5IC50ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbWluLXdpZHRoOiAzZW07CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIG1heC13aWR0aDogOGVtOwogICAgICB9CgogICAgICAjaGVhZGVyIGEsCiAgICAgICNoZWFkZXIgc3BhbiB7CiAgICAgICAgcGFkZGluZzogMC41ZW07CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgewogICAgICAgIHBhZGRpbmc6IDAuNDVlbSAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICNoZWFkZXIgLml0ZW1zIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjMDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXJnaW4tdG9wOiAuM2VtOwogICAgICB9CgogICAgICBwIHsKICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICB9CiAgICAgIAogICAgICAubGFiZWwgewogICAgICAgIHBhZGRpbmc6IC44ZW0gLjhlbSAuOGVtIDA7CiAgICAgIH0KCiAgICAgICNpbWFnZXMgLnF1ZXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIH0KCiAgICAgICNtZWRpYS1jb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwKTsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIG1heC13aWR0aDogMTAwdnc7CiAgICAgICAgbWF4LWhlaWdodDogMTAwdmg7CiAgICAgIH0KICAgICAgICAKICAgICAgI2ltYWdlcyB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2ltYWdlcyAuaXRlbSB7CiAgICAgICAgd2lkdGg6IDI1dnc7CiAgICAgICAgaGVpZ2h0OiAyNXZ3OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmRpYWxvZyBpbWcgewogICAgICAgIHdpZHRoOiAxNXZ3OwogICAgICB9CiAgICAgIAogICAgICAjbWVkaWEtY29udGFpbmVyIHZpZGVvIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICBib2R5Om5vdCgubm9zdHIpICNoZWFkZXIgLmljb25zLCAKICAgICAgLmZpbHRlci1saWtlcyAjaW1hZ2VzID4gLml0ZW06bm90KC5yZWFjdGVkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDN2dzsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHBhZGRpbmc6IDAgMXZ3OwogICAgICB9CiAgICAgIAogICAgICAucXVlcnksIAogICAgICAubGlrZSwgCiAgICAgICNpbWFnZS1xdWVyeSwgCiAgICAgIC52aWRlb3N2ZywKICAgICAgLmltYWdlc3ZnIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNik7CiAgICAgIH0KICAgICAgCiAgICAgIC5xdWVyeSwgCiAgICAgIC5saWtlLCAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZm9udC1zaXplOiBtaW4oMy41dncsIDEuNWVtKTsKICAgICAgICBtYXgtd2lkdGg6IDVlbTsKICAgICAgfQogICAgICAKICAgICAgI2ltYWdlLXF1ZXJ5IHsKICAgICAgICBwYWRkaW5nOiAuNmVtIC40ZW0gLjFlbSAuNGVtOwogICAgICAgIG1heC13aWR0aDogNWVtOwogICAgICB9CiAgICAgIAogICAgICAubGlrZS5yZWFjdGVkLAogICAgICAuZmlsdGVyLWxpa2VzICNmaWx0ZXItbGlrZXMgewogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgfQoKICAgICAgI2ltYWdlLXF1ZXJ5LAogICAgICAjaW1hZ2UtdXNlciB7CiAgICAgICAgZm9udC1zaXplOiAzZW07CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZS1xdWVyeSwKICAgICAgI2ltYWdlLXVzZXIsCiAgICAgICNtZWRpYS1mb290ZXIgLmxpa2UgewogICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CiAgICAgIAogICAgICAjaW1hZ2UtcXVlcnksCiAgICAgICNpbWFnZS11c2VyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgI2ltYWdlLXVzZXIgewogICAgICAgIGJvdHRvbTogMS45ZW07CiAgICAgICAgZm9udC1zaXplOiAxLjhlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAuNjVlbTsKICAgICAgICBtYXgtd2lkdGg6IDhlbTsKICAgICAgfQogICAgICAKICAgICAgLmxpa2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuMmVtOwogICAgICAgIHdpZHRoOiAxZW07CiAgICAgICAgaGVpZ2h0OiAxZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vc3RyIC5saWtlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsgIAogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIC5saWtlIHsKICAgICAgICBmb250LXNpemU6IDIuNGVtOwogICAgICB9CgogICAgICAjbWVkaWEtZm9vdGVyIHsKICAgICAgICBkaXNwbGF5OiBub25lOyAgCiAgICAgIH0KICAKICAgICAgI2ltYWdlcyAuaW1nIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCAuaXRlbXMgLmJ1dHRvbi5hY3RpdmUgewogICAgICAgIGJhY2tncm91bmQ6ICM0NDQ7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgIH0KICAgICAgCiAgICAgICNpbWFnZXMgPiAuYWN0aXZlIHsKICAgICAgICBvdXRsaW5lOiAuM2VtIHNvbGlkIGdyZWVuOwogICAgICAgIHotaW5kZXg6IDE7CiAgICAgIH0KCiAgICAgIC5oZWFydHN2ZyBwYXRoLAogICAgICAuaGVhZGVyLWljb24gc3ZnIHBhdGggewogICAgICAgIHN0cm9rZTogI2ZmZjsKICAgICAgfQogIAogICAgICAudmlkZW9zdmcsCiAgICAgIC5pbWFnZXN2ZyB7CiAgICAgICAgd2lkdGg6IGNhbGMobWluKDR2dywgMmVtKSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKG1pbig0dncsIDJlbSkpOwogICAgICAgIHBhZGRpbmc6IDAgLjJlbTsKICAgICAgfQogICAgICAKICAgICAgLnZpZGVvc3ZnIHBhdGgsCiAgICAgIC5pbWFnZXN2ZyBwYXRoIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICBhI21lbnUsIAogICAgICAuaGVhZGVyLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5pY29ucyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHotaW5kZXg6IDI7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQogICAgICAKICAgICAgYSNtZW51IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBwYWRkaW5nOiAwIC41ZW07CiAgICAgICAgbWFyZ2luLXRvcDogLS4zZW07CiAgICAgICAgaGVpZ2h0OiAyLjNlbTsKICAgICAgfQogICAgICAKICAgICAgI2hlYWRlciAuaGVhZGVyLWljb24gewogICAgICAgIHBhZGRpbmc6IC4yZW07CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIHdpZHRoOiAxLjVlbTsKICAgICAgICBoZWlnaHQ6IDEuNWVtOwogICAgICAgIG1hcmdpbjogLjFlbSAuNWVtOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAKICAgICAgLmhlYWRlci1pY29uIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEuNWVtOwogICAgICAgIGhlaWdodDogMS41ZW07CiAgICAgIH0KICAgICAgIAogICAgICAubWVudXN2ZyB7CiAgICAgICAgd2lkdGg6IDJlbTsKICAgICAgICBoZWlnaHQ6IDJlbTsKICAgICAgfQoKICAgICAgLm1lbnVzdmcgcGF0aCB7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgfQoKICAgICAgI21lbnUtY29udGVudCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgIHdpZHRoOiAxOGVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMThlbTsKICAgICAgICBiYWNrZ3JvdW5kOiAjMjIyOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB6LWluZGV4OiAzOyAKICAgICAgICBvdmVyZmxvdzogc2Nyb2xsOwogICAgICB9CgogICAgICAjbWVudS1jb250ZW50LnZpc2libGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyB7CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CiAgICAgIAogICAgICAjbWVudS1jb250ZW50IC5pdGVtcyBhLmJ1dHRvbiwKICAgICAgaW5wdXQuc3VibWl0IHsKICAgICAgICBwYWRkaW5nOiAuNWVtIC43ZW07CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6ICMxMTE7CiAgICAgIH0KCiAgICAgICNvdmVybGF5IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIGJhY2tncm91bmQ6ICMwMDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IDM7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIG9wYWNpdHk6IC41OwogICAgICB9CgogICAgICAudmlzaWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQogICAgICAKICAgICAgI3NoYXJlLWRpYWxvZyB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA2ZW0pOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMWVtOwogICAgICAgIHotaW5kZXg6IDQ7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDJlbTsKICAgICAgICBtYXJnaW4tdG9wOiAyZW07CiAgICAgICAgcGFkZGluZzogMWVtOwogICAgICB9CiAgICAgIAogICAgICBoMiB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgfQogICAgICAKICAgICAgc3ZnIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI3RlbXBsYXRlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxkaXYgaWQ9InRlbXBsYXRlIj4KICAgICAgPHN2ZyBjbGFzcz0iaGVhcnRzdmcgc3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CiAgICAgICAgPHBhdGggZD0iTTkuNzE5LDE3LjA3M2wtNi41NjItNi41MWMtMC4yNy0wLjI2OC0wLjUwNC0wLjU2Ny0wLjY5Ni0wLjg4OEMxLjM4NSw3Ljg5LDEuNjcsNS42MTMsMy4xNTUsNC4xNGMwLjg2NC0wLjg1NiwyLjAxMi0xLjMyOSwzLjIzMy0xLjMyOWMxLjkyNCwwLDMuMTE1LDEuMTIsMy42MTIsMS43NTJjMC40OTktMC42MzQsMS42ODktMS43NTIsMy42MTItMS43NTJjMS4yMjEsMCwyLjM2OSwwLjQ3MiwzLjIzMywxLjMyOWMxLjQ4NCwxLjQ3MywxLjc3MSwzLjc1LDAuNjkzLDUuNTM3Yy0wLjE5LDAuMzItMC40MjUsMC42MTgtMC42OTUsMC44ODdsLTYuNTYyLDYuNTFDMTAuMTI1LDE3LjIyOSw5Ljg3NSwxNy4yMjksOS43MTksMTcuMDczIE02LjM4OCwzLjYxQzUuMzc5LDMuNjEsNC40MzEsNCwzLjcxNyw0LjcwN0MyLjQ5NSw1LjkyLDIuMjU5LDcuNzk0LDMuMTQ1LDkuMjY1YzAuMTU4LDAuMjY1LDAuMzUxLDAuNTEsMC41NzQsMC43MzFMMTAsMTYuMjI4bDYuMjgxLTYuMjMyYzAuMjI0LTAuMjIxLDAuNDE2LTAuNDY2LDAuNTczLTAuNzI5YzAuODg3LTEuNDcyLDAuNjUxLTMuMzQ2LTAuNTcxLTQuNTZDMTUuNTcsNCwxNC42MjEsMy42MSwxMy42MTIsMy42MWMtMS40MywwLTIuNjM5LDAuNzg2LTMuMjY4LDEuODYzYy0wLjE1NCwwLjI2NC0wLjUzNiwwLjI2NC0wLjY5LDBDOS4wMjksNC4zOTcsNy44MiwzLjYxLDYuMzg4LDMuNjEiPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICAgIDxzdmcgY2xhc3M9InZpZGVvc3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCQkJPHBhdGggZD0iTTE4LjE3NSw0LjE0MkgxLjk1MUMxLjcwMyw0LjE0MiwxLjUsNC4zNDQsMS41LDQuNTkydjEwLjgxNmMwLDAuMjQ3LDAuMjAzLDAuNDUsMC40NTEsMC40NWgxNi4yMjRjMC4yNDcsMCwwLjQ1LTAuMjAzLDAuNDUtMC40NVY0LjU5MkMxOC42MjUsNC4zNDQsMTguNDIyLDQuMTQyLDE4LjE3NSw0LjE0MiBNNC42NTUsMTQuOTU3SDIuNDAxdi0xLjgwM2gyLjI1M1YxNC45NTd6TTQuNjU1LDEyLjI1NEgyLjQwMXYtMS44MDNoMi4yNTNWMTIuMjU0eiBNNC42NTUsOS41NDlIMi40MDFWNy43NDdoMi4yNTNWOS41NDl6IE00LjY1NSw2Ljg0NkgyLjQwMVY1LjA0M2gyLjI1M1Y2Ljg0NnpNMTQuNTY5LDE0Ljk1N0g1LjU1NlY1LjA0M2g5LjAxM1YxNC45NTd6IE0xNy43MjQsMTQuOTU3aC0yLjI1M3YtMS44MDNoMi4yNTNWMTQuOTU3eiBNMTcuNzI0LDEyLjI1NGgtMi4yNTN2LTEuODAzaDIuMjUzVjEyLjI1NHpNMTcuNzI0LDkuNTQ5aC0yLjI1M1Y3Ljc0N2gyLjI1M1Y5LjU0OXogTTE3LjcyNCw2Ljg0NmgtMi4yNTNWNS4wNDNoMi4yNTNWNi44NDZ6Ij48L3BhdGg+CgkJCTwvc3ZnPgoJCQk8c3ZnIGNsYXNzPSJpbWFnZXN2ZyBzdmctaWNvbiIgdmlld0JveD0iMCAwIDIwIDIwIj4KCQkJCTxwYXRoIGQ9Ik0xOC41NTUsMTUuMzU0VjQuNTkyYzAtMC4yNDgtMC4yMDItMC40NTEtMC40NS0wLjQ1MUgxLjg4OGMtMC4yNDgsMC0wLjQ1MSwwLjIwMy0wLjQ1MSwwLjQ1MXYxMC44MDhjMCwwLjU1OSwwLjc1MSwwLjQ1MSwwLjQ1MSwwLjQ1MWgxNi4yMTdoMC4wMDVDMTguNzkzLDE1Ljg1MSwxOC40NzgsMTQuODE0LDE4LjU1NSwxNS4zNTQgTTIuOCwxNC45NDlsNC45NDQtNi40NjRsNC4xNDQsNS40MTljMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDMsMC4wMDVsMC43OTcsMS4wNEgyLjh6IE0xMy44MjIsMTQuOTQ5bC0xLjAwNi0xLjMxN2wxLjY4OS0yLjIxOGwyLjY4OCwzLjUzNUgxMy44MjJ6IE0xNy42NTQsMTQuMDY0bC0yLjc5MS0zLjY2NmMtMC4xODEtMC4yMzctMC41MzUtMC4yMzctMC43MTYsMGwtMS44OTksMi40OTNsLTQuMTQ2LTUuNDJjLTAuMTgtMC4yMzctMC41MzYtMC4yMzctMC43MTYsMGwtNS4wNDcsNi41OThWNS4wNDJoMTUuMzE2VjE0LjA2NHogTTEyLjQ3NCw2LjM5M2MtMC44NjksMC0xLjU3NywwLjcwNy0xLjU3NywxLjU3NnMwLjcwOCwxLjU3NiwxLjU3NywxLjU3NnMxLjU3Ny0wLjcwNywxLjU3Ny0xLjU3NlMxMy4zNDMsNi4zOTMsMTIuNDc0LDYuMzkzIE0xMi40NzQsOC42NDVjLTAuMzcxLDAtMC42NzYtMC4zMDQtMC42NzYtMC42NzZzMC4zMDUtMC42NzYsMC42NzYtMC42NzZjMC4zNzIsMCwwLjY3NiwwLjMwNCwwLjY3NiwwLjY3NlMxMi44NDYsOC42NDUsMTIuNDc0LDguNjQ1Ij48L3BhdGg+CgkJCTwvc3ZnPgogICAgICA8ZGl2IGlkPSJjb2xzY3NzIj4KICAgICAgLmNvbHMke2NvbHN9ICNpbWFnZXMgLml0ZW0gewogICAgICAgIHdpZHRoOiBjYWxjKDEwMHZ3IC8gJHtjb2xzfSk7CiAgICAgIH0KCiAgICAgIC5jb2xzJHtjb2xzfSAjaW1hZ2VzIC5pdGVtIHsKICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdncgLyAke2NvbHN9KTsKICAgICAgfQogICAgICAKICAgICAgLmNvbHMke2NvbHN9IC5xdWVyeSwKICAgICAgLmNvbHMke2NvbHN9IC5saWtlIHsKICAgICAgICBmb250LXNpemU6IG1pbigxNHZ3ICogKDEgLyAke2NvbHN9KSwgNmVtICogKDEgLyAke2NvbHN9KSkKICAgICAgfQogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ic2hhcmUtZGlhbG9nIiBjbGFzcz0iZGlhbG9nIj4KICAgICAgPGgyPnNoYXJlPC9oMj4KICAgICAgPGZvcm0gaWQ9InNoYXJlLWZvcm0iIGFjdGlvbj0iIyI+CiAgICAgICAgPHAgY2xhc3M9ImNvbnRlbnQiPjwvcD4KICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBjbGFzcz0ic3VibWl0IiB2YWx1ZT0ib2siLz4KICAgICAgPC9mb3JtPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtZWRpYS1mb290ZXIiPgogICAgICA8YSBpZD0iaW1hZ2UtbGlrZSIgY2xhc3M9Imxpa2UiIGhyZWY9IiMiPjwvYT4KICAgICAgPGEgaWQ9ImltYWdlLXF1ZXJ5IiBjbGFzcz0ibGluayIgaHJlZj0iIyI+PC9hPgogICAgICA8YSBpZD0iaW1hZ2UtdXNlciIgY2xhc3M9ImxpbmsiIGhyZWY9IiMiPjwvYT4KICAgIDwvZGl2PgogICAgPGNlbnRlciBpZD0ibWVkaWEtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iaW1hZ2UtY29udGFpbmVyIj4KICAgICAgICA8aW1nIGlkPSJpbWFnZSIvPgogICAgICA8L2Rpdj4KICAgIDwvY2VudGVyPgogICAgPGRpdiBpZD0ib3ZlcmxheSIgY2xhc3M9ImRpYWxvZyI+PC9kaXY+CiAgICA8ZGl2IGlkPSJtZW51LWNvbnRlbnQiIGNsYXNzPSJkaWFsb2ciPgogICAgICA8ZGl2IGNsYXNzPSJpdGVtcyI+CiAgICAgICAgPGgxPjxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT48L2gxPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5hdXRvcGxheTwvZGl2PgogICAgICAgIDxhIGNsYXNzPSJidXR0b24gc2V0YXV0b3BsYXkiIGRhdGEtYXV0b3BsYXk9Im9uIiBocmVmPSIjIj5vbjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJvZmYiIGhyZWY9IiMiPm9mZjwvYT4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIHNldGF1dG9wbGF5IiBkYXRhLWF1dG9wbGF5PSJob3ZlciIgaHJlZj0iIyI+bW91c2VvdmVyPC9hPgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5jb2x1bW5zPC9kaXY+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEiIGhyZWY9IiMiPjE8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjIiIGhyZWY9IiMiPjI8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjQiIGhyZWY9IiMiPjQ8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjYiIGhyZWY9IiMiPjY8L2E+CiAgICAgICAgPGEgY2xhc3M9ImJ1dHRvbiBzZXRjb2xzIiBkYXRhLWNvbHM9IjEwIiBocmVmPSIjIj4xMDwvYT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+Y29ubmVjdGlvbnM8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJjb25uY291bnQiPjA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+cmVsYXlzOjwvZGl2PgogICAgICAgIDxwPlBsZWFzZSB1c2UgcmVsYXlzIHdpdGggTklQLTUwIChzZWFyY2gpIGZ1bmN0aW9uYWxpdHk8L3A+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIjIiBpZD0icmVsYXlzLWZvcm0iPgogICAgICAgICAgPHRleHRhcmVhIGlkPSJyZWxheXMiPjwvdGV4dGFyZWE+CiAgICAgICAgICA8aW5wdXQgY2xhc3M9InN1Ym1pdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0ic2F2ZSByZWxheXMiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwiPnByaXZhdGUga2V5OjwvZGl2PgogICAgICAgIDxwPklmIHlvdSBjYW50IHVzZSBicm93c2VyIGFkZG9uIChtb2JpbGUpPC9wPgogICAgICAgIDxmb3JtIGFjdGlvbj0iIyIgaWQ9InByaXZrZXktZm9ybSI+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InByaXZrZXkiLz4KICAgICAgICAgIDxpbnB1dCBjbGFzcz0ic3VibWl0IiB0eXBlPSJzdWJtaXQiIHZhbHVlPSJzYXZlIGtleSIvPgogICAgICAgIDwvZm9ybT4KICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCI+bG9nczwvZGl2PgogICAgICAgIDxkaXYgaWQ9ImxvZ3MiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIj5sYXRlc3QgcmVsZWFzZTo8L2Rpdj4KICAgICAgICA8YSBjbGFzcz0iYnV0dG9uIGxpbmsiIGlkPSJyZWxlYXNlIiBocmVmPSIjIj48L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJoZWFkZXIiPgogICAgICA8ZGl2IGNsYXNzPSJpY29ucyI+CiAgICAgICAgPGEgaWQ9ImZpbHRlci1saWtlcyIgaHJlZj0iIyIgY2xhc3M9ImhlYWRlci1pY29uIj48L2E+CiAgICAgICAgPGEgaWQ9InNoYXJlIiBocmVmPSIjIiBjbGFzcz0iaGVhZGVyLWljb24iPgogICAgICAgICAgPHN2ZyBjbGFzcz0ic3ZnLWljb24iIHZpZXdCb3g9IjAgMCAyMCAyMCI+CgkJCQkgICAgPHBhdGggZD0iTTE0LjY4LDEyLjYyMWMtMC45LDAtMS43MDIsMC40My0yLjIxNiwxLjA5bC00LjU0OS0yLjYzN2MwLjI4NC0wLjY5MSwwLjI4NC0xLjQ1NywwLTIuMTQ2bDQuNTQ5LTIuNjM4YzAuNTE0LDAuNjYxLDEuMzE1LDEuMDksMi4yMTYsMS4wOWMxLjU0OSwwLDIuODA5LTEuMjYsMi44MDktMi44MDhjMC0xLjU0OC0xLjI2LTIuODA5LTIuODA5LTIuODA5Yy0xLjU0OCwwLTIuODA4LDEuMjYtMi44MDgsMi44MDljMCwwLjM4LDAuMDc2LDAuNzQxLDAuMjE0LDEuMDczbC00LjU1LDIuNjM4Yy0wLjUxNS0wLjY2MS0xLjMxNi0xLjA5LTIuMjE3LTEuMDljLTEuNTQ4LDAtMi44MDgsMS4yNi0yLjgwOCwyLjgwOXMxLjI2LDIuODA4LDIuODA4LDIuODA4YzAuOSwwLDEuNzAyLTAuNDMsMi4yMTctMS4wOWw0LjU1LDIuNjM3Yy0wLjEzOCwwLjMzMi0wLjIxNCwwLjY5My0wLjIxNCwxLjA3NGMwLDEuNTQ5LDEuMjYsMi44MDksMi44MDgsMi44MDljMS41NDksMCwyLjgwOS0xLjI2LDIuODA5LTIuODA5UzE2LjIyOSwxMi42MjEsMTQuNjgsMTIuNjIxTTE0LjY4LDIuNTEyYzEuMTM2LDAsMi4wNiwwLjkyMywyLjA2LDIuMDZTMTUuODE1LDYuNjMsMTQuNjgsNi42M3MtMi4wNTktMC45MjMtMi4wNTktMi4wNTlTMTMuNTQ0LDIuNTEyLDE0LjY4LDIuNTEyTTUuMzE5LDEyLjA2MWMtMS4xMzYsMC0yLjA2LTAuOTI0LTIuMDYtMi4wNnMwLjkyMy0yLjA1OSwyLjA2LTIuMDU5YzEuMTM1LDAsMi4wNiwwLjkyMywyLjA2LDIuMDU5UzYuNDU0LDEyLjA2MSw1LjMxOSwxMi4wNjFNMTQuNjgsMTcuNDg4Yy0xLjEzNiwwLTIuMDU5LTAuOTIyLTIuMDU5LTIuMDU5czAuOTIzLTIuMDYxLDIuMDU5LTIuMDYxczIuMDYsMC45MjQsMi4wNiwyLjA2MVMxNS44MTUsMTcuNDg4LDE0LjY4LDE3LjQ4OCI+PC9wYXRoPgoJCQkgICAgPC9zdmc+CgkJCSAgPC9hPgoJCQk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iaXRlbXMiPgogICAgICAgIDxhIGNsYXNzPSJ0aXRsZSIgaHJlZj0iIyI+ZmlsZXMuaHRtbDwvYT4KICAgICAgICA8YSBpZD0ibWVudSIgaHJlZj0iIyI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJtZW51c3ZnIHN2Zy1pY29uIiB2aWV3Qm94PSIwIDAgMjAgMjAiPgoJCSAgICAgICAgPHBhdGggZD0iTTEwLDEuNDQ1Yy00LjcyNiwwLTguNTU1LDMuODI5LTguNTU1LDguNTU1YzAsNC43MjUsMy44MjksOC41NTUsOC41NTUsOC41NTVjNC43MjUsMCw4LjU1NS0zLjgzLDguNTU1LTguNTU1QzE4LjU1NSw1LjI3NCwxNC43MjUsMS40NDUsMTAsMS40NDUgTTEwLDE3LjY1NGMtNC4yMjEsMC03LjY1NC0zLjQzNC03LjY1NC03LjY1NGMwLTQuMjIxLDMuNDMzLTcuNjU0LDcuNjU0LTcuNjU0YzQuMjIyLDAsNy42NTQsMy40MzMsNy42NTQsNy42NTRDMTcuNjU0LDE0LjIyMSwxNC4yMjIsMTcuNjU0LDEwLDE3LjY1NCBNMTQuMzksMTBjMCwwLjI0OC0wLjIwMywwLjQ1LTAuNDUsMC40NUg2LjA2Yy0wLjI0OCwwLTAuNDUtMC4yMDMtMC40NS0wLjQ1czAuMjAzLTAuNDUsMC40NS0wLjQ1aDcuODc5QzE0LjE4Nyw5LjU1LDE0LjM5LDkuNzUyLDE0LjM5LDEwIE0xNC4zOSwxMi43MDJjMCwwLjI0Ny0wLjIwMywwLjQ0OS0wLjQ1LDAuNDQ5SDYuMDZjLTAuMjQ4LDAtMC40NS0wLjIwMi0wLjQ1LTAuNDQ5YzAtMC4yNDgsMC4yMDMtMC40NTEsMC40NS0wLjQ1MWg3Ljg3OUMxNC4xODcsMTIuMjUxLDE0LjM5LDEyLjQ1NCwxNC4zOSwxMi43MDIgTTE0LjM5LDcuMjk4YzAsMC4yNDgtMC4yMDMsMC40NS0wLjQ1LDAuNDVINi4wNmMtMC4yNDgsMC0wLjQ1LTAuMjAzLTAuNDUtMC40NXMwLjIwMy0wLjQ1LDAuNDUtMC40NWg3Ljg3OUMxNC4xODcsNi44NDgsMTQuMzksNy4wNTEsMTQuMzksNy4yOTgiPjwvcGF0aD4KCSAgICAgICAgPC9zdmc+CiAgICAgICAgPC9hPgogICAgICAgIDxmb3JtIGlkPSJxdWVyeS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJxdWVyeSIgbmFtZT0icXVlcnkiIGlkPSIiIC8+CiAgICAgICAgICA8c2VsZWN0IGlkPSJxdWVyeS10eXBlIj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iYWxsIj5hbGw8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaW1hZ2UiPmltYWdlczwvb3B0aW9uPgogICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ2aWRlbyI+dmlkZW9zPC9vcHRpb24+CiAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgIDxpbnB1dCBpZD0iZ28iIHR5cGU9InN1Ym1pdCIgdmFsdWU9ImdvIi8+CiAgICAgICAgPC9mb3JtPgogICAgICAgIDxzcGFuIGlkPSJxdWVyeWRpc3BsYXkiPgogICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQiPjwvc3Bhbj4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPGRpdiBpZD0ibG9hZGluZyI+dXBkYXRpbmc8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InBsYWNlaG9sZGVyIj5Tb21ldGhpbmcgc2hvdWxkIGxvYWQgc29vbiwgbWF5YmUuPC9kaXY+CiAgICA8ZGl2IGlkPSJpbWFnZXMiPjwvZGl2PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vc2xvd2xpLmdpdGh1Yi5pby9iZWNoMzItYnVmZmVyL2Fzc2V0cy9qcy9iZWNoMzItYnVmZmVyLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICBjb25zdCB1cGRhdGVzcHVia2V5ID0gImFlNWM2ZTBiNzQ2NjBkMjE5NGM4MjU0YjVjMmM4MjU2NzY1NzZiZTAyOTczNzlmYTIwNTIzMTE0YTZhODVlODciCiAgICAgIGNvbnN0IHF1ZXJpZXMgPSB7IAogICAgICAgICJhdXRob3IiOiAnWyJSRVEiLCI8ST4iLHsia2luZHMiOlsxXSwiYXV0aG9ycyI6WyI8UD4iXX1dJwogICAgICB9CiAgICAgIHFzKCIjcmVsYXlzIikudmFsdWUgPSByZWxheXMoKS5qb2luKCJcbiIpCiAgICAgIHFzKCIjcHJpdmtleSIpLnZhbHVlID0gcHJpdmtleSgpCiAgICAgIGNvbnN0IGNvbG9wdHMgPSBbMSwgMiwgNCwgNiwgMTBdCgogICAgICBjb2xzID0gKCkgPT4gcGFyc2VJbnQoc2V0dGluZygiY29scyIsIGNvbG9wdHNbMl0pLCAxMCkKICAgICAgYXV0b3BsYXkgPSAoKSA9PiBzZXR0aW5nKCJhdXRvcGxheSIsICJvZmYiKQogICAgICBsaW1pdCA9ICgpID0+IHBhcnNlSW50KHNldHRpbmcoImxpbWl0IiwgMTUpLCAxMCkKICAgICAgZ2FsbGVyeSA9ICgpID0+IHsKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2dhbGxlcnk9KFthLXowLTldKykvKQogICAgICAgIHJldHVybiBnYWxsZXJ5bWF0Y2hlciAmJiBnYWxsZXJ5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIHZpZXdwdWJrZXkgPSAoKSA9PiB7CiAgICAgICAgbGV0IHB1YmtleW1hdGNoZXIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL3B1YmtleT0oW2EtejAtOV0rKS8pCiAgICAgICAgcmV0dXJuIHB1YmtleW1hdGNoZXIgJiYgcHVia2V5bWF0Y2hlclsxXQogICAgICB9CiAgICAgIAogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgY29scygpKQoKICAgICAgbGV0IHByb3RvY29sID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlLykgPyAibm9zdHI6IiA6ICJ3ZWIrbm9zdHI6IgogICAgICBsZXQgc29ja2V0cyA9IFtdCiAgICAgIGxldCByZXNoYW5kbGVycyA9IFtdCiAgICAgIGxldCB1cmxzID0gW10KICAgICAgbGV0IGxpa2VzID0gW10KICAgICAgbGV0IG5ld2xpa2VzID0gW10KICAgICAgbGV0IGlkY291bnRlciA9IDAKICAgICAgbGV0IHF1ZXJ5d2FpdCA9IG51bGwKICAgICAgbGV0IHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgbGV0IHR5cGVzID0gewogICAgICAgIGltYWdlOiBbInBuZyIsICJqcGciLCAianBlZyIsICJ3ZWJwIl0sCiAgICAgICAgdmlkZW86IFsibXA0IiwgIndlYm0iXQogICAgICB9CiAgICAgIGxldCBpbWdyZWdleCA9IC9odHRwKHxzKVw6XC9cL1teIFxuXSo/XC4ocG5nfGpwZ3xqcGVnfHdlYnApL2dpCiAgICAgIGxldCB2aWRlb3JlZ2V4ID0gL2h0dHAofHMpXDpcL1wvW14gXG5dKj9cLihtcDR8d2VibSkvZ2kKICAgICAgbGV0IHZpZGVvZXh0cmVnZXggPSAvXC4obXA0fHdlYm0pJC9pCiAgICAgIGxldCBpbWdleHRyZWdleCA9IC9cLihwbmd8anBnfGpwZWd8d2VicCkkL2kKICAgICAgd2FpdG1zID0gNTAwMDAKICAgICAgcXVlcnlzdHIgPSAiIgogICAgICBsZXQgcXVlcnljb3VudCA9IDAKICAgICAgbGV0IGhvdmVyZWR2aWRlbyA9IG51bGwKICAgICAgCiAgICAgIHVwZGF0ZXF1ZXJ5KCkKICAgICAgcXMoIiNpbWFnZS1saWtlIikuaW5uZXJIVE1MID0gcXMoIiNmaWx0ZXItbGlrZXMiKS5pbm5lckhUTUwgPSBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTAogICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgc2V0YWN0aXZlKCJzZXRhdXRvcGxheSIsICJhdXRvcGxheSIsIGF1dG9wbGF5KCkpCiAgICAgIAogICAgICBmdW5jdGlvbiBmcm9tSGV4U3RyaW5nKHN0cil7CiAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGggLyAyKQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBidWZmZXJbaV0gPSBwYXJzZUludChzdHIuc3Vic3RyKDIgKiBpLCAyKSwgMTYpCiAgICAgICAgfQogICAgICAgIHJldHVybiBidWZmZXIKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gaTJoZXgoaSkgewogICAgICAgIHJldHVybiAoJzAnICsgaS50b1N0cmluZygxNikpLnNsaWNlKC0yKTsKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdG9oZXgobnB1Yil7CiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oYmVjaDMyLmRlY29kZShucHViKS5kYXRhKS5tYXAoaTJoZXgpLmpvaW4oJycpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJlbGF5cygpewogICAgICAgIGNvbnN0IG9iaiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oInJlbGF5cyIpKQogICAgICAgIGNvbnN0IHIgPSBvYmogJiYgb2JqLmZpbHRlcihyID0+IHIubWF0Y2goL3dzczpcL1wvLisvKSkgfHwgW10KICAgICAgICAKICAgICAgICByZXR1cm4gci5sZW5ndGggPiAwICYmIHIgfHwgWwogICAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiLAogICAgICAgICAgIndzczovL25iLnJlbGF5LmNlbnRlciIsIAogICAgICAgICAgIndzczovL25vc3RyLmNvbXBpbGUtZXJyb3IubmV0IgogICAgICAgIF0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJpdmtleSgpewogICAgICAgIGxldCBrZXkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgicHJpdmtleSIpIHx8ICIiCiAgICAgICAgCiAgICAgICAgaWYoa2V5Lmxlbmd0aCA9PSA2Myl7CiAgICAgICAgICBrZXkgPSBOb3N0clRvb2xzLm5pcDE5LmRlY29kZShrZXkpLmRhdGEKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGtleS5sZW5ndGggPT0gNjQgJiYga2V5IHx8IG51bGwKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2V0dGluZyhrZXksIGRlZmF1bHR2YWx1ZSl7CiAgICAgICAgY29uc3QgdiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSkKICAgICAgICByZXR1cm4gdiAmJiBvcHRpb24oInNldCIgKyBrZXksIGtleSwgdikgJiYgdiB8fCBkZWZhdWx0dmFsdWUKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gb3B0aW9uKGMsIGtleSwgdmFsKXsKICAgICAgICByZXR1cm4gcXMoIi4iICsgYyArICJbZGF0YS0iICsga2V5ICsgIj0nIiArIHZhbCArICInXSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzKHEpewogICAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHEpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHFzYShxKXsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHEpKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBnaWQoaSl7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHF1ZXJ5dHlwZSgpewogICAgICAgIHJldHVybiBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSB8fCAiYWxsIgogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVxdWVyeSgpewogICAgICAgIGxldCBzdHIgPSAoZ2FsbGVyeSgpICYmICJnOiIgKyBnYWxsZXJ5KCkpCiAgICAgICAgc3RyID0gc3RyIHx8ICh2aWV3cHVia2V5KCkgJiYgIms6IiArIHZpZXdwdWJrZXkoKSkKICAgICAgICBzdHIgPSBzdHIgfHwgZGVjb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpKSAgCiAgICAgICAgbGV0IHBhcnRzID0gc3RyLnNwbGl0KCIvIikKICAgICAgICBxcygiI3F1ZXJ5ZGlzcGxheSAudGV4dCIpLmlubmVyVGV4dCA9IHBhcnRzWzBdCiAgICAgICAgcXVlcnlzdHIgPSBwYXJ0c1swXQogICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9IHBhcnRzWzBdCiAgICAgICAgcXMoIiNxdWVyeS10eXBlIikudmFsdWUgPSBwYXJ0c1sxXSB8fCAiYWxsIgogICAgICB9CgogICAgICBmdW5jdGlvbiBhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXMoIiNpbWFnZXMgLmFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGltYWdlb2Zmc2V0KG9mZnNldCl7CiAgICAgICAgY29uc3QgaW1hZ2VzID0gcXNhKCIjaW1hZ2VzID4gLml0ZW0iKS5maWx0ZXIobiA9PiBuLm9mZnNldFBhcmVudCkuZmlsdGVyKGUgPT4gZS5jbGFzc0xpc3QuY29udGFpbnMoInZpc2libGUiKSkKICAgICAgICByZXR1cm4gaW1hZ2VzW2ltYWdlcy5pbmRleE9mKGFjdGl2ZSgpKStvZmZzZXRdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxhc3RhY3RpdmUoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5hY3RpdmUiKS5wb3AoKSAgICAgIAogICAgICB9CgogICAgICBmdW5jdGlvbiBtZW51KCl7CiAgICAgICAgcXNhKCIjbWVudS1jb250ZW50LCAjb3ZlcmxheSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC50b2dnbGUoInZpc2libGUiKSkKICAgICAgfQogIAogICAgICBmdW5jdGlvbiBzZXRhY3RpdmUoYywga2V5LCB2YWwpewogICAgICAgIHFzYSgiLiIgKyBjKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKSkKICAgICAgICBjb25zdCBvcHRpb24gPSBxcygiLiIgKyBjICsgIltkYXRhLSIgKyBrZXkgKyAiPSciICsgdmFsICsgIiddIikKICAgICAgICBvcHRpb24/LmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNjcm9sbHZpc2libGUobiwgb2Zmc2V0KXsKICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMAogICAgICAgIHJldHVybiAobi5vZmZzZXRUb3AgKyBuLm9mZnNldEhlaWdodCkgPj0gKHNjcm9sbFkgLSBvZmZzZXQpCiAgICAgICAgICAmJiBuLm9mZnNldFRvcCA8PSAoc2Nyb2xsWSArIHZpc3VhbFZpZXdwb3J0LmhlaWdodCArIG9mZnNldCkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlaW1hZ2VzbG9hZCgpewogICAgICAgIHFzYSgiI2ltYWdlcyAuaXRlbS5pbWciKS5mb3JFYWNoKGFzeW5jIGltZyA9PiB7CiAgICAgICAgICBpZihzY3JvbGx2aXNpYmxlKGltZywgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICBpbWcuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gInVybCgiICsgaW1nWyJkYXRhLXNyYyJdICsgIikiCiAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgaW1nLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICIiCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlYWxsdmlkZW9wbGF5KCl7CiAgICAgICAgcXNhKCIjaW1hZ2VzIC5pdGVtLnZpZGVvIikuZm9yRWFjaChhc3luYyBuID0+IHVwZGF0ZXZpZGVvcGxheShuKSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHJldmlld3VybHMoKXsKICAgICAgICByZXR1cm4gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLnNsaWNlKDAsIDQpLm1hcChuID0+IG5bImRhdGEtaXRlbSJdLnVybCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRldmlkZW9wbGF5KG4pewogICAgICAgIGNvbnN0IGFwbGF5ID0gYXV0b3BsYXkoKQogICAgICAgIGNvbnN0IHYgPSBuLnF1ZXJ5U2VsZWN0b3IoInZpZGVvIikKICAgICAgICAKICAgICAgICBpZihhcGxheSAhPSAib24iKXsKICAgICAgICAgIHYubXV0ZWQgPSBmYWxzZQogICAgICAgICAgdi5wYXVzZSgpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICB2Lm11dGVkID0gdHJ1ZQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighc2Nyb2xsdmlzaWJsZShuKSl7CiAgICAgICAgICBpZih2LnJlYWR5U3RhdGUgPT0gNCl7CiAgICAgICAgICAgIHYucGF1c2UoKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIHYucHJlbG9hZCA9ICJub25lIgogICAgICAgICAgfQogICAgICAgIH1lbHNlIGlmKHYucmVhZHlTdGF0ZSAhPSA0KXsKICAgICAgICAgIHYucHJlbG9hZCA9ICJhdXRvIgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFwbGF5ID09ICJvbiIgfHwgKGFwbGF5ID09ICJob3ZlciIgJiYgdiA9PSBob3ZlcmVkdmlkZW8pKXsKICAgICAgICAgIHYucGxheSgpCiAgICAgICAgfQogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLCBlID0+IHsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgfSkKICAgICAgCiAgICAgIGxldCB0b3VjaCA9IG51bGwKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLCBlID0+IHRvdWNoID0gZS5jaGFuZ2VkVG91Y2hlc1swXSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwgZSA9PiB7CiAgICAgICAgY29uc3QgeGRpZmYgPSBlLmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblggLSB0b3VjaC5zY3JlZW5YCgogICAgICAgIGlmKHhkaWZmIDwgLTUwKXsKICAgICAgICAgIHN3aXBlKDEpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHhkaWZmID4gNTApewogICAgICAgICAgc3dpcGUoLTEpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgcXMoIiNxdWVyeS1mb3JtIikuYWRkRXZlbnRMaXN0ZW5lcigic3VibWl0IiwgZSA9PiB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIG51bGwsIGxvY2F0aW9uLnBhdGhuYW1lKQogICAgICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyBlbmNvZGVVUklDb21wb25lbnQocXMoIiNxdWVyeSIpLnZhbHVlICsgIi8iICsgcXVlcnl0eXBlKCkpCiAgICAgICAgdXBkYXRlcXVlcnkoKQogICAgICAgIHF1ZXJ5d2FpdC5yZXNvbHZlKCkKICAgICAgfSkKCiAgICAgIHFzKCIjcmVsYXlzLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgciA9IEpTT04uc3RyaW5naWZ5KHFzKCIjcmVsYXlzIikudmFsdWUuc3BsaXQoIlxuIikpCiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oInJlbGF5cyIsIHIpCiAgICAgICAgZGlzY29ubmVjdCgpCiAgICAgIH0pCiAgICAgIAogICAgICBxcygiI3NoYXJlLWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAKICAgICAgICBpZihxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID09ICJjbG9zZSIpewogICAgICAgICAgcXNhKCIuZGlhbG9nLnZpc2libGUiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgZXZlbnRzID0gcXNhKCIjaW1hZ2VzIC5pdGVtIikuZmlsdGVyKG4gPT4gbi5vZmZzZXRQYXJlbnQpLm1hcChuID0+IG5bImRhdGEtZXZlbnQiXS5pZCkKICAgICAgICBjb25zdCBldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAzMzMsCiAgICAgICAgICAiY29udGVudCI6IEpTT04uc3RyaW5naWZ5KGV2ZW50cyksCiAgICAgICAgICAidGFncyI6IFtdCiAgICAgICAgfSkKCiAgICAgICAgYXdhaXQgd2FpdHJlcyhudWxsLCAiT0siKQoKICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lCiAgICAgICAgCiAgICAgICAgY29uc3QgY29udGVudCA9ICJUaGlzIGlzIGEgZ2FsbGVyeSBvZiAiICsgZXZlbnRzLmxlbmd0aAogICAgICAgICAgICArICIgaW1hZ2VzL3ZpZGVvcyBzaGFyZWQgZnJvbSBmaWxlcy5odG1sLiBDaGVjayBpdCBvdXQgaGVyZTogIiArIHVybCArICI/Z2FsbGVyeT0iICsgZXZlbnQuaWQKICAgICAgICAgICAgKyAiXG5cbiIgKyBwcmV2aWV3dXJscygpLmpvaW4oIlxuIikKICAgICAgICAKICAgICAgICBjb25zdCBwdWJsaXNoZWRldmVudCA9IGF3YWl0IHB1Ymxpc2goewogICAgICAgICAgImtpbmQiOiAxLAogICAgICAgICAgImNvbnRlbnQiOiBjb250ZW50LAogICAgICAgICAgInRhZ3MiOiBbCiAgICAgICAgICAgIFsiI2UiLCBldmVudC5pZF0sIAogICAgICAgICAgICBbIiNwIiwgZXZlbnQucHVia2V5XQogICAgICAgICAgXQogICAgICAgIH0pCgogICAgICAgIGF3YWl0IHdhaXRyZXMobnVsbCwgIk9LIikKICAgICAgICAKICAgICAgICBjb25zdCBiZWNoMzJpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHB1Ymxpc2hlZGV2ZW50LmlkKSkKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAnTm90ZSBwdWJsaXNoZWQgPGEgaHJlZj0iJyArIHByb3RvY29sICsgYmVjaDMyaWQgKyAnIj4nICsgYmVjaDMyaWQgKyAnPC9hPicKICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gImNsb3NlIgogICAgICB9KQoKICAgICAgcXMoIiNwcml2a2V5LWZvcm0iKS5hZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBjb25zdCBrZXkgPSBxcygiI3ByaXZrZXkiKS52YWx1ZQoKICAgICAgICBpZihrZXkubGVuZ3RoICE9IDY0ICYmIGtleS5sZW5ndGggIT0gNjMpewogICAgICAgICAgYWxlcnQoImtleSBzaG91bGQgYmUgNjMgb3IgNjQgY2hhcmFjdGVycyBsb25nIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgicHJpdmtleSIsIGtleSkKICAgICAgICBhbGVydCgia2V5IHNhdmVkIikKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsIGFzeW5jIChlKSA9PiB7CiAgICAgICAgaWYoYXV0b3BsYXkoKSA9PSAiaG92ZXIiICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygidmlkZW8tY29udGFpbmVyIikpewogICAgICAgICAgaG92ZXJlZHZpZGVvID0gZS50YXJnZXQucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgaG92ZXJlZHZpZGVvLnBsYXkoKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBob3ZlcmVkdmlkZW8gPSBmYWxzZQogICAgICAgIGlmKCFxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpICYmIGF1dG9wbGF5KCkgPT0gImhvdmVyIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInZpZGVvLWNvbnRhaW5lciIpKXsKICAgICAgICAgIHFzYSgidmlkZW8iKS5mb3JFYWNoKHYgPT4gdi5wYXVzZSgpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKGUpID0+IHsKICAgICAgICBpZihlLnRhcmdldC50eXBlID09ICJzdWJtaXQiIHx8IChlLnRhcmdldC50YWdOYW1lID09ICJBIiAmJiBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpbmsiKSkpewogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgCiAgICAgICAgaWYoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCJ0aXRsZSIpKXsKICAgICAgICAgIHFzKCIjcXVlcnkiKS52YWx1ZSA9ICIiCiAgICAgICAgICBxcygiI3F1ZXJ5LXR5cGUiKS52YWx1ZSA9ICJhbGwiCiAgICAgICAgICBxcygiI2dvIikuY2xpY2soKQogICAgICAgIH0KCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJmaWx0ZXItbGlrZXMiKXsKICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnRvZ2dsZSgiZmlsdGVyLWxpa2VzIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAic2hhcmUiKXsKICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IHFzYSgiI2ltYWdlcyAuaXRlbSIpLmZpbHRlcihuID0+IG4ub2Zmc2V0UGFyZW50KS5tYXAobiA9PiBuWyJkYXRhLWV2ZW50Il0uaWQpCiAgICAgICAgICAvL2NvbnN0IHRleHQgPSB7dHlwZTogIiIsIGV2ZW50czogfQogICAgICAgICAgcXMoIiNzaGFyZS1kaWFsb2cgLmNvbnRlbnQiKS5pbm5lckhUTUwgPSAiPHA+U2hhcmUgbGluayB0byB0aGlzIGdhbGxlcnkgb2YgIiArIGV2ZW50cy5sZW5ndGggKyAiIGltYWdlcy92aWRlb3MgdG8geW91ciBub3N0ciBwcm9maWxlPzwvcD4iCiAgICAgICAgICBxcygiI3NoYXJlLWRpYWxvZyAuY29udGVudCIpLmlubmVySFRNTCArPSBwcmV2aWV3dXJscygpLm1hcCh1cmwgPT4gJzxpbWcgc3JjPSInK3VybCsnIi8+Jykuam9pbigiICIpCiAgICAgICAgICBxcygiI3NoYXJlLWZvcm0gLnN1Ym1pdCIpLnZhbHVlID0gInB1Ymxpc2giCiAgICAgICAgICBxc2EoIiNzaGFyZS1kaWFsb2csICNvdmVybGF5IikuZm9yRWFjaChuID0+IG4uY2xhc3NMaXN0LnRvZ2dsZSgidmlzaWJsZSIpKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNob3ciKSl7CiAgICAgICAgICBhY3RpdmUoKT8uY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIGNvbnN0IGlkID0gZS50YXJnZXQuaWQgfHwgZS50YXJnZXRbImRhdGEtaXRlbS1pZCJdCiAgICAgICAgICBnaWQoaWQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBzaG93KGlkKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgIT0gIkEiICYmIChxcygiI2ltYWdlLWNvbnRhaW5lciIpID09IGUudGFyZ2V0IHx8IHFzKCIjaW1hZ2UiKSA9PSBlLnRhcmdldCB8fCBxcygiI21lZGlhLWNvbnRhaW5lciB2aWRlbyIpID09IGUudGFyZ2V0KSl7CiAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBpZihlLnRhcmdldC5pZCA9PSAibWVudSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGlmKGUudGFyZ2V0LmlkID09ICJvdmVybGF5Iil7CiAgICAgICAgICBxc2EoIi5kaWFsb2cudmlzaWJsZSIpLmZvckVhY2gobiA9PiBuLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGNvbHMiKSl7CiAgICAgICAgICBmb3IobGV0IGMgb2YgY29sb3B0cyl7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiY29scyIgKyBjKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImNvbHMiICsgZS50YXJnZXQuZGF0YXNldC5jb2xzKQogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImNvbHMiLCBlLnRhcmdldC5kYXRhc2V0LmNvbHMpCiAgICAgICAgICBzZXRhY3RpdmUoInNldGNvbHMiLCAiY29scyIsIGNvbHMoKSkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAKICAgICAgICBpZihlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoInNldGF1dG9wbGF5IikpewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImF1dG9wbGF5IiwgZS50YXJnZXQuZGF0YXNldC5hdXRvcGxheSkKICAgICAgICAgIHNldGFjdGl2ZSgic2V0YXV0b3BsYXkiLCAiYXV0b3BsYXkiLCBhdXRvcGxheSgpKQogICAgICAgICAgdXBkYXRlYWxsdmlkZW9wbGF5KCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBlLnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImxpa2UiKSAmJiBsaWtlKGUudGFyZ2V0KQogICAgICB9KQogICAgICAKICAgICAgZnVuY3Rpb24gaGFza2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciB8fCBwcml2a2V5KCkKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmtleSgpKQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzaWduKGV2ZW50KXsKICAgICAgICBpZih3aW5kb3cubm9zdHIpewogICAgICAgICAgcmV0dXJuIGF3YWl0IG5vc3RyLnNpZ25FdmVudChldmVudCkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZXZlbnQuc2lnID0gTm9zdHJUb29scy5nZXRTaWduYXR1cmUoZXZlbnQsIHByaXZrZXkoKSkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbGlrZShsaW5rKXsKICAgICAgICBjb25zdCBldmVudCA9IGxpbmsucGFyZW50RWxlbWVudFsiZGF0YS1ldmVudCJdCiAgICAgICAgCiAgICAgICAgYXdhaXQgcHVibGlzaCh7CiAgICAgICAgICAia2luZCI6IDcsCiAgICAgICAgICAiY29udGVudCI6ICIrIiwKICAgICAgICAgICJ0YWdzIjogWwogICAgICAgICAgICBbImUiLCBldmVudC5pZF0sCiAgICAgICAgICAgIFsicCIsIGV2ZW50LnB1YmtleV0KICAgICAgICAgIF0KICAgICAgICB9KQoKICAgICAgICBsaW5rLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQoKICAgICAgICBjb25zdCBpbWFnZWlkID0gbGlua1siZGF0YS1pdGVtLWlkIl0gfHwgbGluay5kYXRhc2V0LmltYWdlSWQKICAgICAgICAKICAgICAgICBpZihpbWFnZWlkKXsKICAgICAgICAgIGdpZChpbWFnZWlkKS5xdWVyeVNlbGVjdG9yKCIubGlrZSIpLmNsYXNzTGlzdC5hZGQoInJlYWN0ZWQiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZV9ldmVudChldmVudCl7CiAgICAgICAgZXZlbnQucHVia2V5ID0gYXdhaXQgcHVia2V5KCkKICAgICAgICBldmVudC5jcmVhdGVkX2F0ID0gcGFyc2VJbnQoRGF0ZS5ub3coKSAvIDEwMDAsIDEwKQogICAgICAgIGV2ZW50LmlkID0gTm9zdHJUb29scy5nZXRFdmVudEhhc2goZXZlbnQpCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAgIH0KICAgICAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBwdWJsaXNoKGV2ZW50KXsKICAgICAgICBldmVudCA9IGF3YWl0IHByZXBhcmVfZXZlbnQoZXZlbnQpCiAgICAgICAgbGV0IHNpZ25lZGV2ZW50ID0gYXdhaXQgc2lnbihldmVudCkKICAgICAgICBsZXQganNvbiA9IEpTT04uc3RyaW5naWZ5KFsiRVZFTlQiLCBzaWduZWRldmVudF0pCiAgICAgICAgc29ja2V0cy5mb3JFYWNoKHMgPT4gcy5zZW5kKGpzb24pKQogICAgICAgIAogICAgICAgIHJldHVybiBldmVudAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBzd2lwZShvZmZzZXQpewogICAgICAgIGlmKGltYWdlb2Zmc2V0KG9mZnNldCkpewogICAgICAgICAgaW1hZ2VvZmZzZXQob2Zmc2V0KS5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgICAgdGhpc1tvZmZzZXQgPT0gLTEgJiYgImxhc3RhY3RpdmUiIHx8ICJhY3RpdmUiXSgpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZSIpCiAgICAgICAgICB1cGRhdGVzaG93KCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXNob3coKXsKICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YWlucygidmlzaWJsZSIpKXsKICAgICAgICAgIGhpZGV2aWRlbygpCiAgICAgICAgICBzaG93KGFjdGl2ZSgpLmlkKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGUgPT4gewogICAgICAgIGlmKFsiVGFiIiwgIkFycm93TGVmdCIsICJBcnJvd1JpZ2h0IiwgIkFycm93VXAiLCAiQXJyb3dEb3duIl0uaW5jbHVkZXMoZS5rZXkpKXsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkVzY2FwZSIpewogICAgICAgICAgbWVudSgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZS5rZXkgPT0gIkVudGVyIiAmJiBlLnRhcmdldC50YWdOYW1lID09ICJCT0RZIil7CiAgICAgICAgICBpZihxcygiI21lZGlhLWNvbnRhaW5lciIpLmNsYXNzTGlzdC5jb250YW5zKCJ2aXNpYmxlIikpewogICAgICAgICAgICBoaWRlbWVkaWEoKQogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgc2hvdyhhY3RpdmUoKS5pZCkKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93VXAiICYmIGltYWdlb2Zmc2V0KC1jb2xzKCkpKXsKICAgICAgICAgIGltYWdlb2Zmc2V0KC1jb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBsYXN0YWN0aXZlKCkuY2xhc3NMaXN0LnJlbW92ZSgiYWN0aXZlIikKICAgICAgICAgIHVwZGF0ZXNob3coKQogICAgICAgIH0KCiAgICAgICAgaWYoZS5rZXkgPT0gIkFycm93RG93biIgJiYgaW1hZ2VvZmZzZXQoY29scygpKSl7CiAgICAgICAgICBpbWFnZW9mZnNldChjb2xzKCkpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZSIpCiAgICAgICAgICBhY3RpdmUoKS5jbGFzc0xpc3QucmVtb3ZlKCJhY3RpdmUiKQogICAgICAgICAgdXBkYXRlc2hvdygpCiAgICAgICAgfQoKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dMZWZ0Iil7CiAgICAgICAgICBzd2lwZSgtMSkKICAgICAgICB9CgogICAgICAgIGlmKGUua2V5ID09ICJBcnJvd1JpZ2h0Iil7CiAgICAgICAgICBzd2lwZSgxKQogICAgICAgIH0KICAgICAgfSkKCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXF1ZXJ5cmVzKHJlcywgc29ja2V0LCBxLCB0eXBlLCBzdGltZSl7CiAgICAgICAgc2F2ZShzb2NrZXQsIHJlcywgcSwgdHlwZSwgZmFsc2UsIGZhbHNlLCB0cnVlKQogICAgICAgIGxvZygicXVlcnkgcmVzIiwgcmVzLmxlbmd0aCwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50LS0KICAgICAgICBpZihxdWVyeWNvdW50ID09IDApewogICAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LnJlbW92ZSgidmlzaWJsZSIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGxldCB3YWl0ID0gd2FpdG1zIC0gKERhdGUubm93KCkgLSBzdGltZSkKICAgICAgICBxdWVyeXdhaXQgPSBzbGVlcCh3YWl0KQogICAgICAgIGF3YWl0IHF1ZXJ5d2FpdC5wcm9taXNlCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHByaW1hbGdsb2JhbChzb2NrZXQpewogICAgICAgIGxvZygiZ2xvYmFsIiwgc29ja2V0LnVybCkKICAgICAgICBxdWVyeWNvdW50KysKICAgICAgICBxcygiI2xvYWRpbmciKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBsZXQgc3RpbWUgPSBEYXRlLm5vdygpCiAgICAgICAgbGV0IHFpZCA9ICJnbG9iYWxfIiArICgrK2lkY291bnRlcikKICAgICAgICBsZXQgcWlkbGlrZXMgPSAibGlrZXNfIiArICgrK2lkY291bnRlcikKCiAgICAgICAgaWYobmV3bGlrZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICBwcmltYWxzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeShbCiAgICAgICAgICAgICJSRVEiLCAKICAgICAgICAgICAgcWlkbGlrZXMsIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgImNhY2hlIjogWwogICAgICAgICAgICAgICAgImV2ZW50cyIsIHsKICAgICAgICAgICAgICAgICAgImV2ZW50X2lkcyI6IG5ld2xpa2VzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgICBdKSkKCiAgICAgICAgICBjb25zdCBsaWtlX2V2ZW50cyA9IChhd2FpdCB3YWl0cmVzKHFpZGxpa2VzKSlbMF0KICAgICAgICAgIG5ld2xpa2VzLnNwbGljZSgwKQogICAgICAgICAgCiAgICAgICAgICBhd2FpdCBzYXZlKHNvY2tldCwgbGlrZV9ldmVudHMsICIiLCAiYWxsIiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHFpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJjYWNoZSI6IFsKICAgICAgICAgICAgICAiZXhwbG9yZSIsIAogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0aW1lZnJhbWUiOiAibGF0ZXN0IiwKICAgICAgICAgICAgICAgICJzY29wZSI6ICJnbG9iYWwiLAogICAgICAgICAgICAgICAgImxpbWl0IjogNTAKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0KICAgICAgICAgIH0KICAgICAgICBdKSkKICAgICAgICAKICAgICAgICBjb25zdCByZXMgPSAoYXdhaXQgd2FpdHJlcyhxaWQpKVswXQogICAgICAgIGF3YWl0IGhhbmRsZXF1ZXJ5cmVzKHJlcy5maWx0ZXIoZSA9PiBlLmtpbmQgPT0gMSksIHNvY2tldCwgIiIsICJhbGwiLCBzdGltZSkKICAgICAgICBwcmltYWxnbG9iYWwoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeShzb2NrZXQsIHByaW1hbCl7CiAgICAgICAgbG9nKCJxdWVyeSIsIHNvY2tldC51cmwpCiAgICAgICAgcXVlcnljb3VudCsrCiAgICAgICAgcXMoIiNsb2FkaW5nIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgCiAgICAgICAgbGV0IHN0aW1lID0gRGF0ZS5ub3coKQogICAgICAgIGxldCBxID0gcXVlcnlzdHIudHJpbSgpCiAgICAgICAgbGV0IHR5cGUgPSBxdWVyeXR5cGUoKQogICAgICAgIGxldCBpID0gKytpZGNvdW50ZXIKICAgICAgICBsZXQgcWlkID0gInF1ZXJ5XyIgKyBpCiAgICAgICAgY29uc3QgbGlrZXNyZXMgPSBhd2FpdCBxdWVyeWxpa2VzKHNvY2tldCkKICAgICAgICAKICAgICAgICBsaWtlc3Jlcy5mb3JFYWNoKGV2ZW50aWQgPT4gewogICAgICAgICAgaWYoIWxpa2VzLmluY2x1ZGVzKGV2ZW50aWQpKXsKICAgICAgICAgICAgbGlrZXMucHVzaChldmVudGlkKQogICAgICAgICAgICBuZXdsaWtlcy5wdXNoKGV2ZW50aWQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAKICAgICAgICBsZXQgZ2FsbGVyeW1hdGNoID0gcXVlcnlzdHIubWF0Y2goL2c6KFthLXowLTldKykvKQogICAgICAgIGxldCBwdWJrZXltYXRjaCA9IHF1ZXJ5c3RyLm1hdGNoKC9rOihbYS16MC05XSspLykKICAgICAgICBsZXQgcmVzID0gbnVsbAogICAgICAgIAogICAgICAgIGlmKGdhbGxlcnltYXRjaCl7CiAgICAgICAgICBjb25zdCBnYWxsZXJ5cmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzMzXSwgW2dhbGxlcnltYXRjaFsxXV0sIG51bGwpCiAgICAgICAgICBjb25zdCBldmVudGlkcyA9IEpTT04ucGFyc2UoZ2FsbGVyeXJlc1swXS5jb250ZW50KQogICAgICAgICAgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIGV2ZW50aWRzLCBudWxsKQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHB1YmtleW1hdGNoKXsKICAgICAgICAgIGNvbnN0IGtleSA9IHB1YmtleW1hdGNoWzFdLmluZGV4T2YoIm5wdWIiKSA9PSAwICYmIHRvaGV4KHB1YmtleW1hdGNoWzFdKSB8fCBwdWJrZXltYXRjaFsxXQogICAgICAgICAgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIG51bGwsIFtrZXldKQogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXQoKICAgICAgICAgIGZpbHRlcnMucHVzaCguLi4odHlwZXNbdHlwZV0gfHwgW10pLm1hcCgodCkgPT4gewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIGtpbmRzOiBbMV0sIAogICAgICAgICAgICAgIHNlYXJjaDogIi4iICsgdCwKICAgICAgICAgICAgICBsaW1pdDogMjAKICAgICAgICAgICAgfQogICAgICAgICAgfSkpCiAgICAgICAgICAKICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXSwgc2VhcmNoOiBxfSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoZmlsdGVycy5sZW5ndGggPT0gMCl7CiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7a2luZHM6IFsxXX0pCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IHNlYXJjaG9iaiA9IFsiUkVRIiwgcWlkLCAuLi5maWx0ZXJzXQogICAgICAgICAgY29uc3Qgc2VhcmNoanNvbiA9IEpTT04uc3RyaW5naWZ5KHNlYXJjaG9iaikKICAgICAgICAgIHNvY2tldC5zZW5kKHNlYXJjaGpzb24pCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IChhd2FpdCB3YWl0cmVzKHFpZCkpWzBdCiAgICAgICAgICAKICAgICAgICAgIHJlcyA9IHJlcy5maWx0ZXIobyA9PiB7CiAgICAgICAgICAgIGlmKHEubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgZm9yKGxldCB3b3JkIG9mIHEuc3BsaXQoIiAiKSl7CiAgICAgICAgICAgICAgICBpZihvLmNvbnRlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKHdvcmQudG9Mb3dlckNhc2UoKSkgPT0gLTEpewogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBhd2FpdCBoYW5kbGVxdWVyeXJlcyhyZXMsIHNvY2tldCwgcSwgdHlwZSwgc3RpbWUpCiAgICAgICAgcXVlcnkoc29ja2V0KQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBxdWVyeWxpa2VzKHNvY2tldCl7CiAgICAgICAgaWYoIWhhc2tleSgpKXsKICAgICAgICAgIHJldHVybiBbXQogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb25zdCBteXB1YmtleSA9IGF3YWl0IHB1YmtleSgpCiAgICAgICAgY29uc3QgZXZlbnRzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbN10sIG51bGwsIFtteXB1YmtleV0pCiAgICAgICAgcmV0dXJuIGV2ZW50cy5tYXAoZSA9PiBlLnRhZ3MuZmluZCh0ID0+IHRbMF0gPT0gImUiKVsxXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcXVlcnlldmVudHMoc29ja2V0LCBraW5kcywgZXZlbnRpZHMsIGF1dGhvcnMpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgY29uc3QgZmlsdGVycyA9IHt9CiAgICAgICAgCiAgICAgICAgZmlsdGVycy5raW5kcyA9IGtpbmRzCiAgICAgICAgCiAgICAgICAgaWYoZXZlbnRpZHMpewogICAgICAgICAgZmlsdGVyc1siaWRzIl0gPSBldmVudGlkcwogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihhdXRob3JzKXsKICAgICAgICAgIGZpbHRlcnNbImF1dGhvcnMiXSA9IGF1dGhvcnMKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KFsKICAgICAgICAgICJSRVEiLCAKICAgICAgICAgIHF1ZXJ5aWQsIAogICAgICAgICAgZmlsdGVycwogICAgICAgIF0pCiAgICAgICAgCiAgICAgICAgc29ja2V0LnNlbmQoanNvbikKICAgICAgICAKICAgICAgICByZXR1cm4gKGF3YWl0IHdhaXRyZXMocXVlcnlpZCkpWzBdIHx8IFtdCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNhdmUoc29ja2V0LCBldmVudHMsIHEsIHF0eXBlLCByZWFjdGVkLCBhcHBlbmQsIHF1ZXJ5bWV0YSl7CiAgICAgICAgbGV0IGV2ZW50cHVia2V5cyA9IFtdCiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXQogICAgICAgIGNvbnN0IGV2ZW50aWRzID0gZXZlbnRzLm1hcChlID0+IGUuaWQpCiAgICAgICAgbGV0IG5ld3VybHMgPSBbXQogICAgICAgIAogICAgICAgIGZvcihsZXQgZXZlbnQgb2YgZXZlbnRzKXsKICAgICAgICAgIGxldCB1cmxzbWF0Y2ggPSBbXQogICAgICAgICAgCiAgICAgICAgICBpZihxdHlwZSAhPSAidmlkZW8iKXsKICAgICAgICAgICAgdXJsc21hdGNoLnB1c2goLi4uKGV2ZW50LmNvbnRlbnQubWF0Y2goaW1ncmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYocXR5cGUgIT0gImltYWdlIil7CiAgICAgICAgICAgIHVybHNtYXRjaC5wdXNoKC4uLihldmVudC5jb250ZW50Lm1hdGNoKHZpZGVvcmVnZXgpIHx8IFtdKSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgdXJsc21hdGNoID0gdXJsc21hdGNoLmZpbHRlcih1cmwgPT4gIXVybHMuaW5jbHVkZXModXJsKSkKCiAgICAgICAgICBpZih1cmxzbWF0Y2gubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIG5ld3VybHMucHVzaCh7CiAgICAgICAgICAgICAgZXZlbnQ6IGV2ZW50LAogICAgICAgICAgICAgIHVybHM6IHVybHNtYXRjaAogICAgICAgICAgICB9KQogICAgICAgICAgICAKICAgICAgICAgICAgdXJscy5wdXNoKC4uLnVybHNtYXRjaCkKICAgICAgICAgICAgZXZlbnRwdWJrZXlzLmluY2x1ZGVzKGV2ZW50LnB1YmtleSkgfHwgZXZlbnRwdWJrZXlzLnB1c2goZXZlbnQucHVia2V5KQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsb2coInF1ZXJ5IG1ldGEiLCBzb2NrZXQudXJsKQogICAgICAgIGxldCBtZXRhZXZlbnRzID0gKHF1ZXJ5bWV0YSAmJiBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFswXSwgbnVsbCwgZXZlbnRwdWJrZXlzKSB8fCBbXSkKICAgICAgICAKICAgICAgICBmb3IobGV0IGVudHJ5IG9mIG5ld3VybHMpewogICAgICAgICAgZm9yKGxldCB1cmwgb2YgZW50cnkudXJscyl7CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgcmVhY3RlZDogcmVhY3RlZCB8fCBsaWtlcy5pbmNsdWRlcyhlbnRyeS5ldmVudC5pZCksIAogICAgICAgICAgICAgIHVybDogdXJsLCAKICAgICAgICAgICAgICBldmVudDogZW50cnkuZXZlbnQsIAogICAgICAgICAgICAgIGJlY2gzMmlkOiBiZWNoMzIuZW5jb2RlKCJub3RlIiwgZnJvbUhleFN0cmluZyhlbnRyeS5ldmVudC5pZCkpLAogICAgICAgICAgICAgIG1ldGE6IG1ldGFldmVudHMuZmluZChvID0+IG8ucHVia2V5ID09IGVudHJ5LmV2ZW50LnB1YmtleSkKICAgICAgICAgICAgfSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9nKCJzYXZlIHJlcyIsIHJlc3VsdHMubGVuZ3RoLCBzb2NrZXQudXJsKQogICAgICAgIHVwZGF0ZWNvbnRlbnQocmVzdWx0cywgcSwgYXBwZW5kKQogICAgICB9CiAgICAgIAogICAgICBsZXQgbG9hZGVkID0gMAogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlY29udGVudChyZXN1bHRzLCBxLCBhcHBlbmQpewogICAgICAgIHJlc3VsdHMucmV2ZXJzZSgpLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCB0eXBlID0gaXRlbS51cmwubWF0Y2godmlkZW9leHRyZWdleCkgJiYgInZpZGVvIiB8fCAiaW1hZ2UiCiAgICAgICAgICBjb25zdCB0ZXh0ID0gKHEgfHwgInZpZXcgbm90ZSIpLnN1YnN0cmluZygtMzApCiAgICAgICAgICBjb25zdCBpZCA9ICJpdGVtXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgICBjb25zdCBjb250ZW50ZWxlbWVudHMgPSAnPGRpdiBjbGFzcz0idHlwZSI+JyArIHFzKCIjdGVtcGxhdGUgLiIgKyB0eXBlICsgInN2ZyIpLm91dGVySFRNTCArICc8L2Rpdj48YSBjbGFzcz0ibGlrZScgKyAoaXRlbS5yZWFjdGVkID8gJyByZWFjdGVkJyA6ICcnKSArICciIGRhdGEtaXRlbS1pZD0iJyArIGlkICsgCiAgICAgICAgICAgICciIGhyZWY9IiMiPicgKyBxcygiI3RlbXBsYXRlIC5oZWFydHN2ZyIpLm91dGVySFRNTCArICc8L2E+PGEgY2xhc3M9InF1ZXJ5IGxpbmsiIGhyZWY9IicgKyBwcm90b2NvbCArIAogICAgICAgICAgICBpdGVtLmJlY2gzMmlkICsgJyI+JyArIHRleHQgKyAnPC9hPicKICAgICAgICAgIGxldCByb290ID0gbnVsbAogICAgICAgICAgbGV0IHYgPSBudWxsCiAgICAgICAgICAKICAgICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgICAgcm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgidmlkZW8tY29udGFpbmVyIikKICAgICAgICAgICAgcm9vdC5pbm5lckhUTUwgPSBjb250ZW50ZWxlbWVudHMKICAgICAgICAgICAgCiAgICAgICAgICAgIHYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpCiAgICAgICAgICAgIHYuY2xhc3NMaXN0LmFkZCgic2hvdyIpCiAgICAgICAgICAgIHZbImRhdGEtaXRlbS1pZCJdID0gaWQKICAgICAgICAgICAgdi5wcmVsb2FkID0gIm5vbmUiCiAgICAgICAgICAgIHYubG9vcCA9IHRydWUKICAgICAgICAgICAgdi5wbGF5c2lubGluZSA9ICIiCiAgICAgICAgICAgIAogICAgICAgICAgICB2Lm9uY2FucGxheSA9IGFzeW5jIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnN0IGFzcGVjdCA9IHRoaXMudmlkZW9XaWR0aCAvIHRoaXMudmlkZW9IZWlnaHQKICAgICAgICAgICAgICBpZihhc3BlY3QgPiAxKXsKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUud2lkdGggPSAoYXNwZWN0ICogMTAwKSArICIlIgogICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgdGhpcy5zdHlsZS5oZWlnaHQgPSAoMSAvIGFzcGVjdCAqIDEwMCkgKyAiJSIKICAgICAgICAgICAgICAgIHRoaXMuc3R5bGUubWFyZ2luVG9wID0gLSgoMSAvIGFzcGVjdCAqIDEwMCAtIDEwMCkgLyAyKSArICIlIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICB1cGRhdGV2aWRlb3BsYXkodGhpcy5wYXJlbnRFbGVtZW50KQogICAgICAgICAgICB9CgogICAgICAgICAgICBjb25zdCBleHQgPSBpdGVtLnVybC5tYXRjaCh2aWRlb2V4dHJlZ2V4KVsxXQogICAgICAgICAgICB2LmlubmVySFRNTCA9ICc8c291cmNlIHNyYz0iJyArIGl0ZW0udXJsICsgJyIgdHlwZT0idmlkZW8vJyArIGV4dCArICciPjwvc291cmNlPicKICAgICAgICAgICAgCiAgICAgICAgICAgIHJvb3QuYXBwZW5kKHYpCiAgICAgICAgICB9ZWxzZSBpZihpdGVtLnVybC5tYXRjaChpbWdleHRyZWdleCkpewogICAgICAgICAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpCiAgICAgICAgICAgIHJvb3QuaHJlZiA9ICIjIgogICAgICAgICAgICByb290LmlubmVySFRNTCA9IGNvbnRlbnRlbGVtZW50cwogICAgICAgICAgICAgIAogICAgICAgICAgICBpZih0eXBlID09ICJpbWFnZSIpewogICAgICAgICAgICAgIC8vbGV0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuYWx0ID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290WyJkYXRhLXNyYyJdID0gaXRlbS51cmwKICAgICAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoImltZyIpCiAgICAgICAgICAgICAgLy9pbWcuY2xhc3NMaXN0LmFkZCgiZGF0YSIpCiAgICAgICAgICAgICAgLy9yb290LmFwcGVuZChpbWcpCiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgIHJvb3QuaW5uZXJIVE1MICs9ICc8c3BhbiBjbGFzcz0iZmlsZSI+JyArIGl0ZW0udXJsICsgJzwvc3Bhbj4nCiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcm9vdC5pZCA9IGlkCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKQogICAgICAgICAgcm9vdFsiZGF0YS1pdGVtIl0gPSBpdGVtCiAgICAgICAgICByb290WyJkYXRhLWV2ZW50Il0gPSBpdGVtLmV2ZW50CiAgICAgICAgICByb290WyJkYXRhLXF1ZXJ5Il0gPSBxCiAgICAgICAgICByb290WyJkYXRhLXRleHQiXSA9IHRleHQKICAgICAgICAgIAogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKHR5cGUpCiAgICAgICAgICByb290LmNsYXNzTGlzdC5hZGQoIml0ZW0iKQogICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJzaG93IikKICAgICAgICAgIAogICAgICAgICAgaWYoaXRlbS5yZWFjdGVkKXsKICAgICAgICAgICAgcm9vdC5jbGFzc0xpc3QuYWRkKCJyZWFjdGVkIikKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgcXMoIiNpbWFnZXMiKVthcHBlbmQgJiYgImFwcGVuZCIgfHwgInByZXBlbmQiXShyb290KQogICAgICAgICAgCiAgICAgICAgICBpZih2KXsKICAgICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHJvb3QpCiAgICAgICAgICB9CiAgICAgICAgfSkKCiAgICAgICAgdXBkYXRlaW1hZ2VzbG9hZCgpCiAgICAgICAgCiAgICAgICAgaWYoYWN0aXZlKCkgPT0gbnVsbCl7CiAgICAgICAgICBxcygiI2ltYWdlcyAuaXRlbSIpPy5jbGFzc0xpc3QuYWRkKCJhY3RpdmUiKQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZW1lZGlhKCl7CiAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJzY3JvbGwiCiAgICAgICAgcXNhKCIjbWVkaWEtY29udGFpbmVyLCAjaW1hZ2UsICNtZWRpYS1mb290ZXIiKS5mb3JFYWNoKG4gPT4gbi5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikpCiAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LnJlbW92ZSgicmVhY3RlZCIpCiAgICAgICAgaGlkZXZpZGVvKCkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGlkZXZpZGVvKCl7CiAgICAgICAgY29uc3QgdiA9IHFzKCIjbWVkaWEtY29udGFpbmVyIHZpZGVvIikKICAgICAgICAKICAgICAgICBpZih2KXsKICAgICAgICAgIHYubXV0ZWQgPSB0cnVlCiAgICAgICAgICB2LmNsYXNzTGlzdC5hZGQoInNob3ciKQogICAgICAgICAgZ2lkKHZbImRhdGEtaXRlbS1pZCJdKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdXBkYXRldmlkZW9wbGF5KHYucGFyZW50RWxlbWVudCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoa2V5LCB0eXBlKXsKICAgICAgICBsZXQgcmVzaGFuZGxlciA9IGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5oYW5kbGUgPSBmdW5jdGlvbihyZXMpewogICAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICAgIGlmKGtleSA9PSBudWxsIHx8IG9bMV0gPT0ga2V5KXsKICAgICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgICByZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgICByZXNoYW5kbGVycy5zcGxpY2UocmVzaGFuZGxlcnMuaW5kZXhPZih0aGlzKSwgMSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdGhpcy5ldmVudHMucHVzaChvWzJdKQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyByZXNoYW5kbGVyKHJlc29sdmUsIHJlamVjdCkKICAgICAgICAgIHJlc2hhbmRsZXJzLnB1c2goaGFuZGxlcikKICAgICAgICB9KQogICAgICB9CiAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gY2hlY2t1cGRhdGUoc29ja2V0KXsKICAgICAgICBjb25zdCB1cGRhdGVzcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMV0sIG51bGwsIFt1cGRhdGVzcHVia2V5XSkKICAgICAgICBjb25zdCB1cGRhdGVub3RlID0gdXBkYXRlc3Jlcy5maW5kKG4gPT4gbi5jb250ZW50Lm1hdGNoKC9eaHR0cHNcOlwvXC8vKSkKICAgICAgICAKICAgICAgICBpZighdXBkYXRlbm90ZSl7CiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgYWdlID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAvIDEwMDAgLSB1cGRhdGVub3RlLmNyZWF0ZWRfYXQpIC8gMzYwMCAvIDI0KQogICAgICAgIGNvbnN0IG5vdGVpZCA9IGJlY2gzMi5lbmNvZGUoIm5vdGUiLCBmcm9tSGV4U3RyaW5nKHVwZGF0ZW5vdGUuaWQpKQogICAgICAgIHFzKCIjcmVsZWFzZSIpLmhyZWYgPSBwcm90b2NvbCArIG5vdGVpZAogICAgICAgIHFzKCIjcmVsZWFzZSIpLmlubmVyVGV4dCA9IChhZ2UgPT0gMCAmJiAidG9kYXkiIHx8IGFnZSArICIgZGF5KHMpIGFnbyIpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNsZWVwKG1zKXsKICAgICAgICByZXR1cm4gbmV3IGZ1bmN0aW9uKCl7CiAgICAgICAgICBsZXQgdGltZW91dCA9IG51bGwKICAgICAgICAgIGxldCByID0gbnVsbAogICAgICAgICAgCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwcm9taXNlOiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgbXMpCiAgICAgICAgICAgICAgciA9IHJlc29sdmUKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHJlc29sdmU6IGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgICAgcigpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHNob3coaWQpewogICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIgogICAgICAgIGNvbnN0IGl0ZW0gPSBnaWQoaWQpWyJkYXRhLWl0ZW0iXQogICAgICAgIGNvbnN0IG1lZGlhID0gZ2lkKCJtZWRpYS1jb250YWluZXIiKQogICAgICAgIGNvbnN0IGltYWdlID0gZ2lkKCJpbWFnZSIpCgogICAgICAgIGlmKGl0ZW0udXJsLm1hdGNoKHZpZGVvZXh0cmVnZXgpKXsKICAgICAgICAgIGltYWdlLmNsYXNzTGlzdC5yZW1vdmUoInZpc2libGUiKQogICAgICAgICAgY29uc3QgdiA9IGdpZChpZCkucXVlcnlTZWxlY3RvcigidmlkZW8iKQogICAgICAgICAgcXMoIiNtZWRpYS1jb250YWluZXIiKS5hcHBlbmRDaGlsZCh2KQogICAgICAgICAgdi5tdXRlZCA9IGZhbHNlCiAgICAgICAgICB2LmNsYXNzTGlzdC5yZW1vdmUoInNob3ciKQogICAgICAgICAgdi5wbGF5KCkKICAgICAgICB9ZWxzZXsKICAgICAgICAgIGltYWdlLnNyYyA9IGl0ZW0udXJsCiAgICAgICAgICBpbWFnZS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaXRlbS5tZXRhKXsKICAgICAgICAgIGNvbnN0IG1ldGFjb250ZW50ID0gSlNPTi5wYXJzZShpdGVtLm1ldGEuY29udGVudCkKICAgICAgICAgIGNvbnN0IG5hbWUgPSBtZXRhY29udGVudC5kaXNwbGF5X25hbWUgfHwgbWV0YWNvbnRlbnQubmFtZQogICAgICAgICAgcXMoIiNpbWFnZS11c2VyIikuY2xhc3NMaXN0LmFkZCgidmlzaWJsZSIpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5ocmVmID0gIj9wdWJrZXk9IiArIGl0ZW0ubWV0YS5wdWJrZXkvL3Byb3RvY29sICsgYmVjaDMyLmVuY29kZSgibnB1YiIsIGZyb21IZXhTdHJpbmcoaXRlbS5tZXRhLnB1YmtleSkpCiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5pbm5lclRleHQgPSBuYW1lCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBxcygiI2ltYWdlLXVzZXIiKS5jbGFzc0xpc3QucmVtb3ZlKCJ2aXNpYmxlIikKICAgICAgICB9CgogICAgICAgIGdpZCgiaW1hZ2UtbGlrZSIpWyJkYXRhLWl0ZW0taWQiXSA9IGlkCiAgICAgICAgZ2lkKCJtZWRpYS1mb290ZXIiKVsiZGF0YS1ldmVudCJdID0gaXRlbS5ldmVudAoKICAgICAgICBpZihpdGVtLnJlYWN0ZWQpewogICAgICAgICAgZ2lkKCJpbWFnZS1saWtlIikuY2xhc3NMaXN0LmFkZCgicmVhY3RlZCIpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGNvbnN0IGEgPSBxcygiI2ltYWdlLXF1ZXJ5IikKICAgICAgICBhLmhyZWYgPSBwcm90b2NvbCArIGl0ZW0uYmVjaDMyaWQKICAgICAgICBhLmlubmVyVGV4dCA9IGdpZChpZClbImRhdGEtdGV4dCJdCiAgICAgICAgCiAgICAgICAgZ2lkKCJtZWRpYS1jb250YWluZXIiKS5jbGFzc0xpc3QuYWRkKCJ2aXNpYmxlIikKICAgICAgICBnaWQoIm1lZGlhLWZvb3RlciIpLmNsYXNzTGlzdC5hZGQoInZpc2libGUiKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uY291bnQoKXsKICAgICAgICByZXR1cm4gc29ja2V0cy5maWx0ZXIociA9PiByLnJlYWR5U3RhdGUgPT0gMSkubGVuZ3RoCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGRpc2Nvbm5lY3QoKXsKICAgICAgICBmb3IobGV0IHNvY2tldCBvZiBzb2NrZXRzKXsKICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIHNvY2tldHMuc3BsaWNlKDApCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGxvZyhtc2cpewogICAgICAgIGxldCBzY3JvbGwgPSBxcygiI2xvZ3MiKS5zY3JvbGxUb3AgPT0gcXMoIiNsb2dzIikuc2Nyb2xsVG9wTWF4CiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgICAgICBkaXYuaW5uZXJUZXh0ID0gQXJyYXkuZnJvbShhcmd1bWVudHMpLmpvaW4oIiAiKQogICAgICAgIHFzKCIjbG9ncyIpLmFwcGVuZChkaXYpCiAgICAgICAgCiAgICAgICAgc2Nyb2xsICYmIHFzKCIjbG9ncyIpLnNjcm9sbFRvKDAsIHFzKCIjbG9ncyIpLnNjcm9sbFRvcE1heCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gY29ubmVjdCh1cmwpewogICAgICAgIGxvZygiY29ubmVjdGluZyIsIHVybCkKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgCiAgICAgICAgc29ja2V0Lm9uY2xvc2UgPSBhc3luYyBmdW5jdGlvbigpewogICAgICAgICAgc29ja2V0cy5zcGxpY2Uoc29ja2V0cy5pbmRleE9mKHNvY2tldCksIDEpCiAgICAgICAgICBxcygiI2Nvbm5jb3VudCIpLmlubmVyVGV4dCA9IGNvbm5jb3VudCgpICsgKHByaW1hbHNvY2tldCAmJiAxKQogICAgICAgICAgbG9nKCJkaXNjb25uZWN0ZWQiLCB0aGlzLnVybCwgY29ubmNvdW50KCkpCiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKS5wcm9taXNlCiAgICAgICAgICBjb25uZWN0KHRoaXMudXJsKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBzb2NrZXQub25vcGVuID0gZnVuY3Rpb24oKXsKICAgICAgICAgIHFzKCIjY29ubmNvdW50IikuaW5uZXJUZXh0ID0gY29ubmNvdW50KCkgKyAocHJpbWFsc29ja2V0ICYmIDEpCiAgICAgICAgICBsb2coImNvbm5lY3RlZCIsIHRoaXMudXJsLCBjb25uY291bnQoKSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgYXN5bmMgKCkgPT4gewogICAgICAgIHByaW1hbHNvY2tldCA9IGNvbm5lY3QoIndzczovL2NhY2hlMy5wcmltYWwubmV0L2NhY2hlMTciKQogICAgICAgIHByaW1hbHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbGdsb2JhbCh0aGlzKQogICAgICAgIH0pCiAgICAgICAgCiAgICAgICAgcHJpbWFsc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwgZnVuY3Rpb24oKXsKICAgICAgICAgIHByaW1hbHNvY2tldCA9IG51bGwKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGZvcihsZXQgdXJsIG9mIHJlbGF5cygpKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIAogICAgICAgICAgc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCBmdW5jdGlvbigpewogICAgICAgICAgICBjaGVja3VwZGF0ZSh0aGlzKQogICAgICAgICAgICBxdWVyeSh0aGlzKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgYXdhaXQgc2xlZXAoMTAwKS5wcm9taXNlCiAgICAgICAgCiAgICAgICAgaWYoaGFza2V5KCkpewogICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJub3N0ciIpCiAgICAgICAgfQogICAgICB9KQogICAgICAKICAgICAgZm9yKGxldCBjIG9mIGNvbG9wdHMpewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8c3R5bGU+JyArIGNvbHNjc3MuaW5uZXJUZXh0LnJlcGxhY2UoL1wkXHtjb2xzXH0vZywgYykgKyAnPC9zdHlsZT4nKQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4K