data pulled: 2023-05-03
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, 141 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=104) |
Control (N=37) |
Overall (N=141) |
| Age (years) |
|
|
|
| Mean (SD) |
21 (± 3.8) |
27 (± 4.8) |
22 (± 4.8) |
| Median [Min, Max] |
20 [15, 33] |
27 [17, 35] |
22 [15, 35] |
| Missing |
1 (1.0%) |
1 (2.7%) |
2 (1.4%) |
| Sex |
|
|
|
| Female |
42 (40 %) |
16 (43 %) |
58 (41 %) |
| Male |
61 (59 %) |
20 (54 %) |
81 (57 %) |
| Missing |
1 (1.0%) |
1 (2.7%) |
2 (1.4%) |
| Race |
|
|
|
| Asian |
14 (13 %) |
16 (43 %) |
30 (21 %) |
| Black or African American |
2 (2 %) |
6 (16 %) |
8 (6 %) |
| More than one race |
8 (8 %) |
3 (8 %) |
11 (8 %) |
| Other |
6 (6 %) |
0 (0 %) |
6 (4 %) |
| White |
73 (70 %) |
11 (30 %) |
84 (60 %) |
| Missing |
1 (1.0%) |
1 (2.7%) |
2 (1.4%) |
| Education (years) |
|
|
|
| Mean (SD) |
13 (± 2.2) |
16 (± 2.2) |
14 (± 2.6) |
| Median [Min, Max] |
12 [9.0, 20] |
16 [10, 20] |
13 [9.0, 20] |
| Missing |
1 (1.0%) |
1 (2.7%) |
2 (1.4%) |
| Estimated IQ |
|
|
|
| Mean (SD) |
110 (± 14) |
110 (± 11) |
110 (± 13) |
| Median [Min, Max] |
120 [73, 150] |
110 [96, 130] |
110 [73, 150] |
| Missing |
42 (40.4%) |
24 (64.9%) |
66 (46.8%) |
| MATRICS |
|
|
|
| Mean (SD) |
41 (± 11) |
48 (± 12) |
43 (± 11) |
| Median [Min, Max] |
43 [-3.0, 59] |
51 [16, 64] |
44 [-3.0, 64] |
| Missing |
16 (15.4%) |
9 (24.3%) |
25 (17.7%) |
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) .
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.
Score Distributions
Birchwood Social Functioning Scale:
A self-report questionnaire designed to reflect the social skills and
performances of patients
BSFS Section 1 -Assess Social Engagement/Withdrawn
with a total score between 0 and 15 ex hours spent alone vs leaving the
house
Section 1: Pre and Post Pandemic -Compares the
scores of section 1 on the Birchwood Assesment prior to the Covid-19
Pandemic vs After the Pandemic between SPIN-ASD and SPINS Studies
BSFS Section 2 -Looks at Interpersonal Communication
and Relationships with a total score between 0 and 30 ex having someone
to discuss problems with
Section 2: Pre and Post Pandemic -Compares the
scores of section 3 on the Birchwood Assesment prior to the Covid-19
Pandemic vs After the Pandemic between SPIN-ASD and SPINS Studies
BSFS Section 3 -Focuses on Interpersonal Prosocial
activities ex going visiting relatives and going to the movies, with a
total score between 0 and 66
Section 3: Pre and Post Pandemic -Compares the
scores of section 3 on the Birchwood Assesment prior to the Covid-19
Pandemic vs After the Pandemic between SPIN-ASD and SPINS Studies
BSFS Section 4 -Looks at patients involvement in
Recreational Activities with a score between 0 and 48 ex cooking and
playing an instrument
Section 4: Pre and Post Pandemic -Compares the
scores of section 3 on the Birchwood Assesment prior to the Covid-19
Pandemic vs After the Pandemic between SPIN-ASD and SPINS Studies
BSFS Section 5 -Assess the patients Independence
Performance with a score between 0 and 39 ex preparing and cooking a
meal
Section 5: Pre and Post Pandemic -Compares the
scores of section 3 on the Birchwood Assesment prior to the Covid-19
Pandemic vs After the Pandemic between SPIN-ASD and SPINS Studies
BSFS Section 6 -Looks at patience Independence
Competence with a score between 0-39 ex washing own clothes
BSFS Grand Total
Adaptive Behavior Assessment System (ABAS)
-This assessment helps describe a person’s general adaptive behavior
as well as functioning in 11 related adaptive skill areas ex.
communication, self-care and work
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+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCgpgYGB7ciBtcmlfZGF0YWZyYW1lLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKIyMgTVJJCgojeG5hdF9kZiA8LQojc3Bhc2RfcmVkY2FwX2RmICU+JQojc2VsZWN0KHJlY29yZF9pZCwgbXJpX2RvYSwgbXJpX2Zvcm1fY29tcGxldGUpICU+JQojZmlsdGVyKG1yaV9mb3JtX2NvbXBsZXRlICE9IDIpICU+JQojcmVuYW1lKGRhdGUgPSBtcmlfZG9hKSAlPiUKI211dGF0ZShzdHVkeSA9ICJTUEFTRCIpCgojbXJpX2RmIDwtCiN4bmF0X2RmICU+JQojZ3JvdXBfYnkoc3R1ZHksIGRhdGUpICU+JQojY291bnQoKSAlPiUKI3VuZ3JvdXAoKSAlPiUKI211dGF0ZSh0b3RhbCA9IGN1bXN1bShuKSkgJT4lCiNzZWxlY3QoLW4pICU+JQojYmluZF9yb3dzKAogICN0YXJnZXRzX2RmICU+JQogICAgI211dGF0ZShzdHVkeSA9ICJ0YXJnZXQiKSAlPiUKICAgICNyZW5hbWUodG90YWwgPSB0YXJnZXQsCiAgICAgICAgICAgI2RhdGUgPSBtb250aCkgJT4lCiAgICAjc2VsZWN0KHN0dWR5LCBkYXRlLCB0b3RhbCkpCgojcGFydGljaXBhbnRzX3JlY3J1aXRlZCA8LSBucm93KHhuYXRfZGYpCgojbW9udGhzX29mX3N0dWR5IDwtIG5yb3coCiNtcmlfZGYgJT4lCiNmaWx0ZXIoc3R1ZHkgPT0gInRhcmdldCIpICU+JQojZmlsdGVyKCFkYXRlID09ICIyMDE4LTA3LTMxIikgJT4lCiNmaWx0ZXIoZGF0ZSA8IGNlaWxpbmdfZGF0ZShTeXMuRGF0ZSgpLCAibW9udGgiKSkKIykKCiNhdmdfcmVjcnVpdG1lbnQgPC0gcm91bmQocGFydGljaXBhbnRzX3JlY3J1aXRlZCAvIG1vbnRoc19vZl9zdHVkeSwgZGlnaXRzID0gMikKYGBgCgoKCgpgYGB7ciBtcmlfcGxvdCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KYSA8LSBsaXN0KAogIHggPSB0YWlsKG1yaV9kZiRkYXRlLCBuID0gMSksCiAgeSA9IHRhaWwobXJpX2RmJHRvdGFsLCBuID0gMSksCiAgdGV4dCA9IG1yaV9kZiR0b3RhbCwKICB4cmVmID0gIngiLAogIHlyZWYgPSAieSIsCiAgc2hvd2Fycm93ID0gRkFMU0UpCgptcmlfcGxvdCA8LQogIHBsb3RfbHkobXJpX2RmLCAKICAgICAgICAgIHggPSB+ZGF0ZSwgeSA9IH50b3RhbCwKICAgICAgICAgIHR5cGU9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJywKICAgICAgICAgIGNvbG9yID0gfnN0dWR5KSAlPiUKICBsYXlvdXQoZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICdEYXRlJywKICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gYyhhcy5EYXRlKCIyMDE4LTA3LTMxIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5cy5EYXRlKCkgKyAzMCkpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnIyBvZiBQYXJ0aWNpcGFudHMgU2Nhbm5lZCcsCiAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGMoMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJpX2RmJHRvdGFsW21yaV9kZiRkYXRlIDwgbHVicmlkYXRlOjpjZWlsaW5nX2RhdGUoU3lzLkRhdGUoKSwibW9udGgiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMSkpKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgptcmlfcGxvdAoKYGBgCgoKYGBge3Igc3BpbnMgeiB0cmFuc2Zvcm1hdGlvbiwgaW5jbHVkZT1GQUxTRX0Kc3Bpbl9ucF9kZiA8LQogcmVhZF9jc3YoCiAiL3NjcmF0Y2gvbnNoYXJtYS9TUElOLUFTRHJkb2Mvc3Bpbl9ucF9kZi5jc3YiKQoKI3pzY29yZV9kZiA9IGRhdGEuZnJhbWUoKQpjYXNlcyA9IHNwaW5fbnBfZGZbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICdjYXNlJyxdCmNvbnRyb2xzID0gc3Bpbl9ucF9kZltzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gJ2NvbnRyb2wnLF0KCm1lYW5fTUFUUklDUyA9IG1lYW4oY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpzZF9NQVRSSUNTID0gc2QoY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfTUFUUklDUyA9IChjYXNlcyRucF9jb21wb3NpdGVfdHNjb3JlIC0gbWVhbl9NQVRSSUNTKS8gc2RfTUFUUklDUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfTUFUUklDUykKCm1lYW5fTUFUUklDUyA9IG1lYW4oY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpzZF9NQVRSSUNTID0gc2QoY29udHJvbHMkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfTUFUUklDUyA9IChjb250cm9scyRucF9jb21wb3NpdGVfdHNjb3JlIC0gbWVhbl9NQVRSSUNTKS8gc2RfTUFUUklDUwojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfTUFUUklDUykKCm1lYW5fUk1FVCA9IG1lYW4oY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX1JNRVQgPSBzZChjb250cm9scyRzY29nX3JtZXRfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX1JNRVQgPSAoY2FzZXMkc2NvZ19ybWV0X3RvdGFsIC0gbWVhbl9STUVUKSAvIHNkX1JNRVQKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX1JNRVQpCgptZWFuX1JNRVQgPSBtZWFuKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9STUVUID0gc2QoY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9STUVUID0gKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCAtIG1lYW5fUk1FVCkgLyBzZF9STUVUCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9STUVUKQoKbWVhbl9CU0ZTPSBtZWFuKGNvbnRyb2xzJGJzZnNfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUyA9IHNkKGNvbnRyb2xzJGJzZnNfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0JTRlMgPSAoY2FzZXMkYnNmc190b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9CU0ZTKQoKbWVhbl9CU0ZTPSBtZWFuKGNvbnRyb2xzJGJzZnNfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUyA9IHNkKGNvbnRyb2xzJGJzZnNfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlMgPSAoY29udHJvbHMkYnNmc190b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9CU0ZTKQoKbWVhbl9JUSA9IG1lYW4oY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfSVEgPSBzZChjb250cm9scyR3dGFyX3N0ZF9zY29yZSwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfSVEgPSAoY2FzZXMkd3Rhcl9zdGRfc2NvcmUgLSBtZWFuX0lRKSAvIHNkX0lRCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9JUSkKCm1lYW5fSVEgPSBtZWFuKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCnNkX0lRID0gc2QoY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0lRID0gKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlIC0gbWVhbl9JUSkgLyBzZF9JUQojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfSVEpCgp6c2NvcmVfZGY9IGNiaW5kKGNhc2VzJHpzY29yZV9NQVRSSUNTLGNvbnRyb2xzJHpzY29yZV9NQVRSSUNTLGNhc2VzJHpzY29yZV9STUVULGNvbnRyb2xzJHpzY29yZV9STUVULGNhc2VzJHpzY29yZV9JUSwgY29udHJvbHMkenNjb3JlX0lRLCBjYXNlcyR6c2NvcmVfQlNGUyxjb250cm9scyR6c2NvcmVfQlNGUykKCnpzY29yZV9kZj0gcmJpbmQoY2FzZXMsY29udHJvbHMpCgojc3Bpbl9ucF9kZiRic2ZzX3NlYzdfdG90YWwgPC0gcm93U3VtcyhCU0ZTX2RmWyxjKCdic2ZzX3NlYzdfeV90b3RhbF83YScsICdic2ZzX3NlYzdfbl90b3RhbF83YicpXSwgbmEucm09VFJVRSkKI3NwaW5fbnBfZGZbQlNGU19kZiRic2ZzX3NlYzdfdG90YWwgPT0wLCdic2ZzX3NlYzdfdG90YWwnXSA8LSBOQQoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzEgPSAoY2FzZXMkYnNmc19zZWMxX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWMxID0gKGNvbnRyb2xzJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNhc2VzJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjYXNlcyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0JTRlNfc2VjMiA9IChjYXNlcyRic2ZzX3NlYzJfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMiA9IChjb250cm9scyRic2ZzX3NlYzJfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzMgPSAoY2FzZXMkYnNmc19zZWMzX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWMzID0gKGNvbnRyb2xzJGJzZnNfc2VjM190b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNhc2VzJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjYXNlcyRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0JTRlNfc2VjNCA9IChjYXNlcyRic2ZzX3NlYzRfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjb250cm9scyRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzQ9IChjb250cm9scyRic2ZzX3NlYzRfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjYXNlcyRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY2FzZXMkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9CU0ZTX3NlYzUgPSAoY2FzZXMkYnNmc19zZWM1X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY29udHJvbHMkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWM1ID0gKGNvbnRyb2xzJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNhc2VzJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjYXNlcyRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0JTRlNfc2VjNiA9IChjYXNlcyRic2ZzX3NlYzZfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjb250cm9scyRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzYgPSAoY29udHJvbHMkYnNmc19zZWM2X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCgp6c2NvcmVfZGY9IGNiaW5kKGNhc2VzJHpzY29yZV9CU0ZTX3NlYzEsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzEsY2FzZXMkenNjb3JlX0JTRlNfc2VjMiwgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMixjYXNlcyR6c2NvcmVfQlNGU19zZWMzLCBjb250cm9scyR6c2NvcmVfQlNGU19zZWMzLGNhc2VzJHpzY29yZV9CU0ZTX3NlYzQsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzQsY2FzZXMkenNjb3JlX0JTRlNfc2VjNSwgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNSxjYXNlcyR6c2NvcmVfQlNGU19zZWM2LCBjb250cm9scyR6c2NvcmVfQlNGU19zZWM2KQp6c2NvcmVfZGY9IHJiaW5kKGNhc2VzLGNvbnRyb2xzKQoKCgpgYGAKCgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCkJTRlNfZGY8LQogICByZWFkX2NzdigKICIvc2NyYXRjaC9uc2hhcm1hL1NQSU4tQVNEcmRvYy9CU0ZTX2RmLmNzdiIpJT4lCiAgCm11dGF0ZShzdHVkeSA9ICJTUEFTRCIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMiIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoLikpICU+JSAgICAgICAKc2VsZWN0KC1jKHJlZGNhcF9ldmVudF9uYW1lKSkgJT4lCiAgZ3JvdXBfYnkocmVjb3JkX2lkKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAiZG93biIpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJ1cCIpICU+JQogIHNsaWNlKDEpICU+JQogIHVuZ3JvdXAoKQoKYnNmc19hc2RfY2FzZSA8LQogIEJTRlNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgpic2ZzX2FzZF9jb250cm9sIDwtCiAgQlNGU19kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBucm93KCkKCgpic2ZzX3ByZXBhbiA8LQogIEJTRlNfZGYgJT4lCiAgZmlsdGVyKGJzZnNfZG9hIDwgIjIwMjItMDYtMDciKSU+JQogIG5yb3coKQoKYnNmc19kdXJwYW4gPC0KICBCU0ZTX2RmICU+JQogIGZpbHRlcihic2ZzX2RvYSA+ICIyMDIyLTA3LTExIiklPiUKICBucm93KCkKCgojQlNGU19kZiRic2ZzX3ByZXBhbiA8LSAoQlNGU19kZlsnMjAyMi0wNi0wNyddKQoKQlNGU19kZl9wYW4gPC0gQlNGU19kZiAlPiUgYXMuZGF0YS5mcmFtZSAlPiUKICBtdXRhdGUoYnNmc19wcmVwYW4gPSBpZmVsc2UoQlNGU19kZiRic2ZzX2RvYSA8ICIyMDIwLTAzLTE1IiwgInByZXBhbiIsICJvdGhlciIpKQpCU0ZTX2RmX3Bhbltpcy5uYShCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiksICJic2ZzX3ByZXBhbiJdIDwtICJvdGhlciIKCiNCU0ZTX2RmW0JTRlNfZGYkYnNmc19wcmVwYW4gPT0wLCdic2ZzX3ByZXBhbiddIDwtIE5BCgoKCkJTRlNfZGYkYnNmc19hc2RfdG90YWwgPC0gcm93U3VtcyhCU0ZTX2RmWyxjKCdic2ZzX3NlY19ncmFuZHRvdGFsMScsICdic2ZzX3NlY19ncmFuZHRvdGFsMicpXSwgbmEucm09VFJVRSkKQlNGU19kZltCU0ZTX2RmJGJzZnNfYXNkX3RvdGFsID09MCwnYnNmc19hc2RfdG90YWwnXSA8LSBOQQoKCgojQlNGU19kZiRic2ZzX3NlYzdfdG90YWw9cmJpbmQoYnNmc19zZWM3X3lfdG90YWxfN2EsIGJzZnNfc2VjN19uX3RvdGFsXzdiKQoKI0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsIDwtIHJvd1N1bXMoQlNGU19kZlssYygnYnNmc19zZWM3X3lfdG90YWxfN2EnLCAnYnNmc19zZWM3X25fdG90YWxfN2InKV0sIG5hLnJtPVRSVUUpCiNCU0ZTX2RmW0JTRlNfZGYkYnNmc19zZWM3X3RvdGFsID09MCwnYnNmc19zZWM3X3RvdGFsJ10gPC0gTkEKCgpgYGAKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKQUJBU19kZjwtCiAgIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL0FCQVNfZGYuY3N2IikgJT4lCiAgCm11dGF0ZShzdHVkeSA9ICJTUEFTRCIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMiIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDb250cm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNhc2UiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoLikpICU+JSAgICAgICAKc2VsZWN0KC1jKHJlZGNhcF9ldmVudF9uYW1lKSkgJT4lCiAgZ3JvdXBfYnkocmVjb3JkX2lkKSAlPiUKICBmaWxsKC1yZWNvcmRfaWQsIC5kaXJlY3Rpb24gPSAiZG93biIpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJ1cCIpICU+JQogIHNsaWNlKDEpICU+JQogIHVuZ3JvdXAoKQoKYWJhc19hc2RfY2FzZSA8LQogIEFCQVNfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbnJvdygpCgphYmFzX2FzZF9jb250cm9sIDwtCiAgQUJBU19kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBucm93KCkKCkFCQVNfZGYkYWJhc19hc2RfdG90YWwgPC0gcm93U3VtcyhBQkFTX2RmWyxjKCdhYmFzX2dhYycsICdhYmFzX2dhYzEnLCAiYWJhc19nYWMyIildLCBuYS5ybT1UUlVFKQpBQkFTX2RmW0FCQVNfZGYkYWJhc19hc2RfdG90YWwgPT0gMCwnYWJhc19hc2RfdG90YWwnXSA8LSBOQSAKYGBgCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpzcGFzZF9kZW1vX2RmIApjYXNlX2FzZCA9IHNwYXNkX2RlbW9fZGZbc3Bhc2RfZGVtb19kZiRncm91cD09J0Nhc2UnLF0KY29udHJvbF9hc2QgPSBzcGFzZF9kZW1vX2RmW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSdDb250cm9sJyxdCgptZWFuX01BVFJJQ1NzZCA9IG1lYW4oY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpzZF9NQVRSSUNTc2QgPSBzZChjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QgPSAoY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDU3NkKSAvIHNkX01BVFJJQ1NzZAojenNjb3JlX2FzZCA9IGNiaW5kKHpzY29yZV9hc2QsIGNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgoKbWVhbl9NQVRSSUNTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfTUFUUklDU3NkID0gc2QoY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfTUFUUklDU3NkID0gKGNhc2VfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUgLSBtZWFuX01BVFJJQ1NzZCkvIHNkX01BVFJJQ1NzZAojenNjb3JlX2FzZCA9IGNiaW5kKHpzY29yZV9hc2QsIGNhc2VfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgoKbWF0cmljc19hc2RfenNjb3JlID0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX01BVFJJQ1NzZCxjb250cm9sX2FzZCR6c2NvcmVfTUFUUklDU3NkKQoKbWF0cmljc19hc2RfenNjb3JlID0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpCU0ZTX2RmCgpjYXNlX2FzZCA9IEJTRlNfZGZbQlNGU19kZiRncm91cD09J0Nhc2UnLF0KY29udHJvbF9hc2QgPSBCU0ZTX2RmW0JTRlNfZGYkZ3JvdXA9PSdDb250cm9sJyxdCiAKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZCA9IChjYXNlX2FzZCRic2ZzX2FzZF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfYXNkX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCA9IChjb250cm9sX2FzZCRic2ZzX2FzZF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKI2JzZnNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0JTRlNzZCwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCkKI2JzZnNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgoKI3pzY29yZV9hc2Q9Y2JpbmQoenNjb3JlX2FzZCwgQlNGU19kZikKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMxID0gKGNhc2VfYXNkJGJzZnNfc2VjMV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEgPSAoY29udHJvbF9hc2QkYnNmc19zZWMxX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMiA9IChjYXNlX2FzZCRic2ZzX3NlYzJfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMyID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjMl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMgPSAoY2FzZV9hc2QkYnNmc19zZWMzX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMyA9IChjb250cm9sX2FzZCRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM0ID0gKGNhc2VfYXNkJGJzZnNfc2VjNF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQ9IChjb250cm9sX2FzZCRic2ZzX3NlYzRfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM1ID0gKGNhc2VfYXNkJGJzZnNfc2VjNV90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUgPSAoY29udHJvbF9hc2QkYnNmc19zZWM1X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNiA9IChjYXNlX2FzZCRic2ZzX3NlYzZfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWM2ID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKCmJzZnNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMxLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMyLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzIsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMzLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM0LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM1LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUsY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM2LCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzYpCmJzZnNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgpgYGAKCgoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CkFCQVNfZGYKCmNhc2VfYXNkID0gQUJBU19kZltBQkFTX2RmJGdyb3VwPT0nQ2FzZScsXQpjb250cm9sX2FzZCA9IEFCQVNfZGZbQUJBU19kZiRncm91cD09J0NvbnRyb2wnLF0KCm1lYW5fQUJBU3NkID0gbWVhbihjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCnNkX0FCQVNzZD0gc2QoY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQUJBU3NkID0gKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsIC0gbWVhbl9BQkFTc2QpIC8gc2RfQUJBU3NkCgptZWFuX0FCQVNzZCA9IG1lYW4oY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpzZF9BQkFTc2Q9IHNkKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsLG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0FCQVNzZCA9IChjYXNlX2FzZCRhYmFzX2FzZF90b3RhbCAtIG1lYW5fQUJBU3NkKSAvIHNkX0FCQVNzZAoKCmFiYXNfYXNkX3pzY29yZT0gY2JpbmQoY2FzZV9hc2QkenNjb3JlX0FCQVNzZCxjb250cm9sX2FzZCR6c2NvcmVfQUJBU3NkKQphYmFzX2FzZF96c2NvcmU9IHJiaW5kKGNhc2VfYXNkLGNvbnRyb2xfYXNkKQoKI3pzY29yZV9hc2Q9Y2JpbmQoenNjb3JlX2FzZCAsIEFCQVNfZGYpCiN6c2NvcmVfYXNkPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfQUJBU3NkLGNvbnRyb2xfYXNkJHpzY29yZV9BQkFTc2QsY2FzZV9hc2QkenNjb3JlX0JTRlNzZCwgY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZCkKCiNBQkFTX2RmIDwtIHJiaW5kKHNwYXNkX2RlbW9fZGYsQlNGU19kZikKCgpgYGAKCgoKYGBge3J9CgojbWF0cmljcyBzY29yZSBvZiBzcGlucyB2aW9saW4gcGxvdAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9NQVRSSUNTKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCiNSTUVUIFNjb3JlIG9mIHNwaW5zIHZpb2xpbiBwbG90CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX1JNRVQpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAojQmlyY2h3b29kIFNGUyBTY29yZSBvZiBzcGlucyB2aW9saW4gcGxvdAojZ2dwbG90KHpzY29yZV9kZiwgYWVzKGRpYWdub3N0aWNfZ3JvdXAsIHpzY29yZV9CU0ZTKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCiNFc3RpbWF0ZWQgSVEgb2Ygc3BpbnMgdmlvbGluIHBsb3QgCiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0lRKSkgKwogICAgI2dlb21fdmlvbGluKCkgK2dlb21fcG9pbnQoKSAKCmBgYAoKYGBge3J9CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0JTRlMpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpCmBgYAoKIyMgU2NvcmUgRGlzdHJpYnV0aW9ucyAKCgojIyMgQmlyY2h3b29kIFNvY2lhbCBGdW5jdGlvbmluZyBTY2FsZToKQSBzZWxmLXJlcG9ydCBxdWVzdGlvbm5haXJlIGRlc2lnbmVkIHRvIHJlZmxlY3QgdGhlIHNvY2lhbCBza2lsbHMgYW5kIHBlcmZvcm1hbmNlcyBvZiBwYXRpZW50cwoKCioqQlNGUyBTZWN0aW9uIDEqKgotQXNzZXNzIFNvY2lhbCBFbmdhZ2VtZW50L1dpdGhkcmF3biB3aXRoIGEgdG90YWwgc2NvcmUgYmV0d2VlbiAwIGFuZCAxNSBleCBob3VycyBzcGVudCBhbG9uZSB2cyBsZWF2aW5nIHRoZSBob3VzZQpgYGB7cn0KQlNGU19zZWMxX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzFfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzFfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMxX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWMxX2Rpc3RyaWJ1dGlvbgpgYGAKCgogKipTZWN0aW9uIDE6IFByZSBhbmQgUG9zdCBQYW5kZW1pYyoqCiAtQ29tcGFyZXMgdGhlIHNjb3JlcyBvZiBzZWN0aW9uIDEgb24gdGhlIEJpcmNod29vZCBBc3Nlc21lbnQgcHJpb3IgdG8gdGhlIENvdmlkLTE5IFBhbmRlbWljIHZzIEFmdGVyIHRoZSBQYW5kZW1pYyBiZXR3ZWVuIFNQSU4tQVNEIGFuZCBTUElOUyBTdHVkaWVzIApgYGB7cn0KCkJTRlNfc2VjMV9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzFfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMxX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJwcmVwYW4iXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMxX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0icHJlcGFuIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uCgpgYGAKCgoKKipCU0ZTIFNlY3Rpb24gMioqCi1Mb29rcyBhdCBJbnRlcnBlcnNvbmFsIENvbW11bmljYXRpb24gYW5kIFJlbGF0aW9uc2hpcHMgd2l0aCBhIHRvdGFsIHNjb3JlIGJldHdlZW4gMCBhbmQgMzAgZXggaGF2aW5nIHNvbWVvbmUgdG8gZGlzY3VzcyBwcm9ibGVtcyB3aXRoIApgYGB7cn0KQlNGU19zZWMyX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzJfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMyX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWMyX2Rpc3RyaWJ1dGlvbgpgYGAKCgogKipTZWN0aW9uIDI6IFByZSBhbmQgUG9zdCBQYW5kZW1pYyoqCiAtQ29tcGFyZXMgdGhlIHNjb3JlcyBvZiBzZWN0aW9uIDMgb24gdGhlIEJpcmNod29vZCBBc3Nlc21lbnQgcHJpb3IgdG8gdGhlIENvdmlkLTE5IFBhbmRlbWljIHZzIEFmdGVyIHRoZSBQYW5kZW1pYyBiZXR3ZWVuIFNQSU4tQVNEIGFuZCBTUElOUyBTdHVkaWVzIApgYGB7cn0KCkJTRlNfc2VjMl9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzJfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMyX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMl90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJwcmVwYW4iXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMyX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0icHJlcGFuIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMl90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMl90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzJfZGlzdHJpYnV0aW9uCgpgYGAKCgoKCgoqKkJTRlMgU2VjdGlvbiAzKioKLUZvY3VzZXMgb24gSW50ZXJwZXJzb25hbCBQcm9zb2NpYWwgYWN0aXZpdGllcyBleCBnb2luZyB2aXNpdGluZyByZWxhdGl2ZXMgYW5kIGdvaW5nIHRvIHRoZSBtb3ZpZXMsIHdpdGggYSB0b3RhbCBzY29yZSBiZXR3ZWVuIDAgYW5kIDY2CmBgYHtyfQoKQlNGU19zZWMzX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjM190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzNfdG90YWxbQlNGU19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjM190b3RhbFtCU0ZTX2RmJGdyb3VwID09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzNfZGlzdHJpYnV0aW9uCgpgYGAKCgoKCiAqKlNlY3Rpb24gMzogUHJlIGFuZCBQb3N0IFBhbmRlbWljKioKIC1Db21wYXJlcyB0aGUgc2NvcmVzIG9mIHNlY3Rpb24gMyBvbiB0aGUgQmlyY2h3b29kIEFzc2VzbWVudCBwcmlvciB0byB0aGUgQ292aWQtMTkgUGFuZGVtaWMgdnMgQWZ0ZXIgdGhlIFBhbmRlbWljIGJldHdlZW4gU1BJTi1BU0QgYW5kIFNQSU5TIFN0dWRpZXMgCmBgYHtyfQoKQlNGU19zZWMzX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjM190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjM19kaXN0cmlidXRpb24KCiMgZ2dwbG90KHNwaW5fbnBfZGYsIGFlcyh4ID0gZGlhZ25vc3RpY19ncm91cCwgeSA9IGJzZnNfc2VjM190b3RhbCkpICsKIyAgIGdlb21fYm94cGxvdCgpCiMgZ2dwbG90KEJTRlNfZGZfcGFuLCBhZXMoeCA9IGdyb3VwLCB5ID0gYnNmc19zZWMzX3RvdGFsKSkgKwojICAgZ2VvbV9ib3hwbG90KCkgKwojICAgZmFjZXRfZ3JpZCgufmJzZnNfcHJlcGFuKQoKIyBTUEFTRF9zZWMzIDwtIEJTRlNfZGZfcGFuWyxjKDI5OjUwLCAxMjMsIDEyNCldCiMgbGlicmFyeShyZXNoYXBlKQojIFNQQVNEX3NlYzNfbWVsdCA8LSBtZWx0KFNQQVNEX3NlYzMsIG1lYXN1cmUudmFycyA9IDE6MjIpCiMgCiMgYWxsc2VjMyA8LSBnZ3Bsb3QoU1BBU0Rfc2VjM19tZWx0LCBhZXMoeCA9IGdyb3VwLCB5ID0gdmFsdWUsIGZpbGwgPSBncm91cCkpICsKIyAgIGdlb21fYm94cGxvdCgpKwojICAgZmFjZXRfZ3JpZChic2ZzX3ByZXBhbn52YXJpYWJsZSkgKwojICAgeWxpbSgtMSwgNCkKIyAKIyBhbGxzZWMzCiMgCiMgKFNQQVNEX0JTRlNfc2VjM19kaXN0cmlidXRpb24gPC0KIyBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAojICAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQojICAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfcTNfc3BvcnRzW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiMgICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjM19xM19zcG9ydHNbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQojICAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfcTNfc3BvcnRzW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQojICAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfcTNfc3BvcnRzW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQojICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiMgICAgICAgICAgZm9udCA9IHQsCiMgICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKIyAgICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiMgICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkpCiMgCiMgc3BpbnNfc2VsZWN0IDwtIHNwaW5fbnBfZGYgJT4lIHNlbGVjdChic2ZzX3NlYzFfdG90YWwsIGJzZnNfc2VjMl90b3RhbCwgYnNmc19zZWMzX3RvdGFsLCBic2ZzX3NlYzRfdG90YWwsIGJzZnNfc2VjNV90b3RhbCwgYnNmc19zZWM2X3RvdGFsKQojIAojIHNwYXNkX3NlbGVjdCA8LSBCU0ZTX2RmX3BhbiAlPiUgc2VsZWN0KGdyb3VwLGJzZnNfc2VjMV90b3RhbCwgYnNmc19zZWMyX3RvdGFsLCBic2ZzX3NlYzNfdG90YWwsIGJzZnNfc2VjNF90b3RhbCwgYnNmc19zZWM1X3RvdGFsLCBic2ZzX3NlYzZfdG90YWwpCiMgc3Bhc2Rfc2VsZWN0IDwtIHNwYXNkX3NlbGVjdFtjb21wbGV0ZS5jYXNlcyhzcGFzZF9zZWxlY3QpLF0KIyAKIyBzcGluLnBjYSA8LSBlcFBDQShzcGluc19zZWxlY3QsIERFU0lHTiA9IHNwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCkKIyBzcGFzZC5wY2EgPC0gZXBQQ0Eoc3Bhc2Rfc2VsZWN0WywtMV0sIERFU0lHTiA9IHNwYXNkX3NlbGVjdCRncm91cCkKCgoKCgoKYGBgCgoKCgoKCioqQlNGUyBTZWN0aW9uIDQqKgotTG9va3MgYXQgcGF0aWVudHMgaW52b2x2ZW1lbnQgaW4gUmVjcmVhdGlvbmFsIEFjdGl2aXRpZXMgd2l0aCBhIHNjb3JlIGJldHdlZW4gMCBhbmQgNDggIGV4IGNvb2tpbmcgYW5kIHBsYXlpbmcgYW4gaW5zdHJ1bWVudCAKYGBge3J9CkJTRlNfc2VjNF9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzRfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM0X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM0X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNF90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNF9kaXN0cmlidXRpb24KCmBgYAoKCiAqKlNlY3Rpb24gNDogUHJlIGFuZCBQb3N0IFBhbmRlbWljKioKIC1Db21wYXJlcyB0aGUgc2NvcmVzIG9mIHNlY3Rpb24gMyBvbiB0aGUgQmlyY2h3b29kIEFzc2VzbWVudCBwcmlvciB0byB0aGUgQ292aWQtMTkgUGFuZGVtaWMgdnMgQWZ0ZXIgdGhlIFBhbmRlbWljIGJldHdlZW4gU1BJTi1BU0QgYW5kIFNQSU5TIFN0dWRpZXMgCmBgYHtyfQoKQlNGU19zZWM0X2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNF90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzRfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM0X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM0X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM0X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNF9kaXN0cmlidXRpb24KCgpgYGAKCgoKCioqQlNGUyBTZWN0aW9uIDUqKgotQXNzZXNzIHRoZSBwYXRpZW50cyBJbmRlcGVuZGVuY2UgUGVyZm9ybWFuY2Ugd2l0aCBhIHNjb3JlIGJldHdlZW4gMCBhbmQgMzkgIGV4IHByZXBhcmluZyBhbmQgY29va2luZyBhIG1lYWwKYGBge3J9CkJTRlNfc2VjNV9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzVfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM1X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM1X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNV9kaXN0cmlidXRpb24KYGBgCgoKKipTZWN0aW9uIDU6IFByZSBhbmQgUG9zdCBQYW5kZW1pYyoqCiAtQ29tcGFyZXMgdGhlIHNjb3JlcyBvZiBzZWN0aW9uIDMgb24gdGhlIEJpcmNod29vZCBBc3Nlc21lbnQgcHJpb3IgdG8gdGhlIENvdmlkLTE5IFBhbmRlbWljIHZzIEFmdGVyIHRoZSBQYW5kZW1pYyBiZXR3ZWVuIFNQSU4tQVNEIGFuZCBTUElOUyBTdHVkaWVzIApgYGB7cn0KCkJTRlNfc2VjNV9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzVfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM1X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJwcmVwYW4iXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM1X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0icHJlcGFuIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzVfZGlzdHJpYnV0aW9uCgpgYGAKCgoqKkJTRlMgU2VjdGlvbiA2KioKLUxvb2tzIGF0IHBhdGllbmNlIEluZGVwZW5kZW5jZSBDb21wZXRlbmNlIHdpdGggYSBzY29yZSBiZXR3ZWVuIDAtMzkgZXggd2FzaGluZyBvd24gY2xvdGhlcyAKYGBge3J9CkJTRlNfc2VjNl9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gNjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzZfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM2X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM2X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNl9kaXN0cmlidXRpb24KCmBgYAoKKipCU0ZTIEdyYW5kIFRvdGFsKioKYGBge3IgZWNobz1GQUxTRX0KQlNGU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9ODAsIGVuZCA9IDIwMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfYXNkX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19kaXN0cmlidXRpb24KCmBgYAoKCgogIAojIyMgQWRhcHRpdmUgQmVoYXZpb3IgQXNzZXNzbWVudCBTeXN0ZW0gKEFCQVMpCi1UaGlzIGFzc2Vzc21lbnQgaGVscHMgZGVzY3JpYmUgYSBwZXJzb24ncyBnZW5lcmFsIGFkYXB0aXZlIGJlaGF2aW9yIGFzIHdlbGwgYXMgZnVuY3Rpb25pbmcgaW4gMTEgcmVsYXRlZCBhZGFwdGl2ZSBza2lsbCBhcmVhcyAKZXguIGNvbW11bmljYXRpb24sIHNlbGYtY2FyZSBhbmQgd29yayAKCmBgYHtyfQoKQUJBU19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDgwLCBlbmQgPSA0MDAsIHNpemUgPSA4KSkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5BQkFTX2RmJGFiYXNfYXNkX3RvdGFsW0FCQVNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIiBDYXNlIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QUJBU19kZiRhYmFzX2FzZF90b3RhbFtBQkFTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JSAKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBQkFTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCgpBQkFTX2Rpc3RyaWJ1dGlvbgpgYGAgCgoKIyMjIE1BVFJJQ1MgU2NvcmUgCgpgYGB7cn0KCm1hdHJpY3NfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSAwLCBlbmQgPSA2MCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJG5wX2NvbXBvc2l0ZV90c2NvcmVbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkbnBfY29tcG9zaXRlX3RzY29yZVtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+c3Bhc2RfZGVtb19kZiRucF9jb21wb3NpdGVfdHNjb3JlW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lIAogIGFkZF9ib3hwbG90ICh5PSB+c3Bhc2RfZGVtb19kZiRucF9jb21wb3NpdGVfdHNjb3JlW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKICAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTUFUUklDUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgptYXRyaWNzX2Rpc3RyaWJ1dGlvbgpgYGAKCiAgCiMjIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnQKCldlIHVzZSBbbXJpcWNdKGh0dHBzOi8vbXJpcWMucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL2luZGV4Lmh0bWwpIHRvIG9idGFpbiBpbWFnZSBxdWFsaXR5IG1ldHJpY3MgKElRTXMpIGZvciB0aGUgVDF3LCBUMncsIGFuZCBmTVJJIHNjYW5zLiBCZWxvdyBhcmUgcGxvdHMgb2YgZnJhbWV3aXNlIGRpc3BsYWNlbWVudCAoRkQpLCBhIG1lYXN1cmUgb2YgaGVhZCBtb3Rpb24gYWNyb3NzIHRpbWUuIFNwZWNpZmljYWxseSwgdGhlIGF2ZXJhZ2UgRkQgZm9yIGVhY2ggc2NhbiBhY3Jvc3MgYWxsIHRpbWVwb2ludHMgYW5kIHRoZSBwZXJjZW50YWdlIG9mIEZEcyBhYm92ZSBhIHRocmVzaG9sZCBvZiAqKjAuNSBtbSoqIGFyZSBzaG93bi4KCmBgYHtyfQpzcGFzZF9tcmlxY19ib2xkX2RmIDwtCiAgcmVhZF90c3YoCiAgICBoZXJlKCJkYXRhIiwgIm1yaSIsICJtcmlxY19ib2xkX1NQQVNELnRzdiIpCiAgKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAiU1BJTi1BU0QiLAogICAgICAgICBtb2RhbGl0eSA9ICJib2xkIiwKICAgICAgICAgZnVsbF9zdWJqZWN0X2lkID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgInN1Yi0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgIHN1YmplY3RfaWQgPSBwYXN0ZSgiU1BBU0QiLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCAxLCAzKSwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgNCwgMTApLCBzZXAgPSAiXyIpICU+JSBnc3ViKCJDTUgiLCAiQ01QIiwgLiksCiAgICAgICAgIGFjcXVpc2l0aW9uID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgImFjcS0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgIHJ1bl9udW0gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAicnVuLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgc2Nhbl90eXBlID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgInRhc2stKFtbOmFsbnVtOl1dKylfIilbLDJdICU+JSBnc3ViKCJcXGQiLCAiIiwgLikKICAgICAgICAgKSAlPiUKICBsZWZ0X2pvaW4oc3Bhc2RfcmVkY2FwX2RmICU+JSBzZWxlY3QocmVjb3JkX2lkLCBtcmlfZG9hKSwgYnkgPSBjKCJzdWJqZWN0X2lkIiA9ICJyZWNvcmRfaWQiKSkKCnNwaW5zX3N1YmplY3RzIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JSAKICBzZWxlY3QocmVjb3JkX2lkKSAlPiUgCiAgdW5saXN0KCkKCnNwaW5zX21yaXFjX2JvbGRfZGYgPC0KIHJlYWRfdHN2KAogICBoZXJlKCJkYXRhIiwgIm1yaSIsICJtcmlxY19ib2xkX1NQSU5TLnRzdiIpCiApICU+JQogbXV0YXRlKHN0dWR5ID0gIlNQSU5TIiwKICAgICAgICBtb2RhbGl0eSA9ICJib2xkIiwKICAgICAgICBmdWxsX3N1YmplY3RfaWQgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAic3ViLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICBzdWJqZWN0X2lkID0gcGFzdGUoIlNQTjAxIiwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgMSwgMyksIHN1YnN0cihmdWxsX3N1YmplY3RfaWQsIDQsIDEwKSwgc2VwID0gIl8iKSwKICAgICAgICBhY3F1aXNpdGlvbiA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJhY3EtKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHJ1bl9udW0gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAicnVuLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICBzY2FuX3R5cGUgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAidGFzay0oW1s6YWxudW06XV0rKV8iKVssMl0pICU+JQogZmlsdGVyKHN1YmplY3RfaWQgJWluJSBzcGluc19zdWJqZWN0cykKCm1yaXFjX2JvbGRfZGYgPC0KIGJpbmRfcm93cyhzcGFzZF9tcmlxY19ib2xkX2RmLCBzcGluc19tcmlxY19ib2xkX2RmKSAlPiUKIG11dGF0ZShzY2FuX3R5cGUgPSBmYWN0b3Ioc2Nhbl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJyZXN0IiwgImltaSIsICJvYnMiLCAiZW1wIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlJlc3RpbmcgU3RhdGUiLCAiSW1pdGF0ZSIsICJPYnNlcnZlIiwgIkVtcGF0aGljIEFjY3VyYWN5IikpKSAlPiUKIHNlbGVjdChzdHVkeSwgc3ViamVjdF9pZCwgc2Nhbl90eXBlLCBmZF9tZWFuLCBmZF9wZXJjLCBtcmlfZG9hKQpgYGAKCgpgYGB7cn0KcGxvdF9seSgKICBtcmlxY19ib2xkX2RmLCB4ID0gfnNjYW5fdHlwZSwgeSA9IH5mZF9tZWFuLCBjb2xvciA9IH5zdHVkeSwKICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBNZWFuIEZEOiAiLCBmZF9tZWFuKSwKICBtb2RlID0gIm1hcmtlcnMiLAogIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NhbiBUeXBlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJNZWFuIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKYGBge3J9CnBsb3RfbHkobXJpcWNfYm9sZF9kZiAlPiUgbXV0YXRlKHN0dWR5PWFzLmZhY3RvcihzdHVkeSkpLCB4ID0gfm1yaV9kb2EsIHkgPSB+ZmRfbWVhbiwgY29sb3IgPSB+c2Nhbl90eXBlLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IFNjYW4gVHlwZTogIiwgc2Nhbl90eXBlLAogICAgICAgICAgICAgICAgIjxicj4gTWVhbiBGRDogIiwgZmRfbWVhbiksCiAgbW9kZSA9ICJtYXJrZXJzIikgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTVJJIERhdGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lYW4gRnJhbWV3aXNlIERpc3BsYWNlbWVudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seSgKICBtcmlxY19ib2xkX2RmLCB4ID0gfnNjYW5fdHlwZSwgeSA9IH5mZF9wZXJjLCBjb2xvciA9IH5zdHVkeSwKICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBGRCAlOiAiLCBmZF9wZXJjKSwKICBtb2RlID0gIm1hcmtlcnMiLAogIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NhbiBUeXBlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQZXJjZW50YWdlIG9mIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnRzIEFib3ZlIFRocmVzaG9sZCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seShtcmlxY19ib2xkX2RmICU+JSBtdXRhdGUoc3R1ZHk9YXMuZmFjdG9yKHN0dWR5KSksIHggPSB+bXJpX2RvYSwgeSA9IH5mZF9wZXJjLCBjb2xvciA9IH5zY2FuX3R5cGUsCiAgaG92ZXJpbmZvID0gInRleHQiLAogIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCBzdWJqZWN0X2lkLAogICAgICAgICAgICAgICAgIjxicj4gRkQgJTogIiwgZmRfcGVyYyksCiAgbW9kZSA9ICJtYXJrZXJzIikgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTVJJIERhdGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRnJhbWV3aXNlIERpc3BsYWNlbWVudHMgQWJvdmUgVGhyZXNob2xkIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGA=
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.