From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id 5E11B3875A28 for ; Mon, 25 Jul 2022 13:38:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5E11B3875A28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="5.93,193,1654588800"; d="diff'?scan'208";a="82963185" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa1.mentor.iphmx.com with ESMTP; 25 Jul 2022 05:38:44 -0800 IronPort-SDR: ZQ6Q1SE7WAMEJqS4gY0qfcZMz4tjs4GD90erO6Z8nOp63vxUfZuMQTJMUchB4hoyUOsZTXJ10b alRkDSL0KJLtEjcDhs7wOn0IwXWevs9X9n9ClV9pu7qg/RVVPraFrFMpqibzfRk0EZhVaO12Di iuPscWBfIgGGlOmPa6VhPrUvwUnyn6SmvD20milYHCYe9/3ojiWXRo2S5v8wKAMvnzs2iODFIa C3Lwetkn428g5+v7kctEe6gD6KVzmP0luctB+ZCHtUPLDlg2V7t1dWAaLO4WATCandO94b0XUr Oig= Content-Type: multipart/mixed; boundary="------------tFYH3nYSywKhLx1r8gZKYMmy" Message-ID: <055f7cfb-2849-ba5a-a161-13333e19e538@codesourcery.com> Date: Mon, 25 Jul 2022 15:38:25 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Subject: Re: [PATCH] OpenMP, libgomp: Environment variable syntax extension. References: <392c847d-e798-2be3-a808-6888de6c90cd@codesourcery.com> <73621930-22ce-c3f1-61e0-f15683f8b281@codesourcery.com> From: Marcel Vollweiler To: Jakub Jelinek CC: In-Reply-To: X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-15.mgc.mentorg.com (139.181.222.15) To svr-ies-mbx-10.mgc.mentorg.com (139.181.222.10) X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, NICE_REPLY_A, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Jul 2022 13:38:55 -0000 --------------tFYH3nYSywKhLx1r8gZKYMmy Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable Hi Jakub, >>> I'm not sure we can rely on execv on all targets that do support libgom= p. >>> Any reason why you actually need this, rather than using >>> dg-set-target-env-var directive(s) and perhaps return 0; if getenv does= n't >>> return the expected values? >> >> Interesting topic. After some (internal) discussions I think the best wa= y is to >> set the environment variables explicitely instead using dg-set-target-en= v-var. >> The reason is that dg-set-target-env-var does not work for remote testin= g (which >> seems to be a common test environment). For remote testing dejagnu immed= iately >> aborts the test case with UNSUPPORTED which is specified in the correspo= nding >> extension and makes sence from my point of view as the test assumption c= annot be >> fulfilled (since the environment variables are not set on remote targets= ). >> It also means that whenever dg-set-target-env-var is set in the test fil= e, the >> execution of the test case is not tested on remote targets. > > The only reason why dg-set-target-env-var is supported on native only rig= ht > now is that I'm never doing remote testing myself and so couldn't test th= at. > There is no inherent reason why the env vars couldn't be propagated over = to > the remote and set in the environment there. > So trying to work around that rather than at least trying to change > dg-set-target-env-var so that it works with the remote testing you do loo= ks > wrong. > If dg-set-target-env-var can be made to work remotely, it will magically > improve those 130+ tests that use it already together with the newly adde= d > tests. > > So, I'd suggest to just use dg-set-target-env-var and incrementally work = on > making it work for remote testing if that is important to whomever does > that kind of testing. Could be e.g. a matter of invoking remotely > env VAR1=3Dval1 VAR2=3Dval2 program args > instead of program args. If env is missing on the remote side, it could > be UNSUPPORTED then. I agree. So I changed the tests using dg-set-target-env-var and removed the execv parts. > >> +/* The initial ICV values for the host, which are configured with envir= onment >> + variables without a suffix, e.g. OMP_NUM_TEAMS. */ >> +struct gomp_initial_icvs gomp_initial_icvs_none; >> + >> +/* Initial ICV values that were configured for the host and for all dev= ices by >> + using environment variables like OMP_NUM_TEAMS_ALL. */ >> +struct gomp_initial_icvs gomp_initial_icvs_all; >> + >> +/* Initial ICV values that were configured only for devices (not for th= e host) >> + by using environment variables like OMP_NUM_TEAMS_DEV. */ >> +struct gomp_initial_icvs gomp_initial_icvs_dev; > > As I said last time, I don't like allocating these > all the time in the data section of libgomp when at least for a few upcom= ing > years, most users will never use those suffixes. > Can't *_DEV and *_ALL go into the gomp_initial_icv_dev_list > chain too, perhaps gomp_initial_icvs_{none, all, dev} are now defined as pointers (as you prop= osed previously). gomp_initial_icvs_{all, dev} are only instantiated if at least= one according environment variable is parsed. gomp_initial_icvs_none is always initialized with the initial global ICV values. All three structures are now also included in gomp_initial_icv_list (previo= usly named gomp_initial_icv_dev_list) with "magic device numbers" -1, -2, and -3= . The list items for _DEV, _ALL and no suffix are stored at the beginning of = the list whereas the device-specific list items are attached at the end. > >> +static const struct envvar >> +{ >> + const char *name; >> + int name_len; >> + unsigned char flag_vars[3]; >> + unsigned char flag; >> + void *params[3]; >> + bool (*parse_func) (const char *, const char *, void * const[]); >> +} envvars[] =3D { >> + {ENTRY ("OMP_SCHEDULE_DEV"), {OMP_SCHEDULE_DEV_, OMP_SCHEDULE_CHUNK_S= IZE_DEV_}, GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.run_sched_var, = &gomp_initial_icvs_dev.run_sched_chunk_size}, &parse_schedule}, >> + {ENTRY ("OMP_SCHEDULE_ALL"), {OMP_SCHEDULE_DEV_, OMP_SCHEDULE_CHUNK_S= IZE_DEV_}, GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.run_sched_var, = &gomp_initial_icvs_all.run_sched_chunk_size}, &parse_schedule}, >> + {ENTRY ("OMP_SCHEDULE"), {OMP_SCHEDULE_DEV_, OMP_SCHEDULE_CHUNK_SIZE_= DEV_}, GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.run_sched_var, &g= omp_initial_icvs_none.run_sched_chunk_size}, &parse_schedule}, >> + >> + {ENTRY ("OMP_NUM_TEAMS_DEV"), {OMP_NUM_TEAMS_DEV_}, GOMP_ENV_VAR_SUFF= IX_DEV , {&gomp_initial_icvs_dev.nteams_var, false}, &parse_int}, >> + {ENTRY ("OMP_NUM_TEAMS_ALL"), {OMP_NUM_TEAMS_DEV_}, GOMP_ENV_VAR_SUFF= IX_ALL, {&gomp_initial_icvs_all.nteams_var, false}, &parse_int}, >> + {ENTRY ("OMP_NUM_TEAMS"), {OMP_NUM_TEAMS_DEV_}, GOMP_ENV_VAR_SUFFIX_N= ONE, {&gomp_initial_icvs_none.nteams_var, false}, &parse_int}, >> + >> + {ENTRY ("OMP_DYNAMIC_DEV"), {OMP_DYNAMIC_DEV_}, GOMP_ENV_VAR_SUFFIX_D= EV, {&gomp_initial_icvs_dev.dyn_var}, &parse_boolean}, >> + {ENTRY ("OMP_DYNAMIC_ALL"), {OMP_DYNAMIC_DEV_}, GOMP_ENV_VAR_SUFFIX_A= LL, {&gomp_initial_icvs_all.dyn_var}, &parse_boolean}, >> + {ENTRY ("OMP_DYNAMIC"), {OMP_DYNAMIC_DEV_}, GOMP_ENV_VAR_SUFFIX_NONE,= {&gomp_initial_icvs_none.dyn_var}, &parse_boolean}, >> + >> + {ENTRY ("OMP_TEAMS_THREAD_LIMIT_DEV"), {OMP_TEAMS_THREAD_LIMIT_DEV_},= GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.teams_thread_limit_var, f= alse}, &parse_int}, >> + {ENTRY ("OMP_TEAMS_THREAD_LIMIT_ALL"), {OMP_TEAMS_THREAD_LIMIT_DEV_},= GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.teams_thread_limit_var, f= alse}, &parse_int}, >> + {ENTRY ("OMP_TEAMS_THREAD_LIMIT"), {OMP_TEAMS_THREAD_LIMIT_DEV_}, GOM= P_ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.teams_thread_limit_var, fal= se}, &parse_int}, >> + >> + {ENTRY ("OMP_THREAD_LIMIT_DEV"), {OMP_THREAD_LIMIT_DEV_}, GOMP_ENV_VA= R_SUFFIX_DEV, {&gomp_initial_icvs_dev.thread_limit_var, false, (void *) UIN= T_MAX}, &parse_unsigned_long}, >> + {ENTRY ("OMP_THREAD_LIMIT_ALL"), {OMP_THREAD_LIMIT_DEV_}, GOMP_ENV_VA= R_SUFFIX_ALL, {&gomp_initial_icvs_all.thread_limit_var, false, (void *) UIN= T_MAX}, &parse_unsigned_long}, >> + {ENTRY ("OMP_THREAD_LIMIT"), {OMP_THREAD_LIMIT_DEV_}, GOMP_ENV_VAR_SU= FFIX_NONE, {&gomp_initial_icvs_none.thread_limit_var, false, (void *) UINT_= MAX}, &parse_unsigned_long}, >> + >> + {ENTRY ("OMP_NUM_THREADS_DEV"), {OMP_NUM_THREADS_DEV_, OMP_NTHREADS_L= IST_DEV, OMP_NTHREADS_LIST_LEN_DEV}, GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initia= l_icvs_dev.nthreads_var, &gomp_initial_icvs_dev.nthreads_var_list, &gomp_in= itial_icvs_dev.nthreads_var_list_len}, &parse_unsigned_long_list}, >> + {ENTRY ("OMP_NUM_THREADS_ALL"), {OMP_NUM_THREADS_DEV_, OMP_NTHREADS_L= IST_DEV, OMP_NTHREADS_LIST_LEN_DEV}, GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initia= l_icvs_all.nthreads_var, &gomp_initial_icvs_all.nthreads_var_list, &gomp_in= itial_icvs_all.nthreads_var_list_len}, &parse_unsigned_long_list}, >> + {ENTRY ("OMP_NUM_THREADS"), {OMP_NUM_THREADS_DEV_, OMP_NTHREADS_LIST_= DEV, OMP_NTHREADS_LIST_LEN_DEV}, GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_i= cvs_none.nthreads_var, &gomp_initial_icvs_none.nthreads_var_list, &gomp_ini= tial_icvs_none.nthreads_var_list_len}, &parse_unsigned_long_list}, >> + >> + {ENTRY ("OMP_PROC_BIND_DEV"), {OMP_PROC_BIND_DEV_, OMP_PROC_BIND_LIST= _DEV_, OMP_PROC_BIND_LIST_LEN_DEV_}, GOMP_ENV_VAR_SUFFIX_DEV, {&gomp_initia= l_icvs_dev.bind_var, &gomp_initial_icvs_dev.bind_var_list, &gomp_initial_ic= vs_dev.bind_var_list_len}, &parse_bind_var}, >> + {ENTRY ("OMP_PROC_BIND_ALL"), {OMP_PROC_BIND_DEV_, OMP_PROC_BIND_LIST= _DEV_, OMP_PROC_BIND_LIST_LEN_DEV_}, GOMP_ENV_VAR_SUFFIX_ALL, {&gomp_initia= l_icvs_all.bind_var, &gomp_initial_icvs_all.bind_var_list, &gomp_initial_ic= vs_all.bind_var_list_len}, &parse_bind_var}, >> + {ENTRY ("OMP_PROC_BIND"), {OMP_PROC_BIND_DEV_, OMP_PROC_BIND_LIST_DEV= _, OMP_PROC_BIND_LIST_LEN_DEV_}, GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_initial_i= cvs_none.bind_var, &gomp_initial_icvs_none.bind_var_list, &gomp_initial_icv= s_none.bind_var_list_len}, &parse_bind_var}, >> + >> + {ENTRY ("OMP_MAX_ACTIVE_LEVELS_DEV"), {OMP_MAX_ACTIVE_LEVELS_DEV_}, G= OMP_ENV_VAR_SUFFIX_DEV, {&gomp_initial_icvs_dev.max_active_levels_var, (voi= d *) true, (void *) gomp_supported_active_levels}, &parse_unsigned_long}, >> + {ENTRY ("OMP_MAX_ACTIVE_LEVELS_ALL"), {OMP_MAX_ACTIVE_LEVELS_DEV_}, G= OMP_ENV_VAR_SUFFIX_ALL, {&gomp_initial_icvs_all.max_active_levels_var, (voi= d *) true, (void *) gomp_supported_active_levels}, &parse_unsigned_long}, >> + {ENTRY ("OMP_MAX_ACTIVE_LEVELS"), {OMP_MAX_ACTIVE_LEVELS_DEV_}, GOMP_= ENV_VAR_SUFFIX_NONE, {&gomp_initial_icvs_none.max_active_levels_var, (void = *) true, (void *) gomp_supported_active_levels}, &parse_unsigned_long}, >> + >> + {ENTRY ("OMP_WAIT_POLICY_DEV"), {OMP_WAIT_POLICY_DEV_}, GOMP_ENV_VAR_= SUFFIX_DEV, {&gomp_initial_icvs_dev.wait_policy}, &parse_wait_policy}, >> + {ENTRY ("OMP_WAIT_POLICY_ALL"), {OMP_WAIT_POLICY_DEV_}, GOMP_ENV_VAR_= SUFFIX_ALL, {&gomp_initial_icvs_all.wait_policy}, &parse_wait_policy}, >> + {ENTRY ("OMP_WAIT_POLICY"), {OMP_WAIT_POLICY_DEV_}, GOMP_ENV_VAR_SUFF= IX_NONE, {&gomp_initial_icvs_none.wait_policy}, &parse_wait_policy}, >> + >> + {ENTRY ("OMP_STACKSIZE_DEV"), {OMP_STACKSIZE_DEV_}, GOMP_ENV_VAR_SUFF= IX_DEV, {&gomp_initial_icvs_dev.stacksize}, &parse_stacksize}, >> + {ENTRY ("OMP_STACKSIZE_ALL"), {OMP_STACKSIZE_DEV_}, GOMP_ENV_VAR_SUFF= IX_ALL, {&gomp_initial_icvs_all.stacksize}, &parse_stacksize}, >> + {ENTRY ("OMP_STACKSIZE"), {OMP_STACKSIZE_DEV_}, GOMP_ENV_VAR_SUFFIX_N= ONE, {&gomp_initial_icvs_none.stacksize}, &parse_stacksize}, >> + >> + {ENTRY ("OMP_CANCELLATION"), {}, GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_can= cel_var}, &parse_boolean}, >> + {ENTRY ("OMP_DISPLAY_AFFINITY"), {}, GOMP_ENV_VAR_SUFFIX_NONE, {&gomp= _display_affinity_var}, &parse_boolean}, >> + {ENTRY ("OMP_TARGET_OFFLOAD"), {}, GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_t= arget_offload_var}, &parse_target_offload}, >> + {ENTRY ("OMP_MAX_TASK_PRIORITY"), {}, GOMP_ENV_VAR_SUFFIX_NONE, {&gom= p_max_task_priority_var, (void *) true}, &parse_int}, >> + {ENTRY ("OMP_ALLOCATOR"), {}, GOMP_ENV_VAR_SUFFIX_NONE, {&gomp_def_al= locator}, &parse_allocator}, >> + {ENTRY ("OMP_DEFAULT_DEVICE"), {OMP_DEFAULT_DEVICE_DEV_}, GOMP_ENV_VA= R_SUFFIX_NONE, {&gomp_initial_icvs_none.default_device_var, (void *) true},= &parse_int}, >> +}; > > This is very large, why do you need 3 entries per most of the env vars? > Just one would be enough, with just some flag whether it accepts any > suffixes or not. The tables have been optimized now. Only one entry per ICV and removed some= parts. > Lines are too long, they'd need wrapping. > I think the coding conventions are space after { and space before }. Both changed. > >> +static bool >> +get_device_num (char *env, int *dev_num, int *dev_num_len) >> +{ >> + int pos =3D 0; >> + char dev_num_str[INT_MAX_STR_LEN+1]; >> + >> + *dev_num_len =3D 0; >> + *dev_num =3D -1; >> + if (env =3D=3D NULL) >> + return false; >> + >> + while (pos < INT_MAX_STR_LEN) >> + { >> + if (env[pos] =3D=3D '\0' || env[pos] =3D=3D '=3D') >> + break; >> + dev_num_str[pos] =3D env[pos]; >> + pos++; >> + } >> + >> + if (env[pos] !=3D '=3D' || (dev_num_str[0] =3D=3D '0' && pos > 1)) >> + return false; >> + >> + dev_num_str[pos] =3D '\0'; >> + *dev_num =3D (int) strtoul (dev_num_str, 0, 10); >> + *dev_num_len =3D pos; > > Why do you copy the chars to a separate stack buffer? > strtoul will stop on anything that isn't a number. > So, just passing it second argument and verifying that > it points to '=3D' ('\0' wouldn't be valid) would be good enough > (or perhaps also verying it doesn't point to the start pointer > in case caller hasn't checked yet if it starts with a digit). Thanks for this hint. That makes it much simpler. Changed. > Also, the (int) cast means it throws away important information, > we'd treat say > 8589934593 > on 64-bit arches as 1, I think we want to just ignore it. > Also, we should ignore negative values (though, for 5.2 there > is a question if OMP_NUM_THREADS_DEV_-1=3D5 is valid or not and > redundant with OMP_NUM_THREADS_DEV_4=3D5 (if omp_get_num_devices() =3D=3D= 5) > or OMP_NUM_THREADS and which one wins. Negative device numbers are rejected now. Btw. it seems that defining environment variables like "OMP_NUM_THREADS_DEV_-1" is not always valid due= to "-" (invalid identifier name). > >> + return true; >> +} >> + >> +/* Helper function for initialize_env to add a device specific ICV valu= e >> + to gomp_initial_icv_dev_list. */ >> + >> +static void >> +add_device_specific_icv (int dev_num, int icv_code, void *value) >> +{ >> + struct gomp_icv_list *list =3D gomp_initial_icv_dev_list; >> + while (list !=3D NULL && list->device_num !=3D dev_num) >> + list =3D list->next; >> + >> + if (list =3D=3D NULL) >> + { >> + list =3D >> + (struct gomp_icv_list *) gomp_malloc (sizeof (struct gomp_icv_list)= ); > > Formatting, =3D can't be at the end of line. > >> +static unsigned char >> +get_icv_flag (unsigned char flag_var) >> +{ >> + switch (flag_var) >> + { >> + case OMP_NUM_TEAMS_DEV_: >> + return gomp_initial_icv_flags.nteams_var; >> + case OMP_SCHEDULE_DEV_: >> + return gomp_initial_icv_flags.run_sched_var; >> + case OMP_SCHEDULE_CHUNK_SIZE_DEV_: >> + return gomp_initial_icv_flags.run_sched_chunk_size; >> + case OMP_DYNAMIC_DEV_: >> + return gomp_initial_icv_flags.dyn_var; >> + case OMP_TEAMS_THREAD_LIMIT_DEV_: >> + return gomp_initial_icv_flags.teams_thread_limit_var; >> + case OMP_THREAD_LIMIT_DEV_: >> + return gomp_initial_icv_flags.thread_limit_var; >> + case OMP_NUM_THREADS_DEV_: >> + return gomp_initial_icv_flags.nthreads_var; >> + case OMP_NTHREADS_LIST_DEV: >> + return gomp_initial_icv_flags.nthreads_var_list; >> + case OMP_NTHREADS_LIST_LEN_DEV: >> + return gomp_initial_icv_flags.nthreads_var_list_len; >> + case OMP_PROC_BIND_DEV_: >> + return gomp_initial_icv_flags.bind_var; >> + case OMP_PROC_BIND_LIST_DEV_: >> + return gomp_initial_icv_flags.bind_var_list; >> + case OMP_PROC_BIND_LIST_LEN_DEV_: >> + return gomp_initial_icv_flags.bind_var_list_len; >> + case OMP_MAX_ACTIVE_LEVELS_DEV_: >> + return gomp_initial_icv_flags.max_active_levels_var; >> + case OMP_WAIT_POLICY_DEV_: >> + return gomp_initial_icv_flags.wait_policy; >> + case OMP_STACKSIZE_DEV_: >> + return gomp_initial_icv_flags.stacksize; >> + case OMP_DEFAULT_DEVICE_DEV_: >> + return gomp_initial_icv_flags.default_device_var; >> + default: >> + return OMP_NONE; > > Doesn't this function return a bitmask of GOMP_ENV_VAR_SUFFIX_WHATEVER > values? OMP_NONE isn't one of them, shouldn't it return 0 instead? > But more importantly, wouldn't it be easier if the icv_flags was just > an array indexed by flag_var? You don't need a large switch to handle > setting or getting it then. As you just want 4 bits per flag instead of = 8, > you could index it by flag_var >> 1 and for flag_var & 1 shift right or l= eft > by 4. The ICV flags are now defined as uint32_t. This is enough to store flags fo= r our current 21 ICVs. The flags for _DEV, _DEV_X, _ALL and no suffix are now separated as we have the flags variable for each item of the initial icv li= st. > >> static void __attribute__((constructor)) >> initialize_env (void) >> { >> - unsigned long thread_limit_var; >> - unsigned long max_active_levels_var; >> + extern char **environ; >> + char **env; >> + int omp_var, dev_num =3D 0, dev_num_len =3D 0, int_value, k; >> + bool bool_value, ignore =3D false; >> + char *env_val; >> >> /* Do a compile time check that mkomp_h.pl did good job. */ >> omp_check_defines (); >> >> - parse_schedule (); >> - parse_boolean ("OMP_DYNAMIC", &gomp_global_icv.dyn_var); >> - parse_boolean ("OMP_CANCELLATION", &gomp_cancel_var); >> - parse_boolean ("OMP_DISPLAY_AFFINITY", &gomp_display_affinity_var); >> - parse_int ("OMP_DEFAULT_DEVICE", &gomp_global_icv.default_device_var,= true); >> - parse_target_offload ("OMP_TARGET_OFFLOAD", &gomp_target_offload_var)= ; >> - parse_int ("OMP_MAX_TASK_PRIORITY", &gomp_max_task_priority_var, true= ); >> - gomp_def_allocator =3D parse_allocator (); >> - if (parse_unsigned_long ("OMP_THREAD_LIMIT", &thread_limit_var, false= )) >> - { >> - gomp_global_icv.thread_limit_var >> - =3D thread_limit_var > INT_MAX ? UINT_MAX : thread_limit_var; >> - } >> - parse_int_secure ("GOMP_DEBUG", &gomp_debug_var, true); >> #ifndef HAVE_SYNC_BUILTINS >> gomp_mutex_init (&gomp_managed_threads_lock); >> #endif >> gomp_init_num_threads (); >> gomp_available_cpus =3D gomp_global_icv.nthreads_var; >> - if (!parse_unsigned_long_list ("OMP_NUM_THREADS", >> - &gomp_global_icv.nthreads_var, >> - &gomp_nthreads_var_list, >> - &gomp_nthreads_var_list_len)) >> - gomp_global_icv.nthreads_var =3D gomp_available_cpus; >> - parse_int ("OMP_NUM_TEAMS", &gomp_nteams_var, false); >> - parse_int ("OMP_TEAMS_THREAD_LIMIT", &gomp_teams_thread_limit_var, fa= lse); >> - bool ignore =3D false; >> - if (parse_bind_var ("OMP_PROC_BIND", >> - &gomp_global_icv.bind_var, >> - &gomp_bind_var_list, >> - &gomp_bind_var_list_len) >> + >> + for (env =3D environ; *env !=3D 0; env++) >> + { >> + if (!startswith (*env, "OMP_")) >> + continue; > > While the above is certainly good and quickly skips non-OpenMP env vars, > I think > >> + >> + for (omp_var =3D 0; omp_var < OMP_DEV_VAR_CNT; omp_var++) >> + { >> + if (startswith (*env, envvars_dev[omp_var].name)) > > walking 36 entries for each OMP_ env var and doing strncmp for each is > expensive. > > Wouldn't it be better to just walk the name once, find out the suffix in > there and the length of the part before it too, > just a simple loop, stopping at '=3D' and when seeing '_', check if follo= wed > by "ALL=3D", "DEV=3D" or "DEV_" followed by digit. That will determine t= he > kind and length of the env var name without the suffixes, so then > you can just walk the much shortened table with just 16 entries now > and can skip entries which don't have the computed length (the table > includes name_len, so start by > if (envvars[omp_var].name_len !=3D name_len) > continue; > if (memcmp (*env + strlen ("OMP_"), envvars[omp_var].name, > envvars[omp_var].name_len) !=3D 0) > continue; That's a good point. Together with the "envvars" table the parsing has been optimized. Similarly to you proposal I just use a flag in the table and par= se the environment variable variants successively. First the basic variable na= me (e.g. OMP_NUM_TEAMS) and then checking whether "=3D", "_DEV=3D", "_ALL=3D",= or "_DEV_" is following if allowed according to the table's flag. (Only) for a directl= y following "=3D" a check is not necessary because host variants are always a= llowed (thus GOMP_ENV_VAR_SUFFIX_NONE is also omitted in the table). > >> --- a/libgomp/libgomp.h >> +++ b/libgomp/libgomp.h >> @@ -454,6 +454,24 @@ struct gomp_team_state >> >> struct target_mem_desc; >> >> +#define OMP_NONE 0 >> +#define OMP_NUM_TEAMS_DEV_ 1 >> +#define OMP_SCHEDULE_DEV_ 2 >> +#define OMP_SCHEDULE_CHUNK_SIZE_DEV_ 3 >> +#define OMP_DYNAMIC_DEV_ 4 >> +#define OMP_TEAMS_THREAD_LIMIT_DEV_ 5 >> +#define OMP_THREAD_LIMIT_DEV_ 6 >> +#define OMP_NUM_THREADS_DEV_ 7 >> +#define OMP_NTHREADS_LIST_DEV 8 >> +#define OMP_NTHREADS_LIST_LEN_DEV 9 >> +#define OMP_PROC_BIND_DEV_ 10 >> +#define OMP_PROC_BIND_LIST_DEV_ 11 >> +#define OMP_PROC_BIND_LIST_LEN_DEV_ 12 >> +#define OMP_MAX_ACTIVE_LEVELS_DEV_ 13 >> +#define OMP_WAIT_POLICY_DEV_ 14 >> +#define OMP_STACKSIZE_DEV_ 15 >> +#define OMP_DEFAULT_DEVICE_DEV_ 16 > > These aren't constans defined in OpenMP standard, so I think it would > be better to use different prefixes, say GOMP_ICV_WHATEVER or > GOMP_ENV_WHATEVER. OMP_NONE is very much non-descriptive of what > it means. Why do some defines have _DEV_ suffixes and others _DEV? They are renamed accordingly. > It should also be an enum rather than set of defines and I don't see a > reason for the _DEV* suffixes. Agreed and changed accordingly. > >> + >> /* These are the OpenMP 4.0 Internal Control Variables described in >> section 2.3.1. Those described as having one copy per task are >> stored within the structure; those described as having one copy >> @@ -473,6 +491,69 @@ struct gomp_task_icv >> struct target_mem_desc *target_data; >> }; >> >> +#define GOMP_ENV_VAR_SUFFIX_UNKNOWN 0 >> +#define GOMP_ENV_VAR_SUFFIX_NONE 1 >> +#define GOMP_ENV_VAR_SUFFIX_DEV 2 >> +#define GOMP_ENV_VAR_SUFFIX_ALL 4 >> +#define GOMP_ENV_VAR_SUFFIX_DEV_X 8 > > Similarly, make this an enum, and perhaps just GOMP_ENV_SUFFIX_WHATEVER ? Also changed. An updated patch is attached and tested again on x86_64-linux with nvptx an= d amdgcn offloading without regression. Marcel ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------tFYH3nYSywKhLx1r8gZKYMmy Content-Type: text/plain; charset="UTF-8"; name="extend-env-variables-syntax.diff" Content-Disposition: attachment; filename="extend-env-variables-syntax.diff" Content-Transfer-Encoding: base64 T3Blbk1QLCBsaWJnb21wOiBFbnZpcm9ubWVudCB2YXJpYWJsZSBzeW50YXggZXh0ZW5zaW9u LgoKVGhpcyBwYXRjaCBjb25zaWRlcnMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHN5bnRh eCBleHRlbnNpb24gZm9yCmRldmljZS1zcGVjaWZpYyB2YXJpYW50cyBvZiBlbnZpcm9ubWVu dCB2YXJpYWJsZXMgZnJvbSBPcGVuTVAgNS4xIChzZWUKT3Blbk1QIDUuMSBzcGVjaWZpY2F0 aW9uLCBwLiA3NSBhbmQgcC4gNjM5KS4gQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgKGUuZy4K T01QX05VTV9URUFNUykgY2FuIGhhdmUgZGlmZmVyZW50IHN1ZmZpeGVzOgoKX0RFViAoZS5n LiBPTVBfTlVNX1RFQU1TX0RFVik6IGFmZmVjdHMgYWxsIGRldmljZXMgYnV0IG5vdCB0aGUg aG9zdC4KX0RFVl88ZGV2aWNlPiAoZS5nLiBPTVBfTlVNX1RFQU1TX0RFVl80Mik6IGFmZmVj dHMgb25seSBkZXZpY2Ugd2l0aApudW1iZXIgPGRldmljZT4uCm5vIHN1ZmZpeCAoZS5nLiBP TVBfTlVNX1RFQU1TKTogYWZmZWN0cyBvbmx5IHRoZSBob3N0LgoKSW4gZnV0dXJlIE9wZW5N UCB2ZXJzaW9ucyBhbHNvIHN1ZmZpeCBfQUxMIHdpbGwgYmUgaW50cm9kdWNlZCAoc2VlIGRp c2N1c3Npb24KaHR0cHM6Ly9naXRodWIuY29tL09wZW5NUC9zcGVjL2lzc3Vlcy8zMTc5KS4g VGhpcyBpcyBhbHNvIGNvbnNpZGVyZWQgaW4gdGhpcwpwYXRjaDoKCl9BTEwgKGUuZy4gT01Q X05VTV9URUFNU19BTEwpOiBhZmZlY3RzIGFsbCBkZXZpY2VzIGFuZCB0aGUgaG9zdC4KCQpU aGUgcHJlY2VkZW5jZSBpcyBhcyBmb2xsb3dzIChkZXNjZW5kaW5nKS4gRm9yIHRoZSBob3N0 OgoKCTEuIG5vIHN1ZmZpeAoJMi4gX0FMTAoJCkZvciBkZXZpY2VzOgoKCTEuIF9ERVZfPGRl dmljZT4KCTIuIF9ERVYKCTMuIF9BTEwKCQpUaGF0IG1lYW5zLCBfREVWXzxkZXZpY2U+IGlz IHVzZWQgd2hlbmV2ZXIgYXZhaWxhYmxlLiBPdGhlcndpc2UgX0RFViBpcyB1c2VkIGlmCmF2 YWlsYWJsZSwgYW5kIGF0IGxhc3QgX0FMTC4gSWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIGFu eSBvZiB0aGUgdmFyaWFibGUKdmFyaWFudHMsIGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkIGFz IGFscmVhZHkgaW1wbGVtZW50ZWQgYmVmb3JlLgoKVGhpcyBwYXRjaCBjb25jZXJucyBwYXJz aW5nIChhKSwgc3RvcmluZyAoYiksIG91dHB1dCAoYykgYW5kIHRyYW5zbWlzc2lvbiB0byB0 aGUKZGV2aWNlIChkKToKCihhKSBUaGUgYWN0dWFsIG51bWJlciBvZiBkZXZpY2VzIGFuZCB0 aGUgbnVtYmVyaW5nIGFyZSBub3Qga25vd24gd2hlbiBwYXJzaW5nCnRoZSBlbnZpcm9ubWVu dCB2YXJpYWJsZXMuIFRodXMgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgaXRlcmF0 ZWQgYW5kCnNlYXJjaGVkIGZvciBkZXZpY2Utc3BlY2lmaWMgb25lcy4KKGIpIE9ubHkgY29u ZmlndXJlZCBkZXZpY2Utc3BlY2lmaWMgdmFyaWFibGVzIGFyZSBzdG9yZWQuIFRodXMsIGxp bmtlZCBsaXN0cwphcmUgdXNlZC4KKGMpIFRoZSBvdXRwdXQgaXMgZG9uZSBpbiBvbXBfZGlz cGxheV9lbnYgKHNlZSBzcGVjaWZpY2F0aW9uIHAuIDQ2OGYpLiBHbG9iYWwKSUNWcyBhcmUg dGFnZ2VkIHdpdGggW2FsbF0sIHNlZSBodHRwczovL2dpdGh1Yi5jb20vT3Blbk1QL3NwZWMv aXNzdWVzLzMxNzkuCklDVnMgd2hpY2ggYXJlIG5vdCBnbG9iYWwgYnV0IGFyZW4ndCBoYW5k bGVkIGRldmljZS1zcGVjaWZpYyB5ZXQgYXJlIHRhZ2dlZAp3aXRoIFtob3N0XS4gb21wX2Rp c3BsYXlfZW52IG91dHB1dHMgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBJQ1ZzLiBUaGF0 J3Mgd2h5CnNlcGFyYXRlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW50cm9kdWNlZCAobGlrZSBn b21wX2luaXRpYWxfaWN2Li4uKS4KKGQpIERldmljZS1zcGVjaWZpYyBJQ1ZzIHdoaWNoIGFy ZSBhbHJlYWR5IHVzZXIgYWNjZXNzaWJsZSBvbiB0aGUgZGV2aWNlIGFyZQp0cmFuc21pdHRl ZCB0byB0aGUgZGV2aWNlIChtb3Jlb3ZlciBudGVhbXMtdmFyIGlzIGFkZGVkIGFuZCB1c2Vk IGZvciB0aGUgdGVzdHMpLgoKbGliZ29tcC9DaGFuZ2VMb2c6CgoJKiBjb25maWcvZ2NuL2lj di1kZXZpY2UuYyAob21wX2dldF9kZWZhdWx0X2RldmljZSk6IFJldHVybiBJQ1YgdmFsdWUu Cgkob21wX2dldF9tYXhfdGVhbXMpOiBBZGRlZCBmb3IgR0NOIGRldmljZXMuCgkqIGNvbmZp Zy9udnB0eC9pY3YtZGV2aWNlLmMgKG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UpOiBSZXR1cm4g SUNWIHZhbHVlLgoJKG9tcF9nZXRfbWF4X3RlYW1zKTogQWRkZWQgZm9yIG52cHR4IGRldmlj ZXMuCgkqIGVudi5jIChzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCk6IE5ldyBzdHJ1Y3QgdG8gc3Rv cmUgZW50cmllcyBvZiBpbml0aWFsCglJQ1YgdmFsdWVzLgoJKHBhcnNlX3NjaGVkdWxlKTog R2VuZXJhbGl6ZWQgZm9yIGRpZmZlcmVudCB2YXJpYW50cyBvZiBPTVBfU0NIRURVTEUuCgko cHJpbnRfZW52X3Zhcl9lcnJvcik6IEZ1bmN0aW9uIHRoYXQgcHJpbnRzIGFuIGVycm9yIGZv ciBpbnZhbGlkIHZhbHVlcwoJZm9yIElDVnMuCgkocGFyc2VfdW5zaWduZWRfbG9uZ18xKTog UmVtb3ZlZCBnZXRlbnYuIEdlbmVyYWxpemVkLgoJKHBhcnNlX3Vuc2lnbmVkX2xvbmcpOiBM aWtld2lzZS4KCShwYXJzZV9pbnRfMSk6IExpa2V3aXNlLgoJKHBhcnNlX2ludCk6IExpa2V3 aXNlLgoJKHBhcnNlX2ludF9zZWN1cmUpOiBMaWtld2lzZS4KCShwYXJzZV91bnNpZ25lZF9s b25nX2xpc3QpOiBMaWtld2lzZS4KCShwYXJzZV90YXJnZXRfb2ZmbG9hZCk6IExpa2V3aXNl LgoJKHBhcnNlX2JpbmRfdmFyKTogTGlrZXdpc2UuCgkocGFyc2Vfc3RhY2tzaXplKTogTGlr ZXdpc2UuCgkocGFyc2VfYm9vbGVhbik6IExpa2V3aXNlLgoJKHBhcnNlX3dhaXRfcG9saWN5 KTogTGlrZXdpc2UuCgkocGFyc2VfYWxsb2NhdG9yKTogTGlrZXdpc2UuCgkob21wX2Rpc3Bs YXlfZW52KTogRXh0ZW5kZWQgdG8gb3V0cHV0IGRpZmZlcmVudCB2YXJpYW50cyBvZiBlbnZp cm9ubWVudAoJdmFyaWFibGVzLgoJKHByaW50X3NjaGVkdWxlKTogTmV3IGhlbHBlciBmdW5j dGlvbiBmb3Igb21wX2Rpc3BsYXlfZW52IHdoaWNoIHByaW50cwoJdGhlIHZhbHVlcyBvZiBy dW5fc2NoZWRfdmFyLgoJKHByaW50X3Byb2NfYmluZCk6IE5ldyBoZWxwZXIgZnVuY3Rpb24g Zm9yIG9tcF9kaXNwbGF5X2VudiB3aGljaCBwcmludHMKCXRoZSB2YWx1ZXMgb2YgcHJvY19i aW5kX3Zhci4KCShlbnVtIGdvbXBfcGFyc2VfdHlwZSk6IENvbGxlY3Rpb24gb2YgdHlwZXMg dXNlZCBmb3IgcGFyc2luZyBlbnZpcm9ubWVudAoJdmFyaWFibGVzLgoJKEVOVFJZKTogUHJl cHJvY2VzcyBzdHJpbmcgbGVuZ3RocyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgkoT01Q X1ZBUl9DTlQpOiBQcmVwcm9jZXNzIHRhYmxlIHNpemUuCgkoT01QX0hPU1RfVkFSX0NOVCk6 IExpa2V3aXNlLgoJKElOVF9NQVhfU1RSX0xFTik6IENvbnN0YW50IGZvciB0aGUgbWF4aW1h bCBudW1iZXIgb2YgZGlnaXRzIG9mIGEgZGV2aWNlCgludW1iZXIuCgkoZ29tcF9nZXRfaWN2 X2ZsYWcpOiBSZXR1cm5zIGlmIGEgZmxhZyBmb3IgYSBwYXJ0aWN1bGFyIElDViBpcyBzZXQu CgkoZ29tcF9zZXRfaWN2X2ZsYWcpOiBTZXRzIGEgZmxhZyBmb3IgYSBwYXJ0aWN1bGFyIElD Vi4KCShwcmludF9kZXZpY2Vfc3BlY2lmaWNfaWN2cyk6IE5ldyBoZWxwZXIgZnVuY3Rpb24g Zm9yIG9tcF9kaXNwbGF5X2VudiB0bwoJcHJpbnQgZGV2aWNlIHNwZWNpZmljIElDViB2YWx1 ZXMuCgkoZ2V0X2RldmljZV9udW0pOiBOZXcgaGVscGVyIGZ1bmN0aW9uIGZvciBwYXJzZV9k ZXZpY2Vfc3BlY2lmaWMuCglFeHRyYWN0cyB0aGUgZGV2aWNlIG51bWJlciBmcm9tIGFuIGVu dmlyb25tZW50IHZhcmlhYmxlIG5hbWUuCgkoZ2V0X2ljdl9tZW1iZXJfYWRkcik6IEdldHMg dGhlIG1lbW9yeSBhZGRyZXNzIGZvciBhIHBhcnRpY3VsYXIgbWVtYmVyCglvZiBhbiBJQ1Yg c3RydWN0LgoJKGdvbXBfZ2V0X2luaXRpYWxfaWN2X2l0ZW0pOiBHZXQgdGhlIGxpc3QgaXRl bSBvZiBhIGdvbXBfaWN2X2xpc3Qgd2l0aAoJYSBwYXJ0aWN1bGFyIGRldmljZSBudW1iZXIu CgkoYWRkX2ljdl90b19saXN0KTogQWRkcyBhbiBJQ1Ygc3RydWN0IHRvIGEgZ29tcF9pY3Zf bGlzdC4KCShzdGFydHN3aXRoKTogQ2hlY2tzIGlmIGEgc3RyaW5nIHN0YXJ0cyB3aXRoIGEg Z2l2ZW4gcHJlZml4LgoJKGluaXRpYWxpemVfZW52KTogRXh0ZW5kZWQgdG8gcGFyc2UgdGhl IG5ldyBzeW50YXggb2YgZW52aXJvbm1lbnQKCXZhcmlhYmxlcy4KCSogaWN2LWRldmljZS5j IChvbXBfZ2V0X21heF90ZWFtcyk6IEFkZGVkLgoJKiBpY3YuYyAob21wX2dldF9tYXhfdGVh bXMpOiBNb3ZlZCB0byBpY3YtZGV2aWNlLmMuCgkqIGxpYmdvbXAtcGx1Z2luLmggKEdPTVBf REVGQVVMVF9ERVZJQ0VfVkFSKTogTmV3IHRhcmdldC1zaWRlIHZhcmlhYmxlCgl0aGF0IGhv bGRzIHRoZSBkZXNpZ25hdGVkIElDViBvZiB0aGUgdGFyZ2V0IGRldmljZS4KCShHT01QX05U RUFNU19WQVIpOiBMaWtld2lzZS4KCSogbGliZ29tcC5oIChlbnVtIGdvbXBfaWN2cyk6IENv bGxlY3Rpb24gb2YgSUNWcy4KCShlbnVtIGdvbXBfZW52X3N1ZmZpeCk6IENvbGxlY3Rpb24g b2YgcG9zc2libGUgc3VmZml4ZXMgb2YgZW52aXJvbm1lbnQKCXZhcmlhYmxlcy4KCShzdHJ1 Y3QgZ29tcF9pbml0aWFsX2ljdnMpOiBDb250YWlucyBhbGwgSUNWcyBmb3Igd2hpY2ggd2Ug bmVlZCB0byBzdG9yZQoJaW5pdGlhbCB2YWx1ZXMuCgkoc3RydWN0IGdvbXBfaWN2X2xpc3Qp OiBEZWZpbml0aW9uIG9mIGEgbGlua2VkIGxpc3QgdGhhdCBpcyB1c2VkIGZvcgoJc3Rvcmlu ZyBJQ1ZzIGZvciB0aGUgZGV2aWNlcyBhbmQgYWxzbyBmb3IgX0RFViwgX0FMTCwgYW5kIHdp dGhvdXQKCXN1ZmZpeC4KCShnb21wX2dldF9pbml0aWFsX2ljdl9pdGVtKTogR2V0IHRoZSBs aXN0IGl0ZW0gb2YgYSBnb21wX2ljdl9saXN0IHdpdGgKCWEgcGFydGljdWxhciBkZXZpY2Ug bnVtYmVyLgoJKGdvbXBfZ2V0X2ljdl9mbGFnKTogUmV0dXJucyBpZiBhIGZsYWcgZm9yIGEg cGFydGljdWxhciBJQ1YgaXMgc2V0LgoJKiBwbHVnaW4vcGx1Z2luLWdjbi5jIChHT01QX09G RkxPQURfbG9hZF9pbWFnZSk6IEV4dGVuZGVkIHRvIHJlYWQKCWZ1cnRoZXIgSUNWcyBmcm9t IHRoZSBvZmZsb2FkIGltYWdlLgoJKiBwbHVnaW4vcGx1Z2luLW52cHR4LmMgKEdPTVBfT0ZG TE9BRF9sb2FkX2ltYWdlKTogTGlrZXdpc2UuCgkqIHRhcmdldC5jIChnb21wX2dldF9pY3Yp OiBOZXcgaGVscGVyIGZ1bmN0aW9uIGZvcgoJJ2dvbXBfbG9hZF9pbWFnZV90b19kZXZpY2Un IHRoYXQgcmV0dXJucyB0aGUgcG9pbnRlciBmb3IgYW4gSUNWIHZhbHVlCglkZXBlbmRpbmcg b24gdGhlIGRldmljZSBudW1iZXIgYW5kIHRoZSB2YXJpYWJsZSBoaWVyYXJjaHkuCgkoZ29t cF9sb2FkX2ltYWdlX3RvX2RldmljZSk6IEV4dGVuZGVkIHRvIGNvcHkgZnVydGhlciBJQ1Zz IHRvIHRoZSBkZXZpY2UuCgkqIHRlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9pY3Yt NS5jOiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2ljdi02 LmM6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vaWN2LTcu YzogTmV3IHRlc3QuCgkqIHRlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9pY3YtOC5j OiBOZXcgdGVzdC4KCSogdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL29tcC1kaXNw bGF5LWVudi0xLmM6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21t b24vb21wLWRpc3BsYXktZW52LTIuYzogTmV3IHRlc3QuCgpkaWZmIC0tZ2l0IGEvbGliZ29t cC9jb25maWcvZ2NuL2ljdi1kZXZpY2UuYyBiL2xpYmdvbXAvY29uZmlnL2djbi9pY3YtZGV2 aWNlLmMKaW5kZXggZjcwYjdlNi4uOTY2Yzg2NCAxMDA2NDQKLS0tIGEvbGliZ29tcC9jb25m aWcvZ2NuL2ljdi1kZXZpY2UuYworKysgYi9saWJnb21wL2NvbmZpZy9nY24vaWN2LWRldmlj ZS5jCkBAIC0yOCw2ICsyOCwxMiBAQAogCiAjaW5jbHVkZSAibGliZ29tcC5oIgogCisvKiBU aGlzIGlzIHNldCB0byB0aGUgSUNWIHZhbHVlcyBvZiBjdXJyZW50IEdQVSBkdXJpbmcgZGV2 aWNlIGluaXRpYWxpemF0aW9uLAorICAgd2hlbiB0aGUgb2ZmbG9hZCBpbWFnZSBjb250YWlu aW5nIHRoaXMgbGliZ29tcCBwb3J0aW9uIGlzIGxvYWRlZC4gICovCit2b2xhdGlsZSBpbnQg R09NUF9ERVZJQ0VfTlVNX1ZBUjsKK3ZvbGF0aWxlIGludCBHT01QX0RFRkFVTFRfREVWSUNF X1ZBUjsKK3ZvbGF0aWxlIGludCBHT01QX05URUFNU19WQVI7CisKIHZvaWQKIG9tcF9zZXRf ZGVmYXVsdF9kZXZpY2UgKGludCBkZXZpY2VfbnVtIF9fYXR0cmlidXRlX18oKHVudXNlZCkp KQogewpAQCAtMzYsNyArNDIsNyBAQCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlIChpbnQgZGV2 aWNlX251bSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIGludAogb21wX2dldF9kZWZhdWx0 X2RldmljZSAodm9pZCkKIHsKLSAgcmV0dXJuIDA7CisgIHJldHVybiBHT01QX0RFRkFVTFRf REVWSUNFX1ZBUjsKIH0KIAogaW50CkBAIC01OCwxOSArNjQsMjIgQEAgb21wX2lzX2luaXRp YWxfZGV2aWNlICh2b2lkKQogICByZXR1cm4gMDsKIH0KIAotLyogVGhpcyBpcyBzZXQgdG8g dGhlIGRldmljZSBudW1iZXIgb2YgY3VycmVudCBHUFUgZHVyaW5nIGRldmljZSBpbml0aWFs aXphdGlvbiwKLSAgIHdoZW4gdGhlIG9mZmxvYWQgaW1hZ2UgY29udGFpbmluZyB0aGlzIGxp YmdvbXAgcG9ydGlvbiBpcyBsb2FkZWQuICAqLwotdm9sYXRpbGUgaW50IEdPTVBfREVWSUNF X05VTV9WQVI7Ci0KIGludAogb21wX2dldF9kZXZpY2VfbnVtICh2b2lkKQogewogICByZXR1 cm4gR09NUF9ERVZJQ0VfTlVNX1ZBUjsKIH0KIAoraW50CitvbXBfZ2V0X21heF90ZWFtcyAo dm9pZCkKK3sKKyAgcmV0dXJuIEdPTVBfTlRFQU1TX1ZBUjsKK30KKwogaWFsaWFzIChvbXBf c2V0X2RlZmF1bHRfZGV2aWNlKQogaWFsaWFzIChvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKQog aWFsaWFzIChvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKQogaWFsaWFzIChvbXBfZ2V0X251bV9k ZXZpY2VzKQogaWFsaWFzIChvbXBfaXNfaW5pdGlhbF9kZXZpY2UpCiBpYWxpYXMgKG9tcF9n ZXRfZGV2aWNlX251bSkKK2lhbGlhcyAob21wX2dldF9tYXhfdGVhbXMpCmRpZmYgLS1naXQg YS9saWJnb21wL2NvbmZpZy9udnB0eC9pY3YtZGV2aWNlLmMgYi9saWJnb21wL2NvbmZpZy9u dnB0eC9pY3YtZGV2aWNlLmMKaW5kZXggZmFmOTBmOS4uZGFjYWM4ZCAxMDA2NDQKLS0tIGEv bGliZ29tcC9jb25maWcvbnZwdHgvaWN2LWRldmljZS5jCisrKyBiL2xpYmdvbXAvY29uZmln L252cHR4L2ljdi1kZXZpY2UuYwpAQCAtMjgsNiArMjgsMTIgQEAKIAogI2luY2x1ZGUgImxp YmdvbXAuaCIKIAorLyogVGhpcyBpcyBzZXQgdG8gdGhlIElDViB2YWx1ZXMgb2YgY3VycmVu dCBHUFUgZHVyaW5nIGRldmljZSBpbml0aWFsaXphdGlvbiwKKyAgIHdoZW4gdGhlIG9mZmxv YWQgaW1hZ2UgY29udGFpbmluZyB0aGlzIGxpYmdvbXAgcG9ydGlvbiBpcyBsb2FkZWQuICAq Lworc3RhdGljIHZvbGF0aWxlIGludCBHT01QX0RFVklDRV9OVU1fVkFSOworc3RhdGljIHZv bGF0aWxlIGludCBHT01QX0RFRkFVTFRfREVWSUNFX1ZBUjsKK3N0YXRpYyB2b2xhdGlsZSBp bnQgR09NUF9OVEVBTVNfVkFSOworCiB2b2lkCiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlIChp bnQgZGV2aWNlX251bSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSkKIHsKQEAgLTM2LDcgKzQy LDcgQEAgb21wX3NldF9kZWZhdWx0X2RldmljZSAoaW50IGRldmljZV9udW0gX19hdHRyaWJ1 dGVfXygodW51c2VkKSkpCiBpbnQKIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgKHZvaWQpCiB7 Ci0gIHJldHVybiAwOworICByZXR1cm4gR09NUF9ERUZBVUxUX0RFVklDRV9WQVI7CiB9CiAK IGludApAQCAtNTgsMTkgKzY0LDIyIEBAIG9tcF9pc19pbml0aWFsX2RldmljZSAodm9pZCkK ICAgcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgaXMgc2V0IHRvIHRoZSBkZXZpY2UgbnVtYmVy IG9mIGN1cnJlbnQgR1BVIGR1cmluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24sCi0gICB3aGVu IHRoZSBvZmZsb2FkIGltYWdlIGNvbnRhaW5pbmcgdGhpcyBsaWJnb21wIHBvcnRpb24gaXMg bG9hZGVkLiAgKi8KLXN0YXRpYyB2b2xhdGlsZSBpbnQgR09NUF9ERVZJQ0VfTlVNX1ZBUjsK LQogaW50CiBvbXBfZ2V0X2RldmljZV9udW0gKHZvaWQpCiB7CiAgIHJldHVybiBHT01QX0RF VklDRV9OVU1fVkFSOwogfQogCitpbnQKK29tcF9nZXRfbWF4X3RlYW1zICh2b2lkKQorewor ICByZXR1cm4gR09NUF9OVEVBTVNfVkFSOworfQorCiBpYWxpYXMgKG9tcF9zZXRfZGVmYXVs dF9kZXZpY2UpCiBpYWxpYXMgKG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UpCiBpYWxpYXMgKG9t cF9nZXRfaW5pdGlhbF9kZXZpY2UpCiBpYWxpYXMgKG9tcF9nZXRfbnVtX2RldmljZXMpCiBp YWxpYXMgKG9tcF9pc19pbml0aWFsX2RldmljZSkKIGlhbGlhcyAob21wX2dldF9kZXZpY2Vf bnVtKQoraWFsaWFzIChvbXBfZ2V0X21heF90ZWFtcykKZGlmZiAtLWdpdCBhL2xpYmdvbXAv ZW52LmMgYi9saWJnb21wL2Vudi5jCmluZGV4IDFjNGVlODkuLmNjYjg5M2YgMTAwNjQ0Ci0t LSBhL2xpYmdvbXAvZW52LmMKKysrIGIvbGliZ29tcC9lbnYuYwpAQCAtNzMsNiArNzMsMTEg QEAgc3RydWN0IGdvbXBfdGFza19pY3YgZ29tcF9nbG9iYWxfaWN2ID0gewogICAudGFyZ2V0 X2RhdGEgPSBOVUxMCiB9OwogCisvKiBMaXN0IGZvciBpbml0aWFsICJfREVWIiwgIl9BTEwi LCBhbmQgIl9ERVZfWCIgSUNWcyBsaWtlIE9NUF9OVU1fVEVBTVNfREVWLAorICAgT01QX05V TV9URUFNU19BTEwsIG9yIE9NUF9OVU1fVEVBTVNfREVWXzQyLiAgKi8KKworc3RydWN0IGdv bXBfaWN2X2xpc3QgKmdvbXBfaW5pdGlhbF9pY3ZfbGlzdCA9IE5VTEw7CisKIGJvb2wgZ29t cF9jYW5jZWxfdmFyID0gZmFsc2U7CiBlbnVtIGdvbXBfdGFyZ2V0X29mZmxvYWRfdCBnb21w X3RhcmdldF9vZmZsb2FkX3ZhcgogICA9IEdPTVBfVEFSR0VUX09GRkxPQURfREVGQVVMVDsK QEAgLTEwNCw4NiArMTA5LDk0IEBAIGludCBnb2FjY19kZWZhdWx0X2RpbXNbR09NUF9ESU1f TUFYXTsKIHN0YXRpYyBpbnQgd2FpdF9wb2xpY3k7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBz dGFja3NpemUgPSBHT01QX0RFRkFVTFRfU1RBQ0tTSVpFOwogCi0vKiBQYXJzZSB0aGUgT01Q X1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KLQogc3RhdGljIHZvaWQKLXBh cnNlX3NjaGVkdWxlICh2b2lkKQorcHJpbnRfZW52X3Zhcl9lcnJvciAoY29uc3QgY2hhciAq ZW52LCBjb25zdCBjaGFyICp2YWwpCiB7Ci0gIGNoYXIgKmVudiwgKmVuZDsKKyAgY2hhciBu YW1lW3ZhbCAtIGVudl07CisgIG1lbWNweSAobmFtZSwgZW52LCB2YWwgLSBlbnYgLSAxKTsK KyAgbmFtZVt2YWwgLSBlbnYgLSAxXSA9ICdcMCc7CisgIGdvbXBfZXJyb3IgKCJJbnZhbGlk IHZhbHVlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSAlczogJXMiLCBuYW1lLCB2YWwpOwor fQorCisvKiBQYXJzZSB0aGUgT01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlLiAg Ki8KK3N0YXRpYyBib29sCitwYXJzZV9zY2hlZHVsZSAoY29uc3QgY2hhciAqZW52LCBjb25z dCBjaGFyICp2YWwsIHZvaWQgKiBjb25zdCBwYXJhbXNbXSkKK3sKKyAgZW51bSBnb21wX3Nj aGVkdWxlX3R5cGUgKnNjaGVkdWxlID0gKGVudW0gZ29tcF9zY2hlZHVsZV90eXBlICopIHBh cmFtc1swXTsKKyAgaW50ICpjaHVua19zaXplID0gKGludCAqKSBwYXJhbXNbMV07CisgIGNo YXIgKmVuZDsKICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKICAgaW50IG1vbm90b25pYyA9IDA7 CiAKLSAgZW52ID0gZ2V0ZW52ICgiT01QX1NDSEVEVUxFIik7Ci0gIGlmIChlbnYgPT0gTlVM TCkKLSAgICByZXR1cm47CisgIGlmICh2YWwgPT0gTlVMTCkKKyAgICByZXR1cm4gZmFsc2U7 CiAKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLSAgICArK2Vu djsKLSAgaWYgKHN0cm5jYXNlY21wIChlbnYsICJtb25vdG9uaWMiLCA5KSA9PSAwKQorICB3 aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFsOworICBp ZiAoc3RybmNhc2VjbXAgKHZhbCwgIm1vbm90b25pYyIsIDkpID09IDApCiAgICAgewogICAg ICAgbW9ub3RvbmljID0gMTsKLSAgICAgIGVudiArPSA5OworICAgICAgdmFsICs9IDk7CiAg ICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoZW52LCAibm9ubW9ub3RvbmljIiwgMTIp ID09IDApCisgIGVsc2UgaWYgKHN0cm5jYXNlY21wICh2YWwsICJub25tb25vdG9uaWMiLCAx MikgPT0gMCkKICAgICB7CiAgICAgICBtb25vdG9uaWMgPSAtMTsKLSAgICAgIGVudiArPSAx MjsKKyAgICAgIHZhbCArPSAxMjsKICAgICB9CiAgIGlmIChtb25vdG9uaWMpCiAgICAgewot ICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLQkrK2VudjsK LSAgICAgIGlmICgqZW52ICE9ICc6JykKKyAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWdu ZWQgY2hhcikgKnZhbCkpCisJKyt2YWw7CisgICAgICBpZiAoKnZhbCAhPSAnOicpCiAJZ290 byB1bmtub3duOwotICAgICAgKytlbnY7Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2ln bmVkIGNoYXIpICplbnYpKQotCSsrZW52OworICAgICAgKyt2YWw7CisgICAgICB3aGlsZSAo aXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICp2YWwpKQorCSsrdmFsOwogICAgIH0KLSAgaWYg KHN0cm5jYXNlY21wIChlbnYsICJzdGF0aWMiLCA2KSA9PSAwKQorICBpZiAoc3RybmNhc2Vj bXAgKHZhbCwgInN0YXRpYyIsIDYpID09IDApCiAgICAgewotICAgICAgZ29tcF9nbG9iYWxf aWN2LnJ1bl9zY2hlZF92YXIgPSBHRlNfU1RBVElDOwotICAgICAgZW52ICs9IDY7CisgICAg ICAqc2NoZWR1bGUgPSBHRlNfU1RBVElDOworICAgICAgdmFsICs9IDY7CiAgICAgfQotICBl bHNlIGlmIChzdHJuY2FzZWNtcCAoZW52LCAiZHluYW1pYyIsIDcpID09IDApCisgIGVsc2Ug aWYgKHN0cm5jYXNlY21wICh2YWwsICJkeW5hbWljIiwgNykgPT0gMCkKICAgICB7Ci0gICAg ICBnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX3ZhciA9IEdGU19EWU5BTUlDOwotICAgICAg ZW52ICs9IDc7CisgICAgICAqc2NoZWR1bGUgPSBHRlNfRFlOQU1JQzsKKyAgICAgIHZhbCAr PSA3OwogICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGVudiwgImd1aWRlZCIsIDYp ID09IDApCisgIGVsc2UgaWYgKHN0cm5jYXNlY21wICh2YWwsICJndWlkZWQiLCA2KSA9PSAw KQogICAgIHsKLSAgICAgIGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfdmFyID0gR0ZTX0dV SURFRDsKLSAgICAgIGVudiArPSA2OworICAgICAgKnNjaGVkdWxlID0gR0ZTX0dVSURFRDsK KyAgICAgIHZhbCArPSA2OwogICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGVudiwg ImF1dG8iLCA0KSA9PSAwKQorICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodmFsLCAiYXV0byIs IDQpID09IDApCiAgICAgewotICAgICAgZ29tcF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF92YXIg PSBHRlNfQVVUTzsKLSAgICAgIGVudiArPSA0OworICAgICAgKnNjaGVkdWxlID0gR0ZTX0FV VE87CisgICAgICB2YWwgKz0gNDsKICAgICB9CiAgIGVsc2UKICAgICBnb3RvIHVua25vd247 CiAKICAgaWYgKG1vbm90b25pYyA9PSAxCi0gICAgICB8fCAobW9ub3RvbmljID09IDAgJiYg Z29tcF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF92YXIgPT0gR0ZTX1NUQVRJQykpCi0gICAgZ29t cF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF92YXIgfD0gR0ZTX01PTk9UT05JQzsKKyAgICAgIHx8 IChtb25vdG9uaWMgPT0gMCAmJiAqc2NoZWR1bGUgPT0gR0ZTX1NUQVRJQykpCisgICAgKnNj aGVkdWxlIHw9IEdGU19NT05PVE9OSUM7CiAKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25l ZCBjaGFyKSAqZW52KSkKLSAgICArK2VudjsKLSAgaWYgKCplbnYgPT0gJ1wwJykKKyAgd2hp bGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKyAgICArK3ZhbDsKKyAgaWYg KCp2YWwgPT0gJ1wwJykKICAgICB7Ci0gICAgICBnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVk X2NodW5rX3NpemUKLQk9IChnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX3ZhciAmIH5HRlNf TU9OT1RPTklDKSAhPSBHRlNfU1RBVElDOwotICAgICAgcmV0dXJuOworICAgICAgKmNodW5r X3NpemUgPSAoKnNjaGVkdWxlICYgfkdGU19NT05PVE9OSUMpICE9IEdGU19TVEFUSUM7Cisg ICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gIGlmICgqZW52KysgIT0gJywnKQorICBpZiAo KnZhbCsrICE9ICcsJykKICAgICBnb3RvIHVua25vd247Ci0gIHdoaWxlIChpc3NwYWNlICgo dW5zaWduZWQgY2hhcikgKmVudikpCi0gICAgKytlbnY7Ci0gIGlmICgqZW52ID09ICdcMCcp CisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkpCisgICAgKyt2YWw7 CisgIGlmICgqdmFsID09ICdcMCcpCiAgICAgZ290byBpbnZhbGlkOwogCiAgIGVycm5vID0g MDsKLSAgdmFsdWUgPSBzdHJ0b3VsIChlbnYsICZlbmQsIDEwKTsKLSAgaWYgKGVycm5vIHx8 IGVuZCA9PSBlbnYpCisgIHZhbHVlID0gc3RydG91bCAodmFsLCAmZW5kLCAxMCk7CisgIGlm IChlcnJubyB8fCBlbmQgPT0gdmFsKQogICAgIGdvdG8gaW52YWxpZDsKIAogICB3aGlsZSAo aXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbmQpKQpAQCAtMTk0LDIwICsyMDcsMjIgQEAg cGFyc2Vfc2NoZWR1bGUgKHZvaWQpCiAgIGlmICgoaW50KXZhbHVlICE9IHZhbHVlKQogICAg IGdvdG8gaW52YWxpZDsKIAotICBpZiAodmFsdWUgPT0gMAotICAgICAgJiYgKGdvbXBfZ2xv YmFsX2ljdi5ydW5fc2NoZWRfdmFyICYgfkdGU19NT05PVE9OSUMpICE9IEdGU19TVEFUSUMp CisgIGlmICh2YWx1ZSA9PSAwICYmICgqc2NoZWR1bGUgJiB+R0ZTX01PTk9UT05JQykgIT0g R0ZTX1NUQVRJQykKICAgICB2YWx1ZSA9IDE7Ci0gIGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2No ZWRfY2h1bmtfc2l6ZSA9IHZhbHVlOwotICByZXR1cm47CisgICpjaHVua19zaXplID0gdmFs dWU7CisgIHJldHVybiB0cnVlOwogCiAgdW5rbm93bjoKLSAgZ29tcF9lcnJvciAoIlVua25v d24gdmFsdWUgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIE9NUF9TQ0hFRFVMRSIpOwotICBy ZXR1cm47CisgIHByaW50X2Vudl92YXJfZXJyb3IgKGVudiwgdmFsKTsKKyAgcmV0dXJuIGZh bHNlOwogCiAgaW52YWxpZDoKKyAgY2hhciBuYW1lW3ZhbCAtIGVudl07CisgIG1lbWNweSAo bmFtZSwgZW52LCB2YWwgLSBlbnYgLSAxKTsKKyAgbmFtZVt2YWwgLSBlbnYgLSAxXSA9ICdc MCc7CiAgIGdvbXBfZXJyb3IgKCJJbnZhbGlkIHZhbHVlIGZvciBjaHVuayBzaXplIGluICIK LQkgICAgICAiZW52aXJvbm1lbnQgdmFyaWFibGUgT01QX1NDSEVEVUxFIik7Ci0gIHJldHVy bjsKKwkgICAgICAiZW52aXJvbm1lbnQgdmFyaWFibGUgJXM6ICVzIiwgbmFtZSwgdmFsKTsK KyAgcmV0dXJuIGZhbHNlOwogfQogCiAvKiBQYXJzZSBhbiB1bnNpZ25lZCBsb25nIGVudmly b25tZW50IHZhcmlhYmxlLiAgUmV0dXJuIHRydWUgaWYgb25lIHdhcwpAQCAtMjE1LDI0ICsy MzAsMjMgQEAgcGFyc2Vfc2NoZWR1bGUgKHZvaWQpCiAgICBlbnZpcm9ubWVudCB2YXJpYWJs ZS4gICovCiAKIHN0YXRpYyBib29sCi1wYXJzZV91bnNpZ25lZF9sb25nXzEgKGNvbnN0IGNo YXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWx1ZSwgYm9vbCBhbGxvd196ZXJvLAotCQkg ICAgICAgYm9vbCBzZWN1cmUpCitwYXJzZV91bnNpZ25lZF9sb25nXzEgKGNvbnN0IGNoYXIg KmVudiwgY29uc3QgY2hhciAqdmFsLCB1bnNpZ25lZCBsb25nICpwdmFsdWUsCisJCSAgICAg ICBib29sIGFsbG93X3plcm8pCiB7Ci0gIGNoYXIgKmVudiwgKmVuZDsKKyAgY2hhciAqZW5k OwogICB1bnNpZ25lZCBsb25nIHZhbHVlOwogCi0gIGVudiA9IChzZWN1cmUgPyBzZWN1cmVf Z2V0ZW52IChuYW1lKSA6IGdldGVudiAobmFtZSkpOwotICBpZiAoZW52ID09IE5VTEwpCisg IGlmICh2YWwgPT0gTlVMTCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgd2hpbGUgKGlzc3Bh Y2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLSAgICArK2VudjsKLSAgaWYgKCplbnYgPT0g J1wwJykKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKyAgICAr K3ZhbDsKKyAgaWYgKCp2YWwgPT0gJ1wwJykKICAgICBnb3RvIGludmFsaWQ7CiAKICAgZXJy bm8gPSAwOwotICB2YWx1ZSA9IHN0cnRvdWwgKGVudiwgJmVuZCwgMTApOwotICBpZiAoZXJy bm8gfHwgZW5kID09IGVudiB8fCAobG9uZykgdmFsdWUgPD0gMCAtIGFsbG93X3plcm8pCisg IHZhbHVlID0gc3RydG91bCAodmFsLCAmZW5kLCAxMCk7CisgIGlmIChlcnJubyB8fCBlbmQg PT0gdmFsIHx8IChsb25nKSB2YWx1ZSA8PSAwIC0gYWxsb3dfemVybykKICAgICBnb3RvIGlu dmFsaWQ7CiAKICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW5kKSkKQEAg LTI0NCwxNiArMjU4LDM2IEBAIHBhcnNlX3Vuc2lnbmVkX2xvbmdfMSAoY29uc3QgY2hhciAq bmFtZSwgdW5zaWduZWQgbG9uZyAqcHZhbHVlLCBib29sIGFsbG93X3plcm8sCiAgIHJldHVy biB0cnVlOwogCiAgaW52YWxpZDoKLSAgZ29tcF9lcnJvciAoIkludmFsaWQgdmFsdWUgZm9y IGVudmlyb25tZW50IHZhcmlhYmxlICVzIiwgbmFtZSk7CisgIHByaW50X2Vudl92YXJfZXJy b3IgKGVudiwgdmFsKTsKICAgcmV0dXJuIGZhbHNlOwogfQogCiAvKiBBcyBwYXJzZV91bnNp Z25lZF9sb25nXzEsIGJ1dCBhbHdheXMgdXNlIGdldGVudi4gICovCiAKIHN0YXRpYyBib29s Ci1wYXJzZV91bnNpZ25lZF9sb25nIChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25n ICpwdmFsdWUsIGJvb2wgYWxsb3dfemVybykKK3BhcnNlX3Vuc2lnbmVkX2xvbmcgKGNvbnN0 IGNoYXIgKmVudiwgY29uc3QgY2hhciAqdmFsLCB2b2lkICogY29uc3QgcGFyYW1zW10pCiB7 Ci0gIHJldHVybiBwYXJzZV91bnNpZ25lZF9sb25nXzEgKG5hbWUsIHB2YWx1ZSwgYWxsb3df emVybywgZmFsc2UpOworICB1bnNpZ25lZCB1cHBlciA9ICh1bnNpZ25lZCBsb25nKSBwYXJh bXNbMl07CisgIHVuc2lnbmVkIGxvbmcgcHZhbHVlID0gMDsKKyAgYm9vbCByZXQgPSBwYXJz ZV91bnNpZ25lZF9sb25nXzEgKGVudiwgdmFsLCAmcHZhbHVlLCAoYm9vbCkgcGFyYW1zWzFd KTsKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICh1cHBlciA9PSAw KQorICAgICoodW5zaWduZWQgbG9uZyAqKSBwYXJhbXNbMF0gPSBwdmFsdWU7CisgIGVsc2UK KyAgICB7CisgICAgICBpZiAocHZhbHVlID4gdXBwZXIpCisJcHZhbHVlID0gdXBwZXI7Cisg ICAgICBpZiAodXBwZXIgPD0gVUNIQVJfTUFYKQorCSoodW5zaWduZWQgY2hhciAqKSBwYXJh bXNbMF0gPSBwdmFsdWU7CisgICAgICBlbHNlIGlmICh1cHBlciA8PSBVSU5UX01BWCkKKwkq KHVuc2lnbmVkIGludCAqKSBwYXJhbXNbMF0gPSBwdmFsdWU7CisgICAgICBlbHNlCisJKih1 bnNpZ25lZCBsb25nICopIHBhcmFtc1swXSA9IHB2YWx1ZTsKKyAgICB9CisKKyAgcmV0dXJu IHJldDsKIH0KIAogLyogUGFyc2UgYSBwb3NpdGl2ZSBpbnQgZW52aXJvbm1lbnQgdmFyaWFi bGUuICBSZXR1cm4gdHJ1ZSBpZiBvbmUgd2FzCkBAIC0yNjEsNTggKzI5NSw1NyBAQCBwYXJz ZV91bnNpZ25lZF9sb25nIChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwdmFs dWUsIGJvb2wgYWxsb3dfemVybykKICAgIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KIAog c3RhdGljIGJvb2wKLXBhcnNlX2ludF8xIChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnB2YWx1 ZSwgYm9vbCBhbGxvd196ZXJvLCBib29sIHNlY3VyZSkKK3BhcnNlX2ludF8xIChjb25zdCBj aGFyICplbnYsIGNvbnN0IGNoYXIgKnZhbCwgaW50ICpwdmFsdWUsIGJvb2wgYWxsb3dfemVy bykKIHsKICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgaWYgKCFwYXJzZV91bnNpZ25lZF9s b25nXzEgKG5hbWUsICZ2YWx1ZSwgYWxsb3dfemVybywgc2VjdXJlKSkKKyAgaWYgKCFwYXJz ZV91bnNpZ25lZF9sb25nXzEgKGVudiwgdmFsLCAmdmFsdWUsIGFsbG93X3plcm8pKQogICAg IHJldHVybiBmYWxzZTsKICAgaWYgKHZhbHVlID4gSU5UX01BWCkKICAgICB7Ci0gICAgICBn b21wX2Vycm9yICgiSW52YWxpZCB2YWx1ZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMi LCBuYW1lKTsKKyAgICAgIHByaW50X2Vudl92YXJfZXJyb3IgKGVudiwgdmFsKTsKICAgICAg IHJldHVybiBmYWxzZTsKICAgICB9CiAgICpwdmFsdWUgPSAoaW50KSB2YWx1ZTsKICAgcmV0 dXJuIHRydWU7CiB9CiAKLS8qIEFzIHBhcnNlX2ludF8xLCBidXQgdXNlIGdldGVudi4gICov Ci0KIHN0YXRpYyBib29sCi1wYXJzZV9pbnQgKGNvbnN0IGNoYXIgKm5hbWUsIGludCAqcHZh bHVlLCBib29sIGFsbG93X3plcm8pCitwYXJzZV9pbnQgKGNvbnN0IGNoYXIgKmVudiwgY29u c3QgY2hhciAqdmFsLCB2b2lkICogY29uc3QgcGFyYW1zW10pCiB7Ci0gIHJldHVybiBwYXJz ZV9pbnRfMSAobmFtZSwgcHZhbHVlLCBhbGxvd196ZXJvLCBmYWxzZSk7CisgIHJldHVybiBw YXJzZV9pbnRfMSAoZW52LCB2YWwsIChpbnQgKikgcGFyYW1zWzBdLCAoYm9vbCkgcGFyYW1z WzFdKTsKIH0KIAogLyogQXMgcGFyc2VfaW50XzEsIGJ1dCB1c2UgZ2V0ZW52X3NlY3VyZS4g ICovCiAKIHN0YXRpYyBib29sCi1wYXJzZV9pbnRfc2VjdXJlIChjb25zdCBjaGFyICpuYW1l LCBpbnQgKnB2YWx1ZSwgYm9vbCBhbGxvd196ZXJvKQorcGFyc2VfaW50X3NlY3VyZSAoY29u c3QgY2hhciAqZW52LCBpbnQgKnB2YWx1ZSwgYm9vbCBhbGxvd196ZXJvKQogewotICByZXR1 cm4gcGFyc2VfaW50XzEgKG5hbWUsIHB2YWx1ZSwgYWxsb3dfemVybywgdHJ1ZSk7CisgIHJl dHVybiBwYXJzZV9pbnRfMSAoZW52LCBzZWN1cmVfZ2V0ZW52IChlbnYpLCBwdmFsdWUsIGFs bG93X3plcm8pOwogfQogCiAvKiBQYXJzZSBhbiB1bnNpZ25lZCBsb25nIGxpc3QgZW52aXJv bm1lbnQgdmFyaWFibGUuICBSZXR1cm4gdHJ1ZSBpZiBvbmUgd2FzCiAgICBwcmVzZW50IGFu ZCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gICovCiAKIHN0YXRpYyBib29sCi1wYXJz ZV91bnNpZ25lZF9sb25nX2xpc3QgKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcg KnAxc3R2YWx1ZSwKLQkJCSAgdW5zaWduZWQgbG9uZyAqKnB2YWx1ZXMsCi0JCQkgIHVuc2ln bmVkIGxvbmcgKnBudmFsdWVzKQorcGFyc2VfdW5zaWduZWRfbG9uZ19saXN0IChjb25zdCBj aGFyICplbnYsIGNvbnN0IGNoYXIgKnZhbCwKKwkJCSAgdm9pZCAqIGNvbnN0IHBhcmFtc1td KQogewotICBjaGFyICplbnYsICplbmQ7CisgIHVuc2lnbmVkIGxvbmcgKnAxc3R2YWx1ZSA9 ICh1bnNpZ25lZCBsb25nICopIHBhcmFtc1swXTsKKyAgdW5zaWduZWQgbG9uZyAqKnB2YWx1 ZXMgPSAodW5zaWduZWQgbG9uZyAqKikgcGFyYW1zWzFdOworICB1bnNpZ25lZCBsb25nICpw bnZhbHVlcyA9ICh1bnNpZ25lZCBsb25nKikgcGFyYW1zWzJdOworICBjaGFyICplbmQ7CiAg IHVuc2lnbmVkIGxvbmcgdmFsdWUsICp2YWx1ZXMgPSBOVUxMOwogCi0gIGVudiA9IGdldGVu diAobmFtZSk7Ci0gIGlmIChlbnYgPT0gTlVMTCkKKyAgaWYgKHZhbCA9PSBOVUxMKQogICAg IHJldHVybiBmYWxzZTsKIAotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpl bnYpKQotICAgICsrZW52OwotICBpZiAoKmVudiA9PSAnXDAnKQorICB3aGlsZSAoaXNzcGFj ZSAoKHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAoKnZhbCA9PSAn XDAnKQogICAgIGdvdG8gaW52YWxpZDsKIAogICBlcnJubyA9IDA7Ci0gIHZhbHVlID0gc3Ry dG91bCAoZW52LCAmZW5kLCAxMCk7CisgIHZhbHVlID0gc3RydG91bCAodmFsLCAmZW5kLCAx MCk7CiAgIGlmIChlcnJubyB8fCAobG9uZykgdmFsdWUgPD0gMCkKICAgICBnb3RvIGludmFs aWQ7CiAKQEAgLTMyNiw3ICszNTksNyBAQCBwYXJzZV91bnNpZ25lZF9sb25nX2xpc3QgKGNv bnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnAxc3R2YWx1ZSwKIAogCSAgZG8KIAkg ICAgewotCSAgICAgIGVudiA9IGVuZCArIDE7CisJICAgICAgdmFsID0gZW5kICsgMTsKIAkg ICAgICBpZiAobnZhbHVlcyA9PSBuYWxsb2NlZCkKIAkJewogCQkgIHVuc2lnbmVkIGxvbmcg Km47CkBAIC0zMzUsNiArMzY4LDkgQEAgcGFyc2VfdW5zaWduZWRfbG9uZ19saXN0IChjb25z dCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwMXN0dmFsdWUsCiAJCSAgaWYgKG4gPT0g TlVMTCkKIAkJICAgIHsKIAkJICAgICAgZnJlZSAodmFsdWVzKTsKKwkJICAgICAgY2hhciBu YW1lW3ZhbCAtIGVudl07CisJCSAgICAgIG1lbWNweSAobmFtZSwgZW52LCB2YWwgLSBlbnYg LSAxKTsKKwkJICAgICAgbmFtZVt2YWwgLSBlbnYgLSAxXSA9ICdcMCc7CiAJCSAgICAgIGdv bXBfZXJyb3IgKCJPdXQgb2YgbWVtb3J5IHdoaWxlIHRyeWluZyB0byBwYXJzZSIKIAkJCQkg ICIgZW52aXJvbm1lbnQgdmFyaWFibGUgJXMiLCBuYW1lKTsKIAkJICAgICAgcmV0dXJuIGZh bHNlOwpAQCAtMzQ0LDEzICszODAsMTMgQEAgcGFyc2VfdW5zaWduZWRfbG9uZ19saXN0IChj b25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwMXN0dmFsdWUsCiAJCSAgICB2YWx1 ZXNbbnZhbHVlcysrXSA9IHZhbHVlOwogCQl9CiAKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAo KHVuc2lnbmVkIGNoYXIpICplbnYpKQotCQkrK2VudjsKLQkgICAgICBpZiAoKmVudiA9PSAn XDAnKQorCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkpCisJ CSsrdmFsOworCSAgICAgIGlmICgqdmFsID09ICdcMCcpCiAJCWdvdG8gaW52YWxpZDsKIAog CSAgICAgIGVycm5vID0gMDsKLQkgICAgICB2YWx1ZSA9IHN0cnRvdWwgKGVudiwgJmVuZCwg MTApOworCSAgICAgIHZhbHVlID0gc3RydG91bCAodmFsLCAmZW5kLCAxMCk7CiAJICAgICAg aWYgKGVycm5vIHx8IChsb25nKSB2YWx1ZSA8PSAwKQogCQlnb3RvIGludmFsaWQ7CiAKQEAg LTM3MCw1MiArNDA2LDU2IEBAIHBhcnNlX3Vuc2lnbmVkX2xvbmdfbGlzdCAoY29uc3QgY2hh ciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqcDFzdHZhbHVlLAogCX0KICAgICAgIGdvdG8gaW52 YWxpZDsKICAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICAqcG52YWx1ZXMgPSAwOworICAg ICAgKnB2YWx1ZXMgPSBOVUxMOworICAgIH0KIAogICAqcDFzdHZhbHVlID0gdmFsdWU7CiAg IHJldHVybiB0cnVlOwogCiAgaW52YWxpZDoKICAgZnJlZSAodmFsdWVzKTsKLSAgZ29tcF9l cnJvciAoIkludmFsaWQgdmFsdWUgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlICVzIiwgbmFt ZSk7CisgIHByaW50X2Vudl92YXJfZXJyb3IgKGVudiwgdmFsKTsKICAgcmV0dXJuIGZhbHNl OwogfQogCi1zdGF0aWMgdm9pZAotcGFyc2VfdGFyZ2V0X29mZmxvYWQgKGNvbnN0IGNoYXIg Km5hbWUsIGVudW0gZ29tcF90YXJnZXRfb2ZmbG9hZF90ICpvZmZsb2FkKQorc3RhdGljIGJv b2wKK3BhcnNlX3RhcmdldF9vZmZsb2FkIChjb25zdCBjaGFyICplbnYsIGNvbnN0IGNoYXIg KnZhbCwgdm9pZCAqIGNvbnN0IHBhcmFtc1tdKQogewotICBjb25zdCBjaGFyICplbnY7CiAg IGludCBuZXdfb2ZmbG9hZCA9IC0xOwogCi0gIGVudiA9IGdldGVudiAobmFtZSk7Ci0gIGlm IChlbnYgPT0gTlVMTCkKLSAgICByZXR1cm47CisgIGlmICh2YWwgPT0gTlVMTCkKKyAgICBy ZXR1cm4gZmFsc2U7CiAKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52 KSkKLSAgICArK2VudjsKLSAgaWYgKHN0cm5jYXNlY21wIChlbnYsICJkZWZhdWx0IiwgNykg PT0gMCkKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKyAgICAr K3ZhbDsKKyAgaWYgKHN0cm5jYXNlY21wICh2YWwsICJkZWZhdWx0IiwgNykgPT0gMCkKICAg ICB7Ci0gICAgICBlbnYgKz0gNzsKKyAgICAgIHZhbCArPSA3OwogICAgICAgbmV3X29mZmxv YWQgPSBHT01QX1RBUkdFVF9PRkZMT0FEX0RFRkFVTFQ7CiAgICAgfQotICBlbHNlIGlmIChz dHJuY2FzZWNtcCAoZW52LCAibWFuZGF0b3J5IiwgOSkgPT0gMCkKKyAgZWxzZSBpZiAoc3Ry bmNhc2VjbXAgKHZhbCwgIm1hbmRhdG9yeSIsIDkpID09IDApCiAgICAgewotICAgICAgZW52 ICs9IDk7CisgICAgICB2YWwgKz0gOTsKICAgICAgIG5ld19vZmZsb2FkID0gR09NUF9UQVJH RVRfT0ZGTE9BRF9NQU5EQVRPUlk7CiAgICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAo ZW52LCAiZGlzYWJsZWQiLCA4KSA9PSAwKQorICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodmFs LCAiZGlzYWJsZWQiLCA4KSA9PSAwKQogICAgIHsKLSAgICAgIGVudiArPSA4OworICAgICAg dmFsICs9IDg7CiAgICAgICBuZXdfb2ZmbG9hZCA9IEdPTVBfVEFSR0VUX09GRkxPQURfRElT QUJMRUQ7CiAgICAgfQotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbnYp KQotICAgICsrZW52OwotICBpZiAobmV3X29mZmxvYWQgIT0gLTEgJiYgKmVudiA9PSAnXDAn KQorICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFs OworICBpZiAobmV3X29mZmxvYWQgIT0gLTEgJiYgKnZhbCA9PSAnXDAnKQogICAgIHsKLSAg ICAgICpvZmZsb2FkID0gbmV3X29mZmxvYWQ7Ci0gICAgICByZXR1cm47CisgICAgICAqKGVu dW0gZ29tcF90YXJnZXRfb2ZmbG9hZF90ICopIHBhcmFtc1swXSA9IG5ld19vZmZsb2FkOwor ICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gIGdvbXBfZXJyb3IgKCJJbnZhbGlkIHZh bHVlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBPTVBfVEFSR0VUX09GRkxPQUQiKTsKKyAg cHJpbnRfZW52X3Zhcl9lcnJvciAoZW52LCB2YWwpOworICByZXR1cm4gZmFsc2U7CiB9CiAK IC8qIFBhcnNlIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCB0byBhIGJvb2xlYW4gb3IgbGlz dCBvZiBvbXBfcHJvY19iaW5kX3QKQEAgLTQyMywxMCArNDYzLDExIEBAIHBhcnNlX3Rhcmdl dF9vZmZsb2FkIChjb25zdCBjaGFyICpuYW1lLCBlbnVtIGdvbXBfdGFyZ2V0X29mZmxvYWRf dCAqb2ZmbG9hZCkKICAgIHBhcnNlZC4gICovCiAKIHN0YXRpYyBib29sCi1wYXJzZV9iaW5k X3ZhciAoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqcDFzdHZhbHVlLAotCQljaGFyICoqcHZh bHVlcywgdW5zaWduZWQgbG9uZyAqcG52YWx1ZXMpCitwYXJzZV9iaW5kX3ZhciAoY29uc3Qg Y2hhciAqZW52LCBjb25zdCBjaGFyICp2YWwsIHZvaWQgKiBjb25zdCBwYXJhbXNbXSkKIHsK LSAgY2hhciAqZW52OworICBjaGFyICpwMXN0dmFsdWUgPSAoY2hhciAqKSBwYXJhbXNbMF07 CisgIGNoYXIgKipwdmFsdWVzID0gKGNoYXIgKiopIHBhcmFtc1sxXTsKKyAgdW5zaWduZWQg bG9uZyAqcG52YWx1ZXMgPSAodW5zaWduZWQgbG9uZyAqKSBwYXJhbXNbMl07CiAgIGNoYXIg dmFsdWUgPSBvbXBfcHJvY19iaW5kX2ZhbHNlLCAqdmFsdWVzID0gTlVMTDsKICAgaW50IGk7 CiAgIHN0YXRpYyBzdHJ1Y3QgcHJvY19iaW5kX2tpbmRzCkBAIC00NDQsMzAgKzQ4NSwyOSBA QCBwYXJzZV9iaW5kX3ZhciAoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqcDFzdHZhbHVlLAog ICAgIHsgInNwcmVhZCIsIDYsIG9tcF9wcm9jX2JpbmRfc3ByZWFkIH0KICAgfTsKIAotICBl bnYgPSBnZXRlbnYgKG5hbWUpOwotICBpZiAoZW52ID09IE5VTEwpCisgIGlmICh2YWwgPT0g TlVMTCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25l ZCBjaGFyKSAqZW52KSkKLSAgICArK2VudjsKLSAgaWYgKCplbnYgPT0gJ1wwJykKKyAgd2hp bGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKyAgICArK3ZhbDsKKyAgaWYg KCp2YWwgPT0gJ1wwJykKICAgICBnb3RvIGludmFsaWQ7CiAKICAgZm9yIChpID0gMDsgaSA8 IDY7IGkrKykKLSAgICBpZiAoc3RybmNhc2VjbXAgKGVudiwga2luZHNbaV0ubmFtZSwga2lu ZHNbaV0ubGVuKSA9PSAwKQorICAgIGlmIChzdHJuY2FzZWNtcCAodmFsLCBraW5kc1tpXS5u YW1lLCBraW5kc1tpXS5sZW4pID09IDApCiAgICAgICB7CiAJdmFsdWUgPSBraW5kc1tpXS5r aW5kOwotCWVudiArPSBraW5kc1tpXS5sZW47CisJdmFsICs9IGtpbmRzW2ldLmxlbjsKIAli cmVhazsKICAgICAgIH0KICAgaWYgKGkgPT0gNikKICAgICBnb3RvIGludmFsaWQ7CiAKLSAg d2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLSAgICArK2VudjsKLSAg aWYgKCplbnYgIT0gJ1wwJykKKyAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAq dmFsKSkKKyAgICArK3ZhbDsKKyAgaWYgKCp2YWwgIT0gJ1wwJykKICAgICB7Ci0gICAgICBp ZiAoKmVudiA9PSAnLCcpCisgICAgICBpZiAoKnZhbCA9PSAnLCcpCiAJewogCSAgdW5zaWdu ZWQgbG9uZyBudmFsdWVzID0gMCwgbmFsbG9jZWQgPSAwOwogCkBAIC00NzcsNyArNTE3LDcg QEAgcGFyc2VfYmluZF92YXIgKGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKnAxc3R2YWx1ZSwK IAogCSAgZG8KIAkgICAgewotCSAgICAgIGVudisrOworCSAgICAgIHZhbCsrOwogCSAgICAg IGlmIChudmFsdWVzID09IG5hbGxvY2VkKQogCQl7CiAJCSAgY2hhciAqbjsKQEAgLTQ4Niw2 ICs1MjYsOSBAQCBwYXJzZV9iaW5kX3ZhciAoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqcDFz dHZhbHVlLAogCQkgIGlmIChuID09IE5VTEwpCiAJCSAgICB7CiAJCSAgICAgIGZyZWUgKHZh bHVlcyk7CisJCSAgICAgIGNoYXIgbmFtZVt2YWwgLSBlbnZdOworCQkgICAgICBtZW1jcHkg KG5hbWUsIGVudiwgdmFsIC0gZW52IC0gMSk7CisJCSAgICAgIG5hbWVbdmFsIC0gZW52IC0g MV0gPSAnXDAnOwogCQkgICAgICBnb21wX2Vycm9yICgiT3V0IG9mIG1lbW9yeSB3aGlsZSB0 cnlpbmcgdG8gcGFyc2UiCiAJCQkJICAiIGVudmlyb25tZW50IHZhcmlhYmxlICVzIiwgbmFt ZSk7CiAJCSAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQ5NSwyNyArNTM4LDI3IEBAIHBhcnNl X2JpbmRfdmFyIChjb25zdCBjaGFyICpuYW1lLCBjaGFyICpwMXN0dmFsdWUsCiAJCSAgICB2 YWx1ZXNbbnZhbHVlcysrXSA9IHZhbHVlOwogCQl9CiAKLQkgICAgICB3aGlsZSAoaXNzcGFj ZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotCQkrK2VudjsKLQkgICAgICBpZiAoKmVudiA9 PSAnXDAnKQorCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkp CisJCSsrdmFsOworCSAgICAgIGlmICgqdmFsID09ICdcMCcpCiAJCWdvdG8gaW52YWxpZDsK IAogCSAgICAgIGZvciAoaSA9IDI7IGkgPCA2OyBpKyspCi0JCWlmIChzdHJuY2FzZWNtcCAo ZW52LCBraW5kc1tpXS5uYW1lLCBraW5kc1tpXS5sZW4pID09IDApCisJCWlmIChzdHJuY2Fz ZWNtcCAodmFsLCBraW5kc1tpXS5uYW1lLCBraW5kc1tpXS5sZW4pID09IDApCiAJCSAgewog CQkgICAgdmFsdWUgPSBraW5kc1tpXS5raW5kOwotCQkgICAgZW52ICs9IGtpbmRzW2ldLmxl bjsKKwkJICAgIHZhbCArPSBraW5kc1tpXS5sZW47CiAJCSAgICBicmVhazsKIAkJICB9CiAJ ICAgICAgaWYgKGkgPT0gNikKIAkJZ290byBpbnZhbGlkOwogCiAJICAgICAgdmFsdWVzW252 YWx1ZXMrK10gPSB2YWx1ZTsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNo YXIpICplbnYpKQotCQkrK2VudjsKLQkgICAgICBpZiAoKmVudiA9PSAnXDAnKQorCSAgICAg IHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkpCisJCSsrdmFsOworCSAg ICAgIGlmICgqdmFsID09ICdcMCcpCiAJCWJyZWFrOwotCSAgICAgIGlmICgqZW52ICE9ICcs JykKKwkgICAgICBpZiAoKnZhbCAhPSAnLCcpCiAJCWdvdG8gaW52YWxpZDsKIAkgICAgfQog CSAgd2hpbGUgKDEpOwpAQCAtNTMyLDcgKzU3NSw3IEBAIHBhcnNlX2JpbmRfdmFyIChjb25z dCBjaGFyICpuYW1lLCBjaGFyICpwMXN0dmFsdWUsCiAKICBpbnZhbGlkOgogICBmcmVlICh2 YWx1ZXMpOwotICBnb21wX2Vycm9yICgiSW52YWxpZCB2YWx1ZSBmb3IgZW52aXJvbm1lbnQg dmFyaWFibGUgJXMiLCBuYW1lKTsKKyAgcHJpbnRfZW52X3Zhcl9lcnJvciAoZW52LCB2YWwp OwogICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTg2NSwyMyArOTA4LDIyIEBAIHBhcnNlX3Bs YWNlc192YXIgKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaWdub3JlKQogICAgcHJlc2VudCBh bmQgaXQgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICAqLwogCiBzdGF0aWMgYm9vbAotcGFy c2Vfc3RhY2tzaXplIChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpwdmFsdWUp CitwYXJzZV9zdGFja3NpemUgKGNvbnN0IGNoYXIgKmVudiwgY29uc3QgY2hhciAqdmFsLCB2 b2lkICogY29uc3QgcGFyYW1zW10pCiB7Ci0gIGNoYXIgKmVudiwgKmVuZDsKKyAgY2hhciAq ZW5kOwogICB1bnNpZ25lZCBsb25nIHZhbHVlLCBzaGlmdCA9IDEwOwogCi0gIGVudiA9IGdl dGVudiAobmFtZSk7Ci0gIGlmIChlbnYgPT0gTlVMTCkKKyAgaWYgKHZhbCA9PSBOVUxMKQog ICAgIHJldHVybiBmYWxzZTsKIAotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIp ICplbnYpKQotICAgICsrZW52OwotICBpZiAoKmVudiA9PSAnXDAnKQorICB3aGlsZSAoaXNz cGFjZSAoKHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFsOworICBpZiAoKnZhbCA9 PSAnXDAnKQogICAgIGdvdG8gaW52YWxpZDsKIAogICBlcnJubyA9IDA7Ci0gIHZhbHVlID0g c3RydG91bCAoZW52LCAmZW5kLCAxMCk7Ci0gIGlmIChlcnJubyB8fCBlbmQgPT0gZW52KQor ICB2YWx1ZSA9IHN0cnRvdWwgKHZhbCwgJmVuZCwgMTApOworICBpZiAoZXJybm8gfHwgZW5k ID09IHZhbCkKICAgICBnb3RvIGludmFsaWQ7CiAKICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNp Z25lZCBjaGFyKSAqZW5kKSkKQEAgLTkxNCwxMSArOTU2LDExIEBAIHBhcnNlX3N0YWNrc2l6 ZSAoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqcHZhbHVlKQogICBpZiAoKCh2 YWx1ZSA8PCBzaGlmdCkgPj4gc2hpZnQpICE9IHZhbHVlKQogICAgIGdvdG8gaW52YWxpZDsK IAotICAqcHZhbHVlID0gdmFsdWUgPDwgc2hpZnQ7CisgICoodW5zaWduZWQgbG9uZyAqKSBw YXJhbXNbMF0gPSB2YWx1ZSA8PCBzaGlmdDsKICAgcmV0dXJuIHRydWU7CiAKICBpbnZhbGlk OgotICBnb21wX2Vycm9yICgiSW52YWxpZCB2YWx1ZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFi bGUgJXMiLCBuYW1lKTsKKyAgcHJpbnRfZW52X3Zhcl9lcnJvciAoZW52LCB2YWwpOwogICBy ZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTk5OCwzNSArMTA0MCwzMyBAQCBwYXJzZV9zcGluY291 bnQgKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcHZhbHVlKQogLyog UGFyc2UgYSBib29sZWFuIHZhbHVlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBOQU1FIGFu ZCBzdG9yZSB0aGUKICAgIHJlc3VsdCBpbiBWQUxVRS4gIFJldHVybiB0cnVlIGlmIG9uZSB3 YXMgcHJlc2VudCBhbmQgaXQgd2FzCiAgICBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgKi8KLQog c3RhdGljIGJvb2wKLXBhcnNlX2Jvb2xlYW4gKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgKnZh bHVlKQorcGFyc2VfYm9vbGVhbiAoY29uc3QgY2hhciAqZW52LCBjb25zdCBjaGFyICp2YWws IHZvaWQgKiBjb25zdCBwYXJhbXNbXSkKIHsKLSAgY29uc3QgY2hhciAqZW52OworICBib29s ICp2YWx1ZSA9IChib29sICopIHBhcmFtc1swXTsKIAotICBlbnYgPSBnZXRlbnYgKG5hbWUp OwotICBpZiAoZW52ID09IE5VTEwpCisgIGlmICh2YWwgPT0gTlVMTCkKICAgICByZXR1cm4g ZmFsc2U7CiAKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLSAg ICArK2VudjsKLSAgaWYgKHN0cm5jYXNlY21wIChlbnYsICJ0cnVlIiwgNCkgPT0gMCkKKyAg d2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdmFsKSkKKyAgICArK3ZhbDsKKyAg aWYgKHN0cm5jYXNlY21wICh2YWwsICJ0cnVlIiwgNCkgPT0gMCkKICAgICB7CiAgICAgICAq dmFsdWUgPSB0cnVlOwotICAgICAgZW52ICs9IDQ7CisgICAgICB2YWwgKz0gNDsKICAgICB9 Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChlbnYsICJmYWxzZSIsIDUpID09IDApCisgIGVs c2UgaWYgKHN0cm5jYXNlY21wICh2YWwsICJmYWxzZSIsIDUpID09IDApCiAgICAgewogICAg ICAgKnZhbHVlID0gZmFsc2U7Ci0gICAgICBlbnYgKz0gNTsKKyAgICAgIHZhbCArPSA1Owog ICAgIH0KICAgZWxzZQotICAgIGVudiA9ICJYIjsKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNp Z25lZCBjaGFyKSAqZW52KSkKLSAgICArK2VudjsKLSAgaWYgKCplbnYgIT0gJ1wwJykKKyAg ICB2YWwgPSAiWCI7CisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkp CisgICAgKyt2YWw7CisgIGlmICgqdmFsICE9ICdcMCcpCiAgICAgewotICAgICAgZ29tcF9l cnJvciAoIkludmFsaWQgdmFsdWUgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlICVzIiwgbmFt ZSk7CisgICAgICBwcmludF9lbnZfdmFyX2Vycm9yIChlbnYsIHZhbCk7CiAgICAgICByZXR1 cm4gZmFsc2U7CiAgICAgfQogICByZXR1cm4gdHJ1ZTsKQEAgLTEwMzQsMzYgKzEwNzQsNDIg QEAgcGFyc2VfYm9vbGVhbiAoY29uc3QgY2hhciAqbmFtZSwgYm9vbCAqdmFsdWUpCiAKIC8q IFBhcnNlIHRoZSBPTVBfV0FJVF9QT0xJQ1kgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHJl dHVybiB0aGUgdmFsdWUuICAqLwogCi1zdGF0aWMgaW50Ci1wYXJzZV93YWl0X3BvbGljeSAo dm9pZCkKK3N0YXRpYyBib29sCitwYXJzZV93YWl0X3BvbGljeSAoY29uc3QgY2hhciAqZW52 LCBjb25zdCBjaGFyICp2YWwsIHZvaWQgKiBjb25zdCBwYXJhbXNbXSkKIHsKLSAgY29uc3Qg Y2hhciAqZW52OworICBpbnQgKnB2YWx1ZSA9IChpbnQgKikgcGFyYW1zWzBdOwogICBpbnQg cmV0ID0gLTE7CiAKLSAgZW52ID0gZ2V0ZW52ICgiT01QX1dBSVRfUE9MSUNZIik7Ci0gIGlm IChlbnYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7CisgIGlmICh2YWwgPT0gTlVMTCkKKyAg eworICAgICpwdmFsdWUgPSAtMTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KIAotICB3aGls ZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52OwotICBpZiAo c3RybmNhc2VjbXAgKGVudiwgImFjdGl2ZSIsIDYpID09IDApCisgIHdoaWxlIChpc3NwYWNl ICgodW5zaWduZWQgY2hhcikgKnZhbCkpCisgICAgKyt2YWw7CisgIGlmIChzdHJuY2FzZWNt cCAodmFsLCAiYWN0aXZlIiwgNikgPT0gMCkKICAgICB7CiAgICAgICByZXQgPSAxOwotICAg ICAgZW52ICs9IDY7CisgICAgICB2YWwgKz0gNjsKICAgICB9Ci0gIGVsc2UgaWYgKHN0cm5j YXNlY21wIChlbnYsICJwYXNzaXZlIiwgNykgPT0gMCkKKyAgZWxzZSBpZiAoc3RybmNhc2Vj bXAgKHZhbCwgInBhc3NpdmUiLCA3KSA9PSAwKQogICAgIHsKICAgICAgIHJldCA9IDA7Ci0g ICAgICBlbnYgKz0gNzsKKyAgICAgIHZhbCArPSA3OwogICAgIH0KICAgZWxzZQotICAgIGVu diA9ICJYIjsKLSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqZW52KSkKLSAg ICArK2VudjsKLSAgaWYgKCplbnYgPT0gJ1wwJykKLSAgICByZXR1cm4gcmV0OwotICBnb21w X2Vycm9yICgiSW52YWxpZCB2YWx1ZSBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgT01QX1dB SVRfUE9MSUNZIik7Ci0gIHJldHVybiAtMTsKKyAgICB2YWwgPSAiWCI7CisgIHdoaWxlIChp c3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkpCisgICAgKyt2YWw7CisgIGlmICgqdmFs ID09ICdcMCcpCisgICAgeworICAgICAgKnB2YWx1ZSA9IHJldDsKKyAgICAgIHJldHVybiB0 cnVlOworICAgIH0KKyAgcHJpbnRfZW52X3Zhcl9lcnJvciAoZW52LCB2YWwpOworICAqcHZh bHVlID0gLTE7CisgIHJldHVybiBmYWxzZTsKIH0KIAogLyogUGFyc2UgdGhlIEdPTVBfQ1BV X0FGRklOSVRZIGVudmlyb25tZW50IHZhcmlibGUuICBSZXR1cm4gdHJ1ZSBpZiBvbmUgd2Fz CkBAIC0xMTY3LDI2ICsxMjEzLDI0IEBAIHBhcnNlX2FmZmluaXR5IChib29sIGlnbm9yZSkK IH0KIAogLyogUGFyc2UgdGhlIE9NUF9BTExPQ0FUT1IgZW52aXJvbm1lbnQgdmFyaWFibGUg YW5kIHJldHVybiB0aGUgdmFsdWUuICAqLwotCi1zdGF0aWMgdWludHB0cl90Ci1wYXJzZV9h bGxvY2F0b3IgKHZvaWQpCitzdGF0aWMgYm9vbAorcGFyc2VfYWxsb2NhdG9yIChjb25zdCBj aGFyICplbnYsIGNvbnN0IGNoYXIgKnZhbCwgdm9pZCAqIGNvbnN0IHBhcmFtc1tdKQogewot ICBjb25zdCBjaGFyICplbnY7Ci0gIHVpbnRwdHJfdCByZXQgPSBvbXBfZGVmYXVsdF9tZW1f YWxsb2M7CisgIHVpbnRwdHJfdCAqcmV0ID0gKHVpbnRwdHJfdCAqKSBwYXJhbXNbMF07Cisg ICpyZXQgPSBvbXBfZGVmYXVsdF9tZW1fYWxsb2M7CiAKLSAgZW52ID0gZ2V0ZW52ICgiT01Q X0FMTE9DQVRPUiIpOwotICBpZiAoZW52ID09IE5VTEwpCi0gICAgcmV0dXJuIHJldDsKKyAg aWYgKHZhbCA9PSBOVUxMKQorICAgIHJldHVybiBmYWxzZTsKIAotICB3aGlsZSAoaXNzcGFj ZSAoKHVuc2lnbmVkIGNoYXIpICplbnYpKQotICAgICsrZW52OworICB3aGlsZSAoaXNzcGFj ZSAoKHVuc2lnbmVkIGNoYXIpICp2YWwpKQorICAgICsrdmFsOwogICBpZiAoMCkKICAgICA7 CiAjZGVmaW5lIEModikgXAotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoZW52LCAjdiwgc2l6 ZW9mICgjdikgLSAxKSA9PSAwKQlcCisgIGVsc2UgaWYgKHN0cm5jYXNlY21wICh2YWwsICN2 LCBzaXplb2YgKCN2KSAtIDEpID09IDApCVwKICAgICB7CQkJCQkJCVwKLSAgICAgIHJldCA9 IHY7CQkJCQkJXAotICAgICAgZW52ICs9IHNpemVvZiAoI3YpIC0gMTsJCQkJXAorICAgICAg KnJldCA9IHY7CQkJCQkJXAorICAgICAgdmFsICs9IHNpemVvZiAoI3YpIC0gMTsJCQkJXAog ICAgIH0KICAgQyAob21wX2RlZmF1bHRfbWVtX2FsbG9jKQogICBDIChvbXBfbGFyZ2VfY2Fw X21lbV9hbGxvYykKQEAgLTExOTgsMTMgKzEyNDIsMTQgQEAgcGFyc2VfYWxsb2NhdG9yICh2 b2lkKQogICBDIChvbXBfdGhyZWFkX21lbV9hbGxvYykKICN1bmRlZiBDCiAgIGVsc2UKLSAg ICBlbnYgPSAiWCI7Ci0gIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmVudikp Ci0gICAgKytlbnY7Ci0gIGlmICgqZW52ID09ICdcMCcpCi0gICAgcmV0dXJuIHJldDsKLSAg Z29tcF9lcnJvciAoIkludmFsaWQgdmFsdWUgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIE9N UF9BTExPQ0FUT1IiKTsKLSAgcmV0dXJuIG9tcF9kZWZhdWx0X21lbV9hbGxvYzsKKyAgICB2 YWwgPSAiWCI7CisgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnZhbCkpCisg ICAgKyt2YWw7CisgIGlmICgqdmFsID09ICdcMCcpCisgICAgcmV0dXJuIHRydWU7CisgIHBy aW50X2Vudl92YXJfZXJyb3IgKGVudiwgdmFsKTsKKyAgKnJldCA9IG9tcF9kZWZhdWx0X21l bV9hbGxvYzsKKyAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTI1MSw2 MiArMTI5Niw1OSBAQCBwYXJzZV9nb21wX29wZW5hY2NfZGltICh2b2lkKQogICAgIH0KIH0K IAotdm9pZAotb21wX2Rpc3BsYXlfZW52IChpbnQgdmVyYm9zZSkKLXsKLSAgaW50IGk7Ci0K LSAgZnB1dHMgKCJcbk9QRU5NUCBESVNQTEFZIEVOVklST05NRU5UIEJFR0lOXG4iLCBzdGRl cnIpOworLyogSGVscGVyIGZ1bmN0aW9uIGZvciBvbXBfZGlzcGxheV9lbnYgd2hpY2ggcHJp bnRzIHRoZSB2YWx1ZXMgb2YgcnVuX3NjaGVkX3Zhci4KKyAgICdkZXZpY2UnIGNhbiBiZSAn aG9zdCcsICdkZXYnLCAnYWxsJyBvciBhIHBhcnRpY3VsYXIgZGV2aWNlIG51bWJlci4gICov CiAKLSAgZnB1dHMgKCIgIF9PUEVOTVAgPSAnMjAxNTExJ1xuIiwgc3RkZXJyKTsKLSAgZnBy aW50ZiAoc3RkZXJyLCAiICBPTVBfRFlOQU1JQyA9ICclcydcbiIsCi0JICAgZ29tcF9nbG9i YWxfaWN2LmR5bl92YXIgPyAiVFJVRSIgOiAiRkFMU0UiKTsKLSAgZnByaW50ZiAoc3RkZXJy LCAiICBPTVBfTkVTVEVEID0gJyVzJ1xuIiwKLQkgICBnb21wX2dsb2JhbF9pY3YubWF4X2Fj dGl2ZV9sZXZlbHNfdmFyID4gMSA/ICJUUlVFIiA6ICJGQUxTRSIpOwotCi0gIGZwcmludGYg KHN0ZGVyciwgIiAgT01QX05VTV9USFJFQURTID0gJyVsdSIsIGdvbXBfZ2xvYmFsX2ljdi5u dGhyZWFkc192YXIpOwotICBmb3IgKGkgPSAxOyBpIDwgZ29tcF9udGhyZWFkc192YXJfbGlz dF9sZW47IGkrKykKLSAgICBmcHJpbnRmIChzdGRlcnIsICIsJWx1IiwgZ29tcF9udGhyZWFk c192YXJfbGlzdFtpXSk7Ci0gIGZwdXRzICgiJ1xuIiwgc3RkZXJyKTsKLQotICBmcHJpbnRm IChzdGRlcnIsICIgIE9NUF9TQ0hFRFVMRSA9ICciKTsKLSAgaWYgKChnb21wX2dsb2JhbF9p Y3YucnVuX3NjaGVkX3ZhciAmIEdGU19NT05PVE9OSUMpKQorc3RhdGljIHZvaWQKK3ByaW50 X3NjaGVkdWxlIChlbnVtIGdvbXBfc2NoZWR1bGVfdHlwZSBydW5fc2NoZWRfdmFyLCBpbnQg cnVuX3NjaGVkX2NodW5rX3NpemUsCisJCWNvbnN0IGNoYXIgKmRldmljZSkKK3sKKyAgZnBy aW50ZiAoc3RkZXJyLCAiICBbJXNdIE9NUF9TQ0hFRFVMRSA9ICciLCBkZXZpY2UpOworICBp ZiAoKHJ1bl9zY2hlZF92YXIgJiBHRlNfTU9OT1RPTklDKSkKICAgICB7Ci0gICAgICBpZiAo Z29tcF9nbG9iYWxfaWN2LnJ1bl9zY2hlZF92YXIgIT0gKEdGU19NT05PVE9OSUMgfCBHRlNf U1RBVElDKSkKKyAgICAgIGlmIChydW5fc2NoZWRfdmFyICE9IChHRlNfTU9OT1RPTklDIHwg R0ZTX1NUQVRJQykpCiAJZnB1dHMgKCJNT05PVE9OSUM6Iiwgc3RkZXJyKTsKICAgICB9Ci0g IGVsc2UgaWYgKGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfdmFyID09IEdGU19TVEFUSUMp CisgIGVsc2UgaWYgKHJ1bl9zY2hlZF92YXIgPT0gR0ZTX1NUQVRJQykKICAgICBmcHV0cyAo Ik5PTk1PTk9UT05JQzoiLCBzdGRlcnIpOwotICBzd2l0Y2ggKGdvbXBfZ2xvYmFsX2ljdi5y dW5fc2NoZWRfdmFyICYgfkdGU19NT05PVE9OSUMpCisgIHN3aXRjaCAocnVuX3NjaGVkX3Zh ciAmIH5HRlNfTU9OT1RPTklDKQogICAgIHsKICAgICBjYXNlIEdGU19SVU5USU1FOgogICAg ICAgZnB1dHMgKCJSVU5USU1FIiwgc3RkZXJyKTsKLSAgICAgIGlmIChnb21wX2dsb2JhbF9p Y3YucnVuX3NjaGVkX2NodW5rX3NpemUgIT0gMSkKLQlmcHJpbnRmIChzdGRlcnIsICIsJWQi LCBnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX2NodW5rX3NpemUpOworICAgICAgaWYgKHJ1 bl9zY2hlZF9jaHVua19zaXplICE9IDEpCisJZnByaW50ZiAoc3RkZXJyLCAiLCVkIiwgcnVu X3NjaGVkX2NodW5rX3NpemUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBHRlNfU1RBVElD OgogICAgICAgZnB1dHMgKCJTVEFUSUMiLCBzdGRlcnIpOwotICAgICAgaWYgKGdvbXBfZ2xv YmFsX2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6ZSAhPSAwKQotCWZwcmludGYgKHN0ZGVyciwg IiwlZCIsIGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6ZSk7CisgICAgICBp ZiAocnVuX3NjaGVkX2NodW5rX3NpemUgIT0gMCkKKwlmcHJpbnRmIChzdGRlcnIsICIsJWQi LCBydW5fc2NoZWRfY2h1bmtfc2l6ZSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIEdGU19E WU5BTUlDOgogICAgICAgZnB1dHMgKCJEWU5BTUlDIiwgc3RkZXJyKTsKLSAgICAgIGlmIChn b21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX2NodW5rX3NpemUgIT0gMSkKLQlmcHJpbnRmIChz dGRlcnIsICIsJWQiLCBnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVkX2NodW5rX3NpemUpOwor ICAgICAgaWYgKHJ1bl9zY2hlZF9jaHVua19zaXplICE9IDEpCisJZnByaW50ZiAoc3RkZXJy LCAiLCVkIiwgcnVuX3NjaGVkX2NodW5rX3NpemUpOwogICAgICAgYnJlYWs7CiAgICAgY2Fz ZSBHRlNfR1VJREVEOgogICAgICAgZnB1dHMgKCJHVUlERUQiLCBzdGRlcnIpOwotICAgICAg aWYgKGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6ZSAhPSAxKQotCWZwcmlu dGYgKHN0ZGVyciwgIiwlZCIsIGdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6 ZSk7CisgICAgICBpZiAocnVuX3NjaGVkX2NodW5rX3NpemUgIT0gMSkKKwlmcHJpbnRmIChz dGRlcnIsICIsJWQiLCBydW5fc2NoZWRfY2h1bmtfc2l6ZSk7CiAgICAgICBicmVhazsKICAg ICBjYXNlIEdGU19BVVRPOgogICAgICAgZnB1dHMgKCJBVVRPIiwgc3RkZXJyKTsKICAgICAg IGJyZWFrOwogICAgIH0KICAgZnB1dHMgKCInXG4iLCBzdGRlcnIpOworfQorCisvKiBIZWxw ZXIgZnVuY3Rpb24gZm9yIG9tcF9kaXNwbGF5X2VudiB3aGljaCBwcmludHMgdGhlIHZhbHVl cyBvZiBwcm9jX2JpbmRfdmFyLgorICAgJ2RldmljZScgY2FuIGJlICdob3N0JywgJ2Rldics ICdhbGwnLCBvciBhIHBhcnRpY3VsYXIgZGV2aWNlIG51bWJlci4gICovCiAKLSAgZnB1dHMg KCIgIE9NUF9QUk9DX0JJTkQgPSAnIiwgc3RkZXJyKTsKLSAgc3dpdGNoIChnb21wX2dsb2Jh bF9pY3YuYmluZF92YXIpCitzdGF0aWMgdm9pZAorcHJpbnRfcHJvY19iaW5kIChjaGFyIHBy b2NfYmluZF92YXIsIHVuc2lnbmVkIGxvbmcgbGVuLCBjaGFyICoqbGlzdCwKKwkJIGNvbnN0 IGNoYXIgKmRldmljZSkKK3sKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBbJXNdIE9NUF9QUk9D X0JJTkQgPSAnIiwgZGV2aWNlKTsKKyAgc3dpdGNoIChwcm9jX2JpbmRfdmFyKQogICAgIHsK ICAgICBjYXNlIG9tcF9wcm9jX2JpbmRfZmFsc2U6CiAgICAgICBmcHV0cyAoIkZBTFNFIiwg c3RkZXJyKTsKQEAgLTEzMjQsOCArMTM2Niw4IEBAIG9tcF9kaXNwbGF5X2VudiAoaW50IHZl cmJvc2UpCiAgICAgICBmcHV0cyAoIlNQUkVBRCIsIHN0ZGVycik7CiAgICAgICBicmVhazsK ICAgICB9Ci0gIGZvciAoaSA9IDE7IGkgPCBnb21wX2JpbmRfdmFyX2xpc3RfbGVuOyBpKysp Ci0gICAgc3dpdGNoIChnb21wX2JpbmRfdmFyX2xpc3RbaV0pCisgIGZvciAoaW50IGkgPSAx OyBpIDwgbGVuOyBpKyspCisgICAgc3dpdGNoICgoKmxpc3QpW2ldKQogICAgICAgewogICAg ICAgY2FzZSBvbXBfcHJvY19iaW5kX21hc3RlcjoKIAlmcHV0cyAoIixNQVNURVIiLCBzdGRl cnIpOyAvKiBUT0RPOiBDaGFuZ2UgdG8gUFJJTUFSWSBmb3IgT3Blbk1QIDUuMS4gKi8KQEAg LTEzMzgsNyArMTM4MCwyODUgQEAgb21wX2Rpc3BsYXlfZW52IChpbnQgdmVyYm9zZSkKIAli cmVhazsKICAgICAgIH0KICAgZnB1dHMgKCInXG4iLCBzdGRlcnIpOwotICBmcHV0cyAoIiAg T01QX1BMQUNFUyA9ICciLCBzdGRlcnIpOworfQorCitlbnVtIGdvbXBfcGFyc2VfdHlwZQor eworICBQQVJTRV9JTlQgPSAxLAorICBQQVJTRV9CT09MID0gMiwKKyAgUEFSU0VfVUlOVCA9 IDMsCisgIFBBUlNFX1VMT05HID0gNCwKKyAgUEFSU0VfQ0hBUiA9IDUsCisgIFBBUlNFX1VD SEFSID0gNgorfTsKKworLyogVGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyBpdGVtcyB0 aGF0IGhlbHAgcGFyc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgIGFuZCBmaWxsIGNv cnJlc3BvbmRpbmcgSUNWcyB3aXRoIHZhbHVlcy4gIEZMQUdfVkFSUyBjb250YWluIGFsbCBJ Q1ZTIHdoaWNoCisgICBhcmUgYWZmZWN0ZWQgYnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxl LiAgRkxBR1MgZGV0ZXJtaW5lIHdoYXQgdmFyaWFudCBvZgorICAgZW52aXJvbm1lbnQgdmFy aWFibGUgaXMgYWxsb3dlZC4gICovCisKKyNkZWZpbmUgRU5UUlkoTkFNRSkgTkFNRSwgc2l6 ZW9mIChOQU1FKSAtIDEKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW52dmFyCit7CisgIGNvbnN0 IGNoYXIgKm5hbWU7CisgIGludCBuYW1lX2xlbjsKKyAgdWludDhfdCBmbGFnX3ZhcnNbM107 CisgIHVpbnQ4X3QgZmxhZzsKKyAgYm9vbCAoKnBhcnNlX2Z1bmMpIChjb25zdCBjaGFyICos IGNvbnN0IGNoYXIgKiwgdm9pZCAqIGNvbnN0W10pOworfSBlbnZ2YXJzW10gPSB7CisgIHsg RU5UUlkgKCJPTVBfU0NIRURVTEUiKSwKKyAgICB7IEdPTVBfSUNWX1NDSEVEVUxFLCBHT01Q X0lDVl9TQ0hFRFVMRV9DSFVOS19TSVpFIH0sCisgICAgR09NUF9FTlZfU1VGRklYX0RFViB8 IEdPTVBfRU5WX1NVRkZJWF9BTEwgfCBHT01QX0VOVl9TVUZGSVhfREVWX1gsCisgICAgJnBh cnNlX3NjaGVkdWxlIH0sCisgIHsgRU5UUlkgKCJPTVBfTlVNX1RFQU1TIiksCisgICAgeyBH T01QX0lDVl9OVEVBTVMgfSwKKyAgICBHT01QX0VOVl9TVUZGSVhfREVWIHwgR09NUF9FTlZf U1VGRklYX0FMTCB8IEdPTVBfRU5WX1NVRkZJWF9ERVZfWCwKKyAgICAmcGFyc2VfaW50IH0s CisgIHsgRU5UUlkgKCJPTVBfRFlOQU1JQyIpLAorICAgIHsgR09NUF9JQ1ZfRFlOQU1JQyB9 LAorICAgIEdPTVBfRU5WX1NVRkZJWF9ERVYgfCBHT01QX0VOVl9TVUZGSVhfQUxMIHwgR09N UF9FTlZfU1VGRklYX0RFVl9YLAorICAgICZwYXJzZV9ib29sZWFuIH0sCisgIHsgRU5UUlkg KCJPTVBfVEVBTVNfVEhSRUFEX0xJTUlUIiksCisgICAgeyBHT01QX0lDVl9URUFNU19USFJF QURfTElNSVQgfSwKKyAgICBHT01QX0VOVl9TVUZGSVhfREVWIHwgR09NUF9FTlZfU1VGRklY X0FMTCB8IEdPTVBfRU5WX1NVRkZJWF9ERVZfWCwKKyAgICAmcGFyc2VfaW50IH0sCisgIHsg RU5UUlkgKCJPTVBfVEhSRUFEX0xJTUlUIiksCisgICAgeyBHT01QX0lDVl9USFJFQURfTElN SVQgfSwKKyAgICBHT01QX0VOVl9TVUZGSVhfREVWIHwgR09NUF9FTlZfU1VGRklYX0FMTCB8 IEdPTVBfRU5WX1NVRkZJWF9ERVZfWCwKKyAgICAmcGFyc2VfdW5zaWduZWRfbG9uZyB9LAor ICB7IEVOVFJZICgiT01QX05VTV9USFJFQURTIiksCisgICAgeyBHT01QX0lDVl9OVEhSRUFE UywgR09NUF9JQ1ZfTlRIUkVBRFNfTElTVCwgR09NUF9JQ1ZfTlRIUkVBRFNfTElTVF9MRU4g fSwKKyAgICBHT01QX0VOVl9TVUZGSVhfREVWIHwgR09NUF9FTlZfU1VGRklYX0FMTCB8IEdP TVBfRU5WX1NVRkZJWF9ERVZfWCwKKyAgICAmcGFyc2VfdW5zaWduZWRfbG9uZ19saXN0IH0s CisgIHsgRU5UUlkgKCJPTVBfUFJPQ19CSU5EIiksCisgICAgeyBHT01QX0lDVl9CSU5ELCBH T01QX0lDVl9CSU5EX0xJU1QsIEdPTVBfSUNWX0JJTkRfTElTVF9MRU4gfSwKKyAgICBHT01Q X0VOVl9TVUZGSVhfREVWIHwgR09NUF9FTlZfU1VGRklYX0FMTCB8IEdPTVBfRU5WX1NVRkZJ WF9ERVZfWCwKKyAgICAmcGFyc2VfYmluZF92YXIgfSwKKyAgeyBFTlRSWSAoIk9NUF9NQVhf QUNUSVZFX0xFVkVMUyIpLAorICAgIHsgR09NUF9JQ1ZfTUFYX0FDVElWRV9MRVZFTFMgfSwK KyAgICBHT01QX0VOVl9TVUZGSVhfREVWIHwgR09NUF9FTlZfU1VGRklYX0FMTCB8IEdPTVBf RU5WX1NVRkZJWF9ERVZfWCwKKyAgICAmcGFyc2VfdW5zaWduZWRfbG9uZyB9LAorICB7IEVO VFJZICgiT01QX1dBSVRfUE9MSUNZIiksCisgICAgeyBHT01QX0lDVl9XQUlUX1BPTElDWSB9 LAorICAgIEdPTVBfRU5WX1NVRkZJWF9ERVYgfCBHT01QX0VOVl9TVUZGSVhfQUxMIHwgR09N UF9FTlZfU1VGRklYX0RFVl9YLAorICAgICZwYXJzZV93YWl0X3BvbGljeSB9LAorICB7IEVO VFJZICgiT01QX1NUQUNLU0laRSIpLAorICAgIHsgR09NUF9JQ1ZfU1RBQ0tTSVpFIH0sCisg ICAgR09NUF9FTlZfU1VGRklYX0RFViB8IEdPTVBfRU5WX1NVRkZJWF9BTEwgfCBHT01QX0VO Vl9TVUZGSVhfREVWX1gsCisgICAgJnBhcnNlX3N0YWNrc2l6ZSB9LAorICB7IEVOVFJZICgi T01QX0NBTkNFTExBVElPTiIpLCB7IEdPTVBfSUNWX0NBTkNFTExBVElPTiB9LCAwLCAmcGFy c2VfYm9vbGVhbiB9LAorICB7IEVOVFJZICgiT01QX0RJU1BMQVlfQUZGSU5JVFkiKSwgeyBH T01QX0lDVl9ESVNQTEFZX0FGRklOSVRZIH0sIDAsCisgICAgJnBhcnNlX2Jvb2xlYW4gfSwK KyAgeyBFTlRSWSAoIk9NUF9UQVJHRVRfT0ZGTE9BRCIpLCB7IEdPTVBfSUNWX1RBUkdFVF9P RkZMT0FEIH0sIDAsCisgICAgJnBhcnNlX3RhcmdldF9vZmZsb2FkIH0sCisgIHsgRU5UUlkg KCJPTVBfTUFYX1RBU0tfUFJJT1JJVFkiKSwgeyBHT01QX0lDVl9NQVhfVEFTS19QUklPUklU WSB9LCAwLAorICAgICZwYXJzZV9pbnQgfSwKKyAgeyBFTlRSWSAoIk9NUF9BTExPQ0FUT1Ii KSwgeyBHT01QX0lDVl9BTExPQ0FUT1IgfSwgMCwgJnBhcnNlX2FsbG9jYXRvciB9LAorICB7 IEVOVFJZICgiT01QX0RFRkFVTFRfREVWSUNFIiksIHsgR09NUF9JQ1ZfREVGQVVMVF9ERVZJ Q0UgfSwgMCwgJnBhcnNlX2ludCB9Cit9OworI3VuZGVmIEVOVFJZCisjZGVmaW5lIE9NUF9W QVJfQ05UIChzaXplb2YgKGVudnZhcnMpIC8gc2l6ZW9mIChlbnZ2YXJzWzBdKSkKKworLyog VGhlIGZvbGxvd2luZyB0YWJsZSBpcyB1c2VkIHRvIGFwcGx5IHRoZSBoaWVyYXJjaHkgb2Yg SUNWIHZhcmlhbnRzIGZvciBob3N0CisgICB2YXJpYWJsZXMsIGUuZy4gbnRlYW1zX3ZhciBp cyBzZXQgdG8gT01QX05VTV9URUFNU19BTEwgaWYgT01QX05VTV9URUFNUyBpcworICAgdW5k ZWZpbmVkLiAgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBob3N0X2VudnZhcgoreworICB1 bnNpZ25lZCBjaGFyIGZsYWdfdmFyOworICB2b2lkICpkZXN0WzNdOworICBpbnQgdHlwZV9j b2RlOworfSBob3N0X2VudnZhcnNbXSA9IHsKKyAgeyBHT01QX0lDVl9OVEVBTVMsIHsgJmdv bXBfbnRlYW1zX3ZhciB9LCBQQVJTRV9JTlQgfSwKKyAgeyBHT01QX0lDVl9EWU5BTUlDLCB7 ICZnb21wX2dsb2JhbF9pY3YuZHluX3ZhciB9LCBQQVJTRV9CT09MIH0sCisgIHsgR09NUF9J Q1ZfREVGQVVMVF9ERVZJQ0UsIHsgJmdvbXBfZ2xvYmFsX2ljdi5kZWZhdWx0X2RldmljZV92 YXIgfSwKKyAgICBQQVJTRV9JTlQgfSwKKyAgeyBHT01QX0lDVl9URUFNU19USFJFQURfTElN SVQsIHsgJmdvbXBfdGVhbXNfdGhyZWFkX2xpbWl0X3ZhciB9LCBQQVJTRV9JTlQgfSwKKyAg eyBHT01QX0lDVl9TQ0hFRFVMRSwKKyAgICB7ICZnb21wX2dsb2JhbF9pY3YucnVuX3NjaGVk X3ZhciwgJmdvbXBfZ2xvYmFsX2ljdi5ydW5fc2NoZWRfY2h1bmtfc2l6ZSB9LAorICAgIFBB UlNFX0lOVCB9LAorICB7IEdPTVBfSUNWX1RIUkVBRF9MSU1JVCwgeyAmZ29tcF9nbG9iYWxf aWN2LnRocmVhZF9saW1pdF92YXIgfSwgUEFSU0VfVUlOVCB9LAorICB7IEdPTVBfSUNWX05U SFJFQURTLAorICAgIHsgJmdvbXBfZ2xvYmFsX2ljdi5udGhyZWFkc192YXIsICZnb21wX250 aHJlYWRzX3Zhcl9saXN0LAorICAgICAgJmdvbXBfbnRocmVhZHNfdmFyX2xpc3RfbGVuIH0s IFBBUlNFX1VMT05HIH0sCisgIHsgR09NUF9JQ1ZfQklORCwKKyAgICB7ICZnb21wX2dsb2Jh bF9pY3YuYmluZF92YXIsICZnb21wX2JpbmRfdmFyX2xpc3QsICZnb21wX2JpbmRfdmFyX2xp c3RfbGVuIH0sCisgICAgUEFSU0VfQ0hBUiB9LAorICB7IEdPTVBfSUNWX01BWF9BQ1RJVkVf TEVWRUxTLCB7ICZnb21wX2dsb2JhbF9pY3YubWF4X2FjdGl2ZV9sZXZlbHNfdmFyIH0sCisg ICAgUEFSU0VfVUNIQVIgfSwKK307CisjZGVmaW5lIE9NUF9IT1NUX1ZBUl9DTlQgKHNpemVv ZiAoaG9zdF9lbnZ2YXJzKSAvIHNpemVvZiAoaG9zdF9lbnZ2YXJzWzBdKSkKKworI2RlZmlu ZSBJTlRfTUFYX1NUUl9MRU4gMTAKKworYm9vbAorZ29tcF9nZXRfaWN2X2ZsYWcgKHVpbnQz Ml90IHZhbHVlLCBlbnVtIGdvbXBfaWN2cyBpY3YpCit7CisgIHJldHVybiB2YWx1ZSAmICgx IDw8IChpY3YgLSAxKSk7Cit9CisKK3N0YXRpYyB2b2lkCitnb21wX3NldF9pY3ZfZmxhZyAo dWludDMyX3QgKnZhbHVlLCBlbnVtIGdvbXBfaWN2cyBpY3YpCit7CisgICp2YWx1ZSB8PSAx IDw8IChpY3YgLSAxKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2RldmljZV9zcGVjaWZp Y19pY3ZzIChpbnQgaWN2X2NvZGUpCit7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICpsaXN0 ID0gZ29tcF9pbml0aWFsX2ljdl9saXN0OworICBpbnQgaTsKKyAgY2hhciBkZXZfbnVtW0lO VF9NQVhfU1RSX0xFTiArIDFdOworCisgIHdoaWxlIChsaXN0ICE9IE5VTEwpCisgICAgewor ICAgICAgaWYgKGxpc3QtPmRldmljZV9udW0gPCAwKQorCXsKKwkgIGxpc3QgPSBsaXN0LT5u ZXh0OworCSAgY29udGludWU7CisJfQorCisgICAgICBzd2l0Y2ggKGljdl9jb2RlKQorCXsK KwljYXNlIEdPTVBfSUNWX05URUFNUzoKKwkgIGlmIChnb21wX2dldF9pY3ZfZmxhZyAobGlz dC0+ZmxhZ3MsIEdPTVBfSUNWX05URUFNUykpCisJICAgIGZwcmludGYgKHN0ZGVyciwgIiAg WyVkXSBPTVBfTlVNX1RFQU1TID0gJyVkJ1xuIiwKKwkJICAgICBsaXN0LT5kZXZpY2VfbnVt LCBsaXN0LT5pY3ZzLm50ZWFtc192YXIpOworCSAgYnJlYWs7CisJY2FzZSBHT01QX0lDVl9E WU5BTUlDOgorCSAgaWYgKGdvbXBfZ2V0X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9J Q1ZfRFlOQU1JQykpCisJICAgIGZwcmludGYgKHN0ZGVyciwgIiAgWyVkXSBPTVBfRFlOQU1J QyA9ICclcydcbiIsCisJCSAgICAgbGlzdC0+ZGV2aWNlX251bSwgbGlzdC0+aWN2cy5keW5f dmFyID8gIlRSVUUiIDogIkZBTFNFIik7CisJICBicmVhazsKKwljYXNlIEdPTVBfSUNWX1RF QU1TX1RIUkVBRF9MSU1JVDoKKwkgIGlmIChnb21wX2dldF9pY3ZfZmxhZyAobGlzdC0+Zmxh Z3MsIEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCkpCisJICAgIGZwcmludGYgKHN0ZGVy ciwgIiAgWyVkXSBPTVBfVEVBTVNfVEhSRUFEX0xJTUlUID0gJyV1J1xuIiwKKwkJICAgICBs aXN0LT5kZXZpY2VfbnVtLCBsaXN0LT5pY3ZzLnRlYW1zX3RocmVhZF9saW1pdF92YXIpOwor CSAgYnJlYWs7CisJY2FzZSBHT01QX0lDVl9TQ0hFRFVMRToKKwkgIGlmICghKGdvbXBfZ2V0 X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9JQ1ZfU0NIRURVTEUpKSkKKwkgICAgYnJl YWs7CisJICBzcHJpbnRmIChkZXZfbnVtLCAiJWQiLCBsaXN0LT5kZXZpY2VfbnVtKTsKKwkg IHByaW50X3NjaGVkdWxlIChsaXN0LT5pY3ZzLnJ1bl9zY2hlZF92YXIsCisJCQkgIGxpc3Qt PmljdnMucnVuX3NjaGVkX2NodW5rX3NpemUsCisJCQkgIGRldl9udW0pOworCSAgYnJlYWs7 CisJY2FzZSBHT01QX0lDVl9USFJFQURfTElNSVQ6CisJICBpZiAoZ29tcF9nZXRfaWN2X2Zs YWcgKGxpc3QtPmZsYWdzLCBHT01QX0lDVl9USFJFQURfTElNSVQpKQorCSAgICBmcHJpbnRm IChzdGRlcnIsICIgIFslZF0gT01QX1RIUkVBRF9MSU1JVCA9ICclZCdcbiIsCisJCSAgICAg bGlzdC0+ZGV2aWNlX251bSwgbGlzdC0+aWN2cy50aHJlYWRfbGltaXRfdmFyKTsKKwkgIGJy ZWFrOworCWNhc2UgR09NUF9JQ1ZfTlRIUkVBRFM6CisJICBpZiAoIShnb21wX2dldF9pY3Zf ZmxhZyAobGlzdC0+ZmxhZ3MsIEdPTVBfSUNWX05USFJFQURTKSkpCisJICAgIGJyZWFrOwor CSAgZnByaW50ZiAoc3RkZXJyLCAiICBbJWRdIE9NUF9OVU1fVEhSRUFEUyA9ICclbHUiLCBs aXN0LT5kZXZpY2VfbnVtLAorCQkgICBsaXN0LT5pY3ZzLm50aHJlYWRzX3Zhcik7CisJICBm b3IgKGkgPSAxOyBpIDwgbGlzdC0+aWN2cy5udGhyZWFkc192YXJfbGlzdF9sZW47IGkrKykK KwkgICAgZnByaW50ZiAoc3RkZXJyLCAiLCVsdSIsIGxpc3QtPmljdnMubnRocmVhZHNfdmFy X2xpc3RbaV0pOworCSAgZnB1dHMgKCInXG4iLCBzdGRlcnIpOworCSAgYnJlYWs7CisJY2Fz ZSBHT01QX0lDVl9NQVhfQUNUSVZFX0xFVkVMUzoKKwkgIGZwcmludGYgKHN0ZGVyciwgIiAg WyVkXSBPTVBfTUFYX0FDVElWRV9MRVZFTFMgPSAnJXUnXG4iLAorCQkgICBsaXN0LT5kZXZp Y2VfbnVtLCBsaXN0LT5pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzX3Zhcik7CisJICBicmVhazsK KwljYXNlIEdPTVBfSUNWX0JJTkQ6CisJICBpZiAoIShnb21wX2dldF9pY3ZfZmxhZyAobGlz dC0+ZmxhZ3MsIEdPTVBfSUNWX0JJTkQpKSkKKwkgICAgYnJlYWs7CisJICBzcHJpbnRmIChk ZXZfbnVtLCAiJWQiLCBsaXN0LT5kZXZpY2VfbnVtKTsKKwkgIHByaW50X3Byb2NfYmluZCAo bGlzdC0+aWN2cy5iaW5kX3ZhciwgbGlzdC0+aWN2cy5iaW5kX3Zhcl9saXN0X2xlbiwKKwkJ CSAgICZsaXN0LT5pY3ZzLmJpbmRfdmFyX2xpc3QsIGRldl9udW0pOworCSAgYnJlYWs7CisJ Y2FzZSBHT01QX0lDVl9XQUlUX1BPTElDWToKKwkgIGlmIChnb21wX2dldF9pY3ZfZmxhZyAo bGlzdC0+ZmxhZ3MsIEdPTVBfSUNWX1dBSVRfUE9MSUNZKSkKKwkgICAgZnByaW50ZiAoc3Rk ZXJyLCAiICBbJWRdIE9NUF9XQUlUX1BPTElDWSA9ICclcydcbiIsCisJCSAgICAgbGlzdC0+ ZGV2aWNlX251bSwKKwkJICAgICBsaXN0LT5pY3ZzLndhaXRfcG9saWN5ID4gMCA/ICJBQ1RJ VkUiIDogIlBBU1NJVkUiKTsKKwkgIGJyZWFrOworCWNhc2UgR09NUF9JQ1ZfU1RBQ0tTSVpF OgorCSAgaWYgKGdvbXBfZ2V0X2ljdl9mbGFnIChsaXN0LT5mbGFncywgR09NUF9JQ1ZfU1RB Q0tTSVpFKSkKKwkgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbJWRdIE9NUF9TVEFDS1NJWkUg PSAnJWx1J1xuIiwKKwkJICAgICBsaXN0LT5kZXZpY2VfbnVtLCBsaXN0LT5pY3ZzLnN0YWNr c2l6ZSk7CisJICBicmVhazsKKwl9CisgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9 Cit9CisKK3ZvaWQKK29tcF9kaXNwbGF5X2VudiAoaW50IHZlcmJvc2UpCit7CisgIGludCBp OworICBzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCAqZGV2ID0gZ29tcF9nZXRfaW5pdGlhbF9pY3Zf aXRlbSAoLTEpOworICBzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCAqYWxsID0gZ29tcF9nZXRfaW5p dGlhbF9pY3ZfaXRlbSAoLTIpOworICBzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCAqbm9uZSA9IGdv bXBfZ2V0X2luaXRpYWxfaWN2X2l0ZW0gKC0zKTsKKworICBmcHV0cyAoIlxuT1BFTk1QIERJ U1BMQVkgRU5WSVJPTk1FTlQgQkVHSU5cbiIsIHN0ZGVycik7CisKKyAgZnB1dHMgKCIgIF9P UEVOTVAgPSAnMjAxNTExJ1xuIiwgc3RkZXJyKTsKKworICBmcHJpbnRmIChzdGRlcnIsICIg IFtob3N0XSBPTVBfRFlOQU1JQyA9ICclcydcbiIsCisJICAgbm9uZS0+aWN2cy5keW5fdmFy ID8gIlRSVUUiIDogIkZBTFNFIik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9p Y3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfRFlOQU1JQykpCisgICAgZnByaW50ZiAo c3RkZXJyLCAiICBbYWxsXSBPTVBfRFlOQU1JQyA9ICclcydcbiIsCisJICAgICBhbGwtPmlj dnMuZHluX3ZhciA/ICJUUlVFIiA6ICJGQUxTRSIpOworICBpZiAoZGV2ICE9IE5VTEwgJiYg Z29tcF9nZXRfaWN2X2ZsYWcgKGRldi0+ZmxhZ3MsIEdPTVBfSUNWX0RZTkFNSUMpKQorICAg IGZwcmludGYgKHN0ZGVyciwgIiAgW2RldmljZV0gT01QX0RZTkFNSUMgPSAnJXMnXG4iLAor CSAgICAgZGV2LT5pY3ZzLmR5bl92YXIgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgcHJpbnRf ZGV2aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNWX0RZTkFNSUMpOworCisKKyAgLyogVGhl IE9NUF9ORVNURUQgZW52aXJvbm1lbnQgdmFyaWFibGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4g ICovCisgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9NUF9ORVNURUQgPSAnJXMnXG4i LAorCSAgIG5vbmUtPmljdnMubWF4X2FjdGl2ZV9sZXZlbHNfdmFyID4gMSA/ICJUUlVFIiA6 ICJGQUxTRSIpOworCisgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9NUF9OVU1fVEhS RUFEUyA9ICclbHUiLAorCSAgIG5vbmUtPmljdnMubnRocmVhZHNfdmFyKTsKKyAgZm9yIChp ID0gMTsgaSA8IG5vbmUtPmljdnMubnRocmVhZHNfdmFyX2xpc3RfbGVuOyBpKyspCisgICAg ZnByaW50ZiAoc3RkZXJyLCAiLCVsdSIsIG5vbmUtPmljdnMubnRocmVhZHNfdmFyX2xpc3Rb aV0pOworICBmcHV0cyAoIidcbiIsIHN0ZGVycik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBn b21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfTlRIUkVBRFMpKQorICAg IHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2FsbF0gT01QX05VTV9USFJFQURTID0g JyVsdSIsCisJICAgICAgIGFsbC0+aWN2cy5udGhyZWFkc192YXIpOworICAgICAgZm9yIChp ID0gMTsgaSA8IGFsbC0+aWN2cy5udGhyZWFkc192YXJfbGlzdF9sZW47IGkrKykKKwlmcHJp bnRmIChzdGRlcnIsICIsJWx1IiwgYWxsLT5pY3ZzLm50aHJlYWRzX3Zhcl9saXN0W2ldKTsK KyAgICAgIGZwdXRzICgiJ1xuIiwgc3RkZXJyKTsKKyAgICB9CisgIGlmIChkZXYgIT0gTlVM TCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoZGV2LT5mbGFncywgR09NUF9JQ1ZfTlRIUkVBRFMp KQorICAgIHsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2RldmljZV0gT01QX05VTV9U SFJFQURTID0gJyVsdSIsCisJICAgICAgIGRldi0+aWN2cy5udGhyZWFkc192YXIpOworICAg ICAgZm9yIChpID0gMTsgaSA8IGRldi0+aWN2cy5udGhyZWFkc192YXJfbGlzdF9sZW47IGkr KykKKwlmcHJpbnRmIChzdGRlcnIsICIsJWx1IiwgZGV2LT5pY3ZzLm50aHJlYWRzX3Zhcl9s aXN0W2ldKTsKKyAgICAgIGZwdXRzICgiJ1xuIiwgc3RkZXJyKTsKKyAgICB9CisgIHByaW50 X2RldmljZV9zcGVjaWZpY19pY3ZzIChHT01QX0lDVl9OVEhSRUFEUyk7CisKKworICBwcmlu dF9zY2hlZHVsZSAobm9uZS0+aWN2cy5ydW5fc2NoZWRfdmFyLAorCQkgIG5vbmUtPmljdnMu cnVuX3NjaGVkX2NodW5rX3NpemUsICJob3N0Iik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBn b21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfU0NIRURVTEUpKQorICAg IHByaW50X3NjaGVkdWxlIChhbGwtPmljdnMucnVuX3NjaGVkX3ZhciwKKwkJICAgIGFsbC0+ aWN2cy5ydW5fc2NoZWRfY2h1bmtfc2l6ZSwgImFsbCIpOworICBpZiAoZGV2ICE9IE5VTEwg JiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGRldi0+ZmxhZ3MsIEdPTVBfSUNWX1NDSEVEVUxFKSkK KyAgICBwcmludF9zY2hlZHVsZSAoZGV2LT5pY3ZzLnJ1bl9zY2hlZF92YXIsCisJCSAgICBk ZXYtPmljdnMucnVuX3NjaGVkX2NodW5rX3NpemUsICJkZXZpY2UiKTsKKyAgcHJpbnRfZGV2 aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNWX1NDSEVEVUxFKTsKKworICBwcmludF9wcm9j X2JpbmQgKG5vbmUtPmljdnMuYmluZF92YXIsCisJCSAgIG5vbmUtPmljdnMuYmluZF92YXJf bGlzdF9sZW4sCisJCSAgICZub25lLT5pY3ZzLmJpbmRfdmFyX2xpc3QsICJob3N0Iik7Cisg IGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09N UF9JQ1ZfQklORCkpCisgICAgcHJpbnRfcHJvY19iaW5kIChhbGwtPmljdnMuYmluZF92YXIs CisJCSAgICAgYWxsLT5pY3ZzLmJpbmRfdmFyX2xpc3RfbGVuLAorCQkgICAgICZhbGwtPmlj dnMuYmluZF92YXJfbGlzdCwgImFsbCIpOworICBpZiAoZGV2ICE9IE5VTEwgJiYgZ29tcF9n ZXRfaWN2X2ZsYWcgKGRldi0+ZmxhZ3MsIEdPTVBfSUNWX0JJTkQpKQorICAgIHByaW50X3By b2NfYmluZCAoZGV2LT5pY3ZzLmJpbmRfdmFyLAorCQkgICAgIGRldi0+aWN2cy5iaW5kX3Zh cl9saXN0X2xlbiwKKwkJICAgICAmZGV2LT5pY3ZzLmJpbmRfdmFyX2xpc3QsICJkZXZpY2Ui KTsKKyAgcHJpbnRfZGV2aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNWX0JJTkQpOworCisg IGZwdXRzICgiICBbaG9zdF0gT01QX1BMQUNFUyA9ICciLCBzdGRlcnIpOwogICBmb3IgKGkg PSAwOyBpIDwgZ29tcF9wbGFjZXNfbGlzdF9sZW47IGkrKykKICAgICB7CiAgICAgICBmcHV0 cyAoInsiLCBzdGRlcnIpOwpAQCAtMTM0NywzMCArMTY2Nyw4NSBAQCBvbXBfZGlzcGxheV9l bnYgKGludCB2ZXJib3NlKQogICAgIH0KICAgZnB1dHMgKCInXG4iLCBzdGRlcnIpOwogCi0g IGZwcmludGYgKHN0ZGVyciwgIiAgT01QX1NUQUNLU0laRSA9ICclbHUnXG4iLCBzdGFja3Np emUpOworICBmcHJpbnRmIChzdGRlcnIsICIgIFtob3N0XSBPTVBfU1RBQ0tTSVpFID0gJyVs dSdcbiIsCisJICAgbm9uZS0+aWN2cy5zdGFja3NpemUpOworICBpZiAoYWxsICE9IE5VTEwg JiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGFsbC0+ZmxhZ3MsIEdPTVBfSUNWX1NUQUNLU0laRSkp CisgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbYWxsXSBPTVBfU1RBQ0tTSVpFID0gJyVsdSdc biIsCisJICAgICBhbGwtPmljdnMuc3RhY2tzaXplKTsKKyAgaWYgKGRldiAhPSBOVUxMICYm IGdvbXBfZ2V0X2ljdl9mbGFnIChkZXYtPmZsYWdzLCBHT01QX0lDVl9TVEFDS1NJWkUpKQor ICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2RldmljZV0gT01QX1NUQUNLU0laRSA9ICclbHUn XG4iLAorCSAgICAgZGV2LT5pY3ZzLnN0YWNrc2l6ZSk7CisgIHByaW50X2RldmljZV9zcGVj aWZpY19pY3ZzIChHT01QX0lDVl9TVEFDS1NJWkUpOwogCiAgIC8qIEdPTVAncyBkZWZhdWx0 IHZhbHVlIGlzIGFjdHVhbGx5IG5laXRoZXIgYWN0aXZlIG5vciBwYXNzaXZlLiAgKi8KLSAg ZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfV0FJVF9QT0xJQ1kgPSAnJXMnXG4iLAotCSAgIHdh aXRfcG9saWN5ID4gMCA/ICJBQ1RJVkUiIDogIlBBU1NJVkUiKTsKLSAgZnByaW50ZiAoc3Rk ZXJyLCAiICBPTVBfVEhSRUFEX0xJTUlUID0gJyV1J1xuIiwKLQkgICBnb21wX2dsb2JhbF9p Y3YudGhyZWFkX2xpbWl0X3Zhcik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAgT01QX01BWF9B Q1RJVkVfTEVWRUxTID0gJyV1J1xuIiwKLQkgICBnb21wX2dsb2JhbF9pY3YubWF4X2FjdGl2 ZV9sZXZlbHNfdmFyKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfTlVNX1RFQU1TID0g JyV1J1xuIiwgZ29tcF9udGVhbXNfdmFyKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBf VEVBTVNfVEhSRUFEX0xJTUlUID0gJyV1J1xuIiwKLQkgICBnb21wX3RlYW1zX3RocmVhZF9s aW1pdF92YXIpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIiAgT01QX0NBTkNFTExBVElPTiA9 ICclcydcbiIsCisgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9NUF9XQUlUX1BPTElD WSA9ICclcydcbiIsCisJICAgbm9uZS0+aWN2cy53YWl0X3BvbGljeSA+IDAgPyAiQUNUSVZF IiA6ICJQQVNTSVZFIik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxh ZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfV0FJVF9QT0xJQ1kpKQorICAgIGZwcmludGYgKHN0 ZGVyciwgIiAgW2FsbF0gT01QX1dBSVRfUE9MSUNZID0gJyVzJ1xuIiwKKwkgICAgIGFsbC0+ aWN2cy53YWl0X3BvbGljeSA+IDAgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIik7CisgIGlmIChk ZXYgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoZGV2LT5mbGFncywgR09NUF9JQ1Zf V0FJVF9QT0xJQ1kpKQorICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2RldmljZV0gT01QX1dB SVRfUE9MSUNZID0gJyVzJ1xuIiwKKwkgICAgIGRldi0+aWN2cy53YWl0X3BvbGljeSA+IDAg PyAiQUNUSVZFIiA6ICJQQVNTSVZFIik7CisgIHByaW50X2RldmljZV9zcGVjaWZpY19pY3Zz IChHT01QX0lDVl9XQUlUX1BPTElDWSk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9z dF0gT01QX1RIUkVBRF9MSU1JVCA9ICcldSdcbiIsCisJICAgbm9uZS0+aWN2cy50aHJlYWRf bGltaXRfdmFyKTsKKyAgaWYgKGFsbCAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChh bGwtPmZsYWdzLCBHT01QX0lDVl9USFJFQURfTElNSVQpKQorICAgIGZwcmludGYgKHN0ZGVy ciwgIiAgW2FsbF0gT01QX1RIUkVBRF9MSU1JVCA9ICclZCdcbiIsCisJICAgICBhbGwtPmlj dnMudGhyZWFkX2xpbWl0X3Zhcik7CisgIGlmIChkZXYgIT0gTlVMTCAmJiBnb21wX2dldF9p Y3ZfZmxhZyAoZGV2LT5mbGFncywgR09NUF9JQ1ZfVEhSRUFEX0xJTUlUKSkKKyAgICBmcHJp bnRmIChzdGRlcnIsICIgIFtkZXZpY2VdIE9NUF9USFJFQURfTElNSVQgPSAnJWQnXG4iLAor CSAgICAgZGV2LT5pY3ZzLnRocmVhZF9saW1pdF92YXIpOworICBwcmludF9kZXZpY2Vfc3Bl Y2lmaWNfaWN2cyAoR09NUF9JQ1ZfVEhSRUFEX0xJTUlUKTsKKworICBmcHJpbnRmIChzdGRl cnIsICIgIFtob3N0XSBPTVBfTUFYX0FDVElWRV9MRVZFTFMgPSAnJXUnXG4iLAorCSAgIG5v bmUtPmljdnMubWF4X2FjdGl2ZV9sZXZlbHNfdmFyKTsKKyAgaWYgKGFsbCAhPSBOVUxMICYm IGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLAorCQkJIEdPTVBfSUNWX01BWF9BQ1RJ VkVfTEVWRUxTKSkKKyAgICBmcHJpbnRmIChzdGRlcnIsICIgIFthbGxdIE9NUF9NQVhfQUNU SVZFX0xFVkVMUyA9ICcldSdcbiIsCisJICAgICBhbGwtPmljdnMubWF4X2FjdGl2ZV9sZXZl bHNfdmFyKTsKKyAgaWYgKGRldiAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChkZXYt PmZsYWdzLAorCQkJIEdPTVBfSUNWX01BWF9BQ1RJVkVfTEVWRUxTKSkKKyAgICBmcHJpbnRm IChzdGRlcnIsICIgIFtkZXZpY2VdIE9NUF9NQVhfQUNUSVZFX0xFVkVMUyA9ICcldSdcbiIs CisJICAgICBkZXYtPmljdnMubWF4X2FjdGl2ZV9sZXZlbHNfdmFyKTsKKyAgcHJpbnRfZGV2 aWNlX3NwZWNpZmljX2ljdnMgKEdPTVBfSUNWX01BWF9BQ1RJVkVfTEVWRUxTKTsKKworCisg IGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9NUF9OVU1fVEVBTVMgPSAnJWQnXG4iLAor CSAgIG5vbmUtPmljdnMubnRlYW1zX3Zhcik7CisgIGlmIChhbGwgIT0gTlVMTCAmJiBnb21w X2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfTlRFQU1TKSkKKyAgICBmcHJp bnRmIChzdGRlcnIsICIgIFthbGxdIE9NUF9OVU1fVEVBTVMgPSAnJWQnXG4iLAorCSAgICAg YWxsLT5pY3ZzLm50ZWFtc192YXIpOworICBpZiAoZGV2ICE9IE5VTEwgJiYgZ29tcF9nZXRf aWN2X2ZsYWcgKGRldi0+ZmxhZ3MsIEdPTVBfSUNWX05URUFNUykpCisgICAgZnByaW50ZiAo c3RkZXJyLCAiICBbZGV2aWNlXSBPTVBfTlVNX1RFQU1TID0gJyVkJ1xuIiwKKwkgICAgIGRl di0+aWN2cy5udGVhbXNfdmFyKTsKKyAgcHJpbnRfZGV2aWNlX3NwZWNpZmljX2ljdnMgKEdP TVBfSUNWX05URUFNUyk7CisKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9zdF0gT01QX1RF QU1TX1RIUkVBRF9MSU1JVCA9ICcldSdcbiIsCisJICAgbm9uZS0+aWN2cy50ZWFtc190aHJl YWRfbGltaXRfdmFyKTsKKyAgaWYgKGFsbCAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFn IChhbGwtPmZsYWdzLAorCQkJIEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCkpCisgICAg ZnByaW50ZiAoc3RkZXJyLCAiICBbYWxsXSBPTVBfVEVBTVNfVEhSRUFEX0xJTUlUID0gJyV1 J1xuIiwKKwkgICAgIGFsbC0+aWN2cy50ZWFtc190aHJlYWRfbGltaXRfdmFyKTsKKyAgaWYg KGRldiAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChkZXYtPmZsYWdzLAorCQkJIEdP TVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCkpCisgICAgZnByaW50ZiAoc3RkZXJyLCAiICBb ZGV2aWNlXSBPTVBfVEVBTVNfVEhSRUFEX0xJTUlUID0gJyV1J1xuIiwKKwkgICAgIGRldi0+ aWN2cy50ZWFtc190aHJlYWRfbGltaXRfdmFyKTsKKyAgcHJpbnRfZGV2aWNlX3NwZWNpZmlj X2ljdnMgKEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCk7CisKKyAgZnByaW50ZiAoc3Rk ZXJyLCAiICBbaG9zdF0gT01QX0NBTkNFTExBVElPTiA9ICclcydcbiIsCiAJICAgZ29tcF9j YW5jZWxfdmFyID8gIlRSVUUiIDogIkZBTFNFIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiAg T01QX0RFRkFVTFRfREVWSUNFID0gJyVkJ1xuIiwKLQkgICBnb21wX2dsb2JhbF9pY3YuZGVm YXVsdF9kZXZpY2VfdmFyKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfTUFYX1RBU0tf UFJJT1JJVFkgPSAnJWQnXG4iLAorCisgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9N UF9ERUZBVUxUX0RFVklDRSA9ICclZCdcbiIsCisJICAgbm9uZS0+aWN2cy5kZWZhdWx0X2Rl dmljZV92YXIpOworCisgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIE9NUF9NQVhfVEFT S19QUklPUklUWSA9ICclZCdcbiIsCiAJICAgZ29tcF9tYXhfdGFza19wcmlvcml0eV92YXIp OwotICBmcHJpbnRmIChzdGRlcnIsICIgIE9NUF9ESVNQTEFZX0FGRklOSVRZID0gJyVzJ1xu IiwKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9zdF0gT01QX0RJU1BMQVlfQUZGSU5JVFkg PSAnJXMnXG4iLAogCSAgIGdvbXBfZGlzcGxheV9hZmZpbml0eV92YXIgPyAiVFJVRSIgOiAi RkFMU0UiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiICBPTVBfQUZGSU5JVFlfRk9STUFUID0g JyVzJ1xuIiwKKyAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9zdF0gT01QX0FGRklOSVRZX0ZP Uk1BVCA9ICclcydcbiIsCiAJICAgZ29tcF9hZmZpbml0eV9mb3JtYXRfdmFyKTsKLSAgZnBy aW50ZiAoc3RkZXJyLCAiICBPTVBfQUxMT0NBVE9SID0gJyIpOworICBmcHJpbnRmIChzdGRl cnIsICIgIFtob3N0XSBPTVBfQUxMT0NBVE9SID0gJyIpOwogICBzd2l0Y2ggKGdvbXBfZGVm X2FsbG9jYXRvcikKICAgICB7CiAjZGVmaW5lIEModikgY2FzZSB2OiBmcHV0cyAoI3YsIHN0 ZGVycik7IGJyZWFrOwpAQCAtMTM4Nyw3ICsxNzYyLDcgQEAgb21wX2Rpc3BsYXlfZW52IChp bnQgdmVyYm9zZSkKICAgICB9CiAgIGZwdXRzICgiJ1xuIiwgc3RkZXJyKTsKIAotICBmcHV0 cyAoIiAgT01QX1RBUkdFVF9PRkZMT0FEID0gJyIsIHN0ZGVycik7CisgIGZwdXRzICgiICBb aG9zdF0gT01QX1RBUkdFVF9PRkZMT0FEID0gJyIsIHN0ZGVycik7CiAgIHN3aXRjaCAoZ29t cF90YXJnZXRfb2ZmbG9hZF92YXIpCiAgICAgewogICAgIGNhc2UgR09NUF9UQVJHRVRfT0ZG TE9BRF9ERUZBVUxUOgpAQCAtMTQwNCwxMyArMTc3OSwxMyBAQCBvbXBfZGlzcGxheV9lbnYg KGludCB2ZXJib3NlKQogCiAgIGlmICh2ZXJib3NlKQogICAgIHsKLSAgICAgIGZwdXRzICgi ICBHT01QX0NQVV9BRkZJTklUWSA9ICcnXG4iLCBzdGRlcnIpOwotICAgICAgZnByaW50ZiAo c3RkZXJyLCAiICBHT01QX1NUQUNLU0laRSA9ICclbHUnXG4iLCBzdGFja3NpemUpOworICAg ICAgZnB1dHMgKCIgIFtob3N0XSBHT01QX0NQVV9BRkZJTklUWSA9ICcnXG4iLCBzdGRlcnIp OworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9zdF0gR09NUF9TVEFDS1NJWkUgPSAn JWx1J1xuIiwgc3RhY2tzaXplKTsKICNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSAgICAgIGZw cmludGYgKHN0ZGVyciwgIiAgR09NUF9TUElOQ09VTlQgPSAnJSJQUkl1NjQiJ1xuIiwKKyAg ICAgIGZwcmludGYgKHN0ZGVyciwgIiAgW2hvc3RdIEdPTVBfU1BJTkNPVU5UID0gJyUiUFJJ dTY0IidcbiIsCiAJICAgICAgICh1aW50NjRfdCkgZ29tcF9zcGluX2NvdW50X3Zhcik7CiAj ZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBHT01QX1NQSU5DT1VOVCA9ICclbHUn XG4iLAorICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICBbaG9zdF0gR09NUF9TUElOQ09VTlQg PSAnJWx1J1xuIiwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGdvbXBfc3Bpbl9jb3VudF92 YXIpOwogI2VuZGlmCiAgICAgfQpAQCAtMTQ1OSw2NSArMTgzNCwzNjcgQEAgaGFuZGxlX29t cF9kaXNwbGF5X2VudiAodm9pZCkKICAgICBpYWxpYXNfY2FsbCAob21wX2Rpc3BsYXlfZW52 KSAodmVyYm9zZSk7CiB9CiAKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgaW5pdGlhbGl6ZV9l bnYuICBFeHRyYWN0cyB0aGUgZGV2aWNlIG51bWJlciBmcm9tCisgICBhbiBlbnZpcm9ubWVu dCB2YXJpYWJsZSBuYW1lLiAgRU5WIGlzIHRoZSBjb21wbGV0ZSBlbnZpcm9ubWVudCB2YXJp YWJsZS4KKyAgIERFVl9OVU1fUFRSIHBvaW50cyB0byB0aGUgc3RhcnQgb2YgdGhlIGRldmlj ZSBudW1iZXIgaW4gdGhlIGVudmlyb25tZW50CisgICB2YXJpYWJsZSBzdHJpbmcuICBERVZf TlVNX0xFTiBpcyB0aGUgcmV0dXJuZWQgbGVuZ3RoIG9mIHRoZSBkZXZpY2UgbnVtCisgICBz dHJpbmcuICAqLworCitzdGF0aWMgYm9vbAorZ2V0X2RldmljZV9udW0gKGNoYXIgKmVudiwg Y2hhciAqZGV2X251bV9wdHIsIGludCAqZGV2X251bSwgaW50ICpkZXZfbnVtX2xlbikKK3sK KyAgY2hhciAqZW5kOworICBpbnQgcG9zID0gMDsKKworICBpZiAoZGV2X251bV9wdHJbMF0g PT0gJy0nKQorICAgIHsKKyAgICAgIGdvbXBfZXJyb3IgKCJOb24tbmVnYXRpdmUgZGV2aWNl IG51bWJlciBleHBlY3RlZCBpbiAlcyIsIGVudik7CisgICAgICByZXR1cm4gZmFsc2U7Cisg ICAgfQorCisgIHdoaWxlIChwb3MgPD0gSU5UX01BWF9TVFJfTEVOKQorICAgIHsKKyAgICAg IGlmIChkZXZfbnVtX3B0cltwb3NdID09ICdcMCcgfHwgZGV2X251bV9wdHJbcG9zXSA9PSAn PScpCisJYnJlYWs7CisgICAgICBwb3MrKzsKKyAgICB9CisgIGlmIChwb3MgPiBJTlRfTUFY X1NUUl9MRU4pCisgICAgeworICAgICAgZ29tcF9lcnJvciAoIkludmFsaWQgZGV2aWNlIG51 bWJlciBpbiAlcyAodG9vIGxvbmcpIiwgZW52KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAg ICB9CisKKyAgKmRldl9udW0gPSAoaW50KSBzdHJ0b3VsIChkZXZfbnVtX3B0ciwgJmVuZCwg MTApOworICBpZiAoZGV2X251bV9wdHJbMF0gPT0gJzAnICYmICpkZXZfbnVtICE9IDApCisg ICAgeworICAgICAgZ29tcF9lcnJvciAoIkludmFsaWQgZGV2aWNlIG51bWJlciBpbiAlcyAo bGVhZGluZyB6ZXJvKSIsIGVudik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBp ZiAoZGV2X251bV9wdHIgPT0gZW5kIHx8ICplbmQgIT0gJz0nKQorICAgIHsKKyAgICAgIGdv bXBfZXJyb3IgKCJJbnZhbGlkIGRldmljZSBudW1iZXIgaW4gJXMiLCBlbnYpOworICAgICAg cmV0dXJuIGZhbHNlOworICAgIH0KKworICAqZGV2X251bV9sZW4gPSBwb3M7CisgIHJldHVy biB0cnVlOworfQorCitzdGF0aWMgdm9pZAorZ2V0X2ljdl9tZW1iZXJfYWRkciAoc3RydWN0 IGdvbXBfaW5pdGlhbF9pY3ZzICppY3ZzLCBpbnQgaWN2X2NvZGUsCisJCSAgICAgdm9pZCAq aWN2X2FkZHJbM10pCit7CisgIGlmIChpY3ZfY29kZSA9PSAwIHx8IGljdl9hZGRyID09IE5V TEwpCisgICAgcmV0dXJuOworCisgIGljdl9hZGRyWzBdID0gaWN2X2FkZHJbMV0gPSBpY3Zf YWRkclsyXSA9IE5VTEw7CisKKyAgc3dpdGNoIChpY3ZfY29kZSkKKyAgICB7CisgICAgY2Fz ZSBHT01QX0lDVl9OVEVBTVM6CisgICAgICBpY3ZfYWRkclswXSA9ICYoaWN2cy0+bnRlYW1z X3Zhcik7CisgICAgICBpY3ZfYWRkclsxXSA9IGZhbHNlOworICAgICAgYnJlYWs7CisgICAg Y2FzZSBHT01QX0lDVl9EWU5BTUlDOgorICAgICAgaWN2X2FkZHJbMF0gPSAmKCgqaWN2cyku ZHluX3Zhcik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdPTVBfSUNWX1RFQU1TX1RIUkVB RF9MSU1JVDoKKyAgICAgIGljdl9hZGRyWzBdID0gJihpY3ZzLT50ZWFtc190aHJlYWRfbGlt aXRfdmFyKTsKKyAgICAgIGljdl9hZGRyWzFdID0gZmFsc2U7CisgICAgICBicmVhazsKKyAg ICBjYXNlIEdPTVBfSUNWX1NDSEVEVUxFOgorICAgICAgaWN2X2FkZHJbMF0gPSAmKGljdnMt PnJ1bl9zY2hlZF92YXIpOworICAgICAgaWN2X2FkZHJbMV0gPSAmKGljdnMtPnJ1bl9zY2hl ZF9jaHVua19zaXplKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR09NUF9JQ1ZfVEhSRUFE X0xJTUlUOgorICAgICAgaWN2X2FkZHJbMF0gPSAmKGljdnMtPnRocmVhZF9saW1pdF92YXIp OworICAgICAgaWN2X2FkZHJbMV0gPSBmYWxzZTsKKyAgICAgIGljdl9hZGRyWzJdID0gKHZv aWQgKikgVUlOVF9NQVg7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdPTVBfSUNWX05USFJF QURTOgorICAgICAgaWN2X2FkZHJbMF0gPSAmKGljdnMtPm50aHJlYWRzX3Zhcik7CisgICAg ICBpY3ZfYWRkclsxXSA9ICYoaWN2cy0+bnRocmVhZHNfdmFyX2xpc3QpOworICAgICAgaWN2 X2FkZHJbMl0gPSAmKGljdnMtPm50aHJlYWRzX3Zhcl9saXN0X2xlbik7CisgICAgICBicmVh azsKKyAgICBjYXNlIEdPTVBfSUNWX01BWF9BQ1RJVkVfTEVWRUxTOgorICAgICAgaWN2X2Fk ZHJbMF0gPSAmKGljdnMtPm1heF9hY3RpdmVfbGV2ZWxzX3Zhcik7CisgICAgICBpY3ZfYWRk clsxXSA9ICh2b2lkICopIHRydWU7CisgICAgICBpY3ZfYWRkclsyXSA9ICh2b2lkICopIGdv bXBfc3VwcG9ydGVkX2FjdGl2ZV9sZXZlbHM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdP TVBfSUNWX0JJTkQ6CisgICAgICBpY3ZfYWRkclswXSA9ICYoaWN2cy0+YmluZF92YXIpOwor ICAgICAgaWN2X2FkZHJbMV0gPSAmKGljdnMtPmJpbmRfdmFyX2xpc3QpOworICAgICAgaWN2 X2FkZHJbMl0gPSAmKGljdnMtPmJpbmRfdmFyX2xpc3RfbGVuKTsKKyAgICAgIGJyZWFrOwor ICAgIGNhc2UgR09NUF9JQ1ZfV0FJVF9QT0xJQ1k6CisgICAgICBpY3ZfYWRkclswXSA9ICYo aWN2cy0+d2FpdF9wb2xpY3kpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBHT01QX0lDVl9T VEFDS1NJWkU6CisgICAgICBpY3ZfYWRkclswXSA9ICYoaWN2cy0+c3RhY2tzaXplKTsKKyAg ICAgIGJyZWFrOworICAgIGNhc2UgR09NUF9JQ1ZfQ0FOQ0VMTEFUSU9OOgorICAgICAgaWN2 X2FkZHJbMF0gPSAmZ29tcF9jYW5jZWxfdmFyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBH T01QX0lDVl9ESVNQTEFZX0FGRklOSVRZOgorICAgICAgaWN2X2FkZHJbMF0gPSAmZ29tcF9k aXNwbGF5X2FmZmluaXR5X3ZhcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR09NUF9JQ1Zf VEFSR0VUX09GRkxPQUQ6CisgICAgICBpY3ZfYWRkclswXSA9ICZnb21wX3RhcmdldF9vZmZs b2FkX3ZhcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR09NUF9JQ1ZfTUFYX1RBU0tfUFJJ T1JJVFk6CisgICAgICBpY3ZfYWRkclswXSA9ICZnb21wX21heF90YXNrX3ByaW9yaXR5X3Zh cjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgR09NUF9JQ1ZfQUxMT0NBVE9SOgorICAgICAg aWN2X2FkZHJbMF0gPSAmZ29tcF9kZWZfYWxsb2NhdG9yOworICAgICAgYnJlYWs7CisgICAg Y2FzZSBHT01QX0lDVl9ERUZBVUxUX0RFVklDRToKKyAgICAgIGljdl9hZGRyWzBdID0gJihp Y3ZzLT5kZWZhdWx0X2RldmljZV92YXIpOworICAgICAgaWN2X2FkZHJbMV0gPSAodm9pZCAq KSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdHJ1Y3QgZ29tcF9pY3ZfbGlz dCAqCitnb21wX2dldF9pbml0aWFsX2ljdl9pdGVtIChpbnQgZGV2X251bSkKK3sKKyAgc3Ry dWN0IGdvbXBfaWN2X2xpc3QgKmxpc3QgPSBnb21wX2luaXRpYWxfaWN2X2xpc3Q7CisgIHdo aWxlIChsaXN0ICE9IE5VTEwgJiYgbGlzdC0+ZGV2aWNlX251bSAhPSBkZXZfbnVtKQorICAg IGxpc3QgPSBsaXN0LT5uZXh0OworCisgIHJldHVybiBsaXN0OworfQorCisvKiBIZWxwZXIg ZnVuY3Rpb24gZm9yIGluaXRpYWxpemVfZW52IHRvIGFkZCBhIGRldmljZSBzcGVjaWZpYyBJ Q1YgdmFsdWUKKyAgIHRvIGdvbXBfaW5pdGlhbF9pY3ZfbGlzdC4gICovCisKK3N0YXRpYyB1 aW50MzJfdCAqCithZGRfaWN2X3RvX2xpc3QgKGludCBkZXZfbnVtLCBpbnQgaWN2X2NvZGUs IHZvaWQgKmljdl9hZGRyWzNdKQoreworICBzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCAqbGFzdCA9 IE5VTEwsICpsaXN0ID0gZ29tcF9pbml0aWFsX2ljdl9saXN0OworICB3aGlsZSAobGlzdCAh PSBOVUxMICYmIGxpc3QtPmRldmljZV9udW0gIT0gZGV2X251bSkKKyAgICB7CisgICAgICBs YXN0ID0gbGlzdDsKKyAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgIH0KKworICBpZiAo bGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGxpc3QKKwk9IChzdHJ1Y3QgZ29tcF9pY3Zf bGlzdCAqKSBnb21wX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCkpOwor ICAgICAgbGlzdC0+ZGV2aWNlX251bSA9IGRldl9udW07CisgICAgICBtZW1zZXQgKCYobGlz dC0+aWN2cyksIDAsIHNpemVvZiAoc3RydWN0IGdvbXBfaW5pdGlhbF9pY3ZzKSk7CisgICAg ICBsaXN0LT5mbGFncyA9IDA7CisgICAgICBpZiAoZGV2X251bSA8IDApCisJeworCSAgbGlz dC0+bmV4dCA9IGdvbXBfaW5pdGlhbF9pY3ZfbGlzdDsKKwkgIGdvbXBfaW5pdGlhbF9pY3Zf bGlzdCA9IGxpc3Q7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGxpc3QtPm5leHQgPSBOVUxM OworCSAgaWYgKGxhc3QgPT0gTlVMTCkKKwkgICAgZ29tcF9pbml0aWFsX2ljdl9saXN0ID0g bGlzdDsKKwkgIGVsc2UKKwkgICAgbGFzdC0+bmV4dCA9IGxpc3Q7CisJfQorICAgIH0KKwor ICBnZXRfaWN2X21lbWJlcl9hZGRyICgmKGxpc3QtPmljdnMpLCBpY3ZfY29kZSwgaWN2X2Fk ZHIpOworCisgIHJldHVybiAmKGxpc3QtPmZsYWdzKTsKK30KKworLyogUmV0dXJuIHRydWUg aWYgU1RSIHN0cmluZyBzdGFydHMgd2l0aCBQUkVGSVguICAqLworCitzdGF0aWMgaW5saW5l IGJvb2wKK3N0YXJ0c3dpdGggKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcHJlZml4 KQoreworICByZXR1cm4gc3RybmNtcCAoc3RyLCBwcmVmaXgsIHN0cmxlbiAocHJlZml4KSkg PT0gMDsKK30KIAogc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKQog aW5pdGlhbGl6ZV9lbnYgKHZvaWQpCiB7Ci0gIHVuc2lnbmVkIGxvbmcgdGhyZWFkX2xpbWl0 X3ZhcjsKLSAgdW5zaWduZWQgbG9uZyBtYXhfYWN0aXZlX2xldmVsc192YXI7CisgIGV4dGVy biBjaGFyICoqZW52aXJvbjsKKyAgY2hhciAqKmVudjsKKyAgaW50IG9tcF92YXIsIGRldl9u dW0gPSAwLCBkZXZfbnVtX2xlbiA9IDAsIGk7CisgIGJvb2wgaWdub3JlID0gZmFsc2U7Cisg IGNoYXIgKmVudl92YWw7CisgIHZvaWQgKnBhcmFtc1szXTsKKyAgdWludDMyX3QgKmZsYWdf dmFyX2FkZHIgPSBOVUxMOworICB1bnNpZ25lZCBwb3M7CisgIHN0cnVjdCBnb21wX2ljdl9s aXN0ICphbGwsICpub25lOwogCiAgIC8qIERvIGEgY29tcGlsZSB0aW1lIGNoZWNrIHRoYXQg bWtvbXBfaC5wbCBkaWQgZ29vZCBqb2IuICAqLwogICBvbXBfY2hlY2tfZGVmaW5lcyAoKTsK IAotICBwYXJzZV9zY2hlZHVsZSAoKTsKLSAgcGFyc2VfYm9vbGVhbiAoIk9NUF9EWU5BTUlD IiwgJmdvbXBfZ2xvYmFsX2ljdi5keW5fdmFyKTsKLSAgcGFyc2VfYm9vbGVhbiAoIk9NUF9D QU5DRUxMQVRJT04iLCAmZ29tcF9jYW5jZWxfdmFyKTsKLSAgcGFyc2VfYm9vbGVhbiAoIk9N UF9ESVNQTEFZX0FGRklOSVRZIiwgJmdvbXBfZGlzcGxheV9hZmZpbml0eV92YXIpOwotICBw YXJzZV9pbnQgKCJPTVBfREVGQVVMVF9ERVZJQ0UiLCAmZ29tcF9nbG9iYWxfaWN2LmRlZmF1 bHRfZGV2aWNlX3ZhciwgdHJ1ZSk7Ci0gIHBhcnNlX3RhcmdldF9vZmZsb2FkICgiT01QX1RB UkdFVF9PRkZMT0FEIiwgJmdvbXBfdGFyZ2V0X29mZmxvYWRfdmFyKTsKLSAgcGFyc2VfaW50 ICgiT01QX01BWF9UQVNLX1BSSU9SSVRZIiwgJmdvbXBfbWF4X3Rhc2tfcHJpb3JpdHlfdmFy LCB0cnVlKTsKLSAgZ29tcF9kZWZfYWxsb2NhdG9yID0gcGFyc2VfYWxsb2NhdG9yICgpOwot ICBpZiAocGFyc2VfdW5zaWduZWRfbG9uZyAoIk9NUF9USFJFQURfTElNSVQiLCAmdGhyZWFk X2xpbWl0X3ZhciwgZmFsc2UpKQotICAgIHsKLSAgICAgIGdvbXBfZ2xvYmFsX2ljdi50aHJl YWRfbGltaXRfdmFyCi0JPSB0aHJlYWRfbGltaXRfdmFyID4gSU5UX01BWCA/IFVJTlRfTUFY IDogdGhyZWFkX2xpbWl0X3ZhcjsKLSAgICB9Ci0gIHBhcnNlX2ludF9zZWN1cmUgKCJHT01Q X0RFQlVHIiwgJmdvbXBfZGVidWdfdmFyLCB0cnVlKTsKICNpZm5kZWYgSEFWRV9TWU5DX0JV SUxUSU5TCiAgIGdvbXBfbXV0ZXhfaW5pdCAoJmdvbXBfbWFuYWdlZF90aHJlYWRzX2xvY2sp OwogI2VuZGlmCiAgIGdvbXBfaW5pdF9udW1fdGhyZWFkcyAoKTsKICAgZ29tcF9hdmFpbGFi bGVfY3B1cyA9IGdvbXBfZ2xvYmFsX2ljdi5udGhyZWFkc192YXI7Ci0gIGlmICghcGFyc2Vf dW5zaWduZWRfbG9uZ19saXN0ICgiT01QX05VTV9USFJFQURTIiwKLQkJCQkgJmdvbXBfZ2xv YmFsX2ljdi5udGhyZWFkc192YXIsCi0JCQkJICZnb21wX250aHJlYWRzX3Zhcl9saXN0LAot CQkJCSAmZ29tcF9udGhyZWFkc192YXJfbGlzdF9sZW4pKQotICAgIGdvbXBfZ2xvYmFsX2lj di5udGhyZWFkc192YXIgPSBnb21wX2F2YWlsYWJsZV9jcHVzOwotICBwYXJzZV9pbnQgKCJP TVBfTlVNX1RFQU1TIiwgJmdvbXBfbnRlYW1zX3ZhciwgZmFsc2UpOwotICBwYXJzZV9pbnQg KCJPTVBfVEVBTVNfVEhSRUFEX0xJTUlUIiwgJmdvbXBfdGVhbXNfdGhyZWFkX2xpbWl0X3Zh ciwgZmFsc2UpOwotICBib29sIGlnbm9yZSA9IGZhbHNlOwotICBpZiAocGFyc2VfYmluZF92 YXIgKCJPTVBfUFJPQ19CSU5EIiwKLQkJICAgICAgJmdvbXBfZ2xvYmFsX2ljdi5iaW5kX3Zh ciwKLQkJICAgICAgJmdvbXBfYmluZF92YXJfbGlzdCwKLQkJICAgICAgJmdvbXBfYmluZF92 YXJfbGlzdF9sZW4pCisKKyAgLyogSW5pdGlhbCB2YWx1ZXMgZm9yIGhvc3QgZW52aXJvbm1l bnQgdmFyaWFibGVzIHNob3VsZCBhbHdheXMgZXhpc3QgZXZlbiBpZgorICAgICB0aGVyZSBp cyBubyBleHBsaWNpdGx5IHNldCBob3N0IGVudmlyb25tZW50IHZhcmlhYmxlLiAgTW9yZW92 ZXIsIHRoZXkgYXJlCisgICAgIHNldCB0byB0aGUgaW5pdGlhbCBnbG9iYWwgdmFsdWVzLiAg Ki8KKyAgYWRkX2ljdl90b19saXN0ICgtMywgMCwgTlVMTCk7CisgIG5vbmUgPSBnb21wX2dl dF9pbml0aWFsX2ljdl9pdGVtICgtMyk7CisgIG5vbmUtPmljdnMubnRocmVhZHNfdmFyID0g MTsKKyAgbm9uZS0+aWN2cy50aHJlYWRfbGltaXRfdmFyID0gVUlOVF9NQVg7CisgIG5vbmUt PmljdnMucnVuX3NjaGVkX3ZhciA9IEdGU19EWU5BTUlDOworICBub25lLT5pY3ZzLnJ1bl9z Y2hlZF9jaHVua19zaXplID0gMTsKKyAgbm9uZS0+aWN2cy5kZWZhdWx0X2RldmljZV92YXIg PSAwOworICBub25lLT5pY3ZzLmR5bl92YXIgPSBmYWxzZTsKKyAgbm9uZS0+aWN2cy5tYXhf YWN0aXZlX2xldmVsc192YXIgPSAxOworICBub25lLT5pY3ZzLmJpbmRfdmFyID0gb21wX3By b2NfYmluZF9mYWxzZTsKKworICBmb3IgKGVudiA9IGVudmlyb247ICplbnYgIT0gMDsgZW52 KyspCisgICAgeworICAgICAgaWYgKCFzdGFydHN3aXRoICgqZW52LCAiT01QXyIpKQorCWNv bnRpbnVlOworCisgICAgIGZvciAob21wX3ZhciA9IDA7IG9tcF92YXIgPCBPTVBfVkFSX0NO VDsgb21wX3ZhcisrKQorCXsKKwkgIGlmIChzdGFydHN3aXRoICgqZW52LCBlbnZ2YXJzW29t cF92YXJdLm5hbWUpKQorCSAgICB7CisJICAgICAgcG9zID0gZW52dmFyc1tvbXBfdmFyXS5u YW1lX2xlbjsKKwkgICAgICBpZiAoKCplbnYpW3Bvc10gPT0gJz0nKQorCQl7CisJCSAgcG9z Kys7CisJCSAgZmxhZ192YXJfYWRkcgorCQkgICAgPSBhZGRfaWN2X3RvX2xpc3QgKC0zLCBl bnZ2YXJzW29tcF92YXJdLmZsYWdfdmFyc1swXSwKKwkJCQkgICAgICAgcGFyYW1zKTsKKwkJ fQorCSAgICAgIGVsc2UgaWYgKHN0YXJ0c3dpdGggKCYoKmVudilbcG9zXSwgIl9ERVY9IikK KwkJICAgICAgICYmIGVudnZhcnNbb21wX3Zhcl0uZmxhZyAmIEdPTVBfRU5WX1NVRkZJWF9E RVYpCisJCXsKKwkJICBwb3MgKz0gNTsKKwkJICBmbGFnX3Zhcl9hZGRyCisJCSAgICA9IGFk ZF9pY3ZfdG9fbGlzdCAoLTEsIGVudnZhcnNbb21wX3Zhcl0uZmxhZ192YXJzWzBdLAorCQkJ CSAgICAgICBwYXJhbXMpOworCQl9CisJICAgICAgZWxzZSBpZiAoc3RhcnRzd2l0aCAoJigq ZW52KVtwb3NdLCAiX0FMTD0iKQorCQkgICAgICAgJiYgZW52dmFyc1tvbXBfdmFyXS5mbGFn ICYgR09NUF9FTlZfU1VGRklYX0FMTCkKKwkJeworCQkgIHBvcyArPSA1OworCQkgIGZsYWdf dmFyX2FkZHIKKwkJICAgID0gYWRkX2ljdl90b19saXN0ICgtMiwgZW52dmFyc1tvbXBfdmFy XS5mbGFnX3ZhcnNbMF0sCisJCQkJICAgICAgIHBhcmFtcyk7CisJCX0KKwkgICAgICBlbHNl IGlmIChzdGFydHN3aXRoICgmKCplbnYpW3Bvc10sICJfREVWXyIpCisJCSAgICAgICAmJiBl bnZ2YXJzW29tcF92YXJdLmZsYWcgJiBHT01QX0VOVl9TVUZGSVhfREVWX1gpCisJCXsKKwkJ ICBwb3MgKz0gNTsKKwkJICBpZiAoIWdldF9kZXZpY2VfbnVtICgqZW52LCAmKCplbnYpW3Bv c10sICZkZXZfbnVtLAorCQkJCSAgICAgICAmZGV2X251bV9sZW4pKQorCQkgICAgZ290byBu ZXh0X3ZhcjsKKworCQkgIHBvcyArPSBkZXZfbnVtX2xlbiArIDE7CisJCSAgZmxhZ192YXJf YWRkcgorCQkgICAgPSBhZGRfaWN2X3RvX2xpc3QgKGRldl9udW0sIGVudnZhcnNbb21wX3Zh cl0uZmxhZ192YXJzWzBdLAorCQkJCSAgICAgICBwYXJhbXMpOworCQl9CisJICAgICAgZWxz ZQorCQl7CisJCSAgZ29tcF9lcnJvciAoIkludmFsaWQgZGV2aWNlIG51bWJlciBpbiAlcyIs ICplbnYpOworCQkgIGJyZWFrOworCQl9CisJICAgICAgZW52X3ZhbCA9ICYoKmVudilbcG9z XTsKKworCSAgICAgIGlmIChlbnZ2YXJzW29tcF92YXJdLnBhcnNlX2Z1bmMgKCplbnYsIGVu dl92YWwsIHBhcmFtcykpCisJCXsKKwkJICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorCQkg ICAgaWYgKGVudnZhcnNbb21wX3Zhcl0uZmxhZ192YXJzW2ldKQorCQkgICAgICBnb21wX3Nl dF9pY3ZfZmxhZyAoZmxhZ192YXJfYWRkciwKKwkJCQkJIGVudnZhcnNbb21wX3Zhcl0uZmxh Z192YXJzW2ldKTsKKwkJICAgIGVsc2UKKwkJICAgICAgYnJlYWs7CisJCX0KKworCSAgICAg IGJyZWFrOworCSAgICB9CisJfQorCisgbmV4dF92YXI6CisgICAgfQorCisgICAgYWxsID0g Z29tcF9nZXRfaW5pdGlhbF9pY3ZfaXRlbSAoLTIpOworICAgIGZvciAob21wX3ZhciA9IDA7 IG9tcF92YXIgPCBPTVBfSE9TVF9WQVJfQ05UOyBvbXBfdmFyKyspCisgICAgICB7CisJaWYg KG5vbmUgIT0gTlVMTAorCSAgICAmJiBnb21wX2dldF9pY3ZfZmxhZyAobm9uZS0+ZmxhZ3Ms IGhvc3RfZW52dmFyc1tvbXBfdmFyXS5mbGFnX3ZhcikpCisJICBnZXRfaWN2X21lbWJlcl9h ZGRyICgmbm9uZS0+aWN2cywKKwkJCSAgICAgICBob3N0X2VudnZhcnNbb21wX3Zhcl0uZmxh Z192YXIsIHBhcmFtcyk7CisJZWxzZSBpZiAoYWxsICE9IE5VTEwKKwkJICYmIGdvbXBfZ2V0 X2ljdl9mbGFnIChhbGwtPmZsYWdzLAorCQkJCSAgICAgICBob3N0X2VudnZhcnNbb21wX3Zh cl0uZmxhZ192YXIpKQorCSAgZ2V0X2ljdl9tZW1iZXJfYWRkciAoJmFsbC0+aWN2cywgaG9z dF9lbnZ2YXJzW29tcF92YXJdLmZsYWdfdmFyLAorCQkJICAgICAgIHBhcmFtcyk7CisJZWxz ZQorCSAgY29udGludWU7CisKKwlzd2l0Y2ggKGhvc3RfZW52dmFyc1tvbXBfdmFyXS50eXBl X2NvZGUpCisJICB7CisJICBjYXNlIFBBUlNFX0lOVDoKKwkgICAgZm9yIChpID0gMDsgaSA8 IDM7ICsraSkKKwkgICAgICBpZiAoaG9zdF9lbnZ2YXJzW29tcF92YXJdLmRlc3RbaV0gIT0g TlVMTCAmJiBwYXJhbXNbaV0gIT0gTlVMTCkKKwkJKihpbnQgKikgKGhvc3RfZW52dmFyc1tv bXBfdmFyXS5kZXN0W2ldKSA9ICooaW50ICopIHBhcmFtc1tpXTsKKwkgICAgYnJlYWs7CisJ ICBjYXNlIFBBUlNFX0JPT0w6CisJICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisJICAg ICAgaWYgKGhvc3RfZW52dmFyc1tvbXBfdmFyXS5kZXN0W2ldICE9IE5VTEwgJiYgcGFyYW1z W2ldICE9IE5VTEwpCisJCSooYm9vbCAqKSAoaG9zdF9lbnZ2YXJzW29tcF92YXJdLmRlc3Rb aV0pID0gKihib29sICopIHBhcmFtc1tpXTsKKwkgICAgYnJlYWs7CisJICBjYXNlIFBBUlNF X1VJTlQ6CisJICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisJICAgICAgaWYgKGhvc3Rf ZW52dmFyc1tvbXBfdmFyXS5kZXN0W2ldICE9IE5VTEwgJiYgcGFyYW1zW2ldICE9IE5VTEwp CisJCSoodW5zaWduZWQgaW50ICopIChob3N0X2VudnZhcnNbb21wX3Zhcl0uZGVzdFtpXSkK KwkJICA9ICoodW5zaWduZWQgaW50ICopIHBhcmFtc1tpXTsKKwkgICAgYnJlYWs7CisJICBj YXNlIFBBUlNFX1VMT05HOgorCSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorCSAgICAg IGlmIChob3N0X2VudnZhcnNbb21wX3Zhcl0uZGVzdFtpXSAhPSBOVUxMICYmIHBhcmFtc1tp XSAhPSBOVUxMKQorCQkqKHVuc2lnbmVkIGxvbmcgKikgKGhvc3RfZW52dmFyc1tvbXBfdmFy XS5kZXN0W2ldKQorCQkgID0gKih1bnNpZ25lZCBsb25nICopIHBhcmFtc1tpXTsKKwkgICAg YnJlYWs7CisJICBjYXNlIFBBUlNFX0NIQVI6CisJICAgIGZvciAoaSA9IDA7IGkgPCAzOyAr K2kpCisJICAgICAgaWYgKGhvc3RfZW52dmFyc1tvbXBfdmFyXS5kZXN0W2ldICE9IE5VTEwg JiYgcGFyYW1zW2ldICE9IE5VTEwpCisJCSooY2hhciAqKSAoaG9zdF9lbnZ2YXJzW29tcF92 YXJdLmRlc3RbaV0pID0gKihjaGFyICopIHBhcmFtc1tpXTsKKwkgICAgYnJlYWs7CisJICBj YXNlIFBBUlNFX1VDSEFSOgorCSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQorCSAgICAg IGlmIChob3N0X2VudnZhcnNbb21wX3Zhcl0uZGVzdFtpXSAhPSBOVUxMICYmIHBhcmFtc1tp XSAhPSBOVUxMKQorCQkqKHVuc2lnbmVkIGNoYXIgKikgKGhvc3RfZW52dmFyc1tvbXBfdmFy XS5kZXN0W2ldKQorCQkgID0gKih1bnNpZ25lZCBjaGFyICopIHBhcmFtc1tpXTsKKwkgICAg YnJlYWs7CisJICB9CisgICAgICB9CisKKyAgaWYgKCgobm9uZSAhPSBOVUxMICYmIGdvbXBf Z2V0X2ljdl9mbGFnIChub25lLT5mbGFncywgR09NUF9JQ1ZfQklORCkpCisgICAgICAgfHwg KGFsbCAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLCBHT01QX0lD Vl9CSU5EKSkpCiAgICAgICAmJiBnb21wX2dsb2JhbF9pY3YuYmluZF92YXIgPT0gb21wX3By b2NfYmluZF9mYWxzZSkKICAgICBpZ25vcmUgPSB0cnVlOwotICBpZiAocGFyc2VfdW5zaWdu ZWRfbG9uZyAoIk9NUF9NQVhfQUNUSVZFX0xFVkVMUyIsCi0JCQkgICAmbWF4X2FjdGl2ZV9s ZXZlbHNfdmFyLCB0cnVlKSkKLSAgICBnb21wX2dsb2JhbF9pY3YubWF4X2FjdGl2ZV9sZXZl bHNfdmFyCi0gICAgICA9IChtYXhfYWN0aXZlX2xldmVsc192YXIgPiBnb21wX3N1cHBvcnRl ZF9hY3RpdmVfbGV2ZWxzKQotCT8gZ29tcF9zdXBwb3J0ZWRfYWN0aXZlX2xldmVscyA6IG1h eF9hY3RpdmVfbGV2ZWxzX3ZhcjsKLSAgZWxzZQorCisgIGlmICghKChub25lICE9IE5VTEwK KwkgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKG5vbmUtPmZsYWdzLCBHT01QX0lDVl9NQVhfQUNU SVZFX0xFVkVMUykpCisgICAgICAgfHwgKGFsbCAhPSBOVUxMCisJICAgJiYgZ29tcF9nZXRf aWN2X2ZsYWcgKGFsbC0+ZmxhZ3MsIEdPTVBfSUNWX01BWF9BQ1RJVkVfTEVWRUxTKSkpKQog ICAgIHsKICAgICAgIGJvb2wgbmVzdGVkID0gdHJ1ZTsKKyAgICAgIGNvbnN0IGNoYXIgKmVu diA9IGdldGVudiAoIk9NUF9ORVNURUQiKTsKIAogICAgICAgLyogT01QX05FU1RFRCBpcyBk ZXByZWNhdGVkIGluIE9wZW5NUCA1LjAuICAqLwotICAgICAgaWYgKHBhcnNlX2Jvb2xlYW4g KCJPTVBfTkVTVEVEIiwgJm5lc3RlZCkpCisgICAgICBpZiAocGFyc2VfYm9vbGVhbiAoIk9N UF9ORVNURUQiLCBlbnYsICh2b2lkICpbXSkgeyZuZXN0ZWR9KSkKIAlnb21wX2dsb2JhbF9p Y3YubWF4X2FjdGl2ZV9sZXZlbHNfdmFyCiAJICA9IG5lc3RlZCA/IGdvbXBfc3VwcG9ydGVk X2FjdGl2ZV9sZXZlbHMgOiAxOwogICAgICAgZWxzZSBpZiAoZ29tcF9udGhyZWFkc192YXJf bGlzdF9sZW4gPiAxIHx8IGdvbXBfYmluZF92YXJfbGlzdF9sZW4gPiAxKQogCWdvbXBfZ2xv YmFsX2ljdi5tYXhfYWN0aXZlX2xldmVsc192YXIgPSBnb21wX3N1cHBvcnRlZF9hY3RpdmVf bGV2ZWxzOwogICAgIH0KKworICAvKiBQcm9jZXNzIEdPTVBfKiB2YXJpYWJsZXMgYW5kIGRl cGVuZGVuY2llcyBiZXR3ZWVuIHBhcnNlZCBJQ1ZzLiAgKi8KKyAgcGFyc2VfaW50X3NlY3Vy ZSAoIkdPTVBfREVCVUciLCAmZ29tcF9kZWJ1Z192YXIsIHRydWUpOworCiAgIC8qIE1ha2Ug c3VyZSBPTVBfUExBQ0VTIGFuZCBHT01QX0NQVV9BRkZJTklUWSBlbnYgdmFycyBhcmUgYWx3 YXlzCiAgICAgIHBhcnNlZCBpZiBwcmVzZW50IGluIHRoZSBlbnZpcm9ubWVudC4gIElmIE9N UF9QUk9DX0JJTkQgd2FzIHNldAogICAgICBleHBsaWNpdGx5IHRvIGZhbHNlLCBkb24ndCBw b3B1bGF0ZSBwbGFjZXMgbGlzdCB0aG91Z2guICBJZiBwbGFjZXMKQEAgLTE1NDcsNyArMjIy NCwxMSBAQCBpbml0aWFsaXplX2VudiAodm9pZCkKICAgICAgIGdvbXBfc2V0X2FmZmluaXR5 X2Zvcm1hdCAoZW52LCBzdHJsZW4gKGVudikpOwogICB9CiAKLSAgd2FpdF9wb2xpY3kgPSBw YXJzZV93YWl0X3BvbGljeSAoKTsKKyAgaWYgKG5vbmUgIT0gTlVMTCAmJiBnb21wX2dldF9p Y3ZfZmxhZyAobm9uZS0+ZmxhZ3MsIEdPTVBfSUNWX1dBSVRfUE9MSUNZKSkKKyAgICB3YWl0 X3BvbGljeSA9IG5vbmUtPmljdnMud2FpdF9wb2xpY3k7CisgIGVsc2UgaWYgKGFsbCAhPSBO VUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChhbGwtPmZsYWdzLCBHT01QX0lDVl9XQUlUX1BP TElDWSkpCisgICAgd2FpdF9wb2xpY3kgPSBhbGwtPmljdnMud2FpdF9wb2xpY3k7CisKICAg aWYgKCFwYXJzZV9zcGluY291bnQgKCJHT01QX1NQSU5DT1VOVCIsICZnb21wX3NwaW5fY291 bnRfdmFyKSkKICAgICB7CiAgICAgICAvKiBVc2luZyBhIHJvdWdoIGVzdGltYXRpb24gb2Yg MTAwMDAwIHNwaW5zIHBlciBtc2VjLApAQCAtMTU3Myw4ICsyMjU0LDIxIEBAIGluaXRpYWxp emVfZW52ICh2b2lkKQogICAvKiBOb3Qgc3RyaWN0bHkgZW52aXJvbm1lbnQgcmVsYXRlZCwg YnV0IG9yZGVyaW5nIGNvbnN0cnVjdG9ycyBpcyB0cmlja3kuICAqLwogICBwdGhyZWFkX2F0 dHJfaW5pdCAoJmdvbXBfdGhyZWFkX2F0dHIpOwogCi0gIGlmIChwYXJzZV9zdGFja3NpemUg KCJPTVBfU1RBQ0tTSVpFIiwgJnN0YWNrc2l6ZSkKLSAgICAgIHx8IHBhcnNlX3N0YWNrc2l6 ZSAoIkdPTVBfU1RBQ0tTSVpFIiwgJnN0YWNrc2l6ZSkKKyAgaWYgKCEobm9uZSAhPSBOVUxM ICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChub25lLT5mbGFncywgR09NUF9JQ1ZfU1RBQ0tTSVpF KSkpCisgICAgeworICAgICAgY29uc3QgY2hhciAqZW52ID0gZ2V0ZW52ICgiR09NUF9TVEFD S1NJWkUiKTsKKyAgICAgIGlmIChlbnYgIT0gTlVMTAorCSAgJiYgcGFyc2Vfc3RhY2tzaXpl ICgiR09NUF9TVEFDS1NJWkUiLCBlbnYsCisJCQkgICAgICAodm9pZCAqWzNdKSB7Jm5vbmUt PmljdnMuc3RhY2tzaXplfSkpCisJZ29tcF9zZXRfaWN2X2ZsYWcgKCZub25lLT5mbGFncywg R09NUF9JQ1ZfU1RBQ0tTSVpFKTsKKyAgICB9CisgIGlmIChub25lICE9IE5VTEwgJiYgZ29t cF9nZXRfaWN2X2ZsYWcgKG5vbmUtPmZsYWdzLCBHT01QX0lDVl9TVEFDS1NJWkUpKQorICAg IHN0YWNrc2l6ZSA9IG5vbmUtPmljdnMuc3RhY2tzaXplOworICBlbHNlIGlmIChhbGwgIT0g TlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfU1RBQ0tT SVpFKSkKKyAgICBzdGFja3NpemUgPSBhbGwtPmljdnMuc3RhY2tzaXplOworCisgIGlmICgo bm9uZSAhPSBOVUxMICYmIGdvbXBfZ2V0X2ljdl9mbGFnIChub25lLT5mbGFncywgR09NUF9J Q1ZfU1RBQ0tTSVpFKSkKKyAgICAgIHx8IChhbGwgIT0gTlVMTCAmJiBnb21wX2dldF9pY3Zf ZmxhZyAoYWxsLT5mbGFncywgR09NUF9JQ1ZfU1RBQ0tTSVpFKSkKICAgICAgIHx8IEdPTVBf REVGQVVMVF9TVEFDS1NJWkUpCiAgICAgewogICAgICAgaW50IGVycjsKQEAgLTE2MDEsNyAr MjI5NSw4IEBAIGluaXRpYWxpemVfZW52ICh2b2lkKQogCiAgIC8qIE9wZW5BQ0MuICAqLwog Ci0gIGlmICghcGFyc2VfaW50ICgiQUNDX0RFVklDRV9OVU0iLCAmZ29hY2NfZGV2aWNlX251 bSwgdHJ1ZSkpCisgIGlmICghcGFyc2VfaW50ICgiQUNDX0RFVklDRV9OVU0iLCBnZXRlbnYg KCJBQ0NfREVWSUNFX05VTSIpLAorCQkgICh2b2lkICpbXSkgeyZnb2FjY19kZXZpY2VfbnVt LCAodm9pZCAqKSB0cnVlfSkpCiAgICAgZ29hY2NfZGV2aWNlX251bSA9IDA7CiAKICAgcGFy c2VfYWNjX2RldmljZV90eXBlICgpOwpkaWZmIC0tZ2l0IGEvbGliZ29tcC9pY3YtZGV2aWNl LmMgYi9saWJnb21wL2ljdi1kZXZpY2UuYwppbmRleCAxMWNlYjMwLi42Njc1NmU0IDEwMDY0 NAotLS0gYS9saWJnb21wL2ljdi1kZXZpY2UuYworKysgYi9saWJnb21wL2ljdi1kZXZpY2Uu YwpAQCAtODAsMyArODAsMTEgQEAgb21wX2dldF9kZXZpY2VfbnVtICh2b2lkKQogfQogCiBp YWxpYXMgKG9tcF9nZXRfZGV2aWNlX251bSkKKworaW50CitvbXBfZ2V0X21heF90ZWFtcyAo dm9pZCkKK3sKKyAgcmV0dXJuIGdvbXBfbnRlYW1zX3ZhcjsKK30KKworaWFsaWFzIChvbXBf Z2V0X21heF90ZWFtcykKZGlmZiAtLWdpdCBhL2xpYmdvbXAvaWN2LmMgYi9saWJnb21wL2lj di5jCmluZGV4IGRlMTVjYzguLjVjNDM1ZDYgMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvaWN2LmMK KysrIGIvbGliZ29tcC9pY3YuYwpAQCAtMTU1LDEyICsxNTUsNiBAQCBvbXBfc2V0X251bV90 ZWFtcyAoaW50IG51bV90ZWFtcykKICAgICBnb21wX250ZWFtc192YXIgPSBudW1fdGVhbXM7 CiB9CiAKLWludAotb21wX2dldF9tYXhfdGVhbXMgKHZvaWQpCi17Ci0gIHJldHVybiBnb21w X250ZWFtc192YXI7Ci19Ci0KIHZvaWQKIG9tcF9zZXRfdGVhbXNfdGhyZWFkX2xpbWl0IChp bnQgdGhyZWFkX2xpbWl0KQogewpAQCAtMjc1LDcgKzI2OSw2IEBAIGlhbGlhcyAob21wX3Nl dF9tYXhfYWN0aXZlX2xldmVscykKIGlhbGlhcyAob21wX2dldF9tYXhfYWN0aXZlX2xldmVs cykKIGlhbGlhcyAob21wX2dldF9zdXBwb3J0ZWRfYWN0aXZlX2xldmVscykKIGlhbGlhcyAo b21wX3NldF9udW1fdGVhbXMpCi1pYWxpYXMgKG9tcF9nZXRfbWF4X3RlYW1zKQogaWFsaWFz IChvbXBfc2V0X3RlYW1zX3RocmVhZF9saW1pdCkKIGlhbGlhcyAob21wX2dldF90ZWFtc190 aHJlYWRfbGltaXQpCiBpYWxpYXMgKG9tcF9nZXRfY2FuY2VsbGF0aW9uKQpkaWZmIC0tZ2l0 IGEvbGliZ29tcC9saWJnb21wLXBsdWdpbi5oIGIvbGliZ29tcC9saWJnb21wLXBsdWdpbi5o CmluZGV4IGFiM2VkNjMuLjE3Y2RhMjggMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvbGliZ29tcC1w bHVnaW4uaAorKysgYi9saWJnb21wL2xpYmdvbXAtcGx1Z2luLmgKQEAgLTEwMiwxMSArMTAy LDEzIEBAIHN0cnVjdCBhZGRyX3BhaXIKICAgdWludHB0cl90IGVuZDsKIH07CiAKLS8qIFRo aXMgc3ltYm9sIGlzIHRvIG5hbWUgYSB0YXJnZXQgc2lkZSB2YXJpYWJsZSB0aGF0IGhvbGRz IHRoZSBkZXNpZ25hdGVkCi0gICAnZGV2aWNlIG51bWJlcicgb2YgdGhlIHRhcmdldCBkZXZp Y2UuIFRoZSBzeW1ib2wgbmVlZHMgdG8gYmUgYXZhaWxhYmxlIHRvCisvKiBUaGlzIGZvbGxv d2luZyBzeW1ib2xzIGFyZSB0byBuYW1lIHRhcmdldCBzaWRlIHZhcmlhYmxlcyB0aGF0IGhv bGQgdGhlCisgICBkZXNpZ25hdGVkIElDVnMgb2YgdGhlIHRhcmdldCBkZXZpY2UuIFRoZSBz eW1ib2xzIG5lZWQgdG8gYmUgYXZhaWxhYmxlIHRvCiAgICBsaWJnb21wIGNvZGUgYW5kIHRo ZSBvZmZsb2FkIHBsdWdpbiAod2hpY2ggaW4gdGhlIGxhdHRlciBjYXNlIG11c3QgYmUKICAg IHN0cmluZ2lmaWVkKS4gICovCiAjZGVmaW5lIEdPTVBfREVWSUNFX05VTV9WQVIgX19nb21w X2RldmljZV9udW0KKyNkZWZpbmUgR09NUF9ERUZBVUxUX0RFVklDRV9WQVIgX19nb21wX2Rl ZmF1bHRfZGV2aWNlCisjZGVmaW5lIEdPTVBfTlRFQU1TX1ZBUiBfX2dvbXBfbnRlYW1zCiAK IC8qIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zLiAgKi8KIGV4dGVybiB2b2lkICpHT01QX1BM VUdJTl9tYWxsb2MgKHNpemVfdCkgX19hdHRyaWJ1dGVfXyAoKG1hbGxvYykpOwpkaWZmIC0t Z2l0IGEvbGliZ29tcC9saWJnb21wLmggYi9saWJnb21wL2xpYmdvbXAuaAppbmRleCBjMjQz YzRkLi5iNWQ5NjJhIDEwMDY0NAotLS0gYS9saWJnb21wL2xpYmdvbXAuaAorKysgYi9saWJn b21wL2xpYmdvbXAuaApAQCAtNDUzLDYgKzQ1MywzMSBAQCBzdHJ1Y3QgZ29tcF90ZWFtX3N0 YXRlCiAKIHN0cnVjdCB0YXJnZXRfbWVtX2Rlc2M7CiAKK2VudW0gZ29tcF9pY3ZzCit7Cisg ICBHT01QX0lDVl9OVEVBTVMgPSAxLAorICAgR09NUF9JQ1ZfU0NIRURVTEUgPSAyLAorICAg R09NUF9JQ1ZfU0NIRURVTEVfQ0hVTktfU0laRSA9IDMsCisgICBHT01QX0lDVl9EWU5BTUlD ID0gNCwKKyAgIEdPTVBfSUNWX1RFQU1TX1RIUkVBRF9MSU1JVCA9IDUsCisgICBHT01QX0lD Vl9USFJFQURfTElNSVQgPSA2LAorICAgR09NUF9JQ1ZfTlRIUkVBRFMgPSA3LAorICAgR09N UF9JQ1ZfTlRIUkVBRFNfTElTVCA9IDgsCisgICBHT01QX0lDVl9OVEhSRUFEU19MSVNUX0xF TiA9IDksCisgICBHT01QX0lDVl9CSU5EID0gMTAsCisgICBHT01QX0lDVl9CSU5EX0xJU1Qg PSAxMSwKKyAgIEdPTVBfSUNWX0JJTkRfTElTVF9MRU4gPSAxMiwKKyAgIEdPTVBfSUNWX01B WF9BQ1RJVkVfTEVWRUxTID0gMTMsCisgICBHT01QX0lDVl9XQUlUX1BPTElDWSA9IDE0LAor ICAgR09NUF9JQ1ZfU1RBQ0tTSVpFID0gMTUsCisgICBHT01QX0lDVl9ERUZBVUxUX0RFVklD RSA9IDE2LAorICAgR09NUF9JQ1ZfQ0FOQ0VMTEFUSU9OID0gMTcsCisgICBHT01QX0lDVl9E SVNQTEFZX0FGRklOSVRZID0gMTgsCisgICBHT01QX0lDVl9UQVJHRVRfT0ZGTE9BRCA9IDE5 LAorICAgR09NUF9JQ1ZfTUFYX1RBU0tfUFJJT1JJVFkgPSAyMCwKKyAgIEdPTVBfSUNWX0FM TE9DQVRPUiA9IDIxCit9OworCiAvKiBUaGVzZSBhcmUgdGhlIE9wZW5NUCA0LjAgSW50ZXJu YWwgQ29udHJvbCBWYXJpYWJsZXMgZGVzY3JpYmVkIGluCiAgICBzZWN0aW9uIDIuMy4xLiAg VGhvc2UgZGVzY3JpYmVkIGFzIGhhdmluZyBvbmUgY29weSBwZXIgdGFzayBhcmUKICAgIHN0 b3JlZCB3aXRoaW4gdGhlIHN0cnVjdHVyZTsgdGhvc2UgZGVzY3JpYmVkIGFzIGhhdmluZyBv bmUgY29weQpAQCAtNDcyLDYgKzQ5Nyw1NSBAQCBzdHJ1Y3QgZ29tcF90YXNrX2ljdgogICBz dHJ1Y3QgdGFyZ2V0X21lbV9kZXNjICp0YXJnZXRfZGF0YTsKIH07CiAKK2VudW0gZ29tcF9l bnZfc3VmZml4Cit7CisgIEdPTVBfRU5WX1NVRkZJWF9VTktOT1dOID0gMCwKKyAgR09NUF9F TlZfU1VGRklYX05PTkUgPSAxLAorICBHT01QX0VOVl9TVUZGSVhfREVWID0gMiwKKyAgR09N UF9FTlZfU1VGRklYX0FMTCA9IDQsCisgIEdPTVBfRU5WX1NVRkZJWF9ERVZfWCA9IDgKK307 CisKKy8qIFN0cnVjdCB0aGF0IGNvbnRhaW5zIGFsbCBJQ1ZzIGZvciB3aGljaCB3ZSBuZWVk IHRvIHN0b3JlIGluaXRpYWwgdmFsdWVzLgorICAgS2VlcGluZyB0aGUgaW5pdGlhbCB2YWx1 ZXMgaXMgbmVlZGVkIGZvciBvbXBfZGlzcGxheV9lbnYuICBNb3Jlb3ZlciBpbml0aWFsCisg ICBfREVWIGFuZCBfQUxMIHZhcmlhbnRzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUg YWxzbyB1c2VkIHRvIGRldGVybWluZQorICAgYWN0dWFsbHkgdXNlZCB2YWx1ZXMgZm9yIGRl dmljZXMgYW5kIGZvciB0aGUgaG9zdC4gICovCitzdHJ1Y3QgZ29tcF9pbml0aWFsX2ljdnMK K3sKKyAgdW5zaWduZWQgbG9uZyAqbnRocmVhZHNfdmFyX2xpc3Q7CisgIGNoYXIgKmJpbmRf dmFyX2xpc3Q7CisgIHVuc2lnbmVkIGxvbmcgbnRocmVhZHNfdmFyOworICB1bnNpZ25lZCBs b25nIG50aHJlYWRzX3Zhcl9saXN0X2xlbjsKKyAgdW5zaWduZWQgbG9uZyBiaW5kX3Zhcl9s aXN0X2xlbjsKKyAgdW5zaWduZWQgbG9uZyBzdGFja3NpemU7CisgIGludCBydW5fc2NoZWRf Y2h1bmtfc2l6ZTsKKyAgaW50IGRlZmF1bHRfZGV2aWNlX3ZhcjsKKyAgaW50IG50ZWFtc192 YXI7CisgIGludCB0ZWFtc190aHJlYWRfbGltaXRfdmFyOworICBpbnQgd2FpdF9wb2xpY3k7 CisgIHVuc2lnbmVkIGludCB0aHJlYWRfbGltaXRfdmFyOworICBlbnVtIGdvbXBfc2NoZWR1 bGVfdHlwZSBydW5fc2NoZWRfdmFyOworICBib29sIGR5bl92YXI7CisgIHVuc2lnbmVkIGNo YXIgbWF4X2FjdGl2ZV9sZXZlbHNfdmFyOworICBjaGFyIGJpbmRfdmFyOworfTsKKworLyog IERFVklDRV9OVU0gIi0xIiBpcyByZXNlcnZlZCBmb3IgIl9ERVYiIGljdnMuCisgICAgREVW SUNFX05VTSAiLTIiIGlzIHJlc2VydmVkIGZvciAiX0FMTCIgaWN2cy4KKyAgICBERVZJQ0Vf TlVNICItMyIgaXMgcmVzZXJ2ZWQgZm9yICJfQUxMIiBpY3ZzLgorICAgIE5vbi1uZWdhdGl2 ZSBERVZJQ0VfTlVNIGlzIGZvciAiX0RFVl9YIiBpY3ZzLiAgKi8KK3N0cnVjdCBnb21wX2lj dl9saXN0Cit7CisgIGludCBkZXZpY2VfbnVtOworICBzdHJ1Y3QgZ29tcF9pbml0aWFsX2lj dnMgaWN2czsKKyAgdWludDMyX3QgZmxhZ3M7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICpu ZXh0OworfTsKK2V4dGVybiBzdHJ1Y3QgZ29tcF9pY3ZfbGlzdCAqZ29tcF9pbml0aWFsX2lj dl9saXN0OworZXh0ZXJuIHN0cnVjdCBnb21wX2ljdl9saXN0ICpnb21wX2dldF9pbml0aWFs X2ljdl9pdGVtIChpbnQgZGV2X251bSk7CisKK2V4dGVybiBib29sIGdvbXBfZ2V0X2ljdl9m bGFnICh1aW50MzJfdCB2YWx1ZSwgZW51bSBnb21wX2ljdnMgaWN2KTsKKwogZW51bSBnb21w X3RhcmdldF9vZmZsb2FkX3QKIHsKICAgR09NUF9UQVJHRVRfT0ZGTE9BRF9ERUZBVUxULApk aWZmIC0tZ2l0IGEvbGliZ29tcC9wbHVnaW4vcGx1Z2luLWdjbi5jIGIvbGliZ29tcC9wbHVn aW4vcGx1Z2luLWdjbi5jCmluZGV4IGVhMzI3YmYuLjU2NDA2YTcgMTAwNjQ0Ci0tLSBhL2xp YmdvbXAvcGx1Z2luL3BsdWdpbi1nY24uYworKysgYi9saWJnb21wL3BsdWdpbi9wbHVnaW4t Z2NuLmMKQEAgLTU2MSw2ICs1NjEsMTQgQEAgc3RydWN0IGhlYXAgewogICBjaGFyIGRhdGFb MF07CiB9OwogCisvKiBTdHJpbmdzIG9mIElDVnMgd2hpY2ggYXJlIGNvcGllZCB0byB0aGUg ZGV2aWNlLiAgKi8KK3N0YXRpYyBjaGFyICpHT01QX0lDVl9TVFJJTkdTW10gPQoreworICBY U1RSSU5HIChHT01QX0RFVklDRV9OVU1fVkFSKSwKKyAgWFNUUklORyAoR09NUF9ERUZBVUxU X0RFVklDRV9WQVIpLAorICBYU1RSSU5HIChHT01QX05URUFNU19WQVIpCit9OworCiAvKiB9 fX0gICovCiAvKiB7e3sgR2xvYmFsIHZhcmlhYmxlcyAgKi8KIApAQCAtMzM2Nyw3ICszMzc1 LDcgQEAgR09NUF9PRkZMT0FEX2xvYWRfaW1hZ2UgKGludCBvcmQsIHVuc2lnbmVkIHZlcnNp b24sIGNvbnN0IHZvaWQgKnRhcmdldF9kYXRhLAogICBzdHJ1Y3Qga2VybmVsX2luZm8gKmtl cm5lbDsKICAgaW50IGtlcm5lbF9jb3VudCA9IGltYWdlX2Rlc2MtPmtlcm5lbF9jb3VudDsK ICAgdW5zaWduZWQgdmFyX2NvdW50ID0gaW1hZ2VfZGVzYy0+Z2xvYmFsX3ZhcmlhYmxlX2Nv dW50OwotICBpbnQgb3RoZXJfY291bnQgPSAxOworICBpbnQgb3RoZXJfY291bnQgPSAzOwog CiAgIGFnZW50ID0gZ2V0X2FnZW50X2luZm8gKG9yZCk7CiAgIGlmICghYWdlbnQpCkBAIC0z NDY0LDM2ICszNDcyLDQzIEBAIEdPTVBfT0ZGTE9BRF9sb2FkX2ltYWdlIChpbnQgb3JkLCB1 bnNpZ25lZCB2ZXJzaW9uLCBjb25zdCB2b2lkICp0YXJnZXRfZGF0YSwKIAl9CiAgICAgfQog Ci0gIEdDTl9ERUJVRyAoIkxvb2tpbmcgZm9yIHZhcmlhYmxlICVzXG4iLCBYU1RSSU5HIChH T01QX0RFVklDRV9OVU1fVkFSKSk7Ci0KLSAgaHNhX3N0YXR1c190IHN0YXR1czsKLSAgaHNh X2V4ZWN1dGFibGVfc3ltYm9sX3QgdmFyX3N5bWJvbDsKLSAgc3RhdHVzID0gaHNhX2Zucy5o c2FfZXhlY3V0YWJsZV9nZXRfc3ltYm9sX2ZuIChhZ2VudC0+ZXhlY3V0YWJsZSwgTlVMTCwK LQkJCQkJCSBYU1RSSU5HIChHT01QX0RFVklDRV9OVU1fVkFSKSwKLQkJCQkJCSBhZ2VudC0+ aWQsIDAsICZ2YXJfc3ltYm9sKTsKLSAgaWYgKHN0YXR1cyA9PSBIU0FfU1RBVFVTX1NVQ0NF U1MpCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBvdGhlcl9jb3VudDsgaSsrKQogICAg IHsKLSAgICAgIHVpbnQ2NF90IGRldmljZV9udW1fdmFycHRyOwotICAgICAgdWludDMyX3Qg ZGV2aWNlX251bV92YXJzaXplOworICAgICAgR0NOX0RFQlVHICgiTG9va2luZyBmb3IgdmFy aWFibGUgJXNcbiIsIEdPTVBfSUNWX1NUUklOR1NbaV0pOwogCi0gICAgICBzdGF0dXMgPSBo c2FfZm5zLmhzYV9leGVjdXRhYmxlX3N5bWJvbF9nZXRfaW5mb19mbgotCSh2YXJfc3ltYm9s LCBIU0FfRVhFQ1VUQUJMRV9TWU1CT0xfSU5GT19WQVJJQUJMRV9BRERSRVNTLAotCSAmZGV2 aWNlX251bV92YXJwdHIpOwotICAgICAgaWYgKHN0YXR1cyAhPSBIU0FfU1RBVFVTX1NVQ0NF U1MpCi0JaHNhX2ZhdGFsICgiQ291bGQgbm90IGV4dHJhY3QgYSB2YXJpYWJsZSBmcm9tIGl0 cyBzeW1ib2wiLCBzdGF0dXMpOwotICAgICAgc3RhdHVzID0gaHNhX2Zucy5oc2FfZXhlY3V0 YWJsZV9zeW1ib2xfZ2V0X2luZm9fZm4KLQkodmFyX3N5bWJvbCwgSFNBX0VYRUNVVEFCTEVf U1lNQk9MX0lORk9fVkFSSUFCTEVfU0laRSwKLQkgJmRldmljZV9udW1fdmFyc2l6ZSk7Ci0g ICAgICBpZiAoc3RhdHVzICE9IEhTQV9TVEFUVVNfU1VDQ0VTUykKLQloc2FfZmF0YWwgKCJD b3VsZCBub3QgZXh0cmFjdCBhIHZhcmlhYmxlIHNpemUgZnJvbSBpdHMgc3ltYm9sIiwgc3Rh dHVzKTsKKyAgICAgIGhzYV9zdGF0dXNfdCBzdGF0dXM7CisgICAgICBoc2FfZXhlY3V0YWJs ZV9zeW1ib2xfdCB2YXJfc3ltYm9sOworICAgICAgc3RhdHVzID0gaHNhX2Zucy5oc2FfZXhl Y3V0YWJsZV9nZXRfc3ltYm9sX2ZuIChhZ2VudC0+ZXhlY3V0YWJsZSwgTlVMTCwKKwkJCQkJ CSAgICAgR09NUF9JQ1ZfU1RSSU5HU1tpXSwKKwkJCQkJCSAgICAgYWdlbnQtPmlkLCAwLCAm dmFyX3N5bWJvbCk7CisgICAgICBpZiAoc3RhdHVzID09IEhTQV9TVEFUVVNfU1VDQ0VTUykK Kwl7CisJICB1aW50NjRfdCB2YXJwdHI7CisJICB1aW50MzJfdCB2YXJzaXplOwogCi0gICAg ICBwYWlyLT5zdGFydCA9IGRldmljZV9udW1fdmFycHRyOwotICAgICAgcGFpci0+ZW5kID0g ZGV2aWNlX251bV92YXJwdHIgKyBkZXZpY2VfbnVtX3ZhcnNpemU7CisJICBzdGF0dXMgPSBo c2FfZm5zLmhzYV9leGVjdXRhYmxlX3N5bWJvbF9nZXRfaW5mb19mbgorCSAgICAodmFyX3N5 bWJvbCwgSFNBX0VYRUNVVEFCTEVfU1lNQk9MX0lORk9fVkFSSUFCTEVfQUREUkVTUywKKwkg ICAgICZ2YXJwdHIpOworCSAgaWYgKHN0YXR1cyAhPSBIU0FfU1RBVFVTX1NVQ0NFU1MpCisJ ICAgIGhzYV9mYXRhbCAoIkNvdWxkIG5vdCBleHRyYWN0IGEgdmFyaWFibGUgZnJvbSBpdHMg c3ltYm9sIiwgc3RhdHVzKTsKKwkgIHN0YXR1cyA9IGhzYV9mbnMuaHNhX2V4ZWN1dGFibGVf c3ltYm9sX2dldF9pbmZvX2ZuCisJICAgICh2YXJfc3ltYm9sLCBIU0FfRVhFQ1VUQUJMRV9T WU1CT0xfSU5GT19WQVJJQUJMRV9TSVpFLAorCSAgICAgJnZhcnNpemUpOworCSAgaWYgKHN0 YXR1cyAhPSBIU0FfU1RBVFVTX1NVQ0NFU1MpCisJICAgIGhzYV9mYXRhbCAoIkNvdWxkIG5v dCBleHRyYWN0IGEgdmFyaWFibGUgc2l6ZSBmcm9tIGl0cyBzeW1ib2wiLAorCQkgICAgICAg c3RhdHVzKTsKKworCSAgcGFpci0+c3RhcnQgPSB2YXJwdHI7CisJICBwYWlyLT5lbmQgPSB2 YXJwdHIgKyB2YXJzaXplOworCX0KKyAgICAgIGVsc2UKKwl7CisJICAvKiBUaGUgdmFyaWFi bGUgd2FzIG5vdCBpbiB0aGlzIGltYWdlLiAgKi8KKwkgIEdDTl9ERUJVRyAoIlZhcmlhYmxl IG5vdCBmb3VuZCBpbiBpbWFnZTogJXNcbiIsIEdPTVBfSUNWX1NUUklOR1NbaV0pOworCSAg cGFpci0+c3RhcnQgPSBwYWlyLT5lbmQgPSAwOworCX0KKyAgICAgIHBhaXIrKzsKICAgICB9 Ci0gIGVsc2UKLSAgICAvKiBUaGUgJ0dPTVBfREVWSUNFX05VTV9WQVInIHZhcmlhYmxlIHdh cyBub3QgaW4gdGhpcyBpbWFnZS4gICovCi0gICAgcGFpci0+c3RhcnQgPSBwYWlyLT5lbmQg PSAwOwotICBwYWlyKys7CiAKICAgLyogRW5zdXJlIHRoYXQgY29uc3RydWN0b3JzIGFyZSBy dW4gZmlyc3QuICAqLwogICBzdHJ1Y3QgR09NUF9rZXJuZWxfbGF1bmNoX2F0dHJpYnV0ZXMg a2xhID0KZGlmZiAtLWdpdCBhL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5jIGIvbGli Z29tcC9wbHVnaW4vcGx1Z2luLW52cHR4LmMKaW5kZXggYmM2M2UyNzQuLmI4N2VhMzggMTAw NjQ0Ci0tLSBhL2xpYmdvbXAvcGx1Z2luL3BsdWdpbi1udnB0eC5jCisrKyBiL2xpYmdvbXAv cGx1Z2luL3BsdWdpbi1udnB0eC5jCkBAIC0zMzQsNiArMzM0LDE0IEBAIHN0cnVjdCBwdHhf ZGV2aWNlCiAKIHN0YXRpYyBzdHJ1Y3QgcHR4X2RldmljZSAqKnB0eF9kZXZpY2VzOwogCisv KiBTdHJpbmdzIG9mIElDVnMgd2hpY2ggYXJlIGNvcGllZCB0byB0aGUgZGV2aWNlLiAgKi8K K3N0YXRpYyBjaGFyICpHT01QX0lDVl9TVFJJTkdTW10gPQoreworICBYU1RSSU5HIChHT01Q X0RFVklDRV9OVU1fVkFSKSwKKyAgWFNUUklORyAoR09NUF9ERUZBVUxUX0RFVklDRV9WQVIp LAorICBYU1RSSU5HIChHT01QX05URUFNU19WQVIpCit9OworCiBzdGF0aWMgaW5saW5lIHN0 cnVjdCBudnB0eF90aHJlYWQgKgogbnZwdHhfdGhyZWFkICh2b2lkKQogewpAQCAtMTI3NSw3 ICsxMjgzLDcgQEAgR09NUF9PRkZMT0FEX2xvYWRfaW1hZ2UgKGludCBvcmQsIHVuc2lnbmVk IHZlcnNpb24sIGNvbnN0IHZvaWQgKnRhcmdldF9kYXRhLAogICBDVW1vZHVsZSBtb2R1bGU7 CiAgIGNvbnN0IGNoYXIgKmNvbnN0ICp2YXJfbmFtZXM7CiAgIGNvbnN0IHN0cnVjdCB0YXJn X2ZuX2xhdW5jaCAqZm5fZGVzY3M7Ci0gIHVuc2lnbmVkIGludCBmbl9lbnRyaWVzLCB2YXJf ZW50cmllcywgb3RoZXJfZW50cmllcywgaSwgajsKKyAgdW5zaWduZWQgaW50IGZuX2VudHJp ZXMsIHZhcl9lbnRyaWVzLCBvdGhlcl9lbnRyaWVzLCBpLCBqLCBrOwogICBzdHJ1Y3QgdGFy Z19mbl9kZXNjcmlwdG9yICp0YXJnX2ZuczsKICAgc3RydWN0IGFkZHJfcGFpciAqdGFyZ190 Ymw7CiAgIGNvbnN0IG52cHR4X3RkYXRhX3QgKmltZ19oZWFkZXIgPSAoY29uc3QgbnZwdHhf dGRhdGFfdCAqKSB0YXJnZXRfZGF0YTsKQEAgLTEzMDUsOCArMTMxMyw4IEBAIEdPTVBfT0ZG TE9BRF9sb2FkX2ltYWdlIChpbnQgb3JkLCB1bnNpZ25lZCB2ZXJzaW9uLCBjb25zdCB2b2lk ICp0YXJnZXRfZGF0YSwKICAgZm5fZW50cmllcyA9IGltZ19oZWFkZXItPmZuX251bTsKICAg Zm5fZGVzY3MgPSBpbWdfaGVhZGVyLT5mbl9kZXNjczsKIAotICAvKiBDdXJyZW50bHksIHRo ZSBvbmx5IG90aGVyIGVudHJ5IGtpbmQgaXMgJ2RldmljZSBudW1iZXInLiAgKi8KLSAgb3Ro ZXJfZW50cmllcyA9IDE7CisgIC8qIEN1cnJlbnRseSwgb3RoZXIgZW50cnkga2luZHMgYXJl ICdkZXZpY2UgbnVtYmVyJyBhbmQgZnVydGhlciBJQ1ZzLiAgKi8KKyAgb3RoZXJfZW50cmll cyA9IDM7CiAKICAgdGFyZ190YmwgPSBHT01QX1BMVUdJTl9tYWxsb2MgKHNpemVvZiAoc3Ry dWN0IGFkZHJfcGFpcikKIAkJCQkgKiAoZm5fZW50cmllcyArIHZhcl9lbnRyaWVzICsgb3Ro ZXJfZW50cmllcykpOwpAQCAtMTM1OCwyMCArMTM2NiwyMyBAQCBHT01QX09GRkxPQURfbG9h ZF9pbWFnZSAoaW50IG9yZCwgdW5zaWduZWQgdmVyc2lvbiwgY29uc3Qgdm9pZCAqdGFyZ2V0 X2RhdGEsCiAgICAgICB0YXJnX3RibC0+ZW5kID0gdGFyZ190YmwtPnN0YXJ0ICsgYnl0ZXM7 CiAgICAgfQogCi0gIENVZGV2aWNlcHRyIGRldmljZV9udW1fdmFycHRyOwotICBzaXplX3Qg ZGV2aWNlX251bV92YXJzaXplOwotICBDVXJlc3VsdCByID0gQ1VEQV9DQUxMX05PQ0hFQ0sg KGN1TW9kdWxlR2V0R2xvYmFsLCAmZGV2aWNlX251bV92YXJwdHIsCi0JCQkJICAmZGV2aWNl X251bV92YXJzaXplLCBtb2R1bGUsCi0JCQkJICBYU1RSSU5HIChHT01QX0RFVklDRV9OVU1f VkFSKSk7Ci0gIGlmIChyID09IENVREFfU1VDQ0VTUykKKyAgZm9yIChrID0gMDsgayA8IG90 aGVyX2VudHJpZXM7IGsrKywgdGFyZ190YmwrKykKICAgICB7Ci0gICAgICB0YXJnX3RibC0+ c3RhcnQgPSAodWludHB0cl90KSBkZXZpY2VfbnVtX3ZhcnB0cjsKLSAgICAgIHRhcmdfdGJs LT5lbmQgPSAodWludHB0cl90KSAoZGV2aWNlX251bV92YXJwdHIgKyBkZXZpY2VfbnVtX3Zh cnNpemUpOworICAgICAgQ1VkZXZpY2VwdHIgdmFycHRyOworICAgICAgc2l6ZV90IHZhcnNp emU7CisgICAgICBDVXJlc3VsdCByID0gQ1VEQV9DQUxMX05PQ0hFQ0sgKGN1TW9kdWxlR2V0 R2xvYmFsLCAmdmFycHRyLCAmdmFyc2l6ZSwKKwkJCQkgICAgICBtb2R1bGUsIEdPTVBfSUNW X1NUUklOR1Nba10pOworICAgICAgaWYgKHIgPT0gQ1VEQV9TVUNDRVNTKQorCXsKKwkgIHRh cmdfdGJsLT5zdGFydCA9ICh1aW50cHRyX3QpIHZhcnB0cjsKKwkgIHRhcmdfdGJsLT5lbmQg PSAodWludHB0cl90KSAodmFycHRyICsgdmFyc2l6ZSk7CisJfQorICAgICAgZWxzZQorCXsK KwkgIC8qIFRoZSB2YXJpYWJsZSB3YXMgbm90IGluIHRoaXMgaW1hZ2UuICAqLworCSAgdGFy Z190YmwtPnN0YXJ0ID0gdGFyZ190YmwtPmVuZCA9IDA7CisJfQogICAgIH0KLSAgZWxzZQot ICAgIC8qIFRoZSAnR09NUF9ERVZJQ0VfTlVNX1ZBUicgdmFyaWFibGUgd2FzIG5vdCBpbiB0 aGlzIGltYWdlLiAgKi8KLSAgICB0YXJnX3RibC0+c3RhcnQgPSB0YXJnX3RibC0+ZW5kID0g MDsKLSAgdGFyZ190YmwrKzsKIAogICBudnB0eF9zZXRfY2xvY2t0aWNrIChtb2R1bGUsIGRl dik7CiAKZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGFyZ2V0LmMgYi9saWJnb21wL3RhcmdldC5j CmluZGV4IDEzNWRiMWQuLjM1MDY3NDQgMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvdGFyZ2V0LmMK KysrIGIvbGliZ29tcC90YXJnZXQuYwpAQCAtMjEwOCw2ICsyMTA4LDM2IEBAIGdvbXBfdXBk YXRlIChzdHJ1Y3QgZ29tcF9kZXZpY2VfZGVzY3IgKmRldmljZXAsIHNpemVfdCBtYXBudW0s IHZvaWQgKipob3N0YWRkcnMsCiAgIGdvbXBfbXV0ZXhfdW5sb2NrICgmZGV2aWNlcC0+bG9j ayk7CiB9CiAKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgJ2dvbXBfbG9hZF9pbWFnZV90b19k ZXZpY2UnLiBSZXR1cm5zIHRoZSBwb2ludGVyIGZvciBhbgorICAgSUNWIHZhbHVlIGRlcGVu ZGluZyBvbiB0aGUgZGV2aWNlIG51bSBERVZfTlVNIGFuZCB0aGUgdmFyaWFibGUgaGllcmFy Y2h5CisgICAoX0RFVl80MiwgX0RFViwgX0FMTCkuICAqLworCitzdGF0aWMgdm9pZCAqCitn b21wX2dldF9pY3YgKGludCBkZXZfbnVtLCBpbnQgaWN2X2NvZGUpCit7CisgIHZvaWQgKnZh bCA9IE5VTEw7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICpsaXN0ID0gZ29tcF9nZXRfaW5p dGlhbF9pY3ZfaXRlbSAoZGV2X251bSk7CisgIHN0cnVjdCBnb21wX2ljdl9saXN0ICpsaXN0 X2RldiA9IGdvbXBfZ2V0X2luaXRpYWxfaWN2X2l0ZW0gKC0xKTsKKyAgc3RydWN0IGdvbXBf aWN2X2xpc3QgKmxpc3RfYWxsID0gZ29tcF9nZXRfaW5pdGlhbF9pY3ZfaXRlbSAoLTIpOwor CisgIHN3aXRjaCAoaWN2X2NvZGUpCisgICAgeworICAgIGNhc2UgR09NUF9JQ1ZfTlRFQU1T OgorICAgICAgaWYgKGxpc3QgIT0gTlVMTCAmJiBnb21wX2dldF9pY3ZfZmxhZyAobGlzdC0+ ZmxhZ3MsIEdPTVBfSUNWX05URUFNUykpCisJdmFsID0gJmxpc3QtPmljdnMubnRlYW1zX3Zh cjsKKyAgICAgIGVsc2UgaWYgKGxpc3RfZGV2ICE9IE5VTEwKKwkgICAgICAgJiYgZ29tcF9n ZXRfaWN2X2ZsYWcgKGxpc3RfZGV2LT5mbGFncywgR09NUF9JQ1ZfTlRFQU1TKSkKKwl2YWwg PSAmbGlzdF9kZXYtPmljdnMubnRlYW1zX3ZhcjsKKyAgICAgIGVsc2UgaWYgKGxpc3RfYWxs ICE9IE5VTEwKKwkgICAgICAgJiYgZ29tcF9nZXRfaWN2X2ZsYWcgKGxpc3RfYWxsLT5mbGFn cywgR09NUF9JQ1ZfTlRFQU1TKSkKKwl2YWwgPSAmbGlzdF9hbGwtPmljdnMubnRlYW1zX3Zh cjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdmFsID0gTlVM TDsKKyAgICB9CisgIHJldHVybiB2YWw7Cit9CisKIC8qIExvYWQgaW1hZ2UgcG9pbnRlZCBi eSBUQVJHRVRfREFUQSB0byB0aGUgZGV2aWNlLCBzcGVjaWZpZWQgYnkgREVWSUNFUC4KICAg IEFuZCBpbnNlcnQgdG8gc3BsYXkgdHJlZSB0aGUgbWFwcGluZyBiZXR3ZWVuIGFkZHJlc3Nl cyBmcm9tIEhPU1RfVEFCTEUgYW5kCiAgICBmcm9tIGxvYWRlZCB0YXJnZXQgaW1hZ2UuICBX ZSByZWx5IGluIHRoZSBob3N0IGFuZCBkZXZpY2UgY29tcGlsZXIKQEAgLTIxMjgsOCArMjE1 OCw4IEBAIGdvbXBfbG9hZF9pbWFnZV90b19kZXZpY2UgKHN0cnVjdCBnb21wX2RldmljZV9k ZXNjciAqZGV2aWNlcCwgdW5zaWduZWQgdmVyc2lvbiwKICAgaW50IG51bV9mdW5jcyA9IGhv c3RfZnVuY3NfZW5kIC0gaG9zdF9mdW5jX3RhYmxlOwogICBpbnQgbnVtX3ZhcnMgID0gKGhv c3RfdmFyc19lbmQgLSBob3N0X3Zhcl90YWJsZSkgLyAyOwogCi0gIC8qIE90aGVycyBjdXJy ZW50bHkgaXMgb25seSAnZGV2aWNlX251bScgKi8KLSAgaW50IG51bV9vdGhlcnMgPSAxOwor ICAvKiBPdGhlcnMgY29udGFpbnMgZnVydGhlciBJQ1ZzIChjdXJyZW50bHkgZGV2aWNlX251 bSwgZXRjLikuICAqLworICBpbnQgbnVtX290aGVycyA9IDM7CiAKICAgLyogTG9hZCBpbWFn ZSB0byBkZXZpY2UgYW5kIGdldCB0YXJnZXQgYWRkcmVzc2VzIGZvciB0aGUgaW1hZ2UuICAq LwogICBzdHJ1Y3QgYWRkcl9wYWlyICp0YXJnZXRfdGFibGUgPSBOVUxMOwpAQCAtMjIxMywz MiArMjI0Myw0NCBAQCBnb21wX2xvYWRfaW1hZ2VfdG9fZGV2aWNlIChzdHJ1Y3QgZ29tcF9k ZXZpY2VfZGVzY3IgKmRldmljZXAsIHVuc2lnbmVkIHZlcnNpb24sCiAgICAgICBhcnJheSsr OwogICAgIH0KIAotICAvKiBMYXN0IGVudHJ5IGlzIGZvciB0aGUgb24tZGV2aWNlICdkZXZp Y2VfbnVtJyB2YXJpYWJsZS4gVG9sZXJhdGUgY2FzZQotICAgICB3aGVyZSBwbHVnaW4gZG9l cyBub3QgcmV0dXJuIHRoaXMgZW50cnkuICAqLworICAvKiBMYXN0IGVudHJpZXMgYXJlIGZv ciB0aGUgb24tZGV2aWNlICdkZXZpY2VfbnVtJyB2YXJpYWJsZSBhbmQgb3RoZXIgSUNWcy4K KyAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSB2YXJpYWJsZXMgaW4gVEFSR0VUX1RBQkxFIHJl c3VsdHMgZnJvbSBHT01QX0lDVl9TVFJJTkdTCisgICAgIGFycmF5LiBUb2xlcmF0ZSBjYXNl IHdoZXJlIHBsdWdpbiBkb2VzIG5vdCByZXR1cm4gdGhvc2UgZW50cmllcy4gICovCiAgIGlm IChudW1fZnVuY3MgKyBudW1fdmFycyA8IG51bV90YXJnZXRfZW50cmllcykKICAgICB7Ci0g ICAgICBzdHJ1Y3QgYWRkcl9wYWlyICpkZXZpY2VfbnVtX3ZhciA9ICZ0YXJnZXRfdGFibGVb bnVtX2Z1bmNzICsgbnVtX3ZhcnNdOwotICAgICAgLyogU3RhcnQgYWRkcmVzcyB3aWxsIGJl IG5vbi16ZXJvIGZvciBsYXN0IGVudHJ5IGlmIEdPTVBfREVWSUNFX05VTV9WQVIKLQkgd2Fz IGZvdW5kIGluIHRoaXMgaW1hZ2UuICAqLwotICAgICAgaWYgKGRldmljZV9udW1fdmFyLT5z dGFydCAhPSAwKQorICAgICAgLyogVGhlIGluZGV4IG9mIHRoZSBkZXZpY2VwIHdpdGhpbiBk ZXZpY2VzW10gaXMgcmVnYXJkZWQgYXMgaXRzCisJICdkZXZpY2UgbnVtYmVyJywgd2hpY2gg aXMgZGlmZmVyZW50IGZyb20gdGhlIHBlci1kZXZpY2UgdHlwZQorCSBkZXZpY2VwLT50YXJn ZXRfaWQuICAqLworICAgICAgaW50IGRldl9udW0gPSAoaW50KSAoZGV2aWNlcCAtICZkZXZp Y2VzWzBdKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fb3RoZXJzOyArK2kpCiAJewot CSAgLyogVGhlIGluZGV4IG9mIHRoZSBkZXZpY2VwIHdpdGhpbiBkZXZpY2VzW10gaXMgcmVn YXJkZWQgYXMgaXRzCi0JICAgICAnZGV2aWNlIG51bWJlcicsIHdoaWNoIGlzIGRpZmZlcmVu dCBmcm9tIHRoZSBwZXItZGV2aWNlIHR5cGUKLQkgICAgIGRldmljZXAtPnRhcmdldF9pZC4g ICovCi0JICBpbnQgZGV2aWNlX251bV92YWwgPSAoaW50KSAoZGV2aWNlcCAtICZkZXZpY2Vz WzBdKTsKLQkgIGlmIChkZXZpY2VfbnVtX3Zhci0+ZW5kIC0gZGV2aWNlX251bV92YXItPnN0 YXJ0ICE9IHNpemVvZiAoaW50KSkKKwkgIHN0cnVjdCBhZGRyX3BhaXIgKnZhciA9ICZ0YXJn ZXRfdGFibGVbbnVtX2Z1bmNzICsgbnVtX3ZhcnMgKyBpXTsKKwkgIC8qIFN0YXJ0IGFkZHJl c3Mgd2lsbCBiZSBub24temVybyBmb3IgdGhlIGN1cnJlbnQgZW50cnkgaWYKKwkgICAgIHRo ZSB2YXJpYWJsZSB3YXMgZm91bmQgaW4gdGhpcyBpbWFnZS4gICovCisJICBpZiAodmFyLT5z dGFydCAhPSAwKQogCSAgICB7Ci0JICAgICAgZ29tcF9tdXRleF91bmxvY2sgKCZkZXZpY2Vw LT5sb2NrKTsKLQkgICAgICBpZiAoaXNfcmVnaXN0ZXJfbG9jaykKLQkJZ29tcF9tdXRleF91 bmxvY2sgKCZyZWdpc3Rlcl9sb2NrKTsKLQkgICAgICBnb21wX2ZhdGFsICgib2ZmbG9hZCBw bHVnaW4gbWFuYWdlZCAnZGV2aWNlX251bScgbm90IG9mIGV4cGVjdGVkICIKLQkJCSAgImZv cm1hdCIpOwotCSAgICB9Ci0KLQkgIC8qIENvcHkgZGV2aWNlX251bSB2YWx1ZSB0byBwbGFj ZSBvbiBkZXZpY2UgbWVtb3J5LCBoZXJlYnkgYWN0dWFsbHkKLQkgICAgIGRlc2lnbmF0aW5n IGl0cyBkZXZpY2UgbnVtYmVyIGludG8gZWZmZWN0LiAgKi8KLQkgIGdvbXBfY29weV9ob3N0 MmRldiAoZGV2aWNlcCwgTlVMTCwgKHZvaWQgKikgZGV2aWNlX251bV92YXItPnN0YXJ0LAot CQkJICAgICAgJmRldmljZV9udW1fdmFsLCBzaXplb2YgKGludCksIGZhbHNlLCBOVUxMKTsK KwkgICAgICB2b2lkICp2YWwgPSBOVUxMOworCSAgICAgIHN3aXRjaCAoaSkKKwkJeworCQlj YXNlIDA6ICAvLyBHT01QX0RFVklDRV9OVU1fVkFSCisJCSAgdmFsID0gJmRldl9udW07CisJ CSAgYnJlYWs7CisJCWNhc2UgMTogIC8vIEdPTVBfREVGQVVMVF9ERVZJQ0VfVkFSCisJCSAg dmFsID0gJmdvbXBfZ2xvYmFsX2ljdi5kZWZhdWx0X2RldmljZV92YXI7CisJCSAgYnJlYWs7 CisJCWNhc2UgMjogLy8gR09NUF9OVEVBTVNfVkFSCisJCSAgdmFsID0gZ29tcF9nZXRfaWN2 IChkZXZfbnVtLCBHT01QX0lDVl9OVEVBTVMpOworCQkgIGJyZWFrOworCQl9CisJICAgICAg aWYgKHZhbCAhPSBOVUxMKQorCQl7CisJCSAgc2l6ZV90IHZhcl9zaXplID0gdmFyLT5lbmQg LSB2YXItPnN0YXJ0OworCQkgIC8qIENvcHkgZGV2aWNlX251bSB2YWx1ZSB0byBwbGFjZSBv biBkZXZpY2UgbWVtb3J5LCBoZXJlYnkKKwkJICAgICBhY3R1YWxseSBkZXNpZ25hdGluZyBp dHMgZGV2aWNlIG51bWJlciBpbnRvIGVmZmVjdC4gICovCisJCSAgZ29tcF9jb3B5X2hvc3Qy ZGV2IChkZXZpY2VwLCBOVUxMLCAodm9pZCAqKSB2YXItPnN0YXJ0LCB2YWwsCisJCQkJICAg ICAgdmFyX3NpemUsIGZhbHNlLCBOVUxMKTsKKwkJfQorCSAgfQogCX0KICAgICB9CiAKZGlm ZiAtLWdpdCBhL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2ljdi01 LmMgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9pY3YtNS5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMTA4YmNlCi0tLSAvZGV2L251 bGwKKysrIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vaWN2LTUu YwpAQCAtMCwwICsxLDI1IEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLXNldC10 YXJnZXQtZW52LXZhciBPTVBfTlVNX1RFQU1TX0RFVl8wICI0MiIgfSAqLworLyogeyBkZy1z ZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9URUFNU19ERVZfMSAiNDMiIH0gKi8KKy8qIHsg ZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWXzIgIjQ0IiB9ICovCisv KiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTlVNX1RFQU1TX0FMTCAiNDUiIH0gKi8K Ky8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWICI0NiIgfSAq LworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9URUFNUyAiNDciIH0gKi8K KworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQKK21haW4g KGludCBhcmdjLCBjaGFyICpjb25zdCAqYXJndikKK3sKKyAgaWYgKG9tcF9nZXRfbWF4X3Rl YW1zICgpICE9IDQ3KQorICAgIGFib3J0ICgpOworCisgIGludCBudW1fZGV2aWNlcyA9IG9t cF9nZXRfbnVtX2RldmljZXMgKCkgPiAzID8gMyA6IG9tcF9nZXRfbnVtX2RldmljZXMgKCk7 CisgIGZvciAoaW50IGk9MDsgaSA8IG51bV9kZXZpY2VzOyBpKyspCisgICAgI3ByYWdtYSBv bXAgdGFyZ2V0IGRldmljZSAoaSkKKyAgICAgIGlmIChvbXBfZ2V0X21heF90ZWFtcyAoKSAh PSA0MiArIGkpCisJYWJvcnQgKCk7CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9s aWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9pY3YtNi5jIGIvbGliZ29t cC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vaWN2LTYuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWYwN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbGli Z29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vaWN2LTYuYwpAQCAtMCwwICsx LDQ0IEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZh ciBPTVBfTlVNX1RFQU1TX0FMTCAiNDIiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYt dmFyIE9NUF9OVU1fVEVBTVNfREVWICI0MyIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVu di12YXIgT01QX1NDSEVEVUxFX0FMTCAiZ3VpZGVkLDQiIH0gKi8KKy8qIHsgZGctc2V0LXRh cmdldC1lbnYtdmFyIE9NUF9EWU5BTUlDX0FMTCAidHJ1ZSIgfSAqLworLyogeyBkZy1zZXQt dGFyZ2V0LWVudi12YXIgT01QX1RFQU1TX1RIUkVBRF9MSU1JVF9BTEwgIjQ0IiB9ICovCisv KiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfVEhSRUFEX0xJTUlUX0FMTCAiNDUiIH0g Ki8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEhSRUFEU19BTEwgIjQ2 LDMsMiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX01BWF9BQ1RJVkVf TEVWRUxTX0FMTCAiNDciIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9Q Uk9DX0JJTkRfQUxMICJzcHJlYWQiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFy IE9NUF9XQUlUX1BPTElDWV9BTEwgImFjdGl2ZSIgfSAqLworCisvKiBUaGlzIHRlc3RzIHRo ZSBoaWVyYXJjaGljYWwgdXNhZ2Ugb2YgSUNWcyBvbiB0aGUgZGV2aWNlLCBpLmUuIGlmCisg ICBPTVBfTlVNX1RFQU1TX0RFVl88ZGV2aWNlX251bT4gaXMgbm90IGNvbmZpZ3VyZWQsIHRo ZW4gdGhlIHZhbHVlIG9mCisgICBPTVBfTlVNX1RFQU1TX0RFViBzaG91bGQgYmUgdXNlZC4g IEFuZCBpZiAqLworCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisK K2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQoreworICBlbnVtIG9t cF9zY2hlZF90IGtpbmQ7CisgIGludCBjaHVua19zaXplOworICBvbXBfZ2V0X3NjaGVkdWxl KCZraW5kLCAmY2h1bmtfc2l6ZSk7CisKKyAgaWYgKG9tcF9nZXRfbWF4X3RlYW1zICgpICE9 IDQyCisgICAgICB8fCAhb21wX2dldF9keW5hbWljICgpCisgICAgICB8fCBraW5kICE9IDMg fHwgY2h1bmtfc2l6ZSAhPSA0CisgICAgICB8fCBvbXBfZ2V0X3RlYW1zX3RocmVhZF9saW1p dCAoKSAhPSA0NAorICAgICAgfHwgb21wX2dldF90aHJlYWRfbGltaXQgKCkgIT0gNDUKKyAg ICAgIHx8IG9tcF9nZXRfbWF4X3RocmVhZHMgKCkgIT0gNDYKKyAgICAgIHx8IG9tcF9nZXRf cHJvY19iaW5kICgpICE9IG9tcF9wcm9jX2JpbmRfc3ByZWFkCisgICAgICB8fCBvbXBfZ2V0 X21heF9hY3RpdmVfbGV2ZWxzICgpICE9IDQ3KQorICAgIGFib3J0ICgpOworCisgIGludCBu dW1fZGV2aWNlcyA9IG9tcF9nZXRfbnVtX2RldmljZXMgKCkgPiAzID8gMyA6IG9tcF9nZXRf bnVtX2RldmljZXMgKCk7CisgIGZvciAoaW50IGk9MDsgaSA8IG51bV9kZXZpY2VzOyBpKysp CisgICAgI3ByYWdtYSBvbXAgdGFyZ2V0IGRldmljZSAoaSkKKyAgICAgIGlmIChvbXBfZ2V0 X21heF90ZWFtcyAoKSAhPSA0MykKKwlhYm9ydCAoKTsKKworICByZXR1cm4gMDsKK30KZGlm ZiAtLWdpdCBhL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2ljdi03 LmMgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9pY3YtNy5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDgxZGMKLS0tIC9kZXYvbnVs bAorKysgYi9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9pY3YtNy5j CkBAIC0wLDAgKzEsMjYgQEAKKy8qIHsgZGctZG8gcnVuIH0gKi8KKy8qIHsgZGctc2V0LXRh cmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfQUxMICI0MiIgfSAqLworCisvKiBUaGlzIHRl c3RzIHRoZSBoaWVyYXJjaGljYWwgdXNhZ2Ugb2YgSUNWcyBvbiB0aGUgaG9zdCBhbmQgb24g ZGV2aWNlcywgaS5lLiBpZgorICAgT01QX05VTV9URUFNU19ERVZfPGRldmljZV9udW0+LCBP TVBfTlVNX1RFQU1TX0RFViwgYW5kCisgICBPTVBfTlVNX1RFQU1TIGFyZSBub3QgY29uZmln dXJlZCwgdGhlbiB0aGUgdmFsdWUgb2YKKyAgIE9NUF9OVU1fVEVBTVNfQUxMIHNob3VsZCBi ZSB1c2VkIGZvciB0aGUgaG9zdCBhcyB3ZWxsIGFzIGZvciB0aGUKKyAgIGRldmljZXMuICAq LworCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludAorbWFp biAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQoreworICBpZiAob21wX2dldF9tYXhf dGVhbXMgKCkgIT0gNDIpCisgICAgYWJvcnQgKCk7CisKKyAgaW50IG51bV9kZXZpY2VzID0g b21wX2dldF9udW1fZGV2aWNlcyAoKSA+IDMgPyAzIDogb21wX2dldF9udW1fZGV2aWNlcyAo KTsKKyAgZm9yIChpbnQgaT0wOyBpIDwgbnVtX2RldmljZXM7IGkrKykKKyAgICAjcHJhZ21h IG9tcCB0YXJnZXQgZGV2aWNlIChpKQorICAgICAgaWYgKG9tcF9nZXRfbWF4X3RlYW1zICgp ICE9IDQyKQorCWFib3J0ICgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGli Z29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vaWN2LTguYyBiL2xpYmdvbXAv dGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2ljdi04LmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhZmY1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmdv bXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2ljdi04LmMKQEAgLTAsMCArMSwy MiBAQAorLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIg T01QX05VTV9URUFNU19ERVZfMTIzNDU2Nzg5MCAiNDIiIH0gKi8KKy8qIHsgZGctc2V0LXRh cmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWXyAiNDMiIH0gKi8KKy8qIHsgZGctc2V0 LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWXzAxICI0NCIgfSAqLworLyogeyBk Zy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9URUFNU19ERVZfYSAiNDUiIH0gKi8KKy8q IHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWXzEyMzQ1Njc4OTAx ICI0NiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9URUFNU19E RVZfLTEgIjQ3IiB9ICovCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIu aD4KKworaW50CittYWluIChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCit7CisgIHJl dHVybiAwOworfQorCisvKiB7IGRnLW91dHB1dCAiLipJbnZhbGlkIGRldmljZSBudW1iZXIg aW4gT01QX05VTV9URUFNU19ERVZfPTQzLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKklu dmFsaWQgZGV2aWNlIG51bWJlciBpbiBPTVBfTlVNX1RFQU1TX0RFVl8wMT00NCAobGVhZGlu ZyB6ZXJvKS4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipJbnZhbGlkIGRldmljZSBudW1i ZXIgaW4gT01QX05VTV9URUFNU19ERVZfYT00NS4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAi LipJbnZhbGlkIGRldmljZSBudW1iZXIgaW4gT01QX05VTV9URUFNU19ERVZfMTIzNDU2Nzg5 MDE9NDYgKHRvbyBsb25nKS4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipOb24tbmVnYXRp dmUgZGV2aWNlIG51bWJlciBleHBlY3RlZCBpbiBPTVBfTlVNX1RFQU1TX0RFVl8tMT00Ny4q IiB9ICovCmRpZmYgLS1naXQgYS9saWJnb21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNv bW1vbi9vbXAtZGlzcGxheS1lbnYtMS5jIGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5j LWMrKy1jb21tb24vb21wLWRpc3BsYXktZW52LTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi5jNTg2ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliZ29tcC90ZXN0 c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vb21wLWRpc3BsYXktZW52LTEuYwpAQCAtMCww ICsxLDExOSBAQAorLyogeyBkZy1kbyBydW4gfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVu di12YXIgT01QX1RIUkVBRF9MSU1JVF9ERVZfMjQgIjQyIiB9ICovCisvKiB7IGRnLXNldC10 YXJnZXQtZW52LXZhciBPTVBfVEhSRUFEX0xJTUlUX0FMTCAiNDMiIH0gKi8KKy8qIHsgZGct c2V0LXRhcmdldC1lbnYtdmFyIE9NUF9USFJFQURfTElNSVRfREVWICI0NCIgfSAqLworLyog eyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1RIUkVBRF9MSU1JVCAiNDUiIH0gKi8KKy8q IHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9ERUZBVUxUX0RFVklDRSAiNDIiIH0gKi8K Ky8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9TQ0hFRFVMRV9ERVZfMjQgImd1aWRl ZCw0IiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfU0NIRURVTEVfQUxM ICJkeW5hbWljIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfU0NIRURV TEVfREVWICJndWlkZWQsMSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01Q X1NDSEVEVUxFICJndWlkZWQsMiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIg T01QX0RZTkFNSUNfREVWXzI0ICJ0cnVlIiB9ICovCisKKy8qIHsgZGctc2V0LXRhcmdldC1l bnYtdmFyIE9NUF9EWU5BTUlDX0FMTCAidHJ1ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0 LWVudi12YXIgT01QX0RZTkFNSUNfREVWICJ0cnVlIiB9ICovCisvKiB7IGRnLXNldC10YXJn ZXQtZW52LXZhciBPTVBfRFlOQU1JQyAidHJ1ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0 LWVudi12YXIgT01QX05VTV9USFJFQURTICI0LDMsMiIgfSAqLworLyogeyBkZy1zZXQtdGFy Z2V0LWVudi12YXIgT01QX05VTV9USFJFQURTX0FMTCAiNDUsNDYsNDciIH0gKi8KKy8qIHsg ZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEhSRUFEU19ERVYgIjQyLDQzLDQ0IiB9 ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTlVNX1RIUkVBRFNfREVWXzI0 ICIxNCwxMywxMiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX01BWF9B Q1RJVkVfTEVWRUxTICI0MiIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01Q X01BWF9BQ1RJVkVfTEVWRUxTX0FMTCAiNDMiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1l bnYtdmFyIE9NUF9NQVhfQUNUSVZFX0xFVkVMU19ERVYgIjQ0IiB9ICovCisKKy8qIHsgZGct c2V0LXRhcmdldC1lbnYtdmFyIE9NUF9NQVhfQUNUSVZFX0xFVkVMU19ERVZfMjQgIjQ1IiB9 ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTlVNX1RFQU1TICI0MiIgfSAq LworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX05VTV9URUFNU19BTEwgIjQzIiB9 ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTlVNX1RFQU1TX0RFViAiNDQi IH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9OVU1fVEVBTVNfREVWXzI0 ICI0NSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1BST0NfQklORCAi c3ByZWFkIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfUFJPQ19CSU5E X0FMTCAiY2xvc2UiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9QUk9D X0JJTkRfREVWICJzcHJlYWQsc3ByZWFkIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52 LXZhciBPTVBfUFJPQ19CSU5EX0RFVl8yNCAic3ByZWFkLGNsb3NlIiB9ICovCisvKiB7IGRn LXNldC10YXJnZXQtZW52LXZhciBPTVBfU1RBQ0tTSVpFICI0MiIgfSAqLworCisvKiB7IGRn LXNldC10YXJnZXQtZW52LXZhciBPTVBfU1RBQ0tTSVpFX0FMTCAiNDIgTSIgfSAqLworLyog eyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1NUQUNLU0laRV9ERVYgIjQzIGsiIH0gKi8K Ky8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9TVEFDS1NJWkVfREVWXzI0ICI0NCIg fSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1dBSVRfUE9MSUNZICJhY3Rp dmUiIH0gKi8KKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9XQUlUX1BPTElDWV9B TEwgIkFDVElWRSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1dBSVRf UE9MSUNZX0RFViAicGFzc2l2ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIg T01QX1dBSVRfUE9MSUNZX0RFVl8yNCAiUEFTU0lWRSIgfSAqLworLyogeyBkZy1zZXQtdGFy Z2V0LWVudi12YXIgT01QX1RFQU1TX1RIUkVBRF9MSU1JVCAiNDIiIH0gKi8KKy8qIHsgZGct c2V0LXRhcmdldC1lbnYtdmFyIE9NUF9URUFNU19USFJFQURfTElNSVRfQUxMICI0MyIgfSAq LworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12YXIgT01QX1RFQU1TX1RIUkVBRF9MSU1JVF9E RVYgIjQ0IiB9ICovCisKKy8qIHsgZGctc2V0LXRhcmdldC1lbnYtdmFyIE9NUF9URUFNU19U SFJFQURfTElNSVRfREVWXzI0ICI0NSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVudi12 YXIgT01QX0NBTkNFTExBVElPTiAidHJ1ZSIgfSAqLworLyogeyBkZy1zZXQtdGFyZ2V0LWVu di12YXIgT01QX0RJU1BMQVlfQUZGSU5JVFkgInRydWUiIH0gKi8KKy8qIHsgZGctc2V0LXRh cmdldC1lbnYtdmFyIE9NUF9UQVJHRVRfT0ZGTE9BRCAibWFuZGF0b3J5IiB9ICovCisvKiB7 IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTUFYX1RBU0tfUFJJT1JJVFkgIjIwIiB9ICov CisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfQUxMT0NBVE9SICJvbXBfY29uc3Rf bWVtX2FsbG9jIiB9ICovCisvKiB7IGRnLXNldC10YXJnZXQtZW52LXZhciBPTVBfTkVTVEVE ICJmYWxzZSIgfSAqLworCisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQoreworICBvbXBf ZGlzcGxheV9lbnYgKDEpOworICByZXR1cm4gMDsKK30KKworLyogeyBkZy1vdXRwdXQgIi4q XFxcW2hvc3RdIE9NUF9EWU5BTUlDID0gJ1RSVUUnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0 ICIuKlxcXFthbGxdIE9NUF9EWU5BTUlDID0gJ1RSVUUnLioiIH0gKi8KKy8qIHsgZGctb3V0 cHV0ICIuKlxcXFtkZXZpY2VdIE9NUF9EWU5BTUlDID0gJ1RSVUUnLioiIH0gKi8KKy8qIHsg ZGctb3V0cHV0ICIuKlxcXFsyNFxdIE9NUF9EWU5BTUlDID0gJ1RSVUUnLioiIH0gKi8KKwor LyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9OVU1fVEhSRUFEUyA9ICc0LDMsMicu KiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2FsbFxdIE9NUF9OVU1fVEhSRUFEUyA9 ICc0NSw0Niw0NycuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2RldmljZVxdIE9N UF9OVU1fVEhSRUFEUyA9ICc0Miw0Myw0NCcuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4q XFxcWzI0XF0gT01QX05VTV9USFJFQURTID0gJzE0LDEzLDEyJy4qIiB9ICovCisKKy8qIHsg ZGctb3V0cHV0ICIuKlxcXFtob3N0XSBPTVBfU0NIRURVTEUgPSAnR1VJREVELDInLioiIH0g Ki8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFthbGxcXSBPTVBfU0NIRURVTEUgPSAnRFlOQU1J QycuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2RldmljZVxdIE9NUF9TQ0hFRFVM RSA9ICdHVUlERUQnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFsyNFxdIE9NUF9T Q0hFRFVMRSA9ICdHVUlERUQsNCcuKiIgfSAqLworCisvKiB7IGRnLW91dHB1dCAiLipcXFxb aG9zdF0gT01QX1BST0NfQklORCA9ICdTUFJFQUQnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0 ICIuKlxcXFthbGxcXSBPTVBfUFJPQ19CSU5EID0gJ0NMT1NFJy4qIiB9ICovCisvKiB7IGRn LW91dHB1dCAiLipcXFxbZGV2aWNlXF0gT01QX1BST0NfQklORCA9ICdTUFJFQUQsU1BSRUFE Jy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbMjRcXSBPTVBfUFJPQ19CSU5EID0g J1NQUkVBRCxDTE9TRScuKiIgfSAqLworCisvKiB7IGRnLW91dHB1dCAiLipcXFxbaG9zdF0g T01QX1NUQUNLU0laRSA9ICc0MzAwOCcuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxc W2FsbFxdIE9NUF9TVEFDS1NJWkUgPSAnNDQwNDAxOTInLioiIH0gKi8KKy8qIHsgZGctb3V0 cHV0ICIuKlxcXFtkZXZpY2VcXSBPTVBfU1RBQ0tTSVpFID0gJzQ0MDMyJy4qIiB9ICovCisv KiB7IGRnLW91dHB1dCAiLipcXFxbMjRcXSBPTVBfU1RBQ0tTSVpFID0gJzQ1MDU2Jy4qIiB9 ICovCisKKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtob3N0XSBPTVBfV0FJVF9QT0xJQ1kgPSAn QUNUSVZFJy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbYWxsXF0gT01QX1dBSVRf UE9MSUNZID0gJ0FDVElWRScuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2Rldmlj ZVxdIE9NUF9XQUlUX1BPTElDWSA9ICdQQVNTSVZFJy4qIiB9ICovCisvKiB7IGRnLW91dHB1 dCAiLipcXFxbMjRcXSBPTVBfV0FJVF9QT0xJQ1kgPSAnUEFTU0lWRScuKiIgfSAqLworCisv KiB7IGRnLW91dHB1dCAiLipcXFxbaG9zdF0gT01QX1RIUkVBRF9MSU1JVCA9ICc0NScuKiIg fSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2FsbFxdIE9NUF9USFJFQURfTElNSVQgPSAn NDMnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtkZXZpY2VcXSBPTVBfVEhSRUFE X0xJTUlUID0gJzQ0Jy4qIiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbMjRcXSBPTVBf VEhSRUFEX0xJTUlUID0gJzQyJy4qIiB9ICovCisKKy8qIHsgZGctb3V0cHV0ICIuKlxcXFto b3N0XSBPTVBfTUFYX0FDVElWRV9MRVZFTFMgPSAnNDInLioiIH0gKi8KKy8qIHsgZGctb3V0 cHV0ICIuKlxcXFthbGxcXSBPTVBfTUFYX0FDVElWRV9MRVZFTFMgPSAnNDMnLioiIH0gKi8K Ky8qIHsgZGctb3V0cHV0ICIuKlxcXFtkZXZpY2VcXSBPTVBfTUFYX0FDVElWRV9MRVZFTFMg PSAnNDQnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFsyNFxdIE9NUF9NQVhfQUNU SVZFX0xFVkVMUyA9ICc0NScuKiIgfSAqLworCisvKiB7IGRnLW91dHB1dCAiLipcXFxbaG9z dF0gT01QX05VTV9URUFNUyA9ICc0MicuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxc W2FsbFxdIE9NUF9OVU1fVEVBTVMgPSAnNDMnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIu KlxcXFtkZXZpY2VcXSBPTVBfTlVNX1RFQU1TID0gJzQ0Jy4qIiB9ICovCisvKiB7IGRnLW91 dHB1dCAiLipcXFxbMjRcXSBPTVBfTlVNX1RFQU1TID0gJzQ1Jy4qIiB9ICovCisKKy8qIHsg ZGctb3V0cHV0ICIuKlxcXFtob3N0XSBPTVBfVEVBTVNfVEhSRUFEX0xJTUlUID0gJzQyJy4q IiB9ICovCisvKiB7IGRnLW91dHB1dCAiLipcXFxbYWxsXF0gT01QX1RFQU1TX1RIUkVBRF9M SU1JVCA9ICc0MycuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2RldmljZVxdIE9N UF9URUFNU19USFJFQURfTElNSVQgPSAnNDQnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0ICIu KlxcXFsyNFxdIE9NUF9URUFNU19USFJFQURfTElNSVQgPSAnNDUnLioiIH0gKi8KKworLyog eyBkZy1vdXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9DQU5DRUxMQVRJT04gPSAnVFJVRScuKiIg fSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9ERUZBVUxUX0RFVklDRSA9 ICc0MicuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9NQVhfVEFT S19QUklPUklUWSA9ICcyMCcuKiIgfSAqLworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3Rd IE9NUF9ESVNQTEFZX0FGRklOSVRZID0gJ1RSVUUnLioiIH0gKi8KKy8qIHsgZGctb3V0cHV0 ICIuKlxcXFtob3N0XSBPTVBfQUxMT0NBVE9SID0gJ29tcF9jb25zdF9tZW1fYWxsb2MnLioi IH0gKi8KKy8qIHsgZGctb3V0cHV0ICIuKlxcXFtob3N0XSBPTVBfVEFSR0VUX09GRkxPQUQg PSAnTUFOREFUT1JZJy4qIiB9ICovCmRpZmYgLS1naXQgYS9saWJnb21wL3Rlc3RzdWl0ZS9s aWJnb21wLmMtYysrLWNvbW1vbi9vbXAtZGlzcGxheS1lbnYtMi5jIGIvbGliZ29tcC90ZXN0 c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vb21wLWRpc3BsYXktZW52LTIuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjBkYTRhCi0tLSAvZGV2L251bGwKKysr IGIvbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5jLWMrKy1jb21tb24vb21wLWRpc3BsYXkt ZW52LTIuYwpAQCAtMCwwICsxLDIyIEBACisvKiB7IGRnLWRvIHJ1biB9ICovCisvKiB7IGRn LXNldC10YXJnZXQtZW52LXZhciBPTVBfTlVNX1RFQU1TICI0MiIgfSAqLworCisvKiBUaGlz IHRlc3QgY2hlY2tzIGlmIG9tcF9kaXNwbGF5X2VudiBvdXRwdXRzIHRoZSBpbml0aWFsIElD ViB2YWx1ZXMgYWx0aG91Z2gKKyAgIHRoZSB2YWx1ZSB3YXMgdXBkYXRlZC4gICovCisKKyNp bmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworaW50CittYWluIChpbnQg YXJnYywgY2hhciAqY29uc3QgKmFyZ3YpCit7CisgIG9tcF9kaXNwbGF5X2VudiAoMSk7Cisg IG9tcF9zZXRfbnVtX3RlYW1zICgyNCk7CisgIGlmIChvbXBfZ2V0X21heF90ZWFtcyAoKSAh PSAyNCkKKyAgICBhYm9ydCAoKTsKKyAgb21wX2Rpc3BsYXlfZW52ICgxKTsKKworICByZXR1 cm4gMDsKK30KKworLyogeyBkZy1vdXRwdXQgIi4qXFxcW2hvc3RdIE9NUF9OVU1fVEVBTVMg PSAnNDInLipcXFxbaG9zdF0gT01QX05VTV9URUFNUyA9ICc0MiciIH0gKi8K --------------tFYH3nYSywKhLx1r8gZKYMmy--