LyoKICogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9mYy1sYW5nL2ZjLWxhbmcuYyx2IDEuMyAyMDAyLzA4LzIyIDA3OjM2OjQzIGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAyIEtlaXRoIFBhY2thcmQKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlICJmY2ludC5oIgojaW5jbHVkZSAiZmNjaGFyc2V0LmMiCiNpbmNsdWRlICJmY3N0ci5jIgoKLyoKICogZmMtbGFuZwogKgogKiBSZWFkIGEgc2V0IG9mIGxhbmd1YWdlIG9ydGhvZ3JhcGhpZXMgYW5kIGJ1aWxkIEMgZGVjbGFyYXRpb25zIGZvcgogKiBjaGFyc2V0cyB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGlkZW50aWZ5IHdoaWNoIGxhbmd1YWdlcyBhcmUKICogc3VwcG9ydGVkIGJ5IGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCB0aGlzIHVzZXMgc29tZSB1dGlsaXRpZXMKICogZnJvbSB0aGUgZm9udGNvbmZpZyBsaWJyYXJ5LCBzbyB0aGUgbmVjZXNzYXJ5IGZpbGUgaXMgc2ltcGx5CiAqIGluY2x1ZGVkIGluIHRoaXMgY29tcGlsYXRpb24uICBBIGNvdXBsZSBvZiBleHRyYSB1dGlsaXR5CiAqIGZ1bmN0aW9ucyBhcmUgYWxzbyBuZWVkZWQgaW4gc2xpZ2h0bHkgbW9kaWZpZWQgZm9ybQogKi8KCnZvaWQKRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKQp7Cn0KCnZvaWQKRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpCnsKfQoKRmNDaGFyOCAqCkZjQ29uZmlnSG9tZSAodm9pZCkKewogICAgcmV0dXJuIGdldGVudiAoIkhPTUUiKTsKfQoKc3RhdGljIHZvaWQgCmZhdGFsIChjaGFyICpmaWxlLCBpbnQgbGluZW5vLCBjaGFyICptc2cpCnsKICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgZmlsZSwgbGluZW5vLCBtc2cpOwogICAgZXhpdCAoMSk7Cn0KCnN0YXRpYyBjaGFyICoKZ2V0X2xpbmUgKEZJTEUgKmYsIGNoYXIgKmxpbmUsIGludCAqbGluZW5vKQp7CiAgICBjaGFyICAgICpoYXNoOwogICAgaWYgKCFmZ2V0cyAobGluZSwgMTAyNCwgZikpCglyZXR1cm4gMDsKICAgICsrKCpsaW5lbm8pOwogICAgaGFzaCA9IHN0cmNociAobGluZSwgJyMnKTsKICAgIGlmIChoYXNoKQoJKmhhc2ggPSAnXDAnOwogICAgaWYgKGxpbmVbMF0gPT0gJ1wwJyB8fCBsaW5lWzBdID09ICdcbicgfHwgbGluZVswXSA9PSAnXDAzMicgfHwgbGluZVswXSA9PSAnXHInKQoJcmV0dXJuIGdldF9saW5lIChmLCBsaW5lLCBsaW5lbm8pOwogICAgcmV0dXJuIGxpbmU7Cn0KCi8qCiAqIGJ1aWxkIGEgc2luZ2xlIGNoYXJzZXQgZnJvbSBhIHNvdXJjZSBmaWxlCiAqCiAqIFRoZSBmaWxlIGZvcm1hdCBpcyBxdWl0ZSBzaW1wbGUsIGVpdGhlcgogKiBhIHNpbmdsZSBoZXggdmFsdWUgb3IgYSBwYWlyIHNlcGFyYXRlZCB3aXRoIGEgZGFzaAogKgogKiBDb21tZW50cyBiZWdpbiB3aXRoICcjJwogKi8KCnN0YXRpYyBGY0NoYXJTZXQgKgpzY2FuIChGSUxFICpmLCBjaGFyICpmaWxlKQp7CiAgICBGY0NoYXJTZXQJKmMgPSAwOwogICAgRmNDaGFyU2V0CSpuOwogICAgaW50CQlzdGFydCwgZW5kLCB1Y3M0OwogICAgY2hhcglsaW5lWzEwMjRdOwogICAgaW50CQlsaW5lbm8gPSAwOwoKICAgIHdoaWxlIChnZXRfbGluZSAoZiwgbGluZSwgJmxpbmVubykpCiAgICB7CglpZiAoIXN0cm5jbXAgKGxpbmUsICJpbmNsdWRlIiwgNykpCgl7CgkgICAgZmlsZSA9IHN0cmNociAobGluZSwgJyAnKTsKCSAgICB3aGlsZSAoKmZpbGUgPT0gJyAnKQoJCWZpbGUrKzsKCSAgICBlbmQgPSBzdHJsZW4gKGZpbGUpOwoJICAgIGlmIChmaWxlW2VuZC0xXSA9PSAnXG4nKQoJCWZpbGVbZW5kLTFdID0gJ1wwJzsKCSAgICBmID0gZm9wZW4gKGZpbGUsICJyIik7CgkgICAgaWYgKCFmKQoJCWZhdGFsIChmaWxlLCAwLCAiY2FuJ3Qgb3BlbiIpOwoJICAgIGMgPSBzY2FuIChmLCBmaWxlKTsKCSAgICBmY2xvc2UgKGYpOwoJICAgIHJldHVybiBjOwoJfQoJaWYgKHN0cmNociAobGluZSwgJy0nKSkKCXsKCSAgICBpZiAoc3NjYW5mIChsaW5lLCAiJXgtJXgiLCAmc3RhcnQsICZlbmQpICE9IDIpCgkJZmF0YWwgKGZpbGUsIGxpbmVubywgInBhcnNlIGVycm9yIik7Cgl9CgllbHNlCgl7CgkgICAgaWYgKHNzY2FuZiAobGluZSwgIiV4IiwgJnN0YXJ0KSAhPSAxKQoJCWZhdGFsIChmaWxlLCBsaW5lbm8sICJwYXJzZSBlcnJvciIpOwoJICAgIGVuZCA9IHN0YXJ0OwoJfQoJaWYgKCFjKQoJICAgIGMgPSBGY0NoYXJTZXRDcmVhdGUgKCk7Cglmb3IgKHVjczQgPSBzdGFydDsgdWNzNCA8PSBlbmQ7IHVjczQrKykKCXsKCSAgICBpZiAoIUZjQ2hhclNldEFkZENoYXIgKGMsIHVjczQpKQoJCWZhdGFsIChmaWxlLCBsaW5lbm8sICJvdXQgb2YgbWVtb3J5Iik7Cgl9CiAgICB9CiAgICBuID0gRmNDaGFyU2V0RnJlZXplIChjKTsKICAgIEZjQ2hhclNldERlc3Ryb3kgKGMpOwogICAgcmV0dXJuIG47Cn0KCi8qCiAqIENvbnZlcnQgYSBmaWxlIG5hbWUgaW50byBhIG5hbWUgc3VpdGFibGUgZm9yIEMgZGVjbGFyYXRpb25zCiAqLwpzdGF0aWMgY2hhciAqCmdldF9uYW1lIChjaGFyICpmaWxlKQp7CiAgICBjaGFyICAgICpuYW1lOwogICAgY2hhciAgICAqZG90OwoKICAgIGRvdCA9IHN0cmNociAoZmlsZSwgJy4nKTsKICAgIGlmICghZG90KQoJZG90ID0gZmlsZSArIHN0cmxlbihmaWxlKTsKICAgIG5hbWUgPSBtYWxsb2MgKGRvdCAtIGZpbGUgKyAxKTsKICAgIHN0cm5jcHkgKG5hbWUsIGZpbGUsIGRvdCAtIGZpbGUpOwogICAgbmFtZVtkb3QtZmlsZV0gPSAnXDAnOwogICAgcmV0dXJuIG5hbWU7Cn0KCi8qCiAqIENvbnZlcnQgYSBDIG5hbWUgaW50byBhIGxhbmd1YWdlIG5hbWUKICovCnN0YXRpYyBjaGFyICoKZ2V0X2xhbmcgKGNoYXIgKm5hbWUpCnsKICAgIGNoYXIgICAgKmxhbmcgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKICAgIGNoYXIgICAgKmwgPSBsYW5nOwogICAgY2hhciAgICBjOwoKICAgIHdoaWxlICgoYyA9ICpuYW1lKyspKQogICAgewoJaWYgKGlzdXBwZXIgKChpbnQpICh1bnNpZ25lZCBjaGFyKSBjKSkKCSAgICBjID0gdG9sb3dlciAoKGludCkgKHVuc2lnbmVkIGNoYXIpIGMpOwoJaWYgKGMgPT0gJ18nKQoJICAgIGMgPSAnLSc7CglpZiAoYyA9PSAnICcpCgkgICAgY29udGludWU7CgkqbCsrID0gYzsKICAgIH0KICAgICpsKysgPSAnXDAnOwogICAgcmV0dXJuIGxhbmc7Cn0KCnN0YXRpYyBpbnQgY29tcGFyZSAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKewogICAgY29uc3QgRmNDaGFyOCAgICAqY29uc3QgKmFzID0gYSwgKmNvbnN0ICpicyA9IGI7CiAgICByZXR1cm4gRmNTdHJDbXBJZ25vcmVDYXNlICgqYXMsICpicyk7Cn0KCiNkZWZpbmUgTUFYX0xBTkcJICAgIDEwMjQKI2RlZmluZSBNQVhfTEFOR19TRVRfTUFQICAgICgoTUFYX0xBTkcgKyAzMSkgLyAzMikKCiNkZWZpbmUgQml0U2V0KG1hcCwgaWQpICAgKChtYXApWyhpZCk+PjVdIHw9ICgoRmNDaGFyMzIpIDEgPDwgKChpZCkgJiAweDFmKSkpCiNkZWZpbmUgQml0R2V0KG1hcCwgaWQpICAgKChtYXApWyhpZCk+PjVdID4+ICgoaWQpICYgMHgxZikpICYgMSkKCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGNoYXIJKmZpbGVzW01BWF9MQU5HXTsKICAgIEZjQ2hhclNldAkqc2V0c1tNQVhfTEFOR107CiAgICBpbnQJCWR1cGxpY2F0ZVtNQVhfTEFOR107CiAgICBpbnQJCWNvdW50cnlbTUFYX0xBTkddOwogICAgY2hhcgkqbmFtZXNbTUFYX0xBTkddOwogICAgY2hhcgkqbGFuZ3NbTUFYX0xBTkddOwogICAgRklMRQkqZjsKICAgIGludAkJbmNvdW50cnkgPSAwOwogICAgaW50CQlpID0gMDsKICAgIEZjQ2hhckxlYWYJKipsZWF2ZXMsICoqc2xlYXZlczsKICAgIGludAkJdG90YWxfbGVhdmVzID0gMDsKICAgIGludAkJbCwgc2wsIHRsOwogICAgaW50CQljOwogICAgY2hhcglsaW5lWzEwMjRdOwogICAgRmNDaGFyMzIJbWFwW01BWF9MQU5HX1NFVF9NQVBdOwogICAgaW50CQludW1fbGFuZ19zZXRfbWFwOwogICAgaW50CQlzZXRSYW5nZVN0YXJ0WzI2XTsKICAgIGludAkJc2V0UmFuZ2VFbmRbMjZdOwogICAgRmNDaGFyOAlzZXRSYW5nZUNoYXI7CiAgICAKICAgIHdoaWxlICgqKythcmd2KQogICAgewoJaWYgKGkgPT0gTUFYX0xBTkcpCgkgICAgZmF0YWwgKCphcmd2LCAwLCAiVG9vIG1hbnkgbGFuZ3VhZ2VzIik7CglmaWxlc1tpKytdID0gKmFyZ3Y7CiAgICB9CiAgICBmaWxlc1tpXSA9IDA7CiAgICBxc29ydCAoZmlsZXMsIGksIHNpemVvZiAoY2hhciAqKSwgY29tcGFyZSk7CiAgICBpID0gMDsKICAgIHdoaWxlIChmaWxlc1tpXSkKICAgIHsKCWYgPSBmb3BlbiAoZmlsZXNbaV0sICJyIik7CglpZiAoIWYpCgkgICAgZmF0YWwgKGZpbGVzW2ldLCAwLCBzdHJlcnJvciAoZXJybm8pKTsKCXNldHNbaV0gPSBzY2FuIChmLCBmaWxlc1tpXSk7CgluYW1lc1tpXSA9IGdldF9uYW1lIChmaWxlc1tpXSk7CglsYW5nc1tpXSA9IGdldF9sYW5nKG5hbWVzW2ldKTsKCWlmIChzdHJjaHIgKGxhbmdzW2ldLCAnLScpKQoJICAgIGNvdW50cnlbbmNvdW50cnkrK10gPSBpOwoKCXRvdGFsX2xlYXZlcyArPSBzZXRzW2ldLT5udW07CglpKys7CglmY2xvc2UgKGYpOwogICAgfQogICAgc2V0c1tpXSA9IDA7CiAgICBsZWF2ZXMgPSBtYWxsb2MgKHRvdGFsX2xlYXZlcyAqIHNpemVvZiAoRmNDaGFyTGVhZiAqKSk7CiAgICB0bCA9IDA7CiAgICAvKgogICAgICogRmluZCB1bmlxdWUgbGVhdmVzCiAgICAgKi8KICAgIGZvciAoaSA9IDA7IHNldHNbaV07IGkrKykKICAgIHsKCXNsZWF2ZXMgPSBzZXRzW2ldLT5sZWF2ZXM7Cglmb3IgKHNsID0gMDsgc2wgPCBzZXRzW2ldLT5udW07IHNsKyspCgl7CgkgICAgZm9yIChsID0gMDsgbCA8IHRsOyBsKyspCgkJaWYgKGxlYXZlc1tsXSA9PSBzbGVhdmVzW3NsXSkKCQkgICAgYnJlYWs7CgkgICAgaWYgKGwgPT0gdGwpCgkJbGVhdmVzW3RsKytdID0gc2xlYXZlc1tzbF07Cgl9CiAgICB9CgogICAgLyoKICAgICAqIFNjYW4gdGhlIGlucHV0IHVudGlsIHRoZSBtYXJrZXIgaXMgZm91bmQKICAgICAqLwogICAgCiAgICB3aGlsZSAoZmdldHMgKGxpbmUsIHNpemVvZiAobGluZSksIHN0ZGluKSkKICAgIHsKCWlmICghc3RybmNtcCAobGluZSwgIkBAQCIsIDMpKQoJICAgIGJyZWFrOwoJZnB1dHMgKGxpbmUsIHN0ZG91dCk7CiAgICB9CiAgICAKICAgIHByaW50ZiAoIi8qIHRvdGFsIHNpemU6ICVkIHVuaXF1ZSBsZWF2ZXM6ICVkICovXG5cbiIsCgkgICAgdG90YWxfbGVhdmVzLCB0bCk7CiAgICAvKgogICAgICogRHVtcCBsZWF2ZXMKICAgICAqLwogICAgcHJpbnRmICgic3RhdGljIGNvbnN0IEZjQ2hhckxlYWYJbGVhdmVzWyVkXSA9IHtcbiIsIHRsKTsKICAgIGZvciAobCA9IDA7IGwgPCB0bDsgbCsrKQogICAgewoJcHJpbnRmICgiICAgIHsgeyAvKiAlZCAqLyIsIGwpOwoJZm9yIChpID0gMDsgaSA8IDI1Ni8zMjsgaSsrKQoJewoJICAgIGlmIChpICUgNCA9PSAwKQoJCXByaW50ZiAoIlxuICAgIik7CgkgICAgcHJpbnRmICgiIDB4JTA4eCwiLCBsZWF2ZXNbbF0tPm1hcFtpXSk7Cgl9CglwcmludGYgKCJcbiAgICB9IH0sXG4iKTsKICAgIH0KICAgIHByaW50ZiAoIn07XG5cbiIpOwogICAgcHJpbnRmICgiI2RlZmluZSBMKG4pICgoRmNDaGFyTGVhZiAqKSAmbGVhdmVzW25dKVxuXG4iKTsKCiAgICAvKgogICAgICogRmluZCBkdXBsaWNhdGUgY2hhcnNldHMKICAgICAqLwogICAgZHVwbGljYXRlWzBdID0gLTE7CiAgICBmb3IgKGkgPSAxOyBzZXRzW2ldOyBpKyspCiAgICB7CglpbnQgajsKCglkdXBsaWNhdGVbaV0gPSAtMTsKCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCgkgICAgaWYgKHNldHNbal0gPT0gc2V0c1tpXSkKCSAgICB7CgkJZHVwbGljYXRlW2ldID0gajsKCQlicmVhazsKCSAgICB9CiAgICB9CgogICAgLyoKICAgICAqIEZpbmQgcmFuZ2VzIGZvciBlYWNoIGxldHRlciBmb3IgZmFzdGVyIHNlYXJjaGluZwogICAgICovCiAgICBzZXRSYW5nZUNoYXIgPSAnYSc7CiAgICBmb3IgKGkgPSAwOyBzZXRzW2ldOyBpKyspCiAgICB7CgljaGFyCWMgPSBuYW1lc1tpXVswXTsKCQoJd2hpbGUgKHNldFJhbmdlQ2hhciA8PSBjICYmIGMgPD0gJ3onKQoJICAgIHNldFJhbmdlU3RhcnRbc2V0UmFuZ2VDaGFyKysgLSAnYSddID0gaTsKICAgIH0KICAgIGZvciAoc2V0UmFuZ2VDaGFyID0gJ2EnOyBzZXRSYW5nZUNoYXIgPCAneic7IHNldFJhbmdlQ2hhcisrKQoJc2V0UmFuZ2VFbmRbc2V0UmFuZ2VDaGFyIC0gJ2EnXSA9IHNldFJhbmdlU3RhcnRbc2V0UmFuZ2VDaGFyKzEtJ2EnXSAtIDE7CiAgICBzZXRSYW5nZUVuZFtzZXRSYW5nZUNoYXIgLSAnYSddID0gaSAtIDE7CiAgICAKICAgIC8qCiAgICAgKiBEdW1wIGFycmF5cwogICAgICovCiAgICBmb3IgKGkgPSAwOyBzZXRzW2ldOyBpKyspCiAgICB7CglpbnQgbjsKCQoJaWYgKGR1cGxpY2F0ZVtpXSA+PSAwKQoJICAgIGNvbnRpbnVlOwoJcHJpbnRmICgic3RhdGljIGNvbnN0IEZjQ2hhckxlYWYgKmxlYXZlc18lc1slZF0gPSB7XG4iLAoJCW5hbWVzW2ldLCBzZXRzW2ldLT5udW0pOwoJZm9yIChuID0gMDsgbiA8IHNldHNbaV0tPm51bTsgbisrKQoJewoJICAgIGlmIChuICUgOCA9PSAwKQoJCXByaW50ZiAoIiAgICIpOwoJICAgIGZvciAobCA9IDA7IGwgPCB0bDsgbCsrKQoJCWlmIChsZWF2ZXNbbF0gPT0gc2V0c1tpXS0+bGVhdmVzW25dKQoJCSAgICBicmVhazsKCSAgICBpZiAobCA9PSB0bCkKCQlmYXRhbCAobmFtZXNbaV0sIDAsICJjYW4ndCBmaW5kIGxlYWYiKTsKCSAgICBwcmludGYgKCIgTCglM2QpLCIsIGwpOwoJICAgIGlmIChuICUgOCA9PSA3KQoJCXByaW50ZiAoIlxuIik7Cgl9CglpZiAobiAlIDggIT0gMCkKCSAgICBwcmludGYgKCJcbiIpOwoJcHJpbnRmICgifTtcblxuIik7CgkKCglwcmludGYgKCJzdGF0aWMgY29uc3QgRmNDaGFyMTYgbnVtYmVyc18lc1slZF0gPSB7XG4iLAoJCW5hbWVzW2ldLCBzZXRzW2ldLT5udW0pOwoJZm9yIChuID0gMDsgbiA8IHNldHNbaV0tPm51bTsgbisrKQoJewoJICAgIGlmIChuICUgOCA9PSAwKQoJCXByaW50ZiAoIiAgICIpOwoJICAgIHByaW50ZiAoIiAweCUwNHgsIiwgc2V0c1tpXS0+bnVtYmVyc1tuXSk7CgkgICAgaWYgKG4gJSA4ID09IDcpCgkJcHJpbnRmICgiXG4iKTsKCX0KCWlmIChuICUgOCAhPSAwKQoJICAgIHByaW50ZiAoIlxuIik7CglwcmludGYgKCJ9O1xuXG4iKTsKICAgIH0KICAgIHByaW50ZiAoIiN1bmRlZiBMXG5cbiIpOwogICAgCiAgICAvKgogICAgICogRHVtcCBzZXRzCiAgICAgKi8KCiAgICBwcmludGYgKCJzdGF0aWMgY29uc3QgRmNMYW5nQ2hhclNldCAgZmNMYW5nQ2hhclNldHNbXSA9IHtcbiIpOwogICAgZm9yIChpID0gMDsgc2V0c1tpXTsgaSsrKQogICAgewoJaW50CWogPSBkdXBsaWNhdGVbaV07CgoJaWYgKGogPCAwKQoJICAgIGogPSBpOwoJcHJpbnRmICgiICAgIHsgKEZjQ2hhcjggKikgXCIlc1wiLFxuIgoJCSIgICAgICB7IEZDX1JFRl9DT05TVEFOVCwgJWQsICIKCQkiKEZjQ2hhckxlYWYgKiopIGxlYXZlc18lcywgIgoJCSIoRmNDaGFyMTYgKikgbnVtYmVyc18lcyB9IH0sXG4iLAoJCWxhbmdzW2ldLAoJCXNldHNbal0tPm51bSwgbmFtZXNbal0sIG5hbWVzW2pdKTsKICAgIH0KICAgIHByaW50ZiAoIn07XG5cbiIpOwogICAgcHJpbnRmICgiI2RlZmluZSBOVU1fTEFOR19DSEFSX1NFVAklZFxuIiwgaSk7CiAgICBudW1fbGFuZ19zZXRfbWFwID0gKGkgKyAzMSkgLyAzMjsKICAgIHByaW50ZiAoIiNkZWZpbmUgTlVNX0xBTkdfU0VUX01BUAklZFxuIiwgbnVtX2xhbmdfc2V0X21hcCk7CiAgICAvKgogICAgICogRHVtcCBpbmRpY2VzIHdpdGggY291bnRyeSBjb2RlcwogICAgICovCiAgICBpZiAobmNvdW50cnkpCiAgICB7CglpbnQJbmNvdW50cnlfZW50ID0gMDsKCXByaW50ZiAoIlxuIik7CglwcmludGYgKCJzdGF0aWMgY29uc3QgRmNDaGFyMzIgZmNMYW5nQ291bnRyeVNldHNbXVtOVU1fTEFOR19TRVRfTUFQXSA9IHtcbiIpOwoJZm9yIChjID0gMDsgYyA8IG5jb3VudHJ5OyBjKyspCgl7CgkgICAgaSA9IGNvdW50cnlbY107CgkgICAgaWYgKGkgPj0gMCkKCSAgICB7CgkJaW50IGwgPSBzdHJjaHIgKGxhbmdzW2ldLCAnLScpIC0gbGFuZ3NbaV07CgkJaW50IGQsIGs7CgoJCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZ19zZXRfbWFwOyBrKyspCgkJICAgIG1hcFtrXSA9IDA7CgoJCUJpdFNldCAobWFwLCBpKTsKCQlmb3IgKGQgPSBjICsgMTsgZCA8IG5jb3VudHJ5OyBkKyspCgkJewoJCSAgICBpbnQgaiA9IGNvdW50cnlbZF07CgkJICAgIGlmIChqID49IDAgJiYgIXN0cm5jbXAgKGxhbmdzW2pdLCBsYW5nc1tpXSwgbCkpCgkJICAgIHsKCQkJQml0U2V0KG1hcCwgaik7CgkJCWNvdW50cnlbZF0gPSAtMTsKCQkgICAgfQoJCX0KCQlwcmludGYgKCIgICAgeyIpOwoJCWZvciAoayA9IDA7IGsgPCBudW1fbGFuZ19zZXRfbWFwOyBrKyspCgkJICAgIHByaW50ZiAoIiAweCUwOHgsIiwgbWFwW2tdKTsKCQlwcmludGYgKCIgfSwgLyogJSouKnMgKi9cbiIsCgkJCWwsIGwsIGxhbmdzW2ldKTsKCQkrK25jb3VudHJ5X2VudDsKCSAgICB9Cgl9CglwcmludGYgKCJ9O1xuXG4iKTsKCXByaW50ZiAoIiNkZWZpbmUgTlVNX0NPVU5UUllfU0VUICVkXG4iLCBuY291bnRyeV9lbnQpOwogICAgfQogICAgCgogICAgLyoKICAgICAqIER1bXAgc2V0cyBzdGFydC9maW5pc2ggZm9yIHRoZSBmYXN0cGF0aAogICAgICovCiAgICBwcmludGYgKCJzdGF0aWMgY29uc3QgRmNMYW5nQ2hhclNldFJhbmdlICBmY0xhbmdDaGFyU2V0UmFuZ2VzW10gPSB7XG4iKTsKICAgIGZvciAoc2V0UmFuZ2VDaGFyID0gJ2EnOyBzZXRSYW5nZUNoYXIgPD0gJ3onIDsgc2V0UmFuZ2VDaGFyKyspCiAgICB7CglwcmludGYgKCIgICAgeyAlZCwgJWQgfSwgLyogJWMgKi9cbiIsCgkJc2V0UmFuZ2VTdGFydFtzZXRSYW5nZUNoYXIgLSAnYSddLAoJCXNldFJhbmdlRW5kW3NldFJhbmdlQ2hhciAtICdhJ10sIHNldFJhbmdlQ2hhcik7CiAgICB9CiAgICBwcmludGYgKCJ9O1xuXG4iKTsKIAogICAgd2hpbGUgKGZnZXRzIChsaW5lLCBzaXplb2YgKGxpbmUpLCBzdGRpbikpCglmcHV0cyAobGluZSwgc3Rkb3V0KTsKICAgIAogICAgZmZsdXNoIChzdGRvdXQpOwogICAgZXhpdCAoZmVycm9yIChzdGRvdXQpKTsKfQo=