data pulled: 2023-03-27
website: http://rpubs.com/nsharmaa/spasd_tracking


This report is meant to provide a quick overview of the Social Processes Initiative in Neurobiology of Autism-spectrum and Schizophrenia-spectrum Disorders (SPIN-ASD) study. All data summarized here derives from the SPIN-ASD project on CAMH’s REDCap database, the SPINS project on AHRC’s REDCap database, and TIGRLab’s XNAT database. This summary is only as accurate as the data captured there.

For each of the plots, you can hover over selected areas to see more metadata. Dragging a rectangle over a specific area of the plot will zoom in and double clicking will reset to the original view.

Demographics

As part of the study design, one of the goals is to collect cognitive and MR imaging data from 140 participants (100 participants with autism-spectrum disorders and 40 healthy controls). Participants who either drop out, are withdrawn prior to completing the study, or whose MRI data cannot be used will be replaced until this goal is achieved.

The study will also leverage previously collected data from the Social Processes Initiative in Neurobiology of Schizophrenias (SPINS) study, which consists of a matching protocol. SPINS is a multi-site study that collected cognitive and MR imaging data from clinically stable patients with schizophrenia-spectrum disorders and healthy controls from each of CAMH (CMH), Zucker Hillside Hospital (ZHH) and Maryland Psychiatric Research Center (MRC).

SPIN-ASD

Thus far, 137 participants have consented to be in the study. A table summarizing their demographics as well as histograms of their age and estimated IQ distributions are shown below.

For estimated IQ, study participants either completed the Wechsler Abbreviated Scale of Intelligence (WASI-II) or the Wechsler Adult Intelligence Scale (WAIS-IV).

Case
(N=101)
Control
(N=36)
Overall
(N=137)
Age (years)
Mean (SD) 21 (± 3.8) 27 (± 4.5) 22 (± 4.8)
Median [Min, Max] 20 [15, 33] 27 [17, 35] 22 [15, 35]
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Sex
Female 41 (41 %) 15 (42 %) 56 (41 %)
Male 60 (59 %) 20 (56 %) 80 (58 %)
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Race
Asian 14 (14 %) 16 (44 %) 30 (22 %)
Black or African American 1 (1 %) 6 (17 %) 7 (5 %)
More than one race 8 (8 %) 2 (6 %) 10 (7 %)
Other 6 (6 %) 0 (0 %) 6 (4 %)
White 72 (71 %) 11 (31 %) 83 (61 %)
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Education (years)
Mean (SD) 13 (± 2.2) 16 (± 2.0) 14 (± 2.6)
Median [Min, Max] 12 [9.0, 20] 16 [11, 20] 13 [9.0, 20]
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Estimated IQ
Mean (SD) 110 (± 14) 110 (± 11) 110 (± 13)
Median [Min, Max] 120 [73, 150] 110 [96, 130] 110 [73, 150]
Missing 39 (38.6%) 23 (63.9%) 62 (45.3%)
MATRICS
Mean (SD) 41 (± 11) 48 (± 12) 43 (± 11)
Median [Min, Max] 43 [-3.0, 59] 51 [16, 64] 44 [-3.0, 64]
Missing 13 (12.9%) 8 (22.2%) 21 (15.3%)

SPINS

The total SPINS dataset consists of 359 participants with an SSD and 198 participants. After filtering the dataset for participants within the same age range as SPIN-ASD, we get the demographics table, and age and estimated IQ distributions shown below.

For estimated IQ, study participants completed the Wechsler Test of Adult Reading (WTAR).

CMH
CMP
MRC
MRP
ZHH
ZHP
Overall
Case
(N=107)
Control
(N=47)
Case
(N=15)
Control
(N=14)
Case
(N=18)
Control
(N=15)
Case
(N=32)
Control
(N=27)
Case
(N=22)
Control
(N=13)
Case
(N=45)
Control
(N=26)
Case
(N=239)
Control
(N=142)
Age (years)
Mean (SD) 26 (± 4.6) 24 (± 4.2) 25 (± 3.4) 26 (± 4.1) 27 (± 5.2) 28 (± 4.1) 28 (± 4.8) 27 (± 4.1) 28 (± 4.4) 27 (± 5.2) 25 (± 4.7) 28 (± 4.7) 26 (± 4.7) 26 (± 4.5)
Median [Min, Max] 25 [18, 35] 23 [18, 35] 24 [20, 31] 25 [20, 34] 26 [18, 34] 29 [21, 33] 28 [18, 35] 26 [19, 34] 30 [21, 35] 26 [20, 35] 24 [18, 35] 28 [18, 35] 25 [18, 35] 25 [18, 35]
Sex
Female 31 (29 %) 21 (45 %) 7 (47 %) 10 (71 %) 3 (17 %) 3 (20 %) 7 (22 %) 11 (41 %) 9 (41 %) 7 (54 %) 15 (33 %) 16 (62 %) 72 (30 %) 68 (48 %)
Male 76 (71 %) 26 (55 %) 8 (53 %) 4 (29 %) 15 (83 %) 12 (80 %) 25 (78 %) 16 (59 %) 13 (59 %) 6 (46 %) 30 (67 %) 10 (38 %) 167 (70 %) 74 (52 %)
Intersex 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %)
Race
American Indian/Alaska Native 1 (1 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 1 (0 %) 0 (0 %)
Asian 23 (21 %) 15 (32 %) 1 (7 %) 7 (50 %) 2 (11 %) 1 (7 %) 3 (9 %) 1 (4 %) 2 (9 %) 1 (8 %) 9 (20 %) 5 (19 %) 40 (17 %) 30 (21 %)
Black or African American 17 (16 %) 3 (6 %) 1 (7 %) 0 (0 %) 12 (67 %) 7 (47 %) 13 (41 %) 4 (15 %) 10 (45 %) 4 (31 %) 18 (40 %) 11 (42 %) 71 (30 %) 29 (20 %)
More than one race 8 (7 %) 2 (4 %) 5 (33 %) 0 (0 %) 1 (6 %) 1 (7 %) 1 (3 %) 0 (0 %) 3 (14 %) 2 (15 %) 1 (2 %) 0 (0 %) 19 (8 %) 5 (4 %)
Other 3 (3 %) 1 (2 %) 1 (7 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 1 (4 %) 2 (9 %) 0 (0 %) 0 (0 %) 0 (0 %) 6 (3 %) 2 (1 %)
Unknown or not reported 3 (3 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 0 (0 %) 2 (9 %) 0 (0 %) 0 (0 %) 0 (0 %) 5 (2 %) 0 (0 %)
White 52 (49 %) 26 (55 %) 7 (47 %) 7 (50 %) 3 (17 %) 6 (40 %) 15 (47 %) 21 (78 %) 3 (14 %) 6 (46 %) 17 (38 %) 10 (38 %) 97 (41 %) 76 (54 %)
Education (years)
Mean (SD) 13 (± 1.8) 15 (± 1.8) 14 (± 2.1) 17 (± 1.7) 13 (± 1.8) 15 (± 1.8) 14 (± 2.3) 17 (± 2.0) 13 (± 2.2) 15 (± 2.4) 14 (± 1.8) 17 (± 2.0) 14 (± 1.9) 16 (± 2.0)
Median [Min, Max] 13 [10, 18] 16 [11, 18] 14 [10, 18] 18 [14, 20] 14 [10, 16] 16 [12, 18] 14 [7.0, 18] 16 [12, 20] 14 [10, 18] 16 [12, 19] 13 [9.0, 18] 17 [13, 20] 13 [7.0, 18] 16 [11, 20]
Estimated IQ
Mean (SD) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA) NA (± NA)
Median [Min, Max] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA] NA [NA, NA]
Missing 107 (100%) 47 (100%) 15 (100%) 14 (100%) 18 (100%) 15 (100%) 32 (100%) 27 (100%) 22 (100%) 13 (100%) 45 (100%) 26 (100%) 239 (100%) 142 (100%)

Assessment Completion Status

Below is a heatmap depicting which assessments have been completed for each participant in SPIN-ASD. There are separate tabs dividing Case and Control participants. The Assessment is shown in the x axis and the Subject ID is shown in the y axis. Green indicates ‘complete’, red indicates ‘incomplete’ and yellow indicates a ‘partial complete’. Blank rectangles indicate that the assessment either hasn’t been attempted yet or that the data hasn’t been entered. You can hover over each square to get more details on the reason for an assessment being incomplete.

The Autism-Spectrum Quotient (AQ), Schizotypal Personality Questionnaire-Brief (SPQ-B) and Beck Depression Inventory-II (BDI-II) were added to the study protocol partway through the study and haven’t been completed for several participants at the beginning.

Case

The Autism Diagnostic Interview-Revised (ADI-R) was included in the study protocol in the event of an inconclusive clinical diagnosis and a need for further diagnostic information following the Autism Diagnostic Observation Schedule, Second Edition (ADOS-2) .

Control

Social Cognition

RMET

The Reading the Mind in the Eyes test (RMET) is a test of social sensitivity. The participant is presented with a series of 36 photographs of the eye region and asked to choose which of 4 words best describes what the actor in the photograph is thinking or feeling.

IRI

The Interpersonal Reactivity Index (IRI) is a 28 item self-report measure of cognitive and affective empathy.

TASIT-R

The Awareness of Social Inference Test-Revised (TASIT-R) consists of emotion evaluation (Part 1), social inference - minimal (Part 2), and social inference - enriched (Part 3). In Part 1, the participant views 28 brief video clips to identify the emotion expressed by the actor. In Part 2 and 3, the participant views 31 videotaped vignettes of social interactions involving lies and sarcasm and makes judgements regarding what the individual in the scene believed or knew, meant by what he or she said, intended to do, and actually felt.

ER-40

The Penn Emotion Recognition Task-40 (ER-40) is a measure of emotional processing. Participants rate the emotional valence of 40 faces displaying happy, sad or neutral expressions on a 7 point scale.

A median response time below 1000 seconds indicates inattention and should be filtered out from further analysis.

MRI

Thus far, 121 participants have been scanned. The target is to scan 3.33 participants per month (40 per year). We are currently averaging 2.28 participants per month.

Score Distributions

BSFS Section 1

BSFS Section 2

BSFS Section 3

BSFS Section 4

BSFS Section 5

BSFS Section 6

BSFS Total

Framewise Displacement

We use mriqc to obtain image quality metrics (IQMs) for the T1w, T2w, and fMRI scans. Below are plots of framewise displacement (FD), a measure of head motion across time. Specifically, the average FD for each scan across all timepoints and the percentage of FDs above a threshold of 0.5 mm are shown.

LS0tCnRpdGxlOiAiU1BJTi1BU0QgU3R1ZHkgVHJhY2tpbmciCmRlc2NyaXB0aW9uOiB8CiAgVGhpcyByZXBvcnQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBTUElOLUFTRCBzdHVkeS4Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBmaWdfd2lkdGg6IDgKLS0tCgpkYXRhIHB1bGxlZDogYHIgU3lzLkRhdGUoKWAgIAp3ZWJzaXRlOiBodHRwOi8vcnB1YnMuY29tL25zaGFybWFhL3NwYXNkX3RyYWNraW5nCgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgY29tbWVudCA9ICIjIyIsCiAgUi5vcHRpb25zID0gbGlzdCh3aWR0aCA9IDYwKQopCgpkYXRlIDwtIFN5cy5EYXRlKCkKCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgp0IDwtIGxpc3QoCiAgZmFtaWx5ID0gImhlbHZldGljYSIsCiAgc2l6ZSA9IDE0CikKYGBgCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdsdWUpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGFibGUxKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCmBgYHtyIGxvYWRfZGF0YX0Kc291cmNlKGhlcmUoIlIvZ2V0X3JlZGNhcC5SIikpCgpzZXR0aW5nc19jZmcgPC0gaGVyZSgibWV0YWRhdGEvc2V0dGluZ3MueWFtbCIpCnNwYXNkX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUEFTRF97ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwYXNkX2RhdGFfcGF0aCkpewogIGdldF9yZWRjYXAoIlNQQVNEIiwgc2V0dGluZ3NfY2ZnLCBzcGFzZF9kYXRhX3BhdGgpCn0KCnNwaW5zX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUElOU197ZGF0ZX0uY3N2IikpCgppZiAoIWZpbGUuZXhpc3RzKHNwaW5zX2RhdGFfcGF0aCkpIHsKICAgIGdldF9yZWRjYXAoIlNQSU5TIiwgc2V0dGluZ3NfY2ZnLCBzcGluc19kYXRhX3BhdGgpCn0KYGBgCgpgYGB7ciBjbGVhbl9kYXRhfQpzcGFzZF9yZWRjYXBfZGYgPC0KICByZWFkX2NzdihzcGFzZF9kYXRhX3BhdGgsIG5hID0gYygiIiwgIk5BIiwgIk5JIiwgIklOViIsICJOQVNLIiwgIkFTS1UiKSkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU4tQVNEIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSkgJT4lCiAgZmlsdGVyKHJlZGNhcF9ldmVudF9uYW1lICE9ICJjbF9hcm1fMyIpICU+JQogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3JlZGNhcF9kZiA8LQogIHJlYWRfY3N2KHNwaW5zX2RhdGFfcGF0aCkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQSU5TIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzEiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ29udHJvbCIpICU+JQogICAgICAgICAgICAgICAgICAgIGZhY3RvciguKSkgJT4lICAgICAgIAogIHNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCnNwaW5zX3RvdGFsX2Nhc2UgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgpzcGluc190b3RhbF9jb250cm9sIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG5yb3coKQoKc3BpbnNfcmVkY2FwX2RmIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihkZW1vX2FnZV9zdHVkeV9lbnRyeSA8IDM2KQoKCnRhcmdldHNfZGYgPC0KICByZWFkX2NzdihoZXJlKCJtZXRhZGF0YSIsICJyZWNydWl0bWVudF90YXJnZXRzLmNzdiIpKQpgYGAKClRoaXMgcmVwb3J0IGlzIG1lYW50IHRvIHByb3ZpZGUgYSBxdWljayBvdmVydmlldyBvZiB0aGUgKipTb2NpYWwgUHJvY2Vzc2VzIEluaXRpYXRpdmUgaW4gTmV1cm9iaW9sb2d5IG9mIEF1dGlzbS1zcGVjdHJ1bSBhbmQgU2NoaXpvcGhyZW5pYS1zcGVjdHJ1bSBEaXNvcmRlcnMgKFNQSU4tQVNEKSoqIHN0dWR5LiBBbGwgZGF0YSBzdW1tYXJpemVkIGhlcmUgZGVyaXZlcyBmcm9tIHRoZSBTUElOLUFTRCBwcm9qZWN0IG9uIENBTUgncyBSRURDYXAgZGF0YWJhc2UsIHRoZSBTUElOUyBwcm9qZWN0IG9uIEFIUkMncyBSRURDYXAgZGF0YWJhc2UsIGFuZCBUSUdSTGFiJ3MgWE5BVCBkYXRhYmFzZS4gVGhpcyBzdW1tYXJ5IGlzIG9ubHkgYXMgYWNjdXJhdGUgYXMgdGhlIGRhdGEgY2FwdHVyZWQgdGhlcmUuICAKCkZvciBlYWNoIG9mIHRoZSBwbG90cywgeW91IGNhbiBob3ZlciBvdmVyIHNlbGVjdGVkIGFyZWFzIHRvIHNlZSBtb3JlIG1ldGFkYXRhLiBEcmFnZ2luZyBhIHJlY3RhbmdsZSBvdmVyIGEgc3BlY2lmaWMgYXJlYSBvZiB0aGUgcGxvdCB3aWxsIHpvb20gaW4gYW5kIGRvdWJsZSBjbGlja2luZyB3aWxsIHJlc2V0IHRvIHRoZSBvcmlnaW5hbCB2aWV3LgoKIyMgRGVtb2dyYXBoaWNzIHsudGFic2V0fQoKQXMgcGFydCBvZiB0aGUgc3R1ZHkgZGVzaWduLCBvbmUgb2YgdGhlIGdvYWxzIGlzIHRvIGNvbGxlY3QgY29nbml0aXZlIGFuZCBNUiBpbWFnaW5nIGRhdGEgZnJvbSAqKjE0MCoqIHBhcnRpY2lwYW50cyAoKioxMDAgcGFydGljaXBhbnRzIHdpdGggYXV0aXNtLXNwZWN0cnVtIGRpc29yZGVycyoqIGFuZCAqKjQwIGhlYWx0aHkgY29udHJvbHMqKikuIFBhcnRpY2lwYW50cyB3aG8gZWl0aGVyIGRyb3Agb3V0LCBhcmUgd2l0aGRyYXduIHByaW9yIHRvIGNvbXBsZXRpbmcgdGhlIHN0dWR5LCBvciB3aG9zZSBNUkkgZGF0YSBjYW5ub3QgYmUgdXNlZCB3aWxsIGJlIHJlcGxhY2VkIHVudGlsIHRoaXMgZ29hbCBpcyBhY2hpZXZlZC4gIAoKVGhlIHN0dWR5IHdpbGwgYWxzbyBsZXZlcmFnZSBwcmV2aW91c2x5IGNvbGxlY3RlZCBkYXRhIGZyb20gdGhlICoqU29jaWFsIFByb2Nlc3NlcyBJbml0aWF0aXZlIGluIE5ldXJvYmlvbG9neSBvZiBTY2hpem9waHJlbmlhcyAoU1BJTlMpKiogc3R1ZHksIHdoaWNoIGNvbnNpc3RzIG9mIGEgbWF0Y2hpbmcgcHJvdG9jb2wuIFNQSU5TIGlzIGEgbXVsdGktc2l0ZSBzdHVkeSB0aGF0IGNvbGxlY3RlZCBjb2duaXRpdmUgYW5kIE1SIGltYWdpbmcgZGF0YSBmcm9tICoqY2xpbmljYWxseSBzdGFibGUgcGF0aWVudHMgd2l0aCBzY2hpem9waHJlbmlhLXNwZWN0cnVtIGRpc29yZGVycyoqIGFuZCAqKmhlYWx0aHkgY29udHJvbHMqKiBmcm9tIGVhY2ggb2YgKipDQU1IIChDTUgpKiosICoqWnVja2VyIEhpbGxzaWRlIEhvc3BpdGFsIChaSEgpKiogYW5kICoqTWFyeWxhbmQgUHN5Y2hpYXRyaWMgUmVzZWFyY2ggQ2VudGVyIChNUkMpKiouCgojIyMgU1BJTi1BU0QKCmBgYCB7ciBzcGFzZF9kZW1vX2RhdGFmcmFtZX0Kc3Bhc2RfZGVtb19kZiA8LQogIHNwYXNkX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwKICAgICAgICAgZGVtb19zZXhfYmlydGgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LAogICAgICAgICBkZW1vX3JhY2VfX18xX3doaXRlLCBkZW1vX3JhY2VfX18yX2JsYWNrLCBkZW1vX3JhY2VfX18zX25hdGl2ZSwKICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiwgZGVtb19yYWNlX19fNV9pc2xhbmRlciwgZGVtb19yYWNlX19fNl9vdGhlciwKICAgICAgICAgZGVtb19yYWNlX19fN19taXhlZCwgZGVtb19yYWNlX19fOF91bmtub3duLCBkZW1vX3JhY2Vfb3RoZXIsCiAgICAgICAgIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmLCB3YXNpX3dhaXNfZnNpcSwgd2FzaV9mc2lxNF9jcywgbnBfY29tcG9zaXRlX3RzY29yZSwKICAgICAgICAgaGFuZF9sYXRlcmFsaXR5X3F1b3RpZW50KSAlPiUKICBtdXRhdGUoc2V4ID0gZmFjdG9yKGRlbW9fc2V4X2JpcnRoLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLCAyLCAzKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkZlbWFsZSIsICJNYWxlIiwgIkludGVyc2V4IikpLAogICAgICAgICByYWNlID0gY2FzZV93aGVuKGRlbW9fcmFjZV9fXzdfbWl4ZWQgPT0gMSB+ICJNb3JlIHRoYW4gb25lIHJhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzFfd2hpdGUgPT0gMSB+ICJXaGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMl9ibGFjayA9PSAxIH4gIkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzNfbmF0aXZlID09IDEgfiAiQW1lcmljYW4gSW5kaWFuL0FsYXNrYSBOYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4gPT0gMSB+ICJBc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNV9pc2xhbmRlciA9PSAxIH4gIkhhd2FpaWFuIG9yIFBhY2lmaWMgSXNsYW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzZfb3RoZXIgPT0gMSB+ICJPdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fOF91bmtub3duID09IDEgfiAiVW5rbm93biBvciBub3QgcmVwb3J0ZWQiKSAlPiUKICAgICAgICAgICBmYWN0b3IoLiksCiAgICAgICAgIGlxID0gaWZlbHNlKGlzLm5hKHdhc2lfZnNpcTRfY3MpLCB3YXNpX3dhaXNfZnNpcSwgd2FzaV9mc2lxNF9jcykpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBzZXgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LCByYWNlLCBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgaXEsIG5wX2NvbXBvc2l0ZV90c2NvcmUpICU+JQogIGRyb3BsZXZlbHMoKQpgYGAKClRodXMgZmFyLCAqKmByIG5yb3coc3Bhc2RfZGVtb19kZilgKiogcGFydGljaXBhbnRzIGhhdmUgY29uc2VudGVkIHRvIGJlIGluIHRoZSBzdHVkeS4gQSB0YWJsZSBzdW1tYXJpemluZyB0aGVpciBkZW1vZ3JhcGhpY3MgYXMgd2VsbCBhcyBoaXN0b2dyYW1zIG9mIHRoZWlyIGFnZSBhbmQgZXN0aW1hdGVkIElRIGRpc3RyaWJ1dGlvbnMgYXJlIHNob3duIGJlbG93LiAgCgpGb3IgKiplc3RpbWF0ZWQgSVEqKiwgc3R1ZHkgcGFydGljaXBhbnRzIGVpdGhlciBjb21wbGV0ZWQgdGhlICoqV2VjaHNsZXIgQWJicmV2aWF0ZWQgU2NhbGUgb2YgSW50ZWxsaWdlbmNlIChXQVNJLUlJKSoqIG9yIHRoZSAqKldlY2hzbGVyIEFkdWx0IEludGVsbGlnZW5jZSBTY2FsZSAoV0FJUy1JVikqKi4KCmBgYHtyIHNwYXNkX2RlbW9fdGFibGV9CmxhYmVsKHNwYXNkX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnkpIDwtICJBZ2UgKHllYXJzKSIKbGFiZWwoc3Bhc2RfZGVtb19kZiRzZXgpIDwtICJTZXgiCmxhYmVsKHNwYXNkX2RlbW9fZGYkcmFjZSkgPC0gIlJhY2UiCmxhYmVsKHNwYXNkX2RlbW9fZGYkZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYpIDwtIkVkdWNhdGlvbiAoeWVhcnMpIgpsYWJlbChzcGFzZF9kZW1vX2RmJGlxKSA8LSAiRXN0aW1hdGVkIElRIgpsYWJlbChzcGFzZF9kZW1vX2RmJG5wX2NvbXBvc2l0ZV90c2NvcmUpIDwtICJNQVRSSUNTIgoKbXkucmVuZGVyLmNvbnQgPC0gZnVuY3Rpb24oeCkgewogICAgd2l0aChzdGF0cy5hcHBseS5yb3VuZGluZyhzdGF0cy5kZWZhdWx0KHgpLCBkaWdpdHM9MiksIGMoIiIsCiAgICAgICAgIk1lYW4gKFNEKSI9c3ByaW50ZigiJXMgKCZwbHVzbW47ICVzKSIsIE1FQU4sIFNEKSwKICAgICAgICAiTWVkaWFuIFtNaW4sIE1heF0iPXNwcmludGYoIiVzIFslcywgJXNdIiwgTUVESUFOLCBNSU4sIE1BWCkpKQp9Cm15LnJlbmRlci5jYXQgPC0gZnVuY3Rpb24oeCkgewogICAgYygiIiwgc2FwcGx5KHN0YXRzLmRlZmF1bHQoeCksIGZ1bmN0aW9uKHkpIHdpdGgoeSwKICAgICAgICBzcHJpbnRmKCIlZCAoJTAuMGYgJSUpIiwgRlJFUSwgUENUKSkpKQp9CgpzcGFzZF9kZW1vX3RhYmxlIDwtCiAgdGFibGUxKH4gZGVtb19hZ2Vfc3R1ZHlfZW50cnkgKyBzZXggKyByYWNlICsgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYgKyBpcSArIG5wX2NvbXBvc2l0ZV90c2NvcmUgfCBncm91cCwKICAgICAgICBkYXRhID0gc3Bhc2RfZGVtb19kZiwKICAgICAgICByZW5kZXIuY29udGludW91cyA9IG15LnJlbmRlci5jb250LCByZW5kZXIuY2F0ZWdvcmljYWwgPSBteS5yZW5kZXIuY2F0KQoKc3Bhc2RfZGVtb190YWJsZQpgYGAKCmBgYHtyIHNwYXNkX2RlbW9fZGlzdHJpYnV0aW9uc30Kc3Bhc2RfYWdlX2Rpc3RyaWJ1dGlvbiA8LQogIHBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSAxNSwgZW5kID0gMzYsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwYXNkX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnlbc3Bhc2RfZGVtb19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UiKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRkZW1vX2FnZV9zdHVkeV9lbnRyeVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCIpICU+JQogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFnZSAoeWVhcnMpIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCnNwYXNkX2lxX2Rpc3RyaWJ1dGlvbiA8LQogIHBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSA3MCwgZW5kID0gMTUwLCBzaXplID0gMTApKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRpcVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSIpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGFzZF9kZW1vX2RmJGlxW3NwYXNkX2RlbW9fZGYkZ3JvdXAgPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIikgJT4lCiAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRXN0aW1hdGVkIElRIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCnNwYXNkX2FnZV9kaXN0cmlidXRpb24Kc3Bhc2RfaXFfZGlzdHJpYnV0aW9uCmBgYAoKIyMjIFNQSU5TCgpgYGB7ciBzcGluc19kZW1vX2RhdGFmcmFtZX0Kc3BpbnNfZGVtb19kZiA8LQogIHNwaW5zX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwgIAogCiAgICAgICAgIGRlbW9fc2V4X2JpcnRoLCBkZW1vX2FnZV9zdHVkeV9lbnRyeSwKICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSwgZGVtb19yYWNlX19fMl9ibGFjaywgZGVtb19yYWNlX19fM19uYXRpdmUsCiAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4sIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIsIGRlbW9fcmFjZV9fXzZfb3RoZXIsCiAgICAgICAgIGRlbW9fcmFjZV9fXzdfbWl4ZWQsIGRlbW9fcmFjZV9fXzhfdW5rbm93biwgZGVtb19yYWNlX290aGVyLAogICAgICAgICBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgd3Rhcl9zdGRfc2NvcmUsIHd0YXJzdW1fc3RkLAogICAgICAgICBoYW5kX2xhdGVyYWxpdHlfcXVvdGllbnQpICU+JQogIG11dGF0ZShzZXggPSBmYWN0b3IoZGVtb19zZXhfYmlydGgsCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsIDIsIDMpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiLCAiSW50ZXJzZXgiKSksCiAgICAgICAgIHJhY2UgPSBjYXNlX3doZW4oZGVtb19yYWNlX19fN19taXhlZCA9PSAxIH4gIk1vcmUgdGhhbiBvbmUgcmFjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSA9PSAxIH4gIldoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18yX2JsYWNrID09IDEgfiAiQmxhY2sgb3IgQWZyaWNhbiBBbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fM19uYXRpdmUgPT0gMSB+ICJBbWVyaWNhbiBJbmRpYW4vQWxhc2thIE5hdGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNF9hc2lhbiA9PSAxIH4gIkFzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX181X2lzbGFuZGVyID09IDEgfiAiSGF3YWlpYW4gb3IgUGFjaWZpYyBJc2xhbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNl9vdGhlciA9PSAxIH4gIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX184X3Vua25vd24gPT0gMSB+ICJVbmtub3duIG9yIG5vdCByZXBvcnRlZCIpICU+JQogICAgICAgICAgIGZhY3RvciguKSwKICAgICAgICAgaXEgPSBpZmVsc2UoaXMubmEod3Rhcl9zdGRfc2NvcmUpLHd0YXJfc3RkX3Njb3JlLCB3dGFyc3VtX3N0ZCkpICU+JQogIHNlcGFyYXRlKHJlY29yZF9pZCwgYygic3R1ZHkiLCAic2l0ZSIsICJzdWIiKSwgc2VwID0gIl8iLCByZW1vdmUgPSBGQUxTRSkgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgc2l0ZSwgZ3JvdXAsIHNleCwgZGVtb19hZ2Vfc3R1ZHlfZW50cnksIHJhY2UsIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmLCBpcSkKYGBgCgpUaGUgdG90YWwgU1BJTlMgZGF0YXNldCBjb25zaXN0cyBvZiAqKmByIHNwaW5zX3RvdGFsX2Nhc2VgKiogcGFydGljaXBhbnRzIHdpdGggYW4gU1NEIGFuZCAqKmByIHNwaW5zX3RvdGFsX2NvbnRyb2xgKiogcGFydGljaXBhbnRzLiBBZnRlciBmaWx0ZXJpbmcgdGhlIGRhdGFzZXQgZm9yIHBhcnRpY2lwYW50cyB3aXRoaW4gdGhlIHNhbWUgYWdlIHJhbmdlIGFzIFNQSU4tQVNELCB3ZSBnZXQgdGhlIGRlbW9ncmFwaGljcyB0YWJsZSwgYW5kIGFnZSBhbmQgZXN0aW1hdGVkIElRIGRpc3RyaWJ1dGlvbnMgc2hvd24gYmVsb3cuICAKCkZvciAqKmVzdGltYXRlZCBJUSoqLCBzdHVkeSBwYXJ0aWNpcGFudHMgY29tcGxldGVkIHRoZSAqKldlY2hzbGVyIFRlc3Qgb2YgQWR1bHQgUmVhZGluZyAoV1RBUikqKi4KCmBgYHtyIHNwaW5zX2RlbW9fdGFibGV9CmxhYmVsKHNwaW5zX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnkpIDwtICJBZ2UgKHllYXJzKSIKbGFiZWwoc3BpbnNfZGVtb19kZiRzZXgpIDwtICJTZXgiCmxhYmVsKHNwaW5zX2RlbW9fZGYkcmFjZSkgPC0gIlJhY2UiCmxhYmVsKHNwaW5zX2RlbW9fZGYkZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYpIDwtIkVkdWNhdGlvbiAoeWVhcnMpIgpsYWJlbChzcGluc19kZW1vX2RmJGlxKSA8LSAiRXN0aW1hdGVkIElRIgoKbXkucmVuZGVyLmNvbnQgPC0gZnVuY3Rpb24oeCkgewogICAgd2l0aChzdGF0cy5hcHBseS5yb3VuZGluZyhzdGF0cy5kZWZhdWx0KHgpLCBkaWdpdHM9MiksIGMoIiIsCiAgICAgICAgIk1lYW4gKFNEKSI9c3ByaW50ZigiJXMgKCZwbHVzbW47ICVzKSIsIE1FQU4sIFNEKSwKICAgICAgICAiTWVkaWFuIFtNaW4sIE1heF0iPXNwcmludGYoIiVzIFslcywgJXNdIiwgTUVESUFOLCBNSU4sIE1BWCkpKQp9Cm15LnJlbmRlci5jYXQgPC0gZnVuY3Rpb24oeCkgewogICAgYygiIiwgc2FwcGx5KHN0YXRzLmRlZmF1bHQoeCksIGZ1bmN0aW9uKHkpIHdpdGgoeSwKICAgICAgICBzcHJpbnRmKCIlZCAoJTAuMGYgJSUpIiwgRlJFUSwgUENUKSkpKQp9CgpzcGluc19kZW1vX3RhYmxlIDwtCiAgdGFibGUxKH4gZGVtb19hZ2Vfc3R1ZHlfZW50cnkgKyBzZXggKyByYWNlICsgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYgKyBpcSB8IHNpdGUqZ3JvdXAsCiAgICAgICAgZGF0YSA9IHNwaW5zX2RlbW9fZGYsCiAgICAgICAgcmVuZGVyLmNvbnRpbnVvdXMgPSBteS5yZW5kZXIuY29udCwgcmVuZGVyLmNhdGVnb3JpY2FsID0gbXkucmVuZGVyLmNhdCkKCnNwaW5zX2RlbW9fdGFibGUKYGBgCgpgYGB7ciBzcGluc19kZW1vX2Rpc3RyaWJ1dGlvbnN9CnNwaW5zX2FnZV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gMTcsIGVuZCA9IDM2LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGluc19kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5W3NwaW5zX2RlbW9fZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIikgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnlbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wiKSAlPiUKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBZ2UgKHllYXJzKSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGluc19pcV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gNjAsIGVuZCA9IDEzMCwgc2l6ZSA9IDEwKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkaXFbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UiKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3BpbnNfZGVtb19kZiRpcVtzcGluc19kZW1vX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCIpICU+JQogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVzdGltYXRlZCBJUSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGluc19hZ2VfZGlzdHJpYnV0aW9uCnNwaW5zX2lxX2Rpc3RyaWJ1dGlvbgpgYGAKCiMjIEFzc2Vzc21lbnQgQ29tcGxldGlvbiBTdGF0dXMgey50YWJzZXR9CgpCZWxvdyBpcyBhIGhlYXRtYXAgZGVwaWN0aW5nIHdoaWNoIGFzc2Vzc21lbnRzIGhhdmUgYmVlbiBjb21wbGV0ZWQgZm9yIGVhY2ggcGFydGljaXBhbnQgaW4gU1BJTi1BU0QuIFRoZXJlIGFyZSBzZXBhcmF0ZSB0YWJzIGRpdmlkaW5nIGBDYXNlYCBhbmQgYENvbnRyb2xgIHBhcnRpY2lwYW50cy4gVGhlIGBBc3Nlc3NtZW50YCBpcyBzaG93biBpbiB0aGUgeCBheGlzIGFuZCB0aGUgYFN1YmplY3QgSURgIGlzIHNob3duIGluIHRoZSB5IGF4aXMuICoqPHNwYW4gc3R5bGU9ImNvbG9yOiMyMzg4MjMiPkdyZWVuPC9zcGFuPioqIGluZGljYXRlcyAnY29tcGxldGUnLCAqKjxzcGFuIHN0eWxlPSJjb2xvcjojRDIyMjJEIj5yZWQ8L3NwYW4+KiogaW5kaWNhdGVzICdpbmNvbXBsZXRlJyBhbmQgKio8c3BhbiBzdHlsZT0iY29sb3I6I0ZGQkYwMCI+eWVsbG93PC9zcGFuPioqIGluZGljYXRlcyBhICdwYXJ0aWFsIGNvbXBsZXRlJy4gQmxhbmsgcmVjdGFuZ2xlcyBpbmRpY2F0ZSB0aGF0IHRoZSBhc3Nlc3NtZW50IGVpdGhlciBoYXNuJ3QgYmVlbiBhdHRlbXB0ZWQgeWV0IG9yIHRoYXQgdGhlIGRhdGEgaGFzbid0IGJlZW4gZW50ZXJlZC4gWW91IGNhbiBob3ZlciBvdmVyIGVhY2ggc3F1YXJlIHRvIGdldCBtb3JlIGRldGFpbHMgb24gdGhlIHJlYXNvbiBmb3IgYW4gYXNzZXNzbWVudCBiZWluZyBpbmNvbXBsZXRlLgoKYGBge3IgYXNzZXNzbWVudF9jb21wbGV0ZX0Kc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgPC0KICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLAogICAgICAgICBlbmRzX3dpdGgoIl9mb3JtX2NvbXBsZXRlIiksCiAgICAgICAgIGhhbmRfcmVkY2FwX2lkLAogICAgICAgICBhcV9yZWRjYXBfaWQsCiAgICAgICAgIHNwcWJfcmVkY2FwX2lkLAogICAgICAgICBiZGlfcmVkY2FwX2lkLAogICAgICAgICBpcmlfcmVkY2FwX2lkLAogICAgICAgICBlbmRzX3dpdGgoIl9leHBsYWluIiksCiAgICAgICAgIGVuZHNfd2l0aCgiX290aGVyX3JlYXNvbl9uYyIpKSAlPiUKICBtdXRhdGUocmVjb3JkX2lkID0gc3RyX3JlbW92ZShyZWNvcmRfaWQsICJTUEFTRF9DTVBfIiksCiAgICAgICAgIGhhbmRfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShoYW5kX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIGhhbmRfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGFxX2Zvcm1fY29tcGxldGUgPSBpZmVsc2UoYXFfcmVkY2FwX2lkID09ICJbc3VydmV5IHJlc3BvbmRlbnRdIiwgMSwgYXFfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIHNwcWJfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShzcHFiX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIHNwcWJfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGJkaV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGJkaV9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBiZGlfZm9ybV9jb21wbGV0ZSksCiAgICAgICAgIGlyaV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGlyaV9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBpcmlfZm9ybV9jb21wbGV0ZSkpCgpzcGFzZF9hc3Nlc3NtZW50X2NvbXBsZXRlIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsIGVuZHNfd2l0aCgiX2Zvcm1fY29tcGxldGUiKSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAiY29tcGxldGUiLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShjb21wbGV0ZSkpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gc3RyX3JlbW92ZShhc3Nlc3NtZW50LCAiX2Zvcm1fY29tcGxldGUiKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZXhwbGFpbiA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBlbmRzX3dpdGgoIl9leHBsYWluIikpICU+JQogIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInJlYXNvbiIsIC1jKHJlY29yZF9pZCwgZ3JvdXApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHJlYXNvbikpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gc3RyX3JlbW92ZShhc3Nlc3NtZW50LCAiX2V4cGxhaW4iKSkgJT4lCiAgZmlsdGVyKGFzc2Vzc21lbnQgIT0gIm5wX3ZhbGlkaXR5X2lzc3VlcyIpICU+JQogIG11dGF0ZShyZWFzb24gPSBmYWN0b3IocmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYyg4OCwgODksIDkwLCA5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTIsIDkzLCA5NCwgOTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2LCA5NywgOTgsIDk5KSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk90aGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlcm1pbmF0ZWQgZnJvbSBzdHVkeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzZWQgYXBwb2ludG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmF0ZXIgZm9yZ290IHRvIGFkbWluaXN0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGltZSBjb25zdHJhaW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaXRoZHJldyBjb25zZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlY2Vhc2VkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBiZSBjb250YWN0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGxldGVkIGJ1dCB3aXRoIGxlc3MgdGhhbiBiZXN0IGVmZm9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZ1c2VkIHRvIGJlZ2luL2ZpbmlzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQaHlzaWNhbCBpbXBhaXJtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvZ25pdGl2ZSBpbXBhaXJtZW50IikpKQoKc3Bhc2RfYXNzZXNzbWVudF9leHBsYWluX290aGVyIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9zdGF0dXMgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsIGVuZHNfd2l0aCgiX290aGVyX3JlYXNvbl9uYyIpKSAlPiUKICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJyZWFzb25fb3RoZXIiLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZWFzb25fb3RoZXIpKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IHN0cl9yZW1vdmUoYXNzZXNzbWVudCwgIl9vdGhlcl9yZWFzb25fbmMiKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZGYgPC0KICBzcGFzZF9hc3Nlc3NtZW50X2NvbXBsZXRlICU+JQogIGxlZnRfam9pbihzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW4pICU+JQogIGxlZnRfam9pbihzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW5fb3RoZXIpICU+JQogIGZpbHRlcighYXNzZXNzbWVudCAlaW4lIGMoImVsZ19wIiwgImVsZ19jdCIsICJucF9mYWN0IiwgInRlcm0iKSkgJT4lCiAgbXV0YXRlKHJlYXNvbiA9IGlmZWxzZShyZWFzb24gPT0gIk90aGVyIiwgcmVhc29uX290aGVyLCBhcy5jaGFyYWN0ZXIocmVhc29uKSksCiAgICAgICAgIGNvbXBsZXRlX3RleHQgPSBjYXNlX3doZW4oY29tcGxldGUgPT0gMSB+ICJDb21wbGV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUgPT0gMiB+ICJOb3QgY29tcGxldGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlID09IDMgfiAiUGFydGlhbCIpKQpgYGAKClRoZSAqKkF1dGlzbS1TcGVjdHJ1bSBRdW90aWVudCAoQVEpKiosICoqU2NoaXpvdHlwYWwgUGVyc29uYWxpdHkgUXVlc3Rpb25uYWlyZS1CcmllZiAoU1BRLUIpKiogYW5kICoqQmVjayBEZXByZXNzaW9uIEludmVudG9yeS1JSSAoQkRJLUlJKSoqIHdlcmUgYWRkZWQgdG8gdGhlIHN0dWR5IHByb3RvY29sIHBhcnR3YXkgdGhyb3VnaCB0aGUgc3R1ZHkgYW5kIGhhdmVuJ3QgYmVlbiBjb21wbGV0ZWQgZm9yIHNldmVyYWwgcGFydGljaXBhbnRzIGF0IHRoZSBiZWdpbm5pbmcuCgojIyMgQ2FzZQoKVGhlICoqQXV0aXNtIERpYWdub3N0aWMgSW50ZXJ2aWV3LVJldmlzZWQgKEFESS1SKSoqIHdhcyBpbmNsdWRlZCBpbiB0aGUgc3R1ZHkgcHJvdG9jb2wgaW4gdGhlIGV2ZW50IG9mIGFuIGluY29uY2x1c2l2ZSBjbGluaWNhbCBkaWFnbm9zaXMgYW5kIGEgbmVlZCBmb3IgZnVydGhlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvbGxvd2luZyB0aGUgKipBdXRpc20gRGlhZ25vc3RpYyBPYnNlcnZhdGlvbiBTY2hlZHVsZSwgU2Vjb25kIEVkaXRpb24gKEFET1MtMikqKiAuICAKCmBgYHtyIGNhc2VfYXNzZXNzbWVudF9jb21wbGV0ZX0KY2FzZV9hc3Nlc3NtZW50X2RmIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNhc2UiKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb25zZW50IiwgImRlbW8iLCAic2NpZDUiLCAic29mYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFoaCIsICJucG1lZCIsICJwbWVkIiwgInVyaW5lIiwgImh3diIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZCIsICJ3YXNpIiwgImZuZCIsICJhZGlyIiwgImFkb3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFxIiwgImJwcnMiLCAic3BxYiIsICJiZGkiLCAiY28iLCAibXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmFzIiwgImJzZnMiLCAibnAiLCAidGFzaXQiLCAicm1ldCIsICJpcmkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb25zZW50IiwgIkRlbW9ncmFwaGljcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNDSUQtNS1SViIsICJTT0ZBUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWNhbCBIaXN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25wc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzeWNob3Ryb3BpYyBNZWRpY2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmUgVG94aWNvbG9neSBQcmVnbmFuY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaWdodCBXZWlnaHQgVml0YWxzIiwgIkhEUSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FTSS1JSS9XQUlTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWdlcnN0cm9tIE5pY290aW5lIERlcGVuZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFESS1SIiwgIkFET1MtMiIsICJBUSIsICJCUFJTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTUFEtQiIsICJCREktSUkiLCAiTmljb3RpbmUgRXhwaXJlZCBDTyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SSSIsICJBQkFTLUlJIiwgIkJTRlMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXVyb3BzeWNoIiwgIlRBU0lUIEEiLCAiUk1FVCIsICJJUkkiKSkpCgpjYXNlX2NvbXBsZXRlX3Bsb3QgPC0KICBjYXNlX2Fzc2Vzc21lbnRfZGYgJT4lCiAgcGxvdF9seSh4ID0gfmFzc2Vzc21lbnQsIHkgPSB+cmVjb3JkX2lkLCB6ID0gfmNvbXBsZXRlLAogICAgICAgICAgeGdhcCA9IDIsIHlnYXAgPSAyLAogICAgICAgICAgY29sb3JzID0gYygiIzIzODgyMyIsICIjRDIyMjJEIiwgIiNGRkJGMDAiKSwKICAgICAgICAgIHR5cGUgPSAiaGVhdG1hcCIsCiAgICAgICAgICBoZWlnaHQ9MTMwMCwKICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywKICAgICAgICAgIHRleHQgPSB+cGFzdGUoJyBTdWJqZWN0IElEOiAnLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IEFzc2Vzc21lbnQ6ICcsIGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFN0YXR1czogJywgY29tcGxldGVfdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4gUmVhc29uOiAnLCByZWFzb24pKSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBc3Nlc3NtZW50IiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2tzID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrYW5nbGU9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgc2hvd2dyaWQgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTdWJqZWN0IElEIiwKICAgICAgICAgICAgICAgICAgICAgIGF1dG9yYW5nZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXIgPSAiY2F0ZWdvcnkgZGVzY2VuZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3ZhbHM9fnJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpKSAlPiUKICBoaWRlX2NvbG9yYmFyKCkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpjYXNlX2NvbXBsZXRlX3Bsb3QKYGBgCgojIyMgQ29udHJvbAoKYGBge3IgY29udHJvbF9hc3Nlc3NtZW50X2NvbXBsZXRlfQpjb250cm9sX2Fzc2Vzc21lbnRfZGYgPC0KICBzcGFzZF9hc3Nlc3NtZW50X2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImNvbnNlbnQiLCAiZGVtbyIsICJzY2lkNSIsICJzb2ZhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWhoIiwgIm5wbWVkIiwgInBtZWQiLCAidXJpbmUiLCAiaHd2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kIiwgIndhc2kiLCAiZm5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXEiLCAic3BxYiIsICJiZGkiLCAiY28iLCAibXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmFzIiwgImJzZnMiLCAibnAiLCAidGFzaXQiLCAicm1ldCIsICJpcmkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb25zZW50IiwgIkRlbW9ncmFwaGljcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNDSUQtNS1SViIsICJTT0ZBUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWNhbCBIaXN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25wc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzeWNob3Ryb3BpYyBNZWRpY2F0aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXJpbmUgVG94aWNvbG9neSBQcmVnbmFuY3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaWdodCBXZWlnaHQgVml0YWxzIiwgIkhEUSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0FTSS1JSS9XQUlTIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWdlcnN0cm9tIE5pY290aW5lIERlcGVuZGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRIiwgIlNQUS1CIiwgIkJESS1JSSIsICJOaWNvdGluZSBFeHBpcmVkIENPIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVJJIiwgIkFCQVMtSUkiLCAiQlNGUyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5ldXJvcHN5Y2giLCAiVEFTSVQgQSIsICJSTUVUIiwgIklSSSIpKSkKCmNvbnRyb2xfY29tcGxldGVfcGxvdCA8LQogIGNvbnRyb2xfYXNzZXNzbWVudF9kZiAlPiUKICBwbG90X2x5KHggPSB+YXNzZXNzbWVudCwgeSA9IH5yZWNvcmRfaWQsIHogPSB+Y29tcGxldGUsCiAgICAgICAgICB4Z2FwID0gMiwgeWdhcCA9IDIsCiAgICAgICAgICBjb2xvcnMgPSBjKCIjMjM4ODIzIiwgIiNGRkJGMDAiLCAiI0QyMjIyRCIpLAogICAgICAgICAgdHlwZSA9ICJoZWF0bWFwIiwKICAgICAgICAgIGhvdmVyaW5mbyA9ICd0ZXh0JywKICAgICAgICAgIHRleHQgPSB+cGFzdGUoJyBTdWJqZWN0IElEOiAnLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IEFzc2Vzc21lbnQ6ICcsIGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFN0YXR1czogJywgY29tcGxldGVfdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgJzxicj4gUmVhc29uOiAnLCByZWFzb24pKSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBc3Nlc3NtZW50IiwKICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiY2F0ZWdvcnkiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3MgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2thbmdsZSA9IDQ1LAogICAgICAgICAgICAgICAgICAgICAgc2hvd2dyaWQgPSBGQUxTRSksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTdWJqZWN0IElEIiwKICAgICAgICAgICAgICAgICAgICAgIGF1dG9yYW5nZSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5b3JkZXIgPSAiY2F0ZWdvcnkgZGVzY2VuZGluZyIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja3ZhbHM9fnJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpKSAlPiUKICBoaWRlX2NvbG9yYmFyKCkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpjb250cm9sX2NvbXBsZXRlX3Bsb3QKYGBgCgoKCgojIyBTb2NpYWwgQ29nbml0aW9uIHsudGFic2V0fQoKYGBge3Igc2NvZ19kYXRhZnJhbWV9CnNjb2dfZGYgPC0KICByYmluZCgKICAgIHNwYXNkX3JlZGNhcF9kZiAlPiUKICAgICAgc2VsZWN0KHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwLAogICAgICAgICAgICAgcm1ldF90b3RhbCwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQsIGlyaV9mYWN0b3JfZnMsIGlyaV9mYWN0b3JfZWMsIGlyaV9mYWN0b3JfcGQsIGlyaV90b3RhbCwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUsIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZ19lcjQwYW5nX2NvbHVtbnYsIHNjb2dfZXI0MGZlYXJfY29sdW1udywKICAgICAgICAgICAgIHNjb2dfZXI0MGhhcF9jb2x1bW54LCBzY29nX2VyNDBub2VfY29sdW1ueSwgc2NvZ19lcjQwc2FkX2NvbHVtbnosIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIsCiAgICAgICAgICAgICBzY29nX2VyNDBtaWxkX2NvbHVtbmFwLCBzY29nX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyLCBzY29nX2VyNDBleHJ0X2NvbHVtbmFzLAogICAgICAgICAgICAgdGFzaXRfY29ycmVjdF90b3RhbCwgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCwgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20pLAogICAgc3BpbnNfcmVkY2FwX2RmICU+JQogICAgICBzZWxlY3QocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXAsCiAgICAgICAgICAgICBybWV0X3RvdGFsLCBzY29nMl9ybWV0X3RvdGFsLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9wdCwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzcGVjdGl2ZSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZnMsIHNjb2cyX2lyaV9mYWN0b3JfZmFudGFzeSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZWMsIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2VybiwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcGQsIHNjb2cyX2lyaV9mYWN0b3JfcGVyc29uYWxfZGlzdHJlc3MsCiAgICAgICAgICAgICBpcmlfdG90YWwsCiAgICAgICAgICAgICBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDAyX2NyX2NvbHVtbnBjcl92YWx1ZSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZzJfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwKICAgICAgICAgICAgIHNjb2dfZXI0MGFuZ19jb2x1bW52LCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsCiAgICAgICAgICAgICBzY29nX2VyNDBmZWFyX2NvbHVtbncsIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICBzY29nX2VyNDBoYXBfY29sdW1ueCwgc2NvZzJfZXI0MGhhcF9jb2x1bW54LAogICAgICAgICAgICAgc2NvZ19lcjQwbm9lX2NvbHVtbnksIHNjb2cyX2VyNDBub2VfY29sdW1ueSwKICAgICAgICAgICAgIHNjb2dfZXI0MHNhZF9jb2x1bW56LCBzY29nMl9lcjQwc2FkX2NvbHVtbnosCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBhX2NvbHVtbmFhLCBzY29nMl9lcjQwX2ZwYV9jb2x1bW5hYSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIsIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCwgc2NvZzJfZXI0MG1pbGRfY29sdW1uYXAsCiAgICAgICAgICAgICBzY29nX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwKICAgICAgICAgICAgIHNjb2dfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2cyX2VyNDBtZHJ0X2NvbHVtbmFyLAogICAgICAgICAgICAgc2NvZ19lcjQwZXhydF9jb2x1bW5hcywgc2NvZzJfZXI0MGV4cnRfY29sdW1uYXMsCiAgICAgICAgICAgICB0YXNpdF9jb3JyZWN0X3RvdGFsLCB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LAogICAgICAgICAgICAgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCwgdGFzaXRzdW1fcDJfdG90YWxfaXRlbXNjb3JyZWN0LAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdHN1bV9wM19ncmFuZHRvdGFsX2xpZXMsCiAgICAgICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20sIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfc2FyY2FzbSkgJT4lCiAgICAgIG11dGF0ZShybWV0X3RvdGFsID0gaWZlbHNlKGlzLm5hKHJtZXRfdG90YWwpLCBzY29nMl9ybWV0X3RvdGFsLCBybWV0X3RvdGFsKSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9wdCksIHNjb2cyX2lyaV9mYWN0b3JfcGVyc3BlY3RpdmUsIGlyaV9mYWN0b3JfcHQpLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9mcyA9IGlmZWxzZShpcy5uYShpcmlfZmFjdG9yX2ZzKSwgc2NvZzJfaXJpX2ZhY3Rvcl9mYW50YXN5LCBpcmlfZmFjdG9yX2ZzKSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZWMgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9lYyksIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2VybiwgaXJpX2ZhY3Rvcl9lYyksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3BkID0gaWZlbHNlKGlzLm5hKGlyaV9mYWN0b3JfcGQpLCBzY29nMl9pcmlfZmFjdG9yX3BlcnNvbmFsX2Rpc3RyZXNzLCBpcmlfZmFjdG9yX3BkKSwKICAgICAgICAgICAgIGlyaV90b3RhbCA9IGlmZWxzZShpcy5uYShpcmlfdG90YWwpLCBpcmlfZmFjdG9yX3B0ICsgaXJpX2ZhY3Rvcl9mcyArIGlyaV9mYWN0b3JfZWMgKyBpcmlfZmFjdG9yX3BkLCBpcmlfdG90YWwpLAogICAgICAgICAgICAgc2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2dfZXI0MDJfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlKSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsIHNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSksCiAgICAgICAgICAgICBzY29nX2VyNDBhbmdfY29sdW1udiA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBhbmdfY29sdW1udiwgc2NvZ19lcjQwYW5nX2NvbHVtbnYpLAogICAgICAgICAgICAgc2NvZ19lcjQwZmVhcl9jb2x1bW53ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGZlYXJfY29sdW1udywgc2NvZ19lcjQwZmVhcl9jb2x1bW53KSwKICAgICAgICAgICAgIHNjb2dfZXI0MGhhcF9jb2x1bW54ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGhhcF9jb2x1bW54LCBzY29nX2VyNDBoYXBfY29sdW1ueCksCiAgICAgICAgICAgICBzY29nX2VyNDBub2VfY29sdW1ueSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBub2VfY29sdW1ueSwgc2NvZ19lcjQwbm9lX2NvbHVtbnkpLAogICAgICAgICAgICAgc2NvZ19lcjQwc2FkX2NvbHVtbnogPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwc2FkX2NvbHVtbnosIHNjb2dfZXI0MHNhZF9jb2x1bW56KSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwX2ZwYV9jb2x1bW5hYSwgc2NvZ19lcjQwX2ZwYV9jb2x1bW5hYSksCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBmX2NvbHVtbmFiID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MF9mcGZfY29sdW1uYWIsIHNjb2dfZXI0MF9mcGZfY29sdW1uYWIpLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBtaWxkX2NvbHVtbmFwLCBzY29nX2VyNDBtaWxkX2NvbHVtbmFwKSwKICAgICAgICAgICAgIHNjb2dfZXI0MGV4dHJfY29sdW1uYXEgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZ19lcjQwZXh0cl9jb2x1bW5hcSksCiAgICAgICAgICAgICBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2dfZXI0MG1kcnRfY29sdW1uYXIpLAogICAgICAgICAgICAgc2NvZ19lcjQwZXhydF9jb2x1bW5hcyA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBleHJ0X2NvbHVtbmFzLCBzY29nX2VyNDBleHJ0X2NvbHVtbmFzKSwKICAgICAgICAgICAgIHRhc2l0X2NvcnJlY3RfdG90YWwgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LCB0YXNpdF9jb3JyZWN0X3RvdGFsKSwKICAgICAgICAgICAgIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCB0YXNpdHN1bV9wMl90b3RhbF9pdGVtc2NvcnJlY3QsIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwpLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9saWVzLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMpLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9zYXJjYXNtLCB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20pKSAlPiUKICAgICAgc2VsZWN0KC1jKHNjb2cyX3JtZXRfdG90YWwsCiAgICAgICAgICAgICAgICBzY29nMl9pcmlfZmFjdG9yX3BlcnNwZWN0aXZlLCBzY29nMl9pcmlfZmFjdG9yX2ZhbnRhc3ksIHNjb2cyX2lyaV9mYWN0b3JfZW1wYXRoaWNfY29uY2Vybiwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzb25hbF9kaXN0cmVzcywKICAgICAgICAgICAgICAgIHNjb2dfZXI0MDJfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nMl9lcjQwX2NydF9jb2x1bW5xY3J0X3ZhbHVlLCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICAgICBzY29nMl9lcjQwaGFwX2NvbHVtbngsIHNjb2cyX2VyNDBub2VfY29sdW1ueSwgc2NvZzJfZXI0MHNhZF9jb2x1bW56LAogICAgICAgICAgICAgICAgc2NvZzJfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLCBzY29nMl9lcjQwbWlsZF9jb2x1bW5hcCwKICAgICAgICAgICAgICAgIHNjb2cyX2VyNDBleHRyX2NvbHVtbmFxLCBzY29nMl9lcjQwbWRydF9jb2x1bW5hciwgc2NvZzJfZXI0MGV4cnRfY29sdW1uYXMsCiAgICAgICAgICAgICAgICB0YXNpdHN1bV90b3RhbF9jb3JyZWN0LCB0YXNpdHN1bV9wMl90b3RhbF9pdGVtc2NvcnJlY3QsIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfbGllcywgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9zYXJjYXNtKSkpCgojIGZpbHRlciBvdXQgcGFydGljaXBhbnRzIHdpdGggTkEgcm93cwpzY29nX2RmIDwtIHNjb2dfZGZbcm93U3Vtcyhpcy5uYShzY29nX2RmKSkgPCAxOCwgXQoKIyBmaWx0ZXIgb3V0IFRBU0lUIHNjb3JlcyB3aXRoIDAKc2NvZ19kZiA8LQogIHNjb2dfZGYgJT4lCiAgbXV0YXRlKHRhc2l0X2NvcnJlY3RfdG90YWwgPSBuYV9pZih0YXNpdF9jb3JyZWN0X3RvdGFsLCAwKSwKICAgICAgICAgdGFzaXRfcGFydDJfZ3JhbmR0b3RhbCA9IG5hX2lmKHRhc2l0X3BhcnQyX2dyYW5kdG90YWwsIDApLAogICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMgPSBuYV9pZih0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX2xpZXMsIDApLAogICAgICAgICB0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20gPSBuYV9pZih0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20sIDApKQpgYGAKCiMjIyBSTUVUCgpUaGUgKipSZWFkaW5nIHRoZSBNaW5kIGluIHRoZSBFeWVzIHRlc3QgKFJNRVQpKiogIGlzIGEgdGVzdCBvZiBzb2NpYWwgc2Vuc2l0aXZpdHkuIFRoZSBwYXJ0aWNpcGFudCBpcyBwcmVzZW50ZWQgd2l0aCBhIHNlcmllcyBvZiAzNiBwaG90b2dyYXBocyBvZiB0aGUgZXllIHJlZ2lvbiBhbmQgYXNrZWQgdG8gY2hvb3NlIHdoaWNoIG9mIDQgd29yZHMgYmVzdCBkZXNjcmliZXMgd2hhdCB0aGUgYWN0b3IgaW4gdGhlIHBob3RvZ3JhcGggaXMgdGhpbmtpbmcgb3IgZmVlbGluZy4KCmBgYHtyIHJtZXRfZGlzdHJpYnV0aW9ufQpwbG90X2x5KHNjb2dfZGYgJT4lCiAgICAgICAgICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJzY29yZSIsIC1jKHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwKSkgJT4lCiAgICAgICAgICBmaWx0ZXIoYXNzZXNzbWVudCAlaW4lIGMoInJtZXRfdG90YWwiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygicm1ldF90b3RhbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUk1FVCBUb3RhbCIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiUk1FVCIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NvcmUiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKIyMjIElSSQoKVGhlICoqSW50ZXJwZXJzb25hbCBSZWFjdGl2aXR5IEluZGV4IChJUkkpKiogaXMgYSAyOCBpdGVtIHNlbGYtcmVwb3J0IG1lYXN1cmUgb2YgY29nbml0aXZlIGFuZCBhZmZlY3RpdmUgZW1wYXRoeS4KCmBgYHtyIGlyaV9kaXN0cmlidXRpb259CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygiaXJpX2ZhY3Rvcl9wdCIsICJpcmlfZmFjdG9yX2ZzIiwgImlyaV9mYWN0b3JfZWMiLCAiaXJpX2ZhY3Rvcl9wZCIsICJpcmlfdG90YWwiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiaXJpX2ZhY3Rvcl9wdCIsICJpcmlfZmFjdG9yX2ZzIiwgImlyaV9mYWN0b3JfZWMiLCAiaXJpX2ZhY3Rvcl9wZCIsICJpcmlfdG90YWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBlcnNwZWN0aXZlLVRha2luZyIsICJGYW50YXN5IiwgIkVtcGF0aGljIENvbmNlcm4iLCAiUGVyc29uYWwgRGlzdHJlc3MiLCAiVG90YWwiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIklSSSBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBUQVNJVC1SCgoqKlRoZSBBd2FyZW5lc3Mgb2YgU29jaWFsIEluZmVyZW5jZSBUZXN0LVJldmlzZWQgKFRBU0lULVIpKiogY29uc2lzdHMgb2YgZW1vdGlvbiBldmFsdWF0aW9uICgqKlBhcnQgMSoqKSwgc29jaWFsIGluZmVyZW5jZSAtIG1pbmltYWwgKCoqUGFydCAyKiopLCBhbmQgc29jaWFsIGluZmVyZW5jZSAtIGVucmljaGVkICgqKlBhcnQgMyoqKS4gSW4gUGFydCAxLCB0aGUgcGFydGljaXBhbnQgdmlld3MgMjggYnJpZWYgdmlkZW8gY2xpcHMgdG8gaWRlbnRpZnkgdGhlIGVtb3Rpb24gZXhwcmVzc2VkIGJ5IHRoZSBhY3Rvci4gSW4gUGFydCAyIGFuZCAzLCB0aGUgcGFydGljaXBhbnQgdmlld3MgMzEgdmlkZW90YXBlZCB2aWduZXR0ZXMgb2Ygc29jaWFsIGludGVyYWN0aW9ucyBpbnZvbHZpbmcgbGllcyBhbmQgc2FyY2FzbSBhbmQgbWFrZXMganVkZ2VtZW50cyByZWdhcmRpbmcgd2hhdCB0aGUgaW5kaXZpZHVhbCBpbiB0aGUgc2NlbmUgYmVsaWV2ZWQgb3Iga25ldywgbWVhbnQgYnkgd2hhdCBoZSBvciBzaGUgc2FpZCwgaW50ZW5kZWQgdG8gZG8sIGFuZCBhY3R1YWxseSBmZWx0LgoKYGBge3IgdGFzaXRfZGlzdHJpYnV0aW9uc30KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJ0YXNpdF9jb3JyZWN0X3RvdGFsIiwgInRhc2l0X3BhcnQyX2dyYW5kdG90YWwiLCAidGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSIpKSAlPiUKICAgICAgICAgIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ0YXNpdF9jb3JyZWN0X3RvdGFsIiwgInRhc2l0X3BhcnQyX2dyYW5kdG90YWwiLCAidGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUGFydCAxIiwgIlBhcnQgMiIsICJQYXJ0IDMgTGllcyIsICJQYXJ0IDMgU2FyY2FzbSIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiVEFTSVQtUiBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBFUi00MAoKVGhlICoqUGVubiBFbW90aW9uIFJlY29nbml0aW9uIFRhc2stNDAgKEVSLTQwKSoqIGlzIGEgbWVhc3VyZSBvZiBlbW90aW9uYWwgcHJvY2Vzc2luZy4gUGFydGljaXBhbnRzIHJhdGUgdGhlIGVtb3Rpb25hbCB2YWxlbmNlIG9mIDQwIGZhY2VzIGRpc3BsYXlpbmcgaGFwcHksIHNhZCBvciBuZXV0cmFsIGV4cHJlc3Npb25zIG9uIGEgNyBwb2ludCBzY2FsZS4gCgpgYGB7ciBlcjQwX2NvcnJlY3R9CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygic2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSIsICJzY29nX2VyNDBhbmdfY29sdW1udiIsICJzY29nX2VyNDBmZWFyX2NvbHVtbnciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBoYXBfY29sdW1ueCIsICJzY29nX2VyNDBub2VfY29sdW1ueSIsICJzY29nX2VyNDBzYWRfY29sdW1ueiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBtaWxkX2NvbHVtbmFwIiwgInNjb2dfZXI0MGV4dHJfY29sdW1uYXEiKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygic2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSIsICJzY29nX2VyNDBhbmdfY29sdW1udiIsICJzY29nX2VyNDBmZWFyX2NvbHVtbnciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvZ19lcjQwaGFwX2NvbHVtbngiLCAic2NvZ19lcjQwbm9lX2NvbHVtbnkiLCAic2NvZ19lcjQwc2FkX2NvbHVtbnoiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb2dfZXI0MG1pbGRfY29sdW1uYXAiLCAic2NvZ19lcjQwZXh0cl9jb2x1bW5hcSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ29ycmVjdCBSZXNwb25zZXMiLCAiQ29ycmVjdCBBbmdlciIsICJDb3JyZWN0IEZlYXIiLCAiQ29ycmVjdCBIYXBweSIsICJDb3JyZWN0IE5ldXRyYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ycmVjdCBTYWQiLCAiQ29ycmVjdCBNaWxkIiwgIkNvcnJlY3QgRXh0cmVtZSIpKSksCiAgICAgICAgeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnNjb3JlLCBjb2xvciA9IH5ncm91cCwgc3ltYm9sID0gfnN0dWR5LAogICAgICAgIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICAgICAgICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCBhc3Nlc3NtZW50LCAiOiAiLCBzY29yZSksCiAgICAgICAgbW9kZSA9ICJtYXJrZXJzIiwKICAgICAgICBtYXJrZXIgPSBsaXN0KGNvbG9yID0gIiMwMDAiLCBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRVItNDAgU3VzYnNjYWxlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTY29yZSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpBIG1lZGlhbiByZXNwb25zZSB0aW1lIGJlbG93IDEwMDAgc2Vjb25kcyBpbmRpY2F0ZXMgaW5hdHRlbnRpb24gYW5kIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSBmdXJ0aGVyIGFuYWx5c2lzLgoKYGBge3IgZXI0MF9ydH0KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUiLCAic2NvZ19lcjQwbWRydF9jb2x1bW5hciIsICJzY29nX2VyNDBleHJ0X2NvbHVtbmFzIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb2dfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSIsICJzY29nX2VyNDBtZHJ0X2NvbHVtbmFyIiwgInNjb2dfZXI0MGV4cnRfY29sdW1uYXMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNvcnJlY3QgUmVzcG9uc2VzIiwgIkNvcnJlY3QgTWlsZCIsICJDb3JyZWN0IEV4dHJlbWUiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVSLTQwIFN1c2JzY2FsZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTWVkaWFuIFJlc3BvbnNlIFRpbWUgKHNlY29uZHMpIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIE1SSQoKYGBge3IgbXJpX2RhdGFmcmFtZX0KeG5hdF9kZiA8LQogIHNwYXNkX3JlZGNhcF9kZiAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBtcmlfZG9hLCBtcmlfZm9ybV9jb21wbGV0ZSkgJT4lCiAgZmlsdGVyKG1yaV9mb3JtX2NvbXBsZXRlICE9IDIpICU+JQogIHJlbmFtZShkYXRlID0gbXJpX2RvYSkgJT4lCiAgbXV0YXRlKHN0dWR5ID0gIlNQQVNEIikKCm1yaV9kZiA8LQogIHhuYXRfZGYgJT4lCiAgZ3JvdXBfYnkoc3R1ZHksIGRhdGUpICU+JQogIGNvdW50KCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0b3RhbCA9IGN1bXN1bShuKSkgJT4lCiAgc2VsZWN0KC1uKSAlPiUKICBiaW5kX3Jvd3MoCiAgICB0YXJnZXRzX2RmICU+JQogICAgICBtdXRhdGUoc3R1ZHkgPSAidGFyZ2V0IikgJT4lCiAgICAgIHJlbmFtZSh0b3RhbCA9IHRhcmdldCwKICAgICAgICAgICAgIGRhdGUgPSBtb250aCkgJT4lCiAgICAgIHNlbGVjdChzdHVkeSwgZGF0ZSwgdG90YWwpKQoKcGFydGljaXBhbnRzX3JlY3J1aXRlZCA8LSBucm93KHhuYXRfZGYpCgptb250aHNfb2Zfc3R1ZHkgPC0gbnJvdygKICBtcmlfZGYgJT4lCiAgZmlsdGVyKHN0dWR5ID09ICJ0YXJnZXQiKSAlPiUKICBmaWx0ZXIoIWRhdGUgPT0gIjIwMTgtMDctMzEiKSAlPiUKICBmaWx0ZXIoZGF0ZSA8IGNlaWxpbmdfZGF0ZShTeXMuRGF0ZSgpLCAibW9udGgiKSkKKQoKYXZnX3JlY3J1aXRtZW50IDwtIHJvdW5kKHBhcnRpY2lwYW50c19yZWNydWl0ZWQgLyBtb250aHNfb2Zfc3R1ZHksIGRpZ2l0cyA9IDIpCmBgYAoKVGh1cyBmYXIsICoqYHIgcGFydGljaXBhbnRzX3JlY3J1aXRlZGAqKiBwYXJ0aWNpcGFudHMgaGF2ZSBiZWVuIHNjYW5uZWQuIFRoZSB0YXJnZXQgaXMgdG8gc2NhbiAqKjMuMzMqKiBwYXJ0aWNpcGFudHMgcGVyIG1vbnRoICgqKjQwKiogcGVyIHllYXIpLiBXZSBhcmUgY3VycmVudGx5IGF2ZXJhZ2luZyAqKmByIGF2Z19yZWNydWl0bWVudGAqKiBwYXJ0aWNpcGFudHMgcGVyIG1vbnRoLgoKYGBge3IgbXJpX3Bsb3R9CmEgPC0gbGlzdCgKICB4ID0gdGFpbChtcmlfZGYkZGF0ZSwgbiA9IDEpLAogIHkgPSB0YWlsKG1yaV9kZiR0b3RhbCwgbiA9IDEpLAogIHRleHQgPSBtcmlfZGYkdG90YWwsCiAgeHJlZiA9ICJ4IiwKICB5cmVmID0gInkiLAogIHNob3dhcnJvdyA9IEZBTFNFKQoKbXJpX3Bsb3QgPC0KICBwbG90X2x5KG1yaV9kZiwgCiAgICAgICAgICB4ID0gfmRhdGUsIHkgPSB+dG90YWwsCiAgICAgICAgICB0eXBlPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsCiAgICAgICAgICBjb2xvciA9IH5zdHVkeSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnRGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGMoYXMuRGF0ZSgiMjAxOC0wNy0zMSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXMuRGF0ZSgpICsgMzApKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJyMgb2YgUGFydGljaXBhbnRzIFNjYW5uZWQnLAogICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBjKDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yaV9kZiR0b3RhbFttcmlfZGYkZGF0ZSA8IGx1YnJpZGF0ZTo6Y2VpbGluZ19kYXRlKFN5cy5EYXRlKCksIm1vbnRoIildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDEpKSkpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKbXJpX3Bsb3QKCmBgYAoKCmBgYHtyIHNwaW5zIHogdHJhbnNmb3JtYXRpb24sIGluY2x1ZGU9RkFMU0V9CnNwaW5fbnBfZGYgPC0KIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL3NwaW5fbnBfZGYuY3N2IikKCiN6c2NvcmVfZGYgPSBkYXRhLmZyYW1lKCkKY2FzZXMgPSBzcGluX25wX2RmW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAnY2FzZScsXQpjb250cm9scyA9IHNwaW5fbnBfZGZbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICdjb250cm9sJyxdCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX01BVFJJQ1MgPSAoY2FzZXMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX01BVFJJQ1MgPSBtZWFuKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDUyA9IHNkKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX01BVFJJQ1MgPSAoY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDUykvIHNkX01BVFJJQ1MKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX01BVFJJQ1MpCgptZWFuX1JNRVQgPSBtZWFuKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9STUVUID0gc2QoY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9STUVUID0gKGNhc2VzJHNjb2dfcm1ldF90b3RhbCAtIG1lYW5fUk1FVCkgLyBzZF9STUVUCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9STUVUKQoKbWVhbl9STUVUID0gbWVhbihjb250cm9scyRzY29nX3JtZXRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfUk1FVCA9IHNkKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfUk1FVCA9IChjb250cm9scyRzY29nX3JtZXRfdG90YWwgLSBtZWFuX1JNRVQpIC8gc2RfUk1FVAojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfUk1FVCkKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTID0gKGNhc2VzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlMgPSBzZChjb250cm9scyRic2ZzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTID0gKGNvbnRyb2xzJGJzZnNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfQlNGUykKCm1lYW5fSVEgPSBtZWFuKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCnNkX0lRID0gc2QoY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0lRID0gKGNhc2VzJHd0YXJfc3RkX3Njb3JlIC0gbWVhbl9JUSkgLyBzZF9JUQojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfSVEpCgptZWFuX0lRID0gbWVhbihjb250cm9scyR3dGFyX3N0ZF9zY29yZSwgbmEucm0gPSBUUlVFKQpzZF9JUSA9IHNkKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9JUSA9IChjb250cm9scyR3dGFyX3N0ZF9zY29yZSAtIG1lYW5fSVEpIC8gc2RfSVEKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX0lRKQoKenNjb3JlX2RmPSBjYmluZChjYXNlcyR6c2NvcmVfTUFUUklDUyxjb250cm9scyR6c2NvcmVfTUFUUklDUyxjYXNlcyR6c2NvcmVfUk1FVCxjb250cm9scyR6c2NvcmVfUk1FVCxjYXNlcyR6c2NvcmVfSVEsIGNvbnRyb2xzJHpzY29yZV9JUSwgY2FzZXMkenNjb3JlX0JTRlMsY29udHJvbHMkenNjb3JlX0JTRlMpCgp6c2NvcmVfZGY9IHJiaW5kKGNhc2VzLGNvbnRyb2xzKQoKI3NwaW5fbnBfZGYkYnNmc19zZWM3X3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWM3X3lfdG90YWxfN2EnLCAnYnNmc19zZWM3X25fdG90YWxfN2InKV0sIG5hLnJtPVRSVUUpCiNzcGluX25wX2RmW0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsID09MCwnYnNmc19zZWM3X3RvdGFsJ10gPC0gTkEKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWMxID0gKGNhc2VzJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMSA9IChjb250cm9scyRic2ZzX3NlYzFfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzIgPSAoY2FzZXMkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUz0gbWVhbihjb250cm9scyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzIgPSAoY29udHJvbHMkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWMzID0gKGNhc2VzJGJzZnNfc2VjM190b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMyA9IChjb250cm9scyRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzQgPSAoY2FzZXMkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWM0PSAoY29udHJvbHMkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWM1ID0gKGNhc2VzJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNSA9IChjb250cm9scyRic2ZzX3NlYzVfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzYgPSAoY2FzZXMkYnNmc19zZWM2X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWM2ID0gKGNvbnRyb2xzJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgoKenNjb3JlX2RmPSBjYmluZChjYXNlcyR6c2NvcmVfQlNGU19zZWMxLCBjb250cm9scyR6c2NvcmVfQlNGU19zZWMxLGNhc2VzJHpzY29yZV9CU0ZTX3NlYzIsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzIsY2FzZXMkenNjb3JlX0JTRlNfc2VjMywgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMyxjYXNlcyR6c2NvcmVfQlNGU19zZWM0LCBjb250cm9scyR6c2NvcmVfQlNGU19zZWM0LGNhc2VzJHpzY29yZV9CU0ZTX3NlYzUsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzUsY2FzZXMkenNjb3JlX0JTRlNfc2VjNiwgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNikKenNjb3JlX2RmPSByYmluZChjYXNlcyxjb250cm9scykKCgoKYGBgCgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpCU0ZTX2RmPC0KICAgcmVhZF9jc3YoCiAiL3NjcmF0Y2gvbnNoYXJtYS9TUElOLUFTRHJkb2MvQlNGU19kZi5jc3YiKSU+JQogIAptdXRhdGUoc3R1ZHkgPSAiU1BBU0QiLAogICAgICAgICBncm91cCA9IGNhc2Vfd2hlbihncmVwbCgiYXJtXzIiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ2FzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCJhcm1fMSIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDb250cm9sIikgJT4lCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yKC4pKSAlPiUgICAgICAgCnNlbGVjdCgtYyhyZWRjYXBfZXZlbnRfbmFtZSkpICU+JQogIGdyb3VwX2J5KHJlY29yZF9pZCkgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gImRvd24iKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAidXAiKSAlPiUKICBzbGljZSgxKSAlPiUKICB1bmdyb3VwKCkKCmJzZnNfYXNkX2Nhc2UgPC0KICBCU0ZTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ2FzZSIpICU+JQogIG5yb3coKQoKYnNmc19hc2RfY29udHJvbCA8LQogIEJTRlNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDb250cm9sIikgJT4lCiAgbnJvdygpCgpCU0ZTX2RmJGJzZnNfYXNkX3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWNfZ3JhbmR0b3RhbDEnLCAnYnNmc19zZWNfZ3JhbmR0b3RhbDInKV0sIG5hLnJtPVRSVUUpCkJTRlNfZGZbQlNGU19kZiRic2ZzX2FzZF90b3RhbCA9PTAsJ2JzZnNfYXNkX3RvdGFsJ10gPC0gTkEKCgojQlNGU19kZiRic2ZzX3NlYzdfdG90YWw9cmJpbmQoYnNmc19zZWM3X3lfdG90YWxfN2EsIGJzZnNfc2VjN19uX3RvdGFsXzdiKQoKI0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWM3X3lfdG90YWxfN2EnLCAnYnNmc19zZWM3X25fdG90YWxfN2InKV0sIG5hLnJtPVRSVUUpCiNCU0ZTX2RmW0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsID09MCwnYnNmc19zZWM3X3RvdGFsJ10gPC0gTkEKCgpgYGAKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKQUJBU19kZjwtCiAgIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL0FCQVNfZGYuY3N2IikgJT4lCiAgCm11dGF0ZShzdHVkeSA9ICJTUEFTRCIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMiIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoLikpICU+JSAgICAgICAKc2VsZWN0KC1jKHJlZGNhcF9ldmVudF9uYW1lKSkgJT4lCiAgZ3JvdXBfYnkocmVjb3JkX2lkKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAiZG93biIpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJ1cCIpICU+JQogIHNsaWNlKDEpICU+JQogIHVuZ3JvdXAoKQoKYWJhc19hc2RfY2FzZSA8LQogIEFCQVNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgphYmFzX2FzZF9jb250cm9sIDwtCiAgQUJBU19kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBucm93KCkKCkFCQVNfZGYkYWJhc19hc2RfdG90YWwgPC0gcm93U3VtcyhBQkFTX2RmWyxjKCdhYmFzX2dhYycsICdhYmFzX2dhYzEnLCAiYWJhc19nYWMyIildLCBuYS5ybT1UUlVFKQpBQkFTX2RmW0FCQVNfZGYkYWJhc19hc2RfdG90YWwgPT0gMCwnYWJhc19hc2RfdG90YWwnXSA8LSBOQSAKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpzcGFzZF9kZW1vX2RmIApjYXNlX2FzZCA9IHNwYXNkX2RlbW9fZGZbc3Bhc2RfZGVtb19kZiRncm91cD09J0Nhc2UnLF0KY29udHJvbF9hc2QgPSBzcGFzZF9kZW1vX2RmW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSdDb250cm9sJyxdCgptZWFuX01BVFJJQ1NzZCA9IG1lYW4oY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpzZF9NQVRSSUNTc2QgPSBzZChjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QgPSAoY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDU3NkKSAvIHNkX01BVFJJQ1NzZAojenNjb3JlX2FzZCA9IGNiaW5kKHpzY29yZV9hc2QsIGNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgoKbWVhbl9NQVRSSUNTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDU3NkID0gc2QoY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfTUFUUklDU3NkID0gKGNhc2VfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUgLSBtZWFuX01BVFJJQ1NzZCkvIHNkX01BVFJJQ1NzZAojenNjb3JlX2FzZCA9IGNiaW5kKHpzY29yZV9hc2QsIGNhc2VfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgoKbWF0cmljc19hc2RfenNjb3JlID0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX01BVFJJQ1NzZCxjb250cm9sX2FzZCR6c2NvcmVfTUFUUklDU3NkKQoKbWF0cmljc19hc2RfenNjb3JlID0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpCU0ZTX2RmCgpjYXNlX2FzZCA9IEJTRlNfZGZbQlNGU19kZiRncm91cD09J0Nhc2UnLF0KY29udHJvbF9hc2QgPSBCU0ZTX2RmW0JTRlNfZGYkZ3JvdXA9PSdDb250cm9sJyxdCiAKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZCA9IChjYXNlX2FzZCRic2ZzX2FzZF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCA9IChjb250cm9sX2FzZCRic2ZzX2FzZF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKI2JzZnNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0JTRlNzZCwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCkKI2JzZnNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgoKI3pzY29yZV9hc2Q9Y2JpbmQoenNjb3JlX2FzZCwgQlNGU19kZikKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMxID0gKGNhc2VfYXNkJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEgPSAoY29udHJvbF9hc2QkYnNmc19zZWMxX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMiA9IChjYXNlX2FzZCRic2ZzX3NlYzJfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMyID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjMl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMgPSAoY2FzZV9hc2QkYnNmc19zZWMzX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMyA9IChjb250cm9sX2FzZCRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM0ID0gKGNhc2VfYXNkJGJzZnNfc2VjNF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQ9IChjb250cm9sX2FzZCRic2ZzX3NlYzRfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM1ID0gKGNhc2VfYXNkJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUgPSAoY29udHJvbF9hc2QkYnNmc19zZWM1X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNiA9IChjYXNlX2FzZCRic2ZzX3NlYzZfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM2ID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKCmJzZnNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMxLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMyLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzIsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMzLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM0LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM1LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM2LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzYpCmJzZnNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgpgYGAKCgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CkFCQVNfZGYKCmNhc2VfYXNkID0gQUJBU19kZltBQkFTX2RmJGdyb3VwPT0nQ2FzZScsXQpjb250cm9sX2FzZCA9IEFCQVNfZGZbQUJBU19kZiRncm91cD09J0NvbnRyb2wnLF0KCm1lYW5fQUJBU3NkID0gbWVhbihjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCnNkX0FCQVNzZD0gc2QoY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQUJBU3NkID0gKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsIC0gbWVhbl9BQkFTc2QpIC8gc2RfQUJBU3NkCgptZWFuX0FCQVNzZCA9IG1lYW4oY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpzZF9BQkFTc2Q9IHNkKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsLG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0FCQVNzZCA9IChjYXNlX2FzZCRhYmFzX2FzZF90b3RhbCAtIG1lYW5fQUJBU3NkKSAvIHNkX0FCQVNzZAoKCmFiYXNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0FCQVNzZCxjb250cm9sX2FzZCR6c2NvcmVfQUJBU3NkKQphYmFzX2FzZF96c2NvcmU9IHJiaW5kKGNhc2VfYXNkLGNvbnRyb2xfYXNkKQoKI3pzY29yZV9hc2Q9Y2JpbmQoenNjb3JlX2FzZCAsIEFCQVNfZGYpCiN6c2NvcmVfYXNkPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfQUJBU3NkLGNvbnRyb2xfYXNkJHpzY29yZV9BQkFTc2QsY2FzZV9hc2QkenNjb3JlX0JTRlNzZCwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCkKCiNBQkFTX2RmIDwtIHJiaW5kKHNwYXNkX2RlbW9fZGYsQlNGU19kZikKCgpgYGAKCgoKYGBge3J9CgojbWF0cmljcyBzY29yZSBvZiBzcGlucyB2aW9saW4gcGxvdAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9NQVRSSUNTKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCiNSTUVUIFNjb3JlIG9mIHNwaW5zIHZpb2xpbiBwbG90CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX1JNRVQpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAojQmlyY2h3b29kIFNGUyBTY29yZSBvZiBzcGlucyB2aW9saW4gcGxvdAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9CU0ZTKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCiNFc3RpbWF0ZWQgSVEgb2Ygc3BpbnMgdmlvbGluIHBsb3QgCiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0lRKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCmBgYAoKYGBge3J9CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0JTRlMpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpCmBgYAoKIyMgU2NvcmUgRGlzdHJpYnV0aW9ucyAKYGBge3J9CgptYXRyaWNzX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gLTYsIGVuZCA9IDUsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSAoeCA9IH56c2NvcmVfZGYkenNjb3JlX01BVFJJQ1NbenNjb3JlX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2hpc3RvZ3JhbSAoeCA9IH56c2NvcmVfZGYkenNjb3JlX01BVFJJQ1NbenNjb3JlX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9oaXN0b2dyYW0gKHg9IH5tYXRyaWNzX2FzZF96c2NvcmUkenNjb3JlX01BVFJJQ1NzZFttYXRyaWNzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lIAogIGFkZF9oaXN0b2dyYW0gKHg9IH5tYXRyaWNzX2FzZF96c2NvcmUkenNjb3JlX01BVFJJQ1NzZFttYXRyaWNzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKICAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTUFUUklDUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgptYXRyaWNzX2Rpc3RyaWJ1dGlvbgpgYGAKCgoKCkJTRlMgU2VjdGlvbiAxCmBgYHtyfQpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMxX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzFfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uCmBgYAoKCkJTRlMgU2VjdGlvbiAyCmBgYHtyfQpCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMyX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjMl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uCmBgYApCU0ZTIFNlY3Rpb24gMwpgYGB7cn0KCkJTRlNfc2VjM19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMzX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMzX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjM190b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjM19kaXN0cmlidXRpb24KCmBgYAoKCgoKCgpCU0ZTIFNlY3Rpb24gNApgYGB7cn0KQlNGU19zZWM0X2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNF90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzRfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM0X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWM0X2Rpc3RyaWJ1dGlvbgoKYGBgCgpCU0ZTIFNlY3Rpb24gNQpgYGB7cn0KQlNGU19zZWM1X2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzVfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzVfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM1X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWM1X2Rpc3RyaWJ1dGlvbgpgYGAKCkJTRlMgU2VjdGlvbiA2CmBgYHtyfQpCU0ZTX3NlYzZfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDYwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM2X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzZfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzZfZGlzdHJpYnV0aW9uCgpgYGAKCkJTRlMgVG90YWwKYGBge3IgZWNobz1GQUxTRX0KQlNGU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9ODAsIGVuZCA9IDIwMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19kaXN0cmlidXRpb24KCmBgYAoKCmBgYHtyfQoKQUJBU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IC02LCBlbmQgPSA1LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0gKHg9IH5hYmFzX2FzZF96c2NvcmUkenNjb3JlX0FCQVNzZFthYmFzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIiBDYXNlIFNQSU4tQVNEIikgICU+JQogIGFkZF9oaXN0b2dyYW0gKHg9IH5hYmFzX2FzZF96c2NvcmUkenNjb3JlX0FCQVNzZFthYmFzX2FzZF96c2NvcmUkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lIAogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFCQVMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKCkFCQVNfZGlzdHJpYnV0aW9uCmBgYCAKCgogIAojIyMgRnJhbWV3aXNlIERpc3BsYWNlbWVudAoKV2UgdXNlIFttcmlxY10oaHR0cHM6Ly9tcmlxYy5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvaW5kZXguaHRtbCkgdG8gb2J0YWluIGltYWdlIHF1YWxpdHkgbWV0cmljcyAoSVFNcykgZm9yIHRoZSBUMXcsIFQydywgYW5kIGZNUkkgc2NhbnMuIEJlbG93IGFyZSBwbG90cyBvZiBmcmFtZXdpc2UgZGlzcGxhY2VtZW50IChGRCksIGEgbWVhc3VyZSBvZiBoZWFkIG1vdGlvbiBhY3Jvc3MgdGltZS4gU3BlY2lmaWNhbGx5LCB0aGUgYXZlcmFnZSBGRCBmb3IgZWFjaCBzY2FuIGFjcm9zcyBhbGwgdGltZXBvaW50cyBhbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgRkRzIGFib3ZlIGEgdGhyZXNob2xkIG9mICoqMC41IG1tKiogYXJlIHNob3duLgoKYGBge3J9CnNwYXNkX21yaXFjX2JvbGRfZGYgPC0KICByZWFkX3RzdigKICAgIGhlcmUoImRhdGEiLCAibXJpIiwgIm1yaXFjX2JvbGRfU1BBU0QudHN2IikKICApICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUElOLUFTRCIsCiAgICAgICAgIG1vZGFsaXR5ID0gImJvbGQiLAogICAgICAgICBmdWxsX3N1YmplY3RfaWQgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAic3ViLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgc3ViamVjdF9pZCA9IHBhc3RlKCJTUEFTRCIsIHN1YnN0cihmdWxsX3N1YmplY3RfaWQsIDEsIDMpLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCA0LCAxMCksIHNlcCA9ICJfIikgJT4lIGdzdWIoIkNNSCIsICJDTVAiLCAuKSwKICAgICAgICAgYWNxdWlzaXRpb24gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAiYWNxLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgcnVuX251bSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJydW4tKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgICBzY2FuX3R5cGUgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAidGFzay0oW1s6YWxudW06XV0rKV8iKVssMl0gJT4lIGdzdWIoIlxcZCIsICIiLCAuKQogICAgICAgICApICU+JQogIGxlZnRfam9pbihzcGFzZF9yZWRjYXBfZGYgJT4lIHNlbGVjdChyZWNvcmRfaWQsIG1yaV9kb2EpLCBieSA9IGMoInN1YmplY3RfaWQiID0gInJlY29yZF9pZCIpKQoKc3BpbnNfc3ViamVjdHMgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lIAogIHNlbGVjdChyZWNvcmRfaWQpICU+JSAKICB1bmxpc3QoKQoKc3BpbnNfbXJpcWNfYm9sZF9kZiA8LQogcmVhZF90c3YoCiAgIGhlcmUoImRhdGEiLCAibXJpIiwgIm1yaXFjX2JvbGRfU1BJTlMudHN2IikKICkgJT4lCiBtdXRhdGUoc3R1ZHkgPSAiU1BJTlMiLAogICAgICAgIG1vZGFsaXR5ID0gImJvbGQiLAogICAgICAgIGZ1bGxfc3ViamVjdF9pZCA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJzdWItKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHN1YmplY3RfaWQgPSBwYXN0ZSgiU1BOMDEiLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCAxLCAzKSwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgNCwgMTApLCBzZXAgPSAiXyIpLAogICAgICAgIGFjcXVpc2l0aW9uID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgImFjcS0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgcnVuX251bSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJydW4tKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHNjYW5fdHlwZSA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJ0YXNrLShbWzphbG51bTpdXSspXyIpWywyXSkgJT4lCiBmaWx0ZXIoc3ViamVjdF9pZCAlaW4lIHNwaW5zX3N1YmplY3RzKQoKbXJpcWNfYm9sZF9kZiA8LQogYmluZF9yb3dzKHNwYXNkX21yaXFjX2JvbGRfZGYsIHNwaW5zX21yaXFjX2JvbGRfZGYpICU+JQogbXV0YXRlKHNjYW5fdHlwZSA9IGZhY3RvcihzY2FuX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInJlc3QiLCAiaW1pIiwgIm9icyIsICJlbXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUmVzdGluZyBTdGF0ZSIsICJJbWl0YXRlIiwgIk9ic2VydmUiLCAiRW1wYXRoaWMgQWNjdXJhY3kiKSkpICU+JQogc2VsZWN0KHN0dWR5LCBzdWJqZWN0X2lkLCBzY2FuX3R5cGUsIGZkX21lYW4sIGZkX3BlcmMsIG1yaV9kb2EpCmBgYAoKCmBgYHtyfQpwbG90X2x5KAogIG1yaXFjX2JvbGRfZGYsIHggPSB+c2Nhbl90eXBlLCB5ID0gfmZkX21lYW4sIGNvbG9yID0gfnN0dWR5LAogIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IE1lYW4gRkQ6ICIsIGZkX21lYW4pLAogIG1vZGUgPSAibWFya2VycyIsCiAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJTY2FuIFR5cGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lYW4gRnJhbWV3aXNlIERpc3BsYWNlbWVudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seShtcmlxY19ib2xkX2RmICU+JSBtdXRhdGUoc3R1ZHk9YXMuZmFjdG9yKHN0dWR5KSksIHggPSB+bXJpX2RvYSwgeSA9IH5mZF9tZWFuLCBjb2xvciA9IH5zY2FuX3R5cGUsCiAgaG92ZXJpbmZvID0gInRleHQiLAogIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCBzdWJqZWN0X2lkLAogICAgICAgICAgICAgICAgIjxicj4gU2NhbiBUeXBlOiAiLCBzY2FuX3R5cGUsCiAgICAgICAgICAgICAgICAiPGJyPiBNZWFuIEZEOiAiLCBmZF9tZWFuKSwKICBtb2RlID0gIm1hcmtlcnMiKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNUkkgRGF0ZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTWVhbiBGcmFtZXdpc2UgRGlzcGxhY2VtZW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCmBgYHtyfQpwbG90X2x5KAogIG1yaXFjX2JvbGRfZGYsIHggPSB+c2Nhbl90eXBlLCB5ID0gfmZkX3BlcmMsIGNvbG9yID0gfnN0dWR5LAogIHR5cGUgPSAiYm94IiwgYm94cG9pbnRzID0gImFsbCIsIGppdHRlciA9IDAuMywgcG9pbnRwb3MgPSAwLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IEZEICU6ICIsIGZkX3BlcmMpLAogIG1vZGUgPSAibWFya2VycyIsCiAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwKICAgICAgICAgICAgICAgIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJTY2FuIFR5cGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRnJhbWV3aXNlIERpc3BsYWNlbWVudHMgQWJvdmUgVGhyZXNob2xkIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCmBgYHtyfQpwbG90X2x5KG1yaXFjX2JvbGRfZGYgJT4lIG11dGF0ZShzdHVkeT1hcy5mYWN0b3Ioc3R1ZHkpKSwgeCA9IH5tcmlfZG9hLCB5ID0gfmZkX3BlcmMsIGNvbG9yID0gfnNjYW5fdHlwZSwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBGRCAlOiAiLCBmZF9wZXJjKSwKICBtb2RlID0gIm1hcmtlcnMiKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJNUkkgRGF0ZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVyY2VudGFnZSBvZiBGcmFtZXdpc2UgRGlzcGxhY2VtZW50cyBBYm92ZSBUaHJlc2hvbGQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYA==