Manufacturer’s Instructions

In the params section, change rxn multiplier to 0.5 if doing 1/2 reactions, or 0.25 if doing 1/4 reactions.

1. Prepare mastermixes for number of libraries (individual RNA extractions) Don’t prepare reagents until the stopping point before they are needed.

Reagents evaporate in the PCR hood and this protocol takes several hours.

2. mRNA Capture

This protocol requires 50 ng – 1 μg of intact total RNA, in 50 μL of RNase-free water. Degraded or fragmented total RNA will result in significant 3’-bias. This protocol has been optimized to isolate mature mRNA from total RNA through two subsequent capture steps using mRNA Capture Beads. Other RNA molecules with homopolymeric adenosine regions may also be isolated. RNA samples should only be kept on ice where specified in this protocol, since low temperatures may promote non-specific capture, resulting in increased rRNA levels in the captured mRNA. Before starting, equilibrate mRNA Capture Beads, mRNA Bead Binding Buffer, mRNA Bead Wash Buffer and Fragment, Prime and Elute Buffer (2X) to room temperature. Before use, beads must be washed with mRNA Bead Binding Buffer (steps 2.1 – 2.5).

2.1

Resuspend the mRNA Capture Beads thoroughly by pipetting up and down gently, or by using a vortex mixer on a low to medium speed setting to prevent foaming. High-speed vortexing or shaking should be avoided to prevent foaming. Refer to Important Parameters: mRNA Capture Beads (p. 4) for more information.

2.2

For each library to be prepared, transfer 52.5 μL (50 μL + 5% excess) of the resuspended mRNA Capture Beads into an appropriate tube. When preparing multiple libraries, beads for up to 24 libraries (1260 μL) may be washed in a single tube. When preparing more than 24 libraries, wash beads in multiple batches. Please refer to Important Parameters: mRNA Capture Beads for additional recommendations regarding bulk bead washing.

2.3

Place the tube on a magnet and incubate at room temperature until the solution is clear. Carefully remove and discard the supernatant, and replace it with an equal volume of mRNA Bead Binding Buffer (52.5 μL per library).

2.4

Remove the tube from the magnet and resuspend the beads by pipetting up and down, or by low to medium speed vortexing. Be careful to avoid producing excessive foam.

2.5

Place the tube on the magnet and incubate at room temperature until the solution is clear. Carefully remove and discard the supernatant, and replace it with an equal volume of mRNA Bead Binding Buffer (52.5 μL per library).

2.6

Remove the tube from the magnet and resuspend the beads by pipetting up and down, or by low to medium speed vortexing. Be careful to avoid producing excessive foam.

2.7

For each RNA sample to be captured, transfer 50 μL of resuspended mRNA Capture Beads into individual tubes or wells of a plate.

2.8

To each well/tube, add 50 μL of the appropriate RNA sample (in RNase-free water).

2.9

Mix thoroughly by gently pipetting up and down several times.

2.10

Place the plate/tube(s) in a thermocycler and perform the 1st mRNA capture as follows:

Step Temp Duration
1st mRNA capture 65˚C 2 min
Cool 20˚C 5 min

2.11

Place the plate/tube(s) containing the mixture of mRNA Capture Beads and RNA, on a magnet and incubate at room temperature until the solution is clear. Remove and discard the supernatant.

2.12

Remove the plate/tube(s) from the magnet and resuspend thoroughly in 200 μL of mRNA Bead Wash Buffer by pipetting up and down several times.

2.13

Place the plate/tube(s) on the magnet and incubate at room temperature until the solution is clear. Remove and discard the supernatant.

2.14

Resuspend the beads in 50 μL of RNase-free water.

2.15

Place the plate/tube(s) in a thermocycler and perform the 2nd mRNA capture as follows:

Step Temp Duration
2nd mRNA capture 70˚C 2 min
Cool 20˚C 5 min

2.16

Add 50 μL of Bead Binding Buffer to the mixture of mRNA Capture Beads and RNA, and mix thoroughly by gently pipetting up and down several times.

2.17

Incubate the plate/tube(s) at 20°C for 5 min.

2.18

Place the plate/tube(s) on the magnet and incubate at room temperature until the solution is clear. Remove and discard the supernatant.

2.19

Remove the beads from the magnet and resuspend in 200 μL of mRNA Bead Wash Buffer by pipetting up and down several times.

2.20

Place the plate/tube(s) on the magnet and incubate at room temperature until the solution is clear. Remove and discard the entire volume of supernatant. Caution: carryover of mRNA Bead Wash Buffer may inhibit 1st strand cDNA synthesis.

3. mRNA Elution, Fragmentation and Priming

3.1

Prepare the required volume of Fragment, Prime and Elute Buffer (1X) at room temperature as follows:

3.2

Thoroughly resuspend the mRNA Capture Beads with captured mRNA prepared in step 2.20 in 22 μL of Fragment, Prime and Elute Buffer (1X).

SAFE STOPPING POINT OVERNIGHT ONLY

Resuspended beads with captured mRNA may be stored at 4°C for ≤24 hrs. Do not freeze the samples as this will damage the beads. When ready, proceed to step 3.3.

Prep reagents for next set of steps:

3.3

Place the plate/tube(s) in a thermocycler and carry out the fragmentation and priming program given in the table below:

Desired mean library insert size (bp) Fragmentation
100-200 8 min at 94˚C
200-300 6 min at 94˚C
300-400 6 min at 85˚C

We are shooting for a 342-572 insert size

3.4

Immediately place the plate/tube(s) on a magnet to capture the beads, and incubate until the liquid is clear. Caution: to prevent hybridization of poly(A)-rich RNA to the capture beads, do not allow the sample to cool before placing on the magnet.

3.5

Carefully remove 20μL of the supernatant containing the eluted, fragmented, and primed RNA into a separate plate or tube.

3.6

Place the plate/tube(s) on ice and proceed immediately to 1st Strand Synthesis (step 4).

4. 1st Strand Synthesis

4.1

On ice, assemble the 1st strand synthesis reaction as follows:

Component Volume
Fragmented, primed RNA eluted from beads 20 ul
1st strand synthesis master mix (Table 2) 10 ul
Total Volume 30 ul

4.2

Keeping the plate/tube(s) on ice, mix thoroughly by gently pipetting the reaction up and down several times.

4.3

Incubate the plate/tube(s) using the following protocol:

Step Temp Duration
Primer Extension 25˚C 10 min
1st Strand Synthesis 42˚C 15 min
Enzyme inactivation 70˚C 15 min
HOLD 4˚C

4.4

Place the plate/tube(s) on ice and proceed immediately to 2nd Strand Synthesis and A-tailing (step 5).

5. 2nd Strand Synthesis and A-tailing

5.1

On ice, assemble the 2nd strand synthesis and A-tailing reaction as follows:

Component Volume
1st strand synthesis product 30 uL
2nd strand synthesis and A-tailing master mix (Table 3) 30 uL
Total Volume 60 ul

5.2

Keeping the plate/tube(s) on ice, mix thoroughly by gently pipetting the reaction up and down several times.

5.3

Incubate the plate/tube(s) using the following protocol:

Step Temp Duration
2nd Strand Synthesis 16˚C 30 min
A-Tailing 62˚C 10 min
HOLD 4˚C

5.4

Place the plate/tube(s) on ice and proceed immediately to Adapter Ligation (step 6).

6. Adapter Ligation

6.1

Dilute adapters in preparation for ligation, targeting the following concentrations:

Quantity of starting material Adapter stock concentration
50 – 499 ng 1.5 uM
500 – 1000 ng 7 μM

6.2

On ice, set up the adapter ligation reaction as follows:

Component Volume
2nd strand synthesis product 60 μL
Adapter ligation master mix (Table 4) 45 μL
Diluted adapter stock 5 μL
Total volume: 110 μL

6.3

Keeping the plate/tube(s) on ice, mix thoroughly by pipetting the reaction up and down several times.

6.4

Incubate the plate/tube(s) at 20°C for 15 min.

6.5

Proceed immediately to 1st Post-ligation Cleanup (step 7).

7. First Post-ligation Cleanup

7.1

Perform a 0.63X bead-based cleanup by combining the following:

Component Volume
Adapter-ligated DNA 110 μL
KAPA Pure Beads 70 μL
Total volume: 180 μL

7.2

Mix thoroughly by vortexing and/or pipetting up and down multiple times.

7.3

Incubate the plate/tube(s) at room temperature for 5 – 15 min to bind DNA to the beads.

7.4

Place the plate/tube(s) on a magnet to capture the beads. Incubate until the liquid is clear.

7.5

Carefully remove and discard 175 μL of supernatant.

7.6

Keeping the plate/tube(s) on the magnet, add 200 μL of 80% ethanol.

7.7

Incubate the plate/tube(s) on the magnet at room temperature for ≥30 sec.

7.8

Carefully remove and discard the ethanol.

7.9

Keeping the plate/tube(s) on the magnet, add 200 μL of 80% ethanol.

7.10

Incubate the plate/tube(s) on the magnet at room temperature for ≥30 sec.

7.11

Carefully remove and discard the ethanol. Try to remove all residual ethanol without disturbing the beads.

7.12

Dry the beads at room temperature for 3 – 5 min, or until all of the ethanol has evaporated. Caution: over-drying the beads may result in reduced yield.

7.13

Remove the plate/tube(s) from the magnet.

7.14

Thoroughly resuspend the beads in 50 μL of 10 mM Tris-HCl (pH 8.0 – 8.5).

7.15

Incubate the plate/tube(s) at room temperature for 2 min to elute DNA off the beads.

SAFE STOPPING POINT OVERNIGHT ONLY

The solution with resuspended beads can be stored at 4°C for ≤24 hrs. Do not freeze the beads, as this can result in dramatic loss of DNA. When ready, proceed to 2nd Post-ligation Cleanup (step 8).

Prep the remaining reagents needed for next steps, make fresh EtOH every day of protocol.

8. 2nd Post-ligation Cleanup

8.1

Perform a 0.7X bead-based cleanup by combining the following:

Component Volume
Beads with purified, adapter-ligated DNA 50 μL
PEG/NaCl Solution 35 μL
Total volume: 85 μL

8.2

Mix thoroughly by vortexing and/or pipetting up and down multiple times.

8.3

Incubate the plate/tube(s) at room temperature for 5 – 15 min to bind DNA to the beads.

8.4

Place the plate/tube(s) on a magnet to capture the beads. Incubate until the liquid is clear.

8.5

Carefully remove and discard 80 μL of supernatant.

8.6

Keeping the plate/tube(s) on the magnet, add 200 μL of 80% ethanol.

8.7

Incubate the plate/tube(s) on the magnet at room temperature for ≥30 sec.

8.8

Carefully remove and discard the ethanol.

8.9

Keeping the plate/tube(s) on the magnet, add 200 μL of 80% ethanol.

8.10

Incubate the plate/tube(s) on the magnet at room temperature for ≥30 sec.

8.11

Carefully remove and discard the ethanol. Try to remove all residual ethanol without disturbing the beads.

8.12

Dry the beads at room temperature for 3 – 5 min, or until all of the ethanol has evaporated. Caution: over-drying the beads may result in reduced yield.

8.13

Remove the plate/tube(s) from the magnet.

8.14

Thoroughly resuspend the beads in 22μL of 10 mM Tris-HCl (pH 8.0 – 8.5).

8.15

Incubate the plate/tube(s) at room temperature for 2 min to elute DNA off the beads.

8.16

Place the plate/tube(s) on a magnet to capture the beads. Incubate until the liquid is clear.

8.17

Transfer 20 μL of the clear supernatant to a new plate/tube(s) and proceed to Library Amplification (step 9).

SAFE STOPPING POINT

The purified, adapter-ligated library DNA may be stored at 4°C for ≤1 week, or frozen at -20°C for ≤1 month. When ready, proceed to Library Amplification (step 9).

9. Library Amplification

9.1

Assemble each library amplification reaction as follows:

Component Volume
Purified, adapter-ligated DNA 20 μL
Library amplification master mix (Table 5) 30 μL
Total volume: 50 μL

9.2

Mix well by pipetting up and down several times.

9.3

Amplify the library using the following thermocycling profile:

Step Temp. Duration Cycles
Initial denaturation 98°C 45 sec 1
Denaturation 98°C 15 sec Refer to Table 1
Annealing* 60°C 30 sec Refer to Table 1
Extension 72°C 30 sec Refer to Table 1
Final Extension 72°C 1 min 1
HOLD 4°C 1

Table 1

Quantity of starting material Number of cycles
50 – 100 ng 13 – 16
101 – 250 ng 11 – 14
251 – 500 ng 9 – 12
501 – 1000 ng 7 – 10

9.4

Proceed immediately to Library Amplification Cleanup (step 10).

10. Library Amplification Cleanup

10.1

Perform a 1X bead-based cleanup by combining the following:

Component Volume
Adapter-ligated DNA 50 μL
KAPA Pure Beads 50 μL
Total volume: 100 μL

10.2

Mix thoroughly by vortexing and/or pipetting up and down multiple times.

10.3

Incubate the plate/tube(s) at room temperature for 5 – 15 min to bind DNA to the beads.

10.4

Place the plate/tube(s) on a magnet to capture the beads. Incubate until the liquid is clear.

10.5

Carefully remove and discard 95 μL of supernatant.

10.6

Keeping the plate/tube(s) on the magnet, add 200 μL of 80% ethanol.

10.7

Incubate the plate/tube(s) on the magnet at room temperature for ≥30 sec.

10.8

Carefully remove and discard the ethanol.

10.9

Keeping the plate/tube(s) on the magnet, add 200 μL of 80% ethanol.

10.10

Incubate the plate/tube(s) on the magnet at room temperature for ≥30 sec.

10.11

Carefully remove and discard the ethanol. Try to remove all residual ethanol without disturbing the beads.

10.12

Dry the beads at room temperature for 3 – 5 min, or until all of the ethanol has evaporated. Caution: over-drying the beads may result in reduced yield.

10.13

Thoroughly resuspend the dried beads in 22 μL of 10 mM Tris-HCl (pH 8.0 – 8.5).

10.14

Incubate the plate/tube(s) at room temperature for 2 min to elute DNA off the beads.

10.15

Place the plate/tube(s) on the magnet to capture the beads. Incubate until the liquid is clear.

10.16

Transfer 20 μL of the clear supernatant to a new plate/tube(s), and store the purified, amplified libraries at 4°C for ≤ 1 week or at -20°C.

LS0tCnRpdGxlOiAibVJOQSBDYXB0dXJlIHVzaW5nIEthcGEgbVJOQSBIeXBlciBraXQiCm91dHB1dDogaHRtbF9ub3RlYm9vawpwYXJhbXM6CiAgbnVtX3NhbXBsZXM6IDIyCiAgcnhuX211bHRpcGxpZXI6IDEKLS0tCltNYW51ZmFjdHVyZXIncyBJbnN0cnVjdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9waW5za3lsYWIvbGFib3JhdG9yeS9ibG9iL21hc3Rlci9kb2N1bWVudGF0aW9uL2thcGEtbXJuYS1oeXBlci5wZGYpCgpJbiB0aGUgcGFyYW1zIHNlY3Rpb24sIGNoYW5nZSByeG4gbXVsdGlwbGllciB0byAwLjUgaWYgZG9pbmcgMS8yIHJlYWN0aW9ucywgb3IgMC4yNSBpZiBkb2luZyAxLzQgcmVhY3Rpb25zLgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKYGBgCgpgYGB7cn0KbXJuYV9jYXB0dXJlIDwtIHRyaWJibGUofml0ZW0sIH5xdWFudGl0eSwKICAgICAgICAgICAgICAgICAgICAgICAgImthcGFfbXJuYV9oeXBlcl9raXRfc2NyaXB0X3VsIiwgcGFyYW1zJG51bV9zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAidHViZXNfMS43bWwiLCA1LAogICAgICAgICAgICAgICAgICAgICAgICAiZmFsY29uXzE1bWwiLCAyLAogICAgICAgICAgICAgICAgICAgICAgICAiZmFsY29uXzUwbWwiLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAidHViZXNfMjAwdWwiLCBwYXJhbXMkbnVtX3NhbXBsZXMgKiAzLAogICAgICAgICAgICAgICAgICAgICAgICAicGxhdGVzIiwgcGFyYW1zJG51bV9zYW1wbGVzICogMSwKICAgICAgICAgICAgICAgICAgICAgICAgInRpcHNfMTAwIiwgMzYgKiBwYXJhbXMkbnVtX3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0aXBzXzEwMDAiLCA2ICogcGFyYW1zJG51bV9zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAidGlwc18xMCIsIDEgKiBwYXJhbXMkbnVtX3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICJwaDJvX21sIiwgMC4wNjEgKiBwYXJhbXMkbnVtX3NhbXBsZXMgKiBwYXJhbXMkcnhuX211bHRpcGxpZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAiZXRoYW5vbF91bCIsIDEyMDAgKiBwYXJhbXMkbnVtX3NhbXBsZXMgKiBwYXJhbXMkcnhuX211bHRpcGxpZXIpCgprYWJsZShtcm5hX2NhcHR1cmUpICU+JSAKICBrYWJsZV9zdHlsaW5nKCJib3JkZXJlZCIpCmBgYAoKCiMjIyAxLiB+flByZXBhcmUgbWFzdGVybWl4ZXMgZm9yIG51bWJlciBvZiBsaWJyYXJpZXMgKGluZGl2aWR1YWwgUk5BIGV4dHJhY3Rpb25zKX5+IERvbid0IHByZXBhcmUgcmVhZ2VudHMgdW50aWwgdGhlIHN0b3BwaW5nIHBvaW50IGJlZm9yZSB0aGV5IGFyZSBuZWVkZWQuICAKUmVhZ2VudHMgZXZhcG9yYXRlIGluIHRoZSBQQ1IgaG9vZCBhbmQgdGhpcyBwcm90b2NvbCB0YWtlcyBzZXZlcmFsIGhvdXJzLgoKCiMjIyAyLiBtUk5BIENhcHR1cmUKVGhpcyBwcm90b2NvbCByZXF1aXJlcyA1MCBuZyDigJMgMSDOvGcgb2YgaW50YWN0IHRvdGFsIFJOQSwgaW4gNTAgzrxMIG9mIFJOYXNlLWZyZWUgd2F0ZXIuIERlZ3JhZGVkIG9yIGZyYWdtZW50ZWQgdG90YWwgUk5BIHdpbGwgcmVzdWx0IGluIHNpZ25pZmljYW50IDMnLWJpYXMuClRoaXMgcHJvdG9jb2wgaGFzIGJlZW4gb3B0aW1pemVkIHRvIGlzb2xhdGUgbWF0dXJlIG1STkEgZnJvbSB0b3RhbCBSTkEgdGhyb3VnaCB0d28gc3Vic2VxdWVudCBjYXB0dXJlIHN0ZXBzIHVzaW5nIG1STkEgQ2FwdHVyZSBCZWFkcy4gT3RoZXIgUk5BIG1vbGVjdWxlcyB3aXRoIGhvbW9wb2x5bWVyaWMgYWRlbm9zaW5lIHJlZ2lvbnMgbWF5IGFsc28gYmUgaXNvbGF0ZWQuClJOQSBzYW1wbGVzIHNob3VsZCBvbmx5IGJlIGtlcHQgb24gaWNlIHdoZXJlIHNwZWNpZmllZCBpbiB0aGlzIHByb3RvY29sLCBzaW5jZSBsb3cgdGVtcGVyYXR1cmVzIG1heSBwcm9tb3RlIG5vbi1zcGVjaWZpYyBjYXB0dXJlLCByZXN1bHRpbmcgaW4gaW5jcmVhc2VkIHJSTkEgbGV2ZWxzIGluIHRoZSBjYXB0dXJlZCBtUk5BLgpCZWZvcmUgc3RhcnRpbmcsIGVxdWlsaWJyYXRlIG1STkEgQ2FwdHVyZSBCZWFkcywgbVJOQSBCZWFkIEJpbmRpbmcgQnVmZmVyLCBtUk5BIEJlYWQgV2FzaCBCdWZmZXIgYW5kIEZyYWdtZW50LCBQcmltZSBhbmQgRWx1dGUgQnVmZmVyICgyWCkgdG8gcm9vbSB0ZW1wZXJhdHVyZS4KQmVmb3JlIHVzZSwgYmVhZHMgbXVzdCBiZSB3YXNoZWQgd2l0aCBtUk5BIEJlYWQgQmluZGluZyBCdWZmZXIgKHN0ZXBzIDIuMSDigJMgMi41KS4gIAoKIyMjIyAyLjEgICAKUmVzdXNwZW5kIHRoZSBtUk5BIENhcHR1cmUgQmVhZHMgdGhvcm91Z2hseSBieSBwaXBldHRpbmcgdXAgYW5kIGRvd24gZ2VudGx5LCBvciBieSB1c2luZyBhIHZvcnRleCBtaXhlciBvbiBhIGxvdyB0byBtZWRpdW0gc3BlZWQgc2V0dGluZyB0byBwcmV2ZW50IGZvYW1pbmcuIEhpZ2gtc3BlZWQgdm9ydGV4aW5nIG9yIHNoYWtpbmcgc2hvdWxkIGJlIGF2b2lkZWQgdG8gcHJldmVudCBmb2FtaW5nLiBSZWZlciB0byBJbXBvcnRhbnQgUGFyYW1ldGVyczogbVJOQSBDYXB0dXJlIEJlYWRzIChwLiA0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIAoKIyMjIyAyLjIgICAKRm9yIGVhY2ggbGlicmFyeSB0byBiZSBwcmVwYXJlZCwgdHJhbnNmZXIgNTIuNSDOvEwgKDUwIM68TCArIDUlIGV4Y2Vzcykgb2YgdGhlIHJlc3VzcGVuZGVkIG1STkEgQ2FwdHVyZSBCZWFkcyBpbnRvIGFuIGFwcHJvcHJpYXRlIHR1YmUuIFdoZW4gcHJlcGFyaW5nIG11bHRpcGxlIGxpYnJhcmllcywgYmVhZHMgZm9yIHVwIHRvIDI0IGxpYnJhcmllcyAoMTI2MCDOvEwpIG1heSBiZSB3YXNoZWQgaW4gYSBzaW5nbGUgdHViZS4gV2hlbiBwcmVwYXJpbmcgbW9yZSB0aGFuIDI0IGxpYnJhcmllcywgd2FzaCBiZWFkcyBpbiBtdWx0aXBsZSBiYXRjaGVzLiBQbGVhc2UgcmVmZXIgdG8gSW1wb3J0YW50IFBhcmFtZXRlcnM6IG1STkEgQ2FwdHVyZSBCZWFkcyBmb3IgYWRkaXRpb25hbCByZWNvbW1lbmRhdGlvbnMgcmVnYXJkaW5nIGJ1bGsgYmVhZCB3YXNoaW5nLiAgCgojIyMjIDIuMyAgIApQbGFjZSB0aGUgdHViZSBvbiBhIG1hZ25ldCBhbmQgaW5jdWJhdGUgYXQgcm9vbSB0ZW1wZXJhdHVyZSB1bnRpbCB0aGUgc29sdXRpb24gaXMgY2xlYXIuIENhcmVmdWxseSByZW1vdmUgYW5kIGRpc2NhcmQgdGhlIHN1cGVybmF0YW50LCBhbmQgcmVwbGFjZSBpdCB3aXRoIGFuIGVxdWFsIHZvbHVtZSBvZiBtUk5BIEJlYWQgQmluZGluZyBCdWZmZXIgKDUyLjUgzrxMIHBlciBsaWJyYXJ5KS4gIAoKIyMjIyAyLjQgICAKUmVtb3ZlIHRoZSB0dWJlIGZyb20gdGhlIG1hZ25ldCBhbmQgcmVzdXNwZW5kIHRoZSBiZWFkcyBieSBwaXBldHRpbmcgdXAgYW5kIGRvd24sIG9yIGJ5IGxvdyB0byBtZWRpdW0gc3BlZWQgdm9ydGV4aW5nLiBCZSBjYXJlZnVsIHRvIGF2b2lkIHByb2R1Y2luZyBleGNlc3NpdmUgZm9hbS4gIAoKIyMjIyAyLjUgICAKUGxhY2UgdGhlIHR1YmUgb24gdGhlIG1hZ25ldCBhbmQgaW5jdWJhdGUgYXQgcm9vbSB0ZW1wZXJhdHVyZSB1bnRpbCB0aGUgc29sdXRpb24gaXMgY2xlYXIuIENhcmVmdWxseSByZW1vdmUgYW5kIGRpc2NhcmQgdGhlIHN1cGVybmF0YW50LCBhbmQgcmVwbGFjZSBpdCB3aXRoIGFuIGVxdWFsIHZvbHVtZSBvZiBtUk5BIEJlYWQgQmluZGluZyBCdWZmZXIgKDUyLjUgzrxMIHBlciBsaWJyYXJ5KS4gIAoKIyMjIyAyLjYgICAKUmVtb3ZlIHRoZSB0dWJlIGZyb20gdGhlIG1hZ25ldCBhbmQgcmVzdXNwZW5kIHRoZSBiZWFkcyBieSBwaXBldHRpbmcgdXAgYW5kIGRvd24sIG9yIGJ5IGxvdyB0byBtZWRpdW0gc3BlZWQgdm9ydGV4aW5nLiBCZSBjYXJlZnVsIHRvIGF2b2lkIHByb2R1Y2luZyBleGNlc3NpdmUgZm9hbS4gIAoKIyMjIyAyLjcgICAKRm9yIGVhY2ggUk5BIHNhbXBsZSB0byBiZSBjYXB0dXJlZCwgdHJhbnNmZXIgNTAgzrxMIG9mIHJlc3VzcGVuZGVkIG1STkEgQ2FwdHVyZSBCZWFkcyBpbnRvIGluZGl2aWR1YWwgdHViZXMgb3Igd2VsbHMgb2YgYSBwbGF0ZS4gIAoKIyMjIyAyLjggICAKVG8gZWFjaCB3ZWxsL3R1YmUsIGFkZCA1MCDOvEwgb2YgdGhlIGFwcHJvcHJpYXRlIFJOQSBzYW1wbGUgKGluIFJOYXNlLWZyZWUgd2F0ZXIpLiAgCgojIyMjIDIuOSAgIApNaXggdGhvcm91Z2hseSBieSBnZW50bHkgcGlwZXR0aW5nIHVwIGFuZCBkb3duIHNldmVyYWwgdGltZXMuICAKCiMjIyMgMi4xMCAgIAoKUGxhY2UgdGhlIHBsYXRlL3R1YmUocykgaW4gYSB0aGVybW9jeWNsZXIgYW5kIHBlcmZvcm0gdGhlIDFzdCBtUk5BIGNhcHR1cmUgYXMgZm9sbG93czogIAoKfFN0ZXB8VGVtcHxEdXJhdGlvbnwKfC0tLS18LS0tLXwtLS0tfAp8MXN0IG1STkEgY2FwdHVyZXw2NcuaQ3wyIG1pbnwKfENvb2x8MjDLmkN8NSBtaW58ICAgIAoKCiMjIyMgMi4xMSAgIApQbGFjZSB0aGUgcGxhdGUvdHViZShzKSBjb250YWluaW5nIHRoZSBtaXh0dXJlIG9mIG1STkEgQ2FwdHVyZSBCZWFkcyBhbmQgUk5BLCBvbiBhIG1hZ25ldCBhbmQgaW5jdWJhdGUgYXQgcm9vbSB0ZW1wZXJhdHVyZSB1bnRpbCB0aGUgc29sdXRpb24gaXMgY2xlYXIuIFJlbW92ZSBhbmQgZGlzY2FyZCB0aGUgc3VwZXJuYXRhbnQuICAKCiMjIyMgMi4xMiAgIApSZW1vdmUgdGhlIHBsYXRlL3R1YmUocykgZnJvbSB0aGUgbWFnbmV0IGFuZCByZXN1c3BlbmQgdGhvcm91Z2hseSBpbiAyMDAgzrxMIG9mIG1STkEgQmVhZCBXYXNoIEJ1ZmZlciBieSBwaXBldHRpbmcgdXAgYW5kIGRvd24gc2V2ZXJhbCB0aW1lcy4gIAoKIyMjIyAyLjEzICAgClBsYWNlIHRoZSBwbGF0ZS90dWJlKHMpIG9uIHRoZSBtYWduZXQgYW5kIGluY3ViYXRlIGF0IHJvb20gdGVtcGVyYXR1cmUgdW50aWwgdGhlIHNvbHV0aW9uIGlzIGNsZWFyLiBSZW1vdmUgYW5kIGRpc2NhcmQgdGhlIHN1cGVybmF0YW50LiAgCgojIyMjIDIuMTQgICAKUmVzdXNwZW5kIHRoZSBiZWFkcyBpbiA1MCDOvEwgb2YgUk5hc2UtZnJlZSB3YXRlci4gIAoKIyMjIyAyLjE1ICAgClBsYWNlIHRoZSBwbGF0ZS90dWJlKHMpIGluIGEgdGhlcm1vY3ljbGVyIGFuZCBwZXJmb3JtIHRoZSAybmQgbVJOQSBjYXB0dXJlIGFzIGZvbGxvd3M6ICAgCgp8U3RlcHxUZW1wfER1cmF0aW9ufAp8LS0tLXwtLS0tfC0tLS18CnwybmQgbVJOQSBjYXB0dXJlfDcwy5pDfDIgbWlufAp8Q29vbHwyMMuaQ3w1IG1pbnwgICAgCgojIyMjIDIuMTYgICAKQWRkIDUwIM68TCBvZiBCZWFkIEJpbmRpbmcgQnVmZmVyIHRvIHRoZSBtaXh0dXJlIG9mIG1STkEgQ2FwdHVyZSBCZWFkcyBhbmQgUk5BLCBhbmQgbWl4IHRob3JvdWdobHkgYnkgZ2VudGx5IHBpcGV0dGluZyB1cCBhbmQgZG93biBzZXZlcmFsIHRpbWVzLiAgCgojIyMjIDIuMTcgICAKSW5jdWJhdGUgdGhlIHBsYXRlL3R1YmUocykgYXQgMjDCsEMgZm9yIDUgbWluLiAgCgojIyMjIDIuMTggICAKUGxhY2UgdGhlIHBsYXRlL3R1YmUocykgb24gdGhlIG1hZ25ldCBhbmQgaW5jdWJhdGUgYXQgcm9vbSB0ZW1wZXJhdHVyZSB1bnRpbCB0aGUgc29sdXRpb24gaXMgY2xlYXIuIFJlbW92ZSBhbmQgZGlzY2FyZCB0aGUgc3VwZXJuYXRhbnQuICAKCiMjIyMgMi4xOSAgIApSZW1vdmUgdGhlIGJlYWRzIGZyb20gdGhlIG1hZ25ldCBhbmQgcmVzdXNwZW5kIGluIDIwMCDOvEwgb2YgbVJOQSBCZWFkIFdhc2ggQnVmZmVyIGJ5IHBpcGV0dGluZyB1cCBhbmQgZG93biBzZXZlcmFsIHRpbWVzLiAgCgojIyMjIDIuMjAgIApQbGFjZSB0aGUgcGxhdGUvdHViZShzKSBvbiB0aGUgbWFnbmV0IGFuZCBpbmN1YmF0ZSBhdCByb29tIHRlbXBlcmF0dXJlIHVudGlsIHRoZSBzb2x1dGlvbiBpcyBjbGVhci4gUmVtb3ZlIGFuZCBkaXNjYXJkIHRoZSBlbnRpcmUgdm9sdW1lIG9mIHN1cGVybmF0YW50LiAqKkNhdXRpb246IGNhcnJ5b3ZlciBvZiBtUk5BIEJlYWQgV2FzaCBCdWZmZXIgbWF5IGluaGliaXQgMXN0IHN0cmFuZCBjRE5BIHN5bnRoZXNpcy4qKiAgCgojIyMgMy4gbVJOQSBFbHV0aW9uLCBGcmFnbWVudGF0aW9uIGFuZCBQcmltaW5nICAKCiMjIyMgMy4xIApQcmVwYXJlIHRoZSByZXF1aXJlZCB2b2x1bWUgb2YgRnJhZ21lbnQsIFByaW1lIGFuZCBFbHV0ZSBCdWZmZXIgKDFYKSBhdCByb29tIHRlbXBlcmF0dXJlIGFzIGZvbGxvd3M6ICAKYGBge3J9CmthYmxlKHRyaWJibGUofkNvbXBvbmVudCwgflZvbHVtZSwKICAgICAgICJ1bCBSTmFzZS1mcmVlIHdhdGVyIiwgMTEsIAogICAgICAgInVsIEZyYWdtZW50LCBQcmltZSwgYW5kIEVsdXRlIEJ1ZmZlciAoMngpIiwgMTEpICU+JSAKICBtdXRhdGUoVm9sdW1lID0gVm9sdW1lICogcGFyYW1zJG51bV9zYW1wbGVzICogcGFyYW1zJHJ4bl9tdWx0aXBsaWVyKSkgJT4lIAogIGthYmxlX3N0eWxpbmcoImJvcmRlcmVkIikgCmBgYAojIyMjIDMuMiAgClRob3JvdWdobHkgcmVzdXNwZW5kIHRoZSBtUk5BIENhcHR1cmUgQmVhZHMgd2l0aCBjYXB0dXJlZCBtUk5BIHByZXBhcmVkIGluIHN0ZXAgMi4yMCBpbiAyMiDOvEwgb2YgRnJhZ21lbnQsIFByaW1lIGFuZCBFbHV0ZSBCdWZmZXIgKDFYKS4gIAoKIyBTQUZFIFNUT1BQSU5HIFBPSU5UIE9WRVJOSUdIVCBPTkxZClJlc3VzcGVuZGVkIGJlYWRzIHdpdGggY2FwdHVyZWQgbVJOQSBtYXkgYmUgc3RvcmVkIGF0IDTCsEMgZm9yIOKJpDI0IGhycy4gRG8gbm90IGZyZWV6ZSB0aGUgc2FtcGxlcyBhcyB0aGlzIHdpbGwgZGFtYWdlIHRoZSBiZWFkcy4gV2hlbiByZWFkeSwgcHJvY2VlZCB0byBzdGVwIDMuMy4gIAoKIyMgUHJlcCByZWFnZW50cyBmb3IgbmV4dCBzZXQgb2Ygc3RlcHM6CmBgYHtyfQpmaXJzdF9zdHJhbmQgPC0gdHJpYmJsZSh+aXRlbSwgfnZvbHVtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICJ1bCBvZiAxc3Qgc3RyYW5kIHN5bnRoZXNpcyBidWZmZXIiLCAxMSwKICAgICAgICAgICAgICAgICAgICAgICAgInVsIG9mIEtBUEEgU2NyaXB0IiwgMSkgJT4lCiAgbXV0YXRlKHZvbHVtZSA9IHZvbHVtZSAqIHBhcmFtcyRudW1fc2FtcGxlcyAqIHBhcmFtcyRyeG5fbXVsdGlwbGllcikKCmthYmxlKGZpcnN0X3N0cmFuZCkgJT4lIAogIGthYmxlX3N0eWxpbmcoImJvcmRlcmVkIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIxc3QgU3RyYW5kIE1hc3RlciBNaXgiID0gMikpCgpgYGAKCmBgYHtyfQpzZWNvbmRfc3RyYW5kIDwtIHRyaWJibGUofml0ZW0sIH52b2x1bWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgInVsIDJuZCBTdHJhbmQgTWFya2luZyBCdWZmZXIiLCAzMSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ1bCAybmQgU3RyYW5kIFN5bnRoZXNpcyBhbmQgQS10YWlsaW5nIGVuenltZSBtaXgiLCAyKSAlPiUKICBtdXRhdGUodm9sdW1lID0gdm9sdW1lICogcGFyYW1zJG51bV9zYW1wbGVzICogcGFyYW1zJHJ4bl9tdWx0aXBsaWVyKQoKa2FibGUoc2Vjb25kX3N0cmFuZCkgJT4lIAogIGthYmxlX3N0eWxpbmcoImJvcmRlcmVkIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIybmQgU3RyYW5kIGFuZCBBLXRhaWxpbmcgTWFzdGVyIE1peCIgPSAyKSkKYGBgCgpgYGB7cn0KYWRhcHRlcl9saWcgPC0gdHJpYmJsZSh+aXRlbSwgfnZvbHVtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgInVsIExpZ2F0aW9uIEJ1ZmZlciIsIDQwLAogICAgICAgICAgICAgICAgICAgICAgICJ1bCBETkEgbGlnYXNlIiwgMTApICU+JQogIG11dGF0ZSh2b2x1bWUgPSB2b2x1bWUgKiBwYXJhbXMkbnVtX3NhbXBsZXMgKiBwYXJhbXMkcnhuX211bHRpcGxpZXIpCgprYWJsZShhZGFwdGVyX2xpZykgJT4lIAogIGthYmxlX3N0eWxpbmcoImJvcmRlcmVkIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJBZGFwdGVyIExpZ2F0aW9uIE1hc3RlciBNaXgiID0gMikpCmBgYApgYGB7cn0KYmVhZCA8LSB0cmliYmxlKH5pdGVtLCB+dm9sdW1lLCAKICAgICAgICAgICAgICAgICJ1bCBwb3N0LWxpZyBjbGVhbnVwIiwgNzAsCiAgICAgICAgICAgICAgICAidWwgTGlicmFyeSBBbXBsaWZpY2F0aW9uIGNsZWFudXAiLCA1MCkgJT4lCiAgbXV0YXRlKHZvbHVtZSA9IHZvbHVtZSAqIHBhcmFtcyRudW1fc2FtcGxlcyAqIHBhcmFtcyRyeG5fbXVsdGlwbGllcikgJT4lIAogIHN1bW1hcmlzZSh2b2x1bWUgPSBzdW0odm9sdW1lKSkKCmthYmxlKGJlYWQpICU+JSAKICBrYWJsZV9zdHlsaW5nKCJib3JkZXJlZCIpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygidWwgS2FwYSBwdXJlIGJlYWRzIG5lZWRlZCIgPSAxKSkKYGBgCmBgYHtyfQpldG9oIDwtIHRyaWJibGUofml0ZW0sIH52b2x1bWUsIAogICAgICAgICAgICAgICAgInVsIDFzdCBwb3N0LWxpZyBjbGVhbnVwIiwgNDAwLAogICAgICAgICAgICAgICAgInVsIDJuZCBwb3N0LWxpZyBjbGVhbnVwIiwgNDAwLAogICAgICAgICAgICAgICAgInVsIExpYnJhcnkgQW1wbGlmaWNhdGlvbiBjbGVhbnVwIiwgNDAwKSAlPiUKICBtdXRhdGUodm9sdW1lID0gdm9sdW1lICogcGFyYW1zJG51bV9zYW1wbGVzICogcGFyYW1zJHJ4bl9tdWx0aXBsaWVyKSAlPiUgCiAgc3VtbWFyaXNlKHZvbHVtZSA9IHN1bSh2b2x1bWUpLzEwMDApCgprYWJsZShldG9oKSAlPiUgCiAga2FibGVfc3R5bGluZygiYm9yZGVyZWQiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIm1MIDgwJSBFdE9IIG5lZWRlZCIgPSAxKSkKYGBgCmBgYHtyfQplbHV0IDwtIHRyaWJibGUofml0ZW0sIH52b2x1bWUsIAogICAgICAgICAgICAgICAgInVsIDFzdCBwb3N0LWxpZyBjbGVhbnVwIiwgNTAsCiAgICAgICAgICAgICAgICAidWwgMm5kIHBvc3QtbGlnIGNsZWFudXAiLCAyMiwKICAgICAgICAgICAgICAgICJ1bCBMaWJyYXJ5IEFtcGxpZmljYXRpb24gY2xlYW51cCIsIDIyKSAlPiUKICBtdXRhdGUodm9sdW1lID0gdm9sdW1lICogcGFyYW1zJG51bV9zYW1wbGVzICogcGFyYW1zJHJ4bl9tdWx0aXBsaWVyKSAlPiUgCiAgc3VtbWFyaXNlKHZvbHVtZSA9IHN1bSh2b2x1bWUpKQoKa2FibGUoZWx1dCkgJT4lIAogIGthYmxlX3N0eWxpbmcoImJvcmRlcmVkIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCJ1bCAxMG1NIFRyaXMtSENsIHBoIDguMC04LjUgRWx1dGlvbiBidWZmZXIgbmVlZGVkIiA9IDEpKQpgYGAKYGBge3J9ClBFRyA8LSB0cmliYmxlKH5pdGVtLCB+dm9sdW1lLCAKICAgICAgICAgICAgICAgInVsIDJuZCBwb3N0LWxpZyBjbGVhbnVwIiwgMzUpICU+JQogIG11dGF0ZSh2b2x1bWUgPSB2b2x1bWUgKiBwYXJhbXMkbnVtX3NhbXBsZXMgKiBwYXJhbXMkcnhuX211bHRpcGxpZXIpICU+JSAKICBzdW1tYXJpc2Uodm9sdW1lID0gc3VtKHZvbHVtZSkpCgprYWJsZShQRUcpICU+JSAKICBrYWJsZV9zdHlsaW5nKCJib3JkZXJlZCIpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygidWwgUEVHL05hQ2wgbmVlZGVkIiA9IDEpKQpgYGAKCiMjIyMgMy4zICAKUGxhY2UgdGhlIHBsYXRlL3R1YmUocykgaW4gYSB0aGVybW9jeWNsZXIgYW5kIGNhcnJ5IG91dCB0aGUgZnJhZ21lbnRhdGlvbiBhbmQgcHJpbWluZyBwcm9ncmFtIGdpdmVuIGluIHRoZSB0YWJsZSBiZWxvdzogIAoKfERlc2lyZWQgbWVhbiBsaWJyYXJ5IGluc2VydCBzaXplIChicCl8RnJhZ21lbnRhdGlvbnwKfC0tLS18LS0tLXwKfDEwMC0yMDB8OCBtaW4gYXQgOTTLmkN8CnwyMDAtMzAwfDYgbWluIGF0IDk0y5pDfAp8MzAwLTQwMHw2IG1pbiBhdCA4NcuaQ3wgIAoKIyMgV2UgYXJlIHNob290aW5nIGZvciBhIDM0Mi01NzIgaW5zZXJ0IHNpemUKCiMjIyMgMy40ICAKSW1tZWRpYXRlbHkgcGxhY2UgdGhlIHBsYXRlL3R1YmUocykgb24gYSBtYWduZXQgdG8gY2FwdHVyZSB0aGUgYmVhZHMsIGFuZCBpbmN1YmF0ZSB1bnRpbCB0aGUgbGlxdWlkIGlzIGNsZWFyLiAqKkNhdXRpb246IHRvIHByZXZlbnQgaHlicmlkaXphdGlvbiBvZiBwb2x5KEEpLXJpY2ggUk5BIHRvIHRoZSBjYXB0dXJlIGJlYWRzLCBkbyBub3QgYWxsb3cgdGhlIHNhbXBsZSB0byBjb29sIGJlZm9yZSBwbGFjaW5nIG9uIHRoZSBtYWduZXQuKiogIAoKIyMjIyAzLjUgIApDYXJlZnVsbHkgcmVtb3ZlIDIwzrxMIG9mIHRoZSBzdXBlcm5hdGFudCBjb250YWluaW5nIHRoZSBlbHV0ZWQsIGZyYWdtZW50ZWQsIGFuZCBwcmltZWQgUk5BIGludG8gYSBzZXBhcmF0ZSBwbGF0ZSBvciB0dWJlLiAgCgojIyMjIDMuNiAgClBsYWNlIHRoZSBwbGF0ZS90dWJlKHMpIG9uIGljZSBhbmQgcHJvY2VlZCBpbW1lZGlhdGVseSB0byAxc3QgU3RyYW5kIFN5bnRoZXNpcyAoc3RlcCA0KS4gIAoKIyMjIDQuIDFzdCBTdHJhbmQgU3ludGhlc2lzCgojIyMjIDQuMSAgCk9uIGljZSwgYXNzZW1ibGUgdGhlIDFzdCBzdHJhbmQgc3ludGhlc2lzIHJlYWN0aW9uIGFzIGZvbGxvd3M6ICAKCnxDb21wb25lbnR8Vm9sdW1lfAp8LS0tLXwtLS0tfAp8RnJhZ21lbnRlZCwgcHJpbWVkIFJOQSBlbHV0ZWQgZnJvbSBiZWFkc3wyMCB1bHwKfDFzdCBzdHJhbmQgc3ludGhlc2lzIG1hc3RlciBtaXggKFRhYmxlIDIpfDEwIHVsfAp8KipUb3RhbCBWb2x1bWUqKnwqKjMwIHVsKip8ICAKCiMjIyMgNC4yICAKS2VlcGluZyB0aGUgcGxhdGUvdHViZShzKSBvbiBpY2UsIG1peCB0aG9yb3VnaGx5IGJ5IGdlbnRseSBwaXBldHRpbmcgdGhlIHJlYWN0aW9uIHVwIGFuZCBkb3duIHNldmVyYWwgdGltZXMuICAKCiMjIyMgNC4zICAKSW5jdWJhdGUgdGhlIHBsYXRlL3R1YmUocykgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm90b2NvbDogIAoKfFN0ZXB8VGVtcHxEdXJhdGlvbnwKfC0tLS18LS0tLXwtLS0tfAp8UHJpbWVyIEV4dGVuc2lvbnwyNcuaQ3wxMCBtaW58Cnwxc3QgU3RyYW5kIFN5bnRoZXNpc3w0MsuaQ3wxNSBtaW58CnxFbnp5bWUgaW5hY3RpdmF0aW9ufDcwy5pDfDE1IG1pbnwKfEhPTER8NMuaQ3ziiJ58ICAKCiMjIyMgNC40ICAKUGxhY2UgdGhlIHBsYXRlL3R1YmUocykgb24gaWNlIGFuZCBwcm9jZWVkIGltbWVkaWF0ZWx5IHRvIDJuZCBTdHJhbmQgU3ludGhlc2lzIGFuZCBBLXRhaWxpbmcgKHN0ZXAgNSkuICAKCiMjIyA1LiAybmQgU3RyYW5kIFN5bnRoZXNpcyBhbmQgQS10YWlsaW5nICAKCiMjIyMgNS4xICAgCgpPbiBpY2UsIGFzc2VtYmxlIHRoZSAybmQgc3RyYW5kIHN5bnRoZXNpcyBhbmQgQS10YWlsaW5nIHJlYWN0aW9uIGFzIGZvbGxvd3M6ICAKCnxDb21wb25lbnR8Vm9sdW1lfAp8LS0tLXwtLS0tfAp8MXN0IHN0cmFuZCBzeW50aGVzaXMgcHJvZHVjdHwzMCB1THwKfDJuZCBzdHJhbmQgc3ludGhlc2lzIGFuZCBBLXRhaWxpbmcgbWFzdGVyIG1peCAoVGFibGUgMyl8MzAgdUx8CnwqKlRvdGFsIFZvbHVtZSoqfCoqNjAgdWwqKnwgIAoKIyMjIyA1LjIgIApLZWVwaW5nIHRoZSBwbGF0ZS90dWJlKHMpIG9uIGljZSwgbWl4IHRob3JvdWdobHkgYnkgZ2VudGx5IHBpcGV0dGluZyB0aGUgcmVhY3Rpb24gdXAgYW5kIGRvd24gc2V2ZXJhbCB0aW1lcy4gIAoKIyMjIyA1LjMgICAKSW5jdWJhdGUgdGhlIHBsYXRlL3R1YmUocykgdXNpbmcgdGhlIGZvbGxvd2luZyBwcm90b2NvbDogIAoKfFN0ZXB8VGVtcHxEdXJhdGlvbnwKfC0tLS18LS0tLXwtLS0tfAp8Mm5kIFN0cmFuZCBTeW50aGVzaXN8MTbLmkN8MzAgbWlufAp8QS1UYWlsaW5nfDYyy5pDfDEwIG1pbnwKfEhPTER8NMuaQ3ziiJ58ICAgCgojIyMjIDUuNCAgClBsYWNlIHRoZSBwbGF0ZS90dWJlKHMpIG9uIGljZSBhbmQgcHJvY2VlZCBpbW1lZGlhdGVseSB0byBBZGFwdGVyIExpZ2F0aW9uIChzdGVwIDYpLiAgCgojIyMgNi4gQWRhcHRlciBMaWdhdGlvbiAgCgojIyMjIDYuMSAKRGlsdXRlIGFkYXB0ZXJzIGluIHByZXBhcmF0aW9uIGZvciBsaWdhdGlvbiwgdGFyZ2V0aW5nIHRoZSBmb2xsb3dpbmcgY29uY2VudHJhdGlvbnM6ICAKCnxRdWFudGl0eSBvZiBzdGFydGluZyBtYXRlcmlhbHxBZGFwdGVyIHN0b2NrIGNvbmNlbnRyYXRpb258CnwtLS0tfC0tLS18Cnw1MCDigJMgNDk5IG5nfDEuNSB1TXwKfDUwMCDigJMgMTAwMCBuZ3w3IM68TXwgIAoKIyMjIyA2LjIgIApPbiBpY2UsIHNldCB1cCB0aGUgYWRhcHRlciBsaWdhdGlvbiByZWFjdGlvbiBhcyBmb2xsb3dzOiAgCgp8Q29tcG9uZW50fFZvbHVtZXwKfC0tLS18LS0tLXwKfDJuZCBzdHJhbmQgc3ludGhlc2lzIHByb2R1Y3R8NjAgzrxMfAp8QWRhcHRlciBsaWdhdGlvbiBtYXN0ZXIgbWl4IChUYWJsZSA0KXw0NSDOvEx8CnxEaWx1dGVkIGFkYXB0ZXIgc3RvY2t8NSDOvEx8CnwqKlRvdGFsIHZvbHVtZToqKnwqKjExMCDOvEwqKnwgIAoKIyMjIyA2LjMgIApLZWVwaW5nIHRoZSBwbGF0ZS90dWJlKHMpIG9uIGljZSwgbWl4IHRob3JvdWdobHkgYnkgcGlwZXR0aW5nIHRoZSByZWFjdGlvbiB1cCBhbmQgZG93biBzZXZlcmFsIHRpbWVzLiAgCgojIyMjIDYuNCAgCkluY3ViYXRlIHRoZSBwbGF0ZS90dWJlKHMpIGF0IDIwwrBDIGZvciAxNSBtaW4uICAKCiMjIyMgNi41ICAKUHJvY2VlZCBpbW1lZGlhdGVseSB0byAxc3QgUG9zdC1saWdhdGlvbiBDbGVhbnVwIChzdGVwIDcpLgoKIyMjIDcuIEZpcnN0IFBvc3QtbGlnYXRpb24gQ2xlYW51cCAgCgojIyMjIDcuMSAgClBlcmZvcm0gYSAwLjYzWCBiZWFkLWJhc2VkIGNsZWFudXAgYnkgY29tYmluaW5nIHRoZSBmb2xsb3dpbmc6ICAKCnxDb21wb25lbnR8Vm9sdW1lfAp8LS0tLXwtLS0tfAp8QWRhcHRlci1saWdhdGVkIEROQXwxMTAgzrxMfAp8S0FQQSBQdXJlIEJlYWRzfDcwIM68THwKfCoqVG90YWwgdm9sdW1lOioqfCoqMTgwIM68TCoqfCAgCgojIyMjIDcuMiAgCk1peCB0aG9yb3VnaGx5IGJ5IHZvcnRleGluZyBhbmQvb3IgcGlwZXR0aW5nIHVwIGFuZCBkb3duIG11bHRpcGxlIHRpbWVzLiAgCgojIyMjIDcuMyAgCkluY3ViYXRlIHRoZSBwbGF0ZS90dWJlKHMpIGF0IHJvb20gdGVtcGVyYXR1cmUgZm9yIDUg4oCTIDE1IG1pbiB0byBiaW5kIEROQSB0byB0aGUgYmVhZHMuICAKCiMjIyMgNy40ICAKUGxhY2UgdGhlIHBsYXRlL3R1YmUocykgb24gYSBtYWduZXQgdG8gY2FwdHVyZSB0aGUgYmVhZHMuIEluY3ViYXRlIHVudGlsIHRoZSBsaXF1aWQgaXMgY2xlYXIuICAKCiMjIyMgNy41ICAKQ2FyZWZ1bGx5IHJlbW92ZSBhbmQgZGlzY2FyZCAxNzUgzrxMIG9mIHN1cGVybmF0YW50LiAgCgojIyMjIDcuNiAgCktlZXBpbmcgdGhlIHBsYXRlL3R1YmUocykgb24gdGhlIG1hZ25ldCwgYWRkIDIwMCDOvEwgb2YgODAlIGV0aGFub2wuICAKCiMjIyMgNy43ICAKSW5jdWJhdGUgdGhlIHBsYXRlL3R1YmUocykgb24gdGhlIG1hZ25ldCBhdCByb29tIHRlbXBlcmF0dXJlIGZvciDiiaUzMCBzZWMuICAKCiMjIyMgNy44ICAKQ2FyZWZ1bGx5IHJlbW92ZSBhbmQgZGlzY2FyZCB0aGUgZXRoYW5vbC4gIAoKIyMjIyA3LjkgIApLZWVwaW5nIHRoZSBwbGF0ZS90dWJlKHMpIG9uIHRoZSBtYWduZXQsIGFkZCAyMDAgzrxMIG9mIDgwJSBldGhhbm9sLiAgCgojIyMjIDcuMTAgIApJbmN1YmF0ZSB0aGUgcGxhdGUvdHViZShzKSBvbiB0aGUgbWFnbmV0IGF0IHJvb20gdGVtcGVyYXR1cmUgZm9yIOKJpTMwIHNlYy4gIAoKIyMjIyA3LjExICAKQ2FyZWZ1bGx5IHJlbW92ZSBhbmQgZGlzY2FyZCB0aGUgZXRoYW5vbC4gVHJ5IHRvIHJlbW92ZSBhbGwgcmVzaWR1YWwgZXRoYW5vbCB3aXRob3V0IGRpc3R1cmJpbmcgdGhlIGJlYWRzLiAgCgojIyMjIDcuMTIgICAKRHJ5IHRoZSBiZWFkcyBhdCByb29tIHRlbXBlcmF0dXJlIGZvciAzIOKAkyA1IG1pbiwgb3IgdW50aWwgYWxsIG9mIHRoZSBldGhhbm9sIGhhcyBldmFwb3JhdGVkLiAqKkNhdXRpb246IG92ZXItZHJ5aW5nIHRoZSBiZWFkcyBtYXkgcmVzdWx0IGluIHJlZHVjZWQgeWllbGQuKiogIAoKIyMjIyA3LjEzICAKUmVtb3ZlIHRoZSBwbGF0ZS90dWJlKHMpIGZyb20gdGhlIG1hZ25ldC4gIAoKIyMjIyA3LjE0ICAKVGhvcm91Z2hseSByZXN1c3BlbmQgdGhlIGJlYWRzIGluIDUwIM68TCBvZiAxMCBtTSBUcmlzLUhDbCAocEggOC4wIOKAkyA4LjUpLiAgCgojIyMjIDcuMTUgIApJbmN1YmF0ZSB0aGUgcGxhdGUvdHViZShzKSBhdCByb29tIHRlbXBlcmF0dXJlIGZvciAyIG1pbiB0byBlbHV0ZSBETkEgb2ZmIHRoZSBiZWFkcy4gIAoKIyBTQUZFIFNUT1BQSU5HIFBPSU5UIE9WRVJOSUdIVCBPTkxZClRoZSBzb2x1dGlvbiB3aXRoIHJlc3VzcGVuZGVkIGJlYWRzIGNhbiBiZSBzdG9yZWQgYXQgNMKwQyBmb3Ig4omkMjQgaHJzLiBEbyBub3QgZnJlZXplIHRoZSBiZWFkcywgYXMgdGhpcyBjYW4gcmVzdWx0IGluIGRyYW1hdGljIGxvc3Mgb2YgRE5BLiBXaGVuIHJlYWR5LCBwcm9jZWVkIHRvIDJuZCBQb3N0LWxpZ2F0aW9uIENsZWFudXAgKHN0ZXAgOCkuCgojIyBQcmVwIHRoZSByZW1haW5pbmcgcmVhZ2VudHMgbmVlZGVkIGZvciBuZXh0IHN0ZXBzLCBtYWtlIGZyZXNoIEV0T0ggZXZlcnkgZGF5IG9mIHByb3RvY29sLgoKYGBge3J9CmxpYnJhcnlfYW1wIDwtIHRyaWJibGUofml0ZW0sIH52b2x1bWUsIAogICAgICAgICAgICAgICAgICAgICAgICJ1bCBIaUZpIEhvdFN0YXJ0IFJlYWR5TWl4IiwgMjUsCiAgICAgICAgICAgICAgICAgICAgICAgInVsIExpYnJhcnkgQW1wbGlmaWNhdGlvbiBQcmltZXIgTWl4IiwgNSkgJT4lCiAgbXV0YXRlKHZvbHVtZSA9IHZvbHVtZSAqIHBhcmFtcyRudW1fc2FtcGxlcyAqIHBhcmFtcyRyeG5fbXVsdGlwbGllcikKCmthYmxlKGxpYnJhcnlfYW1wKSAlPiUgCiAga2FibGVfc3R5bGluZygiYm9yZGVyZWQiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIkxpYnJhcnkgQW1wbGlmaWNhdGlvbiBNYXN0ZXIgTWl4IiA9IDIpKQpgYGAKCiMjIyA4LiAybmQgUG9zdC1saWdhdGlvbiBDbGVhbnVwICAKCiMjIyMgOC4xICAKUGVyZm9ybSBhIDAuN1ggYmVhZC1iYXNlZCBjbGVhbnVwIGJ5IGNvbWJpbmluZyB0aGUgZm9sbG93aW5nOiAgCgp8Q29tcG9uZW50fFZvbHVtZXwKfC0tLS18LS0tLXwKfEJlYWRzIHdpdGggcHVyaWZpZWQsIGFkYXB0ZXItbGlnYXRlZCBETkF8NTAgzrxMfAp8UEVHL05hQ2wgU29sdXRpb258MzUgzrxMfAp8KipUb3RhbCB2b2x1bWU6Kip8Kio4NSDOvEwqKnwgIAoKIyMjIyA4LjIgIApNaXggdGhvcm91Z2hseSBieSB2b3J0ZXhpbmcgYW5kL29yIHBpcGV0dGluZyB1cCBhbmQgZG93biBtdWx0aXBsZSB0aW1lcy4gIAoKIyMjIyA4LjMgIApJbmN1YmF0ZSB0aGUgcGxhdGUvdHViZShzKSBhdCByb29tIHRlbXBlcmF0dXJlIGZvciA1IOKAkyAxNSBtaW4gdG8gYmluZCBETkEgdG8gdGhlIGJlYWRzLiAgCgojIyMjIDguNCAgClBsYWNlIHRoZSBwbGF0ZS90dWJlKHMpIG9uIGEgbWFnbmV0IHRvIGNhcHR1cmUgdGhlIGJlYWRzLiBJbmN1YmF0ZSB1bnRpbCB0aGUgbGlxdWlkIGlzIGNsZWFyLiAgCgojIyMjIDguNQpDYXJlZnVsbHkgcmVtb3ZlIGFuZCBkaXNjYXJkIDgwIM68TCBvZiBzdXBlcm5hdGFudC4gIAoKIyMjIyA4LjYgICAKS2VlcGluZyB0aGUgcGxhdGUvdHViZShzKSBvbiB0aGUgbWFnbmV0LCBhZGQgMjAwIM68TCBvZiA4MCUgZXRoYW5vbC4gIAoKIyMjIyA4LjcgICAKSW5jdWJhdGUgdGhlIHBsYXRlL3R1YmUocykgb24gdGhlIG1hZ25ldCBhdCByb29tIHRlbXBlcmF0dXJlIGZvciDiiaUzMCBzZWMuICAKCiMjIyMgOC44ICAgCkNhcmVmdWxseSByZW1vdmUgYW5kIGRpc2NhcmQgdGhlIGV0aGFub2wuICAKCiMjIyMgOC45ICAgCktlZXBpbmcgdGhlIHBsYXRlL3R1YmUocykgb24gdGhlIG1hZ25ldCwgYWRkIDIwMCDOvEwgb2YgODAlIGV0aGFub2wuICAKCiMjIyMgOC4xMCAgIApJbmN1YmF0ZSB0aGUgcGxhdGUvdHViZShzKSBvbiB0aGUgbWFnbmV0IGF0IHJvb20gdGVtcGVyYXR1cmUgZm9yIOKJpTMwIHNlYy4gIAoKIyMjIyA4LjExICAKQ2FyZWZ1bGx5IHJlbW92ZSBhbmQgZGlzY2FyZCB0aGUgZXRoYW5vbC4gVHJ5IHRvIHJlbW92ZSBhbGwgcmVzaWR1YWwgZXRoYW5vbCB3aXRob3V0IGRpc3R1cmJpbmcgdGhlIGJlYWRzLiAgCgojIyMjIDguMTIgIApEcnkgdGhlIGJlYWRzIGF0IHJvb20gdGVtcGVyYXR1cmUgZm9yIDMg4oCTIDUgbWluLCBvciB1bnRpbCBhbGwgb2YgdGhlIGV0aGFub2wgaGFzIGV2YXBvcmF0ZWQuIENhdXRpb246IG92ZXItZHJ5aW5nIHRoZSBiZWFkcyBtYXkgcmVzdWx0IGluIHJlZHVjZWQgeWllbGQuICAKCiMjIyMgOC4xMyAgClJlbW92ZSB0aGUgcGxhdGUvdHViZShzKSBmcm9tIHRoZSBtYWduZXQuICAKCiMjIyMgOC4xNCAgClRob3JvdWdobHkgcmVzdXNwZW5kIHRoZSBiZWFkcyBpbiAyMs68TCBvZiAxMCBtTSBUcmlzLUhDbCAocEggOC4wIOKAkyA4LjUpLiAgCgojIyMjIDguMTUgIApJbmN1YmF0ZSB0aGUgcGxhdGUvdHViZShzKSBhdCByb29tIHRlbXBlcmF0dXJlIGZvciAyIG1pbiB0byBlbHV0ZSBETkEgb2ZmIHRoZSBiZWFkcy4gIAoKIyMjIyA4LjE2ICAKUGxhY2UgdGhlIHBsYXRlL3R1YmUocykgb24gYSBtYWduZXQgdG8gY2FwdHVyZSB0aGUgYmVhZHMuIEluY3ViYXRlIHVudGlsIHRoZSBsaXF1aWQgaXMgY2xlYXIuICAKCiMjIyMgOC4xNyAgClRyYW5zZmVyIDIwIM68TCBvZiB0aGUgY2xlYXIgc3VwZXJuYXRhbnQgdG8gYSBuZXcgcGxhdGUvdHViZShzKSBhbmQgcHJvY2VlZCB0byBMaWJyYXJ5IEFtcGxpZmljYXRpb24gKHN0ZXAgOSkuICAKCiMgU0FGRSBTVE9QUElORyBQT0lOVApUaGUgcHVyaWZpZWQsIGFkYXB0ZXItbGlnYXRlZCBsaWJyYXJ5IEROQSBtYXkgYmUgc3RvcmVkIGF0IDTCsEMgZm9yIOKJpDEgd2Vlaywgb3IgZnJvemVuIGF0IC0yMMKwQyBmb3Ig4omkMSBtb250aC4gV2hlbiByZWFkeSwgcHJvY2VlZCB0byBMaWJyYXJ5IEFtcGxpZmljYXRpb24gKHN0ZXAgOSkuICAKCiMjIyA5LiBMaWJyYXJ5IEFtcGxpZmljYXRpb24gIAoKIyMjIyA5LjEgIApBc3NlbWJsZSBlYWNoIGxpYnJhcnkgYW1wbGlmaWNhdGlvbiByZWFjdGlvbiBhcyBmb2xsb3dzOiAgCgp8Q29tcG9uZW50fFZvbHVtZXwKfC0tLS18LS0tLXwKfFB1cmlmaWVkLCBhZGFwdGVyLWxpZ2F0ZWQgRE5BfDIwIM68THwKfExpYnJhcnkgYW1wbGlmaWNhdGlvbiBtYXN0ZXIgbWl4IChUYWJsZSA1KXwzMCDOvEx8CnwqKlRvdGFsIHZvbHVtZToqKnwqKjUwIM68TCoqfCAgCgojIyMjIDkuMiAgIApNaXggd2VsbCBieSBwaXBldHRpbmcgdXAgYW5kIGRvd24gc2V2ZXJhbCB0aW1lcy4gIAoKIyMjIyA5LjMgIApBbXBsaWZ5IHRoZSBsaWJyYXJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgdGhlcm1vY3ljbGluZyBwcm9maWxlOiAgCgp8U3RlcHxUZW1wLnxEdXJhdGlvbnxDeWNsZXN8CnwtLS0tfC0tLS18LS0tLXwtLS0tfAp8SW5pdGlhbCBkZW5hdHVyYXRpb258IDk4wrBDfDQ1IHNlYyB8MXwgCnxEZW5hdHVyYXRpb24gfDk4wrBDfDE1IHNlY3xSZWZlciB0byBUYWJsZSAxfAp8QW5uZWFsaW5nKnwgNjDCsEN8MzAgc2VjfFJlZmVyIHRvIFRhYmxlIDF8CnxFeHRlbnNpb258IDcywrBDfDMwIHNlY3xSZWZlciB0byBUYWJsZSAxfAp8RmluYWwgRXh0ZW5zaW9ufCA3MsKwQ3wxIG1pbnwxfAp8SE9MRHwgNMKwQ3ziiJ58MXwgIAoKKipUYWJsZSAxKioKCnxRdWFudGl0eSBvZiBzdGFydGluZyBtYXRlcmlhbHxOdW1iZXIgb2YgY3ljbGVzfAp8LS0tLXwtLS0tfAp8NTAg4oCTIDEwMCBuZ3wxMyDigJMgMTZ8CnwxMDEg4oCTIDI1MCBuZ3wxMSDigJMgMTR8CnwyNTEg4oCTIDUwMCBuZ3w5IOKAkyAxMnwgCnw1MDEg4oCTIDEwMDAgbmd8NyDigJMgMTB8ICAKCiMjIyMgOS40ICAKUHJvY2VlZCBpbW1lZGlhdGVseSB0byBMaWJyYXJ5IEFtcGxpZmljYXRpb24gQ2xlYW51cCAoc3RlcCAxMCkuICAKCiMjIyAxMC4gTGlicmFyeSBBbXBsaWZpY2F0aW9uIENsZWFudXAgIAoKIyMjIyAxMC4xICAgClBlcmZvcm0gYSAxWCBiZWFkLWJhc2VkIGNsZWFudXAgYnkgY29tYmluaW5nIHRoZSBmb2xsb3dpbmc6ICAKCnxDb21wb25lbnR8Vm9sdW1lfAp8LS0tLXwtLS0tfAp8QWRhcHRlci1saWdhdGVkIEROQXw1MCDOvEx8CnxLQVBBIFB1cmUgQmVhZHN8NTAgzrxMfAp8KipUb3RhbCB2b2x1bWU6Kip8KioxMDAgzrxMKip8CgojIyMjIDEwLjIgIApNaXggdGhvcm91Z2hseSBieSB2b3J0ZXhpbmcgYW5kL29yIHBpcGV0dGluZyB1cCBhbmQgZG93biBtdWx0aXBsZSB0aW1lcy4gIAoKIyMjIyAxMC4zICAKSW5jdWJhdGUgdGhlIHBsYXRlL3R1YmUocykgYXQgcm9vbSB0ZW1wZXJhdHVyZSBmb3IgNSDigJMgMTUgbWluIHRvIGJpbmQgRE5BIHRvIHRoZSBiZWFkcy4gIAoKIyMjIyAxMC40ICAKUGxhY2UgdGhlIHBsYXRlL3R1YmUocykgb24gYSBtYWduZXQgdG8gY2FwdHVyZSB0aGUgYmVhZHMuIEluY3ViYXRlIHVudGlsIHRoZSBsaXF1aWQgaXMgY2xlYXIuICAKCiMjIyMgMTAuNSAgCkNhcmVmdWxseSByZW1vdmUgYW5kIGRpc2NhcmQgOTUgzrxMIG9mIHN1cGVybmF0YW50LiAgCgojIyMjIDEwLjYgIApLZWVwaW5nIHRoZSBwbGF0ZS90dWJlKHMpIG9uIHRoZSBtYWduZXQsIGFkZCAyMDAgzrxMIG9mIDgwJSBldGhhbm9sLiAgCgojIyMjIDEwLjcgIApJbmN1YmF0ZSB0aGUgcGxhdGUvdHViZShzKSBvbiB0aGUgbWFnbmV0IGF0IHJvb20gdGVtcGVyYXR1cmUgZm9yIOKJpTMwIHNlYy4gIAoKIyMjIyAxMC44ICAKQ2FyZWZ1bGx5IHJlbW92ZSBhbmQgZGlzY2FyZCB0aGUgZXRoYW5vbC4gIAoKIyMjIyAxMC45ICAKS2VlcGluZyB0aGUgcGxhdGUvdHViZShzKSBvbiB0aGUgbWFnbmV0LCBhZGQgMjAwIM68TCBvZiA4MCUgZXRoYW5vbC4gIAoKIyMjIyAxMC4xMCAgCkluY3ViYXRlIHRoZSBwbGF0ZS90dWJlKHMpIG9uIHRoZSBtYWduZXQgYXQgcm9vbSB0ZW1wZXJhdHVyZSBmb3Ig4omlMzAgc2VjLiAgCgojIyMjIDEwLjExICAKQ2FyZWZ1bGx5IHJlbW92ZSBhbmQgZGlzY2FyZCB0aGUgZXRoYW5vbC4gVHJ5IHRvIHJlbW92ZSBhbGwgcmVzaWR1YWwgZXRoYW5vbCB3aXRob3V0IGRpc3R1cmJpbmcgdGhlIGJlYWRzLiAgCgojIyMjIDEwLjEyICAKRHJ5IHRoZSBiZWFkcyBhdCByb29tIHRlbXBlcmF0dXJlIGZvciAzIOKAkyA1IG1pbiwgb3IgdW50aWwgYWxsIG9mIHRoZSBldGhhbm9sIGhhcyBldmFwb3JhdGVkLiBDYXV0aW9uOiBvdmVyLWRyeWluZyB0aGUgYmVhZHMgbWF5IHJlc3VsdCBpbiByZWR1Y2VkIHlpZWxkLiAgCgojIyMjIDEwLjEzICAKVGhvcm91Z2hseSByZXN1c3BlbmQgdGhlIGRyaWVkIGJlYWRzIGluIDIyIM68TCBvZiAxMCBtTSBUcmlzLUhDbCAocEggOC4wIOKAkyA4LjUpLiAgCgojIyMjIDEwLjE0ICAKSW5jdWJhdGUgdGhlIHBsYXRlL3R1YmUocykgYXQgcm9vbSB0ZW1wZXJhdHVyZSBmb3IgMiBtaW4gdG8gZWx1dGUgRE5BIG9mZiB0aGUgYmVhZHMuICAKCiMjIyMgMTAuMTUgIApQbGFjZSB0aGUgcGxhdGUvdHViZShzKSBvbiB0aGUgbWFnbmV0IHRvIGNhcHR1cmUgdGhlIGJlYWRzLiBJbmN1YmF0ZSB1bnRpbCB0aGUgbGlxdWlkIGlzIGNsZWFyLiAgCgojIyMjIDEwLjE2ICAKVHJhbnNmZXIgMjAgzrxMIG9mIHRoZSBjbGVhciBzdXBlcm5hdGFudCB0byBhIG5ldyBwbGF0ZS90dWJlKHMpLCBhbmQgc3RvcmUgdGhlIHB1cmlmaWVkLCBhbXBsaWZpZWQgbGlicmFyaWVzIGF0IDTCsEMgZm9yIOKJpCAxIHdlZWsgb3IgYXQgLTIwwrBDLiAgCgoK