U29tZSB3YXJuaW5ncywgZmlyc3QuCgogKiBCSUcgRkFUIFdBUk5JTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIElmIHlvdSB0b3VjaCBhbnl0aGluZyBvbiBkaXNrIGJldHdlZW4gc3VzcGVuZCBhbmQgcmVzdW1lLi4uCiAqCQkJCS4uLmtpc3MgeW91ciBkYXRhIGdvb2RieWUuCiAqCiAqIElmIHlvdSBkbyByZXN1bWUgZnJvbSBpbml0cmQgYWZ0ZXIgeW91ciBmaWxlc3lzdGVtcyBhcmUgbW91bnRlZC4uLgogKgkJCQkuLi5ieWUgYnllIHJvb3QgcGFydGl0aW9uLgogKgkJCVt0aGlzIGlzIGFjdHVhbGx5IHNhbWUgY2FzZSBhcyBhYm92ZV0KICoKICogSWYgeW91IGhhdmUgdW5zdXBwb3J0ZWQgKCopIGRldmljZXMgdXNpbmcgRE1BLCB5b3UgbWF5IGhhdmUgc29tZQogKiBwcm9ibGVtcy4gSWYgeW91ciBkaXNrIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHN1c3BlbmQuLi4gKElERSBkb2VzKSwKICogaXQgbWF5IGNhdXNlIHNvbWUgcHJvYmxlbXMsIHRvby4gSWYgeW91IGNoYW5nZSBrZXJuZWwgY29tbWFuZCBsaW5lCiAqIGJldHdlZW4gc3VzcGVuZCBhbmQgcmVzdW1lLCBpdCBtYXkgZG8gc29tZXRoaW5nIHdyb25nLiBJZiB5b3UgY2hhbmdlCiAqIHlvdXIgaGFyZHdhcmUgd2hpbGUgc3lzdGVtIGlzIHN1c3BlbmRlZC4uLiB3ZWxsLCBpdCB3YXMgbm90IGdvb2QgaWRlYTsKICogYnV0IGl0IHdpbGwgcHJvYmFibHkgb25seSBjcmFzaC4KICoKICogKCopIHN1c3BlbmQvcmVzdW1lIHN1cHBvcnQgaXMgbmVlZGVkIHRvIG1ha2UgaXQgc2FmZS4KICoKICogSWYgeW91IGhhdmUgYW55IGZpbGVzeXN0ZW1zIG9uIFVTQiBkZXZpY2VzIG1vdW50ZWQgYmVmb3JlIHNvZnR3YXJlIHN1c3BlbmQsCiAqIHRoZXkgd29uJ3QgYmUgYWNjZXNzaWJsZSBhZnRlciByZXN1bWUgYW5kIHlvdSBtYXkgbG9zZSBkYXRhLCBhcyB0aG91Z2gKICogeW91IGhhdmUgdW5wbHVnZ2VkIHRoZSBVU0IgZGV2aWNlcyB3aXRoIG1vdW50ZWQgZmlsZXN5c3RlbXMgb24gdGhlbTsKICogc2VlIHRoZSBGQVEgYmVsb3cgZm9yIGRldGFpbHMuICAoVGhpcyBpcyBub3QgdHJ1ZSBmb3IgbW9yZSB0cmFkaXRpb25hbAogKiBwb3dlciBzdGF0ZXMgbGlrZSAic3RhbmRieSIsIHdoaWNoIG5vcm1hbGx5IGRvbid0IHR1cm4gVVNCIG9mZi4pCgpZb3UgbmVlZCB0byBhcHBlbmQgcmVzdW1lPS9kZXYveW91cl9zd2FwX3BhcnRpdGlvbiB0byBrZXJuZWwgY29tbWFuZApsaW5lLiBUaGVuIHlvdSBzdXNwZW5kIGJ5CgplY2hvIHNodXRkb3duID4gL3N5cy9wb3dlci9kaXNrOyBlY2hvIGRpc2sgPiAvc3lzL3Bvd2VyL3N0YXRlCgouIElmIHlvdSBmZWVsIEFDUEkgd29ya3MgcHJldHR5IHdlbGwgb24geW91ciBzeXN0ZW0sIHlvdSBtaWdodCB0cnkKCmVjaG8gcGxhdGZvcm0gPiAvc3lzL3Bvd2VyL2Rpc2s7IGVjaG8gZGlzayA+IC9zeXMvcG93ZXIvc3RhdGUKCi4gSWYgeW91IGhhdmUgU0FUQSBkaXNrcywgeW91J2xsIG5lZWQgcmVjZW50IGtlcm5lbHMgd2l0aCBTQVRBIHN1c3BlbmQKc3VwcG9ydC4gRm9yIHN1c3BlbmQgYW5kIHJlc3VtZSB0byB3b3JrLCBtYWtlIHN1cmUgeW91ciBkaXNrIGRyaXZlcnMKYXJlIGJ1aWx0IGludG8ga2VybmVsIC0tIG5vdCBtb2R1bGVzLiBbVGhlcmUncyB3YXkgdG8gbWFrZQpzdXNwZW5kL3Jlc3VtZSB3aXRoIG1vZHVsYXIgZGlzayBkcml2ZXJzLCBzZWUgRkFRLCBidXQgeW91IHByb2JhYmx5CnNob3VsZCBub3QgZG8gdGhhdC5dCgpJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgc3VzcGVuZCBpbWFnZSBzaXplIHRvIE4gYnl0ZXMsIGRvCgplY2hvIE4gPiAvc3lzL3Bvd2VyL2ltYWdlX3NpemUKCmJlZm9yZSBzdXNwZW5kIChpdCBpcyBsaW1pdGVkIHRvIDUwMCBNQiBieSBkZWZhdWx0KS4KCgpBcnRpY2xlIGFib3V0IGdvYWxzIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBTb2Z0d2FyZSBTdXNwZW5kIGZvciBMaW51eAp+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpBdXRob3I6IEeC4WJvciBLdXRpCkxhc3QgcmV2aXNlZDogMjAwMy0xMC0yMCBieSBQYXZlbCBNYWNoZWsKCklkZWEgYW5kIGdvYWxzIHRvIGFjaGlldmUKCk5vd2FkYXlzIGl0IGlzIGNvbW1vbiBpbiBzZXZlcmFsIGxhcHRvcHMgdGhhdCB0aGV5IGhhdmUgYSBzdXNwZW5kIGJ1dHRvbi4gSXQKc2F2ZXMgdGhlIHN0YXRlIG9mIHRoZSBtYWNoaW5lIHRvIGEgZmlsZXN5c3RlbSBvciB0byBhIHBhcnRpdGlvbiBhbmQgc3dpdGNoZXMKdG8gc3RhbmRieSBtb2RlLiBMYXRlciByZXN1bWluZyB0aGUgbWFjaGluZSB0aGUgc2F2ZWQgc3RhdGUgaXMgbG9hZGVkIGJhY2sgdG8KcmFtIGFuZCB0aGUgbWFjaGluZSBjYW4gY29udGludWUgaXRzIHdvcmsuIEl0IGhhcyB0d28gcmVhbCBiZW5lZml0cy4gRmlyc3Qgd2UKc2F2ZSBvdXJzZWx2ZXMgdGhlIHRpbWUgbWFjaGluZSBnb2VzIGRvd24gYW5kIGxhdGVyIGJvb3RzIHVwLCBlbmVyZ3kgY29zdHMKYXJlIHJlYWwgaGlnaCB3aGVuIHJ1bm5pbmcgZnJvbSBiYXR0ZXJpZXMuIFRoZSBvdGhlciBnYWluIGlzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0bwppbnRlcnJ1cHQgb3VyIHByb2dyYW1zIHNvIHByb2Nlc3NlcyB0aGF0IGFyZSBjYWxjdWxhdGluZyBzb21ldGhpbmcgZm9yIGEgbG9uZwp0aW1lIHNob3VsZG4ndCBuZWVkIHRvIGJlIHdyaXR0ZW4gaW50ZXJydXB0aWJsZS4KCnN3c3VzcCBzYXZlcyB0aGUgc3RhdGUgb2YgdGhlIG1hY2hpbmUgaW50byBhY3RpdmUgc3dhcHMgYW5kIHRoZW4gcmVib290cyBvcgpwb3dlcmRvd25zLiAgWW91IG11c3QgZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBzd2FwIHBhcnRpdGlvbiB0byByZXN1bWUgZnJvbSB3aXRoCmBgcmVzdW1lPScnIGtlcm5lbCBvcHRpb24uIElmIHNpZ25hdHVyZSBpcyBmb3VuZCBpdCBsb2FkcyBhbmQgcmVzdG9yZXMgc2F2ZWQKc3RhdGUuIElmIHRoZSBvcHRpb24gYGBub3Jlc3VtZScnIGlzIHNwZWNpZmllZCBhcyBhIGJvb3QgcGFyYW1ldGVyLCBpdCBza2lwcwp0aGUgcmVzdW1pbmcuCgpJbiB0aGUgbWVhbnRpbWUgd2hpbGUgdGhlIHN5c3RlbSBpcyBzdXNwZW5kZWQgeW91IHNob3VsZCBub3QgYWRkL3JlbW92ZSBhbnkKb2YgdGhlIGhhcmR3YXJlLCB3cml0ZSB0byB0aGUgZmlsZXN5c3RlbXMsIGV0Yy4KClNsZWVwIHN0YXRlcyBzdW1tYXJ5Cj09PT09PT09PT09PT09PT09PT09CgpUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGludGVyZmFjZXMgeW91IGNhbiB1c2UsIC9wcm9jL2FjcGkgc2hvdWxkCndvcmsgbGlrZSB0aGlzOgoKSW4gYSByZWFsbHkgcGVyZmVjdCB3b3JsZDoKZWNobyAxID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzdGFuZGJ5CmVjaG8gMiA+IC9wcm9jL2FjcGkvc2xlZXAgICAgICAgIyBmb3Igc3VzcGVuZCB0byByYW0KZWNobyAzID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzdXNwZW5kIHRvIHJhbSwgYnV0IHdpdGggbW9yZSBwb3dlciBjb25zZXJ2YXRpdmUKZWNobyA0ID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzdXNwZW5kIHRvIGRpc2sKZWNobyA1ID4gL3Byb2MvYWNwaS9zbGVlcCAgICAgICAjIGZvciBzaHV0ZG93biB1bmZyaWVuZGx5IHRoZSBzeXN0ZW0KCmFuZCBwZXJoYXBzCmVjaG8gNGIgPiAvcHJvYy9hY3BpL3NsZWVwICAgICAgIyBmb3Igc3VzcGVuZCB0byBkaXNrIHZpYSBzNGJpb3MKCkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpROiB3ZWxsLCBzdXNwZW5kaW5nIGEgc2VydmVyIGlzIElNSE8gYSByZWFsbHkgc3R1cGlkIHRoaW5nLApidXQuLi4gKERpZWdvIFp1Y2NhdG8pOgoKQTogWW91IGJvdWdodCBuZXcgVVBTIGZvciB5b3VyIHNlcnZlci4gSG93IGRvIHlvdSBpbnN0YWxsIGl0IHdpdGhvdXQKYnJpbmdpbmcgbWFjaGluZSBkb3duPyBTdXNwZW5kIHRvIGRpc2ssIHJlYXJyYW5nZSBwb3dlciBjYWJsZXMsCnJlc3VtZS4KCllvdSBoYXZlIHlvdXIgc2VydmVyIG9uIFVQUy4gUG93ZXIgZGllZCwgYW5kIFVQUyBpcyBpbmRpY2F0aW5nIDMwCnNlY29uZHMgdG8gZmFpbHVyZS4gV2hhdCBkbyB5b3UgZG8/IFN1c3BlbmQgdG8gZGlzay4KCgpROiBNYXliZSBJJ20gbWlzc2luZyBzb21ldGhpbmcsIGJ1dCB3aHkgZG9uJ3QgdGhlIHJlZ3VsYXIgSS9PIHBhdGhzIHdvcms/CgpBOiBXZSBkbyB1c2UgdGhlIHJlZ3VsYXIgSS9PIHBhdGhzLiBIb3dldmVyIHdlIGNhbm5vdCByZXN0b3JlIHRoZSBkYXRhCnRvIGl0cyBvcmlnaW5hbCBsb2NhdGlvbiBhcyB3ZSBsb2FkIGl0LiBUaGF0IHdvdWxkIGNyZWF0ZSBhbgppbmNvbnNpc3RlbnQga2VybmVsIHN0YXRlIHdoaWNoIHdvdWxkIGNlcnRhaW5seSByZXN1bHQgaW4gYW4gb29wcy4KSW5zdGVhZCwgd2UgbG9hZCB0aGUgaW1hZ2UgaW50byB1bnVzZWQgbWVtb3J5IGFuZCB0aGVuIGF0b21pY2FsbHkgY29weQppdCBiYWNrIHRvIGl0IG9yaWdpbmFsIGxvY2F0aW9uLiBUaGlzIGltcGxpZXMsIG9mIGNvdXJzZSwgYSBtYXhpbXVtCmltYWdlIHNpemUgb2YgaGFsZiB0aGUgYW1vdW50IG9mIG1lbW9yeS4KClRoZXJlIGFyZSB0d28gc29sdXRpb25zIHRvIHRoaXM6CgoqIHJlcXVpcmUgaGFsZiBvZiBtZW1vcnkgdG8gYmUgZnJlZSBkdXJpbmcgc3VzcGVuZC4gVGhhdCB3YXkgeW91IGNhbgpyZWFkICJuZXciIGRhdGEgb250byBmcmVlIHNwb3RzLCB0aGVuIGNsaSBhbmQgY29weQoKKiBhc3N1bWUgd2UgaGFkIHNwZWNpYWwgInBvbGxpbmciIGlkZSBkcml2ZXIgdGhhdCBvbmx5IHVzZXMgbWVtb3J5CmJldHdlZW4gMC02NDBLQi4gVGhhdCB3YXksIEknZCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IDAtNjQwS0IgaXMgZnJlZQpkdXJpbmcgc3VzcGVuZGluZywgYnV0IG90aGVyd2lzZSBpdCB3b3VsZCB3b3JrLi4uCgpzdXNwZW5kMiBzaGFyZXMgdGhpcyBmdW5kYW1lbnRhbCBsaW1pdGF0aW9uLCBidXQgZG9lcyBub3QgaW5jbHVkZSB1c2VyCmRhdGEgYW5kIGRpc2sgY2FjaGVzIGludG8gInVzZWQgbWVtb3J5IiBieSBzYXZpbmcgdGhlbSBpbgphZHZhbmNlLiBUaGF0IG1lYW5zIHRoYXQgdGhlIGxpbWl0YXRpb24gZ29lcyBhd2F5IGluIHByYWN0aWNlLgoKUTogRG9lcyBsaW51eCBzdXBwb3J0IEFDUEkgUzQ/CgpBOiBZZXMuIFRoYXQncyB3aGF0IGVjaG8gcGxhdGZvcm0gPiAvc3lzL3Bvd2VyL2Rpc2sgZG9lcy4KClE6IFdoYXQgaXMgJ3N1c3BlbmQyJz8KCkE6IHN1c3BlbmQyIGlzICdTb2Z0d2FyZSBTdXNwZW5kIDInLCBhIGZvcmtlZCBpbXBsZW1lbnRhdGlvbiBvZgpzdXNwZW5kLXRvLWRpc2sgd2hpY2ggaXMgYXZhaWxhYmxlIGFzIHNlcGFyYXRlIHBhdGNoZXMgZm9yIDIuNCBhbmQgMi42Cmtlcm5lbHMgZnJvbSBzd3N1c3Auc291cmNlZm9yZ2UubmV0LiBJdCBpbmNsdWRlcyBzdXBwb3J0IGZvciBTTVAsIDRHQgpoaWdobWVtIGFuZCBwcmVlbXB0aW9uLiBJdCBhbHNvIGhhcyBhIGV4dGVuc2libGUgYXJjaGl0ZWN0dXJlIHRoYXQKYWxsb3dzIGZvciBhcmJpdHJhcnkgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBpbWFnZSAoY29tcHJlc3Npb24sCmVuY3J5cHRpb24pIGFuZCBhcmJpdHJhcnkgYmFja2VuZHMgZm9yIHdyaXRpbmcgdGhlIGltYWdlIChlZyB0byBzd2FwCm9yIGFuIE5GUyBzaGFyZVtXb3JrIEluIFByb2dyZXNzXSkuIFF1ZXN0aW9ucyByZWdhcmRpbmcgc3VzcGVuZDIKc2hvdWxkIGJlIHNlbnQgdG8gdGhlIG1haWxpbmcgbGlzdCBhdmFpbGFibGUgdGhyb3VnaCB0aGUgc3VzcGVuZDIKd2Vic2l0ZSwgYW5kIG5vdCB0byB0aGUgTGludXggS2VybmVsIE1haWxpbmcgTGlzdC4gV2UgYXJlIHdvcmtpbmcKdG93YXJkIG1lcmdpbmcgc3VzcGVuZDIgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgoKUTogQSBrZXJuZWwgdGhyZWFkIG11c3Qgdm9sdW50YXJpbHkgZnJlZXplIGl0c2VsZiAoY2FsbCAncmVmcmlnZXJhdG9yJykuCkkgZm91bmQgc29tZSBrZXJuZWwgdGhyZWFkcyB0aGF0IGRvbid0IGRvIGl0LCBhbmQgdGhleSBkb24ndCBmcmVlemUKc28gdGhlIHN5c3RlbSBjYW4ndCBzbGVlcC4gSXMgdGhpcyBhIGtub3duIGJlaGF2aW9yPwoKQTogQWxsIHN1Y2gga2VybmVsIHRocmVhZHMgbmVlZCB0byBiZSBmaXhlZCwgb25lIGJ5IG9uZS4gU2VsZWN0IHRoZQpwbGFjZSB3aGVyZSB0aGUgdGhyZWFkIGlzIHNhZmUgdG8gYmUgZnJvemVuIChubyBrZXJuZWwgc2VtYXBob3JlcwpzaG91bGQgYmUgaGVsZCBhdCB0aGF0IHBvaW50IGFuZCBpdCBtdXN0IGJlIHNhZmUgdG8gc2xlZXAgdGhlcmUpLCBhbmQKYWRkOgoKICAgICAgIHRyeV90b19mcmVlemUoKTsKCklmIHRoZSB0aHJlYWQgaXMgbmVlZGVkIGZvciB3cml0aW5nIHRoZSBpbWFnZSB0byBzdG9yYWdlLCB5b3Ugc2hvdWxkCmluc3RlYWQgc2V0IHRoZSBQRl9OT0ZSRUVaRSBwcm9jZXNzIGZsYWcgd2hlbiBjcmVhdGluZyB0aGUgdGhyZWFkIChhbmQKYmUgdmVyeSBjYXJlZnVsbCkuCgoKUTogV2hhdCBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGJldHdlZW4gInBsYXRmb3JtIiwgInNodXRkb3duIiBhbmQKImZpcm13YXJlIiBpbiAvc3lzL3Bvd2VyL2Rpc2s/CgpBOgoKc2h1dGRvd246IHNhdmUgc3RhdGUgaW4gbGludXgsIHRoZW4gdGVsbCBiaW9zIHRvIHBvd2VyZG93bgoKcGxhdGZvcm06IHNhdmUgc3RhdGUgaW4gbGludXgsIHRoZW4gdGVsbCBiaW9zIHRvIHBvd2VyZG93biBhbmQgYmxpbmsKICAgICAgICAgICJzdXNwZW5kZWQgbGVkIgoKZmlybXdhcmU6IHRlbGwgYmlvcyB0byBzYXZlIHN0YXRlIGl0c2VsZiBbbmVlZHMgQklPUy1zcGVjaWZpYyBzdXNwZW5kCgkgIHBhcnRpdGlvbiwgYW5kIGhhcyB2ZXJ5IGxpdHRsZSB0byBkbyB3aXRoIHN3c3VzcF0KCiJwbGF0Zm9ybSIgaXMgYWN0dWFsbHkgcmlnaHQgdGhpbmcgdG8gZG8sIGJ1dCAic2h1dGRvd24iIGlzIG1vc3QKcmVsaWFibGUuCgpROiBJIGRvIG5vdCB1bmRlcnN0YW5kIHdoeSB5b3UgaGF2ZSBzdWNoIHN0cm9uZyBvYmplY3Rpb25zIHRvIGlkZWEgb2YKc2VsZWN0aXZlIHN1c3BlbmQuCgpBOiBEbyBzZWxlY3RpdmUgc3VzcGVuZCBkdXJpbmcgcnVudGltZSBwb3dlciBtYW5hZ21lbnQsIHRoYXQncyBva2F5LiBCdXQKaXRzIHVzZWxlc3MgZm9yIHN1c3BlbmQtdG8tZGlzay4gKEFuZCBJIGRvIG5vdCBzZWUgaG93IHlvdSBjb3VsZCB1c2UKaXQgZm9yIHN1c3BlbmQtdG8tcmFtLCBJIGhvcGUgeW91IGRvIG5vdCB3YW50IHRoYXQpLgoKTGV0cyBzZWUsIHNvIHlvdSBzdWdnZXN0IHRvCgoqIFNVU1BFTkQgYWxsIGJ1dCBzd2FwIGRldmljZSBhbmQgcGFyZW50cwoqIFNuYXBzaG90CiogV3JpdGUgaW1hZ2UgdG8gZGlzawoqIFNVU1BFTkQgc3dhcCBkZXZpY2UgYW5kIHBhcmVudHMKKiBQb3dlcmRvd24KCk9oIG5vLCB0aGF0IGRvZXMgbm90IHdvcmssIGlmIHN3YXAgZGV2aWNlIG9yIGl0cyBwYXJlbnRzIHVzZXMgRE1BLAp5b3UndmUgY29ycnVwdGVkIGRhdGEuIFlvdSdkIGhhdmUgdG8gZG8KCiogU1VTUEVORCBhbGwgYnV0IHN3YXAgZGV2aWNlIGFuZCBwYXJlbnRzCiogRlJFRVpFIHN3YXAgZGV2aWNlIGFuZCBwYXJlbnRzCiogU25hcHNob3QKKiBVTkZSRUVaRSBzd2FwIGRldmljZSBhbmQgcGFyZW50cwoqIFdyaXRlCiogU1VTUEVORCBzd2FwIGRldmljZSBhbmQgcGFyZW50cwoKV2hpY2ggbWVhbnMgdGhhdCB5b3Ugc3RpbGwgbmVlZCB0aGF0IEZSRUVaRSBzdGF0ZSwgYW5kIHlvdSBnZXQgbW9yZQpjb21wbGljYXRlZCBjb2RlLiAoQW5kIEkgaGF2ZSBub3QgeWV0IGludHJvZHVjZSBkZXRhaWxzIGxpa2Ugc3lzdGVtCmRldmljZXMpLgoKUTogVGhlcmUgZG9uJ3Qgc2VlbSB0byBiZSBhbnkgZ2VuZXJhbGx5IHVzZWZ1bCBiZWhhdmlvcmFsCmRpc3RpbmN0aW9ucyBiZXR3ZWVuIFNVU1BFTkQgYW5kIEZSRUVaRS4KCkE6IERvaW5nIFNVU1BFTkQgd2hlbiB5b3UgYXJlIGFza2VkIHRvIGRvIEZSRUVaRSBpcyBhbHdheXMgY29ycmVjdCwKYnV0IGl0IG1heSBiZSB1bm5lY2Nlc3NhcmlseSBzbG93LiBJZiB5b3Ugd2FudCB5b3VyIGRyaXZlciB0byBzdGF5IHNpbXBsZSwKc2xvd25lc3MgbWF5IG5vdCBtYXR0ZXIgdG8geW91LiBJdCBjYW4gYWx3YXlzIGJlIGZpeGVkIGxhdGVyLgoKRm9yIGRldmljZXMgbGlrZSBkaXNrIGl0IGRvZXMgbWF0dGVyLCB5b3UgZG8gbm90IHdhbnQgdG8gc3BpbmRvd24gZm9yCkZSRUVaRS4KClE6IEFmdGVyIHJlc3VtaW5nLCBzeXN0ZW0gaXMgcGFnaW5nIGhlYXZpbGx5LCBsZWFkaW5nIHRvIHZlcnkgYmFkIGludGVyYWN0aXZpdHkuCgpBOiBUcnkgcnVubmluZwoKY2F0IGBjYXQgL3Byb2MvWzAtOV0qL21hcHMgfCBncmVwIC8gfCBzZWQgJ3M6LiogLzovOicgfCBzb3J0IC11YCA+IC9kZXYvbnVsbAoKYWZ0ZXIgcmVzdW1lLiBzd2Fwb2ZmIC1hOyBzd2Fwb24gLWEgbWF5IGFsc28gYmUgdXNlZnVsLgoKUTogV2hhdCBoYXBwZW5zIHRvIGRldmljZXMgZHVyaW5nIHN3c3VzcD8gVGhleSBzZWVtIHRvIGJlIHJlc3VtZWQKZHVyaW5nIHN5c3RlbSBzdXNwZW5kPwoKQTogVGhhdCdzIGNvcnJlY3QuIFdlIG5lZWQgdG8gcmVzdW1lIHRoZW0gaWYgd2Ugd2FudCB0byB3cml0ZSBpbWFnZSB0bwpkaXNrLiBXaG9sZSBzZXF1ZW5jZSBnb2VzIGxpa2UKCiAgICAgIFN1c3BlbmQgcGFydAogICAgICB+fn5+fn5+fn5+fn4KICAgICAgcnVubmluZyBzeXN0ZW0sIHVzZXIgYXNrcyBmb3Igc3VzcGVuZC10by1kaXNrCgogICAgICB1c2VyIHByb2Nlc3NlcyBhcmUgc3RvcHBlZAoKICAgICAgc3VzcGVuZChQTVNHX0ZSRUVaRSk6IGRldmljZXMgYXJlIGZyb3plbiBzbyB0aGF0IHRoZXkgZG9uJ3QgaW50ZXJmZXJlCiAgICAgIAkJICAgICAgd2l0aCBzdGF0ZSBzbmFwc2hvdAoKICAgICAgc3RhdGUgc25hcHNob3Q6IGNvcHkgb2Ygd2hvbGUgdXNlZCBtZW1vcnkgaXMgdGFrZW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCgogICAgICByZXN1bWUoKTogZGV2aWNlcyBhcmUgd29rZW4gdXAgc28gdGhhdCB3ZSBjYW4gd3JpdGUgaW1hZ2UgdG8gc3dhcAoKICAgICAgd3JpdGUgaW1hZ2UgdG8gc3dhcAoKICAgICAgc3VzcGVuZChQTVNHX1NVU1BFTkQpOiBzdXNwZW5kIGRldmljZXMgc28gdGhhdCB3ZSBjYW4gcG93ZXIgb2ZmCgogICAgICB0dXJuIHRoZSBwb3dlciBvZmYKCiAgICAgIFJlc3VtZSBwYXJ0CiAgICAgIH5+fn5+fn5+fn5+CiAgICAgIChpcyBhY3R1YWxseSBwcmV0dHkgc2ltaWxhcikKCiAgICAgIHJ1bm5pbmcgc3lzdGVtLCB1c2VyIGFza3MgZm9yIHN1c3BlbmQtdG8tZGlzawoKICAgICAgdXNlciBwcm9jZXNzZXMgYXJlIHN0b3BwZWQgKGluIGNvbW1vbiBjYXNlIHRoZXJlIGFyZSBub25lLCBidXQgd2l0aCByZXN1bWUtZnJvbS1pbml0cmQsIG5vb25lIGtub3dzKQoKICAgICAgcmVhZCBpbWFnZSBmcm9tIGRpc2sKCiAgICAgIHN1c3BlbmQoUE1TR19GUkVFWkUpOiBkZXZpY2VzIGFyZSBmcm96ZW4gc28gdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZQogICAgICAJCSAgICAgIHdpdGggaW1hZ2UgcmVzdG9yYXRpb24KCiAgICAgIGltYWdlIHJlc3RvcmF0aW9uOiByZXdyaXRlIG1lbW9yeSB3aXRoIGltYWdlCgogICAgICByZXN1bWUoKTogZGV2aWNlcyBhcmUgd29rZW4gdXAgc28gdGhhdCBzeXN0ZW0gY2FuIGNvbnRpbnVlCgogICAgICB0aGF3IGFsbCB1c2VyIHByb2Nlc3NlcwoKUTogV2hhdCBpcyB0aGlzICdFbmNyeXB0IHN1c3BlbmQgaW1hZ2UnIGZvcj8KCkE6IEZpcnN0IG9mIGFsbDogaXQgaXMgbm90IGEgcmVwbGFjZW1lbnQgZm9yIGRtLWNyeXB0IGVuY3J5cHRlZCBzd2FwLgpJdCBjYW5ub3QgcHJvdGVjdCB5b3VyIGNvbXB1dGVyIHdoaWxlIGl0IGlzIHN1c3BlbmRlZC4gSW5zdGVhZCBpdCBkb2VzCnByb3RlY3QgZnJvbSBsZWFraW5nIHNlbnNpdGl2ZSBkYXRhIGFmdGVyIHJlc3VtZSBmcm9tIHN1c3BlbmQuCgpUaGluayBvZiB0aGUgZm9sbG93aW5nOiB5b3Ugc3VzcGVuZCB3aGlsZSBhbiBhcHBsaWNhdGlvbiBpcyBydW5uaW5nCnRoYXQga2VlcHMgc2Vuc2l0aXZlIGRhdGEgaW4gbWVtb3J5LiBUaGUgYXBwbGljYXRpb24gaXRzZWxmIHByZXZlbnRzCnRoZSBkYXRhIGZyb20gYmVpbmcgc3dhcHBlZCBvdXQuIFN1c3BlbmQsIGhvd2V2ZXIsIG11c3Qgd3JpdGUgdGhlc2UKZGF0YSB0byBzd2FwIHRvIGJlIGFibGUgdG8gcmVzdW1lIGxhdGVyIG9uLiBXaXRob3V0IHN1c3BlbmQgZW5jcnlwdGlvbgp5b3VyIHNlbnNpdGl2ZSBkYXRhIGFyZSB0aGVuIHN0b3JlZCBpbiBwbGFpbnRleHQgb24gZGlzay4gIFRoaXMgbWVhbnMKdGhhdCBhZnRlciByZXN1bWUgeW91ciBzZW5zaXRpdmUgZGF0YSBhcmUgYWNjZXNzaWJsZSB0byBhbGwKYXBwbGljYXRpb25zIGhhdmluZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBzd2FwIGRldmljZSB3aGljaCB3YXMgdXNlZApmb3Igc3VzcGVuZC4gSWYgeW91IGRvbid0IG5lZWQgc3dhcCBhZnRlciByZXN1bWUgdGhlc2UgZGF0YSBjYW4gcmVtYWluCm9uIGRpc2sgdmlydHVhbGx5IGZvcmV2ZXIuIFRodXMgaXQgY2FuIGhhcHBlbiB0aGF0IHlvdXIgc3lzdGVtIGdldHMKYnJva2VuIGluIHdlZWtzIGxhdGVyIGFuZCBzZW5zaXRpdmUgZGF0YSB3aGljaCB5b3UgdGhvdWdodCB3ZXJlCmVuY3J5cHRlZCBhbmQgcHJvdGVjdGVkIGFyZSByZXRyaWV2ZWQgYW5kIHN0b2xlbiBmcm9tIHRoZSBzd2FwIGRldmljZS4KVG8gcHJldmVudCB0aGlzIHNpdHVhdGlvbiB5b3Ugc2hvdWxkIHVzZSAnRW5jcnlwdCBzdXNwZW5kIGltYWdlJy4KCkR1cmluZyBzdXNwZW5kIGEgdGVtcG9yYXJ5IGtleSBpcyBjcmVhdGVkIGFuZCB0aGlzIGtleSBpcyB1c2VkIHRvCmVuY3J5cHQgdGhlIGRhdGEgd3JpdHRlbiB0byBkaXNrLiBXaGVuLCBkdXJpbmcgcmVzdW1lLCB0aGUgZGF0YSB3YXMKcmVhZCBiYWNrIGludG8gbWVtb3J5IHRoZSB0ZW1wb3Jhcnkga2V5IGlzIGRlc3Ryb3llZCB3aGljaCBzaW1wbHkKbWVhbnMgdGhhdCBhbGwgZGF0YSB3cml0dGVuIHRvIGRpc2sgZHVyaW5nIHN1c3BlbmQgYXJlIHRoZW4KaW5hY2Nlc3NpYmxlIHNvIHRoZXkgY2FuJ3QgYmUgc3RvbGVuIGxhdGVyIG9uLiAgVGhlIG9ubHkgdGhpbmcgdGhhdAp5b3UgbXVzdCB0aGVuIHRha2UgY2FyZSBvZiBpcyB0aGF0IHlvdSBjYWxsICdta3N3YXAnIGZvciB0aGUgc3dhcApwYXJ0aXRpb24gdXNlZCBmb3Igc3VzcGVuZCBhcyBlYXJseSBhcyBwb3NzaWJsZSBkdXJpbmcgcmVndWxhcgpib290LiBUaGlzIGFzc2VydHMgdGhhdCBhbnkgdGVtcG9yYXJ5IGtleSBmcm9tIGFuIG9vcHNlZCBzdXNwZW5kIG9yCmZyb20gYSBmYWlsZWQgb3IgYWJvcnRlZCByZXN1bWUgaXMgZXJhc2VkIGZyb20gdGhlIHN3YXAgZGV2aWNlLgoKQXMgYSBydWxlIG9mIHRodW1iIHVzZSBlbmNyeXB0ZWQgc3dhcCB0byBwcm90ZWN0IHlvdXIgZGF0YSB3aGlsZSB5b3VyCnN5c3RlbSBpcyBzaHV0IGRvd24gb3Igc3VzcGVuZGVkLiBBZGRpdGlvbmFsbHkgdXNlIHRoZSBlbmNyeXB0ZWQKc3VzcGVuZCBpbWFnZSB0byBwcmV2ZW50IHNlbnNpdGl2ZSBkYXRhIGZyb20gYmVpbmcgc3RvbGVuIGFmdGVyCnJlc3VtZS4KClE6IFdoeSBjYW4ndCB3ZSBzdXNwZW5kIHRvIGEgc3dhcCBmaWxlPwoKQTogQmVjYXVzZSBhY2Nlc3Npbmcgc3dhcCBmaWxlIG5lZWRzIHRoZSBmaWxlc3lzdGVtIG1vdW50ZWQsIGFuZApmaWxlc3lzdGVtIG1pZ2h0IGRvIHNvbWV0aGluZyB3cm9uZyAobGlrZSByZXBsYXlpbmcgdGhlIGpvdXJuYWwpCmR1cmluZyBtb3VudC4KClRoZXJlIGFyZSBmZXcgd2F5cyB0byBnZXQgdGhhdCBmaXhlZDoKCjEpIFByb2JhYmx5IGNvdWxkIGJlIHNvbHZlZCBieSBtb2RpZnlpbmcgZXZlcnkgZmlsZXN5c3RlbSB0byBzdXBwb3J0CnNvbWUga2luZCBvZiAicmVhbGx5IHJlYWQtb25seSEiIG9wdGlvbi4gUGF0Y2hlcyB3ZWxjb21lLgoKMikgc3VzcGVuZDIgZ2V0cyBhcm91bmQgdGhhdCBieSBzdG9yaW5nIGFic29sdXRlIHBvc2l0aW9ucyBpbiBvbi1kaXNrCmltYWdlIChhbmQgYmxvY2tzaXplKSwgd2l0aCByZXN1bWUgcGFyYW1ldGVyIHBvaW50aW5nIGRpcmVjdGx5IHRvCnN1c3BlbmQgaGVhZGVyLgoKUTogSXMgdGhlcmUgYSBtYXhpbXVtIHN5c3RlbSBSQU0gc2l6ZSB0aGF0IGlzIHN1cHBvcnRlZCBieSBzd3N1c3A/CgpBOiBJdCBzaG91bGQgd29yayBva2F5IHdpdGggaGlnaG1lbS4KClE6IERvZXMgc3dzdXNwICh0byBkaXNrKSB1c2Ugb25seSBvbmUgc3dhcCBwYXJ0aXRpb24gb3IgY2FuIGl0IHVzZQptdWx0aXBsZSBzd2FwIHBhcnRpdGlvbnMgKGFnZ3JlZ2F0ZSB0aGVtIGludG8gb25lIGxvZ2ljYWwgc3BhY2UpPwoKQTogT25seSBvbmUgc3dhcCBwYXJ0aXRpb24sIHNvcnJ5LgoKUTogSWYgbXkgYXBwbGljYXRpb24ocykgY2F1c2VzIGxvdHMgb2YgbWVtb3J5ICYgc3dhcCBzcGFjZSB0byBiZSB1c2VkCihvdmVyIGhhbGYgb2YgdGhlIHRvdGFsIHN5c3RlbSBSQU0pLCBpcyBpdCBjb3JyZWN0IHRoYXQgaXQgaXMgbGlrZWx5CnRvIGJlIHVzZWxlc3MgdG8gdHJ5IHRvIHN1c3BlbmQgdG8gZGlzayB3aGlsZSB0aGF0IGFwcCBpcyBydW5uaW5nPwoKQTogTm8sIGl0IHNob3VsZCB3b3JrIG9rYXksIGFzIGxvbmcgYXMgeW91ciBhcHAgZG9lcyBub3QgbWxvY2soKQppdC4gSnVzdCBwcmVwYXJlIGJpZyBlbm91Z2ggc3dhcCBwYXJ0aXRpb24uCgpROiBXaGF0IGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHN1c3BlbmQtdG8tZGlzayBwcm9ibGVtcz8KCkE6IFdlbGwsIGxhc3QgbWVzc2FnZXMgb24gdGhlIHNjcmVlbiBhcmUgYWx3YXlzIHVzZWZ1bC4gSWYgc29tZXRoaW5nCmlzIGJyb2tlbiwgaXQgaXMgdXN1YWxseSBzb21lIGtlcm5lbCBkcml2ZXIsIHRoZXJlZm9yZSB0cnlpbmcgd2l0aCBhcwpsaXR0bGUgYXMgcG9zc2libGUgbW9kdWxlcyBsb2FkZWQgaGVscHMgYSBsb3QuIEkgYWxzbyBwcmVmZXIgcGVvcGxlIHRvCnN1c3BlbmQgZnJvbSBjb25zb2xlLCBwcmVmZXJhYmx5IHdpdGhvdXQgWCBydW5uaW5nLiBCb290aW5nIHdpdGgKaW5pdD0vYmluL2Jhc2gsIHRoZW4gc3dhcG9uIGFuZCBzdGFydGluZyBzdXNwZW5kIHNlcXVlbmNlIG1hbnVhbGx5CnVzdWFsbHkgZG9lcyB0aGUgdHJpY2suIFRoZW4gaXQgaXMgZ29vZCBpZGVhIHRvIHRyeSB3aXRoIGxhdGVzdAp2YW5pbGxhIGtlcm5lbC4KClE6IEhvdyBjYW4gZGlzdHJpYnV0aW9ucyBzaGlwIGEgc3dzdXNwLXN1cHBvcnRpbmcga2VybmVsIHdpdGggbW9kdWxhcgpkaXNrIGRyaXZlcnMgKGVzcGVjaWFsbHkgU0FUQSk/CgpBOiBXZWxsLCBpdCBjYW4gYmUgZG9uZSwgbG9hZCB0aGUgZHJpdmVycywgdGhlbiBkbyBlY2hvIGludG8KL3N5cy9wb3dlci9kaXNrL3Jlc3VtZSBmaWxlIGZyb20gaW5pdHJkLiBCZSBzdXJlIG5vdCB0byBtb3VudAphbnl0aGluZywgbm90IGV2ZW4gcmVhZC1vbmx5IG1vdW50LCBvciB5b3UgYXJlIGdvaW5nIHRvIGxvc2UgeW91cgpkYXRhLgoKUTogSG93IGRvIEkgbWFrZSBzdXNwZW5kIG1vcmUgdmVyYm9zZT8KCkE6IElmIHlvdSB3YW50IHRvIHNlZSBhbnkgbm9uLWVycm9yIGtlcm5lbCBtZXNzYWdlcyBvbiB0aGUgdmlydHVhbAp0ZXJtaW5hbCB0aGUga2VybmVsIHN3aXRjaGVzIHRvIGR1cmluZyBzdXNwZW5kLCB5b3UgaGF2ZSB0byBzZXQgdGhlCmtlcm5lbCBjb25zb2xlIGxvZ2xldmVsIHRvIGF0IGxlYXN0IDUsIGZvciBleGFtcGxlIGJ5IGRvaW5nCgoJZWNobyA1ID4gL3Byb2Mvc3lzL2tlcm5lbC9wcmludGsKClE6IElzIHRoaXMgdHJ1ZSB0aGF0IGlmIEkgaGF2ZSBhIG1vdW50ZWQgZmlsZXN5c3RlbSBvbiBhIFVTQiBkZXZpY2UgYW5kCkkgc3VzcGVuZCB0byBkaXNrLCBJIGNhbiBsb3NlIGRhdGEgdW5sZXNzIHRoZSBmaWxlc3lzdGVtIGhhcyBiZWVuIG1vdW50ZWQKd2l0aCAic3luYyI/CgpBOiBUaGF0J3MgcmlnaHQgLi4uIGlmIHlvdSBkaXNjb25uZWN0IHRoYXQgZGV2aWNlLCB5b3UgbWF5IGxvc2UgZGF0YS4KSW4gZmFjdCwgZXZlbiB3aXRoICItbyBzeW5jIiB5b3UgY2FuIGxvc2UgZGF0YSBpZiB5b3VyIHByb2dyYW1zIGhhdmUKaW5mb3JtYXRpb24gaW4gYnVmZmVycyB0aGV5IGhhdmVuJ3Qgd3JpdHRlbiBvdXQgdG8gYSBkaXNrIHlvdSBkaXNjb25uZWN0LApvciBpZiB5b3UgZGlzY29ubmVjdCBiZWZvcmUgdGhlIGRldmljZSBmaW5pc2hlZCBzYXZpbmcgZGF0YSB5b3Ugd3JvdGUuCgpTb2Z0d2FyZSBzdXNwZW5kIG5vcm1hbGx5IHBvd2VycyBkb3duIFVTQiBjb250cm9sbGVycywgd2hpY2ggaXMgZXF1aXZhbGVudAp0byBkaXNjb25uZWN0aW5nIGFsbCBVU0IgZGV2aWNlcyBhdHRhY2hlZCB0byB5b3VyIHN5c3RlbS4KCllvdXIgc3lzdGVtIG1pZ2h0IHdlbGwgc3VwcG9ydCBsb3ctcG93ZXIgbW9kZXMgZm9yIGl0cyBVU0IgY29udHJvbGxlcnMKd2hpbGUgdGhlIHN5c3RlbSBpcyBhc2xlZXAsIG1haW50YWluaW5nIHRoZSBjb25uZWN0aW9uLCB1c2luZyB0cnVlIHNsZWVwCm1vZGVzIGxpa2UgInN1c3BlbmQtdG8tUkFNIiBvciAic3RhbmRieSIuICAoRG9uJ3Qgd3JpdGUgImRpc2siIHRvIHRoZQovc3lzL3Bvd2VyL3N0YXRlIGZpbGU7IHdyaXRlICJzdGFuZGJ5IiBvciAibWVtIi4pICBXZSd2ZSBub3Qgc2VlbiBhbnkKaGFyZHdhcmUgdGhhdCBjYW4gdXNlIHRoZXNlIG1vZGVzIHRocm91Z2ggc29mdHdhcmUgc3VzcGVuZCwgYWx0aG91Z2ggaW4KdGhlb3J5IHNvbWUgc3lzdGVtcyBtaWdodCBzdXBwb3J0ICJwbGF0Zm9ybSIgb3IgImZpcm13YXJlIiBtb2RlcyB0aGF0Cndvbid0IGJyZWFrIHRoZSBVU0IgY29ubmVjdGlvbnMuCgpSZW1lbWJlciB0aGF0IGl0J3MgYWx3YXlzIGEgYmFkIGlkZWEgdG8gdW5wbHVnIGEgZGlzayBkcml2ZSBjb250YWluaW5nIGEKbW91bnRlZCBmaWxlc3lzdGVtLiAgVGhhdCdzIHRydWUgZXZlbiB3aGVuIHlvdXIgc3lzdGVtIGlzIGFzbGVlcCEgIFRoZQpzYWZlc3QgdGhpbmcgaXMgdG8gdW5tb3VudCBhbGwgZmlsZXN5c3RlbXMgb24gcmVtb3ZhYmxlIG1lZGlhIChzdWNoIFVTQiwKRmlyZXdpcmUsIENvbXBhY3RGbGFzaCwgTU1DLCBleHRlcm5hbCBTQVRBLCBvciBldmVuIElERSBob3RwbHVnIGJheXMpCmJlZm9yZSBzdXNwZW5kaW5nOyB0aGVuIHJlbW91bnQgdGhlbSBhZnRlciByZXN1bWluZy4KCg==