LyoKICogJFhGcmVlODYkCiAqCiAqIENvcHlyaWdodCCpIDIwMDIgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJmY2ludC5oIgoKRmNCbGFua3MgKgpGY0JsYW5rc0NyZWF0ZSAodm9pZCkKewogICAgRmNCbGFua3MJKmI7CgogICAgYiA9IG1hbGxvYyAoc2l6ZW9mIChGY0JsYW5rcykpOwogICAgaWYgKCFiKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fQkxBTktTLCBzaXplb2YgKEZjQmxhbmtzKSk7CiAgICBiLT5uYmxhbmsgPSAwOwogICAgYi0+c2JsYW5rID0gMDsKICAgIGItPmJsYW5rcyA9IDA7CiAgICByZXR1cm4gYjsKfQoKdm9pZApGY0JsYW5rc0Rlc3Ryb3kgKEZjQmxhbmtzICpiKQp7CiAgICBpZiAoYi0+YmxhbmtzKQogICAgewoJRmNNZW1GcmVlIChGQ19NRU1fQkxBTktTLCBiLT5zYmxhbmsgKiBzaXplb2YgKEZjQ2hhcjMyKSk7CglmcmVlIChiLT5ibGFua3MpOwogICAgfQogICAgRmNNZW1GcmVlIChGQ19NRU1fQkxBTktTLCBzaXplb2YgKEZjQmxhbmtzKSk7CiAgICBmcmVlIChiKTsKfQoKRmNCb29sCkZjQmxhbmtzQWRkIChGY0JsYW5rcyAqYiwgRmNDaGFyMzIgdWNzNCkKewogICAgRmNDaGFyMzIJKmM7CiAgICBpbnQJCXNibGFuazsKCiAgICBmb3IgKHNibGFuayA9IDA7IHNibGFuayA8IGItPm5ibGFuazsgc2JsYW5rKyspCglpZiAoYi0+YmxhbmtzW3NibGFua10gPT0gdWNzNCkKCSAgICByZXR1cm4gRmNUcnVlOwoKICAgIGlmIChiLT5uYmxhbmsgPT0gYi0+c2JsYW5rKQogICAgewoJc2JsYW5rID0gYi0+c2JsYW5rICsgMzI7CglpZiAoYi0+YmxhbmtzKQoJICAgIGMgPSAoRmNDaGFyMzIgKikgcmVhbGxvYyAoYi0+YmxhbmtzLCBzYmxhbmsgKiBzaXplb2YgKEZjQ2hhcjMyKSk7CgllbHNlCgkgICAgYyA9IChGY0NoYXIzMiAqKSBtYWxsb2MgKHNibGFuayAqIHNpemVvZiAoRmNDaGFyMzIpKTsKCWlmICghYykKCSAgICByZXR1cm4gRmNGYWxzZTsKCWlmIChiLT5zYmxhbmspCgkgICAgRmNNZW1GcmVlIChGQ19NRU1fQkxBTktTLCBiLT5zYmxhbmsgKiBzaXplb2YgKEZjQ2hhcjMyKSk7CglGY01lbUFsbG9jIChGQ19NRU1fQkxBTktTLCBzYmxhbmsgKiBzaXplb2YgKEZjQ2hhcjMyKSk7CgliLT5zYmxhbmsgPSBzYmxhbms7CgliLT5ibGFua3MgPSBjOwogICAgfQogICAgYi0+YmxhbmtzW2ItPm5ibGFuaysrXSA9IHVjczQ7CiAgICByZXR1cm4gRmNUcnVlOwp9CgpGY0Jvb2wKRmNCbGFua3NJc01lbWJlciAoRmNCbGFua3MgKmIsIEZjQ2hhcjMyIHVjczQpCnsKICAgIGludAlpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBiLT5uYmxhbms7IGkrKykKCWlmIChiLT5ibGFua3NbaV0gPT0gdWNzNCkKCSAgICByZXR1cm4gRmNUcnVlOwogICAgcmV0dXJuIEZjRmFsc2U7Cn0K