<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>178390</bug_id>
          
          <creation_ts>2017-10-17 09:01:59 -0700</creation_ts>
          <short_desc>Support recursive tail call optimization for polymorphic calls</short_desc>
          <delta_ts>2017-11-28 05:12:34 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>176601</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Robin Morisset">rmorisset</reporter>
          <assigned_to name="Robin Morisset">rmorisset</assigned_to>
          <cc>buildbot</cc>
    
    <cc>commit-queue</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>rniwa</cc>
    
    <cc>saam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1361245</commentid>
    <comment_count>0</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-17 09:01:59 -0700</bug_when>
    <thetext>There is currently code in DFGByteCodeParser.cpp::handleInlining(...) that turns a polymorphic call into a switch on the value of the callee, with fast paths for each frequently called callee. This enables the calls to be inlined, but currently if one is a recursive tail call it cannot be optimized as in https://bugs.webkit.org/show_bug.cgi?id=176601. This is an unnecessary restriction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362201</commentid>
    <comment_count>1</comment_count>
      <attachid>324250</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-19 10:48:33 -0700</bug_when>
    <thetext>Created attachment 324250
WIP, preliminary refactoring</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362250</commentid>
    <comment_count>2</comment_count>
      <attachid>324262</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-19 12:15:59 -0700</bug_when>
    <thetext>Created attachment 324262
WIP</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362252</commentid>
    <comment_count>3</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-10-19 12:19:17 -0700</bug_when>
    <thetext>Attachment 324262 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:1346:  Multi line control clauses should use braces.  [whitespace/braces] [4]
Total errors found: 1 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362697</commentid>
    <comment_count>4</comment_count>
      <attachid>324401</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-20 08:09:58 -0700</bug_when>
    <thetext>Created attachment 324401
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362698</commentid>
    <comment_count>5</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-10-20 08:11:27 -0700</bug_when>
    <thetext>Attachment 324401 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:1346:  Multi line control clauses should use braces.  [whitespace/braces] [4]
Total errors found: 1 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362704</commentid>
    <comment_count>6</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-20 08:51:17 -0700</bug_when>
    <thetext>SunSpider:
   3d-cube                                            4.7406+-0.1604            4.4135+-0.3265          might be 1.0741x faster
   3d-morph                                           5.0439+-0.3045            4.9617+-0.1804          might be 1.0166x faster
   3d-raytrace                                        4.6364+-0.4214     ?      4.8838+-0.4810        ? might be 1.0534x slower
   access-binary-trees                                2.0920+-0.1220            2.0292+-0.1858          might be 1.0309x faster
   access-fannkuch                                    5.4307+-0.3572     ?      5.8002+-0.9780        ? might be 1.0680x slower
   access-nbody                                       2.7929+-0.4545            2.6152+-0.1226          might be 1.0680x faster
   access-nsieve                                      2.3547+-0.2029     ?      2.4300+-0.0707        ? might be 1.0320x slower
   bitops-3bit-bits-in-byte                           1.3878+-0.2629            1.3156+-0.1408          might be 1.0548x faster
   bitops-bits-in-byte                                2.7015+-0.3859            2.4362+-0.0911          might be 1.1089x faster
   bitops-bitwise-and                                 2.3112+-0.3250     ?      2.4361+-0.1834        ? might be 1.0541x slower
   bitops-nsieve-bits                                 3.6935+-0.1521     ?      3.7345+-0.4356        ? might be 1.0111x slower
   controlflow-recursive                              2.2219+-0.2514            2.1355+-0.0903          might be 1.0405x faster
   crypto-aes                                         4.4188+-0.3999            4.2502+-0.1615          might be 1.0396x faster
   crypto-md5                                         2.4542+-0.1932     ?      2.5405+-0.2197        ? might be 1.0352x slower
   crypto-sha1                                        2.6261+-0.2223            2.6048+-0.1838        
   date-format-tofte                                  7.7025+-1.5669            7.2689+-0.4865          might be 1.0596x faster
   date-format-xparb                                  4.9261+-0.2274            4.8682+-0.3388          might be 1.0119x faster
   math-cordic                                        3.0046+-0.1125     ?      3.1100+-0.1763        ? might be 1.0351x slower
   math-partial-sums                                  4.2559+-1.4706            4.1099+-0.2877          might be 1.0355x faster
   math-spectral-norm                                 2.0585+-0.1687            1.8915+-0.1553          might be 1.0883x faster
   regexp-dna                                         7.1373+-0.1023     ?      7.2188+-0.3546        ? might be 1.0114x slower
   string-base64                                      4.6766+-0.2453     ?      4.9480+-0.3373        ? might be 1.0580x slower
   string-fasta                                       5.8613+-0.3304     ?      6.2903+-0.2644        ? might be 1.0732x slower
   string-tagcloud                                    8.3543+-0.2227            8.2750+-0.7080        
   string-unpack-code                                19.1577+-0.5076           18.7568+-0.4761          might be 1.0214x faster
   string-validate-input                              5.1353+-0.2066     ?      5.2360+-0.3733        ? might be 1.0196x slower

   &lt;arithmetic&gt;                                       4.6606+-0.1086            4.6369+-0.0824          might be 1.0051x faster

                                                          Conf#1                    Conf#2                                      
LongSpider:
   3d-cube                                          743.3364+-16.9881    ?    747.2447+-9.8873        ?
   3d-morph                                         498.9675+-3.8510          497.3754+-15.8592       
   3d-raytrace                                      423.5014+-9.3655     ?    424.0785+-12.1830       ?
   access-binary-trees                              920.3850+-13.2572    ?    921.9882+-20.2226       ?
   access-fannkuch                                  260.3717+-14.9256         233.9330+-19.1393         might be 1.1130x faster
   access-nbody                                     426.2677+-5.8794          424.7436+-4.6168        
   access-nsieve                                    352.6670+-8.5627          348.6665+-12.1425         might be 1.0115x faster
   bitops-3bit-bits-in-byte                          30.4611+-1.0262     ?     31.1438+-3.1502        ? might be 1.0224x slower
   bitops-bits-in-byte                               90.2295+-7.8619     ?    128.0945+-38.3815       ? might be 1.4197x slower
   bitops-nsieve-bits                               342.3952+-15.5238         338.1292+-4.3887          might be 1.0126x faster
   controlflow-recursive                            386.2708+-10.7607         383.4576+-5.0927        
   crypto-aes                                       499.9988+-11.4259         499.0734+-8.7046        
   crypto-md5                                       449.5331+-2.9971          447.3342+-14.8998       
   crypto-sha1                                      550.8433+-8.4904     ?    553.6381+-7.5920        ?
   date-format-tofte                                290.1520+-4.7459     ?    290.8591+-3.5872        ?
   date-format-xparb                                560.8743+-27.6412    ?    561.1144+-36.1531       ?
   hash-map                                         133.8291+-7.9164          133.4437+-5.0202        
   math-cordic                                      429.9993+-4.1395     ?    431.6057+-3.6335        ?
   math-partial-sums                                228.7563+-0.4379     ?    231.6970+-6.4385        ? might be 1.0129x slower
   math-spectral-norm                               352.9766+-13.2632         352.9424+-10.3477       
   string-base64                                    415.9871+-7.7441     ?    419.5347+-10.5945       ?
   string-fasta                                     306.8175+-12.3722    ?    312.1820+-12.4545       ? might be 1.0175x slower
   string-tagcloud                                  140.2115+-7.0250     ?    142.0247+-4.2935        ? might be 1.0129x slower

   &lt;geometric&gt;                                      317.3551+-2.6633     ?    321.1596+-5.4219        ? might be 1.0120x slower

                                                          Conf#1                    Conf#2                                      
V8Spider:
   crypto                                            35.8758+-12.8537          31.7330+-0.2946          might be 1.1306x faster
   deltablue                                         47.1593+-4.3159     ?     49.9207+-1.8247        ? might be 1.0586x slower
   earley-boyer                                      29.5943+-0.5200     ?     32.2305+-7.7521        ? might be 1.0891x slower
   raytrace                                          22.2935+-8.1827           20.8257+-4.6855          might be 1.0705x faster
   regexp                                            51.1688+-0.7887           50.8893+-1.0603        
   richards                                          38.1844+-1.2516     ?     39.6586+-1.8072        ? might be 1.0386x slower
   splay                                             27.4482+-0.5682     ?     27.7344+-1.4826        ? might be 1.0104x slower

   &lt;geometric&gt;                                       34.4776+-1.9037     ?     34.5392+-1.0912        ? might be 1.0018x slower

                                                          Conf#1                    Conf#2                                      
Octane:
   encrypt                                           0.12581+-0.00117    ?     0.12736+-0.00764       ? might be 1.0123x slower
   decrypt                                           2.21757+-0.05768          2.20827+-0.05826       
   deltablue                                x2       0.12267+-0.00554          0.11535+-0.00982         might be 1.0634x faster
   earley                                            0.24258+-0.01153          0.23582+-0.00294         might be 1.0287x faster
   boyer                                             4.13986+-0.08825          4.10189+-0.04924       
   navier-stokes                            x2       4.58489+-0.05029    ?     4.59649+-0.08957       ?
   raytrace                                 x2       0.64152+-0.00559          0.63789+-0.00357       
   richards                                 x2       0.07414+-0.00034    ?     0.07489+-0.00158       ? might be 1.0101x slower
   splay                                    x2       0.29472+-0.00558    ?     0.29841+-0.00253       ? might be 1.0125x slower
   regexp                                   x2      14.53782+-0.10715    ?    14.91860+-0.74437       ? might be 1.0262x slower
   pdfjs                                    x2      37.37914+-0.87305         37.04115+-0.45810       
   mandreel                                 x2      36.02615+-0.65060    ?    36.26710+-0.99095       ?
   gbemu                                    x2      27.56974+-0.78518         27.36446+-0.15044       
   closure                                           0.42942+-0.00699          0.42707+-0.00263       
   jquery                                            5.75672+-0.44038          5.71423+-0.24476       
   box2d                                    x2       7.09826+-0.09215          7.06418+-0.04907       
   zlib                                     x2     286.85677+-12.49188       285.61918+-3.65758       
   typescript                               x2     591.74445+-18.29531       582.29529+-8.25199         might be 1.0162x faster

   &lt;geometric&gt;                                       4.38487+-0.01278          4.36354+-0.01492         might be 1.0049x faster

                                                          Conf#1                    Conf#2                                      
Kraken:
   ai-astar                                           75.915+-17.011            75.856+-6.498         
   audio-beat-detection                               32.694+-0.277      ?      33.059+-2.005         ? might be 1.0111x slower
   audio-dft                                          79.203+-4.342      ?      87.989+-12.475        ? might be 1.1109x slower
   audio-fft                                          23.271+-0.570      ?      23.696+-0.593         ? might be 1.0183x slower
   audio-oscillator                                   49.369+-11.196            47.109+-4.762           might be 1.0480x faster
   imaging-darkroom                                   50.765+-2.444      ?      51.694+-3.910         ? might be 1.0183x slower
   imaging-desaturate                                 41.760+-0.562      ?      41.845+-0.242         ?
   imaging-gaussian-blur                              58.071+-2.915      ?      60.742+-8.093         ? might be 1.0460x slower
   json-parse-financial                               29.507+-1.588      ?      30.736+-1.599         ? might be 1.0416x slower
   json-stringify-tinderbox                           19.445+-2.045      ?      20.548+-3.123         ? might be 1.0567x slower
   stanford-crypto-aes                                32.713+-0.930      ?      33.319+-0.868         ? might be 1.0185x slower
   stanford-crypto-ccm                                30.323+-3.695             29.608+-4.368           might be 1.0242x faster
   stanford-crypto-pbkdf2                             52.881+-2.682      ?      53.582+-4.336         ? might be 1.0133x slower
   stanford-crypto-sha256-iterative                   17.963+-0.484      ?      18.101+-0.305         ?

   &lt;arithmetic&gt;                                       42.420+-0.824      ?      43.420+-1.711         ? might be 1.0236x slower

So there does not appear to be any significant regression or progression. I still have to check TailBench, and maybe re-run some of these with higher number of runs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362705</commentid>
    <comment_count>7</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-20 08:55:13 -0700</bug_when>
    <thetext>Some more (skipping the microbenchmarks, none of which show any progression or regression either):
                                                          Conf#1                    Conf#2                                      
AsmBench:
   bigfib.cpp                                       412.6786+-7.5506     ?    421.4230+-12.0319       ? might be 1.0212x slower
   cray.c                                           294.3629+-5.4464          293.3703+-3.4236        
   dry.c                                            361.2978+-4.7491          358.9027+-0.6614        
   FloatMM.c                                        529.3777+-4.2541     ?    535.6852+-13.1560       ? might be 1.0119x slower
   gcc-loops.cpp                                   3547.4122+-216.3958       3497.5497+-91.0798         might be 1.0143x faster
   n-body.c                                         611.6992+-23.4641         606.6401+-9.4231        
   Quicksort.c                                      367.9689+-5.2186     ?    370.1124+-21.5112       ?
   stepanov_container.cpp                          2860.0131+-308.2569       2795.7637+-84.5963         might be 1.0230x faster
   Towers.c                                         203.7318+-11.1605         201.1208+-2.4274          might be 1.0130x faster

   &lt;geometric&gt;                                      604.4949+-4.3115          602.6509+-3.8450          might be 1.0031x faster

                                                          Conf#1                    Conf#2                                      
CompressionBench:
   huffman                                           25.6085+-3.3878           24.6127+-0.1713          might be 1.0405x faster
   arithmetic-simple                                235.5256+-1.7086          234.8749+-1.8039        
   arithmetic-precise                               216.5422+-5.0899     ?    220.9287+-16.2782       ? might be 1.0203x slower
   arithmetic-complex-precise                       221.9506+-14.5923         221.3373+-6.8423        
   arithmetic-precise-order-0                       245.5509+-1.2054     ?    245.7853+-0.8679        ?
   arithmetic-precise-order-1                       268.0273+-3.0704     ?    270.1372+-17.6204       ?
   arithmetic-precise-order-2                       306.6118+-3.5147     ?    314.2617+-23.8548       ? might be 1.0249x slower
   arithmetic-simple-order-1                        276.6948+-4.3248     ?    277.3080+-5.2175        ?
   arithmetic-simple-order-2                        321.3170+-6.3690     ?    333.1250+-25.9720       ? might be 1.0367x slower
   lz-string                                        225.4969+-1.8691     ?    237.4882+-16.2229       ? might be 1.0532x slower

   &lt;geometric&gt;                                      202.6671+-2.1359     ?    204.6571+-2.0159        ? might be 1.0098x slower

                                                          Conf#1                    Conf#2                                      
SixSpeed:
   template_string.es5                             4883.6143+-54.9447        4856.8132+-37.4012       
   template_string.es6                             4138.3417+-65.1480    ?   4146.9897+-57.8470       ?
   defaults.es5                                     322.4486+-3.2821     ?    328.2272+-20.7757       ? might be 1.0179x slower
   defaults.es6                                     320.8857+-0.8631     ?    325.4340+-4.3139        ? might be 1.0142x slower
   map-set-lookup.es5                                63.3699+-18.0542    ?     69.1140+-20.9033       ? might be 1.0906x slower
   map-set-lookup.es6                                 0.9250+-0.1929     ?      1.4653+-1.8007        ? might be 1.5841x slower
   spread.es5                                        12.2799+-0.8453     ?     12.3222+-0.1461        ?
   spread.es6                                        38.2454+-4.8489           37.7236+-2.1692          might be 1.0138x faster
   object-assign.es5                                203.3602+-3.6944          203.1307+-5.5323        
   object-assign.es6                                205.2889+-7.2714          203.4252+-4.6228        
   spread-literal.es5                                15.4348+-0.4644           15.0320+-0.3064          might be 1.0268x faster
   spread-literal.es6                                22.3255+-0.2088           22.1947+-0.5524        
   map-set.es5                                       21.0168+-3.8319     ?     21.4493+-2.1669        ? might be 1.0206x slower
   map-set.es6                                      153.0753+-19.3095         149.4788+-6.4879          might be 1.0241x faster
   destructuring-simple.es5                          64.5383+-0.5496     ?     64.9165+-0.8554        ?
   destructuring-simple.es6                          64.5018+-0.4070     ?     64.6168+-0.3211        ?
   super.es5                                         10.7960+-1.6672     ?     12.2737+-1.5451        ? might be 1.1369x slower
   super.es6                                         21.0604+-0.6828     ?     21.7510+-2.6521        ? might be 1.0328x slower
   for-of-object.es5                                 44.8350+-2.4941           43.3120+-4.6808          might be 1.0352x faster
   for-of-object.es6                                141.0807+-2.2138          140.5900+-5.1682        
   rest.es5                                          30.1490+-0.9708           30.1376+-0.4853        
   rest.es6                                           2.0336+-0.0679            1.9902+-0.0933          might be 1.0218x faster
   regex-u.es5                                       33.9125+-0.4769     ?     34.2583+-0.6404        ? might be 1.0102x slower
   regex-u.es6                                       65.9092+-8.5911           63.2293+-0.6174          might be 1.0424x faster
   arrow.es5                                         64.8582+-0.5937     ?     65.3704+-2.6912        ?
   arrow.es6                                         67.2280+-4.6573           64.2952+-0.3072          might be 1.0456x faster
   bindings-compound.es5                             64.7179+-0.3352           54.0939+-11.8612         might be 1.1964x faster
   bindings-compound.es6                             64.4318+-0.2751     ?     68.9605+-13.9606       ? might be 1.0703x slower
   classes.es5                                       56.5108+-1.2590     ?     57.2444+-1.8317        ? might be 1.0130x slower
   classes.es6                                       56.7508+-1.3581           56.1429+-1.2649          might be 1.0108x faster
   template_string_tag.es5                           60.2440+-0.8336           58.5812+-4.3304          might be 1.0284x faster
   template_string_tag.es6                          171.7587+-5.6791     ?    174.6210+-9.3965        ? might be 1.0167x slower
   map-string.es5                                    83.5129+-5.6925           83.1068+-3.7639        
   map-string.es6                                   351.3727+-2.2468     ?    352.2203+-4.1178        ?
   arrow-declare.es5                                101.5883+-13.0381          96.7725+-0.6436          might be 1.0498x faster
   arrow-declare.es6                                 99.1322+-5.7563           96.7269+-1.3041          might be 1.0249x faster
   spread-generator.es5                              77.7860+-23.2422          70.5928+-1.3365          might be 1.1019x faster
   spread-generator.es6                             174.2321+-10.9408         169.6866+-3.7196          might be 1.0268x faster
   object-literal-ext.es5                            16.6722+-0.5216           16.3120+-0.2331          might be 1.0221x faster
   object-literal-ext.es6                            19.4162+-1.4462     ?     19.9951+-2.3405        ? might be 1.0298x slower
   generator.es5                                     98.9652+-0.7480     ?    102.9295+-10.7550       ? might be 1.0401x slower
   generator.es6                                    152.0974+-1.7712     ?    154.8335+-9.9898        ? might be 1.0180x slower
   arrow-args.es5                                    65.8676+-3.5179     ?     65.9514+-5.2790        ?
   arrow-args.es6                                    65.7977+-2.0867     ?     68.2464+-5.2469        ? might be 1.0372x slower
   for-of-array.es5                                 172.9953+-14.9916         170.7838+-14.0335         might be 1.0129x faster
   for-of-array.es6                                 190.1968+-19.8151    ?    202.8972+-33.4669       ? might be 1.0668x slower
   bindings.es5                                      61.2527+-11.9562    ?     64.6559+-0.3929        ? might be 1.0556x slower
   bindings.es6                                      64.6057+-0.3761     ?     64.8993+-0.2570        ?
   destructuring.es5                                 58.4807+-7.1957           56.6716+-5.8298          might be 1.0319x faster
   destructuring.es6                                 60.9296+-3.7189     ?     63.3567+-3.8806        ? might be 1.0398x slower
   map-set-object.es5                                29.8170+-0.1195           29.8151+-0.6593        
   map-set-object.es6                               150.7845+-2.6843     ?    152.5730+-4.1060        ? might be 1.0119x slower

   &lt;geometric&gt;                                       68.1462+-0.7738     ?     68.5582+-1.4546        ? might be 1.0060x slower

                                                          Conf#1                    Conf#2                                      
Geomean of preferred means:
   &lt;scaled-result&gt;                                   44.1172+-0.2000     ?     44.3246+-0.2259        ? might be 1.0047x slower


Conf#1 is ToT, Conf#2 is ToT with this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362734</commentid>
    <comment_count>8</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-10-20 09:49:50 -0700</bug_when>
    <thetext>What about tail bench?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362742</commentid>
    <comment_count>9</comment_count>
      <attachid>324401</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-10-20 10:05:48 -0700</bug_when>
    <thetext>Comment on attachment 324401
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=324401&amp;action=review

r=me

&gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:1739
&gt; +    if (InlineCallFrame::isTail(kind) &amp;&amp; ByteCodeParser::handleRecursiveTailCall(callee, registerOffset, argumentCountIncludingThis, insertChecksWithAccounting)) {

I think you should check the kind == InlineCallFrame::TailCall here and not InlineCallFrame::isTail since that returns true for varargs. Even if this is never called with varargs, I think being explicit is more intuitive.

&gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:1797
&gt; +        (void) c;

Why name this parameter if it&apos;s unused?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362744</commentid>
    <comment_count>10</comment_count>
      <attachid>324413</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-20 10:20:47 -0700</bug_when>
    <thetext>Created attachment 324413
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362746</commentid>
    <comment_count>11</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-10-20 10:21:40 -0700</bug_when>
    <thetext>Attachment 324413 did not pass style-queue:


ERROR: Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:1346:  Multi line control clauses should use braces.  [whitespace/braces] [4]
Total errors found: 1 in 2 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1362748</commentid>
    <comment_count>12</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-10-20 10:22:21 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #9)
&gt; Comment on attachment 324401 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=324401&amp;action=review
&gt; 
&gt; r=me
&gt; 
&gt; &gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:1739
&gt; &gt; +    if (InlineCallFrame::isTail(kind) &amp;&amp; ByteCodeParser::handleRecursiveTailCall(callee, registerOffset, argumentCountIncludingThis, insertChecksWithAccounting)) {
&gt; 
&gt; I think you should check the kind == InlineCallFrame::TailCall here and not
&gt; InlineCallFrame::isTail since that returns true for varargs. Even if this is
&gt; never called with varargs, I think being explicit is more intuitive.

Done

&gt; &gt; Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:1797
&gt; &gt; +        (void) c;
&gt; 
&gt; Why name this parameter if it&apos;s unused?

I didn&apos;t know that parameter names are optional for C++ lambdas. Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1364528</commentid>
    <comment_count>13</comment_count>
      <attachid>324413</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2017-10-25 15:16:10 -0700</bug_when>
    <thetext>Comment on attachment 324413
Patch

You mean r?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1370295</commentid>
    <comment_count>14</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-11-10 07:23:19 -0800</bug_when>
    <thetext>I benchmarked this change on TailBench, and it does not seem to have any significant performance change, probably because all calls are monomorphic.
I will try to test it on ARES/Speedometer to see if there is anything that benefits from it, but I am not very optimistic.

sbarati: do you think it is worth landing nonetheless for the refactoring (making it a lot clearer which code is used for varargs and for non-varargs calls)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1370341</commentid>
    <comment_count>15</comment_count>
      <attachid>324413</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-11-10 08:40:02 -0800</bug_when>
    <thetext>Comment on attachment 324413
Patch

r=me
It’d be nice to both add this with tests and micro benchmarks. An interesting test would be having all of the polymorphic calllees on the in-line stack, so you jump to different places depending on callee. It’d also be interesting to have tests where one of the polymorphic callees is on the stack, and we go down normal in lining for the others.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1370344</commentid>
    <comment_count>16</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-11-10 08:41:40 -0800</bug_when>
    <thetext>(In reply to Robin Morisset from comment #14)
&gt; I benchmarked this change on TailBench, and it does not seem to have any
&gt; significant performance change, probably because all calls are monomorphic.
&gt; I will try to test it on ARES/Speedometer to see if there is anything that
&gt; benefits from it, but I am not very optimistic.
&gt; 
&gt; sbarati: do you think it is worth landing nonetheless for the refactoring
&gt; (making it a lot clearer which code is used for varargs and for non-varargs
&gt; calls)?

I think it’s worth landing just for quality of tail call loop optimization implementation. Just because it’s not used by TailBench doesn’t mean it won’t be used by programs that use tail calls heavily.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1370391</commentid>
    <comment_count>17</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-11-10 09:56:43 -0800</bug_when>
    <thetext>You were right to insist on specific tests and benchmarks, the first benchmark I tested that should trigger this optimisation (a variant of merge-sort.js in CPS) hangs in one in 5 runs approximately (and sadly works fine with useConcurrentJIT=false, and works fine in debug mode, and works fine when restricting the functions being dfg compiled).
I am investigating, will keep you informed.

(In reply to Saam Barati from comment #15)
&gt; Comment on attachment 324413 [details]
&gt; Patch
&gt; 
&gt; r=me
&gt; It’d be nice to both add this with tests and micro benchmarks. An
&gt; interesting test would be having all of the polymorphic calllees on the
&gt; in-line stack, so you jump to different places depending on callee. It’d
&gt; also be interesting to have tests where one of the polymorphic callees is on
&gt; the stack, and we go down normal in lining for the others.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1374876</commentid>
    <comment_count>18</comment_count>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-11-27 02:59:33 -0800</bug_when>
    <thetext>The bug was unrelated to this patch. I made a separate bug for it: https://bugs.webkit.org/show_bug.cgi?id=179835</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1374997</commentid>
    <comment_count>19</comment_count>
      <attachid>324413</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-11-27 10:42:26 -0800</bug_when>
    <thetext>Comment on attachment 324413
Patch

Rejecting attachment 324413 from commit-queue.

Failed to run &quot;[&apos;/Volumes/Data/EWS/WebKit/Tools/Scripts/webkit-patch&apos;, &apos;--status-host=webkit-queues.webkit.org&apos;, &apos;--bot-id=webkit-cq-03&apos;, &apos;apply-attachment&apos;, &apos;--no-update&apos;, &apos;--non-interactive&apos;, 324413, &apos;--port=mac&apos;]&quot; exit_code: 2 cwd: /Volumes/Data/EWS/WebKit

Last 500 characters of output:
(offset 6 lines).
Hunk #9 succeeded at 1973 (offset 6 lines).
Hunk #10 succeeded at 1996 (offset 6 lines).
Hunk #11 succeeded at 2038 (offset 6 lines).
Hunk #12 succeeded at 2064 (offset 6 lines).
Hunk #13 succeeded at 2105 (offset 6 lines).
2 out of 13 hunks FAILED -- saving rejects to file Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp.rej

Failed to run &quot;[u&apos;/Volumes/Data/EWS/WebKit/Tools/Scripts/svn-apply&apos;, &apos;--force&apos;, &apos;--reviewer&apos;, u&apos;Saam Barati&apos;]&quot; exit_code: 1 cwd: /Volumes/Data/EWS/WebKit

Full output: http://webkit-queues.webkit.org/results/5376411</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375289</commentid>
    <comment_count>20</comment_count>
      <attachid>327738</attachid>
    <who name="Robin Morisset">rmorisset</who>
    <bug_when>2017-11-28 02:38:16 -0800</bug_when>
    <thetext>Created attachment 327738
Patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375312</commentid>
    <comment_count>21</comment_count>
      <attachid>327738</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-11-28 05:11:36 -0800</bug_when>
    <thetext>Comment on attachment 327738
Patch for landing

Clearing flags on attachment: 327738

Committed r225212: &lt;https://trac.webkit.org/changeset/225212&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375313</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-11-28 05:11:38 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1375314</commentid>
    <comment_count>23</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-11-28 05:12:34 -0800</bug_when>
    <thetext>&lt;rdar://problem/35720919&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>324250</attachid>
            <date>2017-10-19 10:48:33 -0700</date>
            <delta_ts>2017-10-19 12:15:55 -0700</delta_ts>
            <desc>WIP, preliminary refactoring</desc>
            <filename>bug-178390-20171019194831.patch</filename>
            <type>text/plain</type>
            <size>29010</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIzNjg4CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCmluZGV4IDc5MjQ2ODhmZjAzZjNiM2E2M2FlOTM3ODYw
MjVjZGNjNWNmMTBlMzUuLjU5MWUyOWVkMzc5ODFiYTY2MmU5NDBjZTEyNWFhOTZmMTgzMzZmZmMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIu
Y3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3Bw
CkBAIC0yMjQsMTEgKzIyNCwxMiBAQCBwcml2YXRlOgogICAgIHZvaWQgZW1pdEZ1bmN0aW9uQ2hl
Y2tzKENhbGxWYXJpYW50LCBOb2RlKiBjYWxsVGFyZ2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0Fy
Z3VtbnQpOwogICAgIHZvaWQgZW1pdEFyZ3VtZW50UGhhbnRvbXMoaW50IHJlZ2lzdGVyT2Zmc2V0
LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMpOwogICAgIE5vZGUqIGdldEFyZ3VtZW50
Q291bnQoKTsKLSAgICBib29sIGhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKE5vZGUqIGNhbGxUYXJn
ZXROb2RlLCBjb25zdCBDYWxsTGlua1N0YXR1cyYsIGludCByZWdpc3Rlck9mZnNldCwgVmlydHVh
bFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzKTsK
KyAgICBib29sIGhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBD
YWxsVmFyaWFudCwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3Vt
ZW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMpOwogICAgIHVuc2lnbmVkIGlubGlu
aW5nQ29zdChDYWxsVmFyaWFudCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBJbmxp
bmVDYWxsRnJhbWU6OktpbmQpOyAvLyBSZXR1cm4gVUlOVF9NQVggaWYgaXQncyBub3QgYW4gaW5s
aW5pbmcgY2FuZGlkYXRlLiBCeSBjb252ZW50aW9uLCBpbnRyaW5zaWNzIGhhdmUgYSBjb3N0IG9m
IDEuCi0gICAgdW5zaWduZWQgZ2V0SW5saW5pbmdCYWxhbmNlKCkKICAgICAvLyBIYW5kbGUgaW5s
aW5pbmcuIFJldHVybiB0cnVlIGlmIGl0IHN1Y2NlZWRlZCwgZmFsc2UgaWYgd2UgbmVlZCB0byBw
bGFudCBhIGNhbGwuCi0gICAgYm9vbCBoYW5kbGVJbmxpbmluZyhOb2RlKiBjYWxsVGFyZ2V0Tm9k
ZSwgaW50IHJlc3VsdE9wZXJhbmQsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiwgaW50IHJlZ2lzdGVy
T2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBWaXJ0dWFsUmVnaXN0ZXIgYXJn
dW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwgaW50IGFyZ3VtZW50Q291
bnRJbmNsdWRpbmdUaGlzLCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBOb2RlVHlwZSBjYWxsT3AsIElu
bGluZUNhbGxGcmFtZTo6S2luZCwgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlvbik7CisgICAgYm9v
bCBoYW5kbGVWYXJhcmdzSW5saW5pbmcoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRP
cGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYsIGludCByZWdpc3Rlck9mZnNldCwgVmlydHVh
bFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgVmlydHVhbFJlZ2lzdGVyIGFyZ3VtZW50c0FyZ3VtZW50
LCB1bnNpZ25lZCBhcmd1bWVudHNPZmZzZXQsIHVuc2lnbmVkIG5leHRPZmZzZXQsIE5vZGVUeXBl
IGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kKTsKKyAgICB1bnNpZ25lZCBnZXRJbmxpbmlu
Z0JhbGFuY2UoY29uc3QgQ2FsbExpbmtTdGF0dXMmLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsK
KyAgICBib29sIGhhbmRsZUlubGluaW5nKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0
T3BlcmFuZCwgY29uc3QgQ2FsbExpbmtTdGF0dXMmLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1
YWxSZWdpc3RlciB0aGlzQXJndW1lbnQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywg
dW5zaWduZWQgbmV4dE9mZnNldCwgTm9kZVR5cGUgY2FsbE9wLCBJbmxpbmVDYWxsRnJhbWU6Oktp
bmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRpY3Rpb24pOwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIENo
ZWNrc0Z1bmN0b3I+CiAgICAgYm9vbCBhdHRlbXB0VG9JbmxpbmVDYWxsKE5vZGUqIGNhbGxUYXJn
ZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZhcmlhbnQsIGludCByZWdpc3Rlck9mZnNl
dCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBJ
bmxpbmVDYWxsRnJhbWU6OktpbmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRpY3Rpb24sIHVuc2lnbmVk
JiBpbmxpbmluZ0JhbGFuY2UsIEJhc2ljQmxvY2sqIGNvbnRpbnVhdGlvbkJsb2NrLCBjb25zdCBD
aGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpOwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNr
c0Z1bmN0b3I+CkBAIC0xMjk5LDcgKzEzMDAsOCBAQCBCeXRlQ29kZVBhcnNlcjo6VGVybWluYWxp
dHkgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwoCiAgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNh
bk9wdGltaXplKCkpIHsKICAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCA9IHZp
cnR1YWxSZWdpc3RlckZvckFyZ3VtZW50KDAsIHJlZ2lzdGVyT2Zmc2V0KTsKIAotICAgICAgICBp
ZiAob3AgPT0gVGFpbENhbGwgJiYgaGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoY2FsbFRhcmdldCwg
Y2FsbExpbmtTdGF0dXMsIHJlZ2lzdGVyT2Zmc2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50Q291
bnRJbmNsdWRpbmdUaGlzKSkKKyAgICAgICAgaWYgKG9wID09IFRhaWxDYWxsICYmICFjYWxsTGlu
a1N0YXR1cy5jb3VsZFRha2VTbG93UGF0aCgpICYmIGNhbGxMaW5rU3RhdHVzLnNpemUoKSA9PSAx
CisgICAgICAgICAgICAmJiBoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChjYWxsVGFyZ2V0LCBjYWxs
TGlua1N0YXR1c1swXSwgcmVnaXN0ZXJPZmZzZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRDb3Vu
dEluY2x1ZGluZ1RoaXMpKQogICAgICAgICAgICAgcmV0dXJuIFRlcm1pbmFsOwogCiAgICAgICAg
IC8vIElubGluaW5nIGlzIHF1aXRlIGNvbXBsZXgsIGFuZCBtYW5hZ2VkIGJ5IGEgcGlwZWxpbmUg
b2YgZnVuY3Rpb25zOgpAQCAtMTMwOSw3ICsxMzExLDcgQEAgQnl0ZUNvZGVQYXJzZXI6OlRlcm1p
bmFsaXR5IEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVDYWxsKAogICAgICAgICAvLyAtIGF0dGVtcHRU
b0lubGluZUNhbGwgZGVhbHMgd2l0aCBzcGVjaWFsIGNhc2VzIHN1Y2ggYXMgaW50cmluc2ljcywg
aXQgYWxzbyBjaGVja3MgdGhlIGlubGluaW5nIGhldXJpc3RpYyAodGhyb3VnaCBpbmxpbmluZ0Nv
c3QpCiAgICAgICAgIC8vIC0gaW5saW5lQ2FsbCBmaW5hbGx5IGRvZXMgdGhlIGFjdHVhbCBpbmxp
bmluZywgYWZ0ZXIgYSBjb21wbGljYXRlZCBwcm9jZWR1cmUgdG8gc2V0dXAgdGhlIHN0YWNrIGNv
cnJlY3RseQogICAgICAgICB1bnNpZ25lZCBuZXh0T2Zmc2V0ID0gbV9jdXJyZW50SW5kZXggKyBp
bnN0cnVjdGlvblNpemU7Ci0gICAgICAgIGlmIChoYW5kbGVJbmxpbmluZyhjYWxsVGFyZ2V0LCBy
ZXN1bHQsIGNhbGxMaW5rU3RhdHVzLCByZWdpc3Rlck9mZnNldCwgdGhpc0FyZ3VtZW50LCBWaXJ0
dWFsUmVnaXN0ZXIoKSwgMCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQs
IG9wLCBraW5kLCBwcmVkaWN0aW9uKSkgeworICAgICAgICBpZiAoaGFuZGxlSW5saW5pbmcoY2Fs
bFRhcmdldCwgcmVzdWx0LCBjYWxsTGlua1N0YXR1cywgcmVnaXN0ZXJPZmZzZXQsIHRoaXNBcmd1
bWVudCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQsIG9wLCBraW5kLCBw
cmVkaWN0aW9uKSkgewogICAgICAgICAgICAgaWYgKFVOTElLRUxZKG1fZ3JhcGguY29tcGlsYXRp
b24oKSkpCiAgICAgICAgICAgICAgICAgbV9ncmFwaC5jb21waWxhdGlvbigpLT5ub3RpY2VJbmxp
bmVkQ2FsbCgpOwogICAgICAgICAgICAgcmV0dXJuIE5vblRlcm1pbmFsOwpAQCAtMTM0NiwxMSAr
MTM0OCwxNSBAQCBCeXRlQ29kZVBhcnNlcjo6VGVybWluYWxpdHkgQnl0ZUNvZGVQYXJzZXI6Omhh
bmRsZVZhcmFyZ3NDYWxsKEluc3RydWN0aW9uKiBwYywgTgogICAgIAogICAgIFZFUkJPU0VfTE9H
KCIgICAgVmFyYXJncyBjYWxsIGxpbmsgc3RhdHVzIGF0ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCks
ICI6ICIsIGNhbGxMaW5rU3RhdHVzLCAiXG4iKTsKICAgICAKLSAgICBpZiAoY2FsbExpbmtTdGF0
dXMuY2FuT3B0aW1pemUoKQotICAgICAgICAmJiBoYW5kbGVJbmxpbmluZyhjYWxsVGFyZ2V0LCBy
ZXN1bHQsIGNhbGxMaW5rU3RhdHVzLCBmaXJzdEZyZWVSZWcsIFZpcnR1YWxSZWdpc3Rlcih0aGlz
UmVnKSwgVmlydHVhbFJlZ2lzdGVyKGFyZ3VtZW50cyksIGZpcnN0VmFyQXJnT2Zmc2V0LCAwLCBt
X2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfY2FsbF92YXJhcmdzKSwgb3AsIElubGlu
ZUNhbGxGcmFtZTo6dmFyYXJnc0tpbmRGb3IoY2FsbE1vZGUpLCBwcmVkaWN0aW9uKSkgewotICAg
ICAgICBpZiAoVU5MSUtFTFkobV9ncmFwaC5jb21waWxhdGlvbigpKSkKLSAgICAgICAgICAgIG1f
Z3JhcGguY29tcGlsYXRpb24oKS0+bm90aWNlSW5saW5lZENhbGwoKTsKLSAgICAgICAgcmV0dXJu
IE5vblRlcm1pbmFsOworICAgIGlmIChjYWxsTGlua1N0YXR1cy5jYW5PcHRpbWl6ZSgpKSB7Cisg
ICAgICAgIGlmIChoYW5kbGVWYXJhcmdzSW5saW5pbmcoY2FsbFRhcmdldCwgcmVzdWx0LAorICAg
ICAgICAgICAgY2FsbExpbmtTdGF0dXMsIGZpcnN0RnJlZVJlZywgVmlydHVhbFJlZ2lzdGVyKHRo
aXNSZWcpLCBWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRzKSwKKyAgICAgICAgICAgIGZpcnN0VmFy
QXJnT2Zmc2V0LCBtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfY2FsbF92YXJhcmdz
KSwgb3AsCisgICAgICAgICAgICBJbmxpbmVDYWxsRnJhbWU6OnZhcmFyZ3NLaW5kRm9yKGNhbGxN
b2RlKSkpIHsKKyAgICAgICAgICAgIGlmIChVTkxJS0VMWShtX2dyYXBoLmNvbXBpbGF0aW9uKCkp
KQorICAgICAgICAgICAgICAgIG1fZ3JhcGguY29tcGlsYXRpb24oKS0+bm90aWNlSW5saW5lZENh
bGwoKTsKKyAgICAgICAgICAgIHJldHVybiBOb25UZXJtaW5hbDsKKyAgICAgICAgfQogICAgIH0K
ICAgICAKICAgICBDYWxsVmFyYXJnc0RhdGEqIGRhdGEgPSBtX2dyYXBoLm1fY2FsbFZhcmFyZ3NE
YXRhLmFkZCgpOwpAQCAtMTQxOSwxNCArMTQyNSw5IEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OmVt
aXRBcmd1bWVudFBoYW50b21zKGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJ
CiAgICAgICAgIGFkZFRvR3JhcGgoUGhhbnRvbSwgZ2V0KHZpcnR1YWxSZWdpc3RlckZvckFyZ3Vt
ZW50KGksIHJlZ2lzdGVyT2Zmc2V0KSkpOwogfQogCi1ib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5k
bGVSZWN1cnNpdmVUYWlsQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgY29uc3QgQ2FsbExpbmtT
dGF0dXMmIGNhbGxMaW5rU3RhdHVzLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3Rl
ciB0aGlzQXJndW1lbnQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcykKK2Jvb2wgQnl0
ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2Rl
LCBDYWxsVmFyaWFudCBjYWxsVmFyaWFudCwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVn
aXN0ZXIgdGhpc0FyZ3VtZW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMpCiB7Ci0g
ICAgLy8gRklYTUU6IFdlIGN1cnJlbnRseSBvbmx5IGRvIHRoaXMgb3B0aW1pc2F0aW9uIGluIHRo
ZSBzaW1wbGUsIG5vbi1wb2x5bW9ycGhpYyBjYXNlLgotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzgzOTAKLSAgICBpZiAoY2FsbExpbmtTdGF0dXMuY291
bGRUYWtlU2xvd1BhdGgoKSB8fCBjYWxsTGlua1N0YXR1cy5zaXplKCkgIT0gMSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byB0YXJnZXRFeGVjdXRhYmxlID0gY2FsbExpbmtTdGF0
dXNbMF0uZXhlY3V0YWJsZSgpOworICAgIGF1dG8gdGFyZ2V0RXhlY3V0YWJsZSA9IGNhbGxWYXJp
YW50LmV4ZWN1dGFibGUoKTsKICAgICBJbmxpbmVTdGFja0VudHJ5KiBzdGFja0VudHJ5ID0gbV9p
bmxpbmVTdGFja1RvcDsKICAgICBkbyB7CiAgICAgICAgIGlmICh0YXJnZXRFeGVjdXRhYmxlICE9
IHN0YWNrRW50cnktPmV4ZWN1dGFibGUoKSkKQEAgLTE0NDYsNyArMTQ0Nyw3IEBAIGJvb2wgQnl0
ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2Rl
LCBjb25zdCBDYWxsTGluCiAgICAgICAgIH0KIAogICAgICAgICAvLyBXZSBtdXN0IGFkZCBzb21l
IGNoZWNrIHRoYXQgdGhlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3YXMgY29ycmVjdCBhbmQgdGhl
IHRhcmdldCBvZiB0aGlzIGNhbGwgaXMgd2hhdCB3ZSB0aG91Z2h0Ci0gICAgICAgIGVtaXRGdW5j
dGlvbkNoZWNrcyhjYWxsTGlua1N0YXR1c1swXSwgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVu
dCk7CisgICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsVmFyaWFudCwgY2FsbFRhcmdldE5v
ZGUsIHRoaXNBcmd1bWVudCk7CiAgICAgICAgIC8vIFdlIGZsdXNoIGV2ZXJ5dGhpbmcsIGFzIGlm
IHdlIHdlcmUgaW4gdGhlIGJhY2tlZGdlIG9mIGEgbG9vcCAoc2VlIHRyZWF0bWVudCBvZiBvcF9q
bXAgaW4gcGFyc2VCbG9jaykuCiAgICAgICAgIGZsdXNoRm9yVGVybWluYWwoKTsKIApAQCAtMTc0
Miw2MyArMTc0Myw1MyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjphdHRlbXB0VG9JbmxpbmVDYWxs
KE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZAogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAgICAgCiAgICAgVkVSQk9TRV9MT0coIiAgICBDb25zaWRlcmluZyBjYWxsZWUgIiwg
Y2FsbGVlLCAiXG4iKTsKLSAgICAKLSAgICAvLyBJbnRyaW5zaWNzIGFuZCBpbnRlcm5hbCBmdW5j
dGlvbnMgY2FuIG9ubHkgYmUgaW5saW5lZCBpZiB3ZSdyZSBub3QgZG9pbmcgdmFyYXJncy4gVGhp
cyBpcyBiZWNhdXNlCi0gICAgLy8gd2UgY3VycmVudGx5IGRvbid0IGhhdmUgYW55IHdheSBvZiBn
ZXR0aW5nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmb3IgYXJndW1lbnRzIHRvIG5vbi1KUyB2YXJh
cmdzCi0gICAgLy8gY2FsbHMuIFRoZSBwcmVkaWN0aW9uIHByb3BhZ2F0b3Igd29uJ3QgYmUgb2Yg
YW55IGhlbHAgYmVjYXVzZSBMb2FkVmFyYXJncyBvYnNjdXJlcyB0aGUgZGF0YSBmbG93LAotICAg
IC8vIGFuZCB0aGVyZSBhcmUgbm8gY2FsbHNpdGUgdmFsdWUgcHJvZmlsZXMgYW5kIG5hdGl2ZSBm
dW5jdGlvbiB3b24ndCBoYXZlIGNhbGxlZSB2YWx1ZSBwcm9maWxlcyBmb3IKLSAgICAvLyB0aG9z
ZSBhcmd1bWVudHMuIEV2ZW4gd29yc2UsIGlmIHRoZSBpbnRyaW5zaWMgZGVjaWRlcyB0byBleGl0
LCBpdCB3b24ndCByZWFsbHkgaGF2ZSBhbnl3aGVyZSB0bwotICAgIC8vIGV4aXQgdG86IExvYWRW
YXJhcmdzIGlzIGVmZmVjdGZ1bCBhbmQgaXQncyBwYXJ0IG9mIHRoZSBvcF9jYWxsX3ZhcmFyZ3Ms
IHNvIHdlIGNhbid0IGV4aXQgd2l0aG91dAotICAgIC8vIGNhbGxpbmcgTG9hZFZhcmFyZ3MgdHdp
Y2UuCi0gICAgaWYgKCFJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKSkgewogCi0gICAg
ICAgIGJvb2wgZGlkSW5zZXJ0Q2hlY2tzID0gZmFsc2U7Ci0gICAgICAgIGF1dG8gaW5zZXJ0Q2hl
Y2tzV2l0aEFjY291bnRpbmcgPSBbJl0gKCkgewotICAgICAgICAgICAgaW5zZXJ0Q2hlY2tzKG51
bGxwdHIpOwotICAgICAgICAgICAgZGlkSW5zZXJ0Q2hlY2tzID0gdHJ1ZTsKLSAgICAgICAgfTsK
KyAgICBib29sIGRpZEluc2VydENoZWNrcyA9IGZhbHNlOworICAgIGF1dG8gaW5zZXJ0Q2hlY2tz
V2l0aEFjY291bnRpbmcgPSBbJl0gKCkgeworICAgICAgICBpbnNlcnRDaGVja3MobnVsbHB0cik7
CisgICAgICAgIGRpZEluc2VydENoZWNrcyA9IHRydWU7CisgICAgfTsKIAotICAgICAgICBhdXRv
IGVuZFNwZWNpYWxDYXNlID0gWyZdICgpIHsKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKGRp
ZEluc2VydENoZWNrcyk7Ci0gICAgICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20sIGNhbGxUYXJn
ZXROb2RlKTsKLSAgICAgICAgICAgIGVtaXRBcmd1bWVudFBoYW50b21zKHJlZ2lzdGVyT2Zmc2V0
LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcyk7Ci0gICAgICAgICAgICBpbmxpbmluZ0JhbGFu
Y2UtLTsKLSAgICAgICAgICAgIGlmIChjb250aW51YXRpb25CbG9jaykgewotICAgICAgICAgICAg
ICAgIG1fY3VycmVudEluZGV4ID0gbmV4dE9mZnNldDsKLSAgICAgICAgICAgICAgICBtX2V4aXRP
SyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1NldExvY2FsUXVldWUoKTsKLSAgICAg
ICAgICAgICAgICBhZGRKdW1wVG8oY29udGludWF0aW9uQmxvY2spOwotICAgICAgICAgICAgfQot
ICAgICAgICB9OwotICAgIAotICAgICAgICBpZiAoSW50ZXJuYWxGdW5jdGlvbiogZnVuY3Rpb24g
PSBjYWxsZWUuaW50ZXJuYWxGdW5jdGlvbigpKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlQ29u
c3RhbnRJbnRlcm5hbEZ1bmN0aW9uKGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBmdW5j
dGlvbiwgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBzcGVjaWFs
aXphdGlvbktpbmQsIHByZWRpY3Rpb24sIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nKSkgewot
ICAgICAgICAgICAgICAgIGVuZFNwZWNpYWxDYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5z
ZXJ0Q2hlY2tzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIGVuZFNwZWNp
YWxDYXNlID0gWyZdICgpIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoZGlkSW5zZXJ0Q2hlY2tz
KTsKKyAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tLCBjYWxsVGFyZ2V0Tm9kZSk7CisgICAgICAg
IGVtaXRBcmd1bWVudFBoYW50b21zKHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVk
aW5nVGhpcyk7CisgICAgICAgIGlubGluaW5nQmFsYW5jZS0tOworICAgICAgICBpZiAoY29udGlu
dWF0aW9uQmxvY2spIHsKKyAgICAgICAgICAgIG1fY3VycmVudEluZGV4ID0gbmV4dE9mZnNldDsK
KyAgICAgICAgICAgIG1fZXhpdE9LID0gdHJ1ZTsKKyAgICAgICAgICAgIHByb2Nlc3NTZXRMb2Nh
bFF1ZXVlKCk7CisgICAgICAgICAgICBhZGRKdW1wVG8oY29udGludWF0aW9uQmxvY2spOwogICAg
ICAgICB9Ci0gICAgCi0gICAgICAgIEludHJpbnNpYyBpbnRyaW5zaWMgPSBjYWxsZWUuaW50cmlu
c2ljRm9yKHNwZWNpYWxpemF0aW9uS2luZCk7Ci0gICAgICAgIGlmIChpbnRyaW5zaWMgIT0gTm9J
bnRyaW5zaWMpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVJbnRyaW5zaWNDYWxsKGNhbGxUYXJn
ZXROb2RlLCByZXN1bHRPcGVyYW5kLCBpbnRyaW5zaWMsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVu
dENvdW50SW5jbHVkaW5nVGhpcywgcHJlZGljdGlvbiwgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRp
bmcpKSB7Ci0gICAgICAgICAgICAgICAgZW5kU3BlY2lhbENhc2UoKTsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICB9OwogCi0gICAgICAgICAgICBSRUxF
QVNFX0FTU0VSVCghZGlkSW5zZXJ0Q2hlY2tzKTsKLSAgICAgICAgICAgIC8vIFdlIG1pZ2h0IHN0
aWxsIHRyeSB0byBpbmxpbmUgdGhlIEludHJpbnNpYyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGEgYnVp
bHRpbiBKUyBmdW5jdGlvbi4KKyAgICBpZiAoSW50ZXJuYWxGdW5jdGlvbiogZnVuY3Rpb24gPSBj
YWxsZWUuaW50ZXJuYWxGdW5jdGlvbigpKSB7CisgICAgICAgIGlmIChoYW5kbGVDb25zdGFudElu
dGVybmFsRnVuY3Rpb24oY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGZ1bmN0aW9uLCBy
ZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHNwZWNpYWxpemF0aW9u
S2luZCwgcHJlZGljdGlvbiwgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRpbmcpKSB7CisgICAgICAg
ICAgICBlbmRTcGVjaWFsQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg
IH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICAgICAgaWYgKE9wdGlvbnM6OnVzZURPTUpJVCgpKSB7
Ci0gICAgICAgICAgICBpZiAoY29uc3QgRE9NSklUOjpTaWduYXR1cmUqIHNpZ25hdHVyZSA9IGNh
bGxlZS5zaWduYXR1cmVGb3Ioc3BlY2lhbGl6YXRpb25LaW5kKSkgewotICAgICAgICAgICAgICAg
IGlmIChoYW5kbGVET01KSVRDYWxsKGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBzaWdu
YXR1cmUsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgcHJlZGlj
dGlvbiwgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IGVuZFNwZWNpYWxDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5zZXJ0
Q2hlY2tzKTsKKyAgICBJbnRyaW5zaWMgaW50cmluc2ljID0gY2FsbGVlLmludHJpbnNpY0Zvcihz
cGVjaWFsaXphdGlvbktpbmQpOworICAgIGlmIChpbnRyaW5zaWMgIT0gTm9JbnRyaW5zaWMpIHsK
KyAgICAgICAgaWYgKGhhbmRsZUludHJpbnNpY0NhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9w
ZXJhbmQsIGludHJpbnNpYywgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdU
aGlzLCBwcmVkaWN0aW9uLCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykpIHsKKyAgICAgICAg
ICAgIGVuZFNwZWNpYWxDYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorCisgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVja3MpOworICAgICAgICAv
LyBXZSBtaWdodCBzdGlsbCB0cnkgdG8gaW5saW5lIHRoZSBJbnRyaW5zaWMgYmVjYXVzZSBpdCBt
aWdodCBiZSBhIGJ1aWx0aW4gSlMgZnVuY3Rpb24uCisgICAgfQorCisgICAgaWYgKE9wdGlvbnM6
OnVzZURPTUpJVCgpKSB7CisgICAgICAgIGlmIChjb25zdCBET01KSVQ6OlNpZ25hdHVyZSogc2ln
bmF0dXJlID0gY2FsbGVlLnNpZ25hdHVyZUZvcihzcGVjaWFsaXphdGlvbktpbmQpKSB7CisgICAg
ICAgICAgICBpZiAoaGFuZGxlRE9NSklUQ2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFu
ZCwgc2lnbmF0dXJlLCByZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMs
IHByZWRpY3Rpb24sIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nKSkgeworICAgICAgICAgICAg
ICAgIGVuZFNwZWNpYWxDYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAg
ICAgICAgICB9CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5zZXJ0Q2hlY2tzKTsK
ICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTE4MTMsNyArMTgwNCwxMjggQEAgYm9vbCBCeXRl
Q29kZVBhcnNlcjo6YXR0ZW1wdFRvSW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50
IHJlc3VsdE9wZXJhbmQKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdW5zaWduZWQgQnl0ZUNvZGVQ
YXJzZXI6OmdldElubGluaW5nQmFsYW5jZSgpIHsKK2Jvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRs
ZVZhcmFyZ3NJbmxpbmluZyhOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQs
CisgICAgY29uc3QgQ2FsbExpbmtTdGF0dXMmIGNhbGxMaW5rU3RhdHVzLCBpbnQgZmlyc3RGcmVl
UmVnLCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LAorICAgIFZpcnR1YWxSZWdpc3RlciBh
cmd1bWVudHNBcmd1bWVudCwgdW5zaWduZWQgYXJndW1lbnRzT2Zmc2V0LAorICAgIHVuc2lnbmVk
IG5leHRPZmZzZXQsIE5vZGVUeXBlIGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kIGtpbmQp
Cit7CisgICAgVkVSQk9TRV9MT0coIkhhbmRsaW5nIGlubGluaW5nIChWYXJhcmdzKS4uLlxuU3Rh
Y2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOworICAgIGlmIChjYWxsTGlua1N0YXR1
cy5tYXhOdW1Bcmd1bWVudHMoKSA+IE9wdGlvbnM6Om1heGltdW1WYXJhcmdzRm9ySW5saW5pbmco
KSkgeworICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmluZzogdG9vIG1hbnkgYXJn
dW1lbnRzIGZvciB2YXJhcmdzIGlubGluaW5nLlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNvdWxkVGFrZVNsb3dQYXRoKCkgfHwgY2Fs
bExpbmtTdGF0dXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgVkVSQk9TRV9MT0coIkJhaWxpbmcg
aW5saW5pbmc6IHBvbHltb3JwaGljIGlubGluaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciB2
YXJhcmdzLlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDYWxsVmFy
aWFudCBjYWxsVmFyaWFudCA9IGNhbGxMaW5rU3RhdHVzWzBdOworCisgICAgdW5zaWduZWQgbWFu
ZGF0b3J5TWluaW11bTsKKyAgICBpZiAoRnVuY3Rpb25FeGVjdXRhYmxlKiBmdW5jdGlvbkV4ZWN1
dGFibGUgPSBjYWxsVmFyaWFudC5mdW5jdGlvbkV4ZWN1dGFibGUoKSkKKyAgICAgICAgbWFuZGF0
b3J5TWluaW11bSA9IGZ1bmN0aW9uRXhlY3V0YWJsZS0+cGFyYW1ldGVyQ291bnQoKTsKKyAgICBl
bHNlCisgICAgICAgIG1hbmRhdG9yeU1pbmltdW0gPSAwOworICAgIAorICAgIC8vIGluY2x1ZGVz
ICJ0aGlzIgorICAgIHVuc2lnbmVkIG1heE51bUFyZ3VtZW50cyA9IHN0ZDo6bWF4KGNhbGxMaW5r
U3RhdHVzLm1heE51bUFyZ3VtZW50cygpLCBtYW5kYXRvcnlNaW5pbXVtICsgMSk7CisKKyAgICBD
b2RlU3BlY2lhbGl6YXRpb25LaW5kIHNwZWNpYWxpemF0aW9uS2luZCA9IElubGluZUNhbGxGcmFt
ZTo6c3BlY2lhbGl6YXRpb25LaW5kRm9yKGtpbmQpOworICAgIGlmIChpbmxpbmluZ0Nvc3QoY2Fs
bFZhcmlhbnQsIG1heE51bUFyZ3VtZW50cywga2luZCkgPiBnZXRJbmxpbmluZ0JhbGFuY2UoY2Fs
bExpbmtTdGF0dXMsIHNwZWNpYWxpemF0aW9uS2luZCkpIHsKKyAgICAgICAgVkVSQk9TRV9MT0co
IkJhaWxpbmcgaW5saW5pbmc6IGlubGluaW5nIGNvc3QgdG9vIGhpZ2guXG4iKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBmaXJz
dEZyZWVSZWcgKyAxOworICAgIHJlZ2lzdGVyT2Zmc2V0IC09IG1heE51bUFyZ3VtZW50czsgLy8g
aW5jbHVkZXMgInRoaXMiCisgICAgcmVnaXN0ZXJPZmZzZXQgLT0gQ2FsbEZyYW1lOjpoZWFkZXJT
aXplSW5SZWdpc3RlcnM7CisgICAgcmVnaXN0ZXJPZmZzZXQgPSAtV1RGOjpyb3VuZFVwVG9NdWx0
aXBsZU9mKHN0YWNrQWxpZ25tZW50UmVnaXN0ZXJzKCksIC1yZWdpc3Rlck9mZnNldCk7CisgICAg
CisgICAgYXV0byBpbnNlcnRDaGVja3MgPSBbJl0gKENvZGVCbG9jayogY29kZUJsb2NrKSB7Cisg
ICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsVmFyaWFudCwgY2FsbFRhcmdldE5vZGUsIHRo
aXNBcmd1bWVudCk7CisgICAgICAgIAorICAgICAgICBpbnQgcmVtYXBwZWRSZWdpc3Rlck9mZnNl
dCA9CisgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFuZChWaXJ0dWFsUmVnaXN0
ZXIocmVnaXN0ZXJPZmZzZXQpKS5vZmZzZXQoKTsKKyAgICAgICAgCisgICAgICAgIGVuc3VyZUxv
Y2FscyhWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRSZWdpc3Rlck9mZnNldCkudG9Mb2NhbCgpKTsK
KyAgICAgICAgCisgICAgICAgIGludCBhcmd1bWVudFN0YXJ0ID0gcmVnaXN0ZXJPZmZzZXQgKyBD
YWxsRnJhbWU6OmhlYWRlclNpemVJblJlZ2lzdGVyczsKKyAgICAgICAgaW50IHJlbWFwcGVkQXJn
dW1lbnRTdGFydCA9CisgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFuZChWaXJ0
dWFsUmVnaXN0ZXIoYXJndW1lbnRTdGFydCkpLm9mZnNldCgpOworICAgICAgICAKKyAgICAgICAg
TG9hZFZhcmFyZ3NEYXRhKiBkYXRhID0gbV9ncmFwaC5tX2xvYWRWYXJhcmdzRGF0YS5hZGQoKTsK
KyAgICAgICAgZGF0YS0+c3RhcnQgPSBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0
YXJ0ICsgMSk7CisgICAgICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVk
UmVnaXN0ZXJPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50KTsKKyAgICAgICAg
ZGF0YS0+b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OworICAgICAgICBkYXRhLT5saW1pdCA9IG1h
eE51bUFyZ3VtZW50czsKKyAgICAgICAgZGF0YS0+bWFuZGF0b3J5TWluaW11bSA9IG1hbmRhdG9y
eU1pbmltdW07CisgICAgICAgIAorICAgICAgICBpZiAoY2FsbE9wID09IFRhaWxDYWxsRm9yd2Fy
ZFZhcmFyZ3MpCisgICAgICAgICAgICBhZGRUb0dyYXBoKEZvcndhcmRWYXJhcmdzLCBPcEluZm8o
ZGF0YSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhZGRUb0dyYXBoKExvYWRWYXJhcmdz
LCBPcEluZm8oZGF0YSksIGdldChhcmd1bWVudHNBcmd1bWVudCkpOworICAgICAgICAKKyAgICAg
ICAgLy8gTG9hZFZhcmFyZ3MgbWF5IE9TUiBleGl0LiBIZW5jZSwgd2UgbmVlZCB0byBrZWVwIGFs
aXZlIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQKKyAgICAgICAgLy8gYW5kIGFyZ3VtZW50
c0FyZ3VtZW50IGZvciB0aGUgYmFzZWxpbmUgSklULiBIb3dldmVyLCB3ZSBvbmx5IG5lZWQgYSBQ
aGFudG9tIGZvcgorICAgICAgICAvLyBjYWxsVGFyZ2V0Tm9kZSBiZWNhdXNlIHRoZSBvdGhlciAy
IGFyZSBzdGlsbCBpbiB1c2UgYW5kIGFsaXZlIGF0IHRoaXMgcG9pbnQuCisgICAgICAgIGFkZFRv
R3JhcGgoUGhhbnRvbSwgY2FsbFRhcmdldE5vZGUpOworICAgICAgICAKKyAgICAgICAgLy8gSW4g
REZHIElSIGJlZm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJvbCBmbG93IGJldHdlZW4g
YWZ0ZXIgdGhlCisgICAgICAgIC8vIExvYWRWYXJhcmdzIGFuZCB0aGUgbGFzdCBTZXRBcmd1bWVu
dC4gVGhpcyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQgdG8gREZHCisgICAgICAgIC8vIFNT
QS4gRm9ydHVuYXRlbHksIHdlIGFsc28gaGF2ZSBvdGhlciByZWFzb25zIGZvciBub3QgaW5zZXJ0
aW5nIGNvbnRyb2wgZmxvdworICAgICAgICAvLyBiZWZvcmUgU1NBLgorICAgICAgICAKKyAgICAg
ICAgVmFyaWFibGVBY2Nlc3NEYXRhKiBjb3VudFZhcmlhYmxlID0gbmV3VmFyaWFibGVBY2Nlc3NE
YXRhKFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZyYW1lU2xv
dDo6YXJndW1lbnRDb3VudCkpOworICAgICAgICAvLyBUaGlzIGlzIHByZXR0eSBsYW1lLCBidXQg
aXQgd2lsbCBmb3JjZSB0aGUgY291bnQgdG8gYmUgZmx1c2hlZCBhcyBhbiBpbnQuIFRoaXMgZG9l
c24ndAorICAgICAgICAvLyBtYXR0ZXIgdmVyeSBtdWNoLCBzaW5jZSBvdXIgdXNlIG9mIGEgU2V0
QXJndW1lbnQgYW5kIEZsdXNoZXMgZm9yIHRoaXMgbG9jYWwgc2xvdCBpcworICAgICAgICAvLyBt
b3N0bHkganVzdCBhIGZvcm1hbGl0eS4KKyAgICAgICAgY291bnRWYXJpYWJsZS0+cHJlZGljdChT
cGVjSW50MzJPbmx5KTsKKyAgICAgICAgY291bnRWYXJpYWJsZS0+bWVyZ2VJc1Byb2ZpdGFibGVU
b1VuYm94KHRydWUpOworICAgICAgICBOb2RlKiBzZXRBcmd1bWVudENvdW50ID0gYWRkVG9HcmFw
aChTZXRBcmd1bWVudCwgT3BJbmZvKGNvdW50VmFyaWFibGUpKTsKKyAgICAgICAgbV9jdXJyZW50
QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFyaWFibGUtPmxvY2FsKCks
IHNldEFyZ3VtZW50Q291bnQpOworICAgICAgICAKKyAgICAgICAgc2V0KFZpcnR1YWxSZWdpc3Rl
cihhcmd1bWVudFN0YXJ0KSwgZ2V0KHRoaXNBcmd1bWVudCksIEltbWVkaWF0ZU5ha2VkU2V0KTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBhcmd1bWVudCA9IDE7IGFyZ3VtZW50IDwgbWF4TnVtQXJn
dW1lbnRzOyArK2FyZ3VtZW50KSB7CisgICAgICAgICAgICBWYXJpYWJsZUFjY2Vzc0RhdGEqIHZh
cmlhYmxlID0gbmV3VmFyaWFibGVBY2Nlc3NEYXRhKFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZEFy
Z3VtZW50U3RhcnQgKyBhcmd1bWVudCkpOworICAgICAgICAgICAgdmFyaWFibGUtPm1lcmdlU2hv
dWxkTmV2ZXJVbmJveCh0cnVlKTsgLy8gV2UgY3VycmVudGx5IGhhdmUgbm93aGVyZSB0byBwdXQg
dGhlIHR5cGUgY2hlY2sgb24gdGhlIExvYWRWYXJhcmdzLiBMb2FkVmFyYXJncyBpcyBlZmZlY3Rm
dWwsIHNvIGFmdGVyIGl0IGZpbmlzaGVzLCB3ZSBjYW5ub3QgZXhpdC4KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgLy8gRm9yIGEgd2hpbGUgaXQgaGFkIGJlZW4gbXkgaW50ZW50aW9uIHRvIGRv
IHRoaW5ncyBsaWtlIHRoaXMgaW5zaWRlIHRoZQorICAgICAgICAgICAgLy8gcHJlZGljdGlvbiBp
bmplY3Rpb24gcGhhc2UuIEJ1dCBpbiB0aGlzIGNhc2UgaXQncyByZWFsbHkgYmVzdCB0byBkbyBp
dCBoZXJlLAorICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCdzIGhlcmUgdGhhdCB3ZSBoYXZlIGFj
Y2VzcyB0byB0aGUgdmFyaWFibGUgYWNjZXNzIGRhdGFzIGZvciB0aGUKKyAgICAgICAgICAgIC8v
IGlubGluaW5nIHdlJ3JlIGFib3V0IHRvIGRvLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAg
IC8vIFNvbWV0aGluZyBlbHNlIHRoYXQncyBpbnRlcmVzdGluZyBoZXJlIGlzIHRoYXQgd2UnZCBy
ZWFsbHkgbG92ZSB0byBnZXQKKyAgICAgICAgICAgIC8vIHByZWRpY3Rpb25zIGZyb20gdGhlIGFy
Z3VtZW50cyBsb2FkZWQgYXQgdGhlIGNhbGxzaXRlLCByYXRoZXIgdGhhbiB0aGUKKyAgICAgICAg
ICAgIC8vIGFyZ3VtZW50cyByZWNlaXZlZCBpbnNpZGUgdGhlIGNhbGxlZS4gQnV0IHRoYXQgcHJv
YmFibHkgd29uJ3QgbWF0dGVyIGZvciBtb3N0CisgICAgICAgICAgICAvLyBjYWxscy4KKyAgICAg
ICAgICAgIGlmIChjb2RlQmxvY2sgJiYgYXJndW1lbnQgPCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4o
Y29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkpKSB7CisgICAgICAgICAgICAgICAgQ29uY3VycmVu
dEpTTG9ja2VyIGxvY2tlcihjb2RlQmxvY2stPm1fbG9jayk7CisgICAgICAgICAgICAgICAgVmFs
dWVQcm9maWxlJiBwcm9maWxlID0gY29kZUJsb2NrLT52YWx1ZVByb2ZpbGVGb3JBcmd1bWVudChh
cmd1bWVudCk7CisgICAgICAgICAgICAgICAgdmFyaWFibGUtPnByZWRpY3QocHJvZmlsZS5jb21w
dXRlVXBkYXRlZFByZWRpY3Rpb24obG9ja2VyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIE5vZGUqIHNldEFyZ3VtZW50ID0gYWRkVG9HcmFwaChTZXRBcmd1bWVu
dCwgT3BJbmZvKHZhcmlhYmxlKSk7CisgICAgICAgICAgICBtX2N1cnJlbnRCbG9jay0+dmFyaWFi
bGVzQXRUYWlsLnNldE9wZXJhbmQodmFyaWFibGUtPmxvY2FsKCksIHNldEFyZ3VtZW50KTsKKyAg
ICAgICAgfQorICAgIH07CisKKyAgICAvLyBJbnRyaW5zaWNzIGFuZCBpbnRlcm5hbCBmdW5jdGlv
bnMgY2FuIG9ubHkgYmUgaW5saW5lZCBpZiB3ZSdyZSBub3QgZG9pbmcgdmFyYXJncy4gVGhpcyBp
cyBiZWNhdXNlCisgICAgLy8gd2UgY3VycmVudGx5IGRvbid0IGhhdmUgYW55IHdheSBvZiBnZXR0
aW5nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmb3IgYXJndW1lbnRzIHRvIG5vbi1KUyB2YXJhcmdz
CisgICAgLy8gY2FsbHMuIFRoZSBwcmVkaWN0aW9uIHByb3BhZ2F0b3Igd29uJ3QgYmUgb2YgYW55
IGhlbHAgYmVjYXVzZSBMb2FkVmFyYXJncyBvYnNjdXJlcyB0aGUgZGF0YSBmbG93LAorICAgIC8v
IGFuZCB0aGVyZSBhcmUgbm8gY2FsbHNpdGUgdmFsdWUgcHJvZmlsZXMgYW5kIG5hdGl2ZSBmdW5j
dGlvbiB3b24ndCBoYXZlIGNhbGxlZSB2YWx1ZSBwcm9maWxlcyBmb3IKKyAgICAvLyB0aG9zZSBh
cmd1bWVudHMuIEV2ZW4gd29yc2UsIGlmIHRoZSBpbnRyaW5zaWMgZGVjaWRlcyB0byBleGl0LCBp
dCB3b24ndCByZWFsbHkgaGF2ZSBhbnl3aGVyZSB0bworICAgIC8vIGV4aXQgdG86IExvYWRWYXJh
cmdzIGlzIGVmZmVjdGZ1bCBhbmQgaXQncyBwYXJ0IG9mIHRoZSBvcF9jYWxsX3ZhcmFyZ3MsIHNv
IHdlIGNhbid0IGV4aXQgd2l0aG91dAorICAgIC8vIGNhbGxpbmcgTG9hZFZhcmFyZ3MgdHdpY2Uu
CisgICAgSW5zdHJ1Y3Rpb24qIHNhdmVkQ3VycmVudEluc3RydWN0aW9uID0gbV9jdXJyZW50SW5z
dHJ1Y3Rpb247CisgICAgaW5saW5lQ2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwg
Y2FsbFZhcmlhbnQsIHJlZ2lzdGVyT2Zmc2V0LCBtYXhOdW1Bcmd1bWVudHMsIG5leHRPZmZzZXQs
IGtpbmQsIG51bGxwdHIsIGluc2VydENoZWNrcyk7CisgICAgbV9jdXJyZW50SW5zdHJ1Y3Rpb24g
PSBzYXZlZEN1cnJlbnRJbnN0cnVjdGlvbjsKKworICAgIFZFUkJPU0VfTE9HKCJTdWNjZXNzZnVs
IGlubGluaW5nICh2YXJhcmdzLCBtb25vbW9ycGhpYykuXG5TdGFjazogIiwgY3VycmVudENvZGVP
cmlnaW4oKSwgIlxuIik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3Vuc2lnbmVkIEJ5dGVDb2Rl
UGFyc2VyOjpnZXRJbmxpbmluZ0JhbGFuY2UoY29uc3QgQ2FsbExpbmtTdGF0dXMmIGNhbGxMaW5r
U3RhdHVzLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIHNwZWNpYWxpemF0aW9uS2luZCkKK3sKICAg
ICB1bnNpZ25lZCBpbmxpbmluZ0JhbGFuY2UgPSBPcHRpb25zOjptYXhpbXVtRnVuY3Rpb25Gb3JD
YWxsSW5saW5lQ2FuZGlkYXRlSW5zdHJ1Y3Rpb25Db3VudCgpOwogICAgIGlmIChzcGVjaWFsaXph
dGlvbktpbmQgPT0gQ29kZUZvckNvbnN0cnVjdCkKICAgICAgICAgaW5saW5pbmdCYWxhbmNlID0g
c3RkOjptaW4oaW5saW5pbmdCYWxhbmNlLCBPcHRpb25zOjptYXhpbXVtRnVuY3Rpb25Gb3JDb25z
dHJ1Y3RJbmxpbmVDYW5kaWRhdGVJbnN0cnVjdGlvbkNvdW50KCkpOwpAQCAtMTgyNCwxNDYgKzE5
MzYsMzUgQEAgdW5zaWduZWQgQnl0ZUNvZGVQYXJzZXI6OmdldElubGluaW5nQmFsYW5jZSgpIHsK
IAogYm9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcoCiAgICAgTm9kZSogY2FsbFRh
cmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExp
bmtTdGF0dXMsCi0gICAgaW50IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVSZWcsIFZpcnR1YWxS
ZWdpc3RlciB0aGlzQXJndW1lbnQsCi0gICAgVmlydHVhbFJlZ2lzdGVyIGFyZ3VtZW50c0FyZ3Vt
ZW50LCB1bnNpZ25lZCBhcmd1bWVudHNPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5n
VGhpcywKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1l
bnQsCisgICAgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLAogICAgIHVuc2lnbmVkIG5l
eHRPZmZzZXQsIE5vZGVUeXBlIGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kIGtpbmQsIFNw
ZWN1bGF0ZWRUeXBlIHByZWRpY3Rpb24pCiB7CiAgICAgVkVSQk9TRV9MT0coIkhhbmRsaW5nIGlu
bGluaW5nLi4uXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIlxuIik7Ci0gICAgQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6
OnNwZWNpYWxpemF0aW9uS2luZEZvcihraW5kKTsKLSAgICAKLSAgICBpZiAoIWNhbGxMaW5rU3Rh
dHVzLnNpemUoKSkgewotICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmluZy5cbiIp
OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmIChJbmxpbmVDYWxs
RnJhbWU6OmlzVmFyYXJncyhraW5kKQotICAgICAgICAmJiBjYWxsTGlua1N0YXR1cy5tYXhOdW1B
cmd1bWVudHMoKSA+IE9wdGlvbnM6Om1heGltdW1WYXJhcmdzRm9ySW5saW5pbmcoKSkgewotICAg
ICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmluZyBiZWNhdXNlIG9mIHZhcmFyZ3MuXG4i
KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAgICAgCi0gICAgdW5zaWduZWQg
aW5saW5pbmdCYWxhbmNlID0gZ2V0SW5saW5pbmdCYWxhbmNlKCk7CiAgICAgCisgICAgQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6OnNw
ZWNpYWxpemF0aW9uS2luZEZvcihraW5kKTsKKyAgICB1bnNpZ25lZCBpbmxpbmluZ0JhbGFuY2Ug
PSBnZXRJbmxpbmluZ0JhbGFuY2UoY2FsbExpbmtTdGF0dXMsIHNwZWNpYWxpemF0aW9uS2luZCk7
CisKICAgICAvLyBGaXJzdCBjaGVjayBpZiB3ZSBjYW4gYXZvaWQgY3JlYXRpbmcgY29udHJvbCBm
bG93LiBPdXIgaW5saW5lciBkb2VzIHNvbWUgQ0ZHCiAgICAgLy8gc2ltcGxpZmljYXRpb24gb24g
dGhlIGZseSBhbmQgdGhpcyBoZWxwcyByZWR1Y2UgY29tcGlsZSB0aW1lcywgYnV0IHdlIGNhbiBv
bmx5IGxldmVyYWdlCiAgICAgLy8gdGhpcyBpbiBjYXNlcyB3aGVyZSB3ZSBkb24ndCBuZWVkIGNv
bnRyb2wgZmxvdyBkaWFtb25kcyB0byBjaGVjayB0aGUgY2FsbGVlLgogICAgIGlmICghY2FsbExp
bmtTdGF0dXMuY291bGRUYWtlU2xvd1BhdGgoKSAmJiBjYWxsTGlua1N0YXR1cy5zaXplKCkgPT0g
MSkgewotICAgICAgICBpbnQgcmVnaXN0ZXJPZmZzZXQ7Ci0gICAgICAgIAotICAgICAgICAvLyBP
bmx5IHVzZWQgZm9yIHZhcmFyZ3MgY2FsbHMuCi0gICAgICAgIHVuc2lnbmVkIG1hbmRhdG9yeU1p
bmltdW0gPSAwOwotICAgICAgICB1bnNpZ25lZCBtYXhOdW1Bcmd1bWVudHMgPSAwOwotCi0gICAg
ICAgIGlmIChJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKSkgewotICAgICAgICAgICAg
aWYgKEZ1bmN0aW9uRXhlY3V0YWJsZSogZnVuY3Rpb25FeGVjdXRhYmxlID0gY2FsbExpbmtTdGF0
dXNbMF0uZnVuY3Rpb25FeGVjdXRhYmxlKCkpCi0gICAgICAgICAgICAgICAgbWFuZGF0b3J5TWlu
aW11bSA9IGZ1bmN0aW9uRXhlY3V0YWJsZS0+cGFyYW1ldGVyQ291bnQoKTsKLSAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICBtYW5kYXRvcnlNaW5pbXVtID0gMDsKLSAgICAgICAgICAg
IAotICAgICAgICAgICAgLy8gaW5jbHVkZXMgInRoaXMiCi0gICAgICAgICAgICBtYXhOdW1Bcmd1
bWVudHMgPSBzdGQ6Om1heCgKLSAgICAgICAgICAgICAgICBjYWxsTGlua1N0YXR1cy5tYXhOdW1B
cmd1bWVudHMoKSwKLSAgICAgICAgICAgICAgICBtYW5kYXRvcnlNaW5pbXVtICsgMSk7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIHNvcnQgb2YgcHJldGVuZCB0aGF0IHRoaXMgKmlz
KiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkLgotICAgICAgICAgICAg
YXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMgPSBtYXhOdW1Bcmd1bWVudHM7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIHJlZ2lzdGVyT2Zmc2V0ID0gcmVnaXN0ZXJPZmZzZXRPckZpcnN0RnJl
ZVJlZyArIDE7Ci0gICAgICAgICAgICByZWdpc3Rlck9mZnNldCAtPSBtYXhOdW1Bcmd1bWVudHM7
IC8vIGluY2x1ZGVzICJ0aGlzIgotICAgICAgICAgICAgcmVnaXN0ZXJPZmZzZXQgLT0gQ2FsbEZy
YW1lOjpoZWFkZXJTaXplSW5SZWdpc3RlcnM7Ci0gICAgICAgICAgICByZWdpc3Rlck9mZnNldCA9
IC1XVEY6OnJvdW5kVXBUb011bHRpcGxlT2YoCi0gICAgICAgICAgICAgICAgc3RhY2tBbGlnbm1l
bnRSZWdpc3RlcnMoKSwKLSAgICAgICAgICAgICAgICAtcmVnaXN0ZXJPZmZzZXQpOwotICAgICAg
ICB9IGVsc2UKLSAgICAgICAgICAgIHJlZ2lzdGVyT2Zmc2V0ID0gcmVnaXN0ZXJPZmZzZXRPckZp
cnN0RnJlZVJlZzsKLSAgICAgICAgCi0gICAgICAgIGJvb2wgcmVzdWx0ID0gYXR0ZW1wdFRvSW5s
aW5lQ2FsbCgKKyAgICAgICAgcmV0dXJuIGF0dGVtcHRUb0lubGluZUNhbGwoCiAgICAgICAgICAg
ICBjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2FsbExpbmtTdGF0dXNbMF0sIHJlZ2lz
dGVyT2Zmc2V0LAotICAgICAgICAgICAgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRP
ZmZzZXQsIGtpbmQsIHByZWRpY3Rpb24sCi0gICAgICAgICAgICBpbmxpbmluZ0JhbGFuY2UsIG51
bGxwdHIsIFsmXSAoQ29kZUJsb2NrKiBjb2RlQmxvY2spIHsKKyAgICAgICAgICAgIGFyZ3VtZW50
Q291bnRJbmNsdWRpbmdUaGlzLCBuZXh0T2Zmc2V0LCBraW5kLCBwcmVkaWN0aW9uLCBpbmxpbmlu
Z0JhbGFuY2UsIG51bGxwdHIsCisgICAgICAgICAgICBbJl0gKENvZGVCbG9jayogY29kZUJsb2Nr
KSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIGNvZGVCbG9jazsKICAgICAgICAgICAgICAgICBl
bWl0RnVuY3Rpb25DaGVja3MoY2FsbExpbmtTdGF0dXNbMF0sIGNhbGxUYXJnZXROb2RlLCB0aGlz
QXJndW1lbnQpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHZhcmFyZ3MgY2Fs
bCwgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBhcmd1bWVudHMgcmlnaHQgbm93LgotICAgICAgICAg
ICAgICAgIGlmIChJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKSkgewotICAgICAgICAg
ICAgICAgICAgICBpbnQgcmVtYXBwZWRSZWdpc3Rlck9mZnNldCA9Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBtX2lubGluZVN0YWNrVG9wLT5yZW1hcE9wZXJhbmQoVmlydHVhbFJlZ2lzdGVyKHJl
Z2lzdGVyT2Zmc2V0KSkub2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgICAgICBlbnN1cmVMb2NhbHMoVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVkUmVnaXN0ZXJP
ZmZzZXQpLnRvTG9jYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAg
ICAgICBpbnQgYXJndW1lbnRTdGFydCA9IHJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZyYW1lOjpoZWFk
ZXJTaXplSW5SZWdpc3RlcnM7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZW1hcHBlZEFyZ3Vt
ZW50U3RhcnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmxpbmVTdGFja1RvcC0+cmVt
YXBPcGVyYW5kKFZpcnR1YWxSZWdpc3Rlcihhcmd1bWVudFN0YXJ0KSkub2Zmc2V0KCk7Ci0KLSAg
ICAgICAgICAgICAgICAgICAgTG9hZFZhcmFyZ3NEYXRhKiBkYXRhID0gbV9ncmFwaC5tX2xvYWRW
YXJhcmdzRGF0YS5hZGQoKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS0+c3RhcnQgPSBWaXJ0
dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0YXJ0ICsgMSk7Ci0gICAgICAgICAgICAgICAg
ICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVkUmVnaXN0ZXJPZmZzZXQg
KyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgZGF0
YS0+b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBkYXRhLT5s
aW1pdCA9IG1heE51bUFyZ3VtZW50czsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS0+bWFuZGF0
b3J5TWluaW11bSA9IG1hbmRhdG9yeU1pbmltdW07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYg
KGNhbGxPcCA9PSBUYWlsQ2FsbEZvcndhcmRWYXJhcmdzKQotICAgICAgICAgICAgICAgICAgICAg
ICAgYWRkVG9HcmFwaChGb3J3YXJkVmFyYXJncywgT3BJbmZvKGRhdGEpKTsKLSAgICAgICAgICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9HcmFwaChMb2FkVmFy
YXJncywgT3BJbmZvKGRhdGEpLCBnZXQoYXJndW1lbnRzQXJndW1lbnQpKTsKLQotICAgICAgICAg
ICAgICAgICAgICAvLyBMb2FkVmFyYXJncyBtYXkgT1NSIGV4aXQuIEhlbmNlLCB3ZSBuZWVkIHRv
IGtlZXAgYWxpdmUgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVudAotICAgICAgICAgICAgICAg
ICAgICAvLyBhbmQgYXJndW1lbnRzQXJndW1lbnQgZm9yIHRoZSBiYXNlbGluZSBKSVQuIEhvd2V2
ZXIsIHdlIG9ubHkgbmVlZCBhIFBoYW50b20gZm9yCi0gICAgICAgICAgICAgICAgICAgIC8vIGNh
bGxUYXJnZXROb2RlIGJlY2F1c2UgdGhlIG90aGVyIDIgYXJlIHN0aWxsIGluIHVzZSBhbmQgYWxp
dmUgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9t
LCBjYWxsVGFyZ2V0Tm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW4gREZHIElSIGJl
Zm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJvbCBmbG93IGJldHdlZW4gYWZ0ZXIgdGhl
Ci0gICAgICAgICAgICAgICAgICAgIC8vIExvYWRWYXJhcmdzIGFuZCB0aGUgbGFzdCBTZXRBcmd1
bWVudC4gVGhpcyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQgdG8gREZHCi0gICAgICAgICAg
ICAgICAgICAgIC8vIFNTQS4gRm9ydHVuYXRlbHksIHdlIGFsc28gaGF2ZSBvdGhlciByZWFzb25z
IGZvciBub3QgaW5zZXJ0aW5nIGNvbnRyb2wgZmxvdwotICAgICAgICAgICAgICAgICAgICAvLyBi
ZWZvcmUgU1NBLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlQWNj
ZXNzRGF0YSogY291bnRWYXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0YSgKLSAgICAgICAg
ICAgICAgICAgICAgICAgIFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zmc2V0ICsg
Q2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCkpOwotICAgICAgICAgICAgICAgICAgICAvLyBU
aGlzIGlzIHByZXR0eSBsYW1lLCBidXQgaXQgd2lsbCBmb3JjZSB0aGUgY291bnQgdG8gYmUgZmx1
c2hlZCBhcyBhbiBpbnQuIFRoaXMgZG9lc24ndAotICAgICAgICAgICAgICAgICAgICAvLyBtYXR0
ZXIgdmVyeSBtdWNoLCBzaW5jZSBvdXIgdXNlIG9mIGEgU2V0QXJndW1lbnQgYW5kIEZsdXNoZXMg
Zm9yIHRoaXMgbG9jYWwgc2xvdCBpcwotICAgICAgICAgICAgICAgICAgICAvLyBtb3N0bHkganVz
dCBhIGZvcm1hbGl0eS4KLSAgICAgICAgICAgICAgICAgICAgY291bnRWYXJpYWJsZS0+cHJlZGlj
dChTcGVjSW50MzJPbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgY291bnRWYXJpYWJsZS0+bWVy
Z2VJc1Byb2ZpdGFibGVUb1VuYm94KHRydWUpOwotICAgICAgICAgICAgICAgICAgICBOb2RlKiBz
ZXRBcmd1bWVudENvdW50ID0gYWRkVG9HcmFwaChTZXRBcmd1bWVudCwgT3BJbmZvKGNvdW50VmFy
aWFibGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0
VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFyaWFibGUtPmxvY2FsKCksIHNldEFyZ3VtZW50Q291bnQp
OwotCi0gICAgICAgICAgICAgICAgICAgIHNldChWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRTdGFy
dCksIGdldCh0aGlzQXJndW1lbnQpLCBJbW1lZGlhdGVOYWtlZFNldCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGZvciAodW5zaWduZWQgYXJndW1lbnQgPSAxOyBhcmd1bWVudCA8IG1heE51bUFyZ3Vt
ZW50czsgKythcmd1bWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVBY2Nl
c3NEYXRhKiB2YXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0YSgKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0YXJ0ICsgYXJn
dW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5tZXJnZVNob3VsZE5l
dmVyVW5ib3godHJ1ZSk7IC8vIFdlIGN1cnJlbnRseSBoYXZlIG5vd2hlcmUgdG8gcHV0IHRoZSB0
eXBlIGNoZWNrIG9uIHRoZSBMb2FkVmFyYXJncy4gTG9hZFZhcmFyZ3MgaXMgZWZmZWN0ZnVsLCBz
byBhZnRlciBpdCBmaW5pc2hlcywgd2UgY2Fubm90IGV4aXQuCi0gICAgICAgICAgICAgICAgICAg
ICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBhIHdoaWxlIGl0IGhhZCBiZWVu
IG15IGludGVudGlvbiB0byBkbyB0aGluZ3MgbGlrZSB0aGlzIGluc2lkZSB0aGUKLSAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIHByZWRpY3Rpb24gaW5qZWN0aW9uIHBoYXNlLiBCdXQgaW4gdGhp
cyBjYXNlIGl0J3MgcmVhbGx5IGJlc3QgdG8gZG8gaXQgaGVyZSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIGJlY2F1c2UgaXQncyBoZXJlIHRoYXQgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhlIHZh
cmlhYmxlIGFjY2VzcyBkYXRhcyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBp
bmxpbmluZyB3ZSdyZSBhYm91dCB0byBkby4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgZWxzZSB0aGF0J3MgaW50ZXJlc3Rp
bmcgaGVyZSBpcyB0aGF0IHdlJ2QgcmVhbGx5IGxvdmUgdG8gZ2V0Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBwcmVkaWN0aW9ucyBmcm9tIHRoZSBhcmd1bWVudHMgbG9hZGVkIGF0IHRoZSBj
YWxsc2l0ZSwgcmF0aGVyIHRoYW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmd1
bWVudHMgcmVjZWl2ZWQgaW5zaWRlIHRoZSBjYWxsZWUuIEJ1dCB0aGF0IHByb2JhYmx5IHdvbid0
IG1hdHRlciBmb3IgbW9zdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMuCi0gICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoY29kZUJsb2NrICYmIGFyZ3VtZW50IDwgc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KGNvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpKSkgewotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIENvbmN1cnJlbnRKU0xvY2tlciBsb2NrZXIoY29kZUJsb2NrLT5tX2xv
Y2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUHJvZmlsZSYgcHJvZmlsZSA9
IGNvZGVCbG9jay0+dmFsdWVQcm9maWxlRm9yQXJndW1lbnQoYXJndW1lbnQpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5wcmVkaWN0KHByb2ZpbGUuY29tcHV0ZVVwZGF0
ZWRQcmVkaWN0aW9uKGxvY2tlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBOb2RlKiBzZXRBcmd1
bWVudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1lbnQsIE9wSW5mbyh2YXJpYWJsZSkpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5zZXRPcGVy
YW5kKHZhcmlhYmxlLT5sb2NhbCgpLCBzZXRBcmd1bWVudCk7Ci0gICAgICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKLSAgICAgICAgVkVSQk9TRV9M
T0coIkRvbmUgaW5saW5pbmcgKHNpbXBsZSkuXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4o
KSwgIlxuUmVzdWx0OiAiLCByZXN1bHQsICJcbiIpOwotICAgICAgICByZXR1cm4gcmVzdWx0Owog
ICAgIH0KLSAgICAKKwogICAgIC8vIFdlIG5lZWQgdG8gY3JlYXRlIHNvbWUga2luZCBvZiBzd2l0
Y2ggb3ZlciBjYWxsZWUuIEZvciBub3cgd2Ugb25seSBkbyB0aGlzIGlmIHdlIGJlbGlldmUgdGhh
dAogICAgIC8vIHdlJ3JlIGluIHRoZSB0b3AgdGllci4gV2UgaGF2ZSB0d28gcmVhc29ucyBmb3Ig
dGhpczogZmlyc3QsIGl0IHByb3ZpZGVzIHVzIGFuIG9wcG9ydHVuaXR5IHRvCiAgICAgLy8gZG8g
bW9yZSBkZXRhaWxlZCBwb2x5dmFyaWFudC9wb2x5bW9ycGhpYyBwcm9maWxpbmc7IGFuZCBzZWNv
bmQsIGl0IHJlZHVjZXMgY29tcGlsZSB0aW1lcyBpbgogICAgIC8vIHRoZSBERkcuIEFuZCBieSBw
b2x5dmFyaWFudCBwcm9maWxpbmcgd2UgbWVhbiBwb2x5dmFyaWFudCBwcm9maWxpbmcgb2YgKnRo
aXMqIGNhbGwuIE5vdGUgdGhhdAogICAgIC8vIHdlIGNvdWxkIGltcHJvdmUgdGhhdCBhc3BlY3Qg
b2YgdGhpcyBieSBkb2luZyBwb2x5bW9ycGhpYyBpbmxpbmluZyBidXQgaGF2aW5nIHRoZSBwcm9m
aWxpbmcKICAgICAvLyBhbHNvLgotICAgIGlmICghaXNGVEwobV9ncmFwaC5tX3BsYW4ubW9kZSkg
fHwgIU9wdGlvbnM6OnVzZVBvbHltb3JwaGljQ2FsbElubGluaW5nKCkKLSAgICAgICAgfHwgSW5s
aW5lQ2FsbEZyYW1lOjppc1ZhcmFyZ3Moa2luZCkpIHsKKyAgICBpZiAoIWlzRlRMKG1fZ3JhcGgu
bV9wbGFuLm1vZGUpIHx8ICFPcHRpb25zOjp1c2VQb2x5bW9ycGhpY0NhbGxJbmxpbmluZygpKSB7
CiAgICAgICAgIFZFUkJPU0VfTE9HKCJCYWlsaW5nIGlubGluaW5nIChoYXJkKS5cblN0YWNrOiAi
LCBjdXJyZW50Q29kZU9yaWdpbigpLCAiXG4iKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAg
IH0KQEAgLTIwMDIsOCArMjAwMyw2IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUlubGlu
aW5nKAogCiAgICAgVkVSQk9TRV9MT0coIkRvaW5nIGhhcmQgaW5saW5pbmcuLi5cblN0YWNrOiAi
LCBjdXJyZW50Q29kZU9yaWdpbigpLCAiXG4iKTsKIAotICAgIGludCByZWdpc3Rlck9mZnNldCA9
IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVSZWc7Ci0KICAgICAvLyBUaGlzIG1ha2VzIG1lIHdp
c2ggdGhhdCB3ZSB3ZXJlIGluIFNTQSBhbGwgdGhlIHRpbWUuIFdlIG5lZWQgdG8gcGljayBhIHZh
cmlhYmxlIGludG8gd2hpY2ggdG8KICAgICAvLyBzdG9yZSB0aGUgY2FsbGVlIHNvIHRoYXQgaXQg
d2lsbCBiZSBhY2Nlc3NpYmxlIHRvIGFsbCBvZiB0aGUgYmxvY2tzIHdlJ3JlIGFib3V0IHRvIGNy
ZWF0ZS4gV2UKICAgICAvLyBnZXQgYXdheSB3aXRoIGRvaW5nIGFuIGltbWVkaWF0ZS1zZXQgaGVy
ZSBiZWNhdXNlIHdlIHdvdWxkbid0IGhhdmUgcGVyZm9ybWVkIGFueSBzaWRlIGVmZmVjdHMK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>324262</attachid>
            <date>2017-10-19 12:15:59 -0700</date>
            <delta_ts>2017-10-20 08:09:54 -0700</delta_ts>
            <desc>WIP</desc>
            <filename>bug-178390-20171019211557.patch</filename>
            <type>text/plain</type>
            <size>37865</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIzNjkxCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCBl
NTQ2ZjQ5N2VmZjY0MDg2M2MyZjc3MzQyZTIwNmE2ZDE1ZGE2M2Y0Li4wZmU5ZmU2N2JmZGE3ZGJk
Y2RkYWNiZmE4ZmI4ZWVmNDk0YmEyYjkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
NSArMSwyNiBAQAogMjAxNy0xMC0xOSAgUm9iaW4gTW9yaXNzZXQgIDxybW9yaXNzZXRAYXBwbGUu
Y29tPgogCisgICAgICAgIFN1cHBvcnQgcmVjdXJzaXZlIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24g
Zm9yIHBvbHltb3JwaGljIGNhbGxzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNzgzOTAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBDb21lcyB3aXRoIGEgbGFyZ2UgYnV0IGZhaXJseSBzaW1wbGUgcmVmYWN0
b3Jpbmc6IHRoZSBpbmxpbmluZyBwYXRoIGZvciB2YXJhcmdzIGFuZCBub24tdmFyYXJncyBjYWxs
cyBub3cgY29udmVyZ2UgYSBsb3QgbGF0ZXIsCisgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgcmVk
dW5kYW50IGNoZWNrcywgYW5kIHNpbXBsaWZ5aW5nIGEgZmV3IHBhcnRzIG9mIHRoZSBpbmxpbmlu
ZyBwaXBlbGluZS4KKworICAgICAgICAqIGRmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHA6CisgICAg
ICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwpOgorICAgICAgICAoSlND
OjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVWYXJhcmdzQ2FsbCk6CisgICAgICAgIChKU0M6
OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKToKKyAgICAgICAg
KEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aW5saW5lQ2FsbCk6CisgICAgICAgIChKU0M6OkRG
Rzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGxWYXJpYW50KToKKyAgICAgICAgKEpTQzo6REZH
OjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlVmFyYXJnc0lubGluaW5nKToKKyAgICAgICAgKEpTQzo6
REZHOjpCeXRlQ29kZVBhcnNlcjo6Z2V0SW5saW5pbmdCYWxhbmNlKToKKyAgICAgICAgKEpTQzo6
REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcpOgorICAgICAgICAoSlNDOjpERkc6
OkJ5dGVDb2RlUGFyc2VyOjphdHRlbXB0VG9JbmxpbmVDYWxsKTogRGVsZXRlZC4KKworMjAxNy0x
MC0xOSAgUm9iaW4gTW9yaXNzZXQgIDxybW9yaXNzZXRAYXBwbGUuY29tPgorCiAgICAgICAgIFR1
cm4gcmVjdXJzaXZlIHRhaWwgY2FsbHMgaW50byBsb29wcwogICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc2NjAxCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9K
YXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwIGIvU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAKaW5kZXggODczOThkMjY3MzE5MDAwM2Fk
YTAwOWY2YmFkNTY2MGE1MThiOTQzOS4uYjU3MmZkY2FjZmY3OGFjMmM4YTAwNWMxMjM5MWE4MmRj
ODg0ZDZjYSAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29k
ZVBhcnNlci5jcHAKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBh
cnNlci5jcHAKQEAgLTIyNCwxMiArMjI0LDE1IEBAIHByaXZhdGU6CiAgICAgdm9pZCBlbWl0RnVu
Y3Rpb25DaGVja3MoQ2FsbFZhcmlhbnQsIE5vZGUqIGNhbGxUYXJnZXQsIFZpcnR1YWxSZWdpc3Rl
ciB0aGlzQXJndW1udCk7CiAgICAgdm9pZCBlbWl0QXJndW1lbnRQaGFudG9tcyhpbnQgcmVnaXN0
ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcyk7CiAgICAgTm9kZSogZ2V0
QXJndW1lbnRDb3VudCgpOwotICAgIGJvb2wgaGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoTm9kZSog
Y2FsbFRhcmdldE5vZGUsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiwgaW50IHJlZ2lzdGVyT2Zmc2V0
LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNrc0Z1bmN0b3I+CisgICAgYm9vbCBo
YW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChDYWxsVmFyaWFudCwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBp
bnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIGNvbnN0IENoZWNrc0Z1bmN0b3ImIGVtaXRG
dW5jdGlvbkNoZWNrSWZOZWVkZWQpOwogICAgIHVuc2lnbmVkIGlubGluaW5nQ29zdChDYWxsVmFy
aWFudCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBJbmxpbmVDYWxsRnJhbWU6Oktp
bmQpOyAvLyBSZXR1cm4gVUlOVF9NQVggaWYgaXQncyBub3QgYW4gaW5saW5pbmcgY2FuZGlkYXRl
LiBCeSBjb252ZW50aW9uLCBpbnRyaW5zaWNzIGhhdmUgYSBjb3N0IG9mIDEuCiAgICAgLy8gSGFu
ZGxlIGlubGluaW5nLiBSZXR1cm4gdHJ1ZSBpZiBpdCBzdWNjZWVkZWQsIGZhbHNlIGlmIHdlIG5l
ZWQgdG8gcGxhbnQgYSBjYWxsLgotICAgIGJvb2wgaGFuZGxlSW5saW5pbmcoTm9kZSogY2FsbFRh
cmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYsIGludCBy
ZWdpc3Rlck9mZnNldCwgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgVmlydHVhbFJlZ2lz
dGVyIGFyZ3VtZW50c0FyZ3VtZW50LCB1bnNpZ25lZCBhcmd1bWVudHNPZmZzZXQsIGludCBhcmd1
bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgTm9kZVR5cGUgY2Fs
bE9wLCBJbmxpbmVDYWxsRnJhbWU6OktpbmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRpY3Rpb24pOwot
ICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNrc0Z1bmN0b3I+Ci0gICAgYm9vbCBhdHRlbXB0VG9J
bmxpbmVDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZh
cmlhbnQsIGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlz
LCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBJbmxpbmVDYWxsRnJhbWU6OktpbmQsIFNwZWN1bGF0ZWRU
eXBlIHByZWRpY3Rpb24sIHVuc2lnbmVkJiBpbmxpbmluZ0JhbGFuY2UsIEJhc2ljQmxvY2sqIGNv
bnRpbnVhdGlvbkJsb2NrLCBjb25zdCBDaGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpOworICAg
IGJvb2wgaGFuZGxlVmFyYXJnc0lubGluaW5nKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVz
dWx0T3BlcmFuZCwgY29uc3QgQ2FsbExpbmtTdGF0dXMmLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZp
cnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQsIFZpcnR1YWxSZWdpc3RlciBhcmd1bWVudHNBcmd1
bWVudCwgdW5zaWduZWQgYXJndW1lbnRzT2Zmc2V0LCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBOb2Rl
VHlwZSBjYWxsT3AsIElubGluZUNhbGxGcmFtZTo6S2luZCk7CisgICAgdW5zaWduZWQgZ2V0SW5s
aW5pbmdCYWxhbmNlKGNvbnN0IENhbGxMaW5rU3RhdHVzJiwgQ29kZVNwZWNpYWxpemF0aW9uS2lu
ZCk7CisgICAgZW51bSBjbGFzcyBDYWxsT3B0aW1pemF0aW9uUmVzdWx0IHsgT3B0aW1pemVkVG9K
dW1wLCBJbmxpbmVkLCBEaWROb3RoaW5nIH07CisgICAgQ2FsbE9wdGltaXphdGlvblJlc3VsdCBo
YW5kbGVDYWxsVmFyaWFudChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQs
IENhbGxWYXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJn
dW1lbnQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNl
dCwgTm9kZVR5cGUgY2FsbE9wLCBJbmxpbmVDYWxsRnJhbWU6OktpbmQsIFNwZWN1bGF0ZWRUeXBl
IHByZWRpY3Rpb24sIHVuc2lnbmVkJiBpbmxpbmluZ0JhbGFuY2UsIEJhc2ljQmxvY2sqIGNvbnRp
bnVhdGlvbkJsb2NrLCBib29sIG5lZWRzVG9DaGVja0NhbGxlZSk7CisgICAgQ2FsbE9wdGltaXph
dGlvblJlc3VsdCBoYW5kbGVJbmxpbmluZyhOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3Vs
dE9wZXJhbmQsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0
dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMs
IHVuc2lnbmVkIG5leHRPZmZzZXQsIE5vZGVUeXBlIGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpL
aW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uKTsKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBD
aGVja3NGdW5jdG9yPgogICAgIHZvaWQgaW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwg
aW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBh
cmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgSW5saW5lQ2Fs
bEZyYW1lOjpLaW5kLCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tz
RnVuY3RvciYgaW5zZXJ0Q2hlY2tzKTsKICAgICAvLyBIYW5kbGUgaW50cmluc2ljIGZ1bmN0aW9u
cy4gUmV0dXJuIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxzZSBpZiB3ZSBuZWVkIHRvIHBsYW50
IGEgY2FsbC4KQEAgLTEyOTQsMjEgKzEyOTcsMTUgQEAgQnl0ZUNvZGVQYXJzZXI6OlRlcm1pbmFs
aXR5IEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVDYWxsKAogICAgIAogICAgIFZFUkJPU0VfTE9HKCIg
ICAgSGFuZGxpbmcgY2FsbCBhdCAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiOiAiLCBjYWxsTGlu
a1N0YXR1cywgIlxuIik7CiAgICAgCi0gICAgLy8gV2UgZmlyc3QgY2hlY2sgdGhhdCB3ZSBoYXZl
IHByb2ZpbGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNhbGwsIGFuZCB0aGF0IGl0IGRpZCBu
b3QgYmVoYXZlIHRvbyBwb2x5bW9ycGhpY2FsbHkuCisgICAgLy8gSWYgd2UgaGF2ZSBwcm9maWxp
bmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjYWxsLCBhbmQgaXQgZGlkIG5vdCBiZWhhdmUgdG9v
IHBvbHltb3JwaGljYWxseSwKKyAgICAvLyB3ZSBtYXkgYmUgYWJsZSB0byBpbmxpbmUgaXQsIG9y
IGluIHRoZSBjYXNlIG9mIHJlY3Vyc2l2ZSB0YWlsIGNhbGxzIHR1cm4gaXQgaW50byBhIGp1bXAu
CiAgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNhbk9wdGltaXplKCkpIHsKICAgICAgICAgVmlydHVh
bFJlZ2lzdGVyIHRoaXNBcmd1bWVudCA9IHZpcnR1YWxSZWdpc3RlckZvckFyZ3VtZW50KDAsIHJl
Z2lzdGVyT2Zmc2V0KTsKLQotICAgICAgICBpZiAob3AgPT0gVGFpbENhbGwgJiYgaGFuZGxlUmVj
dXJzaXZlVGFpbENhbGwoY2FsbFRhcmdldCwgY2FsbExpbmtTdGF0dXMsIHJlZ2lzdGVyT2Zmc2V0
LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzKSkKKyAgICAgICAgYXV0
byBvcHRpbWl6YXRpb25SZXN1bHQgPSBoYW5kbGVJbmxpbmluZyhjYWxsVGFyZ2V0LCByZXN1bHQs
IGNhbGxMaW5rU3RhdHVzLCByZWdpc3Rlck9mZnNldCwgdGhpc0FyZ3VtZW50LAorICAgICAgICAg
ICAgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG1fY3VycmVudEluZGV4ICsgaW5zdHJ1Y3Rp
b25TaXplLCBvcCwga2luZCwgcHJlZGljdGlvbik7CisgICAgICAgIGlmIChvcHRpbWl6YXRpb25S
ZXN1bHQgPT0gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6T3B0aW1pemVkVG9KdW1wKQogICAgICAg
ICAgICAgcmV0dXJuIFRlcm1pbmFsOwotCi0gICAgICAgIC8vIElubGluaW5nIGlzIHF1aXRlIGNv
bXBsZXgsIGFuZCBtYW5hZ2VkIGJ5IGEgcGlwZWxpbmUgb2YgZnVuY3Rpb25zOgotICAgICAgICAv
LyBoYW5kbGUoVmFyYXJncylDYWxsIC0+IGhhbmRsZUlubGluaW5nIC0+IGF0dGVtcHRUb0lubGlu
ZUNhbGwgLT4gaW5saW5lQ2FsbAotICAgICAgICAvLyAtIGhhbmRsZUNhbGwgYW5kIGhhbmRsZVZh
cmFyZ3NDYWxsIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBubyBpbmxpbmluZyBoYXBwZW5zLCBh
bmQgZG8gc29tZSBzYW5pdHkgY2hlY2tzIG9uIHRoZWlyIGFyZ3VtZW50cwotICAgICAgICAvLyAt
IGhhbmRsZUlubGluaW5nIGNoZWNrcyB3aGV0aGVyIHRoZSBjYWxsIGlzIHBvbHltb3JwaGljLCBh
bmQgaWYgc28gaXMgcmVzcG9uc2libGUgZm9yIGluc2VydGluZyBhIHN3aXRjaCBvbiB0aGUgY2Fs
bGVlCi0gICAgICAgIC8vIC0gYXR0ZW1wdFRvSW5saW5lQ2FsbCBkZWFscyB3aXRoIHNwZWNpYWwg
Y2FzZXMgc3VjaCBhcyBpbnRyaW5zaWNzLCBpdCBhbHNvIGNoZWNrcyB0aGUgaW5saW5pbmcgaGV1
cmlzdGljICh0aHJvdWdoIGlubGluaW5nQ29zdCkKLSAgICAgICAgLy8gLSBpbmxpbmVDYWxsIGZp
bmFsbHkgZG9lcyB0aGUgYWN0dWFsIGlubGluaW5nLCBhZnRlciBhIGNvbXBsaWNhdGVkIHByb2Nl
ZHVyZSB0byBzZXR1cCB0aGUgc3RhY2sgY29ycmVjdGx5Ci0gICAgICAgIHVuc2lnbmVkIG5leHRP
ZmZzZXQgPSBtX2N1cnJlbnRJbmRleCArIGluc3RydWN0aW9uU2l6ZTsKLSAgICAgICAgaWYgKGhh
bmRsZUlubGluaW5nKGNhbGxUYXJnZXQsIHJlc3VsdCwgY2FsbExpbmtTdGF0dXMsIHJlZ2lzdGVy
T2Zmc2V0LCB0aGlzQXJndW1lbnQsIFZpcnR1YWxSZWdpc3RlcigpLCAwLCBhcmd1bWVudENvdW50
SW5jbHVkaW5nVGhpcywgbmV4dE9mZnNldCwgb3AsIGtpbmQsIHByZWRpY3Rpb24pKSB7CisgICAg
ICAgIGlmIChvcHRpbWl6YXRpb25SZXN1bHQgPT0gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6SW5s
aW5lZCkgewogICAgICAgICAgICAgaWYgKFVOTElLRUxZKG1fZ3JhcGguY29tcGlsYXRpb24oKSkp
CiAgICAgICAgICAgICAgICAgbV9ncmFwaC5jb21waWxhdGlvbigpLT5ub3RpY2VJbmxpbmVkQ2Fs
bCgpOwogICAgICAgICAgICAgcmV0dXJuIE5vblRlcm1pbmFsOwpAQCAtMTM0NSwxMSArMTM0Miwx
NSBAQCBCeXRlQ29kZVBhcnNlcjo6VGVybWluYWxpdHkgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVZh
cmFyZ3NDYWxsKEluc3RydWN0aW9uKiBwYywgTgogICAgIAogICAgIFZFUkJPU0VfTE9HKCIgICAg
VmFyYXJncyBjYWxsIGxpbmsgc3RhdHVzIGF0ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICI6ICIs
IGNhbGxMaW5rU3RhdHVzLCAiXG4iKTsKICAgICAKLSAgICBpZiAoY2FsbExpbmtTdGF0dXMuY2Fu
T3B0aW1pemUoKQotICAgICAgICAmJiBoYW5kbGVJbmxpbmluZyhjYWxsVGFyZ2V0LCByZXN1bHQs
IGNhbGxMaW5rU3RhdHVzLCBmaXJzdEZyZWVSZWcsIFZpcnR1YWxSZWdpc3Rlcih0aGlzUmVnKSwg
VmlydHVhbFJlZ2lzdGVyKGFyZ3VtZW50cyksIGZpcnN0VmFyQXJnT2Zmc2V0LCAwLCBtX2N1cnJl
bnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfY2FsbF92YXJhcmdzKSwgb3AsIElubGluZUNhbGxG
cmFtZTo6dmFyYXJnc0tpbmRGb3IoY2FsbE1vZGUpLCBwcmVkaWN0aW9uKSkgewotICAgICAgICBp
ZiAoVU5MSUtFTFkobV9ncmFwaC5jb21waWxhdGlvbigpKSkKLSAgICAgICAgICAgIG1fZ3JhcGgu
Y29tcGlsYXRpb24oKS0+bm90aWNlSW5saW5lZENhbGwoKTsKLSAgICAgICAgcmV0dXJuIE5vblRl
cm1pbmFsOworICAgIGlmIChjYWxsTGlua1N0YXR1cy5jYW5PcHRpbWl6ZSgpKSB7CisgICAgICAg
IGlmIChoYW5kbGVWYXJhcmdzSW5saW5pbmcoY2FsbFRhcmdldCwgcmVzdWx0LAorICAgICAgICAg
ICAgY2FsbExpbmtTdGF0dXMsIGZpcnN0RnJlZVJlZywgVmlydHVhbFJlZ2lzdGVyKHRoaXNSZWcp
LCBWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRzKSwKKyAgICAgICAgICAgIGZpcnN0VmFyQXJnT2Zm
c2V0LCBtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfY2FsbF92YXJhcmdzKSwgb3As
CisgICAgICAgICAgICBJbmxpbmVDYWxsRnJhbWU6OnZhcmFyZ3NLaW5kRm9yKGNhbGxNb2RlKSkp
IHsKKyAgICAgICAgICAgIGlmIChVTkxJS0VMWShtX2dyYXBoLmNvbXBpbGF0aW9uKCkpKQorICAg
ICAgICAgICAgICAgIG1fZ3JhcGguY29tcGlsYXRpb24oKS0+bm90aWNlSW5saW5lZENhbGwoKTsK
KyAgICAgICAgICAgIHJldHVybiBOb25UZXJtaW5hbDsKKyAgICAgICAgfQogICAgIH0KICAgICAK
ICAgICBDYWxsVmFyYXJnc0RhdGEqIGRhdGEgPSBtX2dyYXBoLm1fY2FsbFZhcmFyZ3NEYXRhLmFk
ZCgpOwpAQCAtMTQxOCwxNCArMTQxOSwxMCBAQCB2b2lkIEJ5dGVDb2RlUGFyc2VyOjplbWl0QXJn
dW1lbnRQaGFudG9tcyhpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SQogICAg
ICAgICBhZGRUb0dyYXBoKFBoYW50b20sIGdldCh2aXJ0dWFsUmVnaXN0ZXJGb3JBcmd1bWVudChp
LCByZWdpc3Rlck9mZnNldCkpKTsKIH0KIAotYm9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlUmVj
dXJzaXZlVGFpbENhbGwoTm9kZSogY2FsbFRhcmdldE5vZGUsIGNvbnN0IENhbGxMaW5rU3RhdHVz
JiBjYWxsTGlua1N0YXR1cywgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhp
c0FyZ3VtZW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMpCit0ZW1wbGF0ZTx0eXBl
bmFtZSBDaGVja3NGdW5jdG9yPgorYm9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlUmVjdXJzaXZl
VGFpbENhbGwoQ2FsbFZhcmlhbnQgY2FsbFZhcmlhbnQsIGludCByZWdpc3Rlck9mZnNldCwgaW50
IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBjb25zdCBDaGVja3NGdW5jdG9yJiBlbWl0RnVu
Y3Rpb25DaGVja0lmTmVlZGVkKQogewotICAgIC8vIEZJWE1FOiBXZSBjdXJyZW50bHkgb25seSBk
byB0aGlzIG9wdGltaXNhdGlvbiBpbiB0aGUgc2ltcGxlLCBub24tcG9seW1vcnBoaWMgY2FzZS4K
LSAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTc4MzkwCi0g
ICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNvdWxkVGFrZVNsb3dQYXRoKCkgfHwgY2FsbExpbmtTdGF0
dXMuc2l6ZSgpICE9IDEpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGF1dG8gdGFyZ2V0
RXhlY3V0YWJsZSA9IGNhbGxMaW5rU3RhdHVzWzBdLmV4ZWN1dGFibGUoKTsKKyAgICBhdXRvIHRh
cmdldEV4ZWN1dGFibGUgPSBjYWxsVmFyaWFudC5leGVjdXRhYmxlKCk7CiAgICAgSW5saW5lU3Rh
Y2tFbnRyeSogc3RhY2tFbnRyeSA9IG1faW5saW5lU3RhY2tUb3A7CiAgICAgZG8gewogICAgICAg
ICBpZiAodGFyZ2V0RXhlY3V0YWJsZSAhPSBzdGFja0VudHJ5LT5leGVjdXRhYmxlKCkpCkBAIC0x
NDQ0LDggKzE0NDEsOCBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVSZWN1cnNpdmVUYWls
Q2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgY29uc3QgQ2FsbExpbgogICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFdlIG11c3QgYWRkIHNvbWUg
Y2hlY2sgdGhhdCB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHdhcyBjb3JyZWN0IGFuZCB0aGUg
dGFyZ2V0IG9mIHRoaXMgY2FsbCBpcyB3aGF0IHdlIHRob3VnaHQKLSAgICAgICAgZW1pdEZ1bmN0
aW9uQ2hlY2tzKGNhbGxMaW5rU3RhdHVzWzBdLCBjYWxsVGFyZ2V0Tm9kZSwgdGhpc0FyZ3VtZW50
KTsKKyAgICAgICAgLy8gV2UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgY2hlY2sgdGhhdCB0aGUgcHJv
ZmlsaW5nIGluZm9ybWF0aW9uIHdhcyBjb3JyZWN0IGFuZCB0aGUgdGFyZ2V0IG9mIHRoaXMgY2Fs
bCBpcyB3aGF0IHdlIHRob3VnaHQKKyAgICAgICAgZW1pdEZ1bmN0aW9uQ2hlY2tJZk5lZWRlZCgp
OwogICAgICAgICAvLyBXZSBmbHVzaCBldmVyeXRoaW5nLCBhcyBpZiB3ZSB3ZXJlIGluIHRoZSBi
YWNrZWRnZSBvZiBhIGxvb3AgKHNlZSB0cmVhdG1lbnQgb2Ygb3Bfam1wIGluIHBhcnNlQmxvY2sp
LgogICAgICAgICBmbHVzaEZvclRlcm1pbmFsKCk7CiAKQEAgLTE1ODcsNiArMTU4NCw3IEBAIHVu
c2lnbmVkIEJ5dGVDb2RlUGFyc2VyOjppbmxpbmluZ0Nvc3QoQ2FsbFZhcmlhbnQgY2FsbGVlLCBp
bnQgYXJndW1lbnRDb3VudEluY2x1CiB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgog
dm9pZCBCeXRlQ29kZVBhcnNlcjo6aW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50
IHJlc3VsdE9wZXJhbmQsIENhbGxWYXJpYW50IGNhbGxlZSwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBp
bnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIElubGlu
ZUNhbGxGcmFtZTo6S2luZCBraW5kLCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29u
c3QgQ2hlY2tzRnVuY3RvciYgaW5zZXJ0Q2hlY2tzKQogeworICAgIEluc3RydWN0aW9uKiBzYXZl
ZEN1cnJlbnRJbnN0cnVjdGlvbiA9IG1fY3VycmVudEluc3RydWN0aW9uOwogICAgIENvZGVTcGVj
aWFsaXphdGlvbktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVj
aWFsaXphdGlvbktpbmRGb3Ioa2luZCk7CiAgICAgCiAgICAgQVNTRVJUKGlubGluaW5nQ29zdChj
YWxsZWUsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBraW5kKSAhPSBVSU5UX01BWCk7CkBA
IC0xNzMwLDIzNiArMTcyOCwyNDQgQEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6aW5saW5lQ2FsbChO
b2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXIKICAgICBBU1NF
UlQoIW1fY3VycmVudEJsb2NrLT50ZXJtaW5hbCgpKTsKIAogICAgIHByZXBhcmVUb1BhcnNlQmxv
Y2soKTsKKyAgICBtX2N1cnJlbnRJbnN0cnVjdGlvbiA9IHNhdmVkQ3VycmVudEluc3RydWN0aW9u
OwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgotYm9vbCBCeXRlQ29kZVBh
cnNlcjo6YXR0ZW1wdFRvSW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3Vs
dE9wZXJhbmQsIENhbGxWYXJpYW50IGNhbGxlZSwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJn
dW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIElubGluZUNhbGxG
cmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uLCB1bnNpZ25lZCYgaW5s
aW5pbmdCYWxhbmNlLCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tz
RnVuY3RvciYgaW5zZXJ0Q2hlY2tzKQorQnl0ZUNvZGVQYXJzZXI6OkNhbGxPcHRpbWl6YXRpb25S
ZXN1bHQgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGxWYXJpYW50KE5vZGUqIGNhbGxUYXJnZXRO
b2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZhcmlhbnQgY2FsbGVlLCBpbnQgcmVnaXN0ZXJP
ZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQsIGludCBhcmd1bWVudENvdW50SW5j
bHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgTm9kZVR5cGUgb3AsIElubGluZUNhbGxG
cmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uLCB1bnNpZ25lZCYgaW5s
aW5pbmdCYWxhbmNlLCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgYm9vbCBuZWVkc1Rv
Q2hlY2tDYWxsZWUpCiB7Ci0gICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlv
bktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6OnNwZWNpYWxpemF0aW9uS2luZEZvcihraW5kKTsKLSAg
ICAKLSAgICBpZiAoIWlubGluaW5nQmFsYW5jZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IAogICAgIFZFUkJPU0VfTE9HKCIgICAgQ29uc2lkZXJpbmcgY2FsbGVlICIsIGNhbGxlZSwgIlxu
Iik7Ci0gICAgCi0gICAgLy8gSW50cmluc2ljcyBhbmQgaW50ZXJuYWwgZnVuY3Rpb25zIGNhbiBv
bmx5IGJlIGlubGluZWQgaWYgd2UncmUgbm90IGRvaW5nIHZhcmFyZ3MuIFRoaXMgaXMgYmVjYXVz
ZQotICAgIC8vIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlIGFueSB3YXkgb2YgZ2V0dGluZyBwcm9m
aWxpbmcgaW5mb3JtYXRpb24gZm9yIGFyZ3VtZW50cyB0byBub24tSlMgdmFyYXJncwotICAgIC8v
IGNhbGxzLiBUaGUgcHJlZGljdGlvbiBwcm9wYWdhdG9yIHdvbid0IGJlIG9mIGFueSBoZWxwIGJl
Y2F1c2UgTG9hZFZhcmFyZ3Mgb2JzY3VyZXMgdGhlIGRhdGEgZmxvdywKLSAgICAvLyBhbmQgdGhl
cmUgYXJlIG5vIGNhbGxzaXRlIHZhbHVlIHByb2ZpbGVzIGFuZCBuYXRpdmUgZnVuY3Rpb24gd29u
J3QgaGF2ZSBjYWxsZWUgdmFsdWUgcHJvZmlsZXMgZm9yCi0gICAgLy8gdGhvc2UgYXJndW1lbnRz
LiBFdmVuIHdvcnNlLCBpZiB0aGUgaW50cmluc2ljIGRlY2lkZXMgdG8gZXhpdCwgaXQgd29uJ3Qg
cmVhbGx5IGhhdmUgYW55d2hlcmUgdG8KLSAgICAvLyBleGl0IHRvOiBMb2FkVmFyYXJncyBpcyBl
ZmZlY3RmdWwgYW5kIGl0J3MgcGFydCBvZiB0aGUgb3BfY2FsbF92YXJhcmdzLCBzbyB3ZSBjYW4n
dCBleGl0IHdpdGhvdXQKLSAgICAvLyBjYWxsaW5nIExvYWRWYXJhcmdzIHR3aWNlLgotICAgIGlm
ICghSW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFyZ3Moa2luZCkpIHsKIAotICAgICAgICBib29sIGRp
ZEluc2VydENoZWNrcyA9IGZhbHNlOwotICAgICAgICBhdXRvIGluc2VydENoZWNrc1dpdGhBY2Nv
dW50aW5nID0gWyZdICgpIHsKLSAgICAgICAgICAgIGluc2VydENoZWNrcyhudWxscHRyKTsKLSAg
ICAgICAgICAgIGRpZEluc2VydENoZWNrcyA9IHRydWU7Ci0gICAgICAgIH07CisgICAgYm9vbCBk
aWRJbnNlcnRDaGVja3MgPSBmYWxzZTsKKyAgICBhdXRvIGluc2VydENoZWNrc1dpdGhBY2NvdW50
aW5nID0gWyZdICgpIHsKKyAgICAgICAgaWYgKG5lZWRzVG9DaGVja0NhbGxlZSkKKyAgICAgICAg
ICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsZWUsIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1l
bnQpOworICAgICAgICBkaWRJbnNlcnRDaGVja3MgPSB0cnVlOworICAgIH07CiAKLSAgICAgICAg
YXV0byBlbmRTcGVjaWFsQ2FzZSA9IFsmXSAoKSB7Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VS
VChkaWRJbnNlcnRDaGVja3MpOwotICAgICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tLCBjYWxs
VGFyZ2V0Tm9kZSk7Ci0gICAgICAgICAgICBlbWl0QXJndW1lbnRQaGFudG9tcyhyZWdpc3Rlck9m
ZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMpOwotICAgICAgICAgICAgaW5saW5pbmdC
YWxhbmNlLS07Ci0gICAgICAgICAgICBpZiAoY29udGludWF0aW9uQmxvY2spIHsKLSAgICAgICAg
ICAgICAgICBtX2N1cnJlbnRJbmRleCA9IG5leHRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbV9l
eGl0T0sgPSB0cnVlOwotICAgICAgICAgICAgICAgIHByb2Nlc3NTZXRMb2NhbFF1ZXVlKCk7Ci0g
ICAgICAgICAgICAgICAgYWRkSnVtcFRvKGNvbnRpbnVhdGlvbkJsb2NrKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfTsKLSAgICAKLSAgICAgICAgaWYgKEludGVybmFsRnVuY3Rpb24qIGZ1bmN0
aW9uID0gY2FsbGVlLmludGVybmFsRnVuY3Rpb24oKSkgewotICAgICAgICAgICAgaWYgKGhhbmRs
ZUNvbnN0YW50SW50ZXJuYWxGdW5jdGlvbihjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwg
ZnVuY3Rpb24sIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgc3Bl
Y2lhbGl6YXRpb25LaW5kLCBwcmVkaWN0aW9uLCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykp
IHsKLSAgICAgICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOwotICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWRp
ZEluc2VydENoZWNrcyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG9wID09
IFRhaWxDYWxsICYmIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChjYWxs
ZWUsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgaW5zZXJ0Q2hl
Y2tzV2l0aEFjY291bnRpbmcpKSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGRpZEluc2VydENo
ZWNrcyk7CisgICAgICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpPcHRpbWl6ZWRU
b0p1bXA7CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVja3MpOworCisg
ICAgaWYgKCFpbmxpbmluZ0JhbGFuY2UpCisgICAgICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9u
UmVzdWx0OjpEaWROb3RoaW5nOworCisgICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFs
aXphdGlvbktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6OnNwZWNpYWxpemF0aW9uS2luZEZvcihraW5k
KTsKKworICAgIGF1dG8gZW5kU3BlY2lhbENhc2UgPSBbJl0gKCkgeworICAgICAgICBSRUxFQVNF
X0FTU0VSVChkaWRJbnNlcnRDaGVja3MpOworICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20sIGNh
bGxUYXJnZXROb2RlKTsKKyAgICAgICAgZW1pdEFyZ3VtZW50UGhhbnRvbXMocmVnaXN0ZXJPZmZz
ZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzKTsKKyAgICAgICAgaW5saW5pbmdCYWxhbmNl
LS07CisgICAgICAgIGlmIChjb250aW51YXRpb25CbG9jaykgeworICAgICAgICAgICAgbV9jdXJy
ZW50SW5kZXggPSBuZXh0T2Zmc2V0OworICAgICAgICAgICAgbV9leGl0T0sgPSB0cnVlOworICAg
ICAgICAgICAgcHJvY2Vzc1NldExvY2FsUXVldWUoKTsKKyAgICAgICAgICAgIGFkZEp1bXBUbyhj
b250aW51YXRpb25CbG9jayk7CiAgICAgICAgIH0KLSAgICAKLSAgICAgICAgSW50cmluc2ljIGlu
dHJpbnNpYyA9IGNhbGxlZS5pbnRyaW5zaWNGb3Ioc3BlY2lhbGl6YXRpb25LaW5kKTsKLSAgICAg
ICAgaWYgKGludHJpbnNpYyAhPSBOb0ludHJpbnNpYykgewotICAgICAgICAgICAgaWYgKGhhbmRs
ZUludHJpbnNpY0NhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGludHJpbnNpYywg
cmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBwcmVkaWN0aW9uLCBp
bnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykpIHsKLSAgICAgICAgICAgICAgICBlbmRTcGVjaWFs
Q2FzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAg
IH07CiAKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVja3MpOwotICAg
ICAgICAgICAgLy8gV2UgbWlnaHQgc3RpbGwgdHJ5IHRvIGlubGluZSB0aGUgSW50cmluc2ljIGJl
Y2F1c2UgaXQgbWlnaHQgYmUgYSBidWlsdGluIEpTIGZ1bmN0aW9uLgorICAgIGlmIChJbnRlcm5h
bEZ1bmN0aW9uKiBmdW5jdGlvbiA9IGNhbGxlZS5pbnRlcm5hbEZ1bmN0aW9uKCkpIHsKKyAgICAg
ICAgaWYgKGhhbmRsZUNvbnN0YW50SW50ZXJuYWxGdW5jdGlvbihjYWxsVGFyZ2V0Tm9kZSwgcmVz
dWx0T3BlcmFuZCwgZnVuY3Rpb24sIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVk
aW5nVGhpcywgc3BlY2lhbGl6YXRpb25LaW5kLCBwcmVkaWN0aW9uLCBpbnNlcnRDaGVja3NXaXRo
QWNjb3VudGluZykpIHsKKyAgICAgICAgICAgIGVuZFNwZWNpYWxDYXNlKCk7CisgICAgICAgICAg
ICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6SW5saW5lZDsKICAgICAgICAgfQorICAg
ICAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5zZXJ0Q2hlY2tzKTsKKyAgICAgICAgcmV0dXJuIENh
bGxPcHRpbWl6YXRpb25SZXN1bHQ6OkRpZE5vdGhpbmc7CisgICAgfQogCi0gICAgICAgIGlmIChP
cHRpb25zOjp1c2VET01KSVQoKSkgewotICAgICAgICAgICAgaWYgKGNvbnN0IERPTUpJVDo6U2ln
bmF0dXJlKiBzaWduYXR1cmUgPSBjYWxsZWUuc2lnbmF0dXJlRm9yKHNwZWNpYWxpemF0aW9uS2lu
ZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlRE9NSklUQ2FsbChjYWxsVGFyZ2V0Tm9k
ZSwgcmVzdWx0T3BlcmFuZCwgc2lnbmF0dXJlLCByZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3Vu
dEluY2x1ZGluZ1RoaXMsIHByZWRpY3Rpb24sIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nKSkg
ewotICAgICAgICAgICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOwotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUkVM
RUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7CisgICAgSW50cmluc2ljIGludHJpbnNpYyA9
IGNhbGxlZS5pbnRyaW5zaWNGb3Ioc3BlY2lhbGl6YXRpb25LaW5kKTsKKyAgICBpZiAoaW50cmlu
c2ljICE9IE5vSW50cmluc2ljKSB7CisgICAgICAgIGlmIChoYW5kbGVJbnRyaW5zaWNDYWxsKGNh
bGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBpbnRyaW5zaWMsIHJlZ2lzdGVyT2Zmc2V0LCBh
cmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgcHJlZGljdGlvbiwgaW5zZXJ0Q2hlY2tzV2l0aEFj
Y291bnRpbmcpKSB7CisgICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOworICAgICAgICAgICAg
cmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OklubGluZWQ7CisgICAgICAgIH0KKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7CisgICAgICAgIC8vIFdlIG1pZ2h0
IHN0aWxsIHRyeSB0byBpbmxpbmUgdGhlIEludHJpbnNpYyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGEg
YnVpbHRpbiBKUyBmdW5jdGlvbi4KKyAgICB9CisKKyAgICBpZiAoT3B0aW9uczo6dXNlRE9NSklU
KCkpIHsKKyAgICAgICAgaWYgKGNvbnN0IERPTUpJVDo6U2lnbmF0dXJlKiBzaWduYXR1cmUgPSBj
YWxsZWUuc2lnbmF0dXJlRm9yKHNwZWNpYWxpemF0aW9uS2luZCkpIHsKKyAgICAgICAgICAgIGlm
IChoYW5kbGVET01KSVRDYWxsKGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBzaWduYXR1
cmUsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgcHJlZGljdGlv
biwgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRpbmcpKSB7CisgICAgICAgICAgICAgICAgZW5kU3Bl
Y2lhbENhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3Vs
dDo6SW5saW5lZDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFk
aWRJbnNlcnRDaGVja3MpOwogICAgICAgICB9CiAgICAgfQogICAgIAogICAgIHVuc2lnbmVkIG15
SW5saW5pbmdDb3N0ID0gaW5saW5pbmdDb3N0KGNhbGxlZSwgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMsIGtpbmQpOwogICAgIGlmIChteUlubGluaW5nQ29zdCA+IGlubGluaW5nQmFsYW5jZSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJl
c3VsdDo6RGlkTm90aGluZzsKIAotICAgIEluc3RydWN0aW9uKiBzYXZlZEN1cnJlbnRJbnN0cnVj
dGlvbiA9IG1fY3VycmVudEluc3RydWN0aW9uOwotICAgIGlubGluZUNhbGwoY2FsbFRhcmdldE5v
ZGUsIHJlc3VsdE9wZXJhbmQsIGNhbGxlZSwgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJ
bmNsdWRpbmdUaGlzLCBuZXh0T2Zmc2V0LCBraW5kLCBjb250aW51YXRpb25CbG9jaywgaW5zZXJ0
Q2hlY2tzKTsKKyAgICBhdXRvIGluc2VydENoZWNrID0gWyZdIChDb2RlQmxvY2sqIGMpIHsKKyAg
ICAgICAgKHZvaWQpIGM7CisgICAgICAgIGlmIChuZWVkc1RvQ2hlY2tDYWxsZWUpCisgICAgICAg
ICAgICBlbWl0RnVuY3Rpb25DaGVja3MoY2FsbGVlLCBjYWxsVGFyZ2V0Tm9kZSwgdGhpc0FyZ3Vt
ZW50KTsKKyAgICB9OworICAgIGlubGluZUNhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJh
bmQsIGNhbGxlZSwgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBu
ZXh0T2Zmc2V0LCBraW5kLCBjb250aW51YXRpb25CbG9jaywgaW5zZXJ0Q2hlY2spOwogICAgIGlu
bGluaW5nQmFsYW5jZSAtPSBteUlubGluaW5nQ29zdDsKLSAgICBtX2N1cnJlbnRJbnN0cnVjdGlv
biA9IHNhdmVkQ3VycmVudEluc3RydWN0aW9uOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVy
biBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpJbmxpbmVkOwogfQogCi1ib29sIEJ5dGVDb2RlUGFy
c2VyOjpoYW5kbGVJbmxpbmluZygKLSAgICBOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3Vs
dE9wZXJhbmQsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiBjYWxsTGlua1N0YXR1cywKLSAgICBpbnQg
cmVnaXN0ZXJPZmZzZXRPckZpcnN0RnJlZVJlZywgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVu
dCwKLSAgICBWaXJ0dWFsUmVnaXN0ZXIgYXJndW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3Vt
ZW50c09mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLAotICAgIHVuc2lnbmVk
IG5leHRPZmZzZXQsIE5vZGVUeXBlIGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kIGtpbmQs
IFNwZWN1bGF0ZWRUeXBlIHByZWRpY3Rpb24pCitib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVW
YXJhcmdzSW5saW5pbmcoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLAor
ICAgIGNvbnN0IENhbGxMaW5rU3RhdHVzJiBjYWxsTGlua1N0YXR1cywgaW50IGZpcnN0RnJlZVJl
ZywgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwKKyAgICBWaXJ0dWFsUmVnaXN0ZXIgYXJn
dW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwKKyAgICB1bnNpZ25lZCBu
ZXh0T2Zmc2V0LCBOb2RlVHlwZSBjYWxsT3AsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5kKQog
ewotICAgIFZFUkJPU0VfTE9HKCJIYW5kbGluZyBpbmxpbmluZy4uLlxuU3RhY2s6ICIsIGN1cnJl
bnRDb2RlT3JpZ2luKCksICJcbiIpOwotICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQgc3BlY2lh
bGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVjaWFsaXphdGlvbktpbmRGb3Ioa2lu
ZCk7Ci0gICAgCi0gICAgaWYgKCFjYWxsTGlua1N0YXR1cy5zaXplKCkpIHsKLSAgICAgICAgVkVS
Qk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmcuXG4iKTsKKyAgICBWRVJCT1NFX0xPRygiSGFuZGxp
bmcgaW5saW5pbmcgKFZhcmFyZ3MpLi4uXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwg
IlxuIik7CisgICAgaWYgKGNhbGxMaW5rU3RhdHVzLm1heE51bUFyZ3VtZW50cygpID4gT3B0aW9u
czo6bWF4aW11bVZhcmFyZ3NGb3JJbmxpbmluZygpKSB7CisgICAgICAgIFZFUkJPU0VfTE9HKCJC
YWlsaW5nIGlubGluaW5nOiB0b28gbWFueSBhcmd1bWVudHMgZm9yIHZhcmFyZ3MgaW5saW5pbmcu
XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoY2FsbExpbmtTdGF0
dXMuY291bGRUYWtlU2xvd1BhdGgoKSB8fCBjYWxsTGlua1N0YXR1cy5zaXplKCkgIT0gMSkgewor
ICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmluZzogcG9seW1vcnBoaWMgaW5saW5p
bmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHZhcmFyZ3MuXG4iKTsKICAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgIH0KKworICAgIENhbGxWYXJpYW50IGNhbGxWYXJpYW50ID0gY2FsbExpbmtT
dGF0dXNbMF07CisKKyAgICB1bnNpZ25lZCBtYW5kYXRvcnlNaW5pbXVtOworICAgIGlmIChGdW5j
dGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uRXhlY3V0YWJsZSA9IGNhbGxWYXJpYW50LmZ1bmN0aW9u
RXhlY3V0YWJsZSgpKQorICAgICAgICBtYW5kYXRvcnlNaW5pbXVtID0gZnVuY3Rpb25FeGVjdXRh
YmxlLT5wYXJhbWV0ZXJDb3VudCgpOworICAgIGVsc2UKKyAgICAgICAgbWFuZGF0b3J5TWluaW11
bSA9IDA7CiAgICAgCi0gICAgaWYgKElubGluZUNhbGxGcmFtZTo6aXNWYXJhcmdzKGtpbmQpCi0g
ICAgICAgICYmIGNhbGxMaW5rU3RhdHVzLm1heE51bUFyZ3VtZW50cygpID4gT3B0aW9uczo6bWF4
aW11bVZhcmFyZ3NGb3JJbmxpbmluZygpKSB7Ci0gICAgICAgIFZFUkJPU0VfTE9HKCJCYWlsaW5n
IGlubGluaW5nIGJlY2F1c2Ugb2YgdmFyYXJncy5cbiIpOworICAgIC8vIGluY2x1ZGVzICJ0aGlz
IgorICAgIHVuc2lnbmVkIG1heE51bUFyZ3VtZW50cyA9IHN0ZDo6bWF4KGNhbGxMaW5rU3RhdHVz
Lm1heE51bUFyZ3VtZW50cygpLCBtYW5kYXRvcnlNaW5pbXVtICsgMSk7CisKKyAgICBDb2RlU3Bl
Y2lhbGl6YXRpb25LaW5kIHNwZWNpYWxpemF0aW9uS2luZCA9IElubGluZUNhbGxGcmFtZTo6c3Bl
Y2lhbGl6YXRpb25LaW5kRm9yKGtpbmQpOworICAgIGlmIChpbmxpbmluZ0Nvc3QoY2FsbFZhcmlh
bnQsIG1heE51bUFyZ3VtZW50cywga2luZCkgPiBnZXRJbmxpbmluZ0JhbGFuY2UoY2FsbExpbmtT
dGF0dXMsIHNwZWNpYWxpemF0aW9uS2luZCkpIHsKKyAgICAgICAgVkVSQk9TRV9MT0coIkJhaWxp
bmcgaW5saW5pbmc6IGlubGluaW5nIGNvc3QgdG9vIGhpZ2guXG4iKTsKICAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgIH0KKyAgICAKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSBmaXJzdEZyZWVS
ZWcgKyAxOworICAgIHJlZ2lzdGVyT2Zmc2V0IC09IG1heE51bUFyZ3VtZW50czsgLy8gaW5jbHVk
ZXMgInRoaXMiCisgICAgcmVnaXN0ZXJPZmZzZXQgLT0gQ2FsbEZyYW1lOjpoZWFkZXJTaXplSW5S
ZWdpc3RlcnM7CisgICAgcmVnaXN0ZXJPZmZzZXQgPSAtV1RGOjpyb3VuZFVwVG9NdWx0aXBsZU9m
KHN0YWNrQWxpZ25tZW50UmVnaXN0ZXJzKCksIC1yZWdpc3Rlck9mZnNldCk7CisgICAgCisgICAg
YXV0byBpbnNlcnRDaGVja3MgPSBbJl0gKENvZGVCbG9jayogY29kZUJsb2NrKSB7CisgICAgICAg
IGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsVmFyaWFudCwgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1
bWVudCk7CisgICAgICAgIAorICAgICAgICBpbnQgcmVtYXBwZWRSZWdpc3Rlck9mZnNldCA9Cisg
ICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFuZChWaXJ0dWFsUmVnaXN0ZXIocmVn
aXN0ZXJPZmZzZXQpKS5vZmZzZXQoKTsKKyAgICAgICAgCisgICAgICAgIGVuc3VyZUxvY2FscyhW
aXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRSZWdpc3Rlck9mZnNldCkudG9Mb2NhbCgpKTsKKyAgICAg
ICAgCisgICAgICAgIGludCBhcmd1bWVudFN0YXJ0ID0gcmVnaXN0ZXJPZmZzZXQgKyBDYWxsRnJh
bWU6OmhlYWRlclNpemVJblJlZ2lzdGVyczsKKyAgICAgICAgaW50IHJlbWFwcGVkQXJndW1lbnRT
dGFydCA9CisgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFuZChWaXJ0dWFsUmVn
aXN0ZXIoYXJndW1lbnRTdGFydCkpLm9mZnNldCgpOworICAgICAgICAKKyAgICAgICAgTG9hZFZh
cmFyZ3NEYXRhKiBkYXRhID0gbV9ncmFwaC5tX2xvYWRWYXJhcmdzRGF0YS5hZGQoKTsKKyAgICAg
ICAgZGF0YS0+c3RhcnQgPSBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0YXJ0ICsg
MSk7CisgICAgICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVkUmVnaXN0
ZXJPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50KTsKKyAgICAgICAgZGF0YS0+
b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OworICAgICAgICBkYXRhLT5saW1pdCA9IG1heE51bUFy
Z3VtZW50czsKKyAgICAgICAgZGF0YS0+bWFuZGF0b3J5TWluaW11bSA9IG1hbmRhdG9yeU1pbmlt
dW07CisgICAgICAgIAorICAgICAgICBpZiAoY2FsbE9wID09IFRhaWxDYWxsRm9yd2FyZFZhcmFy
Z3MpCisgICAgICAgICAgICBhZGRUb0dyYXBoKEZvcndhcmRWYXJhcmdzLCBPcEluZm8oZGF0YSkp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBhZGRUb0dyYXBoKExvYWRWYXJhcmdzLCBPcElu
Zm8oZGF0YSksIGdldChhcmd1bWVudHNBcmd1bWVudCkpOworICAgICAgICAKKyAgICAgICAgLy8g
TG9hZFZhcmFyZ3MgbWF5IE9TUiBleGl0LiBIZW5jZSwgd2UgbmVlZCB0byBrZWVwIGFsaXZlIGNh
bGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQKKyAgICAgICAgLy8gYW5kIGFyZ3VtZW50c0FyZ3Vt
ZW50IGZvciB0aGUgYmFzZWxpbmUgSklULiBIb3dldmVyLCB3ZSBvbmx5IG5lZWQgYSBQaGFudG9t
IGZvcgorICAgICAgICAvLyBjYWxsVGFyZ2V0Tm9kZSBiZWNhdXNlIHRoZSBvdGhlciAyIGFyZSBz
dGlsbCBpbiB1c2UgYW5kIGFsaXZlIGF0IHRoaXMgcG9pbnQuCisgICAgICAgIGFkZFRvR3JhcGgo
UGhhbnRvbSwgY2FsbFRhcmdldE5vZGUpOworICAgICAgICAKKyAgICAgICAgLy8gSW4gREZHIElS
IGJlZm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJvbCBmbG93IGJldHdlZW4gYWZ0ZXIg
dGhlCisgICAgICAgIC8vIExvYWRWYXJhcmdzIGFuZCB0aGUgbGFzdCBTZXRBcmd1bWVudC4gVGhp
cyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQgdG8gREZHCisgICAgICAgIC8vIFNTQS4gRm9y
dHVuYXRlbHksIHdlIGFsc28gaGF2ZSBvdGhlciByZWFzb25zIGZvciBub3QgaW5zZXJ0aW5nIGNv
bnRyb2wgZmxvdworICAgICAgICAvLyBiZWZvcmUgU1NBLgorICAgICAgICAKKyAgICAgICAgVmFy
aWFibGVBY2Nlc3NEYXRhKiBjb3VudFZhcmlhYmxlID0gbmV3VmFyaWFibGVBY2Nlc3NEYXRhKFZp
cnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZyYW1lU2xvdDo6YXJn
dW1lbnRDb3VudCkpOworICAgICAgICAvLyBUaGlzIGlzIHByZXR0eSBsYW1lLCBidXQgaXQgd2ls
bCBmb3JjZSB0aGUgY291bnQgdG8gYmUgZmx1c2hlZCBhcyBhbiBpbnQuIFRoaXMgZG9lc24ndAor
ICAgICAgICAvLyBtYXR0ZXIgdmVyeSBtdWNoLCBzaW5jZSBvdXIgdXNlIG9mIGEgU2V0QXJndW1l
bnQgYW5kIEZsdXNoZXMgZm9yIHRoaXMgbG9jYWwgc2xvdCBpcworICAgICAgICAvLyBtb3N0bHkg
anVzdCBhIGZvcm1hbGl0eS4KKyAgICAgICAgY291bnRWYXJpYWJsZS0+cHJlZGljdChTcGVjSW50
MzJPbmx5KTsKKyAgICAgICAgY291bnRWYXJpYWJsZS0+bWVyZ2VJc1Byb2ZpdGFibGVUb1VuYm94
KHRydWUpOworICAgICAgICBOb2RlKiBzZXRBcmd1bWVudENvdW50ID0gYWRkVG9HcmFwaChTZXRB
cmd1bWVudCwgT3BJbmZvKGNvdW50VmFyaWFibGUpKTsKKyAgICAgICAgbV9jdXJyZW50QmxvY2st
PnZhcmlhYmxlc0F0VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFyaWFibGUtPmxvY2FsKCksIHNldEFy
Z3VtZW50Q291bnQpOwogICAgICAgICAKKyAgICAgICAgc2V0KFZpcnR1YWxSZWdpc3Rlcihhcmd1
bWVudFN0YXJ0KSwgZ2V0KHRoaXNBcmd1bWVudCksIEltbWVkaWF0ZU5ha2VkU2V0KTsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBhcmd1bWVudCA9IDE7IGFyZ3VtZW50IDwgbWF4TnVtQXJndW1lbnRz
OyArK2FyZ3VtZW50KSB7CisgICAgICAgICAgICBWYXJpYWJsZUFjY2Vzc0RhdGEqIHZhcmlhYmxl
ID0gbmV3VmFyaWFibGVBY2Nlc3NEYXRhKFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZEFyZ3VtZW50
U3RhcnQgKyBhcmd1bWVudCkpOworICAgICAgICAgICAgdmFyaWFibGUtPm1lcmdlU2hvdWxkTmV2
ZXJVbmJveCh0cnVlKTsgLy8gV2UgY3VycmVudGx5IGhhdmUgbm93aGVyZSB0byBwdXQgdGhlIHR5
cGUgY2hlY2sgb24gdGhlIExvYWRWYXJhcmdzLiBMb2FkVmFyYXJncyBpcyBlZmZlY3RmdWwsIHNv
IGFmdGVyIGl0IGZpbmlzaGVzLCB3ZSBjYW5ub3QgZXhpdC4KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgLy8gRm9yIGEgd2hpbGUgaXQgaGFkIGJlZW4gbXkgaW50ZW50aW9uIHRvIGRvIHRoaW5n
cyBsaWtlIHRoaXMgaW5zaWRlIHRoZQorICAgICAgICAgICAgLy8gcHJlZGljdGlvbiBpbmplY3Rp
b24gcGhhc2UuIEJ1dCBpbiB0aGlzIGNhc2UgaXQncyByZWFsbHkgYmVzdCB0byBkbyBpdCBoZXJl
LAorICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCdzIGhlcmUgdGhhdCB3ZSBoYXZlIGFjY2VzcyB0
byB0aGUgdmFyaWFibGUgYWNjZXNzIGRhdGFzIGZvciB0aGUKKyAgICAgICAgICAgIC8vIGlubGlu
aW5nIHdlJ3JlIGFib3V0IHRvIGRvLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNv
bWV0aGluZyBlbHNlIHRoYXQncyBpbnRlcmVzdGluZyBoZXJlIGlzIHRoYXQgd2UnZCByZWFsbHkg
bG92ZSB0byBnZXQKKyAgICAgICAgICAgIC8vIHByZWRpY3Rpb25zIGZyb20gdGhlIGFyZ3VtZW50
cyBsb2FkZWQgYXQgdGhlIGNhbGxzaXRlLCByYXRoZXIgdGhhbiB0aGUKKyAgICAgICAgICAgIC8v
IGFyZ3VtZW50cyByZWNlaXZlZCBpbnNpZGUgdGhlIGNhbGxlZS4gQnV0IHRoYXQgcHJvYmFibHkg
d29uJ3QgbWF0dGVyIGZvciBtb3N0CisgICAgICAgICAgICAvLyBjYWxscy4KKyAgICAgICAgICAg
IGlmIChjb2RlQmxvY2sgJiYgYXJndW1lbnQgPCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29kZUJs
b2NrLT5udW1QYXJhbWV0ZXJzKCkpKSB7CisgICAgICAgICAgICAgICAgQ29uY3VycmVudEpTTG9j
a2VyIGxvY2tlcihjb2RlQmxvY2stPm1fbG9jayk7CisgICAgICAgICAgICAgICAgVmFsdWVQcm9m
aWxlJiBwcm9maWxlID0gY29kZUJsb2NrLT52YWx1ZVByb2ZpbGVGb3JBcmd1bWVudChhcmd1bWVu
dCk7CisgICAgICAgICAgICAgICAgdmFyaWFibGUtPnByZWRpY3QocHJvZmlsZS5jb21wdXRlVXBk
YXRlZFByZWRpY3Rpb24obG9ja2VyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIE5vZGUqIHNldEFyZ3VtZW50ID0gYWRkVG9HcmFwaChTZXRBcmd1bWVudCwgT3BJ
bmZvKHZhcmlhYmxlKSk7CisgICAgICAgICAgICBtX2N1cnJlbnRCbG9jay0+dmFyaWFibGVzQXRU
YWlsLnNldE9wZXJhbmQodmFyaWFibGUtPmxvY2FsKCksIHNldEFyZ3VtZW50KTsKKyAgICAgICAg
fQorICAgIH07CisKKyAgICAvLyBJbnRyaW5zaWNzIGFuZCBpbnRlcm5hbCBmdW5jdGlvbnMgY2Fu
IG9ubHkgYmUgaW5saW5lZCBpZiB3ZSdyZSBub3QgZG9pbmcgdmFyYXJncy4gVGhpcyBpcyBiZWNh
dXNlCisgICAgLy8gd2UgY3VycmVudGx5IGRvbid0IGhhdmUgYW55IHdheSBvZiBnZXR0aW5nIHBy
b2ZpbGluZyBpbmZvcm1hdGlvbiBmb3IgYXJndW1lbnRzIHRvIG5vbi1KUyB2YXJhcmdzCisgICAg
Ly8gY2FsbHMuIFRoZSBwcmVkaWN0aW9uIHByb3BhZ2F0b3Igd29uJ3QgYmUgb2YgYW55IGhlbHAg
YmVjYXVzZSBMb2FkVmFyYXJncyBvYnNjdXJlcyB0aGUgZGF0YSBmbG93LAorICAgIC8vIGFuZCB0
aGVyZSBhcmUgbm8gY2FsbHNpdGUgdmFsdWUgcHJvZmlsZXMgYW5kIG5hdGl2ZSBmdW5jdGlvbiB3
b24ndCBoYXZlIGNhbGxlZSB2YWx1ZSBwcm9maWxlcyBmb3IKKyAgICAvLyB0aG9zZSBhcmd1bWVu
dHMuIEV2ZW4gd29yc2UsIGlmIHRoZSBpbnRyaW5zaWMgZGVjaWRlcyB0byBleGl0LCBpdCB3b24n
dCByZWFsbHkgaGF2ZSBhbnl3aGVyZSB0bworICAgIC8vIGV4aXQgdG86IExvYWRWYXJhcmdzIGlz
IGVmZmVjdGZ1bCBhbmQgaXQncyBwYXJ0IG9mIHRoZSBvcF9jYWxsX3ZhcmFyZ3MsIHNvIHdlIGNh
bid0IGV4aXQgd2l0aG91dAorICAgIC8vIGNhbGxpbmcgTG9hZFZhcmFyZ3MgdHdpY2UuCisgICAg
aW5saW5lQ2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2FsbFZhcmlhbnQsIHJl
Z2lzdGVyT2Zmc2V0LCBtYXhOdW1Bcmd1bWVudHMsIG5leHRPZmZzZXQsIGtpbmQsIG51bGxwdHIs
IGluc2VydENoZWNrcyk7CisKKyAgICBWRVJCT1NFX0xPRygiU3VjY2Vzc2Z1bCBpbmxpbmluZyAo
dmFyYXJncywgbW9ub21vcnBoaWMpLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJc
biIpOworICAgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBCeXRlQ29kZVBhcnNlcjo6Z2V0
SW5saW5pbmdCYWxhbmNlKGNvbnN0IENhbGxMaW5rU3RhdHVzJiBjYWxsTGlua1N0YXR1cywgQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQpCit7CiAgICAgdW5zaWduZWQg
aW5saW5pbmdCYWxhbmNlID0gT3B0aW9uczo6bWF4aW11bUZ1bmN0aW9uRm9yQ2FsbElubGluZUNh
bmRpZGF0ZUluc3RydWN0aW9uQ291bnQoKTsKICAgICBpZiAoc3BlY2lhbGl6YXRpb25LaW5kID09
IENvZGVGb3JDb25zdHJ1Y3QpCiAgICAgICAgIGlubGluaW5nQmFsYW5jZSA9IHN0ZDo6bWluKGlu
bGluaW5nQmFsYW5jZSwgT3B0aW9uczo6bWF4aW11bUZ1bmN0aW9uRm9yQ29uc3RydWN0SW5saW5l
Q2FuZGlkYXRlSW5zdHJ1Y3Rpb25Db3VudCgpKTsKICAgICBpZiAoY2FsbExpbmtTdGF0dXMuaXND
bG9zdXJlQ2FsbCgpKQogICAgICAgICBpbmxpbmluZ0JhbGFuY2UgPSBzdGQ6Om1pbihpbmxpbmlu
Z0JhbGFuY2UsIE9wdGlvbnM6Om1heGltdW1GdW5jdGlvbkZvckNsb3N1cmVDYWxsSW5saW5lQ2Fu
ZGlkYXRlSW5zdHJ1Y3Rpb25Db3VudCgpKTsKKyAgICByZXR1cm4gaW5saW5pbmdCYWxhbmNlOwor
fQorCitCeXRlQ29kZVBhcnNlcjo6Q2FsbE9wdGltaXphdGlvblJlc3VsdCBCeXRlQ29kZVBhcnNl
cjo6aGFuZGxlSW5saW5pbmcoCisgICAgTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRP
cGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtTdGF0dXMsCisgICAgaW50IHJl
Z2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LAorICAgIGludCBhcmd1
bWVudENvdW50SW5jbHVkaW5nVGhpcywKKyAgICB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBOb2RlVHlw
ZSBjYWxsT3AsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVk
aWN0aW9uKQoreworICAgIFZFUkJPU0VfTE9HKCJIYW5kbGluZyBpbmxpbmluZy4uLlxuU3RhY2s6
ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwogICAgIAorICAgIENvZGVTcGVjaWFsaXph
dGlvbktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVjaWFsaXph
dGlvbktpbmRGb3Ioa2luZCk7CisgICAgdW5zaWduZWQgaW5saW5pbmdCYWxhbmNlID0gZ2V0SW5s
aW5pbmdCYWxhbmNlKGNhbGxMaW5rU3RhdHVzLCBzcGVjaWFsaXphdGlvbktpbmQpOworCiAgICAg
Ly8gRmlyc3QgY2hlY2sgaWYgd2UgY2FuIGF2b2lkIGNyZWF0aW5nIGNvbnRyb2wgZmxvdy4gT3Vy
IGlubGluZXIgZG9lcyBzb21lIENGRwogICAgIC8vIHNpbXBsaWZpY2F0aW9uIG9uIHRoZSBmbHkg
YW5kIHRoaXMgaGVscHMgcmVkdWNlIGNvbXBpbGUgdGltZXMsIGJ1dCB3ZSBjYW4gb25seSBsZXZl
cmFnZQogICAgIC8vIHRoaXMgaW4gY2FzZXMgd2hlcmUgd2UgZG9uJ3QgbmVlZCBjb250cm9sIGZs
b3cgZGlhbW9uZHMgdG8gY2hlY2sgdGhlIGNhbGxlZS4KICAgICBpZiAoIWNhbGxMaW5rU3RhdHVz
LmNvdWxkVGFrZVNsb3dQYXRoKCkgJiYgY2FsbExpbmtTdGF0dXMuc2l6ZSgpID09IDEpIHsKLSAg
ICAgICAgaW50IHJlZ2lzdGVyT2Zmc2V0OwotICAgICAgICAKLSAgICAgICAgLy8gT25seSB1c2Vk
IGZvciB2YXJhcmdzIGNhbGxzLgotICAgICAgICB1bnNpZ25lZCBtYW5kYXRvcnlNaW5pbXVtID0g
MDsKLSAgICAgICAgdW5zaWduZWQgbWF4TnVtQXJndW1lbnRzID0gMDsKLQotICAgICAgICBpZiAo
SW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFyZ3Moa2luZCkpIHsKLSAgICAgICAgICAgIGlmIChGdW5j
dGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uRXhlY3V0YWJsZSA9IGNhbGxMaW5rU3RhdHVzWzBdLmZ1
bmN0aW9uRXhlY3V0YWJsZSgpKQotICAgICAgICAgICAgICAgIG1hbmRhdG9yeU1pbmltdW0gPSBm
dW5jdGlvbkV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7Ci0gICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgbWFuZGF0b3J5TWluaW11bSA9IDA7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIC8vIGluY2x1ZGVzICJ0aGlzIgotICAgICAgICAgICAgbWF4TnVtQXJndW1lbnRzID0g
c3RkOjptYXgoCi0gICAgICAgICAgICAgICAgY2FsbExpbmtTdGF0dXMubWF4TnVtQXJndW1lbnRz
KCksCi0gICAgICAgICAgICAgICAgbWFuZGF0b3J5TWluaW11bSArIDEpOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICAvLyBXZSBzb3J0IG9mIHByZXRlbmQgdGhhdCB0aGlzICppcyogdGhlIG51
bWJlciBvZiBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZC4KLSAgICAgICAgICAgIGFyZ3VtZW50
Q291bnRJbmNsdWRpbmdUaGlzID0gbWF4TnVtQXJndW1lbnRzOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICByZWdpc3Rlck9mZnNldCA9IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVSZWcgKyAx
OwotICAgICAgICAgICAgcmVnaXN0ZXJPZmZzZXQgLT0gbWF4TnVtQXJndW1lbnRzOyAvLyBpbmNs
dWRlcyAidGhpcyIKLSAgICAgICAgICAgIHJlZ2lzdGVyT2Zmc2V0IC09IENhbGxGcmFtZTo6aGVh
ZGVyU2l6ZUluUmVnaXN0ZXJzOwotICAgICAgICAgICAgcmVnaXN0ZXJPZmZzZXQgPSAtV1RGOjpy
b3VuZFVwVG9NdWx0aXBsZU9mKAotICAgICAgICAgICAgICAgIHN0YWNrQWxpZ25tZW50UmVnaXN0
ZXJzKCksCi0gICAgICAgICAgICAgICAgLXJlZ2lzdGVyT2Zmc2V0KTsKLSAgICAgICAgfSBlbHNl
Ci0gICAgICAgICAgICByZWdpc3Rlck9mZnNldCA9IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVS
ZWc7Ci0gICAgICAgIAotICAgICAgICBib29sIHJlc3VsdCA9IGF0dGVtcHRUb0lubGluZUNhbGwo
Ci0gICAgICAgICAgICBjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2FsbExpbmtTdGF0
dXNbMF0sIHJlZ2lzdGVyT2Zmc2V0LAotICAgICAgICAgICAgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMsIG5leHRPZmZzZXQsIGtpbmQsIHByZWRpY3Rpb24sCi0gICAgICAgICAgICBpbmxpbmlu
Z0JhbGFuY2UsIG51bGxwdHIsIFsmXSAoQ29kZUJsb2NrKiBjb2RlQmxvY2spIHsKLSAgICAgICAg
ICAgICAgICBlbWl0RnVuY3Rpb25DaGVja3MoY2FsbExpbmtTdGF0dXNbMF0sIGNhbGxUYXJnZXRO
b2RlLCB0aGlzQXJndW1lbnQpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHZh
cmFyZ3MgY2FsbCwgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBhcmd1bWVudHMgcmlnaHQgbm93Lgot
ICAgICAgICAgICAgICAgIGlmIChJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKSkgewot
ICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYXBwZWRSZWdpc3Rlck9mZnNldCA9Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBtX2lubGluZVN0YWNrVG9wLT5yZW1hcE9wZXJhbmQoVmlydHVhbFJl
Z2lzdGVyKHJlZ2lzdGVyT2Zmc2V0KSkub2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgICAgICBlbnN1cmVMb2NhbHMoVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVk
UmVnaXN0ZXJPZmZzZXQpLnRvTG9jYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgICAgICBpbnQgYXJndW1lbnRTdGFydCA9IHJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZy
YW1lOjpoZWFkZXJTaXplSW5SZWdpc3RlcnM7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZW1h
cHBlZEFyZ3VtZW50U3RhcnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmxpbmVTdGFj
a1RvcC0+cmVtYXBPcGVyYW5kKFZpcnR1YWxSZWdpc3Rlcihhcmd1bWVudFN0YXJ0KSkub2Zmc2V0
KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTG9hZFZhcmFyZ3NEYXRhKiBkYXRhID0gbV9ncmFw
aC5tX2xvYWRWYXJhcmdzRGF0YS5hZGQoKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS0+c3Rh
cnQgPSBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0YXJ0ICsgMSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVkUmVnaXN0
ZXJPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50KTsKLSAgICAgICAgICAgICAg
ICAgICAgZGF0YS0+b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OwotICAgICAgICAgICAgICAgICAg
ICBkYXRhLT5saW1pdCA9IG1heE51bUFyZ3VtZW50czsKLSAgICAgICAgICAgICAgICAgICAgZGF0
YS0+bWFuZGF0b3J5TWluaW11bSA9IG1hbmRhdG9yeU1pbmltdW07Ci0KLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGNhbGxPcCA9PSBUYWlsQ2FsbEZvcndhcmRWYXJhcmdzKQotICAgICAgICAgICAg
ICAgICAgICAgICAgYWRkVG9HcmFwaChGb3J3YXJkVmFyYXJncywgT3BJbmZvKGRhdGEpKTsKLSAg
ICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9HcmFw
aChMb2FkVmFyYXJncywgT3BJbmZvKGRhdGEpLCBnZXQoYXJndW1lbnRzQXJndW1lbnQpKTsKLQot
ICAgICAgICAgICAgICAgICAgICAvLyBMb2FkVmFyYXJncyBtYXkgT1NSIGV4aXQuIEhlbmNlLCB3
ZSBuZWVkIHRvIGtlZXAgYWxpdmUgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVudAotICAgICAg
ICAgICAgICAgICAgICAvLyBhbmQgYXJndW1lbnRzQXJndW1lbnQgZm9yIHRoZSBiYXNlbGluZSBK
SVQuIEhvd2V2ZXIsIHdlIG9ubHkgbmVlZCBhIFBoYW50b20gZm9yCi0gICAgICAgICAgICAgICAg
ICAgIC8vIGNhbGxUYXJnZXROb2RlIGJlY2F1c2UgdGhlIG90aGVyIDIgYXJlIHN0aWxsIGluIHVz
ZSBhbmQgYWxpdmUgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgICAgICAgICAgYWRkVG9HcmFw
aChQaGFudG9tLCBjYWxsVGFyZ2V0Tm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW4g
REZHIElSIGJlZm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJvbCBmbG93IGJldHdlZW4g
YWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIExvYWRWYXJhcmdzIGFuZCB0aGUgbGFz
dCBTZXRBcmd1bWVudC4gVGhpcyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQgdG8gREZHCi0g
ICAgICAgICAgICAgICAgICAgIC8vIFNTQS4gRm9ydHVuYXRlbHksIHdlIGFsc28gaGF2ZSBvdGhl
ciByZWFzb25zIGZvciBub3QgaW5zZXJ0aW5nIGNvbnRyb2wgZmxvdwotICAgICAgICAgICAgICAg
ICAgICAvLyBiZWZvcmUgU1NBLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFZh
cmlhYmxlQWNjZXNzRGF0YSogY291bnRWYXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0YSgK
LSAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVy
T2Zmc2V0ICsgQ2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCkpOwotICAgICAgICAgICAgICAg
ICAgICAvLyBUaGlzIGlzIHByZXR0eSBsYW1lLCBidXQgaXQgd2lsbCBmb3JjZSB0aGUgY291bnQg
dG8gYmUgZmx1c2hlZCBhcyBhbiBpbnQuIFRoaXMgZG9lc24ndAotICAgICAgICAgICAgICAgICAg
ICAvLyBtYXR0ZXIgdmVyeSBtdWNoLCBzaW5jZSBvdXIgdXNlIG9mIGEgU2V0QXJndW1lbnQgYW5k
IEZsdXNoZXMgZm9yIHRoaXMgbG9jYWwgc2xvdCBpcwotICAgICAgICAgICAgICAgICAgICAvLyBt
b3N0bHkganVzdCBhIGZvcm1hbGl0eS4KLSAgICAgICAgICAgICAgICAgICAgY291bnRWYXJpYWJs
ZS0+cHJlZGljdChTcGVjSW50MzJPbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgY291bnRWYXJp
YWJsZS0+bWVyZ2VJc1Byb2ZpdGFibGVUb1VuYm94KHRydWUpOwotICAgICAgICAgICAgICAgICAg
ICBOb2RlKiBzZXRBcmd1bWVudENvdW50ID0gYWRkVG9HcmFwaChTZXRBcmd1bWVudCwgT3BJbmZv
KGNvdW50VmFyaWFibGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZh
cmlhYmxlc0F0VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFyaWFibGUtPmxvY2FsKCksIHNldEFyZ3Vt
ZW50Q291bnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHNldChWaXJ0dWFsUmVnaXN0ZXIoYXJn
dW1lbnRTdGFydCksIGdldCh0aGlzQXJndW1lbnQpLCBJbW1lZGlhdGVOYWtlZFNldCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgYXJndW1lbnQgPSAxOyBhcmd1bWVudCA8IG1h
eE51bUFyZ3VtZW50czsgKythcmd1bWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgVmFy
aWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0YSgKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0
YXJ0ICsgYXJndW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5tZXJn
ZVNob3VsZE5ldmVyVW5ib3godHJ1ZSk7IC8vIFdlIGN1cnJlbnRseSBoYXZlIG5vd2hlcmUgdG8g
cHV0IHRoZSB0eXBlIGNoZWNrIG9uIHRoZSBMb2FkVmFyYXJncy4gTG9hZFZhcmFyZ3MgaXMgZWZm
ZWN0ZnVsLCBzbyBhZnRlciBpdCBmaW5pc2hlcywgd2UgY2Fubm90IGV4aXQuCi0gICAgICAgICAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBhIHdoaWxlIGl0
IGhhZCBiZWVuIG15IGludGVudGlvbiB0byBkbyB0aGluZ3MgbGlrZSB0aGlzIGluc2lkZSB0aGUK
LSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWRpY3Rpb24gaW5qZWN0aW9uIHBoYXNlLiBC
dXQgaW4gdGhpcyBjYXNlIGl0J3MgcmVhbGx5IGJlc3QgdG8gZG8gaXQgaGVyZSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyBoZXJlIHRoYXQgd2UgaGF2ZSBhY2Nlc3Mg
dG8gdGhlIHZhcmlhYmxlIGFjY2VzcyBkYXRhcyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAg
ICAgICAvLyBpbmxpbmluZyB3ZSdyZSBhYm91dCB0byBkby4KLSAgICAgICAgICAgICAgICAgICAg
ICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgZWxzZSB0aGF0J3Mg
aW50ZXJlc3RpbmcgaGVyZSBpcyB0aGF0IHdlJ2QgcmVhbGx5IGxvdmUgdG8gZ2V0Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAvLyBwcmVkaWN0aW9ucyBmcm9tIHRoZSBhcmd1bWVudHMgbG9hZGVk
IGF0IHRoZSBjYWxsc2l0ZSwgcmF0aGVyIHRoYW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAg
ICAvLyBhcmd1bWVudHMgcmVjZWl2ZWQgaW5zaWRlIHRoZSBjYWxsZWUuIEJ1dCB0aGF0IHByb2Jh
Ymx5IHdvbid0IG1hdHRlciBmb3IgbW9zdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fs
bHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZUJsb2NrICYmIGFyZ3VtZW50IDwg
c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpKSkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRKU0xvY2tlciBsb2NrZXIoY29kZUJs
b2NrLT5tX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUHJvZmlsZSYg
cHJvZmlsZSA9IGNvZGVCbG9jay0+dmFsdWVQcm9maWxlRm9yQXJndW1lbnQoYXJndW1lbnQpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5wcmVkaWN0KHByb2ZpbGUuY29t
cHV0ZVVwZGF0ZWRQcmVkaWN0aW9uKGxvY2tlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBOb2Rl
KiBzZXRBcmd1bWVudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1lbnQsIE9wSW5mbyh2YXJpYWJsZSkp
OwotICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFp
bC5zZXRPcGVyYW5kKHZhcmlhYmxlLT5sb2NhbCgpLCBzZXRBcmd1bWVudCk7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAg
VkVSQk9TRV9MT0coIkRvbmUgaW5saW5pbmcgKHNpbXBsZSkuXG5TdGFjazogIiwgY3VycmVudENv
ZGVPcmlnaW4oKSwgIlxuUmVzdWx0OiAiLCByZXN1bHQsICJcbiIpOwotICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgICAgICByZXR1cm4gaGFuZGxlQ2FsbFZhcmlhbnQoCisgICAgICAgICAgICBj
YWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2FsbExpbmtTdGF0dXNbMF0sIHJlZ2lzdGVy
T2Zmc2V0LCB0aGlzQXJndW1lbnQsCisgICAgICAgICAgICBhcmd1bWVudENvdW50SW5jbHVkaW5n
VGhpcywgbmV4dE9mZnNldCwgY2FsbE9wLCBraW5kLCBwcmVkaWN0aW9uLCBpbmxpbmluZ0JhbGFu
Y2UsIG51bGxwdHIsIHRydWUpOwogICAgIH0KLSAgICAKKwogICAgIC8vIFdlIG5lZWQgdG8gY3Jl
YXRlIHNvbWUga2luZCBvZiBzd2l0Y2ggb3ZlciBjYWxsZWUuIEZvciBub3cgd2Ugb25seSBkbyB0
aGlzIGlmIHdlIGJlbGlldmUgdGhhdAogICAgIC8vIHdlJ3JlIGluIHRoZSB0b3AgdGllci4gV2Ug
aGF2ZSB0d28gcmVhc29ucyBmb3IgdGhpczogZmlyc3QsIGl0IHByb3ZpZGVzIHVzIGFuIG9wcG9y
dHVuaXR5IHRvCiAgICAgLy8gZG8gbW9yZSBkZXRhaWxlZCBwb2x5dmFyaWFudC9wb2x5bW9ycGhp
YyBwcm9maWxpbmc7IGFuZCBzZWNvbmQsIGl0IHJlZHVjZXMgY29tcGlsZSB0aW1lcyBpbgogICAg
IC8vIHRoZSBERkcuIEFuZCBieSBwb2x5dmFyaWFudCBwcm9maWxpbmcgd2UgbWVhbiBwb2x5dmFy
aWFudCBwcm9maWxpbmcgb2YgKnRoaXMqIGNhbGwuIE5vdGUgdGhhdAogICAgIC8vIHdlIGNvdWxk
IGltcHJvdmUgdGhhdCBhc3BlY3Qgb2YgdGhpcyBieSBkb2luZyBwb2x5bW9ycGhpYyBpbmxpbmlu
ZyBidXQgaGF2aW5nIHRoZSBwcm9maWxpbmcKICAgICAvLyBhbHNvLgotICAgIGlmICghaXNGVEwo
bV9ncmFwaC5tX3BsYW4ubW9kZSkgfHwgIU9wdGlvbnM6OnVzZVBvbHltb3JwaGljQ2FsbElubGlu
aW5nKCkKLSAgICAgICAgfHwgSW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFyZ3Moa2luZCkpIHsKKyAg
ICBpZiAoIWlzRlRMKG1fZ3JhcGgubV9wbGFuLm1vZGUpIHx8ICFPcHRpb25zOjp1c2VQb2x5bW9y
cGhpY0NhbGxJbmxpbmluZygpKSB7CiAgICAgICAgIFZFUkJPU0VfTE9HKCJCYWlsaW5nIGlubGlu
aW5nIChoYXJkKS5cblN0YWNrOiAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiXG4iKTsKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6
RGlkTm90aGluZzsKICAgICB9CiAgICAgCiAgICAgLy8gSWYgdGhlIGNsYWltIGlzIHRoYXQgdGhp
cyBkaWQgbm90IG9yaWdpbmF0ZSBmcm9tIGEgc3R1YiwgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGVt
aXQgYSBzd2l0Y2gKQEAgLTE5NjgsNyArMTk3NCw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6Omhh
bmRsZUlubGluaW5nKAogICAgIGlmICghT3B0aW9uczo6dXNlUG9seW1vcnBoaWNDYWxsSW5saW5p
bmdGb3JOb25TdHViU3RhdHVzKCkKICAgICAgICAgJiYgIWNhbGxMaW5rU3RhdHVzLmlzQmFzZWRP
blN0dWIoKSkgewogICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmluZyAobm9uLXN0
dWIgcG9seW1vcnBoaXNtKS5cblN0YWNrOiAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiXG4iKTsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJl
c3VsdDo6RGlkTm90aGluZzsKICAgICB9CiAKICAgICBib29sIGFsbEFyZUNsb3N1cmVDYWxscyA9
IHRydWU7CkBAIC0xOTkxLDEzICsxOTk3LDExIEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRs
ZUlubGluaW5nKAogICAgICAgICAvLyBjbG9zdXJlIGNhbGxzLgogICAgICAgICAvLyBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2MDIwCiAgICAgICAgIFZFUkJPU0Vf
TE9HKCJCYWlsaW5nIGlubGluaW5nIChtaXgpLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2lu
KCksICJcbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBDYWxsT3B0
aW1pemF0aW9uUmVzdWx0OjpEaWROb3RoaW5nOwogICAgIH0KIAogICAgIFZFUkJPU0VfTE9HKCJE
b2luZyBoYXJkIGlubGluaW5nLi4uXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIlxu
Iik7CiAKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXQgPSByZWdpc3Rlck9mZnNldE9yRmlyc3RGcmVl
UmVnOwotCiAgICAgLy8gVGhpcyBtYWtlcyBtZSB3aXNoIHRoYXQgd2Ugd2VyZSBpbiBTU0EgYWxs
IHRoZSB0aW1lLiBXZSBuZWVkIHRvIHBpY2sgYSB2YXJpYWJsZSBpbnRvIHdoaWNoIHRvCiAgICAg
Ly8gc3RvcmUgdGhlIGNhbGxlZSBzbyB0aGF0IGl0IHdpbGwgYmUgYWNjZXNzaWJsZSB0byBhbGwg
b2YgdGhlIGJsb2NrcyB3ZSdyZSBhYm91dCB0byBjcmVhdGUuIFdlCiAgICAgLy8gZ2V0IGF3YXkg
d2l0aCBkb2luZyBhbiBpbW1lZGlhdGUtc2V0IGhlcmUgYmVjYXVzZSB3ZSB3b3VsZG4ndCBoYXZl
IHBlcmZvcm1lZCBhbnkgc2lkZSBlZmZlY3RzCkBAIC0yMDM1LDEyICsyMDM5LDEyIEBAIGJvb2wg
Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUlubGluaW5nKAogICAgICAgICAKICAgICAgICAgTm9kZSog
bXlDYWxsVGFyZ2V0Tm9kZSA9IGdldERpcmVjdChjYWxsZWVSZWcpOwogICAgICAgICAKLSAgICAg
ICAgYm9vbCBpbmxpbmluZ1Jlc3VsdCA9IGF0dGVtcHRUb0lubGluZUNhbGwoCisgICAgICAgIGF1
dG8gaW5saW5pbmdSZXN1bHQgPSBoYW5kbGVDYWxsVmFyaWFudCgKICAgICAgICAgICAgIG15Q2Fs
bFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGNhbGxMaW5rU3RhdHVzW2ldLCByZWdpc3Rlck9m
ZnNldCwKLSAgICAgICAgICAgIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBuZXh0T2Zmc2V0
LCBraW5kLCBwcmVkaWN0aW9uLAotICAgICAgICAgICAgaW5saW5pbmdCYWxhbmNlLCBjb250aW51
YXRpb25CbG9jaywgWyZdIChDb2RlQmxvY2sqKSB7IH0pOworICAgICAgICAgICAgdGhpc0FyZ3Vt
ZW50LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgbmV4dE9mZnNldCwgY2FsbE9wLCBraW5k
LCBwcmVkaWN0aW9uLAorICAgICAgICAgICAgaW5saW5pbmdCYWxhbmNlLCBjb250aW51YXRpb25C
bG9jaywgZmFsc2UpOwogICAgICAgICAKLSAgICAgICAgaWYgKCFpbmxpbmluZ1Jlc3VsdCkgewor
ICAgICAgICBpZiAoaW5saW5pbmdSZXN1bHQgPT0gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6RGlk
Tm90aGluZykgewogICAgICAgICAgICAgLy8gVGhhdCBmYWlsZWQgc28gd2UgbGV0IHRoZSBibG9j
ayBkaWUuIE5vdGhpbmcgaW50ZXJlc3Rpbmcgc2hvdWxkIGhhdmUgYmVlbiBhZGRlZCB0bwogICAg
ICAgICAgICAgLy8gdGhlIGJsb2NrLiBXZSBhbHNvIGdpdmUgdXAgb24gaW5saW5pbmcgYW55IG9m
IHRoZSAobGVzcyBmcmVxdWVudCkgY2FsbGVlcy4KICAgICAgICAgICAgIEFTU0VSVChtX2dyYXBo
Lm1fYmxvY2tzLmxhc3QoKSA9PSBtX2N1cnJlbnRCbG9jayk7CkBAIC0yMDYxLDcgKzIwNjUsNyBA
QCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZygKICAgICAgICAgICAgIHRoaW5n
VG9DYXNlT24gPSBjYWxsTGlua1N0YXR1c1tpXS5leGVjdXRhYmxlKCk7CiAgICAgICAgIH0KICAg
ICAgICAgZGF0YS5jYXNlcy5hcHBlbmQoU3dpdGNoQ2FzZShtX2dyYXBoLmZyZWV6ZSh0aGluZ1Rv
Q2FzZU9uKSwgY2FsbGVlRW50cnlCbG9jaykpOwotICAgICAgICBWRVJCT1NFX0xPRygiRmluaXNo
ZWQgaW5saW5pbmcgIiwgY2FsbExpbmtTdGF0dXNbaV0sICIgYXQgIiwgY3VycmVudENvZGVPcmln
aW4oKSwgIi5cbiIpOworICAgICAgICBWRVJCT1NFX0xPRygiRmluaXNoZWQgb3B0aW1pemluZyAi
LCBjYWxsTGlua1N0YXR1c1tpXSwgIiBhdCAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiLlxuIik7
CiAgICAgfQogCiAgICAgLy8gU2xvdyBwYXRoIGJsb2NrCkBAIC0yMTAyLDcgKzIxMDYsNyBAQCBi
b29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZygKICAgICBtX2V4aXRPSyA9IHRydWU7
CiAgICAgCiAgICAgVkVSQk9TRV9MT0coIkRvbmUgaW5saW5pbmcgKGhhcmQpLlxuU3RhY2s6ICIs
IGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVy
biBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpJbmxpbmVkOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFt
ZSBDaGVja3NGdW5jdG9yPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>324401</attachid>
            <date>2017-10-20 08:09:58 -0700</date>
            <delta_ts>2017-10-20 10:20:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-178390-20171020170956.patch</filename>
            <type>text/plain</type>
            <size>40129</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIzNzU1CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCAw
YjIzZTZhMTIzMzYzMGJjNTkwOTg1YjY4NmNjODQ4NzVmOWNlYmFmLi4xMzcwZGFhOWVlODdmOTdk
ZDNlZDEwY2ZjY2VhNmNlZGE0YTIyNjI1IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNiBAQAorMjAxNy0xMC0yMCAgUm9iaW4gTW9yaXNzZXQgIDxybW9yaXNzZXRAYXBwbGUu
Y29tPgorCisgICAgICAgIFN1cHBvcnQgcmVjdXJzaXZlIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24g
Zm9yIHBvbHltb3JwaGljIGNhbGxzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNzgzOTAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBDb21lcyB3aXRoIGEgbGFyZ2UgYnV0IGZhaXJseSBzaW1wbGUgcmVmYWN0
b3Jpbmc6IHRoZSBpbmxpbmluZyBwYXRoIGZvciB2YXJhcmdzIGFuZCBub24tdmFyYXJncyBjYWxs
cyBub3cgY29udmVyZ2UgYSBsb3QgbGF0ZXIsCisgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgcmVk
dW5kYW50IGNoZWNrcywgYW5kIHNpbXBsaWZ5aW5nIGEgZmV3IHBhcnRzIG9mIHRoZSBpbmxpbmlu
ZyBwaXBlbGluZS4KKworICAgICAgICBBbHNvIHJlbW92ZXMgc29tZSBkZWFkIGNvZGUgZnJvbSBp
bmxpbmVDYWxsKCk6IHRoZXJlIHdhcyBhIHNwZWNpYWwgcGF0aCBmb3Igd2hlbiBtX2NvbnRpbnVh
dGlvbkJsb2NrIGlzIG51bGwsIGJ1dCBpdCBzaG91bGQgbmV2ZXIgYmUgKG5vdyBjaGVja2VkIHdp
dGggUkVMRUFTRV9BU1NFUlQpLgorCisgICAgICAgICogZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNw
cDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlQ2FsbCk6CisgICAg
ICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVZhcmFyZ3NDYWxsKToKKyAgICAg
ICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlUmVjdXJzaXZlVGFpbENhbGwpOgor
ICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjppbmxpbmVDYWxsKToKKyAgICAgICAg
KEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlQ2FsbFZhcmlhbnQpOgorICAgICAgICAo
SlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVWYXJhcmdzSW5saW5pbmcpOgorICAgICAg
ICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpnZXRJbmxpbmluZ0JhbGFuY2UpOgorICAgICAg
ICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyk6CisgICAgICAgIChK
U0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmF0dGVtcHRUb0lubGluZUNhbGwpOiBEZWxldGVkLgor
CiAyMDE3LTEwLTIwICBZdXN1a2UgU3V6dWtpICA8dXRhdGFuZS50ZWFAZ21haWwuY29tPgogCiAg
ICAgICAgIFVucmV2aWV3ZWQsIGZvbGxvdyB1cCB0byByZWZsZWN0IGNvbW1lbnRzCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcCBiL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCmluZGV4IDM1Yjc2
NDE5ZTE5Yjg1NzFhMjgyMGJkNjBlZTdhZTA4ZWRhZTY1YWYuLjYzNjkwOGM0NmQwZWIzNjBkNTY5
Mzk0ZGJjMmEwYjYxNWZlNjhkY2EgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHQnl0ZUNvZGVQYXJzZXIuY3BwCkBAIC0yMjQsMTQgKzIyNCwxNyBAQCBwcml2YXRlOgogICAg
IHZvaWQgZW1pdEZ1bmN0aW9uQ2hlY2tzKENhbGxWYXJpYW50LCBOb2RlKiBjYWxsVGFyZ2V0LCBW
aXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtbnQpOwogICAgIHZvaWQgZW1pdEFyZ3VtZW50UGhhbnRv
bXMoaW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMpOwog
ICAgIE5vZGUqIGdldEFyZ3VtZW50Q291bnQoKTsKLSAgICBib29sIGhhbmRsZVJlY3Vyc2l2ZVRh
aWxDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBjb25zdCBDYWxsTGlua1N0YXR1cyYsIGludCBy
ZWdpc3Rlck9mZnNldCwgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgaW50IGFyZ3VtZW50
Q291bnRJbmNsdWRpbmdUaGlzKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9y
PgorICAgIGJvb2wgaGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoQ2FsbFZhcmlhbnQsIGludCByZWdp
c3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBjb25zdCBDaGVja3NG
dW5jdG9yJiBlbWl0RnVuY3Rpb25DaGVja0lmTmVlZGVkKTsKICAgICB1bnNpZ25lZCBpbmxpbmlu
Z0Nvc3QoQ2FsbFZhcmlhbnQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgSW5saW5l
Q2FsbEZyYW1lOjpLaW5kKTsgLy8gUmV0dXJuIFVJTlRfTUFYIGlmIGl0J3Mgbm90IGFuIGlubGlu
aW5nIGNhbmRpZGF0ZS4gQnkgY29udmVudGlvbiwgaW50cmluc2ljcyBoYXZlIGEgY29zdCBvZiAx
LgogICAgIC8vIEhhbmRsZSBpbmxpbmluZy4gUmV0dXJuIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBm
YWxzZSBpZiB3ZSBuZWVkIHRvIHBsYW50IGEgY2FsbC4KLSAgICBib29sIGhhbmRsZUlubGluaW5n
KE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgY29uc3QgQ2FsbExpbmtT
dGF0dXMmLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQs
IFZpcnR1YWxSZWdpc3RlciBhcmd1bWVudHNBcmd1bWVudCwgdW5zaWduZWQgYXJndW1lbnRzT2Zm
c2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQs
IE5vZGVUeXBlIGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kLCBTcGVjdWxhdGVkVHlwZSBw
cmVkaWN0aW9uKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgotICAgIGJv
b2wgYXR0ZW1wdFRvSW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9w
ZXJhbmQsIENhbGxWYXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50
SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5k
LCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uLCB1bnNpZ25lZCYgaW5saW5pbmdCYWxhbmNlLCBC
YXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tzRnVuY3RvciYgaW5zZXJ0
Q2hlY2tzKTsKKyAgICBib29sIGhhbmRsZVZhcmFyZ3NJbmxpbmluZyhOb2RlKiBjYWxsVGFyZ2V0
Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiwgaW50IHJlZ2lz
dGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBWaXJ0dWFsUmVnaXN0ZXIg
YXJndW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwgTm9kZVR5cGUgY2Fs
bE9wLCBJbmxpbmVDYWxsRnJhbWU6OktpbmQpOworICAgIHVuc2lnbmVkIGdldElubGluaW5nQmFs
YW5jZShjb25zdCBDYWxsTGlua1N0YXR1cyYsIENvZGVTcGVjaWFsaXphdGlvbktpbmQpOworICAg
IGVudW0gY2xhc3MgQ2FsbE9wdGltaXphdGlvblJlc3VsdCB7IE9wdGltaXplZFRvSnVtcCwgSW5s
aW5lZCwgRGlkTm90aGluZyB9OworICAgIENhbGxPcHRpbWl6YXRpb25SZXN1bHQgaGFuZGxlQ2Fs
bFZhcmlhbnQoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBDYWxsVmFy
aWFudCwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBp
bnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIElubGlu
ZUNhbGxGcmFtZTo6S2luZCwgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlvbiwgdW5zaWduZWQmIGlu
bGluaW5nQmFsYW5jZSwgQmFzaWNCbG9jayogY29udGludWF0aW9uQmxvY2ssIGJvb2wgbmVlZHNU
b0NoZWNrQ2FsbGVlKTsKKyAgICBDYWxsT3B0aW1pemF0aW9uUmVzdWx0IGhhbmRsZUlubGluaW5n
KE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgY29uc3QgQ2FsbExpbmtT
dGF0dXMmLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQs
IGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgTm9k
ZVR5cGUgY2FsbE9wLCBJbmxpbmVDYWxsRnJhbWU6OktpbmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRp
Y3Rpb24pOwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNrc0Z1bmN0b3I+Ci0gICAgdm9pZCBp
bmxpbmVDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZh
cmlhbnQsIGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlz
LCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBJbmxpbmVDYWxsRnJhbWU6OktpbmQsIEJhc2ljQmxvY2sq
IGNvbnRpbnVhdGlvbkJsb2NrLCBjb25zdCBDaGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpOwor
ICAgIHZvaWQgaW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJh
bmQsIENhbGxWYXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5j
bHVkaW5nVGhpcywgSW5saW5lQ2FsbEZyYW1lOjpLaW5kLCBCYXNpY0Jsb2NrKiBjb250aW51YXRp
b25CbG9jaywgY29uc3QgQ2hlY2tzRnVuY3RvciYgaW5zZXJ0Q2hlY2tzKTsKICAgICAvLyBIYW5k
bGUgaW50cmluc2ljIGZ1bmN0aW9ucy4gUmV0dXJuIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxz
ZSBpZiB3ZSBuZWVkIHRvIHBsYW50IGEgY2FsbC4KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVj
a3NGdW5jdG9yPgogICAgIGJvb2wgaGFuZGxlSW50cmluc2ljQ2FsbChOb2RlKiBjYWxsZWUsIGlu
dCByZXN1bHRPcGVyYW5kLCBJbnRyaW5zaWMsIGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3Vt
ZW50Q291bnRJbmNsdWRpbmdUaGlzLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uLCBjb25zdCBD
aGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpOwpAQCAtMTIzMiw3ICsxMjM1LDcgQEAgQmFzaWNC
bG9jayogQnl0ZUNvZGVQYXJzZXI6OmFsbG9jYXRlVW50YXJnZXRhYmxlQmxvY2soKQogCiB2b2lk
IEJ5dGVDb2RlUGFyc2VyOjptYWtlQmxvY2tUYXJnZXRhYmxlKEJhc2ljQmxvY2sqIGJsb2NrLCB1
bnNpZ25lZCBieXRlY29kZUluZGV4KQogewotICAgIEFTU0VSVChibG9jay0+Ynl0ZWNvZGVCZWdp
biA9PSBVSU5UX01BWCk7CisgICAgUkVMRUFTRV9BU1NFUlQoYmxvY2stPmJ5dGVjb2RlQmVnaW4g
PT0gVUlOVF9NQVgpOwogICAgIGJsb2NrLT5ieXRlY29kZUJlZ2luID0gYnl0ZWNvZGVJbmRleDsK
ICAgICAvLyBtX2Jsb2NrTGlua2luZ1RhcmdldHMgbXVzdCBhbHdheXMgYmUgc29ydGVkIGluIGlu
Y3JlYXNpbmcgb3JkZXIgb2YgYnl0ZWNvZGVCZWdpbgogICAgIGlmIChtX2lubGluZVN0YWNrVG9w
LT5tX2Jsb2NrTGlua2luZ1RhcmdldHMuc2l6ZSgpKQpAQCAtMTI5NCwyMSArMTI5NywxNSBAQCBC
eXRlQ29kZVBhcnNlcjo6VGVybWluYWxpdHkgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwoCiAg
ICAgCiAgICAgVkVSQk9TRV9MT0coIiAgICBIYW5kbGluZyBjYWxsIGF0ICIsIGN1cnJlbnRDb2Rl
T3JpZ2luKCksICI6ICIsIGNhbGxMaW5rU3RhdHVzLCAiXG4iKTsKICAgICAKLSAgICAvLyBXZSBm
aXJzdCBjaGVjayB0aGF0IHdlIGhhdmUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMg
Y2FsbCwgYW5kIHRoYXQgaXQgZGlkIG5vdCBiZWhhdmUgdG9vIHBvbHltb3JwaGljYWxseS4KKyAg
ICAvLyBJZiB3ZSBoYXZlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNhbGwsIGFu
ZCBpdCBkaWQgbm90IGJlaGF2ZSB0b28gcG9seW1vcnBoaWNhbGx5LAorICAgIC8vIHdlIG1heSBi
ZSBhYmxlIHRvIGlubGluZSBpdCwgb3IgaW4gdGhlIGNhc2Ugb2YgcmVjdXJzaXZlIHRhaWwgY2Fs
bHMgdHVybiBpdCBpbnRvIGEganVtcC4KICAgICBpZiAoY2FsbExpbmtTdGF0dXMuY2FuT3B0aW1p
emUoKSkgewogICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50ID0gdmlydHVhbFJl
Z2lzdGVyRm9yQXJndW1lbnQoMCwgcmVnaXN0ZXJPZmZzZXQpOwotCi0gICAgICAgIGlmIChvcCA9
PSBUYWlsQ2FsbCAmJiBoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChjYWxsVGFyZ2V0LCBjYWxsTGlu
a1N0YXR1cywgcmVnaXN0ZXJPZmZzZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRDb3VudEluY2x1
ZGluZ1RoaXMpKQorICAgICAgICBhdXRvIG9wdGltaXphdGlvblJlc3VsdCA9IGhhbmRsZUlubGlu
aW5nKGNhbGxUYXJnZXQsIHJlc3VsdCwgY2FsbExpbmtTdGF0dXMsIHJlZ2lzdGVyT2Zmc2V0LCB0
aGlzQXJndW1lbnQsCisgICAgICAgICAgICBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgbV9j
dXJyZW50SW5kZXggKyBpbnN0cnVjdGlvblNpemUsIG9wLCBraW5kLCBwcmVkaWN0aW9uKTsKKyAg
ICAgICAgaWYgKG9wdGltaXphdGlvblJlc3VsdCA9PSBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpP
cHRpbWl6ZWRUb0p1bXApCiAgICAgICAgICAgICByZXR1cm4gVGVybWluYWw7Ci0KLSAgICAgICAg
Ly8gSW5saW5pbmcgaXMgcXVpdGUgY29tcGxleCwgYW5kIG1hbmFnZWQgYnkgYSBwaXBlbGluZSBv
ZiBmdW5jdGlvbnM6Ci0gICAgICAgIC8vIGhhbmRsZShWYXJhcmdzKUNhbGwgLT4gaGFuZGxlSW5s
aW5pbmcgLT4gYXR0ZW1wdFRvSW5saW5lQ2FsbCAtPiBpbmxpbmVDYWxsCi0gICAgICAgIC8vIC0g
aGFuZGxlQ2FsbCBhbmQgaGFuZGxlVmFyYXJnc0NhbGwgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJl
IG5vIGlubGluaW5nIGhhcHBlbnMsIGFuZCBkbyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlaXIg
YXJndW1lbnRzCi0gICAgICAgIC8vIC0gaGFuZGxlSW5saW5pbmcgY2hlY2tzIHdoZXRoZXIgdGhl
IGNhbGwgaXMgcG9seW1vcnBoaWMsIGFuZCBpZiBzbyBpcyByZXNwb25zaWJsZSBmb3IgaW5zZXJ0
aW5nIGEgc3dpdGNoIG9uIHRoZSBjYWxsZWUKLSAgICAgICAgLy8gLSBhdHRlbXB0VG9JbmxpbmVD
YWxsIGRlYWxzIHdpdGggc3BlY2lhbCBjYXNlcyBzdWNoIGFzIGludHJpbnNpY3MsIGl0IGFsc28g
Y2hlY2tzIHRoZSBpbmxpbmluZyBoZXVyaXN0aWMgKHRocm91Z2ggaW5saW5pbmdDb3N0KQotICAg
ICAgICAvLyAtIGlubGluZUNhbGwgZmluYWxseSBkb2VzIHRoZSBhY3R1YWwgaW5saW5pbmcsIGFm
dGVyIGEgY29tcGxpY2F0ZWQgcHJvY2VkdXJlIHRvIHNldHVwIHRoZSBzdGFjayBjb3JyZWN0bHkK
LSAgICAgICAgdW5zaWduZWQgbmV4dE9mZnNldCA9IG1fY3VycmVudEluZGV4ICsgaW5zdHJ1Y3Rp
b25TaXplOwotICAgICAgICBpZiAoaGFuZGxlSW5saW5pbmcoY2FsbFRhcmdldCwgcmVzdWx0LCBj
YWxsTGlua1N0YXR1cywgcmVnaXN0ZXJPZmZzZXQsIHRoaXNBcmd1bWVudCwgVmlydHVhbFJlZ2lz
dGVyKCksIDAsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBuZXh0T2Zmc2V0LCBvcCwga2lu
ZCwgcHJlZGljdGlvbikpIHsKKyAgICAgICAgaWYgKG9wdGltaXphdGlvblJlc3VsdCA9PSBDYWxs
T3B0aW1pemF0aW9uUmVzdWx0OjpJbmxpbmVkKSB7CiAgICAgICAgICAgICBpZiAoVU5MSUtFTFko
bV9ncmFwaC5jb21waWxhdGlvbigpKSkKICAgICAgICAgICAgICAgICBtX2dyYXBoLmNvbXBpbGF0
aW9uKCktPm5vdGljZUlubGluZWRDYWxsKCk7CiAgICAgICAgICAgICByZXR1cm4gTm9uVGVybWlu
YWw7CkBAIC0xMzQ1LDExICsxMzQyLDE1IEBAIEJ5dGVDb2RlUGFyc2VyOjpUZXJtaW5hbGl0eSBC
eXRlQ29kZVBhcnNlcjo6aGFuZGxlVmFyYXJnc0NhbGwoSW5zdHJ1Y3Rpb24qIHBjLCBOCiAgICAg
CiAgICAgVkVSQk9TRV9MT0coIiAgICBWYXJhcmdzIGNhbGwgbGluayBzdGF0dXMgYXQgIiwgY3Vy
cmVudENvZGVPcmlnaW4oKSwgIjogIiwgY2FsbExpbmtTdGF0dXMsICJcbiIpOwogICAgIAotICAg
IGlmIChjYWxsTGlua1N0YXR1cy5jYW5PcHRpbWl6ZSgpCi0gICAgICAgICYmIGhhbmRsZUlubGlu
aW5nKGNhbGxUYXJnZXQsIHJlc3VsdCwgY2FsbExpbmtTdGF0dXMsIGZpcnN0RnJlZVJlZywgVmly
dHVhbFJlZ2lzdGVyKHRoaXNSZWcpLCBWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRzKSwgZmlyc3RW
YXJBcmdPZmZzZXQsIDAsIG1fY3VycmVudEluZGV4ICsgT1BDT0RFX0xFTkdUSChvcF9jYWxsX3Zh
cmFyZ3MpLCBvcCwgSW5saW5lQ2FsbEZyYW1lOjp2YXJhcmdzS2luZEZvcihjYWxsTW9kZSksIHBy
ZWRpY3Rpb24pKSB7Ci0gICAgICAgIGlmIChVTkxJS0VMWShtX2dyYXBoLmNvbXBpbGF0aW9uKCkp
KQotICAgICAgICAgICAgbV9ncmFwaC5jb21waWxhdGlvbigpLT5ub3RpY2VJbmxpbmVkQ2FsbCgp
OwotICAgICAgICByZXR1cm4gTm9uVGVybWluYWw7CisgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNh
bk9wdGltaXplKCkpIHsKKyAgICAgICAgaWYgKGhhbmRsZVZhcmFyZ3NJbmxpbmluZyhjYWxsVGFy
Z2V0LCByZXN1bHQsCisgICAgICAgICAgICBjYWxsTGlua1N0YXR1cywgZmlyc3RGcmVlUmVnLCBW
aXJ0dWFsUmVnaXN0ZXIodGhpc1JlZyksIFZpcnR1YWxSZWdpc3Rlcihhcmd1bWVudHMpLAorICAg
ICAgICAgICAgZmlyc3RWYXJBcmdPZmZzZXQsIG9wLAorICAgICAgICAgICAgSW5saW5lQ2FsbEZy
YW1lOjp2YXJhcmdzS2luZEZvcihjYWxsTW9kZSkpKSB7CisgICAgICAgICAgICBpZiAoVU5MSUtF
TFkobV9ncmFwaC5jb21waWxhdGlvbigpKSkKKyAgICAgICAgICAgICAgICBtX2dyYXBoLmNvbXBp
bGF0aW9uKCktPm5vdGljZUlubGluZWRDYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gTm9uVGVy
bWluYWw7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgQ2FsbFZhcmFyZ3NEYXRhKiBkYXRh
ID0gbV9ncmFwaC5tX2NhbGxWYXJhcmdzRGF0YS5hZGQoKTsKQEAgLTE0MTgsMTQgKzE0MTksMTAg
QEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6ZW1pdEFyZ3VtZW50UGhhbnRvbXMoaW50IHJlZ2lzdGVy
T2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEkKICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tLCBn
ZXQodmlydHVhbFJlZ2lzdGVyRm9yQXJndW1lbnQoaSwgcmVnaXN0ZXJPZmZzZXQpKSk7CiB9CiAK
LWJvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKE5vZGUqIGNhbGxU
YXJnZXROb2RlLCBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtTdGF0dXMsIGludCByZWdp
c3Rlck9mZnNldCwgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgaW50IGFyZ3VtZW50Q291
bnRJbmNsdWRpbmdUaGlzKQordGVtcGxhdGU8dHlwZW5hbWUgQ2hlY2tzRnVuY3Rvcj4KK2Jvb2wg
Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKENhbGxWYXJpYW50IGNhbGxW
YXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhp
cywgY29uc3QgQ2hlY2tzRnVuY3RvciYgZW1pdEZ1bmN0aW9uQ2hlY2tJZk5lZWRlZCkKIHsKLSAg
ICAvLyBGSVhNRTogV2UgY3VycmVudGx5IG9ubHkgZG8gdGhpcyBvcHRpbWlzYXRpb24gaW4gdGhl
IHNpbXBsZSwgbm9uLXBvbHltb3JwaGljIGNhc2UuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE3ODM5MAotICAgIGlmIChjYWxsTGlua1N0YXR1cy5jb3Vs
ZFRha2VTbG93UGF0aCgpIHx8IGNhbGxMaW5rU3RhdHVzLnNpemUoKSAhPSAxKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvIHRhcmdldEV4ZWN1dGFibGUgPSBjYWxsTGlua1N0YXR1
c1swXS5leGVjdXRhYmxlKCk7CisgICAgYXV0byB0YXJnZXRFeGVjdXRhYmxlID0gY2FsbFZhcmlh
bnQuZXhlY3V0YWJsZSgpOwogICAgIElubGluZVN0YWNrRW50cnkqIHN0YWNrRW50cnkgPSBtX2lu
bGluZVN0YWNrVG9wOwogICAgIGRvIHsKICAgICAgICAgaWYgKHRhcmdldEV4ZWN1dGFibGUgIT0g
c3RhY2tFbnRyeS0+ZXhlY3V0YWJsZSgpKQpAQCAtMTQ0NCw4ICsxNDQxLDggQEAgYm9vbCBCeXRl
Q29kZVBhcnNlcjo6aGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoTm9kZSogY2FsbFRhcmdldE5vZGUs
IGNvbnN0IENhbGxMaW4KICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0K
IAotICAgICAgICAvLyBXZSBtdXN0IGFkZCBzb21lIGNoZWNrIHRoYXQgdGhlIHByb2ZpbGluZyBp
bmZvcm1hdGlvbiB3YXMgY29ycmVjdCBhbmQgdGhlIHRhcmdldCBvZiB0aGlzIGNhbGwgaXMgd2hh
dCB3ZSB0aG91Z2h0Ci0gICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsTGlua1N0YXR1c1sw
XSwgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVudCk7CisgICAgICAgIC8vIFdlIG1heSBuZWVk
IHRvIGFkZCBzb21lIGNoZWNrIHRoYXQgdGhlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3YXMgY29y
cmVjdCBhbmQgdGhlIHRhcmdldCBvZiB0aGlzIGNhbGwgaXMgd2hhdCB3ZSB0aG91Z2h0CisgICAg
ICAgIGVtaXRGdW5jdGlvbkNoZWNrSWZOZWVkZWQoKTsKICAgICAgICAgLy8gV2UgZmx1c2ggZXZl
cnl0aGluZywgYXMgaWYgd2Ugd2VyZSBpbiB0aGUgYmFja2VkZ2Ugb2YgYSBsb29wIChzZWUgdHJl
YXRtZW50IG9mIG9wX2ptcCBpbiBwYXJzZUJsb2NrKS4KICAgICAgICAgZmx1c2hGb3JUZXJtaW5h
bCgpOwogCkBAIC0xNTg1LDggKzE1ODIsOSBAQCB1bnNpZ25lZCBCeXRlQ29kZVBhcnNlcjo6aW5s
aW5pbmdDb3N0KENhbGxWYXJpYW50IGNhbGxlZSwgaW50IGFyZ3VtZW50Q291bnRJbmNsdQogfQog
CiB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgotdm9pZCBCeXRlQ29kZVBhcnNlcjo6
aW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxW
YXJpYW50IGNhbGxlZSwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1
ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5k
LCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tzRnVuY3RvciYgaW5z
ZXJ0Q2hlY2tzKQordm9pZCBCeXRlQ29kZVBhcnNlcjo6aW5saW5lQ2FsbChOb2RlKiBjYWxsVGFy
Z2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXJpYW50IGNhbGxlZSwgaW50IHJlZ2lz
dGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIElubGluZUNhbGxGcmFt
ZTo6S2luZCBraW5kLCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tz
RnVuY3RvciYgaW5zZXJ0Q2hlY2tzKQogeworICAgIEluc3RydWN0aW9uKiBzYXZlZEN1cnJlbnRJ
bnN0cnVjdGlvbiA9IG1fY3VycmVudEluc3RydWN0aW9uOwogICAgIENvZGVTcGVjaWFsaXphdGlv
bktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVjaWFsaXphdGlv
bktpbmRGb3Ioa2luZCk7CiAgICAgCiAgICAgQVNTRVJUKGlubGluaW5nQ29zdChjYWxsZWUsIGFy
Z3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBraW5kKSAhPSBVSU5UX01BWCk7CkBAIC0xNzE2LDI1
MCArMTcxNCwyNTIgQEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6aW5saW5lQ2FsbChOb2RlKiBjYWxs
VGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXIKIAogICAgIGxpbmtCbG9ja3Mo
aW5saW5lU3RhY2tFbnRyeS5tX3VubGlua2VkQmxvY2tzLCBpbmxpbmVTdGFja0VudHJ5Lm1fYmxv
Y2tMaW5raW5nVGFyZ2V0cyk7CiAgICAgCi0gICAgLy8gSWYgdGhlIGNhbGxlZSByZXR1cm5lZCBh
dCBsZWFzdCBvbmNlLCBpdCBwcmVwYXJlZCBhIGNvbnRpbnVhdGlvbiBibG9jayBmb3IgdXMuCi0g
ICAgaWYgKGlubGluZVN0YWNrRW50cnkubV9jb250aW51YXRpb25CbG9jaykKLSAgICAgICAgbV9j
dXJyZW50QmxvY2sgPSBpbmxpbmVTdGFja0VudHJ5Lm1fY29udGludWF0aW9uQmxvY2s7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgY2FsbGVlIG5l
dmVyIHJldHVybnMgKGZvciBleGFtcGxlIGl0IGxvb3BzIGZvcmV2ZXIpLgotICAgICAgICAvLyBJ
biB0aGF0IGNhc2UsIGFsbCBibG9ja3Mgc2hvdWxkIGVuZCBpbiBhIHRlcm1pbmFsLgotICAgICAg
ICBBU1NFUlQobV9ncmFwaC5sYXN0QmxvY2soKS0+dGVybWluYWwoKSk7Ci0gICAgICAgIC8vIFdl
IHRoZW4gYWxsb2NhdGUgYSBuZXcgYmxvY2sgdG8gY29udGludWUgaW4uCi0gICAgICAgIG1fY3Vy
cmVudEJsb2NrID0gYWxsb2NhdGVUYXJnZXRhYmxlQmxvY2sobmV4dE9mZnNldCk7Ci0gICAgfQot
ICAgIEFTU0VSVChtX2N1cnJlbnRCbG9jayk7CisgICAgLy8gVGhlcmUgaXMgYW4gaW52YXJpYW50
IHRoYXQgd2UgdXNlIGhlcmU6IGV2ZXJ5IGZ1bmN0aW9uIGhhcyBhdCBsZWFzdCBvbmUgb3BfcmV0
IHNvbWV3aGVyZS4KKyAgICAvLyBBbmQgd2hlbiBwYXJzZUJsb2NrIGVuY291bnRlcnMgYW4gb3Bf
cmV0LCBpdCBzZXR1cHMgYSBjb250aW51YXRpb24gYmxvY2sgaWYgdGhlcmUgd2FzIG5vbmUuCisg
ICAgLy8gSWYgdGhpcyBpbnZhcmlhbnQgd2FzIHRvIGJlIGNoYW5nZWQsIHdlIHdvdWxkIG5lZWQg
dG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgaGVyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSB3YXMg
bm8gY29udGludWF0aW9uIGJsb2NrIHJlYWR5LgorICAgIFJFTEVBU0VfQVNTRVJUKGlubGluZVN0
YWNrRW50cnkubV9jb250aW51YXRpb25CbG9jayk7CisgICAgbV9jdXJyZW50QmxvY2sgPSBpbmxp
bmVTdGFja0VudHJ5Lm1fY29udGludWF0aW9uQmxvY2s7CiAgICAgQVNTRVJUKCFtX2N1cnJlbnRC
bG9jay0+dGVybWluYWwoKSk7CiAKICAgICBwcmVwYXJlVG9QYXJzZUJsb2NrKCk7CisgICAgbV9j
dXJyZW50SW5zdHJ1Y3Rpb24gPSBzYXZlZEN1cnJlbnRJbnN0cnVjdGlvbjsKIH0KIAotdGVtcGxh
dGU8dHlwZW5hbWUgQ2hlY2tzRnVuY3Rvcj4KLWJvb2wgQnl0ZUNvZGVQYXJzZXI6OmF0dGVtcHRU
b0lubGluZUNhbGwoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBDYWxs
VmFyaWFudCBjYWxsZWUsIGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNs
dWRpbmdUaGlzLCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBJbmxpbmVDYWxsRnJhbWU6OktpbmQga2lu
ZCwgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlvbiwgdW5zaWduZWQmIGlubGluaW5nQmFsYW5jZSwg
QmFzaWNCbG9jayogY29udGludWF0aW9uQmxvY2ssIGNvbnN0IENoZWNrc0Z1bmN0b3ImIGluc2Vy
dENoZWNrcykKK0J5dGVDb2RlUGFyc2VyOjpDYWxsT3B0aW1pemF0aW9uUmVzdWx0IEJ5dGVDb2Rl
UGFyc2VyOjpoYW5kbGVDYWxsVmFyaWFudChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3Vs
dE9wZXJhbmQsIENhbGxWYXJpYW50IGNhbGxlZSwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFs
UmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVu
c2lnbmVkIG5leHRPZmZzZXQsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVk
VHlwZSBwcmVkaWN0aW9uLCB1bnNpZ25lZCYgaW5saW5pbmdCYWxhbmNlLCBCYXNpY0Jsb2NrKiBj
b250aW51YXRpb25CbG9jaywgYm9vbCBuZWVkc1RvQ2hlY2tDYWxsZWUpCiB7Ci0gICAgQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6OnNw
ZWNpYWxpemF0aW9uS2luZEZvcihraW5kKTsKLSAgICAKLSAgICBpZiAoIWlubGluaW5nQmFsYW5j
ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAogICAgIFZFUkJPU0VfTE9HKCIgICAgQ29u
c2lkZXJpbmcgY2FsbGVlICIsIGNhbGxlZSwgIlxuIik7Ci0gICAgCi0gICAgLy8gSW50cmluc2lj
cyBhbmQgaW50ZXJuYWwgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGlubGluZWQgaWYgd2UncmUgbm90
IGRvaW5nIHZhcmFyZ3MuIFRoaXMgaXMgYmVjYXVzZQotICAgIC8vIHdlIGN1cnJlbnRseSBkb24n
dCBoYXZlIGFueSB3YXkgb2YgZ2V0dGluZyBwcm9maWxpbmcgaW5mb3JtYXRpb24gZm9yIGFyZ3Vt
ZW50cyB0byBub24tSlMgdmFyYXJncwotICAgIC8vIGNhbGxzLiBUaGUgcHJlZGljdGlvbiBwcm9w
YWdhdG9yIHdvbid0IGJlIG9mIGFueSBoZWxwIGJlY2F1c2UgTG9hZFZhcmFyZ3Mgb2JzY3VyZXMg
dGhlIGRhdGEgZmxvdywKLSAgICAvLyBhbmQgdGhlcmUgYXJlIG5vIGNhbGxzaXRlIHZhbHVlIHBy
b2ZpbGVzIGFuZCBuYXRpdmUgZnVuY3Rpb24gd29uJ3QgaGF2ZSBjYWxsZWUgdmFsdWUgcHJvZmls
ZXMgZm9yCi0gICAgLy8gdGhvc2UgYXJndW1lbnRzLiBFdmVuIHdvcnNlLCBpZiB0aGUgaW50cmlu
c2ljIGRlY2lkZXMgdG8gZXhpdCwgaXQgd29uJ3QgcmVhbGx5IGhhdmUgYW55d2hlcmUgdG8KLSAg
ICAvLyBleGl0IHRvOiBMb2FkVmFyYXJncyBpcyBlZmZlY3RmdWwgYW5kIGl0J3MgcGFydCBvZiB0
aGUgb3BfY2FsbF92YXJhcmdzLCBzbyB3ZSBjYW4ndCBleGl0IHdpdGhvdXQKLSAgICAvLyBjYWxs
aW5nIExvYWRWYXJhcmdzIHR3aWNlLgotICAgIGlmICghSW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFy
Z3Moa2luZCkpIHsKIAotICAgICAgICBib29sIGRpZEluc2VydENoZWNrcyA9IGZhbHNlOwotICAg
ICAgICBhdXRvIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nID0gWyZdICgpIHsKLSAgICAgICAg
ICAgIGluc2VydENoZWNrcyhudWxscHRyKTsKLSAgICAgICAgICAgIGRpZEluc2VydENoZWNrcyA9
IHRydWU7Ci0gICAgICAgIH07CisgICAgYm9vbCBkaWRJbnNlcnRDaGVja3MgPSBmYWxzZTsKKyAg
ICBhdXRvIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nID0gWyZdICgpIHsKKyAgICAgICAgaWYg
KG5lZWRzVG9DaGVja0NhbGxlZSkKKyAgICAgICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxs
ZWUsIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQpOworICAgICAgICBkaWRJbnNlcnRDaGVj
a3MgPSB0cnVlOworICAgIH07CiAKLSAgICAgICAgYXV0byBlbmRTcGVjaWFsQ2FzZSA9IFsmXSAo
KSB7Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChkaWRJbnNlcnRDaGVja3MpOwotICAgICAg
ICAgICAgYWRkVG9HcmFwaChQaGFudG9tLCBjYWxsVGFyZ2V0Tm9kZSk7Ci0gICAgICAgICAgICBl
bWl0QXJndW1lbnRQaGFudG9tcyhyZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMpOwotICAgICAgICAgICAgaW5saW5pbmdCYWxhbmNlLS07Ci0gICAgICAgICAgICBpZiAo
Y29udGludWF0aW9uQmxvY2spIHsKLSAgICAgICAgICAgICAgICBtX2N1cnJlbnRJbmRleCA9IG5l
eHRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbV9leGl0T0sgPSB0cnVlOwotICAgICAgICAgICAg
ICAgIHByb2Nlc3NTZXRMb2NhbFF1ZXVlKCk7Ci0gICAgICAgICAgICAgICAgYWRkSnVtcFRvKGNv
bnRpbnVhdGlvbkJsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAKLSAgICAg
ICAgaWYgKEludGVybmFsRnVuY3Rpb24qIGZ1bmN0aW9uID0gY2FsbGVlLmludGVybmFsRnVuY3Rp
b24oKSkgewotICAgICAgICAgICAgaWYgKGhhbmRsZUNvbnN0YW50SW50ZXJuYWxGdW5jdGlvbihj
YWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgZnVuY3Rpb24sIHJlZ2lzdGVyT2Zmc2V0LCBh
cmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgc3BlY2lhbGl6YXRpb25LaW5kLCBwcmVkaWN0aW9u
LCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykpIHsKLSAgICAgICAgICAgICAgICBlbmRTcGVj
aWFsQ2FzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7Ci0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKElubGluZUNhbGxGcmFtZTo6aXNUYWlsKGtpbmQpICYm
IEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChjYWxsZWUsIHJlZ2lzdGVy
T2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgaW5zZXJ0Q2hlY2tzV2l0aEFjY291
bnRpbmcpKSB7CisgICAgICAgIFJFTEVBU0VfQVNTRVJUKGRpZEluc2VydENoZWNrcyk7CisgICAg
ICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpPcHRpbWl6ZWRUb0p1bXA7CisgICAg
fQorICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVja3MpOworCisgICAgaWYgKCFpbmxp
bmluZ0JhbGFuY2UpCisgICAgICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpEaWRO
b3RoaW5nOworCisgICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQg
PSBJbmxpbmVDYWxsRnJhbWU6OnNwZWNpYWxpemF0aW9uS2luZEZvcihraW5kKTsKKworICAgIGF1
dG8gZW5kU3BlY2lhbENhc2UgPSBbJl0gKCkgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChkaWRJ
bnNlcnRDaGVja3MpOworICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20sIGNhbGxUYXJnZXROb2Rl
KTsKKyAgICAgICAgZW1pdEFyZ3VtZW50UGhhbnRvbXMocmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50
Q291bnRJbmNsdWRpbmdUaGlzKTsKKyAgICAgICAgaW5saW5pbmdCYWxhbmNlLS07CisgICAgICAg
IGlmIChjb250aW51YXRpb25CbG9jaykgeworICAgICAgICAgICAgbV9jdXJyZW50SW5kZXggPSBu
ZXh0T2Zmc2V0OworICAgICAgICAgICAgbV9leGl0T0sgPSB0cnVlOworICAgICAgICAgICAgcHJv
Y2Vzc1NldExvY2FsUXVldWUoKTsKKyAgICAgICAgICAgIGFkZEp1bXBUbyhjb250aW51YXRpb25C
bG9jayk7CiAgICAgICAgIH0KLSAgICAKLSAgICAgICAgSW50cmluc2ljIGludHJpbnNpYyA9IGNh
bGxlZS5pbnRyaW5zaWNGb3Ioc3BlY2lhbGl6YXRpb25LaW5kKTsKLSAgICAgICAgaWYgKGludHJp
bnNpYyAhPSBOb0ludHJpbnNpYykgewotICAgICAgICAgICAgaWYgKGhhbmRsZUludHJpbnNpY0Nh
bGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGludHJpbnNpYywgcmVnaXN0ZXJPZmZz
ZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBwcmVkaWN0aW9uLCBpbnNlcnRDaGVja3NX
aXRoQWNjb3VudGluZykpIHsKLSAgICAgICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAgIH07CiAKLSAgICAg
ICAgICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVja3MpOwotICAgICAgICAgICAgLy8g
V2UgbWlnaHQgc3RpbGwgdHJ5IHRvIGlubGluZSB0aGUgSW50cmluc2ljIGJlY2F1c2UgaXQgbWln
aHQgYmUgYSBidWlsdGluIEpTIGZ1bmN0aW9uLgorICAgIGlmIChJbnRlcm5hbEZ1bmN0aW9uKiBm
dW5jdGlvbiA9IGNhbGxlZS5pbnRlcm5hbEZ1bmN0aW9uKCkpIHsKKyAgICAgICAgaWYgKGhhbmRs
ZUNvbnN0YW50SW50ZXJuYWxGdW5jdGlvbihjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwg
ZnVuY3Rpb24sIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgc3Bl
Y2lhbGl6YXRpb25LaW5kLCBwcmVkaWN0aW9uLCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykp
IHsKKyAgICAgICAgICAgIGVuZFNwZWNpYWxDYXNlKCk7CisgICAgICAgICAgICByZXR1cm4gQ2Fs
bE9wdGltaXphdGlvblJlc3VsdDo6SW5saW5lZDsKICAgICAgICAgfQorICAgICAgICBSRUxFQVNF
X0FTU0VSVCghZGlkSW5zZXJ0Q2hlY2tzKTsKKyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRp
b25SZXN1bHQ6OkRpZE5vdGhpbmc7CisgICAgfQogCi0gICAgICAgIGlmIChPcHRpb25zOjp1c2VE
T01KSVQoKSkgewotICAgICAgICAgICAgaWYgKGNvbnN0IERPTUpJVDo6U2lnbmF0dXJlKiBzaWdu
YXR1cmUgPSBjYWxsZWUuc2lnbmF0dXJlRm9yKHNwZWNpYWxpemF0aW9uS2luZCkpIHsKLSAgICAg
ICAgICAgICAgICBpZiAoaGFuZGxlRE9NSklUQ2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3Bl
cmFuZCwgc2lnbmF0dXJlLCByZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1Ro
aXMsIHByZWRpY3Rpb24sIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nKSkgewotICAgICAgICAg
ICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQo
IWRpZEluc2VydENoZWNrcyk7CisgICAgSW50cmluc2ljIGludHJpbnNpYyA9IGNhbGxlZS5pbnRy
aW5zaWNGb3Ioc3BlY2lhbGl6YXRpb25LaW5kKTsKKyAgICBpZiAoaW50cmluc2ljICE9IE5vSW50
cmluc2ljKSB7CisgICAgICAgIGlmIChoYW5kbGVJbnRyaW5zaWNDYWxsKGNhbGxUYXJnZXROb2Rl
LCByZXN1bHRPcGVyYW5kLCBpbnRyaW5zaWMsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50
SW5jbHVkaW5nVGhpcywgcHJlZGljdGlvbiwgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRpbmcpKSB7
CisgICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJuIENhbGxP
cHRpbWl6YXRpb25SZXN1bHQ6OklubGluZWQ7CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9B
U1NFUlQoIWRpZEluc2VydENoZWNrcyk7CisgICAgICAgIC8vIFdlIG1pZ2h0IHN0aWxsIHRyeSB0
byBpbmxpbmUgdGhlIEludHJpbnNpYyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGEgYnVpbHRpbiBKUyBm
dW5jdGlvbi4KKyAgICB9CisKKyAgICBpZiAoT3B0aW9uczo6dXNlRE9NSklUKCkpIHsKKyAgICAg
ICAgaWYgKGNvbnN0IERPTUpJVDo6U2lnbmF0dXJlKiBzaWduYXR1cmUgPSBjYWxsZWUuc2lnbmF0
dXJlRm9yKHNwZWNpYWxpemF0aW9uS2luZCkpIHsKKyAgICAgICAgICAgIGlmIChoYW5kbGVET01K
SVRDYWxsKGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBzaWduYXR1cmUsIHJlZ2lzdGVy
T2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgcHJlZGljdGlvbiwgaW5zZXJ0Q2hl
Y2tzV2l0aEFjY291bnRpbmcpKSB7CisgICAgICAgICAgICAgICAgZW5kU3BlY2lhbENhc2UoKTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6SW5saW5lZDsK
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVj
a3MpOwogICAgICAgICB9CiAgICAgfQogICAgIAogICAgIHVuc2lnbmVkIG15SW5saW5pbmdDb3N0
ID0gaW5saW5pbmdDb3N0KGNhbGxlZSwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIGtpbmQp
OwogICAgIGlmIChteUlubGluaW5nQ29zdCA+IGlubGluaW5nQmFsYW5jZSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6RGlkTm90
aGluZzsKIAotICAgIEluc3RydWN0aW9uKiBzYXZlZEN1cnJlbnRJbnN0cnVjdGlvbiA9IG1fY3Vy
cmVudEluc3RydWN0aW9uOwotICAgIGlubGluZUNhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9w
ZXJhbmQsIGNhbGxlZSwgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlz
LCBuZXh0T2Zmc2V0LCBraW5kLCBjb250aW51YXRpb25CbG9jaywgaW5zZXJ0Q2hlY2tzKTsKKyAg
ICBhdXRvIGluc2VydENoZWNrID0gWyZdIChDb2RlQmxvY2sqIGMpIHsKKyAgICAgICAgKHZvaWQp
IGM7CisgICAgICAgIGlmIChuZWVkc1RvQ2hlY2tDYWxsZWUpCisgICAgICAgICAgICBlbWl0RnVu
Y3Rpb25DaGVja3MoY2FsbGVlLCBjYWxsVGFyZ2V0Tm9kZSwgdGhpc0FyZ3VtZW50KTsKKyAgICB9
OworICAgIGlubGluZUNhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGNhbGxlZSwg
cmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBraW5kLCBjb250aW51
YXRpb25CbG9jaywgaW5zZXJ0Q2hlY2spOwogICAgIGlubGluaW5nQmFsYW5jZSAtPSBteUlubGlu
aW5nQ29zdDsKLSAgICBtX2N1cnJlbnRJbnN0cnVjdGlvbiA9IHNhdmVkQ3VycmVudEluc3RydWN0
aW9uOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9uUmVzdWx0
OjpJbmxpbmVkOwogfQogCi1ib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZygKLSAg
ICBOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIGNvbnN0IENhbGxMaW5r
U3RhdHVzJiBjYWxsTGlua1N0YXR1cywKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXRPckZpcnN0RnJl
ZVJlZywgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwKLSAgICBWaXJ0dWFsUmVnaXN0ZXIg
YXJndW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwgaW50IGFyZ3VtZW50
Q291bnRJbmNsdWRpbmdUaGlzLAotICAgIHVuc2lnbmVkIG5leHRPZmZzZXQsIE5vZGVUeXBlIGNh
bGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kIGtpbmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRpY3Rp
b24pCitib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVWYXJhcmdzSW5saW5pbmcoTm9kZSogY2Fs
bFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLAorICAgIGNvbnN0IENhbGxMaW5rU3RhdHVz
JiBjYWxsTGlua1N0YXR1cywgaW50IGZpcnN0RnJlZVJlZywgVmlydHVhbFJlZ2lzdGVyIHRoaXNB
cmd1bWVudCwKKyAgICBWaXJ0dWFsUmVnaXN0ZXIgYXJndW1lbnRzQXJndW1lbnQsIHVuc2lnbmVk
IGFyZ3VtZW50c09mZnNldCwKKyAgICBOb2RlVHlwZSBjYWxsT3AsIElubGluZUNhbGxGcmFtZTo6
S2luZCBraW5kKQogewotICAgIFZFUkJPU0VfTE9HKCJIYW5kbGluZyBpbmxpbmluZy4uLlxuU3Rh
Y2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwotICAgIENvZGVTcGVjaWFsaXphdGlv
bktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVjaWFsaXphdGlv
bktpbmRGb3Ioa2luZCk7Ci0gICAgCi0gICAgaWYgKCFjYWxsTGlua1N0YXR1cy5zaXplKCkpIHsK
LSAgICAgICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmcuXG4iKTsKKyAgICBWRVJCT1NF
X0xPRygiSGFuZGxpbmcgaW5saW5pbmcgKFZhcmFyZ3MpLi4uXG5TdGFjazogIiwgY3VycmVudENv
ZGVPcmlnaW4oKSwgIlxuIik7CisgICAgaWYgKGNhbGxMaW5rU3RhdHVzLm1heE51bUFyZ3VtZW50
cygpID4gT3B0aW9uczo6bWF4aW11bVZhcmFyZ3NGb3JJbmxpbmluZygpKSB7CisgICAgICAgIFZF
UkJPU0VfTE9HKCJCYWlsaW5nIGlubGluaW5nOiB0b28gbWFueSBhcmd1bWVudHMgZm9yIHZhcmFy
Z3MgaW5saW5pbmcuXG4iKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBpZiAo
Y2FsbExpbmtTdGF0dXMuY291bGRUYWtlU2xvd1BhdGgoKSB8fCBjYWxsTGlua1N0YXR1cy5zaXpl
KCkgIT0gMSkgeworICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmluZzogcG9seW1v
cnBoaWMgaW5saW5pbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHZhcmFyZ3MuXG4iKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENhbGxWYXJpYW50IGNhbGxWYXJpYW50
ID0gY2FsbExpbmtTdGF0dXNbMF07CisKKyAgICB1bnNpZ25lZCBtYW5kYXRvcnlNaW5pbXVtOwor
ICAgIGlmIChGdW5jdGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uRXhlY3V0YWJsZSA9IGNhbGxWYXJp
YW50LmZ1bmN0aW9uRXhlY3V0YWJsZSgpKQorICAgICAgICBtYW5kYXRvcnlNaW5pbXVtID0gZnVu
Y3Rpb25FeGVjdXRhYmxlLT5wYXJhbWV0ZXJDb3VudCgpOworICAgIGVsc2UKKyAgICAgICAgbWFu
ZGF0b3J5TWluaW11bSA9IDA7CiAgICAgCi0gICAgaWYgKElubGluZUNhbGxGcmFtZTo6aXNWYXJh
cmdzKGtpbmQpCi0gICAgICAgICYmIGNhbGxMaW5rU3RhdHVzLm1heE51bUFyZ3VtZW50cygpID4g
T3B0aW9uczo6bWF4aW11bVZhcmFyZ3NGb3JJbmxpbmluZygpKSB7Ci0gICAgICAgIFZFUkJPU0Vf
TE9HKCJCYWlsaW5nIGlubGluaW5nIGJlY2F1c2Ugb2YgdmFyYXJncy5cbiIpOworICAgIC8vIGlu
Y2x1ZGVzICJ0aGlzIgorICAgIHVuc2lnbmVkIG1heE51bUFyZ3VtZW50cyA9IHN0ZDo6bWF4KGNh
bGxMaW5rU3RhdHVzLm1heE51bUFyZ3VtZW50cygpLCBtYW5kYXRvcnlNaW5pbXVtICsgMSk7CisK
KyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIHNwZWNpYWxpemF0aW9uS2luZCA9IElubGluZUNh
bGxGcmFtZTo6c3BlY2lhbGl6YXRpb25LaW5kRm9yKGtpbmQpOworICAgIGlmIChpbmxpbmluZ0Nv
c3QoY2FsbFZhcmlhbnQsIG1heE51bUFyZ3VtZW50cywga2luZCkgPiBnZXRJbmxpbmluZ0JhbGFu
Y2UoY2FsbExpbmtTdGF0dXMsIHNwZWNpYWxpemF0aW9uS2luZCkpIHsKKyAgICAgICAgVkVSQk9T
RV9MT0coIkJhaWxpbmcgaW5saW5pbmc6IGlubGluaW5nIGNvc3QgdG9vIGhpZ2guXG4iKTsKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICAKKyAgICBpbnQgcmVnaXN0ZXJPZmZzZXQg
PSBmaXJzdEZyZWVSZWcgKyAxOworICAgIHJlZ2lzdGVyT2Zmc2V0IC09IG1heE51bUFyZ3VtZW50
czsgLy8gaW5jbHVkZXMgInRoaXMiCisgICAgcmVnaXN0ZXJPZmZzZXQgLT0gQ2FsbEZyYW1lOjpo
ZWFkZXJTaXplSW5SZWdpc3RlcnM7CisgICAgcmVnaXN0ZXJPZmZzZXQgPSAtV1RGOjpyb3VuZFVw
VG9NdWx0aXBsZU9mKHN0YWNrQWxpZ25tZW50UmVnaXN0ZXJzKCksIC1yZWdpc3Rlck9mZnNldCk7
CisgICAgCisgICAgYXV0byBpbnNlcnRDaGVja3MgPSBbJl0gKENvZGVCbG9jayogY29kZUJsb2Nr
KSB7CisgICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsVmFyaWFudCwgY2FsbFRhcmdldE5v
ZGUsIHRoaXNBcmd1bWVudCk7CisgICAgICAgIAorICAgICAgICBpbnQgcmVtYXBwZWRSZWdpc3Rl
ck9mZnNldCA9CisgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFuZChWaXJ0dWFs
UmVnaXN0ZXIocmVnaXN0ZXJPZmZzZXQpKS5vZmZzZXQoKTsKKyAgICAgICAgCisgICAgICAgIGVu
c3VyZUxvY2FscyhWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRSZWdpc3Rlck9mZnNldCkudG9Mb2Nh
bCgpKTsKKyAgICAgICAgCisgICAgICAgIGludCBhcmd1bWVudFN0YXJ0ID0gcmVnaXN0ZXJPZmZz
ZXQgKyBDYWxsRnJhbWU6OmhlYWRlclNpemVJblJlZ2lzdGVyczsKKyAgICAgICAgaW50IHJlbWFw
cGVkQXJndW1lbnRTdGFydCA9CisgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFu
ZChWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRTdGFydCkpLm9mZnNldCgpOworICAgICAgICAKKyAg
ICAgICAgTG9hZFZhcmFyZ3NEYXRhKiBkYXRhID0gbV9ncmFwaC5tX2xvYWRWYXJhcmdzRGF0YS5h
ZGQoKTsKKyAgICAgICAgZGF0YS0+c3RhcnQgPSBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1
bWVudFN0YXJ0ICsgMSk7CisgICAgICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJlZ2lzdGVyKHJl
bWFwcGVkUmVnaXN0ZXJPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50KTsKKyAg
ICAgICAgZGF0YS0+b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OworICAgICAgICBkYXRhLT5saW1p
dCA9IG1heE51bUFyZ3VtZW50czsKKyAgICAgICAgZGF0YS0+bWFuZGF0b3J5TWluaW11bSA9IG1h
bmRhdG9yeU1pbmltdW07CisgICAgICAgIAorICAgICAgICBpZiAoY2FsbE9wID09IFRhaWxDYWxs
Rm9yd2FyZFZhcmFyZ3MpCisgICAgICAgICAgICBhZGRUb0dyYXBoKEZvcndhcmRWYXJhcmdzLCBP
cEluZm8oZGF0YSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhZGRUb0dyYXBoKExvYWRW
YXJhcmdzLCBPcEluZm8oZGF0YSksIGdldChhcmd1bWVudHNBcmd1bWVudCkpOworICAgICAgICAK
KyAgICAgICAgLy8gTG9hZFZhcmFyZ3MgbWF5IE9TUiBleGl0LiBIZW5jZSwgd2UgbmVlZCB0byBr
ZWVwIGFsaXZlIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQKKyAgICAgICAgLy8gYW5kIGFy
Z3VtZW50c0FyZ3VtZW50IGZvciB0aGUgYmFzZWxpbmUgSklULiBIb3dldmVyLCB3ZSBvbmx5IG5l
ZWQgYSBQaGFudG9tIGZvcgorICAgICAgICAvLyBjYWxsVGFyZ2V0Tm9kZSBiZWNhdXNlIHRoZSBv
dGhlciAyIGFyZSBzdGlsbCBpbiB1c2UgYW5kIGFsaXZlIGF0IHRoaXMgcG9pbnQuCisgICAgICAg
IGFkZFRvR3JhcGgoUGhhbnRvbSwgY2FsbFRhcmdldE5vZGUpOworICAgICAgICAKKyAgICAgICAg
Ly8gSW4gREZHIElSIGJlZm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJvbCBmbG93IGJl
dHdlZW4gYWZ0ZXIgdGhlCisgICAgICAgIC8vIExvYWRWYXJhcmdzIGFuZCB0aGUgbGFzdCBTZXRB
cmd1bWVudC4gVGhpcyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQgdG8gREZHCisgICAgICAg
IC8vIFNTQS4gRm9ydHVuYXRlbHksIHdlIGFsc28gaGF2ZSBvdGhlciByZWFzb25zIGZvciBub3Qg
aW5zZXJ0aW5nIGNvbnRyb2wgZmxvdworICAgICAgICAvLyBiZWZvcmUgU1NBLgogICAgICAgICAK
KyAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiBjb3VudFZhcmlhYmxlID0gbmV3VmFyaWFibGVB
Y2Nlc3NEYXRhKFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZy
YW1lU2xvdDo6YXJndW1lbnRDb3VudCkpOworICAgICAgICAvLyBUaGlzIGlzIHByZXR0eSBsYW1l
LCBidXQgaXQgd2lsbCBmb3JjZSB0aGUgY291bnQgdG8gYmUgZmx1c2hlZCBhcyBhbiBpbnQuIFRo
aXMgZG9lc24ndAorICAgICAgICAvLyBtYXR0ZXIgdmVyeSBtdWNoLCBzaW5jZSBvdXIgdXNlIG9m
IGEgU2V0QXJndW1lbnQgYW5kIEZsdXNoZXMgZm9yIHRoaXMgbG9jYWwgc2xvdCBpcworICAgICAg
ICAvLyBtb3N0bHkganVzdCBhIGZvcm1hbGl0eS4KKyAgICAgICAgY291bnRWYXJpYWJsZS0+cHJl
ZGljdChTcGVjSW50MzJPbmx5KTsKKyAgICAgICAgY291bnRWYXJpYWJsZS0+bWVyZ2VJc1Byb2Zp
dGFibGVUb1VuYm94KHRydWUpOworICAgICAgICBOb2RlKiBzZXRBcmd1bWVudENvdW50ID0gYWRk
VG9HcmFwaChTZXRBcmd1bWVudCwgT3BJbmZvKGNvdW50VmFyaWFibGUpKTsKKyAgICAgICAgbV9j
dXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFyaWFibGUtPmxv
Y2FsKCksIHNldEFyZ3VtZW50Q291bnQpOworICAgICAgICAKKyAgICAgICAgc2V0KFZpcnR1YWxS
ZWdpc3Rlcihhcmd1bWVudFN0YXJ0KSwgZ2V0KHRoaXNBcmd1bWVudCksIEltbWVkaWF0ZU5ha2Vk
U2V0KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBhcmd1bWVudCA9IDE7IGFyZ3VtZW50IDwgbWF4
TnVtQXJndW1lbnRzOyArK2FyZ3VtZW50KSB7CisgICAgICAgICAgICBWYXJpYWJsZUFjY2Vzc0Rh
dGEqIHZhcmlhYmxlID0gbmV3VmFyaWFibGVBY2Nlc3NEYXRhKFZpcnR1YWxSZWdpc3RlcihyZW1h
cHBlZEFyZ3VtZW50U3RhcnQgKyBhcmd1bWVudCkpOworICAgICAgICAgICAgdmFyaWFibGUtPm1l
cmdlU2hvdWxkTmV2ZXJVbmJveCh0cnVlKTsgLy8gV2UgY3VycmVudGx5IGhhdmUgbm93aGVyZSB0
byBwdXQgdGhlIHR5cGUgY2hlY2sgb24gdGhlIExvYWRWYXJhcmdzLiBMb2FkVmFyYXJncyBpcyBl
ZmZlY3RmdWwsIHNvIGFmdGVyIGl0IGZpbmlzaGVzLCB3ZSBjYW5ub3QgZXhpdC4KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgLy8gRm9yIGEgd2hpbGUgaXQgaGFkIGJlZW4gbXkgaW50ZW50aW9u
IHRvIGRvIHRoaW5ncyBsaWtlIHRoaXMgaW5zaWRlIHRoZQorICAgICAgICAgICAgLy8gcHJlZGlj
dGlvbiBpbmplY3Rpb24gcGhhc2UuIEJ1dCBpbiB0aGlzIGNhc2UgaXQncyByZWFsbHkgYmVzdCB0
byBkbyBpdCBoZXJlLAorICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCdzIGhlcmUgdGhhdCB3ZSBo
YXZlIGFjY2VzcyB0byB0aGUgdmFyaWFibGUgYWNjZXNzIGRhdGFzIGZvciB0aGUKKyAgICAgICAg
ICAgIC8vIGlubGluaW5nIHdlJ3JlIGFib3V0IHRvIGRvLgorICAgICAgICAgICAgLy8KKyAgICAg
ICAgICAgIC8vIFNvbWV0aGluZyBlbHNlIHRoYXQncyBpbnRlcmVzdGluZyBoZXJlIGlzIHRoYXQg
d2UnZCByZWFsbHkgbG92ZSB0byBnZXQKKyAgICAgICAgICAgIC8vIHByZWRpY3Rpb25zIGZyb20g
dGhlIGFyZ3VtZW50cyBsb2FkZWQgYXQgdGhlIGNhbGxzaXRlLCByYXRoZXIgdGhhbiB0aGUKKyAg
ICAgICAgICAgIC8vIGFyZ3VtZW50cyByZWNlaXZlZCBpbnNpZGUgdGhlIGNhbGxlZS4gQnV0IHRo
YXQgcHJvYmFibHkgd29uJ3QgbWF0dGVyIGZvciBtb3N0CisgICAgICAgICAgICAvLyBjYWxscy4K
KyAgICAgICAgICAgIGlmIChjb2RlQmxvY2sgJiYgYXJndW1lbnQgPCBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4oY29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkpKSB7CisgICAgICAgICAgICAgICAgQ29u
Y3VycmVudEpTTG9ja2VyIGxvY2tlcihjb2RlQmxvY2stPm1fbG9jayk7CisgICAgICAgICAgICAg
ICAgVmFsdWVQcm9maWxlJiBwcm9maWxlID0gY29kZUJsb2NrLT52YWx1ZVByb2ZpbGVGb3JBcmd1
bWVudChhcmd1bWVudCk7CisgICAgICAgICAgICAgICAgdmFyaWFibGUtPnByZWRpY3QocHJvZmls
ZS5jb21wdXRlVXBkYXRlZFByZWRpY3Rpb24obG9ja2VyKSk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIE5vZGUqIHNldEFyZ3VtZW50ID0gYWRkVG9HcmFwaChTZXRB
cmd1bWVudCwgT3BJbmZvKHZhcmlhYmxlKSk7CisgICAgICAgICAgICBtX2N1cnJlbnRCbG9jay0+
dmFyaWFibGVzQXRUYWlsLnNldE9wZXJhbmQodmFyaWFibGUtPmxvY2FsKCksIHNldEFyZ3VtZW50
KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBJbnRyaW5zaWNzIGFuZCBpbnRlcm5hbCBm
dW5jdGlvbnMgY2FuIG9ubHkgYmUgaW5saW5lZCBpZiB3ZSdyZSBub3QgZG9pbmcgdmFyYXJncy4g
VGhpcyBpcyBiZWNhdXNlCisgICAgLy8gd2UgY3VycmVudGx5IGRvbid0IGhhdmUgYW55IHdheSBv
ZiBnZXR0aW5nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmb3IgYXJndW1lbnRzIHRvIG5vbi1KUyB2
YXJhcmdzCisgICAgLy8gY2FsbHMuIFRoZSBwcmVkaWN0aW9uIHByb3BhZ2F0b3Igd29uJ3QgYmUg
b2YgYW55IGhlbHAgYmVjYXVzZSBMb2FkVmFyYXJncyBvYnNjdXJlcyB0aGUgZGF0YSBmbG93LAor
ICAgIC8vIGFuZCB0aGVyZSBhcmUgbm8gY2FsbHNpdGUgdmFsdWUgcHJvZmlsZXMgYW5kIG5hdGl2
ZSBmdW5jdGlvbiB3b24ndCBoYXZlIGNhbGxlZSB2YWx1ZSBwcm9maWxlcyBmb3IKKyAgICAvLyB0
aG9zZSBhcmd1bWVudHMuIEV2ZW4gd29yc2UsIGlmIHRoZSBpbnRyaW5zaWMgZGVjaWRlcyB0byBl
eGl0LCBpdCB3b24ndCByZWFsbHkgaGF2ZSBhbnl3aGVyZSB0bworICAgIC8vIGV4aXQgdG86IExv
YWRWYXJhcmdzIGlzIGVmZmVjdGZ1bCBhbmQgaXQncyBwYXJ0IG9mIHRoZSBvcF9jYWxsX3ZhcmFy
Z3MsIHNvIHdlIGNhbid0IGV4aXQgd2l0aG91dAorICAgIC8vIGNhbGxpbmcgTG9hZFZhcmFyZ3Mg
dHdpY2UuCisgICAgaW5saW5lQ2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2Fs
bFZhcmlhbnQsIHJlZ2lzdGVyT2Zmc2V0LCBtYXhOdW1Bcmd1bWVudHMsIGtpbmQsIG51bGxwdHIs
IGluc2VydENoZWNrcyk7CisKKyAgICBWRVJCT1NFX0xPRygiU3VjY2Vzc2Z1bCBpbmxpbmluZyAo
dmFyYXJncywgbW9ub21vcnBoaWMpLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJc
biIpOworICAgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBCeXRlQ29kZVBhcnNlcjo6Z2V0
SW5saW5pbmdCYWxhbmNlKGNvbnN0IENhbGxMaW5rU3RhdHVzJiBjYWxsTGlua1N0YXR1cywgQ29k
ZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQpCit7CiAgICAgdW5zaWduZWQg
aW5saW5pbmdCYWxhbmNlID0gT3B0aW9uczo6bWF4aW11bUZ1bmN0aW9uRm9yQ2FsbElubGluZUNh
bmRpZGF0ZUluc3RydWN0aW9uQ291bnQoKTsKICAgICBpZiAoc3BlY2lhbGl6YXRpb25LaW5kID09
IENvZGVGb3JDb25zdHJ1Y3QpCiAgICAgICAgIGlubGluaW5nQmFsYW5jZSA9IHN0ZDo6bWluKGlu
bGluaW5nQmFsYW5jZSwgT3B0aW9uczo6bWF4aW11bUZ1bmN0aW9uRm9yQ29uc3RydWN0SW5saW5l
Q2FuZGlkYXRlSW5zdHJ1Y3Rpb25Db3VudCgpKTsKICAgICBpZiAoY2FsbExpbmtTdGF0dXMuaXND
bG9zdXJlQ2FsbCgpKQogICAgICAgICBpbmxpbmluZ0JhbGFuY2UgPSBzdGQ6Om1pbihpbmxpbmlu
Z0JhbGFuY2UsIE9wdGlvbnM6Om1heGltdW1GdW5jdGlvbkZvckNsb3N1cmVDYWxsSW5saW5lQ2Fu
ZGlkYXRlSW5zdHJ1Y3Rpb25Db3VudCgpKTsKKyAgICByZXR1cm4gaW5saW5pbmdCYWxhbmNlOwor
fQorCitCeXRlQ29kZVBhcnNlcjo6Q2FsbE9wdGltaXphdGlvblJlc3VsdCBCeXRlQ29kZVBhcnNl
cjo6aGFuZGxlSW5saW5pbmcoCisgICAgTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRP
cGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtTdGF0dXMsCisgICAgaW50IHJl
Z2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LAorICAgIGludCBhcmd1
bWVudENvdW50SW5jbHVkaW5nVGhpcywKKyAgICB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBOb2RlVHlw
ZSBjYWxsT3AsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVk
aWN0aW9uKQoreworICAgIFZFUkJPU0VfTE9HKCJIYW5kbGluZyBpbmxpbmluZy4uLlxuU3RhY2s6
ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwogICAgIAorICAgIENvZGVTcGVjaWFsaXph
dGlvbktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVjaWFsaXph
dGlvbktpbmRGb3Ioa2luZCk7CisgICAgdW5zaWduZWQgaW5saW5pbmdCYWxhbmNlID0gZ2V0SW5s
aW5pbmdCYWxhbmNlKGNhbGxMaW5rU3RhdHVzLCBzcGVjaWFsaXphdGlvbktpbmQpOworCiAgICAg
Ly8gRmlyc3QgY2hlY2sgaWYgd2UgY2FuIGF2b2lkIGNyZWF0aW5nIGNvbnRyb2wgZmxvdy4gT3Vy
IGlubGluZXIgZG9lcyBzb21lIENGRwogICAgIC8vIHNpbXBsaWZpY2F0aW9uIG9uIHRoZSBmbHkg
YW5kIHRoaXMgaGVscHMgcmVkdWNlIGNvbXBpbGUgdGltZXMsIGJ1dCB3ZSBjYW4gb25seSBsZXZl
cmFnZQogICAgIC8vIHRoaXMgaW4gY2FzZXMgd2hlcmUgd2UgZG9uJ3QgbmVlZCBjb250cm9sIGZs
b3cgZGlhbW9uZHMgdG8gY2hlY2sgdGhlIGNhbGxlZS4KICAgICBpZiAoIWNhbGxMaW5rU3RhdHVz
LmNvdWxkVGFrZVNsb3dQYXRoKCkgJiYgY2FsbExpbmtTdGF0dXMuc2l6ZSgpID09IDEpIHsKLSAg
ICAgICAgaW50IHJlZ2lzdGVyT2Zmc2V0OwotICAgICAgICAKLSAgICAgICAgLy8gT25seSB1c2Vk
IGZvciB2YXJhcmdzIGNhbGxzLgotICAgICAgICB1bnNpZ25lZCBtYW5kYXRvcnlNaW5pbXVtID0g
MDsKLSAgICAgICAgdW5zaWduZWQgbWF4TnVtQXJndW1lbnRzID0gMDsKLQotICAgICAgICBpZiAo
SW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFyZ3Moa2luZCkpIHsKLSAgICAgICAgICAgIGlmIChGdW5j
dGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uRXhlY3V0YWJsZSA9IGNhbGxMaW5rU3RhdHVzWzBdLmZ1
bmN0aW9uRXhlY3V0YWJsZSgpKQotICAgICAgICAgICAgICAgIG1hbmRhdG9yeU1pbmltdW0gPSBm
dW5jdGlvbkV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7Ci0gICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgbWFuZGF0b3J5TWluaW11bSA9IDA7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIC8vIGluY2x1ZGVzICJ0aGlzIgotICAgICAgICAgICAgbWF4TnVtQXJndW1lbnRzID0g
c3RkOjptYXgoCi0gICAgICAgICAgICAgICAgY2FsbExpbmtTdGF0dXMubWF4TnVtQXJndW1lbnRz
KCksCi0gICAgICAgICAgICAgICAgbWFuZGF0b3J5TWluaW11bSArIDEpOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICAvLyBXZSBzb3J0IG9mIHByZXRlbmQgdGhhdCB0aGlzICppcyogdGhlIG51
bWJlciBvZiBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZC4KLSAgICAgICAgICAgIGFyZ3VtZW50
Q291bnRJbmNsdWRpbmdUaGlzID0gbWF4TnVtQXJndW1lbnRzOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICByZWdpc3Rlck9mZnNldCA9IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVSZWcgKyAx
OwotICAgICAgICAgICAgcmVnaXN0ZXJPZmZzZXQgLT0gbWF4TnVtQXJndW1lbnRzOyAvLyBpbmNs
dWRlcyAidGhpcyIKLSAgICAgICAgICAgIHJlZ2lzdGVyT2Zmc2V0IC09IENhbGxGcmFtZTo6aGVh
ZGVyU2l6ZUluUmVnaXN0ZXJzOwotICAgICAgICAgICAgcmVnaXN0ZXJPZmZzZXQgPSAtV1RGOjpy
b3VuZFVwVG9NdWx0aXBsZU9mKAotICAgICAgICAgICAgICAgIHN0YWNrQWxpZ25tZW50UmVnaXN0
ZXJzKCksCi0gICAgICAgICAgICAgICAgLXJlZ2lzdGVyT2Zmc2V0KTsKLSAgICAgICAgfSBlbHNl
Ci0gICAgICAgICAgICByZWdpc3Rlck9mZnNldCA9IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVS
ZWc7Ci0gICAgICAgIAotICAgICAgICBib29sIHJlc3VsdCA9IGF0dGVtcHRUb0lubGluZUNhbGwo
Ci0gICAgICAgICAgICBjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2FsbExpbmtTdGF0
dXNbMF0sIHJlZ2lzdGVyT2Zmc2V0LAotICAgICAgICAgICAgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMsIG5leHRPZmZzZXQsIGtpbmQsIHByZWRpY3Rpb24sCi0gICAgICAgICAgICBpbmxpbmlu
Z0JhbGFuY2UsIG51bGxwdHIsIFsmXSAoQ29kZUJsb2NrKiBjb2RlQmxvY2spIHsKLSAgICAgICAg
ICAgICAgICBlbWl0RnVuY3Rpb25DaGVja3MoY2FsbExpbmtTdGF0dXNbMF0sIGNhbGxUYXJnZXRO
b2RlLCB0aGlzQXJndW1lbnQpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHZh
cmFyZ3MgY2FsbCwgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBhcmd1bWVudHMgcmlnaHQgbm93Lgot
ICAgICAgICAgICAgICAgIGlmIChJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKSkgewot
ICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYXBwZWRSZWdpc3Rlck9mZnNldCA9Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBtX2lubGluZVN0YWNrVG9wLT5yZW1hcE9wZXJhbmQoVmlydHVhbFJl
Z2lzdGVyKHJlZ2lzdGVyT2Zmc2V0KSkub2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgICAgICBlbnN1cmVMb2NhbHMoVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVk
UmVnaXN0ZXJPZmZzZXQpLnRvTG9jYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAg
ICAgICAgICAgICAgICBpbnQgYXJndW1lbnRTdGFydCA9IHJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZy
YW1lOjpoZWFkZXJTaXplSW5SZWdpc3RlcnM7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZW1h
cHBlZEFyZ3VtZW50U3RhcnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmxpbmVTdGFj
a1RvcC0+cmVtYXBPcGVyYW5kKFZpcnR1YWxSZWdpc3Rlcihhcmd1bWVudFN0YXJ0KSkub2Zmc2V0
KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTG9hZFZhcmFyZ3NEYXRhKiBkYXRhID0gbV9ncmFw
aC5tX2xvYWRWYXJhcmdzRGF0YS5hZGQoKTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS0+c3Rh
cnQgPSBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0YXJ0ICsgMSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVkUmVnaXN0
ZXJPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50KTsKLSAgICAgICAgICAgICAg
ICAgICAgZGF0YS0+b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OwotICAgICAgICAgICAgICAgICAg
ICBkYXRhLT5saW1pdCA9IG1heE51bUFyZ3VtZW50czsKLSAgICAgICAgICAgICAgICAgICAgZGF0
YS0+bWFuZGF0b3J5TWluaW11bSA9IG1hbmRhdG9yeU1pbmltdW07Ci0KLSAgICAgICAgICAgICAg
ICAgICAgaWYgKGNhbGxPcCA9PSBUYWlsQ2FsbEZvcndhcmRWYXJhcmdzKQotICAgICAgICAgICAg
ICAgICAgICAgICAgYWRkVG9HcmFwaChGb3J3YXJkVmFyYXJncywgT3BJbmZvKGRhdGEpKTsKLSAg
ICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVG9HcmFw
aChMb2FkVmFyYXJncywgT3BJbmZvKGRhdGEpLCBnZXQoYXJndW1lbnRzQXJndW1lbnQpKTsKLQot
ICAgICAgICAgICAgICAgICAgICAvLyBMb2FkVmFyYXJncyBtYXkgT1NSIGV4aXQuIEhlbmNlLCB3
ZSBuZWVkIHRvIGtlZXAgYWxpdmUgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVudAotICAgICAg
ICAgICAgICAgICAgICAvLyBhbmQgYXJndW1lbnRzQXJndW1lbnQgZm9yIHRoZSBiYXNlbGluZSBK
SVQuIEhvd2V2ZXIsIHdlIG9ubHkgbmVlZCBhIFBoYW50b20gZm9yCi0gICAgICAgICAgICAgICAg
ICAgIC8vIGNhbGxUYXJnZXROb2RlIGJlY2F1c2UgdGhlIG90aGVyIDIgYXJlIHN0aWxsIGluIHVz
ZSBhbmQgYWxpdmUgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgICAgICAgICAgYWRkVG9HcmFw
aChQaGFudG9tLCBjYWxsVGFyZ2V0Tm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gSW4g
REZHIElSIGJlZm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJvbCBmbG93IGJldHdlZW4g
YWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIExvYWRWYXJhcmdzIGFuZCB0aGUgbGFz
dCBTZXRBcmd1bWVudC4gVGhpcyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQgdG8gREZHCi0g
ICAgICAgICAgICAgICAgICAgIC8vIFNTQS4gRm9ydHVuYXRlbHksIHdlIGFsc28gaGF2ZSBvdGhl
ciByZWFzb25zIGZvciBub3QgaW5zZXJ0aW5nIGNvbnRyb2wgZmxvdwotICAgICAgICAgICAgICAg
ICAgICAvLyBiZWZvcmUgU1NBLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIFZh
cmlhYmxlQWNjZXNzRGF0YSogY291bnRWYXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0YSgK
LSAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVy
T2Zmc2V0ICsgQ2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCkpOwotICAgICAgICAgICAgICAg
ICAgICAvLyBUaGlzIGlzIHByZXR0eSBsYW1lLCBidXQgaXQgd2lsbCBmb3JjZSB0aGUgY291bnQg
dG8gYmUgZmx1c2hlZCBhcyBhbiBpbnQuIFRoaXMgZG9lc24ndAotICAgICAgICAgICAgICAgICAg
ICAvLyBtYXR0ZXIgdmVyeSBtdWNoLCBzaW5jZSBvdXIgdXNlIG9mIGEgU2V0QXJndW1lbnQgYW5k
IEZsdXNoZXMgZm9yIHRoaXMgbG9jYWwgc2xvdCBpcwotICAgICAgICAgICAgICAgICAgICAvLyBt
b3N0bHkganVzdCBhIGZvcm1hbGl0eS4KLSAgICAgICAgICAgICAgICAgICAgY291bnRWYXJpYWJs
ZS0+cHJlZGljdChTcGVjSW50MzJPbmx5KTsKLSAgICAgICAgICAgICAgICAgICAgY291bnRWYXJp
YWJsZS0+bWVyZ2VJc1Byb2ZpdGFibGVUb1VuYm94KHRydWUpOwotICAgICAgICAgICAgICAgICAg
ICBOb2RlKiBzZXRBcmd1bWVudENvdW50ID0gYWRkVG9HcmFwaChTZXRBcmd1bWVudCwgT3BJbmZv
KGNvdW50VmFyaWFibGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZh
cmlhYmxlc0F0VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFyaWFibGUtPmxvY2FsKCksIHNldEFyZ3Vt
ZW50Q291bnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHNldChWaXJ0dWFsUmVnaXN0ZXIoYXJn
dW1lbnRTdGFydCksIGdldCh0aGlzQXJndW1lbnQpLCBJbW1lZGlhdGVOYWtlZFNldCk7Ci0gICAg
ICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgYXJndW1lbnQgPSAxOyBhcmd1bWVudCA8IG1h
eE51bUFyZ3VtZW50czsgKythcmd1bWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgVmFy
aWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0YSgKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0
YXJ0ICsgYXJndW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5tZXJn
ZVNob3VsZE5ldmVyVW5ib3godHJ1ZSk7IC8vIFdlIGN1cnJlbnRseSBoYXZlIG5vd2hlcmUgdG8g
cHV0IHRoZSB0eXBlIGNoZWNrIG9uIHRoZSBMb2FkVmFyYXJncy4gTG9hZFZhcmFyZ3MgaXMgZWZm
ZWN0ZnVsLCBzbyBhZnRlciBpdCBmaW5pc2hlcywgd2UgY2Fubm90IGV4aXQuCi0gICAgICAgICAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBhIHdoaWxlIGl0
IGhhZCBiZWVuIG15IGludGVudGlvbiB0byBkbyB0aGluZ3MgbGlrZSB0aGlzIGluc2lkZSB0aGUK
LSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWRpY3Rpb24gaW5qZWN0aW9uIHBoYXNlLiBC
dXQgaW4gdGhpcyBjYXNlIGl0J3MgcmVhbGx5IGJlc3QgdG8gZG8gaXQgaGVyZSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyBoZXJlIHRoYXQgd2UgaGF2ZSBhY2Nlc3Mg
dG8gdGhlIHZhcmlhYmxlIGFjY2VzcyBkYXRhcyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAg
ICAgICAvLyBpbmxpbmluZyB3ZSdyZSBhYm91dCB0byBkby4KLSAgICAgICAgICAgICAgICAgICAg
ICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgZWxzZSB0aGF0J3Mg
aW50ZXJlc3RpbmcgaGVyZSBpcyB0aGF0IHdlJ2QgcmVhbGx5IGxvdmUgdG8gZ2V0Ci0gICAgICAg
ICAgICAgICAgICAgICAgICAvLyBwcmVkaWN0aW9ucyBmcm9tIHRoZSBhcmd1bWVudHMgbG9hZGVk
IGF0IHRoZSBjYWxsc2l0ZSwgcmF0aGVyIHRoYW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAg
ICAvLyBhcmd1bWVudHMgcmVjZWl2ZWQgaW5zaWRlIHRoZSBjYWxsZWUuIEJ1dCB0aGF0IHByb2Jh
Ymx5IHdvbid0IG1hdHRlciBmb3IgbW9zdAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2Fs
bHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZUJsb2NrICYmIGFyZ3VtZW50IDwg
c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvZGVCbG9jay0+bnVtUGFyYW1ldGVycygpKSkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRKU0xvY2tlciBsb2NrZXIoY29kZUJs
b2NrLT5tX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUHJvZmlsZSYg
cHJvZmlsZSA9IGNvZGVCbG9jay0+dmFsdWVQcm9maWxlRm9yQXJndW1lbnQoYXJndW1lbnQpOwot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5wcmVkaWN0KHByb2ZpbGUuY29t
cHV0ZVVwZGF0ZWRQcmVkaWN0aW9uKGxvY2tlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBOb2Rl
KiBzZXRBcmd1bWVudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1lbnQsIE9wSW5mbyh2YXJpYWJsZSkp
OwotICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFp
bC5zZXRPcGVyYW5kKHZhcmlhYmxlLT5sb2NhbCgpLCBzZXRBcmd1bWVudCk7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAg
VkVSQk9TRV9MT0coIkRvbmUgaW5saW5pbmcgKHNpbXBsZSkuXG5TdGFjazogIiwgY3VycmVudENv
ZGVPcmlnaW4oKSwgIlxuUmVzdWx0OiAiLCByZXN1bHQsICJcbiIpOwotICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgICAgICByZXR1cm4gaGFuZGxlQ2FsbFZhcmlhbnQoCisgICAgICAgICAgICBj
YWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2FsbExpbmtTdGF0dXNbMF0sIHJlZ2lzdGVy
T2Zmc2V0LCB0aGlzQXJndW1lbnQsCisgICAgICAgICAgICBhcmd1bWVudENvdW50SW5jbHVkaW5n
VGhpcywgbmV4dE9mZnNldCwga2luZCwgcHJlZGljdGlvbiwgaW5saW5pbmdCYWxhbmNlLCBudWxs
cHRyLCB0cnVlKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBXZSBuZWVkIHRvIGNyZWF0ZSBzb21l
IGtpbmQgb2Ygc3dpdGNoIG92ZXIgY2FsbGVlLiBGb3Igbm93IHdlIG9ubHkgZG8gdGhpcyBpZiB3
ZSBiZWxpZXZlIHRoYXQKICAgICAvLyB3ZSdyZSBpbiB0aGUgdG9wIHRpZXIuIFdlIGhhdmUgdHdv
IHJlYXNvbnMgZm9yIHRoaXM6IGZpcnN0LCBpdCBwcm92aWRlcyB1cyBhbiBvcHBvcnR1bml0eSB0
bwogICAgIC8vIGRvIG1vcmUgZGV0YWlsZWQgcG9seXZhcmlhbnQvcG9seW1vcnBoaWMgcHJvZmls
aW5nOyBhbmQgc2Vjb25kLCBpdCByZWR1Y2VzIGNvbXBpbGUgdGltZXMgaW4KICAgICAvLyB0aGUg
REZHLiBBbmQgYnkgcG9seXZhcmlhbnQgcHJvZmlsaW5nIHdlIG1lYW4gcG9seXZhcmlhbnQgcHJv
ZmlsaW5nIG9mICp0aGlzKiBjYWxsLiBOb3RlIHRoYXQKICAgICAvLyB3ZSBjb3VsZCBpbXByb3Zl
IHRoYXQgYXNwZWN0IG9mIHRoaXMgYnkgZG9pbmcgcG9seW1vcnBoaWMgaW5saW5pbmcgYnV0IGhh
dmluZyB0aGUgcHJvZmlsaW5nCiAgICAgLy8gYWxzby4KLSAgICBpZiAoIWlzRlRMKG1fZ3JhcGgu
bV9wbGFuLm1vZGUpIHx8ICFPcHRpb25zOjp1c2VQb2x5bW9ycGhpY0NhbGxJbmxpbmluZygpCi0g
ICAgICAgIHx8IElubGluZUNhbGxGcmFtZTo6aXNWYXJhcmdzKGtpbmQpKSB7CisgICAgaWYgKCFp
c0ZUTChtX2dyYXBoLm1fcGxhbi5tb2RlKSB8fCAhT3B0aW9uczo6dXNlUG9seW1vcnBoaWNDYWxs
SW5saW5pbmcoKSkgewogICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmluZyAoaGFy
ZCkuXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIlxuIik7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OkRpZE5vdGhp
bmc7CiAgICAgfQogICAgIAogICAgIC8vIElmIHRoZSBjbGFpbSBpcyB0aGF0IHRoaXMgZGlkIG5v
dCBvcmlnaW5hdGUgZnJvbSBhIHN0dWIsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBlbWl0IGEgc3dp
dGNoCkBAIC0xOTY4LDcgKzE5NjgsNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxp
bmluZygKICAgICBpZiAoIU9wdGlvbnM6OnVzZVBvbHltb3JwaGljQ2FsbElubGluaW5nRm9yTm9u
U3R1YlN0YXR1cygpCiAgICAgICAgICYmICFjYWxsTGlua1N0YXR1cy5pc0Jhc2VkT25TdHViKCkp
IHsKICAgICAgICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmcgKG5vbi1zdHViIHBvbHlt
b3JwaGlzbSkuXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIlxuIik7Ci0gICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OkRp
ZE5vdGhpbmc7CiAgICAgfQogCiAgICAgYm9vbCBhbGxBcmVDbG9zdXJlQ2FsbHMgPSB0cnVlOwpA
QCAtMTk5MSwxMyArMTk5MSwxMSBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmlu
ZygKICAgICAgICAgLy8gY2xvc3VyZSBjYWxscy4KICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjAyMAogICAgICAgICBWRVJCT1NFX0xPRygiQmFp
bGluZyBpbmxpbmluZyAobWl4KS5cblN0YWNrOiAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiXG4i
KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlv
blJlc3VsdDo6RGlkTm90aGluZzsKICAgICB9CiAKICAgICBWRVJCT1NFX0xPRygiRG9pbmcgaGFy
ZCBpbmxpbmluZy4uLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwogCi0g
ICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gcmVnaXN0ZXJPZmZzZXRPckZpcnN0RnJlZVJlZzsKLQog
ICAgIC8vIFRoaXMgbWFrZXMgbWUgd2lzaCB0aGF0IHdlIHdlcmUgaW4gU1NBIGFsbCB0aGUgdGlt
ZS4gV2UgbmVlZCB0byBwaWNrIGEgdmFyaWFibGUgaW50byB3aGljaCB0bwogICAgIC8vIHN0b3Jl
IHRoZSBjYWxsZWUgc28gdGhhdCBpdCB3aWxsIGJlIGFjY2Vzc2libGUgdG8gYWxsIG9mIHRoZSBi
bG9ja3Mgd2UncmUgYWJvdXQgdG8gY3JlYXRlLiBXZQogICAgIC8vIGdldCBhd2F5IHdpdGggZG9p
bmcgYW4gaW1tZWRpYXRlLXNldCBoZXJlIGJlY2F1c2Ugd2Ugd291bGRuJ3QgaGF2ZSBwZXJmb3Jt
ZWQgYW55IHNpZGUgZWZmZWN0cwpAQCAtMjAzNSwxMiArMjAzMywxMiBAQCBib29sIEJ5dGVDb2Rl
UGFyc2VyOjpoYW5kbGVJbmxpbmluZygKICAgICAgICAgCiAgICAgICAgIE5vZGUqIG15Q2FsbFRh
cmdldE5vZGUgPSBnZXREaXJlY3QoY2FsbGVlUmVnKTsKICAgICAgICAgCi0gICAgICAgIGJvb2wg
aW5saW5pbmdSZXN1bHQgPSBhdHRlbXB0VG9JbmxpbmVDYWxsKAorICAgICAgICBhdXRvIGlubGlu
aW5nUmVzdWx0ID0gaGFuZGxlQ2FsbFZhcmlhbnQoCiAgICAgICAgICAgICBteUNhbGxUYXJnZXRO
b2RlLCByZXN1bHRPcGVyYW5kLCBjYWxsTGlua1N0YXR1c1tpXSwgcmVnaXN0ZXJPZmZzZXQsCi0g
ICAgICAgICAgICBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgbmV4dE9mZnNldCwga2luZCwg
cHJlZGljdGlvbiwKLSAgICAgICAgICAgIGlubGluaW5nQmFsYW5jZSwgY29udGludWF0aW9uQmxv
Y2ssIFsmXSAoQ29kZUJsb2NrKikgeyB9KTsKKyAgICAgICAgICAgIHRoaXNBcmd1bWVudCwgYXJn
dW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQsIGtpbmQsIHByZWRpY3Rpb24sCisg
ICAgICAgICAgICBpbmxpbmluZ0JhbGFuY2UsIGNvbnRpbnVhdGlvbkJsb2NrLCBmYWxzZSk7CiAg
ICAgICAgIAotICAgICAgICBpZiAoIWlubGluaW5nUmVzdWx0KSB7CisgICAgICAgIGlmIChpbmxp
bmluZ1Jlc3VsdCA9PSBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpEaWROb3RoaW5nKSB7CiAgICAg
ICAgICAgICAvLyBUaGF0IGZhaWxlZCBzbyB3ZSBsZXQgdGhlIGJsb2NrIGRpZS4gTm90aGluZyBp
bnRlcmVzdGluZyBzaG91bGQgaGF2ZSBiZWVuIGFkZGVkIHRvCiAgICAgICAgICAgICAvLyB0aGUg
YmxvY2suIFdlIGFsc28gZ2l2ZSB1cCBvbiBpbmxpbmluZyBhbnkgb2YgdGhlIChsZXNzIGZyZXF1
ZW50KSBjYWxsZWVzLgogICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGgubV9ibG9ja3MubGFzdCgp
ID09IG1fY3VycmVudEJsb2NrKTsKQEAgLTIwNjEsNyArMjA1OSw3IEBAIGJvb2wgQnl0ZUNvZGVQ
YXJzZXI6OmhhbmRsZUlubGluaW5nKAogICAgICAgICAgICAgdGhpbmdUb0Nhc2VPbiA9IGNhbGxM
aW5rU3RhdHVzW2ldLmV4ZWN1dGFibGUoKTsKICAgICAgICAgfQogICAgICAgICBkYXRhLmNhc2Vz
LmFwcGVuZChTd2l0Y2hDYXNlKG1fZ3JhcGguZnJlZXplKHRoaW5nVG9DYXNlT24pLCBjYWxsZWVF
bnRyeUJsb2NrKSk7Ci0gICAgICAgIFZFUkJPU0VfTE9HKCJGaW5pc2hlZCBpbmxpbmluZyAiLCBj
YWxsTGlua1N0YXR1c1tpXSwgIiBhdCAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiLlxuIik7Cisg
ICAgICAgIFZFUkJPU0VfTE9HKCJGaW5pc2hlZCBvcHRpbWl6aW5nICIsIGNhbGxMaW5rU3RhdHVz
W2ldLCAiIGF0ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICIuXG4iKTsKICAgICB9CiAKICAgICAv
LyBTbG93IHBhdGggYmxvY2sKQEAgLTIxMDIsNyArMjEwMCw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJz
ZXI6OmhhbmRsZUlubGluaW5nKAogICAgIG1fZXhpdE9LID0gdHJ1ZTsKICAgICAKICAgICBWRVJC
T1NFX0xPRygiRG9uZSBpbmxpbmluZyAoaGFyZCkuXG5TdGFjazogIiwgY3VycmVudENvZGVPcmln
aW4oKSwgIlxuIik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRp
b25SZXN1bHQ6OklubGluZWQ7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNrc0Z1bmN0b3I+
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>324413</attachid>
            <date>2017-10-20 10:20:47 -0700</date>
            <delta_ts>2017-11-28 02:38:12 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-178390-20171020192046.patch</filename>
            <type>text/plain</type>
            <size>40112</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIzNzU1CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCAw
YjIzZTZhMTIzMzYzMGJjNTkwOTg1YjY4NmNjODQ4NzVmOWNlYmFmLi4xMzcwZGFhOWVlODdmOTdk
ZDNlZDEwY2ZjY2VhNmNlZGE0YTIyNjI1IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNiBAQAorMjAxNy0xMC0yMCAgUm9iaW4gTW9yaXNzZXQgIDxybW9yaXNzZXRAYXBwbGUu
Y29tPgorCisgICAgICAgIFN1cHBvcnQgcmVjdXJzaXZlIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24g
Zm9yIHBvbHltb3JwaGljIGNhbGxzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNzgzOTAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBDb21lcyB3aXRoIGEgbGFyZ2UgYnV0IGZhaXJseSBzaW1wbGUgcmVmYWN0
b3Jpbmc6IHRoZSBpbmxpbmluZyBwYXRoIGZvciB2YXJhcmdzIGFuZCBub24tdmFyYXJncyBjYWxs
cyBub3cgY29udmVyZ2UgYSBsb3QgbGF0ZXIsCisgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgcmVk
dW5kYW50IGNoZWNrcywgYW5kIHNpbXBsaWZ5aW5nIGEgZmV3IHBhcnRzIG9mIHRoZSBpbmxpbmlu
ZyBwaXBlbGluZS4KKworICAgICAgICBBbHNvIHJlbW92ZXMgc29tZSBkZWFkIGNvZGUgZnJvbSBp
bmxpbmVDYWxsKCk6IHRoZXJlIHdhcyBhIHNwZWNpYWwgcGF0aCBmb3Igd2hlbiBtX2NvbnRpbnVh
dGlvbkJsb2NrIGlzIG51bGwsIGJ1dCBpdCBzaG91bGQgbmV2ZXIgYmUgKG5vdyBjaGVja2VkIHdp
dGggUkVMRUFTRV9BU1NFUlQpLgorCisgICAgICAgICogZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNw
cDoKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlQ2FsbCk6CisgICAg
ICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVZhcmFyZ3NDYWxsKToKKyAgICAg
ICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlUmVjdXJzaXZlVGFpbENhbGwpOgor
ICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjppbmxpbmVDYWxsKToKKyAgICAgICAg
KEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlQ2FsbFZhcmlhbnQpOgorICAgICAgICAo
SlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVWYXJhcmdzSW5saW5pbmcpOgorICAgICAg
ICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpnZXRJbmxpbmluZ0JhbGFuY2UpOgorICAgICAg
ICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyk6CisgICAgICAgIChK
U0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmF0dGVtcHRUb0lubGluZUNhbGwpOiBEZWxldGVkLgor
CiAyMDE3LTEwLTIwICBZdXN1a2UgU3V6dWtpICA8dXRhdGFuZS50ZWFAZ21haWwuY29tPgogCiAg
ICAgICAgIFVucmV2aWV3ZWQsIGZvbGxvdyB1cCB0byByZWZsZWN0IGNvbW1lbnRzCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcCBiL1Nv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCmluZGV4IDM1Yjc2
NDE5ZTE5Yjg1NzFhMjgyMGJkNjBlZTdhZTA4ZWRhZTY1YWYuLmIyZGE4MWVjMjYxMjgxZWZjZTk5
ZTZlMjE3Zjc2ZGM1Y2MzYjM3YTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9k
ZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHQnl0ZUNvZGVQYXJzZXIuY3BwCkBAIC0yMjQsMTQgKzIyNCwxNyBAQCBwcml2YXRlOgogICAg
IHZvaWQgZW1pdEZ1bmN0aW9uQ2hlY2tzKENhbGxWYXJpYW50LCBOb2RlKiBjYWxsVGFyZ2V0LCBW
aXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtbnQpOwogICAgIHZvaWQgZW1pdEFyZ3VtZW50UGhhbnRv
bXMoaW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMpOwog
ICAgIE5vZGUqIGdldEFyZ3VtZW50Q291bnQoKTsKLSAgICBib29sIGhhbmRsZVJlY3Vyc2l2ZVRh
aWxDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBjb25zdCBDYWxsTGlua1N0YXR1cyYsIGludCBy
ZWdpc3Rlck9mZnNldCwgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgaW50IGFyZ3VtZW50
Q291bnRJbmNsdWRpbmdUaGlzKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9y
PgorICAgIGJvb2wgaGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoQ2FsbFZhcmlhbnQsIGludCByZWdp
c3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBjb25zdCBDaGVja3NG
dW5jdG9yJiBlbWl0RnVuY3Rpb25DaGVja0lmTmVlZGVkKTsKICAgICB1bnNpZ25lZCBpbmxpbmlu
Z0Nvc3QoQ2FsbFZhcmlhbnQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgSW5saW5l
Q2FsbEZyYW1lOjpLaW5kKTsgLy8gUmV0dXJuIFVJTlRfTUFYIGlmIGl0J3Mgbm90IGFuIGlubGlu
aW5nIGNhbmRpZGF0ZS4gQnkgY29udmVudGlvbiwgaW50cmluc2ljcyBoYXZlIGEgY29zdCBvZiAx
LgogICAgIC8vIEhhbmRsZSBpbmxpbmluZy4gUmV0dXJuIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBm
YWxzZSBpZiB3ZSBuZWVkIHRvIHBsYW50IGEgY2FsbC4KLSAgICBib29sIGhhbmRsZUlubGluaW5n
KE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgY29uc3QgQ2FsbExpbmtT
dGF0dXMmLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQs
IFZpcnR1YWxSZWdpc3RlciBhcmd1bWVudHNBcmd1bWVudCwgdW5zaWduZWQgYXJndW1lbnRzT2Zm
c2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQs
IE5vZGVUeXBlIGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kLCBTcGVjdWxhdGVkVHlwZSBw
cmVkaWN0aW9uKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgotICAgIGJv
b2wgYXR0ZW1wdFRvSW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9w
ZXJhbmQsIENhbGxWYXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50
SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5k
LCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uLCB1bnNpZ25lZCYgaW5saW5pbmdCYWxhbmNlLCBC
YXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tzRnVuY3RvciYgaW5zZXJ0
Q2hlY2tzKTsKKyAgICBib29sIGhhbmRsZVZhcmFyZ3NJbmxpbmluZyhOb2RlKiBjYWxsVGFyZ2V0
Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiwgaW50IHJlZ2lz
dGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBWaXJ0dWFsUmVnaXN0ZXIg
YXJndW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwgTm9kZVR5cGUgY2Fs
bE9wLCBJbmxpbmVDYWxsRnJhbWU6OktpbmQpOworICAgIHVuc2lnbmVkIGdldElubGluaW5nQmFs
YW5jZShjb25zdCBDYWxsTGlua1N0YXR1cyYsIENvZGVTcGVjaWFsaXphdGlvbktpbmQpOworICAg
IGVudW0gY2xhc3MgQ2FsbE9wdGltaXphdGlvblJlc3VsdCB7IE9wdGltaXplZFRvSnVtcCwgSW5s
aW5lZCwgRGlkTm90aGluZyB9OworICAgIENhbGxPcHRpbWl6YXRpb25SZXN1bHQgaGFuZGxlQ2Fs
bFZhcmlhbnQoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBDYWxsVmFy
aWFudCwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBp
bnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIElubGlu
ZUNhbGxGcmFtZTo6S2luZCwgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlvbiwgdW5zaWduZWQmIGlu
bGluaW5nQmFsYW5jZSwgQmFzaWNCbG9jayogY29udGludWF0aW9uQmxvY2ssIGJvb2wgbmVlZHNU
b0NoZWNrQ2FsbGVlKTsKKyAgICBDYWxsT3B0aW1pemF0aW9uUmVzdWx0IGhhbmRsZUlubGluaW5n
KE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgY29uc3QgQ2FsbExpbmtT
dGF0dXMmLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQs
IGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgTm9k
ZVR5cGUgY2FsbE9wLCBJbmxpbmVDYWxsRnJhbWU6OktpbmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRp
Y3Rpb24pOwogICAgIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNrc0Z1bmN0b3I+Ci0gICAgdm9pZCBp
bmxpbmVDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZh
cmlhbnQsIGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlz
LCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBJbmxpbmVDYWxsRnJhbWU6OktpbmQsIEJhc2ljQmxvY2sq
IGNvbnRpbnVhdGlvbkJsb2NrLCBjb25zdCBDaGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpOwor
ICAgIHZvaWQgaW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJh
bmQsIENhbGxWYXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5j
bHVkaW5nVGhpcywgSW5saW5lQ2FsbEZyYW1lOjpLaW5kLCBCYXNpY0Jsb2NrKiBjb250aW51YXRp
b25CbG9jaywgY29uc3QgQ2hlY2tzRnVuY3RvciYgaW5zZXJ0Q2hlY2tzKTsKICAgICAvLyBIYW5k
bGUgaW50cmluc2ljIGZ1bmN0aW9ucy4gUmV0dXJuIHRydWUgaWYgaXQgc3VjY2VlZGVkLCBmYWxz
ZSBpZiB3ZSBuZWVkIHRvIHBsYW50IGEgY2FsbC4KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVj
a3NGdW5jdG9yPgogICAgIGJvb2wgaGFuZGxlSW50cmluc2ljQ2FsbChOb2RlKiBjYWxsZWUsIGlu
dCByZXN1bHRPcGVyYW5kLCBJbnRyaW5zaWMsIGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3Vt
ZW50Q291bnRJbmNsdWRpbmdUaGlzLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uLCBjb25zdCBD
aGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpOwpAQCAtMTIzMiw3ICsxMjM1LDcgQEAgQmFzaWNC
bG9jayogQnl0ZUNvZGVQYXJzZXI6OmFsbG9jYXRlVW50YXJnZXRhYmxlQmxvY2soKQogCiB2b2lk
IEJ5dGVDb2RlUGFyc2VyOjptYWtlQmxvY2tUYXJnZXRhYmxlKEJhc2ljQmxvY2sqIGJsb2NrLCB1
bnNpZ25lZCBieXRlY29kZUluZGV4KQogewotICAgIEFTU0VSVChibG9jay0+Ynl0ZWNvZGVCZWdp
biA9PSBVSU5UX01BWCk7CisgICAgUkVMRUFTRV9BU1NFUlQoYmxvY2stPmJ5dGVjb2RlQmVnaW4g
PT0gVUlOVF9NQVgpOwogICAgIGJsb2NrLT5ieXRlY29kZUJlZ2luID0gYnl0ZWNvZGVJbmRleDsK
ICAgICAvLyBtX2Jsb2NrTGlua2luZ1RhcmdldHMgbXVzdCBhbHdheXMgYmUgc29ydGVkIGluIGlu
Y3JlYXNpbmcgb3JkZXIgb2YgYnl0ZWNvZGVCZWdpbgogICAgIGlmIChtX2lubGluZVN0YWNrVG9w
LT5tX2Jsb2NrTGlua2luZ1RhcmdldHMuc2l6ZSgpKQpAQCAtMTI5NCwyMSArMTI5NywxNSBAQCBC
eXRlQ29kZVBhcnNlcjo6VGVybWluYWxpdHkgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwoCiAg
ICAgCiAgICAgVkVSQk9TRV9MT0coIiAgICBIYW5kbGluZyBjYWxsIGF0ICIsIGN1cnJlbnRDb2Rl
T3JpZ2luKCksICI6ICIsIGNhbGxMaW5rU3RhdHVzLCAiXG4iKTsKICAgICAKLSAgICAvLyBXZSBm
aXJzdCBjaGVjayB0aGF0IHdlIGhhdmUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoaXMg
Y2FsbCwgYW5kIHRoYXQgaXQgZGlkIG5vdCBiZWhhdmUgdG9vIHBvbHltb3JwaGljYWxseS4KKyAg
ICAvLyBJZiB3ZSBoYXZlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNhbGwsIGFu
ZCBpdCBkaWQgbm90IGJlaGF2ZSB0b28gcG9seW1vcnBoaWNhbGx5LAorICAgIC8vIHdlIG1heSBi
ZSBhYmxlIHRvIGlubGluZSBpdCwgb3IgaW4gdGhlIGNhc2Ugb2YgcmVjdXJzaXZlIHRhaWwgY2Fs
bHMgdHVybiBpdCBpbnRvIGEganVtcC4KICAgICBpZiAoY2FsbExpbmtTdGF0dXMuY2FuT3B0aW1p
emUoKSkgewogICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50ID0gdmlydHVhbFJl
Z2lzdGVyRm9yQXJndW1lbnQoMCwgcmVnaXN0ZXJPZmZzZXQpOwotCi0gICAgICAgIGlmIChvcCA9
PSBUYWlsQ2FsbCAmJiBoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChjYWxsVGFyZ2V0LCBjYWxsTGlu
a1N0YXR1cywgcmVnaXN0ZXJPZmZzZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRDb3VudEluY2x1
ZGluZ1RoaXMpKQorICAgICAgICBhdXRvIG9wdGltaXphdGlvblJlc3VsdCA9IGhhbmRsZUlubGlu
aW5nKGNhbGxUYXJnZXQsIHJlc3VsdCwgY2FsbExpbmtTdGF0dXMsIHJlZ2lzdGVyT2Zmc2V0LCB0
aGlzQXJndW1lbnQsCisgICAgICAgICAgICBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgbV9j
dXJyZW50SW5kZXggKyBpbnN0cnVjdGlvblNpemUsIG9wLCBraW5kLCBwcmVkaWN0aW9uKTsKKyAg
ICAgICAgaWYgKG9wdGltaXphdGlvblJlc3VsdCA9PSBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpP
cHRpbWl6ZWRUb0p1bXApCiAgICAgICAgICAgICByZXR1cm4gVGVybWluYWw7Ci0KLSAgICAgICAg
Ly8gSW5saW5pbmcgaXMgcXVpdGUgY29tcGxleCwgYW5kIG1hbmFnZWQgYnkgYSBwaXBlbGluZSBv
ZiBmdW5jdGlvbnM6Ci0gICAgICAgIC8vIGhhbmRsZShWYXJhcmdzKUNhbGwgLT4gaGFuZGxlSW5s
aW5pbmcgLT4gYXR0ZW1wdFRvSW5saW5lQ2FsbCAtPiBpbmxpbmVDYWxsCi0gICAgICAgIC8vIC0g
aGFuZGxlQ2FsbCBhbmQgaGFuZGxlVmFyYXJnc0NhbGwgZGVhbCB3aXRoIHRoZSBjYXNlIHdoZXJl
IG5vIGlubGluaW5nIGhhcHBlbnMsIGFuZCBkbyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlaXIg
YXJndW1lbnRzCi0gICAgICAgIC8vIC0gaGFuZGxlSW5saW5pbmcgY2hlY2tzIHdoZXRoZXIgdGhl
IGNhbGwgaXMgcG9seW1vcnBoaWMsIGFuZCBpZiBzbyBpcyByZXNwb25zaWJsZSBmb3IgaW5zZXJ0
aW5nIGEgc3dpdGNoIG9uIHRoZSBjYWxsZWUKLSAgICAgICAgLy8gLSBhdHRlbXB0VG9JbmxpbmVD
YWxsIGRlYWxzIHdpdGggc3BlY2lhbCBjYXNlcyBzdWNoIGFzIGludHJpbnNpY3MsIGl0IGFsc28g
Y2hlY2tzIHRoZSBpbmxpbmluZyBoZXVyaXN0aWMgKHRocm91Z2ggaW5saW5pbmdDb3N0KQotICAg
ICAgICAvLyAtIGlubGluZUNhbGwgZmluYWxseSBkb2VzIHRoZSBhY3R1YWwgaW5saW5pbmcsIGFm
dGVyIGEgY29tcGxpY2F0ZWQgcHJvY2VkdXJlIHRvIHNldHVwIHRoZSBzdGFjayBjb3JyZWN0bHkK
LSAgICAgICAgdW5zaWduZWQgbmV4dE9mZnNldCA9IG1fY3VycmVudEluZGV4ICsgaW5zdHJ1Y3Rp
b25TaXplOwotICAgICAgICBpZiAoaGFuZGxlSW5saW5pbmcoY2FsbFRhcmdldCwgcmVzdWx0LCBj
YWxsTGlua1N0YXR1cywgcmVnaXN0ZXJPZmZzZXQsIHRoaXNBcmd1bWVudCwgVmlydHVhbFJlZ2lz
dGVyKCksIDAsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBuZXh0T2Zmc2V0LCBvcCwga2lu
ZCwgcHJlZGljdGlvbikpIHsKKyAgICAgICAgaWYgKG9wdGltaXphdGlvblJlc3VsdCA9PSBDYWxs
T3B0aW1pemF0aW9uUmVzdWx0OjpJbmxpbmVkKSB7CiAgICAgICAgICAgICBpZiAoVU5MSUtFTFko
bV9ncmFwaC5jb21waWxhdGlvbigpKSkKICAgICAgICAgICAgICAgICBtX2dyYXBoLmNvbXBpbGF0
aW9uKCktPm5vdGljZUlubGluZWRDYWxsKCk7CiAgICAgICAgICAgICByZXR1cm4gTm9uVGVybWlu
YWw7CkBAIC0xMzQ1LDExICsxMzQyLDE1IEBAIEJ5dGVDb2RlUGFyc2VyOjpUZXJtaW5hbGl0eSBC
eXRlQ29kZVBhcnNlcjo6aGFuZGxlVmFyYXJnc0NhbGwoSW5zdHJ1Y3Rpb24qIHBjLCBOCiAgICAg
CiAgICAgVkVSQk9TRV9MT0coIiAgICBWYXJhcmdzIGNhbGwgbGluayBzdGF0dXMgYXQgIiwgY3Vy
cmVudENvZGVPcmlnaW4oKSwgIjogIiwgY2FsbExpbmtTdGF0dXMsICJcbiIpOwogICAgIAotICAg
IGlmIChjYWxsTGlua1N0YXR1cy5jYW5PcHRpbWl6ZSgpCi0gICAgICAgICYmIGhhbmRsZUlubGlu
aW5nKGNhbGxUYXJnZXQsIHJlc3VsdCwgY2FsbExpbmtTdGF0dXMsIGZpcnN0RnJlZVJlZywgVmly
dHVhbFJlZ2lzdGVyKHRoaXNSZWcpLCBWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRzKSwgZmlyc3RW
YXJBcmdPZmZzZXQsIDAsIG1fY3VycmVudEluZGV4ICsgT1BDT0RFX0xFTkdUSChvcF9jYWxsX3Zh
cmFyZ3MpLCBvcCwgSW5saW5lQ2FsbEZyYW1lOjp2YXJhcmdzS2luZEZvcihjYWxsTW9kZSksIHBy
ZWRpY3Rpb24pKSB7Ci0gICAgICAgIGlmIChVTkxJS0VMWShtX2dyYXBoLmNvbXBpbGF0aW9uKCkp
KQotICAgICAgICAgICAgbV9ncmFwaC5jb21waWxhdGlvbigpLT5ub3RpY2VJbmxpbmVkQ2FsbCgp
OwotICAgICAgICByZXR1cm4gTm9uVGVybWluYWw7CisgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNh
bk9wdGltaXplKCkpIHsKKyAgICAgICAgaWYgKGhhbmRsZVZhcmFyZ3NJbmxpbmluZyhjYWxsVGFy
Z2V0LCByZXN1bHQsCisgICAgICAgICAgICBjYWxsTGlua1N0YXR1cywgZmlyc3RGcmVlUmVnLCBW
aXJ0dWFsUmVnaXN0ZXIodGhpc1JlZyksIFZpcnR1YWxSZWdpc3Rlcihhcmd1bWVudHMpLAorICAg
ICAgICAgICAgZmlyc3RWYXJBcmdPZmZzZXQsIG9wLAorICAgICAgICAgICAgSW5saW5lQ2FsbEZy
YW1lOjp2YXJhcmdzS2luZEZvcihjYWxsTW9kZSkpKSB7CisgICAgICAgICAgICBpZiAoVU5MSUtF
TFkobV9ncmFwaC5jb21waWxhdGlvbigpKSkKKyAgICAgICAgICAgICAgICBtX2dyYXBoLmNvbXBp
bGF0aW9uKCktPm5vdGljZUlubGluZWRDYWxsKCk7CisgICAgICAgICAgICByZXR1cm4gTm9uVGVy
bWluYWw7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAgQ2FsbFZhcmFyZ3NEYXRhKiBkYXRh
ID0gbV9ncmFwaC5tX2NhbGxWYXJhcmdzRGF0YS5hZGQoKTsKQEAgLTE0MTgsMTQgKzE0MTksMTAg
QEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6ZW1pdEFyZ3VtZW50UGhhbnRvbXMoaW50IHJlZ2lzdGVy
T2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEkKICAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tLCBn
ZXQodmlydHVhbFJlZ2lzdGVyRm9yQXJndW1lbnQoaSwgcmVnaXN0ZXJPZmZzZXQpKSk7CiB9CiAK
LWJvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKE5vZGUqIGNhbGxU
YXJnZXROb2RlLCBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtTdGF0dXMsIGludCByZWdp
c3Rlck9mZnNldCwgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgaW50IGFyZ3VtZW50Q291
bnRJbmNsdWRpbmdUaGlzKQordGVtcGxhdGU8dHlwZW5hbWUgQ2hlY2tzRnVuY3Rvcj4KK2Jvb2wg
Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKENhbGxWYXJpYW50IGNhbGxW
YXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhp
cywgY29uc3QgQ2hlY2tzRnVuY3RvciYgZW1pdEZ1bmN0aW9uQ2hlY2tJZk5lZWRlZCkKIHsKLSAg
ICAvLyBGSVhNRTogV2UgY3VycmVudGx5IG9ubHkgZG8gdGhpcyBvcHRpbWlzYXRpb24gaW4gdGhl
IHNpbXBsZSwgbm9uLXBvbHltb3JwaGljIGNhc2UuCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTE3ODM5MAotICAgIGlmIChjYWxsTGlua1N0YXR1cy5jb3Vs
ZFRha2VTbG93UGF0aCgpIHx8IGNhbGxMaW5rU3RhdHVzLnNpemUoKSAhPSAxKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBhdXRvIHRhcmdldEV4ZWN1dGFibGUgPSBjYWxsTGlua1N0YXR1
c1swXS5leGVjdXRhYmxlKCk7CisgICAgYXV0byB0YXJnZXRFeGVjdXRhYmxlID0gY2FsbFZhcmlh
bnQuZXhlY3V0YWJsZSgpOwogICAgIElubGluZVN0YWNrRW50cnkqIHN0YWNrRW50cnkgPSBtX2lu
bGluZVN0YWNrVG9wOwogICAgIGRvIHsKICAgICAgICAgaWYgKHRhcmdldEV4ZWN1dGFibGUgIT0g
c3RhY2tFbnRyeS0+ZXhlY3V0YWJsZSgpKQpAQCAtMTQ0NCw4ICsxNDQxLDggQEAgYm9vbCBCeXRl
Q29kZVBhcnNlcjo6aGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoTm9kZSogY2FsbFRhcmdldE5vZGUs
IGNvbnN0IENhbGxMaW4KICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0K
IAotICAgICAgICAvLyBXZSBtdXN0IGFkZCBzb21lIGNoZWNrIHRoYXQgdGhlIHByb2ZpbGluZyBp
bmZvcm1hdGlvbiB3YXMgY29ycmVjdCBhbmQgdGhlIHRhcmdldCBvZiB0aGlzIGNhbGwgaXMgd2hh
dCB3ZSB0aG91Z2h0Ci0gICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsTGlua1N0YXR1c1sw
XSwgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVudCk7CisgICAgICAgIC8vIFdlIG1heSBuZWVk
IHRvIGFkZCBzb21lIGNoZWNrIHRoYXQgdGhlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3YXMgY29y
cmVjdCBhbmQgdGhlIHRhcmdldCBvZiB0aGlzIGNhbGwgaXMgd2hhdCB3ZSB0aG91Z2h0CisgICAg
ICAgIGVtaXRGdW5jdGlvbkNoZWNrSWZOZWVkZWQoKTsKICAgICAgICAgLy8gV2UgZmx1c2ggZXZl
cnl0aGluZywgYXMgaWYgd2Ugd2VyZSBpbiB0aGUgYmFja2VkZ2Ugb2YgYSBsb29wIChzZWUgdHJl
YXRtZW50IG9mIG9wX2ptcCBpbiBwYXJzZUJsb2NrKS4KICAgICAgICAgZmx1c2hGb3JUZXJtaW5h
bCgpOwogCkBAIC0xNTg1LDggKzE1ODIsOSBAQCB1bnNpZ25lZCBCeXRlQ29kZVBhcnNlcjo6aW5s
aW5pbmdDb3N0KENhbGxWYXJpYW50IGNhbGxlZSwgaW50IGFyZ3VtZW50Q291bnRJbmNsdQogfQog
CiB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgotdm9pZCBCeXRlQ29kZVBhcnNlcjo6
aW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxW
YXJpYW50IGNhbGxlZSwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1
ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5k
LCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tzRnVuY3RvciYgaW5z
ZXJ0Q2hlY2tzKQordm9pZCBCeXRlQ29kZVBhcnNlcjo6aW5saW5lQ2FsbChOb2RlKiBjYWxsVGFy
Z2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXJpYW50IGNhbGxlZSwgaW50IHJlZ2lz
dGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIElubGluZUNhbGxGcmFt
ZTo6S2luZCBraW5kLCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywgY29uc3QgQ2hlY2tz
RnVuY3RvciYgaW5zZXJ0Q2hlY2tzKQogeworICAgIEluc3RydWN0aW9uKiBzYXZlZEN1cnJlbnRJ
bnN0cnVjdGlvbiA9IG1fY3VycmVudEluc3RydWN0aW9uOwogICAgIENvZGVTcGVjaWFsaXphdGlv
bktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVjaWFsaXphdGlv
bktpbmRGb3Ioa2luZCk7CiAgICAgCiAgICAgQVNTRVJUKGlubGluaW5nQ29zdChjYWxsZWUsIGFy
Z3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBraW5kKSAhPSBVSU5UX01BWCk7CkBAIC0xNzE2LDI1
MCArMTcxNCwyNTEgQEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6aW5saW5lQ2FsbChOb2RlKiBjYWxs
VGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXIKIAogICAgIGxpbmtCbG9ja3Mo
aW5saW5lU3RhY2tFbnRyeS5tX3VubGlua2VkQmxvY2tzLCBpbmxpbmVTdGFja0VudHJ5Lm1fYmxv
Y2tMaW5raW5nVGFyZ2V0cyk7CiAgICAgCi0gICAgLy8gSWYgdGhlIGNhbGxlZSByZXR1cm5lZCBh
dCBsZWFzdCBvbmNlLCBpdCBwcmVwYXJlZCBhIGNvbnRpbnVhdGlvbiBibG9jayBmb3IgdXMuCi0g
ICAgaWYgKGlubGluZVN0YWNrRW50cnkubV9jb250aW51YXRpb25CbG9jaykKLSAgICAgICAgbV9j
dXJyZW50QmxvY2sgPSBpbmxpbmVTdGFja0VudHJ5Lm1fY29udGludWF0aW9uQmxvY2s7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIC8vIFdlIGFyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgY2FsbGVlIG5l
dmVyIHJldHVybnMgKGZvciBleGFtcGxlIGl0IGxvb3BzIGZvcmV2ZXIpLgotICAgICAgICAvLyBJ
biB0aGF0IGNhc2UsIGFsbCBibG9ja3Mgc2hvdWxkIGVuZCBpbiBhIHRlcm1pbmFsLgotICAgICAg
ICBBU1NFUlQobV9ncmFwaC5sYXN0QmxvY2soKS0+dGVybWluYWwoKSk7Ci0gICAgICAgIC8vIFdl
IHRoZW4gYWxsb2NhdGUgYSBuZXcgYmxvY2sgdG8gY29udGludWUgaW4uCi0gICAgICAgIG1fY3Vy
cmVudEJsb2NrID0gYWxsb2NhdGVUYXJnZXRhYmxlQmxvY2sobmV4dE9mZnNldCk7Ci0gICAgfQot
ICAgIEFTU0VSVChtX2N1cnJlbnRCbG9jayk7CisgICAgLy8gVGhlcmUgaXMgYW4gaW52YXJpYW50
IHRoYXQgd2UgdXNlIGhlcmU6IGV2ZXJ5IGZ1bmN0aW9uIGhhcyBhdCBsZWFzdCBvbmUgb3BfcmV0
IHNvbWV3aGVyZS4KKyAgICAvLyBBbmQgd2hlbiBwYXJzZUJsb2NrIGVuY291bnRlcnMgYW4gb3Bf
cmV0LCBpdCBzZXR1cHMgYSBjb250aW51YXRpb24gYmxvY2sgaWYgdGhlcmUgd2FzIG5vbmUuCisg
ICAgLy8gSWYgdGhpcyBpbnZhcmlhbnQgd2FzIHRvIGJlIGNoYW5nZWQsIHdlIHdvdWxkIG5lZWQg
dG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgaGVyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSB3YXMg
bm8gY29udGludWF0aW9uIGJsb2NrIHJlYWR5LgorICAgIFJFTEVBU0VfQVNTRVJUKGlubGluZVN0
YWNrRW50cnkubV9jb250aW51YXRpb25CbG9jayk7CisgICAgbV9jdXJyZW50QmxvY2sgPSBpbmxp
bmVTdGFja0VudHJ5Lm1fY29udGludWF0aW9uQmxvY2s7CiAgICAgQVNTRVJUKCFtX2N1cnJlbnRC
bG9jay0+dGVybWluYWwoKSk7CiAKICAgICBwcmVwYXJlVG9QYXJzZUJsb2NrKCk7CisgICAgbV9j
dXJyZW50SW5zdHJ1Y3Rpb24gPSBzYXZlZEN1cnJlbnRJbnN0cnVjdGlvbjsKIH0KIAotdGVtcGxh
dGU8dHlwZW5hbWUgQ2hlY2tzRnVuY3Rvcj4KLWJvb2wgQnl0ZUNvZGVQYXJzZXI6OmF0dGVtcHRU
b0lubGluZUNhbGwoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBDYWxs
VmFyaWFudCBjYWxsZWUsIGludCByZWdpc3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNs
dWRpbmdUaGlzLCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBJbmxpbmVDYWxsRnJhbWU6OktpbmQga2lu
ZCwgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlvbiwgdW5zaWduZWQmIGlubGluaW5nQmFsYW5jZSwg
QmFzaWNCbG9jayogY29udGludWF0aW9uQmxvY2ssIGNvbnN0IENoZWNrc0Z1bmN0b3ImIGluc2Vy
dENoZWNrcykKK0J5dGVDb2RlUGFyc2VyOjpDYWxsT3B0aW1pemF0aW9uUmVzdWx0IEJ5dGVDb2Rl
UGFyc2VyOjpoYW5kbGVDYWxsVmFyaWFudChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3Vs
dE9wZXJhbmQsIENhbGxWYXJpYW50IGNhbGxlZSwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFs
UmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVu
c2lnbmVkIG5leHRPZmZzZXQsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVk
VHlwZSBwcmVkaWN0aW9uLCB1bnNpZ25lZCYgaW5saW5pbmdCYWxhbmNlLCBCYXNpY0Jsb2NrKiBj
b250aW51YXRpb25CbG9jaywgYm9vbCBuZWVkc1RvQ2hlY2tDYWxsZWUpCiB7Ci0gICAgQ29kZVNw
ZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6OnNw
ZWNpYWxpemF0aW9uS2luZEZvcihraW5kKTsKLSAgICAKLSAgICBpZiAoIWlubGluaW5nQmFsYW5j
ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAogICAgIFZFUkJPU0VfTE9HKCIgICAgQ29u
c2lkZXJpbmcgY2FsbGVlICIsIGNhbGxlZSwgIlxuIik7Ci0gICAgCi0gICAgLy8gSW50cmluc2lj
cyBhbmQgaW50ZXJuYWwgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGlubGluZWQgaWYgd2UncmUgbm90
IGRvaW5nIHZhcmFyZ3MuIFRoaXMgaXMgYmVjYXVzZQotICAgIC8vIHdlIGN1cnJlbnRseSBkb24n
dCBoYXZlIGFueSB3YXkgb2YgZ2V0dGluZyBwcm9maWxpbmcgaW5mb3JtYXRpb24gZm9yIGFyZ3Vt
ZW50cyB0byBub24tSlMgdmFyYXJncwotICAgIC8vIGNhbGxzLiBUaGUgcHJlZGljdGlvbiBwcm9w
YWdhdG9yIHdvbid0IGJlIG9mIGFueSBoZWxwIGJlY2F1c2UgTG9hZFZhcmFyZ3Mgb2JzY3VyZXMg
dGhlIGRhdGEgZmxvdywKLSAgICAvLyBhbmQgdGhlcmUgYXJlIG5vIGNhbGxzaXRlIHZhbHVlIHBy
b2ZpbGVzIGFuZCBuYXRpdmUgZnVuY3Rpb24gd29uJ3QgaGF2ZSBjYWxsZWUgdmFsdWUgcHJvZmls
ZXMgZm9yCi0gICAgLy8gdGhvc2UgYXJndW1lbnRzLiBFdmVuIHdvcnNlLCBpZiB0aGUgaW50cmlu
c2ljIGRlY2lkZXMgdG8gZXhpdCwgaXQgd29uJ3QgcmVhbGx5IGhhdmUgYW55d2hlcmUgdG8KLSAg
ICAvLyBleGl0IHRvOiBMb2FkVmFyYXJncyBpcyBlZmZlY3RmdWwgYW5kIGl0J3MgcGFydCBvZiB0
aGUgb3BfY2FsbF92YXJhcmdzLCBzbyB3ZSBjYW4ndCBleGl0IHdpdGhvdXQKLSAgICAvLyBjYWxs
aW5nIExvYWRWYXJhcmdzIHR3aWNlLgotICAgIGlmICghSW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFy
Z3Moa2luZCkpIHsKIAotICAgICAgICBib29sIGRpZEluc2VydENoZWNrcyA9IGZhbHNlOwotICAg
ICAgICBhdXRvIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nID0gWyZdICgpIHsKLSAgICAgICAg
ICAgIGluc2VydENoZWNrcyhudWxscHRyKTsKLSAgICAgICAgICAgIGRpZEluc2VydENoZWNrcyA9
IHRydWU7Ci0gICAgICAgIH07CisgICAgYm9vbCBkaWRJbnNlcnRDaGVja3MgPSBmYWxzZTsKKyAg
ICBhdXRvIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nID0gWyZdICgpIHsKKyAgICAgICAgaWYg
KG5lZWRzVG9DaGVja0NhbGxlZSkKKyAgICAgICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxs
ZWUsIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQpOworICAgICAgICBkaWRJbnNlcnRDaGVj
a3MgPSB0cnVlOworICAgIH07CiAKLSAgICAgICAgYXV0byBlbmRTcGVjaWFsQ2FzZSA9IFsmXSAo
KSB7Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVChkaWRJbnNlcnRDaGVja3MpOwotICAgICAg
ICAgICAgYWRkVG9HcmFwaChQaGFudG9tLCBjYWxsVGFyZ2V0Tm9kZSk7Ci0gICAgICAgICAgICBl
bWl0QXJndW1lbnRQaGFudG9tcyhyZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMpOwotICAgICAgICAgICAgaW5saW5pbmdCYWxhbmNlLS07Ci0gICAgICAgICAgICBpZiAo
Y29udGludWF0aW9uQmxvY2spIHsKLSAgICAgICAgICAgICAgICBtX2N1cnJlbnRJbmRleCA9IG5l
eHRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbV9leGl0T0sgPSB0cnVlOwotICAgICAgICAgICAg
ICAgIHByb2Nlc3NTZXRMb2NhbFF1ZXVlKCk7Ci0gICAgICAgICAgICAgICAgYWRkSnVtcFRvKGNv
bnRpbnVhdGlvbkJsb2NrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAKLSAgICAg
ICAgaWYgKEludGVybmFsRnVuY3Rpb24qIGZ1bmN0aW9uID0gY2FsbGVlLmludGVybmFsRnVuY3Rp
b24oKSkgewotICAgICAgICAgICAgaWYgKGhhbmRsZUNvbnN0YW50SW50ZXJuYWxGdW5jdGlvbihj
YWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgZnVuY3Rpb24sIHJlZ2lzdGVyT2Zmc2V0LCBh
cmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgc3BlY2lhbGl6YXRpb25LaW5kLCBwcmVkaWN0aW9u
LCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykpIHsKLSAgICAgICAgICAgICAgICBlbmRTcGVj
aWFsQ2FzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7Ci0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGtpbmQgPT0gSW5saW5lQ2FsbEZyYW1lOjpUYWlsQ2Fs
bCAmJiBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoY2FsbGVlLCByZWdp
c3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIGluc2VydENoZWNrc1dpdGhB
Y2NvdW50aW5nKSkgeworICAgICAgICBSRUxFQVNFX0FTU0VSVChkaWRJbnNlcnRDaGVja3MpOwor
ICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6T3B0aW1pemVkVG9KdW1wOwor
ICAgIH0KKyAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5zZXJ0Q2hlY2tzKTsKKworICAgIGlmICgh
aW5saW5pbmdCYWxhbmNlKQorICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6
RGlkTm90aGluZzsKKworICAgIENvZGVTcGVjaWFsaXphdGlvbktpbmQgc3BlY2lhbGl6YXRpb25L
aW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVjaWFsaXphdGlvbktpbmRGb3Ioa2luZCk7CisKKyAg
ICBhdXRvIGVuZFNwZWNpYWxDYXNlID0gWyZdICgpIHsKKyAgICAgICAgUkVMRUFTRV9BU1NFUlQo
ZGlkSW5zZXJ0Q2hlY2tzKTsKKyAgICAgICAgYWRkVG9HcmFwaChQaGFudG9tLCBjYWxsVGFyZ2V0
Tm9kZSk7CisgICAgICAgIGVtaXRBcmd1bWVudFBoYW50b21zKHJlZ2lzdGVyT2Zmc2V0LCBhcmd1
bWVudENvdW50SW5jbHVkaW5nVGhpcyk7CisgICAgICAgIGlubGluaW5nQmFsYW5jZS0tOworICAg
ICAgICBpZiAoY29udGludWF0aW9uQmxvY2spIHsKKyAgICAgICAgICAgIG1fY3VycmVudEluZGV4
ID0gbmV4dE9mZnNldDsKKyAgICAgICAgICAgIG1fZXhpdE9LID0gdHJ1ZTsKKyAgICAgICAgICAg
IHByb2Nlc3NTZXRMb2NhbFF1ZXVlKCk7CisgICAgICAgICAgICBhZGRKdW1wVG8oY29udGludWF0
aW9uQmxvY2spOwogICAgICAgICB9Ci0gICAgCi0gICAgICAgIEludHJpbnNpYyBpbnRyaW5zaWMg
PSBjYWxsZWUuaW50cmluc2ljRm9yKHNwZWNpYWxpemF0aW9uS2luZCk7Ci0gICAgICAgIGlmIChp
bnRyaW5zaWMgIT0gTm9JbnRyaW5zaWMpIHsKLSAgICAgICAgICAgIGlmIChoYW5kbGVJbnRyaW5z
aWNDYWxsKGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBpbnRyaW5zaWMsIHJlZ2lzdGVy
T2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgcHJlZGljdGlvbiwgaW5zZXJ0Q2hl
Y2tzV2l0aEFjY291bnRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgZW5kU3BlY2lhbENhc2UoKTsK
LSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICB9OwogCi0g
ICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5zZXJ0Q2hlY2tzKTsKLSAgICAgICAgICAg
IC8vIFdlIG1pZ2h0IHN0aWxsIHRyeSB0byBpbmxpbmUgdGhlIEludHJpbnNpYyBiZWNhdXNlIGl0
IG1pZ2h0IGJlIGEgYnVpbHRpbiBKUyBmdW5jdGlvbi4KKyAgICBpZiAoSW50ZXJuYWxGdW5jdGlv
biogZnVuY3Rpb24gPSBjYWxsZWUuaW50ZXJuYWxGdW5jdGlvbigpKSB7CisgICAgICAgIGlmICho
YW5kbGVDb25zdGFudEludGVybmFsRnVuY3Rpb24oY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJh
bmQsIGZ1bmN0aW9uLCByZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMs
IHNwZWNpYWxpemF0aW9uS2luZCwgcHJlZGljdGlvbiwgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRp
bmcpKSB7CisgICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOworICAgICAgICAgICAgcmV0dXJu
IENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OklubGluZWQ7CiAgICAgICAgIH0KKyAgICAgICAgUkVM
RUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7CisgICAgICAgIHJldHVybiBDYWxsT3B0aW1p
emF0aW9uUmVzdWx0OjpEaWROb3RoaW5nOworICAgIH0KIAotICAgICAgICBpZiAoT3B0aW9uczo6
dXNlRE9NSklUKCkpIHsKLSAgICAgICAgICAgIGlmIChjb25zdCBET01KSVQ6OlNpZ25hdHVyZSog
c2lnbmF0dXJlID0gY2FsbGVlLnNpZ25hdHVyZUZvcihzcGVjaWFsaXphdGlvbktpbmQpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKGhhbmRsZURPTUpJVENhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3Vs
dE9wZXJhbmQsIHNpZ25hdHVyZSwgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRp
bmdUaGlzLCBwcmVkaWN0aW9uLCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykpIHsKLSAgICAg
ICAgICAgICAgICAgICAgZW5kU3BlY2lhbENhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFJFTEVBU0VfQVNT
RVJUKCFkaWRJbnNlcnRDaGVja3MpOworICAgIEludHJpbnNpYyBpbnRyaW5zaWMgPSBjYWxsZWUu
aW50cmluc2ljRm9yKHNwZWNpYWxpemF0aW9uS2luZCk7CisgICAgaWYgKGludHJpbnNpYyAhPSBO
b0ludHJpbnNpYykgeworICAgICAgICBpZiAoaGFuZGxlSW50cmluc2ljQ2FsbChjYWxsVGFyZ2V0
Tm9kZSwgcmVzdWx0T3BlcmFuZCwgaW50cmluc2ljLCByZWdpc3Rlck9mZnNldCwgYXJndW1lbnRD
b3VudEluY2x1ZGluZ1RoaXMsIHByZWRpY3Rpb24sIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5n
KSkgeworICAgICAgICAgICAgZW5kU3BlY2lhbENhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBD
YWxsT3B0aW1pemF0aW9uUmVzdWx0OjpJbmxpbmVkOworICAgICAgICB9CisgICAgICAgIFJFTEVB
U0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVja3MpOworICAgICAgICAvLyBXZSBtaWdodCBzdGlsbCB0
cnkgdG8gaW5saW5lIHRoZSBJbnRyaW5zaWMgYmVjYXVzZSBpdCBtaWdodCBiZSBhIGJ1aWx0aW4g
SlMgZnVuY3Rpb24uCisgICAgfQorCisgICAgaWYgKE9wdGlvbnM6OnVzZURPTUpJVCgpKSB7Cisg
ICAgICAgIGlmIChjb25zdCBET01KSVQ6OlNpZ25hdHVyZSogc2lnbmF0dXJlID0gY2FsbGVlLnNp
Z25hdHVyZUZvcihzcGVjaWFsaXphdGlvbktpbmQpKSB7CisgICAgICAgICAgICBpZiAoaGFuZGxl
RE9NSklUQ2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgc2lnbmF0dXJlLCByZWdp
c3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHByZWRpY3Rpb24sIGluc2Vy
dENoZWNrc1dpdGhBY2NvdW50aW5nKSkgeworICAgICAgICAgICAgICAgIGVuZFNwZWNpYWxDYXNl
KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OklubGlu
ZWQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5zZXJ0
Q2hlY2tzKTsKICAgICAgICAgfQogICAgIH0KICAgICAKICAgICB1bnNpZ25lZCBteUlubGluaW5n
Q29zdCA9IGlubGluaW5nQ29zdChjYWxsZWUsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBr
aW5kKTsKICAgICBpZiAobXlJbmxpbmluZ0Nvc3QgPiBpbmxpbmluZ0JhbGFuY2UpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OkRp
ZE5vdGhpbmc7CiAKLSAgICBJbnN0cnVjdGlvbiogc2F2ZWRDdXJyZW50SW5zdHJ1Y3Rpb24gPSBt
X2N1cnJlbnRJbnN0cnVjdGlvbjsKLSAgICBpbmxpbmVDYWxsKGNhbGxUYXJnZXROb2RlLCByZXN1
bHRPcGVyYW5kLCBjYWxsZWUsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5n
VGhpcywgbmV4dE9mZnNldCwga2luZCwgY29udGludWF0aW9uQmxvY2ssIGluc2VydENoZWNrcyk7
CisgICAgYXV0byBpbnNlcnRDaGVjayA9IFsmXSAoQ29kZUJsb2NrKikgeworICAgICAgICBpZiAo
bmVlZHNUb0NoZWNrQ2FsbGVlKQorICAgICAgICAgICAgZW1pdEZ1bmN0aW9uQ2hlY2tzKGNhbGxl
ZSwgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVudCk7CisgICAgfTsKKyAgICBpbmxpbmVDYWxs
KGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBjYWxsZWUsIHJlZ2lzdGVyT2Zmc2V0LCBh
cmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywga2luZCwgY29udGludWF0aW9uQmxvY2ssIGluc2Vy
dENoZWNrKTsKICAgICBpbmxpbmluZ0JhbGFuY2UgLT0gbXlJbmxpbmluZ0Nvc3Q7Ci0gICAgbV9j
dXJyZW50SW5zdHJ1Y3Rpb24gPSBzYXZlZEN1cnJlbnRJbnN0cnVjdGlvbjsKLSAgICByZXR1cm4g
dHJ1ZTsKKyAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6SW5saW5lZDsKIH0KIAot
Ym9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcoCi0gICAgTm9kZSogY2FsbFRhcmdl
dE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtT
dGF0dXMsCi0gICAgaW50IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVSZWcsIFZpcnR1YWxSZWdp
c3RlciB0aGlzQXJndW1lbnQsCi0gICAgVmlydHVhbFJlZ2lzdGVyIGFyZ3VtZW50c0FyZ3VtZW50
LCB1bnNpZ25lZCBhcmd1bWVudHNPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhp
cywKLSAgICB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBOb2RlVHlwZSBjYWxsT3AsIElubGluZUNhbGxG
cmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uKQorYm9vbCBCeXRlQ29k
ZVBhcnNlcjo6aGFuZGxlVmFyYXJnc0lubGluaW5nKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQg
cmVzdWx0T3BlcmFuZCwKKyAgICBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtTdGF0dXMs
IGludCBmaXJzdEZyZWVSZWcsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQsCisgICAgVmly
dHVhbFJlZ2lzdGVyIGFyZ3VtZW50c0FyZ3VtZW50LCB1bnNpZ25lZCBhcmd1bWVudHNPZmZzZXQs
CisgICAgTm9kZVR5cGUgY2FsbE9wLCBJbmxpbmVDYWxsRnJhbWU6OktpbmQga2luZCkKIHsKLSAg
ICBWRVJCT1NFX0xPRygiSGFuZGxpbmcgaW5saW5pbmcuLi5cblN0YWNrOiAiLCBjdXJyZW50Q29k
ZU9yaWdpbigpLCAiXG4iKTsKLSAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIHNwZWNpYWxpemF0
aW9uS2luZCA9IElubGluZUNhbGxGcmFtZTo6c3BlY2lhbGl6YXRpb25LaW5kRm9yKGtpbmQpOwot
ICAgIAotICAgIGlmICghY2FsbExpbmtTdGF0dXMuc2l6ZSgpKSB7Ci0gICAgICAgIFZFUkJPU0Vf
TE9HKCJCYWlsaW5nIGlubGluaW5nLlxuIik7CisgICAgVkVSQk9TRV9MT0coIkhhbmRsaW5nIGlu
bGluaW5nIChWYXJhcmdzKS4uLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIp
OworICAgIGlmIChjYWxsTGlua1N0YXR1cy5tYXhOdW1Bcmd1bWVudHMoKSA+IE9wdGlvbnM6Om1h
eGltdW1WYXJhcmdzRm9ySW5saW5pbmcoKSkgeworICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGlu
ZyBpbmxpbmluZzogdG9vIG1hbnkgYXJndW1lbnRzIGZvciB2YXJhcmdzIGlubGluaW5nLlxuIik7
CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNv
dWxkVGFrZVNsb3dQYXRoKCkgfHwgY2FsbExpbmtTdGF0dXMuc2l6ZSgpICE9IDEpIHsKKyAgICAg
ICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmc6IHBvbHltb3JwaGljIGlubGluaW5nIGlz
IG5vdCB5ZXQgc3VwcG9ydGVkIGZvciB2YXJhcmdzLlxuIik7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisKKyAgICBDYWxsVmFyaWFudCBjYWxsVmFyaWFudCA9IGNhbGxMaW5rU3RhdHVz
WzBdOworCisgICAgdW5zaWduZWQgbWFuZGF0b3J5TWluaW11bTsKKyAgICBpZiAoRnVuY3Rpb25F
eGVjdXRhYmxlKiBmdW5jdGlvbkV4ZWN1dGFibGUgPSBjYWxsVmFyaWFudC5mdW5jdGlvbkV4ZWN1
dGFibGUoKSkKKyAgICAgICAgbWFuZGF0b3J5TWluaW11bSA9IGZ1bmN0aW9uRXhlY3V0YWJsZS0+
cGFyYW1ldGVyQ291bnQoKTsKKyAgICBlbHNlCisgICAgICAgIG1hbmRhdG9yeU1pbmltdW0gPSAw
OwogICAgIAotICAgIGlmIChJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKQotICAgICAg
ICAmJiBjYWxsTGlua1N0YXR1cy5tYXhOdW1Bcmd1bWVudHMoKSA+IE9wdGlvbnM6Om1heGltdW1W
YXJhcmdzRm9ySW5saW5pbmcoKSkgewotICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxp
bmluZyBiZWNhdXNlIG9mIHZhcmFyZ3MuXG4iKTsKKyAgICAvLyBpbmNsdWRlcyAidGhpcyIKKyAg
ICB1bnNpZ25lZCBtYXhOdW1Bcmd1bWVudHMgPSBzdGQ6Om1heChjYWxsTGlua1N0YXR1cy5tYXhO
dW1Bcmd1bWVudHMoKSwgbWFuZGF0b3J5TWluaW11bSArIDEpOworCisgICAgQ29kZVNwZWNpYWxp
emF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6OnNwZWNpYWxp
emF0aW9uS2luZEZvcihraW5kKTsKKyAgICBpZiAoaW5saW5pbmdDb3N0KGNhbGxWYXJpYW50LCBt
YXhOdW1Bcmd1bWVudHMsIGtpbmQpID4gZ2V0SW5saW5pbmdCYWxhbmNlKGNhbGxMaW5rU3RhdHVz
LCBzcGVjaWFsaXphdGlvbktpbmQpKSB7CisgICAgICAgIFZFUkJPU0VfTE9HKCJCYWlsaW5nIGlu
bGluaW5nOiBpbmxpbmluZyBjb3N0IHRvbyBoaWdoLlxuIik7CiAgICAgICAgIHJldHVybiBmYWxz
ZTsKICAgICB9CisgICAgCisgICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gZmlyc3RGcmVlUmVnICsg
MTsKKyAgICByZWdpc3Rlck9mZnNldCAtPSBtYXhOdW1Bcmd1bWVudHM7IC8vIGluY2x1ZGVzICJ0
aGlzIgorICAgIHJlZ2lzdGVyT2Zmc2V0IC09IENhbGxGcmFtZTo6aGVhZGVyU2l6ZUluUmVnaXN0
ZXJzOworICAgIHJlZ2lzdGVyT2Zmc2V0ID0gLVdURjo6cm91bmRVcFRvTXVsdGlwbGVPZihzdGFj
a0FsaWdubWVudFJlZ2lzdGVycygpLCAtcmVnaXN0ZXJPZmZzZXQpOworICAgIAorICAgIGF1dG8g
aW5zZXJ0Q2hlY2tzID0gWyZdIChDb2RlQmxvY2sqIGNvZGVCbG9jaykgeworICAgICAgICBlbWl0
RnVuY3Rpb25DaGVja3MoY2FsbFZhcmlhbnQsIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQp
OworICAgICAgICAKKyAgICAgICAgaW50IHJlbWFwcGVkUmVnaXN0ZXJPZmZzZXQgPQorICAgICAg
ICBtX2lubGluZVN0YWNrVG9wLT5yZW1hcE9wZXJhbmQoVmlydHVhbFJlZ2lzdGVyKHJlZ2lzdGVy
T2Zmc2V0KSkub2Zmc2V0KCk7CisgICAgICAgIAorICAgICAgICBlbnN1cmVMb2NhbHMoVmlydHVh
bFJlZ2lzdGVyKHJlbWFwcGVkUmVnaXN0ZXJPZmZzZXQpLnRvTG9jYWwoKSk7CisgICAgICAgIAor
ICAgICAgICBpbnQgYXJndW1lbnRTdGFydCA9IHJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZyYW1lOjpo
ZWFkZXJTaXplSW5SZWdpc3RlcnM7CisgICAgICAgIGludCByZW1hcHBlZEFyZ3VtZW50U3RhcnQg
PQorICAgICAgICBtX2lubGluZVN0YWNrVG9wLT5yZW1hcE9wZXJhbmQoVmlydHVhbFJlZ2lzdGVy
KGFyZ3VtZW50U3RhcnQpKS5vZmZzZXQoKTsKKyAgICAgICAgCisgICAgICAgIExvYWRWYXJhcmdz
RGF0YSogZGF0YSA9IG1fZ3JhcGgubV9sb2FkVmFyYXJnc0RhdGEuYWRkKCk7CisgICAgICAgIGRh
dGEtPnN0YXJ0ID0gVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVkQXJndW1lbnRTdGFydCArIDEpOwor
ICAgICAgICBkYXRhLT5jb3VudCA9IFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zm
c2V0ICsgQ2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCk7CisgICAgICAgIGRhdGEtPm9mZnNl
dCA9IGFyZ3VtZW50c09mZnNldDsKKyAgICAgICAgZGF0YS0+bGltaXQgPSBtYXhOdW1Bcmd1bWVu
dHM7CisgICAgICAgIGRhdGEtPm1hbmRhdG9yeU1pbmltdW0gPSBtYW5kYXRvcnlNaW5pbXVtOwor
ICAgICAgICAKKyAgICAgICAgaWYgKGNhbGxPcCA9PSBUYWlsQ2FsbEZvcndhcmRWYXJhcmdzKQor
ICAgICAgICAgICAgYWRkVG9HcmFwaChGb3J3YXJkVmFyYXJncywgT3BJbmZvKGRhdGEpKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgYWRkVG9HcmFwaChMb2FkVmFyYXJncywgT3BJbmZvKGRh
dGEpLCBnZXQoYXJndW1lbnRzQXJndW1lbnQpKTsKKyAgICAgICAgCisgICAgICAgIC8vIExvYWRW
YXJhcmdzIG1heSBPU1IgZXhpdC4gSGVuY2UsIHdlIG5lZWQgdG8ga2VlcCBhbGl2ZSBjYWxsVGFy
Z2V0Tm9kZSwgdGhpc0FyZ3VtZW50CisgICAgICAgIC8vIGFuZCBhcmd1bWVudHNBcmd1bWVudCBm
b3IgdGhlIGJhc2VsaW5lIEpJVC4gSG93ZXZlciwgd2Ugb25seSBuZWVkIGEgUGhhbnRvbSBmb3IK
KyAgICAgICAgLy8gY2FsbFRhcmdldE5vZGUgYmVjYXVzZSB0aGUgb3RoZXIgMiBhcmUgc3RpbGwg
aW4gdXNlIGFuZCBhbGl2ZSBhdCB0aGlzIHBvaW50LgorICAgICAgICBhZGRUb0dyYXBoKFBoYW50
b20sIGNhbGxUYXJnZXROb2RlKTsKKyAgICAgICAgCisgICAgICAgIC8vIEluIERGRyBJUiBiZWZv
cmUgU1NBLCB3ZSBjYW5ub3QgaW5zZXJ0IGNvbnRyb2wgZmxvdyBiZXR3ZWVuIGFmdGVyIHRoZQor
ICAgICAgICAvLyBMb2FkVmFyYXJncyBhbmQgdGhlIGxhc3QgU2V0QXJndW1lbnQuIFRoaXMgaXNu
J3QgYSBwcm9ibGVtIG9uY2Ugd2UgZ2V0IHRvIERGRworICAgICAgICAvLyBTU0EuIEZvcnR1bmF0
ZWx5LCB3ZSBhbHNvIGhhdmUgb3RoZXIgcmVhc29ucyBmb3Igbm90IGluc2VydGluZyBjb250cm9s
IGZsb3cKKyAgICAgICAgLy8gYmVmb3JlIFNTQS4KICAgICAgICAgCisgICAgICAgIFZhcmlhYmxl
QWNjZXNzRGF0YSogY291bnRWYXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0YShWaXJ0dWFs
UmVnaXN0ZXIocmVtYXBwZWRSZWdpc3Rlck9mZnNldCArIENhbGxGcmFtZVNsb3Q6OmFyZ3VtZW50
Q291bnQpKTsKKyAgICAgICAgLy8gVGhpcyBpcyBwcmV0dHkgbGFtZSwgYnV0IGl0IHdpbGwgZm9y
Y2UgdGhlIGNvdW50IHRvIGJlIGZsdXNoZWQgYXMgYW4gaW50LiBUaGlzIGRvZXNuJ3QKKyAgICAg
ICAgLy8gbWF0dGVyIHZlcnkgbXVjaCwgc2luY2Ugb3VyIHVzZSBvZiBhIFNldEFyZ3VtZW50IGFu
ZCBGbHVzaGVzIGZvciB0aGlzIGxvY2FsIHNsb3QgaXMKKyAgICAgICAgLy8gbW9zdGx5IGp1c3Qg
YSBmb3JtYWxpdHkuCisgICAgICAgIGNvdW50VmFyaWFibGUtPnByZWRpY3QoU3BlY0ludDMyT25s
eSk7CisgICAgICAgIGNvdW50VmFyaWFibGUtPm1lcmdlSXNQcm9maXRhYmxlVG9VbmJveCh0cnVl
KTsKKyAgICAgICAgTm9kZSogc2V0QXJndW1lbnRDb3VudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1l
bnQsIE9wSW5mbyhjb3VudFZhcmlhYmxlKSk7CisgICAgICAgIG1fY3VycmVudEJsb2NrLT52YXJp
YWJsZXNBdFRhaWwuc2V0T3BlcmFuZChjb3VudFZhcmlhYmxlLT5sb2NhbCgpLCBzZXRBcmd1bWVu
dENvdW50KTsKKyAgICAgICAgCisgICAgICAgIHNldChWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRT
dGFydCksIGdldCh0aGlzQXJndW1lbnQpLCBJbW1lZGlhdGVOYWtlZFNldCk7CisgICAgICAgIGZv
ciAodW5zaWduZWQgYXJndW1lbnQgPSAxOyBhcmd1bWVudCA8IG1heE51bUFyZ3VtZW50czsgKyth
cmd1bWVudCkgeworICAgICAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJsZSA9IG5l
d1ZhcmlhYmxlQWNjZXNzRGF0YShWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0YXJ0
ICsgYXJndW1lbnQpKTsKKyAgICAgICAgICAgIHZhcmlhYmxlLT5tZXJnZVNob3VsZE5ldmVyVW5i
b3godHJ1ZSk7IC8vIFdlIGN1cnJlbnRseSBoYXZlIG5vd2hlcmUgdG8gcHV0IHRoZSB0eXBlIGNo
ZWNrIG9uIHRoZSBMb2FkVmFyYXJncy4gTG9hZFZhcmFyZ3MgaXMgZWZmZWN0ZnVsLCBzbyBhZnRl
ciBpdCBmaW5pc2hlcywgd2UgY2Fubm90IGV4aXQuCisgICAgICAgICAgICAKKyAgICAgICAgICAg
IC8vIEZvciBhIHdoaWxlIGl0IGhhZCBiZWVuIG15IGludGVudGlvbiB0byBkbyB0aGluZ3MgbGlr
ZSB0aGlzIGluc2lkZSB0aGUKKyAgICAgICAgICAgIC8vIHByZWRpY3Rpb24gaW5qZWN0aW9uIHBo
YXNlLiBCdXQgaW4gdGhpcyBjYXNlIGl0J3MgcmVhbGx5IGJlc3QgdG8gZG8gaXQgaGVyZSwKKyAg
ICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyBoZXJlIHRoYXQgd2UgaGF2ZSBhY2Nlc3MgdG8gdGhl
IHZhcmlhYmxlIGFjY2VzcyBkYXRhcyBmb3IgdGhlCisgICAgICAgICAgICAvLyBpbmxpbmluZyB3
ZSdyZSBhYm91dCB0byBkby4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBTb21ldGhp
bmcgZWxzZSB0aGF0J3MgaW50ZXJlc3RpbmcgaGVyZSBpcyB0aGF0IHdlJ2QgcmVhbGx5IGxvdmUg
dG8gZ2V0CisgICAgICAgICAgICAvLyBwcmVkaWN0aW9ucyBmcm9tIHRoZSBhcmd1bWVudHMgbG9h
ZGVkIGF0IHRoZSBjYWxsc2l0ZSwgcmF0aGVyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBhcmd1
bWVudHMgcmVjZWl2ZWQgaW5zaWRlIHRoZSBjYWxsZWUuIEJ1dCB0aGF0IHByb2JhYmx5IHdvbid0
IG1hdHRlciBmb3IgbW9zdAorICAgICAgICAgICAgLy8gY2FsbHMuCisgICAgICAgICAgICBpZiAo
Y29kZUJsb2NrICYmIGFyZ3VtZW50IDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvZGVCbG9jay0+
bnVtUGFyYW1ldGVycygpKSkgeworICAgICAgICAgICAgICAgIENvbmN1cnJlbnRKU0xvY2tlciBs
b2NrZXIoY29kZUJsb2NrLT5tX2xvY2spOworICAgICAgICAgICAgICAgIFZhbHVlUHJvZmlsZSYg
cHJvZmlsZSA9IGNvZGVCbG9jay0+dmFsdWVQcm9maWxlRm9yQXJndW1lbnQoYXJndW1lbnQpOwor
ICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5wcmVkaWN0KHByb2ZpbGUuY29tcHV0ZVVwZGF0ZWRQ
cmVkaWN0aW9uKGxvY2tlcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
ICAgICBOb2RlKiBzZXRBcmd1bWVudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1lbnQsIE9wSW5mbyh2
YXJpYWJsZSkpOworICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5z
ZXRPcGVyYW5kKHZhcmlhYmxlLT5sb2NhbCgpLCBzZXRBcmd1bWVudCk7CisgICAgICAgIH0KKyAg
ICB9OworCisgICAgLy8gSW50cmluc2ljcyBhbmQgaW50ZXJuYWwgZnVuY3Rpb25zIGNhbiBvbmx5
IGJlIGlubGluZWQgaWYgd2UncmUgbm90IGRvaW5nIHZhcmFyZ3MuIFRoaXMgaXMgYmVjYXVzZQor
ICAgIC8vIHdlIGN1cnJlbnRseSBkb24ndCBoYXZlIGFueSB3YXkgb2YgZ2V0dGluZyBwcm9maWxp
bmcgaW5mb3JtYXRpb24gZm9yIGFyZ3VtZW50cyB0byBub24tSlMgdmFyYXJncworICAgIC8vIGNh
bGxzLiBUaGUgcHJlZGljdGlvbiBwcm9wYWdhdG9yIHdvbid0IGJlIG9mIGFueSBoZWxwIGJlY2F1
c2UgTG9hZFZhcmFyZ3Mgb2JzY3VyZXMgdGhlIGRhdGEgZmxvdywKKyAgICAvLyBhbmQgdGhlcmUg
YXJlIG5vIGNhbGxzaXRlIHZhbHVlIHByb2ZpbGVzIGFuZCBuYXRpdmUgZnVuY3Rpb24gd29uJ3Qg
aGF2ZSBjYWxsZWUgdmFsdWUgcHJvZmlsZXMgZm9yCisgICAgLy8gdGhvc2UgYXJndW1lbnRzLiBF
dmVuIHdvcnNlLCBpZiB0aGUgaW50cmluc2ljIGRlY2lkZXMgdG8gZXhpdCwgaXQgd29uJ3QgcmVh
bGx5IGhhdmUgYW55d2hlcmUgdG8KKyAgICAvLyBleGl0IHRvOiBMb2FkVmFyYXJncyBpcyBlZmZl
Y3RmdWwgYW5kIGl0J3MgcGFydCBvZiB0aGUgb3BfY2FsbF92YXJhcmdzLCBzbyB3ZSBjYW4ndCBl
eGl0IHdpdGhvdXQKKyAgICAvLyBjYWxsaW5nIExvYWRWYXJhcmdzIHR3aWNlLgorICAgIGlubGlu
ZUNhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGNhbGxWYXJpYW50LCByZWdpc3Rl
ck9mZnNldCwgbWF4TnVtQXJndW1lbnRzLCBraW5kLCBudWxscHRyLCBpbnNlcnRDaGVja3MpOwor
CisgICAgVkVSQk9TRV9MT0coIlN1Y2Nlc3NmdWwgaW5saW5pbmcgKHZhcmFyZ3MsIG1vbm9tb3Jw
aGljKS5cblN0YWNrOiAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiXG4iKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordW5zaWduZWQgQnl0ZUNvZGVQYXJzZXI6OmdldElubGluaW5nQmFsYW5jZShj
b25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtTdGF0dXMsIENvZGVTcGVjaWFsaXphdGlvbktp
bmQgc3BlY2lhbGl6YXRpb25LaW5kKQorewogICAgIHVuc2lnbmVkIGlubGluaW5nQmFsYW5jZSA9
IE9wdGlvbnM6Om1heGltdW1GdW5jdGlvbkZvckNhbGxJbmxpbmVDYW5kaWRhdGVJbnN0cnVjdGlv
bkNvdW50KCk7CiAgICAgaWYgKHNwZWNpYWxpemF0aW9uS2luZCA9PSBDb2RlRm9yQ29uc3RydWN0
KQogICAgICAgICBpbmxpbmluZ0JhbGFuY2UgPSBzdGQ6Om1pbihpbmxpbmluZ0JhbGFuY2UsIE9w
dGlvbnM6Om1heGltdW1GdW5jdGlvbkZvckNvbnN0cnVjdElubGluZUNhbmRpZGF0ZUluc3RydWN0
aW9uQ291bnQoKSk7CiAgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmlzQ2xvc3VyZUNhbGwoKSkKICAg
ICAgICAgaW5saW5pbmdCYWxhbmNlID0gc3RkOjptaW4oaW5saW5pbmdCYWxhbmNlLCBPcHRpb25z
OjptYXhpbXVtRnVuY3Rpb25Gb3JDbG9zdXJlQ2FsbElubGluZUNhbmRpZGF0ZUluc3RydWN0aW9u
Q291bnQoKSk7CisgICAgcmV0dXJuIGlubGluaW5nQmFsYW5jZTsKK30KKworQnl0ZUNvZGVQYXJz
ZXI6OkNhbGxPcHRpbWl6YXRpb25SZXN1bHQgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUlubGluaW5n
KAorICAgIE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgY29uc3QgQ2Fs
bExpbmtTdGF0dXMmIGNhbGxMaW5rU3RhdHVzLAorICAgIGludCByZWdpc3Rlck9mZnNldCwgVmly
dHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwKKyAgICBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMsCisgICAgdW5zaWduZWQgbmV4dE9mZnNldCwgTm9kZVR5cGUgY2FsbE9wLCBJbmxpbmVD
YWxsRnJhbWU6OktpbmQga2luZCwgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlvbikKK3sKKyAgICBW
RVJCT1NFX0xPRygiSGFuZGxpbmcgaW5saW5pbmcuLi5cblN0YWNrOiAiLCBjdXJyZW50Q29kZU9y
aWdpbigpLCAiXG4iKTsKICAgICAKKyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIHNwZWNpYWxp
emF0aW9uS2luZCA9IElubGluZUNhbGxGcmFtZTo6c3BlY2lhbGl6YXRpb25LaW5kRm9yKGtpbmQp
OworICAgIHVuc2lnbmVkIGlubGluaW5nQmFsYW5jZSA9IGdldElubGluaW5nQmFsYW5jZShjYWxs
TGlua1N0YXR1cywgc3BlY2lhbGl6YXRpb25LaW5kKTsKKwogICAgIC8vIEZpcnN0IGNoZWNrIGlm
IHdlIGNhbiBhdm9pZCBjcmVhdGluZyBjb250cm9sIGZsb3cuIE91ciBpbmxpbmVyIGRvZXMgc29t
ZSBDRkcKICAgICAvLyBzaW1wbGlmaWNhdGlvbiBvbiB0aGUgZmx5IGFuZCB0aGlzIGhlbHBzIHJl
ZHVjZSBjb21waWxlIHRpbWVzLCBidXQgd2UgY2FuIG9ubHkgbGV2ZXJhZ2UKICAgICAvLyB0aGlz
IGluIGNhc2VzIHdoZXJlIHdlIGRvbid0IG5lZWQgY29udHJvbCBmbG93IGRpYW1vbmRzIHRvIGNo
ZWNrIHRoZSBjYWxsZWUuCiAgICAgaWYgKCFjYWxsTGlua1N0YXR1cy5jb3VsZFRha2VTbG93UGF0
aCgpICYmIGNhbGxMaW5rU3RhdHVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgIGludCByZWdpc3Rl
ck9mZnNldDsKLSAgICAgICAgCi0gICAgICAgIC8vIE9ubHkgdXNlZCBmb3IgdmFyYXJncyBjYWxs
cy4KLSAgICAgICAgdW5zaWduZWQgbWFuZGF0b3J5TWluaW11bSA9IDA7Ci0gICAgICAgIHVuc2ln
bmVkIG1heE51bUFyZ3VtZW50cyA9IDA7Ci0KLSAgICAgICAgaWYgKElubGluZUNhbGxGcmFtZTo6
aXNWYXJhcmdzKGtpbmQpKSB7Ci0gICAgICAgICAgICBpZiAoRnVuY3Rpb25FeGVjdXRhYmxlKiBm
dW5jdGlvbkV4ZWN1dGFibGUgPSBjYWxsTGlua1N0YXR1c1swXS5mdW5jdGlvbkV4ZWN1dGFibGUo
KSkKLSAgICAgICAgICAgICAgICBtYW5kYXRvcnlNaW5pbXVtID0gZnVuY3Rpb25FeGVjdXRhYmxl
LT5wYXJhbWV0ZXJDb3VudCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1h
bmRhdG9yeU1pbmltdW0gPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBpbmNsdWRl
cyAidGhpcyIKLSAgICAgICAgICAgIG1heE51bUFyZ3VtZW50cyA9IHN0ZDo6bWF4KAotICAgICAg
ICAgICAgICAgIGNhbGxMaW5rU3RhdHVzLm1heE51bUFyZ3VtZW50cygpLAotICAgICAgICAgICAg
ICAgIG1hbmRhdG9yeU1pbmltdW0gKyAxKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8g
V2Ugc29ydCBvZiBwcmV0ZW5kIHRoYXQgdGhpcyAqaXMqIHRoZSBudW1iZXIgb2YgYXJndW1lbnRz
IHRoYXQgd2VyZSBwYXNzZWQuCi0gICAgICAgICAgICBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhp
cyA9IG1heE51bUFyZ3VtZW50czsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmVnaXN0ZXJP
ZmZzZXQgPSByZWdpc3Rlck9mZnNldE9yRmlyc3RGcmVlUmVnICsgMTsKLSAgICAgICAgICAgIHJl
Z2lzdGVyT2Zmc2V0IC09IG1heE51bUFyZ3VtZW50czsgLy8gaW5jbHVkZXMgInRoaXMiCi0gICAg
ICAgICAgICByZWdpc3Rlck9mZnNldCAtPSBDYWxsRnJhbWU6OmhlYWRlclNpemVJblJlZ2lzdGVy
czsKLSAgICAgICAgICAgIHJlZ2lzdGVyT2Zmc2V0ID0gLVdURjo6cm91bmRVcFRvTXVsdGlwbGVP
ZigKLSAgICAgICAgICAgICAgICBzdGFja0FsaWdubWVudFJlZ2lzdGVycygpLAotICAgICAgICAg
ICAgICAgIC1yZWdpc3Rlck9mZnNldCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmVn
aXN0ZXJPZmZzZXQgPSByZWdpc3Rlck9mZnNldE9yRmlyc3RGcmVlUmVnOwotICAgICAgICAKLSAg
ICAgICAgYm9vbCByZXN1bHQgPSBhdHRlbXB0VG9JbmxpbmVDYWxsKAotICAgICAgICAgICAgY2Fs
bFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGNhbGxMaW5rU3RhdHVzWzBdLCByZWdpc3Rlck9m
ZnNldCwKLSAgICAgICAgICAgIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBuZXh0T2Zmc2V0
LCBraW5kLCBwcmVkaWN0aW9uLAotICAgICAgICAgICAgaW5saW5pbmdCYWxhbmNlLCBudWxscHRy
LCBbJl0gKENvZGVCbG9jayogY29kZUJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgZW1pdEZ1bmN0
aW9uQ2hlY2tzKGNhbGxMaW5rU3RhdHVzWzBdLCBjYWxsVGFyZ2V0Tm9kZSwgdGhpc0FyZ3VtZW50
KTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSB2YXJhcmdzIGNhbGwsIHdlIHdh
bnQgdG8gZXh0cmFjdCB0aGUgYXJndW1lbnRzIHJpZ2h0IG5vdy4KLSAgICAgICAgICAgICAgICBp
ZiAoSW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFyZ3Moa2luZCkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgaW50IHJlbWFwcGVkUmVnaXN0ZXJPZmZzZXQgPQotICAgICAgICAgICAgICAgICAgICAgICAg
bV9pbmxpbmVTdGFja1RvcC0+cmVtYXBPcGVyYW5kKFZpcnR1YWxSZWdpc3RlcihyZWdpc3Rlck9m
ZnNldCkpLm9mZnNldCgpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAg
ICAgZW5zdXJlTG9jYWxzKFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zmc2V0KS50
b0xvY2FsKCkpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaW50
IGFyZ3VtZW50U3RhcnQgPSByZWdpc3Rlck9mZnNldCArIENhbGxGcmFtZTo6aGVhZGVyU2l6ZUlu
UmVnaXN0ZXJzOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYXBwZWRBcmd1bWVudFN0YXJ0
ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFu
ZChWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRTdGFydCkpLm9mZnNldCgpOwotCi0gICAgICAgICAg
ICAgICAgICAgIExvYWRWYXJhcmdzRGF0YSogZGF0YSA9IG1fZ3JhcGgubV9sb2FkVmFyYXJnc0Rh
dGEuYWRkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEtPnN0YXJ0ID0gVmlydHVhbFJlZ2lz
dGVyKHJlbWFwcGVkQXJndW1lbnRTdGFydCArIDEpOwotICAgICAgICAgICAgICAgICAgICBkYXRh
LT5jb3VudCA9IFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZy
YW1lU2xvdDo6YXJndW1lbnRDb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEtPm9mZnNl
dCA9IGFyZ3VtZW50c09mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgZGF0YS0+bGltaXQgPSBt
YXhOdW1Bcmd1bWVudHM7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEtPm1hbmRhdG9yeU1pbmlt
dW0gPSBtYW5kYXRvcnlNaW5pbXVtOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsT3Ag
PT0gVGFpbENhbGxGb3J3YXJkVmFyYXJncykKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRv
R3JhcGgoRm9yd2FyZFZhcmFyZ3MsIE9wSW5mbyhkYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvR3JhcGgoTG9hZFZhcmFyZ3MsIE9w
SW5mbyhkYXRhKSwgZ2V0KGFyZ3VtZW50c0FyZ3VtZW50KSk7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgLy8gTG9hZFZhcmFyZ3MgbWF5IE9TUiBleGl0LiBIZW5jZSwgd2UgbmVlZCB0byBrZWVwIGFs
aXZlIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQKLSAgICAgICAgICAgICAgICAgICAgLy8g
YW5kIGFyZ3VtZW50c0FyZ3VtZW50IGZvciB0aGUgYmFzZWxpbmUgSklULiBIb3dldmVyLCB3ZSBv
bmx5IG5lZWQgYSBQaGFudG9tIGZvcgotICAgICAgICAgICAgICAgICAgICAvLyBjYWxsVGFyZ2V0
Tm9kZSBiZWNhdXNlIHRoZSBvdGhlciAyIGFyZSBzdGlsbCBpbiB1c2UgYW5kIGFsaXZlIGF0IHRo
aXMgcG9pbnQuCi0gICAgICAgICAgICAgICAgICAgIGFkZFRvR3JhcGgoUGhhbnRvbSwgY2FsbFRh
cmdldE5vZGUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIEluIERGRyBJUiBiZWZvcmUgU1NB
LCB3ZSBjYW5ub3QgaW5zZXJ0IGNvbnRyb2wgZmxvdyBiZXR3ZWVuIGFmdGVyIHRoZQotICAgICAg
ICAgICAgICAgICAgICAvLyBMb2FkVmFyYXJncyBhbmQgdGhlIGxhc3QgU2V0QXJndW1lbnQuIFRo
aXMgaXNuJ3QgYSBwcm9ibGVtIG9uY2Ugd2UgZ2V0IHRvIERGRwotICAgICAgICAgICAgICAgICAg
ICAvLyBTU0EuIEZvcnR1bmF0ZWx5LCB3ZSBhbHNvIGhhdmUgb3RoZXIgcmVhc29ucyBmb3Igbm90
IGluc2VydGluZyBjb250cm9sIGZsb3cKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIFNT
QS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZUFjY2Vzc0RhdGEq
IGNvdW50VmFyaWFibGUgPSBuZXdWYXJpYWJsZUFjY2Vzc0RhdGEoCi0gICAgICAgICAgICAgICAg
ICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRSZWdpc3Rlck9mZnNldCArIENhbGxGcmFt
ZVNsb3Q6OmFyZ3VtZW50Q291bnQpKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBw
cmV0dHkgbGFtZSwgYnV0IGl0IHdpbGwgZm9yY2UgdGhlIGNvdW50IHRvIGJlIGZsdXNoZWQgYXMg
YW4gaW50LiBUaGlzIGRvZXNuJ3QKLSAgICAgICAgICAgICAgICAgICAgLy8gbWF0dGVyIHZlcnkg
bXVjaCwgc2luY2Ugb3VyIHVzZSBvZiBhIFNldEFyZ3VtZW50IGFuZCBGbHVzaGVzIGZvciB0aGlz
IGxvY2FsIHNsb3QgaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbW9zdGx5IGp1c3QgYSBmb3Jt
YWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIGNvdW50VmFyaWFibGUtPnByZWRpY3QoU3BlY0lu
dDMyT25seSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50VmFyaWFibGUtPm1lcmdlSXNQcm9m
aXRhYmxlVG9VbmJveCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgTm9kZSogc2V0QXJndW1l
bnRDb3VudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1lbnQsIE9wSW5mbyhjb3VudFZhcmlhYmxlKSk7
Ci0gICAgICAgICAgICAgICAgICAgIG1fY3VycmVudEJsb2NrLT52YXJpYWJsZXNBdFRhaWwuc2V0
T3BlcmFuZChjb3VudFZhcmlhYmxlLT5sb2NhbCgpLCBzZXRBcmd1bWVudENvdW50KTsKLQotICAg
ICAgICAgICAgICAgICAgICBzZXQoVmlydHVhbFJlZ2lzdGVyKGFyZ3VtZW50U3RhcnQpLCBnZXQo
dGhpc0FyZ3VtZW50KSwgSW1tZWRpYXRlTmFrZWRTZXQpOwotICAgICAgICAgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGFyZ3VtZW50ID0gMTsgYXJndW1lbnQgPCBtYXhOdW1Bcmd1bWVudHM7ICsr
YXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSog
dmFyaWFibGUgPSBuZXdWYXJpYWJsZUFjY2Vzc0RhdGEoCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVmlydHVhbFJlZ2lzdGVyKHJlbWFwcGVkQXJndW1lbnRTdGFydCArIGFyZ3VtZW50KSk7
Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS0+bWVyZ2VTaG91bGROZXZlclVuYm94
KHRydWUpOyAvLyBXZSBjdXJyZW50bHkgaGF2ZSBub3doZXJlIHRvIHB1dCB0aGUgdHlwZSBjaGVj
ayBvbiB0aGUgTG9hZFZhcmFyZ3MuIExvYWRWYXJhcmdzIGlzIGVmZmVjdGZ1bCwgc28gYWZ0ZXIg
aXQgZmluaXNoZXMsIHdlIGNhbm5vdCBleGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgYSB3aGlsZSBpdCBoYWQgYmVlbiBteSBpbnRl
bnRpb24gdG8gZG8gdGhpbmdzIGxpa2UgdGhpcyBpbnNpZGUgdGhlCi0gICAgICAgICAgICAgICAg
ICAgICAgICAvLyBwcmVkaWN0aW9uIGluamVjdGlvbiBwaGFzZS4gQnV0IGluIHRoaXMgY2FzZSBp
dCdzIHJlYWxseSBiZXN0IHRvIGRvIGl0IGhlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAv
LyBiZWNhdXNlIGl0J3MgaGVyZSB0aGF0IHdlIGhhdmUgYWNjZXNzIHRvIHRoZSB2YXJpYWJsZSBh
Y2Nlc3MgZGF0YXMgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5saW5pbmcg
d2UncmUgYWJvdXQgdG8gZG8uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGVsc2UgdGhhdCdzIGludGVyZXN0aW5nIGhlcmUg
aXMgdGhhdCB3ZSdkIHJlYWxseSBsb3ZlIHRvIGdldAotICAgICAgICAgICAgICAgICAgICAgICAg
Ly8gcHJlZGljdGlvbnMgZnJvbSB0aGUgYXJndW1lbnRzIGxvYWRlZCBhdCB0aGUgY2FsbHNpdGUs
IHJhdGhlciB0aGFuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJndW1lbnRzIHJl
Y2VpdmVkIGluc2lkZSB0aGUgY2FsbGVlLiBCdXQgdGhhdCBwcm9iYWJseSB3b24ndCBtYXR0ZXIg
Zm9yIG1vc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzLgotICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKGNvZGVCbG9jayAmJiBhcmd1bWVudCA8IHN0YXRpY19jYXN0PHVuc2ln
bmVkPihjb2RlQmxvY2stPm51bVBhcmFtZXRlcnMoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBDb25jdXJyZW50SlNMb2NrZXIgbG9ja2VyKGNvZGVCbG9jay0+bV9sb2NrKTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVByb2ZpbGUmIHByb2ZpbGUgPSBjb2RlQmxv
Y2stPnZhbHVlUHJvZmlsZUZvckFyZ3VtZW50KGFyZ3VtZW50KTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB2YXJpYWJsZS0+cHJlZGljdChwcm9maWxlLmNvbXB1dGVVcGRhdGVkUHJlZGlj
dGlvbihsb2NrZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSogc2V0QXJndW1lbnQgPSBh
ZGRUb0dyYXBoKFNldEFyZ3VtZW50LCBPcEluZm8odmFyaWFibGUpKTsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIG1fY3VycmVudEJsb2NrLT52YXJpYWJsZXNBdFRhaWwuc2V0T3BlcmFuZCh2YXJp
YWJsZS0+bG9jYWwoKSwgc2V0QXJndW1lbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIFZFUkJPU0VfTE9HKCJEb25l
IGlubGluaW5nIChzaW1wbGUpLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcblJl
c3VsdDogIiwgcmVzdWx0LCAiXG4iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAg
cmV0dXJuIGhhbmRsZUNhbGxWYXJpYW50KAorICAgICAgICAgICAgY2FsbFRhcmdldE5vZGUsIHJl
c3VsdE9wZXJhbmQsIGNhbGxMaW5rU3RhdHVzWzBdLCByZWdpc3Rlck9mZnNldCwgdGhpc0FyZ3Vt
ZW50LAorICAgICAgICAgICAgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQs
IGtpbmQsIHByZWRpY3Rpb24sIGlubGluaW5nQmFsYW5jZSwgbnVsbHB0ciwgdHJ1ZSk7CiAgICAg
fQotICAgIAorCiAgICAgLy8gV2UgbmVlZCB0byBjcmVhdGUgc29tZSBraW5kIG9mIHN3aXRjaCBv
dmVyIGNhbGxlZS4gRm9yIG5vdyB3ZSBvbmx5IGRvIHRoaXMgaWYgd2UgYmVsaWV2ZSB0aGF0CiAg
ICAgLy8gd2UncmUgaW4gdGhlIHRvcCB0aWVyLiBXZSBoYXZlIHR3byByZWFzb25zIGZvciB0aGlz
OiBmaXJzdCwgaXQgcHJvdmlkZXMgdXMgYW4gb3Bwb3J0dW5pdHkgdG8KICAgICAvLyBkbyBtb3Jl
IGRldGFpbGVkIHBvbHl2YXJpYW50L3BvbHltb3JwaGljIHByb2ZpbGluZzsgYW5kIHNlY29uZCwg
aXQgcmVkdWNlcyBjb21waWxlIHRpbWVzIGluCiAgICAgLy8gdGhlIERGRy4gQW5kIGJ5IHBvbHl2
YXJpYW50IHByb2ZpbGluZyB3ZSBtZWFuIHBvbHl2YXJpYW50IHByb2ZpbGluZyBvZiAqdGhpcyog
Y2FsbC4gTm90ZSB0aGF0CiAgICAgLy8gd2UgY291bGQgaW1wcm92ZSB0aGF0IGFzcGVjdCBvZiB0
aGlzIGJ5IGRvaW5nIHBvbHltb3JwaGljIGlubGluaW5nIGJ1dCBoYXZpbmcgdGhlIHByb2ZpbGlu
ZwogICAgIC8vIGFsc28uCi0gICAgaWYgKCFpc0ZUTChtX2dyYXBoLm1fcGxhbi5tb2RlKSB8fCAh
T3B0aW9uczo6dXNlUG9seW1vcnBoaWNDYWxsSW5saW5pbmcoKQotICAgICAgICB8fCBJbmxpbmVD
YWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKSkgeworICAgIGlmICghaXNGVEwobV9ncmFwaC5tX3Bs
YW4ubW9kZSkgfHwgIU9wdGlvbnM6OnVzZVBvbHltb3JwaGljQ2FsbElubGluaW5nKCkpIHsKICAg
ICAgICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmcgKGhhcmQpLlxuU3RhY2s6ICIsIGN1
cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IHJldHVybiBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpEaWROb3RoaW5nOwogICAgIH0KICAgICAK
ICAgICAvLyBJZiB0aGUgY2xhaW0gaXMgdGhhdCB0aGlzIGRpZCBub3Qgb3JpZ2luYXRlIGZyb20g
YSBzdHViLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gZW1pdCBhIHN3aXRjaApAQCAtMTk2OCw3ICsx
OTY3LDcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcoCiAgICAgaWYgKCFP
cHRpb25zOjp1c2VQb2x5bW9ycGhpY0NhbGxJbmxpbmluZ0Zvck5vblN0dWJTdGF0dXMoKQogICAg
ICAgICAmJiAhY2FsbExpbmtTdGF0dXMuaXNCYXNlZE9uU3R1YigpKSB7CiAgICAgICAgIFZFUkJP
U0VfTE9HKCJCYWlsaW5nIGlubGluaW5nIChub24tc3R1YiBwb2x5bW9ycGhpc20pLlxuU3RhY2s6
ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpEaWROb3RoaW5nOwogICAgIH0K
IAogICAgIGJvb2wgYWxsQXJlQ2xvc3VyZUNhbGxzID0gdHJ1ZTsKQEAgLTE5OTEsMTMgKzE5OTAs
MTEgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcoCiAgICAgICAgIC8vIGNs
b3N1cmUgY2FsbHMuCiAgICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0xMzYwMjAKICAgICAgICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmcgKG1p
eCkuXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIlxuIik7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OkRpZE5vdGhp
bmc7CiAgICAgfQogCiAgICAgVkVSQk9TRV9MT0coIkRvaW5nIGhhcmQgaW5saW5pbmcuLi5cblN0
YWNrOiAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAiXG4iKTsKIAotICAgIGludCByZWdpc3Rlck9m
ZnNldCA9IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZyZWVSZWc7Ci0KICAgICAvLyBUaGlzIG1ha2Vz
IG1lIHdpc2ggdGhhdCB3ZSB3ZXJlIGluIFNTQSBhbGwgdGhlIHRpbWUuIFdlIG5lZWQgdG8gcGlj
ayBhIHZhcmlhYmxlIGludG8gd2hpY2ggdG8KICAgICAvLyBzdG9yZSB0aGUgY2FsbGVlIHNvIHRo
YXQgaXQgd2lsbCBiZSBhY2Nlc3NpYmxlIHRvIGFsbCBvZiB0aGUgYmxvY2tzIHdlJ3JlIGFib3V0
IHRvIGNyZWF0ZS4gV2UKICAgICAvLyBnZXQgYXdheSB3aXRoIGRvaW5nIGFuIGltbWVkaWF0ZS1z
ZXQgaGVyZSBiZWNhdXNlIHdlIHdvdWxkbid0IGhhdmUgcGVyZm9ybWVkIGFueSBzaWRlIGVmZmVj
dHMKQEAgLTIwMzUsMTIgKzIwMzIsMTIgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlSW5s
aW5pbmcoCiAgICAgICAgIAogICAgICAgICBOb2RlKiBteUNhbGxUYXJnZXROb2RlID0gZ2V0RGly
ZWN0KGNhbGxlZVJlZyk7CiAgICAgICAgIAotICAgICAgICBib29sIGlubGluaW5nUmVzdWx0ID0g
YXR0ZW1wdFRvSW5saW5lQ2FsbCgKKyAgICAgICAgYXV0byBpbmxpbmluZ1Jlc3VsdCA9IGhhbmRs
ZUNhbGxWYXJpYW50KAogICAgICAgICAgICAgbXlDYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFu
ZCwgY2FsbExpbmtTdGF0dXNbaV0sIHJlZ2lzdGVyT2Zmc2V0LAotICAgICAgICAgICAgYXJndW1l
bnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQsIGtpbmQsIHByZWRpY3Rpb24sCi0gICAg
ICAgICAgICBpbmxpbmluZ0JhbGFuY2UsIGNvbnRpbnVhdGlvbkJsb2NrLCBbJl0gKENvZGVCbG9j
ayopIHsgfSk7CisgICAgICAgICAgICB0aGlzQXJndW1lbnQsIGFyZ3VtZW50Q291bnRJbmNsdWRp
bmdUaGlzLCBuZXh0T2Zmc2V0LCBraW5kLCBwcmVkaWN0aW9uLAorICAgICAgICAgICAgaW5saW5p
bmdCYWxhbmNlLCBjb250aW51YXRpb25CbG9jaywgZmFsc2UpOwogICAgICAgICAKLSAgICAgICAg
aWYgKCFpbmxpbmluZ1Jlc3VsdCkgeworICAgICAgICBpZiAoaW5saW5pbmdSZXN1bHQgPT0gQ2Fs
bE9wdGltaXphdGlvblJlc3VsdDo6RGlkTm90aGluZykgewogICAgICAgICAgICAgLy8gVGhhdCBm
YWlsZWQgc28gd2UgbGV0IHRoZSBibG9jayBkaWUuIE5vdGhpbmcgaW50ZXJlc3Rpbmcgc2hvdWxk
IGhhdmUgYmVlbiBhZGRlZCB0bwogICAgICAgICAgICAgLy8gdGhlIGJsb2NrLiBXZSBhbHNvIGdp
dmUgdXAgb24gaW5saW5pbmcgYW55IG9mIHRoZSAobGVzcyBmcmVxdWVudCkgY2FsbGVlcy4KICAg
ICAgICAgICAgIEFTU0VSVChtX2dyYXBoLm1fYmxvY2tzLmxhc3QoKSA9PSBtX2N1cnJlbnRCbG9j
ayk7CkBAIC0yMDYxLDcgKzIwNTgsNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxp
bmluZygKICAgICAgICAgICAgIHRoaW5nVG9DYXNlT24gPSBjYWxsTGlua1N0YXR1c1tpXS5leGVj
dXRhYmxlKCk7CiAgICAgICAgIH0KICAgICAgICAgZGF0YS5jYXNlcy5hcHBlbmQoU3dpdGNoQ2Fz
ZShtX2dyYXBoLmZyZWV6ZSh0aGluZ1RvQ2FzZU9uKSwgY2FsbGVlRW50cnlCbG9jaykpOwotICAg
ICAgICBWRVJCT1NFX0xPRygiRmluaXNoZWQgaW5saW5pbmcgIiwgY2FsbExpbmtTdGF0dXNbaV0s
ICIgYXQgIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIi5cbiIpOworICAgICAgICBWRVJCT1NFX0xP
RygiRmluaXNoZWQgb3B0aW1pemluZyAiLCBjYWxsTGlua1N0YXR1c1tpXSwgIiBhdCAiLCBjdXJy
ZW50Q29kZU9yaWdpbigpLCAiLlxuIik7CiAgICAgfQogCiAgICAgLy8gU2xvdyBwYXRoIGJsb2Nr
CkBAIC0yMTAyLDcgKzIwOTksNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmlu
ZygKICAgICBtX2V4aXRPSyA9IHRydWU7CiAgICAgCiAgICAgVkVSQk9TRV9MT0coIkRvbmUgaW5s
aW5pbmcgKGhhcmQpLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwotICAg
IHJldHVybiB0cnVlOworICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpJbmxpbmVk
OwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>327738</attachid>
            <date>2017-11-28 02:38:16 -0800</date>
            <delta_ts>2017-11-28 05:11:36 -0800</delta_ts>
            <desc>Patch for landing</desc>
            <filename>bug-178390-20171128113814.patch</filename>
            <type>text/plain</type>
            <size>39967</size>
            <attacher name="Robin Morisset">rmorisset</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjI1MjA4CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCAy
Y2Q5ZTZkZGQ2ZmNmMGU1ZWQ0ZjFjYjA2N2ZiMjFjNDA2M2Q5ODJkLi42MjcwZTA3YWU3ZDNmNmYx
MTIyZjI2ZjkwM2ZiY2E3Y2NhYjRhMzQ2IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwyNiBAQAorMjAxNy0xMS0yOCAgUm9iaW4gTW9yaXNzZXQgIDxybW9yaXNzZXRAYXBwbGUu
Y29tPgorCisgICAgICAgIFN1cHBvcnQgcmVjdXJzaXZlIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24g
Zm9yIHBvbHltb3JwaGljIGNhbGxzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xNzgzOTAKKworICAgICAgICBSZXZpZXdlZCBieSBTYWFtIEJhcmF0aS4K
KworICAgICAgICBDb21lcyB3aXRoIGEgbGFyZ2UgYnV0IGZhaXJseSBzaW1wbGUgcmVmYWN0b3Jp
bmc6IHRoZSBpbmxpbmluZyBwYXRoIGZvciB2YXJhcmdzIGFuZCBub24tdmFyYXJncyBjYWxscyBu
b3cgY29udmVyZ2UgYSBsb3QgbGF0ZXIsCisgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgcmVkdW5k
YW50IGNoZWNrcywgYW5kIHNpbXBsaWZ5aW5nIGEgZmV3IHBhcnRzIG9mIHRoZSBpbmxpbmluZyBw
aXBlbGluZS4KKworICAgICAgICBBbHNvIHJlbW92ZXMgc29tZSBkZWFkIGNvZGUgZnJvbSBpbmxp
bmVDYWxsKCk6IHRoZXJlIHdhcyBhIHNwZWNpYWwgcGF0aCBmb3Igd2hlbiBtX2NvbnRpbnVhdGlv
bkJsb2NrIGlzIG51bGwsIGJ1dCBpdCBzaG91bGQgbmV2ZXIgYmUgKG5vdyBjaGVja2VkIHdpdGgg
UkVMRUFTRV9BU1NFUlQpLgorCisgICAgICAgICogZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcDoK
KyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlQ2FsbCk6CisgICAgICAg
IChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVZhcmFyZ3NDYWxsKToKKyAgICAgICAg
KEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlUmVjdXJzaXZlVGFpbENhbGwpOgorICAg
ICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjppbmxpbmVDYWxsKToKKyAgICAgICAgKEpT
Qzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6aGFuZGxlQ2FsbFZhcmlhbnQpOgorICAgICAgICAoSlND
OjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVWYXJhcmdzSW5saW5pbmcpOgorICAgICAgICAo
SlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpnZXRJbmxpbmluZ0JhbGFuY2UpOgorICAgICAgICAo
SlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZyk6CisgICAgICAgIChKU0M6
OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmF0dGVtcHRUb0lubGluZUNhbGwpOiBEZWxldGVkLgorCiAy
MDE3LTExLTI3ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgogCiAgICAgICAgIFNw
cmVhZCBjYW4gZXNjYXBlIHdoZW4gQ3JlYXRlUmVzdCBkb2VzIG5vdApkaWZmIC0tZ2l0IGEvU291
cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHAgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNwcAppbmRleCA4N2E4MjA2NGMyNjdm
MDc3NTY5ODUyYWUzOTM3NjA2MTY0MjBiY2FhLi41MTY1NDg5MGQ3NTIxZmIyOWYwNmRkZGIyYWJk
YjljZjlhNTk4NmU2IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5
dGVDb2RlUGFyc2VyLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVD
b2RlUGFyc2VyLmNwcApAQCAtMjI0LDE0ICsyMjQsMTcgQEAgcHJpdmF0ZToKICAgICB2b2lkIGVt
aXRGdW5jdGlvbkNoZWNrcyhDYWxsVmFyaWFudCwgTm9kZSogY2FsbFRhcmdldCwgVmlydHVhbFJl
Z2lzdGVyIHRoaXNBcmd1bW50KTsKICAgICB2b2lkIGVtaXRBcmd1bWVudFBoYW50b21zKGludCBy
ZWdpc3Rlck9mZnNldCwgaW50IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzKTsKICAgICBOb2Rl
KiBnZXRBcmd1bWVudENvdW50KCk7Ci0gICAgYm9vbCBoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChO
b2RlKiBjYWxsVGFyZ2V0Tm9kZSwgY29uc3QgQ2FsbExpbmtTdGF0dXMmLCBpbnQgcmVnaXN0ZXJP
ZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQsIGludCBhcmd1bWVudENvdW50SW5j
bHVkaW5nVGhpcyk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hlY2tzRnVuY3Rvcj4KKyAgICBi
b29sIGhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKENhbGxWYXJpYW50LCBpbnQgcmVnaXN0ZXJPZmZz
ZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgY29uc3QgQ2hlY2tzRnVuY3RvciYg
ZW1pdEZ1bmN0aW9uQ2hlY2tJZk5lZWRlZCk7CiAgICAgdW5zaWduZWQgaW5saW5pbmdDb3N0KENh
bGxWYXJpYW50LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIElubGluZUNhbGxGcmFt
ZTo6S2luZCk7IC8vIFJldHVybiBVSU5UX01BWCBpZiBpdCdzIG5vdCBhbiBpbmxpbmluZyBjYW5k
aWRhdGUuIEJ5IGNvbnZlbnRpb24sIGludHJpbnNpY3MgaGF2ZSBhIGNvc3Qgb2YgMS4KICAgICAv
LyBIYW5kbGUgaW5saW5pbmcuIFJldHVybiB0cnVlIGlmIGl0IHN1Y2NlZWRlZCwgZmFsc2UgaWYg
d2UgbmVlZCB0byBwbGFudCBhIGNhbGwuCi0gICAgYm9vbCBoYW5kbGVJbmxpbmluZyhOb2RlKiBj
YWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiwg
aW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBWaXJ0dWFs
UmVnaXN0ZXIgYXJndW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwgaW50
IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBOb2RlVHlw
ZSBjYWxsT3AsIElubGluZUNhbGxGcmFtZTo6S2luZCwgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlv
bik7Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hlY2tzRnVuY3Rvcj4KLSAgICBib29sIGF0dGVt
cHRUb0lubGluZUNhbGwoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBD
YWxsVmFyaWFudCwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGlu
Z1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIElubGluZUNhbGxGcmFtZTo6S2luZCwgU3BlY3Vs
YXRlZFR5cGUgcHJlZGljdGlvbiwgdW5zaWduZWQmIGlubGluaW5nQmFsYW5jZSwgQmFzaWNCbG9j
ayogY29udGludWF0aW9uQmxvY2ssIGNvbnN0IENoZWNrc0Z1bmN0b3ImIGluc2VydENoZWNrcyk7
CisgICAgYm9vbCBoYW5kbGVWYXJhcmdzSW5saW5pbmcoTm9kZSogY2FsbFRhcmdldE5vZGUsIGlu
dCByZXN1bHRPcGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYsIGludCByZWdpc3Rlck9mZnNl
dCwgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgVmlydHVhbFJlZ2lzdGVyIGFyZ3VtZW50
c0FyZ3VtZW50LCB1bnNpZ25lZCBhcmd1bWVudHNPZmZzZXQsIE5vZGVUeXBlIGNhbGxPcCwgSW5s
aW5lQ2FsbEZyYW1lOjpLaW5kKTsKKyAgICB1bnNpZ25lZCBnZXRJbmxpbmluZ0JhbGFuY2UoY29u
c3QgQ2FsbExpbmtTdGF0dXMmLCBDb2RlU3BlY2lhbGl6YXRpb25LaW5kKTsKKyAgICBlbnVtIGNs
YXNzIENhbGxPcHRpbWl6YXRpb25SZXN1bHQgeyBPcHRpbWl6ZWRUb0p1bXAsIElubGluZWQsIERp
ZE5vdGhpbmcgfTsKKyAgICBDYWxsT3B0aW1pemF0aW9uUmVzdWx0IGhhbmRsZUNhbGxWYXJpYW50
KE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZhcmlhbnQsIGlu
dCByZWdpc3Rlck9mZnNldCwgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwgaW50IGFyZ3Vt
ZW50Q291bnRJbmNsdWRpbmdUaGlzLCB1bnNpZ25lZCBuZXh0T2Zmc2V0LCBJbmxpbmVDYWxsRnJh
bWU6OktpbmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRpY3Rpb24sIHVuc2lnbmVkJiBpbmxpbmluZ0Jh
bGFuY2UsIEJhc2ljQmxvY2sqIGNvbnRpbnVhdGlvbkJsb2NrLCBib29sIG5lZWRzVG9DaGVja0Nh
bGxlZSk7CisgICAgQ2FsbE9wdGltaXphdGlvblJlc3VsdCBoYW5kbGVJbmxpbmluZyhOb2RlKiBj
YWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIGNvbnN0IENhbGxMaW5rU3RhdHVzJiwg
aW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LCBpbnQgYXJn
dW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQsIE5vZGVUeXBlIGNh
bGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uKTsK
ICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgotICAgIHZvaWQgaW5saW5lQ2Fs
bChOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXJpYW50LCBp
bnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWdu
ZWQgbmV4dE9mZnNldCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kLCBCYXNpY0Jsb2NrKiBjb250aW51
YXRpb25CbG9jaywgY29uc3QgQ2hlY2tzRnVuY3RvciYgaW5zZXJ0Q2hlY2tzKTsKKyAgICB2b2lk
IGlubGluZUNhbGwoTm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLCBDYWxs
VmFyaWFudCwgaW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1Ro
aXMsIElubGluZUNhbGxGcmFtZTo6S2luZCwgQmFzaWNCbG9jayogY29udGludWF0aW9uQmxvY2ss
IGNvbnN0IENoZWNrc0Z1bmN0b3ImIGluc2VydENoZWNrcyk7CiAgICAgLy8gSGFuZGxlIGludHJp
bnNpYyBmdW5jdGlvbnMuIFJldHVybiB0cnVlIGlmIGl0IHN1Y2NlZWRlZCwgZmFsc2UgaWYgd2Ug
bmVlZCB0byBwbGFudCBhIGNhbGwuCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hlY2tzRnVuY3Rv
cj4KICAgICBib29sIGhhbmRsZUludHJpbnNpY0NhbGwoTm9kZSogY2FsbGVlLCBpbnQgcmVzdWx0
T3BlcmFuZCwgSW50cmluc2ljLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50
SW5jbHVkaW5nVGhpcywgU3BlY3VsYXRlZFR5cGUgcHJlZGljdGlvbiwgY29uc3QgQ2hlY2tzRnVu
Y3RvciYgaW5zZXJ0Q2hlY2tzKTsKQEAgLTEyMzQsNyArMTIzNyw3IEBAIEJhc2ljQmxvY2sqIEJ5
dGVDb2RlUGFyc2VyOjphbGxvY2F0ZVVudGFyZ2V0YWJsZUJsb2NrKCkKIAogdm9pZCBCeXRlQ29k
ZVBhcnNlcjo6bWFrZUJsb2NrVGFyZ2V0YWJsZShCYXNpY0Jsb2NrKiBibG9jaywgdW5zaWduZWQg
Ynl0ZWNvZGVJbmRleCkKIHsKLSAgICBBU1NFUlQoYmxvY2stPmJ5dGVjb2RlQmVnaW4gPT0gVUlO
VF9NQVgpOworICAgIFJFTEVBU0VfQVNTRVJUKGJsb2NrLT5ieXRlY29kZUJlZ2luID09IFVJTlRf
TUFYKTsKICAgICBibG9jay0+Ynl0ZWNvZGVCZWdpbiA9IGJ5dGVjb2RlSW5kZXg7CiAgICAgLy8g
bV9ibG9ja0xpbmtpbmdUYXJnZXRzIG11c3QgYWx3YXlzIGJlIHNvcnRlZCBpbiBpbmNyZWFzaW5n
IG9yZGVyIG9mIGJ5dGVjb2RlQmVnaW4KICAgICBpZiAobV9pbmxpbmVTdGFja1RvcC0+bV9ibG9j
a0xpbmtpbmdUYXJnZXRzLnNpemUoKSkKQEAgLTEyOTYsMjEgKzEyOTksMTUgQEAgQnl0ZUNvZGVQ
YXJzZXI6OlRlcm1pbmFsaXR5IEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVDYWxsKAogICAgIAogICAg
IFZFUkJPU0VfTE9HKCIgICAgSGFuZGxpbmcgY2FsbCBhdCAiLCBjdXJyZW50Q29kZU9yaWdpbigp
LCAiOiAiLCBjYWxsTGlua1N0YXR1cywgIlxuIik7CiAgICAgCi0gICAgLy8gV2UgZmlyc3QgY2hl
Y2sgdGhhdCB3ZSBoYXZlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNhbGwsIGFu
ZCB0aGF0IGl0IGRpZCBub3QgYmVoYXZlIHRvbyBwb2x5bW9ycGhpY2FsbHkuCisgICAgLy8gSWYg
d2UgaGF2ZSBwcm9maWxpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBjYWxsLCBhbmQgaXQgZGlk
IG5vdCBiZWhhdmUgdG9vIHBvbHltb3JwaGljYWxseSwKKyAgICAvLyB3ZSBtYXkgYmUgYWJsZSB0
byBpbmxpbmUgaXQsIG9yIGluIHRoZSBjYXNlIG9mIHJlY3Vyc2l2ZSB0YWlsIGNhbGxzIHR1cm4g
aXQgaW50byBhIGp1bXAuCiAgICAgaWYgKGNhbGxMaW5rU3RhdHVzLmNhbk9wdGltaXplKCkpIHsK
ICAgICAgICAgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCA9IHZpcnR1YWxSZWdpc3RlckZv
ckFyZ3VtZW50KDAsIHJlZ2lzdGVyT2Zmc2V0KTsKLQotICAgICAgICBpZiAob3AgPT0gVGFpbENh
bGwgJiYgaGFuZGxlUmVjdXJzaXZlVGFpbENhbGwoY2FsbFRhcmdldCwgY2FsbExpbmtTdGF0dXMs
IHJlZ2lzdGVyT2Zmc2V0LCB0aGlzQXJndW1lbnQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlz
KSkKKyAgICAgICAgYXV0byBvcHRpbWl6YXRpb25SZXN1bHQgPSBoYW5kbGVJbmxpbmluZyhjYWxs
VGFyZ2V0LCByZXN1bHQsIGNhbGxMaW5rU3RhdHVzLCByZWdpc3Rlck9mZnNldCwgdGhpc0FyZ3Vt
ZW50LAorICAgICAgICAgICAgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG1fY3VycmVudElu
ZGV4ICsgaW5zdHJ1Y3Rpb25TaXplLCBvcCwga2luZCwgcHJlZGljdGlvbik7CisgICAgICAgIGlm
IChvcHRpbWl6YXRpb25SZXN1bHQgPT0gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6T3B0aW1pemVk
VG9KdW1wKQogICAgICAgICAgICAgcmV0dXJuIFRlcm1pbmFsOwotCi0gICAgICAgIC8vIElubGlu
aW5nIGlzIHF1aXRlIGNvbXBsZXgsIGFuZCBtYW5hZ2VkIGJ5IGEgcGlwZWxpbmUgb2YgZnVuY3Rp
b25zOgotICAgICAgICAvLyBoYW5kbGUoVmFyYXJncylDYWxsIC0+IGhhbmRsZUlubGluaW5nIC0+
IGF0dGVtcHRUb0lubGluZUNhbGwgLT4gaW5saW5lQ2FsbAotICAgICAgICAvLyAtIGhhbmRsZUNh
bGwgYW5kIGhhbmRsZVZhcmFyZ3NDYWxsIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBubyBpbmxp
bmluZyBoYXBwZW5zLCBhbmQgZG8gc29tZSBzYW5pdHkgY2hlY2tzIG9uIHRoZWlyIGFyZ3VtZW50
cwotICAgICAgICAvLyAtIGhhbmRsZUlubGluaW5nIGNoZWNrcyB3aGV0aGVyIHRoZSBjYWxsIGlz
IHBvbHltb3JwaGljLCBhbmQgaWYgc28gaXMgcmVzcG9uc2libGUgZm9yIGluc2VydGluZyBhIHN3
aXRjaCBvbiB0aGUgY2FsbGVlCi0gICAgICAgIC8vIC0gYXR0ZW1wdFRvSW5saW5lQ2FsbCBkZWFs
cyB3aXRoIHNwZWNpYWwgY2FzZXMgc3VjaCBhcyBpbnRyaW5zaWNzLCBpdCBhbHNvIGNoZWNrcyB0
aGUgaW5saW5pbmcgaGV1cmlzdGljICh0aHJvdWdoIGlubGluaW5nQ29zdCkKLSAgICAgICAgLy8g
LSBpbmxpbmVDYWxsIGZpbmFsbHkgZG9lcyB0aGUgYWN0dWFsIGlubGluaW5nLCBhZnRlciBhIGNv
bXBsaWNhdGVkIHByb2NlZHVyZSB0byBzZXR1cCB0aGUgc3RhY2sgY29ycmVjdGx5Ci0gICAgICAg
IHVuc2lnbmVkIG5leHRPZmZzZXQgPSBtX2N1cnJlbnRJbmRleCArIGluc3RydWN0aW9uU2l6ZTsK
LSAgICAgICAgaWYgKGhhbmRsZUlubGluaW5nKGNhbGxUYXJnZXQsIHJlc3VsdCwgY2FsbExpbmtT
dGF0dXMsIHJlZ2lzdGVyT2Zmc2V0LCB0aGlzQXJndW1lbnQsIFZpcnR1YWxSZWdpc3RlcigpLCAw
LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgbmV4dE9mZnNldCwgb3AsIGtpbmQsIHByZWRp
Y3Rpb24pKSB7CisgICAgICAgIGlmIChvcHRpbWl6YXRpb25SZXN1bHQgPT0gQ2FsbE9wdGltaXph
dGlvblJlc3VsdDo6SW5saW5lZCkgewogICAgICAgICAgICAgaWYgKFVOTElLRUxZKG1fZ3JhcGgu
Y29tcGlsYXRpb24oKSkpCiAgICAgICAgICAgICAgICAgbV9ncmFwaC5jb21waWxhdGlvbigpLT5u
b3RpY2VJbmxpbmVkQ2FsbCgpOwogICAgICAgICAgICAgcmV0dXJuIE5vblRlcm1pbmFsOwpAQCAt
MTM0NywxMSArMTM0NCwxNSBAQCBCeXRlQ29kZVBhcnNlcjo6VGVybWluYWxpdHkgQnl0ZUNvZGVQ
YXJzZXI6OmhhbmRsZVZhcmFyZ3NDYWxsKEluc3RydWN0aW9uKiBwYywgTgogICAgIAogICAgIFZF
UkJPU0VfTE9HKCIgICAgVmFyYXJncyBjYWxsIGxpbmsgc3RhdHVzIGF0ICIsIGN1cnJlbnRDb2Rl
T3JpZ2luKCksICI6ICIsIGNhbGxMaW5rU3RhdHVzLCAiXG4iKTsKICAgICAKLSAgICBpZiAoY2Fs
bExpbmtTdGF0dXMuY2FuT3B0aW1pemUoKQotICAgICAgICAmJiBoYW5kbGVJbmxpbmluZyhjYWxs
VGFyZ2V0LCByZXN1bHQsIGNhbGxMaW5rU3RhdHVzLCBmaXJzdEZyZWVSZWcsIFZpcnR1YWxSZWdp
c3Rlcih0aGlzUmVnKSwgVmlydHVhbFJlZ2lzdGVyKGFyZ3VtZW50cyksIGZpcnN0VmFyQXJnT2Zm
c2V0LCAwLCBtX2N1cnJlbnRJbmRleCArIE9QQ09ERV9MRU5HVEgob3BfY2FsbF92YXJhcmdzKSwg
b3AsIElubGluZUNhbGxGcmFtZTo6dmFyYXJnc0tpbmRGb3IoY2FsbE1vZGUpLCBwcmVkaWN0aW9u
KSkgewotICAgICAgICBpZiAoVU5MSUtFTFkobV9ncmFwaC5jb21waWxhdGlvbigpKSkKLSAgICAg
ICAgICAgIG1fZ3JhcGguY29tcGlsYXRpb24oKS0+bm90aWNlSW5saW5lZENhbGwoKTsKLSAgICAg
ICAgcmV0dXJuIE5vblRlcm1pbmFsOworICAgIGlmIChjYWxsTGlua1N0YXR1cy5jYW5PcHRpbWl6
ZSgpKSB7CisgICAgICAgIGlmIChoYW5kbGVWYXJhcmdzSW5saW5pbmcoY2FsbFRhcmdldCwgcmVz
dWx0LAorICAgICAgICAgICAgY2FsbExpbmtTdGF0dXMsIGZpcnN0RnJlZVJlZywgVmlydHVhbFJl
Z2lzdGVyKHRoaXNSZWcpLCBWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRzKSwKKyAgICAgICAgICAg
IGZpcnN0VmFyQXJnT2Zmc2V0LCBvcCwKKyAgICAgICAgICAgIElubGluZUNhbGxGcmFtZTo6dmFy
YXJnc0tpbmRGb3IoY2FsbE1vZGUpKSkgeworICAgICAgICAgICAgaWYgKFVOTElLRUxZKG1fZ3Jh
cGguY29tcGlsYXRpb24oKSkpCisgICAgICAgICAgICAgICAgbV9ncmFwaC5jb21waWxhdGlvbigp
LT5ub3RpY2VJbmxpbmVkQ2FsbCgpOworICAgICAgICAgICAgcmV0dXJuIE5vblRlcm1pbmFsOwor
ICAgICAgICB9CiAgICAgfQogICAgIAogICAgIENhbGxWYXJhcmdzRGF0YSogZGF0YSA9IG1fZ3Jh
cGgubV9jYWxsVmFyYXJnc0RhdGEuYWRkKCk7CkBAIC0xNDIwLDE3ICsxNDIxLDEzIEBAIHZvaWQg
Qnl0ZUNvZGVQYXJzZXI6OmVtaXRBcmd1bWVudFBoYW50b21zKGludCByZWdpc3Rlck9mZnNldCwg
aW50IGFyZ3VtZW50Q291bnRJCiAgICAgICAgIGFkZFRvR3JhcGgoUGhhbnRvbSwgZ2V0KHZpcnR1
YWxSZWdpc3RlckZvckFyZ3VtZW50KGksIHJlZ2lzdGVyT2Zmc2V0KSkpOwogfQogCi1ib29sIEJ5
dGVDb2RlUGFyc2VyOjpoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9k
ZSwgY29uc3QgQ2FsbExpbmtTdGF0dXMmIGNhbGxMaW5rU3RhdHVzLCBpbnQgcmVnaXN0ZXJPZmZz
ZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQsIGludCBhcmd1bWVudENvdW50SW5jbHVk
aW5nVGhpcykKK3RlbXBsYXRlPHR5cGVuYW1lIENoZWNrc0Z1bmN0b3I+Citib29sIEJ5dGVDb2Rl
UGFyc2VyOjpoYW5kbGVSZWN1cnNpdmVUYWlsQ2FsbChDYWxsVmFyaWFudCBjYWxsVmFyaWFudCwg
aW50IHJlZ2lzdGVyT2Zmc2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIGNvbnN0
IENoZWNrc0Z1bmN0b3ImIGVtaXRGdW5jdGlvbkNoZWNrSWZOZWVkZWQpCiB7CiAgICAgaWYgKFVO
TElLRUxZKCFPcHRpb25zOjpvcHRpbWl6ZVJlY3Vyc2l2ZVRhaWxDYWxscygpKSkKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCi0gICAgLy8gRklYTUU6IFdlIGN1cnJlbnRseSBvbmx5IGRvIHRoaXMg
b3B0aW1pc2F0aW9uIGluIHRoZSBzaW1wbGUsIG5vbi1wb2x5bW9ycGhpYyBjYXNlLgotICAgIC8v
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzgzOTAKLSAgICBpZiAo
Y2FsbExpbmtTdGF0dXMuY291bGRUYWtlU2xvd1BhdGgoKSB8fCBjYWxsTGlua1N0YXR1cy5zaXpl
KCkgIT0gMSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byB0YXJnZXRFeGVjdXRh
YmxlID0gY2FsbExpbmtTdGF0dXNbMF0uZXhlY3V0YWJsZSgpOworICAgIGF1dG8gdGFyZ2V0RXhl
Y3V0YWJsZSA9IGNhbGxWYXJpYW50LmV4ZWN1dGFibGUoKTsKICAgICBJbmxpbmVTdGFja0VudHJ5
KiBzdGFja0VudHJ5ID0gbV9pbmxpbmVTdGFja1RvcDsKICAgICBkbyB7CiAgICAgICAgIGlmICh0
YXJnZXRFeGVjdXRhYmxlICE9IHN0YWNrRW50cnktPmV4ZWN1dGFibGUoKSkKQEAgLTE0NTAsNyAr
MTQ0Nyw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZVJlY3Vyc2l2ZVRhaWxDYWxsKE5v
ZGUqIGNhbGxUYXJnZXROb2RlLCBjb25zdCBDYWxsTGluCiAgICAgICAgIH0KIAogICAgICAgICAv
LyBXZSBtdXN0IGFkZCBzb21lIGNoZWNrIHRoYXQgdGhlIHByb2ZpbGluZyBpbmZvcm1hdGlvbiB3
YXMgY29ycmVjdCBhbmQgdGhlIHRhcmdldCBvZiB0aGlzIGNhbGwgaXMgd2hhdCB3ZSB0aG91Z2h0
Ci0gICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsTGlua1N0YXR1c1swXSwgY2FsbFRhcmdl
dE5vZGUsIHRoaXNBcmd1bWVudCk7CisgICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrSWZOZWVkZWQo
KTsKIAogICAgICAgICAvLyBXZSBtdXN0IHNldCB0aGUgYXJndW1lbnRzIHRvIHRoZSByaWdodCB2
YWx1ZXMKICAgICAgICAgaW50IGFyZ0luZGV4ID0gMDsKQEAgLTE1OTEsOCArMTU4OCw5IEBAIHVu
c2lnbmVkIEJ5dGVDb2RlUGFyc2VyOjppbmxpbmluZ0Nvc3QoQ2FsbFZhcmlhbnQgY2FsbGVlLCBp
bnQgYXJndW1lbnRDb3VudEluY2x1CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNrc0Z1bmN0
b3I+Ci12b2lkIEJ5dGVDb2RlUGFyc2VyOjppbmxpbmVDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2Rl
LCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZhcmlhbnQgY2FsbGVlLCBpbnQgcmVnaXN0ZXJPZmZz
ZXQsIGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwg
SW5saW5lQ2FsbEZyYW1lOjpLaW5kIGtpbmQsIEJhc2ljQmxvY2sqIGNvbnRpbnVhdGlvbkJsb2Nr
LCBjb25zdCBDaGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpCit2b2lkIEJ5dGVDb2RlUGFyc2Vy
OjppbmxpbmVDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2Fs
bFZhcmlhbnQgY2FsbGVlLCBpbnQgcmVnaXN0ZXJPZmZzZXQsIGludCBhcmd1bWVudENvdW50SW5j
bHVkaW5nVGhpcywgSW5saW5lQ2FsbEZyYW1lOjpLaW5kIGtpbmQsIEJhc2ljQmxvY2sqIGNvbnRp
bnVhdGlvbkJsb2NrLCBjb25zdCBDaGVja3NGdW5jdG9yJiBpbnNlcnRDaGVja3MpCiB7CisgICAg
SW5zdHJ1Y3Rpb24qIHNhdmVkQ3VycmVudEluc3RydWN0aW9uID0gbV9jdXJyZW50SW5zdHJ1Y3Rp
b247CiAgICAgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQgPSBJbmxp
bmVDYWxsRnJhbWU6OnNwZWNpYWxpemF0aW9uS2luZEZvcihraW5kKTsKICAgICAKICAgICBBU1NF
UlQoaW5saW5pbmdDb3N0KGNhbGxlZSwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIGtpbmQp
ICE9IFVJTlRfTUFYKTsKQEAgLTE3MjIsMjUwICsxNzIwLDI1MSBAQCB2b2lkIEJ5dGVDb2RlUGFy
c2VyOjppbmxpbmVDYWxsKE5vZGUqIGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwg
Q2FsbFZhcgogCiAgICAgbGlua0Jsb2NrcyhpbmxpbmVTdGFja0VudHJ5Lm1fdW5saW5rZWRCbG9j
a3MsIGlubGluZVN0YWNrRW50cnkubV9ibG9ja0xpbmtpbmdUYXJnZXRzKTsKICAgICAKLSAgICAv
LyBJZiB0aGUgY2FsbGVlIHJldHVybmVkIGF0IGxlYXN0IG9uY2UsIGl0IHByZXBhcmVkIGEgY29u
dGludWF0aW9uIGJsb2NrIGZvciB1cy4KLSAgICBpZiAoaW5saW5lU3RhY2tFbnRyeS5tX2NvbnRp
bnVhdGlvbkJsb2NrKQotICAgICAgICBtX2N1cnJlbnRCbG9jayA9IGlubGluZVN0YWNrRW50cnku
bV9jb250aW51YXRpb25CbG9jazsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gV2UgYXJlIGluIHRo
ZSBjYXNlIHdoZXJlIHRoZSBjYWxsZWUgbmV2ZXIgcmV0dXJucyAoZm9yIGV4YW1wbGUgaXQgbG9v
cHMgZm9yZXZlcikuCi0gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgYWxsIGJsb2NrcyBzaG91bGQg
ZW5kIGluIGEgdGVybWluYWwuCi0gICAgICAgIEFTU0VSVChtX2dyYXBoLmxhc3RCbG9jaygpLT50
ZXJtaW5hbCgpKTsKLSAgICAgICAgLy8gV2UgdGhlbiBhbGxvY2F0ZSBhIG5ldyBibG9jayB0byBj
b250aW51ZSBpbi4KLSAgICAgICAgbV9jdXJyZW50QmxvY2sgPSBhbGxvY2F0ZVRhcmdldGFibGVC
bG9jayhuZXh0T2Zmc2V0KTsKLSAgICB9Ci0gICAgQVNTRVJUKG1fY3VycmVudEJsb2NrKTsKKyAg
ICAvLyBUaGVyZSBpcyBhbiBpbnZhcmlhbnQgdGhhdCB3ZSB1c2UgaGVyZTogZXZlcnkgZnVuY3Rp
b24gaGFzIGF0IGxlYXN0IG9uZSBvcF9yZXQgc29tZXdoZXJlLgorICAgIC8vIEFuZCB3aGVuIHBh
cnNlQmxvY2sgZW5jb3VudGVycyBhbiBvcF9yZXQsIGl0IHNldHVwcyBhIGNvbnRpbnVhdGlvbiBi
bG9jayBpZiB0aGVyZSB3YXMgbm9uZS4KKyAgICAvLyBJZiB0aGlzIGludmFyaWFudCB3YXMgdG8g
YmUgY2hhbmdlZCwgd2Ugd291bGQgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBoZXJlIGlu
IHRoZSBjYXNlIHdoZXJlIHRoZXJlIHdhcyBubyBjb250aW51YXRpb24gYmxvY2sgcmVhZHkuCisg
ICAgUkVMRUFTRV9BU1NFUlQoaW5saW5lU3RhY2tFbnRyeS5tX2NvbnRpbnVhdGlvbkJsb2NrKTsK
KyAgICBtX2N1cnJlbnRCbG9jayA9IGlubGluZVN0YWNrRW50cnkubV9jb250aW51YXRpb25CbG9j
azsKICAgICBBU1NFUlQoIW1fY3VycmVudEJsb2NrLT50ZXJtaW5hbCgpKTsKIAogICAgIHByZXBh
cmVUb1BhcnNlQmxvY2soKTsKKyAgICBtX2N1cnJlbnRJbnN0cnVjdGlvbiA9IHNhdmVkQ3VycmVu
dEluc3RydWN0aW9uOwogfQogCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGVja3NGdW5jdG9yPgotYm9v
bCBCeXRlQ29kZVBhcnNlcjo6YXR0ZW1wdFRvSW5saW5lQ2FsbChOb2RlKiBjYWxsVGFyZ2V0Tm9k
ZSwgaW50IHJlc3VsdE9wZXJhbmQsIENhbGxWYXJpYW50IGNhbGxlZSwgaW50IHJlZ2lzdGVyT2Zm
c2V0LCBpbnQgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHVuc2lnbmVkIG5leHRPZmZzZXQs
IElubGluZUNhbGxGcmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVkVHlwZSBwcmVkaWN0aW9uLCB1
bnNpZ25lZCYgaW5saW5pbmdCYWxhbmNlLCBCYXNpY0Jsb2NrKiBjb250aW51YXRpb25CbG9jaywg
Y29uc3QgQ2hlY2tzRnVuY3RvciYgaW5zZXJ0Q2hlY2tzKQorQnl0ZUNvZGVQYXJzZXI6OkNhbGxP
cHRpbWl6YXRpb25SZXN1bHQgQnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGxWYXJpYW50KE5vZGUq
IGNhbGxUYXJnZXROb2RlLCBpbnQgcmVzdWx0T3BlcmFuZCwgQ2FsbFZhcmlhbnQgY2FsbGVlLCBp
bnQgcmVnaXN0ZXJPZmZzZXQsIFZpcnR1YWxSZWdpc3RlciB0aGlzQXJndW1lbnQsIGludCBhcmd1
bWVudENvdW50SW5jbHVkaW5nVGhpcywgdW5zaWduZWQgbmV4dE9mZnNldCwgSW5saW5lQ2FsbEZy
YW1lOjpLaW5kIGtpbmQsIFNwZWN1bGF0ZWRUeXBlIHByZWRpY3Rpb24sIHVuc2lnbmVkJiBpbmxp
bmluZ0JhbGFuY2UsIEJhc2ljQmxvY2sqIGNvbnRpbnVhdGlvbkJsb2NrLCBib29sIG5lZWRzVG9D
aGVja0NhbGxlZSkKIHsKLSAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIHNwZWNpYWxpemF0aW9u
S2luZCA9IElubGluZUNhbGxGcmFtZTo6c3BlY2lhbGl6YXRpb25LaW5kRm9yKGtpbmQpOwotICAg
IAotICAgIGlmICghaW5saW5pbmdCYWxhbmNlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
CiAgICAgVkVSQk9TRV9MT0coIiAgICBDb25zaWRlcmluZyBjYWxsZWUgIiwgY2FsbGVlLCAiXG4i
KTsKLSAgICAKLSAgICAvLyBJbnRyaW5zaWNzIGFuZCBpbnRlcm5hbCBmdW5jdGlvbnMgY2FuIG9u
bHkgYmUgaW5saW5lZCBpZiB3ZSdyZSBub3QgZG9pbmcgdmFyYXJncy4gVGhpcyBpcyBiZWNhdXNl
Ci0gICAgLy8gd2UgY3VycmVudGx5IGRvbid0IGhhdmUgYW55IHdheSBvZiBnZXR0aW5nIHByb2Zp
bGluZyBpbmZvcm1hdGlvbiBmb3IgYXJndW1lbnRzIHRvIG5vbi1KUyB2YXJhcmdzCi0gICAgLy8g
Y2FsbHMuIFRoZSBwcmVkaWN0aW9uIHByb3BhZ2F0b3Igd29uJ3QgYmUgb2YgYW55IGhlbHAgYmVj
YXVzZSBMb2FkVmFyYXJncyBvYnNjdXJlcyB0aGUgZGF0YSBmbG93LAotICAgIC8vIGFuZCB0aGVy
ZSBhcmUgbm8gY2FsbHNpdGUgdmFsdWUgcHJvZmlsZXMgYW5kIG5hdGl2ZSBmdW5jdGlvbiB3b24n
dCBoYXZlIGNhbGxlZSB2YWx1ZSBwcm9maWxlcyBmb3IKLSAgICAvLyB0aG9zZSBhcmd1bWVudHMu
IEV2ZW4gd29yc2UsIGlmIHRoZSBpbnRyaW5zaWMgZGVjaWRlcyB0byBleGl0LCBpdCB3b24ndCBy
ZWFsbHkgaGF2ZSBhbnl3aGVyZSB0bwotICAgIC8vIGV4aXQgdG86IExvYWRWYXJhcmdzIGlzIGVm
ZmVjdGZ1bCBhbmQgaXQncyBwYXJ0IG9mIHRoZSBvcF9jYWxsX3ZhcmFyZ3MsIHNvIHdlIGNhbid0
IGV4aXQgd2l0aG91dAotICAgIC8vIGNhbGxpbmcgTG9hZFZhcmFyZ3MgdHdpY2UuCi0gICAgaWYg
KCFJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhraW5kKSkgewogCi0gICAgICAgIGJvb2wgZGlk
SW5zZXJ0Q2hlY2tzID0gZmFsc2U7Ci0gICAgICAgIGF1dG8gaW5zZXJ0Q2hlY2tzV2l0aEFjY291
bnRpbmcgPSBbJl0gKCkgewotICAgICAgICAgICAgaW5zZXJ0Q2hlY2tzKG51bGxwdHIpOwotICAg
ICAgICAgICAgZGlkSW5zZXJ0Q2hlY2tzID0gdHJ1ZTsKLSAgICAgICAgfTsKKyAgICBib29sIGRp
ZEluc2VydENoZWNrcyA9IGZhbHNlOworICAgIGF1dG8gaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRp
bmcgPSBbJl0gKCkgeworICAgICAgICBpZiAobmVlZHNUb0NoZWNrQ2FsbGVlKQorICAgICAgICAg
ICAgZW1pdEZ1bmN0aW9uQ2hlY2tzKGNhbGxlZSwgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVu
dCk7CisgICAgICAgIGRpZEluc2VydENoZWNrcyA9IHRydWU7CisgICAgfTsKIAotICAgICAgICBh
dXRvIGVuZFNwZWNpYWxDYXNlID0gWyZdICgpIHsKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
KGRpZEluc2VydENoZWNrcyk7Ci0gICAgICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20sIGNhbGxU
YXJnZXROb2RlKTsKLSAgICAgICAgICAgIGVtaXRBcmd1bWVudFBoYW50b21zKHJlZ2lzdGVyT2Zm
c2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcyk7Ci0gICAgICAgICAgICBpbmxpbmluZ0Jh
bGFuY2UtLTsKLSAgICAgICAgICAgIGlmIChjb250aW51YXRpb25CbG9jaykgewotICAgICAgICAg
ICAgICAgIG1fY3VycmVudEluZGV4ID0gbmV4dE9mZnNldDsKLSAgICAgICAgICAgICAgICBtX2V4
aXRPSyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzc1NldExvY2FsUXVldWUoKTsKLSAg
ICAgICAgICAgICAgICBhZGRKdW1wVG8oY29udGludWF0aW9uQmxvY2spOwotICAgICAgICAgICAg
fQotICAgICAgICB9OwotICAgIAotICAgICAgICBpZiAoSW50ZXJuYWxGdW5jdGlvbiogZnVuY3Rp
b24gPSBjYWxsZWUuaW50ZXJuYWxGdW5jdGlvbigpKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxl
Q29uc3RhbnRJbnRlcm5hbEZ1bmN0aW9uKGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBm
dW5jdGlvbiwgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBzcGVj
aWFsaXphdGlvbktpbmQsIHByZWRpY3Rpb24sIGluc2VydENoZWNrc1dpdGhBY2NvdW50aW5nKSkg
ewotICAgICAgICAgICAgICAgIGVuZFNwZWNpYWxDYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSRUxFQVNFX0FTU0VSVCghZGlk
SW5zZXJ0Q2hlY2tzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoa2luZCA9
PSBJbmxpbmVDYWxsRnJhbWU6OlRhaWxDYWxsICYmIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVSZWN1
cnNpdmVUYWlsQ2FsbChjYWxsZWUsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVk
aW5nVGhpcywgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRpbmcpKSB7CisgICAgICAgIFJFTEVBU0Vf
QVNTRVJUKGRpZEluc2VydENoZWNrcyk7CisgICAgICAgIHJldHVybiBDYWxsT3B0aW1pemF0aW9u
UmVzdWx0OjpPcHRpbWl6ZWRUb0p1bXA7CisgICAgfQorICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJ
bnNlcnRDaGVja3MpOworCisgICAgaWYgKCFpbmxpbmluZ0JhbGFuY2UpCisgICAgICAgIHJldHVy
biBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpEaWROb3RoaW5nOworCisgICAgQ29kZVNwZWNpYWxp
emF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQgPSBJbmxpbmVDYWxsRnJhbWU6OnNwZWNpYWxp
emF0aW9uS2luZEZvcihraW5kKTsKKworICAgIGF1dG8gZW5kU3BlY2lhbENhc2UgPSBbJl0gKCkg
eworICAgICAgICBSRUxFQVNFX0FTU0VSVChkaWRJbnNlcnRDaGVja3MpOworICAgICAgICBhZGRU
b0dyYXBoKFBoYW50b20sIGNhbGxUYXJnZXROb2RlKTsKKyAgICAgICAgZW1pdEFyZ3VtZW50UGhh
bnRvbXMocmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzKTsKKyAgICAg
ICAgaW5saW5pbmdCYWxhbmNlLS07CisgICAgICAgIGlmIChjb250aW51YXRpb25CbG9jaykgewor
ICAgICAgICAgICAgbV9jdXJyZW50SW5kZXggPSBuZXh0T2Zmc2V0OworICAgICAgICAgICAgbV9l
eGl0T0sgPSB0cnVlOworICAgICAgICAgICAgcHJvY2Vzc1NldExvY2FsUXVldWUoKTsKKyAgICAg
ICAgICAgIGFkZEp1bXBUbyhjb250aW51YXRpb25CbG9jayk7CiAgICAgICAgIH0KLSAgICAKLSAg
ICAgICAgSW50cmluc2ljIGludHJpbnNpYyA9IGNhbGxlZS5pbnRyaW5zaWNGb3Ioc3BlY2lhbGl6
YXRpb25LaW5kKTsKLSAgICAgICAgaWYgKGludHJpbnNpYyAhPSBOb0ludHJpbnNpYykgewotICAg
ICAgICAgICAgaWYgKGhhbmRsZUludHJpbnNpY0NhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9w
ZXJhbmQsIGludHJpbnNpYywgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdU
aGlzLCBwcmVkaWN0aW9uLCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykpIHsKLSAgICAgICAg
ICAgICAgICBlbmRTcGVjaWFsQ2FzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwot
ICAgICAgICAgICAgfQorICAgIH07CiAKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUKCFkaWRJ
bnNlcnRDaGVja3MpOwotICAgICAgICAgICAgLy8gV2UgbWlnaHQgc3RpbGwgdHJ5IHRvIGlubGlu
ZSB0aGUgSW50cmluc2ljIGJlY2F1c2UgaXQgbWlnaHQgYmUgYSBidWlsdGluIEpTIGZ1bmN0aW9u
LgorICAgIGlmIChJbnRlcm5hbEZ1bmN0aW9uKiBmdW5jdGlvbiA9IGNhbGxlZS5pbnRlcm5hbEZ1
bmN0aW9uKCkpIHsKKyAgICAgICAgaWYgKGhhbmRsZUNvbnN0YW50SW50ZXJuYWxGdW5jdGlvbihj
YWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgZnVuY3Rpb24sIHJlZ2lzdGVyT2Zmc2V0LCBh
cmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgc3BlY2lhbGl6YXRpb25LaW5kLCBwcmVkaWN0aW9u
LCBpbnNlcnRDaGVja3NXaXRoQWNjb3VudGluZykpIHsKKyAgICAgICAgICAgIGVuZFNwZWNpYWxD
YXNlKCk7CisgICAgICAgICAgICByZXR1cm4gQ2FsbE9wdGltaXphdGlvblJlc3VsdDo6SW5saW5l
ZDsKICAgICAgICAgfQorICAgICAgICBSRUxFQVNFX0FTU0VSVCghZGlkSW5zZXJ0Q2hlY2tzKTsK
KyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OkRpZE5vdGhpbmc7CisgICAg
fQogCi0gICAgICAgIGlmIChPcHRpb25zOjp1c2VET01KSVQoKSkgewotICAgICAgICAgICAgaWYg
KGNvbnN0IERPTUpJVDo6U2lnbmF0dXJlKiBzaWduYXR1cmUgPSBjYWxsZWUuc2lnbmF0dXJlRm9y
KHNwZWNpYWxpemF0aW9uS2luZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGFuZGxlRE9NSklU
Q2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgc2lnbmF0dXJlLCByZWdpc3Rlck9m
ZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIHByZWRpY3Rpb24sIGluc2VydENoZWNr
c1dpdGhBY2NvdW50aW5nKSkgewotICAgICAgICAgICAgICAgICAgICBlbmRTcGVjaWFsQ2FzZSgp
OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7CisgICAgSW50
cmluc2ljIGludHJpbnNpYyA9IGNhbGxlZS5pbnRyaW5zaWNGb3Ioc3BlY2lhbGl6YXRpb25LaW5k
KTsKKyAgICBpZiAoaW50cmluc2ljICE9IE5vSW50cmluc2ljKSB7CisgICAgICAgIGlmIChoYW5k
bGVJbnRyaW5zaWNDYWxsKGNhbGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBpbnRyaW5zaWMs
IHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgcHJlZGljdGlvbiwg
aW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRpbmcpKSB7CisgICAgICAgICAgICBlbmRTcGVjaWFsQ2Fz
ZSgpOworICAgICAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6OklubGluZWQ7
CisgICAgICAgIH0KKyAgICAgICAgUkVMRUFTRV9BU1NFUlQoIWRpZEluc2VydENoZWNrcyk7Cisg
ICAgICAgIC8vIFdlIG1pZ2h0IHN0aWxsIHRyeSB0byBpbmxpbmUgdGhlIEludHJpbnNpYyBiZWNh
dXNlIGl0IG1pZ2h0IGJlIGEgYnVpbHRpbiBKUyBmdW5jdGlvbi4KKyAgICB9CisKKyAgICBpZiAo
T3B0aW9uczo6dXNlRE9NSklUKCkpIHsKKyAgICAgICAgaWYgKGNvbnN0IERPTUpJVDo6U2lnbmF0
dXJlKiBzaWduYXR1cmUgPSBjYWxsZWUuc2lnbmF0dXJlRm9yKHNwZWNpYWxpemF0aW9uS2luZCkp
IHsKKyAgICAgICAgICAgIGlmIChoYW5kbGVET01KSVRDYWxsKGNhbGxUYXJnZXROb2RlLCByZXN1
bHRPcGVyYW5kLCBzaWduYXR1cmUsIHJlZ2lzdGVyT2Zmc2V0LCBhcmd1bWVudENvdW50SW5jbHVk
aW5nVGhpcywgcHJlZGljdGlvbiwgaW5zZXJ0Q2hlY2tzV2l0aEFjY291bnRpbmcpKSB7CisgICAg
ICAgICAgICAgICAgZW5kU3BlY2lhbENhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ2Fs
bE9wdGltaXphdGlvblJlc3VsdDo6SW5saW5lZDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IFJFTEVBU0VfQVNTRVJUKCFkaWRJbnNlcnRDaGVja3MpOwogICAgICAgICB9CiAgICAgfQogICAg
IAogICAgIHVuc2lnbmVkIG15SW5saW5pbmdDb3N0ID0gaW5saW5pbmdDb3N0KGNhbGxlZSwgYXJn
dW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIGtpbmQpOwogICAgIGlmIChteUlubGluaW5nQ29zdCA+
IGlubGluaW5nQmFsYW5jZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4g
Q2FsbE9wdGltaXphdGlvblJlc3VsdDo6RGlkTm90aGluZzsKIAotICAgIEluc3RydWN0aW9uKiBz
YXZlZEN1cnJlbnRJbnN0cnVjdGlvbiA9IG1fY3VycmVudEluc3RydWN0aW9uOwotICAgIGlubGlu
ZUNhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQsIGNhbGxlZSwgcmVnaXN0ZXJPZmZz
ZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBuZXh0T2Zmc2V0LCBraW5kLCBjb250aW51
YXRpb25CbG9jaywgaW5zZXJ0Q2hlY2tzKTsKKyAgICBhdXRvIGluc2VydENoZWNrID0gWyZdIChD
b2RlQmxvY2sqKSB7CisgICAgICAgIGlmIChuZWVkc1RvQ2hlY2tDYWxsZWUpCisgICAgICAgICAg
ICBlbWl0RnVuY3Rpb25DaGVja3MoY2FsbGVlLCBjYWxsVGFyZ2V0Tm9kZSwgdGhpc0FyZ3VtZW50
KTsKKyAgICB9OworICAgIGlubGluZUNhbGwoY2FsbFRhcmdldE5vZGUsIHJlc3VsdE9wZXJhbmQs
IGNhbGxlZSwgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLCBraW5k
LCBjb250aW51YXRpb25CbG9jaywgaW5zZXJ0Q2hlY2spOwogICAgIGlubGluaW5nQmFsYW5jZSAt
PSBteUlubGluaW5nQ29zdDsKLSAgICBtX2N1cnJlbnRJbnN0cnVjdGlvbiA9IHNhdmVkQ3VycmVu
dEluc3RydWN0aW9uOwotICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBDYWxsT3B0aW1pemF0
aW9uUmVzdWx0OjpJbmxpbmVkOwogfQogCi1ib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxp
bmluZygKLSAgICBOb2RlKiBjYWxsVGFyZ2V0Tm9kZSwgaW50IHJlc3VsdE9wZXJhbmQsIGNvbnN0
IENhbGxMaW5rU3RhdHVzJiBjYWxsTGlua1N0YXR1cywKLSAgICBpbnQgcmVnaXN0ZXJPZmZzZXRP
ckZpcnN0RnJlZVJlZywgVmlydHVhbFJlZ2lzdGVyIHRoaXNBcmd1bWVudCwKLSAgICBWaXJ0dWFs
UmVnaXN0ZXIgYXJndW1lbnRzQXJndW1lbnQsIHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwgaW50
IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzLAotICAgIHVuc2lnbmVkIG5leHRPZmZzZXQsIE5v
ZGVUeXBlIGNhbGxPcCwgSW5saW5lQ2FsbEZyYW1lOjpLaW5kIGtpbmQsIFNwZWN1bGF0ZWRUeXBl
IHByZWRpY3Rpb24pCitib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVWYXJhcmdzSW5saW5pbmco
Tm9kZSogY2FsbFRhcmdldE5vZGUsIGludCByZXN1bHRPcGVyYW5kLAorICAgIGNvbnN0IENhbGxM
aW5rU3RhdHVzJiBjYWxsTGlua1N0YXR1cywgaW50IGZpcnN0RnJlZVJlZywgVmlydHVhbFJlZ2lz
dGVyIHRoaXNBcmd1bWVudCwKKyAgICBWaXJ0dWFsUmVnaXN0ZXIgYXJndW1lbnRzQXJndW1lbnQs
IHVuc2lnbmVkIGFyZ3VtZW50c09mZnNldCwKKyAgICBOb2RlVHlwZSBjYWxsT3AsIElubGluZUNh
bGxGcmFtZTo6S2luZCBraW5kKQogewotICAgIFZFUkJPU0VfTE9HKCJIYW5kbGluZyBpbmxpbmlu
Zy4uLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwotICAgIENvZGVTcGVj
aWFsaXphdGlvbktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpzcGVj
aWFsaXphdGlvbktpbmRGb3Ioa2luZCk7Ci0gICAgCi0gICAgaWYgKCFjYWxsTGlua1N0YXR1cy5z
aXplKCkpIHsKLSAgICAgICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmcuXG4iKTsKKyAg
ICBWRVJCT1NFX0xPRygiSGFuZGxpbmcgaW5saW5pbmcgKFZhcmFyZ3MpLi4uXG5TdGFjazogIiwg
Y3VycmVudENvZGVPcmlnaW4oKSwgIlxuIik7CisgICAgaWYgKGNhbGxMaW5rU3RhdHVzLm1heE51
bUFyZ3VtZW50cygpID4gT3B0aW9uczo6bWF4aW11bVZhcmFyZ3NGb3JJbmxpbmluZygpKSB7Cisg
ICAgICAgIFZFUkJPU0VfTE9HKCJCYWlsaW5nIGlubGluaW5nOiB0b28gbWFueSBhcmd1bWVudHMg
Zm9yIHZhcmFyZ3MgaW5saW5pbmcuXG4iKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0K
KyAgICBpZiAoY2FsbExpbmtTdGF0dXMuY291bGRUYWtlU2xvd1BhdGgoKSB8fCBjYWxsTGlua1N0
YXR1cy5zaXplKCkgIT0gMSkgeworICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxpbmlu
ZzogcG9seW1vcnBoaWMgaW5saW5pbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHZhcmFyZ3Mu
XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIENhbGxWYXJpYW50IGNh
bGxWYXJpYW50ID0gY2FsbExpbmtTdGF0dXNbMF07CisKKyAgICB1bnNpZ25lZCBtYW5kYXRvcnlN
aW5pbXVtOworICAgIGlmIChGdW5jdGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uRXhlY3V0YWJsZSA9
IGNhbGxWYXJpYW50LmZ1bmN0aW9uRXhlY3V0YWJsZSgpKQorICAgICAgICBtYW5kYXRvcnlNaW5p
bXVtID0gZnVuY3Rpb25FeGVjdXRhYmxlLT5wYXJhbWV0ZXJDb3VudCgpOworICAgIGVsc2UKKyAg
ICAgICAgbWFuZGF0b3J5TWluaW11bSA9IDA7CiAgICAgCi0gICAgaWYgKElubGluZUNhbGxGcmFt
ZTo6aXNWYXJhcmdzKGtpbmQpCi0gICAgICAgICYmIGNhbGxMaW5rU3RhdHVzLm1heE51bUFyZ3Vt
ZW50cygpID4gT3B0aW9uczo6bWF4aW11bVZhcmFyZ3NGb3JJbmxpbmluZygpKSB7Ci0gICAgICAg
IFZFUkJPU0VfTE9HKCJCYWlsaW5nIGlubGluaW5nIGJlY2F1c2Ugb2YgdmFyYXJncy5cbiIpOwor
ICAgIC8vIGluY2x1ZGVzICJ0aGlzIgorICAgIHVuc2lnbmVkIG1heE51bUFyZ3VtZW50cyA9IHN0
ZDo6bWF4KGNhbGxMaW5rU3RhdHVzLm1heE51bUFyZ3VtZW50cygpLCBtYW5kYXRvcnlNaW5pbXVt
ICsgMSk7CisKKyAgICBDb2RlU3BlY2lhbGl6YXRpb25LaW5kIHNwZWNpYWxpemF0aW9uS2luZCA9
IElubGluZUNhbGxGcmFtZTo6c3BlY2lhbGl6YXRpb25LaW5kRm9yKGtpbmQpOworICAgIGlmIChp
bmxpbmluZ0Nvc3QoY2FsbFZhcmlhbnQsIG1heE51bUFyZ3VtZW50cywga2luZCkgPiBnZXRJbmxp
bmluZ0JhbGFuY2UoY2FsbExpbmtTdGF0dXMsIHNwZWNpYWxpemF0aW9uS2luZCkpIHsKKyAgICAg
ICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmc6IGlubGluaW5nIGNvc3QgdG9vIGhpZ2gu
XG4iKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICAKKyAgICBpbnQgcmVnaXN0
ZXJPZmZzZXQgPSBmaXJzdEZyZWVSZWcgKyAxOworICAgIHJlZ2lzdGVyT2Zmc2V0IC09IG1heE51
bUFyZ3VtZW50czsgLy8gaW5jbHVkZXMgInRoaXMiCisgICAgcmVnaXN0ZXJPZmZzZXQgLT0gQ2Fs
bEZyYW1lOjpoZWFkZXJTaXplSW5SZWdpc3RlcnM7CisgICAgcmVnaXN0ZXJPZmZzZXQgPSAtV1RG
Ojpyb3VuZFVwVG9NdWx0aXBsZU9mKHN0YWNrQWxpZ25tZW50UmVnaXN0ZXJzKCksIC1yZWdpc3Rl
ck9mZnNldCk7CisgICAgCisgICAgYXV0byBpbnNlcnRDaGVja3MgPSBbJl0gKENvZGVCbG9jayog
Y29kZUJsb2NrKSB7CisgICAgICAgIGVtaXRGdW5jdGlvbkNoZWNrcyhjYWxsVmFyaWFudCwgY2Fs
bFRhcmdldE5vZGUsIHRoaXNBcmd1bWVudCk7CisgICAgICAgIAorICAgICAgICBpbnQgcmVtYXBw
ZWRSZWdpc3Rlck9mZnNldCA9CisgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFu
ZChWaXJ0dWFsUmVnaXN0ZXIocmVnaXN0ZXJPZmZzZXQpKS5vZmZzZXQoKTsKKyAgICAgICAgCisg
ICAgICAgIGVuc3VyZUxvY2FscyhWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRSZWdpc3Rlck9mZnNl
dCkudG9Mb2NhbCgpKTsKKyAgICAgICAgCisgICAgICAgIGludCBhcmd1bWVudFN0YXJ0ID0gcmVn
aXN0ZXJPZmZzZXQgKyBDYWxsRnJhbWU6OmhlYWRlclNpemVJblJlZ2lzdGVyczsKKyAgICAgICAg
aW50IHJlbWFwcGVkQXJndW1lbnRTdGFydCA9CisgICAgICAgIG1faW5saW5lU3RhY2tUb3AtPnJl
bWFwT3BlcmFuZChWaXJ0dWFsUmVnaXN0ZXIoYXJndW1lbnRTdGFydCkpLm9mZnNldCgpOworICAg
ICAgICAKKyAgICAgICAgTG9hZFZhcmFyZ3NEYXRhKiBkYXRhID0gbV9ncmFwaC5tX2xvYWRWYXJh
cmdzRGF0YS5hZGQoKTsKKyAgICAgICAgZGF0YS0+c3RhcnQgPSBWaXJ0dWFsUmVnaXN0ZXIocmVt
YXBwZWRBcmd1bWVudFN0YXJ0ICsgMSk7CisgICAgICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJl
Z2lzdGVyKHJlbWFwcGVkUmVnaXN0ZXJPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENv
dW50KTsKKyAgICAgICAgZGF0YS0+b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OworICAgICAgICBk
YXRhLT5saW1pdCA9IG1heE51bUFyZ3VtZW50czsKKyAgICAgICAgZGF0YS0+bWFuZGF0b3J5TWlu
aW11bSA9IG1hbmRhdG9yeU1pbmltdW07CisgICAgICAgIAorICAgICAgICBpZiAoY2FsbE9wID09
IFRhaWxDYWxsRm9yd2FyZFZhcmFyZ3MpCisgICAgICAgICAgICBhZGRUb0dyYXBoKEZvcndhcmRW
YXJhcmdzLCBPcEluZm8oZGF0YSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhZGRUb0dy
YXBoKExvYWRWYXJhcmdzLCBPcEluZm8oZGF0YSksIGdldChhcmd1bWVudHNBcmd1bWVudCkpOwor
ICAgICAgICAKKyAgICAgICAgLy8gTG9hZFZhcmFyZ3MgbWF5IE9TUiBleGl0LiBIZW5jZSwgd2Ug
bmVlZCB0byBrZWVwIGFsaXZlIGNhbGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQKKyAgICAgICAg
Ly8gYW5kIGFyZ3VtZW50c0FyZ3VtZW50IGZvciB0aGUgYmFzZWxpbmUgSklULiBIb3dldmVyLCB3
ZSBvbmx5IG5lZWQgYSBQaGFudG9tIGZvcgorICAgICAgICAvLyBjYWxsVGFyZ2V0Tm9kZSBiZWNh
dXNlIHRoZSBvdGhlciAyIGFyZSBzdGlsbCBpbiB1c2UgYW5kIGFsaXZlIGF0IHRoaXMgcG9pbnQu
CisgICAgICAgIGFkZFRvR3JhcGgoUGhhbnRvbSwgY2FsbFRhcmdldE5vZGUpOworICAgICAgICAK
KyAgICAgICAgLy8gSW4gREZHIElSIGJlZm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJv
bCBmbG93IGJldHdlZW4gYWZ0ZXIgdGhlCisgICAgICAgIC8vIExvYWRWYXJhcmdzIGFuZCB0aGUg
bGFzdCBTZXRBcmd1bWVudC4gVGhpcyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQgdG8gREZH
CisgICAgICAgIC8vIFNTQS4gRm9ydHVuYXRlbHksIHdlIGFsc28gaGF2ZSBvdGhlciByZWFzb25z
IGZvciBub3QgaW5zZXJ0aW5nIGNvbnRyb2wgZmxvdworICAgICAgICAvLyBiZWZvcmUgU1NBLgog
ICAgICAgICAKKyAgICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiBjb3VudFZhcmlhYmxlID0gbmV3
VmFyaWFibGVBY2Nlc3NEYXRhKFZpcnR1YWxSZWdpc3RlcihyZW1hcHBlZFJlZ2lzdGVyT2Zmc2V0
ICsgQ2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCkpOworICAgICAgICAvLyBUaGlzIGlzIHBy
ZXR0eSBsYW1lLCBidXQgaXQgd2lsbCBmb3JjZSB0aGUgY291bnQgdG8gYmUgZmx1c2hlZCBhcyBh
biBpbnQuIFRoaXMgZG9lc24ndAorICAgICAgICAvLyBtYXR0ZXIgdmVyeSBtdWNoLCBzaW5jZSBv
dXIgdXNlIG9mIGEgU2V0QXJndW1lbnQgYW5kIEZsdXNoZXMgZm9yIHRoaXMgbG9jYWwgc2xvdCBp
cworICAgICAgICAvLyBtb3N0bHkganVzdCBhIGZvcm1hbGl0eS4KKyAgICAgICAgY291bnRWYXJp
YWJsZS0+cHJlZGljdChTcGVjSW50MzJPbmx5KTsKKyAgICAgICAgY291bnRWYXJpYWJsZS0+bWVy
Z2VJc1Byb2ZpdGFibGVUb1VuYm94KHRydWUpOworICAgICAgICBOb2RlKiBzZXRBcmd1bWVudENv
dW50ID0gYWRkVG9HcmFwaChTZXRBcmd1bWVudCwgT3BJbmZvKGNvdW50VmFyaWFibGUpKTsKKyAg
ICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFy
aWFibGUtPmxvY2FsKCksIHNldEFyZ3VtZW50Q291bnQpOworICAgICAgICAKKyAgICAgICAgc2V0
KFZpcnR1YWxSZWdpc3Rlcihhcmd1bWVudFN0YXJ0KSwgZ2V0KHRoaXNBcmd1bWVudCksIEltbWVk
aWF0ZU5ha2VkU2V0KTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBhcmd1bWVudCA9IDE7IGFyZ3Vt
ZW50IDwgbWF4TnVtQXJndW1lbnRzOyArK2FyZ3VtZW50KSB7CisgICAgICAgICAgICBWYXJpYWJs
ZUFjY2Vzc0RhdGEqIHZhcmlhYmxlID0gbmV3VmFyaWFibGVBY2Nlc3NEYXRhKFZpcnR1YWxSZWdp
c3RlcihyZW1hcHBlZEFyZ3VtZW50U3RhcnQgKyBhcmd1bWVudCkpOworICAgICAgICAgICAgdmFy
aWFibGUtPm1lcmdlU2hvdWxkTmV2ZXJVbmJveCh0cnVlKTsgLy8gV2UgY3VycmVudGx5IGhhdmUg
bm93aGVyZSB0byBwdXQgdGhlIHR5cGUgY2hlY2sgb24gdGhlIExvYWRWYXJhcmdzLiBMb2FkVmFy
YXJncyBpcyBlZmZlY3RmdWwsIHNvIGFmdGVyIGl0IGZpbmlzaGVzLCB3ZSBjYW5ub3QgZXhpdC4K
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRm9yIGEgd2hpbGUgaXQgaGFkIGJlZW4gbXkg
aW50ZW50aW9uIHRvIGRvIHRoaW5ncyBsaWtlIHRoaXMgaW5zaWRlIHRoZQorICAgICAgICAgICAg
Ly8gcHJlZGljdGlvbiBpbmplY3Rpb24gcGhhc2UuIEJ1dCBpbiB0aGlzIGNhc2UgaXQncyByZWFs
bHkgYmVzdCB0byBkbyBpdCBoZXJlLAorICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCdzIGhlcmUg
dGhhdCB3ZSBoYXZlIGFjY2VzcyB0byB0aGUgdmFyaWFibGUgYWNjZXNzIGRhdGFzIGZvciB0aGUK
KyAgICAgICAgICAgIC8vIGlubGluaW5nIHdlJ3JlIGFib3V0IHRvIGRvLgorICAgICAgICAgICAg
Ly8KKyAgICAgICAgICAgIC8vIFNvbWV0aGluZyBlbHNlIHRoYXQncyBpbnRlcmVzdGluZyBoZXJl
IGlzIHRoYXQgd2UnZCByZWFsbHkgbG92ZSB0byBnZXQKKyAgICAgICAgICAgIC8vIHByZWRpY3Rp
b25zIGZyb20gdGhlIGFyZ3VtZW50cyBsb2FkZWQgYXQgdGhlIGNhbGxzaXRlLCByYXRoZXIgdGhh
biB0aGUKKyAgICAgICAgICAgIC8vIGFyZ3VtZW50cyByZWNlaXZlZCBpbnNpZGUgdGhlIGNhbGxl
ZS4gQnV0IHRoYXQgcHJvYmFibHkgd29uJ3QgbWF0dGVyIGZvciBtb3N0CisgICAgICAgICAgICAv
LyBjYWxscy4KKyAgICAgICAgICAgIGlmIChjb2RlQmxvY2sgJiYgYXJndW1lbnQgPCBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4oY29kZUJsb2NrLT5udW1QYXJhbWV0ZXJzKCkpKSB7CisgICAgICAgICAg
ICAgICAgQ29uY3VycmVudEpTTG9ja2VyIGxvY2tlcihjb2RlQmxvY2stPm1fbG9jayk7CisgICAg
ICAgICAgICAgICAgVmFsdWVQcm9maWxlJiBwcm9maWxlID0gY29kZUJsb2NrLT52YWx1ZVByb2Zp
bGVGb3JBcmd1bWVudChhcmd1bWVudCk7CisgICAgICAgICAgICAgICAgdmFyaWFibGUtPnByZWRp
Y3QocHJvZmlsZS5jb21wdXRlVXBkYXRlZFByZWRpY3Rpb24obG9ja2VyKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE5vZGUqIHNldEFyZ3VtZW50ID0gYWRkVG9H
cmFwaChTZXRBcmd1bWVudCwgT3BJbmZvKHZhcmlhYmxlKSk7CisgICAgICAgICAgICBtX2N1cnJl
bnRCbG9jay0+dmFyaWFibGVzQXRUYWlsLnNldE9wZXJhbmQodmFyaWFibGUtPmxvY2FsKCksIHNl
dEFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBJbnRyaW5zaWNzIGFuZCBp
bnRlcm5hbCBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgaW5saW5lZCBpZiB3ZSdyZSBub3QgZG9pbmcg
dmFyYXJncy4gVGhpcyBpcyBiZWNhdXNlCisgICAgLy8gd2UgY3VycmVudGx5IGRvbid0IGhhdmUg
YW55IHdheSBvZiBnZXR0aW5nIHByb2ZpbGluZyBpbmZvcm1hdGlvbiBmb3IgYXJndW1lbnRzIHRv
IG5vbi1KUyB2YXJhcmdzCisgICAgLy8gY2FsbHMuIFRoZSBwcmVkaWN0aW9uIHByb3BhZ2F0b3Ig
d29uJ3QgYmUgb2YgYW55IGhlbHAgYmVjYXVzZSBMb2FkVmFyYXJncyBvYnNjdXJlcyB0aGUgZGF0
YSBmbG93LAorICAgIC8vIGFuZCB0aGVyZSBhcmUgbm8gY2FsbHNpdGUgdmFsdWUgcHJvZmlsZXMg
YW5kIG5hdGl2ZSBmdW5jdGlvbiB3b24ndCBoYXZlIGNhbGxlZSB2YWx1ZSBwcm9maWxlcyBmb3IK
KyAgICAvLyB0aG9zZSBhcmd1bWVudHMuIEV2ZW4gd29yc2UsIGlmIHRoZSBpbnRyaW5zaWMgZGVj
aWRlcyB0byBleGl0LCBpdCB3b24ndCByZWFsbHkgaGF2ZSBhbnl3aGVyZSB0bworICAgIC8vIGV4
aXQgdG86IExvYWRWYXJhcmdzIGlzIGVmZmVjdGZ1bCBhbmQgaXQncyBwYXJ0IG9mIHRoZSBvcF9j
YWxsX3ZhcmFyZ3MsIHNvIHdlIGNhbid0IGV4aXQgd2l0aG91dAorICAgIC8vIGNhbGxpbmcgTG9h
ZFZhcmFyZ3MgdHdpY2UuCisgICAgaW5saW5lQ2FsbChjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3Bl
cmFuZCwgY2FsbFZhcmlhbnQsIHJlZ2lzdGVyT2Zmc2V0LCBtYXhOdW1Bcmd1bWVudHMsIGtpbmQs
IG51bGxwdHIsIGluc2VydENoZWNrcyk7CisKKyAgICBWRVJCT1NFX0xPRygiU3VjY2Vzc2Z1bCBp
bmxpbmluZyAodmFyYXJncywgbW9ub21vcnBoaWMpLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3Jp
Z2luKCksICJcbiIpOworICAgIHJldHVybiB0cnVlOworfQorCit1bnNpZ25lZCBCeXRlQ29kZVBh
cnNlcjo6Z2V0SW5saW5pbmdCYWxhbmNlKGNvbnN0IENhbGxMaW5rU3RhdHVzJiBjYWxsTGlua1N0
YXR1cywgQ29kZVNwZWNpYWxpemF0aW9uS2luZCBzcGVjaWFsaXphdGlvbktpbmQpCit7CiAgICAg
dW5zaWduZWQgaW5saW5pbmdCYWxhbmNlID0gT3B0aW9uczo6bWF4aW11bUZ1bmN0aW9uRm9yQ2Fs
bElubGluZUNhbmRpZGF0ZUluc3RydWN0aW9uQ291bnQoKTsKICAgICBpZiAoc3BlY2lhbGl6YXRp
b25LaW5kID09IENvZGVGb3JDb25zdHJ1Y3QpCiAgICAgICAgIGlubGluaW5nQmFsYW5jZSA9IHN0
ZDo6bWluKGlubGluaW5nQmFsYW5jZSwgT3B0aW9uczo6bWF4aW11bUZ1bmN0aW9uRm9yQ29uc3Ry
dWN0SW5saW5lQ2FuZGlkYXRlSW5zdHJ1Y3Rpb25Db3VudCgpKTsKICAgICBpZiAoY2FsbExpbmtT
dGF0dXMuaXNDbG9zdXJlQ2FsbCgpKQogICAgICAgICBpbmxpbmluZ0JhbGFuY2UgPSBzdGQ6Om1p
bihpbmxpbmluZ0JhbGFuY2UsIE9wdGlvbnM6Om1heGltdW1GdW5jdGlvbkZvckNsb3N1cmVDYWxs
SW5saW5lQ2FuZGlkYXRlSW5zdHJ1Y3Rpb25Db3VudCgpKTsKKyAgICByZXR1cm4gaW5saW5pbmdC
YWxhbmNlOworfQorCitCeXRlQ29kZVBhcnNlcjo6Q2FsbE9wdGltaXphdGlvblJlc3VsdCBCeXRl
Q29kZVBhcnNlcjo6aGFuZGxlSW5saW5pbmcoCisgICAgTm9kZSogY2FsbFRhcmdldE5vZGUsIGlu
dCByZXN1bHRPcGVyYW5kLCBjb25zdCBDYWxsTGlua1N0YXR1cyYgY2FsbExpbmtTdGF0dXMsCisg
ICAgaW50IHJlZ2lzdGVyT2Zmc2V0LCBWaXJ0dWFsUmVnaXN0ZXIgdGhpc0FyZ3VtZW50LAorICAg
IGludCBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywKKyAgICB1bnNpZ25lZCBuZXh0T2Zmc2V0
LCBOb2RlVHlwZSBjYWxsT3AsIElubGluZUNhbGxGcmFtZTo6S2luZCBraW5kLCBTcGVjdWxhdGVk
VHlwZSBwcmVkaWN0aW9uKQoreworICAgIFZFUkJPU0VfTE9HKCJIYW5kbGluZyBpbmxpbmluZy4u
LlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJcbiIpOwogICAgIAorICAgIENvZGVT
cGVjaWFsaXphdGlvbktpbmQgc3BlY2lhbGl6YXRpb25LaW5kID0gSW5saW5lQ2FsbEZyYW1lOjpz
cGVjaWFsaXphdGlvbktpbmRGb3Ioa2luZCk7CisgICAgdW5zaWduZWQgaW5saW5pbmdCYWxhbmNl
ID0gZ2V0SW5saW5pbmdCYWxhbmNlKGNhbGxMaW5rU3RhdHVzLCBzcGVjaWFsaXphdGlvbktpbmQp
OworCiAgICAgLy8gRmlyc3QgY2hlY2sgaWYgd2UgY2FuIGF2b2lkIGNyZWF0aW5nIGNvbnRyb2wg
Zmxvdy4gT3VyIGlubGluZXIgZG9lcyBzb21lIENGRwogICAgIC8vIHNpbXBsaWZpY2F0aW9uIG9u
IHRoZSBmbHkgYW5kIHRoaXMgaGVscHMgcmVkdWNlIGNvbXBpbGUgdGltZXMsIGJ1dCB3ZSBjYW4g
b25seSBsZXZlcmFnZQogICAgIC8vIHRoaXMgaW4gY2FzZXMgd2hlcmUgd2UgZG9uJ3QgbmVlZCBj
b250cm9sIGZsb3cgZGlhbW9uZHMgdG8gY2hlY2sgdGhlIGNhbGxlZS4KICAgICBpZiAoIWNhbGxM
aW5rU3RhdHVzLmNvdWxkVGFrZVNsb3dQYXRoKCkgJiYgY2FsbExpbmtTdGF0dXMuc2l6ZSgpID09
IDEpIHsKLSAgICAgICAgaW50IHJlZ2lzdGVyT2Zmc2V0OwotICAgICAgICAKLSAgICAgICAgLy8g
T25seSB1c2VkIGZvciB2YXJhcmdzIGNhbGxzLgotICAgICAgICB1bnNpZ25lZCBtYW5kYXRvcnlN
aW5pbXVtID0gMDsKLSAgICAgICAgdW5zaWduZWQgbWF4TnVtQXJndW1lbnRzID0gMDsKLQotICAg
ICAgICBpZiAoSW5saW5lQ2FsbEZyYW1lOjppc1ZhcmFyZ3Moa2luZCkpIHsKLSAgICAgICAgICAg
IGlmIChGdW5jdGlvbkV4ZWN1dGFibGUqIGZ1bmN0aW9uRXhlY3V0YWJsZSA9IGNhbGxMaW5rU3Rh
dHVzWzBdLmZ1bmN0aW9uRXhlY3V0YWJsZSgpKQotICAgICAgICAgICAgICAgIG1hbmRhdG9yeU1p
bmltdW0gPSBmdW5jdGlvbkV4ZWN1dGFibGUtPnBhcmFtZXRlckNvdW50KCk7Ci0gICAgICAgICAg
ICBlbHNlCi0gICAgICAgICAgICAgICAgbWFuZGF0b3J5TWluaW11bSA9IDA7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIC8vIGluY2x1ZGVzICJ0aGlzIgotICAgICAgICAgICAgbWF4TnVtQXJn
dW1lbnRzID0gc3RkOjptYXgoCi0gICAgICAgICAgICAgICAgY2FsbExpbmtTdGF0dXMubWF4TnVt
QXJndW1lbnRzKCksCi0gICAgICAgICAgICAgICAgbWFuZGF0b3J5TWluaW11bSArIDEpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICAvLyBXZSBzb3J0IG9mIHByZXRlbmQgdGhhdCB0aGlzICpp
cyogdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdCB3ZXJlIHBhc3NlZC4KLSAgICAgICAgICAg
IGFyZ3VtZW50Q291bnRJbmNsdWRpbmdUaGlzID0gbWF4TnVtQXJndW1lbnRzOwotICAgICAgICAg
ICAgCi0gICAgICAgICAgICByZWdpc3Rlck9mZnNldCA9IHJlZ2lzdGVyT2Zmc2V0T3JGaXJzdEZy
ZWVSZWcgKyAxOwotICAgICAgICAgICAgcmVnaXN0ZXJPZmZzZXQgLT0gbWF4TnVtQXJndW1lbnRz
OyAvLyBpbmNsdWRlcyAidGhpcyIKLSAgICAgICAgICAgIHJlZ2lzdGVyT2Zmc2V0IC09IENhbGxG
cmFtZTo6aGVhZGVyU2l6ZUluUmVnaXN0ZXJzOwotICAgICAgICAgICAgcmVnaXN0ZXJPZmZzZXQg
PSAtV1RGOjpyb3VuZFVwVG9NdWx0aXBsZU9mKAotICAgICAgICAgICAgICAgIHN0YWNrQWxpZ25t
ZW50UmVnaXN0ZXJzKCksCi0gICAgICAgICAgICAgICAgLXJlZ2lzdGVyT2Zmc2V0KTsKLSAgICAg
ICAgfSBlbHNlCi0gICAgICAgICAgICByZWdpc3Rlck9mZnNldCA9IHJlZ2lzdGVyT2Zmc2V0T3JG
aXJzdEZyZWVSZWc7Ci0gICAgICAgIAotICAgICAgICBib29sIHJlc3VsdCA9IGF0dGVtcHRUb0lu
bGluZUNhbGwoCi0gICAgICAgICAgICBjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2Fs
bExpbmtTdGF0dXNbMF0sIHJlZ2lzdGVyT2Zmc2V0LAotICAgICAgICAgICAgYXJndW1lbnRDb3Vu
dEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQsIGtpbmQsIHByZWRpY3Rpb24sCi0gICAgICAgICAg
ICBpbmxpbmluZ0JhbGFuY2UsIG51bGxwdHIsIFsmXSAoQ29kZUJsb2NrKiBjb2RlQmxvY2spIHsK
LSAgICAgICAgICAgICAgICBlbWl0RnVuY3Rpb25DaGVja3MoY2FsbExpbmtTdGF0dXNbMF0sIGNh
bGxUYXJnZXROb2RlLCB0aGlzQXJndW1lbnQpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2Ug
aGF2ZSBhIHZhcmFyZ3MgY2FsbCwgd2Ugd2FudCB0byBleHRyYWN0IHRoZSBhcmd1bWVudHMgcmln
aHQgbm93LgotICAgICAgICAgICAgICAgIGlmIChJbmxpbmVDYWxsRnJhbWU6OmlzVmFyYXJncyhr
aW5kKSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYXBwZWRSZWdpc3Rlck9mZnNldCA9
Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2lubGluZVN0YWNrVG9wLT5yZW1hcE9wZXJhbmQo
VmlydHVhbFJlZ2lzdGVyKHJlZ2lzdGVyT2Zmc2V0KSkub2Zmc2V0KCk7Ci0gICAgICAgICAgICAg
ICAgICAgIAotICAgICAgICAgICAgICAgICAgICBlbnN1cmVMb2NhbHMoVmlydHVhbFJlZ2lzdGVy
KHJlbWFwcGVkUmVnaXN0ZXJPZmZzZXQpLnRvTG9jYWwoKSk7Ci0gICAgICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgICAgICAgICBpbnQgYXJndW1lbnRTdGFydCA9IHJlZ2lzdGVyT2Zmc2V0
ICsgQ2FsbEZyYW1lOjpoZWFkZXJTaXplSW5SZWdpc3RlcnM7Ci0gICAgICAgICAgICAgICAgICAg
IGludCByZW1hcHBlZEFyZ3VtZW50U3RhcnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbV9p
bmxpbmVTdGFja1RvcC0+cmVtYXBPcGVyYW5kKFZpcnR1YWxSZWdpc3Rlcihhcmd1bWVudFN0YXJ0
KSkub2Zmc2V0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTG9hZFZhcmFyZ3NEYXRhKiBkYXRh
ID0gbV9ncmFwaC5tX2xvYWRWYXJhcmdzRGF0YS5hZGQoKTsKLSAgICAgICAgICAgICAgICAgICAg
ZGF0YS0+c3RhcnQgPSBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRBcmd1bWVudFN0YXJ0ICsgMSk7
Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEtPmNvdW50ID0gVmlydHVhbFJlZ2lzdGVyKHJlbWFw
cGVkUmVnaXN0ZXJPZmZzZXQgKyBDYWxsRnJhbWVTbG90Ojphcmd1bWVudENvdW50KTsKLSAgICAg
ICAgICAgICAgICAgICAgZGF0YS0+b2Zmc2V0ID0gYXJndW1lbnRzT2Zmc2V0OwotICAgICAgICAg
ICAgICAgICAgICBkYXRhLT5saW1pdCA9IG1heE51bUFyZ3VtZW50czsKLSAgICAgICAgICAgICAg
ICAgICAgZGF0YS0+bWFuZGF0b3J5TWluaW11bSA9IG1hbmRhdG9yeU1pbmltdW07Ci0KLSAgICAg
ICAgICAgICAgICAgICAgaWYgKGNhbGxPcCA9PSBUYWlsQ2FsbEZvcndhcmRWYXJhcmdzKQotICAg
ICAgICAgICAgICAgICAgICAgICAgYWRkVG9HcmFwaChGb3J3YXJkVmFyYXJncywgT3BJbmZvKGRh
dGEpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAg
YWRkVG9HcmFwaChMb2FkVmFyYXJncywgT3BJbmZvKGRhdGEpLCBnZXQoYXJndW1lbnRzQXJndW1l
bnQpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBMb2FkVmFyYXJncyBtYXkgT1NSIGV4aXQu
IEhlbmNlLCB3ZSBuZWVkIHRvIGtlZXAgYWxpdmUgY2FsbFRhcmdldE5vZGUsIHRoaXNBcmd1bWVu
dAotICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYXJndW1lbnRzQXJndW1lbnQgZm9yIHRoZSBi
YXNlbGluZSBKSVQuIEhvd2V2ZXIsIHdlIG9ubHkgbmVlZCBhIFBoYW50b20gZm9yCi0gICAgICAg
ICAgICAgICAgICAgIC8vIGNhbGxUYXJnZXROb2RlIGJlY2F1c2UgdGhlIG90aGVyIDIgYXJlIHN0
aWxsIGluIHVzZSBhbmQgYWxpdmUgYXQgdGhpcyBwb2ludC4KLSAgICAgICAgICAgICAgICAgICAg
YWRkVG9HcmFwaChQaGFudG9tLCBjYWxsVGFyZ2V0Tm9kZSk7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgLy8gSW4gREZHIElSIGJlZm9yZSBTU0EsIHdlIGNhbm5vdCBpbnNlcnQgY29udHJvbCBmbG93
IGJldHdlZW4gYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIExvYWRWYXJhcmdzIGFu
ZCB0aGUgbGFzdCBTZXRBcmd1bWVudC4gVGhpcyBpc24ndCBhIHByb2JsZW0gb25jZSB3ZSBnZXQg
dG8gREZHCi0gICAgICAgICAgICAgICAgICAgIC8vIFNTQS4gRm9ydHVuYXRlbHksIHdlIGFsc28g
aGF2ZSBvdGhlciByZWFzb25zIGZvciBub3QgaW5zZXJ0aW5nIGNvbnRyb2wgZmxvdwotICAgICAg
ICAgICAgICAgICAgICAvLyBiZWZvcmUgU1NBLgotICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgICAgIFZhcmlhYmxlQWNjZXNzRGF0YSogY291bnRWYXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNj
ZXNzRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxSZWdpc3RlcihyZW1hcHBl
ZFJlZ2lzdGVyT2Zmc2V0ICsgQ2FsbEZyYW1lU2xvdDo6YXJndW1lbnRDb3VudCkpOwotICAgICAg
ICAgICAgICAgICAgICAvLyBUaGlzIGlzIHByZXR0eSBsYW1lLCBidXQgaXQgd2lsbCBmb3JjZSB0
aGUgY291bnQgdG8gYmUgZmx1c2hlZCBhcyBhbiBpbnQuIFRoaXMgZG9lc24ndAotICAgICAgICAg
ICAgICAgICAgICAvLyBtYXR0ZXIgdmVyeSBtdWNoLCBzaW5jZSBvdXIgdXNlIG9mIGEgU2V0QXJn
dW1lbnQgYW5kIEZsdXNoZXMgZm9yIHRoaXMgbG9jYWwgc2xvdCBpcwotICAgICAgICAgICAgICAg
ICAgICAvLyBtb3N0bHkganVzdCBhIGZvcm1hbGl0eS4KLSAgICAgICAgICAgICAgICAgICAgY291
bnRWYXJpYWJsZS0+cHJlZGljdChTcGVjSW50MzJPbmx5KTsKLSAgICAgICAgICAgICAgICAgICAg
Y291bnRWYXJpYWJsZS0+bWVyZ2VJc1Byb2ZpdGFibGVUb1VuYm94KHRydWUpOwotICAgICAgICAg
ICAgICAgICAgICBOb2RlKiBzZXRBcmd1bWVudENvdW50ID0gYWRkVG9HcmFwaChTZXRBcmd1bWVu
dCwgT3BJbmZvKGNvdW50VmFyaWFibGUpKTsKLSAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50
QmxvY2stPnZhcmlhYmxlc0F0VGFpbC5zZXRPcGVyYW5kKGNvdW50VmFyaWFibGUtPmxvY2FsKCks
IHNldEFyZ3VtZW50Q291bnQpOwotCi0gICAgICAgICAgICAgICAgICAgIHNldChWaXJ0dWFsUmVn
aXN0ZXIoYXJndW1lbnRTdGFydCksIGdldCh0aGlzQXJndW1lbnQpLCBJbW1lZGlhdGVOYWtlZFNl
dCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgYXJndW1lbnQgPSAxOyBhcmd1
bWVudCA8IG1heE51bUFyZ3VtZW50czsgKythcmd1bWVudCkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgVmFyaWFibGVBY2Nlc3NEYXRhKiB2YXJpYWJsZSA9IG5ld1ZhcmlhYmxlQWNjZXNzRGF0
YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsUmVnaXN0ZXIocmVtYXBwZWRB
cmd1bWVudFN0YXJ0ICsgYXJndW1lbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlh
YmxlLT5tZXJnZVNob3VsZE5ldmVyVW5ib3godHJ1ZSk7IC8vIFdlIGN1cnJlbnRseSBoYXZlIG5v
d2hlcmUgdG8gcHV0IHRoZSB0eXBlIGNoZWNrIG9uIHRoZSBMb2FkVmFyYXJncy4gTG9hZFZhcmFy
Z3MgaXMgZWZmZWN0ZnVsLCBzbyBhZnRlciBpdCBmaW5pc2hlcywgd2UgY2Fubm90IGV4aXQuCi0g
ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBh
IHdoaWxlIGl0IGhhZCBiZWVuIG15IGludGVudGlvbiB0byBkbyB0aGluZ3MgbGlrZSB0aGlzIGlu
c2lkZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZWRpY3Rpb24gaW5qZWN0aW9u
IHBoYXNlLiBCdXQgaW4gdGhpcyBjYXNlIGl0J3MgcmVhbGx5IGJlc3QgdG8gZG8gaXQgaGVyZSwK
LSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQncyBoZXJlIHRoYXQgd2UgaGF2
ZSBhY2Nlc3MgdG8gdGhlIHZhcmlhYmxlIGFjY2VzcyBkYXRhcyBmb3IgdGhlCi0gICAgICAgICAg
ICAgICAgICAgICAgICAvLyBpbmxpbmluZyB3ZSdyZSBhYm91dCB0byBkby4KLSAgICAgICAgICAg
ICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgZWxz
ZSB0aGF0J3MgaW50ZXJlc3RpbmcgaGVyZSBpcyB0aGF0IHdlJ2QgcmVhbGx5IGxvdmUgdG8gZ2V0
Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVkaWN0aW9ucyBmcm9tIHRoZSBhcmd1bWVu
dHMgbG9hZGVkIGF0IHRoZSBjYWxsc2l0ZSwgcmF0aGVyIHRoYW4gdGhlCi0gICAgICAgICAgICAg
ICAgICAgICAgICAvLyBhcmd1bWVudHMgcmVjZWl2ZWQgaW5zaWRlIHRoZSBjYWxsZWUuIEJ1dCB0
aGF0IHByb2JhYmx5IHdvbid0IG1hdHRlciBmb3IgbW9zdAotICAgICAgICAgICAgICAgICAgICAg
ICAgLy8gY2FsbHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZUJsb2NrICYmIGFy
Z3VtZW50IDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvZGVCbG9jay0+bnVtUGFyYW1ldGVycygp
KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmN1cnJlbnRKU0xvY2tlciBsb2Nr
ZXIoY29kZUJsb2NrLT5tX2xvY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVl
UHJvZmlsZSYgcHJvZmlsZSA9IGNvZGVCbG9jay0+dmFsdWVQcm9maWxlRm9yQXJndW1lbnQoYXJn
dW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLT5wcmVkaWN0KHBy
b2ZpbGUuY29tcHV0ZVVwZGF0ZWRQcmVkaWN0aW9uKGxvY2tlcikpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAg
ICAgICBOb2RlKiBzZXRBcmd1bWVudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1lbnQsIE9wSW5mbyh2
YXJpYWJsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50QmxvY2stPnZhcmlh
Ymxlc0F0VGFpbC5zZXRPcGVyYW5kKHZhcmlhYmxlLT5sb2NhbCgpLCBzZXRBcmd1bWVudCk7Ci0g
ICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsK
LSAgICAgICAgVkVSQk9TRV9MT0coIkRvbmUgaW5saW5pbmcgKHNpbXBsZSkuXG5TdGFjazogIiwg
Y3VycmVudENvZGVPcmlnaW4oKSwgIlxuUmVzdWx0OiAiLCByZXN1bHQsICJcbiIpOwotICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gaGFuZGxlQ2FsbFZhcmlhbnQoCisgICAg
ICAgICAgICBjYWxsVGFyZ2V0Tm9kZSwgcmVzdWx0T3BlcmFuZCwgY2FsbExpbmtTdGF0dXNbMF0s
IHJlZ2lzdGVyT2Zmc2V0LCB0aGlzQXJndW1lbnQsCisgICAgICAgICAgICBhcmd1bWVudENvdW50
SW5jbHVkaW5nVGhpcywgbmV4dE9mZnNldCwga2luZCwgcHJlZGljdGlvbiwgaW5saW5pbmdCYWxh
bmNlLCBudWxscHRyLCB0cnVlKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBXZSBuZWVkIHRvIGNy
ZWF0ZSBzb21lIGtpbmQgb2Ygc3dpdGNoIG92ZXIgY2FsbGVlLiBGb3Igbm93IHdlIG9ubHkgZG8g
dGhpcyBpZiB3ZSBiZWxpZXZlIHRoYXQKICAgICAvLyB3ZSdyZSBpbiB0aGUgdG9wIHRpZXIuIFdl
IGhhdmUgdHdvIHJlYXNvbnMgZm9yIHRoaXM6IGZpcnN0LCBpdCBwcm92aWRlcyB1cyBhbiBvcHBv
cnR1bml0eSB0bwogICAgIC8vIGRvIG1vcmUgZGV0YWlsZWQgcG9seXZhcmlhbnQvcG9seW1vcnBo
aWMgcHJvZmlsaW5nOyBhbmQgc2Vjb25kLCBpdCByZWR1Y2VzIGNvbXBpbGUgdGltZXMgaW4KICAg
ICAvLyB0aGUgREZHLiBBbmQgYnkgcG9seXZhcmlhbnQgcHJvZmlsaW5nIHdlIG1lYW4gcG9seXZh
cmlhbnQgcHJvZmlsaW5nIG9mICp0aGlzKiBjYWxsLiBOb3RlIHRoYXQKICAgICAvLyB3ZSBjb3Vs
ZCBpbXByb3ZlIHRoYXQgYXNwZWN0IG9mIHRoaXMgYnkgZG9pbmcgcG9seW1vcnBoaWMgaW5saW5p
bmcgYnV0IGhhdmluZyB0aGUgcHJvZmlsaW5nCiAgICAgLy8gYWxzby4KLSAgICBpZiAoIWlzRlRM
KG1fZ3JhcGgubV9wbGFuLm1vZGUpIHx8ICFPcHRpb25zOjp1c2VQb2x5bW9ycGhpY0NhbGxJbmxp
bmluZygpCi0gICAgICAgIHx8IElubGluZUNhbGxGcmFtZTo6aXNWYXJhcmdzKGtpbmQpKSB7Cisg
ICAgaWYgKCFpc0ZUTChtX2dyYXBoLm1fcGxhbi5tb2RlKSB8fCAhT3B0aW9uczo6dXNlUG9seW1v
cnBoaWNDYWxsSW5saW5pbmcoKSkgewogICAgICAgICBWRVJCT1NFX0xPRygiQmFpbGluZyBpbmxp
bmluZyAoaGFyZCkuXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIlxuIik7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25SZXN1bHQ6
OkRpZE5vdGhpbmc7CiAgICAgfQogICAgIAogICAgIC8vIElmIHRoZSBjbGFpbSBpcyB0aGF0IHRo
aXMgZGlkIG5vdCBvcmlnaW5hdGUgZnJvbSBhIHN0dWIsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBl
bWl0IGEgc3dpdGNoCkBAIC0xOTc0LDcgKzE5NzMsNyBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpo
YW5kbGVJbmxpbmluZygKICAgICBpZiAoIU9wdGlvbnM6OnVzZVBvbHltb3JwaGljQ2FsbElubGlu
aW5nRm9yTm9uU3R1YlN0YXR1cygpCiAgICAgICAgICYmICFjYWxsTGlua1N0YXR1cy5pc0Jhc2Vk
T25TdHViKCkpIHsKICAgICAgICAgVkVSQk9TRV9MT0coIkJhaWxpbmcgaW5saW5pbmcgKG5vbi1z
dHViIHBvbHltb3JwaGlzbSkuXG5TdGFjazogIiwgY3VycmVudENvZGVPcmlnaW4oKSwgIlxuIik7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIENhbGxPcHRpbWl6YXRpb25S
ZXN1bHQ6OkRpZE5vdGhpbmc7CiAgICAgfQogCiAgICAgYm9vbCBhbGxBcmVDbG9zdXJlQ2FsbHMg
PSB0cnVlOwpAQCAtMTk5NywxMyArMTk5NiwxMSBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpoYW5k
bGVJbmxpbmluZygKICAgICAgICAgLy8gY2xvc3VyZSBjYWxscy4KICAgICAgICAgLy8gaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjAyMAogICAgICAgICBWRVJCT1NF
X0xPRygiQmFpbGluZyBpbmxpbmluZyAobWl4KS5cblN0YWNrOiAiLCBjdXJyZW50Q29kZU9yaWdp
bigpLCAiXG4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQ2FsbE9w
dGltaXphdGlvblJlc3VsdDo6RGlkTm90aGluZzsKICAgICB9CiAKICAgICBWRVJCT1NFX0xPRygi
RG9pbmcgaGFyZCBpbmxpbmluZy4uLlxuU3RhY2s6ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICJc
biIpOwogCi0gICAgaW50IHJlZ2lzdGVyT2Zmc2V0ID0gcmVnaXN0ZXJPZmZzZXRPckZpcnN0RnJl
ZVJlZzsKLQogICAgIC8vIFRoaXMgbWFrZXMgbWUgd2lzaCB0aGF0IHdlIHdlcmUgaW4gU1NBIGFs
bCB0aGUgdGltZS4gV2UgbmVlZCB0byBwaWNrIGEgdmFyaWFibGUgaW50byB3aGljaCB0bwogICAg
IC8vIHN0b3JlIHRoZSBjYWxsZWUgc28gdGhhdCBpdCB3aWxsIGJlIGFjY2Vzc2libGUgdG8gYWxs
IG9mIHRoZSBibG9ja3Mgd2UncmUgYWJvdXQgdG8gY3JlYXRlLiBXZQogICAgIC8vIGdldCBhd2F5
IHdpdGggZG9pbmcgYW4gaW1tZWRpYXRlLXNldCBoZXJlIGJlY2F1c2Ugd2Ugd291bGRuJ3QgaGF2
ZSBwZXJmb3JtZWQgYW55IHNpZGUgZWZmZWN0cwpAQCAtMjA0MSwxMiArMjAzOCwxMiBAQCBib29s
IEJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVJbmxpbmluZygKICAgICAgICAgCiAgICAgICAgIE5vZGUq
IG15Q2FsbFRhcmdldE5vZGUgPSBnZXREaXJlY3QoY2FsbGVlUmVnKTsKICAgICAgICAgCi0gICAg
ICAgIGJvb2wgaW5saW5pbmdSZXN1bHQgPSBhdHRlbXB0VG9JbmxpbmVDYWxsKAorICAgICAgICBh
dXRvIGlubGluaW5nUmVzdWx0ID0gaGFuZGxlQ2FsbFZhcmlhbnQoCiAgICAgICAgICAgICBteUNh
bGxUYXJnZXROb2RlLCByZXN1bHRPcGVyYW5kLCBjYWxsTGlua1N0YXR1c1tpXSwgcmVnaXN0ZXJP
ZmZzZXQsCi0gICAgICAgICAgICBhcmd1bWVudENvdW50SW5jbHVkaW5nVGhpcywgbmV4dE9mZnNl
dCwga2luZCwgcHJlZGljdGlvbiwKLSAgICAgICAgICAgIGlubGluaW5nQmFsYW5jZSwgY29udGlu
dWF0aW9uQmxvY2ssIFsmXSAoQ29kZUJsb2NrKikgeyB9KTsKKyAgICAgICAgICAgIHRoaXNBcmd1
bWVudCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQsIGtpbmQsIHByZWRp
Y3Rpb24sCisgICAgICAgICAgICBpbmxpbmluZ0JhbGFuY2UsIGNvbnRpbnVhdGlvbkJsb2NrLCBm
YWxzZSk7CiAgICAgICAgIAotICAgICAgICBpZiAoIWlubGluaW5nUmVzdWx0KSB7CisgICAgICAg
IGlmIChpbmxpbmluZ1Jlc3VsdCA9PSBDYWxsT3B0aW1pemF0aW9uUmVzdWx0OjpEaWROb3RoaW5n
KSB7CiAgICAgICAgICAgICAvLyBUaGF0IGZhaWxlZCBzbyB3ZSBsZXQgdGhlIGJsb2NrIGRpZS4g
Tm90aGluZyBpbnRlcmVzdGluZyBzaG91bGQgaGF2ZSBiZWVuIGFkZGVkIHRvCiAgICAgICAgICAg
ICAvLyB0aGUgYmxvY2suIFdlIGFsc28gZ2l2ZSB1cCBvbiBpbmxpbmluZyBhbnkgb2YgdGhlIChs
ZXNzIGZyZXF1ZW50KSBjYWxsZWVzLgogICAgICAgICAgICAgQVNTRVJUKG1fZ3JhcGgubV9ibG9j
a3MubGFzdCgpID09IG1fY3VycmVudEJsb2NrKTsKQEAgLTIwNjcsNyArMjA2NCw3IEBAIGJvb2wg
Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUlubGluaW5nKAogICAgICAgICAgICAgdGhpbmdUb0Nhc2VP
biA9IGNhbGxMaW5rU3RhdHVzW2ldLmV4ZWN1dGFibGUoKTsKICAgICAgICAgfQogICAgICAgICBk
YXRhLmNhc2VzLmFwcGVuZChTd2l0Y2hDYXNlKG1fZ3JhcGguZnJlZXplKHRoaW5nVG9DYXNlT24p
LCBjYWxsZWVFbnRyeUJsb2NrKSk7Ci0gICAgICAgIFZFUkJPU0VfTE9HKCJGaW5pc2hlZCBpbmxp
bmluZyAiLCBjYWxsTGlua1N0YXR1c1tpXSwgIiBhdCAiLCBjdXJyZW50Q29kZU9yaWdpbigpLCAi
LlxuIik7CisgICAgICAgIFZFUkJPU0VfTE9HKCJGaW5pc2hlZCBvcHRpbWl6aW5nICIsIGNhbGxM
aW5rU3RhdHVzW2ldLCAiIGF0ICIsIGN1cnJlbnRDb2RlT3JpZ2luKCksICIuXG4iKTsKICAgICB9
CiAKICAgICAvLyBTbG93IHBhdGggYmxvY2sKQEAgLTIxMDgsNyArMjEwNSw3IEBAIGJvb2wgQnl0
ZUNvZGVQYXJzZXI6OmhhbmRsZUlubGluaW5nKAogICAgIG1fZXhpdE9LID0gdHJ1ZTsKICAgICAK
ICAgICBWRVJCT1NFX0xPRygiRG9uZSBpbmxpbmluZyAoaGFyZCkuXG5TdGFjazogIiwgY3VycmVu
dENvZGVPcmlnaW4oKSwgIlxuIik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIENhbGxP
cHRpbWl6YXRpb25SZXN1bHQ6OklubGluZWQ7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIENoZWNr
c0Z1bmN0b3I+Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>