data pulled: 2023-11-28
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, 146 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=110)
Control
(N=36)
Overall
(N=146)
Age (years)
Mean (SD) 21 (± 3.8) 27 (± 4.5) 22 (± 4.8)
Median [Min, Max] 20 [15, 33] 27 [17, 35] 22 [15, 35]
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Sex
Female 46 (42 %) 15 (42 %) 61 (42 %)
Male 64 (58 %) 20 (56 %) 84 (58 %)
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Race
Asian 16 (15 %) 16 (44 %) 32 (22 %)
Black or African American 2 (2 %) 6 (17 %) 8 (5 %)
More than one race 9 (8 %) 2 (6 %) 11 (8 %)
Other 7 (6 %) 0 (0 %) 7 (5 %)
White 76 (69 %) 11 (31 %) 87 (60 %)
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Education (years)
Mean (SD) 13 (± 2.1) 16 (± 2.0) 14 (± 2.6)
Median [Min, Max] 12 [9.0, 20] 16 [11, 20] 13 [9.0, 20]
Missing 0 (0%) 1 (2.8%) 1 (0.7%)
Estimated IQ
Mean (SD) 110 (± 14) 110 (± 11) 110 (± 13)
Median [Min, Max] 120 [73, 150] 110 [96, 130] 110 [73, 150]
Missing 48 (43.6%) 23 (63.9%) 71 (48.6%)
MATRICS
Mean (SD) 41 (± 11) 50 (± 12) 43 (± 12)
Median [Min, Max] 42 [-3.0, 59] 53 [16, 75] 44 [-3.0, 75]
Missing 11 (10.0%) 4 (11.1%) 15 (10.3%)

SPINS

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

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

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

Assessment Completion Status

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

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

Case

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

Control

Social Cognition

RMET

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

IRI

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

TASIT-R

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

ER-40

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

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

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

BSFS Section 2 -Looks at Interpersonal Communication and Relationships with a total score between 0 and 30 ex having someone to discuss problems with

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

BSFS Section 4 -Looks at patients involvement in Recreational Activities with a score between 0 and 48 ex cooking and playing an instrument

BSFS Section 5 -Assess the patients Independence Performance with a score between 0 and 39 ex preparing and cooking a meal

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

MATRICS Score

Intended to provide a relatively brief evaluation of key cognitive domains relevant to schizophrenia and related disorders, and was designed to address the following purposes: As an outcome measure for clinical trials of cognition-enhancing drugs for schizophrenia.

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.

MRI

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

LS0tCnRpdGxlOiAiU1BJTi1BU0QgU3R1ZHkgVHJhY2tpbmciCmRlc2NyaXB0aW9uOiB8CiAgVGhpcyByZXBvcnQgaXMgbWVhbnQgdG8gcHJvdmlkZSBhIHF1aWNrIG92ZXJ2aWV3IG9mIHRoZSBTUElOLUFTRCBzdHVkeS4Kb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBmaWdfd2lkdGg6IDgKLS0tCgpkYXRhIHB1bGxlZDogYHIgU3lzLkRhdGUoKWAgIAp3ZWJzaXRlOiBodHRwOi8vcnB1YnMuY29tL25zaGFybWFhL3NwYXNkX3RyYWNraW5nCgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRSwKICBtZXNzYWdlID0gRkFMU0UsCiAgY29tbWVudCA9ICIjIyIsCiAgUi5vcHRpb25zID0gbGlzdCh3aWR0aCA9IDYwKQopCgpkYXRlIDwtIFN5cy5EYXRlKCkKCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9taW5pbWFsKCkpCgp0IDwtIGxpc3QoCiAgZmFtaWx5ID0gImhlbHZldGljYSIsCiAgc2l6ZSA9IDE0CikKYGBgCgpgYGB7ciBsb2FkX2xpYnJhcmllc30KbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdsdWUpCmxpYnJhcnkoaGVyZSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGFibGUxKQpsaWJyYXJ5KHRpZHlyKQpgYGAKCmBgYHtyIGxvYWRfZGF0YX0Kc291cmNlKGhlcmUoIlIvZ2V0X3JlZGNhcC5SIikpCgpzZXR0aW5nc19jZmcgPC0gaGVyZSgibWV0YWRhdGEvc2V0dGluZ3MueWFtbCIpCnNwYXNkX2RhdGFfcGF0aCA8LSBnbHVlKGhlcmUoImRhdGEvY2xpbmljYWwvcmVkY2FwX2V4cG9ydF9TUEFTRF97ZGF0ZX0uY3N2IikpCgpzdHVkeV9zZXR0aW5ncyA8LSBldmFsLmNvbmZpZyhmaWxlID0gc2V0dGluZ3NfY2ZnLCBjb25maWcgPSAiU1BBU0QiKQoKaWYgKCFmaWxlLmV4aXN0cyhzcGFzZF9kYXRhX3BhdGgpKXsKICBnZXRfcmVkY2FwKCJTUEFTRCIsIHNldHRpbmdzX2NmZywgc3Bhc2RfZGF0YV9wYXRoKQp9CgpzcGluc19kYXRhX3BhdGggPC0gZ2x1ZShoZXJlKCJkYXRhL2NsaW5pY2FsL3JlZGNhcF9leHBvcnRfU1BJTlNfe2RhdGV9LmNzdiIpKQoKaWYgKCFmaWxlLmV4aXN0cyhzcGluc19kYXRhX3BhdGgpKSB7CiAgICBnZXRfcmVkY2FwKCJTUElOUyIsIHNldHRpbmdzX2NmZywgc3BpbnNfZGF0YV9wYXRoKQp9CmBgYAoKYGBge3IgY2xlYW5fZGF0YX0Kc3Bhc2RfcmVkY2FwX2RmIDwtCiAgcmVhZF9jc3Yoc3Bhc2RfZGF0YV9wYXRoLCBuYSA9IGMoIiIsICJOQSIsICJOSSIsICJJTlYiLCAiTkFTSyIsICJBU0tVIikpICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUElOLUFTRCIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMSIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiKSAlPiUKICAgICAgICAgICBmYWN0b3IoLikpICU+JQogIGZpbHRlcihyZWRjYXBfZXZlbnRfbmFtZSAhPSAiY2xfYXJtXzMiKSAlPiUKICBzZWxlY3QoLWMocmVkY2FwX2V2ZW50X25hbWUpKSAlPiUKICBncm91cF9ieShyZWNvcmRfaWQpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJkb3duIikgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gInVwIikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgdW5ncm91cCgpCgpzcGluc19yZWRjYXBfZGYgPC0KICByZWFkX2NzdihzcGluc19kYXRhX3BhdGgpICU+JQogIG11dGF0ZShzdHVkeSA9ICJTUElOUyIsCiAgICAgICAgIGdyb3VwID0gY2FzZV93aGVuKGdyZXBsKCJhcm1fMiIsIHJlZGNhcF9ldmVudF9uYW1lKSB+ICJDYXNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcGwoImFybV8xIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiKSAlPiUKICAgICAgICAgICAgICAgICAgICBmYWN0b3IoLikpICU+JSAgICAgICAKICBzZWxlY3QoLWMocmVkY2FwX2V2ZW50X25hbWUpKSAlPiUKICBncm91cF9ieShyZWNvcmRfaWQpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJkb3duIikgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gInVwIikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgdW5ncm91cCgpCgpzcGluc190b3RhbF9jYXNlIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ2FzZSIpICU+JQogIG5yb3coKQoKc3BpbnNfdG90YWxfY29udHJvbCA8LQogIHNwaW5zX3JlZGNhcF9kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBucm93KCkKCnNwaW5zX3JlZGNhcF9kZiA8LQogIHNwaW5zX3JlZGNhcF9kZiAlPiUKICBmaWx0ZXIoZGVtb19hZ2Vfc3R1ZHlfZW50cnkgPCAzNikKCgp0YXJnZXRzX2RmIDwtCiAgcmVhZF9jc3YoaGVyZSgibWV0YWRhdGEiLCAicmVjcnVpdG1lbnRfdGFyZ2V0cy5jc3YiKSkKYGBgCgpUaGlzIHJlcG9ydCBpcyBtZWFudCB0byBwcm92aWRlIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlICoqU29jaWFsIFByb2Nlc3NlcyBJbml0aWF0aXZlIGluIE5ldXJvYmlvbG9neSBvZiBBdXRpc20tc3BlY3RydW0gYW5kIFNjaGl6b3BocmVuaWEtc3BlY3RydW0gRGlzb3JkZXJzIChTUElOLUFTRCkqKiBzdHVkeS4gQWxsIGRhdGEgc3VtbWFyaXplZCBoZXJlIGRlcml2ZXMgZnJvbSB0aGUgU1BJTi1BU0QgcHJvamVjdCBvbiBDQU1IJ3MgUkVEQ2FwIGRhdGFiYXNlLCB0aGUgU1BJTlMgcHJvamVjdCBvbiBBSFJDJ3MgUkVEQ2FwIGRhdGFiYXNlLCBhbmQgVElHUkxhYidzIFhOQVQgZGF0YWJhc2UuIFRoaXMgc3VtbWFyeSBpcyBvbmx5IGFzIGFjY3VyYXRlIGFzIHRoZSBkYXRhIGNhcHR1cmVkIHRoZXJlLiAgCgpGb3IgZWFjaCBvZiB0aGUgcGxvdHMsIHlvdSBjYW4gaG92ZXIgb3ZlciBzZWxlY3RlZCBhcmVhcyB0byBzZWUgbW9yZSBtZXRhZGF0YS4gRHJhZ2dpbmcgYSByZWN0YW5nbGUgb3ZlciBhIHNwZWNpZmljIGFyZWEgb2YgdGhlIHBsb3Qgd2lsbCB6b29tIGluIGFuZCBkb3VibGUgY2xpY2tpbmcgd2lsbCByZXNldCB0byB0aGUgb3JpZ2luYWwgdmlldy4KCiMjIERlbW9ncmFwaGljcyB7LnRhYnNldH0KCkFzIHBhcnQgb2YgdGhlIHN0dWR5IGRlc2lnbiwgb25lIG9mIHRoZSBnb2FscyBpcyB0byBjb2xsZWN0IGNvZ25pdGl2ZSBhbmQgTVIgaW1hZ2luZyBkYXRhIGZyb20gKioxNDAqKiBwYXJ0aWNpcGFudHMgKCoqMTAwIHBhcnRpY2lwYW50cyB3aXRoIGF1dGlzbS1zcGVjdHJ1bSBkaXNvcmRlcnMqKiBhbmQgKio0MCBoZWFsdGh5IGNvbnRyb2xzKiopLiBQYXJ0aWNpcGFudHMgd2hvIGVpdGhlciBkcm9wIG91dCwgYXJlIHdpdGhkcmF3biBwcmlvciB0byBjb21wbGV0aW5nIHRoZSBzdHVkeSwgb3Igd2hvc2UgTVJJIGRhdGEgY2Fubm90IGJlIHVzZWQgd2lsbCBiZSByZXBsYWNlZCB1bnRpbCB0aGlzIGdvYWwgaXMgYWNoaWV2ZWQuICAKClRoZSBzdHVkeSB3aWxsIGFsc28gbGV2ZXJhZ2UgcHJldmlvdXNseSBjb2xsZWN0ZWQgZGF0YSBmcm9tIHRoZSAqKlNvY2lhbCBQcm9jZXNzZXMgSW5pdGlhdGl2ZSBpbiBOZXVyb2Jpb2xvZ3kgb2YgU2NoaXpvcGhyZW5pYXMgKFNQSU5TKSoqIHN0dWR5LCB3aGljaCBjb25zaXN0cyBvZiBhIG1hdGNoaW5nIHByb3RvY29sLiBTUElOUyBpcyBhIG11bHRpLXNpdGUgc3R1ZHkgdGhhdCBjb2xsZWN0ZWQgY29nbml0aXZlIGFuZCBNUiBpbWFnaW5nIGRhdGEgZnJvbSAqKmNsaW5pY2FsbHkgc3RhYmxlIHBhdGllbnRzIHdpdGggc2NoaXpvcGhyZW5pYS1zcGVjdHJ1bSBkaXNvcmRlcnMqKiBhbmQgKipoZWFsdGh5IGNvbnRyb2xzKiogZnJvbSBlYWNoIG9mICoqQ0FNSCAoQ01IKSoqLCAqKlp1Y2tlciBIaWxsc2lkZSBIb3NwaXRhbCAoWkhIKSoqIGFuZCAqKk1hcnlsYW5kIFBzeWNoaWF0cmljIFJlc2VhcmNoIENlbnRlciAoTVJDKSoqLgoKIyMjIFNQSU4tQVNECgpgYGAge3Igc3Bhc2RfZGVtb19kYXRhZnJhbWV9CnNwYXNkX2RlbW9fZGYgPC0KICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsCiAgICAgICAgIGRlbW9fc2V4X2JpcnRoLCBkZW1vX2FnZV9zdHVkeV9lbnRyeSwKICAgICAgICAgZGVtb19yYWNlX19fMV93aGl0ZSwgZGVtb19yYWNlX19fMl9ibGFjaywgZGVtb19yYWNlX19fM19uYXRpdmUsCiAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4sIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIsIGRlbW9fcmFjZV9fXzZfb3RoZXIsCiAgICAgICAgIGRlbW9fcmFjZV9fXzdfbWl4ZWQsIGRlbW9fcmFjZV9fXzhfdW5rbm93biwgZGVtb19yYWNlX290aGVyLAogICAgICAgICBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgd2FzaV93YWlzX2ZzaXEsIHdhc2lfZnNpcTRfY3MsIG5wX2NvbXBvc2l0ZV90c2NvcmUsCiAgICAgICAgIGhhbmRfbGF0ZXJhbGl0eV9xdW90aWVudCkgJT4lCiAgbXV0YXRlKHNleCA9IGZhY3RvcihkZW1vX3NleF9iaXJ0aCwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMSwgMiwgMyksCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJGZW1hbGUiLCAiTWFsZSIsICJJbnRlcnNleCIpKSwKICAgICAgICAgcmFjZSA9IGNhc2Vfd2hlbihkZW1vX3JhY2VfX183X21peGVkID09IDEgfiAiTW9yZSB0aGFuIG9uZSByYWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18xX3doaXRlID09IDEgfiAiV2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzJfYmxhY2sgPT0gMSB+ICJCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX18zX25hdGl2ZSA9PSAxIH4gIkFtZXJpY2FuIEluZGlhbi9BbGFza2EgTmF0aXZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX180X2FzaWFuID09IDEgfiAiQXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzVfaXNsYW5kZXIgPT0gMSB+ICJIYXdhaWlhbiBvciBQYWNpZmljIElzbGFuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBkZW1vX3JhY2VfX182X290aGVyID09IDEgfiAiT3RoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzhfdW5rbm93biA9PSAxIH4gIlVua25vd24gb3Igbm90IHJlcG9ydGVkIikgJT4lCiAgICAgICAgICAgZmFjdG9yKC4pLAogICAgICAgICBpcSA9IGlmZWxzZShpcy5uYSh3YXNpX2ZzaXE0X2NzKSwgd2FzaV93YWlzX2ZzaXEsIHdhc2lfZnNpcTRfY3MpKSAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwgc2V4LCBkZW1vX2FnZV9zdHVkeV9lbnRyeSwgcmFjZSwgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYsIGlxLCBucF9jb21wb3NpdGVfdHNjb3JlKSAlPiUKICBkcm9wbGV2ZWxzKCkKYGBgCgpUaHVzIGZhciwgKipgciBucm93KHNwYXNkX2RlbW9fZGYpYCoqIHBhcnRpY2lwYW50cyBoYXZlIGNvbnNlbnRlZCB0byBiZSBpbiB0aGUgc3R1ZHkuIEEgdGFibGUgc3VtbWFyaXppbmcgdGhlaXIgZGVtb2dyYXBoaWNzIGFzIHdlbGwgYXMgaGlzdG9ncmFtcyBvZiB0aGVpciBhZ2UgYW5kIGVzdGltYXRlZCBJUSBkaXN0cmlidXRpb25zIGFyZSBzaG93biBiZWxvdy4gIAoKRm9yICoqZXN0aW1hdGVkIElRKiosIHN0dWR5IHBhcnRpY2lwYW50cyBlaXRoZXIgY29tcGxldGVkIHRoZSAqKldlY2hzbGVyIEFiYnJldmlhdGVkIFNjYWxlIG9mIEludGVsbGlnZW5jZSAoV0FTSS1JSSkqKiBvciB0aGUgKipXZWNoc2xlciBBZHVsdCBJbnRlbGxpZ2VuY2UgU2NhbGUgKFdBSVMtSVYpKiouCgpgYGB7ciBzcGFzZF9kZW1vX3RhYmxlfQpsYWJlbChzcGFzZF9kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5KSA8LSAiQWdlICh5ZWFycykiCmxhYmVsKHNwYXNkX2RlbW9fZGYkc2V4KSA8LSAiU2V4IgpsYWJlbChzcGFzZF9kZW1vX2RmJHJhY2UpIDwtICJSYWNlIgpsYWJlbChzcGFzZF9kZW1vX2RmJGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmKSA8LSJFZHVjYXRpb24gKHllYXJzKSIKbGFiZWwoc3Bhc2RfZGVtb19kZiRpcSkgPC0gIkVzdGltYXRlZCBJUSIKbGFiZWwoc3Bhc2RfZGVtb19kZiRucF9jb21wb3NpdGVfdHNjb3JlKSA8LSAiTUFUUklDUyIKCm15LnJlbmRlci5jb250IDwtIGZ1bmN0aW9uKHgpIHsKICAgIHdpdGgoc3RhdHMuYXBwbHkucm91bmRpbmcoc3RhdHMuZGVmYXVsdCh4KSwgZGlnaXRzPTIpLCBjKCIiLAogICAgICAgICJNZWFuIChTRCkiPXNwcmludGYoIiVzICgmcGx1c21uOyAlcykiLCBNRUFOLCBTRCksCiAgICAgICAgIk1lZGlhbiBbTWluLCBNYXhdIj1zcHJpbnRmKCIlcyBbJXMsICVzXSIsIE1FRElBTiwgTUlOLCBNQVgpKSkKfQpteS5yZW5kZXIuY2F0IDwtIGZ1bmN0aW9uKHgpIHsKICAgIGMoIiIsIHNhcHBseShzdGF0cy5kZWZhdWx0KHgpLCBmdW5jdGlvbih5KSB3aXRoKHksCiAgICAgICAgc3ByaW50ZigiJWQgKCUwLjBmICUlKSIsIEZSRVEsIFBDVCkpKSkKfQoKc3Bhc2RfZGVtb190YWJsZSA8LQogIHRhYmxlMSh+IGRlbW9fYWdlX3N0dWR5X2VudHJ5ICsgc2V4ICsgcmFjZSArIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmICsgaXEgKyBucF9jb21wb3NpdGVfdHNjb3JlIHwgZ3JvdXAsCiAgICAgICAgZGF0YSA9IHNwYXNkX2RlbW9fZGYsCiAgICAgICAgcmVuZGVyLmNvbnRpbnVvdXMgPSBteS5yZW5kZXIuY29udCwgcmVuZGVyLmNhdGVnb3JpY2FsID0gbXkucmVuZGVyLmNhdCkKCnNwYXNkX2RlbW9fdGFibGUKYGBgCgpgYGB7ciBzcGFzZF9kZW1vX2Rpc3RyaWJ1dGlvbnN9CnNwYXNkX2FnZV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gMTUsIGVuZCA9IDM2LCBzaXplID0gMSkpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGFzZF9kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5W3NwYXNkX2RlbW9fZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIikgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwYXNkX2RlbW9fZGYkZGVtb19hZ2Vfc3R1ZHlfZW50cnlbc3Bhc2RfZGVtb19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wiKSAlPiUKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBZ2UgKHllYXJzKSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGFzZF9pcV9kaXN0cmlidXRpb24gPC0KICBwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0gNzAsIGVuZCA9IDE1MCwgc2l6ZSA9IDEwKSkgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwYXNkX2RlbW9fZGYkaXFbc3Bhc2RfZGVtb19kZiRncm91cCA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UiKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3Bhc2RfZGVtb19kZiRpcVtzcGFzZF9kZW1vX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCIpICU+JQogIGxheW91dChiYXJtb2RlID0gIm92ZXJsYXkiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVzdGltYXRlZCBJUSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpzcGFzZF9hZ2VfZGlzdHJpYnV0aW9uCnNwYXNkX2lxX2Rpc3RyaWJ1dGlvbgpgYGAKCiMjIyBTUElOUwoKYGBge3Igc3BpbnNfZGVtb19kYXRhZnJhbWV9CnNwaW5zX2RlbW9fZGYgPC0KICBzcGluc19yZWRjYXBfZGYgJT4lCiAgc2VsZWN0KHJlY29yZF9pZCwgZ3JvdXAsICAKIAogICAgICAgICBkZW1vX3NleF9iaXJ0aCwgZGVtb19hZ2Vfc3R1ZHlfZW50cnksCiAgICAgICAgIGRlbW9fcmFjZV9fXzFfd2hpdGUsIGRlbW9fcmFjZV9fXzJfYmxhY2ssIGRlbW9fcmFjZV9fXzNfbmF0aXZlLAogICAgICAgICBkZW1vX3JhY2VfX180X2FzaWFuLCBkZW1vX3JhY2VfX181X2lzbGFuZGVyLCBkZW1vX3JhY2VfX182X290aGVyLAogICAgICAgICBkZW1vX3JhY2VfX183X21peGVkLCBkZW1vX3JhY2VfX184X3Vua25vd24sIGRlbW9fcmFjZV9vdGhlciwKICAgICAgICAgZGVtb19oaWdoZXN0X2dyYWRlX3NlbGYsIHd0YXJfc3RkX3Njb3JlLCB3dGFyc3VtX3N0ZCwKICAgICAgICAgaGFuZF9sYXRlcmFsaXR5X3F1b3RpZW50KSAlPiUKICBtdXRhdGUoc2V4ID0gZmFjdG9yKGRlbW9fc2V4X2JpcnRoLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLCAyLCAzKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkZlbWFsZSIsICJNYWxlIiwgIkludGVyc2V4IikpLAogICAgICAgICByYWNlID0gY2FzZV93aGVuKGRlbW9fcmFjZV9fXzdfbWl4ZWQgPT0gMSB+ICJNb3JlIHRoYW4gb25lIHJhY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzFfd2hpdGUgPT0gMSB+ICJXaGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fMl9ibGFjayA9PSAxIH4gIkJsYWNrIG9yIEFmcmljYW4gQW1lcmljYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzNfbmF0aXZlID09IDEgfiAiQW1lcmljYW4gSW5kaWFuL0FsYXNrYSBOYXRpdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzRfYXNpYW4gPT0gMSB+ICJBc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fNV9pc2xhbmRlciA9PSAxIH4gIkhhd2FpaWFuIG9yIFBhY2lmaWMgSXNsYW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRlbW9fcmFjZV9fXzZfb3RoZXIgPT0gMSB+ICJPdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVtb19yYWNlX19fOF91bmtub3duID09IDEgfiAiVW5rbm93biBvciBub3QgcmVwb3J0ZWQiKSAlPiUKICAgICAgICAgICBmYWN0b3IoLiksCiAgICAgICAgIGlxID0gaWZlbHNlKGlzLm5hKHd0YXJfc3RkX3Njb3JlKSx3dGFyX3N0ZF9zY29yZSwgd3RhcnN1bV9zdGQpKSAlPiUKICBzZXBhcmF0ZShyZWNvcmRfaWQsIGMoInN0dWR5IiwgInNpdGUiLCAic3ViIiksIHNlcCA9ICJfIiwgcmVtb3ZlID0gRkFMU0UpICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIHNpdGUsIGdyb3VwLCBzZXgsIGRlbW9fYWdlX3N0dWR5X2VudHJ5LCByYWNlLCBkZW1vX2hpZ2hlc3RfZ3JhZGVfc2VsZiwgaXEpCmBgYAoKVGhlIHRvdGFsIFNQSU5TIGRhdGFzZXQgY29uc2lzdHMgb2YgKipgciBzcGluc190b3RhbF9jYXNlYCoqIHBhcnRpY2lwYW50cyB3aXRoIGFuIFNTRCBhbmQgKipgciBzcGluc190b3RhbF9jb250cm9sYCoqIHBhcnRpY2lwYW50cy4gQWZ0ZXIgZmlsdGVyaW5nIHRoZSBkYXRhc2V0IGZvciBwYXJ0aWNpcGFudHMgd2l0aGluIHRoZSBzYW1lIGFnZSByYW5nZSBhcyBTUElOLUFTRCwgd2UgZ2V0IHRoZSBkZW1vZ3JhcGhpY3MgdGFibGUsIGFuZCBhZ2UgYW5kIGVzdGltYXRlZCBJUSBkaXN0cmlidXRpb25zIHNob3duIGJlbG93LiAgCgpGb3IgKiplc3RpbWF0ZWQgSVEqKiwgc3R1ZHkgcGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGUgKipXZWNoc2xlciBUZXN0IG9mIEFkdWx0IFJlYWRpbmcgKFdUQVIpKiouCgpgYGB7ciBzcGluc19kZW1vX3RhYmxlfQpsYWJlbChzcGluc19kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5KSA8LSAiQWdlICh5ZWFycykiCmxhYmVsKHNwaW5zX2RlbW9fZGYkc2V4KSA8LSAiU2V4IgpsYWJlbChzcGluc19kZW1vX2RmJHJhY2UpIDwtICJSYWNlIgpsYWJlbChzcGluc19kZW1vX2RmJGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmKSA8LSJFZHVjYXRpb24gKHllYXJzKSIKbGFiZWwoc3BpbnNfZGVtb19kZiRpcSkgPC0gIkVzdGltYXRlZCBJUSIKCm15LnJlbmRlci5jb250IDwtIGZ1bmN0aW9uKHgpIHsKICAgIHdpdGgoc3RhdHMuYXBwbHkucm91bmRpbmcoc3RhdHMuZGVmYXVsdCh4KSwgZGlnaXRzPTIpLCBjKCIiLAogICAgICAgICJNZWFuIChTRCkiPXNwcmludGYoIiVzICgmcGx1c21uOyAlcykiLCBNRUFOLCBTRCksCiAgICAgICAgIk1lZGlhbiBbTWluLCBNYXhdIj1zcHJpbnRmKCIlcyBbJXMsICVzXSIsIE1FRElBTiwgTUlOLCBNQVgpKSkKfQpteS5yZW5kZXIuY2F0IDwtIGZ1bmN0aW9uKHgpIHsKICAgIGMoIiIsIHNhcHBseShzdGF0cy5kZWZhdWx0KHgpLCBmdW5jdGlvbih5KSB3aXRoKHksCiAgICAgICAgc3ByaW50ZigiJWQgKCUwLjBmICUlKSIsIEZSRVEsIFBDVCkpKSkKfQoKc3BpbnNfZGVtb190YWJsZSA8LQogIHRhYmxlMSh+IGRlbW9fYWdlX3N0dWR5X2VudHJ5ICsgc2V4ICsgcmFjZSArIGRlbW9faGlnaGVzdF9ncmFkZV9zZWxmICsgaXEgfCBzaXRlKmdyb3VwLAogICAgICAgIGRhdGEgPSBzcGluc19kZW1vX2RmLAogICAgICAgIHJlbmRlci5jb250aW51b3VzID0gbXkucmVuZGVyLmNvbnQsIHJlbmRlci5jYXRlZ29yaWNhbCA9IG15LnJlbmRlci5jYXQpCgpzcGluc19kZW1vX3RhYmxlCmBgYAoKYGBge3Igc3BpbnNfZGVtb19kaXN0cmlidXRpb25zfQpzcGluc19hZ2VfZGlzdHJpYnV0aW9uIDwtCiAgcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDE3LCBlbmQgPSAzNiwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfaGlzdG9ncmFtKHggPSB+c3BpbnNfZGVtb19kZiRkZW1vX2FnZV9zdHVkeV9lbnRyeVtzcGluc19kZW1vX2RmJGdyb3VwID09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSIpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGluc19kZW1vX2RmJGRlbW9fYWdlX3N0dWR5X2VudHJ5W3NwaW5zX2RlbW9fZGYkZ3JvdXAgPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIikgJT4lCiAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQWdlICh5ZWFycykiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKc3BpbnNfaXFfZGlzdHJpYnV0aW9uIDwtCiAgcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9IDYwLCBlbmQgPSAxMzAsIHNpemUgPSAxMCkpICU+JQogIGFkZF9oaXN0b2dyYW0oeCA9IH5zcGluc19kZW1vX2RmJGlxW3NwaW5zX2RlbW9fZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIikgJT4lCiAgYWRkX2hpc3RvZ3JhbSh4ID0gfnNwaW5zX2RlbW9fZGYkaXFbc3BpbnNfZGVtb19kZiRncm91cCA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wiKSAlPiUKICBsYXlvdXQoYmFybW9kZSA9ICJvdmVybGF5IiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJFc3RpbWF0ZWQgSVEiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKc3BpbnNfYWdlX2Rpc3RyaWJ1dGlvbgpzcGluc19pcV9kaXN0cmlidXRpb24KYGBgCgojIyBBc3Nlc3NtZW50IENvbXBsZXRpb24gU3RhdHVzIHsudGFic2V0fQoKQmVsb3cgaXMgYSBoZWF0bWFwIGRlcGljdGluZyB3aGljaCBhc3Nlc3NtZW50cyBoYXZlIGJlZW4gY29tcGxldGVkIGZvciBlYWNoIHBhcnRpY2lwYW50IGluIFNQSU4tQVNELiBUaGVyZSBhcmUgc2VwYXJhdGUgdGFicyBkaXZpZGluZyBgQ2FzZWAgYW5kIGBDb250cm9sYCBwYXJ0aWNpcGFudHMuIFRoZSBgQXNzZXNzbWVudGAgaXMgc2hvd24gaW4gdGhlIHggYXhpcyBhbmQgdGhlIGBTdWJqZWN0IElEYCBpcyBzaG93biBpbiB0aGUgeSBheGlzLiAqKjxzcGFuIHN0eWxlPSJjb2xvcjojMjM4ODIzIj5HcmVlbjwvc3Bhbj4qKiBpbmRpY2F0ZXMgJ2NvbXBsZXRlJywgKio8c3BhbiBzdHlsZT0iY29sb3I6I0QyMjIyRCI+cmVkPC9zcGFuPioqIGluZGljYXRlcyAnaW5jb21wbGV0ZScgYW5kICoqPHNwYW4gc3R5bGU9ImNvbG9yOiNGRkJGMDAiPnllbGxvdzwvc3Bhbj4qKiBpbmRpY2F0ZXMgYSAncGFydGlhbCBjb21wbGV0ZScuIEJsYW5rIHJlY3RhbmdsZXMgaW5kaWNhdGUgdGhhdCB0aGUgYXNzZXNzbWVudCBlaXRoZXIgaGFzbid0IGJlZW4gYXR0ZW1wdGVkIHlldCBvciB0aGF0IHRoZSBkYXRhIGhhc24ndCBiZWVuIGVudGVyZWQuIFlvdSBjYW4gaG92ZXIgb3ZlciBlYWNoIHNxdWFyZSB0byBnZXQgbW9yZSBkZXRhaWxzIG9uIHRoZSByZWFzb24gZm9yIGFuIGFzc2Vzc21lbnQgYmVpbmcgaW5jb21wbGV0ZS4KCmBgYHtyIGFzc2Vzc21lbnRfY29tcGxldGV9CnNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzIDwtCiAgc3Bhc2RfcmVkY2FwX2RmICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwKICAgICAgICAgZW5kc193aXRoKCJfZm9ybV9jb21wbGV0ZSIpLAogICAgICAgICBoYW5kX3JlZGNhcF9pZCwKICAgICAgICAgYXFfcmVkY2FwX2lkLAogICAgICAgICBzcHFiX3JlZGNhcF9pZCwKICAgICAgICAgYmRpX3JlZGNhcF9pZCwKICAgICAgICAgaXJpX3JlZGNhcF9pZCwKICAgICAgICAgZW5kc193aXRoKCJfZXhwbGFpbiIpLAogICAgICAgICBlbmRzX3dpdGgoIl9vdGhlcl9yZWFzb25fbmMiKSkgJT4lCiAgbXV0YXRlKHJlY29yZF9pZCA9IHN0cl9yZW1vdmUocmVjb3JkX2lkLCAiU1BBU0RfQ01QXyIpLAogICAgICAgICBoYW5kX2Zvcm1fY29tcGxldGUgPSBpZmVsc2UoaGFuZF9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBoYW5kX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBhcV9mb3JtX2NvbXBsZXRlID0gaWZlbHNlKGFxX3JlZGNhcF9pZCA9PSAiW3N1cnZleSByZXNwb25kZW50XSIsIDEsIGFxX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBzcHFiX2Zvcm1fY29tcGxldGUgPSBpZmVsc2Uoc3BxYl9yZWRjYXBfaWQgPT0gIltzdXJ2ZXkgcmVzcG9uZGVudF0iLCAxLCBzcHFiX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBiZGlfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShiZGlfcmVkY2FwX2lkID09ICJbc3VydmV5IHJlc3BvbmRlbnRdIiwgMSwgYmRpX2Zvcm1fY29tcGxldGUpLAogICAgICAgICBpcmlfZm9ybV9jb21wbGV0ZSA9IGlmZWxzZShpcmlfcmVkY2FwX2lkID09ICJbc3VydmV5IHJlc3BvbmRlbnRdIiwgMSwgaXJpX2Zvcm1fY29tcGxldGUpKQoKc3Bhc2RfYXNzZXNzbWVudF9jb21wbGV0ZSA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBlbmRzX3dpdGgoIl9mb3JtX2NvbXBsZXRlIikpICU+JQogIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gImNvbXBsZXRlIiwgLWMocmVjb3JkX2lkLCBncm91cCkpICU+JQogIGZpbHRlcighaXMubmEoY29tcGxldGUpKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IHN0cl9yZW1vdmUoYXNzZXNzbWVudCwgIl9mb3JtX2NvbXBsZXRlIikpCgpzcGFzZF9hc3Nlc3NtZW50X2V4cGxhaW4gPC0KICBzcGFzZF9hc3Nlc3NtZW50X3N0YXR1cyAlPiUKICBzZWxlY3QocmVjb3JkX2lkLCBncm91cCwgZW5kc193aXRoKCJfZXhwbGFpbiIpKSAlPiUKICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJyZWFzb24iLCAtYyhyZWNvcmRfaWQsIGdyb3VwKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShyZWFzb24pKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IHN0cl9yZW1vdmUoYXNzZXNzbWVudCwgIl9leHBsYWluIikpICU+JQogIGZpbHRlcihhc3Nlc3NtZW50ICE9ICJucF92YWxpZGl0eV9pc3N1ZXMiKSAlPiUKICBtdXRhdGUocmVhc29uID0gZmFjdG9yKHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoODgsIDg5LCA5MCwgOTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyLCA5MywgOTQsIDk1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NiwgOTcsIDk4LCA5OSksCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJPdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXJtaW5hdGVkIGZyb20gc3R1ZHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2VkIGFwcG9pbnRtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhdGVyIGZvcmdvdCB0byBhZG1pbmlzdGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWUgY29uc3RyYWludHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2l0aGRyZXcgY29uc2VudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNlYXNlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gYmUgY29udGFjdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXRlZCBidXQgd2l0aCBsZXNzIHRoYW4gYmVzdCBlZmZvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmdXNlZCB0byBiZWdpbi9maW5pc2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGh5c2ljYWwgaW1wYWlybWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2duaXRpdmUgaW1wYWlybWVudCIpKSkKCnNwYXNkX2Fzc2Vzc21lbnRfZXhwbGFpbl9vdGhlciA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfc3RhdHVzICU+JQogIHNlbGVjdChyZWNvcmRfaWQsIGdyb3VwLCBlbmRzX3dpdGgoIl9vdGhlcl9yZWFzb25fbmMiKSkgJT4lCiAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAicmVhc29uX290aGVyIiwgLWMocmVjb3JkX2lkLCBncm91cCkpICU+JQogIGZpbHRlcighaXMubmEocmVhc29uX290aGVyKSkgJT4lCiAgbXV0YXRlKGFzc2Vzc21lbnQgPSBzdHJfcmVtb3ZlKGFzc2Vzc21lbnQsICJfb3RoZXJfcmVhc29uX25jIikpCgpzcGFzZF9hc3Nlc3NtZW50X2RmIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9jb21wbGV0ZSAlPiUKICBsZWZ0X2pvaW4oc3Bhc2RfYXNzZXNzbWVudF9leHBsYWluKSAlPiUKICBsZWZ0X2pvaW4oc3Bhc2RfYXNzZXNzbWVudF9leHBsYWluX290aGVyKSAlPiUKICBmaWx0ZXIoIWFzc2Vzc21lbnQgJWluJSBjKCJlbGdfcCIsICJlbGdfY3QiLCAibnBfZmFjdCIsICJ0ZXJtIikpICU+JQogIG11dGF0ZShyZWFzb24gPSBpZmVsc2UocmVhc29uID09ICJPdGhlciIsIHJlYXNvbl9vdGhlciwgYXMuY2hhcmFjdGVyKHJlYXNvbikpLAogICAgICAgICBjb21wbGV0ZV90ZXh0ID0gY2FzZV93aGVuKGNvbXBsZXRlID09IDEgfiAiQ29tcGxldGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlID09IDIgfiAiTm90IGNvbXBsZXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSA9PSAzIH4gIlBhcnRpYWwiKSkKYGBgCgpUaGUgKipBdXRpc20tU3BlY3RydW0gUXVvdGllbnQgKEFRKSoqLCAqKlNjaGl6b3R5cGFsIFBlcnNvbmFsaXR5IFF1ZXN0aW9ubmFpcmUtQnJpZWYgKFNQUS1CKSoqIGFuZCAqKkJlY2sgRGVwcmVzc2lvbiBJbnZlbnRvcnktSUkgKEJESS1JSSkqKiB3ZXJlIGFkZGVkIHRvIHRoZSBzdHVkeSBwcm90b2NvbCBwYXJ0d2F5IHRocm91Z2ggdGhlIHN0dWR5IGFuZCBoYXZlbid0IGJlZW4gY29tcGxldGVkIGZvciBzZXZlcmFsIHBhcnRpY2lwYW50cyBhdCB0aGUgYmVnaW5uaW5nLgoKIyMjIENhc2UKClRoZSAqKkF1dGlzbSBEaWFnbm9zdGljIEludGVydmlldy1SZXZpc2VkIChBREktUikqKiB3YXMgaW5jbHVkZWQgaW4gdGhlIHN0dWR5IHByb3RvY29sIGluIHRoZSBldmVudCBvZiBhbiBpbmNvbmNsdXNpdmUgY2xpbmljYWwgZGlhZ25vc2lzIGFuZCBhIG5lZWQgZm9yIGZ1cnRoZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb2xsb3dpbmcgdGhlICoqQXV0aXNtIERpYWdub3N0aWMgT2JzZXJ2YXRpb24gU2NoZWR1bGUsIFNlY29uZCBFZGl0aW9uIChBRE9TLTIpKiogLiAgCgpgYGB7ciBjYXNlX2Fzc2Vzc21lbnRfY29tcGxldGV9CmNhc2VfYXNzZXNzbWVudF9kZiA8LQogIHNwYXNkX2Fzc2Vzc21lbnRfZGYgJT4lCiAgZmlsdGVyKGdyb3VwID09ICJDYXNlIikgJT4lCiAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiY29uc2VudCIsICJkZW1vIiwgInNjaWQ1IiwgInNvZmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaGgiLCAibnBtZWQiLCAicG1lZCIsICJ1cmluZSIsICJod3YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmQiLCAid2FzaSIsICJmbmQiLCAiYWRpciIsICJhZG9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcSIsICJicHJzIiwgInNwcWIiLCAiYmRpIiwgImNvIiwgIm1yaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJhcyIsICJic2ZzIiwgIm5wIiwgInRhc2l0IiwgInJtZXQiLCAiaXJpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ29uc2VudCIsICJEZW1vZ3JhcGhpY3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQ0lELTUtUlYiLCAiU09GQVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGljYWwgSGlzdG9yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ucHN5Y2hvdHJvcGljIE1lZGljYXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVyaW5lIFRveGljb2xvZ3kgUHJlZ25hbmN5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWlnaHQgV2VpZ2h0IFZpdGFscyIsICJIRFEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBU0ktSUkvV0FJUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFnZXJzdHJvbSBOaWNvdGluZSBEZXBlbmRlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBREktUiIsICJBRE9TLTIiLCAiQVEiLCAiQlBSUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1BRLUIiLCAiQkRJLUlJIiwgIk5pY290aW5lIEV4cGlyZWQgQ08iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUkkiLCAiQUJBUy1JSSIsICJCU0ZTIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmV1cm9wc3ljaCIsICJUQVNJVCBBIiwgIlJNRVQiLCAiSVJJIikpKQoKY2FzZV9jb21wbGV0ZV9wbG90IDwtCiAgY2FzZV9hc3Nlc3NtZW50X2RmICU+JQogIHBsb3RfbHkoeCA9IH5hc3Nlc3NtZW50LCB5ID0gfnJlY29yZF9pZCwgeiA9IH5jb21wbGV0ZSwKICAgICAgICAgIHhnYXAgPSAyLCB5Z2FwID0gMiwKICAgICAgICAgIGNvbG9ycyA9IGMoIiMyMzg4MjMiLCAiI0QyMjIyRCIsICIjRkZCRjAwIiksCiAgICAgICAgICB0eXBlID0gImhlYXRtYXAiLAogICAgICAgICAgaGVpZ2h0PTEzMDAsCiAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCcgU3ViamVjdCBJRDogJywgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBBc3Nlc3NtZW50OiAnLCBhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBTdGF0dXM6ICcsIGNvbXBsZXRlX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFJlYXNvbjogJywgcmVhc29uKSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQXNzZXNzbWVudCIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICIiLAogICAgICAgICAgICAgICAgICAgICAgdGlja2FuZ2xlPSA0NSwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU3ViamVjdCBJRCIsCiAgICAgICAgICAgICAgICAgICAgICBhdXRvcmFuZ2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJjYXRlZ29yeSIsCiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeW9yZGVyID0gImNhdGVnb3J5IGRlc2NlbmRpbmciLAogICAgICAgICAgICAgICAgICAgICAgdGlja3MgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2t2YWxzPX5yZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICBzaG93Z3JpZCA9IEZBTFNFKSkgJT4lCiAgaGlkZV9jb2xvcmJhcigpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKY2FzZV9jb21wbGV0ZV9wbG90CmBgYAoKIyMjIENvbnRyb2wKCmBgYHtyIGNvbnRyb2xfYXNzZXNzbWVudF9jb21wbGV0ZX0KY29udHJvbF9hc3Nlc3NtZW50X2RmIDwtCiAgc3Bhc2RfYXNzZXNzbWVudF9kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNvbnRyb2wiKSAlPiUKICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJjb25zZW50IiwgImRlbW8iLCAic2NpZDUiLCAic29mYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFoaCIsICJucG1lZCIsICJwbWVkIiwgInVyaW5lIiwgImh3diIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFuZCIsICJ3YXNpIiwgImZuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFxIiwgInNwcWIiLCAiYmRpIiwgImNvIiwgIm1yaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJhcyIsICJic2ZzIiwgIm5wIiwgInRhc2l0IiwgInJtZXQiLCAiaXJpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQ29uc2VudCIsICJEZW1vZ3JhcGhpY3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQ0lELTUtUlYiLCAiU09GQVMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGljYWwgSGlzdG9yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ucHN5Y2hvdHJvcGljIE1lZGljYXRpb25zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQc3ljaG90cm9waWMgTWVkaWNhdGlvbnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVyaW5lIFRveGljb2xvZ3kgUHJlZ25hbmN5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWlnaHQgV2VpZ2h0IFZpdGFscyIsICJIRFEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBU0ktSUkvV0FJUyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFnZXJzdHJvbSBOaWNvdGluZSBEZXBlbmRlbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUSIsICJTUFEtQiIsICJCREktSUkiLCAiTmljb3RpbmUgRXhwaXJlZCBDTyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1SSSIsICJBQkFTLUlJIiwgIkJTRlMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXVyb3BzeWNoIiwgIlRBU0lUIEEiLCAiUk1FVCIsICJJUkkiKSkpCgpjb250cm9sX2NvbXBsZXRlX3Bsb3QgPC0KICBjb250cm9sX2Fzc2Vzc21lbnRfZGYgJT4lCiAgcGxvdF9seSh4ID0gfmFzc2Vzc21lbnQsIHkgPSB+cmVjb3JkX2lkLCB6ID0gfmNvbXBsZXRlLAogICAgICAgICAgeGdhcCA9IDIsIHlnYXAgPSAyLAogICAgICAgICAgY29sb3JzID0gYygiIzIzODgyMyIsICIjRkZCRjAwIiwgIiNEMjIyMkQiKSwKICAgICAgICAgIHR5cGUgPSAiaGVhdG1hcCIsCiAgICAgICAgICBob3ZlcmluZm8gPSAndGV4dCcsCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCcgU3ViamVjdCBJRDogJywgcmVjb3JkX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBBc3Nlc3NtZW50OiAnLCBhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAnPGJyPiBTdGF0dXM6ICcsIGNvbXBsZXRlX3RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+IFJlYXNvbjogJywgcmVhc29uKSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQXNzZXNzbWVudCIsCiAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gImNhdGVnb3J5IiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2tzID0gIiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrYW5nbGUgPSA0NSwKICAgICAgICAgICAgICAgICAgICAgIHNob3dncmlkID0gRkFMU0UpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU3ViamVjdCBJRCIsCiAgICAgICAgICAgICAgICAgICAgICBhdXRvcmFuZ2UgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJjYXRlZ29yeSIsCiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeW9yZGVyID0gImNhdGVnb3J5IGRlc2NlbmRpbmciLAogICAgICAgICAgICAgICAgICAgICAgdGlja3MgPSAiIiwKICAgICAgICAgICAgICAgICAgICAgIHRpY2t2YWxzPX5yZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICBzaG93Z3JpZCA9IEZBTFNFKSkgJT4lCiAgaGlkZV9jb2xvcmJhcigpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKY29udHJvbF9jb21wbGV0ZV9wbG90CmBgYAoKCgoKIyMgU29jaWFsIENvZ25pdGlvbiB7LnRhYnNldH0KCmBgYHtyIHNjb2dfZGF0YWZyYW1lfQpzY29nX2RmIDwtCiAgcmJpbmQoCiAgICBzcGFzZF9yZWRjYXBfZGYgJT4lCiAgICAgIHNlbGVjdChyZWNvcmRfaWQsIHN0dWR5LCBncm91cCwKICAgICAgICAgICAgIHJtZXRfdG90YWwsCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3B0LCBpcmlfZmFjdG9yX2ZzLCBpcmlfZmFjdG9yX2VjLCBpcmlfZmFjdG9yX3BkLCBpcmlfdG90YWwsCiAgICAgICAgICAgICBzY29nX2VyNDBfY3JfY29sdW1ucGNyX3ZhbHVlLCBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsIHNjb2dfZXI0MGFuZ19jb2x1bW52LCBzY29nX2VyNDBmZWFyX2NvbHVtbncsCiAgICAgICAgICAgICBzY29nX2VyNDBoYXBfY29sdW1ueCwgc2NvZ19lcjQwbm9lX2NvbHVtbnksIHNjb2dfZXI0MHNhZF9jb2x1bW56LCBzY29nX2VyNDBfZnBhX2NvbHVtbmFhLCBzY29nX2VyNDBfZnBmX2NvbHVtbmFiLAogICAgICAgICAgICAgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCwgc2NvZ19lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZ19lcjQwbWRydF9jb2x1bW5hciwgc2NvZ19lcjQwZXhydF9jb2x1bW5hcywKICAgICAgICAgICAgIHRhc2l0X2NvcnJlY3RfdG90YWwsIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwsIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcywgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtKSwKICAgIHNwaW5zX3JlZGNhcF9kZiAlPiUKICAgICAgc2VsZWN0KHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwLAogICAgICAgICAgICAgcm1ldF90b3RhbCwgc2NvZzJfcm1ldF90b3RhbCwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfcHQsIHNjb2cyX2lyaV9mYWN0b3JfcGVyc3BlY3RpdmUsCiAgICAgICAgICAgICBpcmlfZmFjdG9yX2ZzLCBzY29nMl9pcmlfZmFjdG9yX2ZhbnRhc3ksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX2VjLCBzY29nMl9pcmlfZmFjdG9yX2VtcGF0aGljX2NvbmNlcm4sCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3BkLCBzY29nMl9pcmlfZmFjdG9yX3BlcnNvbmFsX2Rpc3RyZXNzLAogICAgICAgICAgICAgaXJpX3RvdGFsLAogICAgICAgICAgICAgc2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSwgc2NvZ19lcjQwMl9jcl9jb2x1bW5wY3JfdmFsdWUsCiAgICAgICAgICAgICBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsIHNjb2cyX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUsCiAgICAgICAgICAgICBzY29nX2VyNDBhbmdfY29sdW1udiwgc2NvZzJfZXI0MGFuZ19jb2x1bW52LAogICAgICAgICAgICAgc2NvZ19lcjQwZmVhcl9jb2x1bW53LCBzY29nMl9lcjQwZmVhcl9jb2x1bW53LAogICAgICAgICAgICAgc2NvZ19lcjQwaGFwX2NvbHVtbngsIHNjb2cyX2VyNDBoYXBfY29sdW1ueCwKICAgICAgICAgICAgIHNjb2dfZXI0MG5vZV9jb2x1bW55LCBzY29nMl9lcjQwbm9lX2NvbHVtbnksCiAgICAgICAgICAgICBzY29nX2VyNDBzYWRfY29sdW1ueiwgc2NvZzJfZXI0MHNhZF9jb2x1bW56LAogICAgICAgICAgICAgc2NvZ19lcjQwX2ZwYV9jb2x1bW5hYSwgc2NvZzJfZXI0MF9mcGFfY29sdW1uYWEsCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBmX2NvbHVtbmFiLCBzY29nMl9lcjQwX2ZwZl9jb2x1bW5hYiwKICAgICAgICAgICAgIHNjb2dfZXI0MG1pbGRfY29sdW1uYXAsIHNjb2cyX2VyNDBtaWxkX2NvbHVtbmFwLAogICAgICAgICAgICAgc2NvZ19lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZzJfZXI0MGV4dHJfY29sdW1uYXEsCiAgICAgICAgICAgICBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyLCBzY29nMl9lcjQwbWRydF9jb2x1bW5hciwKICAgICAgICAgICAgIHNjb2dfZXI0MGV4cnRfY29sdW1uYXMsIHNjb2cyX2VyNDBleHJ0X2NvbHVtbmFzLAogICAgICAgICAgICAgdGFzaXRfY29ycmVjdF90b3RhbCwgdGFzaXRzdW1fdG90YWxfY29ycmVjdCwKICAgICAgICAgICAgIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwsIHRhc2l0c3VtX3AyX3RvdGFsX2l0ZW1zY29ycmVjdCwKICAgICAgICAgICAgIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcywgdGFzaXRzdW1fcDNfZ3JhbmR0b3RhbF9saWVzLAogICAgICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtLCB0YXNpdHN1bV9wM19ncmFuZHRvdGFsX3NhcmNhc20pICU+JQogICAgICBtdXRhdGUocm1ldF90b3RhbCA9IGlmZWxzZShpcy5uYShybWV0X3RvdGFsKSwgc2NvZzJfcm1ldF90b3RhbCwgcm1ldF90b3RhbCksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX3B0ID0gaWZlbHNlKGlzLm5hKGlyaV9mYWN0b3JfcHQpLCBzY29nMl9pcmlfZmFjdG9yX3BlcnNwZWN0aXZlLCBpcmlfZmFjdG9yX3B0KSwKICAgICAgICAgICAgIGlyaV9mYWN0b3JfZnMgPSBpZmVsc2UoaXMubmEoaXJpX2ZhY3Rvcl9mcyksIHNjb2cyX2lyaV9mYWN0b3JfZmFudGFzeSwgaXJpX2ZhY3Rvcl9mcyksCiAgICAgICAgICAgICBpcmlfZmFjdG9yX2VjID0gaWZlbHNlKGlzLm5hKGlyaV9mYWN0b3JfZWMpLCBzY29nMl9pcmlfZmFjdG9yX2VtcGF0aGljX2NvbmNlcm4sIGlyaV9mYWN0b3JfZWMpLAogICAgICAgICAgICAgaXJpX2ZhY3Rvcl9wZCA9IGlmZWxzZShpcy5uYShpcmlfZmFjdG9yX3BkKSwgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzb25hbF9kaXN0cmVzcywgaXJpX2ZhY3Rvcl9wZCksCiAgICAgICAgICAgICBpcmlfdG90YWwgPSBpZmVsc2UoaXMubmEoaXJpX3RvdGFsKSwgaXJpX2ZhY3Rvcl9wdCArIGlyaV9mYWN0b3JfZnMgKyBpcmlfZmFjdG9yX2VjICsgaXJpX2ZhY3Rvcl9wZCwgaXJpX3RvdGFsKSwKICAgICAgICAgICAgIHNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nX2VyNDAyX2NyX2NvbHVtbnBjcl92YWx1ZSwgc2NvZ19lcjQwX2NyX2NvbHVtbnBjcl92YWx1ZSksCiAgICAgICAgICAgICBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwX2NydF9jb2x1bW5xY3J0X3ZhbHVlLCBzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUpLAogICAgICAgICAgICAgc2NvZ19lcjQwYW5nX2NvbHVtbnYgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwYW5nX2NvbHVtbnYsIHNjb2dfZXI0MGFuZ19jb2x1bW52KSwKICAgICAgICAgICAgIHNjb2dfZXI0MGZlYXJfY29sdW1udyA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBmZWFyX2NvbHVtbncsIHNjb2dfZXI0MGZlYXJfY29sdW1udyksCiAgICAgICAgICAgICBzY29nX2VyNDBoYXBfY29sdW1ueCA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBoYXBfY29sdW1ueCwgc2NvZ19lcjQwaGFwX2NvbHVtbngpLAogICAgICAgICAgICAgc2NvZ19lcjQwbm9lX2NvbHVtbnkgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwbm9lX2NvbHVtbnksIHNjb2dfZXI0MG5vZV9jb2x1bW55KSwKICAgICAgICAgICAgIHNjb2dfZXI0MHNhZF9jb2x1bW56ID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MHNhZF9jb2x1bW56LCBzY29nX2VyNDBzYWRfY29sdW1ueiksCiAgICAgICAgICAgICBzY29nX2VyNDBfZnBhX2NvbHVtbmFhID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MF9mcGFfY29sdW1uYWEsIHNjb2dfZXI0MF9mcGFfY29sdW1uYWEpLAogICAgICAgICAgICAgc2NvZ19lcjQwX2ZwZl9jb2x1bW5hYiA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBfZnBmX2NvbHVtbmFiLCBzY29nX2VyNDBfZnBmX2NvbHVtbmFiKSwKICAgICAgICAgICAgIHNjb2dfZXI0MG1pbGRfY29sdW1uYXAgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwbWlsZF9jb2x1bW5hcCwgc2NvZ19lcjQwbWlsZF9jb2x1bW5hcCksCiAgICAgICAgICAgICBzY29nX2VyNDBleHRyX2NvbHVtbmFxID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgc2NvZzJfZXI0MGV4dHJfY29sdW1uYXEsIHNjb2dfZXI0MGV4dHJfY29sdW1uYXEpLAogICAgICAgICAgICAgc2NvZ19lcjQwbWRydF9jb2x1bW5hciA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHNjb2cyX2VyNDBtZHJ0X2NvbHVtbmFyLCBzY29nX2VyNDBtZHJ0X2NvbHVtbmFyKSwKICAgICAgICAgICAgIHNjb2dfZXI0MGV4cnRfY29sdW1uYXMgPSBpZmVsc2UoZ3JlcGwoIk1SQ3xNUlAiLCByZWNvcmRfaWQpLCBzY29nMl9lcjQwZXhydF9jb2x1bW5hcywgc2NvZ19lcjQwZXhydF9jb2x1bW5hcyksCiAgICAgICAgICAgICB0YXNpdF9jb3JyZWN0X3RvdGFsID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fdG90YWxfY29ycmVjdCwgdGFzaXRfY29ycmVjdF90b3RhbCksCiAgICAgICAgICAgICB0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsID0gaWZlbHNlKGdyZXBsKCJNUkN8TVJQIiwgcmVjb3JkX2lkKSwgdGFzaXRzdW1fcDJfdG90YWxfaXRlbXNjb3JyZWN0LCB0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsKSwKICAgICAgICAgICAgIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcyA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfbGllcywgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzKSwKICAgICAgICAgICAgIHRhc2l0X3BhcnQzX2dyYW5kdG90YWxfc2FyY2FzbSA9IGlmZWxzZShncmVwbCgiTVJDfE1SUCIsIHJlY29yZF9pZCksIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfc2FyY2FzbSwgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtKSkgJT4lCiAgICAgIHNlbGVjdCgtYyhzY29nMl9ybWV0X3RvdGFsLAogICAgICAgICAgICAgICAgc2NvZzJfaXJpX2ZhY3Rvcl9wZXJzcGVjdGl2ZSwgc2NvZzJfaXJpX2ZhY3Rvcl9mYW50YXN5LCBzY29nMl9pcmlfZmFjdG9yX2VtcGF0aGljX2NvbmNlcm4sIHNjb2cyX2lyaV9mYWN0b3JfcGVyc29uYWxfZGlzdHJlc3MsCiAgICAgICAgICAgICAgICBzY29nX2VyNDAyX2NyX2NvbHVtbnBjcl92YWx1ZSwgc2NvZzJfZXI0MF9jcnRfY29sdW1ucWNydF92YWx1ZSwgc2NvZzJfZXI0MGFuZ19jb2x1bW52LCBzY29nMl9lcjQwZmVhcl9jb2x1bW53LAogICAgICAgICAgICAgICAgc2NvZzJfZXI0MGhhcF9jb2x1bW54LCBzY29nMl9lcjQwbm9lX2NvbHVtbnksIHNjb2cyX2VyNDBzYWRfY29sdW1ueiwKICAgICAgICAgICAgICAgIHNjb2cyX2VyNDBfZnBhX2NvbHVtbmFhLCBzY29nMl9lcjQwX2ZwZl9jb2x1bW5hYiwgc2NvZzJfZXI0MG1pbGRfY29sdW1uYXAsCiAgICAgICAgICAgICAgICBzY29nMl9lcjQwZXh0cl9jb2x1bW5hcSwgc2NvZzJfZXI0MG1kcnRfY29sdW1uYXIsIHNjb2cyX2VyNDBleHJ0X2NvbHVtbmFzLAogICAgICAgICAgICAgICAgdGFzaXRzdW1fdG90YWxfY29ycmVjdCwgdGFzaXRzdW1fcDJfdG90YWxfaXRlbXNjb3JyZWN0LCB0YXNpdHN1bV9wM19ncmFuZHRvdGFsX2xpZXMsIHRhc2l0c3VtX3AzX2dyYW5kdG90YWxfc2FyY2FzbSkpKQoKIyBmaWx0ZXIgb3V0IHBhcnRpY2lwYW50cyB3aXRoIE5BIHJvd3MKc2NvZ19kZiA8LSBzY29nX2RmW3Jvd1N1bXMoaXMubmEoc2NvZ19kZikpIDwgMTgsIF0KCiMgZmlsdGVyIG91dCBUQVNJVCBzY29yZXMgd2l0aCAwCnNjb2dfZGYgPC0KICBzY29nX2RmICU+JQogIG11dGF0ZSh0YXNpdF9jb3JyZWN0X3RvdGFsID0gbmFfaWYodGFzaXRfY29ycmVjdF90b3RhbCwgMCksCiAgICAgICAgIHRhc2l0X3BhcnQyX2dyYW5kdG90YWwgPSBuYV9pZih0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsLCAwKSwKICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzID0gbmFfaWYodGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9saWVzLCAwKSwKICAgICAgICAgdGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtID0gbmFfaWYodGFzaXRfcGFydDNfZ3JhbmR0b3RhbF9zYXJjYXNtLCAwKSkKYGBgCgojIyMgUk1FVAoKVGhlICoqUmVhZGluZyB0aGUgTWluZCBpbiB0aGUgRXllcyB0ZXN0IChSTUVUKSoqICBpcyBhIHRlc3Qgb2Ygc29jaWFsIHNlbnNpdGl2aXR5LiBUaGUgcGFydGljaXBhbnQgaXMgcHJlc2VudGVkIHdpdGggYSBzZXJpZXMgb2YgMzYgcGhvdG9ncmFwaHMgb2YgdGhlIGV5ZSByZWdpb24gYW5kIGFza2VkIHRvIGNob29zZSB3aGljaCBvZiA0IHdvcmRzIGJlc3QgZGVzY3JpYmVzIHdoYXQgdGhlIGFjdG9yIGluIHRoZSBwaG90b2dyYXBoIGlzIHRoaW5raW5nIG9yIGZlZWxpbmcuCgpgYGB7ciBybWV0X2Rpc3RyaWJ1dGlvbn0KcGxvdF9seShzY29nX2RmICU+JQogICAgICAgICAgZ2F0aGVyKGtleSA9ICJhc3Nlc3NtZW50IiwgdmFsdWUgPSAic2NvcmUiLCAtYyhyZWNvcmRfaWQsIHN0dWR5LCBncm91cCkpICU+JQogICAgICAgICAgZmlsdGVyKGFzc2Vzc21lbnQgJWluJSBjKCJybWV0X3RvdGFsIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInJtZXRfdG90YWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlJNRVQgVG90YWwiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlJNRVQiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNjb3JlIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIyBJUkkKClRoZSAqKkludGVycGVyc29uYWwgUmVhY3Rpdml0eSBJbmRleCAoSVJJKSoqIGlzIGEgMjggaXRlbSBzZWxmLXJlcG9ydCBtZWFzdXJlIG9mIGNvZ25pdGl2ZSBhbmQgYWZmZWN0aXZlIGVtcGF0aHkuCgpgYGB7ciBpcmlfZGlzdHJpYnV0aW9ufQpwbG90X2x5KHNjb2dfZGYgJT4lCiAgICAgICAgICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJzY29yZSIsIC1jKHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwKSkgJT4lCiAgICAgICAgICBmaWx0ZXIoYXNzZXNzbWVudCAlaW4lIGMoImlyaV9mYWN0b3JfcHQiLCAiaXJpX2ZhY3Rvcl9mcyIsICJpcmlfZmFjdG9yX2VjIiwgImlyaV9mYWN0b3JfcGQiLCAiaXJpX3RvdGFsIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoImlyaV9mYWN0b3JfcHQiLCAiaXJpX2ZhY3Rvcl9mcyIsICJpcmlfZmFjdG9yX2VjIiwgImlyaV9mYWN0b3JfcGQiLCAiaXJpX3RvdGFsIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQZXJzcGVjdGl2ZS1UYWtpbmciLCAiRmFudGFzeSIsICJFbXBhdGhpYyBDb25jZXJuIiwgIlBlcnNvbmFsIERpc3RyZXNzIiwgIlRvdGFsIikpKSwKICAgICAgICB4ID0gfmFzc2Vzc21lbnQsIHkgPSB+c2NvcmUsIGNvbG9yID0gfmdyb3VwLCBzeW1ib2wgPSB+c3R1ZHksCiAgICAgICAgdHlwZSA9ICJib3giLCBib3hwb2ludHMgPSAiYWxsIiwgaml0dGVyID0gMC4zLCBwb2ludHBvcyA9IDAsCiAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLAogICAgICAgIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIGFzc2Vzc21lbnQsICI6ICIsIHNjb3JlKSwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJJUkkgU3VzYnNjYWxlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTY29yZSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgojIyMgVEFTSVQtUgoKKipUaGUgQXdhcmVuZXNzIG9mIFNvY2lhbCBJbmZlcmVuY2UgVGVzdC1SZXZpc2VkIChUQVNJVC1SKSoqIGNvbnNpc3RzIG9mIGVtb3Rpb24gZXZhbHVhdGlvbiAoKipQYXJ0IDEqKiksIHNvY2lhbCBpbmZlcmVuY2UgLSBtaW5pbWFsICgqKlBhcnQgMioqKSwgYW5kIHNvY2lhbCBpbmZlcmVuY2UgLSBlbnJpY2hlZCAoKipQYXJ0IDMqKikuIEluIFBhcnQgMSwgdGhlIHBhcnRpY2lwYW50IHZpZXdzIDI4IGJyaWVmIHZpZGVvIGNsaXBzIHRvIGlkZW50aWZ5IHRoZSBlbW90aW9uIGV4cHJlc3NlZCBieSB0aGUgYWN0b3IuIEluIFBhcnQgMiBhbmQgMywgdGhlIHBhcnRpY2lwYW50IHZpZXdzIDMxIHZpZGVvdGFwZWQgdmlnbmV0dGVzIG9mIHNvY2lhbCBpbnRlcmFjdGlvbnMgaW52b2x2aW5nIGxpZXMgYW5kIHNhcmNhc20gYW5kIG1ha2VzIGp1ZGdlbWVudHMgcmVnYXJkaW5nIHdoYXQgdGhlIGluZGl2aWR1YWwgaW4gdGhlIHNjZW5lIGJlbGlldmVkIG9yIGtuZXcsIG1lYW50IGJ5IHdoYXQgaGUgb3Igc2hlIHNhaWQsIGludGVuZGVkIHRvIGRvLCBhbmQgYWN0dWFsbHkgZmVsdC4KCmBgYHtyIHRhc2l0X2Rpc3RyaWJ1dGlvbnN9CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygidGFzaXRfY29ycmVjdF90b3RhbCIsICJ0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcyIsICJ0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20iKSkgJT4lCiAgICAgICAgICBtdXRhdGUoYXNzZXNzbWVudCA9IGZhY3Rvcihhc3Nlc3NtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygidGFzaXRfY29ycmVjdF90b3RhbCIsICJ0YXNpdF9wYXJ0Ml9ncmFuZHRvdGFsIiwgInRhc2l0X3BhcnQzX2dyYW5kdG90YWxfbGllcyIsICJ0YXNpdF9wYXJ0M19ncmFuZHRvdGFsX3NhcmNhc20iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBhcnQgMSIsICJQYXJ0IDIiLCAiUGFydCAzIExpZXMiLCAiUGFydCAzIFNhcmNhc20iKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlRBU0lULVIgU3VzYnNjYWxlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJTY29yZSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgojIyMgRVItNDAKClRoZSAqKlBlbm4gRW1vdGlvbiBSZWNvZ25pdGlvbiBUYXNrLTQwIChFUi00MCkqKiBpcyBhIG1lYXN1cmUgb2YgZW1vdGlvbmFsIHByb2Nlc3NpbmcuIFBhcnRpY2lwYW50cyByYXRlIHRoZSBlbW90aW9uYWwgdmFsZW5jZSBvZiA0MCBmYWNlcyBkaXNwbGF5aW5nIGhhcHB5LCBzYWQgb3IgbmV1dHJhbCBleHByZXNzaW9ucyBvbiBhIDcgcG9pbnQgc2NhbGUuIAoKYGBge3IgZXI0MF9jb3JyZWN0fQpwbG90X2x5KHNjb2dfZGYgJT4lCiAgICAgICAgICBnYXRoZXIoa2V5ID0gImFzc2Vzc21lbnQiLCB2YWx1ZSA9ICJzY29yZSIsIC1jKHJlY29yZF9pZCwgc3R1ZHksIGdyb3VwKSkgJT4lCiAgICAgICAgICBmaWx0ZXIoYXNzZXNzbWVudCAlaW4lIGMoInNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUiLCAic2NvZ19lcjQwYW5nX2NvbHVtbnYiLCAic2NvZ19lcjQwZmVhcl9jb2x1bW53IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvZ19lcjQwaGFwX2NvbHVtbngiLCAic2NvZ19lcjQwbm9lX2NvbHVtbnkiLCAic2NvZ19lcjQwc2FkX2NvbHVtbnoiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NvZ19lcjQwbWlsZF9jb2x1bW5hcCIsICJzY29nX2VyNDBleHRyX2NvbHVtbmFxIikpICU+JQogICAgICAgICAgbXV0YXRlKGFzc2Vzc21lbnQgPSBmYWN0b3IoYXNzZXNzbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoInNjb2dfZXI0MF9jcl9jb2x1bW5wY3JfdmFsdWUiLCAic2NvZ19lcjQwYW5nX2NvbHVtbnYiLCAic2NvZ19lcjQwZmVhcl9jb2x1bW53IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjb2dfZXI0MGhhcF9jb2x1bW54IiwgInNjb2dfZXI0MG5vZV9jb2x1bW55IiwgInNjb2dfZXI0MHNhZF9jb2x1bW56IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY29nX2VyNDBtaWxkX2NvbHVtbmFwIiwgInNjb2dfZXI0MGV4dHJfY29sdW1uYXEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNvcnJlY3QgUmVzcG9uc2VzIiwgIkNvcnJlY3QgQW5nZXIiLCAiQ29ycmVjdCBGZWFyIiwgIkNvcnJlY3QgSGFwcHkiLCAiQ29ycmVjdCBOZXV0cmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvcnJlY3QgU2FkIiwgIkNvcnJlY3QgTWlsZCIsICJDb3JyZWN0IEV4dHJlbWUiKSkpLAogICAgICAgIHggPSB+YXNzZXNzbWVudCwgeSA9IH5zY29yZSwgY29sb3IgPSB+Z3JvdXAsIHN5bWJvbCA9IH5zdHVkeSwKICAgICAgICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIsCiAgICAgICAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHJlY29yZF9pZCwKICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgYXNzZXNzbWVudCwgIjogIiwgc2NvcmUpLAogICAgICAgIG1vZGUgPSAibWFya2VycyIsCiAgICAgICAgbWFya2VyID0gbGlzdChjb2xvciA9ICIjMDAwIiwgb3BhY2l0eSA9IDAuNSkpICU+JQogIGxheW91dChib3htb2RlID0gImdyb3VwIiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkVSLTQwIFN1c2JzY2FsZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NvcmUiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKQSBtZWRpYW4gcmVzcG9uc2UgdGltZSBiZWxvdyAxMDAwIHNlY29uZHMgaW5kaWNhdGVzIGluYXR0ZW50aW9uIGFuZCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0IGZyb20gZnVydGhlciBhbmFseXNpcy4KCmBgYHtyIGVyNDBfcnR9CnBsb3RfbHkoc2NvZ19kZiAlPiUKICAgICAgICAgIGdhdGhlcihrZXkgPSAiYXNzZXNzbWVudCIsIHZhbHVlID0gInNjb3JlIiwgLWMocmVjb3JkX2lkLCBzdHVkeSwgZ3JvdXApKSAlPiUKICAgICAgICAgIGZpbHRlcihhc3Nlc3NtZW50ICVpbiUgYygic2NvZ19lcjQwX2NydF9jb2x1bW5xY3J0X3ZhbHVlIiwgInNjb2dfZXI0MG1kcnRfY29sdW1uYXIiLCAic2NvZ19lcjQwZXhydF9jb2x1bW5hcyIpKSAlPiUKICAgICAgICAgIG11dGF0ZShhc3Nlc3NtZW50ID0gZmFjdG9yKGFzc2Vzc21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJzY29nX2VyNDBfY3J0X2NvbHVtbnFjcnRfdmFsdWUiLCAic2NvZ19lcjQwbWRydF9jb2x1bW5hciIsICJzY29nX2VyNDBleHJ0X2NvbHVtbmFzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDb3JyZWN0IFJlc3BvbnNlcyIsICJDb3JyZWN0IE1pbGQiLCAiQ29ycmVjdCBFeHRyZW1lIikpKSwKICAgICAgICB4ID0gfmFzc2Vzc21lbnQsIHkgPSB+c2NvcmUsIGNvbG9yID0gfmdyb3VwLCBzeW1ib2wgPSB+c3R1ZHksCiAgICAgICAgdHlwZSA9ICJib3giLCBib3hwb2ludHMgPSAiYWxsIiwgaml0dGVyID0gMC4zLCBwb2ludHBvcyA9IDAsCiAgICAgICAgaG92ZXJpbmZvID0gInRleHQiLAogICAgICAgIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCByZWNvcmRfaWQsCiAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIGFzc2Vzc21lbnQsICI6ICIsIHNjb3JlKSwKICAgICAgICBtb2RlID0gIm1hcmtlcnMiLAogICAgICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsIG9wYWNpdHkgPSAwLjUpKSAlPiUKICBsYXlvdXQoYm94bW9kZSA9ICJncm91cCIsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJFUi00MCBTdXNic2NhbGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lZGlhbiBSZXNwb25zZSBUaW1lIChzZWNvbmRzKSIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgoKCgpgYGB7ciBzcGlucyB6IHRyYW5zZm9ybWF0aW9uLCBpbmNsdWRlPUZBTFNFfQpzcGluX25wX2RmIDwtCiByZWFkX2NzdigKICIvc2NyYXRjaC9uc2hhcm1hL1NQSU4tQVNEcmRvYy9zcGluX25wX2RmLmNzdiIpCgojenNjb3JlX2RmID0gZGF0YS5mcmFtZSgpCmNhc2VzID0gc3Bpbl9ucF9kZltzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gJ2Nhc2UnLF0KY29udHJvbHMgPSBzcGluX25wX2RmW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAnY29udHJvbCcsXQoKbWVhbl9NQVRSSUNTID0gbWVhbihjb250cm9scyRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCnNkX01BVFJJQ1MgPSBzZChjb250cm9scyRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9NQVRSSUNTID0gKGNhc2VzJG5wX2NvbXBvc2l0ZV90c2NvcmUgLSBtZWFuX01BVFJJQ1MpLyBzZF9NQVRSSUNTCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9NQVRSSUNTKQoKbWVhbl9NQVRSSUNTID0gbWVhbihjb250cm9scyRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCnNkX01BVFJJQ1MgPSBzZChjb250cm9scyRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9NQVRSSUNTID0gKGNvbnRyb2xzJG5wX2NvbXBvc2l0ZV90c2NvcmUgLSBtZWFuX01BVFJJQ1MpLyBzZF9NQVRSSUNTCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9NQVRSSUNTKQoKbWVhbl9STUVUID0gbWVhbihjb250cm9scyRzY29nX3JtZXRfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfUk1FVCA9IHNkKGNvbnRyb2xzJHNjb2dfcm1ldF90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfUk1FVCA9IChjYXNlcyRzY29nX3JtZXRfdG90YWwgLSBtZWFuX1JNRVQpIC8gc2RfUk1FVAojenNjb3JlX2RmID0gY2JpbmQoenNjb3JlX2RmLCBjYXNlcyR6c2NvcmVfUk1FVCkKCm1lYW5fUk1FVCA9IG1lYW4oY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX1JNRVQgPSBzZChjb250cm9scyRzY29nX3JtZXRfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX1JNRVQgPSAoY29udHJvbHMkc2NvZ19ybWV0X3RvdGFsIC0gbWVhbl9STUVUKSAvIHNkX1JNRVQKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX1JNRVQpCgptZWFuX0JTRlM9IG1lYW4oY29udHJvbHMkYnNmc190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTID0gc2QoY29udHJvbHMkYnNmc190b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGUyA9IChjYXNlcyRic2ZzX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX0JTRlMpCgptZWFuX0JTRlM9IG1lYW4oY29udHJvbHMkYnNmc190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTID0gc2QoY29udHJvbHMkYnNmc190b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGUyA9IChjb250cm9scyRic2ZzX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX0JTRlMpCgptZWFuX0lRID0gbWVhbihjb250cm9scyR3dGFyX3N0ZF9zY29yZSwgbmEucm0gPSBUUlVFKQpzZF9JUSA9IHNkKGNvbnRyb2xzJHd0YXJfc3RkX3Njb3JlLCBuYS5ybSA9IFRSVUUpCmNhc2VzJHpzY29yZV9JUSA9IChjYXNlcyR3dGFyX3N0ZF9zY29yZSAtIG1lYW5fSVEpIC8gc2RfSVEKI3pzY29yZV9kZiA9IGNiaW5kKHpzY29yZV9kZiwgY2FzZXMkenNjb3JlX0lRKQoKbWVhbl9JUSA9IG1lYW4oY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUsIG5hLnJtID0gVFJVRSkKc2RfSVEgPSBzZChjb250cm9scyR3dGFyX3N0ZF9zY29yZSwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfSVEgPSAoY29udHJvbHMkd3Rhcl9zdGRfc2NvcmUgLSBtZWFuX0lRKSAvIHNkX0lRCiN6c2NvcmVfZGYgPSBjYmluZCh6c2NvcmVfZGYsIGNhc2VzJHpzY29yZV9JUSkKCnpzY29yZV9kZj0gY2JpbmQoY2FzZXMkenNjb3JlX01BVFJJQ1MsY29udHJvbHMkenNjb3JlX01BVFJJQ1MsY2FzZXMkenNjb3JlX1JNRVQsY29udHJvbHMkenNjb3JlX1JNRVQsY2FzZXMkenNjb3JlX0lRLCBjb250cm9scyR6c2NvcmVfSVEsIGNhc2VzJHpzY29yZV9CU0ZTLGNvbnRyb2xzJHpzY29yZV9CU0ZTKQoKenNjb3JlX2RmPSByYmluZChjYXNlcyxjb250cm9scykKCiNzcGluX25wX2RmJGJzZnNfc2VjN190b3RhbCA8LSByb3dTdW1zKEJTRlNfZGZbLGMoJ2JzZnNfc2VjN195X3RvdGFsXzdhJywgJ2JzZnNfc2VjN19uX3RvdGFsXzdiJyldLCBuYS5ybT1UUlVFKQojc3Bpbl9ucF9kZltCU0ZTX2RmJGJzZnNfc2VjN190b3RhbCA9PTAsJ2JzZnNfc2VjN190b3RhbCddIDwtIE5BCgptZWFuX0JTRlMgPSBtZWFuKGNhc2VzJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjYXNlcyRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0JTRlNfc2VjMSA9IChjYXNlcyRic2ZzX3NlYzFfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjb250cm9scyRic2ZzX3NlYzFfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzEgPSAoY29udHJvbHMkYnNmc19zZWMxX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWMyID0gKGNhc2VzJGJzZnNfc2VjMl90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlM9IG1lYW4oY29udHJvbHMkYnNmc19zZWMyX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNvbnRyb2xzJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9scyR6c2NvcmVfQlNGU19zZWMyID0gKGNvbnRyb2xzJGJzZnNfc2VjMl90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNhc2VzJGJzZnNfc2VjM190b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjYXNlcyRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0JTRlNfc2VjMyA9IChjYXNlcyRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjb250cm9scyRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzMgPSAoY29udHJvbHMkYnNmc19zZWMzX3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWM0ID0gKGNhc2VzJGJzZnNfc2VjNF90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzRfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjND0gKGNvbnRyb2xzJGJzZnNfc2VjNF90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNhc2VzJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjYXNlcyRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZXMkenNjb3JlX0JTRlNfc2VjNSA9IChjYXNlcyRic2ZzX3NlYzVfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKbWVhbl9CU0ZTID0gbWVhbihjb250cm9scyRic2ZzX3NlYzVfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGUz0gc2QoY29udHJvbHMkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzUgPSAoY29udHJvbHMkYnNmc19zZWM1X3RvdGFsIC0gbWVhbl9CU0ZTKSAvIHNkX0JTRlMKCm1lYW5fQlNGUyA9IG1lYW4oY2FzZXMkYnNmc19zZWM2X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlM9IHNkKGNhc2VzJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlcyR6c2NvcmVfQlNGU19zZWM2ID0gKGNhc2VzJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGUykgLyBzZF9CU0ZTCgptZWFuX0JTRlMgPSBtZWFuKGNvbnRyb2xzJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTPSBzZChjb250cm9scyRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNiA9IChjb250cm9scyRic2ZzX3NlYzZfdG90YWwgLSBtZWFuX0JTRlMpIC8gc2RfQlNGUwoKCnpzY29yZV9kZj0gY2JpbmQoY2FzZXMkenNjb3JlX0JTRlNfc2VjMSwgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjMSxjYXNlcyR6c2NvcmVfQlNGU19zZWMyLCBjb250cm9scyR6c2NvcmVfQlNGU19zZWMyLGNhc2VzJHpzY29yZV9CU0ZTX3NlYzMsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzMsY2FzZXMkenNjb3JlX0JTRlNfc2VjNCwgY29udHJvbHMkenNjb3JlX0JTRlNfc2VjNCxjYXNlcyR6c2NvcmVfQlNGU19zZWM1LCBjb250cm9scyR6c2NvcmVfQlNGU19zZWM1LGNhc2VzJHpzY29yZV9CU0ZTX3NlYzYsIGNvbnRyb2xzJHpzY29yZV9CU0ZTX3NlYzYpCnpzY29yZV9kZj0gcmJpbmQoY2FzZXMsY29udHJvbHMpCgoKCmBgYAoKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKQlNGU19kZjwtCiAgIHJlYWRfY3N2KAogIi9zY3JhdGNoL25zaGFybWEvU1BJTi1BU0RyZG9jL0JTRlNfZGYuY3N2IiklPiUKICAKbXV0YXRlKHN0dWR5ID0gIlNQQVNEIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzEiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ2FzZSIpICU+JQogICAgICAgICAgICAgICAgICAgIGZhY3RvciguKSkgJT4lICAgICAgIApzZWxlY3QoLWMocmVkY2FwX2V2ZW50X25hbWUpKSAlPiUKICBncm91cF9ieShyZWNvcmRfaWQpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJkb3duIikgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gInVwIikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgdW5ncm91cCgpCgpic2ZzX2FzZF9jYXNlIDwtCiAgQlNGU19kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNhc2UiKSAlPiUKICBucm93KCkKCmJzZnNfYXNkX2NvbnRyb2wgPC0KICBCU0ZTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG5yb3coKQoKCmJzZnNfcHJlcGFuIDwtCiAgQlNGU19kZiAlPiUKICBmaWx0ZXIoYnNmc19kb2EgPCAiMjAyMi0wNi0wNyIpJT4lCiAgbnJvdygpCgpic2ZzX2R1cnBhbiA8LQogIEJTRlNfZGYgJT4lCiAgZmlsdGVyKGJzZnNfZG9hID4gIjIwMjItMDctMTEiKSU+JQogIG5yb3coKQoKCiNCU0ZTX2RmJGJzZnNfcHJlcGFuIDwtIChCU0ZTX2RmWycyMDIyLTA2LTA3J10pCgpCU0ZTX2RmX3BhbiA8LSBCU0ZTX2RmICU+JSBhcy5kYXRhLmZyYW1lICU+JQogIG11dGF0ZShic2ZzX3ByZXBhbiA9IGlmZWxzZShCU0ZTX2RmJGJzZnNfZG9hIDwgIjIwMjAtMDMtMTUiLCAicHJlcGFuIiwgIm90aGVyIikpCkJTRlNfZGZfcGFuW2lzLm5hKEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuKSwgImJzZnNfcHJlcGFuIl0gPC0gIm90aGVyIgoKI0JTRlNfZGZbQlNGU19kZiRic2ZzX3ByZXBhbiA9PTAsJ2JzZnNfcHJlcGFuJ10gPC0gTkEKCgoKQlNGU19kZiRic2ZzX2FzZF90b3RhbCA8LSByb3dTdW1zKEJTRlNfZGZbLGMoJ2JzZnNfc2VjX2dyYW5kdG90YWwxJywgJ2JzZnNfc2VjX2dyYW5kdG90YWwyJyldLCBuYS5ybT1UUlVFKQpCU0ZTX2RmW0JTRlNfZGYkYnNmc19hc2RfdG90YWwgPT0wLCdic2ZzX2FzZF90b3RhbCddIDwtIE5BCgoKCiNCU0ZTX2RmJGJzZnNfc2VjN190b3RhbD1yYmluZChic2ZzX3NlYzdfeV90b3RhbF83YSwgYnNmc19zZWM3X25fdG90YWxfN2IpCgojQlNGU19kZiRic2ZzX3NlYzdfdG90YWwgPC0gcm93U3VtcyhCU0ZTX2RmWyxjKCdic2ZzX3NlYzdfeV90b3RhbF83YScsICdic2ZzX3NlYzdfbl90b3RhbF83YicpXSwgbmEucm09VFJVRSkKI0JTRlNfZGZbQlNGU19kZiRic2ZzX3NlYzdfdG90YWwgPT0wLCdic2ZzX3NlYzdfdG90YWwnXSA8LSBOQQoKCmBgYAoKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgpBQkFTX2RmPC0KICAgcmVhZF9jc3YoCiAiL3NjcmF0Y2gvbnNoYXJtYS9TUElOLUFTRHJkb2MvQUJBU19kZi5jc3YiKSAlPiUKICAKbXV0YXRlKHN0dWR5ID0gIlNQQVNEIiwKICAgICAgICAgZ3JvdXAgPSBjYXNlX3doZW4oZ3JlcGwoImFybV8yIiwgcmVkY2FwX2V2ZW50X25hbWUpIH4gIkNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiYXJtXzEiLCByZWRjYXBfZXZlbnRfbmFtZSkgfiAiQ2FzZSIpICU+JQogICAgICAgICAgICAgICAgICAgIGZhY3RvciguKSkgJT4lICAgICAgIApzZWxlY3QoLWMocmVkY2FwX2V2ZW50X25hbWUpKSAlPiUKICBncm91cF9ieShyZWNvcmRfaWQpICU+JQogIGZpbGwoLXJlY29yZF9pZCwgLmRpcmVjdGlvbiA9ICJkb3duIikgJT4lCiAgZmlsbCgtcmVjb3JkX2lkLCAuZGlyZWN0aW9uID0gInVwIikgJT4lCiAgc2xpY2UoMSkgJT4lCiAgdW5ncm91cCgpCgphYmFzX2FzZF9jYXNlIDwtCiAgQUJBU19kZiAlPiUKICBmaWx0ZXIoZ3JvdXAgPT0gIkNhc2UiKSAlPiUKICBucm93KCkKCmFiYXNfYXNkX2NvbnRyb2wgPC0KICBBQkFTX2RmICU+JQogIGZpbHRlcihncm91cCA9PSAiQ29udHJvbCIpICU+JQogIG5yb3coKQoKQUJBU19kZiRhYmFzX2FzZF90b3RhbCA8LSByb3dTdW1zKEFCQVNfZGZbLGMoJ2FiYXNfZ2FjJywgJ2FiYXNfZ2FjMScsICJhYmFzX2dhYzIiKV0sIG5hLnJtPVRSVUUpCkFCQVNfZGZbQUJBU19kZiRhYmFzX2FzZF90b3RhbCA9PSAwLCdhYmFzX2FzZF90b3RhbCddIDwtIE5BIApgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNwYXNkX2RlbW9fZGYgCmNhc2VfYXNkID0gc3Bhc2RfZGVtb19kZltzcGFzZF9kZW1vX2RmJGdyb3VwPT0nQ2FzZScsXQpjb250cm9sX2FzZCA9IHNwYXNkX2RlbW9fZGZbc3Bhc2RfZGVtb19kZiRncm91cD09J0NvbnRyb2wnLF0KCm1lYW5fTUFUUklDU3NkID0gbWVhbihjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCnNkX01BVFJJQ1NzZCA9IHNkKGNvbnRyb2xfYXNkJG5wX2NvbXBvc2l0ZV90c2NvcmUsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX01BVFJJQ1NzZCA9IChjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlIC0gbWVhbl9NQVRSSUNTc2QpIC8gc2RfTUFUUklDU3NkCiN6c2NvcmVfYXNkID0gY2JpbmQoenNjb3JlX2FzZCwgY29udHJvbF9hc2QkenNjb3JlX01BVFJJQ1NzZCkKCgptZWFuX01BVFJJQ1NzZCA9IG1lYW4oY29udHJvbF9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSwgbmEucm0gPSBUUlVFKQpzZF9NQVRSSUNTc2QgPSBzZChjb250cm9sX2FzZCRucF9jb21wb3NpdGVfdHNjb3JlLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9NQVRSSUNTc2QgPSAoY2FzZV9hc2QkbnBfY29tcG9zaXRlX3RzY29yZSAtIG1lYW5fTUFUUklDU3NkKS8gc2RfTUFUUklDU3NkCiN6c2NvcmVfYXNkID0gY2JpbmQoenNjb3JlX2FzZCwgY2FzZV9hc2QkenNjb3JlX01BVFJJQ1NzZCkKCgptYXRyaWNzX2FzZF96c2NvcmUgPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfTUFUUklDU3NkLGNvbnRyb2xfYXNkJHpzY29yZV9NQVRSSUNTc2QpCgptYXRyaWNzX2FzZF96c2NvcmUgPSByYmluZChjYXNlX2FzZCxjb250cm9sX2FzZCkKCmBgYAoKYGBge3IgaW5jbHVkZT1GQUxTRX0KCkJTRlNfZGYKCmNhc2VfYXNkID0gQlNGU19kZltCU0ZTX2RmJGdyb3VwPT0nQ2FzZScsXQpjb250cm9sX2FzZCA9IEJTRlNfZGZbQlNGU19kZiRncm91cD09J0NvbnRyb2wnLF0KIAptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX2FzZF90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkID0gKGNhc2VfYXNkJGJzZnNfYXNkX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19hc2RfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX2FzZF90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkID0gKGNvbnRyb2xfYXNkJGJzZnNfYXNkX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgojYnNmc19hc2RfenNjb3JlPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfQlNGU3NkLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkKQojYnNmc19hc2RfenNjb3JlPSByYmluZChjYXNlX2FzZCxjb250cm9sX2FzZCkKCgojenNjb3JlX2FzZD1jYmluZCh6c2NvcmVfYXNkLCBCU0ZTX2RmKQoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjMV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEgPSAoY2FzZV9hc2QkYnNmc19zZWMxX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWMxX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMSA9IChjb250cm9sX2FzZCRic2ZzX3NlYzFfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzJfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWMyID0gKGNhc2VfYXNkJGJzZnNfc2VjMl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjMl90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzIgPSAoY29udHJvbF9hc2QkYnNmc19zZWMyX3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY2FzZV9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY2FzZV9hc2QkYnNmc19zZWMzX3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNhc2VfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMyA9IChjYXNlX2FzZCRic2ZzX3NlYzNfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjb250cm9sX2FzZCRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjb250cm9sX2FzZCRic2ZzX3NlYzNfdG90YWwsIG5hLnJtID0gVFJVRSkKY29udHJvbF9hc2QkenNjb3JlX0JTRlNzZF9zZWMzID0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjM190b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjNF90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQgPSAoY2FzZV9hc2QkYnNmc19zZWM0X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWM0X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjND0gKGNvbnRyb2xfYXNkJGJzZnNfc2VjNF90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNhc2VfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNhc2VfYXNkJGJzZnNfc2VjNV90b3RhbCwgbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUgPSAoY2FzZV9hc2QkYnNmc19zZWM1X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgptZWFuX0JTRlNzZCA9IG1lYW4oY29udHJvbF9hc2QkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCnNkX0JTRlNzZD0gc2QoY29udHJvbF9hc2QkYnNmc19zZWM1X3RvdGFsLCBuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNSA9IChjb250cm9sX2FzZCRic2ZzX3NlYzVfdG90YWwgLSBtZWFuX0JTRlNzZCkgLyBzZF9CU0ZTc2QKCm1lYW5fQlNGU3NkID0gbWVhbihjYXNlX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKc2RfQlNGU3NkPSBzZChjYXNlX2FzZCRic2ZzX3NlYzZfdG90YWwsIG5hLnJtID0gVFJVRSkKY2FzZV9hc2QkenNjb3JlX0JTRlNzZF9zZWM2ID0gKGNhc2VfYXNkJGJzZnNfc2VjNl90b3RhbCAtIG1lYW5fQlNGU3NkKSAvIHNkX0JTRlNzZAoKbWVhbl9CU0ZTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpzZF9CU0ZTc2Q9IHNkKGNvbnRyb2xfYXNkJGJzZnNfc2VjNl90b3RhbCwgbmEucm0gPSBUUlVFKQpjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzYgPSAoY29udHJvbF9hc2QkYnNmc19zZWM2X3RvdGFsIC0gbWVhbl9CU0ZTc2QpIC8gc2RfQlNGU3NkCgoKYnNmc19hc2RfenNjb3JlPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzEsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMSxjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzIsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMixjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzMsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjMyxjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzQsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNCxjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzUsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNSxjYXNlX2FzZCR6c2NvcmVfQlNGU3NkX3NlYzYsIGNvbnRyb2xfYXNkJHpzY29yZV9CU0ZTc2Rfc2VjNikKYnNmc19hc2RfenNjb3JlPSByYmluZChjYXNlX2FzZCxjb250cm9sX2FzZCkKCmBgYAoKCgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KQUJBU19kZgoKY2FzZV9hc2QgPSBBQkFTX2RmW0FCQVNfZGYkZ3JvdXA9PSdDYXNlJyxdCmNvbnRyb2xfYXNkID0gQUJBU19kZltBQkFTX2RmJGdyb3VwPT0nQ29udHJvbCcsXQoKbWVhbl9BQkFTc2QgPSBtZWFuKGNvbnRyb2xfYXNkJGFiYXNfYXNkX3RvdGFsLG5hLnJtID0gVFJVRSkKc2RfQUJBU3NkPSBzZChjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCmNvbnRyb2xfYXNkJHpzY29yZV9BQkFTc2QgPSAoY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwgLSBtZWFuX0FCQVNzZCkgLyBzZF9BQkFTc2QKCm1lYW5fQUJBU3NkID0gbWVhbihjb250cm9sX2FzZCRhYmFzX2FzZF90b3RhbCxuYS5ybSA9IFRSVUUpCnNkX0FCQVNzZD0gc2QoY29udHJvbF9hc2QkYWJhc19hc2RfdG90YWwsbmEucm0gPSBUUlVFKQpjYXNlX2FzZCR6c2NvcmVfQUJBU3NkID0gKGNhc2VfYXNkJGFiYXNfYXNkX3RvdGFsIC0gbWVhbl9BQkFTc2QpIC8gc2RfQUJBU3NkCgoKYWJhc19hc2RfenNjb3JlPSBjYmluZChjYXNlX2FzZCR6c2NvcmVfQUJBU3NkLGNvbnRyb2xfYXNkJHpzY29yZV9BQkFTc2QpCmFiYXNfYXNkX3pzY29yZT0gcmJpbmQoY2FzZV9hc2QsY29udHJvbF9hc2QpCgojenNjb3JlX2FzZD1jYmluZCh6c2NvcmVfYXNkICwgQUJBU19kZikKI3pzY29yZV9hc2Q9IGNiaW5kKGNhc2VfYXNkJHpzY29yZV9BQkFTc2QsY29udHJvbF9hc2QkenNjb3JlX0FCQVNzZCxjYXNlX2FzZCR6c2NvcmVfQlNGU3NkLCBjb250cm9sX2FzZCR6c2NvcmVfQlNGU3NkKQoKI0FCQVNfZGYgPC0gcmJpbmQoc3Bhc2RfZGVtb19kZixCU0ZTX2RmKQoKCmBgYAoKCgpgYGB7cn0KCiNtYXRyaWNzIHNjb3JlIG9mIHNwaW5zIHZpb2xpbiBwbG90CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX01BVFJJQ1MpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAoKI1JNRVQgU2NvcmUgb2Ygc3BpbnMgdmlvbGluIHBsb3QKI2dncGxvdCh6c2NvcmVfZGYsIGFlcyhkaWFnbm9zdGljX2dyb3VwLCB6c2NvcmVfUk1FVCkpICsKICAgICNnZW9tX3Zpb2xpbigpICtnZW9tX3BvaW50KCkgCiNCaXJjaHdvb2QgU0ZTIFNjb3JlIG9mIHNwaW5zIHZpb2xpbiBwbG90CiNnZ3Bsb3QoenNjb3JlX2RmLCBhZXMoZGlhZ25vc3RpY19ncm91cCwgenNjb3JlX0JTRlMpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAoKI0VzdGltYXRlZCBJUSBvZiBzcGlucyB2aW9saW4gcGxvdCAKI2dncGxvdCh6c2NvcmVfZGYsIGFlcyhkaWFnbm9zdGljX2dyb3VwLCB6c2NvcmVfSVEpKSArCiAgICAjZ2VvbV92aW9saW4oKSArZ2VvbV9wb2ludCgpIAoKYGBgCgpgYGB7cn0KI2dncGxvdCh6c2NvcmVfZGYsIGFlcyhkaWFnbm9zdGljX2dyb3VwLCB6c2NvcmVfQlNGUykpICsKICAgICNnZW9tX3Zpb2xpbigpICtnZW9tX3BvaW50KCkKYGBgCgojIyBTY29yZSBEaXN0cmlidXRpb25zIAoKCiMjIyBCaXJjaHdvb2QgU29jaWFsIEZ1bmN0aW9uaW5nIFNjYWxlOgpBIHNlbGYtcmVwb3J0IHF1ZXN0aW9ubmFpcmUgZGVzaWduZWQgdG8gcmVmbGVjdCB0aGUgc29jaWFsIHNraWxscyBhbmQgcGVyZm9ybWFuY2VzIG9mIHBhdGllbnRzCgoKKipCU0ZTIFNlY3Rpb24gMSoqCi1Bc3Nlc3MgU29jaWFsIEVuZ2FnZW1lbnQvV2l0aGRyYXduIHdpdGggYSB0b3RhbCBzY29yZSBiZXR3ZWVuIDAgYW5kIDE1IGV4IGhvdXJzIHNwZW50IGFsb25lIHZzIGxlYXZpbmcgdGhlIGhvdXNlCmBgYHtyfQpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMxX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzFfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uCmBgYAoKCiAKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyoqU2VjdGlvbiAxOiBQcmUgYW5kIFBvc3QgUGFuZGVtaWMqKgojIENvbXBhcmVzIHRoZSBzY29yZXMgb2Ygc2VjdGlvbiAxIG9uIHRoZSBCaXJjaHdvb2QgQXNzZXNtZW50IHByaW9yIHRvIHRoZSBDb3ZpZC0xOSBQYW5kZW1pYyB2cyBBZnRlciB0aGUgUGFuZGVtaWMgYmV0d2VlbiBTUElOLUFTRCBhbmQgU1BJTlMgU3R1ZGllcyAKCkJTRlNfc2VjMV9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzFfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMxX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJwcmVwYW4iXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMxX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0icHJlcGFuIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjMV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzFfZGlzdHJpYnV0aW9uCgpgYGAKCgoKKipCU0ZTIFNlY3Rpb24gMioqCi1Mb29rcyBhdCBJbnRlcnBlcnNvbmFsIENvbW11bmljYXRpb24gYW5kIFJlbGF0aW9uc2hpcHMgd2l0aCBhIHRvdGFsIHNjb3JlIGJldHdlZW4gMCBhbmQgMzAgZXggaGF2aW5nIHNvbWVvbmUgdG8gZGlzY3VzcyBwcm9ibGVtcyB3aXRoIApgYGB7cn0KQlNGU19zZWMyX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzJfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMyX3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWMyX2Rpc3RyaWJ1dGlvbgpgYGAKCgogCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiAjKipTZWN0aW9uIDI6IFByZSBhbmQgUG9zdCBQYW5kZW1pYyoqCiAjLUNvbXBhcmVzIHRoZSBzY29yZXMgb2Ygc2VjdGlvbiAzIG9uIHRoZSBCaXJjaHdvb2QgQXNzZXNtZW50IHByaW9yIHRvIHRoZSBDb3ZpZC0xOSBQYW5kZW1pYyB2cyBBZnRlciB0aGUgUGFuZGVtaWMgYmV0d2VlbiBTUElOLUFTRCBhbmQgU1BJTlMgU3R1ZGllcyAKQlNGU19zZWMyX2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjMl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzJfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMyX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzJfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMyX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMyX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjMl9kaXN0cmlidXRpb24KCmBgYAoKCgoKCioqQlNGUyBTZWN0aW9uIDMqKgotRm9jdXNlcyBvbiBJbnRlcnBlcnNvbmFsIFByb3NvY2lhbCBhY3Rpdml0aWVzIGV4IGdvaW5nIHZpc2l0aW5nIHJlbGF0aXZlcyBhbmQgZ29pbmcgdG8gdGhlIG1vdmllcywgd2l0aCBhIHRvdGFsIHNjb3JlIGJldHdlZW4gMCBhbmQgNjYKYGBge3J9CgpCU0ZTX3NlYzNfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMzX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjM190b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjM190b3RhbFtCU0ZTX2RmJGdyb3VwID09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWMzX3RvdGFsW0JTRlNfZGYkZ3JvdXAgPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjM19kaXN0cmlidXRpb24KCmBgYAoKCgoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyoqU2VjdGlvbiAzOiBQcmUgYW5kIFBvc3QgUGFuZGVtaWMqKgojIC1Db21wYXJlcyB0aGUgc2NvcmVzIG9mIHNlY3Rpb24gMyBvbiB0aGUgQmlyY2h3b29kIEFzc2VzbWVudCBwcmlvciB0byB0aGUgQ292aWQtMTkgUGFuZGVtaWMgdnMgQWZ0ZXIgdGhlIFBhbmRlbWljIGJldHdlZW4gU1BJTi1BU0QgYW5kIFNQSU5TIFN0dWRpZXMgCkJTRlNfc2VjM19kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWMzX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjM190b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJwcmVwYW4iXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0icHJlcGFuIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjM190b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjM190b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzNfZGlzdHJpYnV0aW9uCgojIGdncGxvdChzcGluX25wX2RmLCBhZXMoeCA9IGRpYWdub3N0aWNfZ3JvdXAsIHkgPSBic2ZzX3NlYzNfdG90YWwpKSArCiMgICBnZW9tX2JveHBsb3QoKQojIGdncGxvdChCU0ZTX2RmX3BhbiwgYWVzKHggPSBncm91cCwgeSA9IGJzZnNfc2VjM190b3RhbCkpICsKIyAgIGdlb21fYm94cGxvdCgpICsKIyAgIGZhY2V0X2dyaWQoLn5ic2ZzX3ByZXBhbikKCiMgU1BBU0Rfc2VjMyA8LSBCU0ZTX2RmX3BhblssYygyOTo1MCwgMTIzLCAxMjQpXQojIGxpYnJhcnkocmVzaGFwZSkKIyBTUEFTRF9zZWMzX21lbHQgPC0gbWVsdChTUEFTRF9zZWMzLCBtZWFzdXJlLnZhcnMgPSAxOjIyKQojIAojIGFsbHNlYzMgPC0gZ2dwbG90KFNQQVNEX3NlYzNfbWVsdCwgYWVzKHggPSBncm91cCwgeSA9IHZhbHVlLCBmaWxsID0gZ3JvdXApKSArCiMgICBnZW9tX2JveHBsb3QoKSsKIyAgIGZhY2V0X2dyaWQoYnNmc19wcmVwYW5+dmFyaWFibGUpICsKIyAgIHlsaW0oLTEsIDQpCiMgCiMgYWxsc2VjMwojIAojIChTUEFTRF9CU0ZTX3NlYzNfZGlzdHJpYnV0aW9uIDwtCiMgcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKIyAgICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKIyAgIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3EzX3Nwb3J0c1tCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJwcmVwYW4iXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQojICAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzNfcTNfc3BvcnRzW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0icHJlcGFuIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKIyAgIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3EzX3Nwb3J0c1tCU0ZTX2RmX3BhbiRncm91cD09ICJDb250cm9sIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIyAgIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWMzX3EzX3Nwb3J0c1tCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09ICJvdGhlciJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKG90aGVyKSIpICAlPiUKIyAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAojICAgICAgICAgIGZvbnQgPSB0LAojICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiMgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQojICAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpKQojIAojIHNwaW5zX3NlbGVjdCA8LSBzcGluX25wX2RmICU+JSBzZWxlY3QoYnNmc19zZWMxX3RvdGFsLCBic2ZzX3NlYzJfdG90YWwsIGJzZnNfc2VjM190b3RhbCwgYnNmc19zZWM0X3RvdGFsLCBic2ZzX3NlYzVfdG90YWwsIGJzZnNfc2VjNl90b3RhbCkKIyAKIyBzcGFzZF9zZWxlY3QgPC0gQlNGU19kZl9wYW4gJT4lIHNlbGVjdChncm91cCxic2ZzX3NlYzFfdG90YWwsIGJzZnNfc2VjMl90b3RhbCwgYnNmc19zZWMzX3RvdGFsLCBic2ZzX3NlYzRfdG90YWwsIGJzZnNfc2VjNV90b3RhbCwgYnNmc19zZWM2X3RvdGFsKQojIHNwYXNkX3NlbGVjdCA8LSBzcGFzZF9zZWxlY3RbY29tcGxldGUuY2FzZXMoc3Bhc2Rfc2VsZWN0KSxdCiMgCiMgc3Bpbi5wY2EgPC0gZXBQQ0Eoc3BpbnNfc2VsZWN0LCBERVNJR04gPSBzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXApCiMgc3Bhc2QucGNhIDwtIGVwUENBKHNwYXNkX3NlbGVjdFssLTFdLCBERVNJR04gPSBzcGFzZF9zZWxlY3QkZ3JvdXApCgoKCgoKCmBgYAoKCgoKCgoqKkJTRlMgU2VjdGlvbiA0KioKLUxvb2tzIGF0IHBhdGllbnRzIGludm9sdmVtZW50IGluIFJlY3JlYXRpb25hbCBBY3Rpdml0aWVzIHdpdGggYSBzY29yZSBiZXR3ZWVuIDAgYW5kIDQ4ICBleCBjb29raW5nIGFuZCBwbGF5aW5nIGFuIGluc3RydW1lbnQgCmBgYHtyfQpCU0ZTX3NlYzRfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM0X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNF90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNF90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzRfZGlzdHJpYnV0aW9uCgpgYGAKCgogCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMjKipTZWN0aW9uIDQ6IFByZSBhbmQgUG9zdCBQYW5kZW1pYyoqCiAjLUNvbXBhcmVzIHRoZSBzY29yZXMgb2Ygc2VjdGlvbiAzIG9uIHRoZSBCaXJjaHdvb2QgQXNzZXNtZW50IHByaW9yIHRvIHRoZSBDb3ZpZC0xOSBQYW5kZW1pYyB2cyBBZnRlciB0aGUgUGFuZGVtaWMgYmV0d2VlbiBTUElOLUFTRCBhbmQgU1BJTlMgU3R1ZGllcyAKQlNGU19zZWM0X2Rpc3RyaWJ1dGlvbiA8LQpwbG90X2x5KGFscGhhID0gMC42LCBhdXRvYmlueCA9IEZBTFNFLAogICAgICAgICAgeGJpbnMgPSBsaXN0KHN0YXJ0ID0wLCBlbmQgPSAyMCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNF90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNvbnRyb2wiXSxuYW1lID0gIkNvbnRyb2wgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzRfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM0X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gInByZXBhbiJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzRfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSJwcmVwYW4iXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChwcmUtcGFuZGVtaWMpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM0X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNvbnRyb2wiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAob3RoZXIpIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZl9wYW4kYnNmc19zZWM0X3RvdGFsW0JTRlNfZGZfcGFuJGdyb3VwPT0gIkNhc2UiICYgQlNGU19kZl9wYW4kYnNmc19wcmVwYW4gPT0gIm90aGVyIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCAob3RoZXIpIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNF9kaXN0cmlidXRpb24KCgpgYGAKCgoKCioqQlNGUyBTZWN0aW9uIDUqKgotQXNzZXNzIHRoZSBwYXRpZW50cyBJbmRlcGVuZGVuY2UgUGVyZm9ybWFuY2Ugd2l0aCBhIHNjb3JlIGJldHdlZW4gMCBhbmQgMzkgIGV4IHByZXBhcmluZyBhbmQgY29va2luZyBhIG1lYWwKYGBge3J9CkJTRlNfc2VjNV9kaXN0cmlidXRpb24gPC0KcGxvdF9seShhbHBoYSA9IDAuNiwgYXV0b2JpbnggPSBGQUxTRSwKICAgICAgICAgIHhiaW5zID0gbGlzdChzdGFydCA9MCwgZW5kID0gMjAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3NlYzVfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM1X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY2FzZSJdLG5hbWUgPSAiQ2FzZSBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGYkYnNmc19zZWM1X3RvdGFsW0JTRlNfZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfc2VjNV9kaXN0cmlidXRpb24KYGBgCgoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMqKlNlY3Rpb24gNTogUHJlIGFuZCBQb3N0IFBhbmRlbWljKioKICMtQ29tcGFyZXMgdGhlIHNjb3JlcyBvZiBzZWN0aW9uIDMgb24gdGhlIEJpcmNod29vZCBBc3Nlc21lbnQgcHJpb3IgdG8gdGhlIENvdmlkLTE5IFBhbmRlbWljIHZzIEFmdGVyIHRoZSBQYW5kZW1pYyBiZXR3ZWVuIFNQSU4tQVNEIGFuZCBTUElOUyBTdHVkaWVzIApCU0ZTX3NlYzVfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDIwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM1X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNV90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzVfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ29udHJvbCIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAicHJlcGFuIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCAocHJlLXBhbmRlbWljKSIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkJTRlNfZGZfcGFuJGJzZnNfc2VjNV90b3RhbFtCU0ZTX2RmX3BhbiRncm91cD09ICJDYXNlIiAmIEJTRlNfZGZfcGFuJGJzZnNfcHJlcGFuID09InByZXBhbiJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QgKHByZS1wYW5kZW1pYykiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzVfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ29udHJvbCIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAib3RoZXIiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIChvdGhlcikiKSAgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmX3BhbiRic2ZzX3NlYzVfdG90YWxbQlNGU19kZl9wYW4kZ3JvdXA9PSAiQ2FzZSIgJiBCU0ZTX2RmX3BhbiRic2ZzX3ByZXBhbiA9PSAib3RoZXIiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIChvdGhlcikiKSAgJT4lCiAKCiAgbGF5b3V0KGJhcm1vZGUgPSAiZ3JvdXAiLAogICAgICAgICBmb250ID0gdCwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkJTRlMgU2NvcmUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50IikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKQlNGU19zZWM1X2Rpc3RyaWJ1dGlvbgoKYGBgCgoKKipCU0ZTIFNlY3Rpb24gNioqCi1Mb29rcyBhdCBwYXRpZW5jZSBJbmRlcGVuZGVuY2UgQ29tcGV0ZW5jZSB3aXRoIGEgc2NvcmUgYmV0d2VlbiAwLTM5IGV4IHdhc2hpbmcgb3duIGNsb3RoZXMgCmBgYHtyfQpCU0ZTX3NlYzZfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTAsIGVuZCA9IDYwLCBzaXplID0gMSkpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkYnNmc19zZWM2X3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfc2VjNl90b3RhbFtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSxuYW1lID0gIkNhc2UgU1BJTlMiLCkgJT4lCiAgYWRkX2JveHBsb3QgKHk9IH5CU0ZTX2RmJGJzZnNfc2VjNl90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX3NlYzZfdG90YWxbQlNGU19kZiRncm91cD09ICJDYXNlIl0sIG5hbWUgPSAiQ2FzZSBTUElOLUFTRCIpICAlPiUKIAoKICBsYXlvdXQoYmFybW9kZSA9ICJncm91cCIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQlNGUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgpCU0ZTX3NlYzZfZGlzdHJpYnV0aW9uCgpgYGAKCioqQlNGUyBHcmFuZCBUb3RhbCoqCmBgYHtyIGVjaG89RkFMU0V9CkJTRlNfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPTgwLCBlbmQgPSAyMDAsIHNpemUgPSAxKSkgJT4lCiAgYWRkX2JveHBsb3QgKHkgPSB+c3Bpbl9ucF9kZiRic2ZzX3RvdGFsW3NwaW5fbnBfZGYkZGlhZ25vc3RpY19ncm91cCA9PSAiY29udHJvbCJdLG5hbWUgPSAiQ29udHJvbCBTUElOUyIsKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJGJzZnNfdG90YWxbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjYXNlIl0sbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX2FzZF90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNvbnRyb2wiXSwgbmFtZSA9ICJDb250cm9sIFNQSU4tQVNEIikgICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QlNGU19kZiRic2ZzX2FzZF90b3RhbFtCU0ZTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU4tQVNEIikgICU+JQogCgogIGxheW91dChiYXJtb2RlID0gImdyb3VwIiwKICAgICAgICAgZm9udCA9IHQsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJCU0ZTIFNjb3JlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJDb3VudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKCkJTRlNfZGlzdHJpYnV0aW9uCgpgYGAKCgoKICAKIyMjIEFkYXB0aXZlIEJlaGF2aW9yIEFzc2Vzc21lbnQgU3lzdGVtIChBQkFTKQotVGhpcyBhc3Nlc3NtZW50IGhlbHBzIGRlc2NyaWJlIGEgcGVyc29uJ3MgZ2VuZXJhbCBhZGFwdGl2ZSBiZWhhdmlvciBhcyB3ZWxsIGFzIGZ1bmN0aW9uaW5nIGluIDExIHJlbGF0ZWQgYWRhcHRpdmUgc2tpbGwgYXJlYXMgCmV4LiBjb21tdW5pY2F0aW9uLCBzZWxmLWNhcmUgYW5kIHdvcmsgCgpgYGB7cn0KCkFCQVNfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSA4MCwgZW5kID0gNDAwLCBzaXplID0gOCkpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+QUJBU19kZiRhYmFzX2FzZF90b3RhbFtBQkFTX2RmJGdyb3VwPT0gIkNhc2UiXSwgbmFtZSA9ICIgQ2FzZSBTUElOLUFTRCIpICAlPiUKICBhZGRfYm94cGxvdCAoeT0gfkFCQVNfZGYkYWJhc19hc2RfdG90YWxbQUJBU19kZiRncm91cD09ICJDb250cm9sIl0sIG5hbWUgPSAiQ29udHJvbCBTUElOLUFTRCIpICAlPiUgCiAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQUJBUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgoKQUJBU19kaXN0cmlidXRpb24KYGBgIAoKCiMjIyBNQVRSSUNTIFNjb3JlIAoKSW50ZW5kZWQgdG8gcHJvdmlkZSBhIHJlbGF0aXZlbHkgYnJpZWYgZXZhbHVhdGlvbiBvZiBrZXkgY29nbml0aXZlIGRvbWFpbnMgcmVsZXZhbnQgdG8gc2NoaXpvcGhyZW5pYSBhbmQgcmVsYXRlZCBkaXNvcmRlcnMsIGFuZCB3YXMgZGVzaWduZWQgdG8gYWRkcmVzcyB0aGUgZm9sbG93aW5nIHB1cnBvc2VzOiBBcyBhbiBvdXRjb21lIG1lYXN1cmUgZm9yIGNsaW5pY2FsIHRyaWFscyBvZiBjb2duaXRpb24tZW5oYW5jaW5nIGRydWdzIGZvciBzY2hpem9waHJlbmlhLgpgYGB7cn0KCm1hdHJpY3NfZGlzdHJpYnV0aW9uIDwtCnBsb3RfbHkoYWxwaGEgPSAwLjYsIGF1dG9iaW54ID0gRkFMU0UsCiAgICAgICAgICB4YmlucyA9IGxpc3Qoc3RhcnQgPSAwLCBlbmQgPSA2MCwgc2l6ZSA9IDEpKSAlPiUKICBhZGRfYm94cGxvdCAoeSA9IH5zcGluX25wX2RmJG5wX2NvbXBvc2l0ZV90c2NvcmVbc3Bpbl9ucF9kZiRkaWFnbm9zdGljX2dyb3VwID09ICJjb250cm9sIl0sbmFtZSA9ICJDb250cm9sIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5ID0gfnNwaW5fbnBfZGYkbnBfY29tcG9zaXRlX3RzY29yZVtzcGluX25wX2RmJGRpYWdub3N0aWNfZ3JvdXAgPT0gImNhc2UiXSwgbmFtZSA9ICJDYXNlIFNQSU5TIiwpICU+JQogIGFkZF9ib3hwbG90ICh5PSB+c3Bhc2RfZGVtb19kZiRucF9jb21wb3NpdGVfdHNjb3JlW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSAiQ29udHJvbCJdLCBuYW1lID0gIkNvbnRyb2wgU1BJTi1BU0QiKSAgJT4lIAogIGFkZF9ib3hwbG90ICh5PSB+c3Bhc2RfZGVtb19kZiRucF9jb21wb3NpdGVfdHNjb3JlW3NwYXNkX2RlbW9fZGYkZ3JvdXA9PSAiQ2FzZSJdLCBuYW1lID0gIkNhc2UgU1BJTi1BU0QiKSAgJT4lCiAKICAgbGF5b3V0KGJhcm1vZGUgPSAib3ZlcmxheSIsCiAgICAgICAgIGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTUFUUklDUyBTY29yZSIpLAogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiQ291bnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCgptYXRyaWNzX2Rpc3RyaWJ1dGlvbgpgYGAKCiAgCiMjIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnQKCldlIHVzZSBbbXJpcWNdKGh0dHBzOi8vbXJpcWMucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL2luZGV4Lmh0bWwpIHRvIG9idGFpbiBpbWFnZSBxdWFsaXR5IG1ldHJpY3MgKElRTXMpIGZvciB0aGUgVDF3LCBUMncsIGFuZCBmTVJJIHNjYW5zLiBCZWxvdyBhcmUgcGxvdHMgb2YgZnJhbWV3aXNlIGRpc3BsYWNlbWVudCAoRkQpLCBhIG1lYXN1cmUgb2YgaGVhZCBtb3Rpb24gYWNyb3NzIHRpbWUuIFNwZWNpZmljYWxseSwgdGhlIGF2ZXJhZ2UgRkQgZm9yIGVhY2ggc2NhbiBhY3Jvc3MgYWxsIHRpbWVwb2ludHMgYW5kIHRoZSBwZXJjZW50YWdlIG9mIEZEcyBhYm92ZSBhIHRocmVzaG9sZCBvZiAqKjAuNSBtbSoqIGFyZSBzaG93bi4KCmBgYHtyfQpzcGFzZF9tcmlxY19ib2xkX2RmIDwtCiAgcmVhZF90c3YoCiAgICBoZXJlKCJkYXRhIiwgIm1yaSIsICJtcmlxY19ib2xkX1NQQVNELnRzdiIpCiAgKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAiU1BJTi1BU0QiLAogICAgICAgICBtb2RhbGl0eSA9ICJib2xkIiwKICAgICAgICAgZnVsbF9zdWJqZWN0X2lkID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgInN1Yi0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgIHN1YmplY3RfaWQgPSBwYXN0ZSgiU1BBU0QiLCBzdWJzdHIoZnVsbF9zdWJqZWN0X2lkLCAxLCAzKSwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgNCwgMTApLCBzZXAgPSAiXyIpICU+JSBnc3ViKCJDTUgiLCAiQ01QIiwgLiksCiAgICAgICAgIGFjcXVpc2l0aW9uID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgImFjcS0oW1s6YWxudW06XV0rKV8iKVssMl0sCiAgICAgICAgIHJ1bl9udW0gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAicnVuLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICAgc2Nhbl90eXBlID0gc3RyX21hdGNoKGJpZHNfbmFtZSwgInRhc2stKFtbOmFsbnVtOl1dKylfIilbLDJdICU+JSBnc3ViKCJcXGQiLCAiIiwgLikKICAgICAgICAgKSAlPiUKICBsZWZ0X2pvaW4oc3Bhc2RfcmVkY2FwX2RmICU+JSBzZWxlY3QocmVjb3JkX2lkLCBtcmlfZG9hKSwgYnkgPSBjKCJzdWJqZWN0X2lkIiA9ICJyZWNvcmRfaWQiKSkKCnNwaW5zX3N1YmplY3RzIDwtCiAgc3BpbnNfcmVkY2FwX2RmICU+JSAKICBzZWxlY3QocmVjb3JkX2lkKSAlPiUgCiAgdW5saXN0KCkKCnNwaW5zX21yaXFjX2JvbGRfZGYgPC0KIHJlYWRfdHN2KAogICBoZXJlKCJkYXRhIiwgIm1yaSIsICJtcmlxY19ib2xkX1NQSU5TLnRzdiIpCiApICU+JQogbXV0YXRlKHN0dWR5ID0gIlNQSU5TIiwKICAgICAgICBtb2RhbGl0eSA9ICJib2xkIiwKICAgICAgICBmdWxsX3N1YmplY3RfaWQgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAic3ViLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICBzdWJqZWN0X2lkID0gcGFzdGUoIlNQTjAxIiwgc3Vic3RyKGZ1bGxfc3ViamVjdF9pZCwgMSwgMyksIHN1YnN0cihmdWxsX3N1YmplY3RfaWQsIDQsIDEwKSwgc2VwID0gIl8iKSwKICAgICAgICBhY3F1aXNpdGlvbiA9IHN0cl9tYXRjaChiaWRzX25hbWUsICJhY3EtKFtbOmFsbnVtOl1dKylfIilbLDJdLAogICAgICAgIHJ1bl9udW0gPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAicnVuLShbWzphbG51bTpdXSspXyIpWywyXSwKICAgICAgICBzY2FuX3R5cGUgPSBzdHJfbWF0Y2goYmlkc19uYW1lLCAidGFzay0oW1s6YWxudW06XV0rKV8iKVssMl0pICU+JQogZmlsdGVyKHN1YmplY3RfaWQgJWluJSBzcGluc19zdWJqZWN0cykKCm1yaXFjX2JvbGRfZGYgPC0KIGJpbmRfcm93cyhzcGFzZF9tcmlxY19ib2xkX2RmLCBzcGluc19tcmlxY19ib2xkX2RmKSAlPiUKIG11dGF0ZShzY2FuX3R5cGUgPSBmYWN0b3Ioc2Nhbl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJyZXN0IiwgImltaSIsICJvYnMiLCAiZW1wIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlJlc3RpbmcgU3RhdGUiLCAiSW1pdGF0ZSIsICJPYnNlcnZlIiwgIkVtcGF0aGljIEFjY3VyYWN5IikpKSAlPiUKIHNlbGVjdChzdHVkeSwgc3ViamVjdF9pZCwgc2Nhbl90eXBlLCBmZF9tZWFuLCBmZF9wZXJjLCBtcmlfZG9hKQpgYGAKCgpgYGB7cn0KcGxvdF9seSgKICBtcmlxY19ib2xkX2RmLCB4ID0gfnNjYW5fdHlwZSwgeSA9IH5mZF9tZWFuLCBjb2xvciA9IH5zdHVkeSwKICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBNZWFuIEZEOiAiLCBmZF9tZWFuKSwKICBtb2RlID0gIm1hcmtlcnMiLAogIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NhbiBUeXBlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJNZWFuIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnQiKSkgJT4lCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpCmBgYAoKYGBge3J9CnBsb3RfbHkobXJpcWNfYm9sZF9kZiAlPiUgbXV0YXRlKHN0dWR5PWFzLmZhY3RvcihzdHVkeSkpLCB4ID0gfm1yaV9kb2EsIHkgPSB+ZmRfbWVhbiwgY29sb3IgPSB+c2Nhbl90eXBlLAogIGhvdmVyaW5mbyA9ICJ0ZXh0IiwKICB0ZXh0ID0gfnBhc3RlKCIgU3ViamVjdDogIiwgc3ViamVjdF9pZCwKICAgICAgICAgICAgICAgICI8YnI+IFNjYW4gVHlwZTogIiwgc2Nhbl90eXBlLAogICAgICAgICAgICAgICAgIjxicj4gTWVhbiBGRDogIiwgZmRfbWVhbiksCiAgbW9kZSA9ICJtYXJrZXJzIikgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTVJJIERhdGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk1lYW4gRnJhbWV3aXNlIERpc3BsYWNlbWVudCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seSgKICBtcmlxY19ib2xkX2RmLCB4ID0gfnNjYW5fdHlwZSwgeSA9IH5mZF9wZXJjLCBjb2xvciA9IH5zdHVkeSwKICB0eXBlID0gImJveCIsIGJveHBvaW50cyA9ICJhbGwiLCBqaXR0ZXIgPSAwLjMsIHBvaW50cG9zID0gMCwKICBob3ZlcmluZm8gPSAidGV4dCIsCiAgdGV4dCA9IH5wYXN0ZSgiIFN1YmplY3Q6ICIsIHN1YmplY3RfaWQsCiAgICAgICAgICAgICAgICAiPGJyPiBGRCAlOiAiLCBmZF9wZXJjKSwKICBtb2RlID0gIm1hcmtlcnMiLAogIG1hcmtlciA9IGxpc3QoY29sb3IgPSAiIzAwMCIsCiAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMC41KSkgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU2NhbiBUeXBlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQZXJjZW50YWdlIG9mIEZyYW1ld2lzZSBEaXNwbGFjZW1lbnRzIEFib3ZlIFRocmVzaG9sZCIpKSAlPiUKICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkKYGBgCgpgYGB7cn0KcGxvdF9seShtcmlxY19ib2xkX2RmICU+JSBtdXRhdGUoc3R1ZHk9YXMuZmFjdG9yKHN0dWR5KSksIHggPSB+bXJpX2RvYSwgeSA9IH5mZF9wZXJjLCBjb2xvciA9IH5zY2FuX3R5cGUsCiAgaG92ZXJpbmZvID0gInRleHQiLAogIHRleHQgPSB+cGFzdGUoIiBTdWJqZWN0OiAiLCBzdWJqZWN0X2lkLAogICAgICAgICAgICAgICAgIjxicj4gRkQgJTogIiwgZmRfcGVyYyksCiAgbW9kZSA9ICJtYXJrZXJzIikgJT4lCiAgbGF5b3V0KGJveG1vZGUgPSAiZ3JvdXAiLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTVJJIERhdGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlBlcmNlbnRhZ2Ugb2YgRnJhbWV3aXNlIERpc3BsYWNlbWVudHMgQWJvdmUgVGhyZXNob2xkIikpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQpgYGAKCiMjIE1SSQoKYGBge3IgbXJpX2RhdGFmcmFtZX0KCiB4bmF0X2RmIDwtCnNwYXNkX3JlZGNhcF9kZiAlPiUKc2VsZWN0KHJlY29yZF9pZCwgbXJpX2RvYSwgbXJpX2Zvcm1fY29tcGxldGUpICU+JQpmaWx0ZXIobXJpX2Zvcm1fY29tcGxldGUgIT0gMikgJT4lCnJlbmFtZShkYXRlID0gbXJpX2RvYSkgJT4lCm11dGF0ZShzdHVkeSA9ICJTUEFTRCIpCgptcmlfZGYgPC0KeG5hdF9kZiAlPiUKZ3JvdXBfYnkoc3R1ZHksIGRhdGUpICU+JQpjb3VudCgpICU+JQp1bmdyb3VwKCkgJT4lCm11dGF0ZSh0b3RhbCA9IGN1bXN1bShuKSkgJT4lCnNlbGVjdCgtbikgJT4lCmJpbmRfcm93cygKICB0YXJnZXRzX2RmICU+JQogICAgbXV0YXRlKHN0dWR5ID0gInRhcmdldCIpICU+JQogICAgcmVuYW1lKHRvdGFsID0gdGFyZ2V0LAogICAgICAgICAgIGRhdGUgPSBtb250aCkgJT4lCiAgICBzZWxlY3Qoc3R1ZHksIGRhdGUsIHRvdGFsKSkKCnBhcnRpY2lwYW50c19yZWNydWl0ZWQgPC0gbnJvdyh4bmF0X2RmKQoKbW9udGhzX29mX3N0dWR5IDwtIG5yb3coCm1yaV9kZiAlPiUKZmlsdGVyKHN0dWR5ID09ICJ0YXJnZXQiKSAlPiUKZmlsdGVyKCFkYXRlID09ICIyMDE4LTA3LTMxIikgJT4lCmZpbHRlcihkYXRlIDwgY2VpbGluZ19kYXRlKFN5cy5EYXRlKCksICJtb250aCIpKQopCgphdmdfcmVjcnVpdG1lbnQgPC0gcm91bmQocGFydGljaXBhbnRzX3JlY3J1aXRlZCAvIG1vbnRoc19vZl9zdHVkeSwgZGlnaXRzID0gMikKYGBgCgpUaHVzIGZhciwgKipgciBwYXJ0aWNpcGFudHNfcmVjcnVpdGVkYCoqIHBhcnRpY2lwYW50cyBoYXZlIGJlZW4gc2Nhbm5lZC4gVGhlIHRhcmdldCBpcyB0byBzY2FuICoqMy4zMyoqIHBhcnRpY2lwYW50cyBwZXIgbW9udGggKCoqNDAqKiBwZXIgeWVhcikuIFdlIGFyZSBjdXJyZW50bHkgYXZlcmFnaW5nICoqYHIgYXZnX3JlY3J1aXRtZW50YCoqIHBhcnRpY2lwYW50cyBwZXIgbW9udGguCgoKYGBge3IgbXJpX3Bsb3R9CmEgPC0gbGlzdCgKICB4ID0gdGFpbChtcmlfZGYkZGF0ZSwgbiA9IDEpLAogIHkgPSB0YWlsKG1yaV9kZiR0b3RhbCwgbiA9IDEpLAogIHRleHQgPSBtcmlfZGYkdG90YWwsCiAgeHJlZiA9ICJ4IiwKICB5cmVmID0gInkiLAogIHNob3dhcnJvdyA9IEZBTFNFKQoKbXJpX3Bsb3QgPC0KICBwbG90X2x5KG1yaV9kZiwgCiAgICAgICAgICB4ID0gfmRhdGUsIHkgPSB+dG90YWwsCiAgICAgICAgICB0eXBlPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMrbWFya2VycycsCiAgICAgICAgICBjb2xvciA9IH5zdHVkeSkgJT4lCiAgbGF5b3V0KGZvbnQgPSB0LAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnRGF0ZScsCiAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGMoYXMuRGF0ZSgiMjAxOC0wNy0zMSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXMuRGF0ZSgpICsgMzApKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJyMgb2YgUGFydGljaXBhbnRzIFNjYW5uZWQnLAogICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSBjKDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yaV9kZiR0b3RhbFttcmlfZGYkZGF0ZSA8IGx1YnJpZGF0ZTo6Y2VpbGluZ19kYXRlKFN5cy5EYXRlKCksIm1vbnRoIildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDEpKSkpICU+JQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKQoKbXJpX3Bsb3QKCmBgYAo=