LS0gbGlmZS5sdWEKLS0gb3JpZ2luYWwgYnkgRGF2ZSBCb2xsaW5nZXIgPERCb2xsaW5nZXJAY29tcHVzZXJ2ZS5jb20+IHBvc3RlZCB0byBsdWEtbAotLSBtb2RpZmllZCB0byB1c2UgQU5TSSB0ZXJtaW5hbCBlc2NhcGUgc2VxdWVuY2VzCi0tIG1vZGlmaWVkIHRvIHVzZSBmb3IgaW5zdGVhZCBvZiB3aGlsZQoKbG9jYWwgd3JpdGU9aW8ud3JpdGUKCkFMSVZFPSKlIglERUFEPSL+IgpBTElWRT0iTyIJREVBRD0iLSIKCmZ1bmN0aW9uIGRlbGF5KCkgLS0gTk9URTogU1lTVEVNLURFUEVOREVOVCwgYWRqdXN0IGFzIG5lY2Vzc2FyeQogIGZvciBpPTEsMTAwMDAgZG8gZW5kCiAgLS0gbG9jYWwgaT1vcy5jbG9jaygpKzEgd2hpbGUob3MuY2xvY2soKTxpKSBkbyBlbmQKZW5kCgpmdW5jdGlvbiBBUlJBWTJEKHcsaCkKICBsb2NhbCB0ID0ge3c9dyxoPWh9CiAgZm9yIHk9MSxoIGRvCiAgICB0W3ldID0ge30KICAgIGZvciB4PTEsdyBkbwogICAgICB0W3ldW3hdPTAKICAgIGVuZAogIGVuZAogIHJldHVybiB0CmVuZAoKX0NFTExTID0ge30KCi0tIGdpdmUgYmlydGggdG8gYSAic2hhcGUiIHdpdGhpbiB0aGUgY2VsbCBhcnJheQpmdW5jdGlvbiBfQ0VMTFM6c3Bhd24oc2hhcGUsbGVmdCx0b3ApCiAgZm9yIHk9MCxzaGFwZS5oLTEgZG8KICAgIGZvciB4PTAsc2hhcGUudy0xIGRvCiAgICAgIHNlbGZbdG9wK3ldW2xlZnQreF0gPSBzaGFwZVt5KnNoYXBlLncreCsxXQogICAgZW5kCiAgZW5kCmVuZAoKLS0gcnVuIHRoZSBDQSBhbmQgcHJvZHVjZSB0aGUgbmV4dCBnZW5lcmF0aW9uCmZ1bmN0aW9uIF9DRUxMUzpldm9sdmUobmV4dCkKICBsb2NhbCB5bTEseSx5cDEseWk9c2VsZi5oLTEsc2VsZi5oLDEsc2VsZi5oCiAgd2hpbGUgeWkgPiAwIGRvCiAgICBsb2NhbCB4bTEseCx4cDEseGk9c2VsZi53LTEsc2VsZi53LDEsc2VsZi53CiAgICB3aGlsZSB4aSA+IDAgZG8KICAgICAgbG9jYWwgc3VtID0gc2VsZlt5bTFdW3htMV0gKyBzZWxmW3ltMV1beF0gKyBzZWxmW3ltMV1beHAxXSArCiAgICAgICAgICAgICAgICAgIHNlbGZbeV1beG0xXSArIHNlbGZbeV1beHAxXSArCiAgICAgICAgICAgICAgICAgIHNlbGZbeXAxXVt4bTFdICsgc2VsZlt5cDFdW3hdICsgc2VsZlt5cDFdW3hwMV0KICAgICAgbmV4dFt5XVt4XSA9ICgoc3VtPT0yKSBhbmQgc2VsZlt5XVt4XSkgb3IgKChzdW09PTMpIGFuZCAxKSBvciAwCiAgICAgIHhtMSx4LHhwMSx4aSA9IHgseHAxLHhwMSsxLHhpLTEKICAgIGVuZAogICAgeW0xLHkseXAxLHlpID0geSx5cDEseXAxKzEseWktMQogIGVuZAplbmQKCi0tIG91dHB1dCB0aGUgYXJyYXkgdG8gc2NyZWVuCmZ1bmN0aW9uIF9DRUxMUzpkcmF3KCkKICBsb2NhbCBvdXQ9IiIgLS0gYWNjdW11bGF0ZSB0byByZWR1Y2UgZmxpY2tlcgogIGZvciB5PTEsc2VsZi5oIGRvCiAgIGZvciB4PTEsc2VsZi53IGRvCiAgICAgIG91dD1vdXQuLigoKHNlbGZbeV1beF0+MCkgYW5kIEFMSVZFKSBvciBERUFEKQogICAgZW5kCiAgICBvdXQ9b3V0Li4iXG4iCiAgZW5kCiAgd3JpdGUob3V0KQplbmQKCi0tIGNvbnN0cnVjdG9yCmZ1bmN0aW9uIENFTExTKHcsaCkKICBsb2NhbCBjID0gQVJSQVkyRCh3LGgpCiAgYy5zcGF3biA9IF9DRUxMUy5zcGF3bgogIGMuZXZvbHZlID0gX0NFTExTLmV2b2x2ZQogIGMuZHJhdyA9IF9DRUxMUy5kcmF3CiAgcmV0dXJuIGMKZW5kCgotLQotLSBzaGFwZXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHNwYXduKCkgYWJvdmUKLS0KSEVBUlQgPSB7IDEsMCwxLDEsMCwxLDEsMSwxOyB3PTMsaD0zIH0KR0xJREVSID0geyAwLDAsMSwxLDAsMSwwLDEsMTsgdz0zLGg9MyB9CkVYUExPREUgPSB7IDAsMSwwLDEsMSwxLDEsMCwxLDAsMSwwOyB3PTMsaD00IH0KRklTSCA9IHsgMCwxLDEsMSwxLDEsMCwwLDAsMSwwLDAsMCwwLDEsMSwwLDAsMSwwOyB3PTUsaD00IH0KQlVUVEVSRkxZID0geyAxLDAsMCwwLDEsMCwxLDEsMSwwLDEsMCwwLDAsMSwxLDAsMSwwLDEsMSwwLDAsMCwxOyB3PTUsaD01IH0KCi0tIHRoZSBtYWluIHJvdXRpbmUKZnVuY3Rpb24gTElGRSh3LGgpCiAgLS0gY3JlYXRlIHR3byBhcnJheXMKICBsb2NhbCB0aGlzZ2VuID0gQ0VMTFModyxoKQogIGxvY2FsIG5leHRnZW4gPSBDRUxMUyh3LGgpCgogIC0tIGNyZWF0ZSBzb21lIGxpZmUKICAtLSBhYm91dCAxMDAwIGdlbmVyYXRpb25zIG9mIGZ1biwgdGhlbiBhIGdsaWRlciBzdGVhZHktc3RhdGUKICB0aGlzZ2VuOnNwYXduKEdMSURFUiw1LDQpCiAgdGhpc2dlbjpzcGF3bihFWFBMT0RFLDI1LDEwKQogIHRoaXNnZW46c3Bhd24oRklTSCw0LDEyKQoKICAtLSBydW4gdW50aWwgYnJlYWsKICBsb2NhbCBnZW49MQogIHdyaXRlKCJcMDI3WzJKIikJLS0gQU5TSSBjbGVhciBzY3JlZW4KICB3aGlsZSAxIGRvCiAgICB0aGlzZ2VuOmV2b2x2ZShuZXh0Z2VuKQogICAgdGhpc2dlbixuZXh0Z2VuID0gbmV4dGdlbix0aGlzZ2VuCiAgICB3cml0ZSgiXDAyN1tIIikJLS0gQU5TSSBob21lIGN1cnNvcgogICAgdGhpc2dlbjpkcmF3KCkKICAgIHdyaXRlKCJMaWZlIC0gZ2VuZXJhdGlvbiAiLGdlbiwiXG4iKQogICAgZ2VuPWdlbisxCiAgICBpZiBnZW4+MjAwMCB0aGVuIGJyZWFrIGVuZAogICAgLS1kZWxheSgpCQktLSBubyBkZWxheQogIGVuZAplbmQKCkxJRkUoNDAsMjApCg==