Overview of the Green Office Challenge
The Green Office Challenge is a program sponsored by the Office of Sustainability to help faculty and staff at Northeastern University be more sustainable in their workplace. Since its start in the Fall of 2016, it has reached 658 different people in 164 departments and 411 positions. Out of the 658 participants, 219 or 33% have volunteered to be “Eco-Ambassadors”- a critical role for helping to operate and develop the program.
Figure 1, below, shows the number of Green Office Certifications over time by each starting Certification Level:

Scoring
All participants take a 41-question survey examining 5 key sustainability categories: Energy, Waste & Pollution Minimization, Recycling, Transportation, and Purchasing.
Participants are scored by the number of questions they answer “Yes” relative to the number of questions they answer “Action Needed”. Each question answered “Yes” increases a participant’s score. Participants may also answer “N/A” for “Not Applicable” if a question is not relevant to them or their office. N/A answers are not counted towards the final score (not directly anyway). In addition to the 41-question survey, participants may also describe in their own words other sustainable actions they take to earn extra points.
Table 1 shows the number of points needed to receive a Bronze, Silver, or Gold certification level as well as the average number of “Yes” and “Action Needed” answers given by participants on their first certification survey.
Table 1
| Bronze |
0-74 |
21 |
12 |
| Silver |
75-89 |
27 |
7 |
| Gold |
90+ |
32 |
3 |
Figure 2, below, shows the distribution of Points and Certification Levels earned on the first survey taken by the 658 participants. On their first survey, 18% (117) of participants received a Bronze Certification, 41% (272) received a Silver Certification, and 40% (269) received a Gold Certification

Recertification
After taking the survey the first time, many participants elect to re-certify, almost always improving their score in the process. Of the 658 Green Office Challenge participants, 120 participants or 18% re-certified. Figure 3, below, shows how the answer counts changed between these participants’ first and second survey certifications.

As seen in Figure 3, after their re-certification, participants increased their average number of “Yes” answers from 27 to 30 and decreased their average number of “Action Needed” answers from 6 to 3. The average number of “N/A” answers stayed the same at 8.
Figure 4, below, shows the impact that these improvements made on the average number of points participants earned:

As shown in Figure 4, re-certifying participants’ earned an average of 85 points on their First Survey and an average of 93 points on their Second Survey. This 8 point increase brought the average score past the Gold Certification Threshold of 89 points. For context, this could have been achieved by marking 4 additional “Yes” answers, 8 fewer “Action Needed” answers, or some combination of the two.
Figure 4 also shows that the distribution or spread of points narrowed in the Second Certification as the lowest scoring participants improved their score.
Figure 5, below, illustrates how the distribution of points changed from 2016 to 2019 as new participants took the Green Office Challenge and as previous participants re-certified:

To summarize, re-certifying is an essential means for Green Office Challenge participants to improve their score by reviewing their results and finding ways to improve upon what they marked as “Action Needed” the first time around. As mentioned earlier, only 18% of participants have re-certified thus far.
In the next sections, we will examine the most common answers participants gave for each question on the survey as well as the top actions taken by re-certifying participants. This will clarify which areas of the Green Office Challenge are most difficult as well as the low-hanging fruit that participants looking to re-certify should consider.
Green Office Challenge Question Analysis
Throughout this section, we will rank the questions of the Green Office Challenge survey by the proportion of participants who gave a given answer type. A high proportion of “Yes” answers identifies questions that are relatively easy to fulfill. On the other hand, a high proportion of “Action Needed” answers identifies questions that are more challenging. A high proportion of “N/A” (i.e. “Not Applicable”) answers identifies questions that are not relevant to most participants and thus may need to be revised.
Top Questions by Answer Proportion
First, we will rank questions by proportion of answers given by participants on their first survey, regardless of starting Certification Level (e.g. “Bronze” or “Gold”). This will establish a baseline of which questions are easy, challenging, or not relevant to all participants on their first survey (Figure 6, below).

Perhaps the most striking observation in Figure 6 above is that the 20 questions with the highest proportion of “Yes” answers are all around 80% or higher, meaning that the large majority of participants are all doing about half of the 41 possible actions on the survey. By contrast, the distribution of proportions for “Action Needed” are much more diverse, indicating that different aspects of the Green Office Challenge are challenging for different participants. It is unsurprising that “Action Needed” is the most common response to the question, “I have at least one potted plant at my desk” considering that action is only loosely related to office sustainability. On the other hand, “I work paperless” is the second most likely question to be answered “Action Needed” given that working completely paperless is often unfeasible. An improved version of the Green Office Challenge survey should take this into account.
In the “N/A” graph, many of the least relevant questions have to do with areas like events, purchasing, lighting and heating adjustments, or particular Facilities Customer Service requests that not all participants are involved in or have access to. The top “N/A” question (i.e. “I shut my personal printer when not in use”) is largely due to a survey design that doesn’t take into account if participants already answered “Yes” to “I use a shared printer as opposed to having a personal printer in my office”.
Top Answers per Question Section
Below, Figure 7, shows the proportion of answer types (i.e. “Yes”, “Action Needed”, or “N/A”) given in each question section (i.e. Energy, Waste & Pollution Minimization, Recycling, Transportation, and Purchasing) out of all answers given in that section. This provides further insight into which sustainability areas participants find easy, challenging, or not relevant.

As seen in Figure 7, questions relating to Recycling and Waste and Pollution are answered “Yes” around 80% of the time whereas Purchasing and Transportation related questions are answered “Yes” less than 50% of the time. As seen in Figure 7, this is because Purchasing and Transportation related questions are also answered “N/A” around 50% of the time. As discussed earlier in Figure 6, this is because not all participants have access to or are involved in these areas. Energy related questions are the most mixed, with participants likely to answer “Yes”, “Action Needed”, or “N/A” depending on the specific question.
Looking forward, Figure 7 highlights the need to revise Purchasing and Transportation related questions to be more relevant to more participants. It also highlights the opportunity to expand Recycling and Waste and Pollution related questions to be more ambitious areas given their current high rate of success.
Top Questions by Answer Proportion for Each Starting Certification Level
In this section, we will examine the proportion of participants who provided a given answer out of all of those in the same starting Certification Level (e.g. “Bronze”, “Silver”, “Gold”). Here, proportions are calculated based on the number of participants who received that Certification Level. For example, if 100 of the 269 participants who received a Gold Certification level answered “Yes” to a question, the proportion will be 37%. However, if 80 of the 117 participants who received a Bronze Certification level answered “Yes” to a question, the proportion will be 68%. Calculating different proportions based on the total participants in each Certification Level allows for easier comparison between Certification Levels.
The rank order of the questions in all of the following graphs are the same as in Figure 6. This will allow us to see how each Certification Level compares to the average for a given question and answer combination.
Figure 8, below, shows the proportion that each Certification Level answered “Action Needed” for the top 15 questions answered this way in Figure 6:

By definition, for almost all of the 15 questions in Figure 8, Bronze has the highest proportion of “Action Needed responses”, followed by Silver and then Gold. When we look at individual questions, however, this pattern becomes more nuanced. For example, the question, “I use a shared printer as opposed to having a personal printer in my office” has relatively little difference in “Action Needed” proportions between Gold, Silver, and Bronze certifications, indicating that this is a common challenge regardless of how well one does on other areas of the survey. By contrast, earlier in Figure 6, 52% of participants answered “Action Needed” to the question “I work paperless”. However, here in Figure 8 we can see that only 32% of participants with Gold Certifications answered this way, compared to 62% of Silver and 74% of Bronze.

In Figure 9, we can see that the questions most commonly answered “Yes” are largely the same across Certification Levels. What differences remain highlight some of the easier steps that participants with Bronze or Silver Certifications could take to improve their score.

In Figure 10, we can see that the question most commonly answered “Not Applicable” are pretty universal across Certification Levels. This emphasizes the need to revise these questions to be more relevant so that they can be included in calculating participants’ scores and Certification Levels.
In the next section, we will compare the first and second surveys of the 120 participants who re-certified to highlight the most common actions taken to improve their scores.
Top Actions Taken by Re-certifying Participants
We already know that re-certifying is an essential part of the Green Office Challenge in that it allows participants to review their current situation and find ways to do even better. What we don’t yet know is the particular actions that participants have been most likely to take to do so. To diagnose this, we will compare the answers given in participants’ first survey to the answers given in their second survey and categorize them as “Action Taken” in the following manner shown in Table 2:
Table 2
| Action Needed |
Action Needed |
Action Still Needed |
| Action Needed |
Yes |
Improved |
| Yes |
Yes |
Yes Stable |
| Yes |
Action Needed |
Regressed |
| N/A |
N/A |
Still Not Applicable |
Other combinations of N/A were not included due to difficulty of interpretation.
Figure 11, below, shows the results of this analysis:

In the “Action Still Needed” plot in Figure 11, we can see that many of the same challenges in the first survey (Fig. 6) remain for participants in the second survey, as seen in questions like, “I work paperless”, “I use a shared printer as opposed to having a personal printer in my office”, or “I usually take notes electronically or on scrap paper…”. However, the proportion of participants has decreased significantly for all of these “Action Needed” questions, largely because of the changes illustrated in the “Improved” plot in Figure 11.
For example, in the first survey (Fig. 6), 31% of participants answered “Action Needed” for “I usually take notes electronically or on scrap paper…”, but in the second survey, 19% of participants were able to improve in this area (Fig. 11, “Improved” plot). Also impressive are the 18% of participants who Improved on “I work paperless” (Fig. 11, “Improved” plot) in contrast to the 52% of participants who answered “Action Needed” in the first survey (Fig. 6). Other significant improvements are the 24% who now have “a set of durable and reusable silver that I keep in the office” or the 15% who have “[cancelled] subscriptions to printed periodicals and catalogs”. The “Improved” plot in Figure 11 emphasizes the importance of re-certifying and the specific actions that many have taken.
On the other hand, the top five most common “Regressed” actions Figure 11 shows which areas might be difficult to maintain over time. Further support from office co-workers or other Green Office participants may be helpful to prevent this.
Figure 12, below, highlights the areas that are “Still Not Applicable” across participants’ first and second surveys. These are largely the same as the “Not Applicable” responses in the first survey seen in Figure 6.

Conclusion and Next Steps
This report captures how Northeastern University’s Green Office Challenge has operated since its launch in the Fall of 2016. Going forward, this baseline provides an opportunity to improve the program and measure the impact of those improvements. Key improvement areas include increasing re-certification, involving Eco-Ambassadors more comprehensively, and revising the survey both to be more applicable and to better quantify the real environmental impact of the program.
LS0tCnRpdGxlOiAiR09fbHVuY2hfbGVhcm5fU2FnZV9HaWJib25zIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMycKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMycKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKYm9keXsgLyogTm9ybWFsICAqLwogICAgICBmb250LXNpemU6IDE0cHg7CiAgfQp0ZCB7ICAvKiBUYWJsZSAgKi8KICBmb250LXNpemU6IDEycHg7Cn0KaDEudGl0bGUgewogIGZvbnQtc2l6ZTogMThweDsKfQpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAxOHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQpoMiB7IC8qIEhlYWRlciAyICovCiAgICBmb250LXNpemU6IDE2cHg7CiAgY29sb3I6IERhcmtCbHVlOwp9Cn0KaDMgeyAvKiBIZWFkZXIgMyAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQpjb2RlLnJ7IC8qIENvZGUgYmxvY2sgKi8KICAgIGZvbnQtc2l6ZTogMTJweDsKfQpwcmUgeyAvKiBDb2RlIGJsb2NrIC0gZGV0ZXJtaW5lcyBjb2RlIHNwYWNpbmcgYmV0d2VlbiBsaW5lcyAqLwogICAgZm9udC1zaXplOiAxNHB4Owp9Cjwvc3R5bGU+CgojIE92ZXJ2aWV3IG9mIHRoZSBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlClRoZSBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlIGlzIGEgcHJvZ3JhbSBzcG9uc29yZWQgYnkgdGhlIE9mZmljZSBvZiBTdXN0YWluYWJpbGl0eSB0byBoZWxwIGZhY3VsdHkgYW5kIHN0YWZmIGF0IE5vcnRoZWFzdGVybiBVbml2ZXJzaXR5IGJlIG1vcmUgc3VzdGFpbmFibGUgaW4gdGhlaXIgd29ya3BsYWNlLiBTaW5jZSBpdHMgc3RhcnQgaW4gdGhlIEZhbGwgb2YgMjAxNiwgaXQgaGFzIHJlYWNoZWQgNjU4IGRpZmZlcmVudCBwZW9wbGUgaW4gMTY0IGRlcGFydG1lbnRzIGFuZCA0MTEgcG9zaXRpb25zLiBPdXQgb2YgdGhlIDY1OCBwYXJ0aWNpcGFudHMsIDIxOSBvciAzMyUgaGF2ZSB2b2x1bnRlZXJlZCB0byBiZSAiRWNvLUFtYmFzc2Fkb3JzIi0gYSBjcml0aWNhbCByb2xlIGZvciBoZWxwaW5nIHRvIG9wZXJhdGUgYW5kIGRldmVsb3AgdGhlIHByb2dyYW0uCgpGaWd1cmUgMSwgYmVsb3csIHNob3dzIHRoZSBudW1iZXIgb2YgR3JlZW4gT2ZmaWNlIENlcnRpZmljYXRpb25zIG92ZXIgdGltZSBieSBlYWNoIHN0YXJ0aW5nIENlcnRpZmljYXRpb24gTGV2ZWw6CgpgYGB7ciBHcmVlbiBPZmZpY2UgT3ZlciBUaW1lLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHMgPSBGQUxTRX0KI0JZIENFUlQKI3NlbGVjdGluZyB2YXJpYWJsZXMgb2YgaW50ZXJlc3QKZ29zdXJ2ICU+JSAKICBmaWx0ZXIoc3VydmV5b3JkZXIgPT0gMSkgJT4lIAogIHNlbGVjdChDZXJ0LCBkYXRlKSAtPiBnb3RpbWUKCiNjb3VudGluZyBudW1iZXIgb2YgZWFjaCBDZXJ0IG9uIGVhY2ggcmVjb3JkZWQgZGF0ZQpnb3RpbWUgJT4lIGdyb3VwX2J5KENlcnQsIGRhdGUpICU+JSBjb3VudCgpICU+JSByZW5hbWUoY2VydF9jbnQgPSBuKSAlPiUgYXJyYW5nZShkYXRlKSAtPiBnb3RpbWUKCiNnZXR0aW5nIHRoZSBjdW1zdW0gb2YgZWFjaCBDZXJ0IG92ZXIgdGltZQpnb3RpbWUgJT4lIGdyb3VwX2J5KENlcnQpICU+JSBtdXRhdGUoY2VydF9jdW1zdW0gPSBjdW1zdW0oY2VydF9jbnQpKSAtPiBnb3RpbWUKCiNjb252ZXJ0aW5nIFBPU0lYY3QgdmFyaWFibGUgdG8gZGF0ZSBmb3IgZ2VvbV9saW5lCmdvdGltZSRkYXRlIDwtIGFzLkRhdGUoZ290aW1lJGRhdGUsIGZvcm1hdD0gIiV5LyVtLyVkIikKCmdvdGltZSAlPiUKIGdncGxvdCguLCBhZXMoeD1kYXRlLCB5PWNlcnRfY3Vtc3VtLCBjb2xvcj1DZXJ0KSkgKwogIGdlb21fbGluZShzaXplPTEpICsgCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjQgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYi0lWSciKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9IkNlcnRpZmljYXRpb24iLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiNBRDhBNTYiLCAiI0I0QjRCNCIsICIjQzlCMDM3IiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPSBjKCJCcm9uemUiLCAiU2lsdmVyIiwgIkdvbGQiKSkrIAogIGxhYnModGl0bGUgPSAiRmlnLiAxOiBHcmVlbiBPZmZpY2UgQ2VydGlmaWNhdGlvbnMgT3ZlciBUaW1lIikrCiAgICAgICB5bGFiKCJOdW1iZXIgb2YgUGVvcGxlIikrIAogICAgICAgeGxhYigiRGF0ZSIpKyAKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbSA9IDAsIHRvID0gMzAwLCBieSA9IDI1KSkgLT4gcAoKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkodHJhbnNmb3JtcikKbGlicmFyeSgnZ2lmc2tpJykKbGlicmFyeSgncG5nJykKbGlicmFyeSgiZ2FwbWluZGVyIikKcCArIHRyYW5zaXRpb25fcmV2ZWFsKGRhdGUpIC0+IHBfYQoKI2FuaW1hdGUocF9hLCB3aWR0aCA9IDE1MDAsIGhlaWdodCA9IDkwMCwgdW5pdHMgPSJweCIsIHJlcyA9IDEwMCkKYW5pbV9zYXZlKCJwX2EuZ2lmIiwgcF9hLCB3aWR0aCA9IDE1MDAsIGhlaWdodCA9IDkwMCwgdW5pdHMgPSJweCIsIHJlcyA9IDEwMCkKCmBgYAoKIVtdKHBfYS5naWYpCgoKYGBge3IgYWx0ZXJuYXRlIHRpbWUsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cyA9IEZBTFNFLCBldmFsPUZBTFNFfQojQlkgUEVSU09OCiNzZWxlY3RpbmcgdmFyaWFibGVzIG9mIGludGVyZXN0Cmdvc3VydiAlPiUgZmlsdGVyKHN1cnZleW9yZGVyID09IDEpICU+JSBzZWxlY3QocGVyc29uSUQsIGRhdGUpIC0+IGdvdGltZTIKCiNjb3VudGluZyBudW1iZXIgb2YgZWFjaCBDZXJ0IG9uIGVhY2ggcmVjb3JkZWQgZGF0ZQpnb3RpbWUyICU+JSBncm91cF9ieShkYXRlKSAlPiUgY291bnQoKSAlPiUgcmVuYW1lKHBlcnNvbl9jbnQgPSBuKSAlPiUgYXJyYW5nZShkYXRlKSAtPiBnb3RpbWUyCgojZ2V0dGluZyB0aGUgY3Vtc3VtIG9mIGVhY2ggQ2VydCBvdmVyIHRpbWUKZ290aW1lMiAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUocGVyc29uX2N1bXN1bSA9IGN1bXN1bShwZXJzb25fY250KSkgLT4gZ290aW1lMgoKI2NvbnZlcnRpbmcgUE9TSVhjdCB2YXJpYWJsZSB0byBkYXRlIGZvciBnZW9tX2xpbmUKZ290aW1lMiRkYXRlIDwtIGFzLkRhdGUoZ290aW1lMiRkYXRlLCBmb3JtYXQ9ICIleS8lbS8lZCIpCgpnb3RpbWUyICU+JQogZ2dwbG90KC4sIGFlcyh4PWRhdGUsIHk9cGVyc29uX2N1bXN1bSkpICsKICBnZW9tX2xpbmUoKSArIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICI2IG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWItJXknIikKCmdvdGltZTIgPC0gZ290aW1lMiAlPiUgcmVuYW1lKGNlcnRfY3Vtc3VtID0gcGVyc29uX2N1bXN1bSkKcCA8LSBnZ3Bsb3QoZ290aW1lMiwgYWVzKHg9ZGF0ZSwgeT1jZXJ0X2N1bXN1bSkpCnAgPC0gcCArIGdlb21fYXJlYShzdGF0PSJpZGVudGl0eSIsIGFscGhhPTAuMSkgCgpwICsgZ2VvbV9saW5lKGRhdGE9Z290aW1lLCBhZXMoeD1kYXRlLCB5PWNlcnRfY3Vtc3VtLCBjb2xvcj1DZXJ0KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPSJDZXJ0aWZpY2F0aW9uIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCIjQUQ4QTU2IiwgIiNCNEI0QjQiLCAiI0M5QjAzNyIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz0gYygiQnJvbnplIiwgIlNpbHZlciIsICJHb2xkIikpKyAKICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiNiBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViLSV5JyIpCgpgYGAKCgpcCgoKIyMgU2NvcmluZwpcCkFsbCBwYXJ0aWNpcGFudHMgdGFrZSBhIDQxLXF1ZXN0aW9uIHN1cnZleSBleGFtaW5pbmcgNSBrZXkgc3VzdGFpbmFiaWxpdHkgY2F0ZWdvcmllczogRW5lcmd5LCBXYXN0ZSAmIFBvbGx1dGlvbiBNaW5pbWl6YXRpb24sIFJlY3ljbGluZywgVHJhbnNwb3J0YXRpb24sIGFuZCBQdXJjaGFzaW5nLgoKUGFydGljaXBhbnRzIGFyZSBzY29yZWQgYnkgdGhlIG51bWJlciBvZiBxdWVzdGlvbnMgdGhleSBhbnN3ZXIg4oCcWWVz4oCdIHJlbGF0aXZlIHRvIHRoZSBudW1iZXIgb2YgcXVlc3Rpb25zIHRoZXkgYW5zd2VyIOKAnEFjdGlvbiBOZWVkZWTigJ0uIEVhY2ggcXVlc3Rpb24gYW5zd2VyZWQgIlllcyIgaW5jcmVhc2VzIGEgcGFydGljaXBhbnTigJlzIHNjb3JlLiBQYXJ0aWNpcGFudHMgbWF5IGFsc28gYW5zd2VyIOKAnE4vQeKAnSBmb3Ig4oCcTm90IEFwcGxpY2FibGXigJ0gaWYgYSBxdWVzdGlvbiBpcyBub3QgcmVsZXZhbnQgdG8gdGhlbSBvciB0aGVpciBvZmZpY2UuIE4vQSBhbnN3ZXJzIGFyZSBub3QgY291bnRlZCB0b3dhcmRzIHRoZSBmaW5hbCBzY29yZSAobm90IGRpcmVjdGx5IGFueXdheSkuIEluIGFkZGl0aW9uIHRvIHRoZSA0MS1xdWVzdGlvbiBzdXJ2ZXksIHBhcnRpY2lwYW50cyBtYXkgYWxzbyBkZXNjcmliZSBpbiB0aGVpciBvd24gd29yZHMgb3RoZXIgc3VzdGFpbmFibGUgYWN0aW9ucyB0aGV5IHRha2UgdG8gZWFybiBleHRyYSBwb2ludHMuCgpUYWJsZSAxIHNob3dzIHRoZSBudW1iZXIgb2YgcG9pbnRzIG5lZWRlZCB0byByZWNlaXZlIGEgQnJvbnplLCBTaWx2ZXIsIG9yIEdvbGQgY2VydGlmaWNhdGlvbiBsZXZlbCBhcyB3ZWxsIGFzIHRoZSBhdmVyYWdlIG51bWJlciBvZiDigJxZZXPigJ0gYW5kIOKAnEFjdGlvbiBOZWVkZWTigJ0gYW5zd2VycyBnaXZlbiBieSBwYXJ0aWNpcGFudHMgb24gdGhlaXIgZmlyc3QgY2VydGlmaWNhdGlvbiBzdXJ2ZXkuCgoKYGBge3IgVGFibGUgMSwgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gJ2FzaXMnLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQojIyMjUmVwbGljYWJpbGl0eQojI0F2ZXJhZ2UgbnVtYmVyIG9mIGFuc3dlcnMgZm9yIGZpcnN0IGNlcnRpZmljYXRpb24KI2dvcXVlcyAlPiUgZ3JvdXBfYnkocGVyc29uSUQsIENlcnRfMSwgYW5zd2VyXzEpICU+JSBjb3VudCgpICU+JSBncm91cF9ieShDZXJ0XzEsIGFuc3dlcl8xKSAlPiUgc3VtbWFyaXplKG1lYW4gPSBtZWFuKG4pKQoKIyNSYW5nZSBvZiBwb2ludHMKI2dvc3VydiAlPiUgc2VsZWN0KENlcnQsIFBlcmMpICU+JSBncm91cF9ieShDZXJ0KSAlPiUgc3VtbWFyaXplKHJhbmdlID0gcmFuZ2UoUGVyYyksbWVhbiA9IG1lYW4oUGVyYykpCgpyYW5nZSA8LSBjKCIwLTc0IiwgIjc1LTg5IiwgIjkwKyIpCm1lYW5feWVzIDwtIGMoMjEsIDI3LCAzMikKbWVhbl9hbiA8LSBjKDEyLCA3LCAzKQpjZXJ0IDwtIGMoIkJyb256ZSIsICJTaWx2ZXIiLCAiR29sZCIpCgp0YWJsZTEgPC0gZGF0YS5mcmFtZShjZXJ0LCByYW5nZSwgbWVhbl95ZXMsIG1lYW5fYW4pICU+JSAKICByZW5hbWUoYENlcnRpZmljYXRpb24gTGV2ZWxgID0gY2VydCwgYFBvaW50cyBOZWVkZWRgID0gcmFuZ2UsIGBBdmVyYWdlIE51bWJlciBvZiAnWWVzJyBBbnN3ZXJzYCA9IG1lYW5feWVzLCAKIGBBdmVyYWdlIE51bWJlciBvZiAnQWN0aW9uIE5lZWRlZCcgQW5zd2Vyc2AgPSBtZWFuX2FuKQoKa2FibGUodGFibGUxLCBjYXB0aW9uID0gIlRhYmxlIDEiKQpgYGAKCkZpZ3VyZSAyLCBiZWxvdywgc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiBQb2ludHMgYW5kIENlcnRpZmljYXRpb24gTGV2ZWxzIGVhcm5lZCBvbiB0aGUgZmlyc3Qgc3VydmV5IHRha2VuIGJ5IHRoZSA2NTggcGFydGljaXBhbnRzLiBPbiB0aGVpciBmaXJzdCBzdXJ2ZXksIDE4JSAoMTE3KSBvZiBwYXJ0aWNpcGFudHMgcmVjZWl2ZWQgYSBCcm9uemUgQ2VydGlmaWNhdGlvbiwgNDElICgyNzIpIHJlY2VpdmVkIGEgU2lsdmVyIENlcnRpZmljYXRpb24sIGFuZCA0MCUgKDI2OSkgcmVjZWl2ZWQgYSBHb2xkIENlcnRpZmljYXRpb24KCmBgYHtyIHBvaW50cyBlYXJuZWQgYnkgY2VydHMgZmlyc3Qgc3VydmV5LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PSIiLCBpbmNsdWRlPVRSVUUsIGZpZy5oZWlnaHQ9IDUsIGZpZy53aWR0aD0xMCwgZHBpPTk2fQoKI05PVEVTOiBUaGlzIHdvdWxkIGJlIGludGVyYWN0aXZlIGZvciBudW1iZXIgb2YgYmlucy4gUmVtb3ZlIGxlZ2VuZCBjb21wbGV0ZWx5LiAKI09yIGludGVyYWN0aXZlIHRvIHN3aXRjaCB0aGUgc3VydmV5b3JkZXIgZmlsdGVyIQoKZ29zdXJ2ICU+JSBmaWx0ZXIoc3VydmV5b3JkZXIgPT0gMSkgJT4lCiAgc2VsZWN0KENlcnQsIFBlcmMpICU+JSAKICBncm91cF9ieShDZXJ0KSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9UGVyYywgZmlsbD1DZXJ0KSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zPTY1KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0FEOEE1NiIsICIjQjRCNEI0IiwgIiNDOUIwMzciKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTAsIDExMCwgNSkpKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMzAsIDUpKSsKICAgIGxhYnMoeCA9ICJOdW1iZXIgb2YgUG9pbnRzIiwKICAgICAgICAgeSA9ICJDb3VudCIsCiAgICAgICAgIHRpdGxlID0gIkZpZy4yOiBQb2ludHMgRWFybmVkIG9uIEZpcnN0IFN1cnZleSIpKwp0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpLCBhbmdsZSA9IDAwKSkgKwp0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpLCBhbmdsZSA9IDAwKSkgKwp0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9MywgZmFjZT0iYm9sZCIsIGNvbG9yPSJibGFjayIsIHNpemU9cmVsKDMpKSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBoanVzdCA9IDEsIHNpemU9IHJlbCgyLjgpKSkgKwp0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBoanVzdCA9IDEsIHNpemU9IHJlbCgyLjgpKSkKCiNSZXBsaWNhYmlsaXR5IG9mIHByb3BvcnRpb25zCiNnb3N1cnYgJT4lIGZpbHRlcihzdXJ2ZXlvcmRlciA9PSAxKSAlPiUgZ3JvdXBfYnkoQ2VydCkgJT4lIGNvdW50KCkKCgpgYGAKCgpcCgoKIyMgUmVjZXJ0aWZpY2F0aW9uClwKCkFmdGVyIHRha2luZyB0aGUgc3VydmV5IHRoZSBmaXJzdCB0aW1lLCBtYW55IHBhcnRpY2lwYW50cyBlbGVjdCB0byByZS1jZXJ0aWZ5LCBhbG1vc3QgYWx3YXlzIGltcHJvdmluZyB0aGVpciBzY29yZSBpbiB0aGUgcHJvY2Vzcy4gT2YgdGhlIDY1OCBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlIHBhcnRpY2lwYW50cywgMTIwIHBhcnRpY2lwYW50cyBvciAxOCUgcmUtY2VydGlmaWVkLiBGaWd1cmUgMywgYmVsb3csIHNob3dzIGhvdyB0aGUgYW5zd2VyIGNvdW50cyBjaGFuZ2VkIGJldHdlZW4gdGhlc2UgcGFydGljaXBhbnRzJyBmaXJzdCBhbmQgc2Vjb25kIHN1cnZleSBjZXJ0aWZpY2F0aW9ucy4KCmBgYHtyIEFuc3dlciBtZWFucyBjaGFuZ2Ugb3ZlciBzdXJ2ZXlvcmRlciwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KI0Fuc3dlciBtZWFucyBjaGFuZ2Ugb3ZlciBzdXJ2ZXlvcmRlcgojTm90ZSB0aGF0IEkgZmlyc3QgZmlsdGVyIGdvdGlkeSBhbmQgdGhlbiBzZW1pX2pvaW4gd2l0aCBnb3N1cnYgdG8gZ2V0IG9ubHkgdGhvc2UgaW4gc3VydmV5b3JkZXIgPT0yIHdobyBhcmUgYWxzbyBpbiBzdXJ2ZXlvcmRlcj09MS4gTm90IGRvaW5nIHRoaXMgaW5mbGF0ZXMgc3VydmV5b3JkZXI9PTEgYXZlcmFnZSAieWVzIiBzY29yZSBmcm9tIDI3IHRvIDI4LgoKZ290aWR5ICU+JSBmaWx0ZXIoIWlzLm5hKENlcnRfMikpICU+JSAKICBzZW1pX2pvaW4oZ29zdXJ2LCAuKSAlPiUgCiAgZmlsdGVyKHN1cnZleW9yZGVyID09IDEgfCBzdXJ2ZXlvcmRlciA9PTIpICU+JSAKICBzZWxlY3Qoc3VydmV5b3JkZXIsIGNudF95ZXMsIGNudF9hY3Rpb25uZWVkZWQsIGNudF9uYSwgY250X25vKSAlPiUKICByZW5hbWUoIlllcyIgPSBjbnRfeWVzLCAiQWN0aW9uIE5lZWRlZCIgPSBjbnRfYWN0aW9ubmVlZGVkLCAiTi9BIiA9IGNudF9uYSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGMoMjo1KSwgbmFtZXNfdG89ImFuc3dlciIsIHZhbHVlc190bz0iY291bnQiKSAlPiUgCiAgZ3JvdXBfYnkoc3VydmV5b3JkZXIsIGFuc3dlcikgJT4lCiAgc3VtbWFyaXplKG1lYW4gPSByb3VuZChtZWFuKGNvdW50KSwwKSkgJT4lIAogIGZpbHRlcihzdXJ2ZXlvcmRlciAhPTQgJiBhbnN3ZXIgIT0gImNudF9ubyIpICU+JQogIGdncGxvdCguLCBhZXMocmVvcmRlcihhbnN3ZXIsIC1tZWFuKSwgbWVhbiwgZmlsbD1zdXJ2ZXlvcmRlcikpICsKICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiKSsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSJDZXJ0aWZpY2F0aW9uIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIiM1Q0E5RkQiLCAiI0ZDNkI0OSIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz0gYygiRmlyc3QiLCAiU2Vjb25kIikpKyAKICBsYWJzKHRpdGxlID0gIkZpZy4gMzogQ2hhbmdlIGluIEFuc3dlciBDb3VudHMgQmV0d2VlbiBTdXJ2ZXkgMSBhbmQgMiIpKwogICAgICAgeGxhYigiQW5zd2VyIFR5cGUiKSsgCiAgICAgICB5bGFiKCJBdmVyZ2UgTnVtYmVyIG9mIEFuc3dlcnMgcGVyIFBlcnNvbiIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcShmcm9tID0gMCwgdG8gPSAzNSwgYnkgPSAyKSkrIAogIHRoZW1lX21pbmltYWwoKSAKCgpgYGAKCkFzIHNlZW4gaW4gRmlndXJlIDMsIGFmdGVyIHRoZWlyIHJlLWNlcnRpZmljYXRpb24sIHBhcnRpY2lwYW50cyBpbmNyZWFzZWQgdGhlaXIgYXZlcmFnZSBudW1iZXIgb2YgIlllcyIgYW5zd2VycyBmcm9tIDI3IHRvIDMwIGFuZCBkZWNyZWFzZWQgdGhlaXIgYXZlcmFnZSBudW1iZXIgb2YgIkFjdGlvbiBOZWVkZWQiIGFuc3dlcnMgZnJvbSA2IHRvIDMuIFRoZSBhdmVyYWdlIG51bWJlciBvZiAiTi9BIiBhbnN3ZXJzIHN0YXllZCB0aGUgc2FtZSBhdCA4LgoKRmlndXJlIDQsIGJlbG93LCBzaG93cyB0aGUgaW1wYWN0IHRoYXQgdGhlc2UgaW1wcm92ZW1lbnRzIG1hZGUgb24gdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHBvaW50cyBwYXJ0aWNpcGFudHMgZWFybmVkOgoKYGBge3IgRGVuc2l0eSBDaGFuZ2UgUG9pbnRzIFN1cnZleSAxIGFuZCAyLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKI1RoaXMgb25lIGluY2x1ZGVzIEFMTCBwZW9wbGUgZnJvbSBzdXJ2ZXlvcmRlciA9PSAxIHJhdGhlciB0aGFuIGp1c3QgdGhvc2Ugd2hvIGFyZSBBTFNPIGluIHN1cnZleW9yZGVyID09IDIgb3IgMy4gTGVzcyBpbnRlcnByZXRhYmxlIGNvbnNpZGVyaW5nIHNlbGVjdGlvbiBiaWFzIG9mIHRob3NlIHdobyB0YWtlIHRoZSBzdXJ2ZXkgYWdhaW46CiNnb3N1cnYgJT4lIGZpbHRlcihzdXJ2ZXlvcmRlciAhPSA0KSAlPiUgZ2dwbG90KC4sIGFlcyh4PVBlcmMsIGNvbD1zdXJ2ZXlvcmRlcikpICsgZ2VvbV9kZW5zaXR5KHBvc2l0aW9uPSJpZGVudGl0eSIsIGFscGhhPSAwLjIpCgojVXNpbmcgZ290aWR5Li4uCgpnb3RpZHkgJT4lIGZpbHRlcighaXMubmEoUGVyY18xKSAmICFpcy5uYShQZXJjXzIpKSAlPiUgc2VsZWN0KFBlcmNfMSwgUGVyY18yKSAlPiUKICBwaXZvdF9sb25nZXIoYygxOjIpLCBuYW1lc190bz0iU3VydmV5IiwgdmFsdWVzX3RvPSJQb2ludHMiKSAlPiUKZ2dwbG90KC4sIGFlcyhQb2ludHMsIGZpbGw9U3VydmV5KSkgKwogIGdlb21fZGVuc2l0eShhbHBoYT0wLjMpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSJDZXJ0aWZpY2F0aW9uIiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9IGMoIiM1Q0E5RkQiLCAiI0ZDNkI0OSIpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscz0gYygiRmlyc3QiLCAiU2Vjb25kIikpKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKGdvdGlkeSRQZXJjXzEsIG5hLnJtPVQpLCBjb2xvcj0iRmlyc3QiKSkrIAogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKGdvdGlkeSRQZXJjXzIsIG5hLnJtPVQpLCBjb2xvcj0iU2Vjb25kIikpKwogIGxhYnModGl0bGUgPSAiRmlnLiA0OiBJbmNyZWFzZSBpbiBQb2ludHMgRWFybmVkIEJldHdlZW4gU3VydmV5IDEgYW5kIDIiKSArIAogICAgICAgeGxhYigiUG9pbnRzIEVhcm5lZCIpKyAKICAgICAgIHlsYWIoIlByb3BvcnRpb24iKSArIAogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbSA9IDQ3LCB0byA9IDExMSwgYnkgPSA0KSwgZXhwYW5kID0gYygwLCAwKSkrIAogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgdGhlbWVfbWluaW1hbCgpKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIkF2ZXJhZ2UgUG9pbnRzIiwgdmFsdWVzID0gYyhGaXJzdCA9ICIjNUNBOUZEIiwgU2Vjb25kID0gIiNGQzZCNDkiKSkrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTg5LCBjb2xvdXI9IiNDOUIwMzciKSsKICBnZW9tX3RleHQoYWVzKHg9ODcsIGxhYmVsPSJcbkdvbGQgQ2VydGlmaWNhdGlvbiBUaHJlc2hvbGQiLCB5PS4wMTQpLCBjb2xvdXI9IiNDOUIwMzciLCBhbmdsZT05MCwgc2l6ZT0zKSsKICBnZW9tX3RleHQoYWVzKHg9ODMsIGxhYmVsPSJcbkZpcnN0IFN1cnZleSBBdmVyYWdlIiwgeT0uMDExKSwgY29sb3VyPSIjNUNBOUZEIiwgYW5nbGU9OTAsIHNpemU9MykrCiAgZ2VvbV90ZXh0KGFlcyh4PTkwLjUsIGxhYmVsPSJcblNlY29uZCBTdXJ2ZXkgQXZlcmFnZSIsIHk9LjAxMjUpLCBjb2xvdXI9IiNGQzZCNDkiLCBhbmdsZT05MCwgc2l6ZT0zKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpCmBgYAoKQXMgc2hvd24gaW4gRmlndXJlIDQsIHJlLWNlcnRpZnlpbmcgcGFydGljaXBhbnRzJyBlYXJuZWQgYW4gYXZlcmFnZSBvZiA4NSBwb2ludHMgb24gdGhlaXIgRmlyc3QgU3VydmV5IGFuZCBhbiBhdmVyYWdlIG9mIDkzIHBvaW50cyBvbiB0aGVpciBTZWNvbmQgU3VydmV5LiBUaGlzIDggcG9pbnQgaW5jcmVhc2UgYnJvdWdodCB0aGUgYXZlcmFnZSBzY29yZSBwYXN0IHRoZSBHb2xkIENlcnRpZmljYXRpb24gVGhyZXNob2xkIG9mIDg5IHBvaW50cy4gRm9yIGNvbnRleHQsIHRoaXMgY291bGQgaGF2ZSBiZWVuIGFjaGlldmVkIGJ5IG1hcmtpbmcgNCBhZGRpdGlvbmFsICJZZXMiIGFuc3dlcnMsIDggZmV3ZXIgIkFjdGlvbiBOZWVkZWQiIGFuc3dlcnMsIG9yIHNvbWUgY29tYmluYXRpb24gb2YgdGhlIHR3by4KCkZpZ3VyZSA0IGFsc28gc2hvd3MgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9yIHNwcmVhZCBvZiBwb2ludHMgbmFycm93ZWQgaW4gdGhlIFNlY29uZCBDZXJ0aWZpY2F0aW9uIGFzIHRoZSBsb3dlc3Qgc2NvcmluZyBwYXJ0aWNpcGFudHMgaW1wcm92ZWQgdGhlaXIgc2NvcmUuCgpGaWd1cmUgNSwgYmVsb3csIGlsbHVzdHJhdGVzIGhvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIHBvaW50cyBjaGFuZ2VkIGZyb20gMjAxNiB0byAyMDE5IGFzIG5ldyBwYXJ0aWNpcGFudHMgdG9vayB0aGUgR3JlZW4gT2ZmaWNlIENoYWxsZW5nZSBhbmQgYXMgcHJldmlvdXMgcGFydGljaXBhbnRzIHJlLWNlcnRpZmllZDoKCmBgYHtyIGdncGxvdCBvYmplY3QgZm9yIERlbnNpdHkgYW5pbWF0ZWQgQ2hhbmdlIFBvaW50cyAyMDE2IHRvIDIwMTksIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHMgPSBGQUxTRX0KZ29zdXJ2ICU+JSBmaWx0ZXIoIWlzLm5hKFBlcmMpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFBlcmMsIGZpbGw9YXMubnVtZXJpYyh5ZWFyKSkpICsKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC4zKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAieWVsbG93IiwgaGlnaCA9ICJyZWQiKSsKICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVhbihnb3RpZHkkUGVyY18xLCBuYS5ybT1UKSwgY29sb3I9IkZpcnN0IFN1cnZleSIpKSsgCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lYW4oZ290aWR5JFBlcmNfMiwgbmEucm09VCksIGNvbG9yPSJTZWNvbmQgU3VydmV5IikpKwogIGxhYnModGl0bGUgPSAiRmlnLiA1OiBJbmNyZWFzZSBpbiBQb2ludHMgRWFybmVkIE92ZXIgVGltZSIsIGZpbGwgPSAiWWVhciIpICsgCiAgICAgICB4bGFiKCJQb2ludHMgRWFybmVkIikrIAogICAgICAgeWxhYigiUHJvcG9ydGlvbiIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcShmcm9tID0gNDcsIHRvID0gMTExLCBieSA9IDQpLCBleHBhbmQgPSBjKDAsIDApKSsgCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJBdmVyYWdlIFBvaW50cyIsIHZhbHVlcyA9IGMoYEZpcnN0IFN1cnZleWAgPSAiIzVDQTlGRCIsIGBTZWNvbmQgU3VydmV5YCA9ICIjRkM2QjQ5IikpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdD04OSwgY29sb3VyPSIjQzlCMDM3IikrCiAgZ2VvbV90ZXh0KGFlcyh4PTg3LCBsYWJlbD0iXG5Hb2xkIENlcnRpZmljYXRpb24gVGhyZXNob2xkIiwgeT0uMDEyOCksIGNvbG91cj0iI0M5QjAzNyIsIGFuZ2xlPTkwLCBzaXplPTMpKwogIGdlb21fdGV4dChhZXMoeD04MywgbGFiZWw9IlxuRmlyc3QgU3VydmV5IEF2ZXJhZ2UiLCB5PS4wMTEpLCBjb2xvdXI9IiM1Q0E5RkQiLCBhbmdsZT05MCwgc2l6ZT0zKSsKICBnZW9tX3RleHQoYWVzKHg9OTAuNSwgbGFiZWw9IlxuU2Vjb25kIFN1cnZleSBBdmVyYWdlIiwgeT0uMDEyMiksIGNvbG91cj0iI0ZDNkI0OSIsIGFuZ2xlPTkwLCBzaXplPTMpIC0+IGIKICAgIApiICsgdHJhbnNpdGlvbl9zdGF0ZXMoeWVhcikgKyBlYXNlX2FlcygnbGluZWFyJykgLT4gYmMKYW5pbV9zYXZlKCJjYi5naWYiLCBiYywgd2lkdGggPSAxNTAwLCBoZWlnaHQgPSA5MDAsIHVuaXRzID0icHgiLCByZXMgPSAxMDApCj9hbmltX3NhdmUKCiNnb3N1cnYgJT4lIGZpbHRlcighaXMubmEoUGVyYykpICU+JQogIyBtdXRhdGUoCiAgIyAgWWVhck1vbnRoID0gZm9ybWF0KGRhdGUsICIlWS0lbSIpKSAlPiUKICAjZ3JvdXBfYnkoWWVhck1vbnRoKSAlPiUKICAjc3VtbWFyaXplKAogICMgIE1vbnRobHlQZXJjID0gKFBlcmMpKSAlPiUKICAjYXJyYW5nZShZZWFyTW9udGgpICU+JQogICNnZ3Bsb3QoLiwgYWVzKE1vbnRobHlQZXJjLCBmaWxsPWFzLm51bWVyaWMoWWVhck1vbnRoKSkpICsKICAjZ2VvbV9kZW5zaXR5KGFscGhhPTAuMykgKyB0cmFuc2l0aW9uX3N0YXRlcyhZZWFyTW9udGgpICsgZWFzZV9hZXMoJ2xpbmVhcicpCgoKYGBgCgohW10oY2IuZ2lmKQoKClRvIHN1bW1hcml6ZSwgcmUtY2VydGlmeWluZyBpcyBhbiBlc3NlbnRpYWwgbWVhbnMgZm9yIEdyZWVuIE9mZmljZSBDaGFsbGVuZ2UgcGFydGljaXBhbnRzIHRvIGltcHJvdmUgdGhlaXIgc2NvcmUgYnkgcmV2aWV3aW5nIHRoZWlyIHJlc3VsdHMgYW5kIGZpbmRpbmcgd2F5cyB0byBpbXByb3ZlIHVwb24gd2hhdCB0aGV5IG1hcmtlZCBhcyAiQWN0aW9uIE5lZWRlZCIgdGhlIGZpcnN0IHRpbWUgYXJvdW5kLiBBcyBtZW50aW9uZWQgZWFybGllciwgb25seSAxOCUgb2YgcGFydGljaXBhbnRzIGhhdmUgcmUtY2VydGlmaWVkIHRodXMgZmFyLiAKCkluIHRoZSBuZXh0IHNlY3Rpb25zLCB3ZSB3aWxsIGV4YW1pbmUgdGhlIG1vc3QgY29tbW9uIGFuc3dlcnMgcGFydGljaXBhbnRzIGdhdmUgZm9yIGVhY2ggcXVlc3Rpb24gb24gdGhlIHN1cnZleSBhcyB3ZWxsIGFzIHRoZSB0b3AgYWN0aW9ucyB0YWtlbiBieSByZS1jZXJ0aWZ5aW5nIHBhcnRpY2lwYW50cy4gVGhpcyB3aWxsIGNsYXJpZnkgd2hpY2ggYXJlYXMgb2YgdGhlIEdyZWVuIE9mZmljZSBDaGFsbGVuZ2UgYXJlIG1vc3QgZGlmZmljdWx0IGFzIHdlbGwgYXMgdGhlIGxvdy1oYW5naW5nIGZydWl0IHRoYXQgcGFydGljaXBhbnRzIGxvb2tpbmcgdG8gcmUtY2VydGlmeSBzaG91bGQgY29uc2lkZXIuCgoKClwKCgojIEdyZWVuIE9mZmljZSBDaGFsbGVuZ2UgUXVlc3Rpb24gQW5hbHlzaXMKXAoKVGhyb3VnaG91dCB0aGlzIHNlY3Rpb24sIHdlIHdpbGwgcmFuayB0aGUgcXVlc3Rpb25zIG9mIHRoZSBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlIHN1cnZleSBieSB0aGUgcHJvcG9ydGlvbiBvZiBwYXJ0aWNpcGFudHMgd2hvIGdhdmUgYSBnaXZlbiBhbnN3ZXIgdHlwZS4gQSBoaWdoIHByb3BvcnRpb24gb2YgIlllcyIgYW5zd2VycyBpZGVudGlmaWVzIHF1ZXN0aW9ucyB0aGF0IGFyZSByZWxhdGl2ZWx5IGVhc3kgdG8gZnVsZmlsbC4gT24gdGhlIG90aGVyIGhhbmQsIGEgaGlnaCBwcm9wb3J0aW9uIG9mICJBY3Rpb24gTmVlZGVkIiBhbnN3ZXJzIGlkZW50aWZpZXMgcXVlc3Rpb25zIHRoYXQgYXJlIG1vcmUgY2hhbGxlbmdpbmcuIEEgaGlnaCBwcm9wb3J0aW9uIG9mICJOL0EiIChpLmUuICJOb3QgQXBwbGljYWJsZSIpIGFuc3dlcnMgaWRlbnRpZmllcyBxdWVzdGlvbnMgdGhhdCBhcmUgbm90IHJlbGV2YW50IHRvIG1vc3QgcGFydGljaXBhbnRzIGFuZCB0aHVzIG1heSBuZWVkIHRvIGJlIHJldmlzZWQuIAoKClwKCgojIyBUb3AgUXVlc3Rpb25zIGJ5IEFuc3dlciBQcm9wb3J0aW9uClwKCkZpcnN0LCB3ZSB3aWxsIHJhbmsgcXVlc3Rpb25zIGJ5IHByb3BvcnRpb24gb2YgYW5zd2VycyBnaXZlbiBieSBwYXJ0aWNpcGFudHMgb24gdGhlaXIgZmlyc3Qgc3VydmV5LCByZWdhcmRsZXNzIG9mIHN0YXJ0aW5nIENlcnRpZmljYXRpb24gTGV2ZWwgKGUuZy4gIkJyb256ZSIgb3IgIkdvbGQiKS4gVGhpcyB3aWxsIGVzdGFibGlzaCBhIGJhc2VsaW5lIG9mIHdoaWNoIHF1ZXN0aW9ucyBhcmUgZWFzeSwgY2hhbGxlbmdpbmcsIG9yIG5vdCByZWxldmFudCB0byBhbGwgcGFydGljaXBhbnRzIG9uIHRoZWlyIGZpcnN0IHN1cnZleSAoRmlndXJlIDYsIGJlbG93KS4KCgpgYGB7ciBWaXogb2YgUXVlc3Rpb24tIEFuc3dlcnMgT3ZlcmFsbCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY29tbWVudD0iIiwgaW5jbHVkZT1UUlVFLCBmaWcuaGVpZ2h0PSA4LCBmaWcud2lkdGg9OCwgZHBpPTk2fQoKZ29xdWVzdGlkeSAlPiUgc2VsZWN0KHF1ZXN0aW9uLCBzZWN0aW9uLCBzdXJ2ZXlvcmRlciwgeWVzX3Byb3AsIGFuX3Byb3AsIG5hX3Byb3AsIG5vX3Byb3ApICU+JQogIHBpdm90X2xvbmdlcihjKDQ6NyksIG5hbWVzX3RvPSJhbnN3ZXIiLCB2YWx1ZXNfdG89ImFuc3dlcl9wcm9wIikgJT4lIGZpbHRlcihzdXJ2ZXlvcmRlcj09IDEpICU+JQogIG11dGF0ZV9hdCh2YXJzKGFuc3dlciksCiAgICAgICAgICAgIGxpc3QofmNhc2Vfd2hlbigKICAgICAgICAgICAgICAuID09ICJ5ZXNfcHJvcCIgfiAiWWVzIiwKICAgICAgICAgICAgICAuID09ICJhbl9wcm9wIiB+ICJBY3Rpb24gTmVlZGVkIiwKICAgICAgICAgICAgICAuID09ICJuYV9wcm9wIiB+ICJOL0EiLAogICAgICAgICAgICAgIC4gPT0gIm5vX3Byb3AiIH4gIk5vIiwKICAgICAgICAgICAgICBUUlVFIH4gIk5BIikpKSAlPiUgdW5ncm91cCgpICU+JQogICAgZ3JvdXBfYnkoYW5zd2VyKSAlPiUKICAgIG11dGF0ZShxYXJhbmsgPSBvcmRlcihvcmRlcihhbnN3ZXIsIGFuc3dlcl9wcm9wLCBkZWNyZWFzaW5nPVRSVUUpKSkgJT4lCiAgICBhcnJhbmdlKGFuc3dlciwgcWFyYW5rKSAtPiBnb3F1ZXN0aWR5bG9uZwoKZ29xdWVzdGlkeWxvbmckYW5zd2VyIDwtIGZhY3Rvcihnb3F1ZXN0aWR5bG9uZyRhbnN3ZXIsIGxldmVscyA9IGMoIlllcyIsICJBY3Rpb24gTmVlZGVkIiwgIk4vQSIsICJObyIpKQoKZ29xdWVzdGlkeWxvbmcgJT4lIAogIHVuZ3JvdXAoKSAlPiUgbXV0YXRlKHF1ZXMgPSBzdHJfdHJ1bmMoZ29xdWVzdGlkeWxvbmckcXVlc3Rpb24sIDEwMCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUKICBmaWx0ZXIocXVlc3Rpb24gIT0iSSBzZXJ2ZSwgb3Igd291bGQgbGlrZSB0byBzZXJ2ZSwgYXMgYW4gRWNvLUFtYmFzc2Fkb3IgZm9yIHRoZSBHcmVlbiBPZmZpY2UiKSAlPiUgICAgICAgICAgICBmaWx0ZXIoc3VydmV5b3JkZXIgPT0gMSAmIGFuc3dlciAhPSAiTm8iKSAlPiUKICBtdXRhdGUocXVlcz0gcmVvcmRlcl93aXRoaW4ocXVlcywgZGVzYyhxYXJhbmspLCBhbnN3ZXJfcHJvcCkpICU+JQogIG11dGF0ZShhbnN3ZXJfcHJvcCA9IHJvdW5kKGFuc3dlcl9wcm9wLCAwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhbnN3ZXJfcHJvcCkpICU+JSBmaWx0ZXIocWFyYW5rIDw9IDIwKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHF1ZXMsIGFuc3dlcl9wcm9wLCBmaWxsPWFuc3dlcikpICsKICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBjb29yZF9mbGlwKCkrCiAgZmFjZXRfcmVwX3dyYXAofmFuc3dlciwgc2NhbGVzID0gImZyZWVfeSIsbnJvdz0zLCByZXBlYXQudGljay5sYWJlbHMgPSAnYm90dG9tJykgKwogIHNjYWxlX3hfcmVvcmRlcmVkKCkgKwogIGdlb21fdGV4dChzaXplPXJlbCg2KSwgYWVzKGxhYmVsPWFuc3dlcl9wcm9wKSxoanVzdD0xKSArCiAgICBsYWJzKHggPSBOVUxMLAogICAgICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgUGFydGljaXBhbnRzIiwKICAgICAgICAgdGl0bGUgPSAiRmlnLiA2OiBUb3AgMjAgUXVlc3Rpb25zIGJ5IFByb3BvcnRpb24gb2YgQW5zd2VyIFR5cGUiKSAtPiBwCgpwICsgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTMsIGZhY2U9ImJvbGQiLCBjb2xvcj0iYmxhY2siLCBzaXplPXJlbCgxLjgpKSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBzaXplPXJlbCgxLjgpKSkrCnRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIHNpemU9cmVsKDEuOCkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygibGlnaHRza3libHVlMiIsICJ0b21hdG8xIiwgInRhbiIpKQoKYGBgClBlcmhhcHMgdGhlIG1vc3Qgc3RyaWtpbmcgb2JzZXJ2YXRpb24gaW4gRmlndXJlIDYgYWJvdmUgaXMgdGhhdCB0aGUgMjAgcXVlc3Rpb25zIHdpdGggdGhlIGhpZ2hlc3QgcHJvcG9ydGlvbiBvZiAiWWVzIiBhbnN3ZXJzIGFyZSBhbGwgYXJvdW5kIDgwJSBvciBoaWdoZXIsIG1lYW5pbmcgdGhhdCB0aGUgbGFyZ2UgbWFqb3JpdHkgb2YgcGFydGljaXBhbnRzIGFyZSBhbGwgZG9pbmcgYWJvdXQgaGFsZiBvZiB0aGUgNDEgcG9zc2libGUgYWN0aW9ucyBvbiB0aGUgc3VydmV5LiBCeSBjb250cmFzdCwgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwcm9wb3J0aW9ucyBmb3IgIkFjdGlvbiBOZWVkZWQiIGFyZSBtdWNoIG1vcmUgZGl2ZXJzZSwgaW5kaWNhdGluZyB0aGF0IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlIGFyZSBjaGFsbGVuZ2luZyBmb3IgZGlmZmVyZW50IHBhcnRpY2lwYW50cy4gSXQgaXMgdW5zdXJwcmlzaW5nIHRoYXQgIkFjdGlvbiBOZWVkZWQiIGlzIHRoZSBtb3N0IGNvbW1vbiByZXNwb25zZSB0byB0aGUgcXVlc3Rpb24sICJJIGhhdmUgYXQgbGVhc3Qgb25lIHBvdHRlZCBwbGFudCBhdCBteSBkZXNrIiBjb25zaWRlcmluZyB0aGF0IGFjdGlvbiBpcyBvbmx5IGxvb3NlbHkgcmVsYXRlZCB0byBvZmZpY2Ugc3VzdGFpbmFiaWxpdHkuIE9uIHRoZSBvdGhlciBoYW5kLCAiSSB3b3JrIHBhcGVybGVzcyIgaXMgdGhlIHNlY29uZCBtb3N0IGxpa2VseSBxdWVzdGlvbiB0byBiZSBhbnN3ZXJlZCAiQWN0aW9uIE5lZWRlZCIgZ2l2ZW4gdGhhdCB3b3JraW5nIGNvbXBsZXRlbHkgcGFwZXJsZXNzIGlzIG9mdGVuIHVuZmVhc2libGUuIEFuIGltcHJvdmVkIHZlcnNpb24gb2YgdGhlIEdyZWVuIE9mZmljZSBDaGFsbGVuZ2Ugc3VydmV5IHNob3VsZCB0YWtlIHRoaXMgaW50byBhY2NvdW50LgoKSW4gdGhlICJOL0EiIGdyYXBoLCBtYW55IG9mIHRoZSBsZWFzdCByZWxldmFudCBxdWVzdGlvbnMgaGF2ZSB0byBkbyB3aXRoIGFyZWFzIGxpa2UgZXZlbnRzLCBwdXJjaGFzaW5nLCBsaWdodGluZyBhbmQgaGVhdGluZyBhZGp1c3RtZW50cywgb3IgcGFydGljdWxhciBGYWNpbGl0aWVzIEN1c3RvbWVyIFNlcnZpY2UgcmVxdWVzdHMgdGhhdCBub3QgYWxsIHBhcnRpY2lwYW50cyBhcmUgaW52b2x2ZWQgaW4gb3IgaGF2ZSBhY2Nlc3MgdG8uIFRoZSB0b3AgIk4vQSIgcXVlc3Rpb24gKGkuZS4gIkkgc2h1dCBteSBwZXJzb25hbCBwcmludGVyIHdoZW4gbm90IGluIHVzZSIpIGlzIGxhcmdlbHkgZHVlIHRvIGEgc3VydmV5IGRlc2lnbiB0aGF0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgaWYgcGFydGljaXBhbnRzIGFscmVhZHkgYW5zd2VyZWQgIlllcyIgdG8gIkkgdXNlIGEgc2hhcmVkIHByaW50ZXIgYXMgb3Bwb3NlZCB0byBoYXZpbmcgYSBwZXJzb25hbCBwcmludGVyIGluIG15IG9mZmljZSIuCgpcCgoKIyMgVG9wIEFuc3dlcnMgcGVyIFF1ZXN0aW9uIFNlY3Rpb24KXAoKQmVsb3csIEZpZ3VyZSA3LCBzaG93cyB0aGUgcHJvcG9ydGlvbiBvZiBhbnN3ZXIgdHlwZXMgKGkuZS4gIlllcyIsICJBY3Rpb24gTmVlZGVkIiwgb3IgIk4vQSIpIGdpdmVuIGluIGVhY2ggcXVlc3Rpb24gc2VjdGlvbiAoaS5lLiBFbmVyZ3ksIFdhc3RlICYgUG9sbHV0aW9uIE1pbmltaXphdGlvbiwgUmVjeWNsaW5nLCBUcmFuc3BvcnRhdGlvbiwgYW5kIFB1cmNoYXNpbmcpIG91dCBvZiBhbGwgYW5zd2VycyBnaXZlbiBpbiB0aGF0IHNlY3Rpb24uIFRoaXMgcHJvdmlkZXMgZnVydGhlciBpbnNpZ2h0IGludG8gd2hpY2ggc3VzdGFpbmFiaWxpdHkgYXJlYXMgcGFydGljaXBhbnRzIGZpbmQgZWFzeSwgY2hhbGxlbmdpbmcsIG9yIG5vdCByZWxldmFudC4KCmBgYHtyLCBWaXogb2YgUXVlc3Rpb24tIFNlY3Rpb25zLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PSIiLCBpbmNsdWRlPUZBTFNFLCBldmFsPUZBTFNFLCBmaWcuaGVpZ2h0PSA4LCBmaWcud2lkdGg9OCwgZHBpPTk2fQoKZ29xdWVzdGlkeWxvbmcgJT4lIAogIHVuZ3JvdXAoKSAlPiUgbXV0YXRlKHF1ZXMgPSBzdHJfdHJ1bmMoZ29xdWVzdGlkeWxvbmckcXVlc3Rpb24sIDEwMCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUKICBmaWx0ZXIocXVlc3Rpb24gIT0iSSBzZXJ2ZSwgb3Igd291bGQgbGlrZSB0byBzZXJ2ZSwgYXMgYW4gRWNvLUFtYmFzc2Fkb3IgZm9yIHRoZSBHcmVlbiBPZmZpY2UiKSAlPiUgICAgICAgICAgICBmaWx0ZXIoc3VydmV5b3JkZXIgPT0gMSAmIGFuc3dlciAhPSAiTm8iKSAlPiUKICBtdXRhdGUocXVlcz0gcmVvcmRlcl93aXRoaW4ocXVlcywgZGVzYyhxYXJhbmspLCBhbnN3ZXJfcHJvcCkpICU+JQogIG11dGF0ZShhbnN3ZXJfcHJvcCA9IHJvdW5kKGFuc3dlcl9wcm9wLCAwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhbnN3ZXJfcHJvcCkpICU+JSBmaWx0ZXIocWFyYW5rIDw9IDIwKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHF1ZXMsIGFuc3dlcl9wcm9wLCBmaWxsPXNlY3Rpb24pKSArCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBzaG93LmxlZ2VuZCA9IFRSVUUpICsKICBjb29yZF9mbGlwKCkrCiAgZmFjZXRfcmVwX3dyYXAofmFuc3dlciwgc2NhbGVzID0gImZyZWVfeSIsbnJvdz0zLCByZXBlYXQudGljay5sYWJlbHMgPSAnYm90dG9tJykgKwogIHNjYWxlX3hfcmVvcmRlcmVkKCkgKwogIGdlb21fdGV4dChzaXplPXJlbCg2KSwgYWVzKGxhYmVsPWFuc3dlcl9wcm9wKSxoanVzdD0xKSArCiAgICBsYWJzKHggPSBOVUxMLAogICAgICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgUGFydGljaXBhbnRzIiwKICAgICAgICAgdGl0bGUgPSAiRmlnLiA1OiBUb3AgMjAgUXVlc3Rpb25zIGJ5IFByb3BvcnRpb24gb2YgQW5zd2VyIFR5cGUiKSAtPiBnCgpnICsgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTMsIGZhY2U9ImJvbGQiLCBjb2xvcj0iYmxhY2siLCBzaXplPXJlbCgyLjUpKSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBzaXplPXJlbCgxLjgpKSkrCnRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIHNpemU9cmVsKDEuOCkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpKSkKCmBgYAoKYGBge3IgVml6IG9mIFF1ZXN0aW9uLSBTZWN0aW9ucyBncmFwaCAyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PSIiLCBpbmNsdWRlPVRSVUUsIGZpZy5oZWlnaHQ9IDgsIGZpZy53aWR0aD04LCBkcGk9OTZ9Cgpnb3F1ZXN0aWR5ICU+JSBmaWx0ZXIoc3VydmV5b3JkZXI9PSAxKSAlPiUgdW5ncm91cCgpICU+JSBzZWxlY3Qoc2VjdGlvbiwgJ0FjdGlvbiBOZWVkZWQnLCBZZXMsIGBOL0FgKSAlPiUKICAgICBwaXZvdF9sb25nZXIoYygyOjQpLCBuYW1lc190bz0iYW5zd2VyIiwgdmFsdWVzX3RvPSJhbnN3ZXJfY250IikgJT4lIHVuZ3JvdXAoKSAlPiUgCiAgZ3JvdXBfYnkoc2VjdGlvbiwgYW5zd2VyKSAlPiUKICBzdW1tYXJpemUoYW5zd2Vyc3VtID0gc3VtKGFuc3dlcl9jbnQsIG5hLnJtPVRSVUUpKSAlPiUKICBncm91cF9ieShzZWN0aW9uKSAlPiUKICBtdXRhdGUoc2VjdGlvbmFuc3dlcnN1bSA9IHN1bShhbnN3ZXJzdW0pLAogICAgICAgICBzZWN0aW9uYW5zd2VycHJvcCA9IChyb3VuZCgoKGFuc3dlcnN1bS9zZWN0aW9uYW5zd2Vyc3VtKSoxMDApLDApKSkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoc2VjdGlvbiksCiAgICAgICAgICAgIGxpc3QofmNhc2Vfd2hlbigKICAgICAgICAgICAgICAuID09ICJlbmVyZ3kiIH4gIkVuZXJneSIsCiAgICAgICAgICAgICAgLiA9PSAibWlzYyIgfiAiTWlzY2VsYW5lb3VzIiwKICAgICAgICAgICAgICAuID09ICJwdXJjaGFzaW5nIiB+ICJQdXJjaGFzaW5nIiwKICAgICAgICAgICAgICAuID09ICJyZWN5Y2xpbmciIH4gIlJlY3ljbGluZyIsCiAgICAgICAgICAgICAgLiA9PSAidHJhbnNwb3J0YXRpb24iIH4gIlRyYW5zcG9ydGF0aW9uIiwKICAgICAgICAgICAgICAuID09ICJ3YXN0ZSIgfiAiV2FzdGUgJiBQb2xsdXRpb24iLAogICAgICAgICAgICAgIFRSVUUgfiAiTkEiKSkpIC0+IGdvcXVlc3RpZHlsb25nMgoKZ29xdWVzdGlkeWxvbmcyJGFuc3dlciA8LSBmYWN0b3IoZ29xdWVzdGlkeWxvbmcyJGFuc3dlciwgbGV2ZWxzID0gYygiWWVzIiwgIkFjdGlvbiBOZWVkZWQiLCAiTi9BIikpCgpnb3F1ZXN0aWR5bG9uZzIgJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKHNlY3Rpb24gIT0gIk1pc2NlbGFuZW91cyIpICU+JQogIG11dGF0ZShzZWN0aW9uPSByZW9yZGVyX3dpdGhpbihzZWN0aW9uLCBzZWN0aW9uYW5zd2VycHJvcCwgc2VjdGlvbmFuc3dlcnByb3ApKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHNlY3Rpb24sIHNlY3Rpb25hbnN3ZXJwcm9wKSkgKwogIGdlb21fYmFyKGFlcyhmaWxsPSBhbnN3ZXIpLCBzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBjb29yZF9mbGlwKCkrCiAgZmFjZXRfcmVwX3dyYXAofmFuc3dlciwgc2NhbGVzID0gImZyZWVfeSIsbnJvdz0zLCByZXBlYXQudGljay5sYWJlbHMgPSAnYm90dG9tJykgKwogIHNjYWxlX3hfcmVvcmRlcmVkKCkgKwogIGdlb21fdGV4dChzaXplPXJlbCg2KSwgYWVzKGxhYmVsPXNlY3Rpb25hbnN3ZXJwcm9wKSxoanVzdD0xKSArCiAgICBsYWJzKHggPSAiU2VjdGlvbiIsCiAgICAgICAgIHkgPSAiUHJvcG9ydGlvbiBvZiBBbnN3ZXIgUGVyIFRvdGFsIEFuc3dlcnMgSW4gU2VjdGlvbiIsCiAgICAgICAgIHRpdGxlID0gIkZpZy4gNzogQW5zd2VycyBQZXIgUXVlc3Rpb24gU2VjdGlvbiIpIC0+IHoKCnogKyB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjgpLCBhbmdsZSA9IDAwKSkgKwogICAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS44KSwgYW5nbGUgPSA5MCkpICsKdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTMsIGZhY2U9ImJvbGQiLCBjb2xvcj0iYmxhY2siLCBzaXplPXJlbCgyLjUpKSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBzaXplPXJlbCgxLjgpKSkrCnRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIHNpemU9cmVsKDEuOCkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpKSkgKwogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS44KSkpICsKICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyKSkpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0c2t5Ymx1ZTIiLCAidG9tYXRvMSIsICJ0YW4iKSkKCmBgYApBcyBzZWVuIGluIEZpZ3VyZSA3LCBxdWVzdGlvbnMgcmVsYXRpbmcgdG8gUmVjeWNsaW5nIGFuZCBXYXN0ZSBhbmQgUG9sbHV0aW9uIGFyZSBhbnN3ZXJlZCAiWWVzIiBhcm91bmQgODAlIG9mIHRoZSB0aW1lIHdoZXJlYXMgUHVyY2hhc2luZyBhbmQgVHJhbnNwb3J0YXRpb24gcmVsYXRlZCBxdWVzdGlvbnMgYXJlIGFuc3dlcmVkICJZZXMiIGxlc3MgdGhhbiA1MCUgb2YgdGhlIHRpbWUuIEFzIHNlZW4gaW4gRmlndXJlIDcsIHRoaXMgaXMgYmVjYXVzZSBQdXJjaGFzaW5nIGFuZCBUcmFuc3BvcnRhdGlvbiByZWxhdGVkIHF1ZXN0aW9ucyBhcmUgYWxzbyBhbnN3ZXJlZCAiTi9BIiBhcm91bmQgNTAlIG9mIHRoZSB0aW1lLiBBcyBkaXNjdXNzZWQgZWFybGllciBpbiBGaWd1cmUgNiwgdGhpcyBpcyBiZWNhdXNlIG5vdCBhbGwgcGFydGljaXBhbnRzIGhhdmUgYWNjZXNzIHRvIG9yIGFyZSBpbnZvbHZlZCBpbiB0aGVzZSBhcmVhcy4gRW5lcmd5IHJlbGF0ZWQgcXVlc3Rpb25zIGFyZSB0aGUgbW9zdCBtaXhlZCwgd2l0aCBwYXJ0aWNpcGFudHMgbGlrZWx5IHRvIGFuc3dlciAiWWVzIiwgIkFjdGlvbiBOZWVkZWQiLCBvciAiTi9BIiBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmljIHF1ZXN0aW9uLgoKTG9va2luZyBmb3J3YXJkLCBGaWd1cmUgNyBoaWdobGlnaHRzIHRoZSBuZWVkIHRvIHJldmlzZSBQdXJjaGFzaW5nIGFuZCBUcmFuc3BvcnRhdGlvbiByZWxhdGVkIHF1ZXN0aW9ucyB0byBiZSBtb3JlIHJlbGV2YW50IHRvIG1vcmUgcGFydGljaXBhbnRzLiBJdCBhbHNvIGhpZ2hsaWdodHMgdGhlIG9wcG9ydHVuaXR5IHRvIGV4cGFuZCBSZWN5Y2xpbmcgYW5kIFdhc3RlIGFuZCBQb2xsdXRpb24gcmVsYXRlZCBxdWVzdGlvbnMgdG8gYmUgbW9yZSBhbWJpdGlvdXMgYXJlYXMgZ2l2ZW4gdGhlaXIgY3VycmVudCBoaWdoIHJhdGUgb2Ygc3VjY2Vzcy4KCgpcCgoKIyMgVG9wIFF1ZXN0aW9ucyBieSBBbnN3ZXIgUHJvcG9ydGlvbiBmb3IgRWFjaCBTdGFydGluZyBDZXJ0aWZpY2F0aW9uIExldmVsClwKCkluIHRoaXMgc2VjdGlvbiwgd2Ugd2lsbCBleGFtaW5lIHRoZSBwcm9wb3J0aW9uIG9mIHBhcnRpY2lwYW50cyB3aG8gcHJvdmlkZWQgYSBnaXZlbiBhbnN3ZXIgb3V0IG9mIGFsbCBvZiB0aG9zZSBpbiB0aGUgc2FtZSBzdGFydGluZyBDZXJ0aWZpY2F0aW9uIExldmVsIChlLmcuICJCcm9uemUiLCAiU2lsdmVyIiwgIkdvbGQiKS4gSGVyZSwgcHJvcG9ydGlvbnMgYXJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgd2hvIHJlY2VpdmVkIHRoYXQgQ2VydGlmaWNhdGlvbiBMZXZlbC4gRm9yIGV4YW1wbGUsIGlmIDEwMCBvZiB0aGUgMjY5IHBhcnRpY2lwYW50cyB3aG8gcmVjZWl2ZWQgYSBHb2xkIENlcnRpZmljYXRpb24gbGV2ZWwgYW5zd2VyZWQgIlllcyIgdG8gYSBxdWVzdGlvbiwgdGhlIHByb3BvcnRpb24gd2lsbCBiZSAzNyUuIEhvd2V2ZXIsIGlmIDgwIG9mIHRoZSAxMTcgcGFydGljaXBhbnRzIHdobyByZWNlaXZlZCBhIEJyb256ZSBDZXJ0aWZpY2F0aW9uIGxldmVsIGFuc3dlcmVkICJZZXMiIHRvIGEgcXVlc3Rpb24sIHRoZSBwcm9wb3J0aW9uIHdpbGwgYmUgNjglLiBDYWxjdWxhdGluZyBkaWZmZXJlbnQgcHJvcG9ydGlvbnMgYmFzZWQgb24gdGhlIHRvdGFsIHBhcnRpY2lwYW50cyBpbiBlYWNoIENlcnRpZmljYXRpb24gTGV2ZWwgYWxsb3dzIGZvciBlYXNpZXIgY29tcGFyaXNvbiBiZXR3ZWVuIENlcnRpZmljYXRpb24gTGV2ZWxzLgoKVGhlIHJhbmsgb3JkZXIgb2YgdGhlIHF1ZXN0aW9ucyBpbiBhbGwgb2YgdGhlIGZvbGxvd2luZyBncmFwaHMgYXJlIHRoZSBzYW1lIGFzIGluIEZpZ3VyZSA2LiBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gc2VlIGhvdyBlYWNoIENlcnRpZmljYXRpb24gTGV2ZWwgY29tcGFyZXMgdG8gdGhlIGF2ZXJhZ2UgZm9yIGEgZ2l2ZW4gcXVlc3Rpb24gYW5kIGFuc3dlciBjb21iaW5hdGlvbi4KCkZpZ3VyZSA4LCBiZWxvdywgc2hvd3MgdGhlIHByb3BvcnRpb24gdGhhdCBlYWNoIENlcnRpZmljYXRpb24gTGV2ZWwgYW5zd2VyZWQgIkFjdGlvbiBOZWVkZWQiIGZvciB0aGUgdG9wIDE1IHF1ZXN0aW9ucyBhbnN3ZXJlZCB0aGlzIHdheSBpbiBGaWd1cmUgNjoKCmBgYHtyIE5FVyBWaXogb2YgQ2VydF8xIEFOIEFuc3dlcnMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNvbW1lbnQ9IiIsIGluY2x1ZGU9VFJVRSwgZmlnLmhlaWdodD0gOCwgZmlnLndpZHRoPTgsIGRwaT05Nn0KZ29xdWVzdGlkeWxvbmcgPC0gZ29xdWVzdGlkeWxvbmcgJT4lIG11dGF0ZShxYXJhbmtfb3ZlcmFsbCA9IHFhcmFuaykKZ29xdWVzY2VydDIgPC0gZ29xdWVzdGlkeWxvbmcgJT4lIHNlbGVjdChxdWVzdGlvbiwgcWFyYW5rX292ZXJhbGwpICU+JSBsZWZ0X2pvaW4oZ29xdWVzY2VydCwgLikKCmdvcXVlc2NlcnQyICU+JSAKICB1bmdyb3VwKCkgJT4lIG11dGF0ZShxdWVzID0gc3RyX3RydW5jKGdvcXVlc2NlcnQkcXVlc3Rpb24sIDEwMCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUKICBmaWx0ZXIocXVlc3Rpb24gIT0iSSBzZXJ2ZSwgb3Igd291bGQgbGlrZSB0byBzZXJ2ZSwgYXMgYW4gRWNvLUFtYmFzc2Fkb3IgZm9yIHRoZSBHcmVlbiBPZmZpY2UiKSAlPiUgICAgICAgICAKICBmaWx0ZXIoYW5zd2VyID09ICJBY3Rpb24gTmVlZGVkIiAmIHN1cnZleW9yZGVyID09IDEpICU+JQogIG11dGF0ZShxdWVzPSBmY3RfcmVvcmRlcihxdWVzLCBkZXNjKHFhcmFua19vdmVyYWxsKSwgLmZ1bj1tYXgsIC5kZXNjPUZBTFNFKSkgJT4lCiAgbXV0YXRlKGNlcnRwcm9wID0gcm91bmQoY2VydHByb3AsIDApKSAlPiUKICBmaWx0ZXIocWFyYW5rX292ZXJhbGwgPD0gMTUpICU+JQogIGdncGxvdCguLCBhZXMocXVlcywgY2VydHByb3AsIGZpbGw9Q2VydCkpICsKICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScsIHBvc2l0aW9uPSAiZG9kZ2UiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgY29vcmRfZmxpcCgpKwogICNmYWNldF9yZXBfd3JhcCh+Q2VydCwgc2NhbGVzID0gImZyZWVfeSIsbnJvdz0zLCByZXBlYXQudGljay5sYWJlbHMgPSAnYm90dG9tJykgKwogIHNjYWxlX3hfcmVvcmRlcmVkKCkgKwogIGdlb21fdGV4dChoanVzdCA9IDEsIHNpemU9cmVsKDgpLCBhZXMobGFiZWw9Y2VydHByb3ApLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMSksCiAgICBpbmhlcml0LmFlcyA9IFRSVUUpKwpzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjQUQ4QTU2IiwgIiNCNEI0QjQiLCAiI0M5QjAzNyIpKSArCiAgICBsYWJzKHggPSBOVUxMLAogICAgICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgUGVvcGxlIiwKICAgICAgICAgdGl0bGUgPSAiRmlnLiA4OiBUb3AgMTUgJ0FjdGlvbiBOZWVkZWQnIFF1ZXN0aW9ucyBieSAlIG9mIFN0YXJ0aW5nIENlcnQuIExldmVscyIpICsKdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTMsIGZhY2U9ImJvbGQiLCBjb2xvcj0iYmxhY2siLCBzaXplPXJlbCgxLjUpKSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBzaXplPXJlbCgxLjgpKSkrCnRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIHNpemU9cmVsKDEuOCkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpKSkKCmBgYApCeSBkZWZpbml0aW9uLCBmb3IgYWxtb3N0IGFsbCBvZiB0aGUgMTUgcXVlc3Rpb25zIGluIEZpZ3VyZSA4LCBCcm9uemUgaGFzIHRoZSBoaWdoZXN0IHByb3BvcnRpb24gb2YgIkFjdGlvbiBOZWVkZWQgcmVzcG9uc2VzIiwgZm9sbG93ZWQgYnkgU2lsdmVyIGFuZCB0aGVuIEdvbGQuIFdoZW4gd2UgbG9vayBhdCBpbmRpdmlkdWFsIHF1ZXN0aW9ucywgaG93ZXZlciwgdGhpcyBwYXR0ZXJuIGJlY29tZXMgbW9yZSBudWFuY2VkLiBGb3IgZXhhbXBsZSwgdGhlIHF1ZXN0aW9uLCAiSSB1c2UgYSBzaGFyZWQgcHJpbnRlciBhcyBvcHBvc2VkIHRvIGhhdmluZyBhIHBlcnNvbmFsIHByaW50ZXIgaW4gbXkgb2ZmaWNlIiBoYXMgcmVsYXRpdmVseSBsaXR0bGUgZGlmZmVyZW5jZSBpbiAiQWN0aW9uIE5lZWRlZCIgcHJvcG9ydGlvbnMgYmV0d2VlbiBHb2xkLCBTaWx2ZXIsIGFuZCBCcm9uemUgY2VydGlmaWNhdGlvbnMsIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIGEgY29tbW9uIGNoYWxsZW5nZSByZWdhcmRsZXNzIG9mIGhvdyB3ZWxsIG9uZSBkb2VzIG9uIG90aGVyIGFyZWFzIG9mIHRoZSBzdXJ2ZXkuIEJ5IGNvbnRyYXN0LCBlYXJsaWVyIGluIEZpZ3VyZSA2LCA1MiUgb2YgcGFydGljaXBhbnRzIGFuc3dlcmVkICJBY3Rpb24gTmVlZGVkIiB0byB0aGUgcXVlc3Rpb24gIkkgd29yayBwYXBlcmxlc3MiLiBIb3dldmVyLCBoZXJlIGluIEZpZ3VyZSA4IHdlIGNhbiBzZWUgdGhhdCBvbmx5IDMyJSBvZiBwYXJ0aWNpcGFudHMgd2l0aCBHb2xkIENlcnRpZmljYXRpb25zIGFuc3dlcmVkIHRoaXMgd2F5LCBjb21wYXJlZCB0byA2MiUgb2YgU2lsdmVyIGFuZCA3NCUgb2YgQnJvbnplLgoKYGBge3IgTkVXIFZpeiBvZiBDZXJ0XzEgWWVzIEFuc3dlcnMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNvbW1lbnQ9IiIsIGluY2x1ZGU9VFJVRSwgZmlnLmhlaWdodD0gOCwgZmlnLndpZHRoPTgsIGRwaT05Nn0KCmdvcXVlc2NlcnQyICU+JSAKICB1bmdyb3VwKCkgJT4lIG11dGF0ZShxdWVzID0gc3RyX3RydW5jKGdvcXVlc2NlcnQkcXVlc3Rpb24sIDEwMCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUKICBmaWx0ZXIocXVlc3Rpb24gIT0iSSBzZXJ2ZSwgb3Igd291bGQgbGlrZSB0byBzZXJ2ZSwgYXMgYW4gRWNvLUFtYmFzc2Fkb3IgZm9yIHRoZSBHcmVlbiBPZmZpY2UiKSAlPiUgICAgICAgICAKICBmaWx0ZXIoYW5zd2VyID09ICJZZXMiICYgc3VydmV5b3JkZXIgPT0gMSkgJT4lCiAgbXV0YXRlKHF1ZXM9IGZjdF9yZW9yZGVyKHF1ZXMsIGRlc2MocWFyYW5rX292ZXJhbGwpLCAuZnVuPW1heCwgLmRlc2M9RkFMU0UpKSAlPiUKICBtdXRhdGUoY2VydHByb3AgPSByb3VuZChjZXJ0cHJvcCwgMCkpICU+JQogIGZpbHRlcihxYXJhbmtfb3ZlcmFsbCA8PSAxNSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhxdWVzLCBjZXJ0cHJvcCwgZmlsbD1DZXJ0KSkgKwogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgcG9zaXRpb249ICJkb2RnZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBjb29yZF9mbGlwKCkrCiAgI2ZhY2V0X3JlcF93cmFwKH5DZXJ0LCBzY2FsZXMgPSAiZnJlZV95Iixucm93PTMsIHJlcGVhdC50aWNrLmxhYmVscyA9ICdib3R0b20nKSArCiAgc2NhbGVfeF9yZW9yZGVyZWQoKSArCiAgZ2VvbV90ZXh0KGhqdXN0ID0gMSwgc2l6ZT1yZWwoOCksIGFlcyhsYWJlbD1jZXJ0cHJvcCksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwKICAgIGluaGVyaXQuYWVzID0gVFJVRSkrCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNBRDhBNTYiLCAiI0I0QjRCNCIsICIjQzlCMDM3IikpICsKICAgIGxhYnMoeCA9IE5VTEwsCiAgICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBQZW9wbGUiLAogICAgICAgICB0aXRsZSA9ICJGaWcuIDk6IFRvcCAxNSAnWWVzJyBRdWVzdGlvbnMgYnkgJSBvZiBTdGFydGluZyBDZXJ0LiBMZXZlbHMiKSArCnRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDEuOCksIGFuZ2xlID0gMDApKSArCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0zLCBmYWNlPSJib2xkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT1yZWwoMS41KSkpICsKdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgc2l6ZT1yZWwoMS44KSkpKwp0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBzaXplPXJlbCgxLjgpKSkgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMi44KSkpCgpgYGAKCkluIEZpZ3VyZSA5LCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHF1ZXN0aW9ucyBtb3N0IGNvbW1vbmx5IGFuc3dlcmVkICJZZXMiIGFyZSBsYXJnZWx5IHRoZSBzYW1lIGFjcm9zcyBDZXJ0aWZpY2F0aW9uIExldmVscy4gV2hhdCBkaWZmZXJlbmNlcyByZW1haW4gaGlnaGxpZ2h0IHNvbWUgb2YgdGhlIGVhc2llciBzdGVwcyB0aGF0IHBhcnRpY2lwYW50cyB3aXRoIEJyb256ZSBvciBTaWx2ZXIgQ2VydGlmaWNhdGlvbnMgY291bGQgdGFrZSB0byBpbXByb3ZlIHRoZWlyIHNjb3JlLgoKCmBgYHtyIE5FVyBWaXogb2YgQ2VydF8xIE5BIEFuc3dlcnMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNvbW1lbnQ9IiIsIGluY2x1ZGU9VFJVRSwgZmlnLmhlaWdodD0gOCwgZmlnLndpZHRoPTgsIGRwaT05Nn0KCmdvcXVlc2NlcnQyICU+JSAKICB1bmdyb3VwKCkgJT4lIG11dGF0ZShxdWVzID0gc3RyX3RydW5jKGdvcXVlc2NlcnQkcXVlc3Rpb24sIDEwMCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUKICBmaWx0ZXIocXVlc3Rpb24gIT0iSSBzZXJ2ZSwgb3Igd291bGQgbGlrZSB0byBzZXJ2ZSwgYXMgYW4gRWNvLUFtYmFzc2Fkb3IgZm9yIHRoZSBHcmVlbiBPZmZpY2UiKSAlPiUgICAgICAgICAKICBmaWx0ZXIoYW5zd2VyID09ICJOL0EiICYgc3VydmV5b3JkZXIgPT0gMSkgJT4lCiAgbXV0YXRlKHF1ZXM9IGZjdF9yZW9yZGVyKHF1ZXMsIGRlc2MocWFyYW5rX292ZXJhbGwpLCAuZnVuPW1heCwgLmRlc2M9RkFMU0UpKSAlPiUKICBtdXRhdGUoY2VydHByb3AgPSByb3VuZChjZXJ0cHJvcCwgMCkpICU+JQogIGZpbHRlcihxYXJhbmtfb3ZlcmFsbCA8PSAxNSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhxdWVzLCBjZXJ0cHJvcCwgZmlsbD1DZXJ0KSkgKwogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JywgcG9zaXRpb249ICJkb2RnZSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBjb29yZF9mbGlwKCkrCiAgI2ZhY2V0X3JlcF93cmFwKH5DZXJ0LCBzY2FsZXMgPSAiZnJlZV95Iixucm93PTMsIHJlcGVhdC50aWNrLmxhYmVscyA9ICdib3R0b20nKSArCiAgc2NhbGVfeF9yZW9yZGVyZWQoKSArCiAgZ2VvbV90ZXh0KGhqdXN0ID0gMSwgc2l6ZT1yZWwoOCksIGFlcyhsYWJlbD1jZXJ0cHJvcCksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwKICAgIGluaGVyaXQuYWVzID0gVFJVRSkrCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNBRDhBNTYiLCAiI0I0QjRCNCIsICIjQzlCMDM3IikpICsKICAgIGxhYnMoeCA9IE5VTEwsCiAgICAgICAgIHkgPSAiUGVyY2VudGFnZSBvZiBQZW9wbGUiLAogICAgICAgICB0aXRsZSA9ICJGaWcuIDEwOiBUb3AgMTUgJ04vQScgUXVlc3Rpb25zIGJ5ICUgb2YgU3RhcnRpbmcgQ2VydC4gTGV2ZWxzIikgKwp0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjgpLCBhbmdsZSA9IDAwKSkgKwp0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9MywgZmFjZT0iYm9sZCIsIGNvbG9yPSJibGFjayIsIHNpemU9cmVsKDEuNSkpKSArCnRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIHNpemU9cmVsKDEuOCkpKSsKdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgc2l6ZT1yZWwoMS44KSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCkpKQoKYGBgCkluIEZpZ3VyZSAxMCwgd2UgY2FuIHNlZSB0aGF0IHRoZSBxdWVzdGlvbiBtb3N0IGNvbW1vbmx5IGFuc3dlcmVkICJOb3QgQXBwbGljYWJsZSIgYXJlIHByZXR0eSB1bml2ZXJzYWwgYWNyb3NzIENlcnRpZmljYXRpb24gTGV2ZWxzLiBUaGlzIGVtcGhhc2l6ZXMgdGhlIG5lZWQgdG8gcmV2aXNlIHRoZXNlIHF1ZXN0aW9ucyB0byBiZSBtb3JlIHJlbGV2YW50IHNvIHRoYXQgdGhleSBjYW4gYmUgaW5jbHVkZWQgaW4gY2FsY3VsYXRpbmcgcGFydGljaXBhbnRzJyBzY29yZXMgYW5kIENlcnRpZmljYXRpb24gTGV2ZWxzLgoKSW4gdGhlIG5leHQgc2VjdGlvbiwgd2Ugd2lsbCBjb21wYXJlIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHN1cnZleXMgb2YgdGhlIDEyMCBwYXJ0aWNpcGFudHMgd2hvIHJlLWNlcnRpZmllZCB0byBoaWdobGlnaHQgdGhlIG1vc3QgY29tbW9uIGFjdGlvbnMgdGFrZW4gdG8gaW1wcm92ZSB0aGVpciBzY29yZXMuCgoKXAoKCiMgVG9wIEFjdGlvbnMgVGFrZW4gYnkgUmUtY2VydGlmeWluZyBQYXJ0aWNpcGFudHMKXAoKV2UgYWxyZWFkeSBrbm93IHRoYXQgcmUtY2VydGlmeWluZyBpcyBhbiBlc3NlbnRpYWwgcGFydCBvZiB0aGUgR3JlZW4gT2ZmaWNlIENoYWxsZW5nZSBpbiB0aGF0IGl0IGFsbG93cyBwYXJ0aWNpcGFudHMgdG8gcmV2aWV3IHRoZWlyIGN1cnJlbnQgc2l0dWF0aW9uIGFuZCBmaW5kIHdheXMgdG8gZG8gZXZlbiBiZXR0ZXIuIFdoYXQgd2UgZG9uJ3QgeWV0IGtub3cgaXMgdGhlIHBhcnRpY3VsYXIgYWN0aW9ucyB0aGF0IHBhcnRpY2lwYW50cyBoYXZlIGJlZW4gbW9zdCBsaWtlbHkgdG8gdGFrZSB0byBkbyBzby4gVG8gZGlhZ25vc2UgdGhpcywgd2Ugd2lsbCBjb21wYXJlIHRoZSBhbnN3ZXJzIGdpdmVuIGluIHBhcnRpY2lwYW50cycgZmlyc3Qgc3VydmV5IHRvIHRoZSBhbnN3ZXJzIGdpdmVuIGluIHRoZWlyIHNlY29uZCBzdXJ2ZXkgYW5kIGNhdGVnb3JpemUgdGhlbSBhcyAiQWN0aW9uIFRha2VuIiBpbiB0aGUgZm9sbG93aW5nIG1hbm5lciBzaG93biBpbiBUYWJsZSAyOgoKYGBge3IgVGFibGUgMiwgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gJ2FzaXMnLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKZmlyc3QgPC0gYygiQWN0aW9uIE5lZWRlZCIsICJBY3Rpb24gTmVlZGVkIiwgIlllcyIsICJZZXMiLCAiTi9BIikKc2Vjb25kIDwtIGMoIkFjdGlvbiBOZWVkZWQiLCAiWWVzIiwgIlllcyIsICJBY3Rpb24gTmVlZGVkIiwgIk4vQSIpCmFjdGlvbiA8LSBjKCJBY3Rpb24gU3RpbGwgTmVlZGVkIiwgIkltcHJvdmVkIiwgIlllcyBTdGFibGUiLCAiUmVncmVzc2VkIiwgIlN0aWxsIE5vdCBBcHBsaWNhYmxlIikKCnRhYmxlMiA8LSBkYXRhLmZyYW1lKGZpcnN0LCBzZWNvbmQsIGFjdGlvbikgJT4lCiAgcmVuYW1lKGBGaXJzdCBTdXJ2ZXlgID0gZmlyc3QsIGBTZWNvbmQgU3VydmV5YCA9IHNlY29uZCwgYEFjdGlvbiBUYWtlbmAgPSBhY3Rpb24pCgprYWJsZSh0YWJsZTIsIGNhcHRpb24gPSAiVGFibGUgMiIpCgpgYGAKT3RoZXIgY29tYmluYXRpb25zIG9mIE4vQSB3ZXJlIG5vdCBpbmNsdWRlZCBkdWUgdG8gZGlmZmljdWx0eSBvZiBpbnRlcnByZXRhdGlvbi4KCkZpZ3VyZSAxMSwgYmVsb3csIHNob3dzIHRoZSByZXN1bHRzIG9mIHRoaXMgYW5hbHlzaXM6CgpgYGB7ciBBY3Rpb24gVGFrZW4sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNvbW1lbnQ9IiIsIGluY2x1ZGU9VFJVRSwgZmlnLmhlaWdodD0gOCwgZmlnLndpZHRoPTgsIGRwaT05Nn0KCmdvYWN0ICU+JSB1bmdyb3VwKCkgJT4lIAogIHNlbGVjdChxdWVzdGlvbiwgc3VydmV5b3JkZXIsIHNlY3Rpb24sIGFzbl9wcm9wLCBuYV9wcm9wLCByZWdfcHJvcCwgeWVzX3Byb3AsIGltcF9wcm9wLCBvdGhlcl9wcm9wKSAlPiUKICBwaXZvdF9sb25nZXIoYyg0OjkpLCBuYW1lc190bz0iYWN0aW9uX3Rha2VuIiwgdmFsdWVzX3RvPSJhY3Rpb25fcHJvcCIpICU+JSBmaWx0ZXIoc3VydmV5b3JkZXI9PSAiMSB0byAyIikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoYWN0aW9uX3Rha2VuKSwKICAgICAgICAgICAgbGlzdCh+Y2FzZV93aGVuKAogICAgICAgICAgICAgIC4gPT0gImFzbl9wcm9wIiB+ICJBY3Rpb24gU3RpbGwgTmVlZGVkIiwKICAgICAgICAgICAgICAuID09ICJuYV9wcm9wIiB+ICJTdGlsbCBOb3QgQXBwbGljYWJsZSIsCiAgICAgICAgICAgICAgLiA9PSAicmVnX3Byb3AiIH4gIlJlZ3Jlc3NlZCIsCiAgICAgICAgICAgICAgLiA9PSAieWVzX3Byb3AiIH4gIlllcyBTdGFibGUiLAogICAgICAgICAgICAgIC4gPT0gImltcF9wcm9wIiB+ICJJbXByb3ZlZCIsCiAgICAgICAgICAgICAgLiA9PSAib3RoZXJfcHJvcCIgfiAiT3RoZXIiLAogICAgICAgICAgICAgIFRSVUUgfiAiTkEiKSkpICU+JSB1bmdyb3VwKCkgJT4lCiAgICBncm91cF9ieShhY3Rpb25fdGFrZW4pICU+JQogICAgbXV0YXRlKHFhcmFuayA9IG9yZGVyKG9yZGVyKGFjdGlvbl90YWtlbiwgYWN0aW9uX3Byb3AsIGRlY3JlYXNpbmc9VFJVRSkpKSAlPiUKICAgIGFycmFuZ2UoYWN0aW9uX3Rha2VuLCBxYXJhbmspIC0+IGdvYWN0bG9uZwoKZ29hY3Rsb25nJGFjdGlvbl90YWtlbiA8LSBmYWN0b3IoZ29hY3Rsb25nJGFjdGlvbl90YWtlbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQWN0aW9uIFN0aWxsIE5lZWRlZCIsICJJbXByb3ZlZCIsICJSZWdyZXNzZWQiLCAiU3RpbGwgTm90IEFwcGxpY2FibGUiLCAiT3RoZXIiKSkKCmdvYWN0bG9uZyAlPiUgCiAgdW5ncm91cCgpICU+JSBtdXRhdGUocXVlcyA9IHN0cl90cnVuYyhnb2FjdGxvbmckcXVlc3Rpb24sIDEwMCwgInJpZ2h0IiwgZWxsaXBzaXMgPSAiLSIpKSAlPiUKICBmaWx0ZXIocXVlc3Rpb24gIT0iSSBzZXJ2ZSwgb3Igd291bGQgbGlrZSB0byBzZXJ2ZSwgYXMgYW4gRWNvLUFtYmFzc2Fkb3IgZm9yIHRoZSBHcmVlbiBPZmZpY2UiKSAlPiUgICAgICAgICAgICAgICAgIGZpbHRlcihhY3Rpb25fdGFrZW4gIT0gIk90aGVyIikgJT4lIGZpbHRlcihhY3Rpb25fdGFrZW4gIT0gIlN0aWxsIE5vdCBBcHBsaWNhYmxlIikgJT4lCiAgbXV0YXRlKHF1ZXM9IHJlb3JkZXJfd2l0aGluKHF1ZXMsIGRlc2MocWFyYW5rKSwgYWN0aW9uX3Byb3ApKSAlPiUKICBtdXRhdGUoYWN0aW9uX3Byb3AgPSByb3VuZChhY3Rpb25fcHJvcCwgMCkpICU+JQogIGZpbHRlcighaXMubmEoYWN0aW9uX3Byb3ApKSAlPiUgCiAgZmlsdGVyKHFhcmFuayA8PSAyMCkgJT4lCiAgZ2dwbG90KC4sIGFlcyhxdWVzLCBhY3Rpb25fcHJvcCwgZmlsbD1hY3Rpb25fdGFrZW4pKSArCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgY29vcmRfZmxpcCgpKwogIGZhY2V0X3JlcF93cmFwKH5hY3Rpb25fdGFrZW4sIHNjYWxlcyA9ICJmcmVlX3kiLG5yb3c9MywgcmVwZWF0LnRpY2subGFiZWxzID0gJ2JvdHRvbScpICsKICBzY2FsZV94X3Jlb3JkZXJlZCgpICsKICBnZW9tX3RleHQoc2l6ZT1yZWwoOCksIGFlcyhsYWJlbD1hY3Rpb25fcHJvcCksaGp1c3Q9MSkgKwogICAgbGFicyh4ID0gTlVMTCwKICAgICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFJlLUNlcnRpZnlpbmcgUGFydGljaXBhbnRzIiwKICAgICAgICAgdGl0bGUgPSAiRmlnLiAxMTogVG9wIDIwIEFjdGlvbnMgVGFrZW4gcGVyIFF1ZXN0aW9uIEJldHdlZW4gRmlzdCBhbmQgU2Vjb25kIFN1cnZleXMiKSAtPiBhCgphICsgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMS44KSwgYW5nbGUgPSAwMCkpICsKdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTMsIGZhY2U9ImJvbGQiLCBjb2xvcj0iYmxhY2siLCBzaXplPXJlbCgxLjMpKSkgKwp0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAwLCBzaXplPXJlbCgxLjgpKSkrCnRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIHNpemU9cmVsKDEuOCkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgyLjgpKSkKCmBgYApJbiB0aGUgIkFjdGlvbiBTdGlsbCBOZWVkZWQiIHBsb3QgaW4gRmlndXJlIDExLCB3ZSBjYW4gc2VlIHRoYXQgbWFueSBvZiB0aGUgc2FtZSBjaGFsbGVuZ2VzIGluIHRoZSBmaXJzdCBzdXJ2ZXkgKEZpZy4gNikgcmVtYWluIGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIHNlY29uZCBzdXJ2ZXksIGFzIHNlZW4gaW4gcXVlc3Rpb25zIGxpa2UsICJJIHdvcmsgcGFwZXJsZXNzIiwgIkkgdXNlIGEgc2hhcmVkIHByaW50ZXIgYXMgb3Bwb3NlZCB0byBoYXZpbmcgYSBwZXJzb25hbCBwcmludGVyIGluIG15IG9mZmljZSIsIG9yICJJIHVzdWFsbHkgdGFrZSBub3RlcyBlbGVjdHJvbmljYWxseSBvciBvbiBzY3JhcCBwYXBlci4uLiIuIEhvd2V2ZXIsIHRoZSBwcm9wb3J0aW9uIG9mIHBhcnRpY2lwYW50cyBoYXMgZGVjcmVhc2VkIHNpZ25pZmljYW50bHkgZm9yIGFsbCBvZiB0aGVzZSAiQWN0aW9uIE5lZWRlZCIgcXVlc3Rpb25zLCBsYXJnZWx5IGJlY2F1c2Ugb2YgdGhlIGNoYW5nZXMgaWxsdXN0cmF0ZWQgaW4gdGhlICJJbXByb3ZlZCIgcGxvdCBpbiBGaWd1cmUgMTEuIAoKRm9yIGV4YW1wbGUsIGluIHRoZSBmaXJzdCBzdXJ2ZXkgKEZpZy4gNiksIDMxJSBvZiBwYXJ0aWNpcGFudHMgYW5zd2VyZWQgIkFjdGlvbiBOZWVkZWQiIGZvciAiSSB1c3VhbGx5IHRha2Ugbm90ZXMgZWxlY3Ryb25pY2FsbHkgb3Igb24gc2NyYXAgcGFwZXIuLi4iLCBidXQgaW4gdGhlIHNlY29uZCBzdXJ2ZXksIDE5JSBvZiBwYXJ0aWNpcGFudHMgd2VyZSBhYmxlIHRvIGltcHJvdmUgaW4gdGhpcyBhcmVhIChGaWcuIDExLCAiSW1wcm92ZWQiIHBsb3QpLiBBbHNvIGltcHJlc3NpdmUgYXJlIHRoZSAxOCUgb2YgcGFydGljaXBhbnRzIHdobyBJbXByb3ZlZCBvbiAiSSB3b3JrIHBhcGVybGVzcyIgKEZpZy4gMTEsICJJbXByb3ZlZCIgcGxvdCkgaW4gY29udHJhc3QgdG8gdGhlIDUyJSBvZiBwYXJ0aWNpcGFudHMgd2hvIGFuc3dlcmVkICJBY3Rpb24gTmVlZGVkIiBpbiB0aGUgZmlyc3Qgc3VydmV5IChGaWcuIDYpLiBPdGhlciBzaWduaWZpY2FudCBpbXByb3ZlbWVudHMgYXJlIHRoZSAyNCUgd2hvIG5vdyBoYXZlICJhIHNldCBvZiBkdXJhYmxlIGFuZCByZXVzYWJsZSBzaWx2ZXIgdGhhdCBJICBrZWVwIGluIHRoZSBvZmZpY2UiIG9yIHRoZSAxNSUgd2hvIGhhdmUgIltjYW5jZWxsZWRdIHN1YnNjcmlwdGlvbnMgdG8gcHJpbnRlZCBwZXJpb2RpY2FscyBhbmQgY2F0YWxvZ3MiLiBUaGUgIkltcHJvdmVkIiBwbG90IGluIEZpZ3VyZSAxMSBlbXBoYXNpemVzIHRoZSBpbXBvcnRhbmNlIG9mIHJlLWNlcnRpZnlpbmcgYW5kIHRoZSBzcGVjaWZpYyBhY3Rpb25zIHRoYXQgbWFueSBoYXZlIHRha2VuLgoKT24gdGhlIG90aGVyIGhhbmQsIHRoZSB0b3AgZml2ZSBtb3N0IGNvbW1vbiAiUmVncmVzc2VkIiBhY3Rpb25zIEZpZ3VyZSAxMSBzaG93cyB3aGljaCBhcmVhcyBtaWdodCBiZSBkaWZmaWN1bHQgdG8gbWFpbnRhaW4gb3ZlciB0aW1lLiBGdXJ0aGVyIHN1cHBvcnQgZnJvbSBvZmZpY2UgY28td29ya2VycyBvciBvdGhlciBHcmVlbiBPZmZpY2UgcGFydGljaXBhbnRzIG1heSBiZSBoZWxwZnVsIHRvIHByZXZlbnQgdGhpcy4KCkZpZ3VyZSAxMiwgYmVsb3csIGhpZ2hsaWdodHMgdGhlIGFyZWFzIHRoYXQgYXJlICJTdGlsbCBOb3QgQXBwbGljYWJsZSIgYWNyb3NzIHBhcnRpY2lwYW50cycgZmlyc3QgYW5kIHNlY29uZCBzdXJ2ZXlzLiBUaGVzZSBhcmUgbGFyZ2VseSB0aGUgc2FtZSBhcyB0aGUgIk5vdCBBcHBsaWNhYmxlIiByZXNwb25zZXMgaW4gdGhlIGZpcnN0IHN1cnZleSBzZWVuIGluIEZpZ3VyZSA2LgoKYGBge3IgTkEgQWN0aW9uIFRha2VuLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjb21tZW50PSIiLCBpbmNsdWRlPVRSVUUsIGZpZy5oZWlnaHQ9IDgsIGZpZy53aWR0aD0xMCwgZHBpPTk2fQpnb2FjdGxvbmcgJT4lIAogIHVuZ3JvdXAoKSAlPiUgbXV0YXRlKHF1ZXMgPSBzdHJfdHJ1bmMoZ29hY3Rsb25nJHF1ZXN0aW9uLCAxMDAsICJyaWdodCIsIGVsbGlwc2lzID0gIi0iKSkgJT4lCiAgZmlsdGVyKHF1ZXN0aW9uICE9Ikkgc2VydmUsIG9yIHdvdWxkIGxpa2UgdG8gc2VydmUsIGFzIGFuIEVjby1BbWJhc3NhZG9yIGZvciB0aGUgR3JlZW4gT2ZmaWNlIikgJT4lICAgICAgICAgICAgICAgICBmaWx0ZXIoYWN0aW9uX3Rha2VuID09ICJTdGlsbCBOb3QgQXBwbGljYWJsZSIpICU+JQogIG11dGF0ZShxdWVzPSByZW9yZGVyX3dpdGhpbihxdWVzLCBkZXNjKHFhcmFuayksIGFjdGlvbl9wcm9wKSkgJT4lCiAgbXV0YXRlKGFjdGlvbl9wcm9wID0gcm91bmQoYWN0aW9uX3Byb3AsIDApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFjdGlvbl9wcm9wKSkgJT4lIAogIGZpbHRlcihxYXJhbmsgPD0gMjApICU+JQogIGdncGxvdCguLCBhZXMocXVlcywgYWN0aW9uX3Byb3AsIGZpbGw9YWN0aW9uX3Rha2VuKSkgKwogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5Jywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGNvb3JkX2ZsaXAoKSsKICAjZmFjZXRfcmVwX3dyYXAofmFjdGlvbl90YWtlbiwgc2NhbGVzID0gImZyZWVfeSIsbnJvdz0zLCByZXBlYXQudGljay5sYWJlbHMgPSAnYm90dG9tJykgKwogIHNjYWxlX3hfcmVvcmRlcmVkKCkgKwogIGdlb21fdGV4dChzaXplPXJlbCgxMCksIGFlcyhsYWJlbD1hY3Rpb25fcHJvcCksaGp1c3Q9MSkgKwogICAgbGFicyh4ID0gTlVMTCwKICAgICAgICAgeSA9ICJQZXJjZW50YWdlIG9mIFJlLUNlcnRpZnlpbmcgUGFydGljaXBhbnRzIiwKICAgICAgICAgdGl0bGUgPSAiRmlnLiAxMjogVG9wIDIwICdTdGlsbCBOb3QgQXBwbGljYWJsZScgUXVlc3Rpb25zIEJldHdlZW4gRmlyc3QgJiBTZWNvbmQgU3VydmV5cyIpIC0+IGIKCmIgKyB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgxLjgpLCBhbmdsZSA9IDAwKSkgKwp0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGxpbmVoZWlnaHQ9MywgZmFjZT0iYm9sZCIsIGNvbG9yPSJibGFjayIsIHNpemU9cmVsKDEuOCkpKSArCnRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMDAsIHNpemU9cmVsKDEuOCkpKSsKdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwMCwgc2l6ZT1yZWwoMS44KSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gcmVsKDIuOCkpKQoKCmBgYAoKXAoKCiMgQ29uY2x1c2lvbiBhbmQgTmV4dCBTdGVwcwpcCgpUaGlzIHJlcG9ydCBjYXB0dXJlcyBob3cgTm9ydGhlYXN0ZXJuIFVuaXZlcnNpdHkncyBHcmVlbiBPZmZpY2UgQ2hhbGxlbmdlIGhhcyBvcGVyYXRlZCBzaW5jZSBpdHMgbGF1bmNoIGluIHRoZSBGYWxsIG9mIDIwMTYuIEdvaW5nIGZvcndhcmQsIHRoaXMgYmFzZWxpbmUgcHJvdmlkZXMgYW4gb3Bwb3J0dW5pdHkgdG8gaW1wcm92ZSB0aGUgcHJvZ3JhbSBhbmQgbWVhc3VyZSB0aGUgaW1wYWN0IG9mIHRob3NlIGltcHJvdmVtZW50cy4gS2V5IGltcHJvdmVtZW50IGFyZWFzIGluY2x1ZGUgaW5jcmVhc2luZyByZS1jZXJ0aWZpY2F0aW9uLCBpbnZvbHZpbmcgRWNvLUFtYmFzc2Fkb3JzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LCBhbmQgcmV2aXNpbmcgdGhlIHN1cnZleSBib3RoIHRvIGJlIG1vcmUgYXBwbGljYWJsZSBhbmQgdG8gYmV0dGVyIHF1YW50aWZ5IHRoZSByZWFsIGVudmlyb25tZW50YWwgaW1wYWN0IG9mIHRoZSBwcm9ncmFtLgoKCgoK