From mboxrd@z Thu Jan 1 00:00:00 1970 From: Douglas Gilbert Subject: Re: =?utf-8?b?562U5aSNOiAgd2h5IGNvbW1hbmQgb2YgbXVsdGlwYXRo?= =?utf-8?q?_send_reinstate_message_to_all_dm=27s_paths?= Date: Fri, 29 Jun 2018 16:28:52 +0200 Message-ID: References: <86cd2783019e5a6fa8c97a13716273146fd9e434.camel@suse.com> Reply-To: dgilbert@interlog.com Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------0EFA82BEA718DE1AA1245638" Return-path: In-Reply-To: <86cd2783019e5a6fa8c97a13716273146fd9e434.camel@suse.com> Content-Language: en-CA List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com To: Martin Wilck , Jiaojianbing , "christophe.varoqui@opensvc.com" , Hannes Reinecke , Benjamin Marzinski Cc: "dm-devel@redhat.com" , "Yangjie (S)" , "Zhangyanfei (UVP)" List-Id: dm-devel.ids This is a multi-part message in MIME format. --------------0EFA82BEA718DE1AA1245638 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 2018-06-28 09:38 AM, Martin Wilck wrote: > [I've added Hannes, Ben and Douglas to the recepient list to fill in > knowledge from the past that I may lack]. > > tl;dr summary: We've got 3 issues: > > 1) Why does multipath, in reinstate_paths(), try to reinstate paths > which are known to be down? > 2) rescan-scsi-bus.sh can call "multipath" even if "-m" switch is not > used (that looks like a bug to me). > 3) In Jiaojianbing's environment, dead paths that have been removed on > the target and were already marked "offline" may appear as "running" > after rescan-scsi-bus.sh invocation. > > Furthermore, > 4) perhaps rescan-scsi-bus.sh should replace suboptimal "multipath" > calls with multipathd cli commands (or better even, we multipath-tools > people should eventually finish the "delegate to multipathd" work). > > > On Thu, 2018-06-28 at 06:35 +0000, Jiaojianbing wrote: >>>> Dear Christophe, >>>> when dm-105 is in one state of below, paths of dm-105 will change >>>> to >>>> active if we run command of multipath. >>> >>> Could you be more specific please? What multipath command did you >>> run? >>> Which version of multipath-tools are you running? >> >> command is "multipath", which can run in shell as below: >> #multipath > > ... and if I understand correctly, originally the problem occured while > running rescan_scsi_bus.sh. Please also state the version of sg3_utils > you are using. > >> >> And the version: multipath-tools v0.4.9 (05/33, 2016) > > Well, that's ancient. But latest multipath-tools still has the same > code. > >> >>>> I check code of multipath, it sends messge "reinstate_path >>>> pathname" >>>> to kernel in routine reinstate_paths when status of pathgroup = >>>> "PGSTATE_ENABLED/PGSTATE_UNDEF" and path's state = >>>> "PSTATE_FAILED". >>>> why command of multipath do above action to all dm devices? >>>> actually, >>>> parts of these paths are already offline or failed which can't be >>>> recovered. Maybe we can check these devices's status by sending >>>> io to >>>> these sd device at first. according to return of io, multipath >>>> send >>>> reinstate to running devices and do nothing to failed devices? >>> >>> I see this code in reinstate_paths(): >>> >>> vector_foreach_slot (pgp->paths, pp, j) { >>> if (pp->state != PATH_UP && >>> (pgp->status == PGSTATE_DISABLED || >>> pgp->status == PGSTATE_ACTIVE)) >>> continue; >>> >>> if (pp->dmstate == PSTATE_FAILED) { >>> if (dm_reinstate_path(mpp->alias, pp- >>>> dev_t)) >>> condlog(0, "%s: error >>> reinstating", >>> pp->dev); >>> } >>> } >>> >>> The reinstate command is only sent for paths which are either in >>> PATH_UP >>> state, or belong to an PGSTATE_ENABLED path group. I admit I'm >>> unsure why >>> all we try to reinstate paths that we know are down. This is 13- >>> year-old code. >>> >>> Interstingly, the state of your paths changes from "faulty offline" >>> to "ready >>> running". So it appears that these paths are actually _not_ >>> down Just the >>> reinstate seems has failed on them. >>> >>> multipathd -v3 logs and possibly kernel logs would be helpful to >>> understand >>> what was going on in that situation. >> >> Sorry, maybe my two multipath status sample confused you. They >> are just sample. Actually, I run command "rescan-scsi-bus" to >> clear all mapped scsi devices by iscsid in host when all of LUNS in >> remote IPSAN are removed. >> In process of running rescan-scsi-bus, if command "multipath" is >> running, the status of dm's path will change from >> failed to active in some moment as below. If IO is sent to dm-105, >> the process who sends io will be in D state. >> # multipath -ll >> 36d0d04b100b8cba665a187f0000000f9 dm-105 HUAWEI ,XSG1 >> size=1.0G features='1 queue_if_no_path' hwhandler='0' wp=rw >> `-+- policy='service-time 0' prio=1 status=active >> `- 18:0:0:101 sdku 67:288 active faulty running > > The strange part here is that the device is considered "running". This > is the state of the kernel device. If the LUNs are actually _removed_ > as you say, the device should be gone, or at least marked "offline". > > Apparently the SCSI bus SCAN via iSCSI still showed the LUN in a > workable state. For multipath this translates to PATH_UP. Thus even if > the above code didn't have the (pgp->status == PGSTATE_DISABLED || pgp- >> status == PGSTATE_ACTIVE) clause, the reinstate would have been > attempted by multipath. This looks like a low-level problem in your > SCSI or iSCSI layer to me. > > This looks like the actual problem to me. multipath aside, if the path > appears to be "running", any Linux process could try to send IO down to > it and be stuck, as you say. > >> >> I want to know whether command "multipath" is reasonable in >> reinstate_paths(). > > >>> And maybe we should not call "multipath" in process of running >> rescan-scsi-bus ? > > Normally rescan-scsi-bus.sh should call "multipath" only if the > "-m|--multipath" switch was used. I quickly scanned through the code > and didn't find a call to "multipath" (with no options) which wasn't > guarded by the [ -n "$mp_enable" ] condition. (FTR: there is a call to > "multipath -f" from main->flushmpaths if "-f|--flush" is set). > > Again, please double-check your version of sg3_utils, and perhaps run > "bash -x rescan-scsi-bus.sh" to figure out the call chain which runs > the "multipath" command. > > Thanks, > Martin > Hi, My upstream version of rescan-scsi-bus.sh is attached. The last change was the --ignore-rev option from Gris Ge . He has sent several cleanups in the last year, usually via Hannes' github site for sg3_utils. My ChangeLog entry to that script (since sg3_utils 1.42) is: - rescan-scsi-bus.sh: harden code - fixes from Suse; bump version - bump version to 20180615 - add to install list in Makefile, hope it does not clash with other package providing it - add --ignore-rev to ignore revision change If there are no further changes it will be like that in sg3_utils-1.43 revision 780. Doug Gilbert --------------0EFA82BEA718DE1AA1245638 Content-Type: application/x-shellscript; name="rescan-scsi-bus.sh" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="rescan-scsi-bus.sh" IyEvYmluL2Jhc2gKIyBTY3JpcHQgdG8gcmVzY2FuIFNDU0kgYnVzLCB1c2luZyB0aGUgc2Nz aSBhZGQtc2luZ2xlLWRldmljZSBtZWNoYW5pc20uCiMgKGMpIDE5OTgtLTIwMTAgS3VydCBH YXJsb2ZmIDxrdXJ0QGdhcmxvZmYuZGU+LCBHTlUgR1BMIHYyIG9yIHYzCiMgKGMpIDIwMDYt LTIwMTggSGFubmVzIFJlaW5lY2tlLCBHTlUgR1BMIHYyIG9yIGxhdGVyCiMgJElkOiByZXNj YW4tc2NzaS1idXMuc2gsdiAxLjU3IDIwMTIvMDMvMzEgMTQ6MDg6NDggZ2FybG9mZiBFeHAg JAoKVkVSU0lPTj0iMjAxODA2MTUiClNDQU5fV0lMRF9DQVJEPTQyOTQ5NjcyOTUKCnNldGNv bG9yICgpCnsKICByZWQ9IlxlWzA7MzFtIgogIGdyZWVuPSJcZVswOzMybSIKICB5ZWxsb3c9 IlxlWzA7MzNtIgogIGJvbGQ9IlxlWzA7MW0iCiAgbm9ybT0iXGVbMDswbSIKfQoKdW5zZXRj b2xvciAoKSAKewogIHJlZD0iIjsgZ3JlZW49IiIKICB5ZWxsb3c9IiI7IG5vcm09IiIKfQoK ZWNob19kZWJ1ZygpCnsKICBpZiBbICRkZWJ1ZyAtZXEgMSBdIDsgdGhlbgogICAgIGVjaG8g IiQxIgogIGZpCn0KCiMgT3V0cHV0IHNvbWUgdGV4dCBhbmQgcmV0dXJuIGN1cnNvciB0byBw cmV2aW91cyBwb3NpdGlvbgojIChvbmx5IHdvcmtzIGZvciBzaW1wbGUgc3RyaW5ncykKIyBT dG9yZXMgbGVuZ3RoIG9mIHN0cmluZyBpbiBMTiBhbmQgcmV0dXJucyBpdApwcmludF9hbmRf c2Nyb2xsX2JhY2sgKCkKewogIFNUUkc9IiQxIgogIExOPSR7I1NUUkd9CiAgQks9IiIKICBk ZWNsYXJlIC1pIGNudHI9MAogIHdoaWxlIHRlc3QgJGNudHIgLWx0ICRMTjsgZG8gQks9IiRC S1xlW0QiOyBsZXQgY250cis9MTsgZG9uZQogIGVjaG8gLWVuICIkU1RSRyRCSyIKICByZXR1 cm4gJExOCn0KCiMgT3ZlcndyaXRlIGEgdGV4dCBvZiBsZW5ndGggJExOIHdpdGggd2hpdGVz cGFjZQp3aGl0ZV9vdXQgKCkKewogIEJLPSIiOyBXSD0iIgogIGRlY2xhcmUgLWkgY250cj0w CiAgd2hpbGUgdGVzdCAkY250ciAtbHQgJExOOyBkbyBCSz0iJEJLXGVbRCI7IFdIPSIkV0gg IjsgbGV0IGNudHIrPTE7IGRvbmUKICBlY2hvIC1lbiAiJFdIJEJLIgp9CgojIFJldHVybiBo b3N0cy4gc3lzZnMgbXVzdCBiZSBtb3VudGVkCmZpbmRob3N0c18yNiAoKQp7CiAgaG9zdHM9 YGZpbmQgL3N5cy9jbGFzcy9zY3NpX2hvc3QvaG9zdCogLW1heGRlcHRoIDQgLXR5cGUgZCAt byAtdHlwZSBsIDI+IC9kZXYvbnVsbCB8IGF3ayAtRicvJyAne3ByaW50ICQ1fScgfCBzZWQg LWUgJ3N+aG9zdH5+JyB8IHNvcnQgLW51YCAKICBzY3NpX2hvc3RfZGF0YT1gZWNobyAiJGhv c3RzIiB8IHNlZCAtZSAnc35efi9zeXMvY2xhc3Mvc2NzaV9ob3N0L2hvc3R+J2AgCiAgZm9y IGhvc3RkaXIgaW4gJHNjc2lfaG9zdF9kYXRhOyBkbyAKICAgIGhvc3Rubz0ke2hvc3RkaXIj L3N5cy9jbGFzcy9zY3NpX2hvc3QvaG9zdH0KICAgIGlmIFsgLWYgJGhvc3RkaXIvaXNwX25h bWUgXSA7IHRoZW4KICAgICAgaG9zdG5hbWU9InFsYTJ4eHgiCiAgICBlbGlmIFsgLWYgJGhv c3RkaXIvbHBmY19kcnZyX3ZlcnNpb24gXSA7IHRoZW4KICAgICAgaG9zdG5hbWU9ImxwZmMi CiAgICBlbHNlCiAgICAgIGhvc3RuYW1lPWBjYXQgJGhvc3RkaXIvcHJvY19uYW1lYAogICAg ZmkKICAgICNob3N0cz0iJGhvc3RzICRob3N0bm8iCiAgICBlY2hvX2RlYnVnICJIb3N0IGFk YXB0ZXIgJGhvc3RubyAoJGhvc3RuYW1lKSBmb3VuZC4iCiAgZG9uZSAgCiAgaWYgWyAteiAi JGhvc3RzIiBdIDsgdGhlbgogICAgZWNobyAiTm8gU0NTSSBob3N0IGFkYXB0ZXJzIGZvdW5k IGluIHN5c2ZzIgogICAgZXhpdCAxOwogIGZpCiAgIyBOb3QgbmVjZXNzYXJ5IGp1c3QgdXNl IGRvdWJsZSBxdW90ZXMgYXJvdW5kIHZhcmlhYmxlIHRvIHByZXNlcnZlIG5ldyBsaW5lcwog ICNob3N0cz1gZWNobyAkaG9zdHMgfCB0ciAnICcgJ1xuJ2AKfQoKIyBSZXR1cm4gaG9zdHMu IC9wcm9jL3Njc2kvSE9TVEFEQVBURVIvPyBtdXN0IGV4aXN0CmZpbmRob3N0cyAoKQp7CiAg aG9zdHM9CiAgZm9yIGRyaXZlcmRpciBpbiAvcHJvYy9zY3NpLyo7IGRvCiAgICBkcml2ZXI9 JHtkcml2ZXJkaXIjL3Byb2Mvc2NzaS99CiAgICBpZiB0ZXN0ICRkcml2ZXIgPSBzY3NpIC1v ICRkcml2ZXIgPSBzZyAtbyAkZHJpdmVyID0gZHVtbXkgLW8gJGRyaXZlciA9IGRldmljZV9p bmZvOyB0aGVuIGNvbnRpbnVlOyBmaQogICAgZm9yIGhvc3RkaXIgaW4gJGRyaXZlcmRpci8q OyBkbwogICAgICBuYW1lPSR7aG9zdGRpciMvcHJvYy9zY3NpLyovfQogICAgICBpZiB0ZXN0 ICRuYW1lID0gYWRkX21hcCAtbyAkbmFtZSA9IG1hcCAtbyAkbmFtZSA9IG1vZF9wYXJtOyB0 aGVuIGNvbnRpbnVlOyBmaQogICAgICBudW09JG5hbWUKICAgICAgZHJpdmVyaW5mbz0kZHJp dmVyCiAgICAgIGlmIHRlc3QgLXIgIiRob3N0ZGlyL3N0YXR1cyI7IHRoZW4KICAgICAgICBu dW09JChwcmludGYgJyVkXG4nICIkKHNlZCAtbiAncy9TQ1NJIGhvc3QgbnVtYmVyOi8vcCcg IiRob3N0ZGlyL3N0YXR1cyIpIikKICAgICAgICBkcml2ZXJpbmZvPSIkZHJpdmVyOiRuYW1l IgogICAgICBmaQogICAgICBob3N0cz0iJGhvc3RzICRudW0iCiAgICAgIGVjaG8gIkhvc3Qg YWRhcHRlciAkbnVtICgkZHJpdmVyaW5mbykgZm91bmQuIgogICAgZG9uZQogIGRvbmUKfQoK cHJpbnR0eXBlICgpCnsKICBsb2NhbCB0eXBlPSQxCgogIGNhc2UgIiR0eXBlIiBpbgogICAg MCkgZWNobyAiRGlyZWN0LUFjY2VzcyIgOzsKICAgIDEpIGVjaG8gIlNlcXVlbnRpYWwtQWNj ZXNzIiA7OwogICAgMikgZWNobyAiUHJpbnRlciIgOzsKICAgIDMpIGVjaG8gIlByb2Nlc3Nv ciIgOzsKICAgIDQpIGVjaG8gIldPUk0iIDs7CiAgICA1KSBlY2hvICJDRC1ST00iIDs7CiAg ICA2KSBlY2hvICJTY2FubmVyIiA7OwogICAgNykgZWNobyAiT3B0aWNhbC1EZXZpY2UiIDs7 CiAgICA4KSBlY2hvICJNZWRpdW0tQ2hhbmdlciIgOzsKICAgIDkpIGVjaG8gIkNvbW11bmlj YXRpb25zIiA7OwogICAgMTApIGVjaG8gIlVua25vd24iIDs7CiAgICAxMSkgZWNobyAiVW5r bm93biIgOzsKICAgIDEyKSBlY2hvICJSQUlEIiA7OwogICAgMTMpIGVjaG8gIkVuY2xvc3Vy ZSIgOzsKICAgIDE0KSBlY2hvICJEaXJlY3QtQWNjZXNzLVJCQyIgOzsKICAgICopIGVjaG8g IlVua25vd24iIDs7CiAgZXNhYwp9CgpwcmludDAyaSgpCnsKICAgIGlmIFsgIiQxIiA9ICIq IiBdIDsgdGhlbiAKICAgICAgICBlY2hvICIwMCIKICAgIGVsc2UKICAgICAgICBwcmludGYg IiUwMmkiICIkMSIKICAgIGZpCn0KCiMgR2V0IC9wcm9jL3Njc2kvc2NzaSBpbmZvIGZvciBk ZXZpY2UgJGhvc3Q6JGNoYW5uZWw6JGlkOiRsdW4KIyBPcHRpb25hbCBwYXJhbWV0ZXI6IE51 bWJlciBvZiBsaW5lcyBhZnRlciBmaXJzdCAoZGVmYXVsdCA9IDIpLCAKIyByZXN1bHQgaW4g U0NTSVNUUiwgcmV0dXJuIGNvZGUgMSBtZWFucyBlbXB0eS4KcHJvY3Njc2lzY3NpICgpCnsg IAogIGlmIHRlc3QgLXogIiQxIjsgdGhlbiBMTj0yOyBlbHNlIExOPSQxOyBmaQogIENIQU5O RUw9YHByaW50MDJpICIkY2hhbm5lbCJgCiAgSUQ9YHByaW50MDJpICIkaWQiYAogIExVTj1g cHJpbnQwMmkgIiRsdW4iYAogIGlmIFsgLWQgL3N5cy9jbGFzcy9zY3NpX2RldmljZSBdOyB0 aGVuCiAgICBTQ1NJUEFUSD0iL3N5cy9jbGFzcy9zY3NpX2RldmljZS8ke2hvc3R9OiR7Y2hh bm5lbH06JHtpZH06JHtsdW59IgogICAgaWYgWyAtZCAgIiRTQ1NJUEFUSCIgXSA7IHRoZW4K ICAgICAgU0NTSVNUUj0iSG9zdDogc2NzaSR7aG9zdH0gQ2hhbm5lbDogJENIQU5ORUwgSWQ6 ICRJRCBMdW46ICRMVU4iCiAgICAgIGlmIFsgIiRMTiIgLWd0IDAgXSA7IHRoZW4KICAgICAg ICBJVkVORD0kKGNhdCAke1NDU0lQQVRIfS9kZXZpY2UvdmVuZG9yKQogICAgICAgIElQUk9E PSQoY2F0ICR7U0NTSVBBVEh9L2RldmljZS9tb2RlbCkKICAgICAgICBJUFJFVj0kKGNhdCAk e1NDU0lQQVRIfS9kZXZpY2UvcmV2KQogICAgICAgIFNDU0lERVY9JChwcmludGYgJyAgVmVu ZG9yOiAlLTA4cyBNb2RlbDogJS0xNnMgUmV2OiAlLTRzJyAiJElWRU5EIiAiJElQUk9EIiAi JElQUkVWIikKICAgICAgICBTQ1NJU1RSPSIkU0NTSVNUUgokU0NTSURFViIKICAgICAgZmkK ICAgICAgaWYgWyAiJExOIiAtZ3QgMSBdIDsgdGhlbgogICAgICAgIElMVkw9JChjYXQgJHtT Q1NJUEFUSH0vZGV2aWNlL3Njc2lfbGV2ZWwpCiAgICAgICAgdHlwZT0kKGNhdCAke1NDU0lQ QVRIfS9kZXZpY2UvdHlwZSkKICAgICAgICBJVFlQRT0kKHByaW50dHlwZSAkdHlwZSkKICAg ICAgICBTQ1NJVE1QPSQocHJpbnRmICcgIFR5cGU6ICAgJS0xN3MgICAgICAgICAgICAgICAg QU5TSSBTQ1NJIHJldmlzaW9uOiAlMDJkJyAiJElUWVBFIiAiJCgoSUxWTCAtIDEpKSIpCiAg ICAgICAgU0NTSVNUUj0iJFNDU0lTVFIKJFNDU0lUTVAiCiAgICAgIGZpCiAgICBlbHNlCiAg ICAgIHJldHVybiAxCiAgICBmaQogIGVsc2UKICAgIGdyZXBzdHI9InNjc2kkaG9zdCBDaGFu bmVsOiAkQ0hBTk5FTCBJZDogJElEIEx1bjogJExVTiIKICAgIFNDU0lTVFI9JChncmVwIC1B ICIkTE4iIC1lICIkZ3JlcHN0ciIgL3Byb2Mvc2NzaS9zY3NpKQogIGZpCiAgaWYgdGVzdCAt eiAiJFNDU0lTVFIiOyB0aGVuIHJldHVybiAxOyBlbHNlIHJldHVybiAwOyBmaQp9CgojIEZp bmQgc2cgZGV2aWNlIHdpdGggMi42IHN5c2ZzIHN1cHBvcnQKc2dkZXZpY2UyNiAoKQp7CiAg bG9jYWwgZ2VuZGV2CgogIGdlbmRldj0vc3lzL2NsYXNzL3Njc2lfZGV2aWNlLyR7aG9zdH06 JHtjaGFubmVsfToke2lkfToke2x1bn0vZGV2aWNlL2dlbmVyaWMKICBpZiB0ZXN0IC1lICIk Z2VuZGV2IjsgdGhlbgogICAgU0dERVY9JChiYXNlbmFtZSAiJChyZWFkbGluayAiJGdlbmRl diIpIikKICBlbHNlCiAgICBmb3IgU0dERVYgaW4gL3N5cy9jbGFzcy9zY3NpX2dlbmVyaWMv c2cqOyBkbwogICAgICBERVY9YHJlYWRsaW5rICRTR0RFVi9kZXZpY2VgCiAgICAgIGlmIHRl c3QgIiR7REVWIyMqL30iID0gIiRob3N0OiRjaGFubmVsOiRpZDokbHVuIjsgdGhlbgogICAg ICAgIFNHREVWPWBiYXNlbmFtZSAkU0dERVZgOyByZXR1cm4KICAgICAgZmkKICAgIGRvbmUK ICAgIFNHREVWPSIiCiAgZmkgIAp9CgojIEZpbmQgc2cgZGV2aWNlIHdpdGggMi40IHJlcG9y dC1kZXZzIGV4dGVuc2lvbnMKc2dkZXZpY2UyNCAoKQp7CiAgaWYgcHJvY3Njc2lzY3NpIDM7 IHRoZW4KICAgIFNHREVWPWBlY2hvICIkU0NTSVNUUiIgfCBncmVwICdBdHRhY2hlZCBkcml2 ZXJzOicgfCBzZWQgJ3MvXiAqQXR0YWNoZWQgZHJpdmVyczogXChzZ1swLTldKlwpLiovXDEv J2AKICBmaQp9CgojIEZpbmQgc2cgZGV2aWNlIHRoYXQgYmVsb25ncyB0byBTQ1NJIGRldmlj ZSAkaG9zdCAkY2hhbm5lbCAkaWQgJGx1bgojIGFuZCByZXR1cm4gaW4gU0dERVYKc2dkZXZp Y2UgKCkKewogIFNHREVWPQogIGlmIHRlc3QgLWQgL3N5cy9jbGFzcy9zY3NpX2RldmljZTsg dGhlbgogICAgc2dkZXZpY2UyNgogIGVsc2UgIAogICAgRFJWPWBncmVwICdBdHRhY2hlZCBk cml2ZXJzOicgL3Byb2Mvc2NzaS9zY3NpIDI+L2Rldi9udWxsYAogICAgcmVwZGV2c3RhdD0k KCgxLSQ/KSkKICAgIGlmIFsgJHJlcGRldnN0YXQgPSAwIF07IHRoZW4KICAgICAgZWNobyAi c2NzaSByZXBvcnQtZGV2cyAxIiA+L3Byb2Mvc2NzaS9zY3NpCiAgICAgIERSVj1gZ3JlcCAn QXR0YWNoZWQgZHJpdmVyczonIC9wcm9jL3Njc2kvc2NzaSAyPi9kZXYvbnVsbGAKICAgICAg aWYgWyAkPyA9IDEgXTsgdGhlbiByZXR1cm47IGZpCiAgICBmaQogICAgaWYgISBlY2hvICIk RFJWIiB8IGdyZXAgLXEgJ2RyaXZlcnM6IHNnJzsgdGhlbgogICAgICBtb2Rwcm9iZSBzZwog ICAgZmkKICAgIHNnZGV2aWNlMjQKICAgIGlmIFsgJHJlcGRldnN0YXQgPSAwIF07IHRoZW4K ICAgICAgZWNobyAic2NzaSByZXBvcnQtZGV2cyAwIiA+L3Byb2Mvc2NzaS9zY3NpCiAgICBm aQogIGZpCn0KCiMgV2hldGhlciBvciBub3QgdGhlIFJNQiAocmVtb3ZhYmxlKSBiaXQgaGFz IGJlZW4gc2V0IGluIHRoZSBJTlFVSVJZIHJlc3BvbnNlLgojIFVzZXMgJHtob3N0fSwgJHtj aGFubmVsfSwgJHtpZH0gYW5kICR7bHVufS4gQXNzdW1lcyB0aGF0IHNnX2RldmljZSgpIGhh cwojIGFscmVhZHkgYmVlbiBjYWxsZWQuIEhvdyB0byB0ZXN0IHRoaXMgZnVuY3Rpb246IGNv cHkvcGFzdGUgdGhpcyBmdW5jdGlvbgojIGluIGEgc2hlbGwgYW5kIHJ1bgojIChjZCAvc3lz L2NsYXNzL3Njc2lfZGV2aWNlICYmIGZvciBkIGluICo7IGRvIHNldCAke2QvLzovIH07IGVj aG8gLW4gIiRkICQoPC9zeXMvY2xhc3Mvc2NzaV9kZXZpY2UvJHtkfS9kZXZpY2UvYmxvY2sv Ki9yZW1vdmFibGUpIDw+ICI7IFNHREVWPWJzZy8kZCBob3N0PSQxIGNoYW5uZWw9JDIgaWQ9 JDMgbHVuPSQ0IGlzX3JlbW92YWJsZTsgZG9uZSkKaXNfcmVtb3ZhYmxlICgpCnsKICBsb2Nh bCBiIHAKCiAgcD0vc3lzL2NsYXNzL3Njc2lfZGV2aWNlLyR7aG9zdH06JHtjaGFubmVsfTok e2lkfToke2x1bn0vZGV2aWNlL2lucXVpcnkKICAjIEV4dHJhY3QgdGhlIHNlY29uZCBieXRl IG9mIHRoZSBJTlFVSVJZIHJlc3BvbnNlIGFuZCBjaGVjayBiaXQgNyAobWFzayAweDgwKS4K ICBiPSQob2QgLXR4MSAtajEgLU4xICIkcCIgMj4vZGV2L251bGwgfAogICAgICAgICAgIHsg cmVhZCAtciBvZmZzZXQgYnl0ZSByZXN0OyBlY2hvIC1uICIkYnl0ZSI7IH0pCiAgaWYgWyAt biAiJGIiIF07IHRoZW4KICAgIGVjaG8gJCgoKDB4JGIgJiAweDgwKSAhPSAwKSkKICBlbHNl CiAgICBzZ19pbnEgL2Rldi8kU0dERVYgMj4vZGV2L251bGwgfCBzZWQgLW4gJ3MvXi4qUk1C PVwoWzAtOV0qXCkuKiQvXDEvcCcKICBmaQp9CgojIFRlc3QgaWYgU0NTSSBkZXZpY2UgaXMg c3RpbGwgcmVzcG9uZGluZyB0byBjb21tYW5kcwojIFJldHVybiB2YWx1ZXM6CiMgICAwIGRl dmljZSBpcyBwcmVzZW50CiMgICAxIGRldmljZSBoYXMgY2hhbmdlZAojICAgMiBkZXZpY2Ug aGFzIGJlZW4gcmVtb3ZlZAp0ZXN0b25saW5lICgpCnsKICBsb2NhbCBjdHIgUkMgUk1CCgog IDogdGVzdG9ubGluZQogIGN0cj0wCiAgUkM9MAogICMgU2V0IGRlZmF1bHQgdmFsdWVzCiAg SVBUWVBFPTMxCiAgSVBRVUFMPTMKICBpZiB0ZXN0ICEgLXggL3Vzci9iaW4vc2dfdHVyczsg dGhlbiByZXR1cm4gMDsgZmkKICBzZ2RldmljZQogIGlmIHRlc3QgLXogIiRTR0RFViI7IHRo ZW4gcmV0dXJuIDA7IGZpCiAgc2dfdHVycyAvZGV2LyRTR0RFViA+L2Rldi9udWxsIDI+JjEK ICBSQz0kPwoKICAjIEhhbmRsZSBpbiBwcm9ncmVzcyBvZiBiZWNvbWluZyByZWFkeSBhbmQg dW5pdCBhdHRlbnRpb24KICB3aGlsZSB0ZXN0ICRSQyA9IDIgLW8gJFJDID0gNiAmJiB0ZXN0 ICRjdHIgLWxlIDMwOyBkbwogICAgaWYgdGVzdCAkUkMgPSAyIC1hICIkUk1CIiAhPSAiMSI7 IHRoZW4gZWNobyAtbiAiLiI7IGxldCBMTis9MTsgc2xlZXAgMQogICAgZWxzZSBzbGVlcCAw LjAyOyBmaQogICAgbGV0IGN0cis9MQogICAgc2dfdHVycyAvZGV2LyRTR0RFViA+L2Rldi9u dWxsIDI+JjEKICAgIFJDPSQ/CiAgICAjIENoZWNrIGZvciByZW1vdmFibGUgZGV2aWNlOyBU RVNUIFVOSVQgUkVBRFkgb2J2aW91c2x5IHdpbGwKICAgICMgZmFpbCBmb3IgYSByZW1vdmFi bGUgZGV2aWNlIHdpdGggbm8gbWVkaXVtCiAgICBSTUI9JChpc19yZW1vdmFibGUpCiAgICBw cmludF9hbmRfc2Nyb2xsX2JhY2sgIiRob3N0OiRjaGFubmVsOiRpZDokbHVuICRTR0RFViAo JFJNQikgIgogICAgdGVzdCAkUkMgPSAyIC1hICIkUk1CIiA9ICIxIiAmJiBicmVhawogIGRv bmUKICBpZiB0ZXN0ICRjdHIgIT0gMDsgdGhlbiB3aGl0ZV9vdXQ7IGZpCiAgIyBlY2hvIC1l ICJcZVtBXGVbQVxlW0Eke3llbGxvd31UZXN0IGV4aXN0ZW5jZSBvZiAkU0dERVYgPSAkUkMg JHtub3JtfSBcblxuXG4iCiAgaWYgdGVzdCAkUkMgPSAxOyB0aGVuIHJldHVybiAkUkM7IGZp CiAgIyBSZXNldCBSQyAobWlnaHQgYmUgIT0wIGZvciBwYXNzaXZlIHBhdGhzKQogIFJDPTAK ICAjIE9LLCBkZXZpY2Ugb25saW5lLCBjb21wYXJlIElOUVVJUlkgc3RyaW5nCiAgSU5RPWBz Z19pbnEgJHNnX2xlbl9hcmcgL2Rldi8kU0dERVYgMj4vZGV2L251bGxgCiAgaWYgWyAteiAi JElOUSIgXSA7IHRoZW4KICAgIGVjaG8gLWUgIlxlW0FcZVtBXGVbQVxlW0Eke3JlZH0kU0dE RVYgY2hhbmdlZDogJHtib2xkfUlOUVVJUlkgZmFpbGVkJHtub3JtfSAgICBcblxuXG4iCiAg ICByZXR1cm4gMgogIGZpCiAgSVZFTkQ9YGVjaG8gIiRJTlEiIHwgZ3JlcCAnVmVuZG9yIGlk ZW50aWZpY2F0aW9uOicgfCBzZWQgJ3MvXlteOl0qOiBcKC4qXCkkL1wxLydgCiAgSVBST0Q9 YGVjaG8gIiRJTlEiIHwgZ3JlcCAnUHJvZHVjdCBpZGVudGlmaWNhdGlvbjonIHwgc2VkICdz L15bXjpdKjogXCguKlwpJC9cMS8nYAogIElQUkVWPWBlY2hvICIkSU5RIiB8IGdyZXAgJ1By b2R1Y3QgcmV2aXNpb24gbGV2ZWw6JyB8IHNlZCAncy9eW146XSo6IFwoLipcKSQvXDEvJ2AK ICBTVFI9YHByaW50ZiAiICBWZW5kb3I6ICUtMDhzIE1vZGVsOiAlLTE2cyBSZXY6ICUtNHMi ICIkSVZFTkQiICIkSVBST0QiICIkSVBSRVYiYAogIElQVFlQRT1gZWNobyAiJElOUSIgfCBz ZWQgLW4gJ3MvLiogRGV2aWNlX3R5cGU9XChbMC05XSpcKSAuKi9cMS9wJ2AKICBJUFFVQUw9 YGVjaG8gIiRJTlEiIHwgc2VkIC1uICdzLyAqUFF1YWw9XChbMC05XSpcKSAgRGV2aWNlLiov XDEvcCdgCiAgaWYgWyAiJElQUVVBTCIgIT0gMCBdIDsgdGhlbgogICAgWyAteiAiJElQUVVB TCIgXSAmJiBJUFFVQUw9MwogICAgWyAteiAiJElQVFlQRSIgXSAmJiBJUFRZUEU9MzEKICAg IGVjaG8gLWUgIlxlW0FcZVtBXGVbQVxlW0Eke3JlZH0kU0dERVYgY2hhbmdlZDogJHtib2xk fUxVIG5vdCBhdmFpbGFibGUgKFBRdWFsICRJUFFVQUwpJHtub3JtfSAgICBcblxuXG4iCiAg ICByZXR1cm4gMgogIGZpCgogIFRZUEU9JChwcmludHR5cGUgJElQVFlQRSkKICBpZiAhIHBy b2NzY3Npc2NzaSA7IHRoZW4KICAgIGVjaG8gLWUgIlxlW0FcZVtBXGVbQVxlW0Eke3JlZH0k U0dERVYgcmVtb3ZlZC5cblxuXG4iCiAgICByZXR1cm4gMgogIGZpCiAgVE1QU1RSPWBlY2hv ICIkU0NTSVNUUiIgfCBncmVwICdWZW5kb3I6J2AKICBpZiB0ZXN0ICRpZ25vcmVfcmV2IC1l cSAwIDsgdGhlbgogICAgICBpZiBbICIkVE1QU1RSIiAhPSAiJFNUUiIgXTsgdGhlbgogICAg ICAgIGVjaG8gLWUgIlxlW0FcZVtBXGVbQVxlW0Eke3JlZH0kU0dERVYgY2hhbmdlZDogJHti b2xkfVxuZnJvbToke1NDU0lTVFIjKiB9IFxudG86ICRTVFIgJHtub3JtfSBcblxuXG4iCiAg ICAgICAgcmV0dXJuIDEKICAgICAgZmkKICBlbHNlCiAgICAgICMgSWdub3JlIGRpc2sgcmV2 aXNpb24gY2hhbmdlCiAgICAgIGxvY2FsIG9sZF9zdHJfbm9fcmV2PWBlY2hvICIkVE1QU1RS IiB8IHNlZCAtZSAncy8uXHs0XH0kLy8nYAogICAgICBsb2NhbCBuZXdfc3RyX25vX3Jldj1g ZWNobyAiJFNUUiIgfCBzZWQgLWUgJ3MvLlx7NFx9JC8vJ2AKICAgICAgaWYgWyAiJG9sZF9z dHJfbm9fcmV2IiAhPSAiJG5ld19zdHJfbm9fcmV2IiBdOyB0aGVuCiAgICAgICAgZWNobyAt ZSAiXGVbQVxlW0FcZVtBXGVbQSR7cmVkfSRTR0RFViBjaGFuZ2VkOiAke2JvbGR9XG5mcm9t OiR7U0NTSVNUUiMqIH0gXG50bzogJFNUUiAke25vcm19IFxuXG5cbiIKICAgICAgICByZXR1 cm4gMQogICAgICBmaQogIGZpCiAgVE1QU1RSPWBlY2hvICIkU0NTSVNUUiIgfCBzZWQgLW4g J3MvLipUeXBlOiAqXCguKlwpICpBTlNJLiovXDEvcCcgfCBzZWQgJ3MvICokLy9nJ2AKICBp ZiBbICIkVE1QU1RSIiAhPSAiJFRZUEUiIF0gOyB0aGVuCiAgICBlY2hvIC1lICJcZVtBXGVb QVxlW0FcZVtBJHtyZWR9JFNHREVWIGNoYW5nZWQ6ICR7Ym9sZH1cbmZyb206JHtUTVBTVFJ9 IFxudG86ICRUWVBFICR7bm9ybX0gXG5cblxuIgogICAgcmV0dXJuIDEKICBmaQogIHJldHVy biAkUkMKfQoKIyBUZXN0IGlmIFNDU0kgZGV2aWNlICRob3N0ICRjaGFubmVsICRpZCAkbHVu IGV4aXN0cwojIE91dHB1dHMgZGVzY3JpcHRpb24gZnJvbSAvcHJvYy9zY3NpL3Njc2kgKHVu bGVzcyBhcmcgcGFzc2VkKQojIFJldHVybnMgU0NTSVNUUiAoZW1wdHkgaWYgbm8gZGV2KQp0 ZXN0ZXhpc3QgKCkKewogIDogdGVzdGV4aXN0CiAgU0NTSVNUUj0KICBpZiBwcm9jc2NzaXNj c2kgJiYgdGVzdCAteiAiJDEiOyB0aGVuCiAgICBlY2hvICIkU0NTSVNUUiIgfCBoZWFkIC1u MQogICAgZWNobyAiJFNDU0lTVFIiIHwgdGFpbCAtbjIgfCBwciAtbzQgLWwxCiAgZmkKfQoK IyBSZXR1cm5zIHRoZSBsaXN0IG9mIGV4aXN0aW5nIGNoYW5uZWxzIHBlciBob3N0CmNoYW5s aXN0ICgpCnsKICBsb2NhbCBoY2lsCiAgbG9jYWwgY2lsCiAgbG9jYWwgY2hhbgogIGxvY2Fs IHRtcGNoYW4KCiAgZm9yIGRldiBpbiAvc3lzL2NsYXNzL3Njc2lfZGV2aWNlLyR7aG9zdH06 KiA7IGRvCiAgICBbIC1kICRkZXYgXSB8fCBjb250aW51ZTsKICAgIGhjaWw9JHtkZXYjIyov fQogICAgY2lsPSR7aGNpbCMqOn0KICAgIGNoYW49JHtjaWwlJToqfQogICAgZm9yIHRtcGNo YW4gaW4gJGNoYW5uZWxzZWFyY2ggOyBkbwogICAgICBpZiB0ZXN0ICIkY2hhbiIgLWVxICR0 bXBjaGFuIDsgdGhlbgogICAgICAgIGNoYW49CiAgICAgIGZpCiAgICBkb25lCiAgICBpZiB0 ZXN0IC1uICIkY2hhbiIgOyB0aGVuCiAgICAgIGNoYW5uZWxzZWFyY2g9IiRjaGFubmVsc2Vh cmNoICRjaGFuIgogICAgZmkKICBkb25lCiAgaWYgdGVzdCAteiAiJGNoYW5uZWxzZWFyY2gi OyB0aGVuIGNoYW5uZWxzZWFyY2g9IjAiOyBmaQp9CgojIFJldHVybnMgdGhlIGxpc3Qgb2Yg ZXhpc3RpbmcgdGFyZ2V0cyBwZXIgaG9zdAppZGxpc3QgKCkKewogIGxvY2FsIHRtcGlkCiAg bG9jYWwgbmV3aWQKICBsb2NhbCBvbGRpZAoKICBvbGRsaXN0PSQobHMgL3N5cy9jbGFzcy9z Y3NpX2RldmljZS8gfCBzZWQgLW4gInMvJHtob3N0fToke2NoYW5uZWx9OlwoWzAtOV0qOlsw LTldKlwpL1wxL3AiIHwgdW5pcSkKICAjIFJlc2NhbiBMVU4gMCB0byBjaGVjayBpZiB3ZSBm b3VuZCBuZXcgdGFyZ2V0cwogIGVjaG8gIiR7Y2hhbm5lbH0gLSAwIiA+IC9zeXMvY2xhc3Mv c2NzaV9ob3N0L2hvc3Qke2hvc3R9L3NjYW4KICBuZXdsaXN0PSQobHMgL3N5cy9jbGFzcy9z Y3NpX2RldmljZS8gfCBzZWQgLW4gInMvJHtob3N0fToke2NoYW5uZWx9OlwoWzAtOV0qOlsw LTldKlwpL1wxL3AiIHwgdW5pcSkKICBmb3IgbmV3aWQgaW4gJG5ld2xpc3QgOyBkbwogICAg b2xkaWQ9JG5ld2lkCiAgICBmb3IgdG1waWQgaW4gJG9sZGxpc3QgOyBkbwogICAgICBpZiB0 ZXN0ICRuZXdpZCA9ICR0bXBpZCA7IHRoZW4KICAgICAgICBvbGRpZD0KICAgICAgICBicmVh awogICAgICBmaQogICAgZG9uZQogICAgaWYgdGVzdCAtbiAiJG9sZGlkIiA7IHRoZW4KICAg ICAgaWQ9JHtvbGRpZCUlOip9CiAgICAgIGx1bj0ke29sZGlkIyMqOn0KICAgICAgZGV2PS9z eXMvY2xhc3Mvc2NzaV9kZXZpY2UvJHtob3N0fToke2NoYW5uZWx9OiR7aWR9OiR7bHVufQog ICAgICBpZiBbIC1kICRkZXYgXSA7IHRoZW4KCWhjaWw9JHtkZXYjIyovfQogICAgICAgIHBy aW50ZiAiXHIke2dyZWVufU5FVzogJG5vcm0iCiAgICAgICAgdGVzdGV4aXN0CiAgICAgICAg aWYgdGVzdCAiJFNDU0lTVFIiIDsgdGhlbgogICAgICAgICAgaW5jcmZvdW5kICIkaGNpbCIK ICAgICAgICBmaQogICAgICBmaQogICAgZmkKICBkb25lCiAgaWRzZWFyY2g9JChscyAvc3lz L2NsYXNzL3Njc2lfZGV2aWNlLyB8IHNlZCAtbiAicy8ke2hvc3R9OiR7Y2hhbm5lbH06XChb MC05XSpcKTpbMC05XSovXDEvcCIgfCB1bmlxKQp9CgojIFJldHVybnMgdGhlIGxpc3Qgb2Yg ZXhpc3RpbmcgTFVOcyBmcm9tIGRldmljZSAkaG9zdCAkY2hhbm5lbCAkaWQgJGx1bgojIGFu ZCByZXR1cm5zIGxpc3QgdG8gc3Rkb3V0CmdldGx1bnMoKQp7CiAgc2dkZXZpY2UKICBpZiB0 ZXN0IC16ICIkU0dERVYiOyB0aGVuIHJldHVybiAxOyBmaQogIGlmIHRlc3QgISAteCAvdXNy L2Jpbi9zZ19sdW5zOyB0aGVuIGVjaG8gMDsgcmV0dXJuIDE7IGZpCiAgTExVTj1gc2dfbHVu cyAvZGV2LyRTR0RFViAyPi9kZXYvbnVsbCB8IHNlZCAtbiAncy8gICAgXCguKlwpL1wxL3An YAogICMgQWRkZWQgLXogJExMVU4gY29uZGl0aW9uIGJlY2F1c2UgJD8gZ2V0cyB0aGUgUkMg ZnJvbSBzZWQsIG5vdCBzZ19sdW5zCiAgaWYgdGVzdCAkPyAhPSAwIC1vIC16ICIkTExVTiI7 IHRoZW4gZWNobyAwOyByZXR1cm4gMTsgZmkKICBmb3IgbHVuIGluICRMTFVOIDsgZG8KICAg ICAgIyBTd2FwIExVTiBudW1iZXIKICAgICAgbDA9MHgkbHVuCiAgICAgIGwxPSQoKCAoJGww ID4+IDQ4KSAmIDB4ZmZmZiApKQogICAgICBsMj0kKCggKCRsMCA+PiAzMikgJiAweGZmZmYg KSkgCiAgICAgIGwzPSQoKCAoJGwwID4+IDE2KSAmIDB4ZmZmZiApKQogICAgICBsND0kKCgg JGwwICYgMHhmZmZmICkpCiAgICAgIGwwPSQoKCAoICggKCRsNCAqIDB4ZmZmZikgKyAkbDMg KSAqIDB4ZmZmZiArICRsMiApICogMHhmZmZmICsgJGwxICkpCiAgICAgIHByaW50ZiAiJXVc biIgJGwwCiAgZG9uZQogIHJldHVybiAwCn0KCiMgV2FpdCBmb3IgdWRldiB0byBzZXR0bGUg KGNyZWF0ZSBkZXZpY2Ugbm9kZXMgZXRjLikKdWRldmFkbV9zZXR0bGUoKQp7CiAgbG9jYWwg dG1vPTYwCiAgaWYgdGVzdCAteCAvc2Jpbi91ZGV2YWRtOyB0aGVuIAogICAgcHJpbnRfYW5k X3Njcm9sbF9iYWNrICIgQ2FsbGluZyB1ZGV2YWRtIHNldHRsZSAoY2FuIHRha2UgYSB3aGls ZSkgIgogICAgIyBMb29wIGZvciB1cCB0byA2MCBzZWNvbmRzIGlmIHNkIGRldmljZXMgc3Rp bGwgYXJlIHNldHRsaW5nLi4KICAgICMgVGhpcyBhbGxvd3MgdXMgdG8gY29udGludWUgaWYg dWRldiBldmVudHMgYXJlIHN0dWNrIG9uIG11bHRpcGF0aHMgaW4gcmVjb3ZlcnkgbW9kZQog ICAgd2hpbGUgWyAkdG1vIC1ndCAwIF0gOyBkbwogICAgICBpZiAhIC9zYmluL3VkZXZhZG0g c2V0dGxlIC0tdGltZW91dD0xIHwgZWdyZXAgLXEgc2RbYS16XSsgOyB0aGVuCiAgICAgICAg YnJlYWs7CiAgICAgIGZpCiAgICAgIGxldCB0bW89JHRtby0xCiAgICBkb25lCiAgICB3aGl0 ZV9vdXQKICBlbGlmIHRlc3QgLXggL3NiaW4vdWRldnNldHRsZTsgdGhlbgogICAgcHJpbnRf YW5kX3Njcm9sbF9iYWNrICIgQ2FsbGluZyB1ZGV2c2V0dGxlIChjYW4gdGFrZSBhIHdoaWxl KSAiCiAgICAvc2Jpbi91ZGV2c2V0dGxlCiAgICB3aGl0ZV9vdXQKICBlbHNlCiAgICBzbGVl cCAwLjAyCiAgZmkKfQoKIyBQZXJmb3JtIHNjYW4gb24gYSBzaW5nbGUgbHVuICRob3N0ICRj aGFubmVsICRpZCAkbHVuCmRvbHVuc2NhbigpCnsKICBsb2NhbCByZW1hcHBlZGx1bjA9CiAg U0NTSVNUUj0KICBkZXZucj0iJGhvc3QgJGNoYW5uZWwgJGlkICRsdW4iCiAgZWNobyAtZSAi IFNjYW5uaW5nIGZvciBkZXZpY2UgJGRldm5yIC4uLiAiCiAgcHJpbnRmICIke3llbGxvd31P TEQ6ICRub3JtIgogIHRlc3RleGlzdAogICMgRGV2aWNlIGV4aXN0czogVGVzdCB3aGV0aGVy IGl0J3Mgc3RpbGwgb25saW5lCiAgIyAodGVzdG9ubGluZSByZXR1cm5zIDIgaWYgaXQncyBn b25lIGFuZCAxIGlmIGl0IGhhcyBjaGFuZ2VkKQogIGlmIHRlc3QgIiRTQ1NJU1RSIiA7IHRo ZW4KICAgIHRlc3RvbmxpbmUKICAgIFJDPSQ/CiAgICAjIFdlbGwga25vd24gbHVuIHRyYW5z aXRpb24gY2FzZS4gT25seSBmb3IgRGlyZWN0LUFjY2VzcyBkZXZzICh0eXBlIDApCiAgICAj IElmIGJsb2NrIGRpcmVjdG9yeSBleGlzdHMgJiYgYW5kIFBRVUFMICE9IDAsIHdlIHVubWFw cGVkIGx1bjAgYW5kIGp1c3QgaGF2ZSBhIHdlbGwta25vd24gbHVuCiAgICAjIElmIGJsb2Nr IGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0ICYmIFBRVUFMID09IDAsIHdlIG1hcHBlZCBhIHJl YWwgbHVuMAogICAgaWYgdGVzdCAkbHVuIC1lcSAwIC1hICRJUFRZUEUgLWVxIDAgOyB0aGVu CiAgICAgIGlmIHRlc3QgJFJDID0gMiA7IHRoZW4KICAgICAgICBpZiB0ZXN0IC1lIC9zeXMv Y2xhc3Mvc2NzaV9kZXZpY2UvJHtob3N0fToke2NoYW5uZWx9OiR7aWR9OiR7bHVufS9kZXZp Y2U7IHRoZW4KICAgICAgICAgIGlmIHRlc3QgLWQgL3N5cy9jbGFzcy9zY3NpX2RldmljZS8k e2hvc3R9OiR7Y2hhbm5lbH06JHtpZH06JHtsdW59L2RldmljZS9ibG9jayA7IHRoZW4KICAg ICAgICAgICAgcmVtYXBwZWRsdW4wPTIgICMgVHJhbnNpdGlvbiBmcm9tIHJlYWwgbHVuIDAg dG8gd2VsbC1rbm93bgogICAgICAgICAgZWxzZQogICAgICAgICAgICBSQz0wICAgIyBTZXQg dGhpcyBzbyB0aGUgc3lzdGVtIGxlYXZlcyB0aGUgZXhpc3Rpbmcgd2VsbCBrbm93biBsdW4g YWxvbmUuIFRoaXMgaXMgYSBsdW4gMCB3aXRoIG5vIGJsb2NrIGRpcmVjdG9yeQogICAgICAg ICAgZmkKICAgICAgICBmaQogICAgICBlbGlmIHRlc3QgJFJDID0gMCAtYSAkSVBUWVBFIC1l cSAwOyB0aGVuCiAgICAgICAgaWYgdGVzdCAtZSAvc3lzL2NsYXNzL3Njc2lfZGV2aWNlLyR7 aG9zdH06JHtjaGFubmVsfToke2lkfToke2x1bn0vZGV2aWNlOyB0aGVuCiAgICAgICAgICBp ZiB0ZXN0ICEgLWQgL3N5cy9jbGFzcy9zY3NpX2RldmljZS8ke2hvc3R9OiR7Y2hhbm5lbH06 JHtpZH06JHtsdW59L2RldmljZS9ibG9jayA7IHRoZW4KICAgICAgICAgICAgcmVtYXBwZWRs dW4wPTEgICMgVHJhbnNpdGlvbiBmcm9tIHdlbGwta25vd24gdG8gcmVhbCBsdW4gMAogICAg ICAgICAgZmkKICAgICAgICBmaQogICAgICBmaQogICAgZmkKICBmaQoKICAjIFNwZWNpYWwg Y2FzZTogbHVuIDAganVzdCBnb3QgYWRkZWQgKGZvciByZXBvcnRsdW5zY2FuKSwKICAjIHNv IG1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgdHJlYXQgaXQgYXMgbmV3CiAgaWYgdGVzdCAiJGx1 biIgPSAiMCIgLWEgIiQxIiA9ICIxIiAtYSAteiAiJHJlbWFwcGVkbHVuMCI7IHRoZW4KICAg IFNDU0lTVFI9IiIKICAgIHByaW50ZiAiXHJcZVtBXGVbQVxlW0EiCiAgZmkKCiAgOiBmICRy ZW1vdmUgcyAkU0NTSVNUUgogIGlmIHRlc3QgIiRyZW1vdmUiIC1hICIkU0NTSVNUUiIgLW8g IiRyZW1hcHBlZGx1bjAiID0gIjEiOyB0aGVuCiAgICBpZiB0ZXN0ICRSQyAhPSAwIC1vICEg LXogIiRmb3JjZXJlbW92ZSIgLW8gLW4gIiRyZW1hcHBlZGx1bjAiOyB0aGVuCiAgICAgIGlm IHRlc3QgIiRyZW1hcHBlZGx1bjAiICE9ICIxIiA7IHRoZW4KICAgICAgICBlY2hvIC1lbiAi XHJcZVtBXGVbQVxlW0Eke3JlZH1SRU06ICIKICAgICAgICBlY2hvICIkU0NTSVNUUiIgfCBo ZWFkIC1uMQogICAgICAgIGVjaG8gLWUgIiR7bm9ybX1cZVtCXGVbQiIKICAgICAgZmkKICAg ICAgaWYgdGVzdCAtZSAvc3lzL2NsYXNzL3Njc2lfZGV2aWNlLyR7aG9zdH06JHtjaGFubmVs fToke2lkfToke2x1bn0vZGV2aWNlOyB0aGVuCiAgICAgICAgIyBoYXZlIHRvIHByZWVtcHRp dmVseSBkbyB0aGlzIHNvIHdlIGNhbiBmaWd1cmUgb3V0IHRoZSBtcGF0aCBkZXZpY2UKICAg ICAgICAjIERvbid0IGRvIHRoaXMgaWYgd2UncmUgZGVsZXRpbmcgYSB3ZWxsIGtub3duIGx1 biB0byByZXBsYWNlIGl0CiAgICAgICAgaWYgdGVzdCAiJHJlbWFwcGVkbHVuMCIgIT0gIjEi IDsgdGhlbgogICAgICAgICAgaW5jcnJtdmQgIiRob3N0OiRjaGFubmVsOiRpZDokbHVuIgog ICAgICAgIGZpCiAgICAgICAgZWNobyAxID4gL3N5cy9jbGFzcy9zY3NpX2RldmljZS8ke2hv c3R9OiR7Y2hhbm5lbH06JHtpZH06JHtsdW59L2RldmljZS9kZWxldGUKICAgICAgICBzbGVl cCAwLjAyCiAgICAgIGVsc2UKICAgICAgICBlY2hvICJzY3NpIHJlbW92ZS1zaW5nbGUtZGV2 aWNlICRkZXZuciIgPiAvcHJvYy9zY3NpL3Njc2kKICAgICAgICBpZiB0ZXN0ICRSQyAtZXEg MSAtbyAkbHVuIC1lcSAwIDsgdGhlbgogICAgICAgICAgIyBUcnkgcmVhZGRpbmcsIHNob3Vs ZCBmYWlsIGlmIGRldmljZSBpcyBnb25lCiAgICAgICAgICBlY2hvICJzY3NpIGFkZC1zaW5n bGUtZGV2aWNlICRkZXZuciIgPiAvcHJvYy9zY3NpL3Njc2kKICAgICAgICBmaQogICAgICBm aQogICAgZmkKICAgIGlmIHRlc3QgJFJDID0gMCAtbyAiJGZvcmNlcmVzY2FuIiA7IHRoZW4K ICAgICAgaWYgdGVzdCAtZSAvc3lzL2NsYXNzL3Njc2lfZGV2aWNlLyR7aG9zdH06JHtjaGFu bmVsfToke2lkfToke2x1bn0vZGV2aWNlOyB0aGVuCiAgICAgICAgZWNobyAxID4gL3N5cy9j bGFzcy9zY3NpX2RldmljZS8ke2hvc3R9OiR7Y2hhbm5lbH06JHtpZH06JHtsdW59L2Rldmlj ZS9yZXNjYW4KICAgICAgZmkKICAgIGZpCiAgICBwcmludGYgIlxyXGVbQVxlW0FcZVtBJHt5 ZWxsb3d9T0xEOiAkbm9ybSIKICAgIHRlc3RleGlzdAogICAgaWYgdGVzdCAteiAiJFNDU0lT VFIiIC1hICRSQyAhPSAxIC1hICIkcmVtYXBwZWRsdW4wIiAhPSAiMSI7IHRoZW4KICAgICAg cHJpbnRmICJcciR7cmVkfURFTDogJG5vcm1cclxuXG4iCiAgICAgICMgSW4gdGhlIGV2ZW50 IHdlJ3JlIHJlcGxhY2luZyB3aXRoIGEgd2VsbCBrbm93biBub2RlLCB3ZSBuZWVkIHRvIGxl dCBpdCBjb250aW51ZSwgdG8gY3JlYXRlIHRoZSByZXBsYWNlbWVudCBub2RlCiAgICAgIHRl c3QgIiRyZW1hcHBlZGx1bjAiICE9ICIyIiAmJiByZXR1cm4gMQogICAgZmkKICBmaQogIGlm IHRlc3QgLXogIiRTQ1NJU1RSIiAtbyAtbiAiJHJlbWFwcGVkbHVuMCI7IHRoZW4KICAgIGlm IHRlc3QgIiRyZW1hcHBlZGx1bjAiICE9ICIyIiA7IHRoZW4KICAgICAgIyBEZXZpY2UgZG9l cyBub3QgZXhpc3QsIHRyeSB0byBhZGQKICAgICAgcHJpbnRmICJcciR7Z3JlZW59TkVXOiAk bm9ybSIKICAgIGZpCiAgICBpZiB0ZXN0IC1lIC9zeXMvY2xhc3Mvc2NzaV9ob3N0L2hvc3Qk e2hvc3R9L3NjYW47IHRoZW4KICAgICAgZWNobyAiJGNoYW5uZWwgJGlkICRsdW4iID4gL3N5 cy9jbGFzcy9zY3NpX2hvc3QvaG9zdCR7aG9zdH0vc2NhbiAyPiAvZGV2L251bGwKICAgIGVs c2UKICAgICAgZWNobyAic2NzaSBhZGQtc2luZ2xlLWRldmljZSAkZGV2bnIiID4gL3Byb2Mv c2NzaS9zY3NpCiAgICBmaQogICAgdGVzdGV4aXN0CiAgICBpZiB0ZXN0IC16ICIkU0NTSVNU UiI7IHRoZW4KICAgICAgIyBEZXZpY2Ugbm90IHByZXNlbnQKICAgICAgcHJpbnRmICJcclxl W0EiOwogICAgICAjIE9wdGltaXphdGlvbjogaWYgbHVuPT0wLCBzdG9wIGhlcmUgKG9ubHkg aWYgaW4gbm9uLXJlbW92ZSBtb2RlKQogICAgICBpZiB0ZXN0ICRsdW4gPSAwIC1hIC16ICIk cmVtb3ZlIiAtYSAkb3B0c2NhbiA9IDE7IHRoZW4gCiAgICAgICAgYnJlYWs7CiAgICAgIGZp CiAgICBlbHNlIAogICAgICBpZiB0ZXN0ICIkcmVtYXBwZWRsdW4wIiAhPSAiMiIgOyB0aGVu CiAgICAgICAgaW5jcmZvdW5kICIkaG9zdDokY2hhbm5lbDokaWQ6JGx1biIKICAgICAgZmkK ICAgIGZpCiAgZmkKfQoKIyBQZXJmb3JtIHJlcG9ydCBsdW4gc2NhbiBvbiAkaG9zdCAkY2hh bm5lbCAkaWQgdXNpbmcgUkVQT1JUX0xVTlMKZG9yZXBvcnRsdW4oKQp7CiAgbHVuPTAKICBT Q1NJU1RSPQogIGRldm5yPSIkaG9zdCAkY2hhbm5lbCAkaWQgJGx1biIKICBlY2hvIC1lbiAi IFNjYW5uaW5nIGZvciBkZXZpY2UgJGRldm5yIC4uLlxyIgogIGx1bjBhZGRlZD0KICAjcHJp bnRmICIke3llbGxvd31PTEQ6ICRub3JtIgogICMgUGhhc2Ugb25lOiBJZiBMVU4wIGRvZXMg bm90IGV4aXN0LCB0cnkgdG8gYWRkCiAgdGVzdGV4aXN0IC1xCiAgaWYgdGVzdCAteiAiJFND U0lTVFIiOyB0aGVuCiAgICAjIERldmljZSBkb2VzIG5vdCBleGlzdCwgdHJ5IHRvIGFkZAog ICAgI3ByaW50ZiAiXHIke2dyZWVufU5FVzogJG5vcm0iCiAgICBpZiB0ZXN0IC1lIC9zeXMv Y2xhc3Mvc2NzaV9ob3N0L2hvc3Qke2hvc3R9L3NjYW47IHRoZW4KICAgICAgZWNobyAiJGNo YW5uZWwgJGlkICRsdW4iID4gL3N5cy9jbGFzcy9zY3NpX2hvc3QvaG9zdCR7aG9zdH0vc2Nh biAyPiAvZGV2L251bGwKICAgICAgdWRldmFkbV9zZXR0bGUKICAgIGVsc2UKICAgICAgZWNo byAic2NzaSBhZGQtc2luZ2xlLWRldmljZSAkZGV2bnIiID4gL3Byb2Mvc2NzaS9zY3NpCiAg ICBmaQogICAgdGVzdGV4aXN0IC1xCiAgICBpZiB0ZXN0IC1uICIkU0NTSVNUUiI7IHRoZW4K ICAgICAgbHVuMGFkZGVkPTEKICAgICAgI3Rlc3RvbmxpbmUKICAgIGVsc2UKICAgICAgIyBE ZXZpY2Ugbm90IHByZXNlbnQKICAgICAgIyByZXR1cm4KICAgICAgIyBGaW5kIGFsdGVybmF0 aXZlIExVTiB0byBzZW5kIGdldGx1bnMgdG8KICAgICAgZm9yIGRldiBpbiAvc3lzL2NsYXNz L3Njc2lfZGV2aWNlLyR7aG9zdH06JHtjaGFubmVsfToke2lkfToqOyBkbwogICAgICAgIFsg LWQgIiRkZXYiIF0gfHwgY29udGludWUKICAgICAgICBsdW49JHtkZXYjIyo6fQogICAgICAg IGJyZWFrCiAgICAgIGRvbmUKICAgIGZpCiAgZmkKICB0YXJnZXRsdW5zPWBnZXRsdW5zYAog IFJFUExVTlNUQVQ9JD8KICBsdW5yZW1vdmU9CiAgI2VjaG8gImdldGx1bnMgcmVwb3J0cyAi ICR0YXJnZXRsdW5zCiAgb2xkZGV2PWBmaW5kIC9zeXMvY2xhc3Mvc2NzaV9kZXZpY2UvIC1u YW1lICIkaG9zdDokY2hhbm5lbDokaWQ6KiIgMj4vZGV2L251bGwgfCBzb3J0IC10OiAtazQg LW5gCiAgb2xkdGFyZ2V0cz0iJHRhcmdldGx1bnMiCiAgIyBPSyAtLSBpZiB3ZSBkb24ndCBo YXZlIGEgTFVOIHRvIHNlbmQgYSBSRVBPUlRfTFVOUyB0bywgd2UgY291bGQKICAjIGZhbGwg YmFjayB0byB3aWxkY2FyZCBzY2FubmluZy4gU2FtZSB0aGluZyBpZiB0aGUgZGV2aWNlIGRv ZXMgbm90CiAgIyBzdXBwb3J0IFJFUE9SVF9MVU5TCiAgIyBUT0RPOiBXZSBtaWdodCBiZSBi ZXR0ZXIgb2ZmIHRvIEFMV0FZUyB1c2Ugd2lsZGNhcmQgc2Nhbm5pbmcgaWYgCiAgIyBpdCB3 b3JrcwogIGlmIHRlc3QgIiRSRVBMVU5TVEFUIiA9ICIxIjsgdGhlbgogICAgaWYgdGVzdCAt ZSAvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0JHtob3N0fS9zY2FuOyB0aGVuCiAgICAgIGVj aG8gIiRjaGFubmVsICRpZCAtIiA+IC9zeXMvY2xhc3Mvc2NzaV9ob3N0L2hvc3Qke2hvc3R9 L3NjYW4gMj4gL2Rldi9udWxsCiAgICAgIHVkZXZhZG1fc2V0dGxlCiAgICBlbHNlCiAgICAg IGVjaG8gInNjc2kgYWRkLXNpbmdsZS1kZXZpY2UgJGhvc3QgJGNoYW5uZWwgJGlkICRTQ0FO X1dJTERfQ0FSRCIgPiAvcHJvYy9zY3NpL3Njc2kKICAgIGZpCiAgICB0YXJnZXRsdW5zPWBm aW5kIC9zeXMvY2xhc3Mvc2NzaV9kZXZpY2UvIC1uYW1lICIkaG9zdDokY2hhbm5lbDokaWQ6 KiIgMj4vZGV2L251bGwgfCBhd2sgLUYnLycgJ3twcmludCAkNX0nIHwgYXdrIC1GJzonICd7 cHJpbnQgJDR9JyB8IHNvcnQgLW5gCiAgICBsZXQgZm91bmQrPWBlY2hvICIkdGFyZ2V0bHVu cyIgfCB3YyAtbGAKICAgIGxldCBmb3VuZC09YGVjaG8gIiRvbGRkZXYiIHwgd2MgLWxgCiAg ZmkKICBpZiB0ZXN0IC16ICIkdGFyZ2V0bHVucyI7IHRoZW4gdGFyZ2V0bHVucz0iJG9sZHRh cmdldHMiOyBmaQogICMgQ2hlY2sgZXhpc3RpbmcgbHVucwogIGZvciBkZXYgaW4gJG9sZGRl djsgZG8KICAgIFsgLWQgIiRkZXYiIF0gfHwgY29udGludWUKICAgIGx1bj0ke2RldiMjKjp9 CiAgICBuZXdzZWFyY2g9CiAgICBpbmxpc3Q9CiAgICAjIE9LLCBpcyBleGlzdGluZyAkbHVu IChzdGlsbCkgaW4gcmVwb3J0ZWQgbGlzdAogICAgZm9yIHRtcGx1biBpbiAkdGFyZ2V0bHVu czsgZG8KICAgICAgaWYgdGVzdCAkdG1wbHVuIC1lcSAkbHVuIDsgdGhlbgogICAgICAgIGlu bGlzdD0xCiAgICAgICAgZG9sdW5zY2FuICRsdW4wYWRkZWQKICAgICAgZWxzZQogICAgICAg IG5ld3NlYXJjaD0iJG5ld3NlYXJjaCAkdG1wbHVuIgogICAgICBmaQogICAgZG9uZQogICAg IyBPSywgd2UgaGF2ZSBub3cgZG9uZSBhIGx1bnNjYW4gb24gJGx1biBhbmQgCiAgICAjICRu ZXdzZWFyY2ggaXMgdGhlIG9sZCAkdGFyZ2V0bHVucyB3aXRob3V0ICRsdW4KICAgIGlmIFsg LXogIiRpbmxpc3QiIF07IHRoZW4KICAgICAgIyBTdGFsZSBsdW4KICAgICAgbHVucmVtb3Zl PSIkbHVucmVtb3ZlICRsdW4iCiAgICBmaQogICAgIyAkbHVuIHJlbW92ZWQgZnJvbSAkbHVu c2VhcmNoIChlY2hvIGZvciB3aGl0ZXNwYWNlIGNsZWFudXApCiAgICB0YXJnZXRsdW5zPWBl Y2hvICRuZXdzZWFyY2hgCiAgZG9uZQogICMgQWRkIG5ldyBvbmVzIGFuZCBjaGVjayBzdGFs ZSBvbmVzCiAgZm9yIGx1biBpbiAkdGFyZ2V0bHVucyAkbHVucmVtb3ZlOyBkbwogICAgZG9s dW5zY2FuICRsdW4wYWRkZWQKICBkb25lCn0KCiMgUGVyZm9ybSBzZWFyY2ggKHNjYW4gJGhv c3QpCmRvc2VhcmNoICgpCnsKICBpZiB0ZXN0IC16ICIkY2hhbm5lbHNlYXJjaCIgOyB0aGVu CiAgICBjaGFubGlzdAogIGZpCiAgZm9yIGNoYW5uZWwgaW4gJGNoYW5uZWxzZWFyY2g7IGRv CiAgICBpZiB0ZXN0IC16ICIkaWRzZWFyY2giIDsgdGhlbgogICAgICBpZiB0ZXN0IC16ICIk bHVuc2VhcmNoIiA7IHRoZW4KCWlkbGlzdAogICAgICBlbHNlCglpZHNlYXJjaD0kKGxzIC9z eXMvY2xhc3Mvc2NzaV9kZXZpY2UvIHwgc2VkIC1uICJzLyR7aG9zdH06JHtjaGFubmVsfTpc KFswLTldKlwpOlswLTldKi9cMS9wIiB8IHVuaXEpCiAgICAgIGZpCiAgICBmaQogICAgZm9y IGlkIGluICRpZHNlYXJjaDsgZG8KICAgICAgaWYgdGVzdCAteiAiJGx1bnNlYXJjaCIgOyB0 aGVuCiAgICAgICAgZG9yZXBvcnRsdW4KICAgICAgZWxzZQogICAgICAgIGZvciBsdW4gaW4g JGx1bnNlYXJjaDsgZG8KICAgICAgICAgIGRvbHVuc2NhbgogICAgICAgIGRvbmUKICAgICAg ZmkKICAgIGRvbmUKICBkb25lCn0KIApleHBhbmRsaXN0ICgpCnsKICBsaXN0PSQxCiAgcmVz dWx0PSIiCiAgZmlyc3Q9JHtsaXN0JSUsKn0KICByZXN0PSR7bGlzdCMqLH0KICB3aGlsZSB0 ZXN0ICEgLXogIiRmaXJzdCI7IGRvIAogICAgYmVnPSR7Zmlyc3QlJS0qfTsKICAgIGlmIHRl c3QgIiRiZWciID0gIiRmaXJzdCI7IHRoZW4KICAgICAgcmVzdWx0PSIkcmVzdWx0ICRiZWci OwogICAgZWxzZQogICAgICBlbmQ9JHtmaXJzdCMqLX0KICAgICAgcmVzdWx0PSIkcmVzdWx0 IGBzZXEgJGJlZyAkZW5kYCIKICAgIGZpCiAgICB0ZXN0ICIkcmVzdCIgPSAiJGZpcnN0IiAm JiByZXN0PSIiCiAgICBmaXJzdD0ke3Jlc3QlJSwqfQogICAgcmVzdD0ke3Jlc3QjKix9CiAg ZG9uZQogIGVjaG8gJHJlc3VsdAp9CgpzZWFyY2hleGlzdGluZygpCnsKICBsb2NhbCB0bXBj aDsKICBsb2NhbCB0bXBpZAogIGxvY2FsIG1hdGNoPTAKICBsb2NhbCB0YXJnZXRzPWBscyAt ZCAvc3lzL2NsYXNzL3Njc2lfZGV2aWNlLyRob3N0OiogMj4gL2Rldi9udWxsIHwgZWdyZXAg LW8gJGhvc3Q6WzAtOV0rOlswLTldKyB8IHNvcnQgfCB1bmlxYAoKICAjIE5vdGhpbmcgY2Ft ZSBiYWNrIG9uIHRoaXMgaG9zdCwgc28gd2Ugc2hvdWxkIHNraXAgaXQKICB0ZXN0IC16ICIk dGFyZ2V0cyIgJiYgcmV0dXJuCgogIGxvY2FsIHRhcmdldD07CiAgZm9yIHRhcmdldCBpbiAk dGFyZ2V0cyA7IGRvCiAgICBjaGFubmVsPWBlY2hvICR0YXJnZXQgfCBjdXQgLWQiOiIgLWYy YAogICAgaWQ9YGVjaG8gJHRhcmdldCB8IGN1dCAtZCI6IiAtZiAzYAogICAgaWYgWyAtbiAi JGNoYW5uZWxzZWFyY2giIF0gOyB0aGVuCiAgICAgIGZvciB0bXBjaCBpbiAkY2hhbm5lbHNl YXJjaCA7IGRvCiAgICAgICAgdGVzdCAkdG1wY2ggLWVxICRjaGFubmVsICYmIG1hdGNoPTEK ICAgICAgZG9uZQogICAgZWxzZQogICAgICBtYXRjaD0xCiAgICBmaQoKICAgIHRlc3QgJG1h dGNoIC1lcSAwICYmIGNvbnRpbnVlCiAgICBtYXRjaD0wCgogICAgaWYgWyAkZmlsdGVyX2lk cyAtZXEgMSBdIDsgdGhlbgogICAgICBmb3IgdG1waWQgaW4gJGlkc2VhcmNoIDsgZG8KICAg ICAgICBpZiBbICR0bXBpZCAtZXEgJGlkIF0gOyB0aGVuCiAgICAgICAgICBtYXRjaD0xCiAg ICAgICAgZmkKICAgICAgZG9uZQogICAgZWxzZQogICAgICBtYXRjaD0xCiAgICBmaQoKICAg IHRlc3QgJG1hdGNoIC1lcSAwICYmIGNvbnRpbnVlCgogICAgaWYgWyAteiAiJGx1bnNlYXJj aCIgXSA7IHRoZW4KICAgICAgZG9yZXBvcnRsdW4KICAgIGVsc2UKICAgICAgZm9yIGx1biBp biAkbHVuc2VhcmNoIDsgZG8KICAgICAgICBkb2x1bnNjYW4KICAgICAgZG9uZQogICAgZmkK ICBkb25lCn0KCiMgR28gdGhyb3VnaCBhbGwgb2YgdGhlIGV4aXN0aW5nIGRldmljZXMgYW5k IGZpZ3VyZSBvdXQgYW55IHRoYXQgaGF2ZSBiZWVuIHJlbWFwcGVkCmZpbmRyZW1hcHBlZCgp CnsKICBsb2NhbCBoY3RsPTsKICBsb2NhbCBkZXZzPWBscyAvc3lzL2NsYXNzL3Njc2lfZGV2 aWNlL2AKICBsb2NhbCBzZGRldj0KICBsb2NhbCBpZF9zZXJpYWw9CiAgbG9jYWwgaWRfc2Vy aWFsX29sZD0KICBsb2NhbCByZW1hcHBlZD0KICBtcGF0aHM9IiIKICBsb2NhbCB0bXBmaWxl PSQobWt0ZW1wIC90bXAvcmVzY2FuLXNjc2ktYnVzLlhYWFhYWFhYIDI+IC9kZXYvbnVsbCkK CiAgaWYgWyAteiAiJHRtcGZpbGUiIF0gOyB0aGVuCiAgICB0bXBmaWxlPSIvdG1wL3Jlc2Nh bi1zY3NpLWJ1cy4kJCIKICAgIHJtIC1mICR0bXBmaWxlCiAgZmkKCiAgIyBHZXQgYWxsIG9m IHRoZSBJRF9TRVJJQUwgYXR0cmlidXRlcywgYWZ0ZXIgZmluZGluZyB0aGVpciBzZCBub2Rl CiAgZm9yIGhjdGwgaW4gJGRldnMgOyBkbwogICAgaWYgWyAtZCAvc3lzL2NsYXNzL3Njc2lf ZGV2aWNlLyRoY3RsL2RldmljZS9ibG9jayBdIDsgdGhlbgogICAgICBzZGRldj1gbHMgL3N5 cy9jbGFzcy9zY3NpX2RldmljZS8kaGN0bC9kZXZpY2UvYmxvY2tgCiAgICAgIGlkX3Nlcmlh bF9vbGQ9YHVkZXZhZG0gaW5mbyAtcSBhbGwgLW4gJHNkZGV2IHwgZ3JlcCAiSURfU0VSSUFM PSIgfCBjdXQgLWQiPSIgLWYyYAogICAgICBbIC16ICIkaWRfc2VyaWFsX29sZCIgXSAmJiBp ZF9zZXJpYWxfb2xkPSJub25lIgogICAgICBlY2hvICIkaGN0bCAkc2RkZXYgJGlkX3Nlcmlh bF9vbGQiID4+ICR0bXBmaWxlCiAgICBmaQogIGRvbmUKCiAgIyBUcmlnZ2VyIHVkZXYgdG8g dXBkYXRlIHRoZSBpbmZvCiAgZWNobyAtbiAiVHJpZ2dlcmluZyB1ZGV2IHRvIHVwZGF0ZSBk ZXZpY2UgaW5mb3JtYXRpb24uLi4gIgogIC9zYmluL3VkZXZhZG0gdHJpZ2dlcgogIHVkZXZh ZG1fc2V0dGxlIDI+JjEgL2Rldi9udWxsCiAgZWNobyAiRG9uZSIKCiAgIyBTZWUgd2hhdCBj aGFuZ2VkIGFuZCByZWxvYWQgdGhlIHJlc3BlY3RpdmUgbXVsdGlwYXRoIGRldmljZSBpZiBh cHBsaWNhYmxlCiAgd2hpbGUgcmVhZCBoY3RsIHNkZGV2IGlkX3NlcmlhbF9vbGQgOyBkbwog ICAgcmVtYXBwZWQ9MAogICAgaWRfc2VyaWFsPWB1ZGV2YWRtIGluZm8gLXEgYWxsIC1uICRz ZGRldiB8IGdyZXAgIklEX1NFUklBTD0iIHwgY3V0IC1kIj0iIC1mMmAKICAgIFsgLXogIiRp ZF9zZXJpYWwiIF0gJiYgaWRfc2VyaWFsPSJub25lIgogICAgaWYgWyAiJGlkX3NlcmlhbF9v bGQiICE9ICIkaWRfc2VyaWFsIiBdIDsgdGhlbgogICAgICByZW1hcHBlZD0xCiAgICBmaQog ICAgIyBJZiB1ZGV2IGV2ZW50cyB1cGRhdGVkIHRoZSBkaXNrcyBhbHJlYWR5LCBidXQgdGhl IG11bHRpcGF0aCBkZXZpY2UgaXNuJ3QgdXBkYXRlCiAgICAjIGNoZWNrIGZvciBvbGQgZGV2 aWNlcyB0byBtYWtlIHN1cmUgd2UgZm91bmQgcmVtYXBwZWQgbHVucwogICAgaWYgWyAtbiAi JG1wX2VuYWJsZSIgXSAmJiBbICRyZW1hcHBlZCAtZXEgMCBdOyB0aGVuCiAgICAgIGZpbmRt dWx0aXBhdGggJHNkZGV2ICRpZF9zZXJpYWwKICAgICAgaWYgWyAkPyAtZXEgMSBdIDsgdGhl bgogICAgICAgIHJlbWFwcGVkPTEKICAgICAgZmkKICAgIGZpCgogICAgIyBpZiB1dWlkIGlz IDEsIGl0J3MgdW5tYXBwZWQsIHNvIHdlIGRvbid0IHdhbnQgdG8gdHJlYXQgaXQgYXMgYSBy ZW1hcAogICAgIyBpZiByZW1hcHBlZCBmbGFnIGlzIDAsIGp1c3Qgc2tpcCB0aGUgcmVzdCBv ZiB0aGUgbG9naWMKICAgIGlmIFsgIiRpZF9zZXJpYWwiID0gIjEiIF0gfHwgWyAkcmVtYXBw ZWQgLWVxIDAgXSA7IHRoZW4KICAgICAgY29udGludWUKICAgIGZpCiAgICBwcmludGYgIiR7 eWVsbG93fVJFTUFQUEVEOiAkbm9ybSIKICAgIGhvc3Q9YGVjaG8gJGhjdGwgfCBjdXQgLWQi OiIgLWYxYAogICAgY2hhbm5lbD1gZWNobyAkaGN0bCB8IGN1dCAtZCI6IiAtZjJgCiAgICBp ZD1gZWNobyAkaGN0bCB8IGN1dCAtZCI6IiAtZjNgCiAgICBsdW49YGVjaG8gJGhjdGwgfCBj dXQgLWQiOiIgLWY0YAogICAgcHJvY3Njc2lzY3NpCiAgICBlY2hvICIkU0NTSVNUUiIKICAg IGluY3JjaGdkICIkaGN0bCIKICBkb25lIDwgJHRtcGZpbGUKICBybSAtZiAkdG1wZmlsZQoK ICBpZiB0ZXN0IC1uICIkbXBfZW5hYmxlIiAtYSAtbiAiJG1wYXRocyIgOyB0aGVuCiAgICBl Y2hvICJVcGRhdGluZyBtdWx0aXBhdGggZGV2aWNlIG1hcHBpbmdzIgogICAgZmx1c2htcGF0 aHMKICAgICRNVUxUSVBBVEggfCBncmVwICJjcmVhdGU6IiAyPiAvZGV2L251bGwKICBmaQp9 CgppbmNyZm91bmQoKQp7CiAgbG9jYWwgaGN0bD0iJDEiCiAgaWYgdGVzdCAtbiAiJGhjdGwi IDsgdGhlbgogICAgbGV0IGZvdW5kKz0xCiAgICBGT1VORERFVlM9IiRGT1VORERFVlNcdFsk aGN0bF1cbiIKICBlbHNlCiAgICByZXR1cm4KICBmaQp9CgppbmNyY2hnZCgpCnsKICBsb2Nh bCBoY3RsPSIkMSIKICBpZiB0ZXN0IC1uICIkaGN0bCIgOyB0aGVuCiAgICBpZiAhIGVjaG8g JENIR0RFVlMgfCBncmVwIC1xICJcWyRoY3RsXF0iOyB0aGVuCiAgICAgIGxldCB1cGRhdGVk Kz0xCiAgICAgIENIR0RFVlM9IiRDSEdERVZTXHRbJGhjdGxdXG4iCiAgICBmaQogIGVsc2UK ICAgIHJldHVybgogIGZpCgogIGlmIHRlc3QgLW4gIiRtcF9lbmFibGUiIDsgdGhlbgogICAg bG9jYWwgc2Rldj0iYGZpbmRzZGRldiBcIiRoY3RsXCJgIgogICAgaWYgdGVzdCAtbiAiJHNk ZXYiIDsgdGhlbgogICAgICBmaW5kbXVsdGlwYXRoICIkc2RldiIKICAgIGZpCiAgZmkKfQoK aW5jcnJtdmQoKQp7CiAgbG9jYWwgaGN0bD0iJDEiCiAgaWYgdGVzdCAtbiAiJGhjdGwiIDsg dGhlbgogICAgbGV0IHJtdmQrPTE7CiAgICBSTVZEREVWUz0iJFJNVkRERVZTXHRbJGhjdGxd XG4iCiAgZWxzZQogICAgcmV0dXJuCiAgZmkKCiAgaWYgdGVzdCAtbiAiJG1wX2VuYWJsZSIg OyB0aGVuCiAgICBsb2NhbCBzZGV2PSJgZmluZHNkZGV2IFwiJGhjdGxcImAiCiAgICBpZiB0 ZXN0IC1uICIkc2RldiIgOyB0aGVuCiAgICAgIGZpbmRtdWx0aXBhdGggIiRzZGV2IgogICAg ZmkKICBmaQp9CgpmaW5kc2RkZXYoKQp7CiAgbG9jYWwgaGN0bD0iJDEiCiAgbG9jYWwgc2Rk ZXY9ICAKCiAgaWYgdGVzdCAhIC1lIC9zeXMvY2xhc3Mvc2NzaV9kZXZpY2UvJGhjdGwvZGV2 aWNlL2Jsb2NrIDsgdGhlbgogICAgcmV0dXJuIDEKICBmaSAKCiAgc2RkZXY9YGxzIC9zeXMv Y2xhc3Mvc2NzaV9kZXZpY2UvJGhjdGwvZGV2aWNlL2Jsb2NrYAogIGVjaG8gJHNkZGV2Cgog IHJldHVybiAwCn0KCmFkZG1wYXRodG9saXN0KCkKewogIGxvY2FsIG1wPSIkMSIKICBsb2Nh bCBtcDI9CgogIGZvciBtcDIgaW4gJG1wYXRocyA7IGRvCiAgICAjIFRoZSBtdWx0aXBhdGgg ZGV2aWNlIGlzIGFscmVhZHkgaW4gdGhlIGxpc3QKICAgIGlmIFsgIiRtcDIiID0gIiRtcCIg XSA7IHRoZW4KICAgICAgcmV0dXJuCiAgICBmaQogIGRvbmUKICBtcGF0aHM9IiRtcGF0aHMg JG1wIgp9CgpmaW5kbXVsdGlwYXRoKCkKewogIGxvY2FsIGRldj0iJDEiCiAgbG9jYWwgZmlu ZF9taXNtYXRjaD0iJDIiCiAgbG9jYWwgbXA9CiAgbG9jYWwgbXAyPQogIGxvY2FsIGZvdW5k X2R1cD0wCgogICMgTmVlZCBhIHNkZXYsIGFuZCBleGVjdXRhYmxlIG11bHRpcGF0aCBhbmQg ZG1zZXR1cCBjb21tYW5kIGhlcmUKICBpZiBbIC16ICIkZGV2IiBdIHx8IFsgISAteCAkRE1T RVRVUCBdIHx8IFsgISAteCAiJE1VTFRJUEFUSCIgXSA7IHRoZW4KICAgIHJldHVybiAxCiAg ZmkKCiAgbG9jYWwgbWFqX21pbj1gY2F0IC9zeXMvYmxvY2svJGRldi9kZXZgCiAgZm9yIG1w IGluICQoJERNU0VUVVAgbHMgLS10YXJnZXQ9bXVsdGlwYXRoIHwgY3V0IC1mIDEpIDsgZG8K ICAgIFsgIiRtcCIgPSAiTm8iIF0gJiYgYnJlYWs7CiAgICBpZiAkRE1TRVRVUCBzdGF0dXMg JG1wIHwgZ3JlcCAtcSAiICRtYWpfbWluICI7IHRoZW4KICAgICAgIyBXaXRoIHR3byBhcmd1 bWVudHMsIGxvb2sgdXAgY3VycmVudCB1dWlkIGZyb20gc3lzZnMKICAgICAgIyBpZiBpdCBk b2Vzbid0IG1hdGNoIHdoYXQgd2FzIHBhc3NlZCwgdGhpcyBtdWx0aXBhdGgKICAgICAgIyBk ZXZpY2UgaXMgbm90IHVwZGF0ZWQsIHNvIHRoaXMgaXMgYSByZW1hcHBlZCBMVU4KICAgICAg aWYgWyAtbiAiJGZpbmRfbWlzbWF0Y2giIF0gOyB0aGVuCiAgICAgICAgbXAyPSQoJE1VTFRJ UEFUSCAtbCAiJG1wIiB8IGVncmVwIC1vICJkbS1bMC05XSsiKQogICAgICAgIG1wMj0kKGN1 dCAtZjIgLWQtICIvc3lzL2Jsb2NrLyRtcDIvZG0vdXVpZCIpCiAgICAgICAgaWYgWyAiJGZp bmRfbWlzbWF0Y2giICE9ICIkbXAyIiBdIDsgdGhlbgogICAgICAgICAgYWRkbXBhdGh0b2xp c3QgJG1wCiAgICAgICAgICBmb3VuZF9kdXA9MQogICAgICAgIGZpCiAgICAgICAgY29udGlu dWUKICAgICAgZmkKICAgICAgIyBOb3JtYWwgbW9kZTogRmluZCB0aGUgZmlyc3QgbXVsdGlw YXRoIHdpdGggdGhlIHNkZXYKICAgICAgIyBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0CiAgICAg IGFkZG1wYXRodG9saXN0ICRtcAogICAgICByZXR1cm4KICAgIGZpCiAgZG9uZQoKICAjIFJl dHVybiAxIHRvIHNpZ25hbCB0aGF0IGEgZHVwbGljYXRlIHdhcyBmb3VuZCB0byB0aGUgY2Fs bGluZyBmdW5jdGlvbgogIGlmIFsgJGZvdW5kX2R1cCAtZXEgMSBdIDsgdGhlbgogICAgcmV0 dXJuIDEKICBlbHNlCiAgICByZXR1cm4gMAogIGZpCn0KCnJlbG9hZG1wYXRocygpCnsKICBs b2NhbCBtcGF0aAogIGlmIFsgISAteCAiJE1VTFRJUEFUSCIgXSA7IHRoZW4KICAgIGVjaG8g Im5vIC14IG11bHRpcGF0aCIKICAgIHJldHVybgogIGZpCgogICMgUGFzcyAxIGFzIHRoZSBh cmd1bWVudCB0byByZWxvYWQgYWxsIG1wYXRocwogIGlmIFsgIiQxIiA9ICIxIiBdIDsgdGhl bgogICAgZWNobyAiUmVsb2FkaW5nIGFsbCBtdWx0aXBhdGggZGV2aWNlcyIKICAgICRNVUxU SVBBVEggLXIgPiAvZGV2L251bGwgMj4mMQogICAgcmV0dXJuCiAgZmkKCiAgIyBSZWxvYWQg dGhlIG11bHRpcGF0aCBkZXZpY2VzCiAgZm9yIG1wYXRoIGluICRtcGF0aHMgOyBkbwogICAg ZWNobyAtbiAiUmVsb2FkaW5nIG11bHRpcGF0aCBkZXZpY2UgJG1wYXRoLi4uICIKICAgICRN VUxUSVBBVEggLXIgJG1wYXRoID4gL2Rldi9udWxsIDI+JjEKICAgIGlmIHRlc3QgIiQ/IiA9 ICIwIiA7IHRoZW4KICAgICAgZWNobyAiRG9uZSIKICAgIGVsc2UKICAgICAgZWNobyAiRmFp bCIKICAgIGZpCiAgZG9uZQp9CgpyZXNpemVtcGF0aHMoKQp7CiAgbG9jYWwgbXBhdGgKCiAg Zm9yIG1wYXRoIGluICRtcGF0aHMgOyBkbwogICAgZWNobyAtbiAiUmVzaXppbmcgbXVsdGlw YXRoIG1hcCAkbXBhdGggLi4uIgogICAgbXVsdGlwYXRoZCAtayJyZXNpemUgbWFwICRtcGF0 aCIKICAgIGxldCB1cGRhdGVkKz0xCiAgZG9uZQp9CgpmbHVzaG1wYXRocygpCnsKICBsb2Nh bCBtcGF0aAogIGxvY2FsIHJlbW92ZT0iIgogIGxvY2FsIGkKICBsb2NhbCBmbHVzaF9yZXRy aWVzPTUKCiAgaWYgdGVzdCAtbiAiJDEiIDsgdGhlbgogICAgZm9yIG1wYXRoIGluICQoJERN U0VUVVAgbHMgLS10YXJnZXQ9bXVsdGlwYXRoIHwgY3V0IC1mIDEpIDsgZG8KICAgICAgWyAi JG1wYXRoIiA9ICJObyIgXSAmJiBicmVhawogICAgICBudW09JCgkRE1TRVRVUCBzdGF0dXMg JG1wYXRoIHwgYXdrICdCRUdJTntSUz0iICI7YWN0aXZlPTB9L1swLTldKzpbMC05XSsve2Rl dj0xfS9BL3tpZiAoZGV2ID09IDEpIGFjdGl2ZSsrOyBkZXY9MH0gRU5EeyBwcmludCBhY3Rp dmUgfScpCiAgICAgIGlmIFsgJG51bSAtZXEgMCBdIDsgdGhlbgogICAgICAgIHJlbW92ZT0i JHJlbW92ZSAkbXBhdGgiCiAgICAgIGZpCiAgICBkb25lCiAgZWxzZQogICAgcmVtb3ZlPSIk bXBhdGhzIgogIGZpCgogIGZvciBtcGF0aCBpbiAkcmVtb3ZlIDsgZG8KICAgIGk9MAogICAg ZWNobyAtbiAiRmx1c2hpbmcgbXVsdGlwYXRoIGRldmljZSAkbXBhdGguLi4gIgogICAgd2hp bGUgWyAkaSAtbHQgJGZsdXNoX3JldHJpZXMgXSA7IGRvCiAgICAgICRETVNFVFVQIG1lc3Nh Z2UgJG1wYXRoIDAgZmFpbF9pZl9ub19wYXRoID4gL2Rldi9udWxsIDI+JjEKICAgICAgJE1V TFRJUEFUSCAtZiAkbXBhdGggPiAvZGV2L251bGwgMj4mMQogICAgICBpZiB0ZXN0ICIkPyIg PSAiMCIgOyB0aGVuCiAgICAgICAgZWNobyAiRG9uZSAoJGkgcmV0cmllcykiCiAgICAgICAg YnJlYWsKICAgICAgZWxpZiB0ZXN0ICRpIC1lcSAkZmx1c2hfcmV0cmllcyA7IHRoZW4KICAg ICAgICBlY2hvICJGYWlsIgogICAgICBmaQogICAgICBzbGVlcCAwLjAyCiAgICAgIGxldCBp PSRpKzEKICAgIGRvbmUKICBkb25lCn0KCgojIEZpbmQgcmVzaXplZCBsdW5zCmZpbmRyZXNp emVkKCkKewogIGxvY2FsIGRldnM9CiAgbG9jYWwgc2l6ZT0KICBsb2NhbCBuZXdfc2l6ZT0K ICBsb2NhbCBzeXNmc19wYXRoPQogIGxvY2FsIHNkZGV2PQogIGxvY2FsIGk9CiAgbG9jYWwg bT0KICBsb2NhbCBtcGF0aHNpemU9CiAgZGVjbGFyZSAtYSBtcGF0aHNpemVzCgogIGlmIFsg LXogIiRsdW5zZWFyY2giIF0gOyB0aGVuCiAgICBkZXZzPWBscyAvc3lzL2NsYXNzL3Njc2lf ZGV2aWNlL2AKICBlbHNlCiAgICBmb3IgbHVuIGluICRsdW5zZWFyY2ggOyBkbwogICAgICBk ZXZzPSIkZGV2cyBgKGNkIC9zeXMvY2xhc3Mvc2NzaV9kZXZpY2UvICYmIGxzIC1kICo6JHts dW59KWAiCiAgICBkb25lCiAgZmkKCiAgZm9yIGhjdGwgaW4gJGRldnMgOyBkbwogICAgc3lz ZnNfcGF0aD0iL3N5cy9jbGFzcy9zY3NpX2RldmljZS8kaGN0bC9kZXZpY2UiCiAgICBpZiBb IC1kICIkc3lzZnNfcGF0aC9ibG9jayIgXSA7IHRoZW4KICAgICAgc2RkZXY9YGxzICRzeXNm c19wYXRoL2Jsb2NrYAogICAgICBzaXplPWBjYXQgJHN5c2ZzX3BhdGgvYmxvY2svJHNkZGV2 L3NpemVgCgogICAgICBlY2hvIDEgPiAkc3lzZnNfcGF0aC9yZXNjYW4KICAgICAgbmV3X3Np emU9YGNhdCAkc3lzZnNfcGF0aC9ibG9jay8kc2RkZXYvc2l6ZWAKCiAgICAgIGlmIFsgIiRz aXplIiAhPSAiJG5ld19zaXplIiBdICYmIFsgIiRzaXplIiAhPSAiMCIgXSAmJiBbICIkbmV3 X3NpemUiICE9ICIwIiBdIDsgdGhlbgogICAgICAgIHByaW50ZiAiJHt5ZWxsb3d9UkVTSVpF RDogJG5vcm0iCiAgICAgICAgaG9zdD1gZWNobyAkaGN0bCB8IGN1dCAtZCI6IiAtZjFgCiAg ICAgICAgY2hhbm5lbD1gZWNobyAkaGN0bCB8IGN1dCAtZCI6IiAtZjJgCiAgICAgICAgaWQ9 YGVjaG8gJGhjdGwgfCBjdXQgLWQiOiIgLWYzYAogICAgICAgIGx1bj1gZWNobyAkaGN0bCB8 IGN1dCAtZCI6IiAtZjRgCgogICAgICAgIHByb2NzY3Npc2NzaQogICAgICAgIGVjaG8gIiRT Q1NJU1RSIgogICAgICAgIGluY3JjaGdkICIkaGN0bCIKICAgICAgZmkKICAgIGZpCiAgZG9u ZQoKICBpZiB0ZXN0IC1uICIkbXBfZW5hYmxlIiAtYSAtbiAiJG1wYXRocyIgOyB0aGVuCiAg ICBpPTAKICAgIGZvciBtIGluICRtcGF0aHMgOyBkbwogICAgICBtcGF0aHNpemVzWyRpXT0i YCRNVUxUSVBBVEggLWwgJG0gfCBlZ3JlcCAtbyBbMC05XSsuWzAtOV0rW0tNR1RdYCIKICAg ICAgbGV0IGk9JGkrMQogICAgZG9uZQogICAgcmVzaXplbXBhdGhzCiAgICBpPTAKICAgIGZv ciBtIGluICRtcGF0aHMgOyBkbwogICAgICBtcGF0aHNpemU9ImAkTVVMVElQQVRIIC1sICRt IHwgZWdyZXAgLW8gWzAtOVwuXStbS01HVF1gIgogICAgICBlY2hvICIkbSAke21wYXRoc2l6 ZXNbJGldfSA9PiAkbXBhdGhzaXplIgogICAgICBsZXQgaT0kaSsxCiAgICBkb25lCiAgZmkK fQoKRk9VTkRERVZTPSIiCkNIR0RFVlM9IiIKUk1WRERFVlM9IiIKCiMgbWFpbgppZiB0ZXN0 IEAkMSA9IEAtLWhlbHAgLW8gQCQxID0gQC1oIC1vIEAkMSA9IEAtPzsgdGhlbgogICAgZWNo byAiVXNhZ2U6IHJlc2Nhbi1zY3NpLWJ1cy5zaCBbb3B0aW9uc10gW2hvc3QgW2hvc3QgLi4u XV0iCiAgICBlY2hvICJPcHRpb25zOiIKICAgIGVjaG8gIiAtYSAgICAgIHNjYW4gYWxsIHRh cmdldHMsIG5vdCBqdXN0IGN1cnJlbnRseSBleGlzdGluZyBbZGVmYXVsdDogZGlzYWJsZWRd IgogICAgZWNobyAiIC1jICAgICAgZW5hYmxlcyBzY2FubmluZyBvZiBjaGFubmVscyAwIDEg ICBbZGVmYXVsdDogMCAvIGFsbCBkZXRlY3RlZCBvbmVzXSIKICAgIGVjaG8gIiAtZCAgICAg IGVuYWJsZSBkZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHQ6IDBdIgogICAg ZWNobyAiIC1mICAgICAgZmx1c2ggZmFpbGVkIG11bHRpcGF0aCBkZXZpY2VzICAgICBbZGVm YXVsdDogZGlzYWJsZWRdIgogICAgZWNobyAiIC1oICAgICAgaGVscDogcHJpbnQgdGhpcyB1 c2FnZSBtZXNzYWdlIHRoZW4gZXhpdCIKICAgIGVjaG8gIiAtaSAgICAgIGlzc3VlIGEgRmli cmVDaGFubmVsIExJUCByZXNldCAgICAgW2RlZmF1bHQ6IGRpc2FibGVkXSIKICAgIGVjaG8g IiAtSSBTRUNTIGlzc3VlIGEgRmlicmVDaGFubmVsIExJUCByZXNldCBhbmQgd2FpdCBmb3Ig U0VDUyBzZWNvbmRzIFtkZWZhdWx0OiBkaXNhYmxlZF0iCiAgICBlY2hvICIgLWwgICAgICBh Y3RpdmF0ZXMgc2Nhbm5pbmcgZm9yIExVTnMgMC0tNyAgIFtkZWZhdWx0OiAwXSIKICAgIGVj aG8gIiAtTCBOVU0gIGFjdGl2YXRlcyBzY2FubmluZyBmb3IgTFVOcyAwLS1OVU0gW2RlZmF1 bHQ6IDBdIgogICAgZWNobyAiIC1tICAgICAgdXBkYXRlIG11bHRpcGF0aCBkZXZpY2VzICAg ICAgICAgICBbZGVmYXVsdDogZGlzYWJsZWRdIgogICAgZWNobyAiIC1yICAgICAgZW5hYmxl cyByZW1vdmluZyBvZiBkZXZpY2VzICAgICAgICBbZGVmYXVsdDogZGlzYWJsZWRdIgogICAg ZWNobyAiIC1zICAgICAgbG9vayBmb3IgcmVzaXplZCBkaXNrcyBhbmQgcmVsb2FkIGFzc29j aWF0ZWQgbXVsdGlwYXRoIGRldmljZXMsIGlmIGFwcGxpY2FibGUiCiAgICBlY2hvICIgLXUg ICAgICBsb29rIGZvciBleGlzdGluZyBkaXNrcyB0aGF0IGhhdmUgYmVlbiByZW1hcHBlZCIK ICAgIGVjaG8gIiAtViAgICAgIHByaW50IHZlcnNpb24gZGF0ZSB0aGVuIGV4aXQiCiAgICBl Y2hvICIgLXcgICAgICBzY2FuIGZvciB0YXJnZXQgZGV2aWNlIElEcyAwLS0xNSAgIFtkZWZh dWx0OiAwLS03XSIKICAgIGVjaG8gIi0tYWxsdGFyZ2V0czogICAgc2FtZSBhcyAtYSIKICAg IGVjaG8gIi0tYXR0YWNocHEzOiAgICAgVGVsbCBrZXJuZWwgdG8gYXR0YWNoIHNnIHRvIExV TiAwIHRoYXQgcmVwb3J0cyBQUT0zIgogICAgZWNobyAiLS1jaGFubmVscz1MSVNUOiBTY2Fu IG9ubHkgY2hhbm5lbChzKSBpbiBMSVNUIgogICAgZWNobyAiLS1jb2xvcjogICAgICAgICB1 c2UgY29sb3VyZWQgcHJlZml4ZXMgT0xEL05FVy9ERUwiCiAgICBlY2hvICItLWZsdXNoOiAg ICAgICAgIHNhbWUgYXMgLWYiCiAgICBlY2hvICItLWZvcmNlcmVtb3ZlOiAgIFJlbW92ZSBz dGFsZSBkZXZpY2VzIChEQU5HRVJPVVMpIgogICAgZWNobyAiLS1mb3JjZXJlc2NhbjogICBS ZW1vdmUgYW5kIHJlYWRkIGV4aXN0aW5nIGRldmljZXMgKERBTkdFUk9VUykiCiAgICBlY2hv ICItLWhlbHA6ICAgICAgICAgIHByaW50IHRoaXMgdXNhZ2UgbWVzc2FnZSB0aGVuIGV4aXQi CiAgICBlY2hvICItLWhvc3RzPUxJU1Q6ICAgIFNjYW4gb25seSBob3N0KHMpIGluIExJU1Qi CiAgICBlY2hvICItLWlkcz1MSVNUOiAgICAgIFNjYW4gb25seSB0YXJnZXQgSUQocykgaW4g TElTVCIKICAgIGVjaG8gIi0taXNzdWUtbGlwOiAgICAgc2FtZSBhcyAtaSIKICAgIGVjaG8g Ii0taXNzdWUtbGlwLXdhaXQ9U0VDUzogICAgIHNhbWUgYXMgLUkiCiAgICBlY2hvICItLWxh cmdlbHVuOiAgICAgIFRlbGwga2VybmVsIHRvIHN1cHBvcnQgTFVOcyA+IDcgZXZlbiBvbiBT Q1NJMiBkZXZzIgogICAgZWNobyAiLS1sdW5zPUxJU1Q6ICAgICBTY2FuIG9ubHkgbHVuKHMp IGluIExJU1QiICAKICAgIGVjaG8gIi0tbXVsdGlwYXRoOiAgICAgc2FtZSBhcyAtbSIKICAg IGVjaG8gIi0tbm9vcHRzY2FuOiAgICAgZG9uJ3Qgc3RvcCBsb29raW5nIGZvciBMVU5zIGlz IDAgaXMgbm90IGZvdW5kIgogICAgZWNobyAiLS1yZW1vdmU6ICAgICAgICBzYW1lIGFzIC1y IgogICAgZWNobyAiLS1yZXBvcnRsdW4yOiAgICBUZWxsIGtlcm5lbCB0byB0cnkgUkVQT1JU X0xVTiBldmVuIG9uIFNDU0kyIGRldmljZXMiCiAgICBlY2hvICItLXJlc2l6ZTogICAgICAg IHNhbWUgYXMgLXMiCiAgICBlY2hvICItLXNwYXJzZWx1bjogICAgIFRlbGwga2VybmVsIHRv IHN1cHBvcnQgc3BhcnNlIExVTiBudW1iZXJpbmciCiAgICBlY2hvICItLXN5bmMvbm9zeW5j OiAgIElzc3VlIGEgc3luYyAvIG5vIHN5bmMgW2RlZmF1bHQ6IHN5bmMgaWYgcmVtb3ZlXSIK ICAgIGVjaG8gIi0tdXBkYXRlOiAgICAgICAgc2FtZSBhcyAtdSIKICAgIGVjaG8gIi0tdmVy c2lvbjogICAgICAgc2FtZSBhcyAtViIKICAgIGVjaG8gIi0td2lkZTogICAgICAgICAgc2Ft ZSBhcyAtdyIKICAgIGVjaG8gIi0taWdub3JlLXJldjogICAgSWdub3JlIHRoZSByZXZpc2lv biBjaGFuZ2UiCiAgICBlY2hvICIiCiAgICBlY2hvICJIb3N0IG51bWJlcnMgbWF5IHRodXMg YmUgc3BlY2lmaWVkIGVpdGhlciBkaXJlY3RseSBvbiBjbWQgbGluZSAoZGVwcmVjYXRlZCki CiAgICBlY2hvICJvciB3aXRoIHRoZSAtLWhvc3RzPUxJU1QgcGFyYW1ldGVyIChyZWNvbW1l bmRlZCkuIgogICAgZWNobyAiTElTVDogQVstQl1bLENbLURdXS4uLiBpcyBhIGNvbW1hIHNl cGFyYXRlZCBsaXN0IG9mIHNpbmdsZSB2YWx1ZXMgYW5kIHJhbmdlcyIKICAgIGVjaG8gIihO byBzcGFjZXMgYWxsb3dlZC4pIgogICAgZXhpdCAwCmZpCgppZiB0ZXN0IEAkMSA9IEAtLXZl cnNpb24gLW8gQCQxID0gQC1WIDsgdGhlbgogICAgZWNobyAke1ZFUlNJT059CiAgICBleGl0 IDAKZmkKCmlmIHRlc3QgISAtZCAvc3lzL2NsYXNzL3Njc2lfaG9zdC8gLWEgISAtZCAvcHJv Yy9zY3NpLzsgdGhlbgogIGVjaG8gIkVycm9yOiBTQ1NJIHN1YnN5c3RlbSBub3QgYWN0aXZl IgogIGV4aXQgMQpmaQoKIyBNYWtlIHN1cmUgc2cgaXMgdGhlcmUKbW9kcHJvYmUgc2cgPi9k ZXYvbnVsbCAyPiYxCgppZiB0ZXN0IC14IC91c3IvYmluL3NnX2lucTsgdGhlbgogIHNnX3Zl cnNpb249JChzZ19pbnEgLVYgMj4mMSB8IGN1dCAtZCAiICIgLWYgMykKICBpZiB0ZXN0IC1u ICIkc2dfdmVyc2lvbiI7IHRoZW4KICAgIHNnX3Zlcl9tYWo9JHtzZ192ZXJzaW9uOjA6MX0K ICAgIHNnX3ZlcnNpb249JHtzZ192ZXJzaW9uIyM/Ln0KICAgIGxldCBzZ192ZXJzaW9uKz0k KCgxMDAqJHNnX3Zlcl9tYWopKQogIGZpCiAgc2dfdmVyc2lvbj0ke3NnX3ZlcnNpb24jIzAu fQogICNlY2hvICJcIiRzZ192ZXJzaW9uXCIiCiAgaWYgWyAteiAiJHNnX3ZlcnNpb24iIC1v ICIkc2dfdmVyc2lvbiIgLWx0IDcwIF0gOyB0aGVuCiAgICBzZ19sZW5fYXJnPSItMzYiCiAg ZWxzZQogICAgc2dfbGVuX2FyZz0iLS1sZW49MzYiCiAgZmkKZWxzZQogIGVjaG8gIldBUk46 IC91c3IvYmluL3NnX2lucSBub3QgcHJlc2VudCAtLSBwbGVhc2UgaW5zdGFsbCBzZzNfdXRp bHMiCiAgZWNobyAiIG9yIHJlc2Nhbi1zY3NpLWJ1cy5zaCBtaWdodCBub3QgZnVsbHkgd29y ay4iICAgICAKZmkgICAgCgojIGRlZmF1bHRzCnVuc2V0Y29sb3IKZGVidWc9MApsdW5zZWFy Y2g9Cm9wdF9pZHNlYXJjaD1gc2VxIDAgN2AKZmlsdGVyX2lkcz0wCm9wdF9jaGFubmVsc2Vh cmNoPQpyZW1vdmU9CnVwZGF0ZWQ9MAp1cGRhdGU9MApyZXNpemU9MApmb3JjZXJlbW92ZT0K b3B0c2Nhbj0xCnN5bmM9MQpleGlzdGluZ190YXJnZXRzPTEKbXBfZW5hYmxlPQpsaXByZXNl dD0tMQpkZWNsYXJlIC1pIHNjYW5fZmxhZ3M9MAppZ25vcmVfcmV2PTAKCiMgU2NhbiBvcHRp b25zCm9wdD0iJDEiCndoaWxlIHRlc3QgISAteiAiJG9wdCIgLWEgLXogIiR7b3B0IyMtKn0i OyBkbwogIG9wdD0ke29wdCMtfQogIGNhc2UgIiRvcHQiIGluCiAgICBhKSBleGlzdGluZ190 YXJnZXRzPTs7ICAjU2NhbiBBTEwgdGFyZ2V0cyB3aGVuIHNwZWNpZmllZAogICAgZCkgZGVi dWc9MSA7OwogICAgZikgZmx1c2g9MSA7OwogICAgbCkgbHVuc2VhcmNoPWBzZXEgMCA3YCA7 OwogICAgTCkgbHVuc2VhcmNoPWBzZXEgMCAkMmA7IHNoaWZ0IDs7CiAgICBtKSBtcF9lbmFi bGU9MSA7OwogICAgdykgb3B0X2lkc2VhcmNoPWBzZXEgMCAxNWAgOzsKICAgIGMpIG9wdF9j aGFubmVsc2VhcmNoPSIwIDEiIDs7CiAgICByKSByZW1vdmU9MSA7OwogICAgcykgcmVzaXpl PTE7IG1wX2VuYWJsZT0xIDs7CiAgICBpKSBsaXByZXNldD0wIDs7CiAgICBJKSBzaGlmdDsg bGlwcmVzZXQ9JG9wdCA7OwogICAgdSkgdXBkYXRlPTEgOzsKICAgIC1hbGx0YXJnZXRzKSAg ZXhpc3RpbmdfdGFyZ2V0cz07OwogICAgLWZsdXNoKSAgICAgICBmbHVzaD0xIDs7CiAgICAt cmVtb3ZlKSAgICAgIHJlbW92ZT0xIDs7CiAgICAtZm9yY2VyZXNjYW4pIHJlbW92ZT0xOyBm b3JjZXJlc2Nhbj0xIDs7CiAgICAtZm9yY2VyZW1vdmUpIHJlbW92ZT0xOyBmb3JjZXJlbW92 ZT0xIDs7CiAgICAtaG9zdHM9KikgICAgIGFyZz0ke29wdCMtaG9zdHM9fTsgICBob3N0cz1g ZXhwYW5kbGlzdCAkYXJnYCA7OwogICAgLWNoYW5uZWxzPSopICBhcmc9JHtvcHQjLWNoYW5u ZWxzPX07b3B0X2NoYW5uZWxzZWFyY2g9YGV4cGFuZGxpc3QgJGFyZ2AgOzsgCiAgICAtaWRz PSopICAgYXJnPSR7b3B0Iy1pZHM9fTsgICAgICAgICBvcHRfaWRzZWFyY2g9YGV4cGFuZGxp c3QgJGFyZ2AgOyBmaWx0ZXJfaWRzPTE7OwogICAgLWx1bnM9KikgIGFyZz0ke29wdCMtbHVu cz19OyAgICAgICAgbHVuc2VhcmNoPWBleHBhbmRsaXN0ICRhcmdgIDs7IAogICAgLWNvbG9y KSBzZXRjb2xvciA7OwogICAgLW5vb3B0c2Nhbikgb3B0c2Nhbj0wIDs7CiAgICAtaXNzdWUt bGlwKSBsaXByZXNldD0wIDs7CiAgICAtaXNzdWUtbGlwLXdhaXQpIGxpcHJlc2V0PSR7b3B0 Iy1pc3N1ZS1saXAtd2FpdD19OzsKICAgIC1zeW5jKSBzeW5jPTIgOzsKICAgIC1ub3N5bmMp IHN5bmM9MCA7OwogICAgLW11bHRpcGF0aCkgbXBfZW5hYmxlPTEgOzsKICAgIC1hdHRhY2hw cTMpIHNjYW5fZmxhZ3M9JCgoJHNjYW5fZmxhZ3N8MHgxMDAwMDAwKSkgOzsKICAgIC1yZXBv cnRsdW4yKSBzY2FuX2ZsYWdzPSQoKCRzY2FuX2ZsYWdzfDB4MjAwMDApKSA7OwogICAgLXJl c2l6ZSkgcmVzaXplPTE7OwogICAgLWxhcmdlbHVuKSBzY2FuX2ZsYWdzPSQoKCRzY2FuX2Zs YWdzfDB4MjAwKSkgOzsKICAgIC1zcGFyc2VsdW4pIHNjYW5fZmxhZ3M9JCgoc2Nhbl9mbGFn c3wweDQwKSkgOzsKICAgIC11cGRhdGUpIHVwZGF0ZT0xOzsKICAgIC13aWRlKSBvcHRfaWRz ZWFyY2g9YHNlcSAwIDE1YCA7OwogICAgLWlnbm9yZS1yZXYpIGlnbm9yZV9yZXY9MTs7CiAg ICAqKSBlY2hvICJVbmtub3duIG9wdGlvbiAtJG9wdCAhIiA7OwogIGVzYWMKICBzaGlmdAog IG9wdD0iJDEiCmRvbmUgICAgCgppZiBbIC16ICIkaG9zdHMiIF0gOyB0aGVuCiAgaWYgdGVz dCAtZCAvc3lzL2NsYXNzL3Njc2lfaG9zdDsgdGhlbiAKICAgIGZpbmRob3N0c18yNgogIGVs c2UgIAogICAgZmluZGhvc3RzCiAgZmkgIApmaQoKaWYgWyAtZCAvc3lzL2NsYXNzL3Njc2lf aG9zdCAtYSAhIC13IC9zeXMvY2xhc3Mvc2NzaV9ob3N0IF07IHRoZW4KICBlY2hvICJZb3Ug bmVlZCB0byBydW4gc2NzaS1yZXNjYW4tYnVzLnNoIGFzIHJvb3QiCiAgZXhpdCAyCmZpICAK aWYgdGVzdCAiJHN5bmMiID0gMSAtYSAiJHJlbW92ZSIgPSAxOyB0aGVuIHN5bmM9MjsgZmkK aWYgdGVzdCAiJHN5bmMiID0gMjsgdGhlbiBlY2hvICJTeW5jaW5nIGZpbGUgc3lzdGVtcyI7 IHN5bmM7IGZpCmlmIHRlc3QgLXcgL3N5cy9tb2R1bGUvc2NzaV9tb2QvcGFyYW1ldGVycy9k ZWZhdWx0X2Rldl9mbGFncyAtYSAkc2Nhbl9mbGFncyAhPSAwOyB0aGVuCiAgT0xEX1NDQU5G TEFHUz1gY2F0IC9zeXMvbW9kdWxlL3Njc2lfbW9kL3BhcmFtZXRlcnMvZGVmYXVsdF9kZXZf ZmxhZ3NgCiAgTkVXX1NDQU5GTEFHUz0kKCgkT0xEX1NDQU5GTEFHU3wkc2Nhbl9mbGFncykp CiAgaWYgdGVzdCAiJE9MRF9TQ0FORkxBR1MiICE9ICIkTkVXX1NDQU5GTEFHUyI7IHRoZW4K ICAgIGVjaG8gLW4gIlRlbXBvcmFyaWx5IHNldHRpbmcga2VybmVsIHNjYW5uaW5nIGZsYWdz IGZyb20gIgogICAgcHJpbnRmICIweCUwOHggdG8gMHglMDh4XG4iICRPTERfU0NBTkZMQUdT ICRORVdfU0NBTkZMQUdTCiAgICBlY2hvICRORVdfU0NBTkZMQUdTID4gL3N5cy9tb2R1bGUv c2NzaV9tb2QvcGFyYW1ldGVycy9kZWZhdWx0X2Rldl9mbGFncwogIGVsc2UKICAgIHVuc2V0 IE9MRF9TQ0FORkxBR1MKICBmaQpmaSAgCkRNU0VUVVA9JCh3aGljaCBkbXNldHVwKQpbIC16 ICIkRE1TRVRVUCIgXSAmJiBmbHVzaD0gJiYgbXBfZW5hYmxlPQpNVUxUSVBBVEg9JCh3aGlj aCBtdWx0aXBhdGgpClsgLXogIiRNVUxUSVBBVEgiIF0gJiYgZmx1c2g9ICYmIG1wX2VuYWJs ZT0KCmVjaG8gLW4gIlNjYW5uaW5nIFNDU0kgc3Vic3lzdGVtIGZvciBuZXcgZGV2aWNlcyIK dGVzdCAteiAiJGZsdXNoIiB8fCBlY2hvIC1uICIsIGZsdXNoIGZhaWxlZCBtdWx0aXBhdGgg ZGV2aWNlcywiCnRlc3QgLXogIiRyZW1vdmUiIHx8IGVjaG8gLW4gIiBhbmQgcmVtb3ZlIGRl dmljZXMgdGhhdCBoYXZlIGRpc2FwcGVhcmVkIgplY2hvCmRlY2xhcmUgLWkgZm91bmQ9MApk ZWNsYXJlIC1pIHVwZGF0ZWQ9MApkZWNsYXJlIC1pIHJtdmQ9MAoKaWYgWyAtbiAiJGZsdXNo IiBdIDsgdGhlbgogIGlmIFsgLXggIiRNVUxUSVBBVEgiIF0gOyB0aGVuCiAgICBmbHVzaG1w YXRocyAxCiAgZmkKZmkKCiMgVXBkYXRlIGV4aXN0aW5nIG1hcHBpbmdzCmlmIFsgJHVwZGF0 ZSAtZXEgMSBdIDsgdGhlbgogIGVjaG8gIlNlYXJjaGluZyBmb3IgcmVtYXBwZWQgTFVOcyIK ICBmaW5kcmVtYXBwZWQKICAjIElmIHlvdSd2ZSBjaGFuZ2VkIHRoZSBtYXBwaW5nLCB0aGVy ZSdzIGEgY2hhbmNlIGl0J3MgYSBkaWZmZXJlbnQgc2l6ZQogIG1wYXRocz0iIgogIGZpbmRy ZXNpemVkCiMgU2VhcmNoIGZvciByZXNpemVkIExVTnMKZWxpZiBbICRyZXNpemUgLWVxIDEg XSA7IHRoZW4KICBlY2hvICJTZWFyY2hpbmcgZm9yIHJlc2l6ZWQgTFVOcyIKICBmaW5kcmVz aXplZAojIE5vcm1hbCByZXNjYW4gbW9kZQplbHNlCiAgZm9yIGhvc3QgaW4gJGhvc3RzOyBk bwogIGVjaG8gLW4gIlNjYW5uaW5nIGhvc3QgJGhvc3QgIgogIGlmIHRlc3QgLWUgL3N5cy9j bGFzcy9mY19ob3N0L2hvc3QkaG9zdCA7IHRoZW4KICAgICMgSXQncyBwb2ludGxlc3MgdG8g ZG8gYSB0YXJnZXQgc2NhbiBvbiBGQwogICAgaXNzdWVfbGlwPS9zeXMvY2xhc3MvZmNfaG9z dC9ob3N0JGhvc3QvaXNzdWVfbGlwCiAgICBpZiB0ZXN0IC1lICRpc3N1ZV9saXAgLWEgJGxp cHJlc2V0IC1nZSAwIDsgdGhlbgogICAgICBlY2hvIDEgPiAkaXNzdWVfbGlwIDI+IC9kZXYv bnVsbDsKICAgICAgdWRldmFkbV9zZXR0bGUKICAgICAgWyAkbGlwcmVzZXQgLWd0IDAgXSAm JiBzbGVlcCAkbGlwcmVzZXQKICAgIGZpCiAgICBjaGFubmVsc2VhcmNoPQogICAgaWRzZWFy Y2g9CiAgZWxzZQogICAgY2hhbm5lbHNlYXJjaD0kb3B0X2NoYW5uZWxzZWFyY2gKICAgIGlk c2VhcmNoPSRvcHRfaWRzZWFyY2gKICBmaQogIFsgLW4gIiRjaGFubmVsc2VhcmNoIiBdICYm IGVjaG8gLW4gImNoYW5uZWxzICRjaGFubmVsc2VhcmNoICIKICBlY2hvIC1uICJmb3IgIgog IGlmIFsgLW4gIiRpZHNlYXJjaCIgXSA7IHRoZW4KICAgIGVjaG8gLW4gIiBTQ1NJIHRhcmdl dCBJRHMgIiAkaWRzZWFyY2gKICBlbHNlCiAgICBlY2hvIC1uICIgYWxsIFNDU0kgdGFyZ2V0 IElEcyIKICBmaQogIGlmIFsgLW4gIiRsdW5zZWFyY2giIF0gOyB0aGVuCiAgICBlY2hvICIs IExVTnMgIiAkbHVuc2VhcmNoCiAgZWxzZQogICAgZWNobyAiLCBhbGwgTFVOcyIKICBmaQoK ICBpZiBbIC1uICIkZXhpc3RpbmdfdGFyZ2V0cyIgXSA7IHRoZW4KICAgIHNlYXJjaGV4aXN0 aW5nCiAgZWxzZQogICAgZG9zZWFyY2gKICBmaQogIGRvbmUKICBpZiB0ZXN0IC1uICIkT0xE X1NDQU5GTEFHUyI7IHRoZW4KICAgIGVjaG8gJE9MRF9TQ0FORkxBR1MgPiAvc3lzL21vZHVs ZS9zY3NpX21vZC9wYXJhbWV0ZXJzL2RlZmF1bHRfZGV2X2ZsYWdzCiAgZmkKZmkKCmxldCBy bXZkX2ZvdW5kPSRybXZkKyRmb3VuZAppZiB0ZXN0IC1uICIkbXBfZW5hYmxlIiAtYSAkcm12 ZF9mb3VuZCAtZ3QgMCA7IHRoZW4KICBlY2hvICJBdHRlbXB0aW5nIHRvIHVwZGF0ZSBtdWx0 aXBhdGggZGV2aWNlcy4uLiIKICBpZiB0ZXN0ICRybXZkIC1ndCAwIDsgdGhlbgogICAgdWRl dmFkbV9zZXR0bGUKICAgIGVjaG8gIlJlbW92aW5nIG11bHRpcGF0aCBtYXBwaW5ncyBmb3Ig cmVtb3ZlZCBkZXZpY2VzIGlmIGFsbCBwYXRocyBhcmUgbm93IGZhaWxlZC4uLiAiCiAgICBm bHVzaG1wYXRocyAxCiAgZmkKICBpZiB0ZXN0ICRmb3VuZCAtZ3QgMCA7IHRoZW4KICAgIC9z YmluL3VkZXZhZG0gdHJpZ2dlciAtLXN5c25hbWUtbWF0Y2g9c2QqCiAgICB1ZGV2YWRtX3Nl dHRsZQogICAgaWYgWyAteCAiJE1VTFRJUEFUSCIgXSA7IHRoZW4KICAgICAgZWNobyAiVHJ5 aW5nIHRvIGRpc2NvdmVyIG5ldyBtdWx0aXBhdGggbWFwcGluZ3MgZm9yIG5ld2x5IGRpc2Nv dmVyZWQgZGV2aWNlcy4uLiAiCiAgICAgICRNVUxUSVBBVEggfCBncmVwICJjcmVhdGU6IiAy PiAvZGV2L251bGwKICAgIGZpCiAgZmkgCmZpCgplY2hvICIkZm91bmQgbmV3IG9yIGNoYW5n ZWQgZGV2aWNlKHMpIGZvdW5kLiAgICAgICAgICAiCmlmIHRlc3QgISAteiAiJEZPVU5EREVW UyIgOyB0aGVuCiAgcHJpbnRmICIkRk9VTkRERVZTIgpmaQplY2hvICIkdXBkYXRlZCByZW1h cHBlZCBvciByZXNpemVkIGRldmljZShzKSBmb3VuZC4iCmlmIHRlc3QgISAteiAiJENIR0RF VlMiIDsgdGhlbgogIHByaW50ZiAiJENIR0RFVlMiCmZpCmVjaG8gIiRybXZkIGRldmljZShz KSByZW1vdmVkLiAgICAgICAgICAgICAgICAgIgppZiB0ZXN0ICEgLXogIiRSTVZEREVWUyIg OyB0aGVuCiAgcHJpbnRmICIkUk1WRERFVlMiCmZpCgojIExvY2FsIFZhcmlhYmxlczoKIyBz aC1iYXNpYy1vZmZzZXQ6IDIKIyBFbmQ6Cgo= --------------0EFA82BEA718DE1AA1245638 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --------------0EFA82BEA718DE1AA1245638--