1. MPC response overview

As of 10 May 2023, a total of 535,945 persons or 107,840 families have been reached by MPC interventions.

A total of USD 17.4 million has been disbursed by 26 implementing agencies across 34 sub-districts.

Only beneficiaries who have received at least USD 100/family/month have been included; excludes sector-based activities such as non-MPC cash-for-food.


536,000 people reached with MPC, USD 17.4 million disbursed, 10 May 2023

governorate

district

comm.

partners

households

beneficiaries

total_usd

%_BNF1

Aleppo

A'zaz

8

9

4,046

15,272

418,232

2.85

Aleppo

Afrin

100

18

25,499

124,062

3,562,287

23.15

Aleppo

Al Bab

3

5

2,118

7,711

309,138

1.44

Aleppo

Jarablus

2

4

791

2,335

116,390

0.44

Aleppo

Jebel Saman

17

11

10,412

59,304

1,542,012

11.07

Ar-Raqqa

Tell Abiad

2

1

132

547

22,256

0.10

Idleb

Ariha

3

3

465

2,366

61,100

0.44

Idleb

Harim

51

17

55,435

240,381

8,469,088

44.85

Idleb

Idleb

23

14

13,273

66,556

2,306,556

12.42

Idleb

Jisr-Ash-Shugur

32

5

4,196

17,411

575,818

3.25

Total

-

-

-

116,367

535,945

17,382,877

100.00

1As percentage of all MPC beneficiaries reached in NW Syria


161,139 beneficiary frequencies were reached in February 2023 and 201,946 were reached in March 2023. 177,782 have been reached so far in April 2023.

This document distinguishes between beneficiaries, or unique individuals reached, and beneficiary frequencies, or the number of times people have been reached, inclusive of double counting.



1.1 Progress by date


The small number of beneficiaries reached earlier than February all pertained to the HRP, the only such beneficiaries reported so far. The CWG would like to encourage partners to report on their January achievements.



2. Map of activities





3. Geographic breakdown of beneficiaries

Coverage continues to be highest in Afrin and Harim districts, where the highest numbers of damaged houses and wounded people are located (though these areas do not necessarily have the highest proportions of damage).



Casualties and damaged houses, absolute figures and per 100,000 persons

governorate

district

wounded_dead1

wounded_dead_100k1

damaged_houses1

damaged_houses_100k1

Aleppo

A'zaz

356

57.87

276

44.86

Aleppo

Afrin

2,232

478.79

2,910

624.22

Aleppo

Al Bab

206

70.04

832

282.89

Aleppo

Jarablus

40

33.82

257

217.30

Aleppo

Jebel Saman

616

236.80

176

67.66

Idleb

Harim

8,449

507.65

3,230

194.07

Idleb

Idleb

350

48.23

946

130.37

Idleb

Jisr-Ash-Shugur

595

183.68

1,915

591.18

1Data from the Assistance Coordination Unit, Syria 20230328;


Below is a breakdown of beneficiaries based on whether they originate from camps or villages. The majority of MPC beneficiaries are from villages.


More than twice as many beneficiaries from villages as from camps

village_camps

beneficiaries

%_beneficiaries

camp

118,415

21.47

village

283,985

51.48

NA

149,255

27.06




3.1 By sub-district

The plots below show the breakdown of beneficiaries by sub-district. Caution must be taken to ensure that allocations are fair across the affected areas: there are numerous sub-districts where a very large proportion of the total population has already been reached by multi-purpose cash, in particular, Jandairis, Harim, Salqin and Sharan.

Response activities must be proportional with the magnitude and severity of earthquake damage. Overallocation deprives affected persons of the aid they are due.

The average percentage of the population reached, of all sub-districts, is 11.92%.




3.2 Comparisons with PIN and earthquake damage

The plot below shows the total population of each sub-district on the x-axis (for the moment, all persons in these areas are assumed to be affected and are included in the PIN) and the number of beneficiaries on the y-axis.

The size of each point indicates the number of dead or wounded persons there per 100,000.



The higher or lower a sub-district is above the blue line, the more disproportionate the number of beneficiaries allocated to that location are.

This should also be compared to each sub-district’s share of the earthquake damage. Of particular note, sub-districts in grey have yet to receive any MPC assistance.



The CWG is currently working on a prioritisation score, which can be a useful shorthand, that will take into account pre-existing vulnerability (likely from the MSNA) as well as earthquake impacts.



3.3 Planned activities

Whilst it is heartening to see new sub-districts, the majority of planned allocations have been accorded to areas that have already received relatively high levels of support.



14 partners have reported planned activities

project_status

partners

beneficiaries

%_beneficiaries

Completed

25

535,945

82.62

Planned

16

107,574

16.58

Suspended

2

5,148

0.79


The sum of planned beneficiaries is 107,574. If this is the extent of all planned MPC activities, the CWG as a whole can expect to reach 97% of its target of 662,924 persons. But whilst the scale of achievements is important, it is also key to ensure that allocations are fair.


Planned beneficiaries by month

month1

beneficiaries

Apr

54,950

May

10,398

Jun

4,200

Jul

28,520

NA

9,506

1Some dates are missing or improperly encoded;




4. Cash response actors and cash disbursed

USD 17.4 million has been distributed across 251 communities and 34 sub-districts in NW Syria.


Reach and footprint of cash response actors

implementing_partner1

beneficiary_freq

districts

communities

GOAL (GOAL)

119,042

3

82

International Rescue Committee (IRC)

87,363

3

22

Shafak Organization (SO)

59,185

5

16

People in Need (PIN)

48,637

6

29

Ataa Humanitarian Relief Association (ATAA)

30,983

9

35

CBRTWG-031

30,904

6

55

Norwegian Refugee Council (NRC)

30,430

2

4

Mercy-USA for Aid and Development (MUSA)

27,280

5

37

Ihsan for Relief and Development (IRD)

23,526

3

20

Violet Organization (VO)

20,245

3

17

Mercy Without Limits (MWL)

16,460

4

10

World Vision International (WVI)

12,048

1

4

Bahar Organization (BO)

12,000

1

1

Uluslararasi Insani Yardimlasma Dernegi (IYD)

11,449

4

16

Syrian Association for Relief and Development (SARD)

9,303

4

7

Solidarités International (SI)

7,058

1

5

International Humanitarian Relief (IHR)

6,654

3

9

Welthungerhilfe (WHH)

4,830

4

4

Elaf for Relief and Development (ELAF)

3,300

2

2

Ghiras Al Nahda (GAN)

3,050

1

2

Bonyan Organization (BO)

2,951

1

4

The Syrian Est. for Human Care and Development (Massrat)

2,692

3

3

CBRTWG-033

1,769

3

7

Al-Sham Humanitarian Foundation (AHF)

990

7

7

Social Development International (SDI)

975

2

3

Seeds Of Hope Relief and Development (SOH)

570

1

1

1Only partners who provided more than USD 100/family/month;


In the scatterplot below, each point is a single cash working group partner. The x-axis indicates the number of beneficiary frequencies reached per agency and the y-axis indicates the number of communities (admin4) reached. Mouse over each point for more details.




4.1 USD disbursed per partner


USD disbursed and families reached by partner

implementing_partner

total_usd

families

usd_per_fam

%_usd_total

GOAL (GOAL)

3,744,300

24,962

150.00

21.54

International Rescue Committee (IRC)

2,303,550

15,357

150.00

13.25

Ataa Humanitarian Relief Association (ATAA)

1,784,785

7,201

247.85

10.27

Shafak Organization (SO)

1,672,600

11,837

141.30

9.62

Norwegian Refugee Council (NRC)

1,272,600

8,484

150.00

7.32

People in Need (PIN)

1,173,900

7,826

150.00

6.75

Ihsan for Relief and Development (IRD)

689,550

4,597

150.00

3.97

Violet Organization (VO)

653,700

4,358

150.00

3.76

CBRTWG-031

548,800

6,150

89.24

3.16

Mercy-USA for Aid and Development (MUSA)

530,300

5,402

98.17

3.05

Mercy Without Limits (MWL)

438,372

3,325

131.84

2.52

Uluslararasi Insani Yardimlasma Dernegi (IYD)

375,000

2,500

150.00

2.16

Bahar Organization (BO)

360,000

2,400

150.00

2.07

Welthungerhilfe (WHH)

344,400

2,296

150.00

1.98

World Vision International (WVI)

301,200

2,008

150.00

1.73

Syrian Association for Relief and Development (SARD)

286,245

1,907

150.10

1.65

Solidarités International (SI)

218,250

1,455

150.00

1.26

International Humanitarian Relief (IHR)

179,250

1,195

150.00

1.03

Elaf for Relief and Development (ELAF)

160,000

600

266.67

0.92

Ghiras Al Nahda (GAN)

91,500

610

150.00

0.53

Bonyan Organization (BO)

86,471

575

150.38

0.50

The Syrian Est. for Human Care and Development (Massrat)

81,000

540

150.00

0.47

CBRTWG-033

28,100

311

90.35

0.16

Social Development International (SDI)

25,500

170

150.00

0.15

Al-Sham Humanitarian Foundation (AHF)

20,625

165

125.00

0.12

Seeds Of Hope Relief and Development (SOH)

12,880

136

94.71

0.07


The CWG is currently working with other Clusters to consolidate all cash-based activities and will soon be able to provide more comprehensive reporting.




5. Annexes


5.1 Interactive reference table at sub-district level

Columns include: governorate, district, sub-district, total population, beneficiaries, total usd disbursed, wounded and dead, wounded and dead per 100k, damaged houses, damaged houses per 100k, admin3pcode




5.2 Reporting quality

This section documents issues encountered in the cleaning of 4W and FSL data and their impacts on the quality of reporting the CWG can provide. The recommendations by the CWG are included to enhance reporting quality:

  1. The CWG has shifted into a new 4Ws template for biweekly reporting to better capture the earthquake response. Deadlines are set on the 10th and the 25th of each month. 9 partners reported achievements in February and 11 reported achievements in March, with 22 partners having reported in April. If no MPC activities were implemented, please inform the CWG as well.

  2. For this reporting period, activities pertaining to 18,548 beneficiaries were missing their dates or had dates in unreadable formats. Please ensure that the start date and end date are entered in the format mm/dd/yyyy and select the month of reporting from the options in the dropdown menu.

  3. For sex-and-age disggregations, please do not backfill these columns using calculations based on the census or the MSNA. If no disaggregated data is available to your organisation, please leave these columns blank.

  4. The Cash Working Group is currently only collecting planned and implemented Multipurpose Cash achievements. Whilst the CWG welcomes additional inputs on other CVA activities, we also want to ensure that the reporting load is as low as possible for partners i.e. if an agency has implemented Cash-for-Work, this should be reported to the ERL Cluster. The CWG will work with all Clusters to develop a consolidated picture of response-wide CVA interventions.

  5. Please indicate in the previously_assisted column whether or not beneficiaries have been reached before. However, beneficiaries are being reported to the Cash Working Group for this first time, even if you have reached them before, please indicate No in this column. This column is used calculate the number of unique individuals reached.

LS0tDQp0aXRsZTogIk5vcnRod2VzdCBTeXJpYSBDYXNoIFdvcmtpbmcgR3JvdXAgRWFydGhxdWFrZSBSZXNwb25zZSBCdWxsZXRpbiINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICBjb2xsYXBzZWQ6IG5vDQphbHdheXNfYWxsb3dfaHRtbDogeWVzDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9ub3J0aHdlc3Qtc3lyaWEtY2FzaC13b3JraW5nLWdyb3VwL211bHRpc2VjdG9yXzRXc19yZXZpZXcvcmF3L21haW4vTldTLUNXRyUyMGxvZ28uUE5HIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBmaWcud2lkdGg9OSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkobWRlcHJpdikNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIHNjYWxpbmcgZnVuY3Rpb25zIA0KcmFuZ2UwMSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCkpLyhtYXgoeCktbWluKHgpKX0NCnJhbmdlX3duYSA8LSBmdW5jdGlvbih4KXsoeC1taW4oeCwgbmEucm0gPSBUUlVFKSkvKG1heCh4LCBuYS5ybSA9IFRSVUUpLW1pbih4LCBuYS5ybSA9IFRSVUUpKX0NCg0KIyBtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCmxvY2F0aW9ucyA8LSByZWFkX2NzdigiLi9kYXRhL2xvY2F0aW9uc19hb2MuY3N2IikNCg0KcGNvZGUzX3NoYXBlIDwtIA0KICBzdF9yZWFkKCIuL2RhdGEvc3lyX2FkbWJuZGFfdW5jc191bm9jaGFfMjAyMDEyMTcvc3lyX2FkbWJuZGFfYWRtM191bmNzX3Vub2NoYV8yMDIwMTIxNy5zaHAiKQ0KDQpgYGANCg0KDQpgYGB7ciBkYXRhfQ0KDQpyZXBvcnRfZGF0ZSA8LSAiMTAgTWF5IDIwMjMiDQoNCm5hbWVzX2VxIDwtIGMoDQogICJkYXRlIiwNCiAgImdvdmVybm9yYXRlIiwNCiAgImRpc3RyaWN0IiwNCiAgInN1Yl9kaXN0cmljdCIsDQogICJjb21tdW5pdHkiLA0KICAiYWRtaW40IiwNCiAgImNhc3VhbHRpZXMiLA0KICAiaW5qdXJpZXMiLA0KICAiY29tcGxldGVseV9kZXN0cm95ZWRfaG91c2VzIiwNCiAgImRhbWFnZWRfdW5paGFiaXRhYmxlX2hvdXNlcyIsDQogICJ0ZW1wb3JhcnlfYWNjb21tb2RhdGlvbl9jZW50cmVzIiwNCiAgImlkcHNfaW5fYWxsX2NlbnRyZXMiLA0KICAic2Nob29sc19hc19hY2NvbW9kYXRpb25fY2VudHJlcyIsDQogICJpZHBzX2luX3NjaG9vbHMiLA0KICAidGVudHNfbmVlZGVkIiwNCiAgImJsYW5rZXRzX21hdHRyZXNzZXNfbmVlZGVkIiwNCiAgInRlbXBvcmFyeV9hY2NvbW1vZGF0aW9uX2NlbnRyZXNfYXZhaWxhYmxlIiwgDQogICJhY2Nlc3NpYmxlX2NpdmlsX2RlZmVuc2UiLA0KICAibGF0cmluZXNfYXZhaWxhYmxlIiwNCiAgIm1lYWxzX25lZWRlZF9wZXJfZGF5IiwNCiAgIm5lZWRfYmxvb2RfZG9uYXRpb25zIiwNCiAgImhlYWx0aF9zZXJ2aWNlc19hdmFpbGFibGUiLA0KICAibmVjZXNzYXJ5X21lZGljYWxfZXF1aXBtZW50IiwNCiAgInJ1YmJsZV92b2x1bnRlZXJzIiwNCiAgInRlbGVjb21zX2F2YWlsYWJsZSIsDQogICJlbGVjdHJpY2l0eV9hdmFpbGFibGUiLCANCiAgImhlYXRpbmdfZnVlbF9uZWVkZWQiDQopDQoNCmVxIDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9zeXJpYS1lYXJ0aHF1YWtlLWltcGFjdC0yMC1tYXJjaC0yMDIzLnhsc3giLA0KICAgICAgICAgICAgICAgICBzaGVldCA9ICJEQVRBU0VUIikgJT4lIA0KICBzZXROYW1lcyhuYW1lc19lcSkgJT4lIA0KICBsZWZ0X2pvaW4obG9jYXRpb25zICU+JSBzZWxlY3QoYWRtaW40cGNvZGUsIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9IGMoImFkbWluNCIgPSAiYWRtaW40cGNvZGUiKSkgJT4lIA0KICBtdXRhdGUod291bmRlZF9kZWFkID0gY2FzdWFsdGllcyArIGluanVyaWVzLA0KICAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzID0gY29tcGxldGVseV9kZXN0cm95ZWRfaG91c2VzICsgZGFtYWdlZF91bmloYWJpdGFibGVfaG91c2VzKSAlPiUgDQogICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgc3VtbWFyaXNlKHdvdW5kZWRfZGVhZCA9IHN1bSh3b3VuZGVkX2RlYWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzID0gc3VtKGRhbWFnZWRfaG91c2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGxlZnRfam9pbihyZWFkX2V4Y2VsKCIuL2RhdGEvMjAyM0hOT19QaU5fU2V2ZXJpdHlfZGV0YWlsZWRBb0lfRk9SU0hBUkUgMTUwMzIwMjMueGxzeCIsIHNraXAgPSAxLCANCiAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMSkgJT4lDQogICAgICAgICAgICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNwY29kZSwgdG90YWxfcG9wdWxhdGlvbiwgYW9jID0gYW9fYyksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWRfMTAwayA9IHdvdW5kZWRfZGVhZCAvIHRvdGFsX3BvcHVsYXRpb24gKiAxMDAwMDAsIA0KICAgICAgICAgZGFtYWdlZF9ob3VzZXNfMTAwayA9IGRhbWFnZWRfaG91c2VzIC8gdG90YWxfcG9wdWxhdGlvbiAqIDEwMDAwMCkNCg0KDQplcV9tZGVwcml2IDwtIGVxICU+JQ0KICBtdXRhdGVfYXQodmFycyh3b3VuZGVkX2RlYWQsIGRhbWFnZWRfaG91c2VzLCANCiAgICAgICAgICAgICAgICAgd291bmRlZF9kZWFkXzEwMGssIGRhbWFnZWRfaG91c2VzXzEwMGspLCB+IHJhbmdlX3duYSguKSkgJT4lIA0KICBtZGVwcml2KGMoIndvdW5kZWRfZGVhZCIsICJkYW1hZ2VkX2hvdXNlcyIsIA0KICAgICAgICAgICAgIndvdW5kZWRfZGVhZF8xMDBrIiwgImRhbWFnZWRfaG91c2VzXzEwMGsiKSwgDQogICAgICAgICAgbWV0aG9kID0gImN6Iiwgb3V0cHV0ID0gImFsbCIsIA0KICAgICAgICAgIHNjb3JlX2lfaGVhZGluZyA9ICJlcV9zY29yZSIpDQoNCmVxIDwtIGVxICU+JSANCiAgbGVmdF9qb2luKGVxX21kZXByaXYkZGF0YSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNwY29kZSwgZXFfc2NvcmUpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikNCg0KIyBUaGluayBvZiBhbm90aGVyIHdheSB0byBkbyB0aGlzIC0tIGlmIHNvbWVvbmUgZWxzZSBydW5zIHRoaXMsIGl0IHdvbid0IHdvcmsgDQpjYnIgPC0gcmVhZF9jc3YoIi4vZGF0YS9jYnJfY29tLmNzdiIpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gbW9udGgoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgbXV0YXRlKGdvdmVybm9yYXRlID0gcmVjb2RlKGdvdmVybm9yYXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGVwcG8iID0gIkFsZXBwbyIpLCANCiAgICAgICAgIGRpc3RyaWN0ID0gcmVjb2RlKGRpc3RyaWN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYWJhbCBTYW1tYW4iID0gIkplYmVsIFNhbWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYXpheiIgPSAiQSd6YXoiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXJhYmx1cyIgPSAiSmFyYWJsdXMiKSwgDQogICAgICAgICBzdWJfZGlzdHJpY3QgPSByZWNvZGUoc3ViX2Rpc3RyaWN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXpheiIgPSAiQSd6YXoiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXJhYmx1cyIgPSAiSmFyYWJsdXMiKSwgDQogICAgICAgICAjIERvaW5nIHRoaXMgYmVjYXVzZSBBci1SYXFxYSBoYXMgbmV2ZXIgYXBwZWFyZWQgYmVmb3JlDQogICAgICAgICBwcmV2aW91c2x5X2Fzc2lzdGVkID0gaWZlbHNlKGFkbWluMXBjb2RlICVpbiUgYygiU1kxMSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHlfYXNzaXN0ZWQpKQ0KICANCg0KaG5vIDwtIHJlYWRfZXhjZWwoIi4vZGF0YS8yMDIzSE5PX1BpTl9TZXZlcml0eV9kZXRhaWxlZEFvSV9GT1JTSEFSRSAxNTAzMjAyMy54bHN4Iiwgc2tpcCA9IDEsIA0KICAgICAgICAgICAgICAgICAgc2hlZXQgPSAxKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KDQoNCm53X3Bjb2RlMyA8LSBobm8gJT4lIA0KICBmaWx0ZXIoYW9fYyA9PSAiTlciKSAlPiUgDQogIHB1bGwoYWRtaW4zcGNvZGUpDQoNCmZvdXIgPC0gcmVhZF9jc3YoIi4vZGF0YS80d3MuY3N2IikNCg0KYGBgDQoNCg0KPGJyPjxicj48YnI+DQoNCiMgMS4gTVBDIHJlc3BvbnNlIG92ZXJ2aWV3DQoNCg0KDQpgYGB7cn0NCnN1bV9zdGF0cyA8LSBjYnIgICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgDQogICAgICAgICAgIHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpKSAlPiUNCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lciksIA0KICAgICAgICAgICAgY29tbXVuaXRpZXMgPSBuX2Rpc3RpbmN0KGFkbWluNHBjb2RlKSwgDQogICAgICAgICAgICBob3VzZWhvbGRzID0gc3VtKGZhbWlsaWVzW3ByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzW3ByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKQ0KDQoNCmBgYA0KDQoNCkFzIG9mICoqYHIgcmVwb3J0X2RhdGVgKiosIGEgdG90YWwgb2YgKipgciBzdW1fc3RhdHMgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgKiogcGVyc29ucyBvciAqKmByIHN1bV9zdGF0cyAlPiUgcHVsbChob3VzZWhvbGRzKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAqKiBmYW1pbGllcyBoYXZlIGJlZW4gcmVhY2hlZCBieSBNUEMgaW50ZXJ2ZW50aW9ucy4gDQoNCkEgdG90YWwgb2YgVVNEICoqYHIgcGFzdGUoZm9ybWF0KHJvdW5kKChzdW1fc3RhdHMgJT4lIHB1bGwodG90YWxfdXNkKSkgLyAxMDAwMDAwLCAxKSwgdHJpbSA9IFRSVUUpLCAibWlsbGlvbiIpYCoqIGhhcyBiZWVuIGRpc2J1cnNlZCBieSAqKmByIHN1bV9zdGF0cyAlPiUgcHVsbChwYXJ0bmVycylgKiogaW1wbGVtZW50aW5nIGFnZW5jaWVzIGFjcm9zcyAqKmByIGNiciAlPiUgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgc3VtbWFyaXNlKG5fZGlzdGluY3QoYWRtaW4zcGNvZGUpKSAlPiUgcHVsbCgpYCoqIHN1Yi1kaXN0cmljdHMuIA0KDQoqT25seSBiZW5lZmljaWFyaWVzIHdobyBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IFVTRCAxMDAvZmFtaWx5L21vbnRoIGhhdmUgYmVlbiBpbmNsdWRlZDsgZXhjbHVkZXMgc2VjdG9yLWJhc2VkIGFjdGl2aXRpZXMgc3VjaCBhcyBub24tTVBDIGNhc2gtZm9yLWZvb2QuKg0KDQoNCg0KPGJyPg0KDQpgYGB7ciBzdW1tYXJ5IHRhYmxlfQ0KY2JyICAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmIA0KICAgICAgICAgICBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSkgJT4lDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb21tdW5pdGllcyA9IG5fZGlzdGluY3QoYWRtaW40cGNvZGUpLCANCiAgICAgICAgICAgIGhvdXNlaG9sZHMgPSBzdW0oZmFtaWxpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzW3ByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdG90YWxfdXNkID0gc3VtKHRvdGFsX3VzZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZShgJV9CTkZgID0gDQogICAgICAgICAgIHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgdG90YWxfdXNkID0gcm91bmQodG90YWxfdXNkKSkgJT4lDQogIGFkb3JuX3RvdGFscygicm93IiwsLCwgaG91c2Vob2xkcywgYmVuZWZpY2lhcmllcywgdG90YWxfdXNkLCBgJV9CTkZgKSAlPiUgDQogIG11dGF0ZShgJV9CTkZgID0gaWZlbHNlKGAlX0JORmAgPiA5OS45OCwgMTAwLCBgJV9CTkZgKSkgJT4lIA0KICBzZWxlY3QoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBgY29tbS5gID0gY29tbXVuaXRpZXMsIHBhcnRuZXJzLCANCiAgICAgICAgIGhvdXNlaG9sZHMsIGJlbmVmaWNpYXJpZXMsIHRvdGFsX3VzZCwgYCVfQk5GYCkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKHBhc3RlMCgNCiAgICByb3VuZChzdW1fc3RhdHMkYmVuZWZpY2lhcmllcywgZGlnaXRzID0gLTMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpLA0KICAgICIgcGVvcGxlIHJlYWNoZWQgd2l0aCBNUEMsIFVTRCAiLA0KICAgIHBhc3RlKGZvcm1hdChyb3VuZCgoc3VtX3N0YXRzICU+JSBwdWxsKHRvdGFsX3VzZCkpIC8gMTAwMDAwMCwgMSksIHRyaW0gPSBUUlVFKSwgIm1pbGxpb24iKSwgDQogICAgIiBkaXNidXJzZWQsICIsIA0KICAgIHJlcG9ydF9kYXRlKSkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiMgIGZvb3Rub3RlKGkgPSAxLCBqID0gNiwgcGFydCA9ICJoZWFkZXIiLCByZWZfc3ltYm9scyA9ICJhIiwNCiMgICAgICAgICAgIGFzX3BhcmFncmFwaCgiQmVuZWZpY2lhcnkgZmlndXJlcyBpbmNsdWRlIG9ubHkgcmVwb3J0ZWQgTVBDIHdpdGggYSBtaW5pbXVtIHRyYW5zZmVyIHZhbHVlICNvZiBVU0QgMTAwIikpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSA4LCBwYXJ0ID0gImhlYWRlciIsIHJlZl9zeW1ib2xzID0gIjEiLCAgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQXMgcGVyY2VudGFnZSBvZiBhbGwgTVBDIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiBOVyBTeXJpYSIpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpDQoNCg0KDQpgYGANCg0KDQoNCg0KPGJyPg0KDQpgciBmaWx0ZXIoY2JyLCBtb250aCA9PSAyICYgcHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSkgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgd2VyZSByZWFjaGVkIGluIEZlYnJ1YXJ5IDIwMjMgYW5kIGByIGZpbHRlcihjYnIsIG1vbnRoID09IDMgJiBwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmIHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIHJlYWNoZWQgaW4gTWFyY2ggMjAyMy4gYHIgZmlsdGVyKGNiciwgbW9udGggPT0gNCAmIHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGhhdmUgYmVlbiByZWFjaGVkIHNvIGZhciBpbiBBcHJpbCAyMDIzLg0KDQoqVGhpcyBkb2N1bWVudCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYmVuZWZpY2lhcmllcywgb3IgdW5pcXVlIGluZGl2aWR1YWxzIHJlYWNoZWQsIGFuZCBiZW5lZmljaWFyeSBmcmVxdWVuY2llcywgb3IgdGhlIG51bWJlciBvZiB0aW1lcyBwZW9wbGUgaGF2ZSBiZWVuIHJlYWNoZWQsIGluY2x1c2l2ZSBvZiBkb3VibGUgY291bnRpbmcuKg0KDQogIA0KICANCmBgYHtyIGV2YWw9RkFMU0V9DQpjYnIgJT4lIA0KICBtdXRhdGUoZGlzdHJpYnV0aW9uX2RhdGUgPSBhcy5EYXRlKGRpc3RyaWJ1dGlvbl9kYXRlKSkgJT4lIA0KICBmaWx0ZXIoZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjAwMjItMDEtMjAiKSAlPiUgDQogIHtzdW0oLiRiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpfQ0KDQpgYGANCg0KDQoNCjxicj48YnI+DQoNCiMjIDEuMSBQcm9ncmVzcyBieSBkYXRlDQoNCg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQojIFRoaXMgaXMgdGhlIG1lc3NpZXN0IGNodW5rIGluIHRoZSB3aG9sZSBkb2N1bWVudC4gQ2FuIHlvdSBwbGVhc2UgZml4IGl0PyANCg0KcHJvZ3Jlc3NfbGluZSA8LSBjYnIgJT4lDQogIGZpbHRlcighaXMubmEoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIG11dGF0ZShkaXN0cmlidXRpb25fZGF0ZSA9IGFueWRhdGUoZGlzdHJpYnV0aW9uX2RhdGUpKSAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmIA0KICAgICAgICAgICBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSAmIA0KICAgICAgICAgICBwcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyIpICU+JSANCiAgZ3JvdXBfYnkoZGlzdHJpYnV0aW9uX2RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBhcnJhbmdlKGRpc3RyaWJ1dGlvbl9kYXRlKSAlPiUgDQogIGZpbHRlcihkaXN0cmlidXRpb25fZGF0ZSAgPiAiMjAyMi0xMi0zMCIgJiBkaXN0cmlidXRpb25fZGF0ZSA8ICIyMDIzLTA1LTE2IikgJT4lICANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGN1bV9sYWJlbCA9IGlmZWxzZShkaXN0cmlidXRpb25fZGF0ZSA9PSAiMjAyMy0wMi0xMCIgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbl9kYXRlID09ICIyMDIzLTAzLTAxIiB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25fZGF0ZSA9PSAiMjAyMy0wMy0xNSIgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDMtMzAifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDQtMTUifA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uX2RhdGUgPT0gIjIwMjMtMDUtMTAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW1fYmVuLCAiIiksIA0KICAgICAgICAgY3VtX2xhYmVsID0gYXMubnVtZXJpYyhjdW1fbGFiZWwpLCANCiAgICAgICAgIGRpc3RyaWJ1dGlvbl9kYXRlID0gYW55ZGF0ZShkaXN0cmlidXRpb25fZGF0ZSkpIA0KDQpwcm9ncmVzc19saW5lICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGlzdHJpYnV0aW9uX2RhdGUsIHkgPSBjdW1fYmVuKSkgKyANCiAgZ2VvbV9saW5lKGNvbG91ciA9ICJibHVlIikgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6Y29tbWEoY3VtX2xhYmVsKSksIHZqdXN0ID0gLTEsIA0KICAgICAgICAgICAgc2l6ZSA9IDQpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIHdlZWsiLCBkYXRlX2xhYmVscyA9ICIlZC0lYiIpICsNCiAgIyBXaHkgZGlkbid0IHlvdSBsZWFybiB0aGlzIGJlZm9yZT8gDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSAuMSkpICsgDQogIGxhYnMoeCA9ICJEaXN0cmlidXRpb24gZGF0ZSIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTVBDIHByb2dyZXNzIGJ5IGRhdGUiLCANCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiVGhlIGVhcmxpZXN0IGVhcnRocXVha2UtcmVsYXRlZCBkaXN0cmlidXRpb24gd2FzIDIwMjMtMDItMDlcbkV4Y2x1ZGVzICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoc3VtX3N0YXRzICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpIC0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgocHJvZ3Jlc3NfbGluZSRjdW1fbGFiZWwsIG5hLnJtID0gVFJVRSksIGJpZy5tYXJrID0gIiwiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIiBiZW5lZmljaWFyaWVzIGZvciB3aGljaCB0aGUgZGF0ZSB3YXMgbm90IHJlcG9ydGVkIG9yIHdhcyB1bnJlYWRhYmxlIikpDQogICAgICAgICANCmdnc2F2ZSgiLi9pbWcvcHJvZ3Jlc3NfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDguMjcsIHdpZHRoID0gMTEuNjksIHVuaXRzID0gImluIikgIA0KYGBgDQoNCjxicj4NCg0KVGhlIHNtYWxsIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgZWFybGllciB0aGFuIEZlYnJ1YXJ5IGFsbCBwZXJ0YWluZWQgdG8gdGhlIEhSUCwgdGhlIG9ubHkgc3VjaCBiZW5lZmljaWFyaWVzIHJlcG9ydGVkIHNvIGZhci4gVGhlIENXRyB3b3VsZCBsaWtlIHRvIGVuY291cmFnZSBwYXJ0bmVycyB0byByZXBvcnQgb24gdGhlaXIgSmFudWFyeSBhY2hpZXZlbWVudHMuIA0KDQo8YnI+PGJyPg0KDQojIDIuIE1hcCBvZiBhY3Rpdml0aWVzDQoNCjxicj4NCg0KDQoNCmBgYHtyIGZpZy5oZWlnaHQ9N30NCg0KcGxhbm5lZF9pbXBsZW1lbnRlZF9tYXAgPC0gY2JyICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gYygiYWRtaW4zcGNvZGUiID0gIkFETTNfUENPREUiKSkgJT4lIA0KICBmaWx0ZXIoQURNMV9QQ09ERSAlaW4lIGMoIlNZMDIiLCAiU1kwNyIsICJTWTExIikgJiAhaXMubmEoYmVuZWZpY2lhcmllcykpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUNCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjEsIGNvbG91ciA9ICJncmV5NzAiKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gcHJvamVjdF9zdGF0dXMsIA0KICAgICAgICAgICAgICAgICB4ID0gbG9uZ2l0dWRlX3gsIHkgPSBsYXRpdHVkZV95LCANCiAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgic3ViX2Rpc3RyaWN0OiAiLCBzdWJfZGlzdHJpY3QsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0eTogIiwgY29tbXVuaXR5LCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhdGlvbl90eXBlOiAiLCB2aWxsYWdlX2NhbXBzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiIsIGZvcm1hdChiZW5lZmljaWFyaWVzLCBiaWcubWFyayA9ICIsIiksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRuZXI6ICIsIGFiYnJldmlhdGlvbiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbl94OiAiLCBsb25naXR1ZGVfeCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF0X3k6ICIsIGxhdGl0dWRlX3kpKSwgDQogICAgICAgICAgICAgc2hhcGUgPSAyMSwgc3Ryb2tlID0gLjM1LCANCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2QobmEudHJhbnNsYXRlID0gRkFMU0UpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSwgDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksKSArDQogIGxhYnModGl0bGUgPSAiQ29tbXVuaXRpZXMgcmVhY2hlZCBhbmQgcGxhbm5lZCAtLSBDV0cgcGFydG5lcnMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJQbGFubmVkIGluIHllbGxvdywgY29tcGxldGVkIGluIHB1cnBsZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29ucyIsIA0KICAgICAgIGNvbG91ciA9ICJTdGF0dXMiKSArDQogIGd1aWRlcyhzaXplID0gIm5vbmUiKQ0KDQogIA0KZ2dwbG90bHkocGxhbm5lZF9pbXBsZW1lbnRlZF9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbW11bml0aWVzIHJlYWNoZWQgYW5kIHBsYW5uZWQgLS0gQ1dHIHBhcnRuZXJzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhbm5lZCBpbiBncmVlbiwgY29tcGxldGVkIGluIHB1cnBsZSwgc2l6ZSBzaG93cyBudW1iZXIgb2YgcGVyc29uczsgY2xpY2sgYW5kIGRyYWcgdG8gem9vbTsgbW91c2Ugb3ZlciBmb3IgZGV0YWlscyIpKSkNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMgMy4gR2VvZ3JhcGhpYyBicmVha2Rvd24gb2YgYmVuZWZpY2lhcmllcyANCg0KQ292ZXJhZ2UgY29udGludWVzIHRvIGJlIGhpZ2hlc3QgaW4gQWZyaW4gYW5kIEhhcmltIGRpc3RyaWN0cywgd2hlcmUgdGhlIGhpZ2hlc3QgbnVtYmVycyBvZiBkYW1hZ2VkIGhvdXNlcyBhbmQgd291bmRlZCBwZW9wbGUgYXJlIGxvY2F0ZWQgKHRob3VnaCB0aGVzZSBhcmVhcyBkbyBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgaGlnaGVzdCBwcm9wb3J0aW9ucyBvZiBkYW1hZ2UpLiANCg0KDQo8YnI+DQoNCg0KDQpgYGB7ciB3YXJuaW5nID0gRkFMU0V9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiANCiAgICAgICAgICAgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikgJiANCiAgICAgICAgICAgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZShkaXN0cmljdCA9IGZjdF9yZW9yZGVyKGRpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgIGdvdmVybm9yYXRlID0gZmN0X3JlbGV2ZWwoZ292ZXJub3JhdGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJJZGxlYiIsICJBci1SYXFxYSIsICJBbGVwcG8iKSkNCiAgICAgICAgICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gZGlzdHJpY3QpKSArIA0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4zKSArIA0KICBsYWJzKHRpdGxlID0gIk1QQyBiZW5lZmljaWFyaWVzIGJ5IGRpc3RyaWN0IiwgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgeSA9ICIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gdW5pdF9mb3JtYXQodW5pdCA9ICJLIiwgc2NhbGUgPSAxZS0zLCBhY2N1cmFjeSA9IDEpKSArIA0KDQpobm8gJT4lIA0KICBmaWx0ZXIoYWRtaW4ybmFtZV9lbiAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsICJBcmloYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbGwgQWJpYWQiLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCBkaXN0cmljdCA9IGFkbWluMm5hbWVfZW4pICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGxlZnRfam9pbigNCiAgICBjYnIgJT4lDQogICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiANCiAgICAgICAgICAgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikgJiANCiAgICAgICAgICAgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUgIA0KICAgICAgZ3JvdXBfYnkoZGlzdHJpY3QpICU+JSANCiAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpICwgIA0KICBieSA9ICJkaXN0cmljdCIpICU+JSANCiAgIyBLaW5kIG9mIGlycml0YXRpbmcgdGhhdCB5b3UncmUgZG9pbmcgdGhpcyBtYW51YWxseSANCiAgbXV0YXRlKGRpc3RyaWN0ID0gZmN0X3JlbGV2ZWwoZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWwgQmFiIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXJhYmx1cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSd6YXoiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkplYmVsIFNhbWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJpaGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkppc3ItQXNoLVNodWd1ciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWRsZWIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhcmltIiksDQogICAgICAgICBwY19yZWFjaGVkID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHRvdGFsX3BvcHVsYXRpb24gKiAxMDAsIGRpZ2l0cyA9IDEpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjX3JlYWNoZWQsIHkgPSBkaXN0cmljdCkpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBnb3Zlcm5vcmF0ZSkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShwY19yZWFjaGVkKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4zKSArIA0KICBsYWJzKHRpdGxlID0gIlBlcmNlbnQgb2YgcG9wdWxhdGlvbiByZWFjaGVkIiwgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB4ID0gIiUgb2YgcG9wdWxhdGlvbiByZWFjaGVkIikgKw0KICANCiAgcGxvdF9sYXlvdXQoZ3VpZGVzID0gImNvbGxlY3QiKSAmIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KZ2dzYXZlKCIuL2ltZy9tcGNfYnlfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgZmlsdGVyKGFkbWluM3Bjb2RlICVpbiUgbndfcGNvZGUzICYgDQogICAgICAgICAgIGRpc3RyaWN0ICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKHdvdW5kZWRfZGVhZCA9IHN1bSh3b3VuZGVkX2RlYWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZGFtYWdlZF9ob3VzZXMgPSBzdW0oZGFtYWdlZF9ob3VzZXMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgIyBXaGVyZSBpcyBBcmloYSwgYW5kIHdoeSBpcyBpdCBzaG93aW5nIHVwIGhlcmUNCiAgZmlsdGVyKGRpc3RyaWN0ICE9ICJBcmloYSIpICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLCAiQXJpaGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbikgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwb3B1bGF0aW9uID0gc3VtKHRvdGFsX3BvcHVsYXRpb24sIG5hLnJtID0gVFJVRSkpLCBieSA9ICJkaXN0cmljdCIpICU+JSANCiAgbXV0YXRlKHdvdW5kZWRfZGVhZF8xMDBrID0gcm91bmQod291bmRlZF9kZWFkIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgZGFtYWdlZF9ob3VzZXNfMTAwayA9IHJvdW5kKGRhbWFnZWRfaG91c2VzIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgd291bmRlZF9kZWFkLCB3b3VuZGVkX2RlYWRfMTAwaywgDQogICAgICAgICBkYW1hZ2VkX2hvdXNlcywgZGFtYWdlZF9ob3VzZXNfMTAwaykgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIHNldF9jYXB0aW9uKCJDYXN1YWx0aWVzIGFuZCBkYW1hZ2VkIGhvdXNlcywgYWJzb2x1dGUgZmlndXJlcyBhbmQgcGVyIDEwMCwwMDAgcGVyc29ucyIpICU+JSANCiAgZm9vdG5vdGUocGFydCA9ICJoZWFkZXIiLCBpID0gMSwgaiA9IDM6NiwgaW5saW5lID0gVFJVRSwgcmVmX3N5bWJvbHMgPSAiMSIsDQogICAgICAgICAgIHZhbHVlID0gYXNfcGFyYWdyYXBoKCJEYXRhIGZyb20gdGhlIEFzc2lzdGFuY2UgQ29vcmRpbmF0aW9uIFVuaXQsIFN5cmlhIDIwMjMwMzI4IikpDQpgYGANCg0KPGJyPg0KDQpCZWxvdyBpcyBhIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBvcmlnaW5hdGUgZnJvbSBjYW1wcyBvciB2aWxsYWdlcy4gVGhlIG1ham9yaXR5IG9mIE1QQyBiZW5lZmljaWFyaWVzIGFyZSBmcm9tIHZpbGxhZ2VzLiAgDQoNCjxicj4NCg0KYGBge3J9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiBwcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyIpICU+JSANCiAgIyBCaWcgYXNzdW1wdGlvbiB5b3UncmUgbWFraW5nIGhlcmUsIGJ1dCBsaXRlcmFsbHkgYWxsIG9mIHRoZW0gaGF2ZSB0aGUgd29yZA0KICAjICJjYW1wIiBpbiB0aGVpciBuYW1lcw0KICBtdXRhdGUodmlsbGFnZV9jYW1wcyA9IGlmZWxzZSh2aWxsYWdlX2NhbXBzICVpbiUgYygiY2FtcCIsICJ2aWxsYWdlIikgfCBpcy5uYSh2aWxsYWdlX2NhbXBzKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2VfY2FtcHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FtcCIpKSAlPiUgDQogIGdyb3VwX2J5KHZpbGxhZ2VfY2FtcHMpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHZpbGxhZ2VfY2FtcHMgPSAiTkEiKSkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCJNb3JlIHRoYW4gdHdpY2UgYXMgbWFueSBiZW5lZmljaWFyaWVzIGZyb20gdmlsbGFnZXMgYXMgZnJvbSBjYW1wcyIpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC42KQ0KICANCmBgYA0KDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMy4xIEJ5IHN1Yi1kaXN0cmljdA0KDQpgYGB7cn0NCmF2Z19wY19yZWFjaGVkIDwtIGNiciAlPiUgDQogIG11dGF0ZShzdWJfZGlzdHJpY3QgPSByZWNvZGUoc3ViX2Rpc3RyaWN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FscWluIiA9ICJTYWxxaW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZyaW4iID0gIkFmcmluIikpICU+JQ0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiANCiAgICAgICAgICAgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikgJiANCiAgICAgICAgICAgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShhZG1pbjNwY29kZSkpICU+JSANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSwgZ292ZXJub3JhdGUpICU+JQ0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluMW5hbWVfZW4sIGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfcG9wdWxhdGlvbiA9IHN1bSh0b3RhbF9wb3B1bGF0aW9uLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIG11dGF0ZShhdmdfcGNfcmVhY2hlZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBwdWxsKGF2Z19wY19yZWFjaGVkKQ0KYGBgDQoNCg0KVGhlIHBsb3RzIGJlbG93IHNob3cgdGhlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyaWVzIGJ5IHN1Yi1kaXN0cmljdC4gQ2F1dGlvbiBtdXN0IGJlIHRha2VuIHRvIGVuc3VyZSB0aGF0IGFsbG9jYXRpb25zIGFyZSBmYWlyIGFjcm9zcyB0aGUgYWZmZWN0ZWQgYXJlYXM6IHRoZXJlIGFyZSBudW1lcm91cyBzdWItZGlzdHJpY3RzIHdoZXJlIGEgdmVyeSBsYXJnZSBwcm9wb3J0aW9uIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVhY2hlZCBieSBtdWx0aS1wdXJwb3NlIGNhc2gsIGluIHBhcnRpY3VsYXIsIEphbmRhaXJpcywgSGFyaW0sIFNhbHFpbiBhbmQgU2hhcmFuLiANCg0KUmVzcG9uc2UgYWN0aXZpdGllcyBtdXN0IGJlIHByb3BvcnRpb25hbCB3aXRoIHRoZSBtYWduaXR1ZGUgYW5kIHNldmVyaXR5IG9mIGVhcnRocXVha2UgZGFtYWdlLiBPdmVyYWxsb2NhdGlvbiBkZXByaXZlcyBhZmZlY3RlZCBwZXJzb25zIG9mIHRoZSBhaWQgdGhleSBhcmUgZHVlLiANCg0KVGhlIGF2ZXJhZ2UgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiByZWFjaGVkLCBvZiBhbGwgc3ViLWRpc3RyaWN0cywgaXMgYHIgYXZnX3BjX3JlYWNoZWRgJS4gDQoNCjxicj4NCg0KYGBge3J9DQpzdWJfZGlzdHJpY3Rfb3JkZXIgPC0gY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgDQogICAgICAgICAgIHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpICYgDQogICAgICAgICAgIHByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFkbWluM3Bjb2RlKSkgJT4lIA0KICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gcmVjb2RlKHN1Yl9kaXN0cmljdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbHFpbiIgPSAiU2FscWluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmcmluIiA9ICJBZnJpbiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBzdWJfZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZ292ZXJub3JhdGUpKSAlPiUgDQogIHB1bGwoc3ViX2Rpc3RyaWN0KQ0KYGBgDQoNCg0KYGBge3IgZmlnLmhlaWdodD04fQ0KDQoNCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmIA0KICAgICAgICAgICBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSAmIA0KICAgICAgICAgICBwcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhZG1pbjNwY29kZSkpICU+JSANCiAgbXV0YXRlKHN1Yl9kaXN0cmljdCA9IHJlY29kZShzdWJfZGlzdHJpY3QsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYWxxaW4iID0gIlNhbHFpbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnJpbiIgPSAiQWZyaW4iKSkgJT4lIA0KICBncm91cF9ieShnb3Zlcm5vcmF0ZSwgc3ViX2Rpc3RyaWN0KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gZmFjdG9yKHN1Yl9kaXN0cmljdCwgIHN1Yl9kaXN0cmljdF9vcmRlciksIA0KICAgICAgICAgc3ViX2Rpc3RyaWN0ID0gZmN0X3JldihzdWJfZGlzdHJpY3QpKSAlPiUgDQogIGFycmFuZ2Uoc3ViX2Rpc3RyaWN0KSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBzdWJfZGlzdHJpY3QpKSArIA0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChiZWdpbiA9IC4zKSArIA0KICBsYWJzKHRpdGxlID0gIk1QQyBiZW5lZmljaWFyaWVzIGJ5IGRpc3RyaWN0IiwgDQogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoImFzIG9mICIsIHJlcG9ydF9kYXRlKSwgDQogICAgICAgeSA9ICIiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQoNCmNiciAlPiUgDQogIG11dGF0ZShzdWJfZGlzdHJpY3QgPSByZWNvZGUoc3ViX2Rpc3RyaWN0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FscWluIiA9ICJTYWxxaW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZyaW4iID0gIkFmcmluIikpICU+JQ0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiANCiAgICAgICAgICAgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikgJiANCiAgICAgICAgICAgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShhZG1pbjNwY29kZSkpICU+JSANCiAgZ3JvdXBfYnkoc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSwgZ292ZXJub3JhdGUpICU+JQ0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluMW5hbWVfZW4sIGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRvdGFsX3BvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lIA0KICBtdXRhdGUocGNfcmVhY2hlZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyB0b3RhbF9wb3B1bGF0aW9uICogMTAwLCBkaWdpdHMgPSAxKSkgJT4lIA0KICBtdXRhdGUoc3ViX2Rpc3RyaWN0ID0gZmFjdG9yKHN1Yl9kaXN0cmljdCwgIHN1Yl9kaXN0cmljdF9vcmRlciksIA0KICAgICAgICAgc3ViX2Rpc3RyaWN0ID0gZmN0X3JldihzdWJfZGlzdHJpY3QpKSAlPiUgDQogIGFycmFuZ2Uoc3ViX2Rpc3RyaWN0KSAlPiUgIA0KICBnZ3Bsb3QoYWVzKHggPSBwY19yZWFjaGVkLCB5ID0gc3ViX2Rpc3RyaWN0KSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbCA9IGdvdmVybm9yYXRlKSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKHBjX3JlYWNoZWQpKSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKGJlZ2luID0gLjMpICsgDQogIGxhYnModGl0bGUgPSAiUGVyY2VudCBvZiBwb3B1bGF0aW9uIHJlYWNoZWQiLCANCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcmVwb3J0X2RhdGUpLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHggPSAiJSBvZiBwb3B1bGF0aW9uIHJlYWNoZWQiKSArDQogIA0KICBwbG90X2xheW91dChndWlkZXMgPSAiY29sbGVjdCIpICYgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQpnZ3NhdmUoIi4vaW1nL21wY19ieV9zdWJfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMy4yIENvbXBhcmlzb25zIHdpdGggUElOIGFuZCBlYXJ0aHF1YWtlIGRhbWFnZQ0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgdG90YWwgcG9wdWxhdGlvbiBvZiBlYWNoIHN1Yi1kaXN0cmljdCBvbiB0aGUgeC1heGlzIChmb3IgdGhlIG1vbWVudCwgYWxsIHBlcnNvbnMgaW4gdGhlc2UgYXJlYXMgYXJlIGFzc3VtZWQgdG8gYmUgYWZmZWN0ZWQgYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgUElOKSBhbmQgdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIG9uIHRoZSB5LWF4aXMuIA0KDQpUaGUgc2l6ZSBvZiBlYWNoIHBvaW50IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGRlYWQgb3Igd291bmRlZCBwZXJzb25zIHRoZXJlIHBlciAxMDAsMDAwLiANCg0KPGJyPg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTZ9DQplcSAlPiUgDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoZ292ZXJub3JhdGUgPSBhZG1pbjFuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwgDQogICAgICAgICAgICAgICAgICAgICBzdWJfZGlzdHJpY3QgPSBhZG1pbjNuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIGFkbWluM3Bjb2RlKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JQ0KICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJiANCiAgICAgICAgICAgZGlzdHJpY3QgJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLCAiQXJpaGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZWxsIEFiaWFkIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUgDQogIGdyb3VwX2J5KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgc3ViX2Rpc3RyaWN0LCBhZG1pbjNwY29kZSkgJT4lIA0KICBzdW1tYXJpc2Uod291bmRlZF9kZWFkID0gc3VtKHdvdW5kZWRfZGVhZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBkYW1hZ2VkX2hvdXNlcyA9IHN1bShkYW1hZ2VkX2hvdXNlcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIGxlZnRfam9pbihobm8gJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoYWRtaW4zcGNvZGUgJWluJSBud19wY29kZTMgJg0KICAgICAgICAgICAgICAgICAgICAgICBhZG1pbjJuYW1lX2VuICVpbiUgYygiSGFyaW0iLCAiSWRsZWIiLCAiSmlzci1Bc2gtU2h1Z3VyIiwgIkFyaWhhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsbCBBYmlhZCIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZnJpbiIsICJKZWJlbCBTYW1hbiIsICJBJ3pheiIsICJKYXJhYmx1cyIsICJBbCBCYWIiKSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUNCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0odG90YWxfcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIG11dGF0ZSh3b3VuZGVkX2RlYWRfMTAwayA9IHJvdW5kKHdvdW5kZWRfZGVhZCAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGRhbWFnZWRfaG91c2VzXzEwMGsgPSByb3VuZChkYW1hZ2VkX2hvdXNlcyAvIHBvcHVsYXRpb24gKiAxMDAwMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogICAgbGVmdF9qb2luKGNiciAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyIpICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNwY29kZSkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSkpLCANCiAgICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBvcHVsYXRpb24sIHkgPSBiZW5lZmljaWFyaWVzKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHdvdW5kZWRfZGVhZF8xMDBrKSkgKyANCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IHN1Yl9kaXN0cmljdCksDQogICAgICAgICAgICAgICAgICAgcG9pbnQucGFkZGluZyA9IC41LCANCiAgICAgICAgICAgICAgICAgICBzZWdtZW50LmNvbG9yID0gImdyZXk1MCIsIHNpemUgPSAzKSArDQogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gYygwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCwgMzAwMDAwLCAxMDAwMDAwKSwgDQogICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX3lfbG9nMTAoYnJlYWtzID0gYygwLCAxMDAwLCAzMDAwLCAxMDAwMCwgMzAwMDAsIDEwMDAwMCksDQogICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX3NpemUoYnJlYWtzID0gYygwLCAxMDAsIDUwMCwgMTAwMCwgMzAwMCkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3VyID0gImJsdWUiLCBzaXplID0gLjUpICsNCiAgbGFicyh0aXRsZSA9ICJQb3B1bGF0aW9uIGFuZCBNUEMgYmVuZWZpY2lhcmllcyBieSBzdWItZGlzdHJpY3QiLA0KICAgICAgIHN1YnRpdGxlID0gIlNpemUgaW5kaWNhdGVzIGRlYWQvd291bmRlZCBwZXIgMTAwLDAwMDAiLCANCiAgICAgICB4ID0gIlBvcHVsYXRpb24iLCANCiAgICAgICB5ID0gIkJlbmVmaWNpYXJpZXMiLCANCiAgICAgICBzaXplID0gIkRlYWQvd291bmRlZFxucGVyIDEwMGsiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgZnJvbSBDV0csIEZTTCBhbmQgQUNVIikgKw0KICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpIA0KICANCmdnc2F2ZSgiLi9pbWcvcG9wX2Jlbl9zY2F0dGVyLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gOC4yNywgd2lkdGggPSAxMS42OSwgdW5pdHMgPSAiaW4iKQ0KIA0KYGBgDQoNCjxicj4gDQoNClRoZSBoaWdoZXIgb3IgbG93ZXIgYSBzdWItZGlzdHJpY3QgaXMgYWJvdmUgdGhlIGJsdWUgbGluZSwgdGhlIG1vcmUgZGlzcHJvcG9ydGlvbmF0ZSB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYWxsb2NhdGVkIHRvIHRoYXQgbG9jYXRpb24gYXJlLiANCg0KVGhpcyBzaG91bGQgYWxzbyBiZSBjb21wYXJlZCB0byBlYWNoIHN1Yi1kaXN0cmljdCdzIHNoYXJlIG9mIHRoZSBlYXJ0aHF1YWtlIGRhbWFnZS4gT2YgcGFydGljdWxhciBub3RlLCBzdWItZGlzdHJpY3RzIGluIGdyZXkgaGF2ZSB5ZXQgdG8gcmVjZWl2ZSBhbnkgTVBDIGFzc2lzdGFuY2UuIA0KDQo8YnI+DQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCmVxICU+JSANCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChnb3Zlcm5vcmF0ZSA9IGFkbWluMW5hbWVfZW4sIA0KICAgICAgICAgICAgICAgICAgICAgZGlzdHJpY3QgPSBhZG1pbjJuYW1lX2VuLCANCiAgICAgICAgICAgICAgICAgICAgIHN1Yl9kaXN0cmljdCA9IGFkbWluM25hbWVfZW4sIA0KICAgICAgICAgICAgICAgICAgICAgYWRtaW4zcGNvZGUpLCANCiAgICAgICAgICAgIGJ5ID0gImFkbWluM3Bjb2RlIikgJT4lDQogIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmIA0KICAgICAgICAgICBkaXN0cmljdCAlaW4lIGMoIkhhcmltIiwgIklkbGViIiwgIkppc3ItQXNoLVNodWd1ciIsICJBcmloYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbGwgQWJpYWQiLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWZyaW4iLCAiSmViZWwgU2FtYW4iLCAiQSd6YXoiLCAiSmFyYWJsdXMiLCAiQWwgQmFiIikpICU+JSANCiAgZ3JvdXBfYnkoZ292ZXJub3JhdGUsIGRpc3RyaWN0LCBzdWJfZGlzdHJpY3QsIGFkbWluM3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZSh3b3VuZGVkX2RlYWQgPSBzdW0od291bmRlZF9kZWFkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGRhbWFnZWRfaG91c2VzID0gc3VtKGRhbWFnZWRfaG91c2VzLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgbGVmdF9qb2luKGhubyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihhZG1pbjNwY29kZSAlaW4lIG53X3Bjb2RlMyAmDQogICAgICAgICAgICAgICAgICAgICAgIGFkbWluMm5hbWVfZW4gJWluJSBjKCJIYXJpbSIsICJJZGxlYiIsICJKaXNyLUFzaC1TaHVndXIiLCAiQXJpaGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZWxsIEFiaWFkIiwgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFmcmluIiwgIkplYmVsIFNhbWFuIiwgIkEnemF6IiwgIkphcmFibHVzIiwgIkFsIEJhYiIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UocG9wdWxhdGlvbiA9IHN1bSh0b3RhbF9wb3B1bGF0aW9uLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgbXV0YXRlKHdvdW5kZWRfZGVhZF8xMDBrID0gcm91bmQod291bmRlZF9kZWFkIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgZGFtYWdlZF9ob3VzZXNfMTAwayA9IHJvdW5kKGRhbWFnZWRfaG91c2VzIC8gcG9wdWxhdGlvbiAqIDEwMDAwMCwgZGlnaXRzID0gMikpICU+JSANCiAgICBsZWZ0X2pvaW4oY2JyICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHlfYXNzaXN0ZWQgPT0gIk5vIikgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSksIA0KICAgICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGFtYWdlZF9ob3VzZXMsIHkgPSB3b3VuZGVkX2RlYWQpKSArIA0KICBnZW9tX3BvaW50KGFlcyhzaXplID0gd291bmRlZF9kZWFkXzEwMGssIA0KICAgICAgICAgICAgICAgICBjb2xvdXIgPSBiZW5lZmljaWFyaWVzKSkgKyANCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IHN1Yl9kaXN0cmljdCksDQogICAgICAgICAgICAgICAgICAgcG9pbnQucGFkZGluZyA9IC41LCANCiAgICAgICAgICAgICAgICAgICBzZWdtZW50LmNvbG9yID0gImdyZXk1MCIsIHNpemUgPSAzKSArDQogIHNjYWxlX3hfbG9nMTAobGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX3lfbG9nMTAobGFiZWxzID0gY29tbWEpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfc2l6ZShicmVha3MgPSBjKDAsIDEwMCwgNTAwLCAxMDAwLCAzMDAwKSkgKyANCiAgbGFicyh4ID0gIk51bWJlciBvZiBkYW1hZ2VkIGhvdXNlcyIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHdvdW5kZWQgYW5kIGRlYWQiLCANCiAgICAgICB0aXRsZSA9ICJNYWduaXR1ZGUgb2YgZWFydGhxdWFrZSBpbXBhY3RzIGJ5IHN1Yi1kaXN0cmljdCIsIA0KICAgICAgIHN1YnRpdGxlID0gIlNpemUgc2hvd3MgaW50ZW5zaXR5ICh3b3VuZGVkL2RlYWQgcGVyIDEwMGspIGFuZCBjb2xvdXIgc2hvd3MgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHNpemUgPSAiV291bmRlZC9kZWFkXG5wZXIgMTAwayIsIA0KICAgICAgIGNvbG91ciA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIGZyb20gQ1dHLCBGU0wgYW5kIEFDVSIpDQoNCmdnc2F2ZSgiLi9pbWcvZWFydGhxdWFrZV9pbXBhY3Rfc2NhdHRlci5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDguMjcsIHdpZHRoID0gMTEuNjksIHVuaXRzID0gImluIikNCmBgYA0KDQo8YnI+DQoNClRoZSBDV0cgaXMgY3VycmVudGx5IHdvcmtpbmcgb24gYSBwcmlvcml0aXNhdGlvbiBzY29yZSwgd2hpY2ggY2FuIGJlIGEgdXNlZnVsIHNob3J0aGFuZCwgdGhhdCB3aWxsIHRha2UgaW50byBhY2NvdW50IHByZS1leGlzdGluZyB2dWxuZXJhYmlsaXR5IChsaWtlbHkgZnJvbSB0aGUgTVNOQSkgYXMgd2VsbCBhcyBlYXJ0aHF1YWtlIGltcGFjdHMuIA0KDQo8YnI+PGJyPg0KDQoNCiMjIyAzLjMgUGxhbm5lZCBhY3Rpdml0aWVzIA0KDQpXaGlsc3QgaXQgaXMgaGVhcnRlbmluZyB0byBzZWUgbmV3IHN1Yi1kaXN0cmljdHMsIHRoZSBtYWpvcml0eSBvZiBwbGFubmVkIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBhY2NvcmRlZCB0byBhcmVhcyB0aGF0IGhhdmUgYWxyZWFkeSByZWNlaXZlZCByZWxhdGl2ZWx5IGhpZ2ggbGV2ZWxzIG9mIHN1cHBvcnQuICANCg0KPGJyPiANCg0KYGBge3J9DQpjYnIgJT4lIA0KICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIlBsYW5uZWQiICYgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikpICU+JQ0KICBmaWx0ZXIoZ292ZXJub3JhdGUgPT0gIkFsZXBwbyIpICU+JSAgDQogIGdyb3VwX2J5KHN1Yl9kaXN0cmljdCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcihiZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gZmN0X3Jlb3JkZXIoc3ViX2Rpc3RyaWN0LCBiZW5lZmljaWFyaWVzKSkpICsgDQogIGdlb21fY29sKGZpbGwgPSAiIzQxYjZjNCIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpKSwgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gdW5pdF9mb3JtYXQodW5pdCA9ICJLIiwgc2NhbGUgPSAxZS0zLCBhY2N1cmFjeSA9IDEpKSArIA0KICBsYWJzKHRpdGxlID0gIlBsYW5uZWQgYmVuZWZpY2lhcmllcyAtLSBBbGVwcG8iLCANCiAgICAgICB4ID0gIiIsIA0KICAgICAgIHkgPSAiIikgKyANCg0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIiAmIHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpKSAlPiUNCiAgZmlsdGVyKGdvdmVybm9yYXRlID09ICJJZGxlYiIgJiAhaXMubmEoYWRtaW4zcGNvZGUpKSAlPiUgIA0KICBncm91cF9ieShzdWJfZGlzdHJpY3QpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGZjdF9yZW9yZGVyKHN1Yl9kaXN0cmljdCwgYmVuZWZpY2lhcmllcykpKSArIA0KICBnZW9tX2NvbChmaWxsID0gImxpZ2h0Z29sZGVucm9kIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCBoanVzdCA9ICJpbndhcmQiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSB1bml0X2Zvcm1hdCh1bml0ID0gIksiLCBzY2FsZSA9IDFlLTMsIGFjY3VyYWN5ID0gMSkpICsgDQogIGxhYnModGl0bGUgPSAiUGxhbm5lZCBiZW5lZmljaWFyaWVzIC0tIElkbGViIiwgDQogICAgICAgeCA9ICJQbGFubmVkIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB5ID0gIiIpICArIA0KDQogIHBsb3RfbGF5b3V0KHdpZHRocyA9IGMoMS4xNSwgMSkpDQoNCmdnc2F2ZSgiLi9pbWcvcGxhbm5lZF9ieV9zdWJfZGlzdHJpY3QucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSA4LjI3LCB3aWR0aCA9IDExLjY5LCB1bml0cyA9ICJpbiIpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpICYgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUgDQogIGdyb3VwX2J5KHByb2plY3Rfc3RhdHVzKSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoYCVfYmVuZWZpY2lhcmllc2AgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHNldF9jYXB0aW9uKCIxNCBwYXJ0bmVycyBoYXZlIHJlcG9ydGVkIHBsYW5uZWQgYWN0aXZpdGllcyIpICU+JQ0KICB0aGVtZV96ZWJyYSgpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjYpDQpgYGANCg0KPGJyPg0KDQpUaGUgc3VtIG9mIHBsYW5uZWQgYmVuZWZpY2lhcmllcyBpcyAqKmByIGZvcm1hdChmaWx0ZXIoY2JyLCBwcm9qZWN0X3N0YXR1cyA9PSAiUGxhbm5lZCIgJiBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSkgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0sIGJpZy5tYXJrID0gIiwiKWAqKi4gSWYgdGhpcyBpcyB0aGUgZXh0ZW50IG9mIGFsbCBwbGFubmVkIE1QQyBhY3Rpdml0aWVzLCB0aGUgQ1dHIGFzIGEgd2hvbGUgY2FuIGV4cGVjdCB0byByZWFjaCAqKmByIHJvdW5kKChjYnIgJT4lIGZpbHRlcihwcm9qZWN0X3N0YXR1cyAhPSAiU3VzcGVuZGVkIiAmIHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpICYgcHJldmlvdXNseV9hc3Npc3RlZCA9PSAiTm8iKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSkgLyA2NjI5MjQgKiAxMDAsIGRpZ2l0cyA9IDApYCUqKiBvZiBpdHMgdGFyZ2V0IG9mICoqNjYyLDkyNCoqIHBlcnNvbnMuIEJ1dCB3aGlsc3QgdGhlIHNjYWxlIG9mIGFjaGlldmVtZW50cyBpcyBpbXBvcnRhbnQsIGl0IGlzIGFsc28ga2V5IHRvIGVuc3VyZSB0aGF0IGFsbG9jYXRpb25zIGFyZSBmYWlyLiANCg0KDQoNCjxicj4NCg0KDQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJQbGFubmVkIiAmIHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpKSAlPiUgDQogIG11dGF0ZShtb250aCA9IG1vbnRoKGRpc3RyaWJ1dGlvbl9kYXRlLCBsYWJlbCA9IFRSVUUpLCANCiAgICAgICAgIG1vbnRoID0gYXMuY2hhcmFjdGVyKG1vbnRoKSkgJT4lICANCiAgZ3JvdXBfYnkobW9udGgpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSkgJT4lDQogIG11dGF0ZShtb250aCA9IGlmZWxzZShpcy5uYShtb250aCksICJOQSIsIG1vbnRoKSwNCiAgICAgICAgIG1vbnRoID0gZmFjdG9yKG1vbnRoLCBjKCJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT2N0IiwgIk5vdiIsICJEZWMiLCAiTkEiKSkpICU+JSANCiAgYXJyYW5nZShtb250aCkgJT4lIA0KICBmbGV4dGFibGUoKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiUGxhbm5lZCBiZW5lZmljaWFyaWVzIGJ5IG1vbnRoIikgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDEsIGlubGluZSA9IFRSVUUsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIHZhbHVlID0gYXNfcGFyYWdyYXBoKCJTb21lIGRhdGVzIGFyZSBtaXNzaW5nIG9yIGltcHJvcGVybHkgZW5jb2RlZCIpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuNSkNCmBgYA0KDQoNCg0KPGJyPjxicj48YnI+DQoNCiMgNC4gQ2FzaCByZXNwb25zZSBhY3RvcnMgYW5kIGNhc2ggZGlzYnVyc2VkDQoNCg0KVVNEICoqYHIgcGFzdGUocm91bmQoY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSkgJT4lIHtzdW0oLiR0b3RhbF91c2QsIG5hLnJtID0gVFJVRSl9IC8gMTAwMDAwMCwgZGlnaXRzID0gMSksICJtaWxsaW9uIilgKiogaGFzIGJlZW4gZGlzdHJpYnV0ZWQgYWNyb3NzICoqYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluNHBjb2RlKX1gKiogY29tbXVuaXRpZXMgYW5kICoqYHIgY2JyICU+JSBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7bl9kaXN0aW5jdCguJGFkbWluM3Bjb2RlKX1gKiogc3ViLWRpc3RyaWN0cyBpbiBOVyBTeXJpYS4NCg0KPGJyPg0KDQpgYGB7cn0NCmNiciAlPiUgDQogIGZpbHRlcihwcm9qZWN0X3N0YXR1cyA9PSAiQ29tcGxldGVkIiAmIA0KICAgICAgICAgICBzdHJfZGV0ZWN0KGNsdXN0ZXIsICJNdWx0aXB1cnBvc2UiKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcnlfZnJlcSA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGRpc3RyaWN0cyA9IG5fZGlzdGluY3QoYWRtaW4ycGNvZGUpLCANCiAgICAgICAgICAgIGNvbW11bml0aWVzID0gbl9kaXN0aW5jdChhZG1pbjRwY29kZSkpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJ5X2ZyZXEpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlJlYWNoIGFuZCBmb290cHJpbnQgb2YgY2FzaCByZXNwb25zZSBhY3RvcnMiKSAlPiUgDQogIHRoZW1lX3plYnJhKCkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSAlPiUgDQogIGZvb3Rub3RlKGFzX3BhcmFncmFwaCgiT25seSBwYXJ0bmVycyB3aG8gcHJvdmlkZWQgbW9yZSB0aGFuIFVTRCAxMDAvZmFtaWx5L21vbnRoIiksIA0KICAgICAgICAgICBpID0gMSwgaiA9IDEsIHBhcnQgPSAiaGVhZGVyIiwgaW5saW5lID0gVFJVRSwgcmVmX3N5bWJvbHMgPSAiMSIpDQogIA0KYGBgDQoNCjxicj4NCg0KSW4gdGhlIHNjYXR0ZXJwbG90IGJlbG93LCBlYWNoIHBvaW50IGlzIGEgc2luZ2xlIGNhc2ggd29ya2luZyBncm91cCBwYXJ0bmVyLiBUaGUgeC1heGlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHJlYWNoZWQgcGVyIGFnZW5jeSBhbmQgdGhlIHktYXhpcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjb21tdW5pdGllcyAoYWRtaW40KSByZWFjaGVkLiBNb3VzZSBvdmVyIGVhY2ggcG9pbnQgZm9yIG1vcmUgZGV0YWlscy4NCg0KPGJyPg0KDQoNCg0KYGBge3IgcGFydG5lci1zY2F0dGVyfQ0KcGFydG5lcl9zY2F0dGVyIDwtIGNiciAlPiUgDQogICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBjb21tdW5pdGllcyA9IG5fZGlzdGluY3QoYWRtaW40cGNvZGUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBjb21tdW5pdGllcykpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKGltcGxlbWVudGluZ19wYXJ0bmVyLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcnlfZnJlcTogIiwgZm9ybWF0KGJlbmVmaWNpYXJpZXMsIGJpZy5tYXJrID0gIiwiKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW11bml0aWVzOiAiLCBjb21tdW5pdGllcykpKSArIA0KICBzY2FsZV94X2xvZzEwKGxhYmVscyA9IGNvbW1hKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgDQogIGxhYnMoeCA9ICJCZW5lZmljaWFyeSBmcmVxdWVuY2llcyByZWFjaGVkIiwgDQogICAgICAgeSA9ICJDb21tdW5pdGllcyAoYWRtaW40KSByZWFjaGVkIiwgDQogICAgICAgdGl0bGUgPSAiSW1wbGVtZW50aW5nIHBhcnRuZXJzIC0tIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGFuZCBjb21tdW5pdGllcyByZWFjaGVkIikNCg0KZ2dwbG90bHkocGFydG5lcl9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gKGxpc3Qoc2l6ZSA9IDYpKSkpICU+JSANCiAgcGxvdGx5OjpzdHlsZShob3Zlcm9uID0gInBvaW50IikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkJlbmVmaWNpYXJpZXMgYW5kIGNvbW11bml0aWVzIHJlYWNoZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYXNoIHJlc3BvbnNlIGltcGxlbWVudGluZyBwYXJ0bmVyczsgbW91c2Ugb3ZlciBmb3IgZGV0YWlscyIsIjwvc3VwPiIpKSkNCg0KDQpgYGANCg0KDQoNCjxicj48YnI+DQoNCiMjIyA0LjEgVVNEIGRpc2J1cnNlZCBwZXIgcGFydG5lcg0KDQo8YnI+DQoNCmBgYHtyfQ0KY2JyICU+JSANCiAgZmlsdGVyKHByb2plY3Rfc3RhdHVzID09ICJDb21wbGV0ZWQiICYgDQogICAgICAgICAgIHN0cl9kZXRlY3QoY2x1c3RlciwgIk11bHRpcHVycG9zZSIpKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF91c2QgPSBzdW0odG90YWxfdXNkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGZhbWlsaWVzID0gc3VtKGZhbWlsaWVzLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZSh1c2RfcGVyX2ZhbSA9IHJvdW5kKHRvdGFsX3VzZCAvIGZhbWlsaWVzLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBgJV91c2RfdG90YWxgID0gcm91bmQodG90YWxfdXNkIC8gc3VtKHRvdGFsX3VzZCkgKiAxMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHRvdGFsX3VzZCA9IHJvdW5kKHRvdGFsX3VzZCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX3VzZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbigiVVNEIGRpc2J1cnNlZCBhbmQgZmFtaWxpZXMgcmVhY2hlZCBieSBwYXJ0bmVyIikgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgZmxleHRhYmxlOjpzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KQ0KYGBgDQoNCjxicj4NCg0KVGhlIENXRyBpcyBjdXJyZW50bHkgd29ya2luZyB3aXRoIG90aGVyIENsdXN0ZXJzIHRvIGNvbnNvbGlkYXRlIGFsbCBjYXNoLWJhc2VkIGFjdGl2aXRpZXMgYW5kIHdpbGwgc29vbiBiZSBhYmxlIHRvIHByb3ZpZGUgbW9yZSBjb21wcmVoZW5zaXZlIHJlcG9ydGluZy4gDQoNCg0KPGJyPjxicj48YnI+DQoNCiMgNS4gQW5uZXhlcw0KDQo8YnI+DQoNCiMjIyA1LjEgSW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGF0IHN1Yi1kaXN0cmljdCBsZXZlbA0KDQpDb2x1bW5zIGluY2x1ZGU6IA0KYGdvdmVybm9yYXRlYCwgYGRpc3RyaWN0YCwgYHN1Yi1kaXN0cmljdGAsIA0KYHRvdGFsIHBvcHVsYXRpb25gLCBgYmVuZWZpY2lhcmllc2AsIGB0b3RhbCB1c2QgZGlzYnVyc2VkYCwgDQpgd291bmRlZCBhbmQgZGVhZGAsIGB3b3VuZGVkIGFuZCBkZWFkIHBlciAxMDBrYCwgDQpgZGFtYWdlZCBob3VzZXNgLCBgZGFtYWdlZCBob3VzZXMgcGVyIDEwMGtgLCANCmBhZG1pbjNwY29kZWANCg0KPGJyPg0KDQpgYGB7cn0NCmVxICU+JSANCiAgbGVmdF9qb2luKGxvY2F0aW9ucyAlPiUgZGlzdGluY3QoYWRtaW4zcGNvZGUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2Rpc3RyaWN0ID0gYWRtaW4zbmFtZV9lbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWN0ID0gYWRtaW4ybmFtZV9lbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdmVybm9yYXRlID0gYWRtaW4xbmFtZV9lbiksIA0KICAgICAgICAgICAgYnkgPSAiYWRtaW4zcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihjYnIgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIocHJvamVjdF9zdGF0dXMgPT0gIkNvbXBsZXRlZCIgJiANCiAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChjbHVzdGVyLCAiTXVsdGlwdXJwb3NlIikpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllc1twcmV2aW91c2x5X2Fzc2lzdGVkID09ICJObyJdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF91c2QgPSBzdW0odG90YWxfdXNkLCBuYS5ybSA9IFRSVUUpKSwgDQogICAgICAgICAgICBieSA9ICJhZG1pbjNwY29kZSIpICU+JSANCiAgc2VsZWN0KGdvdmVybm9yYXRlLCBkaXN0cmljdCwgc3ViX2Rpc3RyaWN0LCANCiAgICAgICAgIHRvdGFsX3BvcHVsYXRpb24sIA0KICAgICAgICAgYmVuZWZpY2lhcmllcywgdG90YWxfdXNkLCANCiAgICAgICAgIHdvdW5kZWRfZGVhZCwgd291bmRlZF9kZWFkXzEwMGssIA0KICAgICAgICAgZGFtYWdlZF9ob3VzZXMsIGRhbWFnZWRfaG91c2VzXzEwMGssIA0KICAgICAgICAgYWRtaW4zcGNvZGUpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVuY2UgdGFibGUgLS0gRWFydGhxdWFrZSBpbXBhY3RzLCBmcm9tIEFDVSwgZXh0cmFjdGVkIDIwMjMwMzI4IikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJ3b3VuZGVkX2RlYWRfMTAwayIsICJkYW1hZ2VkX2hvdXNlc18xMDBrIiksIGRpZ2l0cyA9IDIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygidG90YWxfcG9wdWxhdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICJ3b3VuZGVkX2RlYWQiLCAiZGFtYWdlZF9ob3VzZXMiLCANCiAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmllcyIsICJ0b3RhbF91c2QiKSwgDQogICAgICAgICAgICAgICAgIGN1cnJlbmN5ID0gIiIsIGludGVydmFsID0gMywgbWFyayA9ICIsIikgJT4lDQogIGZvcm1hdFJvdW5kKGMoInRvdGFsX3BvcHVsYXRpb24iLCANCiAgICAgICAgICAgICAgICAid291bmRlZF9kZWFkIiwgImRhbWFnZWRfaG91c2VzIiwNCiAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmllcyIsICJ0b3RhbF91c2QiKSwgZGlnaXRzID0gMCkNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDUuMiBSZXBvcnRpbmcgcXVhbGl0eSANCg0KYGBge3J9DQptb250aF9yZXBvcnRpbmcgPC0gY2JyICU+JSANCiAgZ3JvdXBfYnkobW9udGggPSBtb250aChkaXN0cmlidXRpb25fZGF0ZSkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcikpDQpgYGANCg0KDQpUaGlzIHNlY3Rpb24gZG9jdW1lbnRzIGlzc3VlcyBlbmNvdW50ZXJlZCBpbiB0aGUgY2xlYW5pbmcgb2YgNFcgYW5kIEZTTCBkYXRhIGFuZCB0aGVpciBpbXBhY3RzIG9uIHRoZSBxdWFsaXR5IG9mIHJlcG9ydGluZyB0aGUgQ1dHIGNhbiBwcm92aWRlLiBUaGUgcmVjb21tZW5kYXRpb25zIGJ5IHRoZSBDV0cgYXJlIGluY2x1ZGVkIHRvIGVuaGFuY2UgcmVwb3J0aW5nIHF1YWxpdHk6IA0KDQoxLiBUaGUgQ1dHIGhhcyBzaGlmdGVkIGludG8gYSBuZXcgNFdzIHRlbXBsYXRlIGZvciBiaXdlZWtseSByZXBvcnRpbmcgdG8gYmV0dGVyIGNhcHR1cmUgdGhlIGVhcnRocXVha2UgcmVzcG9uc2UuIERlYWRsaW5lcyBhcmUgc2V0IG9uIHRoZSAxMHRoIGFuZCB0aGUgMjV0aCBvZiBlYWNoIG1vbnRoLiBgciBmaWx0ZXIobW9udGhfcmVwb3J0aW5nLCBtb250aCA9PSAyKSAlPiUgcHVsbChwYXJ0bmVycylgIHBhcnRuZXJzIHJlcG9ydGVkIGFjaGlldmVtZW50cyBpbiBGZWJydWFyeSBhbmQgYHIgZmlsdGVyKG1vbnRoX3JlcG9ydGluZywgbW9udGggPT0gMykgJT4lIHB1bGwocGFydG5lcnMpYCByZXBvcnRlZCBhY2hpZXZlbWVudHMgaW4gTWFyY2gsIHdpdGggYHIgZmlsdGVyKG1vbnRoX3JlcG9ydGluZywgbW9udGggPT0gNCkgJT4lIHB1bGwocGFydG5lcnMpYCBwYXJ0bmVycyBoYXZpbmcgcmVwb3J0ZWQgaW4gQXByaWwuIElmIG5vIE1QQyBhY3Rpdml0aWVzIHdlcmUgaW1wbGVtZW50ZWQsIHBsZWFzZSBpbmZvcm0gdGhlIENXRyBhcyB3ZWxsLiANCg0KMi4gRm9yIHRoaXMgcmVwb3J0aW5nIHBlcmlvZCwgYWN0aXZpdGllcyBwZXJ0YWluaW5nIHRvIGByIGZvcm1hdChzdW1fc3RhdHMgJT4lIHB1bGwoYmVuZWZpY2lhcmllcykgLSBtYXgocHJvZ3Jlc3NfbGluZSRjdW1fbGFiZWwsIG5hLnJtID0gVFJVRSksIGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyB3ZXJlIG1pc3NpbmcgdGhlaXIgZGF0ZXMgb3IgaGFkIGRhdGVzIGluIHVucmVhZGFibGUgZm9ybWF0cy4gUGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBgc3RhcnQgZGF0ZWAgYW5kIGBlbmQgZGF0ZWAgYXJlIGVudGVyZWQgaW4gdGhlIGZvcm1hdCAqKm1tL2RkL3l5eXkqKiBhbmQgc2VsZWN0IHRoZSBgbW9udGggb2YgcmVwb3J0aW5nYCBmcm9tIHRoZSBvcHRpb25zIGluIHRoZSBkcm9wZG93biBtZW51LiANCg0KMy4gRm9yIHNleC1hbmQtYWdlIGRpc2dncmVnYXRpb25zLCBwbGVhc2UgZG8gbm90IGJhY2tmaWxsIHRoZXNlIGNvbHVtbnMgdXNpbmcgY2FsY3VsYXRpb25zIGJhc2VkIG9uIHRoZSBjZW5zdXMgb3IgdGhlIE1TTkEuIElmIG5vIGRpc2FnZ3JlZ2F0ZWQgZGF0YSBpcyBhdmFpbGFibGUgdG8geW91ciBvcmdhbmlzYXRpb24sIHBsZWFzZSBsZWF2ZSB0aGVzZSBjb2x1bW5zIGJsYW5rLiANCg0KNC4gVGhlIENhc2ggV29ya2luZyBHcm91cCBpcyBjdXJyZW50bHkgb25seSBjb2xsZWN0aW5nIHBsYW5uZWQgYW5kIGltcGxlbWVudGVkICoqTXVsdGlwdXJwb3NlIENhc2gqKiBhY2hpZXZlbWVudHMuIFdoaWxzdCB0aGUgQ1dHIHdlbGNvbWVzIGFkZGl0aW9uYWwgaW5wdXRzIG9uIG90aGVyIENWQSBhY3Rpdml0aWVzLCB3ZSBhbHNvIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcG9ydGluZyBsb2FkIGlzIGFzIGxvdyBhcyBwb3NzaWJsZSBmb3IgcGFydG5lcnMgaS5lLiBpZiBhbiBhZ2VuY3kgaGFzIGltcGxlbWVudGVkIENhc2gtZm9yLVdvcmssIHRoaXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBFUkwgQ2x1c3Rlci4gVGhlIENXRyB3aWxsIHdvcmsgd2l0aCBhbGwgQ2x1c3RlcnMgdG8gZGV2ZWxvcCBhIGNvbnNvbGlkYXRlZCBwaWN0dXJlIG9mIHJlc3BvbnNlLXdpZGUgQ1ZBIGludGVydmVudGlvbnMuIA0KDQo1LiBQbGVhc2UgaW5kaWNhdGUgaW4gdGhlIGBwcmV2aW91c2x5X2Fzc2lzdGVkYCBjb2x1bW4gd2hldGhlciBvciBub3QgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gcmVhY2hlZCBiZWZvcmUuIEhvd2V2ZXIsIGJlbmVmaWNpYXJpZXMgYXJlIGJlaW5nIHJlcG9ydGVkIHRvIHRoZSBDYXNoIFdvcmtpbmcgR3JvdXAgZm9yIHRoaXMgZmlyc3QgdGltZSwgZXZlbiBpZiB5b3UgaGF2ZSByZWFjaGVkIHRoZW0gYmVmb3JlLCBwbGVhc2UgaW5kaWNhdGUgYE5vYCBpbiB0aGlzIGNvbHVtbi4gVGhpcyBjb2x1bW4gaXMgdXNlZCBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB1bmlxdWUgaW5kaXZpZHVhbHMgcmVhY2hlZC4gDQoNCg0KDQoNCg0KDQoNCg0KDQo=