From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 22730 invoked by alias); 23 Oct 2012 21:09:40 -0000 Received: (qmail 22706 invoked by uid 22791); 23 Oct 2012 21:09:36 -0000 X-SWARE-Spam-Status: No, hits=-4.2 required=5.0 tests=AWL,BAYES_50,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,RP_MATCHES_RCVD,TW_AV,TW_CF,TW_CP,TW_FN,TW_MX,TW_TM X-Spam-Check-By: sourceware.org Received: from mail-oa0-f47.google.com (HELO mail-oa0-f47.google.com) (209.85.219.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 23 Oct 2012 21:09:21 +0000 Received: by mail-oa0-f47.google.com with SMTP id h1so4371862oag.20 for ; Tue, 23 Oct 2012 14:09:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type:x-system-of-record:x-gm-message-state; bh=HTfFyTA2oCGEIwwmDMbXKIBdc2AxyuWXzvxQbrs7/SU=; b=ana4+YtEXhtEWg+GdlYt6YcgbNd2t8UY0FXKL3lLdE0d520A7rJgVmgTV/j+nlXtRA R1RuFnkY10lPHMW8qpHCZHkfvPTbd+PI6A5X5rU5il9r6xuanHWYdR//w/o9qC7qCrxe U04t/sPTYgHrH7PFEhvxWpf9nHhBT9hSwSA5TyrjK4RUwaZH1fC4aQfQNTf6PCIDyhH0 vZvSaFz1Z+Zg66W1lx+f8Vphh79VfG0aFRR1lxwFD7ouS6Jw1z6cSQ4T2cDXLHs0LgaN EABXeuAEM41RQv2bvn/3nYkBhyqrdPgpaLSeCQoNM+TfCeyHRjsp0gmw7tdMlJQYxGLK SCCQ== MIME-Version: 1.0 Received: by 10.60.26.72 with SMTP id j8mr12422104oeg.68.1351026560013; Tue, 23 Oct 2012 14:09:20 -0700 (PDT) Received: by 10.182.176.106 with HTTP; Tue, 23 Oct 2012 14:09:19 -0700 (PDT) In-Reply-To: References: <20120307004630.A503DB21B6@azwildcat.mtv.corp.google.com> <4FF7D1C6.90407@redhat.com> <4FF96D0C.5060406@redhat.com> <4FFBF9F5.6020306@redhat.com> <5008708E.1030109@redhat.com> <506F27AF.3070805@redhat.com> <50816D63.3020908@google.com> Date: Tue, 23 Oct 2012 21:21:00 -0000 Message-ID: Subject: Re: User directed Function Multiversioning via Function Overloading (issue5752064) From: Sriraman Tallam To: Diego Novillo Cc: Jason Merrill , Jan Hubicka , Xinliang David Li , mark@codesourcery.com, nathan@codesourcery.com, "H.J. Lu" , Richard Guenther , Uros Bizjak , reply@codereview.appspotmail.com, GCC Patches Content-Type: multipart/mixed; boundary=e89a8fb1f8d231170504ccc06267 X-System-Of-Record: true X-Gm-Message-State: ALoCoQk5rdc7RA97OzXm31An8WSOIJPfZUSBUnsT8mAyCpCmPhc4XOODFrLxAYvC2KoBEO5wsxvbfxClF4cUcpI/xeSNVYInNc53WE/RyauJSEvCSXXapJHGCSQMgJOqeva0GpAAorYCuMNY2cLspKj88i5OuMlnWkQQj9+m0lIv9+tQxhyHmziYJzlVJKDaMDTgoVAI50iH X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2012-10/txt/msg02093.txt.bz2 --e89a8fb1f8d231170504ccc06267 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Content-length: 12566 Hi, I have attached the latest patch with bug fixes, comments. I have also added a description of the function multiversioning syntax supported by the Intel compiler. Thanks, -Sri. On Fri, Oct 19, 2012 at 7:33 PM, Sriraman Tallam wrot= e: > Hi Diego, > > Thanks for the review. I have addressed all your comments. New > patch attached. > > Thanks, > -Sri. > > On Fri, Oct 19, 2012 at 8:10 AM, Diego Novillo wrot= e: >> On 2012-10-12 18:19 , Sriraman Tallam wrote: >> >>> When the front-end sees more than one decl for "foo", it calls a target >>> hook to >>> determine if they are versions. To prevent duplicate definition errors >>> with other >>> versions of "foo", "decls_match" function in cp/decl.c is made to retu= rn >>> false >>> when 2 decls have are deemed versions by the target. This will make all >>> function >>> >>> versions of "foo" to be added to the overload list of "foo". >> >> >> So, this means that this can only work for C++, right? Or could the same >> trickery be done some other way in other FEs? >> >> I see no handling of different FEs. If the user tries to use these >> attributes from languages other than C++, we should emit a diagnostic. > > Yes, the support is only for C++ for now. "target" attribute is not > new and if the user tries to use this with 'C' then a duplicate > defintion error would occur just like now. > I have plans to implement this for C too. > >> >>> +@deftypefn {Target Hook} tree TARGET_GET_FUNCTION_VERSIONS_DISPATCHER >>> (void *@var{arglist}) >>> +This hook is used to get the dispatcher function for a set of function >>> +versions. The dispatcher function is called to invoke the rignt funct= ion >> >> >> s/rignt/right/ >> >>> +version at run-time. @var{arglist} is the vector of function versions >>> +that should be considered for dispatch. >>> +@end deftypefn >>> + >>> +@deftypefn {Target Hook} tree TARGET_GENERATE_VERSION_DISPATCHER_BODY >>> (void *@var{arg}) >>> +This hook is used to generate the dispatcher logic to invoke the right >>> +function version at runtime for a given set of function versions. >> >> >> s/runtime/run-time/ >> >>> +@hook TARGET_GET_FUNCTION_VERSIONS_DISPATCHER >>> +This hook is used to get the dispatcher function for a set of function >>> +versions. The dispatcher function is called to invoke the rignt funct= ion >> >> >> s/rignt/right/ >> >>> +version at run-time. @var{arglist} is the vector of function versions >>> +that should be considered for dispatch. >>> +@end deftypefn >>> + >>> +@hook TARGET_GENERATE_VERSION_DISPATCHER_BODY >>> +This hook is used to generate the dispatcher logic to invoke the right >>> +function version at runtime for a given set of function versions. >> >> >> s/runtime/run-time/ >> >>> @@ -288,7 +289,6 @@ mark_store (gimple stmt, tree t, void *data) >>> } >>> return false; >>> } >>> - >>> /* Create cgraph edges for function calls. >>> Also look for functions and variables having addresses taken. */ >> >> >> Don't remove vertical white space, please. >> >>> + { >>> + struct cgraph_node *callee =3D cgraph_get_create_node >>> (decl); >>> + /* If a call to a multiversioned function dispatcher = is >>> + found, generate the body to dispatch the right >>> function >>> + at run-time. */ >>> + if (callee->dispatcher_function) >>> + { >>> + tree resolver_decl; >>> + gcc_assert (callee->function_version.next); >> >> >> What if callee is the last version in the list? Not sure what you are >> trying to check here. > > So, callee here is the dispatcher function and it points to the set of > semantically identical function versions. At this point, the > dispatcher (callee) should have all the function versions chained in > function_version, which is what the assert is checking. > >> >> >>> @@ -8601,9 +8601,22 @@ handle_target_attribute (tree *node, tree name, = tr >>> warning (OPT_Wattributes, "%qE attribute ignored", name); >>> *no_add_attrs =3D true; >>> } >>> - else if (! targetm.target_option.valid_attribute_p (*node, name, arg= s, >>> - flags)) >>> - *no_add_attrs =3D true; >>> + else >>> + { >>> + /* When a target attribute is invalid, it may also be because the >>> + target for the compilation unit and the attribute match. For >>> + instance, target attribute "xxx" is invalid when -mxxx is use= d. >>> + When used with multiversioning, removing the attribute will l= ead >>> + to duplicate definitions if a default version is provided. >>> + So, generate a warning here and remove the attribute. */ >>> + if (!targetm.target_option.valid_attribute_p (*node, name, args, >>> flags)) >>> + { >>> + warning (OPT_Wattributes, >>> + "Invalid target attribute in function %qE, ignored.", >>> + *node); >>> + *no_add_attrs =3D true; >> >> >> If you do this, isn't the compiler going to generate two warning message= s? >> One for the invalid target attribute, the second for the duplicate >> definition. > > This will be a warning and the duplicate definition would be an error. > The warning would help the user understand why this error occurred. > Example: > > ver.cc > int __attribute__((target("popcnt"))) > bar (bool a) > { > return 0; > } > > int > bar (bool a) > { > return 1; > } > > $ g++ -mpopcnt ver.cc > > ver.cc:2:12: warning: Invalid target attribute in function =91bar=92, > ignored. [-Wattributes] > bar (bool a) > ^ > ver.cc: In function =91int bar(bool)=92: > ver.cc:7:1: error: redefinition of =91int bar(bool)=92 > bar (bool a) > ^ > ver.cc:2:1: error: =91int bar(bool)=92 previously defined here > bar (bool a) > > When compiled with -mpopcnt, the new version does not differ from the def= ault. > Now, the warning makes it clear why the redefinition error occurred. > > > >> >>> @@ -228,6 +228,26 @@ struct GTY(()) cgraph_node { >>> struct cgraph_node *prev_sibling_clone; >>> struct cgraph_node *clones; >>> struct cgraph_node *clone_of; >>> + >>> + /* Function Multiversioning info. */ >>> + struct { >>> >>> + /* Chains all the semantically identical function versions. The >>> + first function in this chain is the default function. */ >>> + struct cgraph_node *prev; >>> + /* If this node is a dispatcher for function versions, this points >>> + to the default function version, the first function in the chai= n. >>> */ >>> + struct cgraph_node *next; >> >> >> Why not a VEC of function decls? Seems easier to manage and less size >> overhead. > > I have solved the size overhead by moving function_version_info > outside cgraph. I think it is better to chain the decls as it is very > easy to traverse the list of semantically identical versions from any > given function version. > >> >> >>> @@ -3516,8 +3522,8 @@ struct GTY(()) tree_function_decl { >>> >>> unsigned looping_const_or_pure_flag : 1; >>> unsigned has_debug_args_flag : 1; >>> unsigned tm_clone_flag : 1; >>> - >>> - /* 1 bit left */ >>> + unsigned versioned_function : 1; >>> + /* No bits left. */ >> >> >> You ate the last bit! How rude ;) > > I should get the patch in before somebody else really eats it ;-) > >> >>> @@ -8132,6 +8176,38 @@ joust (struct z_candidate *cand1, struct z_candi= da >>> && (IS_TYPE_OR_DECL_P (cand1->fn))) >>> return 1; >>> >>> + /* For Candidates of a multi-versioned function, make the version w= ith >> >> >> s/Candidates/candidates/ >> >> >>> + old_current_function_decl =3D current_function_decl; >>> + push_cfun (DECL_STRUCT_FUNCTION (function_decl)); >>> + current_function_decl =3D function_decl; >> >> >> push_cfun will set current_function_decl for you. No need to keep track= of >> old_current_function_decl. >> >>> + enum feature_priority >>> + { >>> + P_ZERO =3D 0, >>> + P_MMX, >>> + P_SSE, >>> + P_SSE2, >>> + P_SSE3, >>> + P_SSSE3, >>> + P_PROC_SSSE3, >>> + P_SSE4_a, >>> + P_PROC_SSE4_a, >>> + P_SSE4_1, >>> + P_SSE4_2, >>> + P_PROC_SSE4_2, >>> + P_POPCNT, >>> + P_AVX, >>> + P_AVX2, >>> + P_FMA, >>> + P_PROC_FMA >>> + }; >> >> >> There's no need to have this list dynamically defined, right? > > I dont understand, why expose the enum outside the function? > >> >>> + } >>> + } >>> + >>> + /* Process feature name. */ >>> + tok_str =3D (char *) xmalloc (strlen (attrs_str) + 1); >> >> >> XNEWVEC(char, strlen (attrs_str) + 1); >> >> >>> + /* Atleast one more version other than the default. */ >> >> >> s/Atleast/At least/ >> >>> + num_versions =3D VEC_length (tree, fndecls); >>> + gcc_assert (num_versions >=3D 2); >>> + >>> + function_version_info =3D (struct _function_version_info *) >>> + xmalloc ((num_versions - 1) * sizeof (struct >>> _function_version_info)); >> >> >> Better use VEC() here. >> >> >>> + >>> + /* The first version in the vector is the default decl. */ >>> + default_decl =3D VEC_index (tree, fndecls, 0); >>> + >>> + old_current_function_decl =3D current_function_decl; >>> + push_cfun (DECL_STRUCT_FUNCTION (dispatch_decl)); >>> + current_function_decl =3D dispatch_decl; >> >> >> No need to set current_function_decl. >> >>> + >>> + gseq =3D bb_seq (*empty_bb); >>> + /* Function version dispatch is via IFUNC. IFUNC resolvers fire bef= ore >>> + constructors, so explicity call __builtin_cpu_init here. */ >>> >>> + ifunc_cpu_init_stmt =3D gimple_build_call_vec ( >>> + ix86_builtins [(int) IX86_BUILTIN_CPU_INIT], NULL= ); >>> + gimple_seq_add_stmt (&gseq, ifunc_cpu_init_stmt); >>> + gimple_set_bb (ifunc_cpu_init_stmt, *empty_bb); >>> + set_bb_seq (*empty_bb, gseq); >>> + >>> + pop_cfun (); >>> + current_function_decl =3D old_current_function_decl; >> >> >> Likewise here. >> >>> +/* This function returns true if fn1 and fn2 are versions of the same >>> function. >>> + Returns false if only one of the function decls has the target >>> attribute >>> + set or if the targets of the function decls are different. This >>> assumes >>> + the fn1 and fn2 have the same signature. */ >> >> >> Mention the arguments in capitals. >> >> >>> + for (i =3D 0; i < strlen (str); i++) >>> + if (str[i] =3D=3D ',') >>> + argnum++; >>> + >>> + attr_str =3D (char *)xmalloc (strlen (str) + 1); >> >> >> XNEWVEC() >> >>> + strcpy (attr_str, str); >>> + >>> + /* Replace "=3D,-" with "_". */ >>> >>> + for (i =3D 0; i < strlen (attr_str); i++) >>> + if (attr_str[i] =3D=3D '=3D' || attr_str[i]=3D=3D '-') >>> >>> + attr_str[i] =3D '_'; >>> + >>> + if (argnum =3D=3D 1) >>> + return attr_str; >>> + >>> + args =3D (char **)xmalloc (argnum * sizeof (char *)); >> >> >> VEC()? >> >>> + if (DECL_DECLARED_INLINE_P (decl) >>> + && lookup_attribute ("gnu_inline", >>> >>> + DECL_ATTRIBUTES (decl))) >>> + error_at (DECL_SOURCE_LOCATION (decl), >>> + "Function versions cannot be marked as gnu_inline," >>> + " bodies have to be generated\n"); >> >> >> No newline at the end of the error message. >> >>> + sprintf (assembler_name, "%s.%s", orig_name, attr_str); >>> + if (dump_file) >>> + fprintf (stderr, "Assembler name set to %s for function version >>> %s\n", >>> + assembler_name, IDENTIFIER_POINTER (id)); >> >> >> This dumps to stderr instead of dump_file. Also, use the new dumping >> facility? >> >> >>> +/* Return a new name by appending SUFFIX to the DECL name. If >>> + make_unique is true, append the full path name. */ >> >> >> Full path name of what? >> >> >>> + >>> +static char * >>> +make_name (tree decl, const char *suffix, bool make_unique) >>> +{ >>> + char *global_var_name; >>> + int name_len; >>> + const char *name; >>> + const char *unique_name =3D NULL; >>> + >>> + name =3D IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); >>> + >>> + /* Get a unique name that can be used globally without any chances >>> + of collision at link time. */ >>> + if (make_unique) >>> + unique_name =3D IDENTIFIER_POINTER (get_file_function_name ("\0")); >>> + >>> + name_len =3D strlen (name) + strlen (suffix) + 2; >>> + >>> + if (make_unique) >>> + name_len +=3D strlen (unique_name) + 1; >>> + global_var_name =3D (char *) xmalloc (name_len); >> >> >> XNEWVEC. >> >> >> >> Diego. --e89a8fb1f8d231170504ccc06267 Content-Type: text/plain; charset=US-ASCII; name="mv_fe_patch_10232012.txt" Content-Disposition: attachment; filename="mv_fe_patch_10232012.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h8ni9qk11 Content-length: 109093 T3ZlcnZpZXcgb2YgdGhlIHBhdGNoIHdoaWNoIGFkZHMgc3VwcG9ydCB0byBz cGVjaWZ5IGZ1bmN0aW9uIHZlcnNpb25zLiAgVGhpcyBpcwpvbmx5IGVuYWJs ZWQgZm9yIHRhcmdldCBpMzg2LgoKRXhhbXBsZToKCmludCBmb28gKCk7ICAv KiBEZWZhdWx0IHZlcnNpb24gKi8KaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9f ICgodGFyZ2V0KCJhdngscG9wY250IikpKTsvKlNwZWNpYWxpemVkIGZvciBh dnggYW5kIHBvcGNudCAqLwppbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0 YXJnZXQoImFyY2g9Y29yZTIsc3NzZTMiKSkpOy8qU3BlY2lhbGl6ZWQgZm9y IGNvcmUyIGFuZCBzc3NlMyovCgppbnQgbWFpbiAoKQp7CiBpbnQgKCpwKSgp ID0gJmZvbzsKIHJldHVybiBmb28gKCkgKyAoKnApKCk7Cn0KCmludCBmb28g KCkKewogcmV0dXJuIDA7Cn0KCmludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0 KCJhdngscG9wY250IikpKQpmb28gKCkKewogcmV0dXJuIDA7Cn0KCmludCBf X2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWNvcmUyLHNzc2UzIikpKQpm b28gKCkKewogcmV0dXJuIDA7Cn0KClRoZSBhYm92ZSBleGFtcGxlIGhhcyBm b28gZGVmaW5lZCAzIHRpbWVzLCBidXQgYWxsIDMgZGVmaW5pdGlvbnMgb2Yg Zm9vIGFyZQpkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgZnVuY3Rp b24uIFRoZSBjYWxsIHRvIGZvbyBpbiBtYWluLCBkaXJlY3RseSBhbmQKdmlh IGEgcG9pbnRlciwgYXJlIGNhbGxzIHRvIHRoZSBtdWx0aS12ZXJzaW9uZWQg ZnVuY3Rpb24gZm9vIHdoaWNoIGlzIGRpc3BhdGNoZWQKdG8gdGhlIHJpZ2h0 IGZvbyBhdCBydW4tdGltZS4KCkZyb250LWVuZCBjaGFuZ2VzOgoKVGhlIGZy b250LWVuZCBjaGFuZ2VzIGFyZSBjYWxscyBhdCBhcHByb3ByaWF0ZSBwbGFj ZXMgdG8gdGFyZ2V0IGhvb2tzIHRoYXQKZGV0ZXJtaW5lIHRoZSBmb2xsb3dp bmc6CgoqIERldGVybWluZSBpZiB0d28gZnVuY3Rpb24gZGVjbHMgd2l0aCB0 aGUgc2FtZSBzaWduYXR1cmUgYXJlIHZlcnNpb25zLgoqIERldGVybWluZSB0 aGUgYXNzZW1ibGVyIG5hbWUgb2YgYSBmdW5jdGlvbiB2ZXJzaW9uLgoqIEdl bmVyYXRlIHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGZvciBhIHNldCBvZiBm dW5jdGlvbiB2ZXJzaW9ucy4KKiBDb21wYXJlIHZlcnNpb25zIHRvIHNlZSBp ZiBvbmUgaGFzIGEgaGlnaGVyIHByaW9yaXR5IG92ZXIgdGhlIG90aGVyLgoK QWxsIHRoZSBpbXBsZW1lbnRhdGlvbiBoYXBwZW5zIGluIHRoZSB0YXJnZXQt c3BlY2lmaWMgY29uZmlnL2kzODYvaTM4Ni5jLgoKV2hhdCBkb2VzIHRoZSBw YXRjaCBkbz8KCiogVHJhY2tpbmcgZGVjbHMgdGhhdCBjb3JyZXNwb25kIHRv IGZ1bmN0aW9uIHZlcnNpb25zIG9mIGZ1bmN0aW9uCm5hbWUsIHNheSAiZm9v IjoKCldoZW4gdGhlIGZyb250LWVuZCBzZWVzIG1vcmUgdGhhbiBvbmUgZGVj bCBmb3IgImZvbyIsIGl0IGNhbGxzIGEgdGFyZ2V0IGhvb2sgdG8KZGV0ZXJt aW5lIGlmIHRoZXkgYXJlIHZlcnNpb25zLiBUbyBwcmV2ZW50IGR1cGxpY2F0 ZSBkZWZpbml0aW9uIGVycm9ycyB3aXRoIG90aGVyCiB2ZXJzaW9ucyBvZiAi Zm9vIiwgImRlY2xzX21hdGNoIiBmdW5jdGlvbiBpbiBjcC9kZWNsLmMgaXMg bWFkZSB0byByZXR1cm4gZmFsc2UKIHdoZW4gMiBkZWNscyBoYXZlIGFyZSBk ZWVtZWQgdmVyc2lvbnMgYnkgdGhlIHRhcmdldC4gVGhpcyB3aWxsIG1ha2Ug YWxsIGZ1bmN0aW9uCnZlcnNpb25zIG9mICJmb28iIHRvIGJlIGFkZGVkIHRv IHRoZSBvdmVybG9hZCBsaXN0IG9mICJmb28iLgoKKiBDaGFuZ2UgdGhlIGFz c2VtYmxlciBuYW1lcyBvZiB0aGUgZnVuY3Rpb24gdmVyc2lvbnMuCgpGb3Ig aTM4NiwgdGhlIHRhcmdldCBjaGFuZ2VzIHRoZSBhc3NlbWJsZXIgbmFtZXMg b2YgdGhlIGZ1bmN0aW9uIHZlcnNpb25zIGJ5CiBzdWZmaXhpbmcgdGhlIHNv cnRlZCBsaXN0IG9mIGFyZ3MgdG8gInRhcmdldCIgdG8gdGhlIGZ1bmN0aW9u IG5hbWUgb2YgImZvbyIuIEZvcgpleGFtcGxlLCBoZSBhc3NlbWJsZXIgbmFt ZSBvZiAidm9pZCBmb28gKCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoInNz ZTQiKSkpIiB3aWxsCmJlY29tZSBfWjNmb292LnNzZTQuICBUaGUgdGFyZ2V0 IGhvb2sgbWFuZ2xlX2RlY2xfYXNzZW1ibGVyX25hbWUgaXMgdXNlZCBmb3Ig dGhpcy4KCiogT3ZlcmxvYWQgcmVzb2x1dGlvbjoKCiBGdW5jdGlvbiAiYnVp bGRfb3Zlcl9jYWxsIiBpbiBjcC9jYWxsLmMgc2VlcyBhIGNhbGwgdG8gZnVu Y3Rpb24KImZvbyIsIHdoaWNoIGlzIG11bHRpLXZlcnNpb25lZC4gVGhlIG92 ZXJsb2FkIHJlc29sdXRpb24gaGFwcGVucyBpbgpmdW5jdGlvbiAiam91c3Qi IGluICJjcC9jYWxsLmMiLiBIZXJlLCB0aGUgY2FsbCB0byAiZm9vIiBoYXMg YWxsCnBvc3NpYmxlIHZlcnNpb25zIG9mICJmb28iIGFzIGNhbmRpZGF0ZXMu IEFsbCB0aGUgY2FuZGlkYXRlcyBvZiAiZm9vIiBhcmUKc3RvcmVkIGluIHRo ZSBjZ3JhcGggZGF0YSBzdHJ1Y3R1cmVzLiBFYWNoIHZlcnNpb24gb2YgZm9v IGlzIGNoYWluZWQgaW4gYSAKZG91Ymx5LWxpbmtlZCBsaXN0IHdpdGggdGhl IGRlZmF1bHQgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IGVsZW1lbnQuICBUaGlz IGFsbG93cwphbnkgcGFzcyB0byBhY2Nlc3MgYWxsIHRoZSBzZW1hbnRpY2Fs bHkgaWRlbnRpY2FsIHZlcnNpb25zLiBBIGNhbGwgdG8gYQptdWx0aS12ZXJz aW9uZWQgZnVuY3Rpb24gd2lsbCBiZSByZXBsYWNlZCBieSBhIGNhbGwgdG8g YSBkaXNwYXRjaGVyIGZ1bmN0aW9uLApkZXRlcm1pbmVkIGJ5IGEgdGFyZ2V0 IGhvb2ssIHRvIGV4ZWN1dGUgdGhlIHJpZ2h0IGZ1bmN0aW9uIHZlcnNpb24g YXQgcnVuLXRpbWUuCgpPcHRpbWl6YXRpb24gdG8gZGlyZWN0bHkgY2FsbCBh IHZlcnNpb24gd2hlbiBwb3NzaWJsZToKQWxzbywgaW4gam91c3QsIHdoZXJl IG92ZXJsb2FkIHJlc29sdXRpb24gaGFwcGVucywgYSBtdWx0aXZlcnNpb25l ZCBmdW5jdGlvbgpyZXNvbHV0aW9uIGlzIG1hZGUgdG8gcmV0dXJuIHRoZSBt b3N0IHNwZWNpYWxpemVkIHZlcnNpb24uICBUaGlzIGlzIHRoZSB2ZXJzaW9u CnRoYXQgd2lsbCBiZSBjaGVja2VkIGZvciBkaXNwYXRjaGluZyBmaXJzdCBh bmQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0LgpOb3csIGlmIHRoZSBj YWxsZXIgY2FuIGlubGluZSB0aGlzIGZ1bmN0aW9uIHZlcnNpb24gdGhlbiBh IGRpcmVjdCBjYWxsIGlzIG1hZGUKdG8gdGhpcyBmdW5jdGlvbiB2ZXJzaW9u IHJhdGhlciB0aGFuIGdvIHRocm91Z2ggdGhlIGRpc3BhdGNoZXIuIFdoZW4g YSBkaXJlY3QKY2FsbCBjYW5ub3QgYmUgbWFkZSwgYSBjYWxsIHRvIHRoZSBk aXNwYXRjaGVyIGZ1bmN0aW9uIGlzIGNyZWF0ZWQuCgoqIENyZWF0aW5nIHRo ZSBkaXNwYXRjaGVyIGJvZHkuCgpUaGUgZGlzcGF0Y2hlciBib2R5LCBjYWxs ZWQgdGhlIHJlc29sdmVyIGlzIG1hZGUgb25seSB3aGVuIHRoZXJlIGlzIGEg Y2FsbCB0byBhCm11bHRpdmVyc2lvbmVkIGZ1bmN0aW9uIGRpc3BhdGNoZXIg b3IgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiBpcyB0YWtlbi4gVGhpcwpp cyBnZW5lcmF0ZWQgZHVyaW5nIGJ1aWxkX2NncmFwaF9lZGdlcyBmb3IgYSBj YWxsIG9yIGNncmFwaF9tYXJrX2FkZHJlc3NfdGFrZW4KZm9yIGEgcG9pbnRl ciByZWZlcmVuY2UuIFRoaXMgaXMgZG9uZSBieSBhbm90aGVyIHRhcmdldCBo b29rLgoKKiBEaXNwYXRjaCBvcmRlcmluZy4KClRoZSBvcmRlciBpbiB3aGlj aCB0aGUgZnVuY3Rpb24gdmVyc2lvbnMgYXJlIGNoZWNrZWQgZHVyaW5nIGRp c3BhdGNoIGlzIGJhc2VkCm9uIGEgcHJpb3JpdHkgdmFsdWUgYXNzaWduZWQg Zm9yIHRoZSBJU0EgdGhhdCBpcyBjYXRlcmVkLiBNb3JlIHNwZWNpYWxpemVk IAp2ZXJzaW9ucyBhcmUgY2hlY2tlZCBmb3IgZGlzcGF0Y2hpbmcgZmlyc3Qu ICBUaGlzIGlzIHRvIG1pdGlnYXRlIHRoZSBhbWJpZ3VpdHkKdGhhdCBjYW4g YXJpc2Ugd2hlbiBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIHZlcnNpb24gaXMg dmFsaWQgZm9yIGV4ZWN1dGlvbiBvbgphIHBhcnRpY3VsYXIgcGxhdGZvcm0u ICBUaGlzIGlzIG5vdCBhIHBlcmZlY3Qgc29sdXRpb24sIGFuZCBpbiBmdXR1 cmUgdGhlIHVzZXIKc2hvdWxkIGJlIGFsbG93ZWQgdG8gYXNzaWduIGEgZGlz cGF0Y2hpbmcgcHJpb3JpdHkgdmFsdWUgdG8gZWFjaCB2ZXJzaW9uLgoKRnVu Y3Rpb24gTVYgaW4gdGhlIEludGVsIGNvbXBpbGVyOgoKVGhlIGludGVsIGNv bXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIG11bHRpdmVyc2lvbmluZyBhbmQg dGhlIHN5bnRheCBpcwpzaW1pbGFyIHRvIHRoZSBwYXRjaCBwcm9wb3NlZCBo ZXJlLiAgSGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0bwpnZW5lcmF0ZSBt dWx0aXBsZSBmdW5jdGlvbiB2ZXJzaW9ucyB3aXRoIHRoZSBpbnRlbCBjb21w aWxlci4KCi8qIENyZWF0ZSBhIHN0dWIgZnVuY3Rpb24gdG8gc3BlY2lmeSB0 aGUgdmFyaW91cyB2ZXJzaW9ucyBvZiBmdW5jdGlvbiB0aGF0CiAgIHdpbGwg YmUgY3JlYXRlZCwgdXNpbmcgZGVjbHNwZWMgYXR0cmlidXRlIGNwdV9kaXNw YXRjaC4gICovCl9fZGVjbHNwZWMgKGNwdV9kaXNwYXRjaCAoY29yZV9pN19z c2U0XzIsIGF0b20sIGdlbmVyaWMpKQp2b2lkIGZvbyAoKSB7fTsKCi8qIEJv ZGllcyBvZiBlYWNoIGZ1bmN0aW9uIHZlcnNpb24uICAqLwoKLyogSW50ZWwg Q29yZWk3IHByb2Nlc3NvciArIFNTRTQuMiB2ZXJzaW9uLiAgKi8KX19kZWNs c3BlYyAoY3B1X3NwZWNpZmljKGNvcmVfaTdfc3NlNF8yKSkKdm9pZCBmb28g KCkKewogIHByaW50ZiAoImNvcmVpNyArIHNzZTQuMiIpOwp9CgovKiBBdG9t IHByb2Nlc3Nvci4gICovCl9fZGVjbHNwZWMgKGNwdV9zcGVjaWZpYyhhdG9t KSkKdm9pZCBmb28gKCkKewogIHByaW50ZiAoImF0b20iKTsKfQoKLyogVGhl IGdlbmVyaWMgb3IgdGhlIGRlZmF1bHQgdmVyc2lvbi4gICovCl9fZGVjbHNw ZWMgKGNwdV9zcGVjaWZpYyhnZW5lcmljKSkKdm9pZCBmb28gKCkKewogIHBy aW50ZiAoIlRoaXMgaXMgZ2VuZXJpYyIpOwp9CgpBIG5ldyBmdW5jdGlvbiB2 ZXJzaW9uIGlzIGdlbmVyYXRlZCBieSBkZWZpbmluZyBhIG5ldyBmdW5jdGlv biB3aXRoIHRoZSBzYW1lCnNpZ25hdHVyZSBidXQgd2l0aCBhIGRpZmZlcmVu dCBjcHVfc3BlY2lmaWMgZGVjbHNwZWMgYXR0cmlidXRlIHN0cmluZy4gIFRo ZQpzZXQgb2YgY3B1X3NwZWNpZmljIHN0cmluZ3MgdGhhdCBhcmUgYWxsb3dl ZCBpcyB0aGUgZm9sbG93aW5nOgoKImNvcmVfMm5kX2dlbl9hdngiCiJjb3Jl X2Flc19wY2xtdWxxZHEiCiJjb3JlX2k3X3NzZTRfMiIKImNvcmVfMl9kdW9f c3NlNF8xIgoiY29yZV8yX2R1b19zc3NlMyIKImF0b20iCiJwZW50aXVtXzRf c3NlMyIKInBlbnRpdW1fNCIKInBlbnRpdW1fbSIKInBlbnRpdW1faWlpIgoi Z2VuZXJpYyIKCkNvbXBhcmlzb24gd2l0aCB0aGUgR0NDIE1WIGltcGxlbWVu dGF0aW9uIGluIHRoaXMgcGF0Y2g6CgoqIFZlcnNpb24gY3JlYXRpb24gc3lu dGF4OgoKVGhlIGltcGxlbWVudGF0aW9uIGluIHRoaXMgcGF0Y2ggYWxzbyBo YXMgYSBzaW1pbGFyIHN5bnRheCB0byBzcGVjaWZ5IGZ1bmN0aW9uCnZlcnNp b25zLiBUaGUgZmlyc3Qgc3R1YiBmdW5jdGlvbiBpcyBub3QgbmVlZGVkLiAg SGVyZSBpcyB0aGUgY29kZSB0byBnZW5lcmF0ZQp0aGUgZnVuY3Rpb24gdmVy c2lvbnMgd2l0aCB0aGlzIHBhdGNoOgoKLyogSW50ZWwgQ29yZWk3IHByb2Nl c3NvciArIFNTRTQuMiB2ZXJzaW9uLiAgKi8KX19hdHRyaWJ1dGVfXyAoKHRh cmdldCAoImFyY2g9Y29yZWk3LCBzc2U0LjIiKSkpCnZvaWQgZm9vICgpCnsK ICBwcmludGYgKCJjb3JlaTcgKyBzc2U0LjIiKTsKfQoKLyogQXRvbSBwcm9j ZXNzb3IuICAqLwpfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgiYXJjaD1hdG9t IikpKQp2b2lkIGZvbyAoKQp7CiAgcHJpbnRmICgiYXRvbSIpOwp9Cgp2b2lk IGZvbyAoKQp7Cn0KClRoZSB0YXJnZXQgYXR0cmlidXRlIGNhbiBoYXZlIG9u ZSBvZiB0aGUgZm9sbG93aW5nIGFyY2ggbmFtZXM6CgoiYW1kIgoiaW50ZWwi CiJhdG9tIgoiY29yZTIiCiJjb3JlaTciCiJuZWhhbGVtIgoid2VzdG1lcmUi CiJzYW5keWJyaWRnZSIKImFtZGZhbTEwaCIKImJhcmNlbG9uYSIKInNoYW5n aGFpIgoiaXN0YW5idWwiCiJhbWRmYW0xNWgiCiJiZHZlcjEiCiJiZHZlcjIi CgphbmQgYW55IG51bWJlciBvZiB0aGUgZm9sbG93aW5nIElTQSBuYW1lczoK CiJjbW92IgoibW14IgoicG9wY250Igoic3NlIgoic3NlMiIKInNzZTMiCiJz c3NlMyIKInNzZTQuMSIKInNzZTQuMiIKImF2eCIKImF2eDIiCgoKCSogZG9j L3RtLnRleGkuaW4gKFRBUkdFVF9PUFRJT05fRlVOQ1RJT05fVkVSU0lPTlMp OiBOZXcgaG9vayBkZXNjcmlwdGlvbi4KCSogKFRBUkdFVF9DT01QQVJFX1ZF UlNJT05fUFJJT1JJVFkpOiBOZXcgaG9vayBkZXNjcmlwdGlvbi4KCSogKFRB UkdFVF9HRVRfRlVOQ1RJT05fVkVSU0lPTlNfRElTUEFUQ0hFUik6IE5ldyBo b29rIGRlc2NyaXB0aW9uLgoJKiAoVEFSR0VUX0dFTkVSQVRFX1ZFUlNJT05f RElTUEFUQ0hFUl9CT0RZKTogTmV3IGhvb2sgZGVzY3JpcHRpb24uCgkqIGRv Yy90bS50ZXhpOiBSZWdlbmVyYXRlLgoJKiBjZ3JhcGhidWlsZC5jIChidWls ZF9jZ3JhcGhfZWRnZXMpOiBHZW5lcmF0ZSBib2R5IG9mIG11bHRpdmVyc2lv bgoJZnVuY3Rpb24gZGlzcGF0Y2hlci4KCSogYy1mYW1pbHkvYy1jb21tb24u YyAoaGFuZGxlX3RhcmdldF9hdHRyaWJ1dGUpOiBXYXJuIGZvciBpbnZhbGlk IGF0dHJpYnV0ZXMuCgkqIHRhcmdldC5kZWYgKGNvbXBhcmVfdmVyc2lvbl9w cmlvcml0eSk6IE5ldyB0YXJnZXQgaG9vay4KCSogKGdlbmVyYXRlX3ZlcnNp b25fZGlzcGF0Y2hlcl9ib2R5KTogTmV3IHRhcmdldCBob29rLgoJKiAoZ2V0 X2Z1bmN0aW9uX3ZlcnNpb25zX2Rpc3BhdGNoZXIpOiBOZXcgdGFyZ2V0IGhv b2suCgkqIChmdW5jdGlvbl92ZXJzaW9ucyk6IE5ldyB0YXJnZXQgaG9vay4K CSogY2dyYXBoLmMgKGNncmFwaF9tYXJrX2FkZHJlc3NfdGFrZW5fbm9kZSk6 IEdlbmVyYXRlIGJvZHkgb2YgbXVsdGl2ZXJzaW9uCglmdW5jdGlvbiBkaXNw YXRjaGVyLgoJKiBjZ3JhcGguaCAoY2dyYXBoX25vZGUpOiBOZXcgbWVtYmVy cyBmdW5jdGlvbl92ZXJzaW9uLAoJZGlzcGF0Y2hlcl9mdW5jdGlvbi4KCShj Z3JhcGhfZnVuY3Rpb25fdmVyc2lvbl9pbmZvKTogTmV3IHN0cnVjdC4KCSog dHJlZS5oIChERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCk6IE5ldyBtYWNyby4K CSh0cmVlX2Z1bmN0aW9uX2RlY2wpOiBOZXcgYml0LWZpZWxkIHZlcnNpb25l ZF9mdW5jdGlvbi4KCSogdGVzdHN1aXRlL2crKy5kZy9tdjEuQzogTmV3IHRl c3QuCgkqIHRlc3RzdWl0ZS9nKysuZGcvbXYyLkM6IE5ldyB0ZXN0LgoJKiB0 ZXN0c3VpdGUvZysrLmRnL212My5DOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRl L2crKy5kZy9tdjQuQzogTmV3IHRlc3QuCgkqIGNwL2NsYXNzLmM6CgkoYWRk X21ldGhvZCk6IENoYW5nZSBhc3NlbWJsZXIgbmFtZXMgb2YgZnVuY3Rpb24g dmVyc2lvbnMuCgkocmVzb2x2ZV9hZGRyZXNzX29mX292ZXJsb2FkZWRfZnVu Y3Rpb24pOiBTYXZlIGFsbCBmdW5jdGlvbgoJdmVyc2lvbiBjYW5kaWRhdGVz LiBDcmVhdGUgZGlzcGF0Y2hlciBkZWNsIGFuZCByZXR1cm4gYWRkcmVzcyBv ZgoJZGlzcGF0Y2hlciBpbnN0ZWFkLgoJKiBjcC9kZWNsLmMgKGRlY2xzX21h dGNoKTogTWFrZSBkZWNscyB1bm1hdGNoZWQgZm9yIHZlcnNpb25lZAoJZnVu Y3Rpb25zLgoJKGR1cGxpY2F0ZV9kZWNscyk6IFJlbW92ZSBhbWJpZ3VpdHkg Zm9yIHZlcnNpb25lZCBmdW5jdGlvbnMuIAoJKGN4eF9jb21kYXRfZ3JvdXAp OiBNYWtlIGNvbWRhdCBncm91cCBvZiB2ZXJzaW9uZWQgZnVuY3Rpb25zIGJl IHRoZQoJc2FtZS4KCSogY3AvZXJyb3IuYyAoZHVtcF9leGNlcHRpb25fc3Bl Yyk6IER1bXAgYXNzZW1ibGVyIG5hbWUgZm9yIGZ1bmN0aW9uCgl2ZXJzaW9u cy4KCSogY3Avc2VtYW50aWNzLmMgKGV4cGFuZF9vcl9kZWZlcl9mbl8xKTog TWFyayBhcyBuZWVkZWQgdmVyc2lvbmVkCglmdW5jdGlvbnMgdGhhdCBhcmUg YWxzbyBtYXJrZWQgaW5saW5lLgoJKiBjcC9kZWNsMi5jOihjaGVja19jbGFz c2ZuKTogQ2hlY2sgYXR0cmlidXRlcyBvZiB2ZXJzaW9uZWQgZnVuY3Rpb25z Cglmb3IgbWF0Y2guCgkqIGNwL2NhbGwuYzogKGJ1aWxkX25ld19mdW5jdGlv bl9jYWxsKTogQ2hlY2sgaWYgdmVyc2lvbmVkIGZ1bmN0aW9ucwoJaGF2ZSBh IGRlZmF1bHQgdmVyc2lvbi4KCShidWlsZF9vdmVyX2NhbGwpOiBNYWtlIGNh bGxzIHRvIG11bHRpdmVyc2lvbmVkIGZ1bmN0aW9ucwoJdG8gY2FsbCB0aGUg ZGlzcGF0Y2hlci4KCShqb3VzdCk6IEZvciBjYWxscyB0byBtdWx0aS12ZXJz aW9uZWQgZnVuY3Rpb25zLCBtYWtlIHRoZSBtb3N0CglzcGVjaWFsaXplZCBm dW5jdGlvbiB2ZXJzaW9uIHdpbi4KCSh0b3VybmV5KTogR2VuZXJhdGUgZGlz cGF0Y2hlciBkZWNsIGZvciBmdW5jdGlvbiB2ZXJzaW9ucy4KCShnZXRfZnVu Y3Rpb25fdmVyc2lvbl9kaXNwYXRjaGVyKTogTmV3IGZ1bmN0aW9uLgoJKGdl bmVyYXRlX2Z1bmN0aW9uX3ZlcnNpb25zX2Rpc3BhdGNoZXIpOiBOZXcgZnVu Y3Rpb24uCgkqIE1ha2VmaWxlLmluOiBBZGQgbXVsdGl2ZXJzaW9uLm8KCSog Y29uZmlnL2kzODYvaTM4Ni5jIChhZGRfY29uZGl0aW9uX3RvX2JiKTogTmV3 IGZ1bmN0aW9uLgoJKGdldF9idWlsdGluX2NvZGVfZm9yX3ZlcnNpb24pOiBO ZXcgZnVuY3Rpb24uCgkoaXg4Nl9jb21wYXJlX3ZlcnNpb25fcHJpb3JpdHkp OiBOZXcgZnVuY3Rpb24uCgkoZmVhdHVyZV9jb21wYXJlKTogTmV3IGZ1bmN0 aW9uLgoJKGRpc3BhdGNoX2Z1bmN0aW9uX3ZlcnNpb25zKTogTmV3IGZ1bmN0 aW9uLgoJKiAoaXg4Nl9mdW5jdGlvbl92ZXJzaW9ucyk6IE5ldyBmdW5jdGlv bi4KCSogKGF0dHJfc3RyY21wKTogTmV3IGZ1bmN0aW9uLgoJKiAoc29ydGVk X2F0dHJfc3RyaW5nKTogTmV3IGZ1bmN0aW9uLgoJKiAoaXg4Nl9tYW5nbGVf ZnVuY3Rpb25fdmVyc2lvbl9hc3NlbWJsZXJfbmFtZSk6IE5ldyBmdW5jdGlv bi4KCSogKGl4ODZfbWFuZ2xlX2RlY2xfYXNzZW1ibGVyX25hbWUpOiBOZXcg ZnVuY3Rpb24uCgkqIChtYWtlX25hbWUpOiBOZXcgZnVuY3Rpb24uCgkqICht YWtlX2Rpc3BhdGNoZXJfZGVjbCk6IE5ldyBmdW5jdGlvbi4KCSogKGlzX2Z1 bmN0aW9uX2RlZmF1bHRfdmVyc2lvbik6IE5ldyBmdW5jdGlvbi4KCSogKGl4 ODZfZ2V0X2Z1bmN0aW9uX3ZlcnNpb25zX2Rpc3BhdGNoZXIpOiBOZXcgZnVu Y3Rpb24uCgkqIChtYWtlX2F0dHJpYnV0ZSk6IE5ldyBmdW5jdGlvbi4KCSog KG1ha2VfcmVzb2x2ZXJfZnVuYyk6IE5ldyBmdW5jdGlvbi4KCSogKGl4ODZf Z2VuZXJhdGVfdmVyc2lvbl9kaXNwYXRjaGVyX2JvZHkpOiBOZXcgZnVuY3Rp b24uCgkqIChUQVJHRVRfQ09NUEFSRV9WRVJTSU9OX1BSSU9SSVRZKTogTmV3 IG1hY3JvLgoJKiAoVEFSR0VUX0dFVF9GVU5DVElPTl9WRVJTSU9OU19ESVNQ QVRDSEVSKTogTmV3IG1hY3JvLgoJKiAoVEFSR0VUX0dFTkVSQVRFX1ZFUlNJ T05fRElTUEFUQ0hFUl9CT0RZKTogTmV3IG1hY3JvLgoJKiAoVEFSR0VUX09Q VElPTl9GVU5DVElPTl9WRVJTSU9OUyk6IE5ldyBtYWNyby4KCSogKFRBUkdF VF9NQU5HTEVfREVDTF9BU1NFTUJMRVJfTkFNRSk6IE5ldyBtYWNyby4KCklu ZGV4OiBnY2MvZG9jL3RtLnRleGkKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gZ2NjL2RvYy90bS50ZXhpCShyZXZpc2lvbiAxOTI2MjMpCisrKyBnY2Mv ZG9jL3RtLnRleGkJKHdvcmtpbmcgY29weSkKQEAgLTk5MTMsNiArOTkxMywx NCBAQCBjaGFuZ2VkIHZpYSB0aGUgb3B0aW1pemUgYXR0cmlidXRlIG9yIHBy YWdtYSwgc2VlCiBAY29kZXtUQVJHRVRfT1ZFUlJJREVfT1BUSU9OU19BRlRF Ul9DSEFOR0V9CiBAZW5kIGRlZnR5cGVmbgogCitAZGVmdHlwZWZuIHtUYXJn ZXQgSG9va30gYm9vbCBUQVJHRVRfT1BUSU9OX0ZVTkNUSU9OX1ZFUlNJT05T ICh0cmVlIEB2YXJ7ZGVjbDF9LCB0cmVlIEB2YXJ7ZGVjbDJ9KQorVGhpcyB0 YXJnZXQgaG9vayByZXR1cm5zIEBjb2Rle3RydWV9IGlmIEB2YXJ7REVDTDF9 IGFuZCBAdmFye0RFQ0wyfSBhcmUKK3ZlcnNpb25zIG9mIHRoZSBzYW1lIGZ1 bmN0aW9uLiAgQHZhcntERUNMMX0gYW5kIEB2YXJ7REVDTDJ9IGFyZSBmdW5j dGlvbgordmVyc2lvbnMgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBz YW1lIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQKK2RpZmZlcmVudCB0YXJnZXQg c3BlY2lmaWMgYXR0cmlidXRlcywgdGhhdCBpcywgdGhleSBhcmUgY29tcGls ZWQgZm9yCitkaWZmZXJlbnQgdGFyZ2V0IG1hY2hpbmVzLgorQGVuZCBkZWZ0 eXBlZm4KKwogQGRlZnR5cGVmbiB7VGFyZ2V0IEhvb2t9IGJvb2wgVEFSR0VU X0NBTl9JTkxJTkVfUCAodHJlZSBAdmFye2NhbGxlcn0sIHRyZWUgQHZhcntj YWxsZWV9KQogVGhpcyB0YXJnZXQgaG9vayByZXR1cm5zIEBjb2Rle2ZhbHNl fSBpZiB0aGUgQHZhcntjYWxsZXJ9IGZ1bmN0aW9uCiBjYW5ub3QgaW5saW5l IEB2YXJ7Y2FsbGVlfSwgYmFzZWQgb24gdGFyZ2V0IHNwZWNpZmljIGluZm9y bWF0aW9uLiAgQnkKQEAgLTEwOTMwLDYgKzEwOTM4LDI5IEBAIFRoZSByZXN1 bHQgaXMgYW5vdGhlciB0cmVlIGNvbnRhaW5pbmcgYSBzaW1wbGlmaWVkCiBj YWxsJ3MgcmVzdWx0LiAgSWYgQHZhcntpZ25vcmV9IGlzIHRydWUgdGhlIHZh bHVlIHdpbGwgYmUgaWdub3JlZC4KIEBlbmQgZGVmdHlwZWZuCiAKK0BkZWZ0 eXBlZm4ge1RhcmdldCBIb29rfSBpbnQgVEFSR0VUX0NPTVBBUkVfVkVSU0lP Tl9QUklPUklUWSAodHJlZSBAdmFye2RlY2wxfSwgdHJlZSBAdmFye2RlY2wy fSkKK1RoaXMgaG9vayBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIHRhcmdldCBh dHRyaWJ1dGVzIGluIHR3byBmdW5jdGlvbnMgdG8KK2RldGVybWluZSB3aGlj aCBmdW5jdGlvbidzIGZlYXR1cmVzIGdldCBoaWdoZXIgcHJpb3JpdHkuICBU aGlzIGlzIHVzZWQKK2R1cmluZyBmdW5jdGlvbiBtdWx0aS12ZXJzaW9uaW5n IHRvIGZpZ3VyZSBvdXQgdGhlIG9yZGVyIGluIHdoaWNoIHR3bwordmVyc2lv bnMgbXVzdCBiZSBkaXNwYXRjaGVkLiAgQSBmdW5jdGlvbiB2ZXJzaW9uIHdp dGggYSBoaWdoZXIgcHJpb3JpdHkKK2lzIGNoZWNrZWQgZm9yIGRpc3BhdGNo aW5nIGVhcmxpZXIuICBAdmFye2RlY2wxfSBhbmQgQHZhcntkZWNsMn0gYXJl CisgdGhlIHR3byBmdW5jdGlvbiBkZWNscyB0aGF0IHdpbGwgYmUgY29tcGFy ZWQuCitAZW5kIGRlZnR5cGVmbgorCitAZGVmdHlwZWZuIHtUYXJnZXQgSG9v a30gdHJlZSBUQVJHRVRfR0VUX0ZVTkNUSU9OX1ZFUlNJT05TX0RJU1BBVENI RVIgKHZvaWQgKkB2YXJ7YXJnbGlzdH0pCitUaGlzIGhvb2sgaXMgdXNlZCB0 byBnZXQgdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24gZm9yIGEgc2V0IG9mIGZ1 bmN0aW9uCit2ZXJzaW9ucy4gIFRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGlz IGNhbGxlZCB0byBpbnZva2UgdGhlIHJpZ2h0IGZ1bmN0aW9uCit2ZXJzaW9u IGF0IHJ1bi10aW1lLiBAdmFye2FyZ2xpc3R9IGlzIHRoZSB2ZWN0b3Igb2Yg ZnVuY3Rpb24gdmVyc2lvbnMKK3RoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQg Zm9yIGRpc3BhdGNoLgorQGVuZCBkZWZ0eXBlZm4KKworQGRlZnR5cGVmbiB7 VGFyZ2V0IEhvb2t9IHRyZWUgVEFSR0VUX0dFTkVSQVRFX1ZFUlNJT05fRElT UEFUQ0hFUl9CT0RZICh2b2lkICpAdmFye2FyZ30pCitUaGlzIGhvb2sgaXMg dXNlZCB0byBnZW5lcmF0ZSB0aGUgZGlzcGF0Y2hlciBsb2dpYyB0byBpbnZv a2UgdGhlIHJpZ2h0CitmdW5jdGlvbiB2ZXJzaW9uIGF0IHJ1bi10aW1lIGZv ciBhIGdpdmVuIHNldCBvZiBmdW5jdGlvbiB2ZXJzaW9ucy4KK0B2YXJ7YXJn fSBwb2ludHMgdG8gdGhlIGNhbGxncmFwaCBub2RlIG9mIHRoZSBkaXNwYXRj aGVyIGZ1bmN0aW9uIHdob3NlCitib2R5IG11c3QgYmUgZ2VuZXJhdGVkLgor QGVuZCBkZWZ0eXBlZm4KKwogQGRlZnR5cGVmbiB7VGFyZ2V0IEhvb2t9IHtj b25zdCBjaGFyICp9IFRBUkdFVF9JTlZBTElEX1dJVEhJTl9ET0xPT1AgKGNv bnN0X3J0eCBAdmFye2luc259KQogCiBUYWtlIGFuIGluc3RydWN0aW9uIGlu IEB2YXJ7aW5zbn0gYW5kIHJldHVybiBOVUxMIGlmIGl0IGlzIHZhbGlkIHdp dGhpbiBhCkluZGV4OiBnY2MvZG9jL3RtLnRleGkuaW4KPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gZ2NjL2RvYy90bS50ZXhpLmluCShyZXZpc2lvbiAx OTI2MjMpCisrKyBnY2MvZG9jL3RtLnRleGkuaW4JKHdvcmtpbmcgY29weSkK QEAgLTk3ODIsNiArOTc4MiwxNCBAQCBjaGFuZ2VkIHZpYSB0aGUgb3B0aW1p emUgYXR0cmlidXRlIG9yIHByYWdtYSwgc2VlCiBAY29kZXtUQVJHRVRfT1ZF UlJJREVfT1BUSU9OU19BRlRFUl9DSEFOR0V9CiBAZW5kIGRlZnR5cGVmbgog CitAaG9vayBUQVJHRVRfT1BUSU9OX0ZVTkNUSU9OX1ZFUlNJT05TCitUaGlz IHRhcmdldCBob29rIHJldHVybnMgQGNvZGV7dHJ1ZX0gaWYgQHZhcntERUNM MX0gYW5kIEB2YXJ7REVDTDJ9IGFyZQordmVyc2lvbnMgb2YgdGhlIHNhbWUg ZnVuY3Rpb24uICBAdmFye0RFQ0wxfSBhbmQgQHZhcntERUNMMn0gYXJlIGZ1 bmN0aW9uCit2ZXJzaW9ucyBpZiBhbmQgb25seSBpZiB0aGV5IGhhdmUgdGhl IHNhbWUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZAorZGlmZmVyZW50IHRhcmdl dCBzcGVjaWZpYyBhdHRyaWJ1dGVzLCB0aGF0IGlzLCB0aGV5IGFyZSBjb21w aWxlZCBmb3IKK2RpZmZlcmVudCB0YXJnZXQgbWFjaGluZXMuCitAZW5kIGRl ZnR5cGVmbgorCiBAaG9vayBUQVJHRVRfQ0FOX0lOTElORV9QCiBUaGlzIHRh cmdldCBob29rIHJldHVybnMgQGNvZGV7ZmFsc2V9IGlmIHRoZSBAdmFye2Nh bGxlcn0gZnVuY3Rpb24KIGNhbm5vdCBpbmxpbmUgQHZhcntjYWxsZWV9LCBi YXNlZCBvbiB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICBCeQpAQCAt MTA3ODgsNiArMTA3OTYsMjkgQEAgVGhlIHJlc3VsdCBpcyBhbm90aGVyIHRy ZWUgY29udGFpbmluZyBhIHNpbXBsaWZpZWQKIGNhbGwncyByZXN1bHQuICBJ ZiBAdmFye2lnbm9yZX0gaXMgdHJ1ZSB0aGUgdmFsdWUgd2lsbCBiZSBpZ25v cmVkLgogQGVuZCBkZWZ0eXBlZm4KIAorQGhvb2sgVEFSR0VUX0NPTVBBUkVf VkVSU0lPTl9QUklPUklUWQorVGhpcyBob29rIGlzIHVzZWQgdG8gY29tcGFy ZSB0aGUgdGFyZ2V0IGF0dHJpYnV0ZXMgaW4gdHdvIGZ1bmN0aW9ucyB0bwor ZGV0ZXJtaW5lIHdoaWNoIGZ1bmN0aW9uJ3MgZmVhdHVyZXMgZ2V0IGhpZ2hl ciBwcmlvcml0eS4gIFRoaXMgaXMgdXNlZAorZHVyaW5nIGZ1bmN0aW9uIG11 bHRpLXZlcnNpb25pbmcgdG8gZmlndXJlIG91dCB0aGUgb3JkZXIgaW4gd2hp Y2ggdHdvCit2ZXJzaW9ucyBtdXN0IGJlIGRpc3BhdGNoZWQuICBBIGZ1bmN0 aW9uIHZlcnNpb24gd2l0aCBhIGhpZ2hlciBwcmlvcml0eQoraXMgY2hlY2tl ZCBmb3IgZGlzcGF0Y2hpbmcgZWFybGllci4gIEB2YXJ7ZGVjbDF9IGFuZCBA dmFye2RlY2wyfSBhcmUKKyB0aGUgdHdvIGZ1bmN0aW9uIGRlY2xzIHRoYXQg d2lsbCBiZSBjb21wYXJlZC4KK0BlbmQgZGVmdHlwZWZuCisKK0Bob29rIFRB UkdFVF9HRVRfRlVOQ1RJT05fVkVSU0lPTlNfRElTUEFUQ0hFUgorVGhpcyBo b29rIGlzIHVzZWQgdG8gZ2V0IHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGZv ciBhIHNldCBvZiBmdW5jdGlvbgordmVyc2lvbnMuICBUaGUgZGlzcGF0Y2hl ciBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW52b2tlIHRoZSByaWdodCBmdW5j dGlvbgordmVyc2lvbiBhdCBydW4tdGltZS4gQHZhcnthcmdsaXN0fSBpcyB0 aGUgdmVjdG9yIG9mIGZ1bmN0aW9uIHZlcnNpb25zCit0aGF0IHNob3VsZCBi ZSBjb25zaWRlcmVkIGZvciBkaXNwYXRjaC4KK0BlbmQgZGVmdHlwZWZuCisK K0Bob29rIFRBUkdFVF9HRU5FUkFURV9WRVJTSU9OX0RJU1BBVENIRVJfQk9E WQorVGhpcyBob29rIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRpc3BhdGNo ZXIgbG9naWMgdG8gaW52b2tlIHRoZSByaWdodAorZnVuY3Rpb24gdmVyc2lv biBhdCBydW4tdGltZSBmb3IgYSBnaXZlbiBzZXQgb2YgZnVuY3Rpb24gdmVy c2lvbnMuCitAdmFye2FyZ30gcG9pbnRzIHRvIHRoZSBjYWxsZ3JhcGggbm9k ZSBvZiB0aGUgZGlzcGF0Y2hlciBmdW5jdGlvbiB3aG9zZQorYm9keSBtdXN0 IGJlIGdlbmVyYXRlZC4KK0BlbmQgZGVmdHlwZWZuCisKIEBob29rIFRBUkdF VF9JTlZBTElEX1dJVEhJTl9ET0xPT1AKIAogVGFrZSBhbiBpbnN0cnVjdGlv biBpbiBAdmFye2luc259IGFuZCByZXR1cm4gTlVMTCBpZiBpdCBpcyB2YWxp ZCB3aXRoaW4gYQpJbmRleDogZ2NjL2NncmFwaGJ1aWxkLmMKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gZ2NjL2NncmFwaGJ1aWxkLmMJKHJldmlzaW9u IDE5MjYyMykKKysrIGdjYy9jZ3JhcGhidWlsZC5jCSh3b3JraW5nIGNvcHkp CkBAIC0zNCw2ICszNCw3IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZp bGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAiaXBhLXV0aWxz LmgiCiAjaW5jbHVkZSAiZXhjZXB0LmgiCiAjaW5jbHVkZSAiaXBhLWlubGlu ZS5oIgorI2luY2x1ZGUgInRhcmdldC5oIgogCiAvKiBDb250ZXh0IG9mIHJl Y29yZF9yZWZlcmVuY2UuICAqLwogc3RydWN0IHJlY29yZF9yZWZlcmVuY2Vf Y3R4CkBAIC0zMTcsOCArMzE4LDIzIEBAIGJ1aWxkX2NncmFwaF9lZGdlcyAo dm9pZCkKIAkJCQkJCQkgYmIpOwogCSAgICAgIGRlY2wgPSBnaW1wbGVfY2Fs bF9mbmRlY2wgKHN0bXQpOwogCSAgICAgIGlmIChkZWNsKQotCQljZ3JhcGhf Y3JlYXRlX2VkZ2UgKG5vZGUsIGNncmFwaF9nZXRfY3JlYXRlX25vZGUgKGRl Y2wpLAotCQkJCSAgICBzdG10LCBiYi0+Y291bnQsIGZyZXEpOworCQl7CisJ CSAgc3RydWN0IGNncmFwaF9ub2RlICpjYWxsZWUgPSBjZ3JhcGhfZ2V0X2Ny ZWF0ZV9ub2RlIChkZWNsKTsKKwkgICAgICAgICAgLyogSWYgYSBjYWxsIHRv IGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24gZGlzcGF0Y2hlciBpcworCQkg ICAgIGZvdW5kLCBnZW5lcmF0ZSB0aGUgYm9keSB0byBkaXNwYXRjaCB0aGUg cmlnaHQgZnVuY3Rpb24KKwkJICAgICBhdCBydW4tdGltZS4gICovCisJCSAg aWYgKGNhbGxlZS0+ZGlzcGF0Y2hlcl9mdW5jdGlvbikKKwkJICAgIHsKKwkJ ICAgICAgdHJlZSByZXNvbHZlcl9kZWNsOworCQkgICAgICBnY2NfYXNzZXJ0 IChjYWxsZWUtPmZ1bmN0aW9uX3ZlcnNpb24KKwkJCQkgICYmIGNhbGxlZS0+ ZnVuY3Rpb25fdmVyc2lvbi0+bmV4dCk7CisJCSAgICAgIGdjY19hc3NlcnQg KHRhcmdldG0uZ2VuZXJhdGVfdmVyc2lvbl9kaXNwYXRjaGVyX2JvZHkpOwor CQkgICAgICByZXNvbHZlcl9kZWNsCisJCQkgPSB0YXJnZXRtLmdlbmVyYXRl X3ZlcnNpb25fZGlzcGF0Y2hlcl9ib2R5IChjYWxsZWUpOworCQkgICAgICBn Y2NfYXNzZXJ0IChyZXNvbHZlcl9kZWNsICE9IE5VTExfVFJFRSk7CisJCSAg ICB9CisJCSAgY2dyYXBoX2NyZWF0ZV9lZGdlIChub2RlLCBjYWxsZWUsIHN0 bXQsIGJiLT5jb3VudCwgZnJlcSk7CisJICAgICAgICB9CiAJICAgICAgZWxz ZQogCQljZ3JhcGhfY3JlYXRlX2luZGlyZWN0X2VkZ2UgKG5vZGUsIHN0bXQs CiAJCQkJCSAgICAgZ2ltcGxlX2NhbGxfZmxhZ3MgKHN0bXQpLApJbmRleDog Z2NjL2MtZmFtaWx5L2MtY29tbW9uLmMKPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQotLS0gZ2NjL2MtZmFtaWx5L2MtY29tbW9uLmMJKHJldmlzaW9uIDE5MjYy MykKKysrIGdjYy9jLWZhbWlseS9jLWNvbW1vbi5jCSh3b3JraW5nIGNvcHkp CkBAIC04NzM3LDkgKzg3MzcsMjAgQEAgaGFuZGxlX3RhcmdldF9hdHRyaWJ1 dGUgKHRyZWUgKm5vZGUsIHRyZWUgbmFtZSwgdHIKICAgICAgIHdhcm5pbmcg KE9QVF9XYXR0cmlidXRlcywgIiVxRSBhdHRyaWJ1dGUgaWdub3JlZCIsIG5h bWUpOwogICAgICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CiAgICAgfQotICBl bHNlIGlmICghIHRhcmdldG0udGFyZ2V0X29wdGlvbi52YWxpZF9hdHRyaWJ1 dGVfcCAoKm5vZGUsIG5hbWUsIGFyZ3MsCi0JCQkJCQkgICAgICBmbGFncykp Ci0gICAgKm5vX2FkZF9hdHRycyA9IHRydWU7CisgIGVsc2UKKyAgICB7Cisg ICAgICAvKiBXaGVuIGEgdGFyZ2V0IGF0dHJpYnV0ZSBpcyBpbnZhbGlkLCBp dCBtYXkgYWxzbyBiZSBiZWNhdXNlIHRoZQorCSB0YXJnZXQgZm9yIHRoZSBj b21waWxhdGlvbiB1bml0IGFuZCB0aGUgYXR0cmlidXRlIG1hdGNoLiAgRm9y CisgICAgICAgICBpbnN0YW5jZSwgdGFyZ2V0IGF0dHJpYnV0ZSAieHh4IiBp cyBpbnZhbGlkIHdoZW4gLW14eHggaXMgdXNlZC4KKyAgICAgICAgIFdoZW4g dXNlZCB3aXRoIG11bHRpdmVyc2lvbmluZywgcmVtb3ZpbmcgdGhlIGF0dHJp YnV0ZSB3aWxsIGxlYWQKKyAgICAgICAgIHRvIGR1cGxpY2F0ZSBkZWZpbml0 aW9ucyBpZiBhIGRlZmF1bHQgdmVyc2lvbiBpcyBwcm92aWRlZC4KKyAgICAg ICAgIFNvLCBnZW5lcmF0ZSBhIHdhcm5pbmcgaGVyZSBhbmQgcmVtb3ZlIHRo ZSBhdHRyaWJ1dGUuICAqLworICAgICAgaWYgKCF0YXJnZXRtLnRhcmdldF9v cHRpb24udmFsaWRfYXR0cmlidXRlX3AgKCpub2RlLCBuYW1lLCBhcmdzLCBm bGFncykpCisJeworCSAgd2FybmluZyAoT1BUX1dhdHRyaWJ1dGVzLCAiJXFF IGF0dHJpYnV0ZSBpbnZhbGlkLCBpZ25vcmVkIiwgbmFtZSk7CisJICAqbm9f YWRkX2F0dHJzID0gdHJ1ZTsKKwl9CisgICAgfQogCiAgIHJldHVybiBOVUxM X1RSRUU7CiB9CkluZGV4OiBnY2MvdGFyZ2V0LmRlZgo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBnY2MvdGFyZ2V0LmRlZgkocmV2aXNpb24gMTkyNjIz KQorKysgZ2NjL3RhcmdldC5kZWYJKHdvcmtpbmcgY29weSkKQEAgLTEyOTgs NiArMTI5OCwzNyBAQCBERUZIT09LCiAgdHJlZSwgKHRyZWUgZm5kZWNsLCBp bnQgbl9hcmdzLCB0cmVlICphcmdwLCBib29sIGlnbm9yZSksCiAgaG9va190 cmVlX3RyZWVfaW50X3RyZWVwX2Jvb2xfbnVsbCkKIAorLyogVGFyZ2V0IGhv b2sgaXMgdXNlZCB0byBjb21wYXJlIHRoZSB0YXJnZXQgYXR0cmlidXRlcyBp biB0d28gZnVuY3Rpb25zIHRvCisgICBkZXRlcm1pbmUgd2hpY2ggZnVuY3Rp b24ncyBmZWF0dXJlcyBnZXQgaGlnaGVyIHByaW9yaXR5LiAgVGhpcyBpcyB1 c2VkCisgICBkdXJpbmcgZnVuY3Rpb24gbXVsdGktdmVyc2lvbmluZyB0byBm aWd1cmUgb3V0IHRoZSBvcmRlciBpbiB3aGljaCB0d28KKyAgIHZlcnNpb25z IG11c3QgYmUgZGlzcGF0Y2hlZC4gIEEgZnVuY3Rpb24gdmVyc2lvbiB3aXRo IGEgaGlnaGVyIHByaW9yaXR5CisgICBpcyBjaGVja2VkIGZvciBkaXNwYXRj aGluZyBlYXJsaWVyLiAgREVDTDEgYW5kIERFQ0wyIGFyZQorICAgdGhlIHR3 byBmdW5jdGlvbiBkZWNscyB0aGF0IHdpbGwgYmUgY29tcGFyZWQuIEl0IHJl dHVybnMgcG9zaXRpdmUgdmFsdWUKKyAgIGlmIERFQ0wxIGlzIGhpZ2hlciBw cmlvcml0eSwgIG5lZ2F0aXZlIHZhbHVlIGlmIERFQ0wyIGlzIGhpZ2hlciBw cmlvcml0eQorICAgYW5kIDAgaWYgdGhleSBhcmUgdGhlIHNhbWUuICovCitE RUZIT09LCisoY29tcGFyZV92ZXJzaW9uX3ByaW9yaXR5LAorICIiLAorIGlu dCwgKHRyZWUgZGVjbDEsIHRyZWUgZGVjbDIpLCBOVUxMKQorCisvKiAgVGFy Z2V0IGhvb2sgaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZGlzcGF0Y2hlciBs b2dpYyB0byBpbnZva2UgdGhlIHJpZ2h0CisgICAgZnVuY3Rpb24gdmVyc2lv biBhdCBydW4tdGltZSBmb3IgYSBnaXZlbiBzZXQgb2YgZnVuY3Rpb24gdmVy c2lvbnMuCisgICAgQVJHIHBvaW50cyB0byB0aGUgY2FsbGdyYXBoIG5vZGUg b2YgdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24gd2hvc2UgYm9keQorICAgIG11 c3QgYmUgZ2VuZXJhdGVkLiAgKi8KK0RFRkhPT0sKKyhnZW5lcmF0ZV92ZXJz aW9uX2Rpc3BhdGNoZXJfYm9keSwKKyAiIiwKKyB0cmVlLCAodm9pZCAqYXJn KSwgTlVMTCkgCisKKy8qIFRhcmdldCBob29rIGlzIHVzZWQgdG8gZ2V0IHRo ZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGZvciBhIHNldCBvZiBmdW5jdGlvbgor ICAgdmVyc2lvbnMuICBUaGUgZGlzcGF0Y2hlciBmdW5jdGlvbiBpcyBjYWxs ZWQgdG8gaW52b2tlIHRoZSByaWdodCBmdW5jdGlvbgorICAgdmVyc2lvbiBh dCBydW4tdGltZS4gIEFSR0xJU1QgaXMgdGhlIHZlY3RvciBvZiBmdW5jdGlv biB2ZXJzaW9ucyB0aGF0CisgICBzaG91bGQgYmUgY29uc2lkZXJlZCBmb3Ig ZGlzcGF0Y2guICAqLworREVGSE9PSworKGdldF9mdW5jdGlvbl92ZXJzaW9u c19kaXNwYXRjaGVyLAorICIiLAorIHRyZWUsICh2b2lkICphcmdsaXN0KSwg TlVMTCkKKwogLyogUmV0dXJucyBhIGNvZGUgZm9yIGEgdGFyZ2V0LXNwZWNp ZmljIGJ1aWx0aW4gdGhhdCBpbXBsZW1lbnRzCiAgICByZWNpcHJvY2FsIG9m IHRoZSBmdW5jdGlvbiwgb3IgTlVMTF9UUkVFIGlmIG5vdCBhdmFpbGFibGUu ICAqLwogREVGSE9PSwpAQCAtMjcyNSw2ICsyNzU2LDE2IEBAIERFRkhPT0sK ICB2b2lkLCAodm9pZCksCiAgaG9va192b2lkX3ZvaWQpCiAKKy8qIFRoaXMg ZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIERFQ0wxIGFuZCBERUNMMiBhcmUg dmVyc2lvbnMgb2YgdGhlIHNhbWUKKyAgIGZ1bmN0aW9uLiAgREVDTDEgYW5k IERFQ0wyIGFyZSBmdW5jdGlvbiB2ZXJzaW9ucyBpZiBhbmQgb25seSBpZiB0 aGV5CisgICBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQg ZGlmZmVyZW50IHRhcmdldCBzcGVjaWZpYyBhdHRyaWJ1dGVzLAorICAgdGhh dCBpcywgdGhleSBhcmUgY29tcGlsZWQgZm9yIGRpZmZlcmVudCB0YXJnZXQg bWFjaGluZXMuICAqLworREVGSE9PSworKGZ1bmN0aW9uX3ZlcnNpb25zLAor ICIiLAorIGJvb2wsICh0cmVlIGRlY2wxLCB0cmVlIGRlY2wyKSwKKyBob29r X2Jvb2xfdHJlZV90cmVlX2ZhbHNlKQorCiAvKiBGdW5jdGlvbiB0byBkZXRl cm1pbmUgaWYgb25lIGZ1bmN0aW9uIGNhbiBpbmxpbmUgYW5vdGhlciBmdW5j dGlvbi4gICovCiAjdW5kZWYgSE9PS19QUkVGSVgKICNkZWZpbmUgSE9PS19Q UkVGSVggIlRBUkdFVF8iCkluZGV4OiBnY2MvY2dyYXBoLmMKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gZ2NjL2NncmFwaC5jCShyZXZpc2lvbiAxOTI2 MjMpCisrKyBnY2MvY2dyYXBoLmMJKHdvcmtpbmcgY29weSkKQEAgLTEyNzcs NiArMTI3NywxNiBAQCBjZ3JhcGhfbWFya19hZGRyZXNzX3Rha2VuX25vZGUg KHN0cnVjdCBjZ3JhcGhfbm9kZQogICBub2RlLT5zeW1ib2wuYWRkcmVzc190 YWtlbiA9IDE7CiAgIG5vZGUgPSBjZ3JhcGhfZnVuY3Rpb25fb3JfdGh1bmtf bm9kZSAobm9kZSwgTlVMTCk7CiAgIG5vZGUtPnN5bWJvbC5hZGRyZXNzX3Rh a2VuID0gMTsKKyAgLyogSWYgdGhlIGFkZHJlc3Mgb2YgYSBtdWx0aXZlcnNp b25lZCBmdW5jdGlvbiBkaXNwYXRjaGVyIGlzIHRha2VuLAorICAgICBnZW5l cmF0ZSB0aGUgYm9keSB0byBkaXNwYXRjaCB0aGUgcmlnaHQgZnVuY3Rpb24g YXQgcnVuLXRpbWUuICBUaGlzCisgICAgIGlzIG5lZWRlZCBhcyB0aGUgYWRk cmVzcyBjYW4gYmUgdXNlZCB0byBkbyBhbiBpbmRpcmVjdCBjYWxsLiAgKi8K KyAgaWYgKG5vZGUtPmRpc3BhdGNoZXJfZnVuY3Rpb24pCisgICAgeworICAg ICAgZ2NjX2Fzc2VydCAobm9kZS0+ZnVuY3Rpb25fdmVyc2lvbgorCQkgICYm IG5vZGUtPmZ1bmN0aW9uX3ZlcnNpb24tPm5leHQpOworICAgICAgZ2NjX2Fz c2VydCAodGFyZ2V0bS5nZW5lcmF0ZV92ZXJzaW9uX2Rpc3BhdGNoZXJfYm9k eSk7CisgICAgICB0YXJnZXRtLmdlbmVyYXRlX3ZlcnNpb25fZGlzcGF0Y2hl cl9ib2R5IChub2RlKTsKKyAgICB9CiB9CiAKIC8qIFJldHVybiBsb2NhbCBp bmZvIGZvciB0aGUgY29tcGlsZWQgZnVuY3Rpb24uICAqLwpJbmRleDogZ2Nj L2NncmFwaC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jZ3Jh cGguaAkocmV2aXNpb24gMTkyNjIzKQorKysgZ2NjL2NncmFwaC5oCSh3b3Jr aW5nIGNvcHkpCkBAIC0yMDAsNyArMjAwLDI2IEBAIHN0cnVjdCBHVFkoKCkp IGNncmFwaF9jbG9uZV9pbmZvCiAgIGJpdG1hcCBjb21iaW5lZF9hcmdzX3Rv X3NraXA7CiB9OwogCisvKiBGdW5jdGlvbiBNdWx0aXZlcnNpb25pbmcgaW5m by4gICovCitzdHJ1Y3QgR1RZKCgpKSBjZ3JhcGhfZnVuY3Rpb25fdmVyc2lv bl9pbmZvCit7CisgIC8qIENoYWlucyBhbGwgdGhlIHNlbWFudGljYWxseSBp ZGVudGljYWwgZnVuY3Rpb24gdmVyc2lvbnMuICBUaGUKKyAgICAgZmlyc3Qg ZnVuY3Rpb24gaW4gdGhpcyBjaGFpbiBpcyB0aGUgZGVmYXVsdCBmdW5jdGlv bi4gICovCisgIHN0cnVjdCBjZ3JhcGhfbm9kZSAqcHJldjsKKyAgLyogSWYg dGhpcyBub2RlIGlzIGEgZGlzcGF0Y2hlciBmb3IgZnVuY3Rpb24gdmVyc2lv bnMsIHRoaXMgcG9pbnRzCisgICAgIHRvIHRoZSBkZWZhdWx0IGZ1bmN0aW9u IHZlcnNpb24sIHRoZSBmaXJzdCBmdW5jdGlvbiBpbiB0aGUgY2hhaW4uICAq LworICBzdHJ1Y3QgY2dyYXBoX25vZGUgKm5leHQ7CisgIC8qIElmIHRoaXMg bm9kZSBjb3JyZXNwb25kcyB0byBhIGZ1bmN0aW9uIHZlcnNpb24sIHRoaXMg cG9pbnRzCisgICAgIHRvIHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGRlY2ws IHdoaWNoIGlzIHRoZSBmdW5jdGlvbiB0aGF0IG11c3QKKyAgICAgYmUgY2Fs bGVkIHRvIGV4ZWN1dGUgdGhlIHJpZ2h0IGZ1bmN0aW9uIHZlcnNpb24gYXQg cnVuLXRpbWUuCiAKKyAgICAgSWYgdGhpcyBjZ3JhcGggbm9kZSBpcyBhIGRp c3BhdGNoZXIgKGlmIGRpc3BhdGNoZXJfZnVuY3Rpb24gaXMgdHJ1ZSwgaW4K KyAgICAgdGhlIGNncmFwaCBzdHJ1Y3QpIGZvciBmdW5jdGlvbiB2ZXJzaW9u cywgdGhpcyBwb2ludHMgdG8gcmVzb2x2ZXIKKyAgICAgZnVuY3Rpb24sIHdo aWNoIGhvbGRzIHRoZSBmdW5jdGlvbiBib2R5IG9mIHRoZSBkaXNwYXRjaGVy LgorICAgICBUaGUgZGlzcGF0Y2hlciBkZWNsIGlzIGFuIGFsaWFzIHRvIHRo ZSByZXNvbHZlciBmdW5jdGlvbiBkZWNsLiAgKi8KKyAgdHJlZSBkaXNwYXRj aGVyX3Jlc29sdmVyOworfTsKKwogLyogVGhlIGNncmFwaCBkYXRhIHN0cnVj dHVyZS4KICAgIEVhY2ggZnVuY3Rpb24gZGVjbCBoYXMgYXNzaWduZWQgY2dy YXBoX25vZGUgbGlzdGluZyBjYWxsZWVzIGFuZCBjYWxsZXJzLiAgKi8KIApA QCAtMjI4LDYgKzI0NywxMCBAQCBzdHJ1Y3QgR1RZKCgpKSBjZ3JhcGhfbm9k ZSB7CiAgIHN0cnVjdCBjZ3JhcGhfbm9kZSAqcHJldl9zaWJsaW5nX2Nsb25l OwogICBzdHJ1Y3QgY2dyYXBoX25vZGUgKmNsb25lczsKICAgc3RydWN0IGNn cmFwaF9ub2RlICpjbG9uZV9vZjsKKworICAvKiBGdW5jdGlvbiBNdWx0aXZl cnNpb25pbmcgSW5mby4gICovCisgIHN0cnVjdCBjZ3JhcGhfZnVuY3Rpb25f dmVyc2lvbl9pbmZvICpmdW5jdGlvbl92ZXJzaW9uOworICAKICAgLyogRm9y IGZ1bmN0aW9ucyB3aXRoIG1hbnkgY2FsbHMgc2l0ZXMgaXQgaG9sZHMgbWFw IGZyb20gY2FsbCBleHByZXNzaW9uCiAgICAgIHRvIHRoZSBlZGdlIHRvIHNw ZWVkIHVwIGNncmFwaF9lZGdlIGZ1bmN0aW9uLiAgKi8KICAgaHRhYl90IEdU WSgocGFyYW1faXMgKHN0cnVjdCBjZ3JhcGhfZWRnZSkpKSBjYWxsX3NpdGVf aGFzaDsKQEAgLTI3OSw2ICszMDIsOCBAQCBzdHJ1Y3QgR1RZKCgpKSBjZ3Jh cGhfbm9kZSB7CiAgIC8qID8/IFdlIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92 ZSB0aGlzLiAgV2UgaGF2ZSBlbm91Z2ggYml0cyBpbgogICAgICBjZ3JhcGgg dG8gY2FsY3VsYXRlIGl0LiAgKi8KICAgdW5zaWduZWQgdG1fY2xvbmUgOiAx OworICAvKiBUcnVlIGlmIHRoaXMgZGVjbCBpcyBhIGRpc3BhdGNoZXIgZm9y IGZ1bmN0aW9uIHZlcnNpb25zLiAgKi8KKyAgdW5zaWduZWQgZGlzcGF0Y2hl cl9mdW5jdGlvbiA6IDE7CiB9OwogCiBERUZfVkVDX1Aoc3ltdGFiX25vZGUp OwpAQCAtNjU2LDYgKzY4MSw3IEBAIHZvaWQgY2dyYXBoX3JlYnVpbGRfcmVm ZXJlbmNlcyAodm9pZCk7CiBpbnQgY29tcHV0ZV9jYWxsX3N0bXRfYmJfZnJl cXVlbmN5ICh0cmVlLCBiYXNpY19ibG9jayBiYik7CiB2b2lkIHJlY29yZF9y ZWZlcmVuY2VzX2luX2luaXRpYWxpemVyICh0cmVlLCBib29sKTsKIAorCiAv KiBJbiBpcGEuYyAgKi8KIGJvb2wgc3ltdGFiX3JlbW92ZV91bnJlYWNoYWJs ZV9ub2RlcyAoYm9vbCwgRklMRSAqKTsKIGNncmFwaF9ub2RlX3NldCBjZ3Jh cGhfbm9kZV9zZXRfbmV3ICh2b2lkKTsKSW5kZXg6IGdjYy90cmVlLmgKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3RyZWUuaAkocmV2aXNpb24g MTkyNjIzKQorKysgZ2NjL3RyZWUuaAkod29ya2luZyBjb3B5KQpAQCAtMzQ3 Niw2ICszNDc2LDEyIEBAIGV4dGVybiBWRUModHJlZSwgZ2MpICoqZGVjbF9k ZWJ1Z19hcmdzX2luc2VydCAodHJlCiAjZGVmaW5lIERFQ0xfRlVOQ1RJT05f U1BFQ0lGSUNfT1BUSU1JWkFUSU9OKE5PREUpIFwKICAgIChGVU5DVElPTl9E RUNMX0NIRUNLIChOT0RFKS0+ZnVuY3Rpb25fZGVjbC5mdW5jdGlvbl9zcGVj aWZpY19vcHRpbWl6YXRpb24pCiAKKy8qIEluIEZVTkNUSU9OX0RFQ0wsIHRo aXMgaXMgc2V0IGlmIHRoaXMgZnVuY3Rpb24gaGFzIG90aGVyIHZlcnNpb25z IGdlbmVyYXRlZAorICAgdXNpbmcgInRhcmdldCIgYXR0cmlidXRlcy4gIFRo ZSBkZWZhdWx0IHZlcnNpb24gaXMgdGhlIG9uZSB3aGljaCBkb2VzIG5vdAor ICAgaGF2ZSBhbnkgInRhcmdldCIgYXR0cmlidXRlIHNldC4gKi8KKyNkZWZp bmUgREVDTF9GVU5DVElPTl9WRVJTSU9ORUQoTk9ERSlcCisgICAoRlVOQ1RJ T05fREVDTF9DSEVDSyAoTk9ERSktPmZ1bmN0aW9uX2RlY2wudmVyc2lvbmVk X2Z1bmN0aW9uKQorCiAvKiBGVU5DVElPTl9ERUNMIGluaGVyaXRzIGZyb20g REVDTF9OT05fQ09NTU9OIGJlY2F1c2Ugb2YgdGhlIHVzZSBvZiB0aGUKICAg IGFyZ3VtZW50cy9yZXN1bHQvc2F2ZWRfdHJlZSBmaWVsZHMgYnkgZnJvbnQg ZW5kcy4gICBJdCB3YXMgZWl0aGVyIGluaGVyaXQKICAgIEZVTkNUSU9OX0RF Q0wgZnJvbSBub25fY29tbW9uLCBvciBpbmhlcml0IG5vbl9jb21tb24gZnJv bSBGVU5DVElPTl9ERUNMLApAQCAtMzUyMCw4ICszNTI2LDggQEAgc3RydWN0 IEdUWSgoKSkgdHJlZV9mdW5jdGlvbl9kZWNsIHsKICAgdW5zaWduZWQgbG9v cGluZ19jb25zdF9vcl9wdXJlX2ZsYWcgOiAxOwogICB1bnNpZ25lZCBoYXNf ZGVidWdfYXJnc19mbGFnIDogMTsKICAgdW5zaWduZWQgdG1fY2xvbmVfZmxh ZyA6IDE7Ci0KLSAgLyogMSBiaXQgbGVmdCAqLworICB1bnNpZ25lZCB2ZXJz aW9uZWRfZnVuY3Rpb24gOiAxOworICAvKiBObyBiaXRzIGxlZnQuICAqLwog fTsKIAogLyogVGhlIHNvdXJjZSBsYW5ndWFnZSBvZiB0aGUgdHJhbnNsYXRp b24tdW5pdC4gICovCkluZGV4OiBnY2MvdGVzdHN1aXRlL2crKy5kZy9tdjIu Qwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvdGVzdHN1aXRlL2cr Ky5kZy9tdjIuQwkocmV2aXNpb24gMCkKKysrIGdjYy90ZXN0c3VpdGUvZysr LmRnL212Mi5DCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDExOSBAQAorLyog VGVzdCBjYXNlIHRvIGNoZWNrIGlmIE11bHRpdmVyc2lvbmluZyBjaG9vc2Vz IHRoZSBjb3JyZWN0CisgICBkaXNwYXRjaGluZyBvcmRlciB3aGVuIHZlcnNp b25zIGFyZSBmb3IgdmFyaW91cyBJU0FzLiAgKi8KKy8qIHsgZGctZG8gcnVu IHsgdGFyZ2V0IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9ICovCisvKiB7IGRn LXJlcXVpcmUtaWZ1bmMgIiIgfSAgKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8y IC1tbm8tc3NlIC1tbm8tbW14IC1tbm8tcG9wY250IC1tbm8tYXZ4IiB9ICov CisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogRGVmYXVsdCB2ZXJzaW9u LiAgKi8KK2ludCBmb28gKCk7CisvKiBUaGUgZGlzcGF0Y2ggY2hlY2tzIHNo b3VsZCBiZSBpbiB0aGUgZXhhY3QgcmV2ZXJzZSBvcmRlciBvZiB0aGUKKyAg IGRlY2xhcmF0aW9ucyBiZWxvdy4gICovCitpbnQgZm9vICgpIF9fYXR0cmli dXRlX18gKCh0YXJnZXQgKCJtbXgiKSkpOworaW50IGZvbyAoKSBfX2F0dHJp YnV0ZV9fICgodGFyZ2V0ICgic3NlIikpKTsKK2ludCBmb28gKCkgX19hdHRy aWJ1dGVfXyAoKHRhcmdldCAoInNzZTIiKSkpOworaW50IGZvbyAoKSBfX2F0 dHJpYnV0ZV9fICgodGFyZ2V0ICgic3NlMyIpKSk7CitpbnQgZm9vICgpIF9f YXR0cmlidXRlX18gKCh0YXJnZXQgKCJzc3NlMyIpKSk7CitpbnQgZm9vICgp IF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJzc2U0LjEiKSkpOworaW50IGZv byAoKSBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgic3NlNC4yIikpKTsKK2lu dCBmb28gKCkgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoInBvcGNudCIpKSk7 CitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJhdngiKSkp OworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgiYXZ4MiIp KSk7CisKK2ludCBtYWluICgpCit7CisKKyAgaW50IHZhbCA9IGZvbyAoKTsK KworICBpZiAoX19idWlsdGluX2NwdV9zdXBwb3J0cyAoImF2eDIiKSkKKyAg ICBhc3NlcnQgKHZhbCA9PSAxKTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2Nw dV9zdXBwb3J0cyAoImF2eCIpKQorICAgIGFzc2VydCAodmFsID09IDIpOwor ICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgicG9wY250Iikp CisgICAgYXNzZXJ0ICh2YWwgPT0gMyk7CisgIGVsc2UgaWYgKF9fYnVpbHRp bl9jcHVfc3VwcG9ydHMgKCJzc2U0LjIiKSkKKyAgICBhc3NlcnQgKHZhbCA9 PSA0KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9zdXBwb3J0cyAoInNz ZTQuMSIpKQorICAgIGFzc2VydCAodmFsID09IDUpOworICBlbHNlIGlmIChf X2J1aWx0aW5fY3B1X3N1cHBvcnRzICgic3NzZTMiKSkKKyAgICBhc3NlcnQg KHZhbCA9PSA2KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9zdXBwb3J0 cyAoInNzZTMiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSA3KTsKKyAgZWxzZSBp ZiAoX19idWlsdGluX2NwdV9zdXBwb3J0cyAoInNzZTIiKSkKKyAgICBhc3Nl cnQgKHZhbCA9PSA4KTsKKyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9zdXBw b3J0cyAoInNzZSIpKQorICAgIGFzc2VydCAodmFsID09IDkpOworICBlbHNl IGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgibW14IikpCisgICAgYXNz ZXJ0ICh2YWwgPT0gMTApOworICBlbHNlCisgICAgYXNzZXJ0ICh2YWwgPT0g MCk7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludAorZm9vICgpCit7CisgIHJl dHVybiAwOworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgibW14 IikpKQorZm9vICgpCit7CisgIHJldHVybiAxMDsKK30KKworaW50IF9fYXR0 cmlidXRlX18gKCh0YXJnZXQoInNzZSIpKSkKK2ZvbyAoKQoreworICByZXR1 cm4gOTsKK30KKworaW50IF9fYXR0cmlidXRlX18gKCh0YXJnZXQoInNzZTIi KSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDg7Cit9CisKK2ludCBfX2F0dHJp YnV0ZV9fICgodGFyZ2V0KCJzc2UzIikpKQorZm9vICgpCit7CisgIHJldHVy biA3OworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgic3NzZTMi KSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDY7Cit9CisKK2ludCBfX2F0dHJp YnV0ZV9fICgodGFyZ2V0KCJzc2U0LjEiKSkpCitmb28gKCkKK3sKKyAgcmV0 dXJuIDU7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJzc2U0 LjIiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDQ7Cit9CisKK2ludCBfX2F0 dHJpYnV0ZV9fICgodGFyZ2V0KCJwb3BjbnQiKSkpCitmb28gKCkKK3sKKyAg cmV0dXJuIDM7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJh dngiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDI7Cit9CisKK2ludCBfX2F0 dHJpYnV0ZV9fICgodGFyZ2V0KCJhdngyIikpKQorZm9vICgpCit7CisgIHJl dHVybiAxOworfQpJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nKysuZGcvbXY0LkMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9nKysu ZGcvbXY0LkMJKHJldmlzaW9uIDApCisrKyBnY2MvdGVzdHN1aXRlL2crKy5k Zy9tdjQuQwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyMyBAQAorLyogVGVz dCBjYXNlIHRvIGNoZWNrIGlmIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgYW4g ZXJyb3IgbWVzc2FnZQorICAgd2hlbiB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9m IGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24gaXMgYWJzZW50CisgICBhbmQg aXRzIHBvaW50ZXIgaXMgdGFrZW4uICAqLworCisvKiB7IGRnLWRvIGNvbXBp bGUgeyB0YXJnZXQgaT84Ni0qLSogeDg2XzY0LSotKiB9IH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1tbm8tc3NlIC1tbm8tcG9wY250IiB9ICovCisK K2ludCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0ICgic3NlIikpKQorZm9vICgp Cit7CisgIHJldHVybiAxOworfQoraW50IF9fYXR0cmlidXRlX18gKCh0YXJn ZXQgKCJwb3BjbnQiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDA7Cit9CisK K2ludCBtYWluICgpCit7CisgIGludCAoKnApKCkgPSAmZm9vOyAvKiB7IGRn LWVycm9yICJQb2ludGVyIHRvIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24g d2l0aG91dCBhIGRlZmF1bHQgaXMgbm90IGFsbG93ZWQiIHt9IH0gKi8KKyAg cmV0dXJuICgqcCkoKTsKK30KSW5kZXg6IGdjYy90ZXN0c3VpdGUvZysrLmRn L212MS5DCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy90ZXN0c3Vp dGUvZysrLmRnL212MS5DCShyZXZpc2lvbiAwKQorKysgZ2NjL3Rlc3RzdWl0 ZS9nKysuZGcvbXYxLkMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTMwIEBA CisvKiBUZXN0IGNhc2UgdG8gY2hlY2sgaWYgTXVsdGl2ZXJzaW9uaW5nIHdv cmtzLiAgKi8KKy8qIHsgZGctZG8gcnVuIHsgdGFyZ2V0IGk/ODYtKi0qIHg4 Nl82NC0qLSogfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtaWZ1bmMgIiIgfSAg Ki8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1mUElDIC1tbm8tYXZ4IC1tbm8t cG9wY250IiB9ICovCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogRGVm YXVsdCB2ZXJzaW9uLiAgKi8KK2ludCBmb28gKCk7CisvKiBUaGUgb3RoZXIg dmVyc2lvbnMgb2YgZm9vLiAgTWl4IHVwIHRoZSBvcmRlcmluZyBhbmQgCisg ICBjaGVjayBpZiB0aGUgZGlzcGF0Y2hpbmcgZG9lcyBpdCBpbiB0aGUgb3Jk ZXIgb2YgcHJpb3JpdHkuICovCisvKiBDaGVjayBjb21iaW5hdGlvbiBvZiB0 YXJnZXQgYXR0cmlidXRlcy4gICovCitpbnQgZm9vICgpIF9fYXR0cmlidXRl X18gKCh0YXJnZXQoImFyY2g9Y29yZWk3LHBvcGNudCIpKSk7CisvKiBUaGUg dGFyZ2V0IG9wZXJhbmRzIGluIHRoaXMgZGVjbGFyYXRpb24gYW5kIHRoZSBk ZWZpbml0aW9uIGFyZSByZS1vcmRlcmVkLgorICAgVGhpcyBzaG91bGQgc3Rp bGwgd29yay4gICovCitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18gKCh0YXJn ZXQoInNzc2UzLGF2eDIiKSkpOworCisvKiBDaGVjayBmb3IgYWxsIHRhcmdl dCBhdHRyaWJ1dGVzIGZvciB3aGljaCBkaXNwYXRjaGVycyBhcmUgYXZhaWxh YmxlLiAgKi8KKy8qIENoZWNrIGFyY2g9ICovCitpbnQgZm9vICgpIF9fYXR0 cmlidXRlX18oKHRhcmdldCgiYXJjaD1jb3JlMiIpKSk7CitpbnQgZm9vICgp IF9fYXR0cmlidXRlX18oKHRhcmdldCgiYXJjaD1jb3JlaTciKSkpOworaW50 IGZvbyAoKSBfX2F0dHJpYnV0ZV9fKCh0YXJnZXQoImFyY2g9YXRvbSIpKSk7 CisvKiBDaGVjayBJU0FzICAqLworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9f KCh0YXJnZXQoImF2eCIpKSk7CitpbnQgZm9vICgpIF9fYXR0cmlidXRlX18g KCh0YXJnZXQoImFyY2g9Y29yZTIsc3NlNC4yIikpKTsKKy8qIENoZWNrIG1v cmUgYXJjaD0uICAqLworaW50IGZvbyAoKSBfX2F0dHJpYnV0ZV9fKCh0YXJn ZXQoImFyY2g9YW1kZmFtMTAiKSkpOworaW50IGZvbyAoKSBfX2F0dHJpYnV0 ZV9fKCh0YXJnZXQoImFyY2g9YmR2ZXIxIikpKTsKK2ludCBmb28gKCkgX19h dHRyaWJ1dGVfXygodGFyZ2V0KCJhcmNoPWJkdmVyMiIpKSk7CisKK2ludCAo KnApKCkgPSAmZm9vOworaW50IG1haW4gKCkKK3sKKyAgaW50IHZhbCA9IGZv byAoKTsKKyAgYXNzZXJ0ICh2YWwgPT0gICgqcCkoKSk7CisKKyAgLyogQ2hl Y2sgaW4gdGhlIGV4YWN0IHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc3Bh dGNoaW5nCisgICAgIGlzIGV4cGVjdGVkIHRvIGhhcHBlbi4gICovCisgIGlm IChfX2J1aWx0aW5fY3B1X2lzICgiYmR2ZXIxIikpCisgICAgYXNzZXJ0ICh2 YWwgPT0gMSk7CisgIGVsc2UgaWYgKF9fYnVpbHRpbl9jcHVfaXMgKCJiZHZl cjIiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSAyKTsKKyAgZWxzZSBpZiAoX19i dWlsdGluX2NwdV9zdXBwb3J0cyAoImF2eDIiKQorCSAgICYmIF9fYnVpbHRp bl9jcHVfc3VwcG9ydHMgKCJzc3NlMyIpKQorICAgIGFzc2VydCAodmFsID09 IDMpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X3N1cHBvcnRzICgiYXZ4 IikpCisgICAgYXNzZXJ0ICh2YWwgPT0gNCk7CisgIGVsc2UgaWYgKF9fYnVp bHRpbl9jcHVfaXMgKCJjb3JlaTciKQorCSAgICYmIF9fYnVpbHRpbl9jcHVf c3VwcG9ydHMgKCJwb3BjbnQiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSA1KTsK KyAgZWxzZSBpZiAoX19idWlsdGluX2NwdV9pcyAoImNvcmVpNyIpKQorICAg IGFzc2VydCAodmFsID09IDYpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1 X2lzICgiYW1kZmFtMTBoIikpCisgICAgYXNzZXJ0ICh2YWwgPT0gNyk7Cisg IGVsc2UgaWYgKF9fYnVpbHRpbl9jcHVfaXMgKCJjb3JlMiIpCisJICAgJiYg X19idWlsdGluX2NwdV9zdXBwb3J0cyAoInNzZTQuMiIpKQorICAgIGFzc2Vy dCAodmFsID09IDgpOworICBlbHNlIGlmIChfX2J1aWx0aW5fY3B1X2lzICgi Y29yZTIiKSkKKyAgICBhc3NlcnQgKHZhbCA9PSA5KTsKKyAgZWxzZSBpZiAo X19idWlsdGluX2NwdV9pcyAoImF0b20iKSkKKyAgICBhc3NlcnQgKHZhbCA9 PSAxMCk7CisgIGVsc2UKKyAgICBhc3NlcnQgKHZhbCA9PSAwKTsKKyAgCisg IHJldHVybiAwOworfQorCitpbnQgZm9vICgpCit7CisgIHJldHVybiAwOwor fQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgiYXJjaD1jb3JlaTcs cG9wY250IikpKQorZm9vICgpCit7CisgIHJldHVybiA1OworfQoraW50IF9f YXR0cmlidXRlX18gKCh0YXJnZXQoImF2eDIsc3NzZTMiKSkpCitmb28gKCkK K3sKKyAgcmV0dXJuIDM7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9fICgodGFy Z2V0KCJhcmNoPWNvcmUyIikpKQorZm9vICgpCit7CisgIHJldHVybiA5Owor fQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgiYXJjaD1jb3JlaTci KSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDY7Cit9CisKK2ludCBfX2F0dHJp YnV0ZV9fICgodGFyZ2V0KCJhcmNoPWF0b20iKSkpCitmb28gKCkKK3sKKyAg cmV0dXJuIDEwOworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgi YXZ4IikpKQorZm9vICgpCit7CisgIHJldHVybiA0OworfQorCitpbnQgX19h dHRyaWJ1dGVfXyAoKHRhcmdldCgiYXJjaD1jb3JlMixzc2U0LjIiKSkpCitm b28gKCkKK3sKKyAgcmV0dXJuIDg7Cit9CisKK2ludCBfX2F0dHJpYnV0ZV9f ICgodGFyZ2V0KCJhcmNoPWFtZGZhbTEwIikpKQorZm9vICgpCit7CisgIHJl dHVybiA3OworfQorCitpbnQgX19hdHRyaWJ1dGVfXyAoKHRhcmdldCgiYXJj aD1iZHZlcjEiKSkpCitmb28gKCkKK3sKKyAgcmV0dXJuIDE7Cit9CisKK2lu dCBfX2F0dHJpYnV0ZV9fICgodGFyZ2V0KCJhcmNoPWJkdmVyMiIpKSkKK2Zv byAoKQoreworICByZXR1cm4gMjsKK30KSW5kZXg6IGdjYy90ZXN0c3VpdGUv ZysrLmRnL212My5DCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy90 ZXN0c3VpdGUvZysrLmRnL212My5DCShyZXZpc2lvbiAwKQorKysgZ2NjL3Rl c3RzdWl0ZS9nKysuZGcvbXYzLkMJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs MzcgQEAKKy8qIFRlc3QgY2FzZSB0byBjaGVjayBpZiBhIGNhbGwgdG8gYSBt dWx0aXZlcnNpb25lZCBmdW5jdGlvbgorICAgaXMgcmVwbGFjZWQgd2l0aCBh IGRpcmVjdCBjYWxsIHRvIHRoZSBwYXJ0aWN1bGFyIHZlcnNpb24gd2hlbgor ICAgdGhlIG1vc3Qgc3BlY2lhbGl6ZWQgdmVyc2lvbidzIHRhcmdldCBhdHRy aWJ1dGVzIG1hdGNoIHRoZQorICAgY2FsbGVyLiAgCisgIAorICAgSW4gdGhp cyBwcm9ncmFtLCBmb28gaXMgbXVsdGl2ZXJzaW9uZWQgYnV0IHRoZXJlIGlz IG5vIGRlZmF1bHQKKyAgIGZ1bmN0aW9uLiAgVGhpcyBpcyBhbiBlcnJvciBp ZiB0aGUgY2FsbCBoYXMgdG8gZ28gdGhyb3VnaCBhCisgICBkaXNwYXRjaGVy LiAgSG93ZXZlciwgdGhlIGNhbGwgdG8gZm9vIGluIGJhciBjYW4gYmUgcmVw bGFjZWQKKyAgIHdpdGggYSBkaXJlY3QgY2FsbCB0byB0aGUgcG9wY250IHZl cnNpb24gb2YgZm9vLiAgSGVuY2UsIHRoaXMKKyAgIHRlc3Qgc2hvdWxkIHBh c3MuICAqLworCisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBpPzg2LSotKiB4 ODZfNjQtKi0qIH0gfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1uby1z c2UgLW1uby1wb3BjbnQiIH0gKi8KKworCisvKiBEZWZhdWx0IHZlcnNpb24u ICAqLworaW50IF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJzc2UiKSkpCitm b28gKCkKK3sKKyAgcmV0dXJuIDE7Cit9CitpbnQgX19hdHRyaWJ1dGVfXyAo KHRhcmdldCAoInBvcGNudCIpKSkKK2ZvbyAoKQoreworICByZXR1cm4gMDsK K30KKworaW50IF9fYXR0cmlidXRlX18gKCh0YXJnZXQgKCJwb3BjbnQiKSkp CitiYXIgKCkKK3sKKyAgcmV0dXJuIGZvbyAoKTsKK30KKworaW50IG1haW4g KCkKK3sKKyAgcmV0dXJuIGJhciAoKTsKK30KSW5kZXg6IGdjYy9jcC9jbGFz cy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jcC9jbGFzcy5j CShyZXZpc2lvbiAxOTI2MjMpCisrKyBnY2MvY3AvY2xhc3MuYwkod29ya2lu ZyBjb3B5KQpAQCAtMTA4Nyw2ICsxMDg3LDMxIEBAIGFkZF9tZXRob2QgKHRy ZWUgdHlwZSwgdHJlZSBtZXRob2QsIHRyZWUgdXNpbmdfZGVjCiAJICAgICAg fHwgc2FtZV90eXBlX3AgKFRSRUVfVFlQRSAoZm5fdHlwZSksCiAJCQkgICAg ICBUUkVFX1RZUEUgKG1ldGhvZF90eXBlKSkpKQogCXsKKwkgIC8qIEZvciBm dW5jdGlvbiB2ZXJzaW9ucywgdGhlaXIgcGFybXMgYW5kIHR5cGVzIG1hdGNo CisJICAgICBidXQgdGhleSBhcmUgbm90IGR1cGxpY2F0ZXMuICBSZWNvcmQg ZnVuY3Rpb24gdmVyc2lvbnMKKwkgICAgIGFzIGFuZCB3aGVuIHRoZXkgYXJl IGZvdW5kLiAgKi8KKwkgIGlmIChUUkVFX0NPREUgKGZuKSA9PSBGVU5DVElP Tl9ERUNMCisJICAgICAgJiYgVFJFRV9DT0RFIChtZXRob2QpID09IEZVTkNU SU9OX0RFQ0wKKwkgICAgICAmJiAoREVDTF9GVU5DVElPTl9TUEVDSUZJQ19U QVJHRVQgKGZuKQorCQkgIHx8IERFQ0xfRlVOQ1RJT05fU1BFQ0lGSUNfVEFS R0VUIChtZXRob2QpKQorCSAgICAgICYmIHRhcmdldG0udGFyZ2V0X29wdGlv bi5mdW5jdGlvbl92ZXJzaW9ucyAoZm4sIG1ldGhvZCkpCisgCSAgICB7CisJ ICAgICAgLyogTWFyayBmdW5jdGlvbnMgYXMgdmVyc2lvbnMgaWYgbmVjZXNz YXJ5LiAgTW9kaWZ5IHRoZSBtYW5nbGVkCisJCSBkZWNsIG5hbWUgaWYgbmVj ZXNzYXJ5LiAgKi8KKwkgICAgICBpZiAoIURFQ0xfRlVOQ1RJT05fVkVSU0lP TkVEIChmbikpCisJCXsKKwkJICBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAo Zm4pID0gMTsKKwkJICBpZiAoREVDTF9BU1NFTUJMRVJfTkFNRV9TRVRfUCAo Zm4pKQorCQkgICAgbWFuZ2xlX2RlY2wgKGZuKTsKKwkJfQorCSAgICAgIGlm ICghREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG1ldGhvZCkpCisJCXsKKwkJ ICBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAobWV0aG9kKSA9IDE7CisJCSAg aWYgKERFQ0xfQVNTRU1CTEVSX05BTUVfU0VUX1AgKG1ldGhvZCkpCisJCSAg ICBtYW5nbGVfZGVjbCAobWV0aG9kKTsKKwkJfQorCSAgICAgIGNvbnRpbnVl OworCSAgICB9CiAJICBpZiAoREVDTF9JTkhFUklURURfQ1RPUl9CQVNFICht ZXRob2QpKQogCSAgICB7CiAJICAgICAgaWYgKERFQ0xfSU5IRVJJVEVEX0NU T1JfQkFTRSAoZm4pKQpAQCAtNjk5NSw2ICs3MDIwLDcgQEAgcmVzb2x2ZV9h ZGRyZXNzX29mX292ZXJsb2FkZWRfZnVuY3Rpb24gKHRyZWUgdGFyZ2UKICAg dHJlZSBtYXRjaGVzID0gTlVMTF9UUkVFOwogICB0cmVlIGZuOwogICB0cmVl IHRhcmdldF9mbl90eXBlOworICBWRUMgKHRyZWUsIGhlYXApICpmbl92ZXJf dmVjID0gTlVMTDsKIAogICAvKiBCeSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwg d2Ugc2hvdWxkIGJlIHNlZWluZyBvbmx5IHJlYWwKICAgICAgcG9pbnRlci10 by1tZW1iZXIgdHlwZXMsIG5vdCB0aGUgaW50ZXJuYWwgUE9JTlRFUl9UWVBF IHRvCkBAIC03MDU5LDkgKzcwODUsMTkgQEAgcmVzb2x2ZV9hZGRyZXNzX29m X292ZXJsb2FkZWRfZnVuY3Rpb24gKHRyZWUgdGFyZ2UKIAkgIGlmIChERUNM X0FOVElDSVBBVEVEIChmbikpCiAJICAgIGNvbnRpbnVlOwogCi0JICAvKiBT ZWUgaWYgdGhlcmUncyBhIG1hdGNoLiAgKi8KKwkgIC8qIFNlZSBpZiB0aGVy ZSdzIGEgbWF0Y2guICAgRm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBtdWx0aS12 ZXJzaW9uZWQsCisJICAgICBhbGwgdGhlIHZlcnNpb25zIG1hdGNoLiAgKi8K IAkgIGlmIChzYW1lX3R5cGVfcCAodGFyZ2V0X2ZuX3R5cGUsIHN0YXRpY19m bl90eXBlIChmbikpKQotCSAgICBtYXRjaGVzID0gdHJlZV9jb25zIChmbiwg TlVMTF9UUkVFLCBtYXRjaGVzKTsKKwkgICAgeworCSAgICAgIG1hdGNoZXMg PSB0cmVlX2NvbnMgKGZuLCBOVUxMX1RSRUUsIG1hdGNoZXMpOworCSAgICAg IC8qSWYgdmVyc2lvbmVkLCBwdXNoIGFsbCBwb3NzaWJsZSB2ZXJzaW9ucyBp bnRvIGEgdmVjdG9yLiAgKi8KKwkgICAgICBpZiAoREVDTF9GVU5DVElPTl9W RVJTSU9ORUQgKGZuKSkKKwkJeworCQkgIGlmIChmbl92ZXJfdmVjID09IE5V TEwpCisJCSAgIGZuX3Zlcl92ZWMgPSBWRUNfYWxsb2MgKHRyZWUsIGhlYXAs IDIpOworCQkgIFZFQ19zYWZlX3B1c2ggKHRyZWUsIGhlYXAsIGZuX3Zlcl92 ZWMsIGZuKTsgCisJCX0KKwkgICAgfQogCX0KICAgICB9CiAKQEAgLTcxNDks MTMgKzcxODUsMjYgQEAgcmVzb2x2ZV9hZGRyZXNzX29mX292ZXJsb2FkZWRf ZnVuY3Rpb24gKHRyZWUgdGFyZ2UKICAgICB7CiAgICAgICAvKiBUaGVyZSB3 ZXJlIHRvbyBtYW55IG1hdGNoZXMuICBGaXJzdCBjaGVjayBpZiB0aGV5J3Jl IGFsbAogCSB0aGUgc2FtZSBmdW5jdGlvbi4gICovCi0gICAgICB0cmVlIG1h dGNoOworICAgICAgdHJlZSBtYXRjaCA9IE5VTExfVFJFRTsKIAogICAgICAg Zm4gPSBUUkVFX1BVUlBPU0UgKG1hdGNoZXMpOwotICAgICAgZm9yIChtYXRj aCA9IFRSRUVfQ0hBSU4gKG1hdGNoZXMpOyBtYXRjaDsgbWF0Y2ggPSBUUkVF X0NIQUlOIChtYXRjaCkpCi0JaWYgKCFkZWNsc19tYXRjaCAoZm4sIFRSRUVf UFVSUE9TRSAobWF0Y2gpKSkKLQkgIGJyZWFrOwogCisgICAgICAvKiBGb3Ig bXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9ucywgbW9yZSB0aGFuIG9uZSBtYXRj aCBpcyBqdXN0IGZpbmUuCisJIENhbGwgZGVjbHNfbWF0Y2ggdG8gbWFrZSBz dXJlIHRoZXkgYXJlIGRpZmZlcmVudCBiZWNhdXNlIHRoZXkgYXJlCisJIHZl cnNpb25lZC4gICovCisgICAgICBpZiAoREVDTF9GVU5DVElPTl9WRVJTSU9O RUQgKGZuKSkKKwl7CisgICAgICAgICAgZm9yIChtYXRjaCA9IFRSRUVfQ0hB SU4gKG1hdGNoZXMpOyBtYXRjaDsgbWF0Y2ggPSBUUkVFX0NIQUlOIChtYXRj aCkpCisgIAkgICAgaWYgKGRlY2xzX21hdGNoIChmbiwgVFJFRV9QVVJQT1NF IChtYXRjaCkpKQorCSAgICAgIGJyZWFrOworCX0KKyAgICAgIGVsc2UKKwl7 CisgICAgICAgICAgZm9yIChtYXRjaCA9IFRSRUVfQ0hBSU4gKG1hdGNoZXMp OyBtYXRjaDsgbWF0Y2ggPSBUUkVFX0NIQUlOIChtYXRjaCkpCisgIAkgICAg aWYgKCFkZWNsc19tYXRjaCAoZm4sIFRSRUVfUFVSUE9TRSAobWF0Y2gpKSkK KwkgICAgICBicmVhazsKKwl9CisKICAgICAgIGlmIChtYXRjaCkKIAl7CiAJ ICBpZiAoZmxhZ3MgJiB0Zl9lcnJvcikKQEAgLTcyMTcsNiArNzI2NiwyOCBA QCByZXNvbHZlX2FkZHJlc3Nfb2Zfb3ZlcmxvYWRlZF9mdW5jdGlvbiAodHJl ZSB0YXJnZQogICAgICAgcGVyZm9ybV9vcl9kZWZlcl9hY2Nlc3NfY2hlY2sg KGFjY2Vzc19wYXRoLCBmbiwgZm4sIGZsYWdzKTsKICAgICB9CiAKKyAgLyog SWYgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCBpcyBtdWx0aS12ZXJz aW9uZWQgaXMgcmVxdWVzdGVkLCB0aGUKKyAgICAgcG9pbnRlciB0byB0aGUg ZGlzcGF0Y2hlciBmdW5jdGlvbiBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhp cyB3b3JrcworICAgICB3ZWxsIGJlY2F1c2UgaW5kaXJlY3RseSBjYWxsaW5n IHRoZSBmdW5jdGlvbiB3aWxsIGRpc3BhdGNoIHRoZSByaWdodAorICAgICBm dW5jdGlvbiB2ZXJzaW9uIGF0IHJ1bi10aW1lLiAgKi8KKyAgaWYgKERFQ0xf RlVOQ1RJT05fVkVSU0lPTkVEIChmbikpCisgICAgeworICAgICAgdHJlZSBk aXNwYXRjaGVyX2RlY2wgPSBOVUxMOworICAgICAgZ2NjX2Fzc2VydCAoZm5f dmVyX3ZlYyAhPSBOVUxMKTsKKyAgICAgIGdjY19hc3NlcnQgKHRhcmdldG0u Z2V0X2Z1bmN0aW9uX3ZlcnNpb25zX2Rpc3BhdGNoZXIpOworICAgICAgZGlz cGF0Y2hlcl9kZWNsID0gdGFyZ2V0bS5nZXRfZnVuY3Rpb25fdmVyc2lvbnNf ZGlzcGF0Y2hlciAoZm5fdmVyX3ZlYyk7CisgICAgICBpZiAoIWRpc3BhdGNo ZXJfZGVjbCkKKwl7CisJICBlcnJvcl9hdCAoaW5wdXRfbG9jYXRpb24sICJQ b2ludGVyIHRvIGEgbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24iCisJCSAgICAi IHdpdGhvdXQgYSBkZWZhdWx0IGlzIG5vdCBhbGxvd2VkIik7CisJICByZXR1 cm4gZXJyb3JfbWFya19ub2RlOworCX0KKyAgICAgIHJldHJvZml0X2xhbmdf ZGVjbCAoZGlzcGF0Y2hlcl9kZWNsKTsKKyAgICAgIG1hcmtfdXNlZCAoZm4p OworICAgICAgVkVDX2ZyZWUgKHRyZWUsIGhlYXAsIGZuX3Zlcl92ZWMpOwor ICAgICAgZm4gPSBkaXNwYXRjaGVyX2RlY2w7CisgICAgfQorCiAgIGlmIChU WVBFX1BUUkZOX1AgKHRhcmdldF90eXBlKSB8fCBUWVBFX1BUUk1FTUZVTkNf UCAodGFyZ2V0X3R5cGUpKQogICAgIHJldHVybiBjcF9idWlsZF9hZGRyX2V4 cHIgKGZuLCBmbGFncyk7CiAgIGVsc2UKSW5kZXg6IGdjYy9jcC9kZWNsLmMK PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL2NwL2RlY2wuYwkocmV2 aXNpb24gMTkyNjIzKQorKysgZ2NjL2NwL2RlY2wuYwkod29ya2luZyBjb3B5 KQpAQCAtNTMsNiArNTMsNyBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBm aWxlIENPUFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgInBvaW50ZXIt c2V0LmgiCiAjaW5jbHVkZSAic3BsYXktdHJlZS5oIgogI2luY2x1ZGUgInBs dWdpbi5oIgorI2luY2x1ZGUgImNncmFwaC5oIgogCiAvKiBQb3NzaWJsZSBj YXNlcyBvZiBiYWQgc3BlY2lmaWVycyB0eXBlIHVzZWQgYnkgYmFkX3NwZWNp ZmllcnMuICovCiBlbnVtIGJhZF9zcGVjX3BsYWNlIHsKQEAgLTk4MSw2ICs5 ODIsMjkgQEAgZGVjbHNfbWF0Y2ggKHRyZWUgbmV3ZGVjbCwgdHJlZSBvbGRk ZWNsKQogICAgICAgaWYgKHQxICE9IHQyKQogCXJldHVybiAwOwogCisgICAg ICAvKiBUaGUgZGVjbHMgZG9udCBtYXRjaCBpZiB0aGV5IGNvcnJlc3BvbmQg dG8gdHdvIGRpZmZlcmVudCB2ZXJzaW9ucworCSBvZiB0aGUgc2FtZSBmdW5j dGlvbi4gICovCisgICAgICBpZiAoY29tcHBhcm1zIChwMSwgcDIpCisJICAm JiBzYW1lX3R5cGVfcCAoVFJFRV9UWVBFIChmMSksIFRSRUVfVFlQRSAoZjIp KSAKKwkgICYmIHRhcmdldG0udGFyZ2V0X29wdGlvbi5mdW5jdGlvbl92ZXJz aW9ucyAobmV3ZGVjbCwgb2xkZGVjbCkpCisJeworCSAgLyogTWFyayBmdW5j dGlvbnMgYXMgdmVyc2lvbnMgaWYgbmVjZXNzYXJ5LiAgTW9kaWZ5IHRoZSBt YW5nbGVkIGRlY2wKKwkgICAgIG5hbWUgaWYgbmVjZXNzYXJ5LiAgKi8KKwkg IGlmICghREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG5ld2RlY2wpKQorCSAg ICB7CisJICAgICAgREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG5ld2RlY2wp ID0gMTsKKwkgICAgICBpZiAoREVDTF9BU1NFTUJMRVJfTkFNRV9TRVRfUCAo bmV3ZGVjbCkpCisJICAgICAgICBtYW5nbGVfZGVjbCAobmV3ZGVjbCk7CisJ ICAgIH0KKwkgIGlmICghREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG9sZGRl Y2wpKQorCSAgICB7CisJICAgICAgREVDTF9GVU5DVElPTl9WRVJTSU9ORUQg KG9sZGRlY2wpID0gMTsKKwkgICAgICBpZiAoREVDTF9BU1NFTUJMRVJfTkFN RV9TRVRfUCAob2xkZGVjbCkpCisJICAgICAgIG1hbmdsZV9kZWNsIChvbGRk ZWNsKTsKKwkgICAgfQorCSAgcmV0dXJuIDA7CisJfQorCiAgICAgICBpZiAo Q1BfREVDTF9DT05URVhUIChuZXdkZWNsKSAhPSBDUF9ERUNMX0NPTlRFWFQg KG9sZGRlY2wpCiAJICAmJiAhIChERUNMX0VYVEVSTl9DX1AgKG5ld2RlY2wp CiAJCSYmIERFQ0xfRVhURVJOX0NfUCAob2xkZGVjbCkpKQpAQCAtMTQ5OSw3 ICsxNTIzLDExIEBAIGR1cGxpY2F0ZV9kZWNscyAodHJlZSBuZXdkZWNsLCB0 cmVlIG9sZGRlY2wsIGJvb2wKIAkgICAgICBlcnJvciAoInByZXZpb3VzIGRl Y2xhcmF0aW9uICVxKyNEIGhlcmUiLCBvbGRkZWNsKTsKIAkgICAgICByZXR1 cm4gTlVMTF9UUkVFOwogCSAgICB9Ci0JICBlbHNlIGlmIChjb21wcGFybXMg KFRZUEVfQVJHX1RZUEVTIChUUkVFX1RZUEUgKG5ld2RlY2wpKSwKKwkgIC8q IEZvciBmdW5jdGlvbiB2ZXJzaW9ucywgcGFyYW1zIGFuZCB0eXBlcyBtYXRj aCwgYnV0IHRoZXkKKwkgICAgIGFyZSBub3QgYW1iaWd1b3VzLiAgKi8KKwkg IGVsc2UgaWYgKCghREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG5ld2RlY2wp CisJCSAgICAmJiAhREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG9sZGRlY2wp KQorCQkgICAmJiBjb21wcGFybXMgKFRZUEVfQVJHX1RZUEVTIChUUkVFX1RZ UEUgKG5ld2RlY2wpKSwKIAkJCSAgICAgIFRZUEVfQVJHX1RZUEVTIChUUkVF X1RZUEUgKG9sZGRlY2wpKSkpCiAJICAgIHsKIAkgICAgICBlcnJvciAoIm5l dyBkZWNsYXJhdGlvbiAlcSNEIiwgbmV3ZGVjbCk7CkBAIC0yMjcyLDYgKzIz MDAsMTEgQEAgZHVwbGljYXRlX2RlY2xzICh0cmVlIG5ld2RlY2wsIHRyZWUg b2xkZGVjbCwgYm9vbAogICBlbHNlIGlmIChERUNMX1BSRVNFUlZFX1AgKG5l d2RlY2wpKQogICAgIERFQ0xfUFJFU0VSVkVfUCAob2xkZGVjbCkgPSAxOwog CisgIC8qIElmIHRoZSBvbGRkZWNsIGlzIGEgdmVyc2lvbiwgc28gaXMgdGhl IG5ld2RlY2wuICAqLworICBpZiAoVFJFRV9DT0RFIChuZXdkZWNsKSA9PSBG VU5DVElPTl9ERUNMCisgICAgICAmJiBERUNMX0ZVTkNUSU9OX1ZFUlNJT05F RCAob2xkZGVjbCkpCisgICAgREVDTF9GVU5DVElPTl9WRVJTSU9ORUQgKG5l d2RlY2wpID0gMTsKKwogICBpZiAoVFJFRV9DT0RFIChuZXdkZWNsKSA9PSBG VU5DVElPTl9ERUNMKQogICAgIHsKICAgICAgIGludCBmdW5jdGlvbl9zaXpl OwpAQCAtMTQyMjcsNyArMTQyNjAsMTEgQEAgY3h4X2NvbWRhdF9ncm91cCAo dHJlZSBkZWNsKQogCSAgZWxzZQogCSAgICBicmVhazsKIAl9Ci0gICAgICBu YW1lID0gREVDTF9BU1NFTUJMRVJfTkFNRSAoZGVjbCk7CisgICAgICBpZiAo VFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCisJICAmJiBERUNM X0ZVTkNUSU9OX1ZFUlNJT05FRCAoZGVjbCkpCisJbmFtZSA9IERFQ0xfTkFN RSAoZGVjbCk7CisgICAgICBlbHNlCisgICAgICAgIG5hbWUgPSBERUNMX0FT U0VNQkxFUl9OQU1FIChkZWNsKTsKICAgICB9CiAKICAgcmV0dXJuIG5hbWU7 CkluZGV4OiBnY2MvY3AvZXJyb3IuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBnY2MvY3AvZXJyb3IuYwkocmV2aXNpb24gMTkyNjIzKQorKysgZ2Nj L2NwL2Vycm9yLmMJKHdvcmtpbmcgY29weSkKQEAgLTE1NDEsOCArMTU0MSwx NiBAQCBkdW1wX2V4Y2VwdGlvbl9zcGVjICh0cmVlIHQsIGludCBmbGFncykK IHN0YXRpYyB2b2lkCiBkdW1wX2Z1bmN0aW9uX25hbWUgKHRyZWUgdCwgaW50 IGZsYWdzKQogewotICB0cmVlIG5hbWUgPSBERUNMX05BTUUgKHQpOworICB0 cmVlIG5hbWU7CiAKKyAgLyogRm9yIGZ1bmN0aW9uIHZlcnNpb25zLCB1c2Ug dGhlIGFzc2VtYmxlciBuYW1lIGFzIHRoZSBkZWNsIG5hbWUgaXMKKyAgICAg dGhlIHNhbWUgZm9yIGFsbCB2ZXJzaW9ucy4gICovCisgIGlmIChUUkVFX0NP REUgKHQpID09IEZVTkNUSU9OX0RFQ0wKKyAgICAgICYmIERFQ0xfRlVOQ1RJ T05fVkVSU0lPTkVEICh0KSkKKyAgICBuYW1lID0gREVDTF9BU1NFTUJMRVJf TkFNRSAodCk7CisgIGVsc2UKKyAgICBuYW1lID0gREVDTF9OQU1FICh0KTsK KwogICAvKiBXZSBjYW4gZ2V0IGhlcmUgd2l0aCBhIGRlY2wgdGhhdCB3YXMg c3ludGhlc2l6ZWQgYnkgbGFuZ3VhZ2UtCiAgICAgIGluZGVwZW5kZW50IG1h Y2hpbmVyeSAoZS5nLiBjb3ZlcmFnZS5jKSBpbiB3aGljaCBjYXNlIGl0IHdv bid0CiAgICAgIGhhdmUgYSBsYW5nX3NwZWNpZmljIHN0cnVjdHVyZSBhdHRh Y2hlZCBhbmQgREVDTF9DT05TVFJVQ1RPUl9QCkluZGV4OiBnY2MvY3Avc2Vt YW50aWNzLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL2NwL3Nl bWFudGljcy5jCShyZXZpc2lvbiAxOTI2MjMpCisrKyBnY2MvY3Avc2VtYW50 aWNzLmMJKHdvcmtpbmcgY29weSkKQEAgLTM4MTMsOCArMzgxMywxMSBAQCBl eHBhbmRfb3JfZGVmZXJfZm5fMSAodHJlZSBmbikKICAgICAgIC8qIElmIHRo ZSB1c2VyIHdhbnRzIHVzIHRvIGtlZXAgYWxsIGlubGluZSBmdW5jdGlvbnMs IHRoZW4gbWFyawogCSB0aGlzIGZ1bmN0aW9uIGFzIG5lZWRlZCBzbyB0aGF0 IGZpbmlzaF9maWxlIHdpbGwgbWFrZSBzdXJlIHRvCiAJIG91dHB1dCBpdCBs YXRlci4gIFNpbWlsYXJseSwgYWxsIGRsbGV4cG9ydCdkIGZ1bmN0aW9ucyBt dXN0Ci0JIGJlIGVtaXR0ZWQ7IHRoZXJlIG1heSBiZSBjYWxsZXJzIGluIG90 aGVyIERMTHMuICAqLwotICAgICAgaWYgKChmbGFnX2tlZXBfaW5saW5lX2Z1 bmN0aW9ucworCSBiZSBlbWl0dGVkOyB0aGVyZSBtYXkgYmUgY2FsbGVycyBp biBvdGhlciBETExzLgorCSBBbHNvLCBtYXJrIHRoaXMgZnVuY3Rpb24gYXMg bmVlZGVkIGlmIGl0IGlzIG1hcmtlZCBpbmxpbmUgYnV0CisJIGlzIGEgbXVs dGktdmVyc2lvbmVkIGZ1bmN0aW9uLiAgKi8KKyAgICAgIGlmICgoKGZsYWdf a2VlcF9pbmxpbmVfZnVuY3Rpb25zCisJICAgIHx8IERFQ0xfRlVOQ1RJT05f VkVSU0lPTkVEIChmbikpCiAJICAgJiYgREVDTF9ERUNMQVJFRF9JTkxJTkVf UCAoZm4pCiAJICAgJiYgIURFQ0xfUkVBTExZX0VYVEVSTiAoZm4pKQogCSAg fHwgKGZsYWdfa2VlcF9pbmxpbmVfZGxsZXhwb3J0CkluZGV4OiBnY2MvY3Av ZGVjbDIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvY3AvZGVj bDIuYwkocmV2aXNpb24gMTkyNjIzKQorKysgZ2NjL2NwL2RlY2wyLmMJKHdv cmtpbmcgY29weSkKQEAgLTY3NCw5ICs2NzQsMTMgQEAgY2hlY2tfY2xhc3Nm biAodHJlZSBjdHlwZSwgdHJlZSBmdW5jdGlvbiwgdHJlZSB0ZW0KIAkgIGlm IChpc190ZW1wbGF0ZSAhPSAoVFJFRV9DT0RFIChmbmRlY2wpID09IFRFTVBM QVRFX0RFQ0wpKQogCSAgICBjb250aW51ZTsKIAorCSAgLyogV2hpbGUgZmlu ZGluZyBhIG1hdGNoLCBzYW1lIHR5cGVzIGFuZCBwYXJhbXMgYXJlIG5vdCBl bm91Z2gKKwkgICAgIGlmIHRoZSBmdW5jdGlvbiBpcyB2ZXJzaW9uZWQuICBB bHNvIGNoZWNrIHZlcnNpb24gKCJ0YXJnZXQiKQorCSAgICAgYXR0cmlidXRl cy4gICovCiAJICBpZiAoc2FtZV90eXBlX3AgKFRSRUVfVFlQRSAoVFJFRV9U WVBFIChmdW5jdGlvbikpLAogCQkJICAgVFJFRV9UWVBFIChUUkVFX1RZUEUg KGZuZGVjbCkpKQogCSAgICAgICYmIGNvbXBwYXJtcyAocDEsIHAyKQorCSAg ICAgICYmICF0YXJnZXRtLnRhcmdldF9vcHRpb24uZnVuY3Rpb25fdmVyc2lv bnMgKGZ1bmN0aW9uLCBmbmRlY2wpCiAJICAgICAgJiYgKCFpc190ZW1wbGF0 ZQogCQkgIHx8IGNvbXBfdGVtcGxhdGVfcGFybXMgKHRlbXBsYXRlX3Bhcm1z LAogCQkJCQkgIERFQ0xfVEVNUExBVEVfUEFSTVMgKGZuZGVjbCkpKQpJbmRl eDogZ2NjL2NwL2NhbGwuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBn Y2MvY3AvY2FsbC5jCShyZXZpc2lvbiAxOTI2MjMpCisrKyBnY2MvY3AvY2Fs bC5jCSh3b3JraW5nIGNvcHkpCkBAIC00MCw2ICs0MCw3IEBAIGFsb25nIHdp dGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBub3Qgc2VlCiAj aW5jbHVkZSAibGFuZ2hvb2tzLmgiCiAjaW5jbHVkZSAiYy1mYW1pbHkvYy1v YmpjLmgiCiAjaW5jbHVkZSAidGltZXZhci5oIgorI2luY2x1ZGUgImNncmFw aC5oIgogCiAvKiBUaGUgdmFyaW91cyBraW5kcyBvZiBjb252ZXJzaW9uLiAg Ki8KIApAQCAtNjQ0NCw2ICs2NDQ1LDM1IEBAIG1hZ2ljX3ZhcmFyZ3NfcCAo dHJlZSBmbikKICAgcmV0dXJuIGZhbHNlOwogfQogCisvKiBSZXR1cm5zIHRo ZSBkZWNsIG9mIHRoZSBkaXNwYXRjaGVyIGZ1bmN0aW9uIGlmIEZOIGlzIGEg ZnVuY3Rpb24gdmVyc2lvbi4gICovCisKK3N0YXRpYyB0cmVlCitnZXRfZnVu Y3Rpb25fdmVyc2lvbl9kaXNwYXRjaGVyICh0cmVlIGZuKQoreworICB0cmVl IGRpc3BhdGNoZXJfZGVjbCA9IE5VTEw7CisgIHN0cnVjdCBjZ3JhcGhfbm9k ZSAqbm9kZSA9IE5VTEw7CisKKyAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChm bikgPT0gRlVOQ1RJT05fREVDTAorCSAgICAgICYmIERFQ0xfRlVOQ1RJT05f VkVSU0lPTkVEIChmbikpOworCisgIG5vZGUgPSBjZ3JhcGhfZ2V0X25vZGUg KGZuKTsKKworICBpZiAobm9kZSAhPSBOVUxMICYmIG5vZGUtPmZ1bmN0aW9u X3ZlcnNpb24gIT0gTlVMTCkKKyAgICBkaXNwYXRjaGVyX2RlY2wgPSBub2Rl LT5mdW5jdGlvbl92ZXJzaW9uLT5kaXNwYXRjaGVyX3Jlc29sdmVyOworICBl bHNlCisgICAgcmV0dXJuIE5VTEw7CisKKyAgaWYgKGRpc3BhdGNoZXJfZGVj bCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGVycm9yX2F0IChpbnB1dF9sb2Nh dGlvbiwgIkNhbGwgdG8gbXVsdGl2ZXJzaW9uZWQgZnVuY3Rpb24iCisgICAg ICAgICAgICAgICAgIiB3aXRob3V0IGEgZGVmYXVsdCBpcyBub3QgYWxsb3dl ZCIpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICByZXRyb2ZpdF9s YW5nX2RlY2wgKGRpc3BhdGNoZXJfZGVjbCk7CisgIGdjY19hc3NlcnQgKGRp c3BhdGNoZXJfZGVjbCAhPSBOVUxMKTsKKyAgcmV0dXJuIGRpc3BhdGNoZXJf ZGVjbDsKK30KKwogLyogU3Vicm91dGluZSBvZiB0aGUgdmFyaW91cyBidWls ZF8qX2NhbGwgZnVuY3Rpb25zLiAgT3ZlcmxvYWQgcmVzb2x1dGlvbgogICAg aGFzIGNob3NlbiBhIHdpbm5pbmcgY2FuZGlkYXRlIENBTkQ7IGJ1aWxkIHVw IGEgQ0FMTF9FWFBSIGFjY29yZGluZ2x5LgogICAgQVJHUyBpcyBhIFRSRUVf TElTVCBvZiB0aGUgdW5jb252ZXJ0ZWQgYXJndW1lbnRzIHRvIHRoZSBjYWxs LiAgRkxBR1MgaXMgYQpAQCAtNjg5Niw2ICs2OTI2LDIwIEBAIGJ1aWxkX292 ZXJfY2FsbCAoc3RydWN0IHpfY2FuZGlkYXRlICpjYW5kLCBpbnQgZmxhCiAg IGlmICghYWxyZWFkeV91c2VkKQogICAgIG1hcmtfdXNlZCAoZm4pOwogCisg IC8qIEZvciBjYWxscyB0byBhIG11bHRpLXZlcnNpb25lZCBmdW5jdGlvbiwg b3ZlcmxvYWQgcmVzb2x1dGlvbgorICAgICByZXR1cm5zIHRoZSBmdW5jdGlv biB3aXRoIHRoZSBoaWdoZXN0IHRhcmdldCBwcmlvcml0eSwgdGhhdCBpcywK KyAgICAgdGhlIHZlcnNpb24gdGhhdCB3aWxsIGNoZWNrZWQgZm9yIGRpc3Bh dGNoaW5nIGZpcnN0LiAgSWYgdGhpcworICAgICB2ZXJzaW9uIGlzIGlubGlu YWJsZSwgYSBkaXJlY3QgY2FsbCB0byB0aGlzIHZlcnNpb24gY2FuIGJlIG1h ZGUKKyAgICAgb3RoZXJ3aXNlIHRoZSBjYWxsIHNob3VsZCBnbyB0aHJvdWdo IHRoZSBkaXNwYXRjaGVyLiAgKi8KKworICBpZiAoREVDTF9GVU5DVElPTl9W RVJTSU9ORUQgKGZuKQorICAgICAgJiYgIXRhcmdldG0udGFyZ2V0X29wdGlv bi5jYW5faW5saW5lX3AgKGN1cnJlbnRfZnVuY3Rpb25fZGVjbCwgZm4pKQor ICAgIHsKKyAgICAgIGZuID0gZ2V0X2Z1bmN0aW9uX3ZlcnNpb25fZGlzcGF0 Y2hlciAoZm4pOworICAgICAgaWYgKGZuID09IE5VTEwpCisJcmV0dXJuIE5V TEw7CisgICAgfQorCiAgIGlmIChERUNMX1ZJTkRFWCAoZm4pICYmIChmbGFn cyAmIExPT0tVUF9OT05WSVJUVUFMKSA9PSAwKQogICAgIHsKICAgICAgIHRy ZWUgdDsKQEAgLTgxNzYsNiArODIyMCwzOCBAQCBqb3VzdCAoc3RydWN0IHpf Y2FuZGlkYXRlICpjYW5kMSwgc3RydWN0IHpfY2FuZGlkYQogICAgICAgJiYg KElTX1RZUEVfT1JfREVDTF9QIChjYW5kMS0+Zm4pKSkKICAgICByZXR1cm4g MTsKIAorICAvKiBGb3IgY2FuZGlkYXRlcyBvZiBhIG11bHRpLXZlcnNpb25l ZCBmdW5jdGlvbiwgIG1ha2UgdGhlIHZlcnNpb24gd2l0aAorICAgICB0aGUg aGlnaGVzdCBwcmlvcml0eSB3aW4uICBUaGlzIHZlcnNpb24gd2lsbCBiZSBj aGVja2VkIGZvciBkaXNwYXRjaGluZworICAgICBmaXJzdC4gIElmIHRoaXMg dmVyc2lvbiBjYW4gYmUgaW5saW5lZCBpbnRvIHRoZSBjYWxsZXIsIHRoZSBm cm9udC1lbmQKKyAgICAgd2lsbCBzaW1wbHkgbWFrZSBhIGRpcmVjdCBjYWxs IHRvIHRoaXMgZnVuY3Rpb24uICAqLworCisgIGlmIChUUkVFX0NPREUgKGNh bmQxLT5mbikgPT0gRlVOQ1RJT05fREVDTAorICAgICAgJiYgREVDTF9GVU5D VElPTl9WRVJTSU9ORUQgKGNhbmQxLT5mbikKKyAgICAgICYmIFRSRUVfQ09E RSAoY2FuZDItPmZuKSA9PSBGVU5DVElPTl9ERUNMCisgICAgICAmJiBERUNM X0ZVTkNUSU9OX1ZFUlNJT05FRCAoY2FuZDItPmZuKSkKKyAgICB7CisgICAg ICB0cmVlIGYxID0gVFJFRV9UWVBFIChjYW5kMS0+Zm4pOworICAgICAgdHJl ZSBmMiA9IFRSRUVfVFlQRSAoY2FuZDItPmZuKTsKKyAgICAgIHRyZWUgcDEg PSBUWVBFX0FSR19UWVBFUyAoZjEpOworICAgICAgdHJlZSBwMiA9IFRZUEVf QVJHX1RZUEVTIChmMik7CisgICAgIAorICAgICAgLyogQ2hlY2sgaWYgY2Fu ZDEtPmZuIGFuZCBjYW5kMi0+Zm4gYXJlIHZlcnNpb25zIG9mIHRoZSBzYW1l IGZ1bmN0aW9uLiAgSXQKKyAgICAgICAgIGlzIHBvc3NpYmxlIHRoYXQgY2Fu ZDEtPmZuIGFuZCBjYW5kMi0+Zm4gYXJlIGZ1bmN0aW9uIHZlcnNpb25zIGJ1 dCBvZgorICAgICAgICAgZGlmZmVyZW50IGZ1bmN0aW9ucy4gIENoZWNrIHR5 cGVzIHRvIHNlZSBpZiB0aGV5IGFyZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZQor ICAgICAgICAgZnVuY3Rpb24uICAqLworICAgICAgaWYgKGNvbXBwYXJtcyAo cDEsIHAyKQorCSAgJiYgc2FtZV90eXBlX3AgKFRSRUVfVFlQRSAoZjEpLCBU UkVFX1RZUEUgKGYyKSkpCisJeworCSAgLyogQWx3YXlzIG1ha2UgdGhlIHZl cnNpb24gd2l0aCB0aGUgaGlnaGVyIHByaW9yaXR5LCBtb3JlCisJICAgICBz cGVjaWFsaXplZCwgd2luLiAgKi8KKwkgIGdjY19hc3NlcnQgKHRhcmdldG0u Y29tcGFyZV92ZXJzaW9uX3ByaW9yaXR5KTsKKwkgIGlmICh0YXJnZXRtLmNv bXBhcmVfdmVyc2lvbl9wcmlvcml0eSAoY2FuZDEtPmZuLCBjYW5kMi0+Zm4p ID49IDApCisJICAgIHJldHVybiAxOworCSAgZWxzZQorCSAgICByZXR1cm4g LTE7CisJfQorICAgIH0KKwogICAvKiBhIHZpYWJsZSBmdW5jdGlvbiBGMQog ICAgICBpcyBkZWZpbmVkIHRvIGJlIGEgYmV0dGVyIGZ1bmN0aW9uIHRoYW4g YW5vdGhlciB2aWFibGUgZnVuY3Rpb24gRjIgIGlmCiAgICAgIGZvciAgYWxs IGFyZ3VtZW50cyBpLCBJQ1NpKEYxKSBpcyBub3QgYSB3b3JzZSBjb252ZXJz aW9uIHNlcXVlbmNlIHRoYW4KQEAgLTg0OTYsNiArODU3MiwzNyBAQCB0d2Vh azoKICAgcmV0dXJuIDA7CiB9CiAKKy8qIEZ1bmN0aW9uIEZOIGlzIG11bHRp LXZlcnNpb25lZCBhbmQgQ0FORElEQVRFUyBjb250YWlucyB0aGUgbGlzdCBv ZiBhbGwKKyAgIG92ZXJsb2FkZWQgY2FuZGlkYXRlcyBmb3IgRk4uICBUaGlz IGZ1bmN0aW9uIGV4dHJhY3RzIGFsbCBmdW5jdGlvbnMgZnJvbQorICAgQ0FO RElEQVRFUyB0aGF0IGFyZSBmdW5jdGlvbiB2ZXJzaW9ucyBvZiBGTiBhbmQg Z2VuZXJhdGVzIGEgZGlzcGF0Y2hlcgorICAgZnVuY3Rpb24gZm9yIHRoaXMg bXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9uIGdyb3VwLiAgKi8KKworc3RhdGlj IHZvaWQKK2dlbmVyYXRlX2Z1bmN0aW9uX3ZlcnNpb25zX2Rpc3BhdGNoZXIg KHRyZWUgZm4sIHN0cnVjdCB6X2NhbmRpZGF0ZSAqY2FuZGlkYXRlcykKK3sK KyAgdHJlZSBmMSA9IFRSRUVfVFlQRSAoZm4pOworICB0cmVlIHAxID0gVFlQ RV9BUkdfVFlQRVMgKGYxKTsKKyAgVkVDICh0cmVlLCBoZWFwKSAqZm5fdmVy X3ZlYyA9IE5VTEw7CisgIHN0cnVjdCB6X2NhbmRpZGF0ZSAqdmVyID0gY2Fu ZGlkYXRlczsKKworICBmbl92ZXJfdmVjID0gVkVDX2FsbG9jICh0cmVlLCBo ZWFwLCAyKTsKKworICBmb3IgKDt2ZXI7IHZlciA9IHZlci0+bmV4dCkKKyAg ICB7CisgICAgICB0cmVlIGYyID0gVFJFRV9UWVBFICh2ZXItPmZuKTsKKyAg ICAgIHRyZWUgcDIgPSBUWVBFX0FSR19UWVBFUyAoZjIpOworICAgICAgLyog SWYgdGhpcyBjYW5kaWRhdGUgaXMgYSB2ZXJzaW9uIG9mIEZOLCB0eXBlcyBt dXN0IG1hdGNoLiAgKi8KKyAgICAgIGlmIChERUNMX0ZVTkNUSU9OX1ZFUlNJ T05FRCAodmVyLT5mbikKKyAgICAgICAgICAmJiBjb21wcGFybXMgKHAxLCBw MikKKwkgICYmIHNhbWVfdHlwZV9wIChUUkVFX1RZUEUgKGYxKSwgVFJFRV9U WVBFIChmMikpKQorICAgICAgICBWRUNfc2FmZV9wdXNoICh0cmVlLCBoZWFw LCBmbl92ZXJfdmVjLCB2ZXItPmZuKTsKKyAgICB9CisKKyAgZ2NjX2Fzc2Vy dCAodGFyZ2V0bS5nZXRfZnVuY3Rpb25fdmVyc2lvbnNfZGlzcGF0Y2hlcik7 CisgIHRhcmdldG0uZ2V0X2Z1bmN0aW9uX3ZlcnNpb25zX2Rpc3BhdGNoZXIg KGZuX3Zlcl92ZWMpOworICBWRUNfZnJlZSAodHJlZSwgaGVhcCwgZm5fdmVy X3ZlYyk7IAorfQorCiAvKiBHaXZlbiBhIGxpc3Qgb2YgY2FuZGlkYXRlcyBm b3Igb3ZlcmxvYWRpbmcsIGZpbmQgdGhlIGJlc3Qgb25lLCBpZiBhbnkuCiAg ICBUaGlzIGFsZ29yaXRobSBoYXMgYSB3b3JzdCBjYXNlIG9mIE8oMm4pICh3 aW5uZXIgaXMgbGFzdCksIGFuZCBhIGJlc3QKICAgIGNhc2Ugb2YgTyhuLzIp ICh0b3RhbGx5IGFtYmlndW91cyk7IG11Y2ggYmV0dGVyIHRoYW4gYSBzb3J0 aW5nCkBAIC04NTQ4LDYgKzg2NTUsMjIgQEAgdG91cm5leSAoc3RydWN0IHpf Y2FuZGlkYXRlICpjYW5kaWRhdGVzLCB0c3Vic3RfZmwKIAlyZXR1cm4gTlVM TDsKICAgICB9CiAKKyAgLyogRm9yIG11bHRpdmVyc2lvbmVkIGZ1bmN0aW9u cywgYWdncmVnYXRlIGFsbCB0aGUgdmVyc2lvbnMgaGVyZSBmb3IKKyAgICAg Z2VuZXJhdGluZyB0aGUgZGlzcGF0Y2hlciBib2R5IGxhdGVyIGlmIG5lY2Vz c2FyeS4gIENoZWNrIHRvIHNlZSBpZgorICAgICB0aGUgZGlzcGF0Y2hlciBp cyBhbHJlYWR5IGdlbmVyYXRlZCB0byBhdm9pZCBkb2luZyB0aGlzIG1vcmUg dGhhbgorICAgICBvbmNlLiAgKi8KKworICBpZiAoVFJFRV9DT0RFIChjaGFt cC0+Zm4pID09IEZVTkNUSU9OX0RFQ0wKKyAgICAgICYmIERFQ0xfRlVOQ1RJ T05fVkVSU0lPTkVEIChjaGFtcC0+Zm4pKQorICAgIHsKKyAgICAgIHN0cnVj dCBjZ3JhcGhfbm9kZSAqY2hhbXBfbm9kZSA9IGNncmFwaF9nZXRfbm9kZSAo Y2hhbXAtPmZuKTsKKyAgICAgIGlmIChjaGFtcF9ub2RlID09IE5VTEwKKwkg IHx8IGNoYW1wX25vZGUtPmZ1bmN0aW9uX3ZlcnNpb24gPT0gTlVMTAorCSAg fHwgY2hhbXBfbm9kZS0+ZnVuY3Rpb25fdmVyc2lvbi0+ZGlzcGF0Y2hlcl9y ZXNvbHZlciA9PSBOVUxMKQorICAgICAgICBnZW5lcmF0ZV9mdW5jdGlvbl92 ZXJzaW9uc19kaXNwYXRjaGVyIChjaGFtcC0+Zm4sIGNhbmRpZGF0ZXMpOwor CisgICAgfQorCiAgIHJldHVybiBjaGFtcDsKIH0KIApJbmRleDogZ2NjL2Nv bmZpZy9pMzg2L2kzODYuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBn Y2MvY29uZmlnL2kzODYvaTM4Ni5jCShyZXZpc2lvbiAxOTI2MjMpCisrKyBn Y2MvY29uZmlnL2kzODYvaTM4Ni5jCSh3b3JraW5nIGNvcHkpCkBAIC02Miw2 ICs2Miw4IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlO RzMuICBJZiBub3Qgc2VlCiAjaW5jbHVkZSAib3B0cy5oIgogI2luY2x1ZGUg ImRpYWdub3N0aWMuaCIKICNpbmNsdWRlICJkdW1wZmlsZS5oIgorI2luY2x1 ZGUgInRyZWUtcGFzcy5oIgorI2luY2x1ZGUgInRyZWUtZmxvdy5oIgogCiBl bnVtIHVwcGVyXzEyOGJpdHNfc3RhdGUKIHsKQEAgLTI4NDEzLDYgKzI4NDE1 LDk4NyBAQCBpeDg2X2luaXRfbW14X3NzZV9idWlsdGlucyAodm9pZCkKICAg ICB9CiB9CiAKKworLyogVGhpcyBhZGRzIGEgY29uZGl0aW9uIHRvIHRoZSBi YXNpY19ibG9jayBORVdfQkIgaW4gZnVuY3Rpb24gRlVOQ1RJT05fREVDTAor ICAgdG8gcmV0dXJuIGEgcG9pbnRlciB0byBWRVJTSU9OX0RFQ0wgaWYgdGhl IG91dGNvbWUgb2YgdGhlIGV4cHJlc3Npb24KKyAgIGZvcm1lZCBieSBQUkVE SUNBVEVfQ0hBSU4gaXMgdHJ1ZS4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBj YWxsZWQgZHVyaW5nCisgICB2ZXJzaW9uIGRpc3BhdGNoIHRvIGRlY2lkZSB3 aGljaCBmdW5jdGlvbiB2ZXJzaW9uIHRvIGV4ZWN1dGUuICBJdCByZXR1cm5z CisgICB0aGUgYmFzaWMgYmxvY2sgYXQgdGhlIGVuZCwgdG8gd2hpY2ggbW9y ZSBjb25kaXRpb25zIGNhbiBiZSBhZGRlZC4gICovCisKK3N0YXRpYyBiYXNp Y19ibG9jaworYWRkX2NvbmRpdGlvbl90b19iYiAodHJlZSBmdW5jdGlvbl9k ZWNsLCB0cmVlIHZlcnNpb25fZGVjbCwKKwkJICAgICB0cmVlIHByZWRpY2F0 ZV9jaGFpbiwgYmFzaWNfYmxvY2sgbmV3X2JiKQoreworICBnaW1wbGUgcmV0 dXJuX3N0bXQ7CisgIHRyZWUgY29udmVydF9leHByLCByZXN1bHRfdmFyOwor ICBnaW1wbGUgY29udmVydF9zdG10OworICBnaW1wbGUgY2FsbF9jb25kX3N0 bXQ7CisgIGdpbXBsZSBpZl9lbHNlX3N0bXQ7CisKKyAgYmFzaWNfYmxvY2sg YmIxLCBiYjIsIGJiMzsKKyAgZWRnZSBlMTIsIGUyMzsKKworICB0cmVlIGNv bmRfdmFyLCBhbmRfZXhwcl92YXIgPSBOVUxMX1RSRUU7CisgIGdpbXBsZV9z ZXEgZ3NlcTsKKworICB0cmVlIHByZWRpY2F0ZV9kZWNsLCBwcmVkaWNhdGVf YXJnOworCisgIHB1c2hfY2Z1biAoREVDTF9TVFJVQ1RfRlVOQ1RJT04gKGZ1 bmN0aW9uX2RlY2wpKTsKKworICBnY2NfYXNzZXJ0IChuZXdfYmIgIT0gTlVM TCk7CisgIGdzZXEgPSBiYl9zZXEgKG5ld19iYik7CisKKworICBjb252ZXJ0 X2V4cHIgPSBidWlsZDEgKENPTlZFUlRfRVhQUiwgcHRyX3R5cGVfbm9kZSwK KwkgICAgIAkJIGJ1aWxkX2ZvbGRfYWRkcl9leHByICh2ZXJzaW9uX2RlY2wp KTsKKyAgcmVzdWx0X3ZhciA9IGNyZWF0ZV90bXBfdmFyIChwdHJfdHlwZV9u b2RlLCBOVUxMKTsKKyAgY29udmVydF9zdG10ID0gZ2ltcGxlX2J1aWxkX2Fz c2lnbiAocmVzdWx0X3ZhciwgY29udmVydF9leHByKTsgCisgIHJldHVybl9z dG10ID0gZ2ltcGxlX2J1aWxkX3JldHVybiAocmVzdWx0X3Zhcik7CisKKyAg aWYgKHByZWRpY2F0ZV9jaGFpbiA9PSBOVUxMX1RSRUUpCisgICAgeworICAg ICAgZ2ltcGxlX3NlcV9hZGRfc3RtdCAoJmdzZXEsIGNvbnZlcnRfc3RtdCk7 CisgICAgICBnaW1wbGVfc2VxX2FkZF9zdG10ICgmZ3NlcSwgcmV0dXJuX3N0 bXQpOworICAgICAgc2V0X2JiX3NlcSAobmV3X2JiLCBnc2VxKTsKKyAgICAg IGdpbXBsZV9zZXRfYmIgKGNvbnZlcnRfc3RtdCwgbmV3X2JiKTsKKyAgICAg IGdpbXBsZV9zZXRfYmIgKHJldHVybl9zdG10LCBuZXdfYmIpOworICAgICAg cG9wX2NmdW4gKCk7CisgICAgICByZXR1cm4gbmV3X2JiOworICAgIH0KKwor ICB3aGlsZSAocHJlZGljYXRlX2NoYWluICE9IE5VTEwpCisgICAgeworICAg ICAgY29uZF92YXIgPSBjcmVhdGVfdG1wX3ZhciAoaW50ZWdlcl90eXBlX25v ZGUsIE5VTEwpOworICAgICAgcHJlZGljYXRlX2RlY2wgPSBUUkVFX1BVUlBP U0UgKHByZWRpY2F0ZV9jaGFpbik7CisgICAgICBwcmVkaWNhdGVfYXJnID0g VFJFRV9WQUxVRSAocHJlZGljYXRlX2NoYWluKTsKKyAgICAgIGNhbGxfY29u ZF9zdG10ID0gZ2ltcGxlX2J1aWxkX2NhbGwgKHByZWRpY2F0ZV9kZWNsLCAx LCBwcmVkaWNhdGVfYXJnKTsKKyAgICAgIGdpbXBsZV9jYWxsX3NldF9saHMg KGNhbGxfY29uZF9zdG10LCBjb25kX3Zhcik7CisKKyAgICAgIGdpbXBsZV9z ZXRfYmxvY2sgKGNhbGxfY29uZF9zdG10LCBERUNMX0lOSVRJQUwgKGZ1bmN0 aW9uX2RlY2wpKTsKKyAgICAgIGdpbXBsZV9zZXRfYmIgKGNhbGxfY29uZF9z dG10LCBuZXdfYmIpOworICAgICAgZ2ltcGxlX3NlcV9hZGRfc3RtdCAoJmdz ZXEsIGNhbGxfY29uZF9zdG10KTsKKworICAgICAgcHJlZGljYXRlX2NoYWlu ID0gVFJFRV9DSEFJTiAocHJlZGljYXRlX2NoYWluKTsKKyAgICAgIAorICAg ICAgaWYgKGFuZF9leHByX3ZhciA9PSBOVUxMKQorICAgICAgICBhbmRfZXhw cl92YXIgPSBjb25kX3ZhcjsKKyAgICAgIGVsc2UKKwl7CisJICBnaW1wbGUg YXNzaWduX3N0bXQ7CisJICAvKiBVc2UgTUlOX0VYUFIgdG8gY2hlY2sgaWYg YW55IGludGVnZXIgaXMgemVybz8uCisJICAgICBhbmRfZXhwcl92YXIgPSBt aW5fZXhwciA8Y29uZF92YXIsIGFuZF9leHByX3Zhcj4gICovCisJICBhc3Np Z25fc3RtdCA9IGdpbXBsZV9idWlsZF9hc3NpZ24gKGFuZF9leHByX3ZhciwK KwkJCSAgYnVpbGQyIChNSU5fRVhQUiwgaW50ZWdlcl90eXBlX25vZGUsCisJ CQkJICBjb25kX3ZhciwgYW5kX2V4cHJfdmFyKSk7CisKKwkgIGdpbXBsZV9z ZXRfYmxvY2sgKGFzc2lnbl9zdG10LCBERUNMX0lOSVRJQUwgKGZ1bmN0aW9u X2RlY2wpKTsKKwkgIGdpbXBsZV9zZXRfYmIgKGFzc2lnbl9zdG10LCBuZXdf YmIpOworCSAgZ2ltcGxlX3NlcV9hZGRfc3RtdCAoJmdzZXEsIGFzc2lnbl9z dG10KTsKKwl9CisgICAgfQorCisgIGlmX2Vsc2Vfc3RtdCA9IGdpbXBsZV9i dWlsZF9jb25kIChHVF9FWFBSLCBhbmRfZXhwcl92YXIsCisJICAJCSAgICAg ICAgICAgIGludGVnZXJfemVyb19ub2RlLAorCQkJCSAgICBOVUxMX1RSRUUs IE5VTExfVFJFRSk7CisgIGdpbXBsZV9zZXRfYmxvY2sgKGlmX2Vsc2Vfc3Rt dCwgREVDTF9JTklUSUFMIChmdW5jdGlvbl9kZWNsKSk7CisgIGdpbXBsZV9z ZXRfYmIgKGlmX2Vsc2Vfc3RtdCwgbmV3X2JiKTsKKyAgZ2ltcGxlX3NlcV9h ZGRfc3RtdCAoJmdzZXEsIGlmX2Vsc2Vfc3RtdCk7CisKKyAgZ2ltcGxlX3Nl cV9hZGRfc3RtdCAoJmdzZXEsIGNvbnZlcnRfc3RtdCk7CisgIGdpbXBsZV9z ZXFfYWRkX3N0bXQgKCZnc2VxLCByZXR1cm5fc3RtdCk7CisgIHNldF9iYl9z ZXEgKG5ld19iYiwgZ3NlcSk7CisKKyAgYmIxID0gbmV3X2JiOworICBlMTIg PSBzcGxpdF9ibG9jayAoYmIxLCBpZl9lbHNlX3N0bXQpOworICBiYjIgPSBl MTItPmRlc3Q7CisgIGUxMi0+ZmxhZ3MgJj0gfkVER0VfRkFMTFRIUlU7Cisg IGUxMi0+ZmxhZ3MgfD0gRURHRV9UUlVFX1ZBTFVFOworCisgIGUyMyA9IHNw bGl0X2Jsb2NrIChiYjIsIHJldHVybl9zdG10KTsKKworICBnaW1wbGVfc2V0 X2JiIChjb252ZXJ0X3N0bXQsIGJiMik7CisgIGdpbXBsZV9zZXRfYmIgKHJl dHVybl9zdG10LCBiYjIpOworCisgIGJiMyA9IGUyMy0+ZGVzdDsKKyAgbWFr ZV9lZGdlIChiYjEsIGJiMywgRURHRV9GQUxTRV9WQUxVRSk7IAorCisgIHJl bW92ZV9lZGdlIChlMjMpOworICBtYWtlX2VkZ2UgKGJiMiwgRVhJVF9CTE9D S19QVFIsIDApOworCisgIHBvcF9jZnVuICgpOworCisgIHJldHVybiBiYjM7 Cit9CisKKy8qIFRoaXMgcGFyc2VzIHRoZSBhdHRyaWJ1dGUgYXJndW1lbnRz IHRvIHRhcmdldCBpbiBERUNMIGFuZCBkZXRlcm1pbmVzCisgICB0aGUgcmln aHQgYnVpbHRpbiB0byB1c2UgdG8gbWF0Y2ggdGhlIHBsYXRmb3JtIHNwZWNp ZmljYXRpb24uCisgICBJdCByZXR1cm5zIHRoZSBwcmlvcml0eSB2YWx1ZSBm b3IgdGhpcyB2ZXJzaW9uIGRlY2wuICBJZiBQUkVESUNBVEVfTElTVAorICAg aXMgbm90IE5VTEwsIGl0IHN0b3JlcyB0aGUgbGlzdCBvZiBjcHUgZmVhdHVy ZXMgdGhhdCBuZWVkIHRvIGJlIGNoZWNrZWQKKyAgIGJlZm9yZSBkaXNwYXRj aGluZyB0aGlzIGZ1bmN0aW9uLiAgKi8KKworc3RhdGljIHVuc2lnbmVkIGlu dAorZ2V0X2J1aWx0aW5fY29kZV9mb3JfdmVyc2lvbiAodHJlZSBkZWNsLCB0 cmVlICpwcmVkaWNhdGVfbGlzdCkKK3sKKyAgdHJlZSBhdHRyczsKKyAgc3Ry dWN0IGNsX3RhcmdldF9vcHRpb24gY3VyX3RhcmdldDsKKyAgdHJlZSB0YXJn ZXRfbm9kZTsKKyAgc3RydWN0IGNsX3RhcmdldF9vcHRpb24gKm5ld190YXJn ZXQ7CisgIGNvbnN0IGNoYXIgKmFyZ19zdHIgPSBOVUxMOworICBjb25zdCBj aGFyICphdHRyc19zdHIgPSBOVUxMOworICBjaGFyICp0b2tfc3RyID0gTlVM TDsKKyAgY2hhciAqdG9rZW47CisKKyAgLyogUHJpb3JpdHkgb2YgaTM4NiBm ZWF0dXJlcywgZ3JlYXRlciB2YWx1ZSBpcyBoaWdoZXIgcHJpb3JpdHkuICAg VGhpcyBpcworICAgICB1c2VkIHRvIGRlY2lkZSB0aGUgb3JkZXIgaW4gd2hp Y2ggZnVuY3Rpb24gZGlzcGF0Y2ggbXVzdCBoYXBwZW4uICBGb3IKKyAgICAg aW5zdGFuY2UsIGEgdmVyc2lvbiBzcGVjaWFsaXplZCBmb3IgU1NFNC4yIHNo b3VsZCBiZSBjaGVja2VkIGZvciBkaXNwYXRjaAorICAgICBiZWZvcmUgYSB2 ZXJzaW9uIGZvciBTU0UzLCBhcyBTU0U0LjIgaW1wbGllcyBTU0UzLiAgKi8K KyAgZW51bSBmZWF0dXJlX3ByaW9yaXR5CisgIHsKKyAgICBQX1pFUk8gPSAw LAorICAgIFBfTU1YLAorICAgIFBfU1NFLAorICAgIFBfU1NFMiwKKyAgICBQ X1NTRTMsCisgICAgUF9TU1NFMywKKyAgICBQX1BST0NfU1NTRTMsCisgICAg UF9TU0U0X2EsCisgICAgUF9QUk9DX1NTRTRfYSwKKyAgICBQX1NTRTRfMSwK KyAgICBQX1NTRTRfMiwKKyAgICBQX1BST0NfU1NFNF8yLAorICAgIFBfUE9Q Q05ULAorICAgIFBfQVZYLAorICAgIFBfQVZYMiwKKyAgICBQX0ZNQSwKKyAg ICBQX1BST0NfRk1BCisgIH07CisKKyBlbnVtIGZlYXR1cmVfcHJpb3JpdHkg cHJpb3JpdHkgPSBQX1pFUk87CisKKyAgLyogVGhlc2UgYXJlIHRoZSB0YXJn ZXQgYXR0cmlidXRlIHN0cmluZ3MgZm9yIHdoaWNoIGEgZGlzcGF0Y2hlciBp cworICAgICBhdmFpbGFibGUsIGZyb20gZm9sZF9idWlsdGluX2NwdS4gICov CisKKyAgc3RhdGljIHN0cnVjdCBfZmVhdHVyZV9saXN0CisgICAgeworICAg ICAgY29uc3QgY2hhciAqY29uc3QgbmFtZTsKKyAgICAgIGNvbnN0IGVudW0g ZmVhdHVyZV9wcmlvcml0eSBwcmlvcml0eTsKKyAgICB9CisgIGNvbnN0IGZl YXR1cmVfbGlzdFtdID0KKyAgICB7CisgICAgICB7Im1teCIsIFBfTU1YfSwK KyAgICAgIHsic3NlIiwgUF9TU0V9LAorICAgICAgeyJzc2UyIiwgUF9TU0Uy fSwKKyAgICAgIHsic3NlMyIsIFBfU1NFM30sCisgICAgICB7InNzc2UzIiwg UF9TU1NFM30sCisgICAgICB7InNzZTQuMSIsIFBfU1NFNF8xfSwKKyAgICAg IHsic3NlNC4yIiwgUF9TU0U0XzJ9LAorICAgICAgeyJwb3BjbnQiLCBQX1BP UENOVH0sCisgICAgICB7ImF2eCIsIFBfQVZYfSwKKyAgICAgIHsiYXZ4MiIs IFBfQVZYMn0KKyAgICB9OworCisKKyAgc3RhdGljIHVuc2lnbmVkIGludCBO VU1fRkVBVFVSRVMKKyAgICA9IHNpemVvZiAoZmVhdHVyZV9saXN0KSAvIHNp emVvZiAoc3RydWN0IF9mZWF0dXJlX2xpc3QpOworCisgIHVuc2lnbmVkIGlu dCBpOworCisgIHRyZWUgcHJlZGljYXRlX2NoYWluID0gTlVMTF9UUkVFOwor ICB0cmVlIHByZWRpY2F0ZV9kZWNsLCBwcmVkaWNhdGVfYXJnOworCisgIGF0 dHJzID0gbG9va3VwX2F0dHJpYnV0ZSAoInRhcmdldCIsIERFQ0xfQVRUUklC VVRFUyAoZGVjbCkpOworICBnY2NfYXNzZXJ0IChhdHRycyAhPSBOVUxMKTsK KworICBhdHRycyA9IFRSRUVfVkFMVUUgKFRSRUVfVkFMVUUgKGF0dHJzKSk7 CisKKyAgZ2NjX2Fzc2VydCAoVFJFRV9DT0RFIChhdHRycykgPT0gU1RSSU5H X0NTVCk7CisgIGF0dHJzX3N0ciA9IFRSRUVfU1RSSU5HX1BPSU5URVIgKGF0 dHJzKTsKKworCisgIC8qIEhhbmRsZSBhcmNoPSBpZiBzcGVjaWZpZWQuICBG b3IgcHJpb3JpdHksIHNldCBpdCB0byBiZSAxIG1vcmUgdGhhbgorICAgICB0 aGUgYmVzdCBpbnN0cnVjdGlvbiBzZXQgdGhlIHByb2Nlc3NvciBjYW4gaGFu ZGxlLiAgRm9yIGluc3RhbmNlLCBpZgorICAgICB0aGVyZSBpcyBhIHZlcnNp b24gZm9yIGF0b20gYW5kIGEgdmVyc2lvbiBmb3Igc3NzZTMgKHRoZSBoaWdo ZXN0IElTQQorICAgICBwcmlvcml0eSBmb3IgYXRvbSksIHRoZSBhdG9tIHZl cnNpb24gbXVzdCBiZSBjaGVja2VkIGZvciBkaXNwYXRjaAorICAgICBiZWZv cmUgdGhlIHNzc2UzIHZlcnNpb24uICovCisgIGlmIChzdHJzdHIgKGF0dHJz X3N0ciwgImFyY2g9IikgIT0gTlVMTCkKKyAgICB7CisgICAgICBjbF90YXJn ZXRfb3B0aW9uX3NhdmUgKCZjdXJfdGFyZ2V0LCAmZ2xvYmFsX29wdGlvbnMp OworICAgICAgdGFyZ2V0X25vZGUgPSBpeDg2X3ZhbGlkX3RhcmdldF9hdHRy aWJ1dGVfdHJlZSAoYXR0cnMpOworICAgIAorICAgICAgZ2NjX2Fzc2VydCAo dGFyZ2V0X25vZGUpOworICAgICAgbmV3X3RhcmdldCA9IFRSRUVfVEFSR0VU X09QVElPTiAodGFyZ2V0X25vZGUpOworICAgICAgZ2NjX2Fzc2VydCAobmV3 X3RhcmdldCk7CisgICAgICAKKyAgICAgIGlmIChuZXdfdGFyZ2V0LT5hcmNo X3NwZWNpZmllZCAmJiBuZXdfdGFyZ2V0LT5hcmNoID4gMCkKKwl7CisJICBz d2l0Y2ggKG5ld190YXJnZXQtPmFyY2gpCisJICAgIHsKKwkgICAgY2FzZSBQ Uk9DRVNTT1JfQ09SRTJfMzI6CisJICAgIGNhc2UgUFJPQ0VTU09SX0NPUkUy XzY0OgorCSAgICAgIGFyZ19zdHIgPSAiY29yZTIiOworCSAgICAgIHByaW9y aXR5ID0gUF9QUk9DX1NTU0UzOworCSAgICAgIGJyZWFrOworCSAgICBjYXNl IFBST0NFU1NPUl9DT1JFSTdfMzI6CisJICAgIGNhc2UgUFJPQ0VTU09SX0NP UkVJN182NDoKKwkgICAgICBhcmdfc3RyID0gImNvcmVpNyI7CisJICAgICAg cHJpb3JpdHkgPSBQX1BST0NfU1NFNF8yOworCSAgICAgIGJyZWFrOworCSAg ICBjYXNlIFBST0NFU1NPUl9BVE9NOgorCSAgICAgIGFyZ19zdHIgPSAiYXRv bSI7CisJICAgICAgcHJpb3JpdHkgPSBQX1BST0NfU1NTRTM7CisJICAgICAg YnJlYWs7CisJICAgIGNhc2UgUFJPQ0VTU09SX0FNREZBTTEwOgorCSAgICAg IGFyZ19zdHIgPSAiYW1kZmFtMTBoIjsKKwkgICAgICBwcmlvcml0eSA9IFBf UFJPQ19TU0U0X2E7CisJICAgICAgYnJlYWs7CisJICAgIGNhc2UgUFJPQ0VT U09SX0JEVkVSMToKKwkgICAgICBhcmdfc3RyID0gImJkdmVyMSI7CisJICAg ICAgcHJpb3JpdHkgPSBQX1BST0NfRk1BOworCSAgICAgIGJyZWFrOworCSAg ICBjYXNlIFBST0NFU1NPUl9CRFZFUjI6CisJICAgICAgYXJnX3N0ciA9ICJi ZHZlcjIiOworCSAgICAgIHByaW9yaXR5ID0gUF9QUk9DX0ZNQTsKKwkgICAg ICBicmVhazsKKwkgICAgfSAgCisJfSAgICAKKyAgICAKKyAgICAgIGNsX3Rh cmdldF9vcHRpb25fcmVzdG9yZSAoJmdsb2JhbF9vcHRpb25zLCAmY3VyX3Rh cmdldCk7CisJCisgICAgICBpZiAocHJlZGljYXRlX2xpc3QgJiYgYXJnX3N0 ciA9PSBOVUxMKQorCXsKKwkgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NB VElPTiAoZGVjbCksCisJICAgIAkiTm8gZGlzcGF0Y2hlciBmb3VuZCBmb3Ig dGhlIHZlcnNpb25pbmcgYXR0cmlidXRlcyIpOworCSAgcmV0dXJuIDA7CisJ fQorICAgIAorICAgICAgaWYgKHByZWRpY2F0ZV9saXN0KQorCXsKKyAgICAg ICAgICBwcmVkaWNhdGVfZGVjbCA9IGl4ODZfYnVpbHRpbnMgWyhpbnQpIElY ODZfQlVJTFRJTl9DUFVfSVNdOworICAgICAgICAgIC8qIEZvciBhIEMgc3Ry aW5nIGxpdGVyYWwgdGhlIGxlbmd0aCBpbmNsdWRlcyB0aGUgdHJhaWxpbmcg TlVMTC4gICovCisgICAgICAgICAgcHJlZGljYXRlX2FyZyA9IGJ1aWxkX3N0 cmluZ19saXRlcmFsIChzdHJsZW4gKGFyZ19zdHIpICsgMSwgYXJnX3N0cik7 CisgICAgICAgICAgcHJlZGljYXRlX2NoYWluID0gdHJlZV9jb25zIChwcmVk aWNhdGVfZGVjbCwgcHJlZGljYXRlX2FyZywKKwkJCQkgICAgICAgcHJlZGlj YXRlX2NoYWluKTsKKwl9CisgICAgfQorCisgIC8qIFByb2Nlc3MgZmVhdHVy ZSBuYW1lLiAgKi8KKyAgdG9rX3N0ciA9ICAoY2hhciAqKSB4bWFsbG9jIChz dHJsZW4gKGF0dHJzX3N0cikgKyAxKTsKKyAgc3RyY3B5ICh0b2tfc3RyLCBh dHRyc19zdHIpOworICB0b2tlbiA9IHN0cnRvayAodG9rX3N0ciwgIiwiKTsK KyAgcHJlZGljYXRlX2RlY2wgPSBpeDg2X2J1aWx0aW5zIFsoaW50KSBJWDg2 X0JVSUxUSU5fQ1BVX1NVUFBPUlRTXTsKKworICB3aGlsZSAodG9rZW4gIT0g TlVMTCkKKyAgICB7CisgICAgICAvKiBEbyBub3QgcHJvY2VzcyAiYXJjaD0i ICAqLworICAgICAgaWYgKHN0cm5jbXAgKHRva2VuLCAiYXJjaD0iLCA1KSA9 PSAwKQorCXsKKwkgIHRva2VuID0gc3RydG9rIChOVUxMLCAiLCIpOworCSAg Y29udGludWU7CisJfQorICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9GRUFU VVJFUzsgKytpKQorCXsKKwkgIGlmIChzdHJjbXAgKHRva2VuLCBmZWF0dXJl X2xpc3RbaV0ubmFtZSkgPT0gMCkKKwkgICAgeworCSAgICAgIGlmIChwcmVk aWNhdGVfbGlzdCkKKwkJeworCQkgIHByZWRpY2F0ZV9hcmcgPSBidWlsZF9z dHJpbmdfbGl0ZXJhbCAoCisJCQkJICBzdHJsZW4gKGZlYXR1cmVfbGlzdFtp XS5uYW1lKSArIDEsCisJCQkJICBmZWF0dXJlX2xpc3RbaV0ubmFtZSk7CisJ CSAgcHJlZGljYXRlX2NoYWluID0gdHJlZV9jb25zIChwcmVkaWNhdGVfZGVj bCwgcHJlZGljYXRlX2FyZywKKwkJCQkJICAgICAgIHByZWRpY2F0ZV9jaGFp bik7CisJCX0KKwkgICAgICAvKiBGaW5kIHRoZSBtYXhpbXVtIHByaW9yaXR5 IGZlYXR1cmUuICAqLworCSAgICAgIGlmIChmZWF0dXJlX2xpc3RbaV0ucHJp b3JpdHkgPiBwcmlvcml0eSkKKwkJcHJpb3JpdHkgPSBmZWF0dXJlX2xpc3Rb aV0ucHJpb3JpdHk7CisKKwkgICAgICBicmVhazsKKwkgICAgfQorCX0KKyAg ICAgIGlmIChwcmVkaWNhdGVfbGlzdCAmJiBpID09IE5VTV9GRUFUVVJFUykK Kwl7CisJICBlcnJvcl9hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKGRlY2wp LAorCQkgICAgIk5vIGRpc3BhdGNoZXIgZm91bmQgZm9yICVzIiwgdG9rZW4p OworCSAgcmV0dXJuIDA7CisJfQorICAgICAgdG9rZW4gPSBzdHJ0b2sgKE5V TEwsICIsIik7CisgICAgfQorICBmcmVlICh0b2tfc3RyKTsKKworICBpZiAo cHJlZGljYXRlX2xpc3QgJiYgcHJlZGljYXRlX2NoYWluID09IE5VTExfVFJF RSkKKyAgICB7CisgICAgICBlcnJvcl9hdCAoREVDTF9TT1VSQ0VfTE9DQVRJ T04gKGRlY2wpLAorCSAgICAgICAgIk5vIGRpc3BhdGNoZXIgZm91bmQgZm9y IHRoZSB2ZXJzaW9uaW5nIGF0dHJpYnV0ZXMgOiAlcyIsCisJICAgICAgICBh dHRyc19zdHIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICBlbHNlIGlm IChwcmVkaWNhdGVfbGlzdCkKKyAgICB7CisgICAgICBwcmVkaWNhdGVfY2hh aW4gPSBucmV2ZXJzZSAocHJlZGljYXRlX2NoYWluKTsKKyAgICAgICpwcmVk aWNhdGVfbGlzdCA9IHByZWRpY2F0ZV9jaGFpbjsKKyAgICB9CisKKyAgcmV0 dXJuIHByaW9yaXR5OyAKK30KKworLyogVGhpcyBjb21wYXJlcyB0aGUgcHJp b3JpdHkgb2YgdGFyZ2V0IGZlYXR1cmVzIGluIGZ1bmN0aW9uIERFQ0wxCisg ICBhbmQgREVDTDIuICBJdCByZXR1cm5zIHBvc2l0aXZlIHZhbHVlIGlmIERF Q0wxIGlzIGhpZ2hlciBwcmlvcml0eSwKKyAgIG5lZ2F0aXZlIHZhbHVlIGlm IERFQ0wyIGlzIGhpZ2hlciBwcmlvcml0eSBhbmQgMCBpZiB0aGV5IGFyZSB0 aGUKKyAgIHNhbWUuICAqLworCitzdGF0aWMgaW50CitpeDg2X2NvbXBhcmVf dmVyc2lvbl9wcmlvcml0eSAodHJlZSBkZWNsMSwgdHJlZSBkZWNsMikKK3sK KyAgdW5zaWduZWQgaW50IHByaW9yaXR5MSA9IDA7CisgIHVuc2lnbmVkIGlu dCBwcmlvcml0eTIgPSAwOworCisgIGlmIChsb29rdXBfYXR0cmlidXRlICgi dGFyZ2V0IiwgREVDTF9BVFRSSUJVVEVTIChkZWNsMSkpICE9IE5VTEwpCisg ICAgcHJpb3JpdHkxID0gZ2V0X2J1aWx0aW5fY29kZV9mb3JfdmVyc2lvbiAo ZGVjbDEsIE5VTEwpOworCisgIGlmIChsb29rdXBfYXR0cmlidXRlICgidGFy Z2V0IiwgREVDTF9BVFRSSUJVVEVTIChkZWNsMikpICE9IE5VTEwpCisgICAg cHJpb3JpdHkyID0gZ2V0X2J1aWx0aW5fY29kZV9mb3JfdmVyc2lvbiAoZGVj bDIsIE5VTEwpOworCisgIHJldHVybiAoaW50KXByaW9yaXR5MSAtIChpbnQp cHJpb3JpdHkyOworfQorCisvKiBWMSBhbmQgVjIgcG9pbnQgdG8gZnVuY3Rp b24gdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQgcHJpb3JpdGllcworICAgYmFz ZWQgb24gdGhlIHRhcmdldCBJU0EuICBUaGlzIGZ1bmN0aW9uIGNvbXBhcmVz IHRoZWlyIHByaW9yaXRpZXMuICAqLworIAorc3RhdGljIGludAorZmVhdHVy ZV9jb21wYXJlIChjb25zdCB2b2lkICp2MSwgY29uc3Qgdm9pZCAqdjIpCit7 CisgIHR5cGVkZWYgc3RydWN0IF9mdW5jdGlvbl92ZXJzaW9uX2luZm8KKyAg ICB7CisgICAgICB0cmVlIHZlcnNpb25fZGVjbDsKKyAgICAgIHRyZWUgcHJl ZGljYXRlX2NoYWluOworICAgICAgdW5zaWduZWQgaW50IGRpc3BhdGNoX3By aW9yaXR5OworICAgIH0gZnVuY3Rpb25fdmVyc2lvbl9pbmZvOworCisgIGNv bnN0IGZ1bmN0aW9uX3ZlcnNpb25faW5mbyBjMSA9ICooY29uc3QgZnVuY3Rp b25fdmVyc2lvbl9pbmZvICopdjE7CisgIGNvbnN0IGZ1bmN0aW9uX3ZlcnNp b25faW5mbyBjMiA9ICooY29uc3QgZnVuY3Rpb25fdmVyc2lvbl9pbmZvICop djI7CisgIHJldHVybiAoYzIuZGlzcGF0Y2hfcHJpb3JpdHkgLSBjMS5kaXNw YXRjaF9wcmlvcml0eSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZ2VuZXJh dGVzIHRoZSBkaXNwYXRjaCBmdW5jdGlvbiBmb3IKKyAgIG11bHRpLXZlcnNp b25lZCBmdW5jdGlvbnMuICBESVNQQVRDSF9ERUNMIGlzIHRoZSBmdW5jdGlv biB3aGljaCB3aWxsCisgICBjb250YWluIHRoZSBkaXNwYXRjaCBsb2dpYy4g IEZOREVDTFMgYXJlIHRoZSBmdW5jdGlvbiBjaG9pY2VzIGZvcgorICAgZGlz cGF0Y2gsIGFuZCBpcyBhIHRyZWUgY2hhaW4uICBFTVBUWV9CQiBpcyB0aGUg YmFzaWMgYmxvY2sgcG9pbnRlcgorICAgaW4gRElTUEFUQ0hfREVDTCBpbiB3 aGljaCB0aGUgZGlzcGF0Y2ggY29kZSBpcyBnZW5lcmF0ZWQuICAqLworCitz dGF0aWMgaW50CitkaXNwYXRjaF9mdW5jdGlvbl92ZXJzaW9ucyAodHJlZSBk aXNwYXRjaF9kZWNsLAorCQkJICAgIHZvaWQgKmZuZGVjbHNfcCwKKwkJCSAg ICBiYXNpY19ibG9jayAqZW1wdHlfYmIpCit7CisgIHRyZWUgZGVmYXVsdF9k ZWNsOworICBnaW1wbGUgaWZ1bmNfY3B1X2luaXRfc3RtdDsKKyAgZ2ltcGxl X3NlcSBnc2VxOworICBpbnQgaXg7CisgIHRyZWUgZWxlOworICBWRUMgKHRy ZWUsIGhlYXApICpmbmRlY2xzOworICB1bnNpZ25lZCBpbnQgbnVtX3ZlcnNp b25zID0gMDsKKyAgdW5zaWduZWQgaW50IGFjdHVhbF92ZXJzaW9ucyA9IDA7 CisgIHVuc2lnbmVkIGludCBpOworCisgIHN0cnVjdCBfZnVuY3Rpb25fdmVy c2lvbl9pbmZvCisgICAgeworICAgICAgdHJlZSB2ZXJzaW9uX2RlY2w7Cisg ICAgICB0cmVlIHByZWRpY2F0ZV9jaGFpbjsKKyAgICAgIHVuc2lnbmVkIGlu dCBkaXNwYXRjaF9wcmlvcml0eTsKKyAgICB9KmZ1bmN0aW9uX3ZlcnNpb25f aW5mbzsKKworICBnY2NfYXNzZXJ0IChkaXNwYXRjaF9kZWNsICE9IE5VTEwK KwkgICAgICAmJiBmbmRlY2xzX3AgIT0gTlVMTAorCSAgICAgICYmIGVtcHR5 X2JiICE9IE5VTEwpOworCisgIC8qZm5kZWNsc19wIGlzIGFjdHVhbGx5IGEg dmVjdG9yLiAgKi8KKyAgZm5kZWNscyA9IChWRUMgKHRyZWUsIGhlYXApICop Zm5kZWNsc19wOworCisgIC8qIEF0IGxlYXN0IG9uZSBtb3JlIHZlcnNpb24g b3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4gICovCisgIG51bV92ZXJzaW9ucyA9 IFZFQ19sZW5ndGggKHRyZWUsIGZuZGVjbHMpOworICBnY2NfYXNzZXJ0IChu dW1fdmVyc2lvbnMgPj0gMik7CisKKyAgZnVuY3Rpb25fdmVyc2lvbl9pbmZv ID0gKHN0cnVjdCBfZnVuY3Rpb25fdmVyc2lvbl9pbmZvICopCisgICAgWE5F V1ZFQyAoc3RydWN0IF9mdW5jdGlvbl92ZXJzaW9uX2luZm8sIChudW1fdmVy c2lvbnMgLSAxKSk7CisKKyAgLyogVGhlIGZpcnN0IHZlcnNpb24gaW4gdGhl IHZlY3RvciBpcyB0aGUgZGVmYXVsdCBkZWNsLiAgKi8KKyAgZGVmYXVsdF9k ZWNsID0gVkVDX2luZGV4ICh0cmVlLCBmbmRlY2xzLCAwKTsKKworICBwdXNo X2NmdW4gKERFQ0xfU1RSVUNUX0ZVTkNUSU9OIChkaXNwYXRjaF9kZWNsKSk7 CisKKyAgZ3NlcSA9IGJiX3NlcSAoKmVtcHR5X2JiKTsKKyAgLyogRnVuY3Rp b24gdmVyc2lvbiBkaXNwYXRjaCBpcyB2aWEgSUZVTkMuICBJRlVOQyByZXNv bHZlcnMgZmlyZSBiZWZvcmUKKyAgICAgY29uc3RydWN0b3JzLCBzbyBleHBs aWNpdHkgY2FsbCBfX2J1aWx0aW5fY3B1X2luaXQgaGVyZS4gICovCisgIGlm dW5jX2NwdV9pbml0X3N0bXQgPSBnaW1wbGVfYnVpbGRfY2FsbF92ZWMgKAor ICAgICAgICAgICAgICAgICAgICAgaXg4Nl9idWlsdGlucyBbKGludCkgSVg4 Nl9CVUlMVElOX0NQVV9JTklUXSwgTlVMTCk7CisgIGdpbXBsZV9zZXFfYWRk X3N0bXQgKCZnc2VxLCBpZnVuY19jcHVfaW5pdF9zdG10KTsKKyAgZ2ltcGxl X3NldF9iYiAoaWZ1bmNfY3B1X2luaXRfc3RtdCwgKmVtcHR5X2JiKTsKKyAg c2V0X2JiX3NlcSAoKmVtcHR5X2JiLCBnc2VxKTsKKworICBwb3BfY2Z1biAo KTsKKworCisgIGZvciAoaXggPSAxOyBWRUNfaXRlcmF0ZSAodHJlZSwgZm5k ZWNscywgaXgsIGVsZSk7ICsraXgpCisgICAgeworICAgICAgdHJlZSB2ZXJz aW9uX2RlY2wgPSBlbGU7CisgICAgICB0cmVlIHByZWRpY2F0ZV9jaGFpbiA9 IE5VTExfVFJFRTsKKyAgICAgIHVuc2lnbmVkIGludCBwcmlvcml0eTsKKyAg ICAgIC8qIEdldCBhdHRyaWJ1dGUgc3RyaW5nLCBwYXJzZSBpdCBhbmQgZmlu ZCB0aGUgcmlnaHQgcHJlZGljYXRlIGRlY2wuCisgICAgICAgICBUaGUgcHJl ZGljYXRlIGZ1bmN0aW9uIGNvdWxkIGJlIGEgbGVuZ3RoeSBjb21iaW5hdGlv biBvZiBtYW55CisJIGZlYXR1cmVzLCBsaWtlIGFyY2gtdHlwZSBhbmQgdmFy aW91cyBpc2EtdmFyaWFudHMuICAqLworICAgICAgcHJpb3JpdHkgPSBnZXRf YnVpbHRpbl9jb2RlX2Zvcl92ZXJzaW9uICh2ZXJzaW9uX2RlY2wsCisJIAkJ CSAgICAgICAgICAgICAgICZwcmVkaWNhdGVfY2hhaW4pOworCisgICAgICBp ZiAocHJlZGljYXRlX2NoYWluID09IE5VTExfVFJFRSkKKwljb250aW51ZTsK KworICAgICAgYWN0dWFsX3ZlcnNpb25zKys7CisgICAgICBmdW5jdGlvbl92 ZXJzaW9uX2luZm8gW2l4IC0gMV0udmVyc2lvbl9kZWNsID0gdmVyc2lvbl9k ZWNsOworICAgICAgZnVuY3Rpb25fdmVyc2lvbl9pbmZvIFtpeCAtIDFdLnBy ZWRpY2F0ZV9jaGFpbiA9IHByZWRpY2F0ZV9jaGFpbjsKKyAgICAgIGZ1bmN0 aW9uX3ZlcnNpb25faW5mbyBbaXggLSAxXS5kaXNwYXRjaF9wcmlvcml0eSA9 IHByaW9yaXR5OworICAgIH0KKworICAvKiBTb3J0IHRoZSB2ZXJzaW9ucyBh Y2NvcmRpbmcgdG8gZGVzY2VuZGluZyBvcmRlciBvZiBkaXNwYXRjaCBwcmlv cml0eS4gIFRoZQorICAgICBwcmlvcml0eSBpcyBiYXNlZCBvbiB0aGUgSVNB LiAgVGhpcyBpcyBub3QgYSBwZXJmZWN0IHNvbHV0aW9uLiAgVGhlcmUKKyAg ICAgY291bGQgc3RpbGwgYmUgYW1iaWd1aXR5LiAgSWYgbW9yZSB0aGFuIG9u ZSBmdW5jdGlvbiB2ZXJzaW9uIGlzIHN1aXRhYmxlCisgICAgIHRvIGV4ZWN1 dGUsICB3aGljaCBvbmUgc2hvdWxkIGJlIGRpc3BhdGNoZWQ/ICBJbiBmdXR1 cmUsIGFsbG93IHRoZSB1c2VyCisgICAgIHRvIHNwZWNpZnkgYSBkaXNwYXRj aCAgcHJpb3JpdHkgbmV4dCB0byB0aGUgdmVyc2lvbi4gICovCisgIHFzb3J0 IChmdW5jdGlvbl92ZXJzaW9uX2luZm8sIGFjdHVhbF92ZXJzaW9ucywKKyAg ICAgICAgIHNpemVvZiAoc3RydWN0IF9mdW5jdGlvbl92ZXJzaW9uX2luZm8p LCBmZWF0dXJlX2NvbXBhcmUpOworCisgIGZvciAgKGkgPSAwOyBpIDwgYWN0 dWFsX3ZlcnNpb25zOyArK2kpCisgICAgKmVtcHR5X2JiID0gYWRkX2NvbmRp dGlvbl90b19iYiAoZGlzcGF0Y2hfZGVjbCwKKwkJCQkgICAgIGZ1bmN0aW9u X3ZlcnNpb25faW5mb1tpXS52ZXJzaW9uX2RlY2wsCisJCQkJICAgICBmdW5j dGlvbl92ZXJzaW9uX2luZm9baV0ucHJlZGljYXRlX2NoYWluLAorCQkJCSAg ICAgKmVtcHR5X2JiKTsKKworICAvKiBkaXNwYXRjaCBkZWZhdWx0IHZlcnNp b24gYXQgdGhlIGVuZC4gICovCisgICplbXB0eV9iYiA9IGFkZF9jb25kaXRp b25fdG9fYmIgKGRpc3BhdGNoX2RlY2wsIGRlZmF1bHRfZGVjbCwKKwkJCQkg ICBOVUxMLCAqZW1wdHlfYmIpOworCisgIGZyZWUgKGZ1bmN0aW9uX3ZlcnNp b25faW5mbyk7CisgIHJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9u IHJldHVybnMgdHJ1ZSBpZiBGTjEgYW5kIEZOMiBhcmUgdmVyc2lvbnMgb2Yg dGhlIHNhbWUgZnVuY3Rpb24sCisgICB0aGF0IGlzLCB0aGUgdGFyZ2V0cyBv ZiB0aGUgZnVuY3Rpb24gZGVjbHMgYXJlIGRpZmZlcmVudC4gIFRoaXMgYXNz dW1lcworICAgdGhhdCBGTjEgYW5kIEZOMiBoYXZlIHRoZSBzYW1lIHNpZ25h dHVyZS4gICovCisKK3N0YXRpYyBib29sCitpeDg2X2Z1bmN0aW9uX3ZlcnNp b25zICh0cmVlIGZuMSwgdHJlZSBmbjIpCit7CisgIHRyZWUgYXR0cjEsIGF0 dHIyOworICBzdHJ1Y3QgY2xfdGFyZ2V0X29wdGlvbiAqdGFyZ2V0MSwgKnRh cmdldDI7CisKKyAgaWYgKFRSRUVfQ09ERSAoZm4xKSAhPSBGVU5DVElPTl9E RUNMCisgICAgICB8fCBUUkVFX0NPREUgKGZuMikgIT0gRlVOQ1RJT05fREVD TCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXR0cjEgPSBERUNMX0ZVTkNU SU9OX1NQRUNJRklDX1RBUkdFVCAoZm4xKTsKKyAgYXR0cjIgPSBERUNMX0ZV TkNUSU9OX1NQRUNJRklDX1RBUkdFVCAoZm4yKTsKKworICAvKiBBdGxlYXN0 IG9uZSBmdW5jdGlvbiBkZWNsIHNob3VsZCBoYXZlIHRhcmdldCBhdHRyaWJ1 dGUgc3BlY2lmaWVkLiAgKi8KKyAgaWYgKGF0dHIxID09IE5VTExfVFJFRSAm JiBhdHRyMiA9PSBOVUxMX1RSRUUpCisgICAgcmV0dXJuIGZhbHNlOworCisg IGlmIChhdHRyMSA9PSBOVUxMX1RSRUUpCisgICAgYXR0cjEgPSB0YXJnZXRf b3B0aW9uX2RlZmF1bHRfbm9kZTsKKyAgZWxzZSBpZiAoYXR0cjIgPT0gTlVM TF9UUkVFKQorICAgIGF0dHIyID0gdGFyZ2V0X29wdGlvbl9kZWZhdWx0X25v ZGU7CisKKyAgdGFyZ2V0MSA9IFRSRUVfVEFSR0VUX09QVElPTiAoYXR0cjEp OworICB0YXJnZXQyID0gVFJFRV9UQVJHRVRfT1BUSU9OIChhdHRyMik7CisK KyAgLyogdGFyZ2V0MSBhbmQgdGFyZ2V0MiBtdXN0IGJlIGRpZmZlcmVudCBp biBzb21lIHdheS4gICovCisgIGlmICh0YXJnZXQxLT54X2l4ODZfaXNhX2Zs YWdzID09IHRhcmdldDItPnhfaXg4Nl9pc2FfZmxhZ3MKKyAgICAgICYmIHRh cmdldDEtPnhfdGFyZ2V0X2ZsYWdzID09IHRhcmdldDItPnhfdGFyZ2V0X2Zs YWdzCisgICAgICAmJiB0YXJnZXQxLT5hcmNoID09IHRhcmdldDItPmFyY2gK KyAgICAgICYmIHRhcmdldDEtPnR1bmUgPT0gdGFyZ2V0Mi0+dHVuZQorICAg ICAgJiYgdGFyZ2V0MS0+eF9peDg2X2ZwbWF0aCA9PSB0YXJnZXQyLT54X2l4 ODZfZnBtYXRoCisgICAgICAmJiB0YXJnZXQxLT5icmFuY2hfY29zdCA9PSB0 YXJnZXQyLT5icmFuY2hfY29zdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAg cmV0dXJuIHRydWU7Cit9CisKKy8qIENvbXBhcmF0b3IgZnVuY3Rpb24gdG8g YmUgdXNlZCBpbiBxc29ydCByb3V0aW5lIHRvIHNvcnQgYXR0cmlidXRlCisg ICBzcGVjaWZpY2F0aW9uIHN0cmluZ3MgdG8gInRhcmdldCIuICAqLworCitz dGF0aWMgaW50CithdHRyX3N0cmNtcCAoY29uc3Qgdm9pZCAqdjEsIGNvbnN0 IHZvaWQgKnYyKQoreworICBjb25zdCBjaGFyICpjMSA9ICooY2hhciAqY29u c3QqKXYxOworICBjb25zdCBjaGFyICpjMiA9ICooY2hhciAqY29uc3QqKXYy OworICByZXR1cm4gc3RyY21wIChjMSwgYzIpOworfQorCisvKiBTVFIgaXMg dGhlIGFyZ3VtZW50IHRvIHRhcmdldCBhdHRyaWJ1dGUuICBUaGlzIGZ1bmN0 aW9uIHRva2VuaXplcworICAgdGhlIGNvbW1hIHNlcGFyYXRlZCBhcmd1bWVu dHMsIHNvcnRzIHRoZW0gYW5kIHJldHVybnMgYSBzdHJpbmcgd2hpY2gKKyAg IGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb21tYSBzZXBhcmF0 ZWQgYXJndW1lbnRzLiAgIEl0IGFsc28KKyAgIHJlcGxhY2VzIG5vbi1pZGVu dGlmaWVyIGNoYXJhY3RlcnMgIj0sLSIgd2l0aCAiXyIuICAqLworCitzdGF0 aWMgY2hhciAqCitzb3J0ZWRfYXR0cl9zdHJpbmcgKGNvbnN0IGNoYXIgKnN0 cikKK3sKKyAgY2hhciAqKmFyZ3MgPSBOVUxMOworICBjaGFyICphdHRyX3N0 ciwgKnJldF9zdHI7CisgIGNoYXIgKmF0dHIgPSBOVUxMOworICB1bnNpZ25l ZCBpbnQgYXJnbnVtID0gMTsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgZm9y IChpID0gMDsgaSA8IHN0cmxlbiAoc3RyKTsgaSsrKQorICAgIGlmIChzdHJb aV0gPT0gJywnKQorICAgICAgYXJnbnVtKys7CisKKyAgYXR0cl9zdHIgPSAo Y2hhciAqKXhtYWxsb2MgKHN0cmxlbiAoc3RyKSArIDEpOworICBzdHJjcHkg KGF0dHJfc3RyLCBzdHIpOworCisgIC8qIFJlcGxhY2UgIj0sLSIgd2l0aCAi XyIuICAqLworICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuIChhdHRyX3N0cik7 IGkrKykKKyAgICBpZiAoYXR0cl9zdHJbaV0gPT0gJz0nIHx8IGF0dHJfc3Ry W2ldPT0gJy0nKQorICAgICAgYXR0cl9zdHJbaV0gPSAnXyc7CisKKyAgaWYg KGFyZ251bSA9PSAxKQorICAgIHJldHVybiBhdHRyX3N0cjsKKworICBhcmdz ID0gWE5FV1ZFQyAoY2hhciAqLCBhcmdudW0pOworCisgIGkgPSAwOworICBh dHRyID0gc3RydG9rIChhdHRyX3N0ciwgIiwiKTsKKyAgd2hpbGUgKGF0dHIg IT0gTlVMTCkKKyAgICB7CisgICAgICBhcmdzW2ldID0gYXR0cjsKKyAgICAg IGkrKzsKKyAgICAgIGF0dHIgPSBzdHJ0b2sgKE5VTEwsICIsIik7CisgICAg fQorCisgIHFzb3J0IChhcmdzLCBhcmdudW0sIHNpemVvZiAoY2hhciopLCBh dHRyX3N0cmNtcCk7CisKKyAgcmV0X3N0ciA9IChjaGFyICopeG1hbGxvYyAo c3RybGVuIChzdHIpICsgMSk7CisgIHN0cmNweSAocmV0X3N0ciwgYXJnc1sw XSk7CisgIGZvciAoaSA9IDE7IGkgPCBhcmdudW07IGkrKykKKyAgICB7Cisg ICAgICBzdHJjYXQgKHJldF9zdHIsICJfIik7CisgICAgICBzdHJjYXQgKHJl dF9zdHIsIGFyZ3NbaV0pOworICAgIH0KKworICBmcmVlIChhcmdzKTsKKyAg ZnJlZSAoYXR0cl9zdHIpOworICByZXR1cm4gcmV0X3N0cjsKK30KKworLyog VGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBhc3NlbWJsZXIgbmFtZSBmb3Ig ZnVuY3Rpb25zIHRoYXQgYXJlCisgICB2ZXJzaW9ucy4gIElmIERFQ0wgaXMg YSBmdW5jdGlvbiB2ZXJzaW9uIGFuZCBoYXMgYSAidGFyZ2V0IgorICAgYXR0 cmlidXRlLCBpdCBhcHBlbmRzIHRoZSBhdHRyaWJ1dGUgc3RyaW5nIHRvIGl0 cyBhc3NlbWJsZXIgbmFtZS4gICovCisKK3N0YXRpYyB0cmVlCitpeDg2X21h bmdsZV9mdW5jdGlvbl92ZXJzaW9uX2Fzc2VtYmxlcl9uYW1lICh0cmVlIGRl Y2wsIHRyZWUgaWQpCit7CisgIHRyZWUgdmVyc2lvbl9hdHRyOworICBjb25z dCBjaGFyICpvcmlnX25hbWUsICp2ZXJzaW9uX3N0cmluZywgKmF0dHJfc3Ry OworICBjaGFyICphc3NlbWJsZXJfbmFtZTsKKworICBpZiAoREVDTF9ERUNM QVJFRF9JTkxJTkVfUCAoZGVjbCkKKyAgICAgICYmIGxvb2t1cF9hdHRyaWJ1 dGUgKCJnbnVfaW5saW5lIiwKKwkJCSAgIERFQ0xfQVRUUklCVVRFUyAoZGVj bCkpKQorICAgIGVycm9yX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAoZGVj bCksCisJICAgICAgIkZ1bmN0aW9uIHZlcnNpb25zIGNhbm5vdCBiZSBtYXJr ZWQgYXMgZ251X2lubGluZSwiCisJICAgICAgIiBib2RpZXMgaGF2ZSB0byBi ZSBnZW5lcmF0ZWQiKTsKKworICBpZiAoREVDTF9WSVJUVUFMX1AgKGRlY2wp CisgICAgICB8fCBERUNMX1ZJTkRFWCAoZGVjbCkpCisgICAgZXJyb3JfYXQg KERFQ0xfU09VUkNFX0xPQ0FUSU9OIChkZWNsKSwKKwkgICAgICAiVmlydHVh bCBmdW5jdGlvbiB2ZXJzaW9uaW5nIG5vdCBzdXBwb3J0ZWRcbiIpOworCisg IHZlcnNpb25fYXR0ciA9IGxvb2t1cF9hdHRyaWJ1dGUgKCJ0YXJnZXQiLCBE RUNMX0FUVFJJQlVURVMgKGRlY2wpKTsKKworICAvKiB0YXJnZXQgYXR0cmli dXRlIHN0cmluZyBpcyBOVUxMIGZvciBkZWZhdWx0IGZ1bmN0aW9ucy4gICov CisgIGlmICh2ZXJzaW9uX2F0dHIgPT0gTlVMTF9UUkVFKQorICAgIHJldHVy biBpZDsKKworICBvcmlnX25hbWUgPSBJREVOVElGSUVSX1BPSU5URVIgKGlk KTsKKyAgdmVyc2lvbl9zdHJpbmcKKyAgICA9IFRSRUVfU1RSSU5HX1BPSU5U RVIgKFRSRUVfVkFMVUUgKFRSRUVfVkFMVUUgKHZlcnNpb25fYXR0cikpKTsK KworICBhdHRyX3N0ciA9IHNvcnRlZF9hdHRyX3N0cmluZyAodmVyc2lvbl9z dHJpbmcpOworICBhc3NlbWJsZXJfbmFtZSA9IChjaGFyICopIHhtYWxsb2Mg KHN0cmxlbiAob3JpZ19uYW1lKQorCQkJCSAgICAgKyBzdHJsZW4gKGF0dHJf c3RyKSArIDIpOworCisgIHNwcmludGYgKGFzc2VtYmxlcl9uYW1lLCAiJXMu JXMiLCBvcmlnX25hbWUsIGF0dHJfc3RyKTsKKworICAvKiBBbGxvdyBhc3Nl bWJsZXIgbmFtZSB0byBiZSBtb2RpZmllZCBpZiBhbHJlYWR5IHNldC4gICov CisgIGlmIChERUNMX0FTU0VNQkxFUl9OQU1FX1NFVF9QIChkZWNsKSkKKyAg ICBTRVRfREVDTF9SVEwgKGRlY2wsIE5VTEwpOworCisgIHJldHVybiBnZXRf aWRlbnRpZmllciAoYXNzZW1ibGVyX25hbWUpOworfQorCitzdGF0aWMgdHJl ZSAKK2l4ODZfbWFuZ2xlX2RlY2xfYXNzZW1ibGVyX25hbWUgKHRyZWUgZGVj bCwgdHJlZSBpZCkKK3sKKyAgLyogRm9yIGZ1bmN0aW9uIHZlcnNpb24sIGFk ZCB0aGUgdGFyZ2V0IHN1ZmZpeCB0byB0aGUgYXNzZW1ibGVyIG5hbWUuICAq LworICBpZiAoVFJFRV9DT0RFIChkZWNsKSA9PSBGVU5DVElPTl9ERUNMCisg ICAgICAmJiBERUNMX0ZVTkNUSU9OX1ZFUlNJT05FRCAoZGVjbCkpCisgICAg cmV0dXJuIGl4ODZfbWFuZ2xlX2Z1bmN0aW9uX3ZlcnNpb25fYXNzZW1ibGVy X25hbWUgKGRlY2wsIGlkKTsKKworICByZXR1cm4gaWQ7Cit9CisKKy8qIFJl dHVybiBhIG5ldyBuYW1lIGJ5IGFwcGVuZGluZyBTVUZGSVggdG8gdGhlIERF Q0wgbmFtZS4gIElmIG1ha2VfdW5pcXVlCisgICBpcyB0cnVlLCBhcHBlbmQg dGhlIGZ1bGwgcGF0aCBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZS4gICovCisK K3N0YXRpYyBjaGFyICoKK21ha2VfbmFtZSAodHJlZSBkZWNsLCBjb25zdCBj aGFyICpzdWZmaXgsIGJvb2wgbWFrZV91bmlxdWUpCit7CisgIGNoYXIgKmds b2JhbF92YXJfbmFtZTsKKyAgaW50IG5hbWVfbGVuOworICBjb25zdCBjaGFy ICpuYW1lOworICBjb25zdCBjaGFyICp1bmlxdWVfbmFtZSA9IE5VTEw7CisK KyAgbmFtZSA9IElERU5USUZJRVJfUE9JTlRFUiAoREVDTF9BU1NFTUJMRVJf TkFNRSAoZGVjbCkpOworCisgIC8qIEdldCBhIHVuaXF1ZSBuYW1lIHRoYXQg Y2FuIGJlIHVzZWQgZ2xvYmFsbHkgd2l0aG91dCBhbnkgY2hhbmNlcworICAg ICBvZiBjb2xsaXNpb24gYXQgbGluayB0aW1lLiAgKi8KKyAgaWYgKG1ha2Vf dW5pcXVlKQorICAgIHVuaXF1ZV9uYW1lID0gSURFTlRJRklFUl9QT0lOVEVS IChnZXRfZmlsZV9mdW5jdGlvbl9uYW1lICgiXDAiKSk7CisKKyAgbmFtZV9s ZW4gPSBzdHJsZW4gKG5hbWUpICsgc3RybGVuIChzdWZmaXgpICsgMjsKKwor ICBpZiAobWFrZV91bmlxdWUpCisgICAgbmFtZV9sZW4gKz0gc3RybGVuICh1 bmlxdWVfbmFtZSkgKyAxOworICBnbG9iYWxfdmFyX25hbWUgPSBYTkVXVkVD IChjaGFyLCBuYW1lX2xlbik7CisKKyAgLyogVXNlICcuJyB0byBjb25jYXRl bmF0ZSBuYW1lcyBhcyBpdCBpcyBkZW1hbmdsZXIgZnJpZW5kbHkuICAqLwor ICBpZiAobWFrZV91bmlxdWUpCisgICAgICBzbnByaW50ZiAoZ2xvYmFsX3Zh cl9uYW1lLCBuYW1lX2xlbiwgIiVzLiVzLiVzIiwgbmFtZSwKKwkJdW5pcXVl X25hbWUsIHN1ZmZpeCk7CisgIGVsc2UKKyAgICAgIHNucHJpbnRmIChnbG9i YWxfdmFyX25hbWUsIG5hbWVfbGVuLCAiJXMuJXMiLCBuYW1lLCBzdWZmaXgp OworCisgIHJldHVybiBnbG9iYWxfdmFyX25hbWU7Cit9CisKKy8qIE1ha2Ug YSBkaXNwYXRjaGVyIGRlY2xhcmF0aW9uIGZvciB0aGUgbXVsdGktdmVyc2lv bmVkIGZ1bmN0aW9uIERFQ0wuCisgICBDYWxscyB0byBERUNMIGZ1bmN0aW9u IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBjYWxscyB0byB0aGUgZGlzcGF0Y2hl cgorICAgYnkgdGhlIGZyb250LWVuZC4gIFJldHVybiB0aGUgZGVjbCBjcmVh dGVkLiAgKi8KKworc3RhdGljIHRyZWUKK21ha2VfZGlzcGF0Y2hlcl9kZWNs IChjb25zdCB0cmVlIGRlY2wpCit7CisgIHRyZWUgZnVuY19kZWNsOworICBj aGFyICpmdW5jX25hbWUsICpyZXNvbHZlcl9uYW1lOworICB0cmVlIGZuX3R5 cGUsIGZ1bmNfdHlwZTsKKyAgYm9vbCBpc191bmlxID0gZmFsc2U7CisKKyAg aWYgKFRSRUVfUFVCTElDIChkZWNsKSA9PSAwKQorICAgIGlzX3VuaXEgPSB0 cnVlOworCisgIGZ1bmNfbmFtZSA9IG1ha2VfbmFtZSAoZGVjbCwgImlmdW5j IiwgaXNfdW5pcSk7CisgIHJlc29sdmVyX25hbWUgPSBtYWtlX25hbWUgKGRl Y2wsICJyZXNvbHZlciIsIGlzX3VuaXEpOworICBnY2NfYXNzZXJ0IChyZXNv bHZlcl9uYW1lKTsKKworICBmbl90eXBlID0gVFJFRV9UWVBFIChkZWNsKTsK KyAgZnVuY190eXBlID0gYnVpbGRfZnVuY3Rpb25fdHlwZSAoVFJFRV9UWVBF IChmbl90eXBlKSwKKwkJCQkgICBUWVBFX0FSR19UWVBFUyAoZm5fdHlwZSkp OworICAKKyAgZnVuY19kZWNsID0gYnVpbGRfZm5fZGVjbCAoZnVuY19uYW1l LCBmdW5jX3R5cGUpOworICBUUkVFX1VTRUQgKGZ1bmNfZGVjbCkgPSAxOwor ICBERUNMX0NPTlRFWFQgKGZ1bmNfZGVjbCkgPSBOVUxMX1RSRUU7CisgIERF Q0xfSU5JVElBTCAoZnVuY19kZWNsKSA9IGVycm9yX21hcmtfbm9kZTsKKyAg REVDTF9BUlRJRklDSUFMIChmdW5jX2RlY2wpID0gMTsKKyAgLyogTWFyayB0 aGlzIGZ1bmMgYXMgZXh0ZXJuYWwsIHRoZSByZXNvbHZlciB3aWxsIGZsaXAg aXQgYWdhaW4gaWYKKyAgICAgaXQgZ2V0cyBnZW5lcmF0ZWQuICAqLworICBE RUNMX0VYVEVSTkFMIChmdW5jX2RlY2wpID0gMTsKKyAgLyogVGhpcyB3aWxs IGJlIG9mIHR5cGUgSUZVTkNzIGhhdmUgdG8gYmUgZXh0ZXJuYWxseSB2aXNp YmxlLiAgKi8KKyAgVFJFRV9QVUJMSUMgKGZ1bmNfZGVjbCkgPSAxOworCisg IHJldHVybiBmdW5jX2RlY2w7ICAKK30KKworLyogUmV0dXJucyB0cnVlIGlm IGRlY2wgaXMgbXVsdGktdmVyc2lvbmVkIGFuZCBERUNMIGlzIHRoZSBkZWZh dWx0IGZ1bmN0aW9uLAorICAgdGhhdCBpcyBpdCBpcyBub3QgdGFnZ2VkIHdp dGggdGFyZ2V0IHNwZWNpZmljIG9wdGltaXphdGlvbi4gICovCisKK3N0YXRp YyBib29sCitpc19mdW5jdGlvbl9kZWZhdWx0X3ZlcnNpb24gKGNvbnN0IHRy ZWUgZGVjbCkKK3sKKyAgcmV0dXJuIChUUkVFX0NPREUgKGRlY2wpID09IEZV TkNUSU9OX0RFQ0wKKwkgICYmIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChk ZWNsKQorCSAgJiYgREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJHRVQgKGRl Y2wpID09IE5VTExfVFJFRSk7Cit9CisKKy8qIE1ha2UgYSBkaXNwYXRjaGVy IGRlY2xhcmF0aW9uIGZvciB0aGUgbXVsdGktdmVyc2lvbmVkIGZ1bmN0aW9u IERFQ0wuCisgICBDYWxscyB0byBERUNMIGZ1bmN0aW9uIHdpbGwgYmUgcmVw bGFjZWQgd2l0aCBjYWxscyB0byB0aGUgZGlzcGF0Y2hlcgorICAgYnkgdGhl IGZyb250LWVuZC4gIEl0IGFsc28gY2hhaW5zIHRoZSBjZ3JhcGggbm9kZXMg b2YgYWxsIHRoZQorICAgc2VtYW50aWNhbGx5IGlkZW50aWNhbCB2ZXJzaW9u cyBpbiB2ZWN0b3IgRk5fVkVSX1ZFQ19QLiAgUmV0dXJucyB0aGUKKyAgIGRl Y2wgb2YgdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24uICAqLworCitzdGF0aWMg dHJlZQoraXg4Nl9nZXRfZnVuY3Rpb25fdmVyc2lvbnNfZGlzcGF0Y2hlciAo dm9pZCAqZm5fdmVyX3ZlY19wKQoreworICBzdHJ1Y3QgY2dyYXBoX25vZGUg Km5vZGUgPSBOVUxMOworICBzdHJ1Y3QgY2dyYXBoX25vZGUgKmRlZmF1bHRf bm9kZSA9IE5VTEw7CisgIHN0cnVjdCBjZ3JhcGhfbm9kZSAqZGlzcGF0Y2hl cl9ub2RlID0gTlVMTDsKKyAgaW50IGl4OworICB0cmVlIGVsZTsKKyAgdHJl ZSBkaXNwYXRjaF9kZWNsID0gTlVMTDsKKyAgVkVDICh0cmVlLCBoZWFwKSAq Zm5fdmVyX3ZlYyA9IE5VTEw7CisKKyAgZm5fdmVyX3ZlYyA9IChWRUMgKHRy ZWUsaGVhcCkgKikgZm5fdmVyX3ZlY19wOworICBnY2NfYXNzZXJ0IChmbl92 ZXJfdmVjICE9IE5VTEwpOworCisgIC8qIEZpbmQgdGhlIGRlZmF1bHQgdmVy c2lvbi4gICovCisgIGZvciAoaXggPSAwOyBWRUNfaXRlcmF0ZSAodHJlZSwg Zm5fdmVyX3ZlYywgaXgsIGVsZSk7ICsraXgpCisgICAgeworICAgICAgaWYg KGlzX2Z1bmN0aW9uX2RlZmF1bHRfdmVyc2lvbiAoZWxlKSkKKwl7CisJICBk ZWZhdWx0X25vZGUgPSBjZ3JhcGhfZ2V0X2NyZWF0ZV9ub2RlIChlbGUpOwor CSAgYnJlYWs7CisJfQorICAgIH0KKworICAvKiBJZiB0aGVyZSBpcyBubyBk ZWZhdWx0IG5vZGUsIGp1c3QgcmV0dXJuIE5VTEwuICAqLworICBpZiAoIWRl ZmF1bHRfbm9kZSkKKyAgICByZXR1cm4gTlVMTDsKKworICAvKiBJZiB0aGUg ZGlzcGF0Y2hlciBpcyBhbHJlYWR5IHRoZXJlLCByZXR1cm4gaXQuICAqLwor ICBpZiAoZGVmYXVsdF9ub2RlLT5mdW5jdGlvbl92ZXJzaW9uCisgICAgICAm JiBkZWZhdWx0X25vZGUtPmZ1bmN0aW9uX3ZlcnNpb24tPmRpc3BhdGNoZXJf cmVzb2x2ZXIpCisgICAgcmV0dXJuIGRlZmF1bHRfbm9kZS0+ZnVuY3Rpb25f dmVyc2lvbi0+ZGlzcGF0Y2hlcl9yZXNvbHZlcjsKKworICBpZiAoZGVmYXVs dF9ub2RlLT5mdW5jdGlvbl92ZXJzaW9uID09IE5VTEwpCisgICAgZGVmYXVs dF9ub2RlLT5mdW5jdGlvbl92ZXJzaW9uCisgICAgICA9IGdnY19hbGxvY19j bGVhcmVkX2NncmFwaF9mdW5jdGlvbl92ZXJzaW9uX2luZm8gKCk7CisKKyNp ZiBkZWZpbmVkIChBU01fT1VUUFVUX1RZUEVfRElSRUNUSVZFKSAmJiBIQVZF X0dOVV9JTkRJUkVDVF9GVU5DVElPTgorICAvKiBSaWdodCBub3csIHRoZSBk aXNwYXRjaGluZyBpcyBkb25lIHZpYSBpZnVuYy4gICovCisgIGRpc3BhdGNo X2RlY2wgPSBtYWtlX2Rpc3BhdGNoZXJfZGVjbCAoZGVmYXVsdF9ub2RlLT5z eW1ib2wuZGVjbCk7IAorI2Vsc2UKKyAgZXJyb3JfYXQgKERFQ0xfU09VUkNF X0xPQ0FUSU9OIChkZWZhdWx0X25vZGUtPnN5bWJvbC5kZWNsKSwKKwkgICAg Ik11bHRpdmVyc2lvbmluZyBuZWVkcyBpZnVuYyB3aGljaCBpcyBub3Qgc3Vw cG9ydGVkICIKKwkgICAgImluIHRoaXMgY29uZmlndXJhdGlvbiIpOworI2Vu ZGlmCisgIGRlZmF1bHRfbm9kZS0+ZnVuY3Rpb25fdmVyc2lvbi0+ZGlzcGF0 Y2hlcl9yZXNvbHZlciA9IGRpc3BhdGNoX2RlY2w7CisgIGRpc3BhdGNoZXJf bm9kZSA9IGNncmFwaF9nZXRfY3JlYXRlX25vZGUgKGRpc3BhdGNoX2RlY2wp OworICBnY2NfYXNzZXJ0IChkaXNwYXRjaGVyX25vZGUpOworICBkaXNwYXRj aGVyX25vZGUtPmRpc3BhdGNoZXJfZnVuY3Rpb24gPSAxOworICBkaXNwYXRj aGVyX25vZGUtPmZ1bmN0aW9uX3ZlcnNpb24KKyAgICA9IGdnY19hbGxvY19j bGVhcmVkX2NncmFwaF9mdW5jdGlvbl92ZXJzaW9uX2luZm8gKCk7CisgIGNn cmFwaF9tYXJrX2FkZHJlc3NfdGFrZW5fbm9kZSAoZGVmYXVsdF9ub2RlKTsK KworICBmb3IgKGl4ID0gMDsgVkVDX2l0ZXJhdGUgKHRyZWUsIGZuX3Zlcl92 ZWMsIGl4LCBlbGUpOyArK2l4KQorICAgIHsKKyAgICAgIG5vZGUgPSBjZ3Jh cGhfZ2V0X2NyZWF0ZV9ub2RlIChlbGUpOworICAgICAgZ2NjX2Fzc2VydCAo bm9kZSAhPSBOVUxMICYmIERFQ0xfRlVOQ1RJT05fVkVSU0lPTkVEIChlbGUp KTsKKworICAgICAgaWYgKG5vZGUgPT0gZGVmYXVsdF9ub2RlKQorCWNvbnRp bnVlOworCisgICAgICBpZiAobm9kZS0+ZnVuY3Rpb25fdmVyc2lvbiA9PSBO VUxMKQorCW5vZGUtPmZ1bmN0aW9uX3ZlcnNpb24KKwkgID0gZ2djX2FsbG9j X2NsZWFyZWRfY2dyYXBoX2Z1bmN0aW9uX3ZlcnNpb25faW5mbyAoKTsKKwor ICAgICAgZ2NjX2Fzc2VydCAoREVDTF9GVU5DVElPTl9TUEVDSUZJQ19UQVJH RVQgKGVsZSkgIT0gTlVMTF9UUkVFKTsKKworICAgICAgaWYgKGRpc3BhdGNo ZXJfbm9kZS0+ZnVuY3Rpb25fdmVyc2lvbi0+bmV4dCkKKyAJeworCSAgc3Ry dWN0IGNncmFwaF9ub2RlICpkaXNwYXRjaGVyX25vZGVfbmV4dAorCSAgICA9 IGRpc3BhdGNoZXJfbm9kZS0+ZnVuY3Rpb25fdmVyc2lvbi0+bmV4dDsKKwkg IG5vZGUtPmZ1bmN0aW9uX3ZlcnNpb24tPm5leHQgPSBkaXNwYXRjaGVyX25v ZGVfbmV4dDsKKwkgIGRpc3BhdGNoZXJfbm9kZV9uZXh0LT5mdW5jdGlvbl92 ZXJzaW9uLT5wcmV2ID0gbm9kZTsKKwl9CisKKyAgICAgIGRpc3BhdGNoZXJf bm9kZS0+ZnVuY3Rpb25fdmVyc2lvbi0+bmV4dCA9IG5vZGU7CisgICAgICBu b2RlLT5mdW5jdGlvbl92ZXJzaW9uLT5wcmV2ID0gZGlzcGF0Y2hlcl9ub2Rl OworICAgICAgbm9kZS0+ZnVuY3Rpb25fdmVyc2lvbi0+ZGlzcGF0Y2hlcl9y ZXNvbHZlciA9IGRpc3BhdGNoX2RlY2w7CisgICAgfQorCisgIC8qIFRoZSBk ZWZhdWx0IHZlcnNpb24gc2hvdWxkIGJlIHRoZSBmaXJzdCBub2RlLiAgKi8K KyAgZGVmYXVsdF9ub2RlLT5mdW5jdGlvbl92ZXJzaW9uLT5uZXh0ID0gZGlz cGF0Y2hlcl9ub2RlLT5mdW5jdGlvbl92ZXJzaW9uLT5uZXh0OworICAoZGlz cGF0Y2hlcl9ub2RlLT5mdW5jdGlvbl92ZXJzaW9uLT5uZXh0KS0+ZnVuY3Rp b25fdmVyc2lvbi0+cHJldgorICAgICA9IGRlZmF1bHRfbm9kZTsKKyAgLyog VGhlIGRpc3BhdGNoZXIgbm9kZSBzaG91bGQgZGlyZWN0bHkgcG9pbnQgdG8g dGhlIGRlZmF1bHQgbm9kZS4gICovCisgIGRpc3BhdGNoZXJfbm9kZS0+ZnVu Y3Rpb25fdmVyc2lvbi0+bmV4dCA9IGRlZmF1bHRfbm9kZTsKKyAgCisgIHJl dHVybiBkaXNwYXRjaF9kZWNsOworfQorCisvKiBNYWtlcyBhIGZ1bmN0aW9u IGF0dHJpYnV0ZSBvZiB0aGUgZm9ybSBOQU1FKEFSR19OQU1FKSBhbmQgY2hh aW5zCisgICBpdCB0byBDSEFJTi4gICovCisKK3N0YXRpYyB0cmVlCittYWtl X2F0dHJpYnV0ZSAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJn X25hbWUsIHRyZWUgY2hhaW4pCit7CisgIHRyZWUgYXR0cl9uYW1lOworICB0 cmVlIGF0dHJfYXJnX25hbWU7CisgIHRyZWUgYXR0cl9hcmdzOworICB0cmVl IGF0dHI7CisKKyAgYXR0cl9uYW1lID0gZ2V0X2lkZW50aWZpZXIgKG5hbWUp OworICBhdHRyX2FyZ19uYW1lID0gYnVpbGRfc3RyaW5nIChzdHJsZW4gKGFy Z19uYW1lKSwgYXJnX25hbWUpOworICBhdHRyX2FyZ3MgPSB0cmVlX2NvbnMg KE5VTExfVFJFRSwgYXR0cl9hcmdfbmFtZSwgTlVMTF9UUkVFKTsKKyAgYXR0 ciA9IHRyZWVfY29ucyAoYXR0cl9uYW1lLCBhdHRyX2FyZ3MsIGNoYWluKTsK KyAgcmV0dXJuIGF0dHI7Cit9CisKKy8qIE1ha2UgdGhlIHJlc29sdmVyIGZ1 bmN0aW9uIGRlY2wgdG8gZGlzcGF0Y2ggdGhlIHZlcnNpb25zIG9mCisgICBh IG11bHRpLXZlcnNpb25lZCBmdW5jdGlvbiwgIERFRkFVTFRfREVDTC4gIENy ZWF0ZSBhbgorICAgZW1wdHkgYmFzaWMgYmxvY2sgaW4gdGhlIHJlc29sdmVy IGFuZCBzdG9yZSB0aGUgcG9pbnRlciBpbgorICAgRU1QVFlfQkIuICBSZXR1 cm4gdGhlIGRlY2wgb2YgdGhlIHJlc29sdmVyIGZ1bmN0aW9uLiAgKi8KKwor c3RhdGljIHRyZWUKK21ha2VfcmVzb2x2ZXJfZnVuYyAoY29uc3QgdHJlZSBk ZWZhdWx0X2RlY2wsCisJCSAgICBjb25zdCB0cmVlIGRpc3BhdGNoX2RlY2ws CisJCSAgICBiYXNpY19ibG9jayAqZW1wdHlfYmIpCit7CisgIGNoYXIgKnJl c29sdmVyX25hbWU7CisgIHRyZWUgZGVjbCwgdHlwZSwgZGVjbF9uYW1lLCB0 OworICBiYXNpY19ibG9jayBuZXdfYmI7CisgIGJvb2wgaXNfdW5pcSA9IGZh bHNlOworCisgIC8qIElGVU5DJ3MgaGF2ZSB0byBiZSBnbG9iYWxseSB2aXNp YmxlLiAgU28sIGlmIHRoZSBkZWZhdWx0X2RlY2wgaXMKKyAgICAgbm90LCB0 aGVuIHRoZSBuYW1lIG9mIHRoZSBJRlVOQyBzaG91bGQgYmUgbWFkZSB1bmlx dWUuICAqLworICBpZiAoVFJFRV9QVUJMSUMgKGRlZmF1bHRfZGVjbCkgPT0g MCkKKyAgICBpc191bmlxID0gdHJ1ZTsKKworICAvKiBBcHBlbmQgdGhlIGZp bGVuYW1lIHRvIHRoZSByZXNvbHZlciBmdW5jdGlvbiBpZiB0aGUgdmVyc2lv bnMgYXJlCisgICAgIG5vdCBleHRlcm5hbGx5IHZpc2libGUuICBUaGlzIGlz IGJlY2F1c2UgdGhlIHJlc29sdmVyIGZ1bmN0aW9uIGhhcworICAgICB0byBi ZSBleHRlcm5hbGx5IHZpc2libGUgZm9yIHRoZSBsb2FkZXIgdG8gZmluZCBp dC4gIFNvLCBhcHBlbmRpbmcKKyAgICAgdGhlIGZpbGVuYW1lIHdpbGwgcHJl dmVudCBjb25mbGljdHMgd2l0aCBhIHJlc29sdmVyIGZ1bmN0aW9uIGZyb20K KyAgICAgYW5vdGhlciBtb2R1bGUgd2hpY2ggaXMgYmFzZWQgb24gdGhlIHNh bWUgdmVyc2lvbiBuYW1lLiAgKi8KKyAgcmVzb2x2ZXJfbmFtZSA9IG1ha2Vf bmFtZSAoZGVmYXVsdF9kZWNsLCAicmVzb2x2ZXIiLCBpc191bmlxKTsKKwor ICAvKiBUaGUgcmVzb2x2ZXIgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBhICh2 b2lkICopLiAqLworICB0eXBlID0gYnVpbGRfZnVuY3Rpb25fdHlwZV9saXN0 IChwdHJfdHlwZV9ub2RlLCBOVUxMX1RSRUUpOworCisgIGRlY2wgPSBidWls ZF9mbl9kZWNsIChyZXNvbHZlcl9uYW1lLCB0eXBlKTsKKyAgZGVjbF9uYW1l ID0gZ2V0X2lkZW50aWZpZXIgKHJlc29sdmVyX25hbWUpOworICBTRVRfREVD TF9BU1NFTUJMRVJfTkFNRSAoZGVjbCwgZGVjbF9uYW1lKTsKKworICBERUNM X05BTUUgKGRlY2wpID0gZGVjbF9uYW1lOworICBUUkVFX1VTRUQgKGRlY2wp ID0gMTsKKyAgREVDTF9BUlRJRklDSUFMIChkZWNsKSA9IDE7CisgIERFQ0xf SUdOT1JFRF9QIChkZWNsKSA9IDA7CisgIC8qIElGVU5DIHJlc29sdmVycyBo YXZlIHRvIGJlIGV4dGVybmFsbHkgdmlzaWJsZS4gICovCisgIFRSRUVfUFVC TElDIChkZWNsKSA9IDE7CisgIERFQ0xfVU5JTkxJTkFCTEUgKGRlY2wpID0g MTsKKworICBERUNMX0VYVEVSTkFMIChkZWNsKSA9IDA7CisgIERFQ0xfRVhU RVJOQUwgKGRpc3BhdGNoX2RlY2wpID0gMDsKKworICBERUNMX0NPTlRFWFQg KGRlY2wpID0gTlVMTF9UUkVFOworICBERUNMX0lOSVRJQUwgKGRlY2wpID0g bWFrZV9ub2RlIChCTE9DSyk7CisgIERFQ0xfU1RBVElDX0NPTlNUUlVDVE9S IChkZWNsKSA9IDA7CisgIFRSRUVfUkVBRE9OTFkgKGRlY2wpID0gMDsKKyAg REVDTF9QVVJFX1AgKGRlY2wpID0gMDsKKworICBpZiAoREVDTF9DT01EQVRf R1JPVVAgKGRlZmF1bHRfZGVjbCkpCisgICAgeworICAgICAgREVDTF9DT01E QVQgKGRlY2wpID0gREVDTF9DT01EQVQgKGRlZmF1bHRfZGVjbCk7CisgICAg ICBtYWtlX2RlY2xfb25lX29ubHkgKGRlY2wsIERFQ0xfQ09NREFUX0dST1VQ IChkZWZhdWx0X2RlY2wpKTsKKyAgICB9CisgIGVsc2UgaWYgKFRSRUVfUFVC TElDIChkZWZhdWx0X2RlY2wpKQorICAgIHsKKyAgICAgIC8qIEluIHRoaXMg Y2FzZSwgZWFjaCB0cmFuc2xhdGlvbiB1bml0IHdpdGggYSBjYWxsIHRvIHRo aXMKKwkgdmVyc2lvbmVkIGZ1bmN0aW9uIHdpbGwgcHV0IG91dCBhIHJlc29s dmVyLiAgRW5zdXJlIGl0CisJIGlzIGNvbWRhdCB0byBrZWVwIGp1c3Qgb25l IGNvcHkuICAqLworICAgICAgREVDTF9DT01EQVQgKGRlY2wpID0gMTsKKyAg ICAgIG1ha2VfZGVjbF9vbmVfb25seSAoZGVjbCwgREVDTF9BU1NFTUJMRVJf TkFNRSAoZGVjbCkpOworICAgIH0KKyAgLyogQnVpbGQgcmVzdWx0IGRlY2wg YW5kIGFkZCB0byBmdW5jdGlvbl9kZWNsLiAqLworICB0ID0gYnVpbGRfZGVj bCAoVU5LTk9XTl9MT0NBVElPTiwgUkVTVUxUX0RFQ0wsIE5VTExfVFJFRSwg cHRyX3R5cGVfbm9kZSk7CisgIERFQ0xfQVJUSUZJQ0lBTCAodCkgPSAxOwor ICBERUNMX0lHTk9SRURfUCAodCkgPSAxOworICBERUNMX1JFU1VMVCAoZGVj bCkgPSB0OworCisgIGdpbXBsaWZ5X2Z1bmN0aW9uX3RyZWUgKGRlY2wpOwor ICBwdXNoX2NmdW4gKERFQ0xfU1RSVUNUX0ZVTkNUSU9OIChkZWNsKSk7Cisg IGdpbXBsZV9yZWdpc3Rlcl9jZmdfaG9va3MgKCk7CisgIGluaXRfZW1wdHlf dHJlZV9jZmdfZm9yX2Z1bmN0aW9uIChERUNMX1NUUlVDVF9GVU5DVElPTiAo ZGVjbCkpOworICBjZnVuLT5jdXJyX3Byb3BlcnRpZXMgfD0KKyAgICAoUFJP UF9naW1wbGVfbGNmIHwgUFJPUF9naW1wbGVfbGVoIHwgUFJPUF9jZmcgfCBQ Uk9QX3NzYQorICAgICB8IFBST1BfZ2ltcGxlX2FueSk7CisgIGNmdW4tPmN1 cnJfcHJvcGVydGllcyA9IDE1OworICBuZXdfYmIgPSBjcmVhdGVfZW1wdHlf YmIgKEVOVFJZX0JMT0NLX1BUUik7CisgIG1ha2VfZWRnZSAoRU5UUllfQkxP Q0tfUFRSLCBuZXdfYmIsIEVER0VfRkFMTFRIUlUpOworICBtYWtlX2VkZ2Ug KG5ld19iYiwgRVhJVF9CTE9DS19QVFIsIDApOworICAqZW1wdHlfYmIgPSBu ZXdfYmI7CisKKyAgY2dyYXBoX2FkZF9uZXdfZnVuY3Rpb24gKGRlY2wsIHRy dWUpOworICBjZ3JhcGhfY2FsbF9mdW5jdGlvbl9pbnNlcnRpb25faG9va3Mg KGNncmFwaF9nZXRfY3JlYXRlX25vZGUgKGRlY2wpKTsKKworICBpZiAoREVD TF9DT01EQVRfR1JPVVAgKGRlZmF1bHRfZGVjbCkpCisgICAgeworICAgICAg Z2NjX2Fzc2VydCAoY2dyYXBoX2dldF9ub2RlIChkZWZhdWx0X2RlY2wpKTsK KyAgICAgIHN5bXRhYl9hZGRfdG9fc2FtZV9jb21kYXRfZ3JvdXAgKAorCShz eW10YWJfbm9kZSkgY2dyYXBoX2dldF9ub2RlIChkZWNsKSwKKwkoc3ltdGFi X25vZGUpIGNncmFwaF9nZXRfbm9kZSAoZGVmYXVsdF9kZWNsKSk7CisgICAg fQorCisgIHBvcF9jZnVuICgpOworCisgIGdjY19hc3NlcnQgKGRpc3BhdGNo X2RlY2wgIT0gTlVMTCk7CisgIC8qIE1hcmsgZGlzcGF0Y2hfZGVjbCBhcyAi aWZ1bmMiIHdpdGggcmVzb2x2ZXIgYXMgcmVzb2x2ZXJfbmFtZS4gICovCisg IERFQ0xfQVRUUklCVVRFUyAoZGlzcGF0Y2hfZGVjbCkgCisgICAgPSBtYWtl X2F0dHJpYnV0ZSAoImlmdW5jIiwgcmVzb2x2ZXJfbmFtZSwgREVDTF9BVFRS SUJVVEVTIChkaXNwYXRjaF9kZWNsKSk7CisKKyAgLyogQ3JlYXRlIHRoZSBh bGlhcyBmb3IgZGlzcGF0Y2ggdG8gcmVzb2x2ZXIgaGVyZS4gICovCisgIGNn cmFwaF9jcmVhdGVfZnVuY3Rpb25fYWxpYXMgKGRpc3BhdGNoX2RlY2wsIGRl Y2wpOworICByZXR1cm4gZGVjbDsKK30KKworLyogR2VuZXJhdGUgdGhlIGRp c3BhdGNoaW5nIGNvZGUgYm9keSB0byBkaXNwYXRjaCBtdWx0aS12ZXJzaW9u ZWQgZnVuY3Rpb24KKyAgIERFQ0wuICBUaGUgdGFyZ2V0IGhvb2sgaXMgY2Fs bGVkIHRvIHByb2Nlc3MgdGhlICJ0YXJnZXQiIGF0dHJpYnV0ZXMgYW5kCisg ICBwcm92aWRlIHRoZSBjb2RlIHRvIGRpc3BhdGNoIHRoZSByaWdodCBmdW5j dGlvbiBhdCBydW4tdGltZS4gIE5PREUgcG9pbnRzCisgICB0byB0aGUgZGlz cGF0Y2hlciBkZWNsIHdob3NlIGJvZHkgd2lsbCBiZSBjcmVhdGVkLiAgKi8K Kworc3RhdGljIHRyZWUgCitpeDg2X2dlbmVyYXRlX3ZlcnNpb25fZGlzcGF0 Y2hlcl9ib2R5ICh2b2lkICpub2RlX3ApCit7CisgIHRyZWUgcmVzb2x2ZXJf ZGVjbDsKKyAgYmFzaWNfYmxvY2sgZW1wdHlfYmI7CisgIFZFQyAodHJlZSwg aGVhcCkgKmZuX3Zlcl92ZWMgPSBOVUxMOworICB0cmVlIGRlZmF1bHRfdmVy X2RlY2w7CisgIHN0cnVjdCBjZ3JhcGhfbm9kZSAqdmVyc247CisgIHN0cnVj dCBjZ3JhcGhfbm9kZSAqbm9kZTsKKworICBub2RlID0gKGNncmFwaF9ub2Rl ICopbm9kZV9wOworCisgIGdjY19hc3NlcnQgKG5vZGUtPmRpc3BhdGNoZXJf ZnVuY3Rpb24KKwkgICAgICAmJiAobm9kZS0+ZnVuY3Rpb25fdmVyc2lvbiAh PSBOVUxMKSk7CisKKyAgaWYgKG5vZGUtPmZ1bmN0aW9uX3ZlcnNpb24tPmRp c3BhdGNoZXJfcmVzb2x2ZXIpCisgICAgcmV0dXJuIG5vZGUtPmZ1bmN0aW9u X3ZlcnNpb24tPmRpc3BhdGNoZXJfcmVzb2x2ZXI7CisKKyAgZGVmYXVsdF92 ZXJfZGVjbCA9IChub2RlLT5mdW5jdGlvbl92ZXJzaW9uLT5uZXh0KS0+c3lt Ym9sLmRlY2w7CisgIHJlc29sdmVyX2RlY2wgPSBtYWtlX3Jlc29sdmVyX2Z1 bmMgKGRlZmF1bHRfdmVyX2RlY2wsCisJCQkJICAgICAgbm9kZS0+c3ltYm9s LmRlY2wsICZlbXB0eV9iYik7CisgIG5vZGUtPmZ1bmN0aW9uX3ZlcnNpb24t PmRpc3BhdGNoZXJfcmVzb2x2ZXIgPSByZXNvbHZlcl9kZWNsOworCisgIHB1 c2hfY2Z1biAoREVDTF9TVFJVQ1RfRlVOQ1RJT04gKHJlc29sdmVyX2RlY2wp KTsKKworICBmbl92ZXJfdmVjID0gVkVDX2FsbG9jICh0cmVlLCBoZWFwLCAy KTsKKworICBmb3IgKHZlcnNuID0gbm9kZS0+ZnVuY3Rpb25fdmVyc2lvbi0+ bmV4dDsgdmVyc247CisgICAgICAgdmVyc24gPSB2ZXJzbi0+ZnVuY3Rpb25f dmVyc2lvbi0+bmV4dCkKKyAgICB7CisgICAgICAvKiBDaGVjayBmb3Igdmly dHVhbCBmdW5jdGlvbnMgaGVyZSBhZ2FpbiwgYXMgYnkgdGhpcyB0aW1lIGl0 IHNob3VsZAorCSBoYXZlIGJlZW4gZGV0ZXJtaW5lZCBpZiB0aGlzIGZ1bmN0 aW9uIG5lZWRzIGEgdnRhYmxlIGluZGV4IG9yCisJIG5vdC4gIFRoaXMgaGFw cGVucyBmb3IgbWV0aG9kcyBpbiBkZXJpdmVkIGNsYXNzZXMgdGhhdCBvdmVy cmlkZQorCSB2aXJ0dWFsIG1ldGhvZHMgaW4gYmFzZSBjbGFzc2VzIGJ1dCBh cmUgbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzCisJIHZpcnR1YWwuICAqLwor ICAgICAgaWYgKERFQ0xfVklOREVYICh2ZXJzbi0+c3ltYm9sLmRlY2wpKQor ICAgICAgICBlcnJvcl9hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKHZlcnNu LT5zeW1ib2wuZGVjbCksCisJCSAgIlZpcnR1YWwgZnVuY3Rpb24gbXVsdGl2 ZXJzaW9uaW5nIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIFZFQ19zYWZlX3B1 c2ggKHRyZWUsIGhlYXAsIGZuX3Zlcl92ZWMsIHZlcnNuLT5zeW1ib2wuZGVj bCk7CisgICAgICBnY2NfYXNzZXJ0ICh2ZXJzbi0+ZnVuY3Rpb25fdmVyc2lv bik7CisgICAgfQorCisgIGRpc3BhdGNoX2Z1bmN0aW9uX3ZlcnNpb25zKHJl c29sdmVyX2RlY2wsIGZuX3Zlcl92ZWMsICZlbXB0eV9iYik7CisKKyAgcmVi dWlsZF9jZ3JhcGhfZWRnZXMgKCk7IAorICBwb3BfY2Z1biAoKTsKKyAgcmV0 dXJuIHJlc29sdmVyX2RlY2w7Cit9CisKIC8qIFRoaXMgYnVpbGRzIHRoZSBw cm9jZXNzb3JfbW9kZWwgc3RydWN0IHR5cGUgZGVmaW5lZCBpbgogICAgbGli Z2NjL2NvbmZpZy9pMzg2L2NwdWluZm8uYyAgKi8KIApAQCAtNDEwMDUsNiAr NDE5ODgsOSBAQCBpeDg2X21lbW1vZGVsX2NoZWNrICh1bnNpZ25lZCBIT1NU X1dJREVfSU5UIHZhbCkKICN1bmRlZiBUQVJHRVRfUFJPRklMRV9CRUZPUkVf UFJPTE9HVUUKICNkZWZpbmUgVEFSR0VUX1BST0ZJTEVfQkVGT1JFX1BST0xP R1VFIGl4ODZfcHJvZmlsZV9iZWZvcmVfcHJvbG9ndWUKIAorI3VuZGVmIFRB UkdFVF9NQU5HTEVfREVDTF9BU1NFTUJMRVJfTkFNRQorI2RlZmluZSBUQVJH RVRfTUFOR0xFX0RFQ0xfQVNTRU1CTEVSX05BTUUgaXg4Nl9tYW5nbGVfZGVj bF9hc3NlbWJsZXJfbmFtZQorCiAjdW5kZWYgVEFSR0VUX0FTTV9VTkFMSUdO RURfSElfT1AKICNkZWZpbmUgVEFSR0VUX0FTTV9VTkFMSUdORURfSElfT1Ag VEFSR0VUX0FTTV9BTElHTkVEX0hJX09QCiAjdW5kZWYgVEFSR0VUX0FTTV9V TkFMSUdORURfU0lfT1AKQEAgLTQxMDk4LDYgKzQyMDg0LDE3IEBAIGl4ODZf bWVtbW9kZWxfY2hlY2sgKHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgdmFsKQog I3VuZGVmIFRBUkdFVF9GT0xEX0JVSUxUSU4KICNkZWZpbmUgVEFSR0VUX0ZP TERfQlVJTFRJTiBpeDg2X2ZvbGRfYnVpbHRpbgogCisjdW5kZWYgVEFSR0VU X0NPTVBBUkVfVkVSU0lPTl9QUklPUklUWQorI2RlZmluZSBUQVJHRVRfQ09N UEFSRV9WRVJTSU9OX1BSSU9SSVRZIGl4ODZfY29tcGFyZV92ZXJzaW9uX3By aW9yaXR5CisKKyN1bmRlZiBUQVJHRVRfR0VORVJBVEVfVkVSU0lPTl9ESVNQ QVRDSEVSX0JPRFkKKyNkZWZpbmUgVEFSR0VUX0dFTkVSQVRFX1ZFUlNJT05f RElTUEFUQ0hFUl9CT0RZIFwKKyAgaXg4Nl9nZW5lcmF0ZV92ZXJzaW9uX2Rp c3BhdGNoZXJfYm9keQorCisjdW5kZWYgVEFSR0VUX0dFVF9GVU5DVElPTl9W RVJTSU9OU19ESVNQQVRDSEVSCisjZGVmaW5lIFRBUkdFVF9HRVRfRlVOQ1RJ T05fVkVSU0lPTlNfRElTUEFUQ0hFUiBcCisgIGl4ODZfZ2V0X2Z1bmN0aW9u X3ZlcnNpb25zX2Rpc3BhdGNoZXIKKwogI3VuZGVmIFRBUkdFVF9FTlVNX1ZB X0xJU1RfUAogI2RlZmluZSBUQVJHRVRfRU5VTV9WQV9MSVNUX1AgaXg4Nl9l bnVtX3ZhX2xpc3QKIApAQCAtNDEyMzgsNiArNDIyMzUsOSBAQCBpeDg2X21l bW1vZGVsX2NoZWNrICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHZhbCkKICN1 bmRlZiBUQVJHRVRfT1BUSU9OX1BSSU5UCiAjZGVmaW5lIFRBUkdFVF9PUFRJ T05fUFJJTlQgaXg4Nl9mdW5jdGlvbl9zcGVjaWZpY19wcmludAogCisjdW5k ZWYgVEFSR0VUX09QVElPTl9GVU5DVElPTl9WRVJTSU9OUworI2RlZmluZSBU QVJHRVRfT1BUSU9OX0ZVTkNUSU9OX1ZFUlNJT05TIGl4ODZfZnVuY3Rpb25f dmVyc2lvbnMKKwogI3VuZGVmIFRBUkdFVF9DQU5fSU5MSU5FX1AKICNkZWZp bmUgVEFSR0VUX0NBTl9JTkxJTkVfUCBpeDg2X2Nhbl9pbmxpbmVfcAogCklu ZGV4OiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9mdW5jc3BlYy00 LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvZnVuY3NwZWMtNC5jCShyZXZpc2lvbiAxOTI2MjMp CisrKyBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9mdW5jc3BlYy00 LmMJKHdvcmtpbmcgY29weSkKQEAgLTEyLDMgKzEyLDQgQEAgZXh0ZXJuIHZv aWQgZXJyb3IzICh2b2lkKSBfX2F0dHJpYnV0ZV9fKChfX3RhcmdldF8KIAog Lyogb3B0aW9uIG9uIGEgdmFyaWFibGUgKi8KIGV4dGVybiBpbnQgZXJyb3I0 IF9fYXR0cmlidXRlX18oKF9fdGFyZ2V0X18oInNzZTIiKSkpOyAvKiB7IGRn LXdhcm5pbmcgImlnbm9yZWQiIH0gKi8KKy8qIHsgZGctZXhjZXNzLWVycm9y cyAiaWdub3JlZCIgfSAqLwo= --e89a8fb1f8d231170504ccc06267--