Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wh9Ay-0002Dk-09 for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jul 2026 17:01:40 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wh99x-001rMb-15 for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jul 2026 17:00:38 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wh99w-001rMR-1Q for pgsql-hackers@lists.postgresql.org; Tue, 07 Jul 2026 17:00:37 +0000 Received: from mail-yw1-x1130.google.com ([2607:f8b0:4864:20::1130]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wh99t-0000000015W-3X7g for pgsql-hackers@lists.postgresql.org; Tue, 07 Jul 2026 17:00:36 +0000 Received: by mail-yw1-x1130.google.com with SMTP id 00721157ae682-8114a4542b2so66506477b3.1 for ; Tue, 07 Jul 2026 10:00:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1783443633; cv=none; d=google.com; s=arc-20260327; b=sGT7oIUf/hpo9JB0dBUgoYCg8KssB6M3vopSNLV2S+sgJmg09d5okCanJ9++dCjhjx GQ/8iQzaNZYA44HAlvi27l/zsDLlwyY6d1hmy6DIpqZndlP/HRMbVjvu9hX0zDvnEplN IAm+SxbysEY/3A/ZKmf2BjcVma6Ln46SoSw8f3wkpFz96sd2XKustTMNaSNt9AykqOok 07Xx28TpvWLj+IdOdGzyIG8bpmMOudP7Nl47YmyzK9Eg9u9uAzzxnAxLkaCKia00MRi7 s30M6dLqu+TdncMQmhNuLNMTkd75hs/AYTlgIcSbkJp95t/KWmp6B2BkxBA1LQWpT7aU 8e2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=f20Nk8vjj93c0tv9K3W0ev10joMS9G3quczHX1eCNCM=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=VI2E5eXXQEkoD6t8McKhbs9PyQppbn64OCjl8PNFMn4bmhcDUcrWJ9CLhfLwsoYlf4 Szc+NdW8mCZKHxDkLlcBpJT1fCe1NtOVyb80S6CVfWpP7mFMUMZlLumVcs1o4UKUy29I RHkxAov+hIwLQsh5qbelN1DhKNIfbKfbGAU+xhr0gm1qHIJfeX2Mg93xg8sNtjn5QrhH HMf0Ta5yjK6wnN6Oda86o7dv7R+FbpiMDhttzAKp0NwM2BrwQmvjAKtxBPkCYgAr2cYG vsQjFz4ewpU5pnY071E5mnakiPW+h5ygP5WemfE+KTA09qatvNhkjnlkiGcyUmq9Np6k NDtA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=percona.com; s=google; t=1783443633; x=1784048433; darn=lists.postgresql.org; h=content-type:to:subject:message-id:date:from:mime-version:from:to :cc:subject:date:message-id:reply-to:content-type; bh=f20Nk8vjj93c0tv9K3W0ev10joMS9G3quczHX1eCNCM=; b=YV1boHDzt5OMJVKTTVlAilvFDly6XyogjoVUXe4+kCAce0le0d9vdMfJTW+E5GZ1YG wqceYuztnHcI0s2Qwr4SYM7zRBeN9St4vcDOZKrHuUJ5jp97uBGdLtP1D7Dt+zVmbP3u FkXZGc0NE8OAxAuhtOLuPp6g5PRUFLDj3CvlOsOUQU+ewZk2ccZhFxF9G3M2a2Q8EIpA RwTJdmG5ga31tDxcgMT7hAVxxHGyPQqrVQHfSaUMDADdLsyhnrKuEWjoI2ZzOoLSeHud +Nc+nZrEPgzuTUJkMRHCgkxzFpXp1Od2zro9OCJorTwQhzHzHrr8YUsSrB/M1+QQ3TRL 2I2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1783443633; x=1784048433; h=content-type:to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=f20Nk8vjj93c0tv9K3W0ev10joMS9G3quczHX1eCNCM=; b=PgJ+NBOJr3OK0UuFaBCeXc38lPvUqOouIoKe+hamelhRvzebPKCxXQAtRqXambKTS3 3hFxvoRqCFOFSmpOft6AvHKpxMCrkSuHU2IxnoAOGphgZ7tO/CbPZnUvj/sC9Lmen/kw UXdSP+IbnOEMW1qBwyNxgqIaw6Dn+ef4YZhWFvEsryuupFGTSihdxjyZJyY8oy5OwOKd b+L31EarlENouRxmytTW2uXctKkL4bTS9kBkEbkxUg9sjIApqMeHOl6TuVkt93ehEN3W jR0utg4d1DajckjYfKbfXVzn1747V3xq79yJZ8s//VvJ8I0XBV95UNp2+I4UcT4snzZW uCQg== X-Gm-Message-State: AOJu0YydEjgwJQmIxIzIJ5lh3Ej1LGzzhOYp1xUaOufs75theFSjtGbw 4kQ26wI66uwI20VwU8TScY2WRNPYIVKj/CVjZXUXQI7nOAA9GzDJMo9dMo9/b1dh2TORYCyXhD2 NALYBcrSB49TZgILbsBAUWKHE/KKAXIgenuSeYCZMURL+qWd/M9DdXujSIR1kT5oDL9JH44FEsc tsM8P2JhjaP05dT8+Y8CwlTz0sztpuYqKnqnHAn5uKgyM5Izl7oLwDCr5+SAcdUq8nXlKnsW23i OPUuuAYdi6Un7iXpLtYUOzfeBwlUViih1KNXmAARm9FG48T1RdrInj374AFMYHIDRJdQgo2ztpm dC843n0= X-Gm-Gg: AfdE7ckW6mnxgDHoiBfP8RQMw7qIZttDyC8QJPM+/oZ6wv4ibNi6aBcNN4O5n/Eeb7E 9Gh/tvY99D6HYerISuzlhaIUdJKg5x8CohtIaqmXM3022ALxuJcGj9fBWrXjefgXoprg/X+rTPh v1rl2eNKEBTxyn9uGBr2WL//V7ImVnWKxSSS8DHmgr9aTfiBEdFKBLckZGgiQFOeE94gULIBYeW ahXZtGU+lZWb+5aD1jVQTzEu4tNRbRmCfvJMDyDmfQOAYryhHJoHt1CGH0hEQbO25Dg3UA38pHJ VqJye52BgMJ4Gdx6F1XJw5HmpyA+0VL68fynLR0xrxjMKCXFkD9l6ts0WOQ7L25kA52gzBJFkDn RAIs/3SQAy2ORZlMOMj0QFkwslpb/ooAlIgwOWw== X-Received: by 2002:a05:690c:318:b0:7fd:ddb0:2622 with SMTP id 00721157ae682-81be063df5amr49644877b3.6.1783443632723; Tue, 07 Jul 2026 10:00:32 -0700 (PDT) MIME-Version: 1.0 From: Zsolt Parragi Date: Tue, 7 Jul 2026 18:00:21 +0100 X-Gm-Features: AVVi8CfS-DausAbKcCr912KKcKds6-9CnP9dTDlKfBFBqMISnvzzXKvT1kSrDu0 Message-ID: Subject: Proposal: new file format for hba/ident/hosts configuration? To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000003578cb0656085432" X-CLOUD-SEC-AV-Sent: true X-CLOUD-SEC-AV-Info: percona,google_mail,monitor X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003578cb0656085432 Content-Type: text/plain; charset="UTF-8" Hello hackers, Currently the hba/ident/hosts configuration files follow similar, but subtly different, whitespace-separated formats. While this works, there are several problems with it: 1. it is a PostgreSQL-specific format, without commonly available parsers. 2. extensibility is limited, which becomes clearly visible in multiple discussions/patch proposals. Two recent examples are: 2.1. the OAuth validators and hba[1]: validators often require extra fields, and while they can add GUCs, those are global. In a multi-tenant application, different hba lines might require different validator configuration. To properly support this use case, validators have to be able to extend the options in pg_hba. 2.2. a recent discussion about adding alternative SSL keys, which also requires an extension of pg_hosts[2], and that's tricky to do in a readable way. 3. we can include other files in them, or we can load options from separate files for hba, but we can't go the other direction: keeping everything (hba, ident, hosts) together in a single file. 4. while they look the same, hba is order-sensitive, ident is order-independent in semantics (today's parser happens to walk top-down), and the new pg_hosts is explicitly unordered. I'd like to improve the above points by introducing a new configuration format, while also keeping the current format for backward compatibility. Backward compatibility would be limited to currently available features, as in the future, we can't guarantee that we can fit every new feature into the old formats in an easy-to-understand way. I would even say that we should implement new functionality only in the new formats. Is this a good idea in general? What does everyone think about the current configuration style? Is it good enough, or should we try to change it? Moving on to more specific design questions, let's focus on the first point: Common, non-vendor-specific configuration formats are INI, XML, JSON, YAML, and TOML. INI/conf is way too simple, and also not really a single standard, as there are many different implementations. XML isn't that popular anymore. That leaves JSON/YAML/TOML. These all share one new requirement compared to the current PostgreSQL config infrastructure, valid UTF-8, but I don't think that could cause any practical problems. YAML is complex, and has many unintuitive features. While it is quite common, I don't think we would want to include a full YAML parser in PostgreSQL, or try to write our own. We could try a limited YAML format, dropping some complex/unsafe features, but that would be as unintuitive as the current configuration formats, and could result in compatibility issues with existing YAML tooling. My initial choice for prototyping was JSON, and I ended up creating a few prototypes for pg_hba with it. At first I liked it, but the more I worked with it, the more I felt the JSON boilerplate hurt readability. It's still a fine machine format, but I don't think it's a win for humans editing config files by hand. Its obvious advantage is that we already have a JSON parser in the code, and we could extend that to handle the more human-friendly JSONC/JSON5 variants. During pgconf.dev several people mentioned TOML when I talked about the idea. Initially I dismissed it for mostly the same reason as INI/conf, as I thought it was too simple. But when I decided to try it, I actually liked it more than my JSON tests. It has a precise specification and many libraries, so it is both easy to parse and read. I'd like to focus on this now, on what a specific TOML configuration could look like. (I am not saying it has to be TOML, it is just the best option I've found so far, but if you have a better suggestion, please share!) I also attached a discussion-starter patchset that implements the described format for pg_hosts. As PostgreSQL doesn't currently include a TOML parser, it uses a vendored tomlc17 parser[3], not necessarily the final approach, but the easiest way to build a PoC that showcases the concept, since tomlc17 isn't packaged for most of our supported platforms. I also have similar patches for the other configuration files, but I'm intentionally including only one of them for simplicity. 1. pg_ident Ident contains multiple maps, which map external usernames to internal usernames, possibly with regexes. Matching works on both fields, as we are looking for specific pairs. Currently ident parsing is ordered, but this is an implementation detail, not a functional requirement: we are only interested in whether a pair is present. If it is matched by multiple lines, it doesn't matter which line we select, as it's not user-visible, other than a log entry. Based on that, I think we can configure it simply in the following way: [ident] map1name = { "sysuser1" = "ppuser1", '/^(.*)@mydomain\.com$' = '\1', } map2name = { "sysuser1" = "ppuser1", "sysuser2" = "ppuser2", } This removes the ordering, since TOML tables are unordered, but it is simple, using the system username as a key and the PostgreSQL username as the value. In its current form, it is not extensible. I don't think we have to be concerned about that too much for ident, but if we ever need to allow additional values per mapping, we can always optionally allow the value to be a table like: "sysuser1" = { username = "ppuser1", other_param = "value", foo = "bar" }, I also put everything under the "[ident]" table, which helps with the "possibly keeping everything in a single file" point. I also want to point out that in the above example map1name / map2name are inline tables, and if somebody prefers, this can also be written in the following way, which has the same meaning: [ident.map1name] sysuser1 = "ppuser1" '/^(.*)@mydomain\.com$' = '\1' [ident.map2name] "sysuser1" = "ppuser1" "sysuser2" = "ppuser2" 2. pg_hosts Hosts is explicitly unordered. It contains hostnames, and every hostname has associated fields (certificate, key, ca, passphrase command, reload), which perfectly fits the "extensibility" version of ident I sketched above. Compared to ident it is only a single map, so we can store entries directly under the "[hosts]" table. We can either write: [hosts] "hostname1" = { ca = "...", key = "...", passphrase_command = "..." } "hostname2" = { ca = "...", key = "...", passphrase_command = "..." } Or again we can write this as: [hosts.hostname1] ca = "..." key = "..." passphrase_command = "..." [hosts.hostname2] ca = "..." key = "..." passphrase_command = "..." This format also clearly gives us extensibility. This is currently limited to SNI support, but "hosts" is a generic name, in case we ever want to add more properties. One idea worth considering is a "_defaults" (or similar) pseudo-hostname. For example, if all hostnames share the same CA, it saves repeating that everywhere. 3. pg_hba This is by far the trickiest format of the three, mainly because of the options list at the end. Fortunately, we can simplify that part with TOML, since we can treat each line as a table. The main issue compared to the previous two is that we have to keep pg_hba ordered, which means we have to use an array for the lines. We also need some kind of support for defaults, similar to what I proposed for hosts, or something even more powerful, to somewhat replicate and improve what the hba configuration can already do with the @include syntax. [hba] _defaults = { host = "localhost", ssl = "required", transport = "tcp" } remote = { host = ["*"] } [[hba.rules]] based_on = "remote" # or alternatively, can be an array to include multiple: [ "remote", "another" ] user = "foo" auth_method = "oauth" issuer = "..." # ... [[hba.rules]] # next rule In the above example I already used the special TOML syntax for arrays of tables, but of course doing this completely inline is also possible. The idea here is that we can specify absolute defaults using the "_defaults" as before (using _ for consistency with hosts), and also include other tables to provide more base settings for a specific rule, using a special based_on property. The value(s) for based_on reference tables inside hba, e.g. including "foo" means including "hba.foo". With based_on, we can also cover part of what the @include syntax does today: for example, we can define a database array in a separate table and reference it from a rule. Based on what I've explained so far, though, this only works within the same file. What's missing from the above specification is including external files: TOML has no official support for this, and the generic suggestion in multiple discussions about it is to "roll your own extension". This is common for most standard configuration file formats, which generally leave this part up to the applications. Adding an include mechanism has the disadvantage that standard parsers won't be able to use it. But it's an optional feature, and we could also provide a helper script that generates a "unified" view of an include hierarchy, which then can be used by standard TOML parsers. As for the syntax, I think we should simply reuse the existing include_dir / include_if_exists / include directives, as present in postgresql.conf, with the additional requirement that we always treat include directives as global/positional. It's a "preprocessor directive" similar to #include in C, in that it just concatenates files together. I think this has many advantages: 1. it keeps the syntax valid TOML, so any TOML library can parse it (includes found in any table = treat it as global scope, also load those files, calculate the union) 2. postgresql.conf is already close to TOML. Above I said that it would be good if we could unify the 3 whitespace-separated configuration files into one, but with minimal additional effort we can do more. Since everything for ident/hosts/hba lives in additional tables, all we have to say is that postgresql.conf only cares about the global table and ignores everything else, and we can then store the whole configuration in a single file. Of course, postgresql.conf allows some syntax that isn't valid TOML, so it isn't a drop-in subset today, but converting a postgresql.conf to TOML wouldn't require much work. The main difference is that TOML doesn't allow unquoted strings, so values like "replica" or "128MB" need quotes around them. I want to make clear that postgresql.conf is not in the scope of this proposal. That's possible future work which I think is important to mention, but I want to keep the focus on ident/hosts/hba. I think the second point is especially useful for cloud/container deployments, or for tests/examples/tutorials. I am not a DBA, so I don't want to claim that I know all about PostgreSQL configuration, but my understanding is that most deployments have relatively simple configuration, where this option would help. What do you think about this in general? About using TOML? About the specific TOML format I suggested here? [1]: https://www.postgresql.org/message-id/CAN4CZFM3b8u5uNNNsY6XCya257u%2BDofms3su9f11iMCxvCacag%40mail.gmail.com [2]: https://www.postgresql.org/message-id/0cabf744-6d58-4bc4-817a-413c804cf61d%40redhat.com [3]: https://github.com/cktan/tomlc17 --0000000000003578cb0656085432 Content-Type: application/octet-stream; name="0001-tomlhosts-vendor-tomlc17-parser.patch" Content-Disposition: attachment; filename="0001-tomlhosts-vendor-tomlc17-parser.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mraw8d8l0 RnJvbSA5MWY2NWU4ZmRkN2E2MTNlODhiNTFlODI3Nzc1MzAwZjU1NjI4OTBkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBac29sdCBQYXJyYWdpIDx6c29sdC5wYXJyYWdpQHBlcmNvbmEu Y29tPgpEYXRlOiBUdWUsIDcgSnVsIDIwMjYgMTY6NTU6MTggKzAwMDAKU3ViamVjdDogW1BBVENI IDEvMl0gdG9tbGhvc3RzOiB2ZW5kb3IgdG9tbGMxNyBwYXJzZXIKCkltcG9ydGVkIGZyb20gaHR0 cHM6Ly9naXRodWIuY29tL2NrdGFuL3RvbWxjMTcgcmVsZWFzZSBSMjYwNjE4CigyMDI2LTA2LTE4 KSwgdXBzdHJlYW0gY29tbWl0IDc4MTNiZGQyMThiMmI1ZjU0OTQwYTk3NTllYzBmZmIzYjYwYzFk MWYuCgpUaGUgb25seSBsb2NhbCBkZWx0YSBpcyB0aGUgaGVhZGVyIGluY2x1ZGUgcGF0aCAoc2Vl IExPQ0FMIENIQU5HRVMKaW4gdG9tbGMxNy5jKTsgTUlUIGxpY2Vuc2UgcHJlc2VydmVkIGFzIHNy Yy9jb21tb24vdG9tbGMxNy5MSUNFTlNFLgotLS0KIHNyYy9jb21tb24vTWFrZWZpbGUgICAgICAg ICAgfCAgICA4ICsKIHNyYy9jb21tb24vbWVzb24uYnVpbGQgICAgICAgfCAgIDExICsKIHNyYy9j b21tb24vdG9tbGMxNy5MSUNFTlNFICAgfCAgIDIyICsKIHNyYy9jb21tb24vdG9tbGMxNy5jICAg ICAgICAgfCAzMTcwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9pbmNs dWRlL2NvbW1vbi90b21sYzE3LmggfCAgMjc3ICsrKwogNSBmaWxlcyBjaGFuZ2VkLCAzNDg4IGlu c2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvY29tbW9uL3RvbWxjMTcuTElDRU5T RQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9jb21tb24vdG9tbGMxNy5jCiBjcmVhdGUgbW9kZSAx MDA2NDQgc3JjL2luY2x1ZGUvY29tbW9uL3RvbWxjMTcuaAoKZGlmZiAtLWdpdCBhL3NyYy9jb21t b24vTWFrZWZpbGUgYi9zcmMvY29tbW9uL01ha2VmaWxlCmluZGV4IDFhMmZiYmU4ODdmLi5jYjdh YTI5MmQ3OCAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi9NYWtlZmlsZQorKysgYi9zcmMvY29tbW9u L01ha2VmaWxlCkBAIC03OSw2ICs3OSw3IEBAIE9CSlNfQ09NTU9OID0gXAogCXNjcmFtLWNvbW1v bi5vIFwKIAlzdHJpbmcubyBcCiAJc3RyaW5naW5mby5vIFwKKwl0b21sYzE3Lm8gXAogCXVuaWNv ZGVfY2FzZS5vIFwKIAl1bmljb2RlX2NhdGVnb3J5Lm8gXAogCXVuaWNvZGVfbm9ybS5vIFwKQEAg LTIxMSw2ICsyMTIsMTMgQEAgUllVX09CSlMgPSAkKFJZVV9GSUxFUykgJChSWVVfRklMRVM6JS5v PSVfc2hsaWIubykgJChSWVVfRklMRVM6JS5vPSVfc3J2Lm8pCiAKICQoUllVX09CSlMpOiBDRkxB R1MgKz0gJChQRVJNSVRfREVDTEFSQVRJT05fQUZURVJfU1RBVEVNRU5UKQogCisjIFRoZSB2ZW5k b3JlZCB0b21sYzE3IFRPTUwgcGFyc2VyIGFsc28gZ2V0cyBhIHBhc3Mgb24KKyMgZGVjbGFyYXRp b24tYWZ0ZXItc3RhdGVtZW50LCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIFJ5dS4KK1RPTUxDMTdf RklMRVMgPSB0b21sYzE3Lm8KK1RPTUxDMTdfT0JKUyA9ICQoVE9NTEMxN19GSUxFUykgJChUT01M QzE3X0ZJTEVTOiUubz0lX3NobGliLm8pICQoVE9NTEMxN19GSUxFUzolLm89JV9zcnYubykKKwor JChUT01MQzE3X09CSlMpOiBDRkxBR1MgKz0gJChQRVJNSVRfREVDTEFSQVRJT05fQUZURVJfU1RB VEVNRU5UKQorCiBjbGVhbiBkaXN0Y2xlYW46CiAJcm0gLWYgbGlicGdjb21tb24uYSBsaWJwZ2Nv bW1vbl9zaGxpYi5hIGxpYnBnY29tbW9uX3Nydi5hIGxpYnBnY29tbW9uX2V4Y2x1ZGVkX3NobGli LmEKIAlybSAtZiAkKE9CSlNfRlJPTlRFTkQpICQoT0JKU19TSExJQikgJChPQkpTX1NSVikKZGlm ZiAtLWdpdCBhL3NyYy9jb21tb24vbWVzb24uYnVpbGQgYi9zcmMvY29tbW9uL21lc29uLmJ1aWxk CmluZGV4IDliZDU1Y2RhOTViLi5iMTZmNzZiMDlkYiAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi9t ZXNvbi5idWlsZAorKysgYi9zcmMvY29tbW9uL21lc29uLmJ1aWxkCkBAIC03NCw2ICs3NCwxNSBA QCByeXVfY2ZsYWdzID0gW10KIAogcnl1X2NmbGFncyArPSBjZmxhZ3Nfbm9fZGVjbF9hZnRlcl9z dGF0ZW1lbnQKIAorIyBUaGUgdmVuZG9yZWQgdG9tbGMxNyBUT01MIHBhcnNlciBhbHNvIGdldHMg YSBwYXNzIG9uCisjIGRlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCwgZm9yIHRoZSBzYW1lIHJl YXNvbiBhcyBSeXUuCit0b21sYzE3X3NvdXJjZXMgPSBmaWxlcygKKyAgJ3RvbWxjMTcuYycsCisp Cit0b21sYzE3X2NmbGFncyA9IFtdCisKK3RvbWxjMTdfY2ZsYWdzICs9IGNmbGFnc19ub19kZWNs X2FmdGVyX3N0YXRlbWVudAorCiBjb25maWdfaW5mb19zb3VyY2VzID0gZmlsZXMoJ2NvbmZpZ19p bmZvLmMnLCkKIGNvbmZpZ19pbmZvX2NmbGFncyA9IFsKICAgJy1EVkFMX0NDPSJAMEAiJy5mb3Jt YXQodmFyX2NjKSwKQEAgLTkwLDEwICs5OSwxMiBAQCBjb25maWdfaW5mb19jZmxhZ3MgPSBbCiAj IGRlZmluZWQgaGVyZS4KIGNvbW1vbl9jZmxhZ3MgPSB7CiAgICdyeXUnOiByeXVfY2ZsYWdzLAor ICAndG9tbGMxNyc6IHRvbWxjMTdfY2ZsYWdzLAogICAnY29uZmlnX2luZm8nOiBjb25maWdfaW5m b19jZmxhZ3MsCiB9CiBjb21tb25fc291cmNlc19jZmxhZ3MgPSB7CiAgICdyeXUnOiByeXVfc291 cmNlcywKKyAgJ3RvbWxjMTcnOiB0b21sYzE3X3NvdXJjZXMsCiAgICdjb25maWdfaW5mbyc6IGNv bmZpZ19pbmZvX3NvdXJjZXMKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi90b21sYzE3LkxJ Q0VOU0UgYi9zcmMvY29tbW9uL3RvbWxjMTcuTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMC4uY2QyOTk1ZDU1MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29t bW9uL3RvbWxjMTcuTElDRU5TRQpAQCAtMCwwICsxLDIyIEBACitNSVQgTGljZW5zZQorCitDb3B5 cmlnaHQgKGMpIDIwMjQtMjAyNiwgQ0sgVGFuCitodHRwczovL2dpdGh1Yi5jb20vY2t0YW4vdG9t bGMxNworCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8g YW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lh dGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhl IFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRp b24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0 cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwg YW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQg dG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJv dmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBp bmNsdWRlZCBpbiBhbGwKK2NvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29m dHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBM SU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNI QUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBD TEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBP RiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElO R1MgSU4gVEhFCitTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL3NyYy9jb21tb24vdG9tbGMxNy5jIGIv c3JjL2NvbW1vbi90b21sYzE3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLmQ5YWI0MDNmOTJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvbW1vbi90b21sYzE3LmMK QEAgLTAsMCArMSwzMTcwIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiB0b21sYzE3LmMK KyAqCSAgVmVuZG9yZWQgVE9NTCAxLjAvMS4xIHBhcnNlciBmcm9tIGh0dHBzOi8vZ2l0aHViLmNv bS9ja3Rhbi90b21sYzE3CisgKgorICogSW1wb3J0ZWQgdmVyYmF0aW0gZnJvbSB1cHN0cmVhbSBj b21taXQKKyAqCSA3ODEzYmRkMjE4YjJiNWY1NDk0MGE5NzU5ZWMwZmZiM2I2MGMxZDFmCisgKiB3 aXRoIHRoZSBzaW5nbGUgbG9jYWwgbW9kaWZpY2F0aW9uIGRvY3VtZW50ZWQgYmVsb3cuIFJlLXZl bmRvcmluZworICogbXVzdCByZS1hcHBseSB0aGlzIGRlbHRhIG9yIHRoZSBidWlsZCB3aWxsIGZh aWwuCisgKgorICogTE9DQUwgQ0hBTkdFUzoKKyAqCSAtIFRoZSBvcmlnaW5hbCBgI2luY2x1ZGUg InRvbWxjMTcuaCJgIHdhcyByZXdyaXR0ZW4gdG8KKyAqCSAgIGAjaW5jbHVkZSAiY29tbW9uL3Rv bWxjMTcuaCJgIHNvIFBvc3RncmVTUUwncyBzdGFuZGFyZAorICoJICAgYHNyYy9jb21tb24vYCAt PiBgc3JjL2luY2x1ZGUvY29tbW9uL2AgbGF5b3V0IHJlc29sdmVzIHRoZQorICoJICAgaGVhZGVy IHdpdGhvdXQgcGVyLWZpbGUgaW5jbHVkZSBmbGFncy4gVGhlIFBHLWxvY2FsIG1hcmtlcgorICoJ ICAgY29tbWVudCBiZWxvdyB0aGUgdXBzdHJlYW0gY29weXJpZ2h0IHRhZ3MgdGhlIGV4YWN0IHNp dGUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIENvcHlyaWdodCAoYykgMjAyNC0y MDI2LCBDSyBUYW4uCisgKiBodHRwczovL2dpdGh1Yi5jb20vY2t0YW4vdG9tbGMxNy9ibG9iL21h aW4vTElDRU5TRQorICovCisvKiBQRyBsb2NhbDogd2FzICNpbmNsdWRlICJ0b21sYzE3LmgiIC0g cmUtYXBwbHkgb24gcmUtdmVuZG9yICovCisjaW5jbHVkZSAiY29tbW9uL3RvbWxjMTcuaCIKKyNp bmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+ CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGFy Zy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRl IDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitj b25zdCB0b21sX2RhdHVtX3QgREFUVU1fWkVSTyA9IHswfTsKKworc3RhdGljIHRvbWxfb3B0aW9u X3QgdG9tbF9vcHRpb24gPSB7MCwgcmVhbGxvYywgZnJlZX07CisKKyNkZWZpbmUgTUFMTE9DKG4p IHRvbWxfb3B0aW9uLm1lbV9yZWFsbG9jKDAsIG4pCisjZGVmaW5lIFJFQUxMT0MocCwgbikgdG9t bF9vcHRpb24ubWVtX3JlYWxsb2MocCwgbikKKyNkZWZpbmUgRlJFRShwKSB0b21sX29wdGlvbi5t ZW1fZnJlZShwKQorCisjZGVmaW5lIERPKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoeCkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKKyAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAor ICAgICh2b2lkKTAKKworLy8gQ29weSBzdHJpbmcgc3JjIHRvIGRzdCB3aGVyZSBkc3QgaXMgbGlt aXRlZCB0byBkc3RzeiB0aGF0IGluY2x1ZGVzCisvLyBOVUwuIFJldHVybiAwIG9uIHN1Y2Nlc3Ms IC0xIG90aGVyd2lzZSAoYmVjYXVzZSBzcmNbXSBpcyBsb25nZXIgdGhhbiBkc3RbXSkuCitzdGF0 aWMgaW5saW5lIGludCBjb3B5c3RyaW5nKGNoYXIgKmRzdCwgaW50IGRzdHN6LCBjb25zdCBjaGFy ICpzcmMpIHsKKyAgaW50IHNyY3N6ID0gc3RybGVuKHNyYykgKyAxOworICBpZiAoc3Jjc3ogPiBk c3RzeikgeworICAgIHJldHVybiAtMTsKKyAgfQorICBtZW1jcHkoZHN0LCBzcmMsIHNyY3N6KTsK KyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgRXJyb3IgYnVmZmVyCisgKi8KK3R5cGVkZWYgc3Ry dWN0IGVidWZfdCBlYnVmX3Q7CitzdHJ1Y3QgZWJ1Zl90IHsKKyAgY2hhciAqcHRyOworICBpbnQg bGVuOworfTsKKworLyoKKyAqICBGb3JtYXQgYW4gZXJyb3IgaW50byBlYnVmW10uIEFsd2F5cyBy ZXR1cm4gLTEuCisgKi8KK3N0YXRpYyBpbnQgU0VURVJST1IoZWJ1Zl90IGVidWYsIGludCBsaW5l bm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQo YXJncywgZm10KTsKKyAgY2hhciAqcCA9IGVidWYucHRyOworICBjaGFyICpxID0gcCArIGVidWYu bGVuOworICBpZiAobGluZW5vKSB7CisgICAgc25wcmludGYocCwgcCA8IHEgPyBxIC0gcCA6IDAs ICIobGluZSAlZCkgIiwgbGluZW5vKTsKKyAgICBwICs9IHN0cmxlbihwKTsKKyAgfQorICB2c25w cmludGYocCwgcCA8IHEgPyBxIC0gcCA6IDAsIGZtdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsK KyAgcmV0dXJuIC0xOworfQorCisvKgorICogIE1lbW9yeSBwb29sLiBBbGxvY2F0ZWQgYSBiaWcg YmxvY2sgb25jZSBhbmQgaGFuZCBvdXQgcGllY2VtZWFsLgorICovCit0eXBlZGVmIHN0cnVjdCBw b29sX3QgcG9vbF90Oworc3RydWN0IHBvb2xfdCB7CisgIGludCBtYXg7ICAgICAvLyBzaXplIG9m IGJ1ZltdCisgIGludCB0b3A7ICAgICAvLyBvZmZzZXQgb2YgZmlyc3QgZnJlZSBieXRlIGluIGJ1 ZltdCisgIGNoYXIgYnVmWzFdOyAvLyBmaXJzdCBieXRlIHN0YXJ0cyBoZXJlCit9OworCisvKioK KyAqICBDcmVhdGUgYSBtZW1vcnkgcG9vbCBvZiBOIGJ5dGVzLiBSZXR1cm4gdGhlIG1lbW9yeSBw b29sIG9uCisgKiAgc3VjY2Vzcywgb3IgTlVMTCBpZiBvdXQgb2YgbWVtb3J5LgorICovCitzdGF0 aWMgcG9vbF90ICpwb29sX2NyZWF0ZShpbnQgTikgeworICBpZiAoTiA8PSAwKSB7CisgICAgTiA9 IDEwMDsgLy8gbWluaW11bQorICB9CisgIGludCB0b3RhbHN6ID0gc2l6ZW9mKHBvb2xfdCkgKyBO OworICBwb29sX3QgKnBvb2wgPSBNQUxMT0ModG90YWxzeik7CisgIGlmICghcG9vbCkgeworICAg IHJldHVybiBOVUxMOworICB9CisgIG1lbXNldChwb29sLCAwLCB0b3RhbHN6KTsKKyAgcG9vbC0+ bWF4ID0gTjsKKyAgcmV0dXJuIHBvb2w7Cit9CisKKy8qKgorICogIERlc3Ryb3kgYSBtZW1vcnkg cG9vbC4KKyAqLworc3RhdGljIHZvaWQgcG9vbF9kZXN0cm95KHBvb2xfdCAqcG9vbCkgeyBGUkVF KHBvb2wpOyB9CisKKy8qKgorICogIEFsbG9jYXRlIG4gYnl0ZXMgZnJvbSBwb29sLiBSZXR1cm4g dGhlIG1lbW9yeSBhbGxvY2F0ZWQgb24KKyAqICBzdWNjZXNzLCBvciBOVUxMIGlmIG91dCBvZiBt ZW1vcnkuCisgKi8KK3N0YXRpYyBjaGFyICpwb29sX2FsbG9jKHBvb2xfdCAqcG9vbCwgaW50IG4p IHsKKyAgaWYgKHBvb2wtPnRvcCArIG4gPiBwb29sLT5tYXgpIHsKKyAgICByZXR1cm4gTlVMTDsK KyAgfQorICBjaGFyICpyZXQgPSBwb29sLT5idWYgKyBwb29sLT50b3A7CisgIHBvb2wtPnRvcCAr PSBuOworICByZXR1cm4gcmV0OworfQorCisvLyBDZWxsOiBleHBhbmRhYmxlIGJ1ZmZlciB0aGF0 IGJlaGF2ZXMgbGlrZSByZWFsbG9jCit0eXBlZGVmIHN0cnVjdCBjZWxsX3QgY2VsbF90Oworc3Ry dWN0IGNlbGxfdCB7CisgIHVpbnQzMl90IHRvcCwgbWF4OworICAvLyBmaXJzdCBieXRlIG9mIGRh dGEgc3RhcnRzIGhlcmUgKGkuZS4gJigqdGhpcylbMV0pCit9OworCitzdGF0aWMgY2hhciAqY2Vs bF9yZWFsbG9jKGNoYXIgKnAsIGludCBzaXplKSB7CisgIGFzc2VydChzaXplID49IDApOworICBp ZiAocCA9PSBOVUxMKSB7CisgICAgLy8gZmlyc3QgbWFsbG9jCisgICAgY2VsbF90ICp0bXAgPSBS RUFMTE9DKE5VTEwsIHNpemUgKyBzaXplb2YoY2VsbF90KSk7CisgICAgaWYgKCF0bXApIHsKKyAg ICAgIHJldHVybiAwOyAvLyBvdXQgb2YgbWVtb3J5CisgICAgfQorICAgIGNlbGxfdCAqY3AgPSB0 bXA7CisgICAgY3AtPm1heCA9IHNpemU7CisgICAgY3AtPnRvcCA9IHNpemU7CisgICAgcmV0dXJu IChjaGFyICopJmNwWzFdOworICB9CisKKyAgLy8gb2J0YWluIGEgaGFuZGxlIHRvIGNlbGwgaW5m bworICBjZWxsX3QgKmNwID0gKGNlbGxfdCAqKShwIC0gc2l6ZW9mKGNlbGxfdCkpOworICBpZiAo KHVpbnQzMl90KXNpemUgPD0gY3AtPm1heCkgeworICAgIC8vIGNlbGwgaXMgYmlnIGVub3VnaCBm b3IgdGhlIG5ldyBzaXplLiBET05FLgorICAgIGNwLT50b3AgPSBzaXplOworICAgIHJldHVybiBw OworICB9CisKKyAgLy8gbmVlZCB0byBleHBhbmQuIGFkZCAzMCUgbWFyZ2luLgorICBpbnQgbmV3 bWF4ID0gc2l6ZSAqIDEuMyArIDEwMDsKKyAgY2VsbF90ICp0bXAgPSBSRUFMTE9DKGNwLCBuZXdt YXggKyBzaXplb2YoY2VsbF90KSk7CisgIGlmICghdG1wKSB7CisgICAgcmV0dXJuIDA7IC8vIG91 dCBvZiBtZW1vcnkKKyAgfQorICBjcCA9IHRtcDsKKyAgY3AtPm1heCA9IG5ld21heDsKKyAgY3At PnRvcCA9IHNpemU7CisgIHJldHVybiAoY2hhciAqKSZjcFsxXTsKK30KKworc3RhdGljIHZvaWQg Y2VsbF9mcmVlKGNoYXIgKnApIHsKKyAgaWYgKHApIHsKKyAgICBjZWxsX3QgKmNwID0gKGNlbGxf dCAqKShwIC0gc2l6ZW9mKGNlbGxfdCkpOworICAgIEZSRUUoY3ApOworICB9Cit9CisKKy8qIFRo aXMgaXMgYSBzdHJpbmcgdmlldy4gKi8KK3R5cGVkZWYgc3RydWN0IHNwYW5fdCBzcGFuX3Q7Citz dHJ1Y3Qgc3Bhbl90IHsKKyAgY29uc3QgY2hhciAqcHRyOworICBpbnQgbGVuOworfTsKKworLyog UmVwcmVzZW50cyBhIG11bHRpLXBhcnQga2V5ICovCisjZGVmaW5lIEtFWVBBUlRNQVggMTAKK3R5 cGVkZWYgc3RydWN0IGtleXBhcnRfdCBrZXlwYXJ0X3Q7CitzdHJ1Y3Qga2V5cGFydF90IHsKKyAg aW50IG5zcGFuOworICBzcGFuX3Qgc3BhbltLRVlQQVJUTUFYXTsKK307CisKK3N0YXRpYyBpbnQg dXRmOF90b191Y3MoY29uc3QgY2hhciAqcywgaW50IGxlbiwgdWludDMyX3QgKnJldCk7CitzdGF0 aWMgaW50IHVjc190b191dGY4KHVpbnQzMl90IGNvZGUsIGNoYXIgYnVmWzRdKTsKKworLy8gZmxh Z3MgZm9yIHRvbWxfZGF0dW1fdDo6ZmxhZy4KKyNkZWZpbmUgRkxBR19JTkxJTkVEIDEKKyNkZWZp bmUgRkxBR19TVERFWFBSIDIKKyNkZWZpbmUgRkxBR19FWFBMSUNJVCA0CisKKy8vIE1heGltdW0g bGV2ZWxzIG9mIGJyYWNrZXRzIGFuZCBicmFjZXMgdG8gcHJldmVudAorLy8gc3RhY2sgb3ZlcmZs b3cgZHVyaW5nIHJlY3Vyc2l2ZSBkZXNjZW50IG9mIHRoZSBwYXJzZXIuCisjZGVmaW5lIEJSQUNL RVRfTEVWRUxfTUFYIDMwCisjZGVmaW5lIEJSQUNFX0xFVkVMX01BWCAzMAorI2RlZmluZSBUQUJM RV9NQVggKDEgPDwgMTQpIC8vIDE2aworI2RlZmluZSBBUlJBWV9NQVggKDEgPDwgMTQpIC8vIDE2 aworCitlbnVtIHRva3R5cF90IHsKKyAgVE9LX0RPVCA9IDEsCisgIFRPS19FUVVBTCwKKyAgVE9L X0NPTU1BLAorICBUT0tfTEJSQUNLLCAgLy8gWworICBUT0tfTExCUkFDSywgLy8gW1sKKyAgVE9L X1JCUkFDSywgIC8vIF0KKyAgVE9LX1JSQlJBQ0ssIC8vIF1dCisgIFRPS19MQlJBQ0UsICAvLyB7 CisgIFRPS19SQlJBQ0UsICAvLyB9CisgIFRPS19MSVQsCisgIFRPS19TVFJJTkcsICAgICAgLy8g InN0cmluZyIKKyAgVE9LX01MU1RSSU5HLCAgICAvLyAiIiJtdWx0aS1saW5lLXN0cmluZyIiIgor ICBUT0tfTElUU1RSSU5HLCAgIC8vICdsaXQtc3RyaW5nJworICBUT0tfTUxMSVRTVFJJTkcsIC8v ICcnJ211bHRpLWxpbmUtbGl0LXN0cmluZycnJworICBUT0tfVElNRSwKKyAgVE9LX0RBVEUsCisg IFRPS19EQVRFVElNRSwKKyAgVE9LX0RBVEVUSU1FVFosCisgIFRPS19JTlRFR0VSLAorICBUT0tf RkxPQVQsCisgIFRPS19CT09MLAorICBUT0tfRU5ETCwKKyAgVE9LX0ZJTiA9IC01MDAwLCAvLyBF T0YKK307Cit0eXBlZGVmIGVudW0gdG9rdHlwX3QgdG9rdHlwX3Q7Cit0eXBlZGVmIHN0cnVjdCBz Y2FubmVyX3Qgc2Nhbm5lcl90OworCisvKiBSZW1lbWJlciB0aGUgY3VycmVudCBzdGF0ZSBvZiBh IHNjYW5uZXIgKi8KK3R5cGVkZWYgc3RydWN0IHNjYW5uZXJfc3RhdGVfdCBzY2FubmVyX3N0YXRl X3Q7CitzdHJ1Y3Qgc2Nhbm5lcl9zdGF0ZV90IHsKKyAgc2Nhbm5lcl90ICpzcDsKKyAgY29uc3Qg Y2hhciAqY3VyOyAvLyBwb2ludHMgaW50byBzY2FubmVyX3Q6OnNyY1tdCisgIGludCBsaW5lbm87 ICAgICAgLy8gY3VycmVudCBsaW5lIG51bWJlcgorICBjb25zdCBjaGFyICpsaW5lX3N0YXJ0Owor fTsKKworLy8gQSBzY2FuIHRva2VuCit0eXBlZGVmIHN0cnVjdCB0b2tlbl90IHRva2VuX3Q7Citz dHJ1Y3QgdG9rZW5fdCB7CisgIHRva3R5cF90IHRva3R5cDsKKyAgaW50IGxpbmVubzsKKyAgaW50 IGNvbG5vOworICBzcGFuX3Qgc3RyOworCisgIC8vIHZhbHVlcyByZXByZXNlbnRlZCBieSBzdHIK KyAgdW5pb24geworICAgIGNvbnN0IGNoYXIgKmVzY3A7IC8vIHBvaW50IHRvIGFuIGVzYyBjaGFy IGluIHN0cgorICAgIGludDY0X3QgaW50NjQ7CisgICAgZG91YmxlIGZwNjQ7CisgICAgYm9vbCBi MTsKKyAgICBzdHJ1Y3QgeworICAgICAgLy8gdmFsaWRpdHkgZGVwZW5kcyBvbiB0b2t0eXAgZm9y IFRJTUUsIERBVEUsIERBVEVUSU1FLCBEQVRFVElNRVRaCisgICAgICBpbnQgeWVhciwgbW9udGgs IGRheSwgaG91ciwgbWludXRlLCBzZWMsIHVzZWM7CisgICAgICBpbnQgdHo7IC8vICstIG1pbnV0 ZXMKKyAgICB9IHRzdmFsOworICB9IHU7Cit9OworCisvLyBTY2FubmVyIG9iamVjdAorc3RydWN0 IHNjYW5uZXJfdCB7CisgIGNvbnN0IGNoYXIgKnNyYzsgIC8vIHNyY1tdIGlzIGEgTlVMLXRlcm1p bmF0ZWQgc3RyaW5nCisgIGNvbnN0IGNoYXIgKmVuZHA7IC8vIGVuZCBvZiBzcmNbXS4gYWx3YXlz IHBvaW50aW5nIGF0IGEgTlVMIGNoYXIuCisgIGNvbnN0IGNoYXIgKmN1cjsgIC8vIGN1cnJlbnQg Y2hhciBpbiBzcmNbXQorICBpbnQgbGluZW5vOyAgICAgICAvLyBsaW5lIG51bWJlciBvZiBjdXJy ZW50IGNoYXIKKyAgY29uc3QgY2hhciAqbGluZV9zdGFydDsKKyAgY2hhciAqZXJybXNnOyAvLyBz ZXQgdG8gZWJ1Zi5wdHIgaWYgdGhlcmUgd2FzIGFuIGVycm9yCisgIGVidWZfdCBlYnVmOyAgLy8g YnVmZmVyIHRvIHN0b3JlIGVycm9yIG1lc3NhZ2UKKworICBpbnQgYnJhY2tldF9sZXZlbDsgLy8g Y291bnQgZGVwdGggb2YgWyBdCisgIGludCBicmFjZV9sZXZlbDsgICAvLyBjb3VudCBkZXB0aCBv ZiB7IH0KK307CitzdGF0aWMgdm9pZCBzY2FuX2luaXQoc2Nhbm5lcl90ICpzcCwgY29uc3QgY2hh ciAqc3JjLCBpbnQgbGVuLCBjaGFyICplcnJidWYsCisgICAgICAgICAgICAgICAgICAgICAgaW50 IGVycmJ1ZnN6KTsKK3N0YXRpYyBpbnQgc2Nhbl9rZXkoc2Nhbm5lcl90ICpzcCwgdG9rZW5fdCAq dG9rKTsKK3N0YXRpYyBpbnQgc2Nhbl92YWx1ZShzY2FubmVyX3QgKnNwLCB0b2tlbl90ICp0b2sp OworLy8gcmVzdG9yZSBzY2FubmVyIHRvIHN0YXRlIGJlZm9yZSB0b2sgd2FzIHJldHVybmVkCitz dGF0aWMgc2Nhbm5lcl9zdGF0ZV90IHNjYW5fbWFyayhzY2FubmVyX3QgKnNwKTsKK3N0YXRpYyB2 b2lkIHNjYW5fcmVzdG9yZShzY2FubmVyX3QgKnNwLCBzY2FubmVyX3N0YXRlX3Qgc3RhdGUpOwor CisjaWZuZGVmIG1pbgorc3RhdGljIGlubGluZSBpbnQgbWluKGludCBhLCBpbnQgYikgeyByZXR1 cm4gYSA8IGIgPyBhIDogYjsgfQorI2VuZGlmCisKKy8vIENvcHkgdXAgdG8gZHN0c3ogLSAxIGNo YXJzIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHNjYW5uZXIKKy8vIHRvIGRzdCwg YW5kIGFsd2F5cyB0ZXJtaW5hdGUgZHN0W10gd2l0aCBhIE5VTCBpZiBkc3RzeiA+IDAuCitzdGF0 aWMgdm9pZCBzY2FuX2NvcHlzdHIoc2Nhbm5lcl90ICpzcCwgY2hhciAqZHN0LCBpbnQgZHN0c3op IHsKKyAgYXNzZXJ0KGRzdHN6ID4gMCk7CisgIGludCBsZW4gPSBtaW4oc3AtPmVuZHAgLSBzcC0+ Y3VyLCBkc3RzeiAtIDEpOyAvLyBhY2NvdW50IGZvciBOVUwKKyAgaWYgKGxlbiA+IDApIHsKKyAg ICBtZW1jcHkoZHN0LCBzcC0+Y3VyLCBsZW4pOworICAgIGRzdFtsZW5dID0gJ1wwJzsKKyAgfQor fQorCisvLyBQYXJzZXIgb2JqZWN0Cit0eXBlZGVmIHN0cnVjdCBwYXJzZXJfdCBwYXJzZXJfdDsK K3N0cnVjdCBwYXJzZXJfdCB7CisgIHNjYW5uZXJfdCBzY2FubmVyOworICB0b21sX2RhdHVtX3Qg dG9wdGFiOyAgLy8gdG9wIHRhYmxlCisgIHRvbWxfZGF0dW1fdCAqY3VydGFiOyAvLyBjdXJyZW50 IHRhYmxlCisgIHBvb2xfdCAqcG9vbDsgICAgICAgICAvLyBtZW1vcnkgcG9vbCBmb3Igc3RyaW5n cworICBjb25zdCBjaGFyICpzcmNuYW1lOyAgLy8gc291cmNlIG5hbWUgY29waWVkIGludG8gdGhl IHBvb2wsIG9yIE5VTEwKKyAgZWJ1Zl90IGVidWY7ICAgICAgICAgIC8vIGJ1ZmZlciB0byBzdG9y ZSBsYXN0IGVycm9yIG1lc3NhZ2UKK307CisKKy8vIEZpbmQga2V5IGluIHRhYiBhbmQgcmV0dXJu IGl0cyBpbmRleC4gSWYgbm90IGZvdW5kLCByZXR1cm4gLTEuCitzdGF0aWMgaW50IHRhYl9maW5k KHRvbWxfZGF0dW1fdCAqdGFiLCBzcGFuX3Qga2V5KSB7CisgIGFzc2VydCh0YWItPnR5cGUgPT0g VE9NTF9UQUJMRSk7CisgIGZvciAoaW50IGkgPSAwLCB0b3AgPSB0YWItPnUudGFiLnNpemU7IGkg PCB0b3A7IGkrKykgeworICAgIGlmICh0YWItPnUudGFiLmxlbltpXSA9PSBrZXkubGVuICYmCisg ICAgICAgIDAgPT0gbWVtY21wKHRhYi0+dS50YWIua2V5W2ldLCBrZXkucHRyLCBrZXkubGVuKSkg eworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiAtMTsKK30KKworLy8gUHV0 IGtleSBpbnRvIHRhYiBkaWN0aW9uYXJ5LiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBkYXR1bSBm b3IgdGhlIGtleS4KKy8vIElmIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsIHJldHVybnMgYSBwb2lu dGVyIHRvIGl0cyBleGlzdGluZyBkYXR1bSAodGhlCisvLyBkYXR1bSBpcyBOT1QgemVyb2VkIOKA lCBjYWxsZXJzIG11c3QgY2hlY2sgZGF0dW0tPnR5cGUgdG8gZGV0ZWN0IGR1cGxpY2F0ZXMpLgor Ly8gSWYgdGhlIGtleSBpcyBuZXcsIGFwcGVuZHMgaXQgd2l0aCBhIHplcm8gZGF0dW0gYW5kIHJl dHVybnMgYSBwb2ludGVyIHRvIGl0LgorLy8gUmV0dXJucyBOVUxMIG9uIGFsbG9jYXRpb24gZmFp bHVyZS4KKy8vCisvLyBEdWFsLXVzZTogdGFiX2FkZCgpIHVzZXMgdGhlIG5vbi16ZXJvIHR5cGUg dG8gZGV0ZWN0IGFuZCByZWplY3QgZHVwbGljYXRlczsKKy8vIGRhdHVtX2NvcHkvZGF0dW1fbWVy Z2UoKSB1c2UgaXQgdG8gbG9jYXRlIG9yIGNyZWF0ZSBhIHNsb3QgZm9yIHdyaXRpbmcuCitzdGF0 aWMgdG9tbF9kYXR1bV90ICp0YWJfZW1wbGFjZSh0b21sX2RhdHVtX3QgKnRhYiwgc3Bhbl90IGtl eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipyZWFzb24p IHsKKyAgYXNzZXJ0KHRhYi0+dHlwZSA9PSBUT01MX1RBQkxFKTsKKyAgaW50IGkgPSB0YWJfZmlu ZCh0YWIsIGtleSk7CisgIGlmIChpID49IDApIHsKKyAgICByZXR1cm4gJnRhYi0+dS50YWIudmFs dWVbaV07CisgIH0KKworICAvLyBFeHBhbmQgcGtleVtdLCBwbGVuW10gYW5kIHZhbHVlW10uCisg IGludCBOID0gdGFiLT51LnRhYi5zaXplOworICBpZiAoTiA+PSBUQUJMRV9NQVgpIHsKKyAgICAq cmVhc29uID0gInRhYmxlIHRvbyBsYXJnZSI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICB7 CisgICAgY2hhciAqKnBrZXkgPSAoY2hhciAqKiljZWxsX3JlYWxsb2MoKGNoYXIgKikodm9pZCAq KXRhYi0+dS50YWIua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNpemVvZigqcGtleSkgKiAoTiArIDEpKTsKKyAgICBpbnQgKnBsZW4gPQorICAgICAgICAoaW50 ICopY2VsbF9yZWFsbG9jKChjaGFyICopdGFiLT51LnRhYi5sZW4sIHNpemVvZigqcGxlbikgKiAo TiArIDEpKTsKKyAgICB0b21sX2RhdHVtX3QgKnZhbHVlID0gKHRvbWxfZGF0dW1fdCAqKWNlbGxf cmVhbGxvYygKKyAgICAgICAgKGNoYXIgKil0YWItPnUudGFiLnZhbHVlLCBzaXplb2YoKnZhbHVl KSAqIChOICsgMSkpOworCisgICAgLy8gb24gc3VjY2VzcywgbXVzdCBzYXZlIG5ldyBwb2ludGVy cyBpbiB0YWItPnUudGFiIGJlY2F1c2UgdGhlCisgICAgLy8gb2xkIG1lbW9yeSBhcmVhcyBhcmUg Z29uZS4KKyAgICBpZiAocGtleSkgeworICAgICAgdGFiLT51LnRhYi5rZXkgPSAoY29uc3QgY2hh ciAqKilwa2V5OworICAgIH0KKyAgICBpZiAocGxlbikgeworICAgICAgdGFiLT51LnRhYi5sZW4g PSBwbGVuOworICAgIH0KKyAgICBpZiAodmFsdWUpIHsKKyAgICAgIHRhYi0+dS50YWIudmFsdWUg PSB2YWx1ZTsKKyAgICB9CisKKyAgICAvLyBpZiBhbnkgZmFpbCwgaXQgaXMgc2FmZSB0byBiYWls IG91dC4KKyAgICBpZiAoIXBrZXkgfHwgIXBsZW4gfHwgIXZhbHVlKSB7CisgICAgICAqcmVhc29u ID0gIm91dCBvZiBtZW1vcnkiOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisKKyAg Ly8gVGhlcmUgaXMgc3VmZmljaWVudCBzcGFjZSBpbiBhbGwgdGhlIGFycmF5cyBmb3Igb25lIG1v cmUgZWxlbWVudC4KKyAgLy8gQXBwZW5kIHRoZSBuZXcga2V5LiBUaGUgdmFsdWUgaXMgc2V0IHRv IERBVFVNX1pFUk8uIENhbGxlciB3aWxsCisgIC8vIG92ZXJ3cml0ZSB3aXRoIGEgdmFsaWQgZGF0 dW0uCisgIHRhYi0+dS50YWIuc2l6ZSA9IE4gKyAxOworICB0YWItPnUudGFiLmtleVtOXSA9IChj aGFyICopa2V5LnB0cjsKKyAgdGFiLT51LnRhYi5sZW5bTl0gPSBrZXkubGVuOworICB0YWItPnUu dGFiLnZhbHVlW05dID0gREFUVU1fWkVSTzsKKyAgcmV0dXJuICZ0YWItPnUudGFiLnZhbHVlW05d OworfQorCisvLyBBZGQgYSBuZXcga2V5IGluIHRhYi4gUmV0dXJuIDAgb24gc3VjY2VzcywgLTEg b3RoZXJ3aXNlLgorLy8gT24gZXJyb3IsICpyZWFzb24gd2lsbCBwb2ludCB0byBhbiBlcnJvciBt ZXNzYWdlLgorc3RhdGljIGludCB0YWJfYWRkKHRvbWxfZGF0dW1fdCAqdGFiLCBzcGFuX3QgbmV3 a2V5LCB0b21sX2RhdHVtX3QgbmV3dmFsdWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hh ciAqKnJlYXNvbikgeworICBhc3NlcnQodGFiLT50eXBlID09IFRPTUxfVEFCTEUpOworICB0b21s X2RhdHVtX3QgKnB2YWx1ZSA9IHRhYl9lbXBsYWNlKHRhYiwgbmV3a2V5LCByZWFzb24pOworICBp ZiAoIXB2YWx1ZSkgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAocHZhbHVlLT50eXBlKSB7 CisgICAgKnJlYXNvbiA9ICJkdXBsaWNhdGUga2V5IjsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAg KnB2YWx1ZSA9IG5ld3ZhbHVlOworICByZXR1cm4gMDsKK30KKworLy8gQWRkIGEgbmV3IGVsZW1l bnQgaW50byBhbiBhcnJheS4gUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorLy8g T24gZXJyb3IsICpyZWFzb24gd2lsbCBwb2ludCB0byBhbiBlcnJvciBtZXNzYWdlLgorc3RhdGlj IHRvbWxfZGF0dW1fdCAqYXJyX2VtcGxhY2UodG9tbF9kYXR1bV90ICphcnIsIGNvbnN0IGNoYXIg KipyZWFzb24pIHsKKyAgYXNzZXJ0KGFyci0+dHlwZSA9PSBUT01MX0FSUkFZKTsKKyAgaW50IG4g PSBhcnItPnUuYXJyLnNpemU7CisgIGlmIChuID49IEFSUkFZX01BWCkgeworICAgICpyZWFzb24g PSAiYXJyYXkgdG9vIGxhcmdlIjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICB0b21sX2RhdHVt X3QgKmVsZW0gPSAodG9tbF9kYXR1bV90ICopY2VsbF9yZWFsbG9jKChjaGFyICopYXJyLT51LmFy ci5lbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHNpemVvZigqZWxlbSkgKiAobiArIDEpKTsKKyAgaWYgKCFlbGVtKSB7CisgICAgKnJlYXNv biA9ICJvdXQgb2YgbWVtb3J5IjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBhcnItPnUuYXJy LmVsZW0gPSBlbGVtOworICBhcnItPnUuYXJyLnNpemUgPSBuICsgMTsKKyAgZWxlbVtuXSA9IERB VFVNX1pFUk87CisgIHJldHVybiAmZWxlbVtuXTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0t LSBwYXJzZXIgc2VjdGlvbgorc3RhdGljIGludCBwYXJzZV9ub3JtKHBhcnNlcl90ICpwcCwgdG9r ZW5fdCB0b2ssIHNwYW5fdCAqcmV0X3NwYW4pOworc3RhdGljIGludCBwYXJzZV92YWwocGFyc2Vy X3QgKnBwLCB0b2tlbl90IHRvaywgdG9tbF9kYXR1bV90ICpyZXQpOworc3RhdGljIGludCBwYXJz ZV9rZXl2YWx1ZV9leHByKHBhcnNlcl90ICpwcCwgdG9rZW5fdCB0b2spOworc3RhdGljIGludCBw YXJzZV9zdGRfdGFibGVfZXhwcihwYXJzZXJfdCAqcHAsIHRva2VuX3QgdG9rKTsKK3N0YXRpYyBp bnQgcGFyc2VfYXJyYXlfdGFibGVfZXhwcihwYXJzZXJfdCAqcHAsIHRva2VuX3QgdG9rKTsKKwor c3RhdGljIHRvbWxfZGF0dW1fdCBta2RhdHVtKHRvbWxfdHlwZV90IHR5KSB7CisgIHRvbWxfZGF0 dW1fdCByZXQgPSB7MH07CisgIHJldC50eXBlID0gdHk7CisgIGlmICh0eSA9PSBUT01MX0RBVEUg fHwgdHkgPT0gVE9NTF9USU1FIHx8IHR5ID09IFRPTUxfREFURVRJTUUgfHwKKyAgICAgIHR5ID09 IFRPTUxfREFURVRJTUVUWikgeworICAgIHJldC51LnRzLnllYXIgPSAtMTsKKyAgICByZXQudS50 cy5tb250aCA9IC0xOworICAgIHJldC51LnRzLmRheSA9IC0xOworICAgIHJldC51LnRzLmhvdXIg PSAtMTsKKyAgICByZXQudS50cy5taW51dGUgPSAtMTsKKyAgICByZXQudS50cy5zZWNvbmQgPSAt MTsKKyAgICByZXQudS50cy51c2VjID0gLTE7CisgICAgcmV0LnUudHMudHogPSAtMTsKKyAgfQor ICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdG9tbF9kYXR1bV90IG1rZGF0dW1fYXQodG9tbF90 eXBlX3QgdHksIGludCBsaW5lbm8sIGludCBjb2xubykgeworICB0b21sX2RhdHVtX3QgcmV0ID0g bWtkYXR1bSh0eSk7CisgIHJldC5saW5lbm8gPSBsaW5lbm87CisgIHJldC5jb2xubyA9IGNvbG5v OworICByZXR1cm4gcmV0OworfQorCisvLyBSZWN1cnNpdmVseSBmcmVlIGFueSBkeW5hbWljYWxs eSBhbGxvY2F0ZWQgbWVtb3J5IGluIHRoZSBkYXR1bSB0cmVlCitzdGF0aWMgdm9pZCBkYXR1bV9m cmVlKHRvbWxfZGF0dW1fdCAqZGF0dW0pIHsKKyAgaWYgKGRhdHVtLT50eXBlID09IFRPTUxfVEFC TEUpIHsKKyAgICBmb3IgKGludCBpID0gMCwgdG9wID0gZGF0dW0tPnUudGFiLnNpemU7IGkgPCB0 b3A7IGkrKykgeworICAgICAgZGF0dW1fZnJlZSgmZGF0dW0tPnUudGFiLnZhbHVlW2ldKTsKKyAg ICB9CisgICAgY2VsbF9mcmVlKChjaGFyICopKHZvaWQgKilkYXR1bS0+dS50YWIua2V5KTsKKyAg ICBjZWxsX2ZyZWUoKGNoYXIgKilkYXR1bS0+dS50YWIubGVuKTsKKyAgICBjZWxsX2ZyZWUoKGNo YXIgKilkYXR1bS0+dS50YWIudmFsdWUpOworICB9IGVsc2UgaWYgKGRhdHVtLT50eXBlID09IFRP TUxfQVJSQVkpIHsKKyAgICBmb3IgKGludCBpID0gMCwgdG9wID0gZGF0dW0tPnUuYXJyLnNpemU7 IGkgPCB0b3A7IGkrKykgeworICAgICAgZGF0dW1fZnJlZSgmZGF0dW0tPnUuYXJyLmVsZW1baV0p OworICAgIH0KKyAgICBjZWxsX2ZyZWUoKGNoYXIgKilkYXR1bS0+dS5hcnIuZWxlbSk7CisgIH0K KyAgLy8gb3RoZXIgdHlwZXMgZG8gbm90IGFsbG9jYXRlIG1lbW9yeQorICAqZGF0dW0gPSBEQVRV TV9aRVJPOworfQorCisvLyBNYXBzIGVhY2ggZGlzdGluY3Qgc291cmNlLW5hbWUgcG9pbnRlciB0 byBhIHNpbmdsZSBjb3B5IGluIHRoZSBkZXN0aW5hdGlvbgorLy8gcG9vbCAoZGVkdXBsaWNhdGVk KSwgc28gdGhlIG1lcmdlZCBwb29sIGhvbGRzIGF0IG1vc3Qgb25lIGNvcHkgb2YgZWFjaCBzb3Vy Y2UKKy8vIG5hbWUgKGtlZXBpbmcgaXQgd2l0aGluIHRoZSByMXBvb2wtPnRvcCArIHIycG9vbC0+ dG9wIGJ1ZGdldCkuCit0eXBlZGVmIHN0cnVjdCBzcmNtYXBfdCBzcmNtYXBfdDsKK3N0cnVjdCBz cmNtYXBfdCB7CisgIHBvb2xfdCAqcG9vbDsKKyAgY29uc3QgY2hhciAqKm9sZHM7IC8vIGNlbGwg YnVmZmVyIG9mIG9sZCBwb2ludGVycworICBjb25zdCBjaGFyICoqbmV3czsgLy8gY2VsbCBidWZm ZXIgb2YgbmV3IChjb3BpZWQpIHBvaW50ZXJzCisgIGludCBuLCBjYXA7Cit9OworCisvLyBSZXR1 cm5zIHRoZSBkZWR1cGxpY2F0ZWQgY29weSBvZiBzcmMsIG9yIE5VTEwgZm9yIGEgTlVMTCBpbnB1 dCBvciBvbgorLy8gb3V0LW9mLW1lbW9yeS4gQ2FsbGVycyBkaXN0aW5ndWlzaCB0aGUgdHdvOiBh IG5vbi1OVUxMIHNyYyB0aGF0IHlpZWxkcyBOVUxMCisvLyBpcyBhIGhhcmQgZmFpbHVyZS4KK3N0 YXRpYyBjb25zdCBjaGFyICpkZWR1cF9zb3VyY2Uoc3JjbWFwX3QgKm0sIGNvbnN0IGNoYXIgKnNy YykgeworICBpZiAoIXNyYykgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGZvciAoaW50IGkg PSAwOyBpIDwgbS0+bjsgaSsrKSB7CisgICAgaWYgKG0tPm9sZHNbaV0gPT0gc3JjKSB7CisgICAg ICByZXR1cm4gbS0+bmV3c1tpXTsKKyAgICB9CisgIH0KKyAgLy8gR3JvdyB0aGUgbWVtbyBmaXJz dCwgc28gYW4gYWxsb2NhdGlvbiBmYWlsdXJlIGFib3J0cyBjbGVhbmx5LgorICBpZiAobS0+biA9 PSBtLT5jYXApIHsKKyAgICBpbnQgbmV3Y2FwID0gbS0+Y2FwID8gbS0+Y2FwICogMiA6IDQ7Cisg ICAgY29uc3QgY2hhciAqKm5vID0gKGNvbnN0IGNoYXIgKiopY2VsbF9yZWFsbG9jKChjaGFyICop KHZvaWQgKiltLT5vbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzaXplb2YoKm5vKSAqIG5ld2NhcCk7CisgICAgaWYgKCFubykgeworICAgICAg cmV0dXJuIE5VTEw7IC8vIG91dCBvZiBtZW1vcnkKKyAgICB9CisgICAgbS0+b2xkcyA9IG5vOwor ICAgIGNvbnN0IGNoYXIgKipubiA9IChjb25zdCBjaGFyICoqKWNlbGxfcmVhbGxvYygoY2hhciAq KSh2b2lkICopbS0+bmV3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc2l6ZW9mKCpubikgKiBuZXdjYXApOworICAgIGlmICghbm4pIHsKKyAgICAg IHJldHVybiBOVUxMOyAvLyBvdXQgb2YgbWVtb3J5CisgICAgfQorICAgIG0tPm5ld3MgPSBubjsK KyAgICBtLT5jYXAgPSBuZXdjYXA7CisgIH0KKyAgaW50IGxlbiA9IChpbnQpc3RybGVuKHNyYykg KyAxOworICBjaGFyICpwID0gcG9vbF9hbGxvYyhtLT5wb29sLCBsZW4pOworICBpZiAoIXApIHsK KyAgICByZXR1cm4gTlVMTDsgLy8gb3V0IG9mIG1lbW9yeQorICB9CisgIG1lbWNweShwLCBzcmMs IGxlbik7CisgIG0tPm9sZHNbbS0+bl0gPSBzcmM7CisgIG0tPm5ld3NbbS0+bl0gPSBwOworICBt LT5uKys7CisgIHJldHVybiBwOworfQorCisvLyBNYWtlIGEgZGVlcCBjb3B5IG9mIHNyYyB0byBk c3QuCisvLyBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvdGhlcndpc2UuCitzdGF0aWMgaW50IGRh dHVtX2NvcHkodG9tbF9kYXR1bV90ICpkc3QsIHRvbWxfZGF0dW1fdCBzcmMsIHNyY21hcF90ICpz bSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqcmVhc29uKSB7CisgICpkc3Qg PSBta2RhdHVtX2F0KHNyYy50eXBlLCBzcmMubGluZW5vLCBzcmMuY29sbm8pOworICBkc3QtPmZs YWcgPSBzcmMuZmxhZzsKKyAgc3dpdGNoIChzcmMudHlwZSkgeworICBjYXNlIFRPTUxfU1RSSU5H OgorICAgIGRzdC0+dS5zdHIucHRyID0gcG9vbF9hbGxvYyhzbS0+cG9vbCwgc3JjLnUuc3RyLmxl biArIDEpOworICAgIGlmICghZHN0LT51LnN0ci5wdHIpIHsKKyAgICAgICpyZWFzb24gPSAib3V0 IG9mIG1lbW9yeSI7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorICAgIGRzdC0+dS5zdHIubGVu ID0gc3JjLnUuc3RyLmxlbjsKKyAgICBtZW1jcHkoKGNoYXIgKilkc3QtPnUuc3RyLnB0ciwgc3Jj LnUuc3RyLnB0ciwgc3JjLnUuc3RyLmxlbiArIDEpOworICAgIGJyZWFrOworICBjYXNlIFRPTUxf VEFCTEU6CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMudS50YWIuc2l6ZTsgaSsrKSB7Cisg ICAgICBjaGFyICprZXljb3B5ID0gcG9vbF9hbGxvYyhzbS0+cG9vbCwgc3JjLnUudGFiLmxlbltp XSArIDEpOworICAgICAgaWYgKCFrZXljb3B5KSB7CisgICAgICAgICpyZWFzb24gPSAib3V0IG9m IG1lbW9yeSI7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIG1lbWNweShrZXlj b3B5LCBzcmMudS50YWIua2V5W2ldLCBzcmMudS50YWIubGVuW2ldICsgMSk7CisgICAgICBzcGFu X3QgbmV3a2V5ID0ge2tleWNvcHksIHNyYy51LnRhYi5sZW5baV19OworICAgICAgdG9tbF9kYXR1 bV90ICpwdmFsdWUgPSB0YWJfZW1wbGFjZShkc3QsIG5ld2tleSwgcmVhc29uKTsKKyAgICAgIGlm ICghcHZhbHVlKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGlmIChkYXR1 bV9jb3B5KHB2YWx1ZSwgc3JjLnUudGFiLnZhbHVlW2ldLCBzbSwgcmVhc29uKSkgeworICAgICAg ICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICBjYXNlIFRPTUxfQVJS QVk6CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMudS5hcnIuc2l6ZTsgaSsrKSB7CisgICAg ICB0b21sX2RhdHVtX3QgKnBlbGVtID0gYXJyX2VtcGxhY2UoZHN0LCByZWFzb24pOworICAgICAg aWYgKCFwZWxlbSkgeworICAgICAgICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAoZGF0 dW1fY29weShwZWxlbSwgc3JjLnUuYXJyLmVsZW1baV0sIHNtLCByZWFzb24pKSB7CisgICAgICAg IGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAg KmRzdCA9IHNyYzsKKyAgICBicmVhazsKKyAgfQorCisgIGRzdC0+c291cmNlID0gZGVkdXBfc291 cmNlKHNtLCBzcmMuc291cmNlKTsKKyAgaWYgKHNyYy5zb3VyY2UgJiYgIWRzdC0+c291cmNlKSB7 CisgICAgKnJlYXNvbiA9ICJvdXQgb2YgbWVtb3J5IjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAg cmV0dXJuIDA7CisKK2JhaWw6CisgIGRhdHVtX2ZyZWUoZHN0KTsKKyAgcmV0dXJuIC0xOworfQor CisvLyBDaGVjayBpZiBkYXR1bSBpcyBhbiBhcnJheSBvZiB0YWJsZXMuCitzdGF0aWMgaW5saW5l IGJvb2wgaXNfYXJyYXlfb2ZfdGFibGVzKHRvbWxfZGF0dW1fdCBkYXR1bSkgeworICBib29sIHJl dCA9IChkYXR1bS50eXBlID09IFRPTUxfQVJSQVkpOworICBmb3IgKGludCBpID0gMDsgcmV0ICYm IGkgPCBkYXR1bS51LmFyci5zaXplOyBpKyspIHsKKyAgICByZXQgPSAoZGF0dW0udS5hcnIuZWxl bVtpXS50eXBlID09IFRPTUxfVEFCTEUpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vIE1l cmdlIHNyYyBpbnRvIGRzdC4gUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgorc3Rh dGljIGludCBkYXR1bV9tZXJnZSh0b21sX2RhdHVtX3QgKmRzdCwgdG9tbF9kYXR1bV90IHNyYywg c3JjbWFwX3QgKnNtLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqcmVhc29u KSB7CisgIGlmIChkc3QtPnR5cGUgIT0gc3JjLnR5cGUpIHsKKyAgICBkYXR1bV9mcmVlKGRzdCk7 CisgICAgcmV0dXJuIGRhdHVtX2NvcHkoZHN0LCBzcmMsIHNtLCByZWFzb24pOworICB9CisgIHN3 aXRjaCAoc3JjLnR5cGUpIHsKKyAgY2FzZSBUT01MX1RBQkxFOgorICAgIC8vIGZvciBrZXktdmFs dWUgaW4gc3JjOgorICAgIC8vICAgIG92ZXJyaWRlIGtleS12YWx1ZSBpbiBkc3QuCisgICAgZm9y IChpbnQgaSA9IDA7IGkgPCBzcmMudS50YWIuc2l6ZTsgaSsrKSB7CisgICAgICBjaGFyICprZXlj b3B5ID0gcG9vbF9hbGxvYyhzbS0+cG9vbCwgc3JjLnUudGFiLmxlbltpXSArIDEpOworICAgICAg aWYgKCFrZXljb3B5KSB7CisgICAgICAgICpyZWFzb24gPSAib3V0IG9mIG1lbW9yeSI7CisgICAg ICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIG1lbWNweShrZXljb3B5LCBzcmMudS50YWIu a2V5W2ldLCBzcmMudS50YWIubGVuW2ldICsgMSk7CisgICAgICBzcGFuX3Qga2V5OworICAgICAg a2V5LnB0ciA9IGtleWNvcHk7CisgICAgICBrZXkubGVuID0gc3JjLnUudGFiLmxlbltpXTsKKyAg ICAgIHRvbWxfZGF0dW1fdCAqcHZhbHVlID0gdGFiX2VtcGxhY2UoZHN0LCBrZXksIHJlYXNvbik7 CisgICAgICBpZiAoIXB2YWx1ZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAg ICBpZiAocHZhbHVlLT50eXBlKSB7CisgICAgICAgIERPKGRhdHVtX21lcmdlKHB2YWx1ZSwgc3Jj LnUudGFiLnZhbHVlW2ldLCBzbSwgcmVhc29uKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBk YXR1bV9mcmVlKHB2YWx1ZSk7CisgICAgICAgIERPKGRhdHVtX2NvcHkocHZhbHVlLCBzcmMudS50 YWIudmFsdWVbaV0sIHNtLCByZWFzb24pKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7 CisgIGNhc2UgVE9NTF9BUlJBWToKKyAgICBpZiAoaXNfYXJyYXlfb2ZfdGFibGVzKHNyYykpIHsK KyAgICAgIC8vIGFwcGVuZCBzcmMgYXJyYXkgdG8gZHN0CisgICAgICBmb3IgKGludCBpID0gMDsg aSA8IHNyYy51LmFyci5zaXplOyBpKyspIHsKKyAgICAgICAgdG9tbF9kYXR1bV90ICpwZWxlbSA9 IGFycl9lbXBsYWNlKGRzdCwgcmVhc29uKTsKKyAgICAgICAgaWYgKCFwZWxlbSkgeworICAgICAg ICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBETyhkYXR1bV9jb3B5KHBlbGVtLCBz cmMudS5hcnIuZWxlbVtpXSwgc20sIHJlYXNvbikpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7 CisgICAgfQorICAgIC8vIGZhbGx0aHJ1CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAg ZGF0dW1fZnJlZShkc3QpOworICByZXR1cm4gZGF0dW1fY29weShkc3QsIHNyYywgc20sIHJlYXNv bik7Cit9CisKKy8vIENvbXBhcmUgdGhlIGNvbnRlbnQgb2YgYSBhbmQgYi4KK3N0YXRpYyBib29s IGRhdHVtX2VxdWl2KHRvbWxfZGF0dW1fdCBhLCB0b21sX2RhdHVtX3QgYikgeworICBpZiAoYS50 eXBlICE9IGIudHlwZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgTjsKKyAgc3dp dGNoIChhLnR5cGUpIHsKKyAgY2FzZSBUT01MX1NUUklORzoKKyAgICByZXR1cm4gYS51LnN0ci5s ZW4gPT0gYi51LnN0ci5sZW4gJiYKKyAgICAgICAgICAgMCA9PSBtZW1jbXAoYS51LnN0ci5wdHIs IGIudS5zdHIucHRyLCBhLnUuc3RyLmxlbik7CisgIGNhc2UgVE9NTF9JTlQ2NDoKKyAgICByZXR1 cm4gYS51LmludDY0ID09IGIudS5pbnQ2NDsKKyAgY2FzZSBUT01MX0ZQNjQ6CisgICAgcmV0dXJu IGEudS5mcDY0ID09IGIudS5mcDY0IHx8IChpc25hbihhLnUuZnA2NCkgJiYgaXNuYW4oYi51LmZw NjQpKTsKKyAgY2FzZSBUT01MX0JPT0xFQU46CisgICAgcmV0dXJuICEhYS51LmJvb2xlYW4gPT0g ISFiLnUuYm9vbGVhbjsKKyAgY2FzZSBUT01MX0RBVEU6CisgICAgcmV0dXJuIGEudS50cy55ZWFy ID09IGIudS50cy55ZWFyICYmIGEudS50cy5tb250aCA9PSBiLnUudHMubW9udGggJiYKKyAgICAg ICAgICAgYS51LnRzLmRheSA9PSBiLnUudHMuZGF5OworICBjYXNlIFRPTUxfVElNRToKKyAgICBy ZXR1cm4gYS51LnRzLmhvdXIgPT0gYi51LnRzLmhvdXIgJiYgYS51LnRzLm1pbnV0ZSA9PSBiLnUu dHMubWludXRlICYmCisgICAgICAgICAgIGEudS50cy5zZWNvbmQgPT0gYi51LnRzLnNlY29uZCAm JiBhLnUudHMudXNlYyA9PSBiLnUudHMudXNlYzsKKyAgY2FzZSBUT01MX0RBVEVUSU1FOgorICAg IHJldHVybiBhLnUudHMueWVhciA9PSBiLnUudHMueWVhciAmJiBhLnUudHMubW9udGggPT0gYi51 LnRzLm1vbnRoICYmCisgICAgICAgICAgIGEudS50cy5kYXkgPT0gYi51LnRzLmRheSAmJiBhLnUu dHMuaG91ciA9PSBiLnUudHMuaG91ciAmJgorICAgICAgICAgICBhLnUudHMubWludXRlID09IGIu dS50cy5taW51dGUgJiYgYS51LnRzLnNlY29uZCA9PSBiLnUudHMuc2Vjb25kICYmCisgICAgICAg ICAgIGEudS50cy51c2VjID09IGIudS50cy51c2VjOworICBjYXNlIFRPTUxfREFURVRJTUVUWjoK KyAgICByZXR1cm4gYS51LnRzLnllYXIgPT0gYi51LnRzLnllYXIgJiYgYS51LnRzLm1vbnRoID09 IGIudS50cy5tb250aCAmJgorICAgICAgICAgICBhLnUudHMuZGF5ID09IGIudS50cy5kYXkgJiYg YS51LnRzLmhvdXIgPT0gYi51LnRzLmhvdXIgJiYKKyAgICAgICAgICAgYS51LnRzLm1pbnV0ZSA9 PSBiLnUudHMubWludXRlICYmIGEudS50cy5zZWNvbmQgPT0gYi51LnRzLnNlY29uZCAmJgorICAg ICAgICAgICBhLnUudHMudXNlYyA9PSBiLnUudHMudXNlYyAmJiBhLnUudHMudHogPT0gYi51LnRz LnR6OworICBjYXNlIFRPTUxfQVJSQVk6CisgICAgTiA9IGEudS5hcnIuc2l6ZTsKKyAgICBpZiAo TiAhPSBiLnUuYXJyLnNpemUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9y IChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgIGlmICghZGF0dW1fZXF1aXYoYS51LmFy ci5lbGVtW2ldLCBiLnUuYXJyLmVsZW1baV0pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg ICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIGNhc2UgVE9NTF9UQUJMRToKKyAgICBO ID0gYS51LnRhYi5zaXplOworICAgIGlmIChOICE9IGIudS50YWIuc2l6ZSkgeworICAgICAgcmV0 dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgeworICAg ICAgaW50IGxlbiA9IGEudS50YWIubGVuW2ldOworICAgICAgaWYgKGxlbiAhPSBiLnUudGFiLmxl bltpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoMCAhPSBt ZW1jbXAoYS51LnRhYi5rZXlbaV0sIGIudS50YWIua2V5W2ldLCBsZW4pKSB7CisgICAgICAgIHJl dHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmICghZGF0dW1fZXF1aXYoYS51LnRhYi52YWx1 ZVtpXSwgYi51LnRhYi52YWx1ZVtpXSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg fQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsKKyAgfQor ICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogIE92ZXJyaWRlIHZhbHVlcyBpbiByMSB1c2lu ZyByMi4gUmV0dXJuIGEgbmV3IHJlc3VsdC4gQWxsIHJlc3VsdHMKKyAqICAoaS5lLiwgcjEsIHIy IGFuZCB0aGUgcmV0dXJuZWQgcmVzdWx0KSBtdXN0IGJlIGZyZWVkIHVzaW5nIHRvbWxfZnJlZSgp CisgKiAgYWZ0ZXIgdXNlLgorICoKKyAqICBMT0dJQzoKKyAqICAgcmV0ID0gY29weSBvZiByMQor ICogICBmb3IgZWFjaCBpdGVtIHggaW4gcjI6CisgKiAgICAgaWYgeCBpcyBub3QgaW4gcmV0Ogor ICogICAgICAgICAgb3ZlcnJpZGUKKyAqICAgICBlbGlmIHggaW4gcmV0IGlzIE5PVCBvZiB0aGUg c2FtZSB0eXBlOgorICogICAgICAgICBvdmVycmlkZQorICogICAgIGVsaWYgeCBpcyBhbiBhcnJh eSBvZiB0YWJsZXM6CisgKiAgICAgICAgIGFwcGVuZCByMi54IHRvIHJldC54CisgKiAgICAgZWxp ZiB4IGlzIGEgdGFibGU6CisgKiAgICAgICAgIG1lcmdlIHIyLnggdG8gcmV0LngKKyAqICAgICBl bHNlOgorICogICAgICAgICBvdmVycmlkZQorICovCit0b21sX3Jlc3VsdF90IHRvbWxfbWVyZ2Uo Y29uc3QgdG9tbF9yZXN1bHRfdCAqcjEsIGNvbnN0IHRvbWxfcmVzdWx0X3QgKnIyKSB7CisgIGNv bnN0IGNoYXIgKnJlYXNvbiA9ICIiOworICB0b21sX3Jlc3VsdF90IHJldCA9IHswfTsKKyAgcG9v bF90ICpwb29sID0gMDsKKyAgc3JjbWFwX3Qgc20gPSB7MH07CisgIGlmICghcjEtPm9rKSB7Cisg ICAgcmVhc29uID0gInBhcmFtIGVycm9yOiByMSBub3Qgb2siOworICAgIGdvdG8gYmFpbDsKKyAg fQorICBpZiAoIXIyLT5vaykgeworICAgIHJlYXNvbiA9ICJwYXJhbSBlcnJvcjogcjIgbm90IG9r IjsKKyAgICBnb3RvIGJhaWw7CisgIH0KKyAgeworICAgIHBvb2xfdCAqcjFwb29sID0gKHBvb2xf dCAqKXIxLT5fX2ludGVybmFsOworICAgIHBvb2xfdCAqcjJwb29sID0gKHBvb2xfdCAqKXIyLT5f X2ludGVybmFsOworICAgIHBvb2wgPSBwb29sX2NyZWF0ZShyMXBvb2wtPnRvcCArIHIycG9vbC0+ dG9wKTsKKyAgICBpZiAoIXBvb2wpIHsKKyAgICAgIHJlYXNvbiA9ICJvdXQgb2YgbWVtb3J5IjsK KyAgICAgIGdvdG8gYmFpbDsKKyAgICB9CisgIH0KKyAgc20ucG9vbCA9IHBvb2w7CisKKyAgLy8g TWFrZSBhIGNvcHkgb2YgcjEKKyAgaWYgKGRhdHVtX2NvcHkoJnJldC50b3B0YWIsIHIxLT50b3B0 YWIsICZzbSwgJnJlYXNvbikpIHsKKyAgICBnb3RvIGJhaWw7CisgIH0KKworICAvLyBNZXJnZSBy MiBpbnRvIHRoZSByZXN1bHQKKyAgaWYgKGRhdHVtX21lcmdlKCZyZXQudG9wdGFiLCByMi0+dG9w dGFiLCAmc20sICZyZWFzb24pKSB7CisgICAgZ290byBiYWlsOworICB9CisKKyAgY2VsbF9mcmVl KChjaGFyICopKHZvaWQgKilzbS5vbGRzKTsKKyAgY2VsbF9mcmVlKChjaGFyICopKHZvaWQgKilz bS5uZXdzKTsKKyAgcmV0Lm9rID0gMTsKKyAgcmV0Ll9faW50ZXJuYWwgPSBwb29sOworICByZXR1 cm4gcmV0OworCitiYWlsOgorICBjZWxsX2ZyZWUoKGNoYXIgKikodm9pZCAqKXNtLm9sZHMpOwor ICBjZWxsX2ZyZWUoKGNoYXIgKikodm9pZCAqKXNtLm5ld3MpOworICBwb29sX2Rlc3Ryb3kocG9v bCk7CisgIHNucHJpbnRmKHJldC5lcnJtc2csIHNpemVvZihyZXQuZXJybXNnKSwgIiVzIiwgcmVh c29uKTsKKyAgcmV0dXJuIHJldDsKK30KKworYm9vbCB0b21sX2VxdWl2KGNvbnN0IHRvbWxfcmVz dWx0X3QgKnIxLCBjb25zdCB0b21sX3Jlc3VsdF90ICpyMikgeworICBpZiAoIShyMS0+b2sgJiYg cjItPm9rKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZGF0dW1fZXF1aXYo cjEtPnRvcHRhYiwgcjItPnRvcHRhYik7Cit9CisKKy8qKgorICogRmluZCBhIGtleSBpbiBhIHRv bWxfdGFibGUuIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGtleSBpZiBmb3VuZCwKKyAqIG9yIGEg VE9NTF9VTktOT1dOIG90aGVyd2lzZS4KKyAqLwordG9tbF9kYXR1bV90IHRvbWxfZ2V0KHRvbWxf ZGF0dW1fdCBkYXR1bSwgY29uc3QgY2hhciAqa2V5KSB7CisgIGlmIChkYXR1bS50eXBlID09IFRP TUxfVEFCTEUpIHsKKyAgICBpbnQgbiA9IGRhdHVtLnUudGFiLnNpemU7CisgICAgaWYgKG4gPiAw KSB7CisgICAgICBpbnQga2V5X2xlbiA9IHN0cmxlbihrZXkpOworICAgICAgY29uc3QgY2hhciAq KnBrZXkgPSBkYXR1bS51LnRhYi5rZXk7CisgICAgICBpbnQgKnBsZW4gPSBkYXR1bS51LnRhYi5s ZW47CisgICAgICB0b21sX2RhdHVtX3QgKnB2YWx1ZSA9IGRhdHVtLnUudGFiLnZhbHVlOworICAg ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKHBsZW5baV0gPT0g a2V5X2xlbiAmJiAwID09IG1lbWNtcChwa2V5W2ldLCBrZXksIGtleV9sZW4pKSB7CisgICAgICAg ICAgcmV0dXJuIHB2YWx1ZVtpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBy ZXR1cm4gREFUVU1fWkVSTzsKK30KKworLyoqCisgKiBMb2NhdGUgYSB2YWx1ZSBzdGFydGluZyBm cm9tIGEgdG9tbF90YWJsZS4gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUga2V5IGlmCisgKiBmb3Vu ZCwgb3IgYSBUT01MX1VOS05PV04gb3RoZXJ3aXNlLgorICoKKyAqIE5vdGU6IHRoZSBtdWx0aXBh cnQta2V5IGlzIHNlcGFyYXRlZCBieSBET1QsIGFuZCBtdXN0IG5vdCBoYXZlIGFueSBlc2NhcGUK KyAqIGNoYXJzLgorICovCit0b21sX2RhdHVtX3QgdG9tbF9zZWVrKHRvbWxfZGF0dW1fdCB0YWJs ZSwgY29uc3QgY2hhciAqbXVsdGlwYXJ0X2tleSkgeworICBpZiAodGFibGUudHlwZSAhPSBUT01M X1RBQkxFKSB7CisgICAgcmV0dXJuIERBVFVNX1pFUk87CisgIH0KKworICAvLyBNYWtlIGEgbXV0 YWJsZSBjb3B5IG9mIHRoZSBtdWx0aXBhcnRfa2V5IGZvciBzcGxpdHRpbmcKKyAgY2hhciBidWZb MjU2XTsKKyAgaWYgKGNvcHlzdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgbXVsdGlwYXJ0X2tleSkp IHsKKyAgICAvLyBpZiB0aGUgbXVsdGlwYXJ0X2tleSBpcyBsb25nZXIgdGhhbiBidWZmZXIsIGp1 c3QKKyAgICAvLyBzaWduYWwgYSBub3QtZm91bmQuCisgICAgcmV0dXJuIERBVFVNX1pFUk87Cisg IH0KKworICAvLyBHbyB0aHJvdWdoIHRoZSBtdWx0aXBhcnQgbmFtZSBwYXJ0IGJ5IHBhcnQuCisg IGNoYXIgKnAgPSBidWY7CisgIHRvbWxfZGF0dW1fdCBkYXR1bSA9IHRhYmxlOworICB3aGlsZSAo ZGF0dW0udHlwZSA9PSBUT01MX1RBQkxFKSB7CisgICAgY2hhciAqcSA9IHN0cmNocihwLCAnLicp OworICAgIGlmIChxKSB7CisgICAgICAvLyB0cmF2ZXJzZSB0byBuZXh0IGtleQorICAgICAgKnEg PSAwOworICAgICAgZGF0dW0gPSB0b21sX2dldChkYXR1bSwgcCk7CisgICAgICBwID0gcSArIDE7 CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBBdCBlbmQgb2YgbGFzdCBrZXlwYXJ0 LgorICAgIC8vIGxvb2sgdXAgcCBpbiB0aGUgZmluYWwgdGFibGUKKyAgICByZXR1cm4gdG9tbF9n ZXQoZGF0dW0sIHApOworICB9CisKKyAgcmV0dXJuIERBVFVNX1pFUk87Cit9CisKKy8qKgorICog IFJldHVybiB0aGUgZGVmYXVsdCBvcHRpb25zLgorICovCit0b21sX29wdGlvbl90IHRvbWxfZGVm YXVsdF9vcHRpb24odm9pZCkgeworICB0b21sX29wdGlvbl90IG9wdCA9IHswLCByZWFsbG9jLCBm cmVlfTsKKyAgcmV0dXJuIG9wdDsKK30KKworLyoqCisgKiAgT3ZlcnJpZGUgdGhlIGN1cnJlbnQg b3B0aW9ucy4KKyAqLwordm9pZCB0b21sX3NldF9vcHRpb24odG9tbF9vcHRpb25fdCBvcHQpIHsg dG9tbF9vcHRpb24gPSBvcHQ7IH0KKworLyoqCisgKiAgRnJlZSB0aGUgcmVzdWx0IHJldHVybmVk IGJ5IHRvbWxfcGFyc2UoKS4KKyAqLwordm9pZCB0b21sX2ZyZWUodG9tbF9yZXN1bHRfdCByZXN1 bHQpIHsKKyAgZGF0dW1fZnJlZSgmcmVzdWx0LnRvcHRhYik7CisgIHBvb2xfZGVzdHJveSgocG9v bF90ICopcmVzdWx0Ll9faW50ZXJuYWwpOworfQorCisvKioKKyAqICBQYXJzZSBhIHRvbWwgZG9j dW1lbnQuCisgKi8KK3RvbWxfcmVzdWx0X3QgdG9tbF9wYXJzZV9maWxlX2V4KGNvbnN0IGNoYXIg KmZuYW1lKSB7CisgIHRvbWxfcmVzdWx0X3QgcmVzdWx0ID0gezB9OworICBGSUxFICpmcCA9IGZv cGVuKGZuYW1lLCAiciIpOworICBpZiAoIWZwKSB7CisgICAgc25wcmludGYocmVzdWx0LmVycm1z Zywgc2l6ZW9mKHJlc3VsdC5lcnJtc2cpLCAiZm9wZW4gJXM6ICVzIiwgZm5hbWUsCisgICAgICAg ICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJlc3Vs dCA9IHRvbWxfcGFyc2VfZmlsZV9uYW1lZChmcCwgZm5hbWUpOworICBmY2xvc2UoZnApOworICBy ZXR1cm4gcmVzdWx0OworfQorCit0b21sX3Jlc3VsdF90IHRvbWxfcGFyc2VfZmlsZShGSUxFICpm cCkgeworICByZXR1cm4gdG9tbF9wYXJzZV9maWxlX25hbWVkKGZwLCBOVUxMKTsKK30KKworLyoq CisgKiAgUGFyc2UgYSB0b21sIGRvY3VtZW50IGZyb20gYSBmaWxlLCB0YWdnaW5nIGRhdHVtcyB3 aXRoIG5hbWUuCisgKi8KK3RvbWxfcmVzdWx0X3QgdG9tbF9wYXJzZV9maWxlX25hbWVkKEZJTEUg KmZwLCBjb25zdCBjaGFyICpuYW1lKSB7CisgIHRvbWxfcmVzdWx0X3QgcmVzdWx0ID0gezB9Owor ICBpZiAoIWZwKSB7CisgICAgc25wcmludGYocmVzdWx0LmVycm1zZywgc2l6ZW9mKHJlc3VsdC5l cnJtc2cpLCAiZnAgaXMgTlVMTCIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgY2hhciAq YnVmID0gMDsKKyAgaW50IHRvcCA9IDA7ICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgYnl0 ZXMgcmVhZCBpbnRvIGJ1ZltdCisgIGVudW0geyBDSFVOS1NaID0gOCAqIDEwMjQgfTsgLy8gYnl0 ZXMgdG8gcmVhZCBwZXIgaXRlcmF0aW9uCisKKyAgLy8gUmVhZCBmaWxlIGludG8gbWVtb3J5LiBj ZWxsX3JlYWxsb2MgaGFuZGxlcyBjYXBhY2l0eSBncm93dGgsIHNvIHdlIG9ubHkKKyAgLy8gbmVl ZCB0byBhc2sgZm9yIHJvb20gZm9yIG9uZSBtb3JlIGNodW5rIChwbHVzIGEgdGVybWluYXRpbmcg TlVMKSBlYWNoIHBhc3MuCisgIC8vIERyaXZlIHRoZSBsb29wIG9mZiBmcmVhZCdzIHJldHVybiB2 YWx1ZSByYXRoZXIgdGhhbiBmZW9mKCk6IGZlb2YoKSBvbmx5CisgIC8vIHJlcG9ydHMgdHJ1ZSBh ZnRlciBhIHJlYWQgaGFzIGFscmVhZHkgaGl0IEVPRiwgYW5kIHRoaXMgYWxzbyBndWFyYW50ZWVz IGJ1ZgorICAvLyBpcyBhbGxvY2F0ZWQgYXQgbGVhc3Qgb25jZSBiZWZvcmUgdGhlIE5VTCB0ZXJt aW5hdG9yIGJlbG93LgorICBmb3IgKDs7KSB7CisgICAgaWYgKHRvcCA+IElOVF9NQVggLSBDSFVO S1NaIC0gMSkgeworICAgICAgc25wcmludGYocmVzdWx0LmVycm1zZywgc2l6ZW9mKHJlc3VsdC5l cnJtc2cpLCAiZmlsZSBpcyB0b28gYmlnIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLy8g YWRkIDEgdG8gQ0hVTktTWiBzbyB3ZSBhbHdheXMgaGF2ZSByb29tIGZvciB0ZXJtaW5hdGluZyBO VUwuCisgICAgY2hhciAqdG1wID0gY2VsbF9yZWFsbG9jKGJ1ZiwgdG9wICsgQ0hVTktTWiArIDEp OworICAgIGlmICghdG1wKSB7CisgICAgICBzbnByaW50ZihyZXN1bHQuZXJybXNnLCBzaXplb2Yo cmVzdWx0LmVycm1zZyksICJvdXQgb2YgbWVtb3J5Iik7CisgICAgICBicmVhazsKKyAgICB9Cisg ICAgYnVmID0gdG1wOworCisgICAgZXJybm8gPSAwOworICAgIHNpemVfdCBuID0gZnJlYWQoYnVm ICsgdG9wLCAxLCBDSFVOS1NaLCBmcCk7CisgICAgdG9wICs9IG47CisgICAgaWYgKG4gPCBDSFVO S1NaKSB7IC8vIHNob3J0IHJlYWQgPT4gRU9GIG9yIGVycm9yCisgICAgICBpZiAoZmVycm9yKGZw KSkgeworICAgICAgICBzbnByaW50ZihyZXN1bHQuZXJybXNnLCBzaXplb2YocmVzdWx0LmVycm1z ZyksICIlcyIsCisgICAgICAgICAgICAgICAgIGVycm5vID8gc3RyZXJyb3IoZXJybm8pIDogIkVy cm9yIHJlYWRpbmcgZmlsZSIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChm ZW9mKGZwKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIHNtYWxsIHByb2Jh YmlsaXR5IG9mIHNob3J0IHJlYWQgZHVlIHRvIHNpZ25hbCwgZXRjLgorICAgIH0KKyAgfQorICAv LyBlcnJvcj8KKyAgaWYgKHJlc3VsdC5lcnJtc2dbMF0pIHsKKyAgICBjZWxsX2ZyZWUoYnVmKTsK KyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIGJ1Zlt0b3BdID0gMDsgLy8gTlVMIHRlcm1pbmF0 b3IKKworICByZXN1bHQgPSB0b21sX3BhcnNlX25hbWVkKGJ1ZiwgdG9wLCBuYW1lKTsKKyAgY2Vs bF9mcmVlKGJ1Zik7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zb3Vy Y2VfcmVjdXJzaXZlKHRvbWxfZGF0dW1fdCAqZGF0dW0sIGNvbnN0IGNoYXIgKnNvdXJjZSkgewor ICBkYXR1bS0+c291cmNlID0gc291cmNlOworICBzd2l0Y2ggKGRhdHVtLT50eXBlKSB7CisgIGNh c2UgVE9NTF9BUlJBWToKKyAgICBmb3IgKGludCBpID0gMCwgdG9wID0gZGF0dW0tPnUuYXJyLnNp emU7IGkgPCB0b3A7IGkrKykgeworICAgICAgc2V0X3NvdXJjZV9yZWN1cnNpdmUoJmRhdHVtLT51 LmFyci5lbGVtW2ldLCBzb3VyY2UpOworICAgIH0KKyAgICBicmVhazsKKyAgY2FzZSBUT01MX1RB QkxFOgorICAgIGZvciAoaW50IGkgPSAwLCB0b3AgPSBkYXR1bS0+dS50YWIuc2l6ZTsgaSA8IHRv cDsgaSsrKSB7CisgICAgICBzZXRfc291cmNlX3JlY3Vyc2l2ZSgmZGF0dW0tPnUudGFiLnZhbHVl W2ldLCBzb3VyY2UpOworICAgIH0KKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBicmVhazsK KyAgfQorfQorCisvKioKKyAqICBQYXJzZSBhIHRvbWwgZG9jdW1lbnQuCisgKi8KK3RvbWxfcmVz dWx0X3QgdG9tbF9wYXJzZShjb25zdCBjaGFyICpzcmMsIGludCBsZW4pIHsKKyAgcmV0dXJuIHRv bWxfcGFyc2VfbmFtZWQoc3JjLCBsZW4sIE5VTEwpOworfQorCit0b21sX3Jlc3VsdF90IHRvbWxf cGFyc2VfbmFtZWQoY29uc3QgY2hhciAqc3JjLCBpbnQgbGVuLCBjb25zdCBjaGFyICpuYW1lKSB7 CisgIHRvbWxfcmVzdWx0X3QgcmVzdWx0ID0gezB9OworICBwYXJzZXJfdCBwYXJzZXIgPSB7MH07 CisgIHBhcnNlcl90ICpwcCA9ICZwYXJzZXI7CisKKyAgLy8gQ2hlY2sgdGhhdCBzcmMgaXMgbm90 IE5VTEwuCisgIGlmICghc3JjKSB7CisgICAgc25wcmludGYocmVzdWx0LmVycm1zZywgc2l6ZW9m KHJlc3VsdC5lcnJtc2cpLCAic3JjIGlzIE5VTEwiKTsKKyAgICBnb3RvIGJhaWw7CisgIH0KKwor ICAvLyBDaGVjayB0aGF0IHNyYyBpcyBOVUwgdGVybWluYXRlZC4KKyAgaWYgKHNyY1tsZW5dKSB7 CisgICAgc25wcmludGYocmVzdWx0LmVycm1zZywgc2l6ZW9mKHJlc3VsdC5lcnJtc2cpLAorICAg ICAgICAgICAgICJzcmNbXSBtdXN0IGJlIE5VTCB0ZXJtaW5hdGVkIik7CisgICAgZ290byBiYWls OworICB9CisKKyAgLy8gSWYgdXNlciBpbnNpc3RzLCBjaGVjayB0aGF0IHNyY1tdIGlzIGEgdmFs aWQgdXRmOCBzdHJpbmcuCisgIGlmICh0b21sX29wdGlvbi5jaGVja191dGY4KSB7CisgICAgaW50 IGxpbmUgPSAxOyAvLyBrZWVwcyB0cmFjayBvZiBsaW5lIG51bWJlcgorICAgIGZvciAoaW50IGkg PSAwOyBpIDwgbGVuOykgeworICAgICAgdWludDMyX3QgY2g7CisgICAgICBpbnQgbiA9IHV0Zjhf dG9fdWNzKHNyYyArIGksIGxlbiAtIGksICZjaCk7CisgICAgICBpZiAobiA8IDApIHsKKyAgICAg ICAgc25wcmludGYocmVzdWx0LmVycm1zZywgc2l6ZW9mKHJlc3VsdC5lcnJtc2cpLAorICAgICAg ICAgICAgICAgICAiaW52YWxpZCBVVEY4IGNoYXIgb24gbGluZSAlZCIsIGxpbmUpOworICAgICAg ICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBpZiAoMHhEODAwIDw9IGNoICYmIGNoIDw9IDB4 REZGRikgeworICAgICAgICAvLyBleHBsaWNpdGx5IHByb2hpYml0IHN1cnJvZ2F0ZXMgKG5vbi1z Y2FsYXIgdW5pY29kZSBjb2RlIHBvaW50KQorICAgICAgICBzbnByaW50ZihyZXN1bHQuZXJybXNn LCBzaXplb2YocmVzdWx0LmVycm1zZyksCisgICAgICAgICAgICAgICAgICJpbnZhbGlkIFVURjgg Y2hhciBcXHUlMDR4IG9uIGxpbmUgJWQiLCBjaCwgbGluZSk7CisgICAgICAgIGdvdG8gYmFpbDsK KyAgICAgIH0KKyAgICAgIGxpbmUgKz0gKGNoID09ICdcbicgPyAxIDogMCk7CisgICAgICBpICs9 IG47CisgICAgfQorICB9CisKKyAgLy8gSW5pdGlhbGl6ZSBwYXJzZXIKKyAgcHAtPnRvcHRhYiA9 IG1rZGF0dW1fYXQoVE9NTF9UQUJMRSwgMSwgMSk7CisgIHBwLT5jdXJ0YWIgPSAmcHAtPnRvcHRh YjsKKyAgcHAtPmVidWYucHRyID0gcmVzdWx0LmVycm1zZzsgLy8gcGFyc2UgZXJyb3Igd2lsbCBi ZSBwcmludGVkIGludG8gcHAtPmVidWYKKyAgcHAtPmVidWYubGVuID0gc2l6ZW9mKHJlc3VsdC5l cnJtc2cpOworCisgIC8vIEFsbG9jIG1lbW9yeSBwb29sIChleHRyYSBieXRlcyBmb3IgTlVMIHRl cm0sIHNhZmV0eSwgYW5kIHRoZSBzb3VyY2UgbmFtZSkKKyAgaW50IG5hbWVsZW4gPSBuYW1lID8g KGludClzdHJsZW4obmFtZSkgKyAxIDogMDsKKyAgcHAtPnBvb2wgPSBwb29sX2NyZWF0ZShsZW4g KyAxMCArIG5hbWVsZW4pOworICBpZiAoIXBwLT5wb29sKSB7CisgICAgc25wcmludGYocmVzdWx0 LmVycm1zZywgc2l6ZW9mKHJlc3VsdC5lcnJtc2cpLCAib3V0IG9mIG1lbW9yeSIpOworICAgIGdv dG8gYmFpbDsKKyAgfQorICBpZiAobmFtZSkgeworICAgIGNoYXIgKnAgPSBwb29sX2FsbG9jKHBw LT5wb29sLCBuYW1lbGVuKTsKKyAgICBpZiAoIXApIHsKKyAgICAgIHNucHJpbnRmKHJlc3VsdC5l cnJtc2csIHNpemVvZihyZXN1bHQuZXJybXNnKSwgIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgIGdv dG8gYmFpbDsKKyAgICB9CisgICAgbWVtY3B5KHAsIG5hbWUsIG5hbWVsZW4pOworICAgIHBwLT5z cmNuYW1lID0gcDsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgc2Nhbm5lci4gU2NhbiBlcnJvciB3 aWxsIGJlIHByaW50ZWQgaW50byBwcC0+ZWJ1Zi4KKyAgc2Nhbl9pbml0KCZwcC0+c2Nhbm5lciwg c3JjLCBsZW4sIHBwLT5lYnVmLnB0ciwgcHAtPmVidWYubGVuKTsKKworICAvLyBLZWVwIHBhcnNp bmcgdW50aWwgRklOCisgIGZvciAoOzspIHsKKyAgICB0b2tlbl90IHRvazsKKyAgICBpZiAoc2Nh bl9rZXkoJnBwLT5zY2FubmVyLCAmdG9rKSkgeworICAgICAgZ290byBiYWlsOworICAgIH0KKyAg ICAvLyBicmVhayBvbiBGSU4KKyAgICBpZiAodG9rLnRva3R5cCA9PSBUT0tfRklOKSB7CisgICAg ICBicmVhazsKKyAgICB9CisgICAgc3dpdGNoICh0b2sudG9rdHlwKSB7CisgICAgY2FzZSBUT0tf RU5ETDogLy8gc2tpcCBibGFuayBsaW5lcworICAgICAgY29udGludWU7CisgICAgY2FzZSBUT0tf TEJSQUNLOgorICAgICAgaWYgKHBhcnNlX3N0ZF90YWJsZV9leHByKHBwLCB0b2spKSB7CisgICAg ICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVE9LX0xMQlJB Q0s6CisgICAgICBpZiAocGFyc2VfYXJyYXlfdGFibGVfZXhwcihwcCwgdG9rKSkgeworICAgICAg ICBnb3RvIGJhaWw7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAg Ly8gbm9uLWJsYW5rIGxpbmU6IHBhcnNlIGFuIGV4cHJlc3Npb24KKyAgICAgIGlmIChwYXJzZV9r ZXl2YWx1ZV9leHByKHBwLCB0b2spKSB7CisgICAgICAgIGdvdG8gYmFpbDsKKyAgICAgIH0KKyAg ICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBlYWNoIGV4cHJlc3Npb24gbXVzdCBiZSBmb2xsb3dl ZCBieSBuZXdsaW5lCisgICAgaWYgKHNjYW5fa2V5KCZwcC0+c2Nhbm5lciwgJnRvaykpIHsKKyAg ICAgIGdvdG8gYmFpbDsKKyAgICB9CisgICAgaWYgKHRvay50b2t0eXAgPT0gVE9LX0ZJTiB8fCB0 b2sudG9rdHlwID09IFRPS19FTkRMKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgU0VU RVJST1IocHAtPmVidWYsIHRvay5saW5lbm8sICJFTkRMIGV4cGVjdGVkIik7CisgICAgZ290byBi YWlsOworICB9CisKKyAgLy8gcmV0dXJuIHJlc3VsdAorICByZXN1bHQub2sgPSB0cnVlOworICBz ZXRfc291cmNlX3JlY3Vyc2l2ZSgmcHAtPnRvcHRhYiwgcHAtPnNyY25hbWUpOworICByZXN1bHQu dG9wdGFiID0gcHAtPnRvcHRhYjsKKyAgcmVzdWx0Ll9faW50ZXJuYWwgPSAodm9pZCAqKXBwLT5w b29sOworICByZXR1cm4gcmVzdWx0OworCitiYWlsOgorICAvLyByZXR1cm4gZXJyb3IKKyAgZGF0 dW1fZnJlZSgmcHAtPnRvcHRhYik7CisgIHBvb2xfZGVzdHJveShwcC0+cG9vbCk7CisgIHJlc3Vs dC5vayA9IGZhbHNlOworICBpZiAocmVzdWx0LmVycm1zZ1swXSA9PSAnXDAnKSB7CisgICAgYXNz ZXJ0KDApOworICAgIHNucHJpbnRmKHJlc3VsdC5lcnJtc2csIHNpemVvZihyZXN1bHQuZXJybXNn KSwgIkVycm9yIG5lYXIgbGluZSAlZFxuIiwKKyAgICAgICAgICAgICBwcC0+c2Nhbm5lci5saW5l bm8pOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENvbnZlcnQgYSAoTElUU1RSSU5H LCBMSVQsIE1MTElUU1RSSU5HLCBNTFNUUklORywgb3IgU1RSSU5HKSB0b2tlbiB0byBhCisvLyBk YXR1bS4KK3N0YXRpYyBpbnQgdG9rZW5fdG9fc3RyaW5nKHBhcnNlcl90ICpwcCwgdG9rZW5fdCB0 b2ssIHRvbWxfZGF0dW1fdCAqcmV0KSB7CisgICpyZXQgPSBta2RhdHVtX2F0KFRPTUxfU1RSSU5H LCB0b2subGluZW5vLCB0b2suY29sbm8pOworICBzcGFuX3Qgc3BhbjsKKyAgRE8ocGFyc2Vfbm9y bShwcCwgdG9rLCAmc3BhbikpOworICByZXQtPnUuc3RyLnB0ciA9IChjaGFyICopc3Bhbi5wdHI7 CisgIHJldC0+dS5zdHIubGVuID0gc3Bhbi5sZW47CisgIHJldHVybiAwOworfQorCisvLyBDb252 ZXJ0IGEgVElNRS9EQVRFL0RBVEVUSU1FL0RBVEVUSU1FVFogdG8gYSBkYXR1bQorc3RhdGljIGlu dCB0b2tlbl90b190aW1lc3RhbXAocGFyc2VyX3QgKnBwLCB0b2tlbl90IHRvaywgdG9tbF9kYXR1 bV90ICpyZXQpIHsKKyAgKHZvaWQpcHA7CisgIHN0YXRpYyBjb25zdCB0b21sX3R5cGVfdCBtYXBb XSA9IHtbVE9LX1RJTUVdID0gVE9NTF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgW1RPS19EQVRFXSA9IFRPTUxfREFURSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFtUT0tfREFURVRJTUVdID0gVE9NTF9EQVRFVElNRSwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFtUT0tfREFURVRJTUVUWl0gPSBUT01MX0RBVEVUSU1F VFp9OworICBzd2l0Y2ggKHRvay50b2t0eXApIHsKKyAgY2FzZSBUT0tfVElNRToKKyAgY2FzZSBU T0tfREFURToKKyAgY2FzZSBUT0tfREFURVRJTUU6CisgIGNhc2UgVE9LX0RBVEVUSU1FVFo6Cisg ICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYXNzZXJ0KDAgJiYgInVuZXhwZWN0ZWQgdG9rZW4g dHlwZSIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICpyZXQgPSBta2RhdHVtX2F0KG1hcFt0 b2sudG9rdHlwXSwgdG9rLmxpbmVubywgdG9rLmNvbG5vKTsKKyAgcmV0LT51LnRzLnllYXIgPSB0 b2sudS50c3ZhbC55ZWFyOworICByZXQtPnUudHMubW9udGggPSB0b2sudS50c3ZhbC5tb250aDsK KyAgcmV0LT51LnRzLmRheSA9IHRvay51LnRzdmFsLmRheTsKKyAgcmV0LT51LnRzLmhvdXIgPSB0 b2sudS50c3ZhbC5ob3VyOworICByZXQtPnUudHMubWludXRlID0gdG9rLnUudHN2YWwubWludXRl OworICByZXQtPnUudHMuc2Vjb25kID0gdG9rLnUudHN2YWwuc2VjOworICByZXQtPnUudHMudXNl YyA9IHRvay51LnRzdmFsLnVzZWM7CisgIHJldC0+dS50cy50eiA9IHRvay51LnRzdmFsLnR6Owor ICByZXR1cm4gMDsKK30KKworLy8gQ29udmVydCBhbiBpbnQ2NCB0b2tlbiB0byBhIGRhdHVtLgor c3RhdGljIGludCB0b2tlbl90b19pbnQ2NChwYXJzZXJfdCAqcHAsIHRva2VuX3QgdG9rLCB0b21s X2RhdHVtX3QgKnJldCkgeworICAodm9pZClwcDsKKyAgYXNzZXJ0KHRvay50b2t0eXAgPT0gVE9L X0lOVEVHRVIpOworICAqcmV0ID0gbWtkYXR1bV9hdChUT01MX0lOVDY0LCB0b2subGluZW5vLCB0 b2suY29sbm8pOworICByZXQtPnUuaW50NjQgPSB0b2sudS5pbnQ2NDsKKyAgcmV0dXJuIDA7Cit9 CisKKy8vIENvbnZlcnQgYSBmcDY0IHRva2VuIHRvIGEgZGF0dW0uCitzdGF0aWMgaW50IHRva2Vu X3RvX2ZwNjQocGFyc2VyX3QgKnBwLCB0b2tlbl90IHRvaywgdG9tbF9kYXR1bV90ICpyZXQpIHsK KyAgKHZvaWQpcHA7CisgIGFzc2VydCh0b2sudG9rdHlwID09IFRPS19GTE9BVCk7CisgICpyZXQg PSBta2RhdHVtX2F0KFRPTUxfRlA2NCwgdG9rLmxpbmVubywgdG9rLmNvbG5vKTsKKyAgcmV0LT51 LmZwNjQgPSB0b2sudS5mcDY0OworICByZXR1cm4gMDsKK30KKworLy8gQ29udmVydCBhIGJvb2xl YW4gdG9rZW4gdG8gYSBkYXR1bS4KK3N0YXRpYyBpbnQgdG9rZW5fdG9fYm9vbGVhbihwYXJzZXJf dCAqcHAsIHRva2VuX3QgdG9rLCB0b21sX2RhdHVtX3QgKnJldCkgeworICAodm9pZClwcDsKKyAg YXNzZXJ0KHRvay50b2t0eXAgPT0gVE9LX0JPT0wpOworICAqcmV0ID0gbWtkYXR1bV9hdChUT01M X0JPT0xFQU4sIHRvay5saW5lbm8sIHRvay5jb2xubyk7CisgIHJldC0+dS5ib29sZWFuID0gdG9r LnUuYjE7CisgIHJldHVybiAwOworfQorCisvLyBQYXJzZSBhIG11bHRpcGFydCBrZXkuIFJldHVy biAwIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZS4KK3N0YXRpYyBpbnQgcGFyc2Vfa2V5KHBhcnNl cl90ICpwcCwgdG9rZW5fdCB0b2ssIGtleXBhcnRfdCAqcmV0X2tleXBhcnQpIHsKKyAgcmV0X2tl eXBhcnQtPm5zcGFuID0gMDsKKyAgLy8ga2V5ID0gc2ltcGxlLWtleSB8IGRvdHRlZF9rZXkKKyAg Ly8gc2ltcGxlLWtleSA9IFNUUklORyB8IExJVFNUUklORyB8IExJVAorICAvLyBkb3R0ZWQta2V5 ID0gc2ltcGxlLWtleSAoRE9UIHNpbXBsZS1rZXkpKworICBpZiAodG9rLnRva3R5cCAhPSBUT0tf U1RSSU5HICYmIHRvay50b2t0eXAgIT0gVE9LX0xJVFNUUklORyAmJgorICAgICAgdG9rLnRva3R5 cCAhPSBUT0tfTElUKSB7CisgICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCB0b2subGluZW5v LCAibWlzc2luZyBrZXkiKTsKKyAgfQorCisgIGludCBuID0gMDsKKyAgc3Bhbl90ICprcHNwYW4g PSByZXRfa2V5cGFydC0+c3BhbjsKKworICAvLyBOb3JtYWxpemUgdGhlIGZpcnN0IGtleXBhcnQK KyAgaWYgKHBhcnNlX25vcm0ocHAsIHRvaywgJmtwc3BhbltuXSkpIHsKKyAgICByZXR1cm4gU0VU RVJST1IocHAtPmVidWYsIHRvay5saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICJ1bmFibGUg dG8gbm9ybWFsaXplIHN0cmluZzsgcHJvYmFibHkgYSB1bmljb2RlIGlzc3VlIik7CisgIH0KKyAg bisrOworCisgIC8vIFNjYW4gYW5kIG5vcm1hbGl6ZSB0aGUgc2Vjb25kIHRvIGxhc3Qga2V5cGFy dAorICB3aGlsZSAoMSkgeworICAgIHNjYW5uZXJfc3RhdGVfdCBtYXJrID0gc2Nhbl9tYXJrKCZw cC0+c2Nhbm5lcik7CisKKyAgICAvLyBFYXQgdGhlIGRvdCBpZiBpdCBpcyB0aGVyZQorICAgIERP KHNjYW5fa2V5KCZwcC0+c2Nhbm5lciwgJnRvaykpOworCisgICAgLy8gSWYgbm90IGEgZG90LCB3 ZSBhcmUgZG9uZSB3aXRoIGtleXBhcnRzLgorICAgIGlmICh0b2sudG9rdHlwICE9IFRPS19ET1Qp IHsKKyAgICAgIHNjYW5fcmVzdG9yZSgmcHAtPnNjYW5uZXIsIG1hcmspOworICAgICAgYnJlYWs7 CisgICAgfQorCisgICAgLy8gU2NhbiB0aGUgbi10aCBrZXkKKyAgICBETyhzY2FuX2tleSgmcHAt PnNjYW5uZXIsICZ0b2spKTsKKworICAgIGlmICh0b2sudG9rdHlwICE9IFRPS19TVFJJTkcgJiYg dG9rLnRva3R5cCAhPSBUT0tfTElUU1RSSU5HICYmCisgICAgICAgIHRvay50b2t0eXAgIT0gVE9L X0xJVCkgeworICAgICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCB0b2subGluZW5vLCAiZXhw ZWN0cyBhIHN0cmluZyBpbiBkb3R0ZWQta2V5Iik7CisgICAgfQorCisgICAgaWYgKG4gPj0gS0VZ UEFSVE1BWCkgeworICAgICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCB0b2subGluZW5vLCAi dG9vIG1hbnkga2V5IHBhcnRzIik7CisgICAgfQorCisgICAgLy8gTm9ybWFsaXplIHRoZSBuLXRo IGtleS4KKyAgICBETyhwYXJzZV9ub3JtKHBwLCB0b2ssICZrcHNwYW5bbl0pKTsKKyAgICBuKys7 CisgIH0KKworICAvLyBUaGlzIGtleSBoYXMgbiBwYXJ0cy4KKyAgcmV0X2tleXBhcnQtPm5zcGFu ID0gbjsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFN0YXJ0aW5nIGF0IHRvcHRhYiwgZGVzY2VuZCBm b2xsb3dpbmcga2V5cGFydFtdLiBJZiBhIGtleSBkb2VzIG5vdAorLy8gZXhpc3QgaW4gdGhlIGN1 cnJlbnQgdGFibGUsIGNyZWF0ZSBhIG5ldyB0YWJsZSBlbnRyeSBmb3IgdGhlCisvLyBrZXkuIFJl dHVybnMgdGhlIGZpbmFsIHRhYmxlIHJlcHJlc2VudGVkIGJ5IHRoZSBrZXkuCitzdGF0aWMgdG9t bF9kYXR1bV90ICpkZXNjZW5kX2tleXBhcnQocGFyc2VyX3QgKnBwLCBpbnQgbGluZW5vLCBpbnQg Y29sbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9tbF9kYXR1bV90 ICp0b3B0YWIsIGtleXBhcnRfdCAqa2V5cGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBib29sIHN0ZHRhYmV4cHIpIHsKKyAgdG9tbF9kYXR1bV90ICp0YWIgPSB0b3B0 YWI7IC8vIGN1cnJlbnQgdGFiCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlwYXJ0LT5uc3Bh bjsgaSsrKSB7CisgICAgY29uc3QgY2hhciAqcmVhc29uOworICAgIC8vIEZpbmQgdGhlIGktdGgg a2V5cGFydAorICAgIGludCBqID0gdGFiX2ZpbmQodGFiLCBrZXlwYXJ0LT5zcGFuW2ldKTsKKyAg ICAvLyBOb3QgZm91bmQ6IGFkZCBhIG5ldyAoa2V5LCB0YWIpIHBhaXIuCisgICAgaWYgKGogPCAw KSB7CisgICAgICB0b21sX2RhdHVtX3QgbmV3dGFiID0gbWtkYXR1bV9hdChUT01MX1RBQkxFLCBs aW5lbm8sIGNvbG5vKTsKKyAgICAgIG5ld3RhYi5mbGFnIHw9IHN0ZHRhYmV4cHIgPyBGTEFHX1NU REVYUFIgOiAwOworICAgICAgaWYgKHRhYl9hZGQodGFiLCBrZXlwYXJ0LT5zcGFuW2ldLCBuZXd0 YWIsICZyZWFzb24pKSB7CisgICAgICAgIFNFVEVSUk9SKHBwLT5lYnVmLCBsaW5lbm8sICIlcyIs IHJlYXNvbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorICAgICAgdGFiID0gJnRh Yi0+dS50YWIudmFsdWVbdGFiLT51LnRhYi5zaXplIC0gMV07IC8vIGRlc2NlbmQKKyAgICAgIGNv bnRpbnVlOworICAgIH0KKworICAgIC8vIEZvdW5kOiBleHRyYWN0IHRoZSB2YWx1ZSBvZiB0aGUg a2V5LgorICAgIHRvbWxfZGF0dW1fdCAqdmFsdWUgPSAmdGFiLT51LnRhYi52YWx1ZVtqXTsKKwor ICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBhIHRhYmxlLCBkZXNjZW5kLgorICAgIGlmICh2YWx1ZS0+ dHlwZSA9PSBUT01MX1RBQkxFKSB7CisgICAgICB0YWIgPSB2YWx1ZTsgLy8gZGVzY2VuZAorICAg ICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHZhbHVlIGlzIGFuIGFycmF5OiBs b2NhdGUgdGhlIGxhc3QgZW50cnkgYW5kIGRlc2NlbmQuCisgICAgaWYgKHZhbHVlLT50eXBlID09 IFRPTUxfQVJSQVkpIHsKKyAgICAgIC8vIElmIGVtcHR5OiBlcnJvci4KKyAgICAgIGlmICh2YWx1 ZS0+dS5hcnIuc2l6ZSA8PSAwKSB7CisgICAgICAgIFNFVEVSUk9SKHBwLT5lYnVmLCBsaW5lbm8s ICJhcnJheSAlcyBoYXMgbm8gZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICBrZXlwYXJ0LT5z cGFuW2ldLnB0cik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICAvLyBF eHRyYWN0IHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGFycmF5LgorICAgICAgdmFsdWUgPSAmdmFs dWUtPnUuYXJyLmVsZW1bdmFsdWUtPnUuYXJyLnNpemUgLSAxXTsKKworICAgICAgLy8gSXQgbXVz dCBiZSBhIHRhYmxlIQorICAgICAgaWYgKHZhbHVlLT50eXBlICE9IFRPTUxfVEFCTEUpIHsKKyAg ICAgICAgU0VURVJST1IocHAtPmVidWYsIGxpbmVubywgImFycmF5ICVzIG11c3QgYmUgYXJyYXkg b2YgdGFibGVzIiwKKyAgICAgICAgICAgICAgICAga2V5cGFydC0+c3BhbltpXS5wdHIpOworICAg ICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKyAgICAgIHRhYiA9IHZhbHVlOyAvLyBkZXNjZW5k CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBrZXkgbm90IGZvdW5kCisgICAgU0VU RVJST1IocHAtPmVidWYsIGxpbmVubywgImNhbm5vdCBsb2NhdGUgdGFibGUgYXQga2V5ICVzIiwK KyAgICAgICAgICAgICBrZXlwYXJ0LT5zcGFuW2ldLnB0cik7CisgICAgcmV0dXJuIE5VTEw7Cisg IH0KKworICAvLyBSZXR1cm4gdGhlIHRhYmxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleXBhcnRb XS4KKyAgcmV0dXJuIHRhYjsKK30KKworLy8gUmVjdXJzaXZlbHkgc2V0IGZsYWdzIG9uIGRhdHVt CitzdGF0aWMgdm9pZCBzZXRfZmxhZ19yZWN1cnNpdmUodG9tbF9kYXR1bV90ICpkYXR1bSwgdWlu dDMyX3QgZmxhZykgeworICBkYXR1bS0+ZmxhZyB8PSBmbGFnOworICBzd2l0Y2ggKGRhdHVtLT50 eXBlKSB7CisgIGNhc2UgVE9NTF9BUlJBWToKKyAgICBmb3IgKGludCBpID0gMCwgdG9wID0gZGF0 dW0tPnUuYXJyLnNpemU7IGkgPCB0b3A7IGkrKykgeworICAgICAgc2V0X2ZsYWdfcmVjdXJzaXZl KCZkYXR1bS0+dS5hcnIuZWxlbVtpXSwgZmxhZyk7CisgICAgfQorICAgIGJyZWFrOworICBjYXNl IFRPTUxfVEFCTEU6CisgICAgZm9yIChpbnQgaSA9IDAsIHRvcCA9IGRhdHVtLT51LnRhYi5zaXpl OyBpIDwgdG9wOyBpKyspIHsKKyAgICAgIHNldF9mbGFnX3JlY3Vyc2l2ZSgmZGF0dW0tPnUudGFi LnZhbHVlW2ldLCBmbGFnKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgYnJl YWs7CisgIH0KK30KKworLy8gUGFyc2UgYW4gaW5saW5lIGFycmF5Lgorc3RhdGljIGludCBwYXJz ZV9pbmxpbmVfYXJyYXkocGFyc2VyX3QgKnBwLCB0b2tlbl90IHRvaywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHRvbWxfZGF0dW1fdCAqcmV0X2RhdHVtKSB7CisgIGFzc2VydCh0b2su dG9rdHlwID09IFRPS19MQlJBQ0spOworICAqcmV0X2RhdHVtID0gbWtkYXR1bV9hdChUT01MX0FS UkFZLCB0b2subGluZW5vLCB0b2suY29sbm8pOworICBpbnQgbmVlZF9jb21tYSA9IDA7CisKKyAg Ly8gbG9vcCB1bnRpbCBSQlJBQ0sKKyAgZm9yICg7OykgeworICAgIC8vIHNraXAgRU5ETAorICAg IGRvIHsKKyAgICAgIERPKHNjYW5fdmFsdWUoJnBwLT5zY2FubmVyLCAmdG9rKSk7CisgICAgfSB3 aGlsZSAodG9rLnRva3R5cCA9PSBUT0tfRU5ETCk7CisKKyAgICAvLyBJZiBnb3QgYW4gUkJSQUNL OiBkb25lIQorICAgIGlmICh0b2sudG9rdHlwID09IFRPS19SQlJBQ0spIHsKKyAgICAgIGJyZWFr OworICAgIH0KKworICAgIC8vIElmIGdvdCBhIENPTU1BOiBjaGVjayBpZiBpdCBpcyBleHBlY3Rl ZC4KKyAgICBpZiAodG9rLnRva3R5cCA9PSBUT0tfQ09NTUEpIHsKKyAgICAgIGlmIChuZWVkX2Nv bW1hKSB7CisgICAgICAgIG5lZWRfY29tbWEgPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAg IH0KKyAgICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywKKyAgICAgICAg ICAgICAgICAgICAgICAic3ludGF4IGVycm9yIHdoaWxlIHBhcnNpbmcgYXJyYXk6IHVuZXhwZWN0 ZWQgY29tbWEiKTsKKyAgICB9CisKKyAgICAvLyBOb3QgYSBjb21tYSwgYnV0IG5lZWQgYSBjb21t YTogZXJyb3IhCisgICAgaWYgKG5lZWRfY29tbWEpIHsKKyAgICAgIHJldHVybiBTRVRFUlJPUihw cC0+ZWJ1ZiwgdG9rLmxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAic3ludGF4IGVycm9y IHdoaWxlIHBhcnNpbmcgYXJyYXk6IG1pc3NpbmcgY29tbWEiKTsKKyAgICB9CisKKyAgICAvLyBU aGlzIGlzIGEgdmFsaWQgdmFsdWUhIE9idGFpbiB0aGUgdmFsdWUuCisgICAgdG9tbF9kYXR1bV90 IHZhbHVlID0gREFUVU1fWkVSTzsKKyAgICBpZiAocGFyc2VfdmFsKHBwLCB0b2ssICZ2YWx1ZSkp IHsKKyAgICAgIGRhdHVtX2ZyZWUoJnZhbHVlKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisK KyAgICAvLyBBZGQgdGhlIHZhbHVlIHRvIHRoZSBhcnJheS4KKyAgICBjb25zdCBjaGFyICpyZWFz b247CisgICAgdG9tbF9kYXR1bV90ICpwZWxlbSA9IGFycl9lbXBsYWNlKHJldF9kYXR1bSwgJnJl YXNvbik7CisgICAgaWYgKCFwZWxlbSkgeworICAgICAgZGF0dW1fZnJlZSgmdmFsdWUpOworICAg ICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCB0b2subGluZW5vLCAid2hpbGUgcGFyc2luZyBh cnJheTogJXMiLCByZWFzb24pOworICAgIH0KKyAgICAqcGVsZW0gPSB2YWx1ZTsKKworICAgIC8v IE5lZWQgY29tbWEgYmVmb3JlIHRoZSBuZXh0IHZhbHVlLgorICAgIG5lZWRfY29tbWEgPSAxOwor ICB9CisKKyAgLy8gU2V0IHRoZSBJTkxJTkUgZmxhZyBmb3IgYWxsIHRoaW5ncyBpbiB0aGlzIGFy cmF5LgorICBzZXRfZmxhZ19yZWN1cnNpdmUocmV0X2RhdHVtLCBGTEFHX0lOTElORUQpOworICBy ZXR1cm4gMDsKK30KKworLy8gUGFyc2UgYW4gaW5saW5lIHRhYmxlLgorc3RhdGljIGludCBwYXJz ZV9pbmxpbmVfdGFibGUocGFyc2VyX3QgKnBwLCB0b2tlbl90IHRvaywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHRvbWxfZGF0dW1fdCAqcmV0X2RhdHVtKSB7CisgIGFzc2VydCh0b2su dG9rdHlwID09IFRPS19MQlJBQ0UpOworICAqcmV0X2RhdHVtID0gbWtkYXR1bV9hdChUT01MX1RB QkxFLCB0b2subGluZW5vLCB0b2suY29sbm8pOworICBib29sIG5lZWRfY29tbWEgPSAwOworICBi b29sIHdhc19jb21tYSA9IDA7CisKKyAgLy8gbG9vcCB1bnRpbCBSQlJBQ0UKKyAgZm9yICg7Oykg eworICAgIERPKHNjYW5fa2V5KCZwcC0+c2Nhbm5lciwgJnRvaykpOworCisgICAgLy8gR290IGFu IFJCUkFDRTogZG9uZSEKKyAgICBpZiAodG9rLnRva3R5cCA9PSBUT0tfUkJSQUNFKSB7CisgICAg ICBpZiAod2FzX2NvbW1hKSB7CisgICAgICAgIC8qCisgICAgICAgIHJldHVybiBTRVRFUlJPUihw cC0+ZWJ1ZiwgdG9rLmxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHRyYSBjb21t YSBiZWZvcmUgY2xvc2luZyBicmFjZSIpOworICAgICAgICAqLworICAgICAgICAvLyBleHRyYSBj b21tYSBiZWZvcmUgUkJSQUNFIGlzIGFsbG93ZWQgZm9yIHYxLjEKKyAgICAgICAgKHZvaWQpMDsK KyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEdvdCBhIGNvbW1hOiBjaGVj ayBpZiBpdCBpcyBleHBlY3RlZC4KKyAgICBpZiAodG9rLnRva3R5cCA9PSBUT0tfQ09NTUEpIHsK KyAgICAgIGlmIChuZWVkX2NvbW1hKSB7CisgICAgICAgIG5lZWRfY29tbWEgPSAwLCB3YXNfY29t bWEgPSAxOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTRVRFUlJP UihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywgInVuZXhwZWN0ZWQgY29tbWEiKTsKKyAgICB9CisKKyAg ICAvLyBOZXdsaW5lIG5vdCBhbGxvd2VkIGluIGlubGluZSB0YWJsZS4KKyAgICAvLyBuZXdsaW5l IGlzIGFsbG93ZWQgaW4gdjEuMQorICAgIGlmICh0b2sudG9rdHlwID09IFRPS19FTkRMKSB7Cisg ICAgICAvLyByZXR1cm4gU0VURVJST1IocHAtPmVidWYsIHRvay5saW5lbm8sICJ1bmV4cGVjdGVk IG5ld2xpbmUiKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIE5vdCBhIGNvbW1h LCBidXQgbmVlZCBhIGNvbW1hOiBlcnJvciEKKyAgICBpZiAobmVlZF9jb21tYSkgeworICAgICAg cmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCB0b2subGluZW5vLCAibWlzc2luZyBjb21tYSIpOwor ICAgIH0KKworICAgIC8vIEdldCB0aGUga2V5cGFydHMKKyAgICBrZXlwYXJ0X3Qga2V5cGFydCA9 IHswfTsKKyAgICBpbnQga2V5bGluZW5vID0gdG9rLmxpbmVubzsKKyAgICBpbnQga2V5Y29sbm8g PSB0b2suY29sbm87CisgICAgRE8ocGFyc2Vfa2V5KHBwLCB0b2ssICZrZXlwYXJ0KSk7CisKKyAg ICAvLyBEZXNjZW5kIHRvIG9uZSBrZXlwYXJ0IGJlZm9yZSBsYXN0CisgICAgYXNzZXJ0KGtleXBh cnQubnNwYW4gPiAwKTsKKyAgICBzcGFuX3QgbGFzdGtleXBhcnQgPSBrZXlwYXJ0LnNwYW5bLS1r ZXlwYXJ0Lm5zcGFuXTsKKyAgICB0b21sX2RhdHVtX3QgKnRhYiA9CisgICAgICAgIGRlc2NlbmRf a2V5cGFydChwcCwga2V5bGluZW5vLCBrZXljb2xubywgcmV0X2RhdHVtLCAma2V5cGFydCwgZmFs c2UpOworICAgIGlmICghdGFiKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8g SWYgdGFiIGlzIGEgcHJldmlvdXNseSBkZWNsYXJlZCBpbmxpbmUgdGFibGU6IGVycm9yLgorICAg IGlmICh0YWItPmZsYWcgJiBGTEFHX0lOTElORUQpIHsKKyAgICAgIHJldHVybiBTRVRFUlJPUihw cC0+ZWJ1ZiwgdG9rLmxpbmVubywgImlubGluZSB0YWJsZSBjYW5ub3QgYmUgZXh0ZW5kZWQiKTsK KyAgICB9CisKKyAgICAvLyBXZSBhcmUgZXhwbGljaXRseSBkZWZpbmluZyBpdCBub3cuCisgICAg dGFiLT5mbGFnIHw9IEZMQUdfRVhQTElDSVQ7CisKKyAgICAvLyBtYXRjaCBFUVVBTAorICAgIERP KHNjYW5fdmFsdWUoJnBwLT5zY2FubmVyLCAmdG9rKSk7CisKKyAgICBpZiAodG9rLnRva3R5cCAh PSBUT0tfRVFVQUwpIHsKKyAgICAgIGlmICh0b2sudG9rdHlwID09IFRPS19FTkRMKSB7CisgICAg ICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywgInVuZXhwZWN0ZWQgbmV3 bGluZSIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVm LCB0b2subGluZW5vLCAibWlzc2luZyAnPSciKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBv YnRhaW4gdGhlIHZhbHVlCisgICAgRE8oc2Nhbl92YWx1ZSgmcHAtPnNjYW5uZXIsICZ0b2spKTsK KyAgICB0b21sX2RhdHVtX3QgdmFsdWUgPSBEQVRVTV9aRVJPOworICAgIGlmIChwYXJzZV92YWwo cHAsIHRvaywgJnZhbHVlKSkgeworICAgICAgZGF0dW1fZnJlZSgmdmFsdWUpOworICAgICAgcmV0 dXJuIC0xOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgdmFsdWUgdG8gdGFiLgorICAgIGNvbnN0 IGNoYXIgKnJlYXNvbjsKKyAgICBpZiAodGFiX2FkZCh0YWIsIGxhc3RrZXlwYXJ0LCB2YWx1ZSwg JnJlYXNvbikpIHsKKyAgICAgIGRhdHVtX2ZyZWUoJnZhbHVlKTsKKyAgICAgIHJldHVybiBTRVRF UlJPUihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywgIiVzIiwgcmVhc29uKTsKKyAgICB9CisgICAgbmVl ZF9jb21tYSA9IDEsIHdhc19jb21tYSA9IDA7CisgIH0KKworICBzZXRfZmxhZ19yZWN1cnNpdmUo cmV0X2RhdHVtLCBGTEFHX0lOTElORUQpOworICByZXR1cm4gMDsKK30KKworLy8gUGFyc2UgYSB2 YWx1ZS4KK3N0YXRpYyBpbnQgcGFyc2VfdmFsKHBhcnNlcl90ICpwcCwgdG9rZW5fdCB0b2ssIHRv bWxfZGF0dW1fdCAqcmV0KSB7CisgICpyZXQgPSBEQVRVTV9aRVJPOyAvLyBpbml0aWFsaXplCisK KyAgLy8gdmFsID0gc3RyaW5nIC8gYm9vbGVhbiAvIGFycmF5IC8gaW5saW5lLXRhYmxlIC8gZGF0 ZS10aW1lIC8gZmxvYXQgLyBpbnRlZ2VyCisgIHN3aXRjaCAodG9rLnRva3R5cCkgeworICBjYXNl IFRPS19TVFJJTkc6CisgIGNhc2UgVE9LX01MU1RSSU5HOgorICBjYXNlIFRPS19MSVRTVFJJTkc6 CisgIGNhc2UgVE9LX01MTElUU1RSSU5HOgorICAgIHJldHVybiB0b2tlbl90b19zdHJpbmcocHAs IHRvaywgcmV0KTsKKyAgY2FzZSBUT0tfVElNRToKKyAgY2FzZSBUT0tfREFURToKKyAgY2FzZSBU T0tfREFURVRJTUU6CisgIGNhc2UgVE9LX0RBVEVUSU1FVFo6CisgICAgcmV0dXJuIHRva2VuX3Rv X3RpbWVzdGFtcChwcCwgdG9rLCByZXQpOworICBjYXNlIFRPS19JTlRFR0VSOgorICAgIHJldHVy biB0b2tlbl90b19pbnQ2NChwcCwgdG9rLCByZXQpOworICBjYXNlIFRPS19GTE9BVDoKKyAgICBy ZXR1cm4gdG9rZW5fdG9fZnA2NChwcCwgdG9rLCByZXQpOworICBjYXNlIFRPS19CT09MOgorICAg IHJldHVybiB0b2tlbl90b19ib29sZWFuKHBwLCB0b2ssIHJldCk7CisgIGNhc2UgVE9LX0xCUkFD SzogLy8gaW5saW5lLWFycmF5CisgICAgcmV0dXJuIHBhcnNlX2lubGluZV9hcnJheShwcCwgdG9r LCByZXQpOworICBjYXNlIFRPS19MQlJBQ0U6IC8vIGlubGluZS10YWJsZQorICAgIHJldHVybiBw YXJzZV9pbmxpbmVfdGFibGUocHAsIHRvaywgcmV0KTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4g U0VURVJST1IocHAtPmVidWYsIHRvay5saW5lbm8sICJtaXNzaW5nIHZhbHVlIik7CisgIH0KK30K KworLy8gUGFyc2UgYSBzdGFuZGFyZCB0YWJsZSBleHByZXNzaW9uLCBhbmQgc2V0IHRoZSBjdXJ0 YWIgb2YgdGhlIHBhcnNlcgorLy8gdG8gdGhlIHRhYmxlIHJlZmVyZW5jZWQuICBBIHN0YW5kYXJk IHRhYmxlIGV4cHJlc3Npb24gaXMgYSBsaW5lCisvLyBsaWtlIFthLmIuYy5kXS4KK3N0YXRpYyBp bnQgcGFyc2Vfc3RkX3RhYmxlX2V4cHIocGFyc2VyX3QgKnBwLCB0b2tlbl90IHRvaykgeworICAv LyBzdGQtdGFibGUgPSBbIGtleSBdCisgIC8vIEVhdCB0aGUgWworICBhc3NlcnQodG9rLnRva3R5 cCA9PSBUT0tfTEJSQUNLKTsgLy8gWyBhdGUgYnkgY2FsbGVyCisKKyAgLy8gUmVhZCB0aGUgZmly c3Qga2V5cGFydAorICBETyhzY2FuX2tleSgmcHAtPnNjYW5uZXIsICZ0b2spKTsKKworICAvLyBF eHRyYWN0IHRoZSBrZXlwYXJ0W10KKyAgaW50IGtleWxpbmVubyA9IHRvay5saW5lbm87CisgIGlu dCBrZXljb2xubyA9IHRvay5jb2xubzsKKyAga2V5cGFydF90IGtleXBhcnQ7CisgIERPKHBhcnNl X2tleShwcCwgdG9rLCAma2V5cGFydCkpOworCisgIC8vIEVhdCB0aGUgXQorICBETyhzY2FuX2tl eSgmcHAtPnNjYW5uZXIsICZ0b2spKTsKKyAgaWYgKHRvay50b2t0eXAgIT0gVE9LX1JCUkFDSykg eworICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywgIm1pc3Npbmcgcmln aHQtYnJhY2tldCIpOworICB9CisKKyAgLy8gRGVzY2VuZCB0byBvbmUga2V5cGFydCBiZWZvcmUg bGFzdC4KKyAgc3Bhbl90IGxhc3RrZXlwYXJ0ID0ga2V5cGFydC5zcGFuWy0ta2V5cGFydC5uc3Bh bl07CisKKyAgLy8gRGVzY2VuZCBrZXlwYXJ0IGZyb20gdGhlIHRvcHRhYi4KKyAgdG9tbF9kYXR1 bV90ICp0YWIgPQorICAgICAgZGVzY2VuZF9rZXlwYXJ0KHBwLCBrZXlsaW5lbm8sIGtleWNvbG5v LCAmcHAtPnRvcHRhYiwgJmtleXBhcnQsIHRydWUpOworICBpZiAoIXRhYikgeworICAgIHJldHVy biAtMTsKKyAgfQorCisgIC8vIExvb2sgZm9yIHRoZSBsYXN0IGtleXBhcnQgaW4gdGhlIGZpbmFs IHRhYgorICBpbnQgaiA9IHRhYl9maW5kKHRhYiwgbGFzdGtleXBhcnQpOworICBpZiAoaiA8IDAp IHsKKyAgICAvLyBJZiBub3QgZm91bmQ6IGFkZCBpdC4KKyAgICBpZiAodGFiLT5mbGFnICYgRkxB R19JTkxJTkVEKSB7CisgICAgICByZXR1cm4gU0VURVJST1IocHAtPmVidWYsIGtleWxpbmVubywg ImlubGluZSB0YWJsZSBjYW5ub3QgYmUgZXh0ZW5kZWQiKTsKKyAgICB9CisgICAgY29uc3QgY2hh ciAqcmVhc29uOworICAgIHRvbWxfZGF0dW1fdCBuZXd0YWIgPSBta2RhdHVtX2F0KFRPTUxfVEFC TEUsIGtleWxpbmVubywga2V5Y29sbm8pOworICAgIG5ld3RhYi5mbGFnIHw9IEZMQUdfU1RERVhQ UjsKKyAgICBpZiAodGFiX2FkZCh0YWIsIGxhc3RrZXlwYXJ0LCBuZXd0YWIsICZyZWFzb24pKSB7 CisgICAgICByZXR1cm4gU0VURVJST1IocHAtPmVidWYsIGtleWxpbmVubywgIiVzIiwgcmVhc29u KTsKKyAgICB9CisgICAgLy8gdGhpcyBpcyB0aGUgbmV3IHRhYgorICAgIHRhYiA9ICZ0YWItPnUu dGFiLnZhbHVlW3RhYi0+dS50YWIuc2l6ZSAtIDFdOworICB9IGVsc2UgeworICAgIC8vIEZvdW5k OiBjaGVjayBmb3IgZXJyb3JzCisgICAgdGFiID0gJnRhYi0+dS50YWIudmFsdWVbal07CisgICAg aWYgKHRhYi0+ZmxhZyAmIEZMQUdfRVhQTElDSVQpIHsKKyAgICAgIC8qCisgICAgICAgIFRoaXMg aXMgbm90IE9LOgorICAgICAgICBbeC55LnpdCisgICAgICAgIFt4Lnkuel0KKworICAgICAgICBi dXQgdGhpcyBpcyBPSzoKKyAgICAgICAgW3gueS56XQorICAgICAgICBbeF0KKyAgICAgICovCisg ICAgICByZXR1cm4gU0VURVJST1IocHAtPmVidWYsIGtleWxpbmVubywgInRhYmxlIGRlZmluZWQg bW9yZSB0aGFuIG9uY2UiKTsKKyAgICB9CisgICAgaWYgKCEodGFiLT5mbGFnICYgRkxBR19TVERF WFBSKSkgeworICAgICAgLyoKKyAgICAgIFt0MV0JCQkjIE9LCisgICAgICB0Mi50My52ID0gMAkJ IyBPSworICAgICAgW3QxLnQyXSAgIAkJIyBzaG91bGQgRkFJTCAgLSB0MiB3YXMgbm9uLWV4cGxp Y2l0IGJ1dCB3YXMgbm90CisgICAgICBjcmVhdGVkIGJ5IHN0ZC10YWJsZS1leHByCisgICAgICAq LworICAgICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCBrZXlsaW5lbm8sICJ0YWJsZSBkZWZp bmVkIGJlZm9yZSIpOworICAgIH0KKyAgfQorCisgIC8vIFNldCBleHBsaWNpdCBmbGFnIG9uIHRh YgorICB0YWItPmZsYWcgfD0gRkxBR19FWFBMSUNJVDsKKyAgdGFiLT5saW5lbm8gPSBrZXlsaW5l bm87CisgIHRhYi0+Y29sbm8gPSBrZXljb2xubzsKKworICAvLyBTZXQgdGFiIGFzIGN1cnRhYiBv ZiB0aGUgcGFyc2VyCisgIHBwLT5jdXJ0YWIgPSB0YWI7CisgIHJldHVybiAwOworfQorCisvLyBQ YXJzZSBhbiBhcnJheSB0YWJsZSBleHByZXNzaW9uLCBhbmQgc2V0IHRoZSBjdXJ0YWIgb2YgdGhl IHBhcnNlcgorLy8gdG8gdGhlIHRhYmxlIHJlZmVyZW5jZWQuIEEgc3RhbmRhcmQgYXJyYXkgdGFi bGUgZXhwcmVzc2lvbiBpcyBhIGxpbmUKKy8vIGxpa2UgW1thLmIuYy5kXV0uCitzdGF0aWMgaW50 IHBhcnNlX2FycmF5X3RhYmxlX2V4cHIocGFyc2VyX3QgKnBwLCB0b2tlbl90IHRvaykgeworICAv LyBhcnJheS10YWJsZSA9IFtbIGtleSBdXQorICBhc3NlcnQodG9rLnRva3R5cCA9PSBUT0tfTExC UkFDSyk7IC8vIFtbIGF0ZSBieSBjYWxsZXIKKworICAvLyBSZWFkIHRoZSBmaXJzdCBrZXlwYXJ0 CisgIERPKHNjYW5fa2V5KCZwcC0+c2Nhbm5lciwgJnRvaykpOworCisgIGludCBrZXlsaW5lbm8g PSB0b2subGluZW5vOworICBpbnQga2V5Y29sbm8gPSB0b2suY29sbm87CisgIGtleXBhcnRfdCBr ZXlwYXJ0OworICBETyhwYXJzZV9rZXkocHAsIHRvaywgJmtleXBhcnQpKTsKKworICAvLyBlYXQg dGhlIF1dCisgIHRva2VuX3QgcnJiOworICBETyhzY2FuX2tleSgmcHAtPnNjYW5uZXIsICZycmIp KTsKKyAgaWYgKHJyYi50b2t0eXAgIT0gVE9LX1JSQlJBQ0spIHsKKyAgICByZXR1cm4gU0VURVJS T1IocHAtPmVidWYsIHJyYi5saW5lbm8sICJtaXNzaW5nICddXSciKTsKKyAgfQorCisgIC8vIHJl bW92ZSB0aGUgbGFzdCBrZXlwYXJ0IGZyb20ga2V5cGFydFtdCisgIGFzc2VydChrZXlwYXJ0Lm5z cGFuID4gMCk7CisgIHNwYW5fdCBsYXN0a2V5cGFydCA9IGtleXBhcnQuc3BhblstLWtleXBhcnQu bnNwYW5dOworCisgIC8vIGRlc2NlbmQgaW50ZXJtZWRpYXRlIGtleXMgZnJvbSB0b3B0YWIKKyAg dG9tbF9kYXR1bV90ICp0YWIgPQorICAgICAgZGVzY2VuZF9rZXlwYXJ0KHBwLCBrZXlsaW5lbm8s IGtleWNvbG5vLCAmcHAtPnRvcHRhYiwgJmtleXBhcnQsIHRydWUpOworICBpZiAoIXRhYikKKyAg ICByZXR1cm4gLTE7CisKKyAgLy8gRm9yIHRoZSBmaW5hbCBrZXlwYXJ0LCBtYWtlIHN1cmUgZW50 cnkgYXQga2V5IGlzIGFuIGFycmF5IG9mIHRhYmxlcworICBjb25zdCBjaGFyICpyZWFzb247Cisg IGludCBpZHggPSB0YWJfZmluZCh0YWIsIGxhc3RrZXlwYXJ0KTsKKyAgaWYgKGlkeCA9PSAtMSkg eworICAgIC8vIElmIG5vdCBmb3VuZCwgYWRkIGFuIGFycmF5IG9mIHRhYmxlLgorICAgIGlmICh0 YWItPmZsYWcgJiBGTEFHX0lOTElORUQpIHsKKyAgICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1 Ziwga2V5bGluZW5vLCAiaW5saW5lIHRhYmxlIGNhbm5vdCBiZSBleHRlbmRlZCIpOworICAgIH0K KyAgICB0b21sX2RhdHVtX3QgbmV3YXJyID0gbWtkYXR1bV9hdChUT01MX0FSUkFZLCBrZXlsaW5l bm8sIGtleWNvbG5vKTsKKyAgICBpZiAodGFiX2FkZCh0YWIsIGxhc3RrZXlwYXJ0LCBuZXdhcnIs ICZyZWFzb24pKSB7CisgICAgICByZXR1cm4gU0VURVJST1IocHAtPmVidWYsIGtleWxpbmVubywg IiVzIiwgcmVhc29uKTsKKyAgICB9CisgICAgaWR4ID0gdGFiX2ZpbmQodGFiLCBsYXN0a2V5cGFy dCk7CisgICAgYXNzZXJ0KGlkeCA+PSAwKTsKKyAgfQorICAvLyBDaGVjayB0aGF0IHRoaXMgaXMg YW4gYXJyYXkuCisgIGlmICh0YWItPnUudGFiLnZhbHVlW2lkeF0udHlwZSAhPSBUT01MX0FSUkFZ KSB7CisgICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCBrZXlsaW5lbm8sICJlbnRyeSBtdXN0 IGJlIGFuIGFycmF5Iik7CisgIH0KKyAgLy8gQWRkIGFuIGVtcHR5IHRhYmxlIHRvIHRoZSBhcnJh eQorICB0b21sX2RhdHVtX3QgKmFyciA9ICZ0YWItPnUudGFiLnZhbHVlW2lkeF07CisgIGlmIChh cnItPmZsYWcgJiBGTEFHX0lOTElORUQpIHsKKyAgICByZXR1cm4gU0VURVJST1IocHAtPmVidWYs IGtleWxpbmVubywgImNhbm5vdCBleHRlbmQgYSBzdGF0aWMgYXJyYXkiKTsKKyAgfQorICB0b21s X2RhdHVtX3QgKnBlbGVtID0gYXJyX2VtcGxhY2UoYXJyLCAmcmVhc29uKTsKKyAgaWYgKCFwZWxl bSkgeworICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1Ziwga2V5bGluZW5vLCAiJXMiLCByZWFz b24pOworICB9CisgICpwZWxlbSA9IG1rZGF0dW1fYXQoVE9NTF9UQUJMRSwga2V5bGluZW5vLCBr ZXljb2xubyk7CisKKyAgLy8gU2V0IHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhpcyBhcnJheSBhcyBj dXJ0YWIgb2YgdGhlIHBhcnNlcgorICBwcC0+Y3VydGFiID0gJmFyci0+dS5hcnIuZWxlbVthcnIt PnUuYXJyLnNpemUgLSAxXTsKKyAgYXNzZXJ0KHBwLT5jdXJ0YWItPnR5cGUgPT0gVE9NTF9UQUJM RSk7CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFBhcnNlIGFuIGV4cHJlc3Npb24uIEEgdG9tbCBk b2MgaXMganVzdCBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMuCitzdGF0aWMgaW50IHBhcnNlX2tleXZh bHVlX2V4cHIocGFyc2VyX3QgKnBwLCB0b2tlbl90IHRvaykgeworICAvLyBPYnRhaW4gdGhlIGtl eQorICBpbnQga2V5bGluZW5vID0gdG9rLmxpbmVubzsKKyAgaW50IGtleWNvbG5vID0gdG9rLmNv bG5vOworICBrZXlwYXJ0X3Qga2V5cGFydDsKKyAgRE8ocGFyc2Vfa2V5KHBwLCB0b2ssICZrZXlw YXJ0KSk7CisKKyAgLy8gbWF0Y2ggdGhlICc9JworICBETyhzY2FuX2tleSgmcHAtPnNjYW5uZXIs ICZ0b2spKTsKKyAgaWYgKHRvay50b2t0eXAgIT0gVE9LX0VRVUFMKSB7CisgICAgcmV0dXJuIFNF VEVSUk9SKHBwLT5lYnVmLCB0b2subGluZW5vLCAiZXhwZWN0ICc9JyIpOworICB9CisKKyAgLy8g TG9jYXRlIHRoZSBsYXN0IHRhYmxlIHVzaW5nIGtleXBhcnRbXQorICBjb25zdCBjaGFyICpyZWFz b247CisgIHRvbWxfZGF0dW1fdCAqdGFiID0gcHAtPmN1cnRhYjsKKyAgZm9yIChpbnQgaSA9IDA7 IGkgPCBrZXlwYXJ0Lm5zcGFuIC0gMTsgaSsrKSB7CisgICAgaW50IGogPSB0YWJfZmluZCh0YWIs IGtleXBhcnQuc3BhbltpXSk7CisgICAgaWYgKGogPCAwKSB7CisgICAgICBpZiAoaSA+IDAgJiYg KHRhYi0+ZmxhZyAmIEZMQUdfRVhQTElDSVQpKSB7CisgICAgICAgIHJldHVybiBTRVRFUlJPUigK KyAgICAgICAgICAgIHBwLT5lYnVmLCBrZXlsaW5lbm8sCisgICAgICAgICAgICAiY2Fubm90IGV4 dGVuZCBhIHByZXZpb3VzbHkgZGVmaW5lZCB0YWJsZSB1c2luZyBkb3R0ZWQgZXhwcmVzc2lvbiIp OworICAgICAgfQorICAgICAgdG9tbF9kYXR1bV90IG5ld3RhYiA9IG1rZGF0dW1fYXQoVE9NTF9U QUJMRSwga2V5bGluZW5vLCBrZXljb2xubyk7CisgICAgICBpZiAodGFiX2FkZCh0YWIsIGtleXBh cnQuc3BhbltpXSwgbmV3dGFiLCAmcmVhc29uKSkgeworICAgICAgICByZXR1cm4gU0VURVJST1Io cHAtPmVidWYsIGtleWxpbmVubywgIiVzIiwgcmVhc29uKTsKKyAgICAgIH0KKyAgICAgIHRhYiA9 ICZ0YWItPnUudGFiLnZhbHVlW3RhYi0+dS50YWIuc2l6ZSAtIDFdOworICAgICAgY29udGludWU7 CisgICAgfQorICAgIHRvbWxfZGF0dW1fdCAqdmFsdWUgPSAmdGFiLT51LnRhYi52YWx1ZVtqXTsK KyAgICBpZiAodmFsdWUtPnR5cGUgPT0gVE9NTF9UQUJMRSkgeworICAgICAgdGFiID0gdmFsdWU7 CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHZhbHVlLT50eXBlID09IFRPTUxfQVJS QVkpIHsKKyAgICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1Ziwga2V5bGluZW5vLAorICAgICAg ICAgICAgICAgICAgICAgICJlbmNvdW50ZXJlZCBwcmV2aW91c2x5IGRlY2xhcmVkIGFycmF5ICcl cyciLAorICAgICAgICAgICAgICAgICAgICAgIGtleXBhcnQuc3BhbltpXS5wdHIpOworICAgIH0K KyAgICByZXR1cm4gU0VURVJST1IocHAtPmVidWYsIGtleWxpbmVubywgImNhbm5vdCBsb2NhdGUg dGFibGUgYXQgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGtleXBhcnQuc3BhbltpXS5wdHIp OworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGRpc2FsbG93ZWQgc2l0dWF0aW9ucy4KKyAgaWYgKHRh Yi0+ZmxhZyAmIEZMQUdfSU5MSU5FRCkgeworICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1Ziwg a2V5bGluZW5vLCAiaW5saW5lIHRhYmxlIGNhbm5vdCBiZSBleHRlbmRlZCIpOworICB9CisgIGlm IChrZXlwYXJ0Lm5zcGFuID4gMSAmJiAodGFiLT5mbGFnICYgRkxBR19FWFBMSUNJVCkpIHsKKyAg ICByZXR1cm4gU0VURVJST1IoCisgICAgICAgIHBwLT5lYnVmLCBrZXlsaW5lbm8sCisgICAgICAg ICJjYW5ub3QgZXh0ZW5kIGEgcHJldmlvdXNseSBkZWZpbmVkIHRhYmxlIHVzaW5nIGRvdHRlZCBl eHByZXNzaW9uIik7CisgIH0KKworICAvLyBPYnRhaW4gdGhlIHZhbHVlCisgIERPKHNjYW5fdmFs dWUoJnBwLT5zY2FubmVyLCAmdG9rKSk7CisgIHRvbWxfZGF0dW1fdCBuZXd2YWwgPSBEQVRVTV9a RVJPOworICBpZiAocGFyc2VfdmFsKHBwLCB0b2ssICZuZXd2YWwpKSB7CisgICAgZGF0dW1fZnJl ZSgmbmV3dmFsKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBBZGQgYSBuZXcga2V5L3Zh bHVlIGZvciB0YWIuCisgIGlmICh0YWJfYWRkKHRhYiwga2V5cGFydC5zcGFuW2tleXBhcnQubnNw YW4gLSAxXSwgbmV3dmFsLCAmcmVhc29uKSkgeworICAgIGRhdHVtX2ZyZWUoJm5ld3ZhbCk7Cisg ICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCBrZXlsaW5lbm8sICIlcyIsIHJlYXNvbik7Cisg IH0KKworICByZXR1cm4gMDsKK30KKworLy8gTm9ybWFsaXplIGEgTElUL1NUUklORy9NTFNUUklO Ry9MSVRTVFJJTkcvTUxMSVRTVFJJTkcKKy8vIC0+IHVuZXNjYXBlIGFsbCBlc2NhcGVkIGNoYXJz CisvLyBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGFsbG9jYXRlZCBvdXQgb2YgcHAtPnBvb2wKK3N0 YXRpYyBpbnQgcGFyc2Vfbm9ybShwYXJzZXJfdCAqcHAsIHRva2VuX3QgdG9rLCBzcGFuX3QgKnJl dF9zcGFuKSB7CisgIC8vIEFsbG9jYXRlIGEgYnVmZmVyIHRvIHN0b3JlIHRoZSBub3JtYWxpemVk IHN0cmluZy4gQWRkIG9uZQorICAvLyBleHRyYS1ieXRlIGZvciB0ZXJtaW5hdGluZyBOVUwuCisg IGNoYXIgKnAgPSBwb29sX2FsbG9jKHBwLT5wb29sLCB0b2suc3RyLmxlbiArIDEpOworICBpZiAo IXApIHsKKyAgICByZXR1cm4gU0VURVJST1IocHAtPmVidWYsIHRvay5saW5lbm8sICJvdXQgb2Yg bWVtb3J5Iik7CisgIH0KKworICAvLyBDb3B5IGZyb20gdG9rZW4gc3RyaW5nIGludG8gYnVmZmVy CisgIG1lbWNweShwLCB0b2suc3RyLnB0ciwgdG9rLnN0ci5sZW4pOworICBwW3Rvay5zdHIubGVu XSA9IDA7IC8vIGFkZGl0aW9uYWwgTlVMIHRlcm0gZm9yIHNhZmV0eQorCisgIHJldF9zcGFuLT5w dHIgPSBwOworICByZXRfc3Bhbi0+bGVuID0gdG9rLnN0ci5sZW47CisKKyAgc3dpdGNoICh0b2su dG9rdHlwKSB7CisgIGNhc2UgVE9LX0xJVDoKKyAgY2FzZSBUT0tfTElUU1RSSU5HOgorICBjYXNl IFRPS19NTExJVFNUUklORzoKKyAgICAvLyBubyBuZWVkIHRvIGhhbmRsZSBlc2NhcGUgY2hhcnMK KyAgICByZXR1cm4gMDsKKworICBjYXNlIFRPS19TVFJJTkc6CisgIGNhc2UgVE9LX01MU1RSSU5H OgorICAgIC8vIG5lZWQgdG8gaGFuZGxlIGVzY2FwZSBjaGFycworICAgIGJyZWFrOworCisgIGRl ZmF1bHQ6CisgICAgcmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCAwLCAiaW50ZXJuYWw6IGFyZyBt dXN0IGJlIGEgc3RyaW5nIik7CisgIH0KKworICAvLyBpZiB0aGVyZSBpcyBubyBlc2NhcGUgY2hh ciwgdGhlbiBkb25lIQorICBpZiAoIXRvay51LmVzY3ApIHsKKyAgICByZXR1cm4gMDsgLy8gc3Vj Y2VzcworICB9CisKKyAgLy8gcCBwb2ludHMgdG8gdGhlIGJhY2tzbGFzaAorICBwICs9ICh0b2su dS5lc2NwIC0gdG9rLnN0ci5wdHIpOworICBhc3NlcnQocCAtIHJldF9zcGFuLT5wdHIgPT0gdG9r LnUuZXNjcCAtIHRvay5zdHIucHRyKTsKKyAgYXNzZXJ0KCpwID09ICdcXCcpOworCisgIC8vIE5v cm1hbGl6ZSB0aGUgZXNjYXBlZCBjaGFycworICBjaGFyICpkc3QgPSBwOworICB3aGlsZSAoKnAp IHsKKyAgICBpZiAoKnAgIT0gJ1xcJykgeworICAgICAgKmRzdCsrID0gKnArKzsKKyAgICAgIGNv bnRpbnVlOworICAgIH0KKyAgICBzd2l0Y2ggKHBbMV0pIHsKKyAgICBjYXNlICciJzoKKyAgICBj YXNlICdcXCc6CisgICAgICAqZHN0KysgPSBwWzFdOworICAgICAgcCArPSAyOworICAgICAgY29u dGludWU7CisgICAgY2FzZSAnYic6CisgICAgICAqZHN0KysgPSAnXGInOworICAgICAgcCArPSAy OworICAgICAgY29udGludWU7CisgICAgY2FzZSAndCc6CisgICAgICAqZHN0KysgPSAnXHQnOwor ICAgICAgcCArPSAyOworICAgICAgY29udGludWU7CisgICAgY2FzZSAnbic6CisgICAgICAqZHN0 KysgPSAnXG4nOworICAgICAgcCArPSAyOworICAgICAgY29udGludWU7CisgICAgY2FzZSAnZic6 CisgICAgICAqZHN0KysgPSAnXGYnOworICAgICAgcCArPSAyOworICAgICAgY29udGludWU7Cisg ICAgY2FzZSAncic6CisgICAgICAqZHN0KysgPSAnXHInOworICAgICAgcCArPSAyOworICAgICAg Y29udGludWU7CisgICAgY2FzZSAnZSc6CisgICAgICAqZHN0KysgPSAnXDAzMyc7CisgICAgICBw ICs9IDI7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlICd4JzogeworICAgICAgY2hhciBidWZb M107CisgICAgICBtZW1jcHkoYnVmLCBwICsgMiwgMik7CisgICAgICBidWZbMl0gPSAwOworICAg ICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgdHdvIGhleCBkaWdpdHMgaGVyZSBi ZWNhdXNlCisgICAgICAvLyB0aGUgc2Nhbm5lciBhbHJlYWR5IGNoZWNrZWQgaXQuCisgICAgICBp bnQzMl90IHVjcyA9IHN0cnRvbChidWYsIDAsIDE2KTsKKyAgICAgIGludCBuID0gdWNzX3RvX3V0 ZjgodWNzLCBkc3QpOworICAgICAgaWYgKG4gPCAwKSB7CisgICAgICAgIHJldHVybiBTRVRFUlJP UihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywgImVycm9yIGNvbnZlcnRpbmcgVUNTICVzIHRvIFVURjgi LAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmKTsKKyAgICAgIH0KKyAgICAgIGRzdCArPSBu OworICAgICAgcCArPSAyICsgMjsgLy8gXHhOTgorICAgICAgY29udGludWU7CisgICAgfQorICAg IGNhc2UgJ3UnOgorICAgIGNhc2UgJ1UnOiB7CisgICAgICBjaGFyIGJ1Zls5XTsKKyAgICAgIGlu dCBzeiA9IChwWzFdID09ICd1JyA/IDQgOiA4KTsKKyAgICAgIG1lbWNweShidWYsIHAgKyAyLCBz eik7CisgICAgICBidWZbc3pdID0gMDsKKyAgICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gY2hl Y2sgZm9yIDQgb3IgOCBoZXggZGlnaXRzIGhlcmUgYmVjYXVzZQorICAgICAgLy8gdGhlIHNjYW5u ZXIgYWxyZWFkeSBjaGVja2VkIGl0LgorICAgICAgaW50MzJfdCB1Y3MgPSBzdHJ0b2woYnVmLCAw LCAxNik7CisgICAgICBpZiAoMHhEODAwIDw9IHVjcyAmJiB1Y3MgPD0gMHhERkZGKSB7CisgICAg ICAgIC8vIGV4cGxpY2l0bHkgcHJvaGliaXQgc3Vycm9nYXRlcyAobm9uLXNjYWxhciB1bmljb2Rl IGNvZGUgcG9pbnQpCisgICAgICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1ZiwgdG9rLmxpbmVu bywgImludmFsaWQgVVRGOCBjaGFyIFxcdSUwNHgiLCB1Y3MpOworICAgICAgfQorICAgICAgaW50 IG4gPSB1Y3NfdG9fdXRmOCh1Y3MsIGRzdCk7CisgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAg cmV0dXJuIFNFVEVSUk9SKHBwLT5lYnVmLCB0b2subGluZW5vLCAiZXJyb3IgY29udmVydGluZyBV Q1MgJXMgdG8gVVRGOCIsCisgICAgICAgICAgICAgICAgICAgICAgICBidWYpOworICAgICAgfQor ICAgICAgZHN0ICs9IG47CisgICAgICBwICs9IDIgKyBzejsgLy8gXHVOTk5OIG9yIFxVTk5OTk5O Tk4KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGNhc2UgJyAnOgorICAgIGNhc2UgJ1x0 JzoKKyAgICBjYXNlICdccic6CisgICAgICAvLyBsaW5lLWVuZGluZyBiYWNrc2xhc2gKKyAgICAg IC8vIC0tLSBhbGxvdyBmb3IgZXh0cmEgd2hpdGVzcGFjZSBjaGFycyBhZnRlciBiYWNrc2xhc2gK KyAgICAgIC8vIC0tLSBza2lwIHVudGlsIG5ld2xpbmUKKyAgICAgIHArKzsgICAgICAgICAgICAg ICAgICAgICAvLyBza2lwIHRoZSBlc2NhcGUgY2hhcgorICAgICAgcCArPSBzdHJzcG4ocCwgIiBc dFxyIik7IC8vIHNraXAgd2hpdGVzcGFjZXMKKyAgICAgIGlmICgqcCAhPSAnXG4nKSB7CisgICAg ICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywKKyAgICAgICAgICAgICAg ICAgICAgICAgICJ1bmV4cGVjdGVkIGNoYXIgYWZ0ZXIgbGluZS1lbmRpbmcgYmFja3NsYXNoIik7 CisgICAgICB9CisgICAgICAvLyBmYWxsdGhydQorICAgIGNhc2UgJ1xuJzoKKyAgICAgIC8vIHNr aXAgYWxsIHdoaXRlc3BhY2VzIGluY2x1ZGluZyBuZXdsaW5lCisgICAgICBwKys7CisgICAgICBw ICs9IHN0cnNwbihwLCAiIFx0XHJcbiIpOworICAgICAgY29udGludWU7CisgICAgZGVmYXVsdDoK KyAgICAgIHJldHVybiBTRVRFUlJPUihwcC0+ZWJ1ZiwgdG9rLmxpbmVubywKKyAgICAgICAgICAg ICAgICAgICAgICAiaW50ZXJuYWw6IHVua25vd24gZXNjYXBlIGNoYXIgXFwlYyIsIHBbMV0pOwor ICAgIH0KKyAgfQorICAqZHN0ID0gMDsKKyAgcmV0X3NwYW4tPmxlbiA9IGRzdCAtIHJldF9zcGFu LT5wdHI7CisgIHJldHVybiAwOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyA9PSAgICBTQ0FOTkVS IFNFQ1RJT04KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gR2V0IHRoZSBuZXh0IGNoYXIKK3N0YXRpYyBp bnQgc2Nhbl9nZXQoc2Nhbm5lcl90ICpzcCkgeworICBpbnQgcmV0ID0gVE9LX0ZJTjsKKyAgY29u c3QgY2hhciAqcCA9IHNwLT5jdXI7CisgIGlmIChwIDwgc3AtPmVuZHApIHsKKyAgICByZXQgPSAq cCsrOworICAgIGlmIChyZXQgPT0gJ1xyJyAmJiBwIDwgc3AtPmVuZHAgJiYgKnAgPT0gJ1xuJykg eworICAgICAgcmV0ID0gKnArKzsKKyAgICB9CisgIH0KKyAgc3AtPmN1ciA9IHA7CisgIGlmIChy ZXQgPT0gJ1xuJykgeworICAgIHNwLT5saW5lbm8gKz0gMTsKKyAgICBzcC0+bGluZV9zdGFydCA9 IHA7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworLy8gQ2hlY2sgaWYgdGhlIG5leHQgY2hhciBt YXRjaGVzIGNoLgorc3RhdGljIGlubGluZSBib29sIHNjYW5fbWF0Y2goc2Nhbm5lcl90ICpzcCwg aW50IGNoKSB7CisgIGNvbnN0IGNoYXIgKnAgPSBzcC0+Y3VyOworICAvLyBleGFjdCBtYXRjaD8g ZG9uZS4KKyAgaWYgKHAgPCBzcC0+ZW5kcCAmJiAqcCA9PSBjaCkgeworICAgIHJldHVybiB0cnVl OworICB9CisgIC8vIFxuIGFsc28gbWF0Y2hlcyBcclxuCisgIGlmIChjaCA9PSAnXG4nICYmIHAg KyAxIDwgc3AtPmVuZHApIHsKKyAgICByZXR1cm4gcFswXSA9PSAnXHInICYmIHBbMV0gPT0gJ1xu JzsKKyAgfQorICAvLyBub3QgYSBtYXRjaAorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIENoZWNr IGlmIHRoZSBuZXh0IGNoYXIgaXMgaW4gYWNjZXB0W10uCitzdGF0aWMgYm9vbCBzY2FuX21hdGNo YW55KHNjYW5uZXJfdCAqc3AsIGNvbnN0IGNoYXIgKmFjY2VwdCkgeworICBmb3IgKDsgKmFjY2Vw dDsgYWNjZXB0KyspIHsKKyAgICBpZiAoc2Nhbl9tYXRjaChzcCwgKmFjY2VwdCkpIHsKKyAgICAg IHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIENoZWNr IGlmIHRoZSBuZXh0IG4gY2hhcnMgbWF0Y2ggY2guCitzdGF0aWMgaW5saW5lIGJvb2wgc2Nhbl9u bWF0Y2goc2Nhbm5lcl90ICpzcCwgaW50IGNoLCBpbnQgbikgeworICBhc3NlcnQoY2ggIT0gJ1xu Jyk7IC8vIG5vdCBoYW5kbGVkCisgIGlmIChzcC0+Y3VyICsgbiA+IHNwLT5lbmRwKSB7CisgICAg cmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IGNoYXIgKnAgPSBzcC0+Y3VyOworICBpbnQgaTsK KyAgZm9yIChpID0gMDsgaSA8IG4gJiYgcFtpXSA9PSBjaDsgaSsrKQorICAgIDsKKyAgcmV0dXJu IGkgPT0gbjsKK30KKworLy8gSW5pdGlhbGl6ZSBhIHRva2VuLgorc3RhdGljIGlubGluZSB0b2tl bl90IG1rdG9rZW4oc2Nhbm5lcl90ICpzcCwgdG9rdHlwX3QgdHlwKSB7CisgIHRva2VuX3QgdG9r ID0gezB9OworICB0b2sudG9rdHlwID0gdHlwOworICB0b2suc3RyLnB0ciA9IHNwLT5jdXI7Cisg IHRvay5saW5lbm8gPSBzcC0+bGluZW5vOworICB0b2suY29sbm8gPSAoaW50KShzcC0+Y3VyIC0g c3AtPmxpbmVfc3RhcnQpICsgMTsKKyAgcmV0dXJuIHRvazsKK30KKworI2RlZmluZSBTX0dFVCgp IHNjYW5fZ2V0KHNwKQorI2RlZmluZSBTX01BVENIKGNoKSBzY2FuX21hdGNoKHNwLCAoY2gpKQor I2RlZmluZSBTX01BVENIMyhjaCkgc2Nhbl9ubWF0Y2goc3AsIChjaCksIDMpCisjZGVmaW5lIFNf TUFUQ0g0KGNoKSBzY2FuX25tYXRjaChzcCwgKGNoKSwgNCkKKyNkZWZpbmUgU19NQVRDSDYoY2gp IHNjYW5fbm1hdGNoKHNwLCAoY2gpLCA2KQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfdmFsaWRf Y2hhcihpbnQgY2gpIHsKKyAgLy8gaS5lLiAoMHgyMCA8PSBjaCAmJiBjaCA8PSAweDdlKSB8fCAo Y2ggJiAweDgwKTsKKyAgcmV0dXJuIGlzcHJpbnQoKHVuc2lnbmVkIGNoYXIpY2gpIHx8IChjaCAm IDB4ODApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfaGV4X2NoYXIoaW50IGNoKSB7Cisg IGNoID0gdG91cHBlcigodW5zaWduZWQgY2hhciljaCk7CisgIHJldHVybiAoJzAnIDw9IGNoICYm IGNoIDw9ICc5JykgfHwgKCdBJyA8PSBjaCAmJiBjaCA8PSAnRicpOworfQorCisvLyBJbml0aWFs aXplIGEgc2Nhbm5lcgorc3RhdGljIHZvaWQgc2Nhbl9pbml0KHNjYW5uZXJfdCAqc3AsIGNvbnN0 IGNoYXIgKnNyYywgaW50IGxlbiwgY2hhciAqZXJyYnVmLAorICAgICAgICAgICAgICAgICAgICAg IGludCBlcnJidWZzeikgeworICBtZW1zZXQoc3AsIDAsIHNpemVvZigqc3ApKTsKKyAgc3AtPnNy YyA9IHNyYzsKKyAgc3AtPmVuZHAgPSBzcmMgKyBsZW47CisgIGFzc2VydCgqc3AtPmVuZHAgPT0g J1wwJyk7CisgIHNwLT5jdXIgPSBzcmM7CisgIHNwLT5saW5lbm8gPSAxOworICBzcC0+bGluZV9z dGFydCA9IHNyYzsKKyAgc3AtPmVidWYucHRyID0gZXJyYnVmOworICBzcC0+ZWJ1Zi5sZW4gPSBl cnJidWZzejsKK30KKworLy8gU2NhbiBlc2NhcGUgc2VxdWVuY2UgY2hhcmFjdGVycyBhZnRlciBh IGJhY2tzbGFzaC4KKy8vIFJldHVybiAjY2hhciBtYXRjaCBvbiBzdWNjZXNzLCAwIGlmIG5vIG1h dGNoLCAtMSBvbiBlcnJvci4KK3N0YXRpYyBpbnQgc2Nhbl9lc2NhcGVfY2hhcnMoc2Nhbm5lcl90 ICpzcCkgeworICBjb25zdCBjaGFyICpwID0gc3AtPmN1cjsKKyAgaWYgKHAgPj0gc3AtPmVuZHAp IHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQgY2ggPSAqcCsrOworICBpZiAoY2ggJiYgc3Ry Y2hyKCJidG5mcmVcIlxcIiwgY2gpKSB7CisgICAgcmV0dXJuIHAgLSBzcC0+Y3VyOworICB9Cisg IGludCBoZXggPSAoY2ggPT0gJ3gnKSA/IDIgOiAoY2ggPT0gJ3UnKSA/IDQgOiAoY2ggPT0gJ1Un KSA/IDggOiAwOworICBpZiAoaGV4KSB7CisgICAgaW50IGkgPSAwOworICAgIGZvciAoOyBpIDwg aGV4ICYmIHAgPCBzcC0+ZW5kcCAmJiBpc19oZXhfY2hhcigqcCk7IGkrKywgcCsrKQorICAgICAg OworICAgIGlmIChpICE9IGhleCkgeworICAgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBz cC0+bGluZW5vLCAiZXhwZWN0ICVkIGhleCBkaWdpdHMgYWZ0ZXIgXFwlYyIsCisgICAgICAgICAg ICAgICAgICAgICAgaGV4LCBjaCk7CisgICAgfQorICAgIHJldHVybiBwIC0gc3AtPmN1cjsKKyAg fQorICByZXR1cm4gMDsKK30KKworLy8gU2NhbiAiIiIgLi4uICIiIgorc3RhdGljIGludCBzY2Fu X211bHRpbGluZV9zdHJpbmcoc2Nhbm5lcl90ICpzcCwgdG9rZW5fdCAqdG9rKSB7CisgIGFzc2Vy dChTX01BVENIMygnIicpKTsKKyAgU19HRVQoKSwgU19HRVQoKSwgU19HRVQoKTsgLy8gc2tpcCBv cGVuaW5nICIiIgorCisgIC8vIEFjY29yZGluZyB0byBzcGVjOiB0cmltIGZpcnN0IG5ld2xpbmUg YWZ0ZXIgIiIiCisgIGlmIChTX01BVENIKCdcbicpKSB7CisgICAgU19HRVQoKTsKKyAgfQorCisg ICp0b2sgPSBta3Rva2VuKHNwLCBUT0tfTUxTVFJJTkcpOworICAvLyBzY2FuIHVudGlsIHRlcm1p bmF0aW5nICIiIgorICBjb25zdCBjaGFyICplc2NwID0gTlVMTDsKKyAgd2hpbGUgKDEpIHsKKyAg ICBpZiAoU19NQVRDSDMoJyInKSkgeworICAgICAgaWYgKFNfTUFUQ0g0KCciJykpIHsKKyAgICAg ICAgLy8gc3BlY2lhbCBjYXNlLi4uICIiImFiY2QgIiIiIiAtPiAoYWJjZCAiKQorICAgICAgICAv LyBidXQgc2VxdWVuY2VzIG9mIDMgb3IgbW9yZSBkb3VibGUgcXVvdGVzIGFyZSBub3QgYWxsb3dl ZAorICAgICAgICBpZiAoU19NQVRDSDYoJyInKSkgeworICAgICAgICAgIHJldHVybiBTRVRFUlJP UihzcC0+ZWJ1Ziwgc3AtPmxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRldGVj dGVkIHNlcXVlbmNlcyBvZiAzIG9yIG1vcmUgZG91YmxlIHF1b3RlcyIpOworICAgICAgICB9IGVs c2UgeworICAgICAgICAgIDsgLy8gbm8gcHJvYmxlbQorICAgICAgICB9CisgICAgICB9IGVsc2Ug eworICAgICAgICBicmVhazsgLy8gZm91bmQgdGVybWluYXRpbmcgIiIiCisgICAgICB9CisgICAg fQorICAgIGludCBjaCA9IFNfR0VUKCk7CisgICAgaWYgKGNoID09IFRPS19GSU4pIHsKKyAgICAg IHJldHVybiBTRVRFUlJPUihzcC0+ZWJ1Ziwgc3AtPmxpbmVubywgInVudGVybWluYXRlZCBcIlwi XCIiKTsKKyAgICB9CisgICAgLy8gSWYgbm9uLWVzY2FwZWQgY2hhciAuLi4KKyAgICBpZiAoY2gg IT0gJ1xcJykgeworICAgICAgaWYgKCEoaXNfdmFsaWRfY2hhcihjaCkgfHwgKGNoICYmIHN0cmNo cigiIFx0XG4iLCBjaCkpKSkgeworICAgICAgICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNw LT5saW5lbm8sICJpbnZhbGlkIGNoYXIgaW4gc3RyaW5nIik7CisgICAgICB9CisgICAgICBjb250 aW51ZTsKKyAgICB9CisgICAgLy8gY2ggaXMgYmFja3NsYXNoCisgICAgaWYgKCFlc2NwKSB7Cisg ICAgICBlc2NwID0gc3AtPmN1ciAtIDE7CS8qIG1hcmsgdGhlIGZpcnN0IGVzYyBwb3NpdGlvbiAq LworICAgICAgYXNzZXJ0KCplc2NwID09ICdcXCcpOworICAgIH0KKworICAgIC8vIGhhbmRsZSBl c2NhcGUgY2hhcgorICAgIGludCBjbnQgPSBzY2FuX2VzY2FwZV9jaGFycyhzcCk7CisgICAgaWYg KGNudCA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGNudCA+IDApIHsK KyAgICAgIHNwLT5jdXIgKz0gY250OyAvLyBza2lwIHRoZSBlc2NhcGUgc2VxdWVuY2UKKyAgICAg IGNvbnRpbnVlOworICAgIH0KKyAgICBhc3NlcnQoY250ID09IDApOworCisgICAgLy8gaGFuZGxl IGxpbmUtZW5kaW5nIGJhY2tzbGFzaAorICAgIGNoID0gU19HRVQoKTsKKyAgICBpZiAoY2ggPT0g JyAnIHx8IGNoID09ICdcdCcpIHsKKyAgICAgIC8vIEFsdGhvdWdoIHRoZSBzcGVjIGRvZXMgbm90 IGFsbG93IGZvciB3aGl0ZXNwYWNlIGZvbGxvd2luZyBhCisgICAgICAvLyBsaW5lLWVuZGluZyBi YWNrc2xhc2gsIHNvbWUgc3RhbmRhcmQgdGVzdHMgZXhwZWN0IGl0LgorICAgICAgLy8gU2tpcCB3 aGl0ZXNwYWNlIHRpbGwgRU9MLgorICAgICAgd2hpbGUgKGNoICE9IFRPS19GSU4gJiYgY2ggJiYg c3RyY2hyKCIgXHQiLCBjaCkpIHsKKyAgICAgICAgY2ggPSBTX0dFVCgpOworICAgICAgfQorICAg ICAgaWYgKGNoICE9ICdcbicpIHsKKyAgICAgICAgLy8gR290IGEgYmFja3NsYXNoIGZvbGxvd2Vk IGJ5IHdoaXRlc3BhY2UsIGZvbGxvd2VkIGJ5IHNvbWUgY2hhcgorICAgICAgICAvLyBiZWZvcmUg bmV3bGluZQorICAgICAgICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNwLT5saW5lbm8sICJi YWQgZXNjYXBlIGNoYXIgaW4gc3RyaW5nIik7CisgICAgICB9CisgICAgICAvLyBmYWxsdGhydQor ICAgIH0KKyAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgLy8gZ290IGEgbGluZS1lbmRpbmcg YmFja3NsYXNoCisgICAgICAvLyAtIHNraXAgYWxsIHdoaXRlc3BhY2VzCisgICAgICB3aGlsZSAo c2Nhbl9tYXRjaGFueShzcCwgIiBcdFxuIikpIHsKKyAgICAgICAgU19HRVQoKTsKKyAgICAgIH0K KyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNw LT5saW5lbm8sICJiYWQgZXNjYXBlIGNoYXIgaW4gc3RyaW5nIik7CisgIH0KKyAgdG9rLT5zdHIu bGVuID0gc3AtPmN1ciAtIHRvay0+c3RyLnB0cjsKKyAgdG9rLT51LmVzY3AgPSBlc2NwOworCisg IGFzc2VydChTX01BVENIMygnIicpKTsKKyAgU19HRVQoKSwgU19HRVQoKSwgU19HRVQoKTsKKyAg cmV0dXJuIDA7Cit9CisKKy8vIFNjYW4gIiAuLi4gIgorc3RhdGljIGludCBzY2FuX3N0cmluZyhz Y2FubmVyX3QgKnNwLCB0b2tlbl90ICp0b2spIHsKKyAgYXNzZXJ0KFNfTUFUQ0goJyInKSk7Cisg IGlmIChTX01BVENIMygnIicpKSB7CisgICAgcmV0dXJuIHNjYW5fbXVsdGlsaW5lX3N0cmluZyhz cCwgdG9rKTsKKyAgfQorICBTX0dFVCgpOyAvLyBza2lwIG9wZW5pbmcgIgorCisgIC8vIHNjYW4g dW50aWwgY2xvc2luZyAiCisgICp0b2sgPSBta3Rva2VuKHNwLCBUT0tfU1RSSU5HKTsKKyAgY29u c3QgY2hhciAqZXNjcCA9IE5VTEw7CisgIHdoaWxlICghU19NQVRDSCgnIicpKSB7CisgICAgaW50 IGNoID0gU19HRVQoKTsKKyAgICBpZiAoY2ggPT0gVE9LX0ZJTikgeworICAgICAgcmV0dXJuIFNF VEVSUk9SKHNwLT5lYnVmLCBzcC0+bGluZW5vLCAidW50ZXJtaW5hdGVkIHN0cmluZyIpOworICAg IH0KKyAgICAvLyBJZiBub24tZXNjYXBlZCBjaGFyIC4uLgorICAgIGlmIChjaCAhPSAnXFwnKSB7 CisgICAgICBpZiAoIShpc192YWxpZF9jaGFyKGNoKSB8fCBjaCA9PSAnICcgfHwgY2ggPT0gJ1x0 JykpIHsKKyAgICAgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBzcC0+bGluZW5vLCAiaW52 YWxpZCBjaGFyIGluIHN0cmluZyIpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQor ICAgIC8vIGNoIGlzIGJhY2tzbGFzaAorICAgIGlmICghZXNjcCkgeworICAgICAgZXNjcCA9IHNw LT5jdXIgLSAxOworICAgICAgYXNzZXJ0KCplc2NwID09ICdcXCcpOworICAgIH0KKworICAgIC8v IGhhbmRsZSBlc2NhcGUgY2hhcgorICAgIGludCBjbnQgPSBzY2FuX2VzY2FwZV9jaGFycyhzcCk7 CisgICAgaWYgKGNudCA8IDApIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGNu dCA+IDApIHsKKyAgICAgIHNwLT5jdXIgKz0gY250OworICAgICAgY29udGludWU7CisgICAgfQor ICAgIHJldHVybiBTRVRFUlJPUihzcC0+ZWJ1Ziwgc3AtPmxpbmVubywgImJhZCBlc2NhcGUgY2hh ciBpbiBzdHJpbmciKTsKKyAgfQorICB0b2stPnN0ci5sZW4gPSBzcC0+Y3VyIC0gdG9rLT5zdHIu cHRyOworICB0b2stPnUuZXNjcCA9IGVzY3A7CisKKyAgYXNzZXJ0KFNfTUFUQ0goJyInKSk7Cisg IFNfR0VUKCk7IC8vIHNraXAgdGhlIHRlcm1pbmF0aW5nICIKKyAgcmV0dXJuIDA7Cit9CisKKy8v IFNjYW4gJycnIC4uLiAnJycKK3N0YXRpYyBpbnQgc2Nhbl9tdWx0aWxpbmVfbGl0c3RyaW5nKHNj YW5uZXJfdCAqc3AsIHRva2VuX3QgKnRvaykgeworICBhc3NlcnQoU19NQVRDSDMoJ1wnJykpOwor ICBTX0dFVCgpLCBTX0dFVCgpLCBTX0dFVCgpOyAvLyBza2lwIG9wZW5pbmcgJycnCisKKyAgLy8g QWNjb3JkaW5nIHRvIHNwZWM6IHRyaW0gZmlyc3QgbmV3bGluZSBhZnRlciAnJycKKyAgaWYgKFNf TUFUQ0goJ1xuJykpIHsKKyAgICBTX0dFVCgpOworICB9CisKKyAgLy8gc2NhbiB1bnRpbCB0ZXJt aW5hdGluZyAnJycKKyAgKnRvayA9IG1rdG9rZW4oc3AsIFRPS19NTExJVFNUUklORyk7CisgIHdo aWxlICgxKSB7CisgICAgaWYgKFNfTUFUQ0gzKCdcJycpKSB7CisgICAgICBpZiAoU19NQVRDSDQo J1wnJykpIHsKKyAgICAgICAgLy8gc3BlY2lhbCBjYXNlLi4uICcnJ2FiY2QgJycnJyAtPiAoYWJj ZCAnKQorICAgICAgICAvLyBidXQgc2VxdWVuY2VzIG9mIDMgb3IgbW9yZSBzaW5nbGUgcXVvdGVz IGFyZSBub3QgYWxsb3dlZAorICAgICAgICBpZiAoU19NQVRDSDYoJ1wnJykpIHsKKyAgICAgICAg ICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNwLT5saW5lbm8sCisgICAgICAgICAgICAgICAg ICAgICAgICAgICJzZXF1ZW5jZXMgb2YgMyBvciBtb3JlIHNpbmdsZSBxdW90ZXMiKTsKKyAgICAg ICAgfSBlbHNlIHsKKyAgICAgICAgICA7IC8vIG5vIHByb2JsZW0KKyAgICAgICAgfQorICAgICAg fSBlbHNlIHsKKyAgICAgICAgYnJlYWs7IC8vIGZvdW5kIHRlcm1pbmF0aW5nICcnJworICAgICAg fQorICAgIH0KKyAgICBpbnQgY2ggPSBTX0dFVCgpOworICAgIGlmIChjaCA9PSBUT0tfRklOKSB7 CisgICAgICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNwLT5saW5lbm8sCisgICAgICAgICAg ICAgICAgICAgICAgInVudGVybWluYXRlZCBtdWx0aWxpbmUgbGl0IHN0cmluZyIpOworICAgIH0K KyAgICBpZiAoIShpc192YWxpZF9jaGFyKGNoKSB8fCAoY2ggJiYgc3RyY2hyKCIgXHRcbiIsIGNo KSkpKSB7CisgICAgICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNwLT5saW5lbm8sICJpbnZh bGlkIGNoYXIgaW4gc3RyaW5nIik7CisgICAgfQorICB9CisgIHRvay0+c3RyLmxlbiA9IHNwLT5j dXIgLSB0b2stPnN0ci5wdHI7CisKKyAgYXNzZXJ0KFNfTUFUQ0gzKCdcJycpKTsKKyAgU19HRVQo KSwgU19HRVQoKSwgU19HRVQoKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIFNjYW4gJyAuLi4gJwor c3RhdGljIGludCBzY2FuX2xpdHN0cmluZyhzY2FubmVyX3QgKnNwLCB0b2tlbl90ICp0b2spIHsK KyAgYXNzZXJ0KFNfTUFUQ0goJ1wnJykpOworICBpZiAoU19NQVRDSDMoJ1wnJykpIHsKKyAgICBy ZXR1cm4gc2Nhbl9tdWx0aWxpbmVfbGl0c3RyaW5nKHNwLCB0b2spOworICB9CisgIFNfR0VUKCk7 IC8vIHNraXAgb3BlbmluZyAnCisKKyAgLy8gc2NhbiB1bnRpbCBjbG9zaW5nICcKKyAgKnRvayA9 IG1rdG9rZW4oc3AsIFRPS19MSVRTVFJJTkcpOworICB3aGlsZSAoIVNfTUFUQ0goJ1wnJykpIHsK KyAgICBpbnQgY2ggPSBTX0dFVCgpOworICAgIGlmIChjaCA9PSBUT0tfRklOKSB7CisgICAgICBy ZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNwLT5saW5lbm8sICJ1bnRlcm1pbmF0ZWQgc3RyaW5n Iik7CisgICAgfQorICAgIGlmICghKGlzX3ZhbGlkX2NoYXIoY2gpIHx8IGNoID09ICdcdCcpKSB7 CisgICAgICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIHNwLT5saW5lbm8sICJpbnZhbGlkIGNo YXIgaW4gc3RyaW5nIik7CisgICAgfQorICB9CisgIHRvay0+c3RyLmxlbiA9IHNwLT5jdXIgLSB0 b2stPnN0ci5wdHI7CisgIGFzc2VydChTX01BVENIKCdcJycpKTsKKyAgU19HRVQoKTsKKyAgcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGlzX3ZhbGlkX2RhdGUoaW50IHllYXIsIGludCBtb250 aCwgaW50IGRheSkgeworICBpZiAoISgxIDw9IHllYXIpKSB7CisgICAgcmV0dXJuIGZhbHNlOwor ICB9CisgIGlmICghKDEgPD0gbW9udGggJiYgbW9udGggPD0gMTIpKSB7CisgICAgcmV0dXJuIGZh bHNlOworICB9CisgIGludCBpc19sZWFwX3llYXIgPSAoeWVhciAlIDQgPT0gMCAmJiB5ZWFyICUg MTAwICE9IDApIHx8ICh5ZWFyICUgNDAwID09IDApOworICBpbnQgZGF5c19pbl9tb250aFtdID0g eworICAgICAgMzEsIDI4ICsgaXNfbGVhcF95ZWFyLCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAz MCwgMzEsIDMwLCAzMX07CisgIHJldHVybiAoMSA8PSBkYXkgJiYgZGF5IDw9IGRheXNfaW5fbW9u dGhbbW9udGggLSAxXSk7Cit9CisKK3N0YXRpYyBib29sIGlzX3ZhbGlkX3RpbWUoaW50IGhvdXIs IGludCBtaW51dGUsIGludCBzZWMsIGludCB1c2VjKSB7CisgIGlmICghKDAgPD0gaG91ciAmJiBo b3VyIDw9IDIzKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoISgwIDw9IG1pbnV0 ZSAmJiBtaW51dGUgPD0gNTkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghKDAg PD0gc2VjICYmIHNlYyA8PSA1OSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCEo MCA8PSB1c2VjKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30K Kworc3RhdGljIGJvb2wgaXNfdmFsaWRfdGltZXpvbmUoaW50IG1pbnV0ZSkgeworICBtaW51dGUg PSAobWludXRlIDwgMCA/IC1taW51dGUgOiBtaW51dGUpOworICBpbnQgaG91ciA9IG1pbnV0ZSAv IDYwOworICBtaW51dGUgPSBtaW51dGUgJSA2MDsKKyAgaWYgKCEoMCA8PSBob3VyICYmIGhvdXIg PD0gMjMpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghKDAgPD0gbWludXRlICYm IG1pbnV0ZSA8IDYwKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsK K30KKworLy8gUmVhZCBhbiBpbnQgKHdpdGhvdXQgc2lnbnMpIGZyb20gdGhlIHN0cmluZyBwLgor c3RhdGljIGludCByZWFkX2ludChjb25zdCBjaGFyICpwLCBpbnQgKnJldCkgeworICBjb25zdCBj aGFyICpwcCA9IHA7CisgIGludDY0X3QgdmFsID0gMDsKKyAgZm9yICg7IGlzZGlnaXQoKHVuc2ln bmVkIGNoYXIpKnApOyBwKyspIHsKKyAgICB2YWwgPSB2YWwgKiAxMCArICgqcCAtICcwJyk7Cisg ICAgaWYgKHZhbCA+IElOVF9NQVgpIHsKKyAgICAgIHJldHVybiAwOyAvLyBvdmVyZmxvd2VkCisg ICAgfQorICB9CisgICpyZXQgPSAoaW50KXZhbDsKKyAgcmV0dXJuIHAgLSBwcDsKK30KKworLy8g UmVhZCBhIGRhdGUgYXMgWVlZWS1NTS1ERCBmcm9tIHBbXS4gUmV0dXJuICNieXRlcyBjb25zdW1l ZC4KK3N0YXRpYyBpbnQgcmVhZF9kYXRlKGNvbnN0IGNoYXIgKnAsIGludCAqeWVhciwgaW50ICpt b250aCwgaW50ICpkYXkpIHsKKyAgY29uc3QgY2hhciAqcHAgPSBwOworICBpbnQgbjsKKyAgbiA9 IHJlYWRfaW50KHAsIHllYXIpOworICBpZiAobiAhPSA0IHx8IHBbNF0gIT0gJy0nKSB7CisgICAg cmV0dXJuIDA7CisgIH0KKyAgbiA9IHJlYWRfaW50KHAgKz0gbiArIDEsIG1vbnRoKTsKKyAgaWYg KG4gIT0gMiB8fCBwWzJdICE9ICctJykgeworICAgIHJldHVybiAwOworICB9CisgIG4gPSByZWFk X2ludChwICs9IG4gKyAxLCBkYXkpOworICBpZiAobiAhPSAyKSB7CisgICAgcmV0dXJuIDA7Cisg IH0KKyAgcCArPSAyOworICBhc3NlcnQocCAtIHBwID09IDEwKTsKKyAgcmV0dXJuIHAgLSBwcDsK K30KKworLy8gUmVhZCBhIHRpbWUgYXMgSEg6TU06U1Muc3Vic2VjIGZyb20gcFtdLiBSZXR1cm4g I2J5dGVzIGNvbnN1bWVkLgorc3RhdGljIGludCByZWFkX3RpbWUoY29uc3QgY2hhciAqcCwgaW50 ICpob3VyLCBpbnQgKm1pbnV0ZSwgaW50ICpzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICBp bnQgKnVzZWMpIHsKKyAgY29uc3QgY2hhciAqcHAgPSBwOworICBpbnQgbjsKKyAgKmhvdXIgPSAq bWludXRlID0gKnNlY29uZCA9ICp1c2VjID0gMDsKKyAgLy8gc2NhbiBob3VycworICBuID0gcmVh ZF9pbnQocCwgaG91cik7CisgIGlmIChuICE9IDIgfHwgcFsyXSAhPSAnOicpIHsKKyAgICByZXR1 cm4gMDsKKyAgfQorICBwICs9IDM7CisKKyAgLy8gc2NhbiBtaW51dGVzCisgIG4gPSByZWFkX2lu dChwLCBtaW51dGUpOworICBpZiAobiAhPSAyKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYg KHBbMl0gIT0gJzonKSB7CisgICAgLy8gc2Vjb25kcyBhcmUgb3B0aW9uYWwgaW4gdjEuMQorICAg IHAgKz0gMjsKKyAgICByZXR1cm4gcCAtIHBwOworICB9CisgIHAgKz0gMzsKKworICAvLyBzY2Fu IHNlY29uZHMKKyAgbiA9IHJlYWRfaW50KHAsIHNlY29uZCk7CisgIGlmIChuICE9IDIpIHsKKyAg ICByZXR1cm4gMDsKKyAgfQorICBwICs9IDI7CisKKyAgaWYgKCpwICE9ICcuJykgeworICAgIHJl dHVybiBwIC0gcHA7CisgIH0KKyAgcCsrOyAvLyBza2lwIHRoZSBwZXJpb2QKKyAgaWYgKCFpc2Rp Z2l0KCh1bnNpZ25lZCBjaGFyKSpwKSkgeworICAgIC8vIHRyYWlsaW5nIHBlcmlvZAorICAgIHJl dHVybiAwOworICB9CisgIGludCBtaWNyb19mYWN0b3IgPSAxMDAwMDA7CisgIHdoaWxlIChpc2Rp Z2l0KCh1bnNpZ25lZCBjaGFyKSpwKSAmJiBtaWNyb19mYWN0b3IpIHsKKyAgICAqdXNlYyArPSAo KnAgLSAnMCcpICogbWljcm9fZmFjdG9yOworICAgIG1pY3JvX2ZhY3RvciAvPSAxMDsKKyAgICBw Kys7CisgIH0KKyAgd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnApKQorICAgIHArKzsg Ly8gY29uc3VtZSBleHRyYSBzdWItbWljcm9zZWNvbmQgZGlnaXRzCisgIHJldHVybiBwIC0gcHA7 Cit9CisKKy8vIFJlYWRzIGEgdGltZXpvbmUgZnJvbSBwW10uIFJldHVybiAjYnl0ZXMgY29uc3Vt ZWQuCisvLyB0emhvdXJzIGFuZCB0em1pbnV0ZXMgcmVzdHJpY3RlZCB0byAyLWNoYXIgaW50ZWdl cnMgb25seS4KK3N0YXRpYyBpbnQgcmVhZF90em9uZShjb25zdCBjaGFyICpwLCBjaGFyICp0enNp Z24sIGludCAqdHpob3VyLCBpbnQgKnR6bWludXRlKSB7CisgIGNvbnN0IGNoYXIgKnBwID0gcDsK KworICAvLyBEZWZhdWx0IHZhbHVlcworICAqdHpob3VyID0gKnR6bWludXRlID0gMDsKKyAgKnR6 c2lnbiA9ICcrJzsKKworICAvLyBMb29rIGZvciBadWx1CisgIGlmICgqcCA9PSAnWicgfHwgKnAg PT0gJ3onKSB7CisgICAgcmV0dXJuIDE7IC8vIGRvbmUhIHR6IGlzICswMDowMC4KKyAgfQorCisg IC8vIExvb2sgZm9yICsvLQorICAqdHpzaWduID0gKnArKzsKKyAgaWYgKCEoKnR6c2lnbiA9PSAn KycgfHwgKnR6c2lnbiA9PSAnLScpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBMb29r IGZvciBISDpNTQorICBpbnQgbjsKKyAgbiA9IHJlYWRfaW50KHAsIHR6aG91cik7CisgIGlmIChu ICE9IDIgfHwgcFsyXSAhPSAnOicpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBuID0gcmVhZF9p bnQocCArPSAzLCB0em1pbnV0ZSk7CisgIGlmIChuICE9IDIpIHsKKyAgICByZXR1cm4gMDsKKyAg fQorICBwICs9IDI7CisgIHJldHVybiBwIC0gcHA7Cit9CisKKy8vIFNjYW4gaGg6bW06c3MueHh4 eHgKK3N0YXRpYyBpbnQgc2Nhbl90aW1lKHNjYW5uZXJfdCAqc3AsIHRva2VuX3QgKnRvaykgewor ICBpbnQgbGluZW5vID0gc3AtPmxpbmVubzsKKyAgY2hhciBidWZmZXJbMjBdOworICBzY2FuX2Nv cHlzdHIoc3AsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgIGNoYXIgKnAgPSBidWZmZXI7 CisgIGludCBob3VyLCBtaW51dGUsIHNlYywgdXNlYzsKKyAgaW50IGxlbiA9IHJlYWRfdGltZShw LCAmaG91ciwgJm1pbnV0ZSwgJnNlYywgJnVzZWMpOworICBpZiAobGVuID09IDApIHsKKyAgICBy ZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIGxpbmVubywgImludmFsaWQgdGltZSIpOworICB9Cisg IGlmICghaXNfdmFsaWRfdGltZShob3VyLCBtaW51dGUsIHNlYywgdXNlYykpIHsKKyAgICByZXR1 cm4gU0VURVJST1Ioc3AtPmVidWYsIGxpbmVubywgImludmFsaWQgdGltZSIpOworICB9CisKKyAg KnRvayA9IG1rdG9rZW4oc3AsIFRPS19USU1FKTsKKyAgdG9rLT5zdHIubGVuID0gbGVuOworICBz cC0+Y3VyICs9IGxlbjsKKyAgdG9rLT51LnRzdmFsLnllYXIgPSAtMTsKKyAgdG9rLT51LnRzdmFs Lm1vbnRoID0gLTE7CisgIHRvay0+dS50c3ZhbC5kYXkgPSAtMTsKKyAgdG9rLT51LnRzdmFsLmhv dXIgPSBob3VyOworICB0b2stPnUudHN2YWwubWludXRlID0gbWludXRlOworICB0b2stPnUudHN2 YWwuc2VjID0gc2VjOworICB0b2stPnUudHN2YWwudXNlYyA9IHVzZWM7CisgIHRvay0+dS50c3Zh bC50eiA9IC0xOworICByZXR1cm4gMDsKK30KKworLy8gU2NhbiBhIHRpbWUsIGEgZGF0ZSwgYSBk YXRldGltZSwgb3IgYSBkYXRhdGltZXR6CitzdGF0aWMgaW50IHNjYW5fdGltZXN0YW1wKHNjYW5u ZXJfdCAqc3AsIHRva2VuX3QgKnRvaykgeworICBpbnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwg bWludXRlLCBzZWMsIHVzZWMsIHR6OworICB5ZWFyID0gbW9udGggPSBkYXkgPSBob3VyID0gbWlu dXRlID0gc2VjID0gdXNlYyA9IHR6ID0gLTE7CisKKyAgaW50IG47CisgIC8vIG1ha2UgYSBjb3B5 IG9mIHNwLT5jdXIgaW50byBidWZmZXIgdG8gZW5zdXJlIE5VTCB0ZXJtaW5hdGVkIHN0cmluZwor ICBjaGFyIGJ1ZmZlcls4MF07CisgIHNjYW5fY29weXN0cihzcCwgYnVmZmVyLCBzaXplb2YoYnVm ZmVyKSk7CisKKyAgdG9rdHlwX3QgdG9rdHlwID0gVE9LX0ZJTjsKKyAgaW50IGxpbmVubyA9IHNw LT5saW5lbm87CisKKyAgLy8gU2VlIGlmIHRoaXMgYSBUSU1FIG9ubHkKKyAgY29uc3QgY2hhciAq cCA9IGJ1ZmZlcjsKKyAgaWYgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpcFswXSkgJiYgaXNkaWdp dCgodW5zaWduZWQgY2hhcilwWzFdKSAmJgorICAgICAgcFsyXSA9PSAnOicpIHsKKyAgICBuID0g cmVhZF90aW1lKGJ1ZmZlciwgJmhvdXIsICZtaW51dGUsICZzZWMsICZ1c2VjKTsKKyAgICBpZiAo IW4pIHsKKyAgICAgIHJldHVybiBTRVRFUlJPUihzcC0+ZWJ1ZiwgbGluZW5vLCAiaW52YWxpZCB0 aW1lIik7CisgICAgfQorICAgIHRva3R5cCA9IFRPS19USU1FOworICAgIHAgKz0gbjsKKyAgICBn b3RvIGRvbmU7CisgIH0KKworICAvLyBUcnkgcmVhZGluZyBhIERBVEUKKyAgbiA9IHJlYWRfZGF0 ZShwLCAmeWVhciwgJm1vbnRoLCAmZGF5KTsKKyAgaWYgKCFuKSB7CisgICAgcmV0dXJuIFNFVEVS Uk9SKHNwLT5lYnVmLCBsaW5lbm8sICJpbnZhbGlkIGRhdGUiKTsKKyAgfQorICB0b2t0eXAgPSBU T0tfREFURTsKKyAgcCArPSBuOworCisgIC8vIENoZWNrIGlmIHRoZXJlIGlzIG5vIHRpbWUgY29t cG9uZW50IGluIGFkZGl0aW9uCisgIGlmICghKChwWzBdID09ICdUJyB8fCBwWzBdID09ICcgJyB8 fCBwWzBdID09ICd0JykgJiYKKyAgICAgICAgaXNkaWdpdCgodW5zaWduZWQgY2hhcilwWzFdKSAm JiBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKXBbMl0pICYmCisgICAgICAgIHBbM10gPT0gJzonKSkg eworICAgIGdvdG8gZG9uZTsgLy8gbm8gVElNRSBjb21wb25lbnQuIHdlIGFyZSBkb25lLgorICB9 CisKKyAgLy8gUmVhZCB0aGUgVElNRQorICBuID0gcmVhZF90aW1lKHAgKz0gMSwgJmhvdXIsICZt aW51dGUsICZzZWMsICZ1c2VjKTsKKyAgaWYgKCFuKSB7CisgICAgcmV0dXJuIFNFVEVSUk9SKHNw LT5lYnVmLCBsaW5lbm8sICJpbnZhbGlkIHRpbWVzdGFtcCIpOworICB9CisgIHRva3R5cCA9IFRP S19EQVRFVElNRTsKKyAgcCArPSBuOworCisgIC8vIFJlYWQgdGhlIChvcHRpb25hbCkgdGltZXpv bmUKKyAgY2hhciB0enNpZ247CisgIGludCB0emhvdXIsIHR6bWludXRlOworICBuID0gcmVhZF90 em9uZShwLCAmdHpzaWduLCAmdHpob3VyLCAmdHptaW51dGUpOworICBpZiAobiA9PSAwKSB7Cisg ICAgZ290byBkb25lOyAvLyBkYXRldGltZSBvbmx5CisgIH0KKyAgdG9rdHlwID0gVE9LX0RBVEVU SU1FVFo7CisgIHAgKz0gbjsKKworICAvLyBDaGVjayB0em1pbnV0ZSByYW5nZS4gVGhpcyBtdXN0 IGJlIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGlzX3ZhbGlkX3RpbWV6b25lKCkKKyAgLy8gYmVjYXVz ZSB3ZSBjb21iaW5lIHR6aG91ciBhbmQgdHptaW51dGUgaW50byB0eiAoYnkgbWludXRlcyBvbmx5 KS4KKyAgaWYgKCEoMCA8PSB0em1pbnV0ZSAmJiB0em1pbnV0ZSA8IDYwKSkgeworICAgIHJldHVy biBTRVRFUlJPUihzcC0+ZWJ1ZiwgbGluZW5vLCAiaW52YWxpZCB0aW1lem9uZSIpOworICB9Cisg IHR6ID0gKHR6aG91ciAqIDYwICsgdHptaW51dGUpICogKHR6c2lnbiA9PSAnLScgPyAtMSA6IDEp OworICBnb3RvIGRvbmU7IC8vIGRhdGV0aW1ldHoKKworZG9uZToKKyAgKnRvayA9IG1rdG9rZW4o c3AsIHRva3R5cCk7CisgIG4gPSBwIC0gYnVmZmVyOworICB0b2stPnN0ci5sZW4gPSBuOworICBz cC0+Y3VyICs9IG47CisKKyAgdG9rLT51LnRzdmFsLnllYXIgPSB5ZWFyOworICB0b2stPnUudHN2 YWwubW9udGggPSBtb250aDsKKyAgdG9rLT51LnRzdmFsLmRheSA9IGRheTsKKyAgdG9rLT51LnRz dmFsLmhvdXIgPSBob3VyOworICB0b2stPnUudHN2YWwubWludXRlID0gbWludXRlOworICB0b2st PnUudHN2YWwuc2VjID0gc2VjOworICB0b2stPnUudHN2YWwudXNlYyA9IHVzZWM7CisgIHRvay0+ dS50c3ZhbC50eiA9IHR6OworCisgIC8vIERvIHNvbWUgZXJyb3IgY2hlY2tzIGJhc2VkIG9uIHR5 cGUKKyAgc3dpdGNoICh0b2stPnRva3R5cCkgeworICBjYXNlIFRPS19USU1FOgorICAgIGlmICgh aXNfdmFsaWRfdGltZShob3VyLCBtaW51dGUsIHNlYywgdXNlYykpIHsKKyAgICAgIHJldHVybiBT RVRFUlJPUihzcC0+ZWJ1ZiwgbGluZW5vLCAiaW52YWxpZCB0aW1lIik7CisgICAgfQorICAgIGJy ZWFrOworICBjYXNlIFRPS19EQVRFOgorICAgIGlmICghaXNfdmFsaWRfZGF0ZSh5ZWFyLCBtb250 aCwgZGF5KSkgeworICAgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5lbm8sICJpbnZh bGlkIGRhdGUiKTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgVE9LX0RBVEVUSU1FOgorICBj YXNlIFRPS19EQVRFVElNRVRaOgorICAgIGlmICghaXNfdmFsaWRfZGF0ZSh5ZWFyLCBtb250aCwg ZGF5KSkgeworICAgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5lbm8sICJpbnZhbGlk IGRhdGUiKTsKKyAgICB9CisgICAgaWYgKCFpc192YWxpZF90aW1lKGhvdXIsIG1pbnV0ZSwgc2Vj LCB1c2VjKSkgeworICAgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5lbm8sICJpbnZh bGlkIHRpbWUiKTsKKyAgICB9CisgICAgaWYgKHRvay0+dG9rdHlwID09IFRPS19EQVRFVElNRVRa ICYmICFpc192YWxpZF90aW1lem9uZSh0eikpIHsKKyAgICAgIHJldHVybiBTRVRFUlJPUihzcC0+ ZWJ1ZiwgbGluZW5vLCAiaW52YWxpZCB0aW1lem9uZSIpOworICAgIH0KKyAgICBicmVhazsKKyAg ZGVmYXVsdDoKKyAgICBhc3NlcnQoMCk7CisgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBs aW5lbm8sICJpbnRlcm5hbCBlcnJvciIpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKy8vIEdp dmVuIGEgdG9tbCBudW1iZXIgKGludCBhbmQgZmxvYXQpIGluIGJ1ZmZlcltdOgorLy8gICAxLiBz cXVlZXplIG91dCAnXycKKy8vICAgMi4gY2hlY2sgZm9yIHN5bnRheCByZXN0cmljdGlvbnMKK3N0 YXRpYyBpbnQgcHJvY2Vzc19udW1zdHIoY2hhciAqYnVmZmVyLCBpbnQgYmFzZSwgY29uc3QgY2hh ciAqKnJlYXNvbikgeworICAvLyBzcXVlZXplIG91dCBfCisgIGNoYXIgKnEgPSBzdHJjaHIoYnVm ZmVyLCAnXycpOworICBpZiAocSkgeworICAgIGZvciAoaW50IGkgPSBxIC0gYnVmZmVyOyBidWZm ZXJbaV07IGkrKykgeworICAgICAgaWYgKGJ1ZmZlcltpXSAhPSAnXycpIHsKKyAgICAgICAgKnEr KyA9IGJ1ZmZlcltpXTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgbGVm dCA9IChpID09IDApID8gMCA6ICh1bnNpZ25lZCBjaGFyKWJ1ZmZlcltpIC0gMV07CisgICAgICBp bnQgcmlnaHQgPSAodW5zaWduZWQgY2hhcilidWZmZXJbaSArIDFdOworICAgICAgaWYgKCFpc2Rp Z2l0KGxlZnQpICYmICEoYmFzZSA9PSAxNiAmJiBpc19oZXhfY2hhcihsZWZ0KSkpIHsKKyAgICAg ICAgKnJlYXNvbiA9ICJ1bmRlcnNjb3JlIG9ubHkgYWxsb3dlZCBiZXR3ZWVuIGRpZ2l0cyI7Cisg ICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmICghaXNkaWdpdChyaWdodCkgJiYg IShiYXNlID09IDE2ICYmIGlzX2hleF9jaGFyKHJpZ2h0KSkpIHsKKyAgICAgICAgKnJlYXNvbiA9 ICJ1bmRlcnNjb3JlIG9ubHkgYWxsb3dlZCBiZXR3ZWVuIGRpZ2l0cyI7CisgICAgICAgIHJldHVy biAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgKnEgPSAwOworICB9CisKKyAgLy8gZGVjaW1hbCBw b2ludHMgbXVzdCBiZSBzdXJyb3VuZGVkIGJ5IGRpZ2l0cy4gQWxzbywgY29udmVydCB0byBsb3dl cmNhc2UuCisgIGZvciAoaW50IGkgPSAwOyBidWZmZXJbaV07IGkrKykgeworICAgIGlmIChidWZm ZXJbaV0gPT0gJy4nKSB7CisgICAgICBpZiAoaSA9PSAwIHx8ICFpc2RpZ2l0KCh1bnNpZ25lZCBj aGFyKWJ1ZmZlcltpIC0gMV0pIHx8CisgICAgICAgICAgIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIp YnVmZmVyW2kgKyAxXSkpIHsKKyAgICAgICAgKnJlYXNvbiA9ICJkZWNpbWFsIHBvaW50IG11c3Qg YmUgc3Vycm91bmRlZCBieSBkaWdpdHMiOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9Cisg ICAgfSBlbHNlIGlmICgnQScgPD0gYnVmZmVyW2ldICYmIGJ1ZmZlcltpXSA8PSAnWicpIHsKKyAg ICAgIGJ1ZmZlcltpXSA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpYnVmZmVyW2ldKTsKKyAgICB9 CisgIH0KKworICBpZiAoYmFzZSA9PSAxMCkgeworICAgIC8vIGNoZWNrIGZvciBsZWFkaW5nIDA6 ICAnKzAxJyBpcyBhbiBlcnJvciEKKyAgICBxID0gYnVmZmVyOworICAgIHEgKz0gKCpxID09ICcr JyB8fCAqcSA9PSAnLScpID8gMSA6IDA7CisgICAgaWYgKHFbMF0gPT0gJzAnICYmIGlzZGlnaXQo KHVuc2lnbmVkIGNoYXIpcVsxXSkpIHsKKyAgICAgICpyZWFzb24gPSAibGVhZGluZyAwIGluIG51 bWJlcnMiOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHJldHVybiAwOworfQor CitzdGF0aWMgaW50IHNjYW5fZmxvYXQoc2Nhbm5lcl90ICpzcCwgdG9rZW5fdCAqdG9rKSB7Cisg IGNoYXIgYnVmZmVyWzUwXTsgLy8gbmVlZCB0byBhY2NvbW1vZGF0ZSAiOV8wMDdfMTk5XzI1NF83 NDBfOTkxLjAiCisgIHNjYW5fY29weXN0cihzcCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisK KyAgaW50IGxpbmVubyA9IHNwLT5saW5lbm87CisgIGNoYXIgKnAgPSBidWZmZXI7CisgIHAgKz0g KCpwID09ICcrJyB8fCAqcCA9PSAnLScpID8gMSA6IDA7CisgIGlmICgwID09IG1lbWNtcChwLCAi bmFuIiwgMykgfHwgKDAgPT0gbWVtY21wKHAsICJpbmYiLCAzKSkpIHsKKyAgICBwICs9IDM7Cisg IH0gZWxzZSB7CisgICAgcCArPSBzdHJzcG4ocCwgIl8wMTIzNDU2Nzg5ZUUuKy0iKTsKKyAgfQor ICBpbnQgbGVuID0gcCAtIGJ1ZmZlcjsKKyAgYnVmZmVyW2xlbl0gPSAwOworCisgIGNvbnN0IGNo YXIgKnJlYXNvbjsKKyAgaWYgKHByb2Nlc3NfbnVtc3RyKGJ1ZmZlciwgMTAsICZyZWFzb24pKSB7 CisgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5lbm8sICIlcyIsIHJlYXNvbik7Cisg IH0KKworICBlcnJubyA9IDA7CisgIGNoYXIgKnE7CisgIGRvdWJsZSBmcDY0ID0gc3RydG9kKGJ1 ZmZlciwgJnEpOworICBpZiAoZXJybm8gfHwgKnEgfHwgcSA9PSBidWZmZXIpIHsKKyAgICByZXR1 cm4gU0VURVJST1Ioc3AtPmVidWYsIGxpbmVubywgImVycm9yIHBhcnNpbmcgZmxvYXQiKTsKKyAg fQorCisgICp0b2sgPSBta3Rva2VuKHNwLCBUT0tfRkxPQVQpOworICB0b2stPnUuZnA2NCA9IGZw NjQ7CisgIHRvay0+c3RyLmxlbiA9IGxlbjsKKyAgc3AtPmN1ciArPSBsZW47CisgIHJldHVybiAw OworfQorCitzdGF0aWMgaW50IHNjYW5fbnVtYmVyKHNjYW5uZXJfdCAqc3AsIHRva2VuX3QgKnRv aykgeworICBjb25zdCBjaGFyICpyZWFzb247CisgIGNoYXIgYnVmZmVyWzUwXTsgLy8gbmVlZCB0 byBhY2NvbW1vZGF0ZSAiOV8wMDdfMTk5XzI1NF83NDBfOTkxLjAiCisgIHNjYW5fY29weXN0cihz cCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgY2hhciAqcCA9IGJ1ZmZlcjsKKyAgaW50 IGxpbmVubyA9IHNwLT5saW5lbm87CisgIC8vIHByb2Nlc3MgJTB4LCAlMG8gb3IgJTBiIGludGVn ZXJzCisgIGlmIChwWzBdID09ICcwJykgeworICAgIGNvbnN0IGNoYXIgKnNwYW4gPSAwOworICAg IGludCBiYXNlID0gMDsKKyAgICBzd2l0Y2ggKHBbMV0pIHsKKyAgICBjYXNlICd4JzoKKyAgICAg IGJhc2UgPSAxNjsKKyAgICAgIHNwYW4gPSAiXzAxMjM0NTY3ODlhYmNkZWZBQkNERUYiOworICAg ICAgYnJlYWs7CisgICAgY2FzZSAnbyc6CisgICAgICBiYXNlID0gODsKKyAgICAgIHNwYW4gPSAi XzAxMjM0NTY3IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ2InOgorICAgICAgYmFzZSA9IDI7 CisgICAgICBzcGFuID0gIl8wMSI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGJhc2Up IHsKKyAgICAgIHAgKz0gMjsKKyAgICAgIHAgKz0gc3Ryc3BuKHAsIHNwYW4pOworICAgICAgaW50 IGxlbiA9IHAgLSBidWZmZXI7CisgICAgICBidWZmZXJbbGVuXSA9IDA7CisKKyAgICAgIGlmIChw cm9jZXNzX251bXN0cihidWZmZXIgKyAyLCBiYXNlLCAmcmVhc29uKSkgeworICAgICAgICByZXR1 cm4gU0VURVJST1Ioc3AtPmVidWYsIGxpbmVubywgIiVzIiwgcmVhc29uKTsKKyAgICAgIH0KKwor ICAgICAgLy8gdXNlIHN0cnRvbGwgdG8gb2J0YWluIHRoZSB2YWx1ZQorICAgICAgKnRvayA9IG1r dG9rZW4oc3AsIFRPS19JTlRFR0VSKTsKKyAgICAgIGNoYXIgKnE7CisgICAgICBlcnJubyA9IDA7 CisgICAgICB0b2stPnUuaW50NjQgPSBzdHJ0b2xsKGJ1ZmZlciArIDIsICZxLCBiYXNlKTsKKyAg ICAgIGlmIChlcnJubyB8fCAqcSB8fCBxID09IGJ1ZmZlciArIDIpIHsKKyAgICAgICAgcmV0dXJu IFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5lbm8sICJlcnJvciBwYXJzaW5nIGludGVnZXIiKTsKKyAg ICAgIH0KKyAgICAgIHRvay0+c3RyLmxlbiA9IGxlbjsKKyAgICAgIHNwLT5jdXIgKz0gbGVuOwor ICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgLy8gaGFuZGxlIGluZi9uYW4KKyAgaWYg KCpwID09ICcrJyB8fCAqcCA9PSAnLScpIHsKKyAgICBwKys7CisgIH0KKyAgaWYgKCpwID09ICdp JyB8fCAqcCA9PSAnbicpIHsKKyAgICByZXR1cm4gc2Nhbl9mbG9hdChzcCwgdG9rKTsKKyAgfQor CisgIC8vIHJlZ3VsYXIgaW50IG9yIGZsb2F0CisgIHAgPSBidWZmZXI7CisgIHAgKz0gc3Ryc3Bu KHAsICIwMTIzNDU2Nzg5XystLmVFIik7CisgIGludCBsZW4gPSBwIC0gYnVmZmVyOworICBidWZm ZXJbbGVuXSA9IDA7CisKKyAgaWYgKHByb2Nlc3NfbnVtc3RyKGJ1ZmZlciwgMTAsICZyZWFzb24p KSB7CisgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5lbm8sICIlcyIsIHJlYXNvbik7 CisgIH0KKworICAqdG9rID0gbWt0b2tlbihzcCwgVE9LX0lOVEVHRVIpOworICBjaGFyICpxOwor ICBlcnJubyA9IDA7CisgIHRvay0+dS5pbnQ2NCA9IHN0cnRvbGwoYnVmZmVyLCAmcSwgMTApOwor ICBpZiAoZXJybm8gfHwgKnEgfHwgcSA9PSBidWZmZXIpIHsKKyAgICBpZiAoKnEgJiYgc3RyY2hy KCIuZUUiLCAqcSkpIHsKKyAgICAgIHJldHVybiBzY2FuX2Zsb2F0KHNwLCB0b2spOyAvLyB0cnkg dG8gZml0IGEgZmxvYXQKKyAgICB9CisgICAgcmV0dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5l bm8sICJlcnJvciBwYXJzaW5nIGludGVnZXIiKTsKKyAgfQorCisgIHRvay0+c3RyLmxlbiA9IGxl bjsKKyAgc3AtPmN1ciArPSBsZW47CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYW5f Ym9vbChzY2FubmVyX3QgKnNwLCB0b2tlbl90ICp0b2spIHsKKyAgY2hhciBidWZmZXJbMTBdOwor ICBzY2FuX2NvcHlzdHIoc3AsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgIGludCBsaW5l bm8gPSBzcC0+bGluZW5vOworICBib29sIHZhbCA9IGZhbHNlOworICBjb25zdCBjaGFyICpwID0g YnVmZmVyOworICBpZiAoMCA9PSBzdHJuY21wKHAsICJ0cnVlIiwgNCkpIHsKKyAgICB2YWwgPSB0 cnVlOworICAgIHAgKz0gNDsKKyAgfSBlbHNlIGlmICgwID09IHN0cm5jbXAocCwgImZhbHNlIiwg NSkpIHsKKyAgICB2YWwgPSBmYWxzZTsKKyAgICBwICs9IDU7CisgIH0gZWxzZSB7CisgICAgcmV0 dXJuIFNFVEVSUk9SKHNwLT5lYnVmLCBsaW5lbm8sICJpbnZhbGlkIGJvb2xlYW4gdmFsdWUiKTsK KyAgfQorICBpZiAoKnAgJiYgIXN0cmNocigiIyBcclxuXHQsfV0iLCAqcCkpIHsKKyAgICByZXR1 cm4gU0VURVJST1Ioc3AtPmVidWYsIGxpbmVubywgImludmFsaWQgYm9vbGVhbiB2YWx1ZSIpOwor ICB9CisKKyAgaW50IGxlbiA9IHAgLSBidWZmZXI7CisgICp0b2sgPSBta3Rva2VuKHNwLCBUT0tf Qk9PTCk7CisgIHRvay0+dS5iMSA9IHZhbDsKKyAgdG9rLT5zdHIubGVuID0gbGVuOworICBzcC0+ Y3VyICs9IGxlbjsKKyAgcmV0dXJuIDA7Cit9CisKKy8vIENoZWNrIGlmIHRoZSBuZXh0IHRva2Vu IG1heSBiZSBUSU1FCitzdGF0aWMgaW5saW5lIGJvb2wgdGVzdF90aW1lKGNvbnN0IGNoYXIgKnAs IGNvbnN0IGNoYXIgKmVuZHApIHsKKyAgcmV0dXJuICZwWzJdIDwgZW5kcCAmJiBpc2RpZ2l0KCh1 bnNpZ25lZCBjaGFyKXBbMF0pICYmCisgICAgICAgICBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKXBb MV0pICYmIHBbMl0gPT0gJzonOworfQorCisvLyBDaGVjayBpZiB0aGUgbmV4dCB0b2tlbiBtYXkg YmUgREFURQorc3RhdGljIGlubGluZSBib29sIHRlc3RfZGF0ZShjb25zdCBjaGFyICpwLCBjb25z dCBjaGFyICplbmRwKSB7CisgIHJldHVybiAmcFs0XSA8IGVuZHAgJiYgaXNkaWdpdCgodW5zaWdu ZWQgY2hhcilwWzBdKSAmJgorICAgICAgICAgaXNkaWdpdCgodW5zaWduZWQgY2hhcilwWzFdKSAm JiBpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKXBbMl0pICYmCisgICAgICAgICBpc2RpZ2l0KCh1bnNp Z25lZCBjaGFyKXBbM10pICYmIHBbNF0gPT0gJy0nOworfQorCisvLyBDaGVjayBpZiB0aGUgbmV4 dCB0b2tlbiBtYXkgYmUgQk9PTAorc3RhdGljIGlubGluZSBib29sIHRlc3RfYm9vbChjb25zdCBj aGFyICpwLCBjb25zdCBjaGFyICplbmRwKSB7CisgIHJldHVybiAmcFswXSA8IGVuZHAgJiYgKCpw ID09ICd0JyB8fCAqcCA9PSAnZicpOworfQorCisvLyBDaGVjayBpZiB0aGUgbmV4dCB0b2tlbiBt YXkgYmUgTlVNQkVSCitzdGF0aWMgYm9vbCB0ZXN0X251bWJlcihjb25zdCBjaGFyICpwLCBjb25z dCBjaGFyICplbmRwKSB7CisgIGlmICgmcFswXSA8IGVuZHAgJiYgKnAgJiYgc3RyY2hyKCIwMTIz NDU2Nzg5Ky0uXyIsICpwKSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICgmcFsyXSA8 IGVuZHApIHsKKyAgICBpZiAoMCA9PSBtZW1jbXAocCwgIm5hbiIsIDMpIHx8IDAgPT0gbWVtY21w KHAsICJpbmYiLCAzKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVy biBmYWxzZTsKK30KKworLy8gU2NhbiBhIGxpdGVyYWwgdGhhdCBpcyBub3QgYSBzdHJpbmcKK3N0 YXRpYyBpbnQgc2Nhbl9ub25zdHJpbmdfbGl0ZXJhbChzY2FubmVyX3QgKnNwLCB0b2tlbl90ICp0 b2spIHsKKyAgaW50IGxpbmVubyA9IHNwLT5saW5lbm87CisgIGlmICh0ZXN0X3RpbWUoc3AtPmN1 ciwgc3AtPmVuZHApKSB7CisgICAgcmV0dXJuIHNjYW5fdGltZShzcCwgdG9rKTsKKyAgfQorCisg IGlmICh0ZXN0X2RhdGUoc3AtPmN1ciwgc3AtPmVuZHApKSB7CisgICAgcmV0dXJuIHNjYW5fdGlt ZXN0YW1wKHNwLCB0b2spOworICB9CisKKyAgaWYgKHRlc3RfYm9vbChzcC0+Y3VyLCBzcC0+ZW5k cCkpIHsKKyAgICByZXR1cm4gc2Nhbl9ib29sKHNwLCB0b2spOworICB9CisKKyAgaWYgKHRlc3Rf bnVtYmVyKHNwLT5jdXIsIHNwLT5lbmRwKSkgeworICAgIHJldHVybiBzY2FuX251bWJlcihzcCwg dG9rKTsKKyAgfQorICByZXR1cm4gU0VURVJST1Ioc3AtPmVidWYsIGxpbmVubywgImludmFsaWQg dmFsdWUiKTsKK30KKworLy8gUmV0dXJuIHRydWUgaWYgVW5pY29kZSBjb2RlcG9pbnQgaXMgYWxs b3dlZCBpbiBhIFRPTUwgMS4xIGJhcmUga2V5LgorLy8gUmFuZ2VzIHRha2VuIHZlcmJhdGltIGZy b20gdGhlIFRPTUwgMS4xIHNwZWMgZ3JhbW1hciBmb3IgYmFyZS1rZXktY2hhci4KK3N0YXRpYyBi b29sIGlzX3VuaWNvZGVfYmFyZV9rZXlfY2hhcih1aW50MzJfdCBjcCkgeworICBpZiAoY3AgPT0g MHhCMiB8fCBjcCA9PSAweEIzIHx8IGNwID09IDB4QjkpCisgICAgcmV0dXJuIHRydWU7CisgIGlm ICgweEJDIDw9IGNwICYmIGNwIDw9IDB4QkUpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICgweEMw IDw9IGNwICYmIGNwIDw9IDB4RDYpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICgweEQ4IDw9IGNw ICYmIGNwIDw9IDB4RjYpCisgICAgcmV0dXJuIHRydWU7CisgIGlmICgweEY4IDw9IGNwICYmIGNw IDw9IDB4MzdEKQorICAgIHJldHVybiB0cnVlOworICBpZiAoMHgzN0YgPD0gY3AgJiYgY3AgPD0g MHgxRkZGKQorICAgIHJldHVybiB0cnVlOworICBpZiAoY3AgPT0gMHgyMDBDIHx8IGNwID09IDB4 MjAwRCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKDB4MjAzRiA8PSBjcCAmJiBjcCA8PSAweDIw NDApCisgICAgcmV0dXJuIHRydWU7CisgIGlmICgweDIwNzAgPD0gY3AgJiYgY3AgPD0gMHgyMThG KQorICAgIHJldHVybiB0cnVlOworICBpZiAoMHgyNDYwIDw9IGNwICYmIGNwIDw9IDB4MjRGRikK KyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKDB4MkMwMCA8PSBjcCAmJiBjcCA8PSAweDJGRUYpCisg ICAgcmV0dXJuIHRydWU7CisgIGlmICgweDMwMDEgPD0gY3AgJiYgY3AgPD0gMHhEN0ZGKQorICAg IHJldHVybiB0cnVlOworICBpZiAoMHhGOTAwIDw9IGNwICYmIGNwIDw9IDB4RkRDRikKKyAgICBy ZXR1cm4gdHJ1ZTsKKyAgaWYgKDB4RkRGMCA8PSBjcCAmJiBjcCA8PSAweEZGRkQpCisgICAgcmV0 dXJuIHRydWU7CisgIGlmICgweDEwMDAwIDw9IGNwICYmIGNwIDw9IDB4RUZGRkYpCisgICAgcmV0 dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gU2NhbiBhIGxpdGVyYWwKK3N0YXRp YyBpbnQgc2Nhbl9saXRlcmFsKHNjYW5uZXJfdCAqc3AsIHRva2VuX3QgKnRvaykgeworICAqdG9r ID0gbWt0b2tlbihzcCwgVE9LX0xJVCk7CisgIGNvbnN0IGNoYXIgKnAgPSBzcC0+Y3VyOworICB3 aGlsZSAocCA8IHNwLT5lbmRwKSB7CisgICAgaWYgKGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKnAp IHx8ICpwID09ICdfJyB8fCAqcCA9PSAnLScpIHsKKyAgICAgIHArKzsKKyAgICAgIGNvbnRpbnVl OworICAgIH0KKyAgICBpZiAoKHVuc2lnbmVkIGNoYXIpKnAgPj0gMHg4MCkgeworICAgICAgdWlu dDMyX3QgY3A7CisgICAgICBpbnQgbiA9IHV0ZjhfdG9fdWNzKHAsIHNwLT5lbmRwIC0gcCwgJmNw KTsKKyAgICAgIGlmIChuID4gMCAmJiBpc191bmljb2RlX2JhcmVfa2V5X2NoYXIoY3ApKSB7Cisg ICAgICAgIHAgKz0gbjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGJy ZWFrOworICB9CisgIHRvay0+c3RyLmxlbiA9IHAgLSB0b2stPnN0ci5wdHI7CisgIHNwLT5jdXIg PSBwOworICByZXR1cm4gMDsKK30KKworLy8gU2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUg c2Nhbm5lcgorc3RhdGljIHNjYW5uZXJfc3RhdGVfdCBzY2FuX21hcmsoc2Nhbm5lcl90ICpzcCkg eworICBzY2FubmVyX3N0YXRlX3QgbWFyazsKKyAgbWFyay5zcCA9IHNwOworICBtYXJrLmN1ciA9 IHNwLT5jdXI7CisgIG1hcmsubGluZW5vID0gc3AtPmxpbmVubzsKKyAgbWFyay5saW5lX3N0YXJ0 ID0gc3AtPmxpbmVfc3RhcnQ7CisgIHJldHVybiBtYXJrOworfQorCisvLyBSZXN0b3JlIHRoZSBz Y2FubmVyIHN0YXRlIHRvIGEgcHJldmlvdXNseSBzYXZlZCBzdGF0ZQorc3RhdGljIHZvaWQgc2Nh bl9yZXN0b3JlKHNjYW5uZXJfdCAqc3AsIHNjYW5uZXJfc3RhdGVfdCBtYXJrKSB7CisgIGFzc2Vy dChtYXJrLnNwID09IHNwKTsKKyAgc3AtPmN1ciA9IG1hcmsuY3VyOworICBzcC0+bGluZW5vID0g bWFyay5saW5lbm87CisgIHNwLT5saW5lX3N0YXJ0ID0gbWFyay5saW5lX3N0YXJ0OworfQorCisv LyBSZXR1cm4gdGhlIG5leHQgdG9rZW4KK3N0YXRpYyBpbnQgc2Nhbl9uZXh0KHNjYW5uZXJfdCAq c3AsIGJvb2wga2V5bW9kZSwgdG9rZW5fdCAqdG9rKSB7CisgIHN0YXRpYyBjb25zdCB0b2t0eXBf dCBtYXBbMTI4XSA9IHsKKyAgICAgIFsnXG4nXSA9IFRPS19FTkRMLCBbJy4nXSA9IFRPS19ET1Qs ICAgIFsnPSddID0gVE9LX0VRVUFMLAorICAgICAgWycsJ10gPSBUT0tfQ09NTUEsIFsneyddID0g VE9LX0xCUkFDRSwgWyd9J10gPSBUT0tfUkJSQUNFfTsKK2FnYWluOgorICAqdG9rID0gbWt0b2tl bihzcCwgVE9LX0ZJTik7CisKKyAgaW50IGNoID0gU19HRVQoKTsKKyAgaWYgKGNoID09IFRPS19G SU4pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHRvay0+c3RyLmxlbiA9IDE7CisgIGlmICgw IDw9IGNoICYmIGNoIDwgMTI4ICYmIG1hcFtjaF0pIHsKKyAgICAvLyBtYXAgc2ltcGxlIGNoYXIg dG8gdG9rZW4gdHlwZSBhbmQgZG9uZQorICAgIHRvay0+dG9rdHlwID0gbWFwW2NoXTsKKyAgICBy ZXR1cm4gMDsKKyAgfQorCisgIC8vIGhhbmRsZSBjaGFyIHRoYXQgcmVxdWlyZSBsb2dpYworICBz d2l0Y2ggKGNoKSB7CisgIGNhc2UgJyAnOgorICBjYXNlICdcdCc6CisgICAgZ290byBhZ2Fpbjsg Ly8gc2tpcCB3aGl0ZXNwYWNlCisKKyAgY2FzZSAnIyc6CisgICAgLy8gY29tbWVudDogc2tpcCB1 bnRpbCBuZXdsaW5lCisgICAgd2hpbGUgKCFTX01BVENIKCdcbicpKSB7CisgICAgICBjaCA9IFNf R0VUKCk7CisgICAgICBpZiAoY2ggPT0gVE9LX0ZJTikKKyAgICAgICAgYnJlYWs7CisgICAgICBp ZiAoKDAgPD0gY2ggJiYgY2ggPD0gMHg4KSB8fCAoMHgwYSA8PSBjaCAmJiBjaCA8PSAweDFmKSB8 fAorICAgICAgICAgIChjaCA9PSAweDdmKSkgeworICAgICAgICByZXR1cm4gU0VURVJST1Ioc3At PmVidWYsIHNwLT5saW5lbm8sICJiYWQgY29udHJvbCBjaGFyIGluIGNvbW1lbnQiKTsKKyAgICAg IH0KKyAgICB9CisgICAgZ290byBhZ2FpbjsgLy8gc2tpcCBjb21tZW50CisKKyAgY2FzZSAnWyc6 CisgICAgdG9rLT50b2t0eXAgPSBUT0tfTEJSQUNLOworICAgIGlmIChrZXltb2RlICYmIFNfTUFU Q0goJ1snKSkgeworICAgICAgU19HRVQoKTsKKyAgICAgIHRvay0+dG9rdHlwID0gVE9LX0xMQlJB Q0s7CisgICAgICB0b2stPnN0ci5sZW4gPSAyOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNl ICddJzoKKyAgICB0b2stPnRva3R5cCA9IFRPS19SQlJBQ0s7CisgICAgaWYgKGtleW1vZGUgJiYg U19NQVRDSCgnXScpKSB7CisgICAgICBTX0dFVCgpOworICAgICAgdG9rLT50b2t0eXAgPSBUT0tf UlJCUkFDSzsKKyAgICAgIHRvay0+c3RyLmxlbiA9IDI7CisgICAgfQorICAgIGJyZWFrOworCisg IGNhc2UgJyInOgorICAgIHNwLT5jdXItLTsKKyAgICBETyhzY2FuX3N0cmluZyhzcCwgdG9rKSk7 CisgICAgYnJlYWs7CisKKyAgY2FzZSAnXCcnOgorICAgIHNwLT5jdXItLTsKKyAgICBETyhzY2Fu X2xpdHN0cmluZyhzcCwgdG9rKSk7CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBzcC0+ Y3VyLS07CisgICAgRE8oa2V5bW9kZSA/IHNjYW5fbGl0ZXJhbChzcCwgdG9rKSA6IHNjYW5fbm9u c3RyaW5nX2xpdGVyYWwoc3AsIHRvaykpOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIDA7 Cit9CisKKy8vIENoZWNrIGZvciBzdGFjayBvdmVyZmxvdyBkdWUgdG8gZXhjZXNzaXZlIG51bWJl ciBvZiBicmFja2V0cyBvciBicmFjZXMKK3N0YXRpYyBpbnQgY2hlY2tfb3ZlcmZsb3coc2Nhbm5l cl90ICpzcCwgdG9rZW5fdCAqdG9rKSB7CisgIHN3aXRjaCAodG9rLT50b2t0eXApIHsKKyAgY2Fz ZSBUT0tfTEJSQUNLOgorICAgIHNwLT5icmFja2V0X2xldmVsKys7CisgICAgaWYgKHNwLT5icmFj a2V0X2xldmVsID4gQlJBQ0tFVF9MRVZFTF9NQVgpIHsKKyAgICAgIHJldHVybiBTRVRFUlJPUihz cC0+ZWJ1Ziwgc3AtPmxpbmVubywgInN0YWNrIG92ZXJmbG93Iik7CisgICAgfQorICAgIGJyZWFr OworICBjYXNlIFRPS19SQlJBQ0s6CisgICAgc3AtPmJyYWNrZXRfbGV2ZWwtLTsKKyAgICBicmVh azsKKyAgY2FzZSBUT0tfTEJSQUNFOgorICAgIHNwLT5icmFjZV9sZXZlbCsrOworICAgIGlmIChz cC0+YnJhY2VfbGV2ZWwgPiBCUkFDRV9MRVZFTF9NQVgpIHsKKyAgICAgIHJldHVybiBTRVRFUlJP UihzcC0+ZWJ1Ziwgc3AtPmxpbmVubywgInN0YWNrIG92ZXJmbG93Iik7CisgICAgfQorICAgIGJy ZWFrOworICBjYXNlIFRPS19SQlJBQ0U6CisgICAgc3AtPmJyYWNlX2xldmVsLS07CisgICAgYnJl YWs7CisgIGRlZmF1bHQ6CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgc2Nhbl9rZXkoc2Nhbm5lcl90ICpzcCwgdG9rZW5fdCAqdG9rKSB7CisgIGlmIChzcC0+ ZXJybXNnKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmIChzY2FuX25leHQoc3AsIHRydWUs IHRvaykgfHwgY2hlY2tfb3ZlcmZsb3coc3AsIHRvaykpIHsKKyAgICBzcC0+ZXJybXNnID0gc3At PmVidWYucHRyOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBzY2FuX3ZhbHVlKHNjYW5uZXJfdCAqc3AsIHRva2VuX3QgKnRvaykgeworICBpZiAoc3At PmVycm1zZykgeworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoc2Nhbl9uZXh0KHNwLCBmYWxz ZSwgdG9rKSB8fCBjaGVja19vdmVyZmxvdyhzcCwgdG9rKSkgeworICAgIHNwLT5lcnJtc2cgPSBz cC0+ZWJ1Zi5wdHI7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQorCisvKioK KyAqIENvbnZlcnQgYSBjaGFyIGluIHV0ZjggaW50byBVQ1MsIGFuZCBzdG9yZSBpdCBpbiAqcmV0 LgorICogUmV0dXJuICNieXRlcyBjb25zdW1lZCBvciAtMSBvbiBmYWlsdXJlLgorICovCitzdGF0 aWMgaW50IHV0ZjhfdG9fdWNzKGNvbnN0IGNoYXIgKm9yaWcsIGludCBsZW4sIHVpbnQzMl90ICpy ZXQpIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIg KilvcmlnOworICB1bnNpZ25lZCBpID0gKmJ1ZisrOworICB1aW50MzJfdCB2OworCisgIC8qIDB4 MDAwMDAwMDAgLSAweDAwMDAwMDdGOgorICAgICAweHh4eHh4eAorICAqLworICBpZiAoMCA9PSAo aSA+PiA3KSkgeworICAgIGlmIChsZW4gPCAxKQorICAgICAgcmV0dXJuIC0xOworICAgIHYgPSBp OworICAgIHJldHVybiAqcmV0ID0gdiwgMTsKKyAgfQorICAvKiAweDAwMDAwMDgwIC0gMHgwMDAw MDdGRjoKKyAgICAgMTEweHh4eHggMTB4eHh4eHgKKyAgKi8KKyAgaWYgKDB4NiA9PSAoaSA+PiA1 KSkgeworICAgIGlmIChsZW4gPCAyKQorICAgICAgcmV0dXJuIC0xOworICAgIHYgPSBpICYgMHgx ZjsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDE7IGorKykgeworICAgICAgaSA9ICpidWYrKzsK KyAgICAgIGlmICgweDIgIT0gKGkgPj4gNikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIHYg PSAodiA8PCA2KSB8IChpICYgMHgzZik7CisgICAgfQorICAgIHJldHVybiAqcmV0ID0gdiwgKGNv bnN0IGNoYXIgKilidWYgLSBvcmlnOworICB9CisKKyAgLyogMHgwMDAwMDgwMCAtIDB4MDAwMEZG RkY6CisgICAgIDExMTB4eHh4IDEweHh4eHh4IDEweHh4eHh4CisgICovCisgIGlmICgweEUgPT0g KGkgPj4gNCkpIHsKKyAgICBpZiAobGVuIDwgMykKKyAgICAgIHJldHVybiAtMTsKKyAgICB2ID0g aSAmIDB4MEY7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgIGkgPSAq YnVmKys7CisgICAgICBpZiAoMHgyICE9IChpID4+IDYpKQorICAgICAgICByZXR1cm4gLTE7Cisg ICAgICB2ID0gKHYgPDwgNikgfCAoaSAmIDB4M2YpOworICAgIH0KKyAgICByZXR1cm4gKnJldCA9 IHYsIChjb25zdCBjaGFyICopYnVmIC0gb3JpZzsKKyAgfQorCisgIC8qIDB4MDAwMTAwMDAgLSAw eDAwMUZGRkZGOgorICAgICAxMTExMHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eAorICAq LworICBpZiAoMHgxRSA9PSAoaSA+PiAzKSkgeworICAgIGlmIChsZW4gPCA0KQorICAgICAgcmV0 dXJuIC0xOworICAgIHYgPSBpICYgMHgwNzsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGor KykgeworICAgICAgaSA9ICpidWYrKzsKKyAgICAgIGlmICgweDIgIT0gKGkgPj4gNikpCisgICAg ICAgIHJldHVybiAtMTsKKyAgICAgIHYgPSAodiA8PCA2KSB8IChpICYgMHgzZik7CisgICAgfQor ICAgIHJldHVybiAqcmV0ID0gdiwgKGNvbnN0IGNoYXIgKilidWYgLSBvcmlnOworICB9CisKKyAg aWYgKDApIHsKKyAgICAvLyBOT1RFOiB0aGVzZSBjb2RlIHBvaW50cyB0YWtpbmcgbW9yZSB0aGFu IDQgYnl0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKworICAgIC8qIDB4MDAyMDAwMDAgLSAweDAzRkZG RkZGOgorICAgICAgIDExMTExMHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4 CisgICAgKi8KKyAgICBpZiAoMHgzRSA9PSAoaSA+PiAyKSkgeworICAgICAgaWYgKGxlbiA8IDUp CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIHYgPSBpICYgMHgwMzsKKyAgICAgIGZvciAoaW50 IGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIGkgPSAqYnVmKys7CisgICAgICAgIGlmICgw eDIgIT0gKGkgPj4gNikpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB2ID0gKHYgPDwg NikgfCAoaSAmIDB4M2YpOworICAgICAgfQorICAgICAgcmV0dXJuICpyZXQgPSB2LCAoY29uc3Qg Y2hhciAqKWJ1ZiAtIG9yaWc7CisgICAgfQorCisgICAgLyogMHgwNDAwMDAwMCAtIDB4N0ZGRkZG RkY6CisgICAgICAgMTExMTExMHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgg MTB4eHh4eHgKKyAgICAqLworICAgIGlmICgweDdlID09IChpID4+IDEpKSB7CisgICAgICBpZiAo bGVuIDwgNikKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgdiA9IGkgJiAweDAxOworICAgICAg Zm9yIChpbnQgaiA9IDA7IGogPCA1OyBqKyspIHsKKyAgICAgICAgaSA9ICpidWYrKzsKKyAgICAg ICAgaWYgKDB4MiAhPSAoaSA+PiA2KSkKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHYg PSAodiA8PCA2KSB8IChpICYgMHgzZik7CisgICAgICB9CisgICAgICByZXR1cm4gKnJldCA9IHYs IChjb25zdCBjaGFyICopYnVmIC0gb3JpZzsKKyAgICB9CisgIH0KKworICByZXR1cm4gLTE7Cit9 CisKKy8qKgorICogQ29udmVydCBhIFVDUyBjaGFyIHRvIHV0ZjggY29kZSwgYW5kIHJldHVybiBp dCBpbiBidWYuCisgKiBSZXR1cm4gI2J5dGVzIHVzZWQgaW4gYnVmIHRvIGVuY29kZSB0aGUgY2hh ciwgb3IKKyAqIC0xIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IHVjc190b191dGY4KHVpbnQz Ml90IGNvZGUsIGNoYXIgYnVmWzRdKSB7CisgIC8qIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9x dWVzdGlvbnMvNjI0MDA1NS9tYW51YWxseS1jb252ZXJ0aW5nLXVuaWNvZGUtY29kZXBvaW50cy1p bnRvLXV0Zi04LWFuZC11dGYtMTYKKyAgICovCisgIC8qIFRoZSBVQ1MgY29kZSB2YWx1ZXMgMHhk ODAw4oCTMHhkZmZmIChVVEYtMTYgc3Vycm9nYXRlcykgYXMgd2VsbAorICAgKiBhcyAweGZmZmUg YW5kIDB4ZmZmZiAoVUNTIG5vbmNoYXJhY3RlcnMpIHNob3VsZCBub3QgYXBwZWFyIGluCisgICAq IGNvbmZvcm1pbmcgVVRGLTggc3RyZWFtcy4KKyAgICovCisgIC8qCisgICAqICBodHRwczovL2dp dGh1Yi5jb20vdG9tbC1sYW5nL3RvbWwtdGVzdC9pc3N1ZXMvMTY1CisgICAqICBbMHhkODAwLCAw eGRmZmZdIGFuZCBbMHhmZmZlLCAweGZmZmZdIGFyZSBpbXBsaWNpdGx5IGFsbG93ZWQgYnkgVE9N TCwgc28KKyAgICogd2UgZGlzYWJsZSB0aGUgY2hlY2suCisgICAqLworICBpZiAoMCkgeworICAg IGlmICgweGQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4ZGZmZikKKyAgICAgIHJldHVybiAtMTsK KyAgICBpZiAoMHhmZmZlIDw9IGNvZGUgJiYgY29kZSA8PSAweGZmZmYpCisgICAgICByZXR1cm4g LTE7CisgIH0KKworICAvKiAweDAwMDAwMDAwIC0gMHgwMDAwMDA3RjoKKyAgICAgMHh4eHh4eHgK KyAgKi8KKyAgaWYgKGNvZGUgPD0gMHg3RikgeworICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFy KWNvZGU7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiAweDAwMDAwMDgwIC0gMHgwMDAwMDdG RjoKKyAgICAgMTEweHh4eHggMTB4eHh4eHgKKyAgKi8KKyAgaWYgKGNvZGUgPD0gMHgwMDAwMDdG RikgeworICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSgweGMwIHwgKGNvZGUgPj4gNikpOwor ICAgIGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgweDgwIHwgKGNvZGUgJiAweDNmKSk7CisgICAg cmV0dXJuIDI7CisgIH0KKworICAvKiAweDAwMDAwODAwIC0gMHgwMDAwRkZGRjoKKyAgICAgMTEx MHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKyAgKi8KKyAgaWYgKGNvZGUgPD0gMHgwMDAwRkZGRikg eworICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSgweGUwIHwgKGNvZGUgPj4gMTIpKTsKKyAg ICBidWZbMV0gPSAodW5zaWduZWQgY2hhcikoMHg4MCB8ICgoY29kZSA+PiA2KSAmIDB4M2YpKTsK KyAgICBidWZbMl0gPSAodW5zaWduZWQgY2hhcikoMHg4MCB8IChjb2RlICYgMHgzZikpOworICAg IHJldHVybiAzOworICB9CisKKyAgLyogMHgwMDAxMDAwMCAtIDB4MDAxRkZGRkY6CisgICAgIDEx MTEweHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4CisgICovCisgIGlmIChjb2RlIDw9IDB4 MDAxRkZGRkYpIHsKKyAgICBidWZbMF0gPSAodW5zaWduZWQgY2hhcikoMHhmMCB8IChjb2RlID4+ IDE4KSk7CisgICAgYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpKDB4ODAgfCAoKGNvZGUgPj4gMTIp ICYgMHgzZikpOworICAgIGJ1ZlsyXSA9ICh1bnNpZ25lZCBjaGFyKSgweDgwIHwgKChjb2RlID4+ IDYpICYgMHgzZikpOworICAgIGJ1ZlszXSA9ICh1bnNpZ25lZCBjaGFyKSgweDgwIHwgKGNvZGUg JiAweDNmKSk7CisgICAgcmV0dXJuIDQ7CisgIH0KKworI2lmZGVmIFVOREVGCisgIGlmICgwKSB7 CisgICAgLy8gTk9URTogdGhlc2UgY29kZSBwb2ludHMgdGFraW5nIG1vcmUgdGhhbiA0IGJ5dGVz IGFyZSBub3Qgc3VwcG9ydGVkCisgICAgLyogMHgwMDIwMDAwMCAtIDB4MDNGRkZGRkY6CisgICAg ICAgMTExMTEweHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHggMTB4eHh4eHgKKyAgICAqLwor ICAgIGlmIChjb2RlIDw9IDB4MDNGRkZGRkYpIHsKKyAgICAgIGJ1ZlswXSA9ICh1bnNpZ25lZCBj aGFyKSgweGY4IHwgKGNvZGUgPj4gMjQpKTsKKyAgICAgIGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFy KSgweDgwIHwgKChjb2RlID4+IDE4KSAmIDB4M2YpKTsKKyAgICAgIGJ1ZlsyXSA9ICh1bnNpZ25l ZCBjaGFyKSgweDgwIHwgKChjb2RlID4+IDEyKSAmIDB4M2YpKTsKKyAgICAgIGJ1ZlszXSA9ICh1 bnNpZ25lZCBjaGFyKSgweDgwIHwgKChjb2RlID4+IDYpICYgMHgzZikpOworICAgICAgYnVmWzRd ID0gKHVuc2lnbmVkIGNoYXIpKDB4ODAgfCAoY29kZSAmIDB4M2YpKTsKKyAgICAgIHJldHVybiA1 OworICAgIH0KKworICAgIC8qIDB4MDQwMDAwMDAgLSAweDdGRkZGRkZGOgorICAgICAgIDExMTEx MTB4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4IDEweHh4eHh4CisgICAgKi8K KyAgICBpZiAoY29kZSA8PSAweDdGRkZGRkZGKSB7CisgICAgICBidWZbMF0gPSAodW5zaWduZWQg Y2hhcikoMHhmYyB8IChjb2RlID4+IDMwKSk7CisgICAgICBidWZbMV0gPSAodW5zaWduZWQgY2hh cikoMHg4MCB8ICgoY29kZSA+PiAyNCkgJiAweDNmKSk7CisgICAgICBidWZbMl0gPSAodW5zaWdu ZWQgY2hhcikoMHg4MCB8ICgoY29kZSA+PiAxOCkgJiAweDNmKSk7CisgICAgICBidWZbM10gPSAo dW5zaWduZWQgY2hhcikoMHg4MCB8ICgoY29kZSA+PiAxMikgJiAweDNmKSk7CisgICAgICBidWZb NF0gPSAodW5zaWduZWQgY2hhcikoMHg4MCB8ICgoY29kZSA+PiA2KSAmIDB4M2YpKTsKKyAgICAg IGJ1Zls1XSA9ICh1bnNpZ25lZCBjaGFyKSgweDgwIHwgKGNvZGUgJiAweDNmKSk7CisgICAgICBy ZXR1cm4gNjsKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiAtMTsKK30KZGlmZiAtLWdp dCBhL3NyYy9pbmNsdWRlL2NvbW1vbi90b21sYzE3LmggYi9zcmMvaW5jbHVkZS9jb21tb24vdG9t bGMxNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4xYmE0YzQ0Nzg2 OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbmNsdWRlL2NvbW1vbi90b21sYzE3LmgKQEAgLTAs MCArMSwyNzcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAyNC0yMDI2LCBDSyBUYW4uCisgKiBodHRw czovL2dpdGh1Yi5jb20vY2t0YW4vdG9tbGMxNy9ibG9iL21haW4vTElDRU5TRQorICovCisKKy8q KgorICogQGZpbGUgdG9tbGMxNy5oCisgKiBAYnJpZWYgQSBUT01MIHBhcnNlciBmb3IgQzE3Lgor ICoKKyAqIFRoaXMgbGlicmFyeSBwcm92aWRlcyBhIHNpbXBsZSBhbmQgZWZmaWNpZW50IHdheSB0 byBwYXJzZSBUT01MIGRvY3VtZW50cworICogaW4gQy4gSXQgc3VwcG9ydHMgc3RhbmRhcmQgVE9N TCBmZWF0dXJlcyBhbmQgcHJvdmlkZXMgYW4gZWFzeS10by11c2UgQVBJCisgKiBmb3IgdHJhdmVy c2luZyB0aGUgcGFyc2VkIGRhdGEuCisgKi8KKworI2lmbmRlZiBUT01MQzE3X0gKKyNkZWZpbmUg VE9NTEMxN19ICisKKy8vIEEgY3J1ZGUgd2F5IHRvIGRldGVybWluZSB2ZXJzaW9uLiBNYW51YWxs eSBjaGFuZ2VkLgorI2RlZmluZSBUT01MQzE3X1JFTEVBU0VfQUZURVIgIjI2MDYxOCIKKworLyoK KyAqICBVU0FHRToKKyAqCisgKiAgMS4gQ2FsbCB0b21sX3BhcnNlKCksIHRvbWxfcGFyc2VfZmls ZSgpLCBvciB0b21sX3BhcnNlX2ZpbGVfZXgoKQorICogIDIuIENoZWNrIHJlc3VsdC5vaworICog IDMuIFVzZSB0b21sX2dldCgpIG9yIHRvbWxfc2VlaygpIHRvIHF1ZXJ5IGFuZCB0cmF2ZXJzZSB0 aGUKKyAqICAgICByZXN1bHQudG9wdGFiCisgKiAgNC4gQ2FsbCB0b21sX2ZyZWUoKSB0byByZWxl YXNlIHJlc291cmNlcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRl IDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNk ZWZpbmUgVE9NTF9FWFRFUk4gZXh0ZXJuICJDIgorI2Vsc2UKKyNkZWZpbmUgVE9NTF9FWFRFUk4g ZXh0ZXJuCisjZW5kaWYKKworLyoqCisgKiBAYnJpZWYgRW51bWVyYXRpb24gb2YgVE9NTCBkYXRh IHR5cGVzLgorICovCitlbnVtIHRvbWxfdHlwZV90IHsKKyAgVE9NTF9VTktOT1dOID0gMCwgLyoq PCBVbmtub3duIG9yIGludmFsaWQgdHlwZSAqLworICBUT01MX1NUUklORywgICAgICAvKio8IFN0 cmluZyB0eXBlICovCisgIFRPTUxfSU5UNjQsICAgICAgIC8qKjwgNjQtYml0IGludGVnZXIgdHlw ZSAqLworICBUT01MX0ZQNjQsICAgICAgICAvKio8IDY0LWJpdCBmbG9hdGluZyBwb2ludCB0eXBl ICovCisgIFRPTUxfQk9PTEVBTiwgICAgIC8qKjwgQm9vbGVhbiB0eXBlICovCisgIFRPTUxfREFU RSwgICAgICAgIC8qKjwgTG9jYWwgZGF0ZSB0eXBlICovCisgIFRPTUxfVElNRSwgICAgICAgIC8q KjwgTG9jYWwgdGltZSB0eXBlICovCisgIFRPTUxfREFURVRJTUUsICAgIC8qKjwgTG9jYWwgZGF0 ZXRpbWUgdHlwZSAqLworICBUT01MX0RBVEVUSU1FVFosICAvKio8IE9mZnNldCBkYXRldGltZSB0 eXBlICovCisgIFRPTUxfQVJSQVksICAgICAgIC8qKjwgQXJyYXkgdHlwZSAqLworICBUT01MX1RB QkxFLCAgICAgICAvKio8IFRhYmxlIHR5cGUgKi8KK307Cit0eXBlZGVmIGVudW0gdG9tbF90eXBl X3QgdG9tbF90eXBlX3Q7CisKKy8qKgorICogQGJyaWVmIFJlcHJlc2VudHMgYSBzaW5nbGUgcGll Y2Ugb2YgVE9NTCBkYXRhLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIGEgbm9kZSBpbiBhIHRy ZWUgdGhhdCByZXByZXNlbnRzIGEgVE9NTCBkb2N1bWVudC4KKyAqIFRoZSBgdWAgdW5pb24gY29u dGFpbnMgdGhlIGFjdHVhbCB2YWx1ZSBiYXNlZCBvbiB0aGUgYHR5cGVgIGZpZWxkLgorICovCit0 eXBlZGVmIHN0cnVjdCB0b21sX2RhdHVtX3QgdG9tbF9kYXR1bV90Oworc3RydWN0IHRvbWxfZGF0 dW1fdCB7CisgIHRvbWxfdHlwZV90IHR5cGU7ICAgLyoqPCBUeXBlIG9mIHRoZSBkYXR1bSAqLwor ICB1aW50MzJfdCBmbGFnOyAgICAgIC8qKjwgSW50ZXJuYWwgZmxhZywgZG8gbm90IHVzZSAqLwor ICBpbnQgbGluZW5vOyAgICAgICAgIC8qKjwgMS1iYXNlZCBzb3VyY2UgbGluZSBudW1iZXIsIDAg aWYgc3ludGhlc2l6ZWQgKi8KKyAgaW50IGNvbG5vOyAgICAgICAgICAvKio8IDEtYmFzZWQgc291 cmNlIGNvbHVtbiBudW1iZXIsIDAgaWYgc3ludGhlc2l6ZWQgKi8KKyAgY29uc3QgY2hhciAqc291 cmNlOyAvKio8IFNvdXJjZSBuYW1lIChlLmcuIGZpbGVuYW1lKSwgTlVMTCBpZiBub3QgcHJvdmlk ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPd25lZCBieSB0aGUgcmVzdWx0OyB2YWxp ZCB1bnRpbCB0b21sX2ZyZWUoKS4gKi8KKyAgdW5pb24geworICAgIGNvbnN0IGNoYXIgKnM7IC8q KjwgU2hvcnRoYW5kIGZvciBzdHIucHRyICovCisgICAgc3RydWN0IHsKKyAgICAgIGNvbnN0IGNo YXIgKnB0cjsgLyoqPCBOVUwgdGVybWluYXRlZCBzdHJpbmcgcG9pbnRlciAqLworICAgICAgaW50 IGxlbjsgLyoqPCBMZW5ndGggb2YgdGhlIHN0cmluZyBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5n IE5VTCAqLworICAgIH0gc3RyOworICAgIGludDY0X3QgaW50NjQ7IC8qKjwgNjQtYml0IGludGVn ZXIgdmFsdWUgKi8KKyAgICBkb3VibGUgZnA2NDsgICAvKio8IDY0LWJpdCBmbG9hdGluZyBwb2lu dCB2YWx1ZSAqLworICAgIGJvb2wgYm9vbGVhbjsgIC8qKjwgQm9vbGVhbiB2YWx1ZSAqLworICAg IHN0cnVjdCB7ICAgICAgIC8qKjwgRGF0ZSBhbmQgdGltZSBjb21wb25lbnRzICovCisgICAgICBp bnQxNl90IHllYXIsIG1vbnRoLCBkYXk7CisgICAgICBpbnQxNl90IGhvdXIsIG1pbnV0ZSwgc2Vj b25kOworICAgICAgaW50MzJfdCB1c2VjOworICAgICAgaW50MTZfdCB0ejsgLyoqPCBUaW1lem9u ZSBvZmZzZXQgaW4gbWludXRlcyAqLworICAgIH0gdHM7CisgICAgc3RydWN0IHsgICAgICAgICAg ICAgIC8qKjwgQXJyYXkgZGF0YSAqLworICAgICAgaW50MzJfdCBzaXplOyAgICAgICAvKio8IE51 bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgKi8KKyAgICAgIHRvbWxfZGF0dW1fdCAqZWxl bTsgLyoqPCBBcnJheSBvZiBlbGVtZW50cyAqLworICAgIH0gYXJyOworICAgIHN0cnVjdCB7ICAg ICAgICAgICAgICAgLyoqPCBUYWJsZSBkYXRhICovCisgICAgICBpbnQzMl90IHNpemU7ICAgICAg ICAvKio8IE51bWJlciBvZiBrZXlzIGluIHRoZSB0YWJsZSAqLworICAgICAgY29uc3QgY2hhciAq KmtleTsgICAgLyoqPCBBcnJheSBvZiBrZXlzICovCisgICAgICBpbnQgKmxlbjsgICAgICAgICAg ICAvKio8IEFycmF5IG9mIGtleSBsZW5ndGhzICovCisgICAgICB0b21sX2RhdHVtX3QgKnZhbHVl OyAvKio8IEFycmF5IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGtleXMgKi8KKyAgICB9IHRh YjsKKyAgfSB1OworfTsKKworLyoqCisgKiBAYnJpZWYgUmVzdWx0IG9mIGEgVE9NTCBwYXJzaW5n IG9wZXJhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdG9tbF9yZXN1bHRfdCB0b21sX3Jlc3Vs dF90Oworc3RydWN0IHRvbWxfcmVzdWx0X3QgeworICBib29sIG9rOyAgICAgICAgICAgICAvKio8 IFRydWUgaWYgcGFyc2luZyB3YXMgc3VjY2Vzc2Z1bCAqLworICB0b21sX2RhdHVtX3QgdG9wdGFi OyAvKio8IFRoZSB0b3AtbGV2ZWwgdGFibGUgKHZhbGlkIGlmIG9rIGlzIHRydWUpICovCisgIGNo YXIgZXJybXNnWzIwMF07ICAgIC8qKjwgRXJyb3IgbWVzc2FnZSAodmFsaWQgaWYgb2sgaXMgZmFs c2UpICovCisgIHZvaWQgKl9faW50ZXJuYWw7ICAgIC8qKjwgSW50ZXJuYWwgc3RhdGUsIGRvIG5v dCB1c2UgKi8KK307CisKKy8qKgorICogQGJyaWVmIFBhcnNlIGEgVE9NTCBkb2N1bWVudCBmcm9t IGEgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzcmMgQSBOVUwtdGVybWluYXRlZCBzdHJpbmcgY29u dGFpbmluZyB0aGUgVE9NTCBkb2N1bWVudC4KKyAqIEBwYXJhbSBsZW4gVGhlIGxlbmd0aCBvZiB0 aGUgc3RyaW5nIChleGNsdWRpbmcgdGhlIE5VTCB0ZXJtaW5hdG9yKS4KKyAqIEByZXR1cm4gQSB0 b21sX3Jlc3VsdF90IHN0cnVjdHVyZS4gTXVzdCBiZSBmcmVlZCB3aXRoIHRvbWxfZnJlZSgpLgor ICoKKyAqIElNUE9SVEFOVDogc3JjW10gbXVzdCBiZSBhIE5VTCB0ZXJtaW5hdGVkIHN0cmluZyEg VGhlIGxlbiBwYXJhbWV0ZXIKKyAqIGRvZXMgbm90IGluY2x1ZGUgdGhlIE5VTCB0ZXJtaW5hdG9y LgorICovCitUT01MX0VYVEVSTiB0b21sX3Jlc3VsdF90IHRvbWxfcGFyc2UoY29uc3QgY2hhciAq c3JjLCBpbnQgbGVuKTsKKworLyoqCisgKiBAYnJpZWYgUGFyc2UgYSBUT01MIGRvY3VtZW50LCB0 YWdnaW5nIGV2ZXJ5IGRhdHVtIHdpdGggYSBzb3VyY2UgbmFtZS4KKyAqCisgKiBAcGFyYW0gc3Jj IEEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFRPTUwgZG9jdW1lbnQuCisg KiBAcGFyYW0gbGVuIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoZXhjbHVkaW5nIHRoZSBOVUwg dGVybWluYXRvcikuCisgKiBAcGFyYW0gbmFtZSBBIHNvdXJjZSBuYW1lIChlLmcuIGZpbGVuYW1l KSBjb3BpZWQgaW50byB0aGUgcmVzdWx0LCBvciBOVUxMLgorICogICAgICAgICAgICAgRXZlcnkg cGFyc2VkIGRhdHVtJ3MgYHNvdXJjZWAgaXMgc2V0IHRvIHRoaXMgbmFtZSAob3IgTlVMTCkuCisg KiBAcmV0dXJuIEEgdG9tbF9yZXN1bHRfdCBzdHJ1Y3R1cmUuIE11c3QgYmUgZnJlZWQgd2l0aCB0 b21sX2ZyZWUoKS4KKyAqCisgKiBJTVBPUlRBTlQ6IHNyY1tdIG11c3QgYmUgYSBOVUwgdGVybWlu YXRlZCBzdHJpbmchIFRoZSBsZW4gcGFyYW1ldGVyCisgKiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBO VUwgdGVybWluYXRvci4KKyAqLworVE9NTF9FWFRFUk4gdG9tbF9yZXN1bHRfdCB0b21sX3BhcnNl X25hbWVkKGNvbnN0IGNoYXIgKnNyYywgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBAYnJpZWYg UGFyc2UgYSBUT01MIGRvY3VtZW50IGZyb20gYSBmaWxlIHBvaW50ZXIuCisgKgorICogQHBhcmFt IGZwIEEgcG9pbnRlciB0byB0aGUgb3BlbiBmaWxlLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxl IGZvciBjbG9zaW5nCisgKiBpdC4KKyAqIEByZXR1cm4gQSB0b21sX3Jlc3VsdF90IHN0cnVjdHVy ZS4gTXVzdCBiZSBmcmVlZCB3aXRoIHRvbWxfZnJlZSgpLgorICoKKyAqIElNUE9SVEFOVDogeW91 IGFyZSBzdGlsbCByZXNwb25zaWJsZSB0byBmY2xvc2UoZnApLgorICovCitUT01MX0VYVEVSTiB0 b21sX3Jlc3VsdF90IHRvbWxfcGFyc2VfZmlsZShGSUxFICpmcCk7CisKKy8qKgorICogQGJyaWVm IFBhcnNlIGEgVE9NTCBkb2N1bWVudCBmcm9tIGEgZmlsZSBwb2ludGVyLCB0YWdnaW5nIGRhdHVt cyB3aXRoIGEgbmFtZS4KKyAqCisgKiBAcGFyYW0gZnAgQSBwb2ludGVyIHRvIHRoZSBvcGVuIGZp bGUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcKKyAqIGl0LgorICogQHBh cmFtIG5hbWUgQSBzb3VyY2UgbmFtZSBjb3BpZWQgaW50byB0aGUgcmVzdWx0LCBvciBOVUxMLgor ICogQHJldHVybiBBIHRvbWxfcmVzdWx0X3Qgc3RydWN0dXJlLiBNdXN0IGJlIGZyZWVkIHdpdGgg dG9tbF9mcmVlKCkuCisgKgorICogSU1QT1JUQU5UOiB5b3UgYXJlIHN0aWxsIHJlc3BvbnNpYmxl IHRvIGZjbG9zZShmcCkuCisgKi8KK1RPTUxfRVhURVJOIHRvbWxfcmVzdWx0X3QgdG9tbF9wYXJz ZV9maWxlX25hbWVkKEZJTEUgKmZwLCBjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBAYnJp ZWYgUGFyc2UgYSBUT01MIGRvY3VtZW50IGZyb20gYSBmaWxlIHBhdGguCisgKgorICogQHBhcmFt IGZuYW1lIFRoZSBwYXRoIHRvIHRoZSBUT01MIGZpbGUuCisgKiBAcmV0dXJuIEEgdG9tbF9yZXN1 bHRfdCBzdHJ1Y3R1cmUuIE11c3QgYmUgZnJlZWQgd2l0aCB0b21sX2ZyZWUoKS4KKyAqLworVE9N TF9FWFRFUk4gdG9tbF9yZXN1bHRfdCB0b21sX3BhcnNlX2ZpbGVfZXgoY29uc3QgY2hhciAqZm5h bWUpOworCisvKioKKyAqIEBicmllZiBSZWxlYXNlIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGEg VE9NTCByZXN1bHQuCisgKgorICogQHBhcmFtIHJlc3VsdCBUaGUgVE9NTCByZXN1bHQgdG8gZnJl ZS4KKyAqLworVE9NTF9FWFRFUk4gdm9pZCB0b21sX2ZyZWUodG9tbF9yZXN1bHRfdCByZXN1bHQp OworCisvKioKKyAqIEBicmllZiBGaW5kIGEgdmFsdWUgZm9yIGEgc3BlY2lmaWMga2V5IGluIGEg VE9NTCB0YWJsZS4KKyAqCisgKiBAcGFyYW0gdGFibGUgVGhlIFRPTUwgdGFibGUgdG8gc2VhcmNo IGluLgorICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvb2sgZm9yLgorICogQHJldHVybiBUaGUg dmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIG9yIGEgZGF0dW0gd2l0aCB0eXBlIFRPTUxf VU5LTk9XTgorICogaWYgbm90IGZvdW5kLgorICovCitUT01MX0VYVEVSTiB0b21sX2RhdHVtX3Qg dG9tbF9nZXQodG9tbF9kYXR1bV90IHRhYmxlLCBjb25zdCBjaGFyICprZXkpOworCisvKioKKyAq IEBicmllZiBMb2NhdGUgYSB2YWx1ZSB1c2luZyBhIG11bHRpcGFydC1rZXkgKGUuZy4sICJhLmIu YyIpLgorICoKKyAqIEBwYXJhbSB0YWJsZSBUaGUgVE9NTCB0YWJsZSB0byBzdGFydCB0aGUgc2Vh cmNoIGZyb20uCisgKiBAcGFyYW0gbXVsdGlwYXJ0X2tleSBBIGRvdC1zZXBhcmF0ZWQga2V5IHN0 cmluZy4gTm8gZXNjYXBlIGNoYXJhY3RlcnMKKyAqIGFsbG93ZWQuIE1heGltdW0gbGVuZ3RoIGlz IDI1NSBieXRlcy4KKyAqIEByZXR1cm4gVGhlIHZhbHVlIGZvdW5kLCBvciBhIGRhdHVtIHdpdGgg dHlwZSBUT01MX1VOS05PV04gaWYgbm90IGZvdW5kLgorICovCitUT01MX0VYVEVSTiB0b21sX2Rh dHVtX3QgdG9tbF9zZWVrKHRvbWxfZGF0dW1fdCB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbXVsdGlwYXJ0X2tleSk7CisKKy8qKgorICogQGJy aWVmIE9CU09MRVRFOiB1c2UgdG9tbF9nZXQoKSBpbnN0ZWFkLgorICogRmluZCBhIGtleSBpbiBh IHRvbWxfdGFibGUuIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGtleSBpZiBmb3VuZCwKKyAqIG9y IGEgVE9NTF9VTktOT1dOIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSB0b21sX2RhdHVt X3QgdG9tbF90YWJsZV9maW5kKHRvbWxfZGF0dW1fdCB0YWJsZSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXkpIHsKKyAgcmV0dXJuIHRv bWxfZ2V0KHRhYmxlLCBrZXkpOworfQorCisvKioKKyAqIEBicmllZiBNZXJnZSB0d28gVE9NTCBy ZXN1bHRzLgorICoKKyAqIEFsbCByZXN1bHRzIChyMSwgcjIsIGFuZCB0aGUgcmV0dXJuZWQgcmVz dWx0KSBtdXN0IGJlIGZyZWVkIGluZGVwZW5kZW50bHkuCisgKgorICogQHBhcmFtIHIxIFRoZSBi YXNlIFRPTUwgcmVzdWx0LgorICogQHBhcmFtIHIyIFRoZSBUT01MIHJlc3VsdCBjb250YWluaW5n IG92ZXJyaWRlcy4KKyAqIEByZXR1cm4gQSBuZXcgdG9tbF9yZXN1bHRfdCByZXByZXNlbnRpbmcg dGhlIG1lcmdlZCBkb2N1bWVudC4KKyAqCisgKiAgTE9HSUM6CisgKiAgIHJldCA9IGNvcHkgb2Yg cjEKKyAqICAgZm9yIGVhY2ggaXRlbSB4IGluIHIyOgorICogICAgIGlmIHggaXMgbm90IGluIHJl dDoKKyAqICAgICAgICAgc2V0IHggaW4gcmV0CisgKiAgICAgZWxpZiB4IGluIHJldCBpcyBOT1Qg b2YgdGhlIHNhbWUgdHlwZToKKyAqICAgICAgICAgb3ZlcnJpZGUKKyAqICAgICBlbGlmIHggaW4g cmV0IGlzIGFuIGFycmF5IG9mIHRhYmxlczoKKyAqICAgICAgICAgYXBwZW5kIHIyLnggdG8gcmV0 LngKKyAqICAgICBlbGlmIHggaW4gcmV0IGlzIGEgdGFibGU6CisgKiAgICAgICAgIG1lcmdlIHIy LnggdG8gcmV0LngKKyAqICAgICBlbHNlOgorICogICAgICAgICBvdmVycmlkZQorICovCitUT01M X0VYVEVSTiB0b21sX3Jlc3VsdF90IHRvbWxfbWVyZ2UoY29uc3QgdG9tbF9yZXN1bHRfdCAqcjEs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9tbF9yZXN1bHRf dCAqcjIpOworCisvKioKKyAqIEBicmllZiBDb21wYXJlIHR3byBUT01MIHJlc3VsdHMgZm9yIGVx dWFsaXR5LgorICoKKyAqIENvbXBhcmlzb24gaXMgc2Vuc2l0aXZlIHRvIHRoZSBvcmRlciBvZiBl bGVtZW50cyBpbiBhcnJheXMgYW5kIHRhYmxlcy4KKyAqCisgKiBAcGFyYW0gcjEgVGhlIGZpcnN0 IFRPTUwgcmVzdWx0LgorICogQHBhcmFtIHIyIFRoZSBzZWNvbmQgVE9NTCByZXN1bHQuCisgKiBA cmV0dXJuIFRydWUgaWYgdGhleSBhcmUgZXF1aXZhbGVudCwgZmFsc2Ugb3RoZXJ3aXNlLgorICov CitUT01MX0VYVEVSTiBib29sIHRvbWxfZXF1aXYoY29uc3QgdG9tbF9yZXN1bHRfdCAqcjEsIGNv bnN0IHRvbWxfcmVzdWx0X3QgKnIyKTsKKworLyoqCisgKiBAYnJpZWYgR2xvYmFsIG9wdGlvbnMg Zm9yIHRoZSBUT01MIHBhcnNlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdG9tbF9vcHRpb25fdCB0 b21sX29wdGlvbl90Oworc3RydWN0IHRvbWxfb3B0aW9uX3QgeworICBib29sIGNoZWNrX3V0Zjg7 IC8qKjwgSWYgdHJ1ZSwgY2hlY2sgaWYgYWxsIGNoYXJhY3RlcnMgYXJlIHZhbGlkIFVURi04Lgor ICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IGZhbHNlLiAqLworICB2b2lkICooKm1lbV9y ZWFsbG9jKSgKKyAgICAgIHZvaWQgKnB0ciwKKyAgICAgIHNpemVfdCBzaXplKTsgLyoqPCBDdXN0 b20gcmVhbGxvYyBmdW5jdGlvbi4gRGVmYXVsdDogcmVhbGxvYygpLiAqLworICB2b2lkICgqbWVt X2ZyZWUpKHZvaWQgKnB0cik7IC8qKjwgQ3VzdG9tIGZyZWUgZnVuY3Rpb24uIERlZmF1bHQ6IGZy ZWUoKS4gKi8KK307CisKKy8qKgorICogQGJyaWVmIEdldCB0aGUgZGVmYXVsdCBwYXJzZXIgb3B0 aW9ucy4KKyAqCisgKiBVc2UgdGhpcyB0byBvYnRhaW4gYW5kIGluaXRpYWxpemUgYSB0b21sX29w dGlvbl90IHN0cnVjdHVyZSBiZWZvcmUKKyAqIGN1c3RvbWl6aW5nIGl0LgorICoKKyAqIEByZXR1 cm4gQSB0b21sX29wdGlvbl90IHdpdGggZGVmYXVsdCB2YWx1ZXMuCisgKi8KK1RPTUxfRVhURVJO IHRvbWxfb3B0aW9uX3QgdG9tbF9kZWZhdWx0X29wdGlvbih2b2lkKTsKKworLyoqCisgKiBAYnJp ZWYgU2V0IHRoZSBnbG9iYWwgcGFyc2VyIG9wdGlvbnMuCisgKgorICogQ2FsbCB0aGlzIG9ubHkg aWYgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IuCisgKgorICogQHBh cmFtIG9wdCBUaGUgb3B0aW9ucyB0byBzZXQuCisgKi8KK1RPTUxfRVhURVJOIHZvaWQgdG9tbF9z ZXRfb3B0aW9uKHRvbWxfb3B0aW9uX3Qgb3B0KTsKKworI2VuZGlmIC8vIFRPTUxDMTdfSAotLSAK Mi40My4wCgo= --0000000000003578cb0656085432 Content-Type: application/octet-stream; name="0002-Add-TOML-format-support-for-the-pg_hosts-configurati.patch" Content-Disposition: attachment; filename="0002-Add-TOML-format-support-for-the-pg_hosts-configurati.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mraw8d9h1 RnJvbSBjZGIxYzcyMTk5ZDdiNmE5MGQ4ODdjNDQ0NWM1ZmYwYzZkOGUzNmUwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBac29sdCBQYXJyYWdpIDx6c29sdC5wYXJyYWdpQHBlcmNvbmEu Y29tPgpEYXRlOiBUdWUsIDcgSnVsIDIwMjYgMTY6NTU6MTggKzAwMDAKU3ViamVjdDogW1BBVENI IDIvMl0gQWRkIFRPTUwgZm9ybWF0IHN1cHBvcnQgZm9yIHRoZSBwZ19ob3N0cyBjb25maWd1cmF0 aW9uCiBmaWxlCgpTdXBwb3J0IGEgVE9NTC1mb3JtYXQgaG9zdHMgZmlsZSAoc2VsZWN0ZWQgd2hl biBob3N0c19maWxlIGVuZHMgaW4KIi50b21sIiksIHBhcnNlZCB2aWEgdGhlIHZlbmRvcmVkIHRv bWxjMTcgcGFyc2VyCi0tLQogc3JjL2JhY2tlbmQvbGlicHEvTWFrZWZpbGUgICAgICAgICAgIHwg ICAzICstCiBzcmMvYmFja2VuZC9saWJwcS9iZS1zZWN1cmUtY29tbW9uLmMgfCAyMjcgKysrKysr KysrKysrKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC9saWJwcS9tZXNvbi5idWlsZCAgICAg ICAgfCAgIDEgKwogc3JjL2JhY2tlbmQvbGlicHEvdG9tbF9jb25maWcuYyAgICAgIHwgMTI5ICsr KysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvbGlicHEvdG9tbF9jb25maWcuaCAgICAgIHwgIDQ4 ICsrKysrKwogc3JjL3Rlc3Qvc3NsL21lc29uLmJ1aWxkICAgICAgICAgICAgIHwgICAxICsKIHNy Yy90ZXN0L3NzbC90LzAwNV9zbmlfdG9tbC5wbCAgICAgICB8IDEwNSArKysrKysrKysrKysrCiA3 IGZpbGVzIGNoYW5nZWQsIDUxMyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUg bW9kZSAxMDA2NDQgc3JjL2JhY2tlbmQvbGlicHEvdG9tbF9jb25maWcuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IHNyYy9pbmNsdWRlL2xpYnBxL3RvbWxfY29uZmlnLmgKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzcmMvdGVzdC9zc2wvdC8wMDVfc25pX3RvbWwucGwKCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9saWJwcS9NYWtlZmlsZSBiL3NyYy9iYWNrZW5kL2xpYnBxL01ha2VmaWxlCmluZGV4IDk4ZWIy YTgyNDJkLi42NTAwMjU1NWY3NCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvbGlicHEvTWFrZWZp bGUKKysrIGIvc3JjL2JhY2tlbmQvbGlicHEvTWFrZWZpbGUKQEAgLTI4LDcgKzI4LDggQEAgT0JK UyA9IFwKIAlwcWNvbW0ubyBcCiAJcHFmb3JtYXQubyBcCiAJcHFtcS5vIFwKLQlwcXNpZ25hbC5v CisJcHFzaWduYWwubyBcCisJdG9tbF9jb25maWcubwogCiBpZmVxICgkKHdpdGhfc3NsKSxvcGVu c3NsKQogT0JKUyArPSBiZS1zZWN1cmUtb3BlbnNzbC5vCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9saWJwcS9iZS1zZWN1cmUtY29tbW9uLmMgYi9zcmMvYmFja2VuZC9saWJwcS9iZS1zZWN1cmUt Y29tbW9uLmMKaW5kZXggNmVjODg3YjhhNDcuLmMxYmQ1Y2Y1ZGI1IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9saWJwcS9iZS1zZWN1cmUtY29tbW9uLmMKKysrIGIvc3JjL2JhY2tlbmQvbGlicHEv YmUtc2VjdXJlLWNvbW1vbi5jCkBAIC0yNCw3ICsyNCw5IEBACiAKICNpbmNsdWRlICJjb21tb24v cGVyY2VudHJlcGwuaCIKICNpbmNsdWRlICJjb21tb24vc3RyaW5nLmgiCisjaW5jbHVkZSAiY29t bW9uL3RvbWxjMTcuaCIKICNpbmNsdWRlICJsaWJwcS9saWJwcS5oIgorI2luY2x1ZGUgImxpYnBx L3RvbWxfY29uZmlnLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9mZC5oIgogI2luY2x1ZGUgInV0aWxz L2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCkBAIC0zNTEsNiArMzUzLDE5OSBA QCBwYXJzZV9ob3N0c19saW5lKFRva2VuaXplZEF1dGhMaW5lICp0b2tfbGluZSwgaW50IGVsZXZl bCkKIAlyZXR1cm4gcGFyc2VkbGluZTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGhv c3RzX3RvbWxfa2V5c1tdID0geworCSJzc2xfY2VydGlmaWNhdGUiLAorCSJzc2xfa2V5IiwKKwki c3NsX2NhIiwKKwkicGFzc3BocmFzZV9jb21tYW5kIiwKKwkicGFzc3BocmFzZV9jb21tYW5kX3Jl bG9hZCIsCisJTlVMTCwKK307CisKKy8qCisgKiBWYWxpZGF0ZSBvbmUgVE9NTCB0YWJsZSAoYSBo b3N0IGVudHJ5IG9yIHRoZSBfZGVmYXVsdHMgdGFibGUpIGFuZCBjb3B5IGl0cworICogdmFsdWVz IGludG8gKm91dCAoYSBIb3N0c0xpbmUpOyBzdHJpbmcgdmFsdWVzIGFyZSBwc3RyZHVwJ2Qgc28g dGhleSBzdXJ2aXZlCisgKiBmcmVlaW5nIHRoZSBwYXJzZWQgVE9NTCBkb2N1bWVudC4gImxhYmVs IiBpcyB0aGUgZG90dGVkIHBhdGggZm9yCisgKiBkaWFnbm9zdGljcywgZS5nLiAiaG9zdHMuX2Rl ZmF1bHRzIi4KKyAqCisgKiAqcmVsb2FkX3ByZXNlbnQgaXMgc2V0IHRydWUgaWYgcGFzc3BocmFz ZV9jb21tYW5kX3JlbG9hZCB3YXMgc3BlY2lmaWVkLCBzbworICogdGhlIG1lcmdlIGNhbiB0ZWxs ICJvbWl0dGVkIiBmcm9tICJzZXQgdG8gZmFsc2UiLgorICovCitzdGF0aWMgYm9vbAoraG9zdHNf dG9tbF9jb2xsZWN0KHRvbWxfZGF0dW1fdCB0YWIsIGNvbnN0IGNoYXIgKmxhYmVsLCBjb25zdCBj aGFyICpmaWxlbmFtZSwKKwkJCQkgICBpbnQgZWxldmVsLCBIb3N0c0xpbmUgKm91dCwgYm9vbCAq cmVsb2FkX3ByZXNlbnQpCit7CisJdG9tbF9kYXR1bV90IGNlcnQgPSB0b21sX2dldCh0YWIsICJz c2xfY2VydGlmaWNhdGUiKTsKKwl0b21sX2RhdHVtX3Qga2V5ID0gdG9tbF9nZXQodGFiLCAic3Ns X2tleSIpOworCXRvbWxfZGF0dW1fdCBjYSA9IHRvbWxfZ2V0KHRhYiwgInNzbF9jYSIpOworCXRv bWxfZGF0dW1fdCBjbWQgPSB0b21sX2dldCh0YWIsICJwYXNzcGhyYXNlX2NvbW1hbmQiKTsKKwl0 b21sX2RhdHVtX3QgcmVsID0gdG9tbF9nZXQodGFiLCAicGFzc3BocmFzZV9jb21tYW5kX3JlbG9h ZCIpOworCisJKnJlbG9hZF9wcmVzZW50ID0gZmFsc2U7CisKKwlpZiAoIXRvbWxfcmVqZWN0X3Vu a25vd24oaG9zdHNfdG9tbF9rZXlzLCB0YWIsIGxhYmVsLCBmaWxlbmFtZSwgZWxldmVsKSkKKwkJ cmV0dXJuIGZhbHNlOworCisJaWYgKGNlcnQudHlwZSAhPSBUT01MX1VOS05PV04gJiYgY2VydC50 eXBlICE9IFRPTUxfU1RSSU5HKQorCQlyZXR1cm4gdG9tbF90eXBlX2Vycm9yKGxhYmVsLCAic3Ns X2NlcnRpZmljYXRlIiwgInN0cmluZyIsIGZpbGVuYW1lLCBlbGV2ZWwpOworCWlmIChrZXkudHlw ZSAhPSBUT01MX1VOS05PV04gJiYga2V5LnR5cGUgIT0gVE9NTF9TVFJJTkcpCisJCXJldHVybiB0 b21sX3R5cGVfZXJyb3IobGFiZWwsICJzc2xfa2V5IiwgInN0cmluZyIsIGZpbGVuYW1lLCBlbGV2 ZWwpOworCWlmIChjYS50eXBlICE9IFRPTUxfVU5LTk9XTiAmJiBjYS50eXBlICE9IFRPTUxfU1RS SU5HKQorCQlyZXR1cm4gdG9tbF90eXBlX2Vycm9yKGxhYmVsLCAic3NsX2NhIiwgInN0cmluZyIs IGZpbGVuYW1lLCBlbGV2ZWwpOworCWlmIChjbWQudHlwZSAhPSBUT01MX1VOS05PV04gJiYgY21k LnR5cGUgIT0gVE9NTF9TVFJJTkcpCisJCXJldHVybiB0b21sX3R5cGVfZXJyb3IobGFiZWwsICJw YXNzcGhyYXNlX2NvbW1hbmQiLCAic3RyaW5nIiwgZmlsZW5hbWUsIGVsZXZlbCk7CisJaWYgKHJl bC50eXBlICE9IFRPTUxfVU5LTk9XTiAmJiByZWwudHlwZSAhPSBUT01MX0JPT0xFQU4pCisJCXJl dHVybiB0b21sX3R5cGVfZXJyb3IobGFiZWwsICJwYXNzcGhyYXNlX2NvbW1hbmRfcmVsb2FkIiwg ImJvb2xlYW4iLCBmaWxlbmFtZSwgZWxldmVsKTsKKworCWlmIChjZXJ0LnR5cGUgPT0gVE9NTF9T VFJJTkcpCisJCW91dC0+c3NsX2NlcnQgPSBwc3RyZHVwKGNlcnQudS5zKTsKKwlpZiAoa2V5LnR5 cGUgPT0gVE9NTF9TVFJJTkcpCisJCW91dC0+c3NsX2tleSA9IHBzdHJkdXAoa2V5LnUucyk7CisJ aWYgKGNhLnR5cGUgPT0gVE9NTF9TVFJJTkcpCisJCW91dC0+c3NsX2NhID0gcHN0cmR1cChjYS51 LnMpOworCWlmIChjbWQudHlwZSA9PSBUT01MX1NUUklORykKKwkJb3V0LT5zc2xfcGFzc3BocmFz ZV9jbWQgPSBwc3RyZHVwKGNtZC51LnMpOworCWlmIChyZWwudHlwZSA9PSBUT01MX0JPT0xFQU4p CisJeworCQlvdXQtPnNzbF9wYXNzcGhyYXNlX3JlbG9hZCA9IHJlbC51LmJvb2xlYW47CisJCSpy ZWxvYWRfcHJlc2VudCA9IHRydWU7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQ YXJzZSBhIHBnX2hvc3RzIFRPTUwgZmlsZSBpbnRvIGEgbGlzdCBvZiBIb3N0c0xpbmUuCisgKiAg ICptaXNzaW5nICAgID0gdHJ1ZSAgLT4gZmlsZSBkb2VzIG5vdCBleGlzdCAoRU5PRU5UKTsgcmV0 dXJucyBOSUwKKyAqICAgKmZpbGVfZXJyICAhPSBOVUxMICAtPiB3aG9sZS1maWxlIG9wZW4vcGFy c2UgZXJyb3I7IHJldHVybnMgTklMCisgKiAgICpoYWRfZXJyb3JzID0gdHJ1ZSAgLT4gc29tZSBl bnRyaWVzIHdlcmUgaW52YWxpZDsgdGhleSB3ZXJlIHJlcG9ydGVkIGF0CisgKiAgICAgICAgICAg ICAgICAgICAgICAgICAgZWxldmVsIGFuZCBsZWZ0IG91dCBvZiB0aGUgcmVzdWx0CisgKi8KK3N0 YXRpYyBMaXN0ICoKK3BhcnNlX2hvc3RzX3RvbWwoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBl bGV2ZWwsCisJCQkJIGJvb2wgKm1pc3NpbmcsIGJvb2wgKmhhZF9lcnJvcnMsIGNoYXIgKipmaWxl X2VycikKK3sKKwl0b21sX3Jlc3VsdF90IHJlc3VsdDsKKwl0b21sX2RhdHVtX3QgaG9zdHNfc2Vj dGlvbjsKKwl0b21sX2RhdHVtX3QgZGVmYXVsdHNfZGF0OworCUhvc3RzTGluZQlkZWZhdWx0cyA9 IHswfTsKKwlib29sCQlkZWZhdWx0c19yZWxvYWRfcHJlc2VudCA9IGZhbHNlOworCWJvb2wJCWhh dmVfZGVmYXVsdHMgPSBmYWxzZTsKKwlMaXN0CSAgICplbnRyaWVzID0gTklMOworCisJKm1pc3Np bmcgPSBmYWxzZTsKKwkqaGFkX2Vycm9ycyA9IGZhbHNlOworCSpmaWxlX2VyciA9IE5VTEw7CisK KwlpZiAoIXRvbWxfY29uZmlnX2xvYWQoZmlsZW5hbWUsIGVsZXZlbCwgJnJlc3VsdCwgZmlsZV9l cnIpKQorCXsKKwkJaWYgKCpmaWxlX2VyciA9PSBOVUxMKQorCQkJKm1pc3NpbmcgPSB0cnVlOwkv KiBFTk9FTlQgKi8KKwkJcmV0dXJuIE5JTDsKKwl9CisKKwlob3N0c19zZWN0aW9uID0gdG9tbF9n ZXQocmVzdWx0LnRvcHRhYiwgImhvc3RzIik7CisJaWYgKGhvc3RzX3NlY3Rpb24udHlwZSA9PSBU T01MX1VOS05PV04pCisJeworCQl0b21sX2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5JTDsJCQkJ Lyogbm8gW2hvc3RzXSB0YWJsZTogZW1wdHkgKi8KKwl9CisJaWYgKGhvc3RzX3NlY3Rpb24udHlw ZSAhPSBUT01MX1RBQkxFKQorCXsKKwkJKmZpbGVfZXJyID0gcHNwcmludGYoIlwiaG9zdHNcIiBp biBcIiVzXCIgaXMgbm90IGEgdGFibGUiLCBmaWxlbmFtZSk7CisJCWVyZXBvcnQoZWxldmVsLAor CQkJCShlcnJjb2RlKEVSUkNPREVfQ09ORklHX0ZJTEVfRVJST1IpLAorCQkJCSBlcnJtc2coIlwi aG9zdHNcIiBpbiBcIiVzXCIgaXMgbm90IGEgdGFibGUiLCBmaWxlbmFtZSkpKTsKKwkJdG9tbF9m cmVlKHJlc3VsdCk7CisJCXJldHVybiBOSUw7CisJfQorCisJZGVmYXVsdHNfZGF0ID0gdG9tbF9n ZXQoaG9zdHNfc2VjdGlvbiwgIl9kZWZhdWx0cyIpOworCWlmIChkZWZhdWx0c19kYXQudHlwZSA9 PSBUT01MX1RBQkxFKQorCXsKKwkJaWYgKGhvc3RzX3RvbWxfY29sbGVjdChkZWZhdWx0c19kYXQs ICJob3N0cy5fZGVmYXVsdHMiLCBmaWxlbmFtZSwKKwkJCQkJCQkgICBlbGV2ZWwsICZkZWZhdWx0 cywgJmRlZmF1bHRzX3JlbG9hZF9wcmVzZW50KSkKKwkJCWhhdmVfZGVmYXVsdHMgPSB0cnVlOwor CQllbHNlCisJCQkqaGFkX2Vycm9ycyA9IHRydWU7CisJfQorCWVsc2UgaWYgKGRlZmF1bHRzX2Rh dC50eXBlICE9IFRPTUxfVU5LTk9XTikKKwl7CisJCWVyZXBvcnQoZWxldmVsLAorCQkJCShlcnJj b2RlKEVSUkNPREVfQ09ORklHX0ZJTEVfRVJST1IpLAorCQkJCSBlcnJtc2coIlwiaG9zdHMuX2Rl ZmF1bHRzXCIgaW4gXCIlc1wiIG11c3QgYmUgYSB0YWJsZSIsIGZpbGVuYW1lKSkpOworCQkqaGFk X2Vycm9ycyA9IHRydWU7CisJfQorCisJZm9yIChpbnQgaSA9IDA7IGkgPCBob3N0c19zZWN0aW9u LnUudGFiLnNpemU7IGkrKykKKwl7CisJCWNvbnN0IGNoYXIgKm5hbWUgPSBob3N0c19zZWN0aW9u LnUudGFiLmtleVtpXTsKKwkJdG9tbF9kYXR1bV90IHZhbCA9IGhvc3RzX3NlY3Rpb24udS50YWIu dmFsdWVbaV07CisJCUhvc3RzTGluZSAgKmhsOworCQlib29sCQlyZWxvYWRfcHJlc2VudCA9IGZh bHNlOworCisJCWlmIChzdHJjbXAobmFtZSwgIl9kZWZhdWx0cyIpID09IDApCisJCQljb250aW51 ZTsKKworCQlpZiAodmFsLnR5cGUgIT0gVE9NTF9UQUJMRSkKKwkJeworCQkJZXJlcG9ydChlbGV2 ZWwsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfQ09ORklHX0ZJTEVfRVJST1IpLAorCQkJCQkgZXJy bXNnKCJcImhvc3RzLiVzXCIgaW4gXCIlc1wiIG11c3QgYmUgYSB0YWJsZSIsIG5hbWUsIGZpbGVu YW1lKSkpOworCQkJKmhhZF9lcnJvcnMgPSB0cnVlOworCQkJY29udGludWU7CisJCX0KKworCQlo bCA9IHBhbGxvYzBfb2JqZWN0KEhvc3RzTGluZSk7CisJCWhsLT5saW5lbnVtYmVyID0gdmFsLmxp bmVubzsKKwkJaGwtPnNvdXJjZWZpbGUgPSBwc3RyZHVwKGZpbGVuYW1lKTsKKwkJaGwtPnJhd2xp bmUgPSBwc3RyZHVwKCIiKTsKKwkJaGwtPmhvc3RuYW1lcyA9IGxpc3RfbWFrZTEocHN0cmR1cChu YW1lKSk7CisKKwkJeworCQkJY2hhcgkgICAqbGFiZWwgPSBwc3ByaW50ZigiaG9zdHMuJXMiLCBu YW1lKTsKKwkJCWJvb2wJCW9rID0gaG9zdHNfdG9tbF9jb2xsZWN0KHZhbCwgbGFiZWwsIGZpbGVu YW1lLCBlbGV2ZWwsCisJCQkJCQkJCQkJCQlobCwgJnJlbG9hZF9wcmVzZW50KTsKKworCQkJcGZy ZWUobGFiZWwpOworCQkJaWYgKCFvaykKKwkJCXsKKwkJCQkqaGFkX2Vycm9ycyA9IHRydWU7CisJ CQkJY29udGludWU7CisJCQl9CisJCX0KKworCQlpZiAoaGF2ZV9kZWZhdWx0cykKKwkJeworCQkJ aWYgKGhsLT5zc2xfY2VydCA9PSBOVUxMKQorCQkJCWhsLT5zc2xfY2VydCA9IGRlZmF1bHRzLnNz bF9jZXJ0OworCQkJaWYgKGhsLT5zc2xfa2V5ID09IE5VTEwpCisJCQkJaGwtPnNzbF9rZXkgPSBk ZWZhdWx0cy5zc2xfa2V5OworCQkJaWYgKGhsLT5zc2xfY2EgPT0gTlVMTCkKKwkJCQlobC0+c3Ns X2NhID0gZGVmYXVsdHMuc3NsX2NhOworCQkJaWYgKGhsLT5zc2xfcGFzc3BocmFzZV9jbWQgPT0g TlVMTCkKKwkJCQlobC0+c3NsX3Bhc3NwaHJhc2VfY21kID0gZGVmYXVsdHMuc3NsX3Bhc3NwaHJh c2VfY21kOworCQkJaWYgKCFyZWxvYWRfcHJlc2VudCAmJiBkZWZhdWx0c19yZWxvYWRfcHJlc2Vu dCkKKwkJCQlobC0+c3NsX3Bhc3NwaHJhc2VfcmVsb2FkID0gZGVmYXVsdHMuc3NsX3Bhc3NwaHJh c2VfcmVsb2FkOworCQl9CisKKwkJaWYgKGhsLT5zc2xfY2VydCA9PSBOVUxMIHx8IGhsLT5zc2xf a2V5ID09IE5VTEwpCisJCXsKKwkJCWVyZXBvcnQoZWxldmVsLAorCQkJCQkoZXJyY29kZShFUlJD T0RFX0NPTkZJR19GSUxFX0VSUk9SKSwKKwkJCQkJIGVycm1zZygiXCJob3N0cy4lc1wiIGluIFwi JXNcIiBpcyBtaXNzaW5nIHJlcXVpcmVkIFwic3NsX2NlcnRpZmljYXRlXCIgb3IgXCJzc2xfa2V5 XCIiLAorCQkJCQkJCW5hbWUsIGZpbGVuYW1lKSkpOworCQkJKmhhZF9lcnJvcnMgPSB0cnVlOwor CQkJY29udGludWU7CisJCX0KKworCQllbnRyaWVzID0gbGFwcGVuZChlbnRyaWVzLCBobCk7CisJ fQorCisJdG9tbF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIGVudHJpZXM7Cit9CisKIC8qCiAgKiBs b2FkX2hvc3RzCiAgKgpAQCAtMzg0LDYgKzU3OSwzOCBAQCBsb2FkX2hvc3RzKExpc3QgKipob3N0 cywgY2hhciAqKmVycl9tc2cpCiAJfQogCSpob3N0cyA9IE5JTDsKIAorCWlmICh0b21sX3BhdGgo SG9zdHNGaWxlTmFtZSkpCisJeworCQlib29sCQltaXNzaW5nID0gZmFsc2U7CisJCWJvb2wJCWhh ZF9lcnJvcnMgPSBmYWxzZTsKKwkJY2hhcgkgICAqZmlsZV9lcnIgPSBOVUxMOworCQlMaXN0CSAg ICplbnRyaWVzOworCisJCWVudHJpZXMgPSBwYXJzZV9ob3N0c190b21sKEhvc3RzRmlsZU5hbWUs IExPRywgJm1pc3NpbmcsICZoYWRfZXJyb3JzLAorCQkJCQkJCQkgICAmZmlsZV9lcnIpOworCQlp ZiAobWlzc2luZykKKwkJCXJldHVybiBIT1NUU0ZJTEVfTUlTU0lORzsKKwkJaWYgKGZpbGVfZXJy KQorCQl7CisJCQlpZiAoZXJyX21zZykKKwkJCQkqZXJyX21zZyA9IGZpbGVfZXJyOworCQkJcmV0 dXJuIEhPU1RTRklMRV9MT0FEX0ZBSUxFRDsKKwkJfQorCisJCSpob3N0cyA9IGVudHJpZXM7CisK KwkJaWYgKGhhZF9lcnJvcnMpCisJCXsKKwkJCWlmIChlcnJfbXNnKQorCQkJCSplcnJfbXNnID0g cHNwcmludGYoImxvYWRpbmcgY29uZmlnIGZyb20gXCIlc1wiIGZhaWxlZCBkdWUgdG8gcGFyc2lu ZyBlcnJvciIsCisJCQkJCQkJCQlIb3N0c0ZpbGVOYW1lKTsKKwkJCXJldHVybiBIT1NUU0ZJTEVf TE9BRF9GQUlMRUQ7CisJCX0KKwkJaWYgKGVudHJpZXMgPT0gTklMKQorCQkJcmV0dXJuIEhPU1RT RklMRV9FTVBUWTsKKwkJcmV0dXJuIEhPU1RTRklMRV9MT0FEX09LOworCX0KKwogCS8qCiAJICog VGhpcyBpcyBub3QgYW4gYXV0aCBmaWxlIHBlciBzZSwgYnV0IGl0IGlzIHVzaW5nIHRoZSBzYW1l IGZpbGUgZm9ybWF0CiAJICogYXMgdGhlIHBnX2hiYSBhbmQgcGdfaWRlbnQgZmlsZXMgYW5kIHRo dXMgdGhlIHNhbWUgY29kZSBpbmZyYXN0cnVjdHVyZS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2xpYnBxL21lc29uLmJ1aWxkIGIvc3JjL2JhY2tlbmQvbGlicHEvbWVzb24uYnVpbGQKaW5kZXgg ODU3MWY2NTI4NDQuLjU5MGIxOGI0Yjc2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9saWJwcS9t ZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2VuZC9saWJwcS9tZXNvbi5idWlsZApAQCAtMTUsNiAr MTUsNyBAQCBiYWNrZW5kX3NvdXJjZXMgKz0gZmlsZXMoCiAgICdwcWZvcm1hdC5jJywKICAgJ3Bx bXEuYycsCiAgICdwcXNpZ25hbC5jJywKKyAgJ3RvbWxfY29uZmlnLmMnLAogKQogCiBpZiBzc2wu Zm91bmQoKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvbGlicHEvdG9tbF9jb25maWcuYyBiL3Ny Yy9iYWNrZW5kL2xpYnBxL3RvbWxfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAuLjUwYjFiYzhjNGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2JhY2tlbmQv bGlicHEvdG9tbF9jb25maWcuYwpAQCAtMCwwICsxLDEyOSBAQAorLyotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgKgorICogdG9tbF9jb25maWcuYworICoJICBNaW5pbWFsIGxvYWRlciBmb3IgVE9NTCBjb25m aWd1cmF0aW9uIGZpbGVzLgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI2 LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICoKKyAqIElERU5USUZJQ0FU SU9OCisgKgkgIHNyYy9iYWNrZW5kL2xpYnBxL3RvbWxfY29uZmlnLmMKKyAqCisgKi0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqLworI2luY2x1ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRlIDxlcnJuby5o PgorCisjaW5jbHVkZSAibGlicHEvdG9tbF9jb25maWcuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2Zk LmgiCisKK2Jvb2wKK3RvbWxfY29uZmlnX2xvYWQoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBl bGV2ZWwsCisJCQkJIHRvbWxfcmVzdWx0X3QgKnJlc3VsdCwgY2hhciAqKmVycl9tc2cpCit7CisJ RklMRQkgICAqZnA7CisKKwlpZiAoZXJyX21zZykKKwkJKmVycl9tc2cgPSBOVUxMOworCisJZnAg PSBBbGxvY2F0ZUZpbGUoZmlsZW5hbWUsICJyIik7CisJaWYgKGZwID09IE5VTEwpCisJeworCQlp bnQJCQlzYXZlX2Vycm5vID0gZXJybm87CisKKwkJaWYgKHNhdmVfZXJybm8gPT0gRU5PRU5UKQor CQkJcmV0dXJuIGZhbHNlOwkJLyogIm1pc3NpbmciIC0gbm90IGFuIGVycm9yICovCisKKwkJaWYg KGVycl9tc2cpCisJCQkqZXJyX21zZyA9IHBzcHJpbnRmKCJjb3VsZCBub3Qgb3BlbiBUT01MIGNv bmZpZyBmaWxlIFwiJXNcIjogJW0iLAorCQkJCQkJCQlmaWxlbmFtZSk7CisJCWVycm5vID0gc2F2 ZV9lcnJubzsKKwkJZXJlcG9ydChlbGV2ZWwsCisJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNz KCksCisJCQkJIGVycm1zZygiY291bGQgbm90IG9wZW4gVE9NTCBjb25maWcgZmlsZSBcIiVzXCI6 ICVtIiwKKwkJCQkJCWZpbGVuYW1lKSkpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJKnJlc3Vs dCA9IHRvbWxfcGFyc2VfZmlsZShmcCk7CisJRnJlZUZpbGUoZnApOworCisJaWYgKCFyZXN1bHQt Pm9rKQorCXsKKwkJaWYgKGVycl9tc2cpCisJCQkqZXJyX21zZyA9IHBzcHJpbnRmKCJUT01MIHBh cnNlIGVycm9yIGluIFwiJXNcIjogJXMiLAorCQkJCQkJCQlmaWxlbmFtZSwgcmVzdWx0LT5lcnJt c2cpOworCQllcmVwb3J0KGVsZXZlbCwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0NPTkZJR19GSUxF X0VSUk9SKSwKKwkJCQkgZXJybXNnKCJUT01MIHBhcnNlIGVycm9yIGluIFwiJXNcIjogJXMiLAor CQkJCQkJZmlsZW5hbWUsIHJlc3VsdC0+ZXJybXNnKSkpOworCQl0b21sX2ZyZWUoKnJlc3VsdCk7 CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFJlamVj dCBrZXlzIG9mICJ0YWIiIG5vdCBpbiB0aGUgTlVMTC10ZXJtaW5hdGVkICJhbGxvd2VkIiBsaXN0 LiAibGFiZWwiIGlzCisgKiB0aGUgZG90dGVkIHBhdGggZm9yIGRpYWdub3N0aWNzIChlLmcuICJo b3N0cy5mb28iKTsgZWFjaCBvZmZlbmRlciBpcworICogcmVwb3J0ZWQgYXQgZWxldmVsLiBSZXR1 cm5zIHRydWUgaWYgYWxsIGtleXMga25vd24uCisgKi8KK2Jvb2wKK3RvbWxfcmVqZWN0X3Vua25v d24oY29uc3QgY2hhciAqY29uc3QgYWxsb3dlZFtdLCB0b21sX2RhdHVtX3QgdGFiLAorCQkJCQlj b25zdCBjaGFyICpsYWJlbCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBlbGV2ZWwpCit7CisJ Ym9vbAkJb2sgPSB0cnVlOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWIudS50YWIuc2l6ZTsg aSsrKQorCXsKKwkJY29uc3QgY2hhciAqa2V5ID0gdGFiLnUudGFiLmtleVtpXTsKKwkJYm9vbAkJ a25vd24gPSBmYWxzZTsKKworCQlmb3IgKGludCBqID0gMDsgYWxsb3dlZFtqXSAhPSBOVUxMOyBq KyspCisJCXsKKwkJCWlmIChzdHJjbXAoa2V5LCBhbGxvd2VkW2pdKSA9PSAwKQorCQkJeworCQkJ CWtub3duID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoa25vd24pCisJCQlj b250aW51ZTsKKworCQllcmVwb3J0KGVsZXZlbCwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0NPTkZJ R19GSUxFX0VSUk9SKSwKKwkJCQkgZXJybXNnKCJcIiVzLiVzXCIgaW4gXCIlc1wiIGlzIG5vdCBh IHJlY29nbml6ZWQga2V5IiwKKwkJCQkJCWxhYmVsLCBrZXksIGZpbGVuYW1lKSkpOworCQlvayA9 IGZhbHNlOworCX0KKworCXJldHVybiBvazsKK30KKworLyoKKyAqIFJlcG9ydCB0aGF0ICJsYWJl bC5maWVsZCIgaW4gImZpbGVuYW1lIiBtdXN0IGJlIG9mIHR5cGUgImV4cGVjdGVkIiBhbmQKKyAq IHJldHVybiBmYWxzZSBmb3IgdXNlIGFzIGEgb25lLWxpbmUgYmFpbC1vdXQuCisgKi8KK2Jvb2wK K3RvbWxfdHlwZV9lcnJvcihjb25zdCBjaGFyICpsYWJlbCwgY29uc3QgY2hhciAqZmllbGQsIGNv bnN0IGNoYXIgKmV4cGVjdGVkLAorCQkJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZWxldmVs KQoreworCWVyZXBvcnQoZWxldmVsLAorCQkJKGVycmNvZGUoRVJSQ09ERV9DT05GSUdfRklMRV9F UlJPUiksCisJCQkgZXJybXNnKCJcIiVzLiVzXCIgaW4gXCIlc1wiIG11c3QgYmUgYSAlcyIsCisJ CQkJCWxhYmVsLCBmaWVsZCwgZmlsZW5hbWUsIGV4cGVjdGVkKSkpOworCXJldHVybiBmYWxzZTsK K30KKworLyogVHJ1ZSBpZiAiZmlsZW5hbWUiIG5hbWVzIGEgVE9NTCBmaWxlICgiLnRvbWwiIGV4 dGVuc2lvbikuICovCitib29sCit0b21sX3BhdGgoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJ Y29uc3QgY2hhciAqZG90OworCisJaWYgKGZpbGVuYW1lID09IE5VTEwpCisJCXJldHVybiBmYWxz ZTsKKwlkb3QgPSBzdHJyY2hyKGZpbGVuYW1lLCAnLicpOworCXJldHVybiBkb3QgIT0gTlVMTCAm JiBzdHJjbXAoZG90LCAiLnRvbWwiKSA9PSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv bGlicHEvdG9tbF9jb25maWcuaCBiL3NyYy9pbmNsdWRlL2xpYnBxL3RvbWxfY29uZmlnLmgKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjk2MzVjMmI0Zjg1Ci0tLSAvZGV2 L251bGwKKysrIGIvc3JjL2luY2x1ZGUvbGlicHEvdG9tbF9jb25maWcuaApAQCAtMCwwICsxLDQ4 IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiB0b21sX2NvbmZpZy5oCisgKgkgIE1pbmlt YWwgbG9hZGVyIGZvciBUT01MIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgKgorICogUG9ydGlvbnMg Q29weXJpZ2h0IChjKSAxOTk2LTIwMjYsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdy b3VwCisgKgorICogc3JjL2luY2x1ZGUvbGlicHEvdG9tbF9jb25maWcuaAorICoKKyAqLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICovCisjaWZuZGVmIFRPTUxfQ09ORklHX0gKKyNkZWZpbmUgVE9NTF9DT05G SUdfSAorCisjaW5jbHVkZSAiY29tbW9uL3RvbWxjMTcuaCIKKworLyoKKyAqIE9wZW4gYW5kIHBh cnNlIGEgVE9NTCBmaWxlLgorICoKKyAqICAgcmV0dXJuIHRydWUgICAgICAgICAgICAgIC0+IHBh cnNlZDsgY2FsbGVyIG93bnMgKnJlc3VsdCBhbmQgbXVzdAorICogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgdG9tbF9mcmVlKCpyZXN1bHQpIHdoZW4gZG9uZQorICogICByZXR1cm4gZmFs c2UsICplcnJfbXNnPT1OVUxMIC0+IGZpbGUgbWlzc2luZyAoRU5PRU5UKQorICogICByZXR1cm4g ZmFsc2UsICplcnJfbXNnIT1OVUxMIC0+IG9wZW4vcGFyc2UgZXJyb3IgKGFscmVhZHkgZXJlcG9y dCdkIGF0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGV2ZWwpOyAqZXJyX21z ZyBob2xkcyB0aGUgbWVzc2FnZQorICovCitleHRlcm4gYm9vbCB0b21sX2NvbmZpZ19sb2FkKGNv bnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZWxldmVsLAorCQkJCQkJCSB0b21sX3Jlc3VsdF90ICpy ZXN1bHQsIGNoYXIgKiplcnJfbXNnKTsKKworLyoKKyAqIFJlamVjdCBrZXlzIG9mICJ0YWIiIG5v dCBpbiB0aGUgTlVMTC10ZXJtaW5hdGVkICJhbGxvd2VkIiBsaXN0LiBSZXBvcnRzIGVhY2gKKyAq IG9mZmVuZGVyIGF0IGVsZXZlbC4gUmV0dXJucyB0cnVlIGlmIGFsbCBrZXlzIGtub3duLgorICov CitleHRlcm4gYm9vbCB0b21sX3JlamVjdF91bmtub3duKGNvbnN0IGNoYXIgKmNvbnN0IGFsbG93 ZWRbXSwgdG9tbF9kYXR1bV90IHRhYiwKKwkJCQkJCQkJY29uc3QgY2hhciAqbGFiZWwsIGNvbnN0 IGNoYXIgKmZpbGVuYW1lLAorCQkJCQkJCQlpbnQgZWxldmVsKTsKKworLyoKKyAqIFJlcG9ydCB0 aGF0ICJsYWJlbC5maWVsZCIgaW4gImZpbGVuYW1lIiBtdXN0IGJlIHR5cGUgImV4cGVjdGVkIiBh bmQgcmV0dXJuCisgKiBmYWxzZS4KKyAqLworZXh0ZXJuIGJvb2wgdG9tbF90eXBlX2Vycm9yKGNv bnN0IGNoYXIgKmxhYmVsLCBjb25zdCBjaGFyICpmaWVsZCwKKwkJCQkJCQljb25zdCBjaGFyICpl eHBlY3RlZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkJCQkJaW50IGVsZXZlbCk7CisKKy8q IFRydWUgaWYgImZpbGVuYW1lIiBuYW1lcyBhIFRPTUwgZmlsZSAoIi50b21sIiBleHRlbnNpb24p LiAqLworZXh0ZXJuIGJvb2wgdG9tbF9wYXRoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworI2Vu ZGlmCQkJCQkJCS8qIFRPTUxfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3NzbC9t ZXNvbi5idWlsZCBiL3NyYy90ZXN0L3NzbC9tZXNvbi5idWlsZAppbmRleCBkN2U3Y2UyMzQzMy4u MmI3NTUyMjQyZjcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3NzbC9tZXNvbi5idWlsZAorKysgYi9z cmMvdGVzdC9zc2wvbWVzb24uYnVpbGQKQEAgLTE0LDYgKzE0LDcgQEAgdGVzdHMgKz0gewogICAg ICAgJ3QvMDAyX3NjcmFtLnBsJywKICAgICAgICd0LzAwM19zc2xpbmZvLnBsJywKICAgICAgICd0 LzAwNF9zbmkucGwnLAorICAgICAgJ3QvMDA1X3NuaV90b21sLnBsJywKICAgICBdLAogICB9LAog fQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qvc3NsL3QvMDA1X3NuaV90b21sLnBsIGIvc3JjL3Rlc3Qv c3NsL3QvMDA1X3NuaV90b21sLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwLi4yMWQ2N2UyZjVhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3NzbC90LzAwNV9z bmlfdG9tbC5wbApAQCAtMCwwICsxLDEwNSBAQAorCisjIENvcHlyaWdodCAoYykgMjAyNC0yMDI2 LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCit1c2Ugc3RyaWN0OwordXNl IHdhcm5pbmdzIEZBVEFMID0+ICdhbGwnOworCit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rl cjsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOworCit1c2Ug RmluZEJpbjsKK3VzZSBsaWIgJEZpbmRCaW46OlJlYWxCaW47CisKK3VzZSBTU0w6OlNlcnZlcjsK KworbXkgJFNFUlZFUkhPU1RBRERSID0gJzEyNy4wLjAuMSc7CitteSAkU0VSVkVSSE9TVENJRFIg PSAnMTI3LjAuMC4xLzMyJzsKKworaWYgKCRFTlZ7d2l0aF9zc2x9IG5lICdvcGVuc3NsJykKK3sK KwlwbGFuIHNraXBfYWxsID0+ICdPcGVuU1NMIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBidWlsZCc7 Cit9CisKK2lmICghJEVOVntQR19URVNUX0VYVFJBfSB8fCAkRU5We1BHX1RFU1RfRVhUUkF9ICF+ IC9cYnNzbFxiLykKK3sKKwlwbGFuIHNraXBfYWxsID0+CisJICAnUG90ZW50aWFsbHkgdW5zYWZl IHRlc3QgU1NMIG5vdCBlbmFibGVkIGluIFBHX1RFU1RfRVhUUkEnOworfQorCitteSAkc3NsX3Nl cnZlciA9IFNTTDo6U2VydmVyLT5uZXcoKTsKKworaWYgKCRzc2xfc2VydmVyLT5pc19saWJyZXNz bCkKK3sKKwlwbGFuIHNraXBfYWxsID0+ICdTTkkgbm90IHN1cHBvcnRlZCB3aGVuIGJ1aWxkaW5n IHdpdGggTGlicmVTU0wnOworfQorCitteSAkbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0 ZXItPm5ldygncHJpbWFyeScpOworJG5vZGUtPmluaXQ7CisKKyRFTlZ7UEdIT1NUfSA9ICRub2Rl LT5ob3N0OworJEVOVntQR1BPUlR9ID0gJG5vZGUtPnBvcnQ7Ciskbm9kZS0+c3RhcnQ7CisKKyRz c2xfc2VydmVyLT5jb25maWd1cmVfdGVzdF9zZXJ2ZXJfZm9yX3NzbCgkbm9kZSwgJFNFUlZFUkhP U1RBRERSLAorCSRTRVJWRVJIT1NUQ0lEUiwgJ3RydXN0Jyk7CisKKyRzc2xfc2VydmVyLT5zd2l0 Y2hfc2VydmVyX2NlcnQoJG5vZGUsIGNlcnRmaWxlID0+ICdzZXJ2ZXItY24tb25seScpOworCitt eSAkY29ubnN0ciA9CisgICJ1c2VyPXNzbHRlc3R1c2VyIGRibmFtZT10cnVzdGRiIGhvc3RhZGRy PSRTRVJWRVJIT1NUQUREUiBzc2xzbmk9MSI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBw Z19ob3N0cy50b21sIC0gaGFwcHkgcGF0aAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK29rKHVu bGluaygkbm9kZS0+ZGF0YV9kaXIgLiAnL3BnX2hvc3RzLmNvbmYnKSwKKwkncmVtb3ZlIHBnX2hv c3RzLmNvbmYgc28gZGlzcGF0Y2ggcGlja3MgcGdfaG9zdHMudG9tbCcpOworCitteSAkZGF0YWRp ciA9ICRub2RlLT5kYXRhX2RpcjsKK215ICR0b21scGF0aCA9ICIkZGF0YWRpci9wZ19ob3N0cy50 b21sIjsKK29wZW4obXkgJGZoLCAnPicsICR0b21scGF0aCkKKyAgb3IgZGllICJvcGVuIHBnX2hv c3RzLnRvbWwgZm9yIHdyaXRpbmc6ICQhIjsKK3ByaW50ICRmaCA8PCdUT01MJzsKK1tob3N0c10K KyJleGFtcGxlLm9yZyIgPSB7IHNzbF9jZXJ0aWZpY2F0ZSA9ICJzZXJ2ZXItY24tb25seStzZXJ2 ZXJfY2EuY3J0Iiwgc3NsX2tleSA9ICJzZXJ2ZXItY24tb25seS5rZXkiLCBzc2xfY2EgPSAicm9v dF9jYS5jcnQiIH0KKyIqIiA9IHsgc3NsX2NlcnRpZmljYXRlID0gInNlcnZlci1jbi1vbmx5LmNy dCIsIHNzbF9rZXkgPSAic2VydmVyLWNuLW9ubHkua2V5IiB9CitUT01MCitjbG9zZSgkZmgpOwor Ciskbm9kZS0+YXBwZW5kX2NvbmYoJ3BnX2hiYS5jb25mJywgImxvY2FsIGFsbCBhbGwgdHJ1c3Qi KTsKKyRub2RlLT5hcHBlbmRfY29uZigncG9zdGdyZXNxbC5jb25mJywKKwkiaG9zdHNfZmlsZSA9 ICckdG9tbHBhdGgnXG4iIC4gInNzbF9zbmkgPSBvblxuIik7Ciskbm9kZS0+cmVzdGFydDsKKwor JG5vZGUtPmNvbm5lY3Rfb2soCisJIiRjb25uc3RyIGhvc3Q9ZXhhbXBsZS5vcmcgc3Nscm9vdGNl cnQ9c3NsL3Jvb3RfY2EuY3J0IHNzbG1vZGU9dmVyaWZ5LWNhIiwKKwkncGdfaG9zdHMudG9tbDog Y29ubmVjdCB0byBleGFtcGxlLm9yZyBhbmQgdmVyaWZ5IHBlci1ob3N0IENBJyk7CisKKyRub2Rl LT5jb25uZWN0X29rKAorCSIkY29ubnN0ciBzc2xyb290Y2VydD1zc2wvcm9vdCtzZXJ2ZXJfY2Eu Y3J0IHNzbG1vZGU9cmVxdWlyZSIsCisJJ3BnX2hvc3RzLnRvbWw6IGNvbm5lY3QgdG8gZGVmYXVs dCBob3N0IHdpdGggc3NsbW9kZT1yZXF1aXJlJyk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwor IyBwZ19ob3N0cy50b21sIC0gYnJva2VuIGZpbGUgbG9ncyB0aGUgVE9NTCBwYXJzZSBlcnJvciBv biByZWxvYWQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitvcGVuKCRmaCwgJz4nLCAkdG9tbHBh dGgpCisgIG9yIGRpZSAib3BlbiBwZ19ob3N0cy50b21sIGZvciByZXdyaXRpbmc6ICQhIjsKK3By aW50ICRmaCAiW2hvc3RzXG4iOyAgICAjIHVudGVybWluYXRlZCB0YWJsZSBoZWFkZXIKK2Nsb3Nl KCRmaCk7CisKK215ICRsb2dfb2Zmc2V0ID0gLXMgJG5vZGUtPmxvZ2ZpbGU7Ciskbm9kZS0+cmVs b2FkOworJG5vZGUtPndhaXRfZm9yX2xvZyhxci9jb3VsZCBub3QgbG9hZCAicGdfaG9zdHNcLmNv bmYiLywgJGxvZ19vZmZzZXQpOworbXkgJGxvZyA9IFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOjpz bHVycF9maWxlKCRub2RlLT5sb2dmaWxlLCAkbG9nX29mZnNldCk7CitsaWtlKAorCSRsb2csCisJ cXIvVE9NTCBwYXJzZSBlcnJvci8sCisJInBnX2hvc3RzLnRvbWw6IG1hbGZvcm1lZCBmaWxlIHBy b2R1Y2VzICdUT01MIHBhcnNlIGVycm9yJyBsb2cgZW50cnkiKTsKKworJG5vZGUtPmNvbm5lY3Rf b2soCisJIiRjb25uc3RyIGhvc3Q9ZXhhbXBsZS5vcmcgc3Nscm9vdGNlcnQ9c3NsL3Jvb3RfY2Eu Y3J0IHNzbG1vZGU9dmVyaWZ5LWNhIiwKKwkncGdfaG9zdHMudG9tbDogY29ubmVjdGlvbiBzdGls bCB3b3JrcyBhZnRlciBtYWxmb3JtZWQgcmVsb2FkJyk7CisKK2RvbmVfdGVzdGluZygpOwotLSAK Mi40My4wCgo= --0000000000003578cb0656085432--