LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfZGJ1aS5oeHgiCiNpbmNsdWRlICJIdG1sUmVhZGVyLmh4eCIKI2luY2x1ZGUgPGNvbm5lY3Rpdml0eS9kYmNvbnZlcnNpb24uaHh4PgojaW5jbHVkZSA8Y29ubmVjdGl2aXR5L2RidG9vbHMuaHh4PgojaW5jbHVkZSA8dG9vbHMvdGVuY2N2dC5oeHg+CiNpbmNsdWRlIDxjb21waGVscGVyL2V4dHJhY3QuaHh4PgojaW5jbHVkZSAiZGJ1X21pc2MuaHJjIgojaW5jbHVkZSAiZGJ1c3RyaW5ncy5ocmMiCiNpbmNsdWRlIDxzZngyL3NmeGh0bWwuaHh4PgojaW5jbHVkZSA8dG9vbHMvZGVidWcuaHh4PgojaW5jbHVkZSA8dG9vbHMvdGVuY2N2dC5oeHg+CiNpbmNsdWRlICJtb2R1bGVkYnUuaHh4IgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3NkYmN4L1hEYXRhRGVzY3JpcHRvckZhY3RvcnkuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3NkYmN4L1hDb2x1bW5zU3VwcGxpZXIuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3NkYmN4L1hBcHBlbmQuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3NkYmMvRGF0YVR5cGUuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3NkYmMvQ29sdW1uVmFsdWUuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL2F3dC9Gb250RGVzY3JpcHRvci5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvYXd0L0ZvbnRXZWlnaHQuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL2F3dC9Gb250U3RyaWtlb3V0LmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9hd3QvRm9udFNsYW50LmhwcD4KI2luY2x1ZGUgPGNvbS9zdW4vc3Rhci9hd3QvRm9udFVuZGVybGluZS5ocHA+CiNpbmNsdWRlIDxjb20vc3VuL3N0YXIvdXRpbC9OdW1iZXJGb3JtYXQuaHBwPgojaW5jbHVkZSA8Y29tL3N1bi9zdGFyL3V0aWwvWE51bWJlckZvcm1hdFR5cGVzLmhwcD4KI2luY2x1ZGUgPHN2dG9vbHMvaHRtbHRva24uaD4KI2luY2x1ZGUgPHN2dG9vbHMvaHRtbGt5d2QuaHh4PgojaW5jbHVkZSA8dG9vbHMvY29sb3IuaHh4PgojaW5jbHVkZSAiV0NvcHlUYWJsZS5oeHgiCiNpbmNsdWRlICJXRXh0ZW5kUGFnZXMuaHh4IgojaW5jbHVkZSAiV05hbWVNYXRjaC5oeHgiCiNpbmNsdWRlICJXQ29sdW1uU2VsZWN0Lmh4eCIKI2luY2x1ZGUgIlFFbnVtVHlwZXMuaHh4IgojaW5jbHVkZSAiV0NQYWdlLmh4eCIKI2luY2x1ZGUgPHRvb2xzL2luZXRtaW1lLmh4eD4KI2luY2x1ZGUgPHN2bC9pbmV0dHlwZS5oeHg+CiNpbmNsdWRlIDxydGwvdGVuY2luZm8uaD4KI2luY2x1ZGUgIlVJVG9vbHMuaHh4IgojaW5jbHVkZSA8dmNsL3N2YXBwLmh4eD4KI2luY2x1ZGUgPHJ0bC9sb2dmaWxlLmh4eD4KCnVzaW5nIG5hbWVzcGFjZSBkYmF1aTsKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6OnVubzsKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6OmJlYW5zOwp1c2luZyBuYW1lc3BhY2UgOjpjb206OnN1bjo6c3Rhcjo6Y29udGFpbmVyOwp1c2luZyBuYW1lc3BhY2UgOjpjb206OnN1bjo6c3Rhcjo6c2RiYzsKdXNpbmcgbmFtZXNwYWNlIDo6Y29tOjpzdW46OnN0YXI6OnNkYmN4Owp1c2luZyBuYW1lc3BhY2UgOjpjb206OnN1bjo6c3Rhcjo6YXd0OwoKI2RlZmluZSBEQkFVSV9IVE1MX0ZPTlRTSVpFUwk4CQkvLyB3aWUgRXhwb3J0LCBIVE1MLU9wdGlvbnMKI2RlZmluZSBIVE1MX01FVEFfTk9ORQkJCTAKI2RlZmluZSBIVE1MX01FVEFfQVVUSE9SCQkxCiNkZWZpbmUgSFRNTF9NRVRBX0RFU0NSSVBUSU9OCTIKI2RlZmluZSBIVE1MX01FVEFfS0VZV09SRFMJCTMKI2RlZmluZSBIVE1MX01FVEFfUkVGUkVTSAkJNAojZGVmaW5lIEhUTUxfTUVUQV9DTEFTU0lGSUNBVElPTiA1CiNkZWZpbmUgSFRNTF9NRVRBX0NSRUFURUQJCTYKI2RlZmluZSBIVE1MX01FVEFfQ0hBTkdFREJZCQk3CiNkZWZpbmUgSFRNTF9NRVRBX0NIQU5HRUQJCTgKI2RlZmluZSBIVE1MX01FVEFfR0VORVJBVE9SCQk5CiNkZWZpbmUgSFRNTF9NRVRBX1NERk9PVE5PVEUJMTAKI2RlZmluZSBIVE1MX01FVEFfU0RFTkROT1RFCQkxMQojZGVmaW5lIEhUTUxfTUVUQV9DT05URU5UX1RZUEUJMTIKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkRCR19OQU1FKE9IVE1MUmVhZGVyKQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBPSFRNTFJlYWRlcgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpPSFRNTFJlYWRlcjo6T0hUTUxSZWFkZXIoU3ZTdHJlYW0mIHJJbixjb25zdCBTaGFyZWRDb25uZWN0aW9uJiBfcnhDb25uZWN0aW9uLAoJCQkJCQljb25zdCBSZWZlcmVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OnV0aWw6OlhOdW1iZXJGb3JtYXR0ZXIgPiYgX3J4TnVtYmVyRiwKCQkJCQkJY29uc3QgOjpjb206OnN1bjo6c3Rhcjo6dW5vOjpSZWZlcmVuY2U8IDo6Y29tOjpzdW46OnN0YXI6Omxhbmc6OlhNdWx0aVNlcnZpY2VGYWN0b3J5ID4mIF9yTSwKCQkJCQkJY29uc3QgVENvbHVtblZlY3RvciogcExpc3QsCgkJCQkJCWNvbnN0IE9UeXBlSW5mb01hcCogX3BJbmZvTWFwKSAKCTpIVE1MUGFyc2VyKHJJbikKCSxPRGF0YWJhc2VFeHBvcnQoIF9yeENvbm5lY3Rpb24sIF9yeE51bWJlckYsIF9yTSwgcExpc3QsIF9wSW5mb01hcCwgckluICkKCSxtX25UYWJsZUNvdW50KDApCgksbV9uQ29sdW1uV2lkdGgoODcpCgksbV9iTWV0YU9wdGlvbnMoc2FsX0ZhbHNlKQoJLG1fYlNETnVtKHNhbF9GYWxzZSkKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpPSFRNTFJlYWRlciIgKTsKCURCR19DVE9SKE9IVE1MUmVhZGVyLE5VTEwpOwoJU2V0U3JjRW5jb2RpbmcoIEdldEV4dGVuZGVkQ29tcGF0aWJpbGl0eVRleHRFbmNvZGluZyggIFJUTF9URVhURU5DT0RJTkdfSVNPXzg4NTlfMSApICk7CiAgICAvLyBJZiB0aGUgZmlsZSBzdGFydHMgd2l0aCBhIEJPTSwgc3dpdGNoIHRvIFVDUzIuCiAgICBTZXRTd2l0Y2hUb1VDUzIoIHNhbF9UcnVlICk7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk9IVE1MUmVhZGVyOjpPSFRNTFJlYWRlcihTdlN0cmVhbSYgckluLAoJCQkJCQkgc2FsX0ludDMyIG5Sb3dzLAoJCQkJCQkgY29uc3QgVFBvc2l0aW9ucyAmX3JDb2x1bW5Qb3NpdGlvbnMsCgkJCQkJCSBjb25zdCBSZWZlcmVuY2U8IDo6Y29tOjpzdW46OnN0YXI6OnV0aWw6OlhOdW1iZXJGb3JtYXR0ZXIgPiYgX3J4TnVtYmVyRiwKCQkJCQkJIGNvbnN0IDo6Y29tOjpzdW46OnN0YXI6OnVubzo6UmVmZXJlbmNlPCA6OmNvbTo6c3VuOjpzdGFyOjpsYW5nOjpYTXVsdGlTZXJ2aWNlRmFjdG9yeSA+JiBfck0sCgkJCQkJCSBjb25zdCBUQ29sdW1uVmVjdG9yKiBwTGlzdCwKCQkJCQkJIGNvbnN0IE9UeXBlSW5mb01hcCogX3BJbmZvTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgc2FsX0Jvb2wgX2JBdXRvSW5jcmVtZW50RW5hYmxlZCkKCTpIVE1MUGFyc2VyKHJJbikKCSxPRGF0YWJhc2VFeHBvcnQoIG5Sb3dzLCBfckNvbHVtblBvc2l0aW9ucywgX3J4TnVtYmVyRiwgX3JNLCBwTGlzdCwgX3BJbmZvTWFwLCBfYkF1dG9JbmNyZW1lbnRFbmFibGVkLCBySW4gKQoJLG1fblRhYmxlQ291bnQoMCkKCSxtX25Db2x1bW5XaWR0aCg4NykKCSxtX2JNZXRhT3B0aW9ucyhzYWxfRmFsc2UpCgksbV9iU0ROdW0oc2FsX0ZhbHNlKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6Ok9IVE1MUmVhZGVyIiApOwoJREJHX0NUT1IoT0hUTUxSZWFkZXIsTlVMTCk7CglTZXRTcmNFbmNvZGluZyggR2V0RXh0ZW5kZWRDb21wYXRpYmlsaXR5VGV4dEVuY29kaW5nKCAgUlRMX1RFWFRFTkNPRElOR19JU09fODg1OV8xICkgKTsKICAgIC8vIElmIHRoZSBmaWxlIHN0YXJ0cyB3aXRoIGEgQk9NLCBzd2l0Y2ggdG8gVUNTMi4KICAgIFNldFN3aXRjaFRvVUNTMiggc2FsX1RydWUgKTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KT0hUTUxSZWFkZXI6On5PSFRNTFJlYWRlcigpCnsKCURCR19EVE9SKE9IVE1MUmVhZGVyLE5VTEwpOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpTdlBhcnNlclN0YXRlIE9IVE1MUmVhZGVyOjpDYWxsUGFyc2VyKCkKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpDYWxsUGFyc2VyIiApOwoJREJHX0NIS1RISVMoT0hUTUxSZWFkZXIsTlVMTCk7CglySW5wdXQuU2VlayhTVFJFQU1fU0VFS19UT19CRUdJTik7CglySW5wdXQuUmVzZXRFcnJvcigpOwoJU3ZQYXJzZXJTdGF0ZSAgZVBhcnNlU3RhdGUgPSBIVE1MUGFyc2VyOjpDYWxsUGFyc2VyKCk7CglTZXRDb2x1bW5UeXBlcyhtX3BDb2x1bW5MaXN0LG1fcEluZm9NYXApOwoJcmV0dXJuIG1fYkZvdW5kVGFibGUgPyBlUGFyc2VTdGF0ZSA6IFNWUEFSX0VSUk9SOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6Ok5leHRUb2tlbiggaW50IG5Ub2tlbiApCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6TmV4dFRva2VuIiApOwoJREJHX0NIS1RISVMoT0hUTUxSZWFkZXIsTlVMTCk7CglpZihtX2JFcnJvciB8fCAhbV9uUm93cykgLy8gZmFsbHMgRmVobGVyIG9kZXIga2VpbmUgUm93cyBtZWhyIHp1ciAiVWJlcnByInVmdW5nIGRhbm4gZ2xlaWNoIHp1ciJ1Y2sKCQlyZXR1cm47CglpZiAoIG5Ub2tlbiA9PSAgSFRNTF9NRVRBICkKCQlzZXRUZXh0RW5jb2RpbmcoKTsKCglpZihtX3hDb25uZWN0aW9uLmlzKCkpCSAgLy8gZ2lidCBhbiB3ZWxjaGVyIENUT1IgZ2VydWZlbiB3dXJkZSB1bmQgZGFtaXQsIG9iIGVpbmUgVGFiZWxsZSBlcnN0ZWxsdCB3ZXJkZW4gc29sbAoJewoJCXN3aXRjaChuVG9rZW4pCgkJewoJCQljYXNlIEhUTUxfVEFCTEVfT046CgkJCQkrK21fblRhYmxlQ291bnQ7CgkJCQl7CS8vIGVzIGthbm4gYXVjaCBURCBvZGVyIFRIIHNlaW4sIHdlbm4gZXMgdm9yaGVyIGtlaW4gVEFCTEUgZ2FiCiAgICAgICAgICAgICAgICAgICAgY29uc3QgSFRNTE9wdGlvbnMqIHBIdG1sT3B0aW9ucyA9IEdldE9wdGlvbnMoKTsKICAgICAgICAgICAgICAgICAgICBzYWxfSW50MTYgbkFyckxlbiA9IHBIdG1sT3B0aW9ucy0+Q291bnQoKTsKCQkJCQlmb3IgKCBzYWxfSW50MTYgaSA9IDA7IGkgPCBuQXJyTGVuOyBpKysgKQoJCQkJCXsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSFRNTE9wdGlvbiogcE9wdGlvbiA9ICgqcEh0bWxPcHRpb25zKVtpXTsKCQkJCQkJc3dpdGNoKCBwT3B0aW9uLT5HZXRUb2tlbigpICkKCQkJCQkJewoJCQkJCQkJY2FzZSBIVE1MX09fV0lEVEg6CgkJCQkJCQl7CS8vIFByb3plbnQ6IHZvbiBEb2t1bWVudGJyZWl0ZSBiencuIGFldXNzZXJlciBaZWxsZQoJCQkJCQkJCW1fbkNvbHVtbldpZHRoID0gR2V0V2lkdGhQaXhlbCggcE9wdGlvbiApOwoJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCWNhc2UgSFRNTF9USEVBRF9PTjoKCQkJY2FzZSBIVE1MX1RCT0RZX09OOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNhbF91SW50MzIgblRlbGwgPSBySW5wdXQuVGVsbCgpOyAvLyB2ZXLkbmRlcnQgdmllbGxlaWNodCBkaWUgUG9zaXRpb24gZGVzIFN0cmVhbXMKCQkJCSAgICBpZiAoICFtX3hUYWJsZS5pcygpICkgCiAgICAgICAgICAgICAgICAgICAgey8vIGVyc3RlIFplaWxlIGFscyBIZWFkZXIgdmVyd2VuZGVuCgkJCQkJICAgIG1fYkVycm9yID0gIUNyZWF0ZVRhYmxlKG5Ub2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbV9iQXBwZW5kRmlyc3RMaW5lICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJJbnB1dC5TZWVrKG5UZWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFX09GRjoKCQkJCWlmKCEtLW1fblRhYmxlQ291bnQpCgkJCQl7CgkJCQkJbV94VGFibGUgPSBOVUxMOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRVJPV19PTjoKCQkJCWlmICggbV9wVXBkYXRlSGVscGVyLmdldCgpICkKCQkJCXsKCQkJCQl0cnkKCQkJCQl7CgkJCQkJCW1fcFVwZGF0ZUhlbHBlci0+bW92ZVRvSW5zZXJ0Um93KCk7IC8vIHNvbnN0IG5ldWUgWmVpbGUgYW5oImFuZ2VuCgkJCQkJfQoJCQkJCWNhdGNoKFNRTEV4Y2VwdGlvbiYgZSkKCQkJCQkvLyBVcGRhdGVGZWhsZXJiZWhhbmRsdW5nCgkJCQkJewoJCQkJCQlzaG93RXJyb3JEaWFsb2coZSk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZQoJCQkJCW1fYkVycm9yID0gc2FsX1RydWU7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RFWFRUT0tFTjoKCQkJY2FzZSBIVE1MX1NJTkdMRUNIQVI6CgkJCQlpZiAoIG1fYkluVGJsICkgLy8mJiAhbV9iU0ROdW0gKSAvLyB3aWNodGlnLCBkYSB3aXIgc29uc3QgYXVjaCBkaWUgTmFtZW4gZGVyIEZvbnRzIGJla29tbWVuCgkJCQkgICAgbV9zVGV4dFRva2VuICs9IGFUb2tlbjsKCQkJCWJyZWFrOwogICAgICAgICAgICBjYXNlIEhUTUxfUEFSQUJSRUFLX09GRjoKICAgICAgICAgICAgICAgIG1fc0N1cnJlbnQgKz0gbV9zVGV4dFRva2VuOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSFRNTF9QQVJBQlJFQUtfT046CiAgICAgICAgICAgICAgICBtX3NUZXh0VG9rZW4uRXJhc2UoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoJCQljYXNlIEhUTUxfVEFCTEVEQVRBX09OOgogICAgICAgICAgICAgICAgZmV0Y2hPcHRpb25zKCk7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFREFUQV9PRkY6CgkJCQl7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBtX3NDdXJyZW50LkxlbigpICkKICAgICAgICAgICAgICAgICAgICAgICAgbV9zVGV4dFRva2VuID0gbV9zQ3VycmVudDsKCQkJCQl0cnkKCQkJCQl7CgkJCQkJCWluc2VydFZhbHVlSW50b0NvbHVtbigpOwoJCQkJCX0KCQkJCQljYXRjaChTUUxFeGNlcHRpb24mIGUpCgkJCQkJLy8gVXBkYXRlRmVobGVyYmVoYW5kbHVuZwoJCQkJCXsKCQkJCQkJc2hvd0Vycm9yRGlhbG9nKGUpOwoJCQkJCX0KICAgICAgICAgICAgICAgICAgICBtX3NDdXJyZW50LkVyYXNlKCk7CgkJCQkJbV9uQ29sdW1uUG9zKys7CiAgICAgICAgICAgICAgICAgICAgZXJhc2VUb2tlbnMoKTsKCQkJCQltX2JTRE51bSA9IG1fYkluVGJsID0gc2FsX0ZhbHNlOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRVJPV19PRkY6CgkJCQlpZiAoICFtX3BVcGRhdGVIZWxwZXIuZ2V0KCkgKQoJCQkJewoJCQkJCW1fYkVycm9yID0gc2FsX1RydWU7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQl0cnkKCQkJCXsKCQkJCQltX25Sb3dDb3VudCsrOwoJCQkJCWlmIChtX2JJc0F1dG9JbmNyZW1lbnQpIC8vIGlmIGJTZXRBdXRvSW5jcmVtZW50IHRoZW4gSSBoYXZlIHRvIHNldCB0aGUgYXV0b2luY3JlbWVudAoJCQkJCQltX3BVcGRhdGVIZWxwZXItPnVwZGF0ZUludCgxLG1fblJvd0NvdW50KTsKCQkJCQltX3BVcGRhdGVIZWxwZXItPmluc2VydFJvdygpOwoJCQkJfQoJCQkJY2F0Y2goU1FMRXhjZXB0aW9uJiBlKQoJCQkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCQkJLy8gVXBkYXRlRmVobGVyYmVoYW5kbHVuZwoJCQkJewoJCQkJCXNob3dFcnJvckRpYWxvZyhlKTsKCQkJCX0KCQkJCW1fbkNvbHVtblBvcyA9IDA7CgkJCQlicmVhazsKCQl9Cgl9CgllbHNlIC8vIFp3ZWlnIG51ciBmInVyIFR5cHByInVmdW5nIGcidWx0aWcKCXsKCQlzd2l0Y2goblRva2VuKQoJCXsKCQkJY2FzZSBIVE1MX1RIRUFEX09OOgoJCQljYXNlIEhUTUxfVEJPRFlfT046CgkJCQkvLyBEZXIgU3BhbHRlbiBLb3BmIHoiYWhsdCBuaWNodCBtaXQKCQkJCWlmKG1fYkhlYWQpCgkJCQl7CgkJCQkJZG8KCQkJCQl7fQoJCQkJCXdoaWxlKEdldE5leHRUb2tlbigpICE9IEhUTUxfVEFCTEVST1dfT0ZGKTsKCQkJCQltX2JIZWFkID0gc2FsX0ZhbHNlOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRURBVEFfT046CgkJCWNhc2UgSFRNTF9UQUJMRUhFQURFUl9PTjoKCQkJCWZldGNoT3B0aW9ucygpOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9URVhUVE9LRU46CgkJCWNhc2UgSFRNTF9TSU5HTEVDSEFSOgogICAgICAgICAgICAgICAgaWYgKCBtX2JJblRibCApIC8vICYmICFtX2JTRE51bSApIC8vIHdpY2h0aWcsIGRhIHdpciBzb25zdCBhdWNoIGRpZSBOYW1lbiBkZXIgRm9udHMgYmVrb21tZW4KCQkJCSAgICBtX3NUZXh0VG9rZW4gKz0gYVRva2VuOwoJCQkJYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSFRNTF9QQVJBQlJFQUtfT0ZGOgogICAgICAgICAgICAgICAgbV9zQ3VycmVudCArPSBtX3NUZXh0VG9rZW47CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBIVE1MX1BBUkFCUkVBS19PTjoKICAgICAgICAgICAgICAgIG1fc1RleHRUb2tlbi5FcmFzZSgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgkJCWNhc2UgSFRNTF9UQUJMRURBVEFfT0ZGOgogICAgICAgICAgICAgICAgaWYgKCBtX3NDdXJyZW50LkxlbigpICkKICAgICAgICAgICAgICAgICAgICBtX3NUZXh0VG9rZW4gPSBtX3NDdXJyZW50OwogICAgICAgICAgICAgICAgYWRqdXN0Rm9ybWF0KCk7CgkJCQltX25Db2x1bW5Qb3MrKzsKCQkJCW1fYlNETnVtID0gbV9iSW5UYmwgPSBzYWxfRmFsc2U7CiAgICAgICAgICAgICAgICBtX3NDdXJyZW50LkVyYXNlKCk7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFUk9XX09GRjoKICAgICAgICAgICAgICAgIGlmICggbV9zQ3VycmVudC5MZW4oKSApCiAgICAgICAgICAgICAgICAgICAgbV9zVGV4dFRva2VuID0gbV9zQ3VycmVudDsKICAgICAgICAgICAgICAgIGFkanVzdEZvcm1hdCgpOwoJCQkJbV9uQ29sdW1uUG9zID0gMDsKCQkJCW1fblJvd3MtLTsKICAgICAgICAgICAgICAgIG1fc0N1cnJlbnQuRXJhc2UoKTsKCQkJCWJyZWFrOwoJCX0KCX0KfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIE9IVE1MUmVhZGVyOjpmZXRjaE9wdGlvbnMoKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OmZldGNoT3B0aW9ucyIgKTsKCW1fYkluVGJsID0gc2FsX1RydWU7Cgljb25zdCBIVE1MT3B0aW9ucyogb3B0aW9ucyA9IEdldE9wdGlvbnMoKTsKCXNhbF9JbnQxNiBuQXJyTGVuID0gb3B0aW9ucy0+Q291bnQoKTsKCWZvciAoIHNhbF9JbnQxNiBpID0gMDsgaSA8IG5BcnJMZW47IGkrKyApCgl7CgkJY29uc3QgSFRNTE9wdGlvbiogcE9wdGlvbiA9ICgqb3B0aW9ucylbaV07CgkJc3dpdGNoKCBwT3B0aW9uLT5HZXRUb2tlbigpICkKCQl7CgkJCWNhc2UgSFRNTF9PX1NEVkFMOgoJCQl7CiAgICAgICAgICAgICAgICBtX3NWYWxUb2tlbiA9IHBPcHRpb24tPkdldFN0cmluZygpOwoJCQkJLy9tX3NUZXh0VG9rZW4gPSBwT3B0aW9uLT5HZXRTdHJpbmcoKTsKCQkJCW1fYlNETnVtID0gc2FsX1RydWU7CgkJCX0KCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9PX1NETlVNOgogICAgICAgICAgICAgICAgbV9zTnVtVG9rZW4gPSBwT3B0aW9uLT5HZXRTdHJpbmcoKTsKCQkJYnJlYWs7CgkJfQoJfQp9Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6OlRhYmxlRGF0YU9uKFN2eENlbGxIb3JKdXN0aWZ5JiBlVmFsLGludCBuVG9rZW4pCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6VGFibGVEYXRhT24iICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKCXNhbF9Cb29sIGJIb3JKdXN0aWZ5Q2VudGVyVEggPSAoblRva2VuID09IEhUTUxfVEFCTEVIRUFERVJfT04pOwoJY29uc3QgSFRNTE9wdGlvbnMqIHBIdG1sT3B0aW9ucyA9IEdldE9wdGlvbnMoKTsKCXNhbF9JbnQxNiBuQXJyTGVuID0gcEh0bWxPcHRpb25zLT5Db3VudCgpOwoJZm9yICggc2FsX0ludDE2IGkgPSAwOyBpIDwgbkFyckxlbjsgaSsrICkKCXsKCQljb25zdCBIVE1MT3B0aW9uKiBwT3B0aW9uID0gKCpwSHRtbE9wdGlvbnMpW2ldOwoJCXN3aXRjaCggcE9wdGlvbi0+R2V0VG9rZW4oKSApCgkJewoJCQljYXNlIEhUTUxfT19BTElHTjoKCQkJewoJCQkJYkhvckp1c3RpZnlDZW50ZXJUSCA9IHNhbF9GYWxzZTsKCQkJCWNvbnN0IFN0cmluZyYgck9wdFZhbCA9IHBPcHRpb24tPkdldFN0cmluZygpOwoJCQkJaWYgKHJPcHRWYWwuRXF1YWxzSWdub3JlQ2FzZUFzY2lpKCBPT09fU1RSSU5HX1NWVE9PTFNfSFRNTF9BTF9yaWdodCApKQoJCQkJCWVWYWwgPSBTVlhfSE9SX0pVU1RJRllfUklHSFQ7CgkJCQllbHNlIGlmIChyT3B0VmFsLkVxdWFsc0lnbm9yZUNhc2VBc2NpaSggT09PX1NUUklOR19TVlRPT0xTX0hUTUxfQUxfY2VudGVyICkpCgkJCQkJZVZhbCA9IFNWWF9IT1JfSlVTVElGWV9DRU5URVI7CgkJCQllbHNlIGlmIChyT3B0VmFsLkVxdWFsc0lnbm9yZUNhc2VBc2NpaSggT09PX1NUUklOR19TVlRPT0xTX0hUTUxfQUxfbGVmdCApKQoJCQkJCWVWYWwgPSBTVlhfSE9SX0pVU1RJRllfTEVGVDsKCQkJCWVsc2UKCQkJCQllVmFsID0gU1ZYX0hPUl9KVVNUSUZZX1NUQU5EQVJEOwoJCQl9CgkJCWJyZWFrOwoJCQljYXNlIEhUTUxfT19XSURUSDoKCQkJCW1fbldpZHRoID0gR2V0V2lkdGhQaXhlbCggcE9wdGlvbiApOwoJCQlicmVhazsKCQl9Cgl9Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6OlRhYmxlRm9udE9uKEZvbnREZXNjcmlwdG9yJiBfckZvbnQsc2FsX0ludDMyICZfclRleHRDb2xvcikKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpUYWJsZUZvbnRPbiIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJY29uc3QgSFRNTE9wdGlvbnMqIHBIdG1sT3B0aW9ucyA9IEdldE9wdGlvbnMoKTsKCXNhbF9JbnQxNiBuQXJyTGVuID0gcEh0bWxPcHRpb25zLT5Db3VudCgpOwoJZm9yICggc2FsX0ludDE2IGkgPSAwOyBpIDwgbkFyckxlbjsgaSsrICkKCXsKCQljb25zdCBIVE1MT3B0aW9uKiBwT3B0aW9uID0gKCpwSHRtbE9wdGlvbnMpW2ldOwoJCXN3aXRjaCggcE9wdGlvbi0+R2V0VG9rZW4oKSApCgkJewoJCWNhc2UgSFRNTF9PX0NPTE9SOgoJCQl7CgkJCQlDb2xvciBhQ29sb3I7CgkJCQlwT3B0aW9uLT5HZXRDb2xvciggYUNvbG9yICk7CgkJCQlfclRleHRDb2xvciA9IGFDb2xvci5HZXRSR0JDb2xvcigpOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgSFRNTF9PX0ZBQ0UgOgoJCQl7CgkJCQljb25zdCBTdHJpbmcmIHJGYWNlID0gcE9wdGlvbi0+R2V0U3RyaW5nKCk7CgkJCQlTdHJpbmcgYUZvbnROYW1lOwoJCQkJeHViX1N0ckxlbiBuUG9zID0gMDsKCQkJCXdoaWxlKCBuUG9zICE9IFNUUklOR19OT1RGT1VORCApCgkJCQl7CS8vIEZvbnRsaXN0ZSwgVkNMOiBTZW1pa29sb24gYWxzIFNlcGFyYXRvciwgSFRNTDogS29tbWEKCQkJCQlTdHJpbmcgYUZOYW1lID0gckZhY2UuR2V0VG9rZW4oIDAsICcsJywgblBvcyApOwoJCQkJCWFGTmFtZS5FcmFzZVRyYWlsaW5nQ2hhcnMoKS5FcmFzZUxlYWRpbmdDaGFycygpOwoJCQkJCWlmKCBhRm9udE5hbWUuTGVuKCkgKQoJCQkJCQlhRm9udE5hbWUgKz0gJzsnOwoJCQkJCWFGb250TmFtZSArPSBhRk5hbWU7CgkJCQl9CgkJCQlpZiAoIGFGb250TmFtZS5MZW4oKSApCgkJCQkJX3JGb250Lk5hbWUgPSA6OnJ0bDo6T1VTdHJpbmcoYUZvbnROYW1lKTsKCQkJfQoJCQlicmVhazsKCQljYXNlIEhUTUxfT19TSVpFIDoKCQkJewoJCQkJc2FsX0ludDE2IG5TaXplID0gKHNhbF9JbnQxNikgcE9wdGlvbi0+R2V0TnVtYmVyKCk7CgkJCQlpZiAoIG5TaXplID09IDAgKQoJCQkJCW5TaXplID0gMTsKCQkJCWVsc2UgaWYgKCBuU2l6ZSA8IERCQVVJX0hUTUxfRk9OVFNJWkVTICkKCQkJCQluU2l6ZSA9IERCQVVJX0hUTUxfRk9OVFNJWkVTOwoKCQkJCV9yRm9udC5IZWlnaHQgPSBuU2l6ZTsKCQkJfQoJCQlicmVhazsKCQl9Cgl9Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9JbnQxNiBPSFRNTFJlYWRlcjo6R2V0V2lkdGhQaXhlbCggY29uc3QgSFRNTE9wdGlvbiogcE9wdGlvbiApCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6R2V0V2lkdGhQaXhlbCIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJY29uc3QgU3RyaW5nJiByT3B0VmFsID0gcE9wdGlvbi0+R2V0U3RyaW5nKCk7CglpZiAoIHJPcHRWYWwuU2VhcmNoKCclJykgIT0gU1RSSU5HX05PVEZPVU5EICkKCXsJLy8gUHJvemVudAoJCURCR19BU1NFUlQoIG1fbkNvbHVtbldpZHRoLCAiV0lEVEggT3B0aW9uOiBtX25Db2x1bW5XaWR0aD09MCB1bmQgV2lkdGglIiApOwoJCXJldHVybiAoc2FsX0ludDE2KSgocE9wdGlvbi0+R2V0TnVtYmVyKCkgKiBtX25Db2x1bW5XaWR0aCkgLyAxMDApOwoJfQoJZWxzZQoJewoJCWlmICggck9wdFZhbC5TZWFyY2goJyonKSAhPSBTVFJJTkdfTk9URk9VTkQgKQoJCXsJLy8gcmVsYXRpdiB6dSB3YXM/IT8KLy8yZG86IENvbEFycmF5IGFsbGVyIHJlbGF0aXZlbiBXZXJ0ZSBzYW1tZWxuIHVuZCBkYW5uIE1ha2VDb2wKCQkJcmV0dXJuIDA7CgkJfQoJCWVsc2UKCQkJcmV0dXJuIChzYWxfSW50MTYpcE9wdGlvbi0+R2V0TnVtYmVyKCk7CS8vIFBpeGVsCgl9Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIE9IVE1MUmVhZGVyOjpDcmVhdGVUYWJsZShpbnQgblRva2VuKQp7CiAgICBSVExfTE9HRklMRV9DT05URVhUX0FVVEhPUiggYUxvZ2dlciwgIm1pc2MiLCAiT2NrZS5KYW5zc2VuQHN1bi5jb20iLCAiT0hUTUxSZWFkZXI6OkNyZWF0ZVRhYmxlIiApOwoJREJHX0NIS1RISVMoT0hUTUxSZWFkZXIsTlVMTCk7CglTdHJpbmcgYVRlbXBOYW1lKE1vZHVsZVJlcyhTVFJfVEJMX1RJVExFKSk7CglhVGVtcE5hbWUgPSBhVGVtcE5hbWUuR2V0VG9rZW4oMCwnICcpOwoJYVRlbXBOYW1lID0gU3RyaW5nKDo6ZGJ0b29sczo6Y3JlYXRlVW5pcXVlTmFtZShtX3hUYWJsZXMsOjpydGw6Ok9VU3RyaW5nKGFUZW1wTmFtZSApKSk7CgoJaW50IG5UbXBUb2tlbjIgPSBuVG9rZW47CglzYWxfQm9vbCBiQ2FwdGlvbiA9IHNhbF9GYWxzZTsKCXNhbF9Cb29sIGJUYWJsZUhlYWRlciA9IHNhbF9GYWxzZTsKCVN0cmluZyBhQ29sdW1uTmFtZTsKCVN2eENlbGxIb3JKdXN0aWZ5IGVWYWw7CgoJU3RyaW5nIGFUYWJsZU5hbWU7CglGb250RGVzY3JpcHRvciBhRm9udCA9IDo6ZGJhdWk6OkNyZWF0ZUZvbnREZXNjcmlwdG9yKEFwcGxpY2F0aW9uOjpHZXRTZXR0aW5ncygpLkdldFN0eWxlU2V0dGluZ3MoKS5HZXRBcHBGb250KCkpOwoJc2FsX0ludDMyIG5UZXh0Q29sb3IgPSAwOwoJZG8KCXsKCQlzd2l0Y2goblRtcFRva2VuMikKCQl7CgkJCWNhc2UgSFRNTF9URVhUVE9LRU46CgkJCWNhc2UgSFRNTF9TSU5HTEVDSEFSOgoJCQkJaWYoYlRhYmxlSGVhZGVyKQoJCQkJCWFDb2x1bW5OYW1lICs9IGFUb2tlbjsKCQkJCWlmKGJDYXB0aW9uKQoJCQkJCWFUYWJsZU5hbWUgKz0gYVRva2VuOwoJCQkJYnJlYWs7CiAgICAgICAgICAgIGNhc2UgSFRNTF9QQVJBQlJFQUtfT0ZGOgogICAgICAgICAgICAgICAgbV9zQ3VycmVudCArPSBhQ29sdW1uTmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEhUTUxfUEFSQUJSRUFLX09OOgogICAgICAgICAgICAgICAgbV9zVGV4dFRva2VuLkVyYXNlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFREFUQV9PTjoKICAgICAgICAgICAgICAgIC8vIG1fYkFwcGVuZEZpcnN0TGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyBydW4gdGhyb3VnaAoJCQljYXNlIEhUTUxfVEFCTEVIRUFERVJfT046CgkJCQlUYWJsZURhdGFPbihlVmFsLG5UbXBUb2tlbjIpOwoJCQkJYlRhYmxlSGVhZGVyID0gc2FsX1RydWU7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RBQkxFREFUQV9PRkY6CiAgICAgICAgICAgICAgICAvLyBtX2JBcHBlbmRGaXJzdExpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgLy8gcnVuIHRocm91Z2gKCQkJY2FzZSBIVE1MX1RBQkxFSEVBREVSX09GRjoKCQkJCXsKCQkJCQlhQ29sdW1uTmFtZS5FcmFzZUxlYWRpbmdDaGFycygpOwoJCQkJCWFDb2x1bW5OYW1lLkVyYXNlVHJhaWxpbmdDaGFycygpOwoJCQkJCWlmICghYUNvbHVtbk5hbWUuTGVuKCkgfHwgbV9iQXBwZW5kRmlyc3RMaW5lICkKCQkJCQkJYUNvbHVtbk5hbWUgPSBTdHJpbmcoTW9kdWxlUmVzKFNUUl9DT0xVTU5fTkFNRSkpOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBtX3NDdXJyZW50LkxlbigpICkKICAgICAgICAgICAgICAgICAgICAgICAgYUNvbHVtbk5hbWUgPSBtX3NDdXJyZW50OwoKICAgICAgICAgICAgICAgICAgICBhQ29sdW1uTmFtZS5FcmFzZUxlYWRpbmdDaGFycygpOwoJCQkJCWFDb2x1bW5OYW1lLkVyYXNlVHJhaWxpbmdDaGFycygpOwoJCQkJCUNyZWF0ZURlZmF1bHRDb2x1bW4oYUNvbHVtbk5hbWUpOwoJCQkJCWFDb2x1bW5OYW1lLkVyYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgbV9zQ3VycmVudC5FcmFzZSgpOwoKCQkJCQllVmFsID0gU1ZYX0hPUl9KVVNUSUZZX1NUQU5EQVJEOwoJCQkJCWJUYWJsZUhlYWRlciA9IHNhbF9GYWxzZTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSBIVE1MX1RJVExFX09OOgoJCQljYXNlIEhUTUxfQ0FQVElPTl9PTjoKCQkJCWJDYXB0aW9uID0gc2FsX1RydWU7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1RJVExFX09GRjoKCQkJY2FzZSBIVE1MX0NBUFRJT05fT0ZGOgoJCQkJYVRhYmxlTmFtZS5FcmFzZUxlYWRpbmdDaGFycygpOwoJCQkJYVRhYmxlTmFtZS5FcmFzZVRyYWlsaW5nQ2hhcnMoKTsKCQkJCWlmKCFhVGFibGVOYW1lLkxlbigpKQoJCQkJCWFUYWJsZU5hbWUgPSBTdHJpbmcoOjpkYnRvb2xzOjpjcmVhdGVVbmlxdWVOYW1lKG1feFRhYmxlcyw6OnJ0bDo6T1VTdHJpbmcoYVRhYmxlTmFtZSkpKTsKCQkJCWVsc2UKCQkJCQlhVGFibGVOYW1lID0gYVRlbXBOYW1lOwoJCQkJYkNhcHRpb24gPSBzYWxfRmFsc2U7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX0ZPTlRfT046CgkJCQlUYWJsZUZvbnRPbihhRm9udCxuVGV4dENvbG9yKTsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfQk9MRF9PTjoKCQkJCWFGb250LldlaWdodCA9IDo6Y29tOjpzdW46OnN0YXI6OmF3dDo6Rm9udFdlaWdodDo6Qk9MRDsKCQkJCWJyZWFrOwoJCQljYXNlIEhUTUxfSVRBTElDX09OOgoJCQkJYUZvbnQuU2xhbnQgPSA6OmNvbTo6c3VuOjpzdGFyOjphd3Q6OkZvbnRTbGFudF9JVEFMSUM7CgkJCQlicmVhazsKCQkJY2FzZSBIVE1MX1VOREVSTElORV9PTjoKCQkJCWFGb250LlVuZGVybGluZSA9IDo6Y29tOjpzdW46OnN0YXI6OmF3dDo6Rm9udFVuZGVybGluZTo6U0lOR0xFOwoJCQkJYnJlYWs7CgkJCWNhc2UgSFRNTF9TVFJJS0VfT046CgkJCQlhRm9udC5TdHJpa2VvdXQgPSA6OmNvbTo6c3VuOjpzdGFyOjphd3Q6OkZvbnRTdHJpa2VvdXQ6OlNJTkdMRTsKCQkJCWJyZWFrOwoJCX0KCX0KCXdoaWxlKChuVG1wVG9rZW4yID0gR2V0TmV4dFRva2VuKCkpICE9IEhUTUxfVEFCTEVST1dfT0ZGKTsKCiAgICBpZiAoIG1fc0N1cnJlbnQuTGVuKCkgKQogICAgICAgIGFDb2x1bW5OYW1lID0gbV9zQ3VycmVudDsKICAgIGFDb2x1bW5OYW1lLkVyYXNlTGVhZGluZ0NoYXJzKCk7CglhQ29sdW1uTmFtZS5FcmFzZVRyYWlsaW5nQ2hhcnMoKTsKCWlmKGFDb2x1bW5OYW1lLkxlbigpKQoJCUNyZWF0ZURlZmF1bHRDb2x1bW4oYUNvbHVtbk5hbWUpOwoKCWlmICggbV92RGVzdFZlY3Rvci5lbXB0eSgpICkKCQlyZXR1cm4gc2FsX0ZhbHNlOwkKCglpZighYVRhYmxlTmFtZS5MZW4oKSkKCQlhVGFibGVOYW1lID0gYVRlbXBOYW1lOwoKCW1fYkluVGJsCQk9IHNhbF9GYWxzZTsKCW1fYkZvdW5kVGFibGUJPSBzYWxfVHJ1ZTsKCglpZiAoIGlzQ2hlY2tFbmFibGVkKCkgKQoJCXJldHVybiBzYWxfVHJ1ZTsKCglyZXR1cm4gIWV4ZWN1dGVXaXphcmQoYVRhYmxlTmFtZSxtYWtlQW55KG5UZXh0Q29sb3IpLGFGb250KSAmJiBtX3hUYWJsZS5pcygpOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgT0hUTUxSZWFkZXI6OnNldFRleHRFbmNvZGluZygpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6c2V0VGV4dEVuY29kaW5nIiApOwoJREJHX0NIS1RISVMoT0hUTUxSZWFkZXIsTlVMTCk7CgltX2JNZXRhT3B0aW9ucyA9IHNhbF9UcnVlOwogICAgUGFyc2VNZXRhT3B0aW9ucyhOVUxMLCBOVUxMKTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBPSFRNTFJlYWRlcjo6cmVsZWFzZSgpCnsKICAgIFJUTF9MT0dGSUxFX0NPTlRFWFRfQVVUSE9SKCBhTG9nZ2VyLCAibWlzYyIsICJPY2tlLkphbnNzZW5Ac3VuLmNvbSIsICJPSFRNTFJlYWRlcjo6cmVsZWFzZSIgKTsKCURCR19DSEtUSElTKE9IVE1MUmVhZGVyLE5VTEwpOwoJUmVsZWFzZVJlZigpOwp9Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClR5cGVTZWxlY3Rpb25QYWdlRmFjdG9yeSBPSFRNTFJlYWRlcjo6Z2V0VHlwZVNlbGVjdGlvblBhZ2VGYWN0b3J5KCkKewogICAgUlRMX0xPR0ZJTEVfQ09OVEVYVF9BVVRIT1IoIGFMb2dnZXIsICJtaXNjIiwgIk9ja2UuSmFuc3NlbkBzdW4uY29tIiwgIk9IVE1MUmVhZGVyOjpnZXRUeXBlU2VsZWN0aW9uUGFnZUZhY3RvcnkiICk7CglEQkdfQ0hLVEhJUyhPSFRNTFJlYWRlcixOVUxMKTsKICAgIHJldHVybiAmT1dpekhUTUxFeHRlbmQ6OkNyZWF0ZTsKfQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK