From mboxrd@z Thu Jan 1 00:00:00 1970 From: Federico Beffa Subject: Re: hackage importer Date: Sun, 22 Mar 2015 21:12:44 +0100 Message-ID: References: <87k2yiqqaw.fsf@gnu.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=089e0149431824fb520511e62c8e Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:42211) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YZmEu-0002qP-Ge for guix-devel@gnu.org; Sun, 22 Mar 2015 16:12:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YZmEo-00029d-Qr for guix-devel@gnu.org; Sun, 22 Mar 2015 16:12:52 -0400 In-Reply-To: List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: =?UTF-8?Q?Ludovic_Court=C3=A8s?= Cc: Guix-devel --089e0149431824fb520511e62c8e Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable ludo@gnu.org (Ludovic Court=C3=A8s) writes: > I would use =E2=80=98ghc-=E2=80=99 right from the start, since that=E2=80= =99s really what it > is. WDYT? Agreed! >> Obviously the tests in part 5 were used along the way and will be >> removed. > > More precisely, they=E2=80=99ll have to be turned into tests/hackage.scm > (similar to tests/snix.scm and tests/pypi.scm.) :-) I've created a test for hackage. In doing so I've had an issue with the locale and would like an advice: When I run "guix import hackage package-name" from the shell, or when I invoke a REPL with Geiser everything works fine. When I initially did run the test-suite with make check TESTS=3Dtests/hackage.scm the conditionals conversion looked wrong. I've found that this is related to the choice of locale. To make the test work as desired I added '(setlocale LC_ALL "en_US.UTF-8")' to the file declaring the tests. I suppose that running the 'guix import ...' command does get the locale from the shell. Should I somehow force the locale within the '(guix import hackage)' module? >> +;; List of libraries distributed with ghc (7.8.4). >> +(define ghc-standard-libraries >> + '("haskell98" ; 2.0.0.3 >> + "hoopl" ; 3.10.0.1 > > Maybe the version numbers in comments can be omitted since they=E2=80=99l= l > become outdated eventually? OK. >> +(define guix-name-prefix "haskell-") > > s/guix-name-prefix/package-name-prefix/ and rather =E2=80=9Cghc-=E2=80=9D= IMO. Agreed. > >> +;; Regular expression matching "key: value" >> +(define key-value-rx >> + "([a-zA-Z0-9-]+): *(\\w?.*)$") >> + >> +;; Regular expression matching a section "head sub-head ..." >> +(define sections-rx >> + "([a-zA-Z0-9\\(\\)-]+)") >> + >> +;; Cabal comment. >> +(define comment-rx >> + "^ *--") > > Use (make-regexp ...) directly, and then =E2=80=98regexp-exec=E2=80=99 in= stead of > =E2=80=98string-match=E2=80=99. I already had in mind to change these before sending the e-mail, but I forgot. It's now done. > >> +;; Check if the current line includes a key >> +(define (has-key? line) >> + (string-match key-value-rx line)) >> + >> +(define (comment-line? line) >> + (string-match comment-rx line)) >> + >> +;; returns the number of indentation spaces and the rest of the line. >> +(define (line-indentation+rest line) > > Please turn all the comments above procedures this into docstrings. Done. > >> +;; Part 1 main function: read a cabal fila and filter empty lines and c= omments. >> +;; Returns a list composed by the pre-processed lines of the file. >> +(define (read-cabal port) > > s/fila/file/ > s/Returns/Return/ > > I would expect =E2=80=98read-cabal=E2=80=99 to return a record, s= ay, that can be > directly manipulated (just like =E2=80=98read=E2=80=99 returns a Scheme o= bject.) But > here it seems to return an intermediate parsing result, right? OK. I've renamed some functions and the new name should hopefully be a better choice. What was 'read-cabal' has become 'strip-cabal' (which only strips comments and empty lines). >> +;; Parses a cabal file in the form of a list of lines as produced by >> +;; READ-CABAL and returns its content in the following form: >> +;; >> +;; (((head1 sub-head1 ... key1) (value)) >> +;; ((head2 sub-head2 ... key2) (value2)) >> +;; ...). >> +;; >> +;; where all elements are strings. >> +;; >> +;; We try do deduce the format from the following document: >> +;; https://www.haskell.org/cabal/users-guide/developing-packages.html >> +;; >> +;; Key values are case-insensitive. We therefore lowercase them. Values= are >> +;; case-sensitive. >> +;; >> +;; Currently only only layout structured files are parsed. Braces {} > > =E2=80=9Conly indentation-structured files=E2=80=9D OK > >> +;; structured files are not handled. >> +(define (cabal->key-values lines) > > I think this is the one I would call =E2=80=98read-cabal=E2=80=99. > ... and I've followed you suggestion and renamed this function to 'read-cab= al'. >> +;; Find if a string represent a conditional >> +(define condition-rx >> + (make-regexp "^if +(.*)$")) > > The comment should rather be =E2=80=9CRegexp for conditionals.=E2=80=9D a= nd be placed > below =E2=80=98define=E2=80=99. OK > I would expect the conversion of conditional expressions to sexps to be > done in the parsing phase above, such that =E2=80=98read-cabal=E2=80=99 r= eturns an > object with some sort of an AST for those conditionals. > > Then this part would focus on the evaluation of those conditionals, > like: > > ;; Evaluate the conditionals in CABAL according to FLAGS. Return an > ;; evaluated Cabal object. > (eval-cabal cabal flags) > > WDYT? I think it's better to keep the parsing phase to a bare minimum and work with layers to keep each function as manageable and simple as possible. The way it works is as follows: 1. 'strip-cabal' reads the file, strips comment and empty lines and return a list. Each element of the list is a line from the Cabal file. 2. 'read-cabal' takes the above list and does the parsing required to read the indentation based structure of the file. It returns a list composed of list pairs. The pair is composed by a list of keys and a list of values. For example, the following snippet name: foo version: 1.0 ... is returned as ((("name") ("foo")) (("version") ("1.0")) ...) This is enough for all the information that we need to build a Guix package, but dependencies. Dependencies are listed in 'Library' and 'Executable cabal' sections of the Cabal file as in the following example snippet: executable cabal build-depends: HTTP >=3D 4000.2.5 && < 4000.3 ... and may include conditionals as in (continuing from above with the proper indentation) if os(windows) build-depends: Win32 >=3D 2 && < 3 else build-depends: unix >=3D 2.0 && < 2.8 ... Now, to make sense of the indentation based structure I need to keep a state indicating how many indentation levels we currently have and the name of the various sub-sections. For this reason I keep a one to one correspondence between indentation levels and section titles. That means that the above snipped is encoded as follows in my Cabal object: ((("executable cabal" "build-depends:") ("HTTP...")) (("executable cabal" "if os(windows)" "build-depends:") ("Win32 ...")) (("executable cabal" "else" "build-depends:") ("unix ...")) ...) If I split 'if' from the predicate 'os(windows)' then the level of indentation and the corresponding section header loose synchronization (different length). For this reason I only convert the predicates from Cabal syntax to Scheme syntax when I take the list of dependencies and convert the list in the form expected in a guix package. I hope to have clarified the strategy. >> +(define (guix-name name) > > Rather =E2=80=98hackage-name->package-name=E2=80=99? OK >> +;; Split the comma separated list of dependencies coming from the cabal= file >> +;; and return a list with inputs suitable for the GUIX package. Curren= tly the >> +;; version information is discarded. > > s/GUIX/Guix/ OK >> +(define (split-dependencies ls) >> + (define (split-at-comma d) >> + (map >> + (lambda (m) >> + (let ((name (guix-name (match:substring m 1)))) >> + (list name (list 'unquote (string->symbol name))))) >> + (list-matches dependencies-rx d))) > > I think it could use simply: > > (map string-trim-both > (string-tokenize d (char-set-complement (char-set #\,)))) Actually, this wouldn't do. On top of splitting at commas, the function al= so translates the name of the package from hackage-name to guix-name. >> +;; Genrate an S-expression containing the list of dependencies. The ge= nerated > > =E2=80=9CGenerate=E2=80=9D Ouch... soo many typos :-( >> +;; S-expressions may include conditionals as defined in the cabal file. >> +;; During this process we discard the version information of the packag= es. >> +(define (dependencies-cond->sexp meta) > > [...] > >> + (match (match:substring rx-result 1) >> + ((? (cut member <> >> + ;; GUIX names are all lower-case. >> + (map (cut string-downcase <>) >> + ghc-standard-libraries))) > > s/GUIX/Guix/ > > I find it hard to read. Typically, I would introduce: > > (define (standard-library? name) > (member name ghc-standard-libraries)) > > and use it here (with the assumption that =E2=80=98ghc-standard-libraries= =E2=80=99 is > already lowercase.) OK, I've followed your advice. I initially kept ghc-standard-libraries capitalized as the original name, but it doesn't really make any sense. >> +;; Run some tests >> + >> +;; (display (cabal->key-values >> +;; (call-with-input-file "mtl.cabal" read-cabal))) >> +;; (display (cabal->key-values >> +;; (call-with-input-file "/home/beffa/tmp/cabal-install.cabal= " read-cabal))) >> +;; (display (get-flags (pre-process-entries-keys (cabal->key-values tes= t-5)))) >> +;; (newline) >> +;; (display (conditional->sexp-like test-cond-2)) >> +;; (newline) >> +;; (display >> +;; (eval-flags (conditional->sexp-like test-cond-6) >> +;; (get-flags (pre-process-entries-keys (cabal->key-values= test-6))))) >> +;; (newline) >> +;; (key->values (cabal->key-values test-1) "name") >> +;; (newline) >> +;; (key-start-end->entries (cabal->key-values test-4) "Library" "CC-Opt= ions") >> +;; (newline) >> +;; (eval-tests (conditional->sexp-like test-cond-6)) > > This should definitely go to tests/hackage.scm. As mentioned above, I've created a test-suite for the hackage and added a couple of thests. > >> + (display (_ "Usage: guix import hackage PACKAGE-NAME >> +Import and convert the Hackage package for PACKAGE-NAME. If PACKAGE-NA= ME >> +includes a suffix constituted by a dash followed by a numerical version= (as >> +used with GUIX packages), then a definition for the specified version o= f the > > s/GUIX/Guix/ OK > Also, guix/scripts/import.scm must be added to po/guix/POTFILES.in, for > i18n. OK, I've added it. Thanks for the review! Fede --089e0149431824fb520511e62c8e Content-Type: text/x-diff; charset=US-ASCII; name="0001-import-Add-hackage-importer.patch" Content-Disposition: attachment; filename="0001-import-Add-hackage-importer.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i7ktyevm0 RnJvbSAyMzFlYTY0NTE5NTA1Zjg0ZTI1MmE0YjNhYjE0ZDM4NTdhOTM3NGMyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGZWRlcmljbyBCZWZmYSA8YmVmZmFAZmJlbmdpbmVlcmluZy5j aD4KRGF0ZTogU2F0LCA3IE1hciAyMDE1IDE3OjIzOjE0ICswMTAwClN1YmplY3Q6IFtQQVRDSCAx LzVdIGltcG9ydDogQWRkIGhhY2thZ2UgaW1wb3J0ZXIuCgoqIGd1aXgvc2NyaXB0cy9pbXBvcnQu c2NtIChpbXBvcnRlcnMpOiBBZGQgaGFja2FnZS4KLS0tCiBndWl4L3NjcmlwdHMvaW1wb3J0LnNj bSB8IDIgKy0KIDEgZmlsZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQoK ZGlmZiAtLWdpdCBhL2d1aXgvc2NyaXB0cy9pbXBvcnQuc2NtIGIvZ3VpeC9zY3JpcHRzL2ltcG9y dC5zY20KaW5kZXggN2U3NWMxMC4uMDZiNGMxNyAxMDA2NDQKLS0tIGEvZ3VpeC9zY3JpcHRzL2lt cG9ydC5zY20KKysrIGIvZ3VpeC9zY3JpcHRzL2ltcG9ydC5zY20KQEAgLTczLDcgKzczLDcgQEAg cmF0aGVyIHRoYW4gXFxuLiIKIDs7OyBFbnRyeSBwb2ludC4KIDs7OwogCi0oZGVmaW5lIGltcG9y dGVycyAnKCJnbnUiICJuaXgiICJweXBpIiAiY3BhbiIpKQorKGRlZmluZSBpbXBvcnRlcnMgJygi Z251IiAibml4IiAicHlwaSIgImNwYW4iICJoYWNrYWdlIikpCiAKIChkZWZpbmUgKHJlc29sdmUt aW1wb3J0ZXIgbmFtZSkKICAgKGxldCAoKG1vZHVsZSAocmVzb2x2ZS1pbnRlcmZhY2UKLS0gCjIu Mi4xCgo= --089e0149431824fb520511e62c8e Content-Type: text/x-diff; charset=UTF-8; name="0002-import-Add-hackage-importer.patch" Content-Disposition: attachment; filename="0002-import-Add-hackage-importer.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i7ktymzk1 RnJvbSBhZDc5YjNiMGJjOGIwOGVjOThmNDliNjY1YjMyY2U5MjU5NTE2NzEzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGZWRlcmljbyBCZWZmYSA8YmVmZmFAZmJlbmdpbmVlcmluZy5j aD4KRGF0ZTogU2F0LCA3IE1hciAyMDE1IDE3OjMwOjE3ICswMTAwClN1YmplY3Q6IFtQQVRDSCAy LzVdIGltcG9ydDogQWRkIGhhY2thZ2UgaW1wb3J0ZXIuCgoqIGd1aXgvc2NyaXB0cy9pbXBvcnQv aGFja2FnZS5zY206IE5ldyBmaWxlLgotLS0KIGd1aXgvc2NyaXB0cy9pbXBvcnQvaGFja2FnZS5z Y20gfCA5NiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxl IGNoYW5nZWQsIDk2IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBndWl4L3Njcmlw dHMvaW1wb3J0L2hhY2thZ2Uuc2NtCgpkaWZmIC0tZ2l0IGEvZ3VpeC9zY3JpcHRzL2ltcG9ydC9o YWNrYWdlLnNjbSBiL2d1aXgvc2NyaXB0cy9pbXBvcnQvaGFja2FnZS5zY20KbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyYjllNQotLS0gL2Rldi9udWxsCisrKyBiL2d1aXgv c2NyaXB0cy9pbXBvcnQvaGFja2FnZS5zY20KQEAgLTAsMCArMSw5NiBAQAorOzs7IEdOVSBHdWl4 IC0tLSBGdW5jdGlvbmFsIHBhY2thZ2UgbWFuYWdlbWVudCBmb3IgR05VCis7OzsgQ29weXJpZ2h0 IMKpIDIwMTUgRmVkZXJpY28gQmVmZmEgPGJlZmZhQGZiZW5naW5lZXJpbmcuY2g+Cis7OzsKKzs7 OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgR3VpeC4KKzs7OworOzs7IEdOVSBHdWl4IGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKzs7 OyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorOzs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorOzs7IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg dmVyc2lvbi4KKzs7OworOzs7IEdOVSBHdWl4IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorOzs7IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7OyBNRVJDSEFOVEFCSUxJVFkgb3Ig RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OzsgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7OworOzs7IFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7 OzsgYWxvbmcgd2l0aCBHTlUgR3VpeC4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcv bGljZW5zZXMvPi4KKworKGRlZmluZS1tb2R1bGUgKGd1aXggc2NyaXB0cyBpbXBvcnQgaGFja2Fn ZSkKKyAgIzp1c2UtbW9kdWxlIChndWl4IHVpKQorICAjOnVzZS1tb2R1bGUgKGd1aXggdXRpbHMp CisgICM6dXNlLW1vZHVsZSAoZ3VpeCBpbXBvcnQgaGFja2FnZSkKKyAgIzp1c2UtbW9kdWxlIChn dWl4IHNjcmlwdHMgaW1wb3J0KQorICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xKQorICAjOnVz ZS1tb2R1bGUgKHNyZmkgc3JmaS0xMSkKKyAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmktMzcpCisg ICM6dXNlLW1vZHVsZSAoaWNlLTkgbWF0Y2gpCisgICM6dXNlLW1vZHVsZSAoaWNlLTkgZm9ybWF0 KQorICAjOmV4cG9ydCAoZ3VpeC1pbXBvcnQtaGFja2FnZSkpCisKKwwKKzs7OworOzs7IENvbW1h bmQtbGluZSBvcHRpb25zLgorOzs7CisKKyhkZWZpbmUgJWRlZmF1bHQtb3B0aW9ucworICAnKCkp CisKKyhkZWZpbmUgKHNob3ctaGVscCkKKyAgKGRpc3BsYXkgKF8gIlVzYWdlOiBndWl4IGltcG9y dCBoYWNrYWdlIFBBQ0tBR0UtTkFNRQorSW1wb3J0IGFuZCBjb252ZXJ0IHRoZSBIYWNrYWdlIHBh Y2thZ2UgZm9yIFBBQ0tBR0UtTkFNRS4gIElmIFBBQ0tBR0UtTkFNRQoraW5jbHVkZXMgYSBzdWZm aXggY29uc3RpdHV0ZWQgYnkgYSBkYXNoIGZvbGxvd2VkIGJ5IGEgbnVtZXJpY2FsIHZlcnNpb24g KGFzCit1c2VkIHdpdGggR3VpeCBwYWNrYWdlcyksIHRoZW4gYSBkZWZpbml0aW9uIGZvciB0aGUg c3BlY2lmaWVkIHZlcnNpb24gb2YgdGhlCitwYWNrYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLiAgSWYg bm8gdmVyc2lvbiBzdWZmaXggaXMgcGVjaWZpZWQsIHRoZW4gdGhlCitnZW5lcmF0ZWQgcGFja2Fn ZSBkZWZpbml0aW9uIHdpbGwgY29ycmVzcG9uZCB0byB0aGUgbGF0ZXN0IGF2YWlsYWJsZQordmVy c2lvbi5cbiIpKQorICAoZGlzcGxheSAoXyAiCisgIC1oLCAtLWhlbHAgICAgICAgICAgICAgZGlz cGxheSB0aGlzIGhlbHAgYW5kIGV4aXQiKSkKKyAgKGRpc3BsYXkgKF8gIgorICAtViwgLS12ZXJz aW9uICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdCIpKQorICAo bmV3bGluZSkKKyAgKHNob3ctYnVnLXJlcG9ydC1pbmZvcm1hdGlvbikpCisKKyhkZWZpbmUgJW9w dGlvbnMKKyAgOzsgU3BlY2lmaWNhdGlvbiBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMuCisg IChjb25zKiAob3B0aW9uICcoI1xoICJoZWxwIikgI2YgI2YKKyAgICAgICAgICAgICAgICAgKGxh bWJkYSBhcmdzCisgICAgICAgICAgICAgICAgICAgKHNob3ctaGVscCkKKyAgICAgICAgICAgICAg ICAgICAoZXhpdCAwKSkpCisgICAgICAgICAob3B0aW9uICcoI1xWICJ2ZXJzaW9uIikgI2YgI2YK KyAgICAgICAgICAgICAgICAgKGxhbWJkYSBhcmdzCisgICAgICAgICAgICAgICAgICAgKHNob3ct dmVyc2lvbi1hbmQtZXhpdCAiZ3VpeCBpbXBvcnQgaGFja2FnZSIpKSkKKyAgICAgICAgICVzdGFu ZGFyZC1pbXBvcnQtb3B0aW9ucykpCisKKwwKKzs7OworOzs7IEVudHJ5IHBvaW50LgorOzs7CisK KyhkZWZpbmUgKGd1aXgtaW1wb3J0LWhhY2thZ2UgLiBhcmdzKQorICAoZGVmaW5lIChwYXJzZS1v cHRpb25zKQorICAgIDs7IFJldHVybiB0aGUgYWxpc3Qgb2Ygb3B0aW9uIHZhbHVlcy4KKyAgICAo YXJncy1mb2xkKiBhcmdzICVvcHRpb25zCisgICAgICAgICAgICAgICAgKGxhbWJkYSAob3B0IG5h bWUgYXJnIHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIChsZWF2ZSAoXyAifkE6IHVucmVjb2du aXplZCBvcHRpb25+JSIpIG5hbWUpKQorICAgICAgICAgICAgICAgIChsYW1iZGEgKGFyZyByZXN1 bHQpCisgICAgICAgICAgICAgICAgICAoYWxpc3QtY29ucyAnYXJndW1lbnQgYXJnIHJlc3VsdCkp CisgICAgICAgICAgICAgICAgJWRlZmF1bHQtb3B0aW9ucykpCisKKyAgKGxldCogKChvcHRzIChw YXJzZS1vcHRpb25zKSkKKyAgICAgICAgIChhcmdzIChmaWx0ZXItbWFwIChtYXRjaC1sYW1iZGEK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCdhcmd1bWVudCAuIHZhbHVlKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoXyAjZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAocmV2ZXJzZSBvcHRzKSkpKQor ICAgIChtYXRjaCBhcmdzCisgICAgICAoKHBhY2thZ2UtbmFtZSkKKyAgICAgICAobGV0ICgoc2V4 cCAoaGFja2FnZS0+Z3VpeC1wYWNrYWdlIHBhY2thZ2UtbmFtZSkpKQorICAgICAgICAgKHVubGVz cyBzZXhwCisgICAgICAgICAgIChsZWF2ZSAoXyAiZmFpbGVkIHRvIGRvd25sb2FkIGNhYmFsIGZp bGUgZm9yIHBhY2thZ2UgJ35hJ34lIikKKyAgICAgICAgICAgICAgICAgIHBhY2thZ2UtbmFtZSkp CisgICAgICAgICBzZXhwKSkKKyAgICAgICgoKQorICAgICAgIChsZWF2ZSAoXyAidG9vIGZldyBh cmd1bWVudHN+JSIpKSkKKyAgICAgICgobWFueSAuLi4pCisgICAgICAgKGxlYXZlIChfICJ0b28g bWFueSBhcmd1bWVudHN+JSIpKSkpKSkKLS0gCjIuMi4xCgo= --089e0149431824fb520511e62c8e Content-Type: text/x-diff; charset=UTF-8; name="0003-import-Add-hackage-importer.patch" Content-Disposition: attachment; filename="0003-import-Add-hackage-importer.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i7ktyuge2 RnJvbSA0NDdjNmI4ZjFlZTZjYzFkNGVkYmE0NGNhYmVmMWIyOGI3NWM3NjA4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGZWRlcmljbyBCZWZmYSA8YmVmZmFAZmJlbmdpbmVlcmluZy5j aD4KRGF0ZTogU3VuLCA4IE1hciAyMDE1IDA3OjQ4OjM4ICswMTAwClN1YmplY3Q6IFtQQVRDSCAz LzVdIGltcG9ydDogQWRkIGhhY2thZ2UgaW1wb3J0ZXIuCgoqIGd1aXgvaW1wb3J0L2hhY2thZ2Uu c2NtOiBOZXcgZmlsZS4KLS0tCiBndWl4L2ltcG9ydC9oYWNrYWdlLnNjbSB8IDc4NyArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEgZmlsZSBjaGFuZ2Vk LCA3ODcgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGd1aXgvaW1wb3J0L2hhY2th Z2Uuc2NtCgpkaWZmIC0tZ2l0IGEvZ3VpeC9pbXBvcnQvaGFja2FnZS5zY20gYi9ndWl4L2ltcG9y dC9oYWNrYWdlLnNjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjJmNDZl Ci0tLSAvZGV2L251bGwKKysrIGIvZ3VpeC9pbXBvcnQvaGFja2FnZS5zY20KQEAgLTAsMCArMSw3 ODcgQEAKKzs7OyBHTlUgR3VpeCAtLS0gRnVuY3Rpb25hbCBwYWNrYWdlIG1hbmFnZW1lbnQgZm9y IEdOVQorOzs7IENvcHlyaWdodCDCqSAyMDE1IEZlZGVyaWNvIEJlZmZhIDxiZWZmYUBmYmVuZ2lu ZWVyaW5nLmNoPgorOzs7Cis7OzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEd1aXguCis7OzsK Kzs7OyBHTlUgR3VpeCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IgbW9kaWZ5IGl0Cis7OzsgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKzs7OyB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7OzsKKzs7OyBHTlUgR3VpeCBpcyBkaXN0cmli dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKzs7OyBXSVRIT1VU IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7Ozsg TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl IHRoZQorOzs7IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7 OzsKKzs7OyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorOzs7IGFsb25nIHdpdGggR05VIEd1aXguICBJZiBub3QsIHNlZSA8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyhkZWZpbmUtbW9kdWxlIChndWl4IGlt cG9ydCBoYWNrYWdlKQorICAjOnVzZS1tb2R1bGUgKGljZS05IG1hdGNoKQorICAjOnVzZS1tb2R1 bGUgKGljZS05IHJlZ2V4KQorICAjOnVzZS1tb2R1bGUgKGljZS05IHJkZWxpbSkKKyAgIzp1c2Ut bW9kdWxlIChpY2UtOSByZWNlaXZlKQorICAjOnVzZS1tb2R1bGUgKGljZS05IHByZXR0eS1wcmlu dCkKKyAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmktMjYpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBz cmZpLTExKQorICAjOnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0xKQorICAjOnVzZS1tb2R1bGUgKChn dWl4IGRvd25sb2FkKSAjOnNlbGVjdCAoZG93bmxvYWQtdG8tc3RvcmUpKQorICAjOnVzZS1tb2R1 bGUgKChndWl4IHV0aWxzKSAjOnNlbGVjdCAocGFja2FnZS1uYW1lLT5uYW1lK3ZlcnNpb24pKQor ICAjOnVzZS1tb2R1bGUgKGd1aXggaW1wb3J0IHV0aWxzKQorICAjOnVzZS1tb2R1bGUgKGd1aXgg c3RvcmUpCisgICM6dXNlLW1vZHVsZSAoZ3VpeCBoYXNoKQorICAjOnVzZS1tb2R1bGUgKGd1aXgg YmFzZTMyKQorICAjOnVzZS1tb2R1bGUgKChndWl4IHV0aWxzKSAjOnNlbGVjdCAoY2FsbC13aXRo LXRlbXBvcmFyeS1vdXRwdXQtZmlsZSkpCisgICM6ZXhwb3J0IChoYWNrYWdlLT5ndWl4LXBhY2th Z2UpKQorCis7OyAodXNlLW1vZHVsZXMgKGljZS05IG1hdGNoKSkKKzs7ICh1c2UtbW9kdWxlcyAo aWNlLTkgcmVnZXgpKQorOzsgKHVzZS1tb2R1bGVzIChpY2UtOSByZGVsaW0pKQorOzsgKHVzZS1t b2R1bGVzIChpY2UtOSByZWNlaXZlKSkKKzs7ICh1c2UtbW9kdWxlcyAoaWNlLTkgcHJldHR5LXBy aW50KSkKKzs7ICh1c2UtbW9kdWxlcyAoc3JmaSBzcmZpLTI2KSkKKzs7ICh1c2UtbW9kdWxlcyAo c3JmaSBzcmZpLTExKSkKKzs7ICh1c2UtbW9kdWxlcyAoc3JmaSBzcmZpLTEpKQorCis7OyBQYXJ0 IDE6Cis7OworOzsgRnVuY3Rpb25zIHVzZWQgdG8gcmVhZCBhIENhYmFsIGZpbGUgYW5kIGRvIHNv bWUgcHJlLXByb2Nlc3Npbmc6IGRpc2NhcmRpbmcKKzs7IGNvbW1lbnRzIGFuZCBlbXB0eSBsaW5l cy4KKworKGRlZmluZSBnaGMtc3RhbmRhcmQtbGlicmFyaWVzCisgIDs7IExpc3Qgb2YgbGlicmFy aWVzIGRpc3RyaWJ1dGVkIHdpdGggZ2hjICg3LjguNCkuCisgICcoImhhc2tlbGw5OCIKKyAgICAi aG9vcGwiCisgICAgImJhc2UiCisgICAgInRyYW5zZm9ybWVycyIKKyAgICAiZGVlcHNlcSIKKyAg ICAiYXJyYXkiCisgICAgImJpbmFyeSIKKyAgICAiYnl0ZXN0cmluZyIKKyAgICAiY29udGFpbmVy cyIKKyAgICAidGltZSIKKyAgICAiY2FiYWwiCisgICAgImJpbi1wYWNrYWdlLWRiIgorICAgICJn aGMtcHJpbSIKKyAgICAiaW50ZWdlci1nbXAiCisgICAgIndpbjMyIgorICAgICJ0ZW1wbGF0ZS1o YXNrZWxsIgorICAgICJwcm9jZXNzIgorICAgICJoYXNrZWxpbmUiCisgICAgInRlcm1pbmZvIgor ICAgICJkaXJlY3RvcnkiCisgICAgImZpbGVwYXRoIgorICAgICJvbGQtbG9jYWxlIgorICAgICJ1 bml4IgorICAgICJvbGQtdGltZSIKKyAgICAicHJldHR5IgorICAgICJ4aHRtbCIKKyAgICAiaHBj IikpCisKKzs7IExpYnJhcmllcyBwcmVzZW50IGluIHRoZSAiSGFza2VsbCBQbGF0Zm9ybSIgMjAx NC4yLjAgYW5kIG5vdCBpbmNsdWRlZCBpbgorOzsgdGhlIEdIQyBzdGFuZGFyZCBsaWJyYXJpZXM6 Cis7OworOzsgInpsaWIiICAgICAgICAgICAgICAgICA7IDAuNS40LjEKKzs7ICJhc3luYyIgICAg ICAgICAgICAgICAgOyAyLjAuMS41Cis7OyAic3RtIiAgICAgICAgICAgICAgICAgIDsgMi40LjIK Kzs7ICJtdGwiICAgICAgICAgICAgICAgICAgOyAyLjEuMy4xCis7OyAicHJpbWl0aXZlIiAgICAg ICAgICAgIDsgMC41LjIuMQorOzsgInBhcmFsbGVsIiAgICAgICAgICAgICA7IDMuMi4wLjQKKzs7 ICJhdHRvcGFyc2VjIiAgICAgICAgICAgOyAwLjEwLjQuMAorOzsgImNhc2UtaW5zZW5zaXRpdmUi ICAgICA7IDEuMS4wLjMKKzs7ICJzeWIiICAgICAgICAgICAgICAgICAgOyAwLjQuMQorOzsgImNv bnRhaW5lcnMiICAgICAgICAgICA7IDAuNS41LjEKKzs7ICJmZ2wiICAgICAgICAgICAgICAgICAg OyA1LjUuMC4xCis7OyAidW5vcmRlcmVkLWNvbnRhaW5lcnMiIDsgMC4yLjMuMworOzsgImhhc2hh YmxlIiAgICAgICAgICAgICA7IDEuMi4xLjAKKzs7ICJzcGxpdCIgICAgICAgICAgICAgICAgOyAw LjIuMgorOzsgInRleHQiICAgICAgICAgICAgICAgICA7IDEuMS4wLjAKKzs7ICJ2ZWN0b3IiICAg ICAgICAgICAgICAgOyAwLjEwLjkuMQorOzsgIkdMVVJhdyIgICAgICAgICAgICAgICA7IDEuNC4w LjEKKzs7ICJPcGVuR0wiICAgICAgICAgICAgICAgOyAyLjkuMi4wCis7OyAiT3BlbkdMUmF3IiAg ICAgICAgICAgIDsgMS41LjAuMAorOzsgIkdMVVQiICAgICAgICAgICAgICAgICA7IDIuNS4xLjEK Kzs7ICJoYXNrZWxsLXNyYyIgICAgICAgICAgOyAxLjAuMS42Cis7OyAibmV0d29yayIgICAgICAg ICAgICAgIDsgMi40LjIuMgorOzsgIkhUVFAiICAgICAgICAgICAgICAgICA7IDQwMDAuMi4xMAor OzsgInJhbmRvbSIgICAgICAgICAgICAgICA7IDEuMC4xLjEKKzs7ICJIVW5pdCIgICAgICAgICAg ICAgICAgOyAxLjIuNS4yCis7OyAiUXVpY2tDaGVjayIgICAgICAgICAgIDsgMi42Cis7OyAiaHRt bCIgICAgICAgICAgICAgICAgIDsgMS4wLjEuMgorOzsgInBhcnNlYyIgICAgICAgICAgICAgICA7 IDMuMS41Cis7OyAicmVnZXgtY29tcGF0IiAgICAgICAgIDsgMC45NS4xCis7OyAicmVnZXgtYmFz ZSIgICAgICAgICAgIDsgMC45My4yCis7OyAicmVnZXgtcG9zaXgiICAgICAgICAgIDsgMC45NS4y CisKKyhkZWZpbmUgcGFja2FnZS1uYW1lLXByZWZpeCAiZ2hjLSIpCisKKyhkZWZpbmUga2V5LXZh bHVlLXJ4CisgIDs7IFJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyAia2V5OiB2YWx1ZSIKKyAg KG1ha2UtcmVnZXhwICIoW2EtekEtWjAtOS1dKyk6ICooXFx3Py4qKSQiKSkKKworKGRlZmluZSBz ZWN0aW9ucy1yeAorICA7OyBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgYSBzZWN0aW9uICJo ZWFkIHN1Yi1oZWFkIC4uLiIKKyAgKG1ha2UtcmVnZXhwICIoW2EtekEtWjAtOVxcKFxcKS1dKyki KSkKKworKGRlZmluZSBjb21tZW50LXJ4CisgIDs7IFJlZ2V4cCBtYXRjaGluZyBDYWJhbCBjb21t ZW50IGxpbmVzLgorICAobWFrZS1yZWdleHAgIl4gKi0tIikpCisKKyhkZWZpbmUgKGhhcy1rZXk/ IGxpbmUpCisgICJDaGVjayBpZiBMSU5FIGluY2x1ZGVzIGEga2V5LiIKKyAgKHJlZ2V4cC1leGVj IGtleS12YWx1ZS1yeCBsaW5lKSkKKworKGRlZmluZSAoY29tbWVudC1saW5lPyBsaW5lKQorICAi Q2hlY2sgaWYgTElORSBpcyBhIGNvbW1lbnQgbGluZS4iCisgIChyZWdleHAtZXhlYyBjb21tZW50 LXJ4IGxpbmUpKQorCisoZGVmaW5lIChsaW5lLWluZGVudGF0aW9uK3Jlc3QgbGluZSkKKyAgIlJl dHVybnMgdHdvIHJlc3VsdHM6IFRoZSBudW1iZXIgb2YgaW5kZW50YXRpb24gc3BhY2VzIGFuZCB0 aGUgcmVzdCBvZiB0aGUKK2xpbmUgKHdpdGhvdXQgaW5kZW50YXRpb24pLiIKKyAgKGxldCBsb29w ICgobGluZS1sc3QgKHN0cmluZy0+bGlzdCBsaW5lKSkKKyAgICAgICAgICAgICAoY291bnQgMCkp CisgICAgKGlmIChvciAobnVsbD8gbGluZS1sc3QpIChub3QgKGVxdj8gKGZpcnN0IGxpbmUtbHN0 KSAjXHNwYWNlKSkpCisgICAgICAgICh2YWx1ZXMgY291bnQgKGxpc3QtPnN0cmluZyBsaW5lLWxz dCkpCisgICAgICAgIChsb29wIChjZHIgbGluZS1sc3QpICgrIGNvdW50IDEpKSkpKQorCisoZGVm aW5lIChzdHJpcC1jYWJhbCBwb3J0KQorICAiUmVhZCBhIENhYmFsIGZpbGUgZnJvbSBQT1JUIGFu ZCBmaWx0ZXIgZW1wdHkgYW5kIGNvbW1lbnQgbGluZXMuCitSZXR1cm4gYSBsaXN0IGNvbXBvc2Vk IGJ5IHRoZSByZW1haW5pbmcgbGluZXMgb2YgdGhlIGZpbGUuIgorICAobGV0IGxvb3AgKChsaW5l IChyZWFkLWxpbmUgcG9ydCkpCisgICAgICAgICAgICAgKHJlc3VsdCAnKCkpKQorICAgIChjb25k CisgICAgICgoZW9mLW9iamVjdD8gbGluZSkKKyAgICAgIChyZXZlcnNlIHJlc3VsdCkpCisgICAg ICgob3IgKHN0cmluZy1udWxsPyBsaW5lKSAoY29tbWVudC1saW5lPyBsaW5lKSkKKyAgICAgIChs b29wIChyZWFkLWxpbmUgcG9ydCkgcmVzdWx0KSkKKyAgICAgKGVsc2UKKyAgICAgIChsb29wIChy ZWFkLWxpbmUgcG9ydCkgKGNvbnMgbGluZSByZXN1bHQpKSkpKSkKKworOzsgUGFydCAyOgorOzsK Kzs7IFRha2UgdGhlIHJlc3VsdCBvZiBwYXJ0IDEgYW5kIGNvbnZlcnQgdGhlIGNvbnRlbnQgb2Yg dGhlIGZpbGUgaW4gYSBsaXN0IG9mCis7OyBsaXN0IHBhaXJzLCB3aGVyZSB0aGUgZmlyc3QgbGlz dCBvZiB0aGUgcGFpciBpbmNsdWRlcyBrZXlzIHdoaWxlIHRoZSBzZWNvbmQKKzs7IGlzIGEgbGlz dCBvZiB2YWx1ZXMuCisKKyhkZWZpbmUgKG11bHRpLWxpbmUtdmFsdWUgbGluZXMgc2VlZCkKKyAg IkZ1bmN0aW9uIHRvIHJlYWQgYSB2YWx1ZSBzcGxpdCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMuIExJ TkVTIGFyZSB0aGUKK3JlbWFpbmluZyBpbnB1dCBsaW5lcyB0byBiZSByZWFkLiBTRUVEIGlzIHRo ZSB2YWx1ZSByZWFkIG9uIHRoZSBzYW1lIGxpbmUgYXMKK3RoZSBrZXkuICBSZXR1cm4gdHdvIHZh bHVlczogQSBsaXN0IHdpdGggdmFsdWVzIGFuZCB0aGUgcmVtYWluaW5nIGxpbmVzIHRvIGJlCitw cm9jZXNzZWQuIgorICAoaWYgKG51bGw/IGxpbmVzKQorICAgICAgKHZhbHVlcyAnKCkgJygpKQor ICAgICAgKGxldC12YWx1ZXMgKCgoY3VycmVudC1pbmRlbnQgdmFsdWUpIChsaW5lLWluZGVudGF0 aW9uK3Jlc3QgKGZpcnN0IGxpbmVzKSkpCisgICAgICAgICAgICAgICAgICAgKChuZXh0LWxpbmUt aW5kZW50IG5leHQtbGluZS12YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgKGlmIChudWxsPyAo Y2RyIGxpbmVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZXMgI2YgIiIpCisgICAg ICAgICAgICAgICAgICAgICAgICAobGluZS1pbmRlbnRhdGlvbityZXN0IChzZWNvbmQgbGluZXMp KSkpKQorICAgICAgICAoaWYgKG9yIChub3QgbmV4dC1saW5lLWluZGVudCkgKDwgbmV4dC1saW5l LWluZGVudCBjdXJyZW50LWluZGVudCkKKyAgICAgICAgICAgICAgICAocmVnZXhwLWV4ZWMgY29u ZGl0aW9uLXJ4IG5leHQtbGluZS12YWx1ZSkpCisgICAgICAgICAgICAodmFsdWVzIChyZXZlcnNl IChjb25zIHZhbHVlIHNlZWQpKSAoY2RyIGxpbmVzKSkKKyAgICAgICAgICAgIChtdWx0aS1saW5l LXZhbHVlIChjZHIgbGluZXMpIChjb25zIHZhbHVlIHNlZWQpKSkpKSkKKworKGRlZmluZSAocmVh ZC1jYWJhbCBsaW5lcykKKyAgIlBhcnNlcyBhIENhYmFsIGZpbGUuICBMSU5FUyBpcyBhIGxpc3Qg d2l0aCBlYWNoIGVsZW1lbnQgYmVpbmcgYSBsaW5lIG9mIGEKK0NhYmFsIGZpbGUsIGFzIHByb2R1 Y2VkIGJ5IFNUUklQLUNBQkFMLiAgUmV0dXJuIGEgbGlzdCBvZiBsaXN0IHBhaXJzOgorCisoKCho ZWFkMSBzdWItaGVhZDEgLi4uIGtleTEpICh2YWx1ZSkpCisgKChoZWFkMiBzdWItaGVhZDIgLi4u IGtleTIpICh2YWx1ZTIpKQorIC4uLikuCisKK1dlIHRyeSBkbyBkZWR1Y2UgdGhlIENhYmFsIGZv cm1hdCBmcm9tIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnQ6CitodHRwczovL3d3dy5oYXNrZWxsLm9y Zy9jYWJhbC91c2Vycy1ndWlkZS9kZXZlbG9waW5nLXBhY2thZ2VzLmh0bWwgCisKK0tleXMgYXJl IGNhc2UtaW5zZW5zaXRpdmUuICBXZSB0aGVyZWZvcmUgbG93ZXJjYXNlIHRoZW0uICBWYWx1ZXMg YXJlCitjYXNlLXNlbnNpdGl2ZS4gIEN1cnJlbnRseSBvbmx5IGluZGVudGF0aW9uLXN0cnVjdHVy ZWQgZmlsZXMgYXJlIHBhcnNlZC4KK0JyYWNlcyBzdHJ1Y3R1cmVkIGZpbGVzIGFyZSBub3QgaGFu ZGxlZC4iIDsiIDwtIG1ha2UgZW1hY3MgaGFwcHkuCisgIChsZXQgbG9vcAorICAgICAgKChsaW5l cyBsaW5lcykKKyAgICAgICAoaW5kZW50cyAgJygpKSA7IG9ubHkgaW5jbHVkZXMgaW5kZW50cyBh dCBzdGFydCBvZiBzZWN0aW9uIGhlYWRzLgorICAgICAgIChzZWN0aW9ucyAnKCkpCisgICAgICAg KHJlc3VsdCAnKCkpKQorICAgIChsZXQtdmFsdWVzCisgICAgICAgICgoKGN1cnJlbnQtaW5kZW50 IGxpbmUpCisgICAgICAgICAgKGlmIChudWxsPyBsaW5lcykKKyAgICAgICAgICAgICAgKHZhbHVl cyAwICIiKQorICAgICAgICAgICAgICAobGluZS1pbmRlbnRhdGlvbityZXN0IChmaXJzdCBsaW5l cykpKSkKKyAgICAgICAgICgobmV4dC1saW5lLWluZGVudCBuZXh0LWxpbmUpCisgICAgICAgICAg KGlmIChvciAobnVsbD8gbGluZXMpIChudWxsPyAoY2RyIGxpbmVzKSkpCisgICAgICAgICAgICAg ICh2YWx1ZXMgMCAiIikKKyAgICAgICAgICAgICAgKGxpbmUtaW5kZW50YXRpb24rcmVzdCAoc2Vj b25kIGxpbmVzKSkpKSkKKyAgICAgIChpZiAobnVsbD8gbGluZXMpCisgICAgICAgICAgKHJldmVy c2UgcmVzdWx0KQorICAgICAgICAgIChsZXQgKChyeC1yZXN1bHQgKGhhcy1rZXk/IGxpbmUpKSkK KyAgICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgKHJ4LXJlc3VsdAorICAgICAgICAgICAg ICAobGV0ICgoa2V5IChzdHJpbmctZG93bmNhc2UgKG1hdGNoOnN1YnN0cmluZyByeC1yZXN1bHQg MSkpKQorICAgICAgICAgICAgICAgICAgICAodmFsdWUgKG1hdGNoOnN1YnN0cmluZyByeC1yZXN1 bHQgMikpKQorICAgICAgICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgICAgIDs7IFNpbXBs ZSBzaW5nbGUgbGluZSAia2V5OiB2YWx1ZSIuCisgICAgICAgICAgICAgICAgICgoPSBuZXh0LWxp bmUtaW5kZW50IGN1cnJlbnQtaW5kZW50KQorICAgICAgICAgICAgICAgICAgKGxvb3AgKGNkciBs aW5lcykgaW5kZW50cyBzZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnMKKyAg ICAgICAgICAgICAgICAgICAgICAgICAobGlzdCAocmV2ZXJzZSAoY29ucyBrZXkgc2VjdGlvbnMp KSAobGlzdCB2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSkpCisgICAg ICAgICAgICAgICAgIDs7IE11bHRpIGxpbmUgImtleTogdmFsdWVcbiB2YWx1ZSBjb250Li4uIi4K KyAgICAgICAgICAgICAgICAgKCg+IG5leHQtbGluZS1pbmRlbnQgY3VycmVudC1pbmRlbnQpCisg ICAgICAgICAgICAgICAgICAobGV0Ki12YWx1ZXMgKCgodmFsdWUtbHN0IGxpbmVzKQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKG11bHRpLWxpbmUtdmFsdWUgKGNkciBsaW5lcykK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAo c3RyaW5nLW51bGw/IHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGAoLHZhbHVlKSkpKSkKKyAgICAgICAgICAgICAgICAgICAg OzsgbXVsdGktbGluZS12YWx1ZSByZXR1cm5zIHRvIHRoZSBmaXJzdCBsaW5lIGFmdGVyIHRoZQor ICAgICAgICAgICAgICAgICAgICA7OyBtdWx0aS12YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAg KGxvb3AgbGluZXMgaW5kZW50cyBzZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAo Y29ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKHJldmVyc2UgKGNvbnMga2V5 IHNlY3Rpb25zKSkgdmFsdWUtbHN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0 KSkpKQorICAgICAgICAgICAgICAgICA7OyBTZWN0aW9uIGVuZGVkLgorICAgICAgICAgICAgICAg ICAoZWxzZQorICAgICAgICAgICAgICAgICAgOzsgSW5kZW50YXRpb24gaXMgcmVkdWNlZC4gQ2hl Y2sgYnkgaG93IG1hbnkgbGV2ZWxzLgorICAgICAgICAgICAgICAgICAgKGxldCogKChpZHggKCsg KGxpc3QtaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhICh4 KSAoPSBuZXh0LWxpbmUtaW5kZW50IHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGluZGVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGhhcy1r ZXk/IG5leHQtbGluZSkgMSAwKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNlYyAoZHJv cCBzZWN0aW9ucyBpZHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIChpbmQgKGRyb3AgaW5k ZW50cyBpZHgpKSkKKyAgICAgICAgICAgICAgICAgICAgKGxvb3AgKGNkciBsaW5lcykgaW5kIHNl YworICAgICAgICAgICAgICAgICAgICAgICAgICAoY29ucyAKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgIChsaXN0IChyZXZlcnNlIChjb25zIGtleSBzZWN0aW9ucykpIChsaXN0IHZhbHVlKSkK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpKSkpKSkKKyAgICAgICAgICAgICA7 OyBTdGFydCBvZiBhIG5ldyBzZWN0aW9uLgorICAgICAgICAgICAgICgob3IgKG51bGw/IGluZGVu dHMpCisgICAgICAgICAgICAgICAgICAoPiBjdXJyZW50LWluZGVudCAoZmlyc3QgaW5kZW50cykp KQorICAgICAgICAgICAgICAobG9vcCAoY2RyIGxpbmVzKSAoY29ucyBjdXJyZW50LWluZGVudCBp bmRlbnRzKQorICAgICAgICAgICAgICAgICAgICAoY29ucyAoc3RyaW5nLWRvd25jYXNlIGxpbmUp IHNlY3Rpb25zKSByZXN1bHQpKQorICAgICAgICAgICAgIChlbHNlCisgICAgICAgICAgICAgIChs b29wIChjZHIgbGluZXMpIGluZGVudHMKKyAgICAgICAgICAgICAgICAgICAgKGNvbnMgKHN0cmlu Zy1kb3duY2FzZSBsaW5lKSAoY2RyIHNlY3Rpb25zKSkKKyAgICAgICAgICAgICAgICAgICAgcmVz dWx0KSkpKSkpKSkKKworKGRlZmluZSBjb25kaXRpb24tcngKKyAgOzsgUmVnZXhwIGZvciBjb25k aXRpb25hbHMuCisgIChtYWtlLXJlZ2V4cCAiXmlmICsoLiopJCIpKQorCisoZGVmaW5lIChzcGxp dC1zZWN0aW9uIHNlY3Rpb24pCisgICJTcGxpdCBTRUNUSU9OIGluIGluZGl2aWR1YWwgd29yZHMg d2l0aCBleGNlcHRpb24gZm9yIHRoZSBwcmVkaWNhdGUgb2YgYW4KKydpZicgY29uZGl0aW9uYWwu IgorICAobGV0ICgocngtcmVzdWx0IChyZWdleHAtZXhlYyBjb25kaXRpb24tcnggc2VjdGlvbikp KQorICAgIChpZiByeC1yZXN1bHQKKyAgICAgICAgYCgiaWYiICwobWF0Y2g6c3Vic3RyaW5nIHJ4 LXJlc3VsdCAxKSkKKyAgICAgICAgKG1hcCBtYXRjaDpzdWJzdHJpbmcgKGxpc3QtbWF0Y2hlcyBz ZWN0aW9ucy1yeCBzZWN0aW9uKSkpKSkKKworKGRlZmluZSAoam9pbi1zZWN0aW9ucyBzZWMxIHNl YzIpCisgIChmb2xkLXJpZ2h0IGNvbnMgc2VjMiBzZWMxKSkKKworKGRlZmluZSAocHJlLXByb2Nl c3Mta2V5cyBrZXkpCisgIChtYXRjaCBrZXkKKyAgICAoKCkgJygpKQorICAgICgoc2VjMSByZXN0 IC4uLikKKyAgICAgKGpvaW4tc2VjdGlvbnMgKHNwbGl0LXNlY3Rpb24gc2VjMSkgKHByZS1wcm9j ZXNzLWtleXMgcmVzdCkpKSkpCisKKyhkZWZpbmUgKHByZS1wcm9jZXNzLWVudHJ5LWtleXMgZW50 cnkpCisgIChtYXRjaCBlbnRyeQorICAgICgoa2V5IHZhbHVlKQorICAgICAobGlzdCAocHJlLXBy b2Nlc3Mta2V5cyBrZXkpIHZhbHVlKSkKKyAgICAoKCkgJygpKSkpCisKKyhkZWZpbmUgKHByZS1w cm9jZXNzLWVudHJpZXMta2V5cyBlbnRyaWVzKQorICAiRU5UUklFUyBpcyBhIGxpc3Qgb2YgbGlz dCBwYWlycywgYSBrZXlzIGxpc3QgYW5kIGEgdmFsdWxlcyBsaXN0LCBhcworcHJvZHVjZWQgYnkg J3JlYWQtY2FiYWwnLiAgU3BsaXQgZWFjaCBlbGVtZW50IG9mIHRoZSBrZXlzIGxpc3QgaW50byBp bmRpdmlkdWFsCit3b3Jkcy4gIFRoaXMgcHJlLXByb2Nlc3NpbmcgaXMgdXNlZCB0byByZWFkIGZs YWdzLiIKKyAgKG1hdGNoIGVudHJpZXMKKyAgICAoKGVudHJ5IHJlc3QgLi4uKQorICAgICAoY29u cyAocHJlLXByb2Nlc3MtZW50cnkta2V5cyBlbnRyeSkKKyAgICAgICAgICAgKHByZS1wcm9jZXNz LWVudHJpZXMta2V5cyByZXN0KSkpCisgICAgKCgpCisgICAgICcoKSkpKQorCisoZGVmaW5lIChn ZXQtZmxhZ3MgcHJlLXByb2Nlc3NlZC1lbnRyaWVzKQorICAiUFJFLVBST0NFU1NFRC1FTlRSSUVT IGlzIGEgbGlzdCBvZiBsaXN0IHBhaXJzLCBhIGtleXMgbGlzdCBhbmQgYSB2YWx1ZXMKK2xpc3Qs IGFzIHByb2R1Y2VkIGJ5ICdyZWFkLWNhYmFsJyBhbmQgcHJlLXByb2Nlc3NlZCBieQorJ3ByZS1w cm9jZXNzLWVudHJpZXMta2V5cycuICBSZXR1cm4gYSBsaXN0IG9mIHBhaXJzIHdpdGggdGhlIG5h bWUgb2YgZmxhZ3MgYW5kCit0aGVpciBkZWZhdWx0IHZhbHVlIChvbmUgb2YgXCJGYWxzZVwiIG9y IFwiVHJ1ZVwiKSBhcyBzcGVjaWZpZWQgaW4gdGhlIENhYmFsIGZpbGU6CisKKygoXCJmbGFnMS1u YW1lXCIgLiBcIkZhbHNlLW9yLVRydWVcIikgLi4uKS4iIDsiIDwtIG1ha2UgZW1hY3MgaGFwcHkK KyAgKG1hdGNoIHByZS1wcm9jZXNzZWQtZW50cmllcworICAgICgoKSAnKCkpCisgICAgKCgoKCJm bGFnIiBmbGFnLW5hbWUgImRlZmF1bHQiKSAoZmxhZy12YWwpKSByZXN0IC4uLikKKyAgICAgKGNv bnMgKGNvbnMgZmxhZy1uYW1lICBmbGFnLXZhbCkKKyAgICAgICAgICAgKGdldC1mbGFncyByZXN0 KSkpCisgICAgKChlbnRyeSByZXN0IC4uLiApCisgICAgIChnZXQtZmxhZ3MgcmVzdCkpCisgICAg KF8gI2YpKSkKKworOzsgUGFydCAzOgorOzsKKzs7IEZ1bmN0aW9ucyB0byByZWFkIGluZm9ybWF0 aW9uIGZyb20gdGhlIENhYmFsIG9iamVjdCBjcmVhdGVkIGJ5ICdyZWFkLWNhYmFsJworOzsgYW5k IHByb2Nlc3MgZGVwZW5kZW5jaWVzIGNvbmRpdGlvbmFscy4KKworKGRlZmluZSB0ZXN0cy1yeAor ICA7OyBDYWJhbCB0ZXN0IGtleXdvcmRzCisgIChtYWtlLXJlZ2V4cCAiKG9zfGFyY2h8ZmxhZ3xp bXBsKVxcKChbYS16QS1aMC05Xy1dKylcXCkiKSkKKworKGRlZmluZSBwYXJlbnMtcngKKyAgOzsg UGFyZW50aGVzZXMgd2l0aGluIGNvbmRpdGlvbnMKKyAgKG1ha2UtcmVnZXhwICJcXCgoLispXFwp IikpCisKKyhkZWZpbmUgb3ItcngKKyAgOzsgT1Igb3BlcmF0b3IgaW4gY29uZGl0aW9ucworICAo bWFrZS1yZWdleHAgIiArXFx8XFx8ICsiKSkKKworKGRlZmluZSBhbmQtcngKKyAgOzsgQU5EIG9w ZXJhdG9yIGluIGNvbmRpdGlvbnMKKyAgKG1ha2UtcmVnZXhwICIgKyYmICsiKSkKKworKGRlZmlu ZSBub3QtcngKKyAgOzsgTk9UIG9wZXJhdG9yIGluIGNvbmRpdGlvbnMKKyAgKG1ha2UtcmVnZXhw ICJeIS4rIikpCisKKyhkZWZpbmUgKGJpLW9wLWFyZ3Mgc3RyIG1hdGNoLWxzdCkKKyAgIlJldHVy biBhIGxpc3Qgd2l0aCB0aGUgYXJndW1lbnRzIG9mIChsb2dpYykgYmlhbnJ5IG9wZXJhdG9ycy4g IE1BVENILUxTVAoraXMgdGhlIHJlc3VsdCBvZiAnbGlzdC1tYXRjaCcgYWdhaW5zdCBhIGJpbmFy eSBvcGVyYXRvciByZWdleHAgb24gU1RSLiIKKyAgKGxldCAoKG9wZXJhdG9ycyAobGVuZ3RoIG1h dGNoLWxzdCkpKQorICAgIChtYXAgKGxhbWJkYSAoZnJvbSB0bykKKyAgICAgICAgICAgKHN1YnN0 cmluZyBzdHIgZnJvbSB0bykpCisgICAgICAgICAoY29ucyAwIChtYXAgbWF0Y2g6ZW5kIG1hdGNo LWxzdCkpCisgICAgICAgICAoYXBwZW5kIChtYXAgbWF0Y2g6c3RhcnQgbWF0Y2gtbHN0KSAobGlz dCAoc3RyaW5nLWxlbmd0aCBzdHIpKSkpKSkKKworKGRlZmluZSAoYmktb3AtPnNleHAtbGlrZSBi aS1vcCBhcmdzKQorICAiQkktT1AgaXMgYSBzdHJpbmcgd2l0aCB0aGUgbmFtZSBvZiBhIFNjaGVt ZSBvcGVyYXRvciB3aGljaCBpbiBhIENhYmFsIGZpbGUKK2lzIHJlcHJlc2VudGVkIGJ5IGEgYmlu YXJ5IG9wZXJhdG9yLiAgQVJHUyBhcmUgdGhlIGFyZ3VtZW50cyBvZiBzYWlkIG9wZXJhdG9yLgor UmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhbiBTLWV4cHJlc3Npb24gb2YgdGhlIG9wZXJh dG9yIGFwcGxpZWQgdG8gaXRzCithcmd1bWVudHMuIgorICAoaWYgKD0gKGxlbmd0aCBhcmdzKSAx KQorICAgICAgKGZpcnN0IGFyZ3MpCisgICAgICAoc3RyaW5nLWFwcGVuZCAiKCIgYmktb3AKKyAg ICAgICAgICAgICAgICAgICAgIChmb2xkIChsYW1iZGEgKGFyZyBzZWVkKSAoc3RyaW5nLWFwcGVu ZCBzZWVkICIgIiBhcmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgYXJncykgIiki KSkpCisKKyhkZWZpbmUgKG5vdC0+c2V4cC1saWtlIGFyZykKKyAgIklmIHRoZSBzdHJpbmcgQVJH IGlzIHByZWZpeGVkIGJ5IGEgQ2FiYWwgbmVnYXRpb24gb3BlcmF0b3IsIGNvbnZlcnQgaXQgdG8K K2FuIGVxdWl2YWxlbnQgU2NoZW1lIFMtZXhwcmVzc2lvbiBzdHJpbmcuIgorICAoaWYgKHJlZ2V4 cC1leGVjIG5vdC1yeCBhcmcpCisgICAgICAoc3RyaW5nLWFwcGVuZCAiKG5vdCAiCisgICAgICAg ICAgICAgICAgICAgICAoc3Vic3RyaW5nIGFyZyAxIChzdHJpbmctbGVuZ3RoIGFyZykpCisgICAg ICAgICAgICAgICAgICAgICAiKSIpCisgICAgICBhcmcpKQorCisoZGVmaW5lIChwYXJlbnMtbGVz cy1jb25kLT5zZXhwLWxpa2UgY29uZGl0aW9uYWwpCisgICJDb252ZXJ0IGEgQ2FiYWwgQ09ORElU SU9OQUwgc3RyaW5nIGludG8gYSBzdHJpbmcgd2l0aCBlcXVpdmFsZW50IFNjaGVtZQorc3ludGF4 LiAgVGhpcyBwcm9jZWR1cmUgYWNjZXB0cyBvbmx5IHNpbXBsZSBjb25kaXRpb25hbHMgd2l0aG91 dCBwYXJlbnRoZXNlcy4iCisgIDs7IFRoZSBvdXRoZXIgb3BlcmF0aW9uIGlzIHRoZSBvbmUgd2l0 aCB0aGUgbG93ZXN0IHByaW9yaXR5OiBPUgorICAoYmktb3AtPnNleHAtbGlrZQorICAgIm9yIgor ICAgOzsgZWFjaCBPUiBhcmd1bWVudCBtYXkgYmUgYW4gQU5EIG9wZXJhdGlvbgorICAgKG1hcCAo bGFtYmRhIChvci1hcmcpCisgICAgICAgICAgKGxldCAoKG0tbHN0IChsaXN0LW1hdGNoZXMgYW5k LXJ4IG9yLWFyZykpKQorICAgICAgICAgICAgOzsgaXMgdGhlcmUgYW4gQU5EIG9wZXJhdGlvbj8K KyAgICAgICAgICAgIChpZiAoPiAobGVuZ3RoIG0tbHN0KSAwKQorICAgICAgICAgICAgICAgIChi aS1vcC0+c2V4cC1saWtlCisgICAgICAgICAgICAgICAgICJhbmQiCisgICAgICAgICAgICAgICAg IDs7IGV4cGFuZCBOT1Qgb3BlcmF0b3JzIHdoZW4gdGhlcmUgYXJlIEFORHMKKyAgICAgICAgICAg ICAgICAgKG1hcCBub3QtPnNleHAtbGlrZSAoYmktb3AtYXJncyBvci1hcmcgbS1sc3QpKSkKKyAg ICAgICAgICAgICAgICA7OyAuLi4gYW5kIHdoZW4gdGhlcmUgYXJlbid0LgorICAgICAgICAgICAg ICAgIChub3QtPnNleHAtbGlrZSBvci1hcmcpKSkpCisgICAgICAgIDs7IGxpc3Qgb2YgT1IgYXJn dW1lbnRzCisgICAgICAgIChiaS1vcC1hcmdzIGNvbmRpdGlvbmFsIChsaXN0LW1hdGNoZXMgb3It cnggY29uZGl0aW9uYWwpKSkpKQorCisoZGVmaW5lIHRlc3Qta2V5d29yZC1vcm5hbWVudCAiwqfC pyIpCisKKyhkZWZpbmUgKGNvbmRpdGlvbmFsLT5zZXhwLWxpa2UgY29uZGl0aW9uYWwpCisgICJD b252ZXJ0IGEgQ2FiYWwgQ09ORElUSU9OQUwgc3RyaW5nIGludG8gYSBzdHJpbmcgd2l0aCBlcXVp dmFsZW50IFNjaGVtZQorc3ludGF4LiIKKyAgOzsgRmlyc3Qgd2Ugc3Vic3RpdHV0ZSBURVNULUtF WVdPUkQtT1JOQU1FTlQgZm9yIHBhcmVudGhlc2VzIGFyb3VuZCB0ZXN0cworICA7OyBrZXl3b3Jk cyBzbyB0aGF0IHBhcmVudGhlc2VzIGFyZSBvbmx5IHVzZWQgdG8gc2V0IHByZWNlZGVuY2VzLiBU aGlzCisgIDs7IHN1YnN0YW50aWFsbHkgc2ltcGxpZnkgcGFyc2luZy4KKyAgKGxldCAoKGNvbmRp dGlvbmFsCisgICAgICAgICAocmVnZXhwLXN1YnN0aXR1dGUvZ2xvYmFsICNmIHRlc3RzLXJ4IGNv bmRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmUgMSB0ZXN0 LWtleXdvcmQtb3JuYW1lbnQgMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 ZXN0LWtleXdvcmQtb3JuYW1lbnQgJ3Bvc3QpKSkKKyAgICAobGV0IGxvb3AgKChzdWItY29uZCBj b25kaXRpb25hbCkpCisgICAgICAobGV0ICgocngtcmVzdWx0IChyZWdleHAtZXhlYyBwYXJlbnMt cnggc3ViLWNvbmQpKSkKKyAgICAgICAgKGNvbmQKKyAgICAgICAgIChyeC1yZXN1bHQKKyAgICAg ICAgICAocGFyZW5zLWxlc3MtY29uZC0+c2V4cC1saWtlCisgICAgICAgICAgIChzdHJpbmctYXBw ZW5kCisgICAgICAgICAgICAobWF0Y2g6cHJlZml4IHJ4LXJlc3VsdCkKKyAgICAgICAgICAgIChs b29wIChtYXRjaDpzdWJzdHJpbmcgcngtcmVzdWx0IDEpKQorICAgICAgICAgICAgKG1hdGNoOnN1 ZmZpeCByeC1yZXN1bHQpKSkpCisgICAgICAgICAoZWxzZQorICAgICAgICAgIChwYXJlbnMtbGVz cy1jb25kLT5zZXhwLWxpa2Ugc3ViLWNvbmQpKSkpKSkpCisKKyhkZWZpbmUgKGV2YWwtZmxhZ3Mg c2V4cC1saWtlLWNvbmQgZmxhZ3MpCisgICJTRVhQLUxJS0UtQ09ORCBpcyBhIHN0cmluZyByZXBy ZXNlbnRpbmcgYW4gUy1leHByZXNzaW9uIGNvbmRpdGlvbmFsLiAgRkxBR1MKK2lzIGEgbGlzdCBv ZiBmbGFnIG5hbWUgYW5kIHZhbHVlIHBhaXJzIGFzIHByb2R1Y2VkIGJ5ICdnZXQtZmxhZ3MnLiAg U3Vic3RpdHV0ZQorXCIjdFwiIG9yIFwiI2ZcIiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIGZs YWdzLiAoRGVmYXVsdCB0byBcIlRydWVcIikuIgorICAoZm9sZC1yaWdodAorICAgKGxhbWJkYSAo ZmxhZyBzZXhwKQorICAgICAobWF0Y2ggZmxhZworICAgICAgICgobmFtZSAuIHZhbHVlKQorICAg ICAgICAobGV0ICgocnggKG1ha2UtcmVnZXhwCisgICAgICAgICAgICAgICAgICAgKHN0cmluZy1h cHBlbmQgImZsYWciIHRlc3Qta2V5d29yZC1vcm5hbWVudCBuYW1lCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdGVzdC1rZXl3b3JkLW9ybmFtZW50KSkpKQorICAgICAgICAgIChy ZWdleHAtc3Vic3RpdHV0ZS9nbG9iYWwKKyAgICAgICAgICAgI2Ygcnggc2V4cAorICAgICAgICAg ICAncHJlIChpZiAoc3RyaW5nLWNpPSB2YWx1ZSAiRmFsc2UiKSAiI2YiICIjdCIpICdwb3N0KSkp CisgICAgICAgKF8gc2V4cCkpKQorICAgc2V4cC1saWtlLWNvbmQKKyAgIChjb25zICcoIlthLXpB LVowLTlfLV0rIiAuICJUcnVlIikgZmxhZ3MpKSkKKworKGRlZmluZSAoZXZhbC10ZXN0cyBzZXhw LWxpa2UtY29uZCkKKyAgIkluIHRoZSBzdHJpbmcgU0VYUC1MSUtFLUNPTkQgc3Vic3RpdHV0ZSB0 ZXN0IGtleXdvcmRzIFwib3MoLi4uKVwiIGFuZAorXCJhcmNoKC4uLilcIiB3aXRoIHN0cmluZ3Mg cmVwcmVzZW50aW5nIFNjaGVtZSBmdW5jdGlvbnMgcGVyZm9ybWluZyBlcXVpdmFsZW50CitjaGVj a3MuIgorICAod2l0aC1pbnB1dC1mcm9tLXN0cmluZyAKKyAgICAgIChmb2xkLXJpZ2h0CisgICAg ICAgKGxhbWJkYSAodGVzdCBzZXhwKQorICAgICAgICAgKG1hdGNoIHRlc3QKKyAgICAgICAgICAg KCh0eXBlIHByZS1tYXRjaCBwb3N0LW1hdGNoKQorICAgICAgICAgICAgKGxldCAoKHJ4IChtYWtl LXJlZ2V4cAorICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWFwcGVuZCB0eXBlIHRlc3Qt a2V5d29yZC1vcm5hbWVudCAiKFxcdyspIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB0ZXN0LWtleXdvcmQtb3JuYW1lbnQpKSkpCisgICAgICAgICAgICAgIChyZWdleHAt c3Vic3RpdHV0ZS9nbG9iYWwKKyAgICAgICAgICAgICAgICNmIHJ4IHNleHAKKyAgICAgICAgICAg ICAgICdwcmUgcHJlLW1hdGNoIDIgcG9zdC1tYXRjaCAncG9zdCkpKQorICAgICAgICAgICAoXyBz ZXhwKSkpCisgICAgICAgc2V4cC1saWtlLWNvbmQKKyAgICAgICA7OyAoJWN1cnJlbnQtc3lzdGVt KSByZXR1cm5zLCBlLmcuLCAieDg2XzY0LWxpbnV4IiBvciAiaTY4Ni1saW51eCIuCisgICAgICAg JygoIihvc3xhcmNoKSIgIihzdHJpbmctbWF0Y2ggXCIiICJcIiAoJWN1cnJlbnQtc3lzdGVtKSki KSkpCisgICAgcmVhZCkpCisKKyhkZWZpbmUgKGV2YWwtaW1wbCBzZXhwLWxpa2UtY29uZCkKKyAg IkNoZWNrIGZvciB0aGUgQ2FiYWwgdGVzdCBcImltcGwoLi4uKVwiIGluIHRoZSBzdHJpbmcgU0VY UC1MSUtFLUNPTkQuCitBc3N1bWUgdGhlIG1vZHVsZSBkZWNsYXJpbmcgdGhlIGdlbmVyYXRlZCBw YWNrYWdlIGluY2x1ZGVzIGEgbG9jYWwgdmFyaWFibGUKK2NhbGxlZCBcImhhc2tlbGwtaW1wbGVt ZW50YXRpb25cIiB3aXRoIGEgc3RyaW5nIHZhbHVlIG9mIHRoZSBmb3JtIE5BTUUtVkVSU0lPTgor YWdhaW5zdCB3aGljaCB3ZSBjb21wYXJlLiIKKyAgKHdpdGgtb3V0cHV0LXRvLXN0cmluZworICAg IChsYW1iZGEgKCkKKyAgICAgICh3cml0ZQorICAgICAgICh3aXRoLWlucHV0LWZyb20tc3RyaW5n IAorICAgICAgICAgICAoZm9sZC1yaWdodAorICAgICAgICAgICAgKGxhbWJkYSAodGVzdCBzZXhw KQorICAgICAgICAgICAgICAobWF0Y2ggdGVzdAorICAgICAgICAgICAgICAgICgocHJlLW1hdGNo IHBvc3QtbWF0Y2gpCisgICAgICAgICAgICAgICAgIChsZXQgKChyeC13aXRoLXZlcnNpb24KKyAg ICAgICAgICAgICAgICAgICAgICAgIChtYWtlLXJlZ2V4cAorICAgICAgICAgICAgICAgICAgICAg ICAgIChzdHJpbmctYXBwZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBsIiB0ZXN0 LWtleXdvcmQtb3JuYW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihbYS16QS1aMC05 Xy1dKykgKihbPD49XSspICooWzAtOS5dKykgKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAg dGVzdC1rZXl3b3JkLW9ybmFtZW50KSkpCisgICAgICAgICAgICAgICAgICAgICAgIChyeC13aXRo b3V0LXZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIChtYWtlLXJlZ2V4cAorICAgICAg ICAgICAgICAgICAgICAgICAgIChzdHJpbmctYXBwZW5kICJpbXBsIiB0ZXN0LWtleXdvcmQtb3Ju YW1lbnQgIihcXHcrKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0 ZXN0LWtleXdvcmQtb3JuYW1lbnQpKSkpCisgICAgICAgICAgICAgICAgICAgKGlmIChyZWdleHAt ZXhlYyByeC13aXRoLXZlcnNpb24gc2V4cCkKKyAgICAgICAgICAgICAgICAgICAgICAgKHJlZ2V4 cC1zdWJzdGl0dXRlL2dsb2JhbAorICAgICAgICAgICAgICAgICAgICAgICAgI2Ygcngtd2l0aC12 ZXJzaW9uIHNleHAKKyAgICAgICAgICAgICAgICAgICAgICAgICdwcmUgcHJlLW1hdGNoIDIgIiBc IiIgMSAiLSIgMyAiXCIgIiBwb3N0LW1hdGNoICdwb3N0KQorICAgICAgICAgICAgICAgICAgICAg ICAocmVnZXhwLXN1YnN0aXR1dGUvZ2xvYmFsCisgICAgICAgICAgICAgICAgICAgICAgICAjZiBy eC13aXRob3V0LXZlcnNpb24gc2V4cAorICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZSBwcmUt bWF0Y2ggIi1tYXRjaCBcIiIgMSAiXCIgIiBwb3N0LW1hdGNoICdwb3N0KSkpKQorICAgICAgICAg ICAgICAgIChfIHNleHApKSkKKyAgICAgICAgICAgIHNleHAtbGlrZS1jb25kCisgICAgICAgICAg ICAnKCgiKHN0cmluZyIgImhhc2tlbGwtaW1wbGVtZW50YXRpb24pIikpKQorICAgICAgICAgcmVh ZCkpKSkpCisKKyhkZWZpbmUgKGtleS0+dmFsdWVzIG1ldGEga2V5KQorICAiTUVUQSBpcyB0aGUg cmVwcmVzZW50YXRpb24gb2YgYSBDYWJhbCBmaWxlIGFzIHByb2R1Y2VkIGJ5ICdyZWFkLWNhYmFs Jy4KK1JldHVybiB0aGUgbGlzdCBvZiB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMg S0VZIChhIHN0cmluZykuIgorICAobWF0Y2ggbWV0YQorICAgICgoKSAnKCkpCisgICAgKCgoKCg/ IChsYW1iZGEoeCkgKGVxdWFsPyB4IGtleSkpKSkgdikgciAuLi4pCisgICAgIHYpCisgICAgKCgo ayB2KSByIC4uLikKKyAgICAgKGtleS0+dmFsdWVzIChjZHIgbWV0YSkga2V5KSkKKyAgICAoXyAi a2V5IE5vdCBmb3VudCIpKSkKKworKGRlZmluZSAoa2V5LXN0YXJ0LWVuZC0+ZW50cmllcyBtZXRh IGtleS1zdGFydCBrZXktZW5kKQorICAiTUVUQSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBD YWJhbCBmaWxlIGFzIHByb2R1Y2VkIGJ5ICdyZWFkLWNhYmFsJy4KK1JldHVybiBhbGwgZW50cmll cyB3aG9zZSBrZXlzIGxpc3Qgc3RhcnRzIHdpdGggS0VZLVNUQVJUIGFuZCBlbmRzIHdpdGgKK0tF WS1FTkQuIgorICAobGV0ICgocHJlZAorICAgICAgICAgKGxhbWJkYSAoeCkKKyAgICAgICAgICAg KGVxdWFsPyAobGlzdCBrZXktc3RhcnQga2V5LWVuZCkgKGxpc3QgKGZpcnN0IHgpIChsYXN0IHgp KSkpKSkKKyAgICAobWF0Y2ggbWV0YQorICAgICAgKCgpICcoKSkKKyAgICAgICgoKCg/IHByZWQg aykgdikgciAuLi4pCisgICAgICAgKGNvbnMgYCgsayAsdikgKGtleS1zdGFydC1lbmQtPmVudHJp ZXMgKGNkciBtZXRhKSBrZXktc3RhcnQga2V5LWVuZCkpKQorICAgICAgKCgoayB2KSByIC4uLikK KyAgICAgICAoa2V5LXN0YXJ0LWVuZC0+ZW50cmllcyAoY2RyIG1ldGEpIGtleS1zdGFydCBrZXkt ZW5kKSkKKyAgICAgIChfICJrZXkgTm90IGZvdW50IikpKSkKKworKGRlZmluZSBlbHNlLXJ4Cisg IChtYWtlLXJlZ2V4cCAiXmVsc2UkIikpCisKKyhkZWZpbmUgKGNvdW50LWlmLWVsc2UgcngtcmVz dWx0LWxzKQorICAoYXBwbHkgKyAobWFwIChsYW1iZGEgKG0pIChpZiBtIDEgMCkpIHJ4LXJlc3Vs dC1scykpKQorCisoZGVmaW5lIChhbmFseXplLWVudHJ5LWNvbmQgZW50cnkpCisgIChsZXQqICgo a2V5cyAoZmlyc3QgZW50cnkpKQorICAgICAgICAgKHZhbHMgKHNlY29uZCBlbnRyeSkpCisgICAg ICAgICAocngtY29uZC1yZXN1bHQKKyAgICAgICAgICAobWFwIChjdXQgcmVnZXhwLWV4ZWMgY29u ZGl0aW9uLXJ4IDw+KSBrZXlzKSkKKyAgICAgICAgIChyeC1lbHNlLXJlc3VsdAorICAgICAgICAg IChtYXAgKGN1dCByZWdleHAtZXhlYyBlbHNlLXJ4IDw+KSBrZXlzKSkKKyAgICAgICAgIChjb25k LW5vIChjb3VudC1pZi1lbHNlIHJ4LWNvbmQtcmVzdWx0KSkKKyAgICAgICAgIChlbHNlLW5vIChj b3VudC1pZi1lbHNlIHJ4LWVsc2UtcmVzdWx0KSkKKyAgICAgICAgIChjb25kLWlkeCAobGlzdC1p bmRleCAobGFtYmRhIChyeCkgKGlmIHJ4ICN0ICNmKSkgcngtY29uZC1yZXN1bHQpKQorICAgICAg ICAgKGVsc2UtaWR4IChsaXN0LWluZGV4IChsYW1iZGEgKHJ4KSAoaWYgcnggI3QgI2YpKSByeC1l bHNlLXJlc3VsdCkpCisgICAgICAgICAoa2V5LWNvbmQKKyAgICAgICAgICAgICAgKGNvbmQKKyAg ICAgICAgICAgICAgICgob3IgKGFuZCBjb25kLWlkeCBlbHNlLWlkeCAoPCBjb25kLWlkeCBlbHNl LWlkeCkpCisgICAgICAgICAgICAgICAgICAgIChhbmQgY29uZC1pZHggKG5vdCBlbHNlLWlkeCkp KQorICAgICAgICAgICAgICAgIChtYXRjaDpzdWJzdHJpbmcKKyAgICAgICAgICAgICAgICAgKHJl Y2VpdmUgKGhlYWQgdGFpbCkKKyAgICAgICAgICAgICAgICAgICAgIChzcGxpdC1hdCByeC1jb25k LXJlc3VsdCBjb25kLWlkeCkgKGZpcnN0IHRhaWwpKSkpCisgICAgICAgICAgICAgICAoKG9yIChh bmQgY29uZC1pZHggZWxzZS1pZHggKD4gY29uZC1pZHggZWxzZS1pZHgpKQorICAgICAgICAgICAg ICAgICAgICAoYW5kIChub3QgY29uZC1pZHgpIGVsc2UtaWR4KSkKKyAgICAgICAgICAgICAgICAo bWF0Y2g6c3Vic3RyaW5nCisgICAgICAgICAgICAgICAgIChyZWNlaXZlIChoZWFkIHRhaWwpCisg ICAgICAgICAgICAgICAgICAgICAoc3BsaXQtYXQgcngtZWxzZS1yZXN1bHQgZWxzZS1pZHgpIChm aXJzdCB0YWlsKSkpKQorICAgICAgICAgICAgICAgKGVsc2UKKyAgICAgICAgICAgICAgICAiIikp KSkKKyAgICAodmFsdWVzIGtleXMgdmFscyByeC1jb25kLXJlc3VsdAorICAgICAgICAgICAgcngt ZWxzZS1yZXN1bHQgY29uZC1ubyBlbHNlLW5vIGtleS1jb25kKSkpCisKKyhkZWZpbmUgKHJlbW92 ZS1jb25kIGVudHJ5IGNvbmQpCisgIChtYXRjaCBlbnRyeQorICAgICgoayB2KQorICAgICAobGlz dCAoY2RyIChtZW1iZXIgY29uZCBrKSkgdikpKSkKKworKGRlZmluZSAoZ3JvdXAtYW5kLXJlZHVj ZS1sZXZlbCBlbnRyaWVzIGdyb3VwIGdyb3VwLWNvbmQpCisgIChsZXQgbG9vcAorICAgICAgKCh0 cnVlLWdyb3VwIGdyb3VwKQorICAgICAgIChmYWxzZS1ncm91cCAnKCkpCisgICAgICAgKGVudHJp ZXMgZW50cmllcykpCisgICAgKGlmIChudWxsPyBlbnRyaWVzKQorICAgICAgICAodmFsdWVzIChy ZXZlcnNlIHRydWUtZ3JvdXApIChyZXZlcnNlIGZhbHNlLWdyb3VwKSBlbnRyaWVzKQorICAgICAg ICAobGV0Ki12YWx1ZXMgKCgoZW50cnkpIChmaXJzdCBlbnRyaWVzKSkKKyAgICAgICAgICAgICAg ICAgICAgICAoKGtleXMgdmFscyByeC1jb25kLXJlc3VsdCByeC1lbHNlLXJlc3VsdAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25kLW5vIGVsc2Utbm8ga2V5LWNvbmQpCisgICAgICAg ICAgICAgICAgICAgICAgIChhbmFseXplLWVudHJ5LWNvbmQgZW50cnkpKSkKKyAgICAgICAgICAo Y29uZAorICAgICAgICAgICAoKGFuZCAoPj0gKCsgY29uZC1ubyBlbHNlLW5vKSAxKSAoc3RyaW5n PSBncm91cC1jb25kIGtleS1jb25kKSkKKyAgICAgICAgICAgIChsb29wIChjb25zIChyZW1vdmUt Y29uZCBlbnRyeSBncm91cC1jb25kKSB0cnVlLWdyb3VwKSBmYWxzZS1ncm91cAorICAgICAgICAg ICAgICAgICAgKGNkciBlbnRyaWVzKSkpCisgICAgICAgICAgICgoYW5kICg+PSAoKyBjb25kLW5v IGVsc2Utbm8pIDEpIChzdHJpbmc9IGtleS1jb25kICJlbHNlIikpCisgICAgICAgICAgICAobG9v cCB0cnVlLWdyb3VwIChjb25zIChyZW1vdmUtY29uZCBlbnRyeSAiZWxzZSIpIGZhbHNlLWdyb3Vw KQorICAgICAgICAgICAgICAgICAgKGNkciBlbnRyaWVzKSkpCisgICAgICAgICAgIChlbHNlCisg ICAgICAgICAgICAodmFsdWVzIChyZXZlcnNlIHRydWUtZ3JvdXApIChyZXZlcnNlIGZhbHNlLWdy b3VwKSBlbnRyaWVzKSkpKSkpKQorCisoZGVmaW5lIGRlcGVuZGVuY2llcy1yeAorICAobWFrZS1y ZWdleHAgIihbYS16QS1aMC05Xy1dKykgKlteLF0qLD8iKSkKKworKGRlZmluZSAoaGFja2FnZS1u YW1lLT5wYWNrYWdlLW5hbWUgbmFtZSkKKyAgKGlmIChzdHJpbmctcHJlZml4PyBwYWNrYWdlLW5h bWUtcHJlZml4IG5hbWUpCisgICAgICAoc3RyaW5nLWRvd25jYXNlIG5hbWUpCisgICAgICAoc3Ry aW5nLWFwcGVuZCBwYWNrYWdlLW5hbWUtcHJlZml4IChzdHJpbmctZG93bmNhc2UgbmFtZSkpKSkK KworKGRlZmluZSAoc3BsaXQtZGVwZW5kZW5jaWVzIGxzKQorICAiU3BsaXQgdGhlIGNvbW1hIHNl cGFyYXRlZCBsaXN0IG9mIGRlcGVuZGVuY2llcyBMUyBjb21pbmcgZnJvbSB0aGUgQ2FiYWwKK2Zp bGUgYW5kIHJldHVybiBhIGxpc3Qgd2l0aCBpbnB1dHMgc3VpdGFibGUgZm9yIHRoZSBHdWl4IHBh Y2thZ2UuICBDdXJyZW50bHkKK3RoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzIGRpc2NhcmRlZC4i CisgIChkZWZpbmUgKHNwbGl0LWF0LWNvbW1hIGQpCisgICAgKG1hcAorICAgICAobGFtYmRhICht KQorICAgICAgIChsZXQgKChuYW1lIChoYWNrYWdlLW5hbWUtPnBhY2thZ2UtbmFtZSAobWF0Y2g6 c3Vic3RyaW5nIG0gMSkpKSkKKyAgICAgICAgIChsaXN0IG5hbWUgKGxpc3QgJ3VucXVvdGUgKHN0 cmluZy0+c3ltYm9sIG5hbWUpKSkpKQorICAgICAobGlzdC1tYXRjaGVzIGRlcGVuZGVuY2llcy1y eCBkKSkpCisgICAgCisgIChmb2xkIChsYW1iZGEgKGQgcCkgKGFwcGVuZCAoc3BsaXQtYXQtY29t bWEgZCkgcCkpICcoKSAgbHMpKQorCisoZGVmaW5lIChkZXBlbmRlbmNpZXMtY29uZC0+c2V4cCBt ZXRhKQorICAiTUVUQSBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYSBDYWJhbCBmaWxlIGFzIHBy b2R1Y2VkIGJ5ICdyZWFkLWNhYmFsJy4KK1JldHVybiBhbiBTLWV4cHJlc3Npb24gY29udGFpbmlu ZyB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgYXMgZXhwZWN0ZWQgYnkgdGhlCisnaW5wdXRzJyBm aWVsZCBvZiBhIHBhY2thZ2UuICBUaGUgZ2VuZXJhdGVkIFMtZXhwcmVzc2lvbnMgbWF5IGluY2x1 ZGUKK2NvbmRpdGlvbmFscyBhcyBkZWZpbmVkIGluIHRoZSBjYWJhbCBmaWxlLiAgRHVyaW5nIHRo aXMgcHJvY2VzcyB3ZSBkaXNjYXJkIHRoZQordmVyc2lvbiBpbmZvcm1hdGlvbiBvZiB0aGUgcGFj a2FnZXMuIgorICAoZGVmaW5lICh0YWtlLWRlcGVuZGVuY2llcyBtZXRhKQorICAgIChsZXQgKChr ZXktc3RhcnQtZXhlICJleGVjdXRhYmxlIGNhYmFsIikKKyAgICAgICAgICAoa2V5LXN0YXJ0LWxp YiAibGlicmFyeSIpCisgICAgICAgICAgKGtleS1lbmQgImJ1aWxkLWRlcGVuZHMiKSkKKyAgICAg IChhcHBlbmQKKyAgICAgICAoa2V5LXN0YXJ0LWVuZC0+ZW50cmllcyBtZXRhIGtleS1zdGFydC1l eGUga2V5LWVuZCkKKyAgICAgICAoa2V5LXN0YXJ0LWVuZC0+ZW50cmllcyBtZXRhIGtleS1zdGFy dC1saWIga2V5LWVuZCkpKSkKKworICAobGV0ICgoZmxhZ3MgKGdldC1mbGFncyAocHJlLXByb2Nl c3MtZW50cmllcy1rZXlzIG1ldGEpKSkpCisgICAgKGRlbGV0ZS1kdXBsaWNhdGVzCisgICAgIChs ZXQgbG9vcCAoKGVudHJpZXMgKHRha2UtZGVwZW5kZW5jaWVzIG1ldGEpKQorICAgICAgICAgICAg ICAgIChyZXN1bHQgJygpKSkKKyAgICAgICAoaWYgKG51bGw/IGVudHJpZXMpCisgICAgICAgICAg IHJlc3VsdAorICAgICAgICAgICAobGV0Ki12YWx1ZXMgKCgoZW50cnkpIChmaXJzdCBlbnRyaWVz KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKGtleXMgdmFscyByeC1jb25kLXJlc3VsdCBy eC1lbHNlLXJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kLW5vIGVs c2Utbm8ga2V5LWNvbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmFseXplLWVudHJ5 LWNvbmQgZW50cnkpKSkKKyAgICAgICAgICAgICAoY29uZAorICAgICAgICAgICAgICAoKD0gKCsg Y29uZC1ubyBlbHNlLW5vKSAwKQorICAgICAgICAgICAgICAgKGxvb3AgKGNkciBlbnRyaWVzKSAo YXBwZW5kIChzcGxpdC1kZXBlbmRlbmNpZXMgdmFscykgcmVzdWx0KSkpCisgICAgICAgICAgICAg IChlbHNlCisgICAgICAgICAgICAgICAobGV0LXZhbHVlcyAoKCh0cnVlLWdyb3VwIGZhbHNlLWdy b3VwIGVudHJpZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cC1hbmQtcmVk dWNlLWxldmVsIGVudHJpZXMgJygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGtleS1jb25kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAoKGNvbmQtZmluYWwpIChldmFsLXRlc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGV2YWwtaW1wbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoZXZhbC1mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKGNvbmRpdGlvbmFsLT5zZXhwLWxpa2UKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdCAoc3BsaXQtc2VjdGlvbiBrZXktY29u ZCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3Mp KSkpKQorICAgICAgICAgICAgICAgICAobG9vcCBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAg ICAgIChjb25kCisgICAgICAgICAgICAgICAgICAgICAgICAoKG9yIChlcT8gY29uZC1maW5hbCAj dCkgKGVxdWFsPyBjb25kLWZpbmFsICcobm90ICNmKSkpCisgICAgICAgICAgICAgICAgICAgICAg ICAgKGFwcGVuZCAobG9vcCB0cnVlLWdyb3VwICcoKSkgcmVzdWx0KSkKKyAgICAgICAgICAgICAg ICAgICAgICAgICgob3IgKGVxPyBjb25kLWZpbmFsICNmKSAoZXF1YWw/IGNvbmQtZmluYWwgJyhu b3QgI3QpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwZW5kIChsb29wIGZhbHNlLWdy b3VwICcoKSkgcmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIChlbHNlCisgICAgICAg ICAgICAgICAgICAgICAgICAgKGNvbnMgYCh1bnF1b3RlLXNwbGljaW5nCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAoaWYgLGNvbmQtZmluYWwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAsKGxvb3AgdHJ1ZS1ncm91cCAnKCkpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLChsb29wIGZhbHNlLWdyb3VwICcoKSkpKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpKSkpKSkpKSkpKSkKKworKGRlZmluZSAoc3Rh bmRhcmQtbGlicmFyeT8gbmFtZSkKKyAgKG1lbWJlciBuYW1lIGdoYy1zdGFuZGFyZC1saWJyYXJp ZXMpKQorCisoZGVmaW5lIChmaWx0ZXItc3RhbmRhcmQtbGlicmFyaWVzIGxzKQorICAiRmlsdGVy IGZyb20gbGlzdCBvZiBpbnB1dHMgTFMgdGhlIGxpYnJhcmllcyBhbHJlYWR5IGluY2x1ZGVkIHdp dGggdGhlCitIYXNrZWxsIGNvbXBpbGVyLiAgQ3VycmVudGx5IHdlIGltcGx5IHRoZSB1c2Ugb2Yg R0hDLiIKKyAgKGxldCAoKHJlYWwtbmFtZS1yeCAobWFrZS1yZWdleHAKKyAgICAgICAgICAgICAg ICAgICAgICAgKHN0cmluZy1hcHBlbmQgcGFja2FnZS1uYW1lLXByZWZpeCAiKFxcdyspIikpKSkK KyAgICAoZm9sZCAobGFtYmRhIChlbGVtIHNlZWQpCisgICAgICAgICAgICAoaWYgKGVxPyAoZmly c3QgZWxlbSkgJ3VucXVvdGUtc3BsaWNpbmcpCisgICAgICAgICAgICAgICAgKGxldCotdmFsdWVz ICgoKGdyb3VwLWNvbmQgdHJ1ZS1ncm91cCBmYWxzZS1ncm91cCkKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAobWF0Y2ggKHNlY29uZCBlbGVtKQorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgKChpZiBjIHQgZiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKHZhbHVlcyBjIHQgZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXyAo dmFsdWVzIGMgJygpICcoKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmls dGVyZWQtdHJ1ZS1ncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVy LXN0YW5kYXJkLWxpYnJhcmllcyB0cnVlLWdyb3VwKSkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICgoZmlsdGVyZWQtZmFsc2UtZ3JvdXApCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKGZpbHRlci1zdGFuZGFyZC1saWJyYXJpZXMgZmFsc2UtZ3JvdXApKSkKKyAgICAgICAg ICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgICAgICAgKChhbmQgKG51bGw/IGZpbHRlcmVk LWZhbHNlLWdyb3VwKQorICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsPyBmaWx0ZXJlZC10 cnVlLWdyb3VwKSkKKyAgICAgICAgICAgICAgICAgICAgc2VlZCkKKyAgICAgICAgICAgICAgICAg ICAoKG51bGw/IGZpbHRlcmVkLWZhbHNlLWdyb3VwKQorICAgICAgICAgICAgICAgICAgICAoY29u cyAobGlzdCAndW5xdW90ZS1zcGxpY2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAobGlzdCAnaWYgZ3JvdXAtY29uZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZmlsdGVyZWQtdHJ1ZS1ncm91cCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNl ZWQpKQorICAgICAgICAgICAgICAgICAgIChlbHNlCisgICAgICAgICAgICAgICAgICAgIChjb25z IChsaXN0ICd1bnF1b3RlLXNwbGljaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChsaXN0ICdpZiBncm91cC1jb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGZpbHRlcmVkLXRydWUtZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZmlsdGVyZWQtZmFsc2UtZ3JvdXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICBz ZWVkKSkpKQorICAgICAgICAgICAgICAgIChsZXQgKChyeC1yZXN1bHQgKHJlZ2V4cC1leGVjIHJl YWwtbmFtZS1yeCAoZmlyc3QgZWxlbSkpKSkKKyAgICAgICAgICAgICAgICAgIChtYXRjaCAobWF0 Y2g6c3Vic3RyaW5nIHJ4LXJlc3VsdCAxKQorICAgICAgICAgICAgICAgICAgICAoKD8gc3RhbmRh cmQtbGlicmFyeT8pCisgICAgICAgICAgICAgICAgICAgICBzZWVkKQorICAgICAgICAgICAgICAg ICAgICAoXworICAgICAgICAgICAgICAgICAgICAgKGNvbnMgZWxlbSBzZWVkKSkpKSkpCisgICAg ICAgICAgJygpIGxzKSkpCisKKzs7IFBhcnQgNDoKKzs7Cis7OyBSZXRyaXZlIHRoZSBkZXNpcmVk IHBhY2thZ2UgYW5kIGl0cyBDYWJhbCBmaWxlIGZyb20KKzs7IGh0dHA6Ly9oYWNrYWdlLmhhc2tl bGwub3JnIGFuZCBjb25zdHJ1Y3QgdGhlIEd1aXggcGFja2FnZSBTLWV4cHJlc3Npb24uCisKKyhk ZWZpbmUgKGhhY2thZ2UtZmV0Y2ggbmFtZS12ZXJzaW9uKQorICAiUmV0dXJuIHRoZSBDYWJhbCBm aWxlIGZvciB0aGUgcGFja2FnZSBOQU1FLVZFUlNJT04sIG9yICNmIG9uIGZhaWx1cmUuICBJZgor dGhlIHZlcnNpb24gcGFydCBpcyBvbWl0dGVkIGZyb20gdGhlIHBhY2thZ2UgbmFtZSwgdGhlbiBy ZXR1cm4gdGhlIGxhdGVzdAordmVyc2lvbi4iCisgIChsZXQqLXZhbHVlcyAoKChuYW1lIHZlcnNp b24pIChwYWNrYWdlLW5hbWUtPm5hbWUrdmVyc2lvbiBuYW1lLXZlcnNpb24pKQorICAgICAgICAg ICAgICAgICgodXJsKQorICAgICAgICAgICAgICAgICAoaWYgdmVyc2lvbgorICAgICAgICAgICAg ICAgICAgICAgKHN0cmluZy1hcHBlbmQgImh0dHA6Ly9oYWNrYWdlLmhhc2tlbGwub3JnL3BhY2th Z2UvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSAiLSIgdmVyc2lv biAiLyIgbmFtZSAiLmNhYmFsIikKKyAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctYXBwZW5k ICJodHRwOi8vaGFja2FnZS5oYXNrZWxsLm9yZy9wYWNrYWdlLyIKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG5hbWUgIi8iIG5hbWUgIi5jYWJhbCIpKSkKKyAgICAgICAgICAg ICAgICAoKGNhYmFsKSAKKyAgICAgICAgICAgICAgICAgKGNhbGwtd2l0aC10ZW1wb3Jhcnktb3V0 cHV0LWZpbGUKKyAgICAgICAgICAgICAgICAgIChsYW1iZGEgKHRlbXAgcG9ydCkKKyAgICAgICAg ICAgICAgICAgICAgKGFuZCAodXJsLWZldGNoIHVybCB0ZW1wKQorICAgICAgICAgICAgICAgICAg ICAgICAgIChjYWxsLXdpdGgtaW5wdXQtZmlsZSB0ZW1wIHN0cmlwLWNhYmFsKSkpKSkpCisgICAg KGFuZD0+IGNhYmFsIHJlYWQtY2FiYWwpKSkKKworKGRlZmluZSBzdHJpbmctPmxpY2Vuc2UKKyAg OzsgTGlzdCBvZiB2YWxpZCB2YWx1ZXMgZnJvbQorICA7OyBodHRwczovL3d3dy5oYXNrZWxsLm9y ZworICA7OyAvY2FiYWwvcmVsZWFzZS9jYWJhbC1sYXRlc3QvZG9jL0FQSS9DYWJhbC9EaXN0cmli dXRpb24tTGljZW5zZS5odG1sLgorICAobWF0Y2gtbGFtYmRhCisgICAoIkdQTC0yIiAnZ3BsMikK KyAgICgiR1BMLTMiICdncGwzKQorICAgKCJHUEwiICInZ3BsPz8iKQorICAgKCJBR1BMLTMiICdh Z3BsMykKKyAgICgiQUdQTCIgIidhZ3BsPz8iKQorICAgKCJMR1BMLTIuMSIgJ2xncGwyLjEpCisg ICAoIkxHUEwtMyIgJ2xncGwzKQorICAgKCJMR1BMIiAiJ2xncGw/PyIpCisgICAoIkJTRDIiICdi c2QtMikKKyAgICgiQlNEMyIgJ2JzZC0zKQorICAgKCJNSVQiICdleHBhdCkKKyAgICgiSVNDIiAn aXNjKQorICAgKCJNUEwiICdtcGwyLjApCisgICAoIkFwYWNoZS0yLjAiICdhc2wyLjApCisgICAo KHgpIChzdHJpbmctPmxpY2Vuc2UgeCkpCisgICAoKGxzdCAuLi4pIGAobGlzdCAsQChtYXAgc3Ry aW5nLT5saWNlbnNlIGxzdCkpKQorICAgKF8gI2YpKSkKKworKGRlZmluZSAoaGFja2FnZS1tb2R1 bGUtPnNleHAgbWV0YSkKKyAgIlJldHVybiB0aGUgYHBhY2thZ2UnIFMtZXhwcmVzc2lvbiBmb3Ig YSBDYWJhbCBwYWNrYWdlLiAgTUVUQSBpcyB0aGUKK3JlcHJlc2VudGF0aW9uIG9mIGEgQ2FiYWwg ZmlsZSBhcyBwcm9kdWNlZCBieSAncmVhZC1jYWJhbCcuIgorCisgIChkZWZpbmUgbmFtZQorICAg IChmaXJzdCAoa2V5LT52YWx1ZXMgbWV0YSAibmFtZSIpKSkKKworICAoZGVmaW5lIHZlcnNpb24K KyAgICAoZmlyc3QgKGtleS0+dmFsdWVzIG1ldGEgInZlcnNpb24iKSkpCisgIAorICAoZGVmaW5l IGRlc2NyaXB0aW9uCisgICAgKGxldCotdmFsdWVzICgoKGRlc2NyaXB0aW9uKSAoa2V5LT52YWx1 ZXMgbWV0YSAiZGVzY3JpcHRpb24iKSkKKyAgICAgICAgICAgICAgICAgICgobGluZXMgbGFzdCkK KyAgICAgICAgICAgICAgICAgICAoc3BsaXQtYXQgZGVzY3JpcHRpb24gKC0gKGxlbmd0aCBkZXNj cmlwdGlvbikgMSkpKSkKKyAgICAgIChmb2xkLXJpZ2h0IChsYW1iZGEgKGxpbmUgc2VlZCkgKHN0 cmluZy1hcHBlbmQgbGluZSAiXG4iIHNlZWQpKQorICAgICAgICAgICAgICAgICAgKGZpcnN0IGxh c3QpIGxpbmVzKSkpCisgIAorICAoZGVmaW5lIHNvdXJjZS11cmwKKyAgICAoc3RyaW5nLWFwcGVu ZCAiaHR0cDovL2hhY2thZ2UuaGFza2VsbC5vcmcvcGFja2FnZS8iIG5hbWUKKyAgICAgICAgICAg ICAgICAgICAiLyIgbmFtZSAiLSIgdmVyc2lvbiAiLnRhci5neiIpKQorCisgIChkZWZpbmUgKG1h eWJlLWlucHV0cyBoYWNrYWdlLW5hbWUtPnBhY2thZ2UtbmFtZSBpbnB1dHMpCisgICAgKG1hdGNo IChmaWx0ZXItc3RhbmRhcmQtbGlicmFyaWVzIGlucHV0cykKKyAgICAgICgoKQorICAgICAgICco KSkKKyAgICAgICgoaW5wdXRzIC4uLikKKyAgICAgICAobGlzdCAobGlzdCBoYWNrYWdlLW5hbWUt PnBhY2thZ2UtbmFtZQorICAgICAgICAgICAgICAgICAgIChsaXN0ICdxdWFzaXF1b3RlIGlucHV0 cykpKSkpKQorICAKKyAgKGxldCAoKHRhcmJhbGwgKHdpdGgtc3RvcmUgc3RvcmUKKyAgICAgICAg ICAgICAgICAgICAoZG93bmxvYWQtdG8tc3RvcmUgc3RvcmUgc291cmNlLXVybCkpKSkKKyAgICBg KHBhY2thZ2UKKyAgICAgICAobmFtZSAsKGhhY2thZ2UtbmFtZS0+cGFja2FnZS1uYW1lIG5hbWUp KQorICAgICAgICh2ZXJzaW9uICx2ZXJzaW9uKQorICAgICAgIChzb3VyY2UgKG9yaWdpbgorICAg ICAgICAgICAgICAgICAobWV0aG9kIHVybC1mZXRjaCkKKyAgICAgICAgICAgICAgICAgKHVyaSAo c3RyaW5nLWFwcGVuZCAsQChmYWN0b3JpemUtdXJpIHNvdXJjZS11cmwgdmVyc2lvbikpKQorICAg ICAgICAgICAgICAgICAoc2hhMjU2CisgICAgICAgICAgICAgICAgICAoYmFzZTMyCisgICAgICAg ICAgICAgICAgICAgLChpZiB0YXJiYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZXZl Y3Rvci0+bml4LWJhc2UzMi1zdHJpbmcgKGZpbGUtc2hhMjU2IHRhcmJhbGwpKQorICAgICAgICAg ICAgICAgICAgICAgICAgImZhaWxlZCB0byBkb3dubG9hZCB0YXIgYXJjaGl2ZSIpKSkpKQorICAg ICAgIChidWlsZC1zeXN0ZW0gaGFza2VsbC1idWlsZC1zeXN0ZW0pCisgICAgICAgLEAobWF5YmUt aW5wdXRzICdpbnB1dHMgKGRlcGVuZGVuY2llcy1jb25kLT5zZXhwIG1ldGEpKQorICAgICAgICho b21lLXBhZ2UgLEAoa2V5LT52YWx1ZXMgbWV0YSAiaG9tZXBhZ2UiKSkKKyAgICAgICAoc3lub3Bz aXMgLEAoa2V5LT52YWx1ZXMgbWV0YSAic3lub3BzaXMiKSkKKyAgICAgICAoZGVzY3JpcHRpb24g LGRlc2NyaXB0aW9uKQorICAgICAgIChsaWNlbnNlICwoc3RyaW5nLT5saWNlbnNlIChrZXktPnZh bHVlcyBtZXRhICJsaWNlbnNlIikpKSkpKQorCisoZGVmaW5lIChoYWNrYWdlLT5ndWl4LXBhY2th Z2UgbW9kdWxlLW5hbWUpCisgICJGZXRjaCB0aGUgQ2FiYWwgZmlsZSBmb3IgUEFDS0FHRS1OQU1F IGZyb20gaGFja2FnZS5oYXNrZWxsLm9yZywgYW5kIHJldHVybgordGhlIGBwYWNrYWdlJyBTLWV4 cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byB0aGF0IHBhY2thZ2UsIG9yICNmIG9uIGZhaWx1cmUu IgorICAobGV0ICgobW9kdWxlLW1ldGEgKGhhY2thZ2UtZmV0Y2ggbW9kdWxlLW5hbWUpKSkKKyAg ICAoYW5kPT4gbW9kdWxlLW1ldGEgaGFja2FnZS1tb2R1bGUtPnNleHApKSkKKworOzs7IGNhYmFs LnNjbSBlbmRzIGhlcmUKLS0gCjIuMi4xCgo= --089e0149431824fb520511e62c8e Content-Type: text/x-diff; charset=US-ASCII; name="0004-import-Add-to-list-of-files-with-translatable-string.patch" Content-Disposition: attachment; filename="0004-import-Add-to-list-of-files-with-translatable-string.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i7ktz22b3 RnJvbSAxNTdmYWRmMTU4ODY2YmVkYTA4YjBjYWQ2NTQ1ODM4MzZhODVhM2U3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGZWRlcmljbyBCZWZmYSA8YmVmZmFAZmJlbmdpbmVlcmluZy5j aD4KRGF0ZTogU3VuLCAyMiBNYXIgMjAxNSAxMzozMDoyNCArMDEwMApTdWJqZWN0OiBbUEFUQ0gg NC81XSBpbXBvcnQ6IEFkZCB0byBsaXN0IG9mIGZpbGVzIHdpdGggdHJhbnNsYXRhYmxlIHN0cmlu Z3MuCgoqIHBvL2d1aXgvUE9URklMRVMuaW46IEFkZCBndWl4L3NjcmlwdHMvaW1wb3J0LnNjbS4K LS0tCiBwby9ndWl4L1BPVEZJTEVTLmluIHwgMSArCiAxIGZpbGUgY2hhbmdlZCwgMSBpbnNlcnRp b24oKykKCmRpZmYgLS1naXQgYS9wby9ndWl4L1BPVEZJTEVTLmluIGIvcG8vZ3VpeC9QT1RGSUxF Uy5pbgppbmRleCA2MTlmNmY5Li40Yjc5Mzg1IDEwMDY0NAotLS0gYS9wby9ndWl4L1BPVEZJTEVT LmluCisrKyBiL3BvL2d1aXgvUE9URklMRVMuaW4KQEAgLTgsNiArOCw3IEBAIGd1aXgvc2NyaXB0 cy9kb3dubG9hZC5zY20KIGd1aXgvc2NyaXB0cy9wYWNrYWdlLnNjbQogZ3VpeC9zY3JpcHRzL2dj LnNjbQogZ3VpeC9zY3JpcHRzL2hhc2guc2NtCitndWl4L3NjcmlwdHMvaW1wb3J0LnNjbQogZ3Vp eC9zY3JpcHRzL3B1bGwuc2NtCiBndWl4L3NjcmlwdHMvc3Vic3RpdHV0ZS1iaW5hcnkuc2NtCiBn dWl4L3NjcmlwdHMvYXV0aGVudGljYXRlLnNjbQotLSAKMi4yLjEKCg== --089e0149431824fb520511e62c8e Content-Type: text/x-diff; charset=UTF-8; name="0005-tests-Add-tests-for-the-hackage-importer.patch" Content-Disposition: attachment; filename="0005-tests-Add-tests-for-the-hackage-importer.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i7kvrrqa4 RnJvbSA2MzFjYzVlOGNhMDcxNDNkMmQzMDk4NGU1ZjRhMTIxNTlhZTQ1ZDU4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGZWRlcmljbyBCZWZmYSA8YmVmZmFAZmJlbmdpbmVlcmluZy5j aD4KRGF0ZTogU3VuLCAyMiBNYXIgMjAxNSAxOTo1MTozMCArMDEwMApTdWJqZWN0OiBbUEFUQ0gg NS81XSB0ZXN0czogQWRkIHRlc3RzIGZvciB0aGUgaGFja2FnZSBpbXBvcnRlci4KCiogdGVzdHMv aGFja2FnZS5zY206IE5ldyBmaWxlLgotLS0KIHRlc3RzL2hhY2thZ2Uuc2NtIHwgMTE0ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxl IGNoYW5nZWQsIDExNCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvaGFj a2FnZS5zY20KCmRpZmYgLS1naXQgYS90ZXN0cy9oYWNrYWdlLnNjbSBiL3Rlc3RzL2hhY2thZ2Uu c2NtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2JiZTUKLS0tIC9kZXYv bnVsbAorKysgYi90ZXN0cy9oYWNrYWdlLnNjbQpAQCAtMCwwICsxLDExNCBAQAorOzs7IEdOVSBH dWl4IC0tLSBGdW5jdGlvbmFsIHBhY2thZ2UgbWFuYWdlbWVudCBmb3IgR05VCis7OzsgQ29weXJp Z2h0IMKpIDIwMTUgRmVkZXJpY28gQmVmZmEgPGJlZmZhQGZiZW5naW5lZXJpbmcuY2g+Cis7OzsK Kzs7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgR3VpeC4KKzs7OworOzs7IEdOVSBHdWl4IGlz IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQK Kzs7OyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQorOzs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorOzs7IHlvdXIgb3B0aW9uKSBhbnkgbGF0 ZXIgdmVyc2lvbi4KKzs7OworOzs7IEdOVSBHdWl4IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorOzs7IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3 aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7OyBNRVJDSEFOVEFCSUxJVFkg b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OzsgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7OworOzs7IFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl Cis7OzsgYWxvbmcgd2l0aCBHTlUgR3VpeC4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5v cmcvbGljZW5zZXMvPi4KKworKGRlZmluZS1tb2R1bGUgKHRlc3QtaGFja2FnZSkKKyAgIzp1c2Ut bW9kdWxlIChndWl4IGltcG9ydCBoYWNrYWdlKQorICAjOnVzZS1tb2R1bGUgKGd1aXggdGVzdHMp CisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTY0KQorICAjOnVzZS1tb2R1bGUgKGljZS05IG1h dGNoKSkKKworKHNldGxvY2FsZSBMQ19BTEwgImVuX1VTLlVURi04IikKKworKGRlZmluZSB0ZXN0 LWNhYmFsLTEKKyAgIm5hbWU6IGZvbwordmVyc2lvbjogMS4wLjAKK2hvbWVwYWdlOiBodHRwOi8v dGVzdC5vcmcKK3N5bm9wc2lzOiBzeW5vcHNpcworZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uCits aWNlbnNlOiBCU0QzCitleGVjdXRhYmxlIGNhYmFsCisgIGJ1aWxkLWRlcGVuZHM6CisgICAgSFRU UCAgICAgICA+PSA0MDAwLjIuNSAmJiA8IDQwMDAuMywKKyAgICBtdGwgICAgICAgID49IDIuMCAg ICAgICYmIDwgMworIikKKworKGRlZmluZSB0ZXN0LWNvbmQtMQorICAiKG9zKGRhcndpbikgfHwg IShmbGFnKGRlYnVnKSkpICYmIGZsYWcoY2lwcykiKQorCisoZGVmaW5lIHJlYWQtY2FiYWwKKyAg KEBAIChndWl4IGltcG9ydCBoYWNrYWdlKSByZWFkLWNhYmFsKSkKKworKGRlZmluZSBzdHJpcC1j YWJhbAorICAoQEAgKGd1aXggaW1wb3J0IGhhY2thZ2UpIHN0cmlwLWNhYmFsKSkKKworKGRlZmlu ZSBldmFsLXRlc3RzCisgIChAQCAoZ3VpeCBpbXBvcnQgaGFja2FnZSkgZXZhbC10ZXN0cykpCisK KyhkZWZpbmUgZXZhbC1pbXBsCisgIChAQCAoZ3VpeCBpbXBvcnQgaGFja2FnZSkgZXZhbC1pbXBs KSkKKworKGRlZmluZSBldmFsLWZsYWdzCisgIChAQCAoZ3VpeCBpbXBvcnQgaGFja2FnZSkgZXZh bC1mbGFncykpCisKKyhkZWZpbmUgY29uZGl0aW9uYWwtPnNleHAtbGlrZQorICAoQEAgKGd1aXgg aW1wb3J0IGhhY2thZ2UpIGNvbmRpdGlvbmFsLT5zZXhwLWxpa2UpKQorCisodGVzdC1iZWdpbiAi aGFja2FnZSIpCisKKyh0ZXN0LWFzc2VydCAiaGFja2FnZS0+Z3VpeC1wYWNrYWdlIgorICA7OyBS ZXBsYWNlIG5ldHdvcmsgcmVzb3VyY2VzIHdpdGggc2FtcGxlIGRhdGEuCisgIChtb2NrCisgICAo KGd1aXggaW1wb3J0IGhhY2thZ2UpIGhhY2thZ2UtZmV0Y2gKKyAgICAobGFtYmRhIChuYW1lLXZl cnNpb24pCisgICAgICAocmVhZC1jYWJhbAorICAgICAgIChjYWxsLXdpdGgtaW5wdXQtc3RyaW5n IHRlc3QtY2FiYWwtMQorICAgICAgICAgc3RyaXAtY2FiYWwpKSkpCisgICAgKG1hdGNoIChoYWNr YWdlLT5ndWl4LXBhY2thZ2UgImZvbyIpCisgICAgICAoKCdwYWNrYWdlCisgICAgICAgICAoJ25h bWUgImdoYy1mb28iKQorICAgICAgICAgKCd2ZXJzaW9uICIxLjAuMCIpCisgICAgICAgICAoJ3Nv dXJjZQorICAgICAgICAgICgnb3JpZ2luCisgICAgICAgICAgICAoJ21ldGhvZCAndXJsLWZldGNo KQorICAgICAgICAgICAgKCd1cmkgKCdzdHJpbmctYXBwZW5kCisgICAgICAgICAgICAgICAgICAi aHR0cDovL2hhY2thZ2UuaGFza2VsbC5vcmcvcGFja2FnZS9mb28vZm9vLSIKKyAgICAgICAgICAg ICAgICAgICd2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAiLnRhci5neiIpKQorICAgICAgICAg ICAgKCdzaGEyNTYKKyAgICAgICAgICAgICAoJ2Jhc2UzMgorICAgICAgICAgICAgICAoPyBzdHJp bmc/IGhhc2gpKSkpKQorICAgICAgICAgKCdidWlsZC1zeXN0ZW0gJ2hhc2tlbGwtYnVpbGQtc3lz dGVtKQorICAgICAgICAgKCdpbnB1dHMKKyAgICAgICAgICAoJ3F1YXNpcXVvdGUKKyAgICAgICAg ICAgKCgiZ2hjLWh0dHAiICgndW5xdW90ZSAnZ2hjLWh0dHApKQorICAgICAgICAgICAgKCJnaGMt bXRsIiAoJ3VucXVvdGUgJ2doYy1tdGwpKSkpKQorICAgICAgICAgKCdob21lLXBhZ2UgImh0dHA6 Ly90ZXN0Lm9yZyIpCisgICAgICAgICAoJ3N5bm9wc2lzICg/IHN0cmluZz8pKQorICAgICAgICAg KCdkZXNjcmlwdGlvbiAoPyBzdHJpbmc/KSkKKyAgICAgICAgICgnbGljZW5zZSAnYnNkLTMpKQor ICAgICAgICAjdCkKKyAgICAgICh4CisgICAgICAgKHBrICdmYWlsIHggI2YpKSkpKQorCisKKyh0 ZXN0LWFzc2VydCAiY29uZGl0aW9uYWwtPnNleHAtbGlrZSIKKyAgKG1hdGNoCisgICAgKGV2YWwt dGVzdHMKKyAgICAgKGV2YWwtaW1wbAorICAgICAgKGV2YWwtZmxhZ3MKKyAgICAgICAoY29uZGl0 aW9uYWwtPnNleHAtbGlrZSB0ZXN0LWNvbmQtMSkKKyAgICAgICAnKCgiZGVidWciIC4gIkZhbHNl IikpKSkpCisgICAgKCgnYW5kICgnb3IgKCdzdHJpbmctbWF0Y2ggImRhcndpbiIgKCclY3VycmVu dC1zeXN0ZW0pKSAoJ25vdCAnI2YpKSAnI3QpCisgICAgICN0KQorICAgICh4CisgICAgIChwayAn ZmFpbCB4ICNmKSkpKQorCisodGVzdC1lbmQgImhhY2thZ2UiKQorCisMCisoZXhpdCAoPSAodGVz dC1ydW5uZXItZmFpbC1jb3VudCAodGVzdC1ydW5uZXItY3VycmVudCkpIDApKQotLSAKMi4yLjEK Cg== --089e0149431824fb520511e62c8e--