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.94.2) (envelope-from ) id 1u9mZL-006GJe-Ui for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Apr 2025 15:08:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1u9mYL-007xQb-Ky for pgsql-hackers@arkaria.postgresql.org; Tue, 29 Apr 2025 15:07:22 +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.94.2) (envelope-from ) id 1u9mYL-007xPX-1i for pgsql-hackers@lists.postgresql.org; Tue, 29 Apr 2025 15:07:22 +0000 Received: from mail-qt1-x82d.google.com ([2607:f8b0:4864:20::82d]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1u9mYJ-000C6r-3D for pgsql-hackers@lists.postgresql.org; Tue, 29 Apr 2025 15:07:21 +0000 Received: by mail-qt1-x82d.google.com with SMTP id d75a77b69052e-47690a4ec97so73061201cf.2 for ; Tue, 29 Apr 2025 08:07:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745939238; x=1746544038; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=nb1lf4i5133axNTTq5g15mSuJR9OkSEMq8K5LG5EoJE=; b=A5LW12gO12mrSROzDH3/sdlUdk1KSZAa71NyiJfJFSpS97T0o4ExU2h63fkbCWRhQ1 i0hxmgunv9+nw3Q/aHNFvS/Q6vgTcQyErs3ygS89tV/i6jCzLYJK+TxsvwMVBGct+2Az omaBwRNaXVyndovi9OFWp5kkFObuXKc05cBYsJOgE4UN2XjJJlGup5zoweUseT9++VFD n7QdDdDSWxABYmT3QZoMVtu2218uAjreXbX3E3gg+qf7bWH88ieoz+SBECoHVQVcmYHw WbT2HU77p5eqm4vv45eShwzcQme8gAdadFHfk2P5lKIU9IKdoXTh9j7ElnKYnO5Qx9SP fzFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745939238; x=1746544038; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=nb1lf4i5133axNTTq5g15mSuJR9OkSEMq8K5LG5EoJE=; b=AINrXcUG7tJBHGdMJaIArrCSBuqjfonYKovG40WhKmC/SbjAy/+vzHSeVSNeh7WP3d Kd5RZSKl2yTNtjBzO/DrIgFoMBauCKmWaN24gAEQDhXH4BrT0zp8Uy2M6dQvxQKnlmsA vnT5vuDz0TbQoqh9rIJjU/UsHpI98XbJpw/74Xm/zIWVapkWiv4GUMvZ7TkPsF3VAOgp zmY2Tng6B1rbdekRxXycpGGayLL9YXHrCU8bcTiXZ3yy1ReS8Zm0OVU331Wym8Upi/eI 5bGWdqW2NwUVGcY5VcqpKGdFdBagaDI2enWpUmqpUqn6rJAnZflBTQ6HIDDV6ak2kQtJ dvkQ== X-Forwarded-Encrypted: i=1; AJvYcCWwEw2OqYmeqRrQg5kNAkG1LwqgU1sDEwgRIce9Va9wPk4UJhnkIu7tQKpgr7UpvZIc8xwa1NJQCmzaga7u@lists.postgresql.org X-Gm-Message-State: AOJu0YytGptx1PuaVgPHGJEiRQihU8FJVCa1vjPbtlQoWjpEb1r2JIq4 p7pLI8pujKuTFZah0eqxjcS9jCOJko/OnRxerrNb9S4m5DhU9yMcX6tbK4VN9UHwM+RFyouEMg1 U1rBqBJgeAsi0znpOT53vfoQCjNs= X-Gm-Gg: ASbGncsTiYpoTEuS19rGiKwv9FhlUizT8zhT9ychlfTF+mWAG6lRhgbyL7NZS1VlCCb EijfhwolF/cz7SwKLntD0TpCpxOCa1U0pVFzJfYdpnC2KQ+RJW/+ufz0DE6BHXHTWtoD7L7CxBU FoRj/MqfzZ6MChza41Xbf4V2C1WjfI+xC2Iy1vMNrP6iRa6pkYZ8XPpgM= X-Google-Smtp-Source: AGHT+IGIZFGplLXW+JvZSjLMxU6nTmRXaWhQj+urpNBgSB/AJd1kjcuIkZb6Thq8aBdIqCRGLuAHNgYAOkrvkJdhn+w= X-Received: by 2002:a05:622a:6090:b0:479:be67:3bd2 with SMTP id d75a77b69052e-48866226462mr50762481cf.23.1745939238047; Tue, 29 Apr 2025 08:07:18 -0700 (PDT) MIME-Version: 1.0 References: <3C304C9E-976C-4FB9-A883-707E0B90756A@justatheory.com> <546E7C54-D2F4-4DBB-9A06-EBBF90265A2C@justatheory.com> <672C8C5E-519A-4B39-9421-E6C31917B271@justatheory.com> In-Reply-To: From: Matheus Alcantara Date: Tue, 29 Apr 2025 12:06:51 -0300 X-Gm-Features: ATxdqUFyDgsjaY9ChGqYS6eQ4ABjAt04Nu-LfNKzWwWfwolBIve5GnYPSBeyGDA Message-ID: Subject: Re: extension_control_path and "directory" To: "David E. Wheeler" Cc: Christoph Berg , Peter Eisentraut , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000159a260633ec289c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000159a260633ec289c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Apr 29, 2025 at 11:08=E2=80=AFAM David E. Wheeler wrote: > Right. My point is a minor one, but I thin you can use an if/ else there: > > ```c > if (strcmp(piece, "$system") =3D=3D 0) { > /* Substitute the path macro if needed */ > mangled =3D substitute_path_macro(piece, "$system", system_dir); > } else { > /* > * Append "extension" suffix in case is a custom extension > * control path. > */ > mangled =3D psprintf("%s/extension", mangled); > } > ``` > The substitute_path_macro() already handles the if/else on "piece" but I think that this if/else version looks nicer. Fixed. I've also included some documentation changes for this v5 version to remove the "extension" from the examples and also mention the scenario when using the "directory" on the .control file. --=20 Matheus Alcantara --000000000000159a260633ec289c Content-Type: application/octet-stream; name="v5-0001-Make-directory-work-with-extension-control-path.patch" Content-Disposition: attachment; filename="v5-0001-Make-directory-work-with-extension-control-path.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ma2n3ujp0 RnJvbSAyYzJiZWRmMzllNmQ2MmRlYTgwZmU5ZDkzNjZjY2I2YzhlMGI0NWRhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFdlZCwgMjMgQXByIDIwMjUgMTY6MTE6MjQgLTAzMDAKU3ViamVjdDogW1BBVENIIHY1XSBN YWtlICJkaXJlY3RvcnkiIHdvcmsgd2l0aCBleHRlbnNpb24gY29udHJvbCBwYXRoCgpQcmV2aW91 c2x5IGV4dGVuc2lvbnMgaW5zdGFsbGVkIG9uIGEgY3VzdG9tIHBhdGggdGhhdCBpcyBhdmFpbGFi bGUgdmlhCmV4dGVuc2lvbl9jb250cm9sX3BhdGggR1VDIHRoYXQgc2V0IHRoZSAiZGlyZWN0b3J5 IiBmaWVsZCBvbiAuY29udHJvbApmaWxlIHdhcyBub3QgYmVpbmcgYWJsZSB0byBDUkVBVEUuIFRo aXMgd2FzIGhhcHBlbmluZyBiZWNhdXNlIG9uCmdldF9leHRlbnNpb25fc2NyaXB0X2RpcmVjdG9y eSB3YXMgaGFyZCBjb2RlZCB0byBzZWFyY2ggZm9yIHRoZSBzY3JpcHQKZmlsZXMgb25seSBvbiB0 aGUgc2hhcmUgc3lzdGVtIGRpci4KClRoaXMgY29tbWl0IGZpeCB0aGlzIGlzc3VlIGJ5IHVzaW5n IHRoZSBjb250cm9sLT5jb250cm9sX2RpciBhcyBhIHNoYXJlCmRpciB0byByZXR1cm4gdGhlIHBh dGggb2YgdGhlIGV4dGVuc2lvbiBzY3JpcHQgZmlsZXMuCi0tLQogZG9jL3NyYy9zZ21sL2NvbmZp Zy5zZ21sICAgICAgICAgICAgICAgICAgICAgIHwgIDIyICsrLS0KIHNyYy9iYWNrZW5kL2NvbW1h bmRzL2V4dGVuc2lvbi5jICAgICAgICAgICAgICB8IDEwMiArKysrKysrKysrKysrLS0tLS0KIC4u Li90LzAwMV9leHRlbnNpb25fY29udHJvbF9wYXRoLnBsICAgICAgICAgICB8ICA5MyArKysrKysr KysrKy0tLS0tCiAzIGZpbGVzIGNoYW5nZWQsIDE2MSBpbnNlcnRpb25zKCspLCA1NiBkZWxldGlv bnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwgYi9kb2Mvc3JjL3Nn bWwvY29uZmlnLnNnbWwKaW5kZXggMDA3ZjFmYmUwMDYuLjZjOTQxZjgyYzkyIDEwMDY0NAotLS0g YS9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21s CkBAIC0xMTAyOSwxNiArMTEwMjksMjYgQEAgZHluYW1pY19saWJyYXJ5X3BhdGggPSAnQzpcdG9v bHNccG9zdGdyZXNxbDtIOlxteV9wcm9qZWN0XGxpYjskbGliZGlyJwogICAgICAgICAoVXNlIDxs aXRlcmFsPnBnX2NvbmZpZyAtLXNoYXJlZGlyPC9saXRlcmFsPiB0byBmaW5kIG91dCB0aGUgbmFt ZSBvZgogICAgICAgICB0aGlzIGRpcmVjdG9yeS4pIEZvciBleGFtcGxlOgogPHByb2dyYW1saXN0 aW5nPgotZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCA9ICcvdXNyL2xvY2FsL3NoYXJlL3Bvc3RncmVz cWwvZXh0ZW5zaW9uOi9ob21lL215X3Byb2plY3Qvc2hhcmUvZXh0ZW5zaW9uOiRzeXN0ZW0nCitl eHRlbnNpb25fY29udHJvbF9wYXRoID0gJy91c3IvbG9jYWwvc2hhcmUvcG9zdGdyZXNxbDovaG9t ZS9teV9wcm9qZWN0L3NoYXJlOiRzeXN0ZW0nCiA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgICBv ciwgaW4gYSBXaW5kb3dzIGVudmlyb25tZW50OgogPHByb2dyYW1saXN0aW5nPgotZXh0ZW5zaW9u X2NvbnRyb2xfcGF0aCA9ICdDOlx0b29sc1xwb3N0Z3Jlc3FsXGV4dGVuc2lvbjtIOlxteV9wcm9q ZWN0XHNoYXJlXGV4dGVuc2lvbjskc3lzdGVtJworZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCA9ICdD Olx0b29sc1xwb3N0Z3Jlc3FsO0g6XG15X3Byb2plY3Rcc2hhcmU7JHN5c3RlbScKIDwvcHJvZ3Jh bWxpc3Rpbmc+Ci0gICAgICAgIE5vdGUgdGhhdCB0aGUgcGF0aCBlbGVtZW50cyBzaG91bGQgdHlw aWNhbGx5IGVuZCBpbgotICAgICAgICA8bGl0ZXJhbD5leHRlbnNpb248L2xpdGVyYWw+IGlmIHRo ZSBub3JtYWwgaW5zdGFsbGF0aW9uIGxheW91dHMgYXJlCi0gICAgICAgIGZvbGxvd2VkLiAgKFRo ZSB2YWx1ZSBmb3IgPGxpdGVyYWw+JHN5c3RlbTwvbGl0ZXJhbD4gYWxyZWFkeSBpbmNsdWRlcwot ICAgICAgICB0aGUgPGxpdGVyYWw+ZXh0ZW5zaW9uPC9saXRlcmFsPiBzdWZmaXguKQorICAgICAg ICBOb3RlIHRoYXQgYWxsIHNwZWNpZmllZCBwYXRoIGVsZW1lbnRzIGFyZSBleHBlY3RlZCB0byBo YXZlIGEKKyAgICAgICAgPGxpdGVyYWw+ZXh0ZW5zaW9uPC9saXRlcmFsPiBzdWJkaXJlY3Rvcnkg d2hpY2ggd2lsbCBoYXZlIHRoZSAuY29udHJvbAorICAgICAgICBhbmQgLnNxbCBmaWxlcywgdGhp cyBwYXRoIHN1ZmZpeCBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGF0IHRoZSBlbmQKKyAgICAg ICAgb2YgZWFjaCBwYXRoLiAoVGhlIHZhbHVlIGZvciA8bGl0ZXJhbD4kc3lzdGVtPC9saXRlcmFs PiBhbHJlYWR5CisgICAgICAgIGluY2x1ZGVzIHRoZSA8bGl0ZXJhbD5leHRlbnNpb248L2xpdGVy YWw+IHN1YmRpcmVjdG9yeS4pCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisgICAg ICAgQWxzbyBub3RlIHRoYXQgZXh0ZW5zaW9uIC5jb250cm9sIGZpbGUgbWF5IGNvbmZpZ3VyZSB0 aGUgLnNxbCBmaWxlcyB0bworICAgICAgIGJlIHBsYWNlZCBpbiBhbm90aGVyIGRpcmVjdG9yeSB1 c2luZyB0aGUgPGxpdGVyYWw+ZGlyZWN0b3J5PC9saXRlcmFsPgorICAgICAgIGZpZWxkIChTZWUg PHhyZWYgbGlua2VuZD0iZXh0ZW5kLWV4dGVuc2lvbnMtZmlsZXMiLz4gZm9yIGRldGFpbHMuKS4g SWYKKyAgICAgICB0aGUgY29uZmlndXJlZCBkaXJlY3RvcnkgaXMgYSByZWxhdGl2ZSBwYXRoLCBp dCB3aWxsIHNlYXJjaCBiYXNlZCBvbiB0aGUKKyAgICAgICBwYXRoIHRoYXQgdGhlIC5jb250cm9s IGZpbGUgd2FzIGZvdW5kLCBmb3IgZXhhbXBsZSwKKyAgICAgICA8bGl0ZXJhbD4vaG9tZS9teV9w cm9qZWN0L3NoYXJlLyZsdDtibGEmZ3Q7PC9saXRlcmFsPi4KICAgICAgICA8L3BhcmE+CiAKICAg ICAgICA8cGFyYT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4dGVuc2lvbi5j IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXh0ZW5zaW9uLmMKaW5kZXggMTgwZjRhZjliZTMuLjU3 N2I5ZjJmZjBkIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHRlbnNpb24uYwor KysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHRlbnNpb24uYwpAQCAtODMsNiArODMsOCBAQCBP aWQJCQlDdXJyZW50RXh0ZW5zaW9uT2JqZWN0ID0gSW52YWxpZE9pZDsKIHR5cGVkZWYgc3RydWN0 IEV4dGVuc2lvbkNvbnRyb2xGaWxlCiB7CiAJY2hhcgkgICAqbmFtZTsJCQkvKiBuYW1lIG9mIHRo ZSBleHRlbnNpb24gKi8KKwljaGFyCSAgICpiYXNlZGlyOwkJLyogYmFzZSBkaXJlY3Rvcnkgd2hl cmUgY29udHJvbCBhbmQgc2NyaXB0CisJCQkJCQkJCSAqIGZpbGVzIGFyZSBsb2NhdGVkICovCiAJ Y2hhcgkgICAqY29udHJvbF9kaXI7CS8qIGRpcmVjdG9yeSB3aGVyZSBjb250cm9sIGZpbGUgd2Fz IGZvdW5kICovCiAJY2hhcgkgICAqZGlyZWN0b3J5OwkJLyogZGlyZWN0b3J5IGZvciBzY3JpcHQg ZmlsZXMgKi8KIAljaGFyCSAgICpkZWZhdWx0X3ZlcnNpb247CS8qIGRlZmF1bHQgaW5zdGFsbCB0 YXJnZXQgdmVyc2lvbiwgaWYgYW55ICovCkBAIC0xNTMsNiArMTU1LDcgQEAgc3RhdGljIHZvaWQg RXhlY0FsdGVyRXh0ZW5zaW9uQ29udGVudHNSZWN1cnNlKEFsdGVyRXh0ZW5zaW9uQ29udGVudHNT dG10ICpzdG10LAogc3RhdGljIGNoYXIgKnJlYWRfd2hvbGVfZmlsZShjb25zdCBjaGFyICpmaWxl bmFtZSwgaW50ICpsZW5ndGgpOwogc3RhdGljIEV4dGVuc2lvbkNvbnRyb2xGaWxlICpuZXdfRXh0 ZW5zaW9uQ29udHJvbEZpbGUoY29uc3QgY2hhciAqZXh0bmFtZSk7CiAKK2NoYXIJICAgKmZpbmRf aW5fcGF0aHMoY29uc3QgY2hhciAqYmFzZW5hbWUsIExpc3QgKnBhdGhzKTsKIAogLyoKICAqIGdl dF9leHRlbnNpb25fb2lkIC0gZ2l2ZW4gYW4gZXh0ZW5zaW9uIG5hbWUsIGxvb2sgdXAgdGhlIE9J RApAQCAtMzc0LDggKzM3NywxNSBAQCBnZXRfZXh0ZW5zaW9uX2NvbnRyb2xfZGlyZWN0b3JpZXMo dm9pZCkKIAkJCXBpZWNlID0gcGFsbG9jKGxlbiArIDEpOwogCQkJc3RybGNweShwaWVjZSwgZWNw LCBsZW4gKyAxKTsKIAotCQkJLyogU3Vic3RpdHV0ZSB0aGUgcGF0aCBtYWNybyBpZiBuZWVkZWQg Ki8KLQkJCW1hbmdsZWQgPSBzdWJzdGl0dXRlX3BhdGhfbWFjcm8ocGllY2UsICIkc3lzdGVtIiwg c3lzdGVtX2Rpcik7CisJCQkvKgorCQkJICogU3Vic3RpdHV0ZSB0aGUgcGF0aCBtYWNybyBpZiBu ZWVkZWQgb3IgYXBwZW5kICJleHRlbnNpb24iCisJCQkgKiBzdWZmaXggaW4gY2FzZSBpcyBhIGN1 c3RvbSBleHRlbnNpb24gY29udHJvbCBwYXRoLgorCQkJICovCisJCQlpZiAoc3RyY21wKHBpZWNl LCAiJHN5c3RlbSIpID09IDApCisJCQkJbWFuZ2xlZCA9IHN1YnN0aXR1dGVfcGF0aF9tYWNybyhw aWVjZSwgIiRzeXN0ZW0iLCBzeXN0ZW1fZGlyKTsKKwkJCWVsc2UKKwkJCQltYW5nbGVkID0gcHNw cmludGYoIiVzL2V4dGVuc2lvbiIsIHBpZWNlKTsKKwogCQkJcGZyZWUocGllY2UpOwogCiAJCQkv KiBDYW5vbmljYWxpemUgdGhlIHBhdGggYmFzZWQgb24gdGhlIE9TIGFuZCBhZGQgdG8gdGhlIGxp c3QgKi8KQEAgLTQwMSwyOCArNDExLDE2IEBAIGdldF9leHRlbnNpb25fY29udHJvbF9kaXJlY3Rv cmllcyh2b2lkKQogc3RhdGljIGNoYXIgKgogZmluZF9leHRlbnNpb25fY29udHJvbF9maWxlbmFt ZShFeHRlbnNpb25Db250cm9sRmlsZSAqY29udHJvbCkKIHsKLQljaGFyCQlzaGFyZXBhdGhbTUFY UEdQQVRIXTsKLQljaGFyCSAgICpzeXN0ZW1fZGlyOwogCWNoYXIJICAgKmJhc2VuYW1lOwotCWNo YXIJICAgKmVjcDsKIAljaGFyCSAgICpyZXN1bHQ7CisJTGlzdAkgICAqcGF0aHM7CiAKIAlBc3Nl cnQoY29udHJvbC0+bmFtZSk7CiAKLQlnZXRfc2hhcmVfcGF0aChteV9leGVjX3BhdGgsIHNoYXJl cGF0aCk7Ci0Jc3lzdGVtX2RpciA9IHBzcHJpbnRmKCIlcy9leHRlbnNpb24iLCBzaGFyZXBhdGgp OwotCiAJYmFzZW5hbWUgPSBwc3ByaW50ZigiJXMuY29udHJvbCIsIGNvbnRyb2wtPm5hbWUpOwog Ci0JLyoKLQkgKiBmaW5kX2luX3BhdGgoKSBkb2VzIG5vdGhpbmcgaWYgdGhlIHBhdGggdmFsdWUg aXMgZW1wdHkuICBUaGlzIGlzIHRoZQotCSAqIGhpc3RvcmljYWwgYmVoYXZpb3IgZm9yIGR5bmFt aWNfbGlicmFyeV9wYXRoLCBidXQgaXQgbWFrZXMgbm8gc2Vuc2UgZm9yCi0JICogZXh0ZW5zaW9u cy4gIFNvIGluIHRoYXQgY2FzZSwgc3Vic3RpdHV0ZSBhIGRlZmF1bHQgdmFsdWUuCi0JICovCi0J ZWNwID0gRXh0ZW5zaW9uX2NvbnRyb2xfcGF0aDsKLQlpZiAoc3RybGVuKGVjcCkgPT0gMCkKLQkJ ZWNwID0gIiRzeXN0ZW0iOwotCXJlc3VsdCA9IGZpbmRfaW5fcGF0aChiYXNlbmFtZSwgZWNwLCAi ZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCIsICIkc3lzdGVtIiwgc3lzdGVtX2Rpcik7CisJcGF0aHMg PSBnZXRfZXh0ZW5zaW9uX2NvbnRyb2xfZGlyZWN0b3JpZXMoKTsKKwlyZXN1bHQgPSBmaW5kX2lu X3BhdGhzKGJhc2VuYW1lLCBwYXRocyk7CiAKIAlpZiAocmVzdWx0KQogCXsKQEAgLTQzOSwxMiAr NDM3LDExIEBAIGZpbmRfZXh0ZW5zaW9uX2NvbnRyb2xfZmlsZW5hbWUoRXh0ZW5zaW9uQ29udHJv bEZpbGUgKmNvbnRyb2wpCiBzdGF0aWMgY2hhciAqCiBnZXRfZXh0ZW5zaW9uX3NjcmlwdF9kaXJl Y3RvcnkoRXh0ZW5zaW9uQ29udHJvbEZpbGUgKmNvbnRyb2wpCiB7Ci0JY2hhcgkJc2hhcmVwYXRo W01BWFBHUEFUSF07Ci0JY2hhcgkgICAqcmVzdWx0OwotCiAJLyoKIAkgKiBUaGUgZGlyZWN0b3J5 IHBhcmFtZXRlciBjYW4gYmUgb21pdHRlZCwgYWJzb2x1dGUsIG9yIHJlbGF0aXZlIHRvIHRoZQot CSAqIGluc3RhbGxhdGlvbidzIHNoYXJlIGRpcmVjdG9yeS4KKwkgKiBpbnN0YWxsYXRpb24ncyBi YXNlIGRpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIHRoZSBzaGFyZWRpciBvciBhIGN1c3RvbQorCSAq IHBhdGggdGhhdCBpdCB3YXMgc2V0IGV4dGVuc2lvbl9jb250cm9sX3BhdGguIEl0IGRlcGVuZHMg d2hlcmUgdGhlCisJICogLmNvbnRyb2wgZmlsZSB3YXMgZm91bmQuCiAJICovCiAJaWYgKCFjb250 cm9sLT5kaXJlY3RvcnkpCiAJCXJldHVybiBwc3RyZHVwKGNvbnRyb2wtPmNvbnRyb2xfZGlyKTsK QEAgLTQ1MiwxMSArNDQ5LDggQEAgZ2V0X2V4dGVuc2lvbl9zY3JpcHRfZGlyZWN0b3J5KEV4dGVu c2lvbkNvbnRyb2xGaWxlICpjb250cm9sKQogCWlmIChpc19hYnNvbHV0ZV9wYXRoKGNvbnRyb2wt PmRpcmVjdG9yeSkpCiAJCXJldHVybiBwc3RyZHVwKGNvbnRyb2wtPmRpcmVjdG9yeSk7CiAKLQln ZXRfc2hhcmVfcGF0aChteV9leGVjX3BhdGgsIHNoYXJlcGF0aCk7Ci0JcmVzdWx0ID0gKGNoYXIg KikgcGFsbG9jKE1BWFBHUEFUSCk7Ci0Jc25wcmludGYocmVzdWx0LCBNQVhQR1BBVEgsICIlcy8l cyIsIHNoYXJlcGF0aCwgY29udHJvbC0+ZGlyZWN0b3J5KTsKLQotCXJldHVybiByZXN1bHQ7CisJ QXNzZXJ0KGNvbnRyb2wtPmJhc2VkaXIgIT0gTlVMTCk7CisJcmV0dXJuIHBzcHJpbnRmKCIlcy8l cyIsIGNvbnRyb2wtPmJhc2VkaXIsIGNvbnRyb2wtPmRpcmVjdG9yeSk7CiB9CiAKIHN0YXRpYyBj aGFyICoKQEAgLTU1MCw2ICs1NDQsMTQgQEAgcGFyc2VfZXh0ZW5zaW9uX2NvbnRyb2xfZmlsZShF eHRlbnNpb25Db250cm9sRmlsZSAqY29udHJvbCwKIAkJCQkgZXJyaGludCgiVGhlIGV4dGVuc2lv biBtdXN0IGZpcnN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIHdoZXJlIFBvc3RncmVTUUwg aXMgcnVubmluZy4iKSkpOwogCX0KIAorCS8qIEFzc2VydCB0aGF0IHRoZSBjb250cm9sX2RpciBl bmRzIHdpdGggL2V4dGVuc2lvbiAqLworCUFzc2VydChjb250cm9sLT5jb250cm9sX2RpciAhPSBO VUxMKTsKKwlBc3NlcnQoc3RyY21wKGNvbnRyb2wtPmNvbnRyb2xfZGlyICsgc3RybGVuKGNvbnRy b2wtPmNvbnRyb2xfZGlyKSAtIHN0cmxlbigiL2V4dGVuc2lvbiIpLCAiL2V4dGVuc2lvbiIpID09 IDApOworCisJY29udHJvbC0+YmFzZWRpciA9IHBuc3RyZHVwKAorCQkJCQkJCQljb250cm9sLT5j b250cm9sX2RpciwKKwkJCQkJCQkJc3RybGVuKGNvbnRyb2wtPmNvbnRyb2xfZGlyKSAtIHN0cmxl bigiL2V4dGVuc2lvbiIpKTsKKwogCWlmICgoZmlsZSA9IEFsbG9jYXRlRmlsZShmaWxlbmFtZSwg InIiKSkgPT0gTlVMTCkKIAl7CiAJCS8qIG5vIGNvbXBsYWludCBmb3IgbWlzc2luZyBhdXhpbGlh cnkgZmlsZSAqLwpAQCAtMzg2MywzICszODY1LDUxIEBAIG5ld19FeHRlbnNpb25Db250cm9sRmls ZShjb25zdCBjaGFyICpleHRuYW1lKQogCiAJcmV0dXJuIGNvbnRyb2w7CiB9CisKKworLyoKKyAq IFdvcmsgaW4gYSB2ZXJ5IHNpbWlsYXIgd2F5IHdpdGggZmluZF9pbl9wYXRoIGJ1dCBpdCByZWNl aXZlcyBhbiBhbHJlYWR5CisgKiBwYXJzZWQgTGlzdCBvZiBwYXRocyB0byBzZWFyY2ggdGhlIGJh c2VuYW1lIGFuZCBpdCBkbyBub3Qgc3VwcG9ydCBtYWNybworICogcmVwbGFjZW1lbnQgb3IgY3Vz dG9tIGVycm9yIG1lc3NhZ2VzIChmb3Igc2ltcGxpY2l0eSkuCisgKgorICogQnkgImFscmVhZHkg cGFyc2VkIExpc3Qgb2YgcGF0aHMiIHRoaXMgZnVuY3Rpb24gZXhwZWN0ZWQgdGhhdCBwYXRocyBh bHJlYWR5CisgKiBoYXZlIGFsbCBtYWNyb3MgcmVwbGFjZWQuCisgKi8KK2NoYXIgKgorZmluZF9p bl9wYXRocyhjb25zdCBjaGFyICpiYXNlbmFtZSwgTGlzdCAqcGF0aHMpCit7CisJTGlzdENlbGwg ICAqY2VsbDsKKworCS8qCisJICogSWYgdGhlIHBhdGhzIHZhcmlhYmxlIGlzIGVtcHR5LCBkb24n dCBkbyBhIHBhdGggc2VhcmNoLgorCSAqLworCWlmIChwYXRocyA9PSBOSUwpCisJCXJldHVybiBO VUxMOworCisJZm9yZWFjaChjZWxsLCBwYXRocykKKwl7CisJCWNoYXIJICAgKnBhdGggPSAoY2hh ciAqKSBsZmlyc3QoY2VsbCk7CisJCWNoYXIJICAgKmZ1bGw7CisKKwkJQXNzZXJ0KHBhdGggIT0g TlVMTCk7CisKKwkJY2Fub25pY2FsaXplX3BhdGgocGF0aCk7CisKKwkJLyogb25seSBhYnNvbHV0 ZSBwYXRocyAqLworCQlpZiAoIWlzX2Fic29sdXRlX3BhdGgocGF0aCkpCisJCQllcmVwb3J0KEVS Uk9SLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfTkFNRSksCisJCQkJCSBlcnJtc2co ImNvbXBvbmVudCBpbiBwYXJhbWV0ZXIgXCJleHRlbnNpb25fY29udHJvbF9wYXRoXCIgaXMgbm90 IGFuIGFic29sdXRlIHBhdGgiKSkpOworCisJCWZ1bGwgPSBwc3ByaW50ZigiJXMvJXMiLCBwYXRo LCBiYXNlbmFtZSk7CisKKwkJZWxvZyhERUJVRzMsICIlczogdHJ5aW5nIFwiJXNcIiIsIF9fZnVu Y19fLCBmdWxsKTsKKworCQlpZiAocGdfZmlsZV9leGlzdHMoZnVsbCkpCisJCQlyZXR1cm4gZnVs bDsKKworCQlwZnJlZShmdWxsKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBh L3NyYy90ZXN0L21vZHVsZXMvdGVzdF9leHRlbnNpb25zL3QvMDAxX2V4dGVuc2lvbl9jb250cm9s X3BhdGgucGwgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZXh0ZW5zaW9ucy90LzAwMV9leHRlbnNp b25fY29udHJvbF9wYXRoLnBsCmluZGV4IGMxODZjMTQ3MGY3Li4xZWY3OWQ3NTc0ZiAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2V4dGVuc2lvbnMvdC8wMDFfZXh0ZW5zaW9uX2Nv bnRyb2xfcGF0aC5wbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZXh0ZW5zaW9ucy90LzAw MV9leHRlbnNpb25fY29udHJvbF9wYXRoLnBsCkBAIC01LDYgKzUsNyBAQCB1c2Ugd2FybmluZ3Mg RkFUQUwgPT4gJ2FsbCc7CiB1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKIHVzZSBQb3N0 Z3JlU1FMOjpUZXN0OjpVdGlsczsKIHVzZSBUZXN0OjpNb3JlOwordXNlIEZpbGU6OlBhdGggcXco IG1ha2VfcGF0aCApOwogCiBteSAkbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5l dygnbm9kZScpOwogCkBAIC0xMiwyNSArMTMsMTQgQEAgJG5vZGUtPmluaXQ7CiAKICMgQ3JlYXRl IGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgdGhlIGV4dGVuc2lvbiBjb250cm9sIGZpbGUKIG15 ICRleHRfZGlyID0gUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6OnRlbXBkaXIoKTsKK21ha2VfcGF0 aCgiJGV4dF9kaXIvZXh0ZW5zaW9uIik7CisKIG15ICRleHRfbmFtZSA9ICJ0ZXN0X2N1c3RvbV9l eHRfcGF0aHMiOwotbXkgJGNvbnRyb2xfZmlsZSA9ICIkZXh0X2Rpci8kZXh0X25hbWUuY29udHJv bCI7Ci1teSAkc3FsX2ZpbGUgPSAiJGV4dF9kaXIvJGV4dF9uYW1lLS0xLjAuc3FsIjsKLQotIyBD cmVhdGUgLmNvbnRyb2wgLnNxbCBmaWxlCi1vcGVuIG15ICRjZiwgJz4nLCAkY29udHJvbF9maWxl IG9yIGRpZSAiQ291bGQgbm90IGNyZWF0ZSBjb250cm9sIGZpbGU6ICQhIjsKLXByaW50ICRjZiAi Y29tbWVudCA9ICdUZXN0IGV4dGVuc2lvbl9jb250cm9sX3BhdGgnXG4iOwotcHJpbnQgJGNmICJk ZWZhdWx0X3ZlcnNpb24gPSAnMS4wJ1xuIjsKLXByaW50ICRjZiAicmVsb2NhdGFibGUgPSB0cnVl XG4iOwotY2xvc2UgJGNmOwotCi0jIENyZWF0ZSAtLTEuMC5zcWwgZmlsZQotb3BlbiBteSAkc3Fs ZiwgJz4nLCAkc3FsX2ZpbGUgb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIHNxbCBmaWxlOiAkISI7 Ci1wcmludCAkc3FsZiAiLyogJHNxbF9maWxlICovXG4iOwotcHJpbnQgJHNxbGYKLSAgIi0tIGNv bXBsYWluIGlmIHNjcmlwdCBpcyBzb3VyY2VkIGluIHBzcWwsIHJhdGhlciB0aGFuIHZpYSBDUkVB VEUgRVhURU5TSU9OXG4iOwotcHJpbnQgJHNxbGYKLSAgcXEnXFxlY2hvIFVzZSAiQ1JFQVRFIEVY VEVOU0lPTiAkZXh0X25hbWUiIHRvIGxvYWQgdGhpcyBmaWxlLiBcXHF1aXRcbic7Ci1jbG9zZSAk c3FsZjsKK2NyZWF0ZV9leHRlbnNpb24oJGV4dF9uYW1lLCAkZXh0X2Rpcik7CisKK215ICRleHRf bmFtZTIgPSAidGVzdF9jdXN0b21fZXh0X3BhdGhzX3VzaW5nX2RpcmVjdG9yeSI7CittYWtlX3Bh dGgoIiRleHRfZGlyLyRleHRfbmFtZTIiKTsKK2NyZWF0ZV9leHRlbnNpb24oJGV4dF9uYW1lMiwg JGV4dF9kaXIsICRleHRfbmFtZTIpOwogCiAjIFVzZSB0aGUgY29ycmVjdCBzZXBhcmF0b3IgYW5k IGVzY2FwZSBcIHdoZW4gcnVubmluZyBvbiBXaW5kb3dzLgogbXkgJHNlcCA9ICR3aW5kb3dzX29z ID8gIjsiIDogIjoiOwpAQCAtNDgsNiArMzgsNyBAQCBpcygkZWNwLCAiXCRzeXN0ZW0kc2VwJGV4 dF9kaXIiLAogCSJjdXN0b20gZXh0ZW5zaW9uIGNvbnRyb2wgZGlyZWN0b3J5IHBhdGggY29uZmln dXJlZCIpOwogCiAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJDUkVBVEUgRVhURU5TSU9O ICRleHRfbmFtZSIpOworJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiQ1JFQVRFIEVYVEVO U0lPTiAkZXh0X25hbWUyIik7CiAKIG15ICRyZXQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jl cycsCiAJInNlbGVjdCAqIGZyb20gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMgd2hlcmUgbmFtZSA9 ICckZXh0X25hbWUnIik7CkBAIC01NSwyNiArNDYsODAgQEAgaXMoICRyZXQsCiAJInRlc3RfY3Vz dG9tX2V4dF9wYXRoc3wxLjB8MS4wfFRlc3QgZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCIsCiAJImV4 dGVuc2lvbiBpcyBpbnN0YWxsZWQgY29ycmVjdGx5IG9uIHBnX2F2YWlsYWJsZV9leHRlbnNpb25z Iik7CiAKLW15ICRyZXQyID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorJHJldCA9ICRu b2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKIAkic2VsZWN0ICogZnJvbSBwZ19hdmFpbGFibGVf ZXh0ZW5zaW9uX3ZlcnNpb25zIHdoZXJlIG5hbWUgPSAnJGV4dF9uYW1lJyIpOwotaXMoICRyZXQy LAoraXMoICRyZXQsCiAJInRlc3RfY3VzdG9tX2V4dF9wYXRoc3wxLjB8dHx0fGZ8dHx8fFRlc3Qg ZXh0ZW5zaW9uX2NvbnRyb2xfcGF0aCIsCiAJImV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgY29ycmVj dGx5IG9uIHBnX2F2YWlsYWJsZV9leHRlbnNpb25fdmVyc2lvbnMiKTsKIAorJHJldCA9ICRub2Rl LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkic2VsZWN0ICogZnJvbSBwZ19hdmFpbGFibGVfZXh0 ZW5zaW9ucyB3aGVyZSBuYW1lID0gJyRleHRfbmFtZTInIik7CitpcyggJHJldCwKKwkidGVzdF9j dXN0b21fZXh0X3BhdGhzX3VzaW5nX2RpcmVjdG9yeXwxLjB8MS4wfFRlc3QgZXh0ZW5zaW9uX2Nv bnRyb2xfcGF0aCIsCisJImV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgY29ycmVjdGx5IG9uIHBnX2F2 YWlsYWJsZV9leHRlbnNpb25zIik7CisKKyRyZXQgPSAkbm9kZS0+c2FmZV9wc3FsKCdwb3N0Z3Jl cycsCisJInNlbGVjdCAqIGZyb20gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbl92ZXJzaW9ucyB3aGVy ZSBuYW1lID0gJyRleHRfbmFtZTInIik7CitpcyggJHJldCwKKwkidGVzdF9jdXN0b21fZXh0X3Bh dGhzX3VzaW5nX2RpcmVjdG9yeXwxLjB8dHx0fGZ8dHx8fFRlc3QgZXh0ZW5zaW9uX2NvbnRyb2xf cGF0aCIsCisJImV4dGVuc2lvbiBpcyBpbnN0YWxsZWQgY29ycmVjdGx5IG9uIHBnX2F2YWlsYWJs ZV9leHRlbnNpb25fdmVyc2lvbnMiKTsKKwogIyBFbnN1cmUgdGhhdCBleHRlbnNpb25zIGluc3Rh bGxlZCBvbiAkc3lzdGVtIGlzIHN0aWxsIHZpc2libGUgd2hlbiB1c2luZyB3aXRoCiAjIGN1c3Rv bSBleHRlbnNpb24gY29udHJvbCBwYXRoLgotbXkgJHJldDMgPSAkbm9kZS0+c2FmZV9wc3FsKCdw b3N0Z3JlcycsCiskcmV0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAogCSJzZWxlY3Qg Y291bnQoKikgPiAwIGFzIG9rIGZyb20gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMgd2hlcmUgbmFt ZSA9ICdwbHBnc3FsJyIKICk7Ci1pcygkcmV0MywgInQiLAoraXMoJHJldCwgInQiLAogCSJcJHN5 c3RlbSBleHRlbnNpb24gaXMgaW5zdGFsbGVkIGNvcnJlY3RseSBvbiBwZ19hdmFpbGFibGVfZXh0 ZW5zaW9ucyIpOwogCiAKLW15ICRyZXQ0ID0gJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAor JHJldCA9ICRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKIAkic2V0IGV4dGVuc2lvbl9jb250 cm9sX3BhdGggPSAnJzsgc2VsZWN0IGNvdW50KCopID4gMCBhcyBvayBmcm9tIHBnX2F2YWlsYWJs ZV9leHRlbnNpb25zIHdoZXJlIG5hbWUgPSAncGxwZ3NxbCciCiApOwotaXMoJHJldDQsICJ0IiwK K2lzKCRyZXQsICJ0IiwKIAkiXCRzeXN0ZW0gZXh0ZW5zaW9uIGlzIGluc3RhbGxlZCBjb3JyZWN0 bHkgb24gcGdfYXZhaWxhYmxlX2V4dGVuc2lvbnMgd2l0aCBlbXB0eSBleHRlbnNpb25fY29udHJv bF9wYXRoIgogKTsKIAorIyBUZXN0IHdpdGggYW4gZXh0ZW5zaW9uIHRoYXQgZG9lcyBub3QgZXhp c3RzCitteSAoJGNvZGUsICRzdGRvdXQsICRzdGRlcnIpID0gICRub2RlLT5wc3FsKCdwb3N0Z3Jl cycsICJDUkVBVEUgRVhURU5TSU9OIGludmFsaWQiKTsKK2lzKCRjb2RlLCAzLCAnZXJyb3IgdG8g Y3JlYXRlIGFuIGV4dGVuc2lvbiB0aGF0IGRvZXMgbm90IGV4aXN0cycpOworbGlrZSgkc3RkZXJy LCBxci9FUlJPUjogIGV4dGVuc2lvbiAiaW52YWxpZCIgaXMgbm90IGF2YWlsYWJsZS8pOworCitz dWIgY3JlYXRlX2V4dGVuc2lvbgoreworCW15ICgkZXh0X25hbWUsICRleHRfZGlyLCAkZGlyZWN0 b3J5KSA9IEBfOworCisJbXkgJGNvbnRyb2xfZmlsZSA9ICIkZXh0X2Rpci9leHRlbnNpb24vJGV4 dF9uYW1lLmNvbnRyb2wiOworCW15ICRzcWxfZmlsZTsKKworCWlmIChkZWZpbmVkICRkaXJlY3Rv cnkpCisJeworCQkkc3FsX2ZpbGUgPSAiJGV4dF9kaXIvJGRpcmVjdG9yeS8kZXh0X25hbWUtLTEu MC5zcWwiOworCX0KKwllbHNlCisJeworCQkkc3FsX2ZpbGUgPSAiJGV4dF9kaXIvZXh0ZW5zaW9u LyRleHRfbmFtZS0tMS4wLnNxbCI7CisJfQorCisJIyBDcmVhdGUgLmNvbnRyb2wgLnNxbCBmaWxl CisJb3BlbiBteSAkY2YsICc+JywgJGNvbnRyb2xfZmlsZSBvciBkaWUgIkNvdWxkIG5vdCBjcmVh dGUgY29udHJvbCBmaWxlOiAkISI7CisJcHJpbnQgJGNmICJjb21tZW50ID0gJ1Rlc3QgZXh0ZW5z aW9uX2NvbnRyb2xfcGF0aCdcbiI7CisJcHJpbnQgJGNmICJkZWZhdWx0X3ZlcnNpb24gPSAnMS4w J1xuIjsKKwlwcmludCAkY2YgInJlbG9jYXRhYmxlID0gdHJ1ZVxuIjsKKwlpZiAoZGVmaW5lZCAk ZGlyZWN0b3J5KQorCXsKKwkJcHJpbnQgJGNmICJkaXJlY3RvcnkgPSAkZGlyZWN0b3J5IjsKKwl9 CisJY2xvc2UgJGNmOworCisJIyBDcmVhdGUgLS0xLjAuc3FsIGZpbGUKKwlvcGVuIG15ICRzcWxm LCAnPicsICRzcWxfZmlsZSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgc3FsIGZpbGU6ICQhIjsK KwlwcmludCAkc3FsZiAiLyogJHNxbF9maWxlICovXG4iOworCXByaW50ICRzcWxmCisJICAiLS0g Y29tcGxhaW4gaWYgc2NyaXB0IGlzIHNvdXJjZWQgaW4gcHNxbCwgcmF0aGVyIHRoYW4gdmlhIENS RUFURSBFWFRFTlNJT05cbiI7CisJcHJpbnQgJHNxbGYKKwkgIHFxJ1xcZWNobyBVc2UgIkNSRUFU RSBFWFRFTlNJT04gJGV4dF9uYW1lIiB0byBsb2FkIHRoaXMgZmlsZS4gXFxxdWl0XG4nOworCWNs b3NlICRzcWxmOworfQorCiBkb25lX3Rlc3RpbmcoKTsKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1 NCkKCg== --000000000000159a260633ec289c--