From 672762b833472d848279334336455b82cc50dc8f Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Wed, 12 Feb 2020 11:18:48 +0000 Subject: [PATCH 01/11] epm and epmi for Generic Reporting Framework v3.2. --- reports.epm | 27 ++++++++++++++++++++++++--- reports.epmi | 27 ++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/reports.epm b/reports.epm index 828c950..7f61e22 100644 --- a/reports.epm +++ b/reports.epm @@ -1,11 +1,12 @@ - + reports - http://git.dev.ac.uk/id/epm/reports + http://localhost:8080/id/epm/reports + document epm/reports/cfg/cfg.d/z_example_reports.pl.off text/plain 73e01974ab33e9a4d7972141c820c7a2 @@ -40,6 +41,7 @@ cGxlX2ZpZWxkcyB9Owo= + document epm/reports/cfg/cfg.d/z_reports.pl text/plain 48c622ad150bea255ba6fbee7e37083b @@ -99,6 +101,7 @@ ICAgICAgICArcmVwb3J0Cn07Cg== + document epm/reports/cfg/cfg.d/z_search_reports.pl text/plain d85eb82057d42ddbf451390ce314d0ff @@ -132,6 +135,7 @@ ICAgIHNob3dfemVyb19yZXN1bHRzID0+IDEsCn07Cgo= + document lang/en/phrases/reports.xml application/xml f344518160d45ccd1d1709a926d9e6d1 @@ -185,6 +189,7 @@ X3JlcG9ydDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBocmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== + document plugins/EPrints/Plugin/Export/Grid2.pm text/plain 83d730999923d798d1acbb44c4a91667 @@ -373,6 +378,7 @@ Cj1mb3IgTElDRU5TRSBFTkQKCg== + document plugins/EPrints/Plugin/Export/MultilineCSV2.pm text/plain ece09c3f7932a096c5cf14b6165a579d @@ -421,6 +427,7 @@ c2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo9Zm9yIExJQ0VOU0UgRU5ECgo= + document plugins/EPrints/Plugin/Export/Report.pm text/plain 4532f1d3111eede3fe6a4e8c66965895 @@ -474,6 +481,7 @@ ZGF0YW9iai0+ZGF0YXNldC0+Y29uZmlkID0+ICRkYXRhb2JqLAoJfTsKfQoKMTsK + document plugins/EPrints/Plugin/Export/Report/CSV.pm text/plain 9ca03f1aa33ed8390c18f29c2ed96d16 @@ -514,6 +522,7 @@ dWU7Cn0KCjE7ICAgICAgICAK + document plugins/EPrints/Plugin/Export/Report/CSV/Example.pm text/plain 0e433b1b61f549da00316e4971512570 @@ -530,6 +539,7 @@ ZjsKfQoKCjE7Cg== + document plugins/EPrints/Plugin/Export/Report/HTML.pm text/plain 8e2ca840f2fd1fa5983bcca0f96a7233 @@ -636,6 +646,7 @@ dGF0aW9uX2xpbmsgKTsKCiAgICAgICAgcmV0dXJuICRwOwp9CgoxOyAgICAgICAgCg== + document plugins/EPrints/Plugin/Export/Report/JSON.pm text/plain 3786d272e437a488408e5825270e1609 @@ -761,6 +772,7 @@ YWx1ZVwiIjsKCX0KCglyZXR1cm4gJHZhbHVlOwp9CgoKMTsK + document plugins/EPrints/Plugin/Screen/Report.pm text/plain e88058df69ea1db3f145b316f6d1ada2 @@ -1541,6 +1553,7 @@ ZzsKfQoKMTsK + document plugins/EPrints/Plugin/Screen/Report/EPrint.pm text/plain d3e587ba8d8f55c66102969ef662e3cb @@ -1584,6 +1597,7 @@ cmV0dXJuIEBidWxsZXRzOwp9CgoxOwo= + document plugins/EPrints/Plugin/Screen/Report/Example.pm text/plain 1c2d8c6ae6fc484e6bb1a93978ec88b9 @@ -1626,6 +1640,7 @@ ZWN0czsKfQoKMTsK + document plugins/EPrints/Plugin/Screen/Report/Example/Articles.pm text/plain 4c43aa504919a5484599af05f9b146b1 @@ -1643,6 +1658,7 @@ ID0+ICdhcnRpY2xlJyB9OwoKCXJldHVybiBcQGZpbHRlcnM7Cn0KCjE7Cg== + document plugins/EPrints/Plugin/Screen/Report/Example/ConferenceItems.pm text/plain 3c8b240f6728e37d91784edf2409a85c @@ -1661,6 +1677,7 @@ MTsK + document plugins/EPrints/Plugin/Screen/Report/User.pm text/plain cf71f006233ea48a6206f5e186956798 @@ -1702,6 +1719,7 @@ ICAgIG15IEBidWxsZXRzOwoKICAgICAgICByZXR1cm4gQGJ1bGxldHM7Cn0KCjE7Cg== + document static/images/epm/reports.png image/png 11fe836e11dc3075b829e17f64caf50d @@ -2140,6 +2158,7 @@ mCeqVAAAAABJRU5ErkJggg== + document static/javascript/auto/reports.js text/plain d02c8742a8d57f71e94e1c62635b94de @@ -2371,6 +2390,7 @@ aXNJbnRlZ2VyKG51bSkgewogIHJldHVybiAobnVtIF4gMCkgPT09IG51bTsKfQo= + document static/style/auto/reports.css text/x-asm 04cbc93d0515c56f56929cd6a16f5a44 @@ -2425,6 +2445,7 @@ dG1sX3JlcG9ydF9wcmludDpob3ZlcnsKCWNvbG9yOiB3aGl0ZTsJCn0K + document static/images/epm/reports.png image/png 11fe836e11dc3075b829e17f64caf50d @@ -2868,7 +2889,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.1 + 3.2 diff --git a/reports.epmi b/reports.epmi index a89b2d5..4a460cf 100644 --- a/reports.epmi +++ b/reports.epmi @@ -1,11 +1,12 @@ - + reports - http://git.dev.ac.uk/id/epm/reports + http://localhost:8080/id/epm/reports + document epm/reports/cfg/cfg.d/z_example_reports.pl.off text/plain 73e01974ab33e9a4d7972141c820c7a2 @@ -13,6 +14,7 @@ 1439 + document epm/reports/cfg/cfg.d/z_reports.pl text/plain 48c622ad150bea255ba6fbee7e37083b @@ -20,6 +22,7 @@ 2869 + document epm/reports/cfg/cfg.d/z_search_reports.pl text/plain d85eb82057d42ddbf451390ce314d0ff @@ -27,6 +30,7 @@ 1400 + document lang/en/phrases/reports.xml application/xml f344518160d45ccd1d1709a926d9e6d1 @@ -34,6 +38,7 @@ 2563 + document plugins/EPrints/Plugin/Export/Grid2.pm text/plain 83d730999923d798d1acbb44c4a91667 @@ -41,6 +46,7 @@ 10222 + document plugins/EPrints/Plugin/Export/MultilineCSV2.pm text/plain ece09c3f7932a096c5cf14b6165a579d @@ -48,6 +54,7 @@ 2279 + document plugins/EPrints/Plugin/Export/Report.pm text/plain 4532f1d3111eede3fe6a4e8c66965895 @@ -55,6 +62,7 @@ 2556 + document plugins/EPrints/Plugin/Export/Report/CSV.pm text/plain 9ca03f1aa33ed8390c18f29c2ed96d16 @@ -62,6 +70,7 @@ 1785 + document plugins/EPrints/Plugin/Export/Report/CSV/Example.pm text/plain 0e433b1b61f549da00316e4971512570 @@ -69,6 +78,7 @@ 409 + document plugins/EPrints/Plugin/Export/Report/HTML.pm text/plain 8e2ca840f2fd1fa5983bcca0f96a7233 @@ -76,6 +86,7 @@ 5578 + document plugins/EPrints/Plugin/Export/Report/JSON.pm text/plain 3786d272e437a488408e5825270e1609 @@ -83,6 +94,7 @@ 6648 + document plugins/EPrints/Plugin/Screen/Report.pm text/plain e88058df69ea1db3f145b316f6d1ada2 @@ -90,6 +102,7 @@ 43956 + document plugins/EPrints/Plugin/Screen/Report/EPrint.pm text/plain d3e587ba8d8f55c66102969ef662e3cb @@ -97,6 +110,7 @@ 1961 + document plugins/EPrints/Plugin/Screen/Report/Example.pm text/plain 1c2d8c6ae6fc484e6bb1a93978ec88b9 @@ -104,6 +118,7 @@ 1893 + document plugins/EPrints/Plugin/Screen/Report/Example/Articles.pm text/plain 4c43aa504919a5484599af05f9b146b1 @@ -111,6 +126,7 @@ 499 + document plugins/EPrints/Plugin/Screen/Report/Example/ConferenceItems.pm text/plain 3c8b240f6728e37d91784edf2409a85c @@ -118,6 +134,7 @@ 516 + document plugins/EPrints/Plugin/Screen/Report/User.pm text/plain cf71f006233ea48a6206f5e186956798 @@ -125,6 +142,7 @@ 1873 + document static/images/epm/reports.png image/png 11fe836e11dc3075b829e17f64caf50d @@ -132,6 +150,7 @@ 24469 + document static/javascript/auto/reports.js text/plain d02c8742a8d57f71e94e1c62635b94de @@ -139,6 +158,7 @@ 12701 + document static/style/auto/reports.css text/x-asm 04cbc93d0515c56f56929cd6a16f5a44 @@ -154,6 +174,7 @@ + document static/images/epm/reports.png image/png 11fe836e11dc3075b829e17f64caf50d @@ -166,7 +187,7 @@ coverimage - 3.1 + 3.2 From 9211f3146856142db28f4dc613fa1c1b4b9ca46d Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Fri, 28 Feb 2020 16:14:02 +0000 Subject: [PATCH 02/11] Update Report screen and CSV output to better handle older versions of LibXML and update JSON report to deal with custom fields that are not already fields defined in the given dataset. --- lib/plugins/EPrints/Plugin/Export/Grid2.pm | 19 ++--- .../EPrints/Plugin/Export/Report/JSON.pm | 74 ++++++++++--------- lib/plugins/EPrints/Plugin/Screen/Report.pm | 4 +- 3 files changed, 51 insertions(+), 46 deletions(-) diff --git a/lib/plugins/EPrints/Plugin/Export/Grid2.pm b/lib/plugins/EPrints/Plugin/Export/Grid2.pm index d3cb84e..9b51687 100644 --- a/lib/plugins/EPrints/Plugin/Export/Grid2.pm +++ b/lib/plugins/EPrints/Plugin/Export/Grid2.pm @@ -58,7 +58,7 @@ sub header_row { if( defined $opts{custom_export} && defined $opts{custom_export}->{$f} ) { - push @names, $ds->repository->html_phrase( "exportfieldoptions:$f" ); + push @names, $ds->repository->phrase( "exportfieldoptions:$f" ); } else { @@ -66,7 +66,7 @@ sub header_row if ($field->isa("EPrints::MetaField::Multipart")) { - my $parent_name = $field->render_name; + my $parent_name = $field->display_name( $field->repository ); if( $field->isa( "EPrints::MetaField::Name" )) #need to deal with legacy phrase id's { foreach my $bit ( $field->get_input_bits() ) @@ -76,11 +76,11 @@ sub header_row my $custom_phrase = $field->name . "_" . $bit; if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) #allow a custom phrase to be used { - push @names, $ds->repository->html_phrase( $custom_phrase ); + push @names, $ds->repository->phrase( $custom_phrase ); } else { - push @names, $parent_name . ": " . $ds->repository->html_phrase( "lib/metafield:".$bit ); + push @names, $parent_name . ": " . $ds->repository->phrase( "lib/metafield:".$bit ); } } } @@ -99,17 +99,17 @@ sub header_row my $custom_phrase = $field->name . "_" . $sub_field->name; if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) #allow a custom phrase to be used { - push @names, $ds->repository->html_phrase( $custom_phrase ); + push @names, $ds->repository->phrase( $custom_phrase ); } else { - push @names, $field->render_name . ": " . $sub_field->render_name; + push @names, $field->display_name( $field->repository ) . ": " . $sub_field->display_name( $sub_field->repository ); } } } else { - push @names, $field->render_name; + push @names, $field->display_name( $field->repository ); } } } @@ -300,7 +300,7 @@ sub value_to_rows { if( $value ne "" ) { - push @rows, [$field->render_single_value( $field->repository, $value )]; + push @rows, [EPrints::Utils::tree_to_utf8( $field->render_single_value( $field->repository, $value ) )]; } else { @@ -309,7 +309,8 @@ sub value_to_rows } elsif( !$field->isa("EPrints::MetaField::Subobject") && $field->is_virtual ) { - push @rows, [$dataobj->render_value( $field->name )]; + #push @rows, [$dataobj->render_value( $field->name )]; + push @rows, [$value]; } else { diff --git a/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm b/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm index 198ff5a..c6808d1 100644 --- a/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm +++ b/lib/plugins/EPrints/Plugin/Export/Report/JSON.pm @@ -154,45 +154,49 @@ sub _epdata_to_json foreach my $fieldname ( @{$self->{exportfields}} ) { - my @fnames = split( /\./, $fieldname ); - if( scalar( @fnames > 1 ) ) #a field of another dataset, e.g. documents.content + my @fnames = split( /\./, $fieldname ); + if( scalar( @fnames > 1 ) ) #a field of another dataset, e.g. documents.content + { + my $field = $self->{dataset}->get_field( $fnames[0] ); #first get the field + if( $field->is_type( "subobject", "itemref" ) ) #if thee field belongs to another dataset { - my $field = $self->{dataset}->get_field( $fnames[0] ); #first get the field - if( $field->is_type( "subobject", "itemref" ) ) #if thee field belongs to another dataset - { - my $subsubdata = $subdata->{$fnames[0]} || []; #create an array for the sub ojects - my $dataobjs= $epdata->value( $fnames[0] ); #get the dataobjects this field represents - for (my $i=0; $i < scalar( @{$dataobjs} ); $i++) - { - my $obj = @{$dataobjs}[$i]; #get the value from the dataobject - my $value = $obj->value( $fnames[1] ); - next if !EPrints::Utils::is_set( $value ); - - my $subsubsubdata = $subdata->{$fnames[0]}[$i] || {}; - $subsubsubdata->{$fnames[1]} = $value; - - $subdata->{$fnames[0]}[$i] = $subsubsubdata; - } - } - } - else - { - my $field = $self->{dataset}->get_field( $fieldname ); + my $subsubdata = $subdata->{$fnames[0]} || []; #create an array for the sub ojects + my $dataobjs= $epdata->value( $fnames[0] ); #get the dataobjects this field represents + for (my $i=0; $i < scalar( @{$dataobjs} ); $i++) + { + my $obj = @{$dataobjs}[$i]; #get the value from the dataobject + my $value = $obj->value( $fnames[1] ); + next if !EPrints::Utils::is_set( $value ); + + my $subsubsubdata = $subdata->{$fnames[0]}[$i] || {}; + $subsubsubdata->{$fnames[1]} = $value; + + $subdata->{$fnames[0]}[$i] = $subsubsubdata; + } + } + } + else + { + if( defined $repo->config( $self->{report}->{export_conf}, "custom_export" ) && + exists $repo->config( $self->{report}->{export_conf}, "custom_export" )->{$fieldname} ) + { + my $value = $repo->config( $self->{report}->{export_conf}, "custom_export" )->{$fieldname}->( $epdata, $self->{report} ); + $subdata->{$fieldname} = $value; + } + else + { + my $field = $self->{dataset}->get_field( $fieldname ); next if !$field->get_property( "export_as_xml" ); next if defined $field->{sub_name}; - my $value = $field->get_value( $epdata ); - if( defined $repo->config( $self->{report}->{export_conf}, "custom_export" ) && - exists $repo->config( $self->{report}->{export_conf}, "custom_export" )->{$field->get_name} ) - { - $value = $repo->config( $self->{report}->{export_conf}, "custom_export" )->{$field->get_name}->( $epdata, $self->{report} ); - } - if( defined $field->{virtual} ) - { - $value = EPrints::Utils::tree_to_utf8( $epdata->render_value( $field->get_name ) ); - } - next if !EPrints::Utils::is_set( $value ); + my $value = $field->get_value( $epdata ); + if( defined $field->{virtual} ) + { + $value = EPrints::Utils::tree_to_utf8( $epdata->render_value( $field->get_name ) ); + } + next if !EPrints::Utils::is_set( $value ); $subdata->{$field->get_name} = $value; - } + } + } } $subdata->{uri} = $epdata->uri; diff --git a/lib/plugins/EPrints/Plugin/Screen/Report.pm b/lib/plugins/EPrints/Plugin/Screen/Report.pm index ce6ae05..34a58ea 100644 --- a/lib/plugins/EPrints/Plugin/Screen/Report.pm +++ b/lib/plugins/EPrints/Plugin/Screen/Report.pm @@ -728,7 +728,7 @@ sub render_controls onclick => "clearForm();", class => "ep_form_action_button clear_button", ) ); - $clear_btn->appendChild( $xml->create_text_node( $self->{session}->html_phrase( "lib/searchexpression:action_reset" ) ) ); + $clear_btn->appendChild( $xml->create_text_node( $self->{session}->phrase( "lib/searchexpression:action_reset" ) ) ); return $div; } @@ -892,7 +892,7 @@ sub render_export_bar onclick => "toggleCheckboxes();", class => "ep_form_action_button select_button", ) ); - $select_btn->appendChild( $xml->create_text_node( $repo->html_phrase( "report_select" ) ) ); + $select_btn->appendChild( $xml->create_text_node( $repo->phrase( "report_select" ) ) ); #allow user to choose which fields they want to export my $export_options = $repo->make_element( "div" ); From 9433621450d9764f53204b9aeaddbdc1d0642726 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Fri, 28 Feb 2020 16:15:24 +0000 Subject: [PATCH 03/11] Update GRF to v3.3 --- reports.epm | 1289 +++++++++++++++++++++++++------------------------- reports.epmi | 14 +- 2 files changed, 655 insertions(+), 648 deletions(-) diff --git a/reports.epm b/reports.epm index 7f61e22..2a41e21 100644 --- a/reports.epm +++ b/reports.epm @@ -192,9 +192,9 @@ X3JlcG9ydDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBocmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - 83d730999923d798d1acbb44c4a91667 + 6699a48d6ff758192b7ab8ff05790b3f MD5 - 10222 + 10355 PWhlYWQxIE5BTUUKCkVQcmludHM6OlBsdWdpbjo6RXhwb3J0OjpHcmlkMgoKPWN1dAoKcGFja2Fn ZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6R3JpZDI7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2Ug RVByaW50czo6UGx1Z2luOjpFeHBvcnQ7CgpASVNBID0gKCAiRVByaW50czo6UGx1Z2luOjpFeHBv @@ -213,168 +213,170 @@ ZmllbGRzID0gJG9wdHN7ZmllbGRzfSB8fD0gWyRzZWxmLT5maWVsZHMoJG9wdHN7bGlzdH0tPntk YXRhc2V0fSldOwoJbXkgJGRzID0gJG9wdHN7bGlzdH0tPntkYXRhc2V0fTsKCglteSBAbmFtZXM7 Cglmb3JlYWNoIG15ICRmIChAJGZpZWxkcykKCXsKCQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21f ZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZ9ICkKICAgICAgICAg -ICAgICAgIHsKICAgICAgICAgICAgICAgIAlwdXNoIEBuYW1lcywgJGRzLT5yZXBvc2l0b3J5LT5o -dG1sX3BocmFzZSggImV4cG9ydGZpZWxkb3B0aW9uczokZiIgKTsKICAgICAgICAgICAgICAgIH0K -CQllbHNlCgkJewoJCQlteSAkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25m -aWdfc3RyaW5nKCAkZHMsICRmICk7CgoJCQlpZiAoJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFG -aWVsZDo6TXVsdGlwYXJ0IikpCgkJCXsKCQkJCW15ICRwYXJlbnRfbmFtZSA9ICRmaWVsZC0+cmVu -ZGVyX25hbWU7CgkJCQlpZiggJGZpZWxkLT5pc2EoICJFUHJpbnRzOjpNZXRhRmllbGQ6Ok5hbWUi -ICkpICNuZWVkIHRvIGRlYWwgd2l0aCBsZWdhY3kgcGhyYXNlIGlkJ3MKCQkJCXsKCQkJCQlmb3Jl -YWNoIG15ICRiaXQgKCAkZmllbGQtPmdldF9pbnB1dF9iaXRzKCkgKQoJCQkJICAgICAgICB7CgkJ -CQkJCSRiaXQgPSAiZ2l2ZW5fbmFtZXMiIGlmKCAkYml0IGVxICJnaXZlbiIgKTsKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJJGJpdCA9ICJmYW1pbHlfbmFt -ZXMiIGlmKCAkYml0IGVxICJmYW1pbHkiICk7CgkJCQkJCW15ICRjdXN0b21fcGhyYXNlID0gJGZp -ZWxkLT5uYW1lIC4gIl8iIC4gJGJpdDsKCQkJCQkJaWYoICRkcy0+cmVwb3NpdG9yeS0+Z2V0X2xh -bmctPmhhc19waHJhc2UoICRjdXN0b21fcGhyYXNlICkgKSAjYWxsb3cgYSBjdXN0b20gcGhyYXNl -IHRvIGJlIHVzZWQKCQkJCQkJewoJCQkJCQkJcHVzaCBAbmFtZXMsICRkcy0+cmVwb3NpdG9yeS0+ -aHRtbF9waHJhc2UoICRjdXN0b21fcGhyYXNlICk7CgkJCQkJCX0KCQkJCQkJZWxzZQoJCQkJCQl7 -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlwdXNoIEBu -YW1lcywgJHBhcmVudF9uYW1lIC4gIjogIiAuICRkcy0+cmVwb3NpdG9yeS0+aHRtbF9waHJhc2Uo -ICJsaWIvbWV0YWZpZWxkOiIuJGJpdCApOwoJCQkJCQl9CiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICB9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJbXkgJG5hbWUgPSAk -ZmllbGQtPm5hbWU7CgkJCQkJcHVzaCBAbmFtZXMsIG1hcCB7CgkJCQkJCSRuYW1lIC4gJy4nIC4g -JF8tPntzdWJfbmFtZX0KCQkJCQl9IEB7JGZpZWxkLT5wcm9wZXJ0eSgiZmllbGRzX2NhY2hlIil9 -OwoJCQkJfQoJCQl9CgkJCWVsc2lmKCAkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpD -b21wb3VuZCIgKSApCgkJCXsKCQkJCWZvcmVhY2ggbXkgJHN1Yl9maWVsZCAoQHskZmllbGQtPnBy -b3BlcnR5KCJmaWVsZHNfY2FjaGUiKX0pCgkJCQl7CgkJCQkJbXkgJGN1c3RvbV9waHJhc2UgPSAk -ZmllbGQtPm5hbWUgLiAiXyIgLiAkc3ViX2ZpZWxkLT5uYW1lOwoJCQkJCWlmKCAkZHMtPnJlcG9z -aXRvcnktPmdldF9sYW5nLT5oYXNfcGhyYXNlKCAkY3VzdG9tX3BocmFzZSApICkgI2FsbG93IGEg -Y3VzdG9tIHBocmFzZSB0byBiZSB1c2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcHVzaCBA -bmFtZXMsICRkcy0+cmVwb3NpdG9yeS0+aHRtbF9waHJhc2UoICRjdXN0b21fcGhyYXNlICk7CiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJZWxzZQoJCQkJCXsK -CQkJCQkJcHVzaCBAbmFtZXMsICRmaWVsZC0+cmVuZGVyX25hbWUgLiAiOiAiIC4gJHN1Yl9maWVs -ZC0+cmVuZGVyX25hbWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcHVzaCBA -bmFtZXMsICRmaWVsZC0+cmVuZGVyX25hbWU7CgkJCX0KCQl9Cgl9CQkKCXJldHVybiBAbmFtZXM7 -Cn0KCnN1YiBkYXRhb2JqX3RvX3Jvd3MKewoJbXkoICRzZWxmLCAkZGF0YW9iaiwgJW9wdHMgKSA9 -IEBfOwoKCW15ICRtYWluX2RhdGFvYmogPSAkZGF0YW9iajsgI3N0b3JlIGRhdGFvYmogZm9yIGZ1 -dHVyZSByZWZlcmVuY2UKCglteSAkZmllbGRzID0gJG9wdHN7ZmllbGRzfSB8fCBbJHNlbGYtPmZp -ZWxkcygkZGF0YW9iai0+e2RhdGFzZXR9KV07CglteSAkZHMgPSAkb3B0c3tsaXN0fS0+e2RhdGFz -ZXR9OwoKCW15IEByb3dzID0gKFtdKTsKCWZvcmVhY2ggbXkgJGZuYW1lIChAJGZpZWxkcykKCXsK -CQkjcmVzZXQgZGF0YW9iaiB0byBtYWluIGRhdGFvYmoKCQkkZGF0YW9iaiA9ICRtYWluX2RhdGFv -Ymo7CgoJCSNnZXQgdGhlIGZpZWxkIGZyb20gdGhlIGlkCgkJbXkgJGZpZWxkOwoJCW15IEBmbmFt -ZXMgPSBzcGxpdCggL1wuLywgJGZuYW1lICk7CgkJbXkgJHN1Yl9kYXRhb2JqX3ZhbHVlcyA9IFtd -OwkJCgkJaWYoIHNjYWxhciggQGZuYW1lcyA+IDEgKSApICNhIGZpZWxkIG9mIGFub3RoZXIgZGF0 -YXNldCwgZS5nLiBkb2N1bWVudHMuY29udGVudAogICAgICAgICAgICAgICAgewoJCQkkZmllbGQg -PSAkZHMtPmdldF9maWVsZCggJGZuYW1lc1swXSApOyAjZmlyc3QgZ2V0IHRoZSBmaWVsZAoJCQlp -ZiggJGZpZWxkLT5pc190eXBlKCAic3Vib2JqZWN0IiwgIml0ZW1yZWYiICkgKSAjaWYgdGhlIGZp -ZWxkIGJlbG9uZ3MgdG8gYW5vdGhlciBkYXRhc2V0CiAgICAgICAgICAgICAgICAgICAgICAgIHsK -CQkJCW15ICRzdWJfZHNfaWQgPSAkZmllbGQtPmdldF9wcm9wZXJ0eSggImRhdGFzZXRpZCIgKTsK -CQkJCW15ICRtdWx0aXBsZSA9ICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAibXVsdGlwbGUiICk7CgkJ -CQlpZiggJG11bHRpcGxlICkKCQkJCXsKCQkJCQlteSBAc3ViX2RhdGFvYmpzOwoJCQkJCSNnZXQg -dGhlIGRhdGFvYmpzIG9mIHRoaXMgZmllbGQKCQkJCQlpZiggJHN1Yl9kc19pZCBlcSAiZG9jdW1l -bnQiICkgI2RvY3VtZW50cyByZXByZXNlbnQgYSBzcGVjaWFsIGNhc2Ugb2Ygc3ViIG9iamVjdCAt -IHdlIGRvbid0IHdhbnQgdm9sYXRpbGUgZG9jdW1lbnRzIChwcm9iYWJseSkKICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsJCgkJCQkJCUBzdWJfZGF0YW9ianMgPSAkZGF0 -YW9iai0+Z2V0X2FsbF9kb2N1bWVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJCWZvcmVhY2ggbXkg -JHN1Yl9vYmogKCBAeyRkYXRhb2JqLT52YWx1ZSggJGZuYW1lc1swXSApfSApCgkJCQkJCXsKCQkJ -CQkJCXB1c2ggQHN1Yl9kYXRhb2JqcywgJGZpZWxkLT5nZXRfaXRlbSggJGRhdGFvYmotPnJlcG9z -aXRvcnksICRzdWJfb2JqICk7CgkJCQkJCX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIH0KCQkJCQkKCQkJCQkjYW5kIGJ1aWxkIHVwIGFuIGFycmF5IG9mIHRoZXNlIHN1 -YiBkYXRhb2JqJ3MgdmFsdWVzCgkJCQkJZm9yZWFjaCBteSAkb2JqICggQHN1Yl9kYXRhb2JqcyAp -ICNnZXQgdGhlIHZhbHVlcyB3ZSBhcmUgcmVxdWVzdGluZyBvZiB0aGUgZGF0YW9iamVjdHMKICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQkJI2NoZWNrIGZvciBh -IGN1c3RvbSByZW5kZXJlcgoJCQkJCQlteSAkdmFsdWU7CgkJCQkJCWlmKCBkZWZpbmVkICRvcHRz -e2N1c3RvbV9leHBvcnR9ICYmIGRlZmluZWQgJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5hbWV9 -ICkKCQkJCQkJewoJCQkJCQkJJHZhbHVlID0gJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5hbWV9 -LT4oICRvYmosICRvcHRze3BsdWdpbn0gKTsKCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCXsJCQkJ -CQkJCgkJCQkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdfc3Ry -aW5nKCAkb2JqLT5kYXRhc2V0LCAkZm5hbWVzWzFdICk7CQkJCQkJCQoJCQkJCQkJaWYoICRmaWVs -ZC0+Z2V0X3Byb3BlcnR5KCAidmlydHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJlbmRl -cmluZwoJCQkJCQkJewoJCQkJCQkJCSR2YWx1ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0 -ZjgoICRvYmotPnJlbmRlcl92YWx1ZSggJGZuYW1lc1sxXSApICk7CgkJCQkJCQl9CgkJCQkJCQll -bHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4gc2ltcGx5IGJlIHJldHJpZXZlZAoJCQkJCQkJ -ewoJCQkJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAkb2JqICk7CgkJCQkJCQl9CgkJ -CQkJCX0KCQkJCQkJcHVzaCBAeyRzdWJfZGF0YW9ial92YWx1ZXN9LCAkdmFsdWU7IAoJCQkJCX0K -CQkJCX0KCQkJCWVsc2UgI3dlIG9ubHkgaGF2ZSBvbmUgc3ViLW9iamVjdCwgCgkJCQl7CgkJCQkJ -bXkgJHN1Yl9vYmogPSAkZmllbGQtPmdldF9pdGVtKCAkZGF0YW9iai0+cmVwb3NpdG9yeSwgJGRh -dGFvYmotPnZhbHVlKCAkZm5hbWVzWzBdICkgKTsgI2dldCB0aGUgc3Vib2JqZWN0CgkJCQkJJGZp -ZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHN1Yl9vYmot -PmRhdGFzZXQsICRmbmFtZXNbMV0gKTsgI2dldCB0aGUgc3Vib2JqZWN0cyBmaWVsZAoJCQkJCW15 -ICR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAkc3ViX29iaiApOyAjZ2V0IHRoZSBzdWJvYmpl -Y3RzIHZhbHVlIGZvciB0aGlzIGZpZWxkCgkJCQkJcHVzaCBAeyRzdWJfZGF0YW9ial92YWx1ZXN9 -LCAkdmFsdWU7CQkJCQkJCgkJCQl9CgkJCX0KCQl9CgoJCW15ICRpID0gQHskcm93c1swXX07CgkJ -bXkgJF9yb3dzOwoJCWlmKCBFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkZmllbGQgKSApICN3ZSBh -bHJlYWR5IGhhdmUgb3VyIHZhbHVlcwoJCXsKCQkJaWYoIHNjYWxhciBAeyRzdWJfZGF0YW9ial92 -YWx1ZXN9ID4gMCApCgkJCXsKCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19yb3dzKCRmaWVs -ZCwgJHN1Yl9kYXRhb2JqX3ZhbHVlcywgJGRhdGFvYmopOwkJCQoJCQl9CgkJCWVsc2UgI3RoZXJl -J3Mgbm8gcmVzdWx0cywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gYWRkIGFuIGVtcHR5IGNlbGwgdG8g -dGhlIHNwcmVhZHNoZWV0CgkJCXsKCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19yb3dzKCRm -aWVsZCwgdW5kZWYpOwoJCQl9CgkJfQoJCWVsc2UgI3dlIG5lZWQgdG8gcmV0cmlldmUgb3VyIHZh -bHVlcyBmb3IgdGhpcyBmaWVsZCBmcm9tIG91ciBkYXRhb2JqIChvciBzdWJfZGF0YW9iaikKCQl7 -CgkJCW15ICR2YWx1ZTsKCQkJaWYoIGRlZmluZWQgJG9wdHN7Y3VzdG9tX2V4cG9ydH0gJiYgZGVm -aW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0gKSAjd2UgaGF2ZSBhIGN1c3RvbSBl -eHBvcnRlcgoJCQl7CgkJCQkkdmFsdWUgPSAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0t -PiggJGRhdGFvYmosICRvcHRze3BsdWdpbn0gKTsKCQkJCSRfcm93cyA9ICRzZWxmLT5jdXN0b21f -dmFsdWVfdG9fcm93cyggJHZhbHVlICk7CgkJCX0KCQkJZWxzZSAjanVzdCBnZXQgdGhlIGZpZWxk -J3MgdXN1YWwgdmFsdWUKCQkJewoJCQkJJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zy -b21fY29uZmlnX3N0cmluZyggJGRzLCAkZm5hbWUgKTsKCQkJCWlmKCAkZmllbGQtPmdldF9wcm9w -ZXJ0eSggInZpcnR1YWwiICkgKSAjdmlydHVhbCBmaWVsZHMgbmVlZCByZW5kZXJpbmcKCQkJCXsK -CQkJCQkkdmFsdWUgPSBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkZGF0YW9iai0+cmVu -ZGVyX3ZhbHVlKCAkZm5hbWUgKSApOwoJCQkJfQoJCQkJZWxzZSAjcmVndWxhciBmaWVsZCB2YWx1 -ZXMgY2FuIHNpbXBseSBiZSByZXRyaWV2ZWQKCQkJCXsKCQkJCQkkdmFsdWUgPSAkZmllbGQtPmdl -dF92YWx1ZSggJGRhdGFvYmogKTsKCQkJCX0KCQkJCSRfcm93cyA9ICRzZWxmLT52YWx1ZV90b19y -b3dzKCRmaWVsZCwgJHZhbHVlLCAkZGF0YW9iaik7IAkJCgkJCX0JCQkKCQl9CgoJCWZvcmVhY2gg -bXkgJGogKDAuLiQjJF9yb3dzKQoJCXsKCQkJZm9yZWFjaCBteSAkX2kgKDAuLiQjeyRfcm93cy0+ -WyRqXX0pCgkJCXsKCQkJCSRyb3dzWyRqXVskaSskX2ldID0gJF9yb3dzLT5bJGpdWyRfaV07CgkJ -CX0KCQl9Cgl9CgoJIyBnZW5lcmF0ZSBjb21wbGV0ZSByb3dzCglpZigkb3B0c3twbHVnaW59LT5w -YXJhbSggIm11bHRpbGluZV9yZXBlYXQiICkpICN3ZSB3YW50IGVhY2ggY29sdW1uIHRvIHJlcGVh -dCBmb3IgZWFjaCByb3cKCXsKCQlmb3JlYWNoIG15ICRpICgwLi4oc2NhbGFyIEByb3dzKS0xKQoJ -CXsKCQkJZm9yZWFjaCBteSAkaiAoMC4uJCN7JHJvd3NbMF19KQoJCQl7CgkJCQkkcm93c1skaV1b -JGpdIHx8PSAkcm93c1swXVskal07CgkJCX0JCgkJfQoJfQoJZWxzZSAjd2UgZG9uJ3Qgd2FudCBy -ZXBlYXRpbmcgdmFsdWVzIGluIHRoZSBjb2x1bW5zCgl7CQoJCWZvcihAcm93cykgewoJCQkkXy0+ -WzBdID0gJHJvd3NbMF1bMF07ICNmaXJzdCBlbGVtZW50IG9mIHRoaXMgYXJyYXkgZXF1YWxzIHRo -ZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBmaXJzdCByb3cKCQkJJF8tPlskI3skcm93c1swXX1dIHx8 -PSB1bmRlZjsKCQl9CgoJfQoKCXJldHVybiBcQHJvd3M7Cn0KCnN1YiB2YWx1ZV90b19yb3dzCnsK -CW15ICgkc2VsZiwgJGZpZWxkLCAkdmFsdWUsICRkYXRhb2JqKSA9IEBfOwoKCW15IEByb3dzOwoK -CWlmIChyZWYoJHZhbHVlKSBlcSAiQVJSQVkiKQoJewoJCSR2YWx1ZSA9IFskZmllbGQtPmVtcHR5 -X3ZhbHVlXSBpZiAhQCR2YWx1ZTsKCQlAcm93cyA9IG1hcCB7ICRzZWxmLT52YWx1ZV90b19yb3dz -KCRmaWVsZCwgJF8sICRkYXRhb2JqKS0+WzBdIH0gQCR2YWx1ZTsKCX0KCWVsc2lmICgkZmllbGQt -PmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpNdWx0aXBhcnQiKSkKCXsKCQlpZiggJGZpZWxkLT5p -c2EoICJFUHJpbnRzOjpNZXRhRmllbGQ6Ok5hbWUiICkpICNuZWVkIHRvIGRlYWwgd2l0aCBsZWdh -Y3kgcGhyYXNlIGlkJ3MKICAgICAgICAgICAgICAgIHsKCQkJbXkgQGJpdF92YWx1ZXM7CgkJCWZv -cmVhY2ggbXkgJGJpdCAoICRmaWVsZC0+Z2V0X2lucHV0X2JpdHMoKSApCiAgICAgICAgICAgICAg -ICAgICAgICAgIHsKCQkJCXB1c2ggQGJpdF92YWx1ZXMsICR2YWx1ZS0+eyRiaXR9OwogICAgICAg -IAkJfQkKCQkJcHVzaCBAcm93cywgXEBiaXRfdmFsdWVzOwoJICAgICAgICB9CgkJZWxzZQoJCXsK -CQkJcHVzaCBAcm93cywgW21hcCB7ICR2YWx1ZS0+eyRfLT57c3ViX25hbWV9fSB9IEB7JGZpZWxk -LT5wcm9wZXJ0eSgiZmllbGRzX2NhY2hlIil9XTsKCQl9Cgl9CgllbHNpZiAoJGZpZWxkLT5pc2Eo -IkVQcmludHM6Ok1ldGFGaWVsZDo6Q29tcG91bmQiKSkKCXsKCQlteSBAc3ViX3ZhbHVlczsKCQlm -b3JlYWNoIG15ICRrZXkgKGtleXMgJXskdmFsdWV9KQoJCXsKCQkJcHVzaCBAc3ViX3ZhbHVlcywg -JHZhbHVlLT57JGtleX07CgkJfQoJCXB1c2ggQHJvd3MsIFxAc3ViX3ZhbHVlczsKCX0KCWVsc2lm -KCAkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxkOjpTdWJqZWN0IikpCiAgICAgICAgewog -ICAgICAgICAgICAgICAgaWYoICR2YWx1ZSBuZSAiIiApCiAgICAgICAgICAgICAgICB7CiAgICAg -ICAgICAgICAgICAgICAgICAgIHB1c2ggQHJvd3MsIFskZmllbGQtPnJlbmRlcl9zaW5nbGVfdmFs -dWUoICRmaWVsZC0+cmVwb3NpdG9yeSwgJHZhbHVlICldOwogICAgICAgICAgICAgICAgfQogICAg -ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg -ICBwdXNoIEByb3dzLCBbJHZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNp -ZiggISRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OlN1Ym9iamVjdCIpICYmICRmaWVs -ZC0+aXNfdmlydHVhbCApCgl7CgkJcHVzaCBAcm93cywgWyRkYXRhb2JqLT5yZW5kZXJfdmFsdWUo -ICRmaWVsZC0+bmFtZSApXTsKCX0KCWVsc2UKCXsKCQlwdXNoIEByb3dzLCBbJHZhbHVlXTsKCX0K -CglyZXR1cm4gXEByb3dzOwp9CgojdXNlZCBmb3IgY3VzdG9tIGV4cG9ydHMgdGhhdCBtaWdodCBy -ZXR1cm4gYSBmaWVsZCBvciBhbiBhcnJheSAoYnV0IGFyZW4ndCBuZWNlc2FyaWx5IGFzc29jaWF0 -ZWQgd2l0aCBhIGZpZWxkISkKc3ViIGN1c3RvbV92YWx1ZV90b19yb3dzCnsKICAgICAgICBteSAo -JHNlbGYsICR2YWx1ZSkgPSBAXzsKCiAgICAgICAgbXkgQHJvd3M7CgogICAgICAgIGlmIChyZWYo -JHZhbHVlKSBlcSAiQVJSQVkiKQogICAgICAgIHsKICAgICAgICAgICAgICAgIEByb3dzID0gbWFw -IHsgJHNlbGYtPmN1c3RvbV92YWx1ZV90b19yb3dzKCRfKS0+WzBdIH0gQCR2YWx1ZTsKICAgICAg -ICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgICAgIHB1c2ggQHJvd3MsIFsk -dmFsdWVdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxAcm93czsKfQoKCjE7Cgo9aGVhZDEg -Q09QWVJJR0hUCgo9Zm9yIENPUFlSSUdIVCBCRUdJTgoKQ29weXJpZ2h0IDIwMDAtMjAxMSBVbml2 -ZXJzaXR5IG9mIFNvdXRoYW1wdG9uLgoKPWZvciBDT1BZUklHSFQgRU5ECgo9Zm9yIExJQ0VOU0Ug -QkVHSU4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVQcmludHMgTDxodHRwOi8vd3d3LmVwcmludHMu -b3JnLz4uCgpFUHJpbnRzIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 -IGFuZC9vciBtb2RpZnkgaXQKdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy -YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCmJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k -YXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCihhdCB5b3VyIG9wdGlv -bikgYW55IGxhdGVyIHZlcnNpb24uCgpFUHJpbnRzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl -IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91 -dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgpGSVRORVNT -IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1 -YmxpYwpMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg -YSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgYWxvbmcgd2l0 -aCBFUHJpbnRzLiAgSWYgbm90LCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4K -Cj1mb3IgTElDRU5TRSBFTkQKCg== +ICAgICAgIHsKICAgICAgICAgICAgICAgIAlwdXNoIEBuYW1lcywgJGRzLT5yZXBvc2l0b3J5LT5w +aHJhc2UoICJleHBvcnRmaWVsZG9wdGlvbnM6JGYiICk7CiAgICAgICAgICAgICAgICB9CgkJZWxz +ZQoJCXsKCQkJbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0 +cmluZyggJGRzLCAkZiApOwoKCQkJaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6 +Ok11bHRpcGFydCIpKQoJCQl7CgkJCQlteSAkcGFyZW50X25hbWUgPSAkZmllbGQtPmRpc3BsYXlf +bmFtZSggJGZpZWxkLT5yZXBvc2l0b3J5ICk7CgkJCQlpZiggJGZpZWxkLT5pc2EoICJFUHJpbnRz +OjpNZXRhRmllbGQ6Ok5hbWUiICkpICNuZWVkIHRvIGRlYWwgd2l0aCBsZWdhY3kgcGhyYXNlIGlk +J3MKCQkJCXsKCQkJCQlmb3JlYWNoIG15ICRiaXQgKCAkZmllbGQtPmdldF9pbnB1dF9iaXRzKCkg +KQoJCQkJICAgICAgICB7CgkJCQkJCSRiaXQgPSAiZ2l2ZW5fbmFtZXMiIGlmKCAkYml0IGVxICJn +aXZlbiIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJ +JGJpdCA9ICJmYW1pbHlfbmFtZXMiIGlmKCAkYml0IGVxICJmYW1pbHkiICk7CgkJCQkJCW15ICRj +dXN0b21fcGhyYXNlID0gJGZpZWxkLT5uYW1lIC4gIl8iIC4gJGJpdDsKCQkJCQkJaWYoICRkcy0+ +cmVwb3NpdG9yeS0+Z2V0X2xhbmctPmhhc19waHJhc2UoICRjdXN0b21fcGhyYXNlICkgKSAjYWxs +b3cgYSBjdXN0b20gcGhyYXNlIHRvIGJlIHVzZWQKCQkJCQkJewoJCQkJCQkJcHVzaCBAbmFtZXMs +ICRkcy0+cmVwb3NpdG9yeS0+cGhyYXNlKCAkY3VzdG9tX3BocmFzZSApOwoJCQkJCQl9CgkJCQkJ +CWVsc2UKCQkJCQkJewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAJcHVzaCBAbmFtZXMsICRwYXJlbnRfbmFtZSAuICI6ICIgLiAkZHMtPnJlcG9zaXRvcnkt +PnBocmFzZSggImxpYi9tZXRhZmllbGQ6Ii4kYml0ICk7CgkJCQkJCX0KICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlteSAk +bmFtZSA9ICRmaWVsZC0+bmFtZTsKCQkJCQlwdXNoIEBuYW1lcywgbWFwIHsKCQkJCQkJJG5hbWUg +LiAnLicgLiAkXy0+e3N1Yl9uYW1lfQoJCQkJCX0gQHskZmllbGQtPnByb3BlcnR5KCJmaWVsZHNf +Y2FjaGUiKX07CgkJCQl9CgkJCX0KCQkJZWxzaWYoICRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRh +RmllbGQ6OkNvbXBvdW5kIiApICkKCQkJewoJCQkJZm9yZWFjaCBteSAkc3ViX2ZpZWxkIChAeyRm +aWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfSkKCQkJCXsKCQkJCQlteSAkY3VzdG9tX3Bo +cmFzZSA9ICRmaWVsZC0+bmFtZSAuICJfIiAuICRzdWJfZmllbGQtPm5hbWU7CgkJCQkJaWYoICRk +cy0+cmVwb3NpdG9yeS0+Z2V0X2xhbmctPmhhc19waHJhc2UoICRjdXN0b21fcGhyYXNlICkgKSAj +YWxsb3cgYSBjdXN0b20gcGhyYXNlIHRvIGJlIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +IAlwdXNoIEBuYW1lcywgJGRzLT5yZXBvc2l0b3J5LT5waHJhc2UoICRjdXN0b21fcGhyYXNlICk7 +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJZWxzZQoJCQkJ +CXsKCQkJCQkJcHVzaCBAbmFtZXMsICRmaWVsZC0+ZGlzcGxheV9uYW1lKCAkZmllbGQtPnJlcG9z +aXRvcnkgKSAuICI6ICIgLiAkc3ViX2ZpZWxkLT5kaXNwbGF5X25hbWUoICRzdWJfZmllbGQtPnJl +cG9zaXRvcnkgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwdXNoIEBuYW1l +cywgJGZpZWxkLT5kaXNwbGF5X25hbWUoICRmaWVsZC0+cmVwb3NpdG9yeSApOwoJCQl9CgkJfQoJ +fQkJCglyZXR1cm4gQG5hbWVzOwp9CgpzdWIgZGF0YW9ial90b19yb3dzCnsKCW15KCAkc2VsZiwg +JGRhdGFvYmosICVvcHRzICkgPSBAXzsKCglteSAkbWFpbl9kYXRhb2JqID0gJGRhdGFvYmo7ICNz +dG9yZSBkYXRhb2JqIGZvciBmdXR1cmUgcmVmZXJlbmNlCgoJbXkgJGZpZWxkcyA9ICRvcHRze2Zp +ZWxkc30gfHwgWyRzZWxmLT5maWVsZHMoJGRhdGFvYmotPntkYXRhc2V0fSldOwoJbXkgJGRzID0g +JG9wdHN7bGlzdH0tPntkYXRhc2V0fTsKCglteSBAcm93cyA9IChbXSk7Cglmb3JlYWNoIG15ICRm +bmFtZSAoQCRmaWVsZHMpCgl7CgkJI3Jlc2V0IGRhdGFvYmogdG8gbWFpbiBkYXRhb2JqCgkJJGRh +dGFvYmogPSAkbWFpbl9kYXRhb2JqOwoKCQkjZ2V0IHRoZSBmaWVsZCBmcm9tIHRoZSBpZAoJCW15 +ICRmaWVsZDsKCQlteSBAZm5hbWVzID0gc3BsaXQoIC9cLi8sICRmbmFtZSApOwoJCW15ICRzdWJf +ZGF0YW9ial92YWx1ZXMgPSBbXTsJCQoJCWlmKCBzY2FsYXIoIEBmbmFtZXMgPiAxICkgKSAjYSBm +aWVsZCBvZiBhbm90aGVyIGRhdGFzZXQsIGUuZy4gZG9jdW1lbnRzLmNvbnRlbnQKICAgICAgICAg +ICAgICAgIHsKCQkJJGZpZWxkID0gJGRzLT5nZXRfZmllbGQoICRmbmFtZXNbMF0gKTsgI2ZpcnN0 +IGdldCB0aGUgZmllbGQKCQkJaWYoICRmaWVsZC0+aXNfdHlwZSggInN1Ym9iamVjdCIsICJpdGVt +cmVmIiApICkgI2lmIHRoZSBmaWVsZCBiZWxvbmdzIHRvIGFub3RoZXIgZGF0YXNldAogICAgICAg +ICAgICAgICAgICAgICAgICB7CgkJCQlteSAkc3ViX2RzX2lkID0gJGZpZWxkLT5nZXRfcHJvcGVy +dHkoICJkYXRhc2V0aWQiICk7CgkJCQlteSAkbXVsdGlwbGUgPSAkZmllbGQtPmdldF9wcm9wZXJ0 +eSggIm11bHRpcGxlIiApOwoJCQkJaWYoICRtdWx0aXBsZSApCgkJCQl7CgkJCQkJbXkgQHN1Yl9k +YXRhb2JqczsKCQkJCQkjZ2V0IHRoZSBkYXRhb2JqcyBvZiB0aGlzIGZpZWxkCgkJCQkJaWYoICRz +dWJfZHNfaWQgZXEgImRvY3VtZW50IiApICNkb2N1bWVudHMgcmVwcmVzZW50IGEgc3BlY2lhbCBj +YXNlIG9mIHN1YiBvYmplY3QgLSB3ZSBkb24ndCB3YW50IHZvbGF0aWxlIGRvY3VtZW50cyAocHJv +YmFibHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CQoJCQkJCQlA +c3ViX2RhdGFvYmpzID0gJGRhdGFvYmotPmdldF9hbGxfZG9jdW1lbnRzOwogICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ewoJCQkJCQlmb3JlYWNoIG15ICRzdWJfb2JqICggQHskZGF0YW9iai0+dmFsdWUoICRmbmFtZXNb +MF0gKX0gKQoJCQkJCQl7CgkJCQkJCQlwdXNoIEBzdWJfZGF0YW9ianMsICRmaWVsZC0+Z2V0X2l0 +ZW0oICRkYXRhb2JqLT5yZXBvc2l0b3J5LCAkc3ViX29iaiApOwoJCQkJCQl9CiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJCgkJCQkJI2FuZCBidWlsZCB1cCBh +biBhcnJheSBvZiB0aGVzZSBzdWIgZGF0YW9iaidzIHZhbHVlcwoJCQkJCWZvcmVhY2ggbXkgJG9i +aiAoIEBzdWJfZGF0YW9ianMgKSAjZ2V0IHRoZSB2YWx1ZXMgd2UgYXJlIHJlcXVlc3Rpbmcgb2Yg +dGhlIGRhdGFvYmplY3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7 +CgkJCQkJCSNjaGVjayBmb3IgYSBjdXN0b20gcmVuZGVyZXIKCQkJCQkJbXkgJHZhbHVlOwoJCQkJ +CQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRze2N1c3Rv +bV9leHBvcnR9LT57JGZuYW1lfSApCgkJCQkJCXsKCQkJCQkJCSR2YWx1ZSA9ICRvcHRze2N1c3Rv +bV9leHBvcnR9LT57JGZuYW1lfS0+KCAkb2JqLCAkb3B0c3twbHVnaW59ICk7CgkJCQkJCX0KCQkJ +CQkJZWxzZQoJCQkJCQl7CQkJCQkJCQoJCQkJCQkJJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZp +ZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJG9iai0+ZGF0YXNldCwgJGZuYW1lc1sxXSApOwkJCQkJ +CQkKCQkJCQkJCWlmKCAkZmllbGQtPmdldF9wcm9wZXJ0eSggInZpcnR1YWwiICkgKSAjdmlydHVh +bCBmaWVsZHMgbmVlZCByZW5kZXJpbmcKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBFUHJpbnRz +OjpVdGlsczo6dHJlZV90b191dGY4KCAkb2JqLT5yZW5kZXJfdmFsdWUoICRmbmFtZXNbMV0gKSAp +OwoJCQkJCQkJfQoJCQkJCQkJZWxzZSAjcmVndWxhciBmaWVsZCB2YWx1ZXMgY2FuIHNpbXBseSBi +ZSByZXRyaWV2ZWQKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSAkZmllbGQtPmdldF92YWx1ZSgg +JG9iaiApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXB1c2ggQHskc3ViX2RhdGFvYmpfdmFsdWVz +fSwgJHZhbHVlOyAKCQkJCQl9CgkJCQl9CgkJCQllbHNlICN3ZSBvbmx5IGhhdmUgb25lIHN1Yi1v +YmplY3QsIAoJCQkJewoJCQkJCW15ICRzdWJfb2JqID0gJGZpZWxkLT5nZXRfaXRlbSggJGRhdGFv +YmotPnJlcG9zaXRvcnksICRkYXRhb2JqLT52YWx1ZSggJGZuYW1lc1swXSApICk7ICNnZXQgdGhl +IHN1Ym9iamVjdAoJCQkJCSRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZp +Z19zdHJpbmcoICRzdWJfb2JqLT5kYXRhc2V0LCAkZm5hbWVzWzFdICk7ICNnZXQgdGhlIHN1Ym9i +amVjdHMgZmllbGQKCQkJCQlteSAkdmFsdWUgPSAkZmllbGQtPmdldF92YWx1ZSggJHN1Yl9vYmog +KTsgI2dldCB0aGUgc3Vib2JqZWN0cyB2YWx1ZSBmb3IgdGhpcyBmaWVsZAoJCQkJCXB1c2ggQHsk +c3ViX2RhdGFvYmpfdmFsdWVzfSwgJHZhbHVlOwkJCQkJCQoJCQkJfQoJCQl9CgkJfQoKCQlteSAk +aSA9IEB7JHJvd3NbMF19OwoJCW15ICRfcm93czsKCQlpZiggRVByaW50czo6VXRpbHM6OmlzX3Nl +dCggJGZpZWxkICkgKSAjd2UgYWxyZWFkeSBoYXZlIG91ciB2YWx1ZXMKCQl7CgkJCWlmKCBzY2Fs +YXIgQHskc3ViX2RhdGFvYmpfdmFsdWVzfSA+IDAgKQoJCQl7CgkJCQkkX3Jvd3MgPSAkc2VsZi0+ +dmFsdWVfdG9fcm93cygkZmllbGQsICRzdWJfZGF0YW9ial92YWx1ZXMsICRkYXRhb2JqKTsJCQkK +CQkJfQoJCQllbHNlICN0aGVyZSdzIG5vIHJlc3VsdHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGFk +ZCBhbiBlbXB0eSBjZWxsIHRvIHRoZSBzcHJlYWRzaGVldAoJCQl7CgkJCQkkX3Jvd3MgPSAkc2Vs +Zi0+dmFsdWVfdG9fcm93cygkZmllbGQsIHVuZGVmKTsKCQkJfQoJCX0KCQllbHNlICN3ZSBuZWVk +IHRvIHJldHJpZXZlIG91ciB2YWx1ZXMgZm9yIHRoaXMgZmllbGQgZnJvbSBvdXIgZGF0YW9iaiAo +b3Igc3ViX2RhdGFvYmopCgkJewoJCQlteSAkdmFsdWU7CgkJCWlmKCBkZWZpbmVkICRvcHRze2N1 +c3RvbV9leHBvcnR9ICYmIGRlZmluZWQgJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5hbWV9ICkg +I3dlIGhhdmUgYSBjdXN0b20gZXhwb3J0ZXIKCQkJewoJCQkJJHZhbHVlID0gJG9wdHN7Y3VzdG9t +X2V4cG9ydH0tPnskZm5hbWV9LT4oICRkYXRhb2JqLCAkb3B0c3twbHVnaW59ICk7CgkJCQkkX3Jv +d3MgPSAkc2VsZi0+Y3VzdG9tX3ZhbHVlX3RvX3Jvd3MoICR2YWx1ZSApOwoJCQl9CgkJCWVsc2Ug +I2p1c3QgZ2V0IHRoZSBmaWVsZCdzIHVzdWFsIHZhbHVlCgkJCXsKCQkJCSRmaWVsZCA9IEVQcmlu +dHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRkcywgJGZuYW1lICk7CgkJCQlp +ZiggJGZpZWxkLT5nZXRfcHJvcGVydHkoICJ2aXJ0dWFsIiApICkgI3ZpcnR1YWwgZmllbGRzIG5l +ZWQgcmVuZGVyaW5nCgkJCQl7CgkJCQkJJHZhbHVlID0gRVByaW50czo6VXRpbHM6OnRyZWVfdG9f +dXRmOCggJGRhdGFvYmotPnJlbmRlcl92YWx1ZSggJGZuYW1lICkgKTsKCQkJCX0KCQkJCWVsc2Ug +I3JlZ3VsYXIgZmllbGQgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmV0cmlldmVkCgkJCQl7CgkJCQkJ +JHZhbHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRkYXRhb2JqICk7CgkJCQl9CgkJCQkkX3Jvd3Mg +PSAkc2VsZi0+dmFsdWVfdG9fcm93cygkZmllbGQsICR2YWx1ZSwgJGRhdGFvYmopOyAJCQoJCQl9 +CQkJCgkJfQoKCQlmb3JlYWNoIG15ICRqICgwLi4kIyRfcm93cykKCQl7CgkJCWZvcmVhY2ggbXkg +JF9pICgwLi4kI3skX3Jvd3MtPlskal19KQoJCQl7CgkJCQkkcm93c1skal1bJGkrJF9pXSA9ICRf +cm93cy0+WyRqXVskX2ldOwoJCQl9CgkJfQoJfQoKCSMgZ2VuZXJhdGUgY29tcGxldGUgcm93cwoJ +aWYoJG9wdHN7cGx1Z2lufS0+cGFyYW0oICJtdWx0aWxpbmVfcmVwZWF0IiApKSAjd2Ugd2FudCBl +YWNoIGNvbHVtbiB0byByZXBlYXQgZm9yIGVhY2ggcm93Cgl7CgkJZm9yZWFjaCBteSAkaSAoMC4u +KHNjYWxhciBAcm93cyktMSkKCQl7CgkJCWZvcmVhY2ggbXkgJGogKDAuLiQjeyRyb3dzWzBdfSkK +CQkJewoJCQkJJHJvd3NbJGldWyRqXSB8fD0gJHJvd3NbMF1bJGpdOwoJCQl9CQoJCX0KCX0KCWVs +c2UgI3dlIGRvbid0IHdhbnQgcmVwZWF0aW5nIHZhbHVlcyBpbiB0aGUgY29sdW1ucwoJewkKCQlm +b3IoQHJvd3MpIHsKCQkJJF8tPlswXSA9ICRyb3dzWzBdWzBdOyAjZmlyc3QgZWxlbWVudCBvZiB0 +aGlzIGFycmF5IGVxdWFscyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZmlyc3Qgcm93CgkJCSRf +LT5bJCN7JHJvd3NbMF19XSB8fD0gdW5kZWY7CgkJfQoKCX0KCglyZXR1cm4gXEByb3dzOwp9Cgpz +dWIgdmFsdWVfdG9fcm93cwp7CglteSAoJHNlbGYsICRmaWVsZCwgJHZhbHVlLCAkZGF0YW9iaikg +PSBAXzsKCglteSBAcm93czsKCglpZiAocmVmKCR2YWx1ZSkgZXEgIkFSUkFZIikKCXsKCQkkdmFs +dWUgPSBbJGZpZWxkLT5lbXB0eV92YWx1ZV0gaWYgIUAkdmFsdWU7CgkJQHJvd3MgPSBtYXAgeyAk +c2VsZi0+dmFsdWVfdG9fcm93cygkZmllbGQsICRfLCAkZGF0YW9iaiktPlswXSB9IEAkdmFsdWU7 +Cgl9CgllbHNpZiAoJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFGaWVsZDo6TXVsdGlwYXJ0Iikp +Cgl7CgkJaWYoICRmaWVsZC0+aXNhKCAiRVByaW50czo6TWV0YUZpZWxkOjpOYW1lIiApKSAjbmVl +ZCB0byBkZWFsIHdpdGggbGVnYWN5IHBocmFzZSBpZCdzCiAgICAgICAgICAgICAgICB7CgkJCW15 +IEBiaXRfdmFsdWVzOwoJCQlmb3JlYWNoIG15ICRiaXQgKCAkZmllbGQtPmdldF9pbnB1dF9iaXRz +KCkgKQogICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQlwdXNoIEBiaXRfdmFsdWVzLCAkdmFs +dWUtPnskYml0fTsKICAgICAgICAJCX0JCgkJCXB1c2ggQHJvd3MsIFxAYml0X3ZhbHVlczsKCSAg +ICAgICAgfQoJCWVsc2UKCQl7CgkJCXB1c2ggQHJvd3MsIFttYXAgeyAkdmFsdWUtPnskXy0+e3N1 +Yl9uYW1lfX0gfSBAeyRmaWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfV07CgkJfQoJfQoJ +ZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OkNvbXBvdW5kIikpCgl7CgkJ +bXkgQHN1Yl92YWx1ZXM7CgkJZm9yZWFjaCBteSAka2V5IChrZXlzICV7JHZhbHVlfSkKCQl7CgkJ +CXB1c2ggQHN1Yl92YWx1ZXMsICR2YWx1ZS0+eyRrZXl9OwoJCX0KCQlwdXNoIEByb3dzLCBcQHN1 +Yl92YWx1ZXM7Cgl9CgllbHNpZiggJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFGaWVsZDo6U3Vi +amVjdCIpKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKCAkdmFsdWUgbmUgIiIgKQogICAg +ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEByb3dzLCBbRVByaW50 +czo6VXRpbHM6OnRyZWVfdG9fdXRmOCggJGZpZWxkLT5yZW5kZXJfc2luZ2xlX3ZhbHVlKCAkZmll +bGQtPnJlcG9zaXRvcnksICR2YWx1ZSApICldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg +ICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNo +IEByb3dzLCBbJHZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNpZiggISRm +aWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OlN1Ym9iamVjdCIpICYmICRmaWVsZC0+aXNf +dmlydHVhbCApCgl7CgkJI3B1c2ggQHJvd3MsIFskZGF0YW9iai0+cmVuZGVyX3ZhbHVlKCAkZmll +bGQtPm5hbWUgKV07CgkJcHVzaCBAcm93cywgWyR2YWx1ZV07Cgl9CgllbHNlCgl7CgkJcHVzaCBA +cm93cywgWyR2YWx1ZV07Cgl9CgoJcmV0dXJuIFxAcm93czsKfQoKI3VzZWQgZm9yIGN1c3RvbSBl +eHBvcnRzIHRoYXQgbWlnaHQgcmV0dXJuIGEgZmllbGQgb3IgYW4gYXJyYXkgKGJ1dCBhcmVuJ3Qg +bmVjZXNhcmlseSBhc3NvY2lhdGVkIHdpdGggYSBmaWVsZCEpCnN1YiBjdXN0b21fdmFsdWVfdG9f +cm93cwp7CiAgICAgICAgbXkgKCRzZWxmLCAkdmFsdWUpID0gQF87CgogICAgICAgIG15IEByb3dz +OwoKICAgICAgICBpZiAocmVmKCR2YWx1ZSkgZXEgIkFSUkFZIikKICAgICAgICB7CiAgICAgICAg +ICAgICAgICBAcm93cyA9IG1hcCB7ICRzZWxmLT5jdXN0b21fdmFsdWVfdG9fcm93cygkXyktPlsw +XSB9IEAkdmFsdWU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAg +ICAgICBwdXNoIEByb3dzLCBbJHZhbHVlXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQHJv +d3M7Cn0KCgoxOwoKPWhlYWQxIENPUFlSSUdIVAoKPWZvciBDT1BZUklHSFQgQkVHSU4KCkNvcHly +aWdodCAyMDAwLTIwMTEgVW5pdmVyc2l0eSBvZiBTb3V0aGFtcHRvbi4KCj1mb3IgQ09QWVJJR0hU +IEVORAoKPWZvciBMSUNFTlNFIEJFR0lOCgpUaGlzIGZpbGUgaXMgcGFydCBvZiBFUHJpbnRzIEw8 +aHR0cDovL3d3dy5lcHJpbnRzLm9yZy8+LgoKRVByaW50cyBpcyBmcmVlIHNvZnR3YXJlOiB5b3Ug +Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CnVuZGVyIHRoZSB0ZXJtcyBvZiB0 +aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApieSB0aGUg +RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNl +LCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKRVByaW50cyBpcyBkaXN0 +cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVApB +TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO +VEFCSUxJVFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO +VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNo +b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp +YwpMaWNlbnNlIGFsb25nIHdpdGggRVByaW50cy4gIElmIG5vdCwgc2VlIEw8aHR0cDovL3d3dy5n +bnUub3JnL2xpY2Vuc2VzLz4uCgo9Zm9yIExJQ0VOU0UgRU5ECgo= @@ -649,9 +651,9 @@ dGF0aW9uX2xpbmsgKTsKCiAgICAgICAgcmV0dXJuICRwOwp9CgoxOyAgICAgICAgCg== document plugins/EPrints/Plugin/Export/Report/JSON.pm text/plain - 3786d272e437a488408e5825270e1609 + c4b031c985ca0de7c8263474b232be14 MD5 - 6648 + 6994 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6UmVwb3J0OjpKU09OOwoKdXNlIEVQcmlu dHM6OlBsdWdpbjo6RXhwb3J0OjpSZXBvcnQ7CkBJU0EgPSAoICJFUHJpbnRzOjpQbHVnaW46OkV4 cG9ydDo6UmVwb3J0IiApOwoKdXNlIHN0cmljdDsKCnN1YiBuZXcKewoJbXkoICRjbGFzcywgJXBh @@ -721,63 +723,69 @@ ICAgICAgICAgICAgICAgICAgICAgJGVwZGF0YS0+aXNhKCAiRVByaW50czo6RGF0YU9iajo6RG9j dW1lbnQiICkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgJGVwZGF0YS0+aGFzX3JlbGF0aW9u KCB1bmRlZiwgImlzVm9sYXRpbGVWZXJzaW9uT2YiICkKICAgICAgICAgICAgICAgICAgKTsKCiAg ICAgICAgICAgICAgICBmb3JlYWNoIG15ICRmaWVsZG5hbWUgKCBAeyRzZWxmLT57ZXhwb3J0Zmll -bGRzfX0gKQogICAgICAgICAgICAgICAgewoJCQlteSBAZm5hbWVzID0gc3BsaXQoIC9cLi8sICRm -aWVsZG5hbWUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNjYWxhciggQGZuYW1lcyA+ -IDEgKSApICNhIGZpZWxkIG9mIGFub3RoZXIgZGF0YXNldCwgZS5nLiBkb2N1bWVudHMuY29udGVu -dAogICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQlteSAkZmllbGQgPSAkc2VsZi0+e2RhdGFz -ZXR9LT5nZXRfZmllbGQoICRmbmFtZXNbMF0gKTsgI2ZpcnN0IGdldCB0aGUgZmllbGQKICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggJGZpZWxkLT5pc190eXBlKCAic3Vib2JqZWN0 -IiwgIml0ZW1yZWYiICkgKSAjaWYgdGhlZSBmaWVsZCBiZWxvbmdzIHRvIGFub3RoZXIgZGF0YXNl -dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKCQkJCQlteSAkc3Vic3ViZGF0YSA9 -ICRzdWJkYXRhLT57JGZuYW1lc1swXX0gfHwgW107ICNjcmVhdGUgYW4gYXJyYXkgZm9yIHRoZSBz -dWIgb2plY3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW15ICRkYXRhb2Jqcz0g -JGVwZGF0YS0+dmFsdWUoICRmbmFtZXNbMF0gKTsgI2dldCB0aGUgZGF0YW9iamVjdHMgdGhpcyBm -aWVsZCByZXByZXNlbnRzCgkJCQkJZm9yIChteSAkaT0wOyAkaSA8IHNjYWxhciggQHskZGF0YW9i -anN9ICk7ICRpKyspCgkJCQkJewoJCQkJCQlteSAkb2JqID0gQHskZGF0YW9ianN9WyRpXTsgI2dl -dCB0aGUgdmFsdWUgZnJvbSB0aGUgZGF0YW9iamVjdAkJCQoJCQkJCQlteSAkdmFsdWUgPSAkb2Jq -LT52YWx1ZSggJGZuYW1lc1sxXSApOwoJCQkJCQluZXh0IGlmICFFUHJpbnRzOjpVdGlsczo6aXNf -c2V0KCAkdmFsdWUgKTsKCgkJCQkJCW15ICRzdWJzdWJzdWJkYXRhID0gJHN1YmRhdGEtPnskZm5h -bWVzWzBdfVskaV0gfHwge307CgkJCQkJCSRzdWJzdWJzdWJkYXRhLT57JGZuYW1lc1sxXX0gPSAk -dmFsdWU7CQkKCgkJCQkJCSRzdWJkYXRhLT57JGZuYW1lc1swXX1bJGldID0gJHN1YnN1YnN1YmRh -dGE7CQkJCQkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgfQoJCQl9CgkJCWVsc2UKCQkJewoJCQkJbXkgJGZpZWxkID0gJHNlbGYtPntkYXRhc2V0fS0+ -Z2V0X2ZpZWxkKCAkZmllbGRuYW1lICk7CgkgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlm -ICEkZmllbGQtPmdldF9wcm9wZXJ0eSggImV4cG9ydF9hc194bWwiICk7CiAgICAgICAgCSAgICAg -ICAgICAgICAgICBuZXh0IGlmIGRlZmluZWQgJGZpZWxkLT57c3ViX25hbWV9OwoJCQkJbXkgJHZh -bHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRlcGRhdGEgKTsKCQkJCWlmKCBkZWZpbmVkICRyZXBv -LT5jb25maWcoICRzZWxmLT57cmVwb3J0fS0+e2V4cG9ydF9jb25mfSwgImN1c3RvbV9leHBvcnQi -ICkgJiYKCQkJCQlleGlzdHMgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntyZXBvcnR9LT57ZXhwb3J0 -X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKS0+eyRmaWVsZC0+Z2V0X25hbWV9ICkKICAgICAgICAJ -ICAgICAgICAgICAgICAgIHsKCQkJCQkkdmFsdWUgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e3Jl -cG9ydH0tPntleHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApLT57JGZpZWxkLT5nZXRfbmFt -ZX0tPiggJGVwZGF0YSwgJHNlbGYtPntyZXBvcnR9ICk7CgkJCQl9CgkJCQlpZiggZGVmaW5lZCAk -ZmllbGQtPnt2aXJ0dWFsfSApCgkJCQl7CgkJCQkJJHZhbHVlID0gRVByaW50czo6VXRpbHM6OnRy -ZWVfdG9fdXRmOCggJGVwZGF0YS0+cmVuZGVyX3ZhbHVlKCAkZmllbGQtPmdldF9uYW1lICkgKTsK -CQkJCX0KCQkgICAgICAgICAgICAgICAgbmV4dCBpZiAhRVByaW50czo6VXRpbHM6OmlzX3NldCgg -JHZhbHVlICk7CiAgICAgICAgCSAgICAgICAgICAgICAgICAkc3ViZGF0YS0+eyRmaWVsZC0+Z2V0 -X25hbWV9ID0gJHZhbHVlOwoJCQl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAk -c3ViZGF0YS0+e3VyaX0gPSAkZXBkYXRhLT51cmk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRz -ZWxmLT5fZXBkYXRhX3RvX2pzb24oICRzdWJkYXRhLCAkZGVwdGggKyAxLCAwLCAlb3B0cyApOwog -ICAgICAgIH0KfQoKCnN1YiBlc2NhcGVfdmFsdWUKewoJbXkoICRwbHVnaW4sICR2YWx1ZSApID0g -QF87CgoJcmV0dXJuICciIicgdW5sZXNzKCBkZWZpbmVkIEVQcmludHM6OlV0aWxzOjppc19zZXQo -ICR2YWx1ZSApICk7CgoJIyBzdHJpcHMgYW55IGtpbmQgb2YgZG91YmxlLXF1b3RlczoKCSR2YWx1 -ZSA9fiBzL1x4OTN8XHg5NHwiLycvZzsKCSMgYW5kIGNvbnRyb2wtY2hhcmFjdGVycwoJJHZhbHVl -ID1+IHMvXG58XHJ8XHQvL2c7CgoJIyBpZiB2YWx1ZSBpcyBhIHB1cmUgbnVtYmVyLCB0aGVuIGFk -ZCA9IiR2YWx1ZSIgc28gdGhhdCBFeGNlbCBzdG9wcyB0aGUgYXV0by1mb3JtYXR0aW5nIChpdCdk -IHR1cm4gMTIzNDU2IGludG8gMS4yM2UrNikKCWlmKCAkdmFsdWUgPX4gL15bMC05XC1dKyQvICkK -CXsKCQlyZXR1cm4gIj1cIiR2YWx1ZVwiIjsKCX0KCgkjIG9ubHkgZXNjYXBlcyByb3cgd2l0aCBz -cGFjZXMgYW5kIGNvbW1hcwoJaWYoICR2YWx1ZSA9fiAvLHwgLyApCgl7CgkJcmV0dXJuICJcIiR2 -YWx1ZVwiIjsKCX0KCglyZXR1cm4gJHZhbHVlOwp9CgoKMTsK +bGRzfX0gKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15IEBmbmFtZXMg +PSBzcGxpdCggL1wuLywgJGZpZWxkbmFtZSApOwogICAgICAgICAgICAgICAgICAgIGlmKCBzY2Fs +YXIoIEBmbmFtZXMgPiAxICkgKSAjYSBmaWVsZCBvZiBhbm90aGVyIGRhdGFzZXQsIGUuZy4gZG9j +dW1lbnRzLmNvbnRlbnQKICAgICAgICAgICAgICAgICAgICB7CgkJCQkgICAgICAgIG15ICRmaWVs +ZCA9ICRzZWxmLT57ZGF0YXNldH0tPmdldF9maWVsZCggJGZuYW1lc1swXSApOyAjZmlyc3QgZ2V0 +IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICBpZiggJGZpZWxkLT5pc190eXBlKCAi +c3Vib2JqZWN0IiwgIml0ZW1yZWYiICkgKSAjaWYgdGhlZSBmaWVsZCBiZWxvbmdzIHRvIGFub3Ro +ZXIgZGF0YXNldAogICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQkJICAgICAgICBteSAkc3Vi +c3ViZGF0YSA9ICRzdWJkYXRhLT57JGZuYW1lc1swXX0gfHwgW107ICNjcmVhdGUgYW4gYXJyYXkg +Zm9yIHRoZSBzdWIgb2plY3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkZGF0YW9i +anM9ICRlcGRhdGEtPnZhbHVlKCAkZm5hbWVzWzBdICk7ICNnZXQgdGhlIGRhdGFvYmplY3RzIHRo +aXMgZmllbGQgcmVwcmVzZW50cwoJCQkJCSAgICAgICAgZm9yIChteSAkaT0wOyAkaSA8IHNjYWxh +ciggQHskZGF0YW9ianN9ICk7ICRpKyspCgkJCQkJICAgICAgICB7CgkJCQkJCSAgICAgICAgbXkg +JG9iaiA9IEB7JGRhdGFvYmpzfVskaV07ICNnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGRhdGFvYmpl +Y3QJCQkKCQkJCQkJICAgICAgICBteSAkdmFsdWUgPSAkb2JqLT52YWx1ZSggJGZuYW1lc1sxXSAp +OwoJCQkJCQkgICAgICAgIG5leHQgaWYgIUVQcmludHM6OlV0aWxzOjppc19zZXQoICR2YWx1ZSAp +OwoKCQkJCQkJICAgICAgICBteSAkc3Vic3Vic3ViZGF0YSA9ICRzdWJkYXRhLT57JGZuYW1lc1sw +XX1bJGldIHx8IHt9OwoJCQkJCQkgICAgICAgICRzdWJzdWJzdWJkYXRhLT57JGZuYW1lc1sxXX0g +PSAkdmFsdWU7CQkKCgkJCQkJCSAgICAgICAgJHN1YmRhdGEtPnskZm5hbWVzWzBdfVskaV0gPSAk +c3Vic3Vic3ViZGF0YTsJCQkJCQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJ +ICAgICAgICB9CgkJCSAgICAgICAgZWxzZQoJCQkgICAgICAgIHsKICAgICAgICAgICAgICAgICAg +ICAgICAgaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntyZXBvcnR9LT57ZXhwb3J0 +X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKSAmJgoJCQkJCSAgICAgICAgZXhpc3RzICRyZXBvLT5j +b25maWcoICRzZWxmLT57cmVwb3J0fS0+e2V4cG9ydF9jb25mfSwgImN1c3RvbV9leHBvcnQiICkt +PnskZmllbGRuYW1lfSApCiAgICAgICAgCSAgICAgICAgICAgIHsKCQkJCQkgICAgICAgIG15ICR2 +YWx1ZSA9ICRyZXBvLT5jb25maWcoICRzZWxmLT57cmVwb3J0fS0+e2V4cG9ydF9jb25mfSwgImN1 +c3RvbV9leHBvcnQiICktPnskZmllbGRuYW1lfS0+KCAkZXBkYXRhLCAkc2VsZi0+e3JlcG9ydH0g +KTsKCSAgICAgICAJICAgICAgICAgICAgICAgICRzdWJkYXRhLT57JGZpZWxkbmFtZX0gPSAkdmFs +dWU7CQkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAg +ICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJICAgICAgICAgICAgbXkg +JGZpZWxkID0gJHNlbGYtPntkYXRhc2V0fS0+Z2V0X2ZpZWxkKCAkZmllbGRuYW1lICk7CgkgICAg +ICAgICAgICAgICAgICAgICAgICBuZXh0IGlmICEkZmllbGQtPmdldF9wcm9wZXJ0eSggImV4cG9y +dF9hc194bWwiICk7CiAgICAgICAgCSAgICAgICAgICAgICAgICBuZXh0IGlmIGRlZmluZWQgJGZp +ZWxkLT57c3ViX25hbWV9OwoJCQkJICAgICAgICAgICAgbXkgJHZhbHVlID0gJGZpZWxkLT5nZXRf +dmFsdWUoICRlcGRhdGEgKTsKCQkJCSAgICAgICAgCWlmKCBkZWZpbmVkICRmaWVsZC0+e3ZpcnR1 +YWx9ICkKCQkJCSAgICAgICAgICAgIHsKCQkJCQkgICAgICAgICAgICAkdmFsdWUgPSBFUHJpbnRz +OjpVdGlsczo6dHJlZV90b191dGY4KCAkZXBkYXRhLT5yZW5kZXJfdmFsdWUoICRmaWVsZC0+Z2V0 +X25hbWUgKSApOwoJCQkJICAgICAgICAgICAgfQoJCSAgICAgICAgICAgICAgICAgICAgbmV4dCBp +ZiAhRVByaW50czo6VXRpbHM6OmlzX3NldCggJHZhbHVlICk7CiAgICAgICAgCSAgICAgICAgICAg +ICAgICAkc3ViZGF0YS0+eyRmaWVsZC0+Z2V0X25hbWV9ID0gJHZhbHVlOwogICAgICAgICAgICAg +ICAgICAgICAgICB9CgkJCSAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg +ICAgJHN1YmRhdGEtPnt1cml9ID0gJGVwZGF0YS0+dXJpOwoKICAgICAgICAgICAgICAgIHJldHVy +biAkc2VsZi0+X2VwZGF0YV90b19qc29uKCAkc3ViZGF0YSwgJGRlcHRoICsgMSwgMCwgJW9wdHMg +KTsKICAgICAgICB9Cn0KCgpzdWIgZXNjYXBlX3ZhbHVlCnsKCW15KCAkcGx1Z2luLCAkdmFsdWUg +KSA9IEBfOwoKCXJldHVybiAnIiInIHVubGVzcyggZGVmaW5lZCBFUHJpbnRzOjpVdGlsczo6aXNf +c2V0KCAkdmFsdWUgKSApOwoKCSMgc3RyaXBzIGFueSBraW5kIG9mIGRvdWJsZS1xdW90ZXM6Cgkk +dmFsdWUgPX4gcy9ceDkzfFx4OTR8Ii8nL2c7CgkjIGFuZCBjb250cm9sLWNoYXJhY3RlcnMKCSR2 +YWx1ZSA9fiBzL1xufFxyfFx0Ly9nOwoKCSMgaWYgdmFsdWUgaXMgYSBwdXJlIG51bWJlciwgdGhl +biBhZGQgPSIkdmFsdWUiIHNvIHRoYXQgRXhjZWwgc3RvcHMgdGhlIGF1dG8tZm9ybWF0dGluZyAo +aXQnZCB0dXJuIDEyMzQ1NiBpbnRvIDEuMjNlKzYpCglpZiggJHZhbHVlID1+IC9eWzAtOVwtXSsk +LyApCgl7CgkJcmV0dXJuICI9XCIkdmFsdWVcIiI7Cgl9CgoJIyBvbmx5IGVzY2FwZXMgcm93IHdp +dGggc3BhY2VzIGFuZCBjb21tYXMKCWlmKCAkdmFsdWUgPX4gLyx8IC8gKQoJewoJCXJldHVybiAi +XCIkdmFsdWVcIiI7Cgl9CgoJcmV0dXJuICR2YWx1ZTsKfQoKCjE7Cg== document plugins/EPrints/Plugin/Screen/Report.pm text/plain - e88058df69ea1db3f145b316f6d1ada2 + d694685745fab90a5d9960238240662a MD5 - 43956 + 43946 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OlNjcmVlbjo6UmVwb3J0OwoKIyBBYnN0cmFjdCBjbGFz cyB0aGF0IGhhbmRsZXMgdGhlIFJlcG9ydCB0b29scwoKdXNlIEpTT04gcXcoZW5jb2RlX2pzb24p Owp1c2UgRVByaW50czo6UGx1Z2luOjpTY3JlZW47CkBJU0EgPSAoICdFUHJpbnRzOjpQbHVnaW46 @@ -1124,432 +1132,431 @@ bC0+Y3JlYXRlX2VsZW1lbnQoICJidXR0b24iLAogICAgICAgIAl0eXBlID0+ICJidXR0b24iLAog ICAgICAgICAgICAgICAgb25jbGljayA9PiAiY2xlYXJGb3JtKCk7IiwKICAgICAgICAgICAgICAg IGNsYXNzID0+ICJlcF9mb3JtX2FjdGlvbl9idXR0b24gY2xlYXJfYnV0dG9uIiwKICAgICAgICAg ICAgICAgICkgKTsKICAgICAgICAkY2xlYXJfYnRuLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRl -X3RleHRfbm9kZSggJHNlbGYtPntzZXNzaW9ufS0+aHRtbF9waHJhc2UoICJsaWIvc2VhcmNoZXhw -cmVzc2lvbjphY3Rpb25fcmVzZXQiICkgKSApOwoJcmV0dXJuICRkaXY7Cn0KCnN1YiByZW5kZXIK -ewoJbXkoICRzZWxmICkgPSBAXzsKCgkjIGlmIHVzZXJzIGFjY2VzcyBTY3JlZW46OlJlcG9ydCBk -aXJlY3RseSB3ZSB3YW50IHRvIGRpc3BsYXkgc29tZSBzb3J0IG9mIG1lbnUKCSMgd2hlcmUgdXNl -cnMgY2FuIHNlbGVjdCB2aWV3YWJsZSByZXBvcnRzCglpZiggKCAiRVByaW50czo6UGx1Z2luOjoi -LiRzZWxmLT5nZXRfaWQgZXEgX19QQUNLQUdFX18gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0 -aW9ufSBuZSAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgIm5l -d3NlYXJjaCIgKQoJewkKCQlyZXR1cm4gJHNlbGYtPnJlbmRlcl9zcGxhc2hfcGFnZTsKCX0KCglt -eSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2Rv -Y19mcmFnbWVudDsKCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2V4cG9ydF9i -YXIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfZ3JvdXBfb3B0aW9ucyAp -OwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9zb3J0X29wdGlvbnMgKTsKCglp -ZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGNodW5r -LT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9yZWZpbmVfc2VhcmNoICk7Cgl9CgoJbXkgJGl0 -ZW1zID0gJHNlbGYtPml0ZW1zOwoJaWYoICFkZWZpbmVkICRpdGVtcyB8fCAkaXRlbXMtPmNvdW50 -ID09IDAgKQoJewoJCSMgTm8gaXRlbXMgbWVzc2FnZQoJfQoKCW15ICRqc29uOwoKCWlmKCBkZWZp -bmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn -cm91cH0gbmUgIiIgKQoJewoJCW15ICRncm91cGVkID0gJHNlbGYtPmdldF9ncm91cGVkX2l0ZW1z -KCAkaXRlbXMsIDEgKTsKCQkkanNvbiA9IGVuY29kZV9qc29uICRncm91cGVkOwoJfQoJZWxzZQoJ -ewoJCW15ICRpdGVtX2lkcyA9IGRlZmluZWQgJGl0ZW1zID8gJGl0ZW1zLT5pZHMgOiBbXTsKCQkk -anNvbiA9ICJbIi5qb2luKCcsJyxAJGl0ZW1faWRzKS4iXSI7Cgl9CgogICAgICAgIG15ICR1cmwg -PSAkcmVwby0+Y3VycmVudF91cmwoIGhvc3QgPT4gMSApOwogICAgICAgIG15ICRwYXJhbWV0ZXJz -ID0gVVJJLT5uZXc7CiAgICAgICAgJHBhcmFtZXRlcnMtPnF1ZXJ5X2Zvcm0oCiAgICAgICAgICAg -ICAgICAkc2VsZi0+aGlkZGVuX2JpdHMsCiAgICAgICAgKTsKICAgICAgICAkcGFyYW1ldGVycyA9 -ICRwYXJhbWV0ZXJzLT5xdWVyeTsKCQkKCW15ICRkcyA9ICRyZXBvLT5kYXRhc2V0KCAkc2VsZi0+ -cGFyYW0oICdkYXRhc2V0aWQnICkgKSBpZiBkZWZpbmVkICRzZWxmLT5wYXJhbSggJ2RhdGFzZXRp -ZCcgKTsKCW15ICRwcmVmaXggPSAkZHMtPmJhc2VfaWQgaWYgZGVmaW5lZCAkZHM7CgoJIyB0aGUg -bWFpbiA8ZGl2PgoJbXkgJGNvbnRhaW5lcl9pZCA9IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2Nv -bnRhaW5lciIsICRzZWxmLT5nZXRfcmVwb3J0ICk7CgoJI3VwZGF0ZSBqYXZhc2NyaXB0IHBhcmFt -ZXRlcnMgaWYgY29taW5nIGZyb20gYSBzZWFyY2ggcmVxdWVzdAoJaWYoICRzZWxmLT57cHJvY2Vz -c29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRwbHVnaW4gPSAkc2VsZi0+e3By -b2Nlc3Nvcn0tPntyZXBvcnR9OwoJCSRwbHVnaW4gPX4gcy86LyUzQS9nOwoJCSRwYXJhbWV0ZXJz -ID0gInNjcmVlbj0kcGx1Z2luIjsKCQkkcHJlZml4ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0 -YXNldGlkfTsKCQkkY29udGFpbmVyX2lkID0gc3ByaW50ZiggImVwX3JlcG9ydF8lc1xfY29udGFp -bmVyIiwgJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0X3BsdWdpbn0tPntyZXBvcnR9ICk7Cgl9 -CgkKCSNzaG93L2hpZGUgY29tcGxpYW5jZQoJbXkgJHNob3dfY29tcGxpYW5jZSA9IDE7Cgkkc2hv -d19jb21wbGlhbmNlID0gJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9IGlmIGRlZmluZWQgJHNlbGYt -PntzaG93X2NvbXBsaWFuY2V9OwoKCSNjdXN0b20gbGFiZWxzCglteSAkbGFiZWxzID0gMDsKCSRs -YWJlbHMgPSBlbmNvZGVfanNvbiAkc2VsZi0+e2xhYmVsc30gaWYgZGVmaW5lZCAkc2VsZi0+e2xh -YmVsc307CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPm1ha2VfamF2YXNjcmlwdCggPDwi -RU9KIiApICk7CmRvY3VtZW50Lm9ic2VydmUoImRvbTpsb2FkZWQiLCBmdW5jdGlvbigpIHsKCW5l -dyBFUHJpbnRzX1NjcmVlbl9SZXBvcnRfTG9hZGVyKCB7CgkJaWRzOiAkanNvbiwKCQlzdGVwOiAy -MCwKCQlwcmVmaXg6ICckcHJlZml4JywKCQl1cmw6ICckdXJsJywKCQlwYXJhbWV0ZXJzOiAnJHBh -cmFtZXRlcnMnLAkJCgkJY29udGFpbmVyX2lkOiAnJGNvbnRhaW5lcl9pZCcsCgkJc2hvd19jb21w -bGlhbmNlOiAkc2hvd19jb21wbGlhbmNlLAoJCWxhYmVsczogJGxhYmVscwoJfSApLmV4ZWN1dGUo -KTsKCn0pOwpFT0oKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2VsZW1lbnQoICdk -aXYnLCBjbGFzcyA9PiAnZXBfcmVwb3J0X3BhZ2UnLCBpZCA9PiAkY29udGFpbmVyX2lkICkgKTsK -Cgkjc2hvdyBzZWFyY2ggY29udHJvbHMgYWZ0ZXIgdGhlIHJlc3VsdHMgdG9vCglpZiggJHNlbGYt -Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCiAgICAgICAgewogICAgICAgICAg -ICAgICAgJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9yZWZpbmVfc2VhcmNoICk7 -CiAgICAgICAgfQoKCXJldHVybiAkY2h1bms7Cn0KCgpzdWIgcmVuZGVyX2V4cG9ydF9iYXIKewoJ -bXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRj -aHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglteSBAcGx1Z2lucyA9ICRzZWxmLT5l -eHBvcnRfcGx1Z2luczsKCXJldHVybiAkY2h1bmsgdW5sZXNzKCBzY2FsYXIoIEBwbHVnaW5zICkg -fHwgZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRm -aWVsZHMiICkgKSApOwoKCW15ICRyZXBvcnRfZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlbGYtPntk -YXRhc2V0aWR9ICk7CglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRB -dHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiApOwoKCWlmKCBkZWZpbmVkICRzZWxmLT5yZXBvc2l0 -b3J5LT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVx -ICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVu -X2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlz -ZSkgKTsKCX0KCQkKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkKCXsK -CQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic29ydCIs -ICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApICk7Cgl9CQoKCWlmKCBkZWZpbmVkICRzZWxm -LT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJl -cG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn -cm91cF9leHB9ICkgKTsKCX0JCgoJaWYoICFkZWZpbmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+ -e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIgKSApICkKCXsKCQkjbm8gY3VzdG9tIGV4cG9y -dCBmaWVsZHMgZGVmaW5lZCwgdXNlIGV4cG9ydCBwbHVnaW5zIGRlc2lnbmVkIGZvciB0aGlzIHJl -cG9ydAoJCW15ICRzZWxlY3QgPSAkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfb3B0 -aW9uX2xpc3QoCgkJCW5hbWUgPT4gJ2V4cG9ydCcsCgkJCXZhbHVlcyA9PiBbbWFwIHsgJF8tPmdl -dF9zdWJ0eXBlIH0gQHBsdWdpbnNdLAoJCQlsYWJlbHMgPT4ge21hcCB7ICRfLT5nZXRfc3VidHlw -ZSA9PiAkXy0+Z2V0X25hbWUgfSBAcGx1Z2luc30sCgkJKSApOwoJfQoJZWxzZQoJewoJCSNwcm92 -aWRlIGxpc3Qgb2YgZGVmYXVsdCBleHBvcnQgcGx1Z2lucyBmb3IgcmVwb3J0cwoJCUBwbHVnaW5z -ID0gJHNlbGYtPmV4cG9ydF9wbHVnaW5zKCAiZ2VuZXJpYyIgKTsKCQlteSAkc2VsZWN0ID0gJGZv -cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX29wdGlvbl9saXN0KAoJCQluYW1lID0+ICdl -eHBvcnQnLAoJCQl2YWx1ZXMgPT4gW21hcCB7ICRfLT5nZXRfc3VidHlwZSB9IEBwbHVnaW5zXSwK -CQkJbGFiZWxzID0+IHttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgPT4gJF8tPmdldF9uYW1lIH0gQHBs -dWdpbnN9LAoJCSkgKTsKCgkJI2NyZWF0ZSBsYWJlbHMgYW5kIHBhbmVscyBmb3IgdGFiYmVkIGlu -dGVyZmFjZWQKCQlteSAkeG1sID0gJHJlcG8tPnhtbDsKCQlteSAkeGh0bWwgPSAkcmVwby0+eGh0 -bWw7CgoJCW15ICRzZWxlY3RfYWxsID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVy -X3NlbGVjdGFsbCggJHhtbCApICk7CgkJbXkgJHNlbGVjdF9idG4gPSAkZm9ybS0+YXBwZW5kQ2hp -bGQoICR4bWwtPmNyZWF0ZV9lbGVtZW50KCAiYnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAg -dHlwZSA9PiAiYnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAgb25jbGljayA9PiAidG9nZ2xl -Q2hlY2tib3hlcygpOyIsCgkgICAgICAgICAgICAgICAgICAgIGNsYXNzID0+ICJlcF9mb3JtX2Fj -dGlvbl9idXR0b24gc2VsZWN0X2J1dHRvbiIsCgkJKSApOwoJICAgIAkkc2VsZWN0X2J0bi0+YXBw -ZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZV90ZXh0X25vZGUoICRyZXBvLT5odG1sX3BocmFzZSggInJl -cG9ydF9zZWxlY3QiICkgKSApOwoKCQkjYWxsb3cgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRz -IHRoZXkgd2FudCB0byBleHBvcnQKCQlteSAkZXhwb3J0X29wdGlvbnMgPSAkcmVwby0+bWFrZV9l -bGVtZW50KCAiZGl2IiApOwoKCQlteSBAa2V5czsKCQlpZiggZGVmaW5lZCAkcmVwby0+Y29uZmln -KCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApICkKCQl7CgkJCUBr -ZXlzID0gQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxk -X29yZGVyIiApfTsKCQl9CgkJZWxzZQoJCXsKCQkJQGtleXMgPSBrZXlzICV7JHJlcG8tPmNvbmZp -ZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMiICl9OyAKCQl9CgkJZm9yZWFj -aCBteSAka2V5ICggQGtleXMgKQoJCXsKCQkJI2NyZWF0ZSBhIG5ldyBsaXN0CQkJCgkJCW15ICR1 -bCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJ1bCIsCgkgICAgICAgICAgICAgICAgCXN0eWxlID0+ -ICJsaXN0LXN0eWxlLXR5cGU6IG5vbmUiCgkgICAgICAgIAkpOwoJCQkKCQkJbXkgJGNvdW50ID0g -MDsgI2NvdW50IGhvdyBtYW55IGZpZWxkcyB3ZSBhZGQKCQkJZm9yZWFjaCBteSAkZmllbGRuYW1l -KCBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiAp -LT57JGtleX19ICkKCQkJewoJCQkJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntl -eHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApICYmIGV4aXN0cyAkeyRyZXBvLT5jb25maWco -ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKX17JGZpZWxkbmFtZX0gKSAj -d2UgaGF2ZSBhIGN1c3RvbSBleHBvcnQgZnVuY3Rpb24gaW5zdGVhZCAKCQkJCXsKCQkJCQkkY291 -bnQrKzsKCQkJCQkkc2VsZi0+X2V4cG9ydF9maWVsZF9jaGVja2JveCggJHJlcG8sICRmaWVsZG5h -bWUsICR1bCwgJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRvcHRpb25zOiRmaWVsZG5h -bWUiICkgKTsgCgkJCQl9CgkJCQllbHNpZiggZGVmaW5lZCBFUHJpbnRzOjpVdGlsczo6ZmllbGRf -ZnJvbV9jb25maWdfc3RyaW5nKCAkcmVwb3J0X2RzLCAkZmllbGRuYW1lICkgKQoJCQkJewoJCQkJ -CW15ICRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRy -ZXBvcnRfZHMsICRmaWVsZG5hbWUgKTsKCQkJCQkkY291bnQrKzsKICAgICAgIAkJCSAgICAgICAg -CSRzZWxmLT5fZXhwb3J0X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAk -ZmllbGQtPnJlbmRlcl9uYW1lICk7CgoJCQkJfQoJCQl9CgkJCWlmKCAkY291bnQgKSAjb25seSBh -ZGQgb3B0aW9ucyBpZiB3ZSBoYXZlIGFueSBmaWVsZHMgdG8gc2hvdwoJCQl7CgkJCQlteSAkZGl2 -ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIGNsYXNzPT4icmVwb3J0X2V4cG9ydF9vcHRp -b25zIiApOwoJCQkJJGRpdi0+YXBwZW5kQ2hpbGQoIG15ICRoID0gJHJlcG8tPm1ha2VfZWxlbWVu -dCggImg0IiApICk7CgkJCQkkaC0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImV4 -cG9ydGZpZWxkczoka2V5IiApICk7CQoJCQkJJGRpdi0+YXBwZW5kQ2hpbGQoICR1bCApOwoJCQkJ -JGV4cG9ydF9vcHRpb25zLT5hcHBlbmRDaGlsZCggJGRpdiApOwoJCQl9CiAgICAgICAJCX0KCQkk -Zm9ybS0+YXBwZW5kQ2hpbGQoICRleHBvcnRfb3B0aW9ucyApOwoJfQoKCSRmb3JtLT5hcHBlbmRD -aGlsZCggCgkJJHJlcG8tPnJlbmRlcl9idXR0b24oCgkJCW5hbWUgPT4gIl9hY3Rpb25fZXhwb3J0 -IiwKCQkJY2xhc3MgPT4gImVwX2Zvcm1fYWN0aW9uX2J1dHRvbiIsCgkJCXZhbHVlID0+ICRyZXBv -LT5waHJhc2UoICdjZ2kvdXNlcnMvZWRpdF9lcHJpbnQ6ZXhwb3J0JyApCgkpICk7CgoJI2NyZWF0 -ZSBhIGNvbGxhcHNpYmxlIGJveAoJbXkgJGltYWdlc3VybCA9ICRyZXBvLT5jdXJyZW50X3VybCgg -cGF0aCA9PiAic3RhdGljIiwgInN0eWxlL2ltYWdlcyIgKTsKCW15ICVvcHRpb25zOwoJJG9wdGlv -bnN7c2Vzc2lvbn0gPSAkcmVwbzsKICAgICAgICAkb3B0aW9uc3tpZH0gPSAiZXBfcmVwb3J0X2V4 -cG9ydCI7CiAgICAgICAgJG9wdGlvbnN7dGl0bGV9ID0gJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhw -b3J0X3RpdGxlIiApOwogICAgICAgICRvcHRpb25ze2NvbGxhcHNlZH0gPSAxOwoJJG9wdGlvbnN7 -Y29udGVudH0gPSAkZm9ybTsKICAgICAgICAkb3B0aW9uc3tzaG93X2ljb25fdXJsfSA9ICIkaW1h -Z2VzdXJsL211bHRpX2Rvd24ucG5nIjsKCSRvcHRpb25ze2hpZGVfaWNvbl91cmx9ID0gIiRpbWFn -ZXN1cmwvbXVsdGlfdXAucG5nIjsKCglteSAkYm94ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRp -diIsIHN0eWxlPT4idGV4dC1hbGlnbjogbGVmdCIgKTsKCSRib3gtPmFwcGVuZENoaWxkKCBFUHJp -bnRzOjpCb3g6OnJlbmRlciggJW9wdGlvbnMgKSApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGJv -eCApOwoKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfc29ydF9vcHRpb25zCnsKCW15KCAk -c2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsg -PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmlu -ZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICkgKSAp -OwoKCW15ICRzb3J0X2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e3NvcnRfY29uZn0sICJz -b3J0ZmllbGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVy -X2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1lID0+ICJzb3J0X3JlcG9ydCIgKTsKICAg -ICAgICAkZm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVuay0+YXBw -ZW5kQ2hpbGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNlYXJjaCIg -KSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9y -bS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRz -ZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZiggZGVmaW5l -ZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hp -bGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNz -b3J9LT57Z3JvdXBfZXhwfSApICk7Cgl9CgoJI2Rpc3BsYXkgdGhlIGxpbmtzIHRoYXQgd2lsbCB0 -cmlnZ2VyIHRoZSBmb3JtCglteSAkZmlyc3QgPSAxOwoJbXkgJHNvcnRfbGlua3MgPSAkcmVwby0+ -bWFrZV9kb2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRzb3J0X25hbWUgKCBrZXlzICV7JHNvcnRf -Y29uZn0gKQogICAgICAgIHsKCQlteSAkc29ydF92YWx1ZSA9ICRzb3J0X2NvbmYtPnskc29ydF9u -YW1lfTsKCQlpZiggJGZpcnN0ICkKCQl7CgkJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJl -bmRlcl9oaWRkZW5fZmllbGQoICJzb3J0IiwgJHNvcnRfdmFsdWUpICk7CgkJfQoKCQlpZiggISRm -aXJzdCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJJHNvcnRfbGlua3MtPmFw -cGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJh -dG9yIiApICk7CiAgICAgICAgICAgICAgICB9CgkJCgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9j -ZXNzb3J9LT57c29ydH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gZXEgJHNvcnRfdmFs -dWUgKQoJCXsKCQkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7 -CgkJCSRzdHJvbmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29y -dF9jb25mfSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBl -bmRDaGlsZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9ICRyZXBvLT5y -ZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6c29ydF9yZXBvcnQoIicuJHNvcnRfdmFsdWUuJyIpJyAp -OwkKCQkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29y -dF9jb25mfSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBl -bmRDaGlsZCggJGxpbmsgKTsKCQl9CgkJJGZpcnN0ID0gMDsKICAgICAgICB9ICAgICAgICAgICAK -CSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpzb3J0X2xp -bmtzIiwgbGlua3M9PiRzb3J0X2xpbmtzICkgKTsKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5k -ZXJfZ3JvdXBfb3B0aW9ucwp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYt -PnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoKCXJl -dHVybiAkY2h1bmsgdW5sZXNzKCBkZWZpbmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3Vw -X2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICkgKSApOwoKCW15ICRncm91cF9jb25mID0gJHJlcG8tPmNv -bmZpZyggJHNlbGYtPntncm91cF9jb25mfSwgImdyb3VwZmllbGRzIiApOwoKCSNidWlsZCB0aGUg -Zm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRl -KCBuYW1lID0+ICJncm91cF9yZXBvcnQiICk7CiAgICAgICAgJGZvcm0tPnNldEF0dHJpYnV0ZSgg -bWV0aG9kID0+ICJnZXQiICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkZm9ybSApOwoJCglpZigg -ZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57 -YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVu -ZGVyX2hpZGRlbl9maWVsZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9 -LT5zZXJpYWxpc2UpICk7Cgl9CgoJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29y -dH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQo -ICJzb3J0IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkgKTsKCX0KCgkjZGlzcGxheSB0 -aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAk -Z3JvdXBfbGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRncm91 -cF92YWx1ZSAoIEB7JGdyb3VwX2NvbmZ9ICkKICAgICAgICB7CgkJbXkgKCRncm91cF9maWVsZCkg -PSBzcGxpdCgvOy8sICRncm91cF92YWx1ZSApOwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0t -PmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggImdyb3VwIiwgJGdyb3Vw -X3ZhbHVlKSApOwoJCX0KCgkJaWYoICEkZmlyc3QgKQogICAgICAgICAgICAgICAgewogICAgICAg -ICAgICAgICAgCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSgg -IlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkK -CQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9j -ZXNzb3J9LT57Z3JvdXB9IGVxICRncm91cF9maWVsZCApCgkJewoJCQlteSAkc3Ryb25nID0gJHJl -cG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRy -ZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91 -cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRzdHJvbmcgKTsKCQl9 -CgkJZWxzZQoJCXsKCQkJbXkgJGxpbmsgPSAkcmVwby0+cmVuZGVyX2xpbmsoICdqYXZhc2NyaXB0 -Omdyb3VwX3JlcG9ydCgiJy4kZ3JvdXBfdmFsdWUuJyIpJyApOwkKCQkJJGxpbmstPmFwcGVuZENo -aWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57Z3JvdXBfY29uZn0gLiAiOmdyb3VwOiIg -LiAkZ3JvdXBfZmllbGQgKSApOwoJCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayAp -OwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJCgkjbm8gZ3JvdXBpbmcg -bGluayBhdCB0aGUgZW5kCgkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9w -aHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CglpZiggZGVmaW5lZCAk +X3RleHRfbm9kZSggJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Np +b246YWN0aW9uX3Jlc2V0IiApICkgKTsKCXJldHVybiAkZGl2Owp9CgpzdWIgcmVuZGVyCnsKCW15 +KCAkc2VsZiApID0gQF87CgoJIyBpZiB1c2VycyBhY2Nlc3MgU2NyZWVuOjpSZXBvcnQgZGlyZWN0 +bHkgd2Ugd2FudCB0byBkaXNwbGF5IHNvbWUgc29ydCBvZiBtZW51CgkjIHdoZXJlIHVzZXJzIGNh +biBzZWxlY3Qgdmlld2FibGUgcmVwb3J0cwoJaWYoICggIkVQcmludHM6OlBsdWdpbjo6Ii4kc2Vs +Zi0+Z2V0X2lkIGVxIF9fUEFDS0FHRV9fICYmICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0g +bmUgInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJuZXdzZWFy +Y2giICkKCXsJCgkJcmV0dXJuICRzZWxmLT5yZW5kZXJfc3BsYXNoX3BhZ2U7Cgl9CgoJbXkgJHJl +cG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJh +Z21lbnQ7CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9leHBvcnRfYmFyICk7 +CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2dyb3VwX29wdGlvbnMgKTsKCSRj +aHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfc29ydF9vcHRpb25zICk7CgoJaWYoICRz +ZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRjaHVuay0+YXBw +ZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwoJfQoKCW15ICRpdGVtcyA9 +ICRzZWxmLT5pdGVtczsKCWlmKCAhZGVmaW5lZCAkaXRlbXMgfHwgJGl0ZW1zLT5jb3VudCA9PSAw +ICkKCXsKCQkjIE5vIGl0ZW1zIG1lc3NhZ2UKCX0KCglteSAkanNvbjsKCglpZiggZGVmaW5lZCAk c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9 -IG5lICIiICkKCXsKCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6 -Z3JvdXBfcmVwb3J0KCIiKScgKTsJCgkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9w -aHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENo -aWxkKCAkbGluayApOwoJfQoJZWxzZQoJewoJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVt -ZW50KCAic3Ryb25nIiApOwogCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhy -YXNlKCAicmVwb3J0Om5vX2dyb3VwaW5nIiApICk7CgkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGls -ZCggJHN0cm9uZyApOwoJfQoJCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJh -c2UoICJSZXBvcnQ6Z3JvdXBfbGlua3MiLCBsaW5rcz0+JGdyb3VwX2xpbmtzICkgKTsKCglyZXR1 -cm4gJGNodW5rOwp9CgpzdWIgcmVuZGVyX3JlZmluZV9zZWFyY2gKewoJbXkoICRzZWxmICkgPSBA +IG5lICIiICkKCXsKCQlteSAkZ3JvdXBlZCA9ICRzZWxmLT5nZXRfZ3JvdXBlZF9pdGVtcyggJGl0 +ZW1zLCAxICk7CgkJJGpzb24gPSBlbmNvZGVfanNvbiAkZ3JvdXBlZDsKCX0KCWVsc2UKCXsKCQlt +eSAkaXRlbV9pZHMgPSBkZWZpbmVkICRpdGVtcyA/ICRpdGVtcy0+aWRzIDogW107CgkJJGpzb24g +PSAiWyIuam9pbignLCcsQCRpdGVtX2lkcykuIl0iOwoJfQoKICAgICAgICBteSAkdXJsID0gJHJl +cG8tPmN1cnJlbnRfdXJsKCBob3N0ID0+IDEgKTsKICAgICAgICBteSAkcGFyYW1ldGVycyA9IFVS +SS0+bmV3OwogICAgICAgICRwYXJhbWV0ZXJzLT5xdWVyeV9mb3JtKAogICAgICAgICAgICAgICAg +JHNlbGYtPmhpZGRlbl9iaXRzLAogICAgICAgICk7CiAgICAgICAgJHBhcmFtZXRlcnMgPSAkcGFy +YW1ldGVycy0+cXVlcnk7CgkJCglteSAkZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlbGYtPnBhcmFt +KCAnZGF0YXNldGlkJyApICkgaWYgZGVmaW5lZCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICk7 +CglteSAkcHJlZml4ID0gJGRzLT5iYXNlX2lkIGlmIGRlZmluZWQgJGRzOwoKCSMgdGhlIG1haW4g +PGRpdj4KCW15ICRjb250YWluZXJfaWQgPSBzcHJpbnRmKCAiZXBfcmVwb3J0XyVzXF9jb250YWlu +ZXIiLCAkc2VsZi0+Z2V0X3JlcG9ydCApOwoKCSN1cGRhdGUgamF2YXNjcmlwdCBwYXJhbWV0ZXJz +IGlmIGNvbWluZyBmcm9tIGEgc2VhcmNoIHJlcXVlc3QKCWlmKCAkc2VsZi0+e3Byb2Nlc3Nvcn0t +PnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQlteSAkcGx1Z2luID0gJHNlbGYtPntwcm9jZXNz +b3J9LT57cmVwb3J0fTsKCQkkcGx1Z2luID1+IHMvOi8lM0EvZzsKCQkkcGFyYW1ldGVycyA9ICJz +Y3JlZW49JHBsdWdpbiI7CgkJJHByZWZpeCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2RhdGFzZXRp +ZH07CgkJJGNvbnRhaW5lcl9pZCA9IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIs +ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydF9wbHVnaW59LT57cmVwb3J0fSApOwoJfQoJCgkj +c2hvdy9oaWRlIGNvbXBsaWFuY2UKCW15ICRzaG93X2NvbXBsaWFuY2UgPSAxOwoJJHNob3dfY29t +cGxpYW5jZSA9ICRzZWxmLT57c2hvd19jb21wbGlhbmNlfSBpZiBkZWZpbmVkICRzZWxmLT57c2hv +d19jb21wbGlhbmNlfTsKCgkjY3VzdG9tIGxhYmVscwoJbXkgJGxhYmVscyA9IDA7CgkkbGFiZWxz +ID0gZW5jb2RlX2pzb24gJHNlbGYtPntsYWJlbHN9IGlmIGRlZmluZWQgJHNlbGYtPntsYWJlbHN9 +OwoKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2phdmFzY3JpcHQoIDw8IkVPSiIg +KSApOwpkb2N1bWVudC5vYnNlcnZlKCJkb206bG9hZGVkIiwgZnVuY3Rpb24oKSB7CgluZXcgRVBy +aW50c19TY3JlZW5fUmVwb3J0X0xvYWRlciggewoJCWlkczogJGpzb24sCgkJc3RlcDogMjAsCgkJ +cHJlZml4OiAnJHByZWZpeCcsCgkJdXJsOiAnJHVybCcsCgkJcGFyYW1ldGVyczogJyRwYXJhbWV0 +ZXJzJywJCQoJCWNvbnRhaW5lcl9pZDogJyRjb250YWluZXJfaWQnLAoJCXNob3dfY29tcGxpYW5j +ZTogJHNob3dfY29tcGxpYW5jZSwKCQlsYWJlbHM6ICRsYWJlbHMKCX0gKS5leGVjdXRlKCk7Cgp9 +KTsKRU9KCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+bWFrZV9lbGVtZW50KCAnZGl2Jywg +Y2xhc3MgPT4gJ2VwX3JlcG9ydF9wYWdlJywgaWQgPT4gJGNvbnRhaW5lcl9pZCApICk7CgoJI3No +b3cgc2VhcmNoIGNvbnRyb2xzIGFmdGVyIHRoZSByZXN1bHRzIHRvbwoJaWYoICRzZWxmLT57cHJv +Y2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQogICAgICAgIHsKICAgICAgICAgICAgICAg +ICRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwogICAg +ICAgIH0KCglyZXR1cm4gJGNodW5rOwp9CgoKc3ViIHJlbmRlcl9leHBvcnRfYmFyCnsKCW15KCAk +c2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsg +PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJbXkgQHBsdWdpbnMgPSAkc2VsZi0+ZXhwb3J0 +X3BsdWdpbnM7CglyZXR1cm4gJGNodW5rIHVubGVzcyggc2NhbGFyKCBAcGx1Z2lucyApIHx8IGRl +ZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRz +IiApICkgKTsKCglteSAkcmVwb3J0X2RzID0gJHJlcG8tPmRhdGFzZXQoICRzZWxmLT57ZGF0YXNl +dGlkfSApOwoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmli +dXRlKCBtZXRob2QgPT4gImdldCIgKTsKCglpZiggZGVmaW5lZCAkc2VsZi0+cmVwb3NpdG9yeS0+ +cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2Vh +cmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVs +ZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2UpICk7 +Cgl9CgkJCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZv +cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNl +bGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQkKCglpZiggZGVmaW5lZCAkc2VsZi0+e3By +b2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5y +ZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBf +ZXhwfSApICk7Cgl9CQoKCWlmKCAhZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv +cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICkgKSApCgl7CgkJI25vIGN1c3RvbSBleHBvcnQgZmll +bGRzIGRlZmluZWQsIHVzZSBleHBvcnQgcGx1Z2lucyBkZXNpZ25lZCBmb3IgdGhpcyByZXBvcnQK +CQlteSAkc2VsZWN0ID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX29wdGlvbl9s +aXN0KAoJCQluYW1lID0+ICdleHBvcnQnLAoJCQl2YWx1ZXMgPT4gW21hcCB7ICRfLT5nZXRfc3Vi +dHlwZSB9IEBwbHVnaW5zXSwKCQkJbGFiZWxzID0+IHttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgPT4g +JF8tPmdldF9uYW1lIH0gQHBsdWdpbnN9LAoJCSkgKTsKCX0KCWVsc2UKCXsKCQkjcHJvdmlkZSBs +aXN0IG9mIGRlZmF1bHQgZXhwb3J0IHBsdWdpbnMgZm9yIHJlcG9ydHMKCQlAcGx1Z2lucyA9ICRz +ZWxmLT5leHBvcnRfcGx1Z2lucyggImdlbmVyaWMiICk7CgkJbXkgJHNlbGVjdCA9ICRmb3JtLT5h +cHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlzdCgKCQkJbmFtZSA9PiAnZXhwb3J0 +JywKCQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgfSBAcGx1Z2luc10sCgkJCWxh +YmVscyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRfLT5nZXRfbmFtZSB9IEBwbHVnaW5z +fSwKCQkpICk7CgoJCSNjcmVhdGUgbGFiZWxzIGFuZCBwYW5lbHMgZm9yIHRhYmJlZCBpbnRlcmZh +Y2VkCgkJbXkgJHhtbCA9ICRyZXBvLT54bWw7CgkJbXkgJHhodG1sID0gJHJlcG8tPnhodG1sOwoK +CQlteSAkc2VsZWN0X2FsbCA9ICRmb3JtLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9zZWxl +Y3RhbGwoICR4bWwgKSApOwoJCW15ICRzZWxlY3RfYnRuID0gJGZvcm0tPmFwcGVuZENoaWxkKCAk +eG1sLT5jcmVhdGVfZWxlbWVudCggImJ1dHRvbiIsCgkgICAgICAgICAgICAgICAgICAgIHR5cGUg +PT4gImJ1dHRvbiIsCgkgICAgICAgICAgICAgICAgICAgIG9uY2xpY2sgPT4gInRvZ2dsZUNoZWNr +Ym94ZXMoKTsiLAoJICAgICAgICAgICAgICAgICAgICBjbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25f +YnV0dG9uIHNlbGVjdF9idXR0b24iLAoJCSkgKTsKCSAgICAJJHNlbGVjdF9idG4tPmFwcGVuZENo +aWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkcmVwby0+cGhyYXNlKCAicmVwb3J0X3NlbGVj +dCIgKSApICk7CgoJCSNhbGxvdyB1c2VyIHRvIGNob29zZSB3aGljaCBmaWVsZHMgdGhleSB3YW50 +IHRvIGV4cG9ydAoJCW15ICRleHBvcnRfb3B0aW9ucyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJk +aXYiICk7CgoJCW15IEBrZXlzOwoJCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWcoICRzZWxmLT57 +ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICkgKQoJCXsKCQkJQGtleXMgPSBAeyRy +ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICl9 +OwoJCX0KCQllbHNlCgkJewoJCQlAa2V5cyA9IGtleXMgJXskcmVwby0+Y29uZmlnKCAkc2VsZi0+ +e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIgKX07IAoJCX0KCQlmb3JlYWNoIG15ICRrZXkg +KCBAa2V5cyApCgkJewoJCQkjY3JlYXRlIGEgbmV3IGxpc3QJCQkKCQkJbXkgJHVsID0gJHJlcG8t +Pm1ha2VfZWxlbWVudCggInVsIiwKCSAgICAgICAgICAgICAgICAJc3R5bGUgPT4gImxpc3Qtc3R5 +bGUtdHlwZTogbm9uZSIKCSAgICAgICAgCSk7CgkJCQoJCQlteSAkY291bnQgPSAwOyAjY291bnQg +aG93IG1hbnkgZmllbGRzIHdlIGFkZAoJCQlmb3JlYWNoIG15ICRmaWVsZG5hbWUoIEB7JHJlcG8t +PmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMiICktPnska2V5fX0g +KQoJCQl7CgkJCQlpZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25m +fSwgImN1c3RvbV9leHBvcnQiICkgJiYgZXhpc3RzICR7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntl +eHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApfXskZmllbGRuYW1lfSApICN3ZSBoYXZlIGEg +Y3VzdG9tIGV4cG9ydCBmdW5jdGlvbiBpbnN0ZWFkIAoJCQkJewoJCQkJCSRjb3VudCsrOwoJCQkJ +CSRzZWxmLT5fZXhwb3J0X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAk +cmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRmaWVsZG9wdGlvbnM6JGZpZWxkbmFtZSIgKSApOyAK +CQkJCX0KCQkJCWVsc2lmKCBkZWZpbmVkIEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZp +Z19zdHJpbmcoICRyZXBvcnRfZHMsICRmaWVsZG5hbWUgKSApCgkJCQl7CgkJCQkJbXkgJGZpZWxk +ID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHJlcG9ydF9kcywg +JGZpZWxkbmFtZSApOwoJCQkJCSRjb3VudCsrOwogICAgICAgCQkJICAgICAgICAJJHNlbGYtPl9l +eHBvcnRfZmllbGRfY2hlY2tib3goICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRmaWVsZC0+cmVu +ZGVyX25hbWUgKTsKCgkJCQl9CgkJCX0KCQkJaWYoICRjb3VudCApICNvbmx5IGFkZCBvcHRpb25z +IGlmIHdlIGhhdmUgYW55IGZpZWxkcyB0byBzaG93CgkJCXsKCQkJCW15ICRkaXYgPSAkcmVwby0+ +bWFrZV9lbGVtZW50KCAiZGl2IiwgY2xhc3M9PiJyZXBvcnRfZXhwb3J0X29wdGlvbnMiICk7CgkJ +CQkkZGl2LT5hcHBlbmRDaGlsZCggbXkgJGggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaDQiICkg +KTsKCQkJCSRoLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRz +OiRrZXkiICkgKTsJCgkJCQkkZGl2LT5hcHBlbmRDaGlsZCggJHVsICk7CgkJCQkkZXhwb3J0X29w +dGlvbnMtPmFwcGVuZENoaWxkKCAkZGl2ICk7CgkJCX0KICAgICAgIAkJfQoJCSRmb3JtLT5hcHBl +bmRDaGlsZCggJGV4cG9ydF9vcHRpb25zICk7Cgl9CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAKCQkk +cmVwby0+cmVuZGVyX2J1dHRvbigKCQkJbmFtZSA9PiAiX2FjdGlvbl9leHBvcnQiLAoJCQljbGFz +cyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIiwKCQkJdmFsdWUgPT4gJHJlcG8tPnBocmFzZSgg +J2NnaS91c2Vycy9lZGl0X2VwcmludDpleHBvcnQnICkKCSkgKTsKCgkjY3JlYXRlIGEgY29sbGFw +c2libGUgYm94CglteSAkaW1hZ2VzdXJsID0gJHJlcG8tPmN1cnJlbnRfdXJsKCBwYXRoID0+ICJz +dGF0aWMiLCAic3R5bGUvaW1hZ2VzIiApOwoJbXkgJW9wdGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9u +fSA9ICRyZXBvOwogICAgICAgICRvcHRpb25ze2lkfSA9ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAg +ICAgICAkb3B0aW9uc3t0aXRsZX0gPSAkcmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRfdGl0bGUi +ICk7CiAgICAgICAgJG9wdGlvbnN7Y29sbGFwc2VkfSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9 +ICRmb3JtOwogICAgICAgICRvcHRpb25ze3Nob3dfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVs +dGlfZG93bi5wbmciOwoJJG9wdGlvbnN7aGlkZV9pY29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0 +aV91cC5wbmciOwoKCW15ICRib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9 +PiJ0ZXh0LWFsaWduOiBsZWZ0IiApOwoJJGJveC0+YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6 +cmVuZGVyKCAlb3B0aW9ucyApICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0 +dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9zb3J0X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBA XzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5t -YWtlX2RvY19mcmFnbWVudDsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiAp -IHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRl -c2NleHAgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2U7CgkJbXkgJGNh -Y2hlaWQgPSAkcmVwby0+cGFyYW0oICJjYWNoZSIgKTsKCQlteSAkc2NvbmYgPSAkc2VsZi0+e3Nj -b25mfTsJCgoJCSNzZXQgdXAgbmV3IHNlYXJjaCBsaW5rCgkJbXkgJG5ld19iYXNldXJsID0gVVJJ -LT5uZXcoICRzZWxmLT57c2Vzc2lvbn0tPmdldF91cmkgKTsKICAgICAgICAJJG5ld19iYXNldXJs -LT5xdWVyeV9mb3JtKAoJICAgICAgICAgICAgICAgIHNjcmVlbiA9PiAiUmVwb3J0IiwKCQkJc2Nv -bmYgPT4gJHNjb25mLAogICAgICAgIAkpOwoKCQlteSAkc2VhcmNoX2xpbmtzID0gJHJlcG8tPm1h -a2VfZG9jX2ZyYWdtZW50OwoJCW15ICRuZXdfbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggIiRu -ZXdfYmFzZXVybCZfYWN0aW9uX25ld3NlYXJjaD0xIiApOwoJICAgCSRuZXdfbGluay0+YXBwZW5k -Q2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9uOm5ldyIgKSAp -OwoJCSRzZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkbmV3X2xpbmsgKTsKCgkJI2FkZCBhIHNl -cGFyYXRvci4uLgoJCSRzZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJh -c2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CgoJCSNzZXQgdXAgcmVmaW5l -IHNlYXJjaCBsaW5rCgkJbXkgJHJlZmluZV9iYXNldXJsID0gVVJJLT5uZXcoICRzZWxmLT57c2Vz -c2lvbn0tPmdldF91cmkgKTsKICAgICAgICAJJHJlZmluZV9iYXNldXJsLT5xdWVyeV9mb3JtKAoJ -ICAgICAgICAJY2FjaGUgPT4gJGNhY2hlaWQsCgkgICAgICAgICAgICAgICAgZXhwID0+ICRlc2Nl -eHAsCiAgICAgICAgCSAgICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAogICAgICAgICAgICAgICAg -CWRhdGFzZXQgPT4gJHNlbGYtPntkYXRhc2V0aWR9LAogICAgICAgICAgICAgICAgCW9yZGVyID0+ -ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPntjdXN0b21fb3JkZXJ9LAoJCQlzY29uZiA9 -PiAkc2NvbmYsCiAgICAgICAgCSk7CgoJCW15ICRyZWZpbmVfbGluayA9ICRyZXBvLT5yZW5kZXJf -bGluayggIiRyZWZpbmVfYmFzZXVybCZfYWN0aW9uX3VwZGF0ZT0xIiApOwogICAgICAJCSRyZWZp -bmVfbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHBy -ZXNzaW9uOnJlZmluZSIgKSApOyAgIAkgICAgICAgICAKCSAgICAgICAgJHNlYXJjaF9saW5rcy0+ -YXBwZW5kQ2hpbGQoICRyZWZpbmVfbGluayApOwoKCQkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVw -by0+aHRtbF9waHJhc2UoICJSZXBvcnQ6c2VhcmNoX2xpbmtzIiwgbGlua3M9PiRzZWFyY2hfbGlu -a3MgKSApOwoJfQoKCXJldHVybiAkY2h1bms7Cn0KCgojYWRkcyBhIG5ldyBjaGVja2JveCB0byBh -bGxvdyB0aGUgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRzIHRvIGV4cG9ydApzdWIgX2V4cG9y -dF9maWVsZF9jaGVja2JveAp7CglteSggJHNlbGYsICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRm -aWVsZGxhYmVsICkgPSBAXzsKCglteSAkbGkgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAibGkiICk7 -CgkkdWwtPmFwcGVuZENoaWxkKCAkbGkgKTsKCiAgICAgICAgbXkgJGNoZWNrYm94ID0gJHJlcG8t -Pm1ha2VfZWxlbWVudCggImlucHV0IiwgdHlwZSA9PiAiY2hlY2tib3giLCBpZCA9PiAkZmllbGRu -YW1lLCBuYW1lID0+ICRmaWVsZG5hbWUsIHZhbHVlID0+ICRmaWVsZG5hbWUgKTsKCWlmKCBkZWZp -bmVkICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfZGVm -YXVsdHMiICkgKQoJewoJCWlmKCAoIGdyZXAgeyAkZmllbGRuYW1lIGVxICRfIH0gQHskcmVwby0+ -Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX2RlZmF1bHRzIiApfSAp -IHx8ICggc2NhbGFyKCBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhw -b3J0ZmllbGRfZGVmYXVsdHMiICl9ICkgPT0gMCApICkKCQl7CgkJCSNvbmx5IGNoZWNrIGRlZmF1 -bHRzIG9yIGNoZWNrIGV2ZXJ5dGhpbmcgaWYgZGVmYXVsdHMgbm90IGRlZmluZWQKCQkJJGNoZWNr -Ym94LT5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInllcyIgKTsKCQl9Cgl9CglteSAkbGFiZWwg -PSAkcmVwby0+bWFrZV9lbGVtZW50KCAibGFiZWwiLCBmb3IgPT4gJGZpZWxkbmFtZSApOwoJJGxh -YmVsLT5hcHBlbmRDaGlsZCggJGZpZWxkbGFiZWwgKTsKCgkkbGktPmFwcGVuZENoaWxkKCAkY2hl -Y2tib3ggKTsKCSRsaS0+YXBwZW5kQ2hpbGQoICRsYWJlbCApOwp9CgojIyMgdXRpbGl0eSBtZXRo -b2RzCgojIFRPRE8gc2hvdWxkIHVzZSAiSlNPTiIgcGFja2FnZQpzdWIgdG9fanNvbgp7CiAgICAg -ICAgbXkoICRzZWxmLCAkb2JqZWN0ICkgPSBAXzsKCglyZXR1cm4gIiIgaWYoICFkZWZpbmVkICRv -YmplY3QgKTsKCiMgVVRGLTggaXNzdWVzOgojCXJldHVybiBKU09OLT5uZXctPnV0ZjgoMSktPmVu -Y29kZSggJG9iamVjdCApOwoKICAgICAgICBpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0hBU0gnICkK -ICAgICAgICB7CiAgICAgICAgICAgICAgICBteSBAc3R1ZmY7CiAgICAgICAgICAgICAgICB3aGls -ZSggbXkoICRrLCAkdiApID0gZWFjaCggJSRvYmplY3QgKSApCiAgICAgICAgICAgICAgICB7CiAg -ICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYoICFFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAk -diApICk7ICAgICAgICMgb3IgJ251bGwnID8KICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBA -c3R1ZmYsIEVQcmludHM6OlV0aWxzOjpqc19zdHJpbmcoICRrICkuJzonLiRzZWxmLT50b19qc29u -KCAkdiApCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3snIC4gam9p -biggIiwiLCBAc3R1ZmYgKSAuICd9JzsKICAgICAgICB9CiAgICAgICAgZWxzaWYoIHJlZiggJG9i -amVjdCApIGVxICdBUlJBWScgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBzdHVmZjsK -ICAgICAgICAgICAgICAgIGZvcmVhY2goIEAkb2JqZWN0ICkKICAgICAgICAgICAgICAgIHsKICAg -ICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICRf -ICkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3R1ZmYsICRzZWxmLT50b19qc29u -KCAkXyApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICdbJyAuIGpv -aW4oICIsIiwgQHN0dWZmICkgLiAnXSc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gRVByaW50 -czo6VXRpbHM6OmpzX3N0cmluZyggJG9iamVjdCApOwp9CgpzdWIgZXhwb3J0X3BsdWdpbnMKewog -ICAgICAgIG15KCAkc2VsZiwgJGdlbmVyaWMgKSA9IEBfOwoKCW15IEBwbHVnaW5faWRzOwoJCglt -eSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWco -ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICkgKQoJewoJCUBwbHVnaW5f -aWRzID0gQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydF9wbHVn -aW5zIiApfTsKCX0JCgllbHNpZiggJGdlbmVyaWMgKQoJewogCQlAcGx1Z2luX2lkcyA9ICRyZXBv -LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAg -ICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC9nZW5lcmljIiwKICAgICAgICAJICAgICAg -ICBpc192aXNpYmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAg -KTsKCX0KCWVsc2UKCXsKICAgICAgICAJQHBsdWdpbl9pZHMgPSAkcmVwby0+cGx1Z2luX2xpc3Qo -CiAgICAgICAgICAgICAgICAJdHlwZSA9PiAiRXhwb3J0IiwKCSAgICAgICAgICAgICAgICBjYW5f -YWNjZXB0ID0+ICJyZXBvcnQvIi4kc2VsZi0+Z2V0X3JlcG9ydCwKICAgICAgICAJICAgICAgICBp -c192aXNpYmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAgKTsK -ICAgICAgICB9CglteSBAcGx1Z2luczsKCWZvcmVhY2ggbXkgJGlkICggQHBsdWdpbl9pZHMgKQog -ICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRwID0gJHJlcG8tPnBsdWdpbiggIiRpZCIgKSBv -ciBuZXh0OwogICAgICAgICAgICAgICAgcHVzaCBAcGx1Z2lucywgJHA7CiAgICAgICAgfQoKICAg -ICAgICByZXR1cm4gQHBsdWdpbnM7Cn0KCnN1YiByZXBvcnRfcGx1Z2lucwp7CglteSggJHNlbGYg -KSA9IEBfOwoKCSMgc2YyIC0gY2FuJ3QgbGlzdCB2aWEgdHlwZSA9PiAiU2VhcmNoOjpSZXBvcnQi -ID8gCiAgICAgICAgbXkgQHBsdWdpbl9pZHMgPSAkc2VsZi0+cmVwb3NpdG9yeS0+cGx1Z2luX2xp -c3QoCiAgICAgICAgICAgICAgICB0eXBlID0+ICJTY3JlZW4iLAogICAgICAgICk7CgogICAgICAg -IG15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewoJ -CW5leHQgaWYoICRpZCAhfiAvXlNjcmVlbjo6UmVwb3J0OjovICk7CSMgbm90ZSB0aGlzIGFsc28g -ZmlsdGVycyBvdXQgJHNlbGYgKGFrYSBTY3JlZW46OlJlcG9ydCkKCiAgICAgICAgICAgICAgICBt -eSAkcCA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW4oICIkaWQiICk7CgkJbmV4dCBpZiggIWRl -ZmluZWQgJHAgfHwgISRwLT5jYW5fYmVfdmlld2VkICk7CgogICAgICAgICAgICAgICAgcHVzaCBA -cGx1Z2lucywgJHA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQHBsdWdpbnM7Cn0KCiNyZXR1 -cm5zIGEgaGFzaCBvZiB2YWx1ZXMgbWFwcGVkIHRvIGEgbGFiZWwgYW5kIGEgbGlzdAojaWYgaWRz -X29ubHkgaXMgc2V0IHRoZSBsaXN0IG9mIGl0ZW1zIGFyZSBqdXN0IHJlcHJlc2VudGVkIGJ5IHRo -ZWlyIGlkICh1c2VkIGJ5IHJlcG9ydCBKUykKc3ViIGdldF9ncm91cGVkX2l0ZW1zCnsKCW15KCAk -c2VsZiwgJGl0ZW1zLCAkaWRzX29ubHkgKSA9IEBfOwoJbXkgJHNlc3Npb24gPSAkc2VsZi0+e3Nl -c3Npb259OwoJbXkgJWdyb3VwZWQ7CgoJbXkgJGdyb3VwaW5nID0gJHNlbGYtPntwcm9jZXNzb3J9 -LT57Z3JvdXB9OwoKCW15ICRtZXRhZmllbGQgPSAkaXRlbXMtPmdldF9kYXRhc2V0LT5maWVsZCgg -JGdyb3VwaW5nICk7CgoJI3NldCBncm91cF9vcHRzIGlmIGFwcHJvcHJpYXRlCglpZiggZGVmaW5l -ZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfSApCgl7CgkJaWYoICRtZXRhZmllbGQt -PnR5cGUgZXEgImRhdGUiICkKCQl7CgkJCSRtZXRhZmllbGQtPntyZW5kZXJfcmVzfSA9ICRzZWxm -LT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmVzfSBpZiBleGlzdHMgJHNlbGYtPntwcm9j -ZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXN9OwoJCX0KCX0KCgkjY3JlYXRlIGEgaGFzaCBvZiBm -aWVsZCB2YWx1ZXMgdG8gaXRlbXMgKG9yIGl0ZW0gaWRzKQoJJGl0ZW1zLT5tYXAoIHN1YiB7Cgkg -ICAgICAgCW15KCAkc2Vzc2lvbiwgJGRhdGFzZXQsICRpdGVtICkgPSBAXzsKCQkKCQlteSAkbXVs -dGlwbGUgPSAkbWV0YWZpZWxkLT5nZXRfcHJvcGVydHkoICJtdWx0aXBsZSIgKTsKCQlteSBAZ3Jv -dXBfdmFsdWVzOwoJCWlmKCAkbXVsdGlwbGUgKQogICAgICAgICAgICAgICAgewoJCQlAZ3JvdXBf -dmFsdWVzID0gQHskaXRlbS0+dmFsdWUoICRncm91cGluZyApfTsKCQl9CgkJZWxzZQoJCXsJCQkK -CQkJQGdyb3VwX3ZhbHVlcyA9ICgkaXRlbS0+dmFsdWUoICRncm91cGluZyApKTsKCQl9CgkKCQlp -Ziggc2NhbGFyIEBncm91cF92YWx1ZXMgPiAwICkKCQl7CgkJCWZvcmVhY2ggbXkgJGdyb3VwX3Zh -bHVlICggQGdyb3VwX3ZhbHVlcyApCgkJCXsKCQkJCW15ICRncm91cF9pZCA9ICRtZXRhZmllbGQt -PmdldF9pZF9mcm9tX3ZhbHVlKCAkc2Vzc2lvbiwgJGdyb3VwX3ZhbHVlICk7CgkJCQkjdHJ1bmNh -dGUgZ3JvdXAgaWYgYXBwcm9wcmlhdGUKCQkJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29y -fS0+e2dyb3VwX29wdHN9ICkKCQkJCXsKCQkJCQkkZ3JvdXBfaWQgPSAgc3Vic3RyKCAiXHUkZ3Jv -dXBfaWQiLCAwLCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfSAp -IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfTsK -CQkJCX0KCgkJICAgICAgICAJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9ICkgI3dlJ3Zl -IGFscmVhZHkgc2V0IHRoaXMgbGlzdCB1cCwgcHVzaCBhIG5ldyBpdGVtIG9uIHRvIHRoZSBsaXN0 -CgkJICAgICAgICAgICAgICAgCXsKCQkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBv -bmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJCQkJewoJCQkJCQlwdXNo -IEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJ -CXsKCQkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbTsKCQkJCQl9CgkgICAg -ICAgCQkgICAgICAgIH0KICAgICAgICAJICAgICAgCQllbHNlICNzZXQgdXAgYSBsaXN0IGZvciB0 -aGlzIGdyb3VwCgkgICAgICAgIAkgICAgICAgCXsKCQkJCQlteSBAZ3JvdXBlZF9pdGVtczsKCQkJ -CQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFu -IHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgICAgICAgICAgewkKICAgICAgICAJCSAg -ICAgICAgICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAg -ICAgICAgICAgICAJCSAgICAgICAgfQoJICAgICAgICAgICAgICAgIAkgICAgICAgIGVsc2UKICAg -ICAgICAJICAgICAgICAgICAgICAgIAl7CgkgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAg -ICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCQkgICAgICAgICAgICAgICAJfQoJ -ICAgICAgICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRf -aXRlbXNdOwoJCQkJfQogICAgICAgICAgICAgICAJCX0KCQl9CgkJZWxzZQoJCXsKCQkJbXkgJGdy -b3VwX2lkID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwogIAkgICAgCQlpZigg -ZXhpc3RzICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0 -IHVwLCBwdXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgIAl7CgkJCQlpZiggJGlkc19v -bmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBp -dGVtCgkJCQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbS0+aWQ7CgkJ -CQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRl -bTsKCQkJCX0KCSAgICAgICAJCX0KICAgICAgICAJICAgICAgCWVsc2UgI3NldCB1cCBhIGxpc3Qg -Zm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCXsKCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJaWYo -ICRpZHNfb25seSApICNzb21ldGltZXMgd2Ugb25seSB3YW50IGlkcyByYXRoZXIgdGhhbiB0aGUg -d2hvbGUgaXRlbQoJCSAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJCQlAZ3JvdXBlZF9pdGVt -cyA9ICgkaXRlbS0+aWQpOwogICAgICAgICAgICAgICAgCQl9CgkgICAgICAgICAgICAgICAgCWVs -c2UKICAgICAgICAJICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgIAkgICAgICAgICAg -ICAgICAgQGdyb3VwZWRfaXRlbXMgPSAoJGl0ZW0pOwogICAgICAgIAkgICAgICAgICAgICAgICAJ -fQoJICAgICAgICAgICAgICAJICAgICAgICAkZ3JvdXBlZHskZ3JvdXBfaWR9ID0gW0Bncm91cGVk -X2l0ZW1zXTsKCQkJfQoJCX0KICAgICAgIAl9ICk7CgoJI25vdyBzb3J0IHRoZSBncm91cHMgYW5k -IGFkZCBodW1hbiByZWFkYWJsZSBsYWJlbHMKCW15IEBzb3J0ZWRfZ3JvdXBzOwoJCglteSAkcmV2 -ZXJzZSA9IDA7CgkkcmV2ZXJzZSA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57 -cmV2ZXJzZV9vcmRlcn0gaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9 -LT57cmV2ZXJzZV9vcmRlcn07CglpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAibmFtZWRzZXQiICkK -CXsKCQlteSggJHRhZ3MsICRsYWJlbHMgKSA9ICRtZXRhZmllbGQtPnRhZ3NfYW5kX2xhYmVscygg -JHNlc3Npb24gKTsKCQkjY29udmVydCB0YWdzIHRvIGEgaGFzaCBvZiB2YWx1ZXMgYW5kIGEgcHJp -b3JpdHkgKGZvciBvcmRlcmluZykKCQlteSAlcHJpb3JpdHk7CgkJbXkgJGluZGV4ID0gMTsKCQlm -b3JlYWNoIG15ICR0YWcgKEB7JHRhZ3N9ICkKCQl7CgkJCSRwcmlvcml0eXskdGFnfSA9ICRpbmRl -eDsKCQkJJGluZGV4Kys7CgkJfQoJCWZvcmVhY2ggbXkgJGtleSAoc29ydCB7JHByaW9yaXR5eyRh -fSA8PT4gJHByaW9yaXR5eyRifX0ga2V5cyAlZ3JvdXBlZCkKICAgICAgICAJewoJCQlwdXNoIEBz -b3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwg -JGxhYmVscy0+eyRrZXl9ICk7CgkJfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgInN1 -YmplY3QiICkKCXsJCQoJCW15ICRkcyA9ICRzZXNzaW9uLT5kYXRhc2V0KCAic3ViamVjdCIgKTsK -CQlteSBAdmFsdWVzID0ga2V5cyAlZ3JvdXBlZDsKCQlteSAkc29ydGVkID0gJG1ldGFmaWVsZC0+ -c29ydF92YWx1ZXMoICRzZXNzaW9uLCBcQHZhbHVlcyApOwoJCW15ICVwcmlvcml0eTsKCQlteSAk -aW5kZXggPSAxOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKEB7JHNvcnRlZH0g -KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcHJpb3JpdHl7JHZh -bHVlfSA9ICRpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4Kys7CiAgICAgICAg -ICAgICAgICB9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJp -b3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAgICAgICAgICAgewoJCQlteSAkc3ViaiA9 -ICRkcy0+ZGF0YW9iaiggJGtleSApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzb3J0 -ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgRVBy -aW50czo6VXRpbHM6OnRyZWVfdG9fdXRmOCggJHN1YmotPnJlbmRlcl9kZXNjcmlwdGlvbiApICkg -aWYgZGVmaW5lZCAkc3ViajsKICAgICAgICAgICAgICAgIH0KCX0KCWVsc2lmKCAkbWV0YWZpZWxk -LT50eXBlIGVxICJkYXRlIiApCgl7CgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkg -JGtleSAoIHNvcnQgeyRiIDw9PiAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNv -cnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAk -a2V5ICk7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGEg -PD0+ICRifSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNl -bGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0K -CX0KCWVsc2UKCXsJCgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkgJGtleSAoIHNv -cnQgeyRiIGNtcCAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNvcnRlZF9ncm91 -cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAka2V5ICk7CgkJ -CX0KCQl9CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCBrZXlzICVncm91cGVk -ICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRl -bSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCX0KCgkjY2hlY2sgZm9yIGFueSB1 -bnNwZWNpZmllZCBncm91cHMKCW15ICRncm91cF9pZCA9ICJVbnNwZWNpZmllZCAiIC4gJG1ldGFm -aWVsZC0+bmFtZTsKCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApCgl7CgkJcHVzaCBA -c29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGdyb3Vw -X2lkfSwgJGdyb3VwX2lkICk7Cgl9CgoJcmV0dXJuIFxAc29ydGVkX2dyb3VwczsKfQkKCgpzdWIg -X21ha2VfZ3JvdXBlZF9pdGVtCnsKCW15KCAkc2VsZiwgJGxpc3QsICRsYWJlbCApID0gQF87Cglt -eSAlZ3JvdXA7CgkkZ3JvdXB7bGlzdH0gPSAkbGlzdDsKCSRncm91cHtsYWJlbH0gPSAkbGFiZWw7 -CglyZXR1cm4gXCVncm91cDsKfQoKc3ViIHJlbmRlcl9zZWxlY3RhbGwKewoJbXkoICRzZWxmLCAk -eG1sICkgPSBAXzsKCglteSAkdG9nZ2xlX2Z1bmN0aW9uID0gJwoJCXZhciBpc0NoZWNrZWQgPSB0 -cnVlOwoJCWZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94ZXMoKSB7CgkgICAgICAgIAl2YXIgZXhwb3J0 -X29wdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJyZXBvcnRfZXhwb3J0 -X29wdGlvbnMiKTsKCQkJZm9yKCBleHBvcnRfb3B0aW9uIG9mIGV4cG9ydF9vcHRpb25zICkKCQkJ -ewoJCQkJdmFyIGNoZWNrYm94ZXMgPSBleHBvcnRfb3B0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1l -KCAiaW5wdXQiICkKCQkJCWZvciggY2hlY2tib3ggb2YgY2hlY2tib3hlcyApCgkJCQl7CgkJCQkJ -aWYoaXNDaGVja2VkKQoJCQkJCXsKCSAgICAgICAgICAgICAgICAJCQljaGVja2JveC5jaGVja2Vk -ID0gIiI7CgkJICAJICAgICAgICAJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkgICAgICAgICAgICAg -ICAgY2hlY2tib3guY2hlY2tlZCA9ICJjaGVja2VkIjsKCQkJCQl9CgkgICAgICAgICAJCX0KCQkJ -fQoJCQlpc0NoZWNrZWQgPSAhaXNDaGVja2VkOwoJCX0nOwoJCglteSAkanNfdGFnID0gJHhtbC0+ -Y3JlYXRlX2VsZW1lbnQoICJzY3JpcHQiICk7CgkkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+ -Y3JlYXRlX3RleHRfbm9kZSggJHRvZ2dsZV9mdW5jdGlvbiApICk7CglyZXR1cm4gJGpzX3RhZzsK -fQoKc3ViIHJlbmRlcl9jbGVhcmZvcm0KewoJbXkoICRzZWxmLCAkeG1sICkgPSBAXzsKCglteSAk -Y2xlYXJfZnVuY3Rpb24gPSAnCgkJZnVuY3Rpb24gY2xlYXJGb3JtKCl7CgkJCXZhciByZXBvcnQg -PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggImN1c3RvbV9yZXBvcnQiICk7CgkJCXZhciBmb3Jt -ID0gcmVwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInNlbGVjdGVkX2Zvcm0iKVswXTsKCQkJ -dmFyIGlucHV0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKTsKCQkJZm9y -KCBpbnB1dCBvZiBpbnB1dHMgKQoJCQl7CgkJCQlmaWVsZF90eXBlID0gaW5wdXQudHlwZS50b0xv -d2VyQ2FzZSgpOwkKCQkJCWNvbnNvbGUubG9nKGZpZWxkX3R5cGUpOwoJCQkJc3dpdGNoIChmaWVs -ZF90eXBlKQoJCQkJewoJCQkJY2FzZSAidGV4dCI6CgkJCQljYXNlICJ0ZXh0YXJlYSI6CgkJCQkJ -aW5wdXQudmFsdWUgPSAiIjsKCQkJCQlicmVhazsKCQkJCWNhc2UgInJhZGlvIjoKCQkJCWNhc2Ug -ImNoZWNrYm94IjoKCQkJCQlpZiAoaW5wdXQuY2hlY2tlZCkKCQkJCQl7CiAgICAgICAgCQkJCQlp -bnB1dC5jaGVja2VkID0gZmFsc2U7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAic2VsZWN0 -LW9uZSI6CgkJCQljYXNlICJzZWxlY3QtbXVsdGkiOgoJCQkJCWlucHV0LnNlbGVjdGVkSW5kZXgg -PSAtMTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0JCgkJ -ICAgICAgICB2YXIgc2VsZWN0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxlY3Qi -ICk7CgkJCWZvciggc2VsZWN0IG9mIHNlbGVjdHMgKQoJCQl7CQoJCQkJaWYoIHNlbGVjdC5oYXNB -dHRyaWJ1dGUoIm11bHRpcGxlIikgKQoJCQkJewoJCQkJCXNlbGVjdC5zZWxlY3RlZEluZGV4ID0g -LTE7CgkJCQl9CgkJCX0JCQoKCQl9JzsJCQoKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxl -bWVudCggInNjcmlwdCIgKTsKICAgICAgICAkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3Jl -YXRlX3RleHRfbm9kZSggJGNsZWFyX2Z1bmN0aW9uICkgKTsKICAgICAgICByZXR1cm4gJGpzX3Rh -ZzsKfQoKMTsK +YWtlX2RvY19mcmFnbWVudDsKCglyZXR1cm4gJGNodW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8t +PmNvbmZpZyggJHNlbGYtPntzb3J0X2NvbmZ9LCAic29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNv +cnRfY29uZiA9ICRyZXBvLT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMi +ICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRm +b3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gInNvcnRfcmVwb3J0IiApOwogICAgICAgICRmb3Jt +LT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCgg +JGZvcm0gKTsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxm +LT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRD +aGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9j +ZXNzb3J9LT57c2VhcmNofS0+c2VyaWFsaXNlKSApOwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57 +cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8t +PnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91 +cF9leHB9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhl +IGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkc29ydF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19m +cmFnbWVudDsKCWZvcmVhY2ggbXkgJHNvcnRfbmFtZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAg +ICAgICAgewoJCW15ICRzb3J0X3ZhbHVlID0gJHNvcnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlm +KCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRl +bl9maWVsZCggInNvcnQiLCAkc29ydF92YWx1ZSkgKTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAg +ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQo +ICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsK +ICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntz +b3J0fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJ +CQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9u +Zy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4g +Ijpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAk +c3Ryb25nICk7CgkJfQoJCWVsc2UKCQl7CgkJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5r +KCAnamF2YXNjcmlwdDpzb3J0X3JlcG9ydCgiJy4kc29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGlu +ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4g +Ijpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAk +bGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5h +cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5r +cz0+JHNvcnRfbGlua3MgKSApOwoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9ncm91cF9v +cHRpb25zCnsKCW15KCAkc2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9y +eTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVu +ayB1bmxlc3MoIGRlZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57Z3JvdXBfY29uZn0sICJn +cm91cGZpZWxkcyIgKSApICk7CgoJbXkgJGdyb3VwX2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2Vs +Zi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAk +Zm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4g +Imdyb3VwX3JlcG9ydCIgKTsKICAgICAgICAkZm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4g +ImdldCIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRy +ZXBvLT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVx +ICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVu +X2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlz +ZSkgKTsKCX0KCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJ +JGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAg +JHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQoKCSNkaXNwbGF5IHRoZSBsaW5rcyB0 +aGF0IHdpbGwgdHJpZ2dlciB0aGUgZm9ybQoJbXkgJGZpcnN0ID0gMTsKCW15ICRncm91cF9saW5r +cyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICgg +QHskZ3JvdXBfY29uZn0gKQogICAgICAgIHsKCQlteSAoJGdyb3VwX2ZpZWxkKSA9IHNwbGl0KC87 +LywgJGdyb3VwX3ZhbHVlICk7CgkJaWYoICRmaXJzdCApCgkJewoJCQkkZm9ybS0+YXBwZW5kQ2hp +bGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAkZ3JvdXBfdmFsdWUpICk7 +CgkJfQoKCQlpZiggISRmaXJzdCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJ +JGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiVXBkYXRlL1Zp +ZXdzOmdyb3VwX3NlcGVyYXRvciIgKSApOwogICAgICAgICAgICAgICAgfQoJCQoJCWlmKCBkZWZp +bmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn +cm91cH0gZXEgJGdyb3VwX2ZpZWxkICkKCQl7CgkJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9l +bGVtZW50KCAic3Ryb25nIiApOwoJCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxf +cGhyYXNlKCAkc2VsZi0+e2dyb3VwX2NvbmZ9IC4gIjpncm91cDoiIC4gJGdyb3VwX2ZpZWxkICkg +KTsKCQkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJ +ewoJCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVw +b3J0KCInLiRncm91cF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBv +LT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9m +aWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7CgkJfQoJCSRm +aXJzdCA9IDA7CiAgICAgICAgfSAgICAgICAgICAgCgkKCSNubyBncm91cGluZyBsaW5rIGF0IHRo +ZSBlbmQKCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVw +ZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJv +Y2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJ +ewoJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpncm91cF9yZXBv +cnQoIiIpJyApOwkKCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggInJl +cG9ydDpub19ncm91cGluZyIgKSApOwoJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5r +ICk7Cgl9CgllbHNlCgl7CgkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJv +bmciICk7CiAJCSRzdHJvbmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBv +cnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25n +ICk7Cgl9CgkKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9y +dDpncm91cF9saW5rcyIsIGxpbmtzPT4kZ3JvdXBfbGlua3MgKSApOwoKCXJldHVybiAkY2h1bms7 +Cn0KCnN1YiByZW5kZXJfcmVmaW5lX3NlYXJjaAp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRy +ZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2Zy +YWdtZW50OwoJCglpZiggZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYt +Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJbXkgJGVzY2V4cCA9ICRz +ZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZTsKCQlteSAkY2FjaGVpZCA9ICRy +ZXBvLT5wYXJhbSggImNhY2hlIiApOwoJCW15ICRzY29uZiA9ICRzZWxmLT57c2NvbmZ9OwkKCgkJ +I3NldCB1cCBuZXcgc2VhcmNoIGxpbmsKCQlteSAkbmV3X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNl +bGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAgICAgIAkkbmV3X2Jhc2V1cmwtPnF1ZXJ5X2Zv +cm0oCgkgICAgICAgICAgICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAoJCQlzY29uZiA9PiAkc2Nv +bmYsCiAgICAgICAgCSk7CgoJCW15ICRzZWFyY2hfbGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJh +Z21lbnQ7CgkJbXkgJG5ld19saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJG5ld19iYXNldXJs +Jl9hY3Rpb25fbmV3c2VhcmNoPTEiICk7CgkgICAJJG5ld19saW5rLT5hcHBlbmRDaGlsZCggJHJl +cG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246bmV3IiApICk7CgkJJHNlYXJj +aF9saW5rcy0+YXBwZW5kQ2hpbGQoICRuZXdfbGluayApOwoKCQkjYWRkIGEgc2VwYXJhdG9yLi4u +CgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0 +ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKCgkJI3NldCB1cCByZWZpbmUgc2VhcmNoIGxp +bmsKCQlteSAkcmVmaW5lX2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0 +X3VyaSApOwogICAgICAgIAkkcmVmaW5lX2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgIAlj +YWNoZSA9PiAkY2FjaGVpZCwKCSAgICAgICAgICAgICAgICBleHAgPT4gJGVzY2V4cCwKICAgICAg +ICAJICAgICAgICBzY3JlZW4gPT4gIlJlcG9ydCIsCiAgICAgICAgICAgICAgICAJZGF0YXNldCA9 +PiAkc2VsZi0+e2RhdGFzZXRpZH0sCiAgICAgICAgICAgICAgICAJb3JkZXIgPT4gJHNlbGYtPntw +cm9jZXNzb3J9LT57c2VhcmNofS0+e2N1c3RvbV9vcmRlcn0sCgkJCXNjb25mID0+ICRzY29uZiwK +ICAgICAgICAJKTsKCgkJbXkgJHJlZmluZV9saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJHJl +ZmluZV9iYXNldXJsJl9hY3Rpb25fdXBkYXRlPTEiICk7CiAgICAgIAkJJHJlZmluZV9saW5rLT5h +cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246cmVm +aW5lIiApICk7ICAgCSAgICAgICAgIAoJICAgICAgICAkc2VhcmNoX2xpbmtzLT5hcHBlbmRDaGls +ZCggJHJlZmluZV9saW5rICk7CgoJCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo +cmFzZSggIlJlcG9ydDpzZWFyY2hfbGlua3MiLCBsaW5rcz0+JHNlYXJjaF9saW5rcyApICk7Cgl9 +CgoJcmV0dXJuICRjaHVuazsKfQoKCiNhZGRzIGEgbmV3IGNoZWNrYm94IHRvIGFsbG93IHRoZSB1 +c2VyIHRvIGNob29zZSB3aGljaCBmaWVsZHMgdG8gZXhwb3J0CnN1YiBfZXhwb3J0X2ZpZWxkX2No +ZWNrYm94CnsKCW15KCAkc2VsZiwgJHJlcG8sICRmaWVsZG5hbWUsICR1bCwgJGZpZWxkbGFiZWwg +KSA9IEBfOwoKCW15ICRsaSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsaSIgKTsKCSR1bC0+YXBw +ZW5kQ2hpbGQoICRsaSApOwoKICAgICAgICBteSAkY2hlY2tib3ggPSAkcmVwby0+bWFrZV9lbGVt +ZW50KCAiaW5wdXQiLCB0eXBlID0+ICJjaGVja2JveCIsIGlkID0+ICRmaWVsZG5hbWUsIG5hbWUg +PT4gJGZpZWxkbmFtZSwgdmFsdWUgPT4gJGZpZWxkbmFtZSApOwoJaWYoIGRlZmluZWQgJHJlcG8t +PmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKSAp +Cgl7CgkJaWYoICggZ3JlcCB7ICRmaWVsZG5hbWUgZXEgJF8gfSBAeyRyZXBvLT5jb25maWcoICRz +ZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfZGVmYXVsdHMiICl9ICkgfHwgKCBzY2Fs +YXIoIEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9k +ZWZhdWx0cyIgKX0gKSA9PSAwICkgKQoJCXsKCQkJI29ubHkgY2hlY2sgZGVmYXVsdHMgb3IgY2hl +Y2sgZXZlcnl0aGluZyBpZiBkZWZhdWx0cyBub3QgZGVmaW5lZAoJCQkkY2hlY2tib3gtPnNldEF0 +dHJpYnV0ZSggImNoZWNrZWQiLCAieWVzIiApOwoJCX0KCX0KCW15ICRsYWJlbCA9ICRyZXBvLT5t +YWtlX2VsZW1lbnQoICJsYWJlbCIsIGZvciA9PiAkZmllbGRuYW1lICk7CgkkbGFiZWwtPmFwcGVu +ZENoaWxkKCAkZmllbGRsYWJlbCApOwoKCSRsaS0+YXBwZW5kQ2hpbGQoICRjaGVja2JveCApOwoJ +JGxpLT5hcHBlbmRDaGlsZCggJGxhYmVsICk7Cn0KCiMjIyB1dGlsaXR5IG1ldGhvZHMKCiMgVE9E +TyBzaG91bGQgdXNlICJKU09OIiBwYWNrYWdlCnN1YiB0b19qc29uCnsKICAgICAgICBteSggJHNl +bGYsICRvYmplY3QgKSA9IEBfOwoKCXJldHVybiAiIiBpZiggIWRlZmluZWQgJG9iamVjdCApOwoK +IyBVVEYtOCBpc3N1ZXM6CiMJcmV0dXJuIEpTT04tPm5ldy0+dXRmOCgxKS0+ZW5jb2RlKCAkb2Jq +ZWN0ICk7CgogICAgICAgIGlmKCByZWYoICRvYmplY3QgKSBlcSAnSEFTSCcgKQogICAgICAgIHsK +ICAgICAgICAgICAgICAgIG15IEBzdHVmZjsKICAgICAgICAgICAgICAgIHdoaWxlKCBteSggJGss +ICR2ICkgPSBlYWNoKCAlJG9iamVjdCApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg +ICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICR2ICkgKTsgICAg +ICAgIyBvciAnbnVsbCcgPwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVmZiwgRVBy +aW50czo6VXRpbHM6OmpzX3N0cmluZyggJGsgKS4nOicuJHNlbGYtPnRvX2pzb24oICR2ICkKICAg +ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCAiLCIsIEBz +dHVmZiApIC4gJ30nOwogICAgICAgIH0KICAgICAgICBlbHNpZiggcmVmKCAkb2JqZWN0ICkgZXEg +J0FSUkFZJyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQHN0dWZmOwogICAgICAgICAg +ICAgICAgZm9yZWFjaCggQCRvYmplY3QgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAg +ICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6VXRpbHM6OmlzX3NldCggJF8gKSApOwogICAg +ICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVmZiwgJHNlbGYtPnRvX2pzb24oICRfICk7CiAg +ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbiggIiwiLCBA +c3R1ZmYgKSAuICddJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBFUHJpbnRzOjpVdGlsczo6 +anNfc3RyaW5nKCAkb2JqZWN0ICk7Cn0KCnN1YiBleHBvcnRfcGx1Z2lucwp7CiAgICAgICAgbXko +ICRzZWxmLCAkZ2VuZXJpYyApID0gQF87CgoJbXkgQHBsdWdpbl9pZHM7CgkKCW15ICRyZXBvID0g +JHNlbGYtPnJlcG9zaXRvcnk7CgoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntl +eHBvcnRfY29uZn0sICJleHBvcnRfcGx1Z2lucyIgKSApCgl7CgkJQHBsdWdpbl9pZHMgPSBAeyRy +ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICl9OwoJ +fQkKCWVsc2lmKCAkZ2VuZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0gJHJlcG8tPnBsdWdpbl9s +aXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkgICAgICAgICAgICAgICAg +Y2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkgICAgICAgIGlzX3Zpc2li +bGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwoJfQoJZWxz +ZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRyZXBvLT5wbHVnaW5fbGlzdCgKICAgICAgICAg +ICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAgICAgICAgICAgIGNhbl9hY2NlcHQgPT4g +InJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUg +PT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwogICAgICAgIH0K +CW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewog +ICAgICAgICAgICAgICAgbXkgJHAgPSAkcmVwby0+cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAg +ICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVy +biBAcGx1Z2luczsKfQoKc3ViIHJlcG9ydF9wbHVnaW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJ +IyBzZjIgLSBjYW4ndCBsaXN0IHZpYSB0eXBlID0+ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAg +ICBteSBAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAg +ICAgICAgICAgIHR5cGUgPT4gIlNjcmVlbiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdp +bnM7Cglmb3JlYWNoIG15ICRpZCAoIEBwbHVnaW5faWRzICkKICAgICAgICB7CgkJbmV4dCBpZigg +JGlkICF+IC9eU2NyZWVuOjpSZXBvcnQ6Oi8gKTsJIyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91 +dCAkc2VsZiAoYWthIFNjcmVlbjo6UmVwb3J0KQoKICAgICAgICAgICAgICAgIG15ICRwID0gJHNl +bGYtPnJlcG9zaXRvcnktPnBsdWdpbiggIiRpZCIgKTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8 +fCAhJHAtPmNhbl9iZV92aWV3ZWQgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAk +cDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNo +IG9mIHZhbHVlcyBtYXBwZWQgdG8gYSBsYWJlbCBhbmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBz +ZXQgdGhlIGxpc3Qgb2YgaXRlbXMgYXJlIGp1c3QgcmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVz +ZWQgYnkgcmVwb3J0IEpTKQpzdWIgZ2V0X2dyb3VwZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRl +bXMsICRpZHNfb25seSApID0gQF87CglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07Cglt +eSAlZ3JvdXBlZDsKCglteSAkZ3JvdXBpbmcgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07 +CgoJbXkgJG1ldGFmaWVsZCA9ICRpdGVtcy0+Z2V0X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcg +KTsKCgkjc2V0IGdyb3VwX29wdHMgaWYgYXBwcm9wcmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57 +cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9ICkKCXsKCQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAi +ZGF0ZSIgKQoJCXsKCQkJJG1ldGFmaWVsZC0+e3JlbmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNz +b3J9LT57Z3JvdXBfb3B0c30tPntyZXN9IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn +cm91cF9vcHRzfS0+e3Jlc307CgkJfQoJfQoKCSNjcmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVl +cyB0byBpdGVtcyAob3IgaXRlbSBpZHMpCgkkaXRlbXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXko +ICRzZXNzaW9uLCAkZGF0YXNldCwgJGl0ZW0gKSA9IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRt +ZXRhZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRpcGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7 +CgkJaWYoICRtdWx0aXBsZSApCiAgICAgICAgICAgICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBA +eyRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICl9OwoJCX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBf +dmFsdWVzID0gKCRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIg +QGdyb3VwX3ZhbHVlcyA+IDAgKQoJCXsKCQkJZm9yZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3Jv +dXBfdmFsdWVzICkKCQkJewoJCQkJbXkgJGdyb3VwX2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zy +b21fdmFsdWUoICRzZXNzaW9uLCAkZ3JvdXBfdmFsdWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBp +ZiBhcHByb3ByaWF0ZQoJCQkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBf +b3B0c30gKQoJCQkJewoJCQkJCSRncm91cF9pZCA9ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAs +ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3Rz +ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkg +ICAgICAgIAlpZiggZXhpc3RzICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBz +ZXQgdGhpcyBsaXN0IHVwLCBwdXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAg +ICAgICAgICAJewoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBp +ZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBl +ZHskZ3JvdXBfaWR9fSwgJGl0ZW0tPmlkOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlw +dXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAg +ICAgfQogICAgICAgIAkgICAgICAJCWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAK +CSAgICAgICAgCSAgICAgICAJewoJCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRz +X29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xl +IGl0ZW0KCQkgICAgICAgICAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJICAgICAgICAgICAg +ICAgICAgICAgICAgQGdyb3VwZWRfaXRlbXMgPSAoJGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAg +IAkJICAgICAgICB9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgZWxzZQogICAgICAgIAkgICAg +ICAgICAgICAgICAgCXsKCSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEBncm91cGVk +X2l0ZW1zID0gKCRpdGVtKTsKICAgICAgICAJCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAg +ICAgICAgCSAgICAgICAgJGdyb3VwZWR7JGdyb3VwX2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJ +CQl9CiAgICAgICAgICAgICAgIAkJfQoJCX0KCQllbHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAi +VW5zcGVjaWZpZWQgIiAuICRtZXRhZmllbGQtPm5hbWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdy +b3VwZWR7JGdyb3VwX2lkfSApICN3ZSd2ZSBhbHJlYWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2gg +YSBuZXcgaXRlbSBvbiB0byB0aGUgbGlzdAoJCSAgCXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29t +ZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsK +CQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVs +c2UKCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJ +ICAgICAgIAkJfQogICAgICAgIAkgICAgICAJZWxzZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBn +cm91cAoJICAgICAgICAJewoJCQkJbXkgQGdyb3VwZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5 +ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVt +CgkJICAgICAgICAgICAgICAgIHsJCiAgICAgICAgCQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVt +LT5pZCk7CiAgICAgICAgICAgICAgICAJCX0KCSAgICAgICAgICAgICAgICAJZWxzZQogICAgICAg +IAkgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3Jv +dXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCSAgICAgICAgICAgICAgIAl9CgkgICAgICAg +ICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJ +CQl9CgkJfQogICAgICAgCX0gKTsKCgkjbm93IHNvcnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFu +IHJlYWRhYmxlIGxhYmVscwoJbXkgQHNvcnRlZF9ncm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsK +CSRyZXZlcnNlID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29y +ZGVyfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNl +X29yZGVyfTsKCWlmKCAkbWV0YWZpZWxkLT50eXBlIGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAk +dGFncywgJGxhYmVscyApID0gJG1ldGFmaWVsZC0+dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiAp +OwoJCSNjb252ZXJ0IHRhZ3MgdG8gYSBoYXNoIG9mIHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9y +IG9yZGVyaW5nKQoJCW15ICVwcmlvcml0eTsKCQlteSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkg +JHRhZyAoQHskdGFnc30gKQoJCXsKCQkJJHByaW9yaXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5k +ZXgrKzsKCQl9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJp +b3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91 +cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57 +JGtleX0gKTsKCQl9Cgl9CgllbHNpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJ +ewkJCgkJbXkgJGRzID0gJHNlc3Npb24tPmRhdGFzZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1 +ZXMgPSBrZXlzICVncm91cGVkOwoJCW15ICRzb3J0ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVl +cyggJHNlc3Npb24sIFxAdmFsdWVzICk7CgkJbXkgJXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7 +CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICR2YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAg +ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGlu +ZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXgrKzsKICAgICAgICAgICAgICAgIH0K +CQlmb3JlYWNoIG15ICRrZXkgKHNvcnQgeyRwcmlvcml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19 +IGtleXMgJWdyb3VwZWQpCiAgICAgICAgICAgICAgICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRh +b2JqKCAka2V5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMs +ICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGls +czo6dHJlZV90b191dGY4KCAkc3Viai0+cmVuZGVyX2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVk +ICRzdWJqOwogICAgICAgICAgICAgICAgfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEg +ImRhdGUiICkKCXsKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29y +dCB7JGIgPD0+ICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3Vw +cywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJ +fQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtl +eXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2Vf +Z3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJ +ewkKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21w +ICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYt +Pl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQll +bHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJ +CQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBl +ZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoKCSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVk +IGdyb3VwcwoJbXkgJGdyb3VwX2lkID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1l +OwoJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3Jv +dXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3Jv +dXBfaWQgKTsKCX0KCglyZXR1cm4gXEBzb3J0ZWRfZ3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91 +cGVkX2l0ZW0KewoJbXkoICRzZWxmLCAkbGlzdCwgJGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsK +CSRncm91cHtsaXN0fSA9ICRsaXN0OwoJJGdyb3Vwe2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBc +JWdyb3VwOwp9CgpzdWIgcmVuZGVyX3NlbGVjdGFsbAp7CglteSggJHNlbGYsICR4bWwgKSA9IEBf +OwoKCW15ICR0b2dnbGVfZnVuY3Rpb24gPSAnCgkJdmFyIGlzQ2hlY2tlZCA9IHRydWU7CgkJZnVu +Y3Rpb24gdG9nZ2xlQ2hlY2tib3hlcygpIHsKCSAgICAgICAgCXZhciBleHBvcnRfb3B0aW9ucyA9 +IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInJlcG9ydF9leHBvcnRfb3B0aW9ucyIp +OwoJCQlmb3IoIGV4cG9ydF9vcHRpb24gb2YgZXhwb3J0X29wdGlvbnMgKQoJCQl7CgkJCQl2YXIg +Y2hlY2tib3hlcyA9IGV4cG9ydF9vcHRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIg +KQoJCQkJZm9yKCBjaGVja2JveCBvZiBjaGVja2JveGVzICkKCQkJCXsKCQkJCQlpZihpc0NoZWNr +ZWQpCgkJCQkJewoJICAgICAgICAgICAgICAgIAkJCWNoZWNrYm94LmNoZWNrZWQgPSAiIjsKCQkg +IAkgICAgICAgIAl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCSAgICAgICAgICAgICAgICBjaGVja2Jv +eC5jaGVja2VkID0gImNoZWNrZWQiOwoJCQkJCX0KCSAgICAgICAgIAkJfQoJCQl9CgkJCWlzQ2hl +Y2tlZCA9ICFpc0NoZWNrZWQ7CgkJfSc7CgkKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxl +bWVudCggInNjcmlwdCIgKTsKCSRqc190YWctPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4 +dF9ub2RlKCAkdG9nZ2xlX2Z1bmN0aW9uICkgKTsKCXJldHVybiAkanNfdGFnOwp9CgpzdWIgcmVu +ZGVyX2NsZWFyZm9ybQp7CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICRjbGVhcl9mdW5j +dGlvbiA9ICcKCQlmdW5jdGlvbiBjbGVhckZvcm0oKXsKCQkJdmFyIHJlcG9ydCA9IGRvY3VtZW50 +LmdldEVsZW1lbnRCeUlkKCAiY3VzdG9tX3JlcG9ydCIgKTsKCQkJdmFyIGZvcm0gPSByZXBvcnQu +Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic2VsZWN0ZWRfZm9ybSIpWzBdOwoJCQl2YXIgaW5wdXRz +ID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApOwoJCQlmb3IoIGlucHV0IG9m +IGlucHV0cyApCgkJCXsKCQkJCWZpZWxkX3R5cGUgPSBpbnB1dC50eXBlLnRvTG93ZXJDYXNlKCk7 +CQoJCQkJY29uc29sZS5sb2coZmllbGRfdHlwZSk7CgkJCQlzd2l0Y2ggKGZpZWxkX3R5cGUpCgkJ +CQl7CgkJCQljYXNlICJ0ZXh0IjoKCQkJCWNhc2UgInRleHRhcmVhIjoKCQkJCQlpbnB1dC52YWx1 +ZSA9ICIiOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAicmFkaW8iOgoJCQkJY2FzZSAiY2hlY2tib3gi +OgoJCQkJCWlmIChpbnB1dC5jaGVja2VkKQoJCQkJCXsKICAgICAgICAJCQkJCWlucHV0LmNoZWNr +ZWQgPSBmYWxzZTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlICJzZWxlY3Qtb25lIjoKCQkJ +CWNhc2UgInNlbGVjdC1tdWx0aSI6CgkJCQkJaW5wdXQuc2VsZWN0ZWRJbmRleCA9IC0xOwoJCQkJ +CWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJCX0KCQkJfQkKCQkgICAgICAgIHZh +ciBzZWxlY3RzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSggInNlbGVjdCIgKTsKCQkJZm9y +KCBzZWxlY3Qgb2Ygc2VsZWN0cyApCgkJCXsJCgkJCQlpZiggc2VsZWN0Lmhhc0F0dHJpYnV0ZSgi +bXVsdGlwbGUiKSApCgkJCQl7CgkJCQkJc2VsZWN0LnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0K +CQkJfQkJCgoJCX0nOwkJCgoJbXkgJGpzX3RhZyA9ICR4bWwtPmNyZWF0ZV9lbGVtZW50KCAic2Ny +aXB0IiApOwogICAgICAgICRqc190YWctPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9u +b2RlKCAkY2xlYXJfZnVuY3Rpb24gKSApOwogICAgICAgIHJldHVybiAkanNfdGFnOwp9CgoxOwo= @@ -2889,7 +2896,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.2 + 3.3 diff --git a/reports.epmi b/reports.epmi index 4a460cf..cb1a74e 100644 --- a/reports.epmi +++ b/reports.epmi @@ -41,9 +41,9 @@ document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - 83d730999923d798d1acbb44c4a91667 + 6699a48d6ff758192b7ab8ff05790b3f MD5 - 10222 + 10355 document @@ -89,17 +89,17 @@ document plugins/EPrints/Plugin/Export/Report/JSON.pm text/plain - 3786d272e437a488408e5825270e1609 + c4b031c985ca0de7c8263474b232be14 MD5 - 6648 + 6994 document plugins/EPrints/Plugin/Screen/Report.pm text/plain - e88058df69ea1db3f145b316f6d1ada2 + d694685745fab90a5d9960238240662a MD5 - 43956 + 43946 document @@ -187,7 +187,7 @@ coverimage - 3.2 + 3.3 From 52d87230dcdbf86cfb69e7ac779fe1681afd9d74 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Wed, 16 Sep 2020 14:02:01 +0000 Subject: [PATCH 04/11] Update Generic Reporting Framework plugin with some accessibility fixes, bringing it to version 3.4 --- lib/lang/en/phrases/reports.xml | 3 + lib/plugins/EPrints/Plugin/Screen/Report.pm | 96 +- lib/static/javascript/auto/reports.js | 2 +- lib/static/style/auto/reports.css | 6 + reports.epm | 1530 ++++++++++--------- reports.epmi | 18 +- 6 files changed, 859 insertions(+), 796 deletions(-) diff --git a/lib/lang/en/phrases/reports.xml b/lib/lang/en/phrases/reports.xml index 2abf9e5..a5f182c 100644 --- a/lib/lang/en/phrases/reports.xml +++ b/lib/lang/en/phrases/reports.xml @@ -19,6 +19,9 @@
+Select Report: +Select Export Format: + Example Articles diff --git a/lib/plugins/EPrints/Plugin/Screen/Report.pm b/lib/plugins/EPrints/Plugin/Screen/Report.pm index 34a58ea..491e94f 100644 --- a/lib/plugins/EPrints/Plugin/Screen/Report.pm +++ b/lib/plugins/EPrints/Plugin/Screen/Report.pm @@ -574,7 +574,7 @@ sub render_splash_page $form->appendChild( $self->render_controls( 1 ) ); #add each report to the select component and generate search form if required - my $report_select = $repo->make_element( "select", name=>"report", id=>"select_report" ); + my $report_select = $repo->make_element( "select", name=>"report", id=>"select_report", 'aria-labelledby' => "report_select_label" ); my %search_forms; my $custom_reports = 0; #foreach my $report_plugin ( @plugins ) @@ -629,13 +629,19 @@ sub render_splash_page $search_forms{$formid} = $frag unless exists $search_forms{$formid}; } } + + # label for form select drop down + my $report_label = $repo->make_element( "label", id=>"report_select_label" ); + $report_label->appendChild( $repo->html_phrase( "report_select_label" ) ); + $form->appendChild( $report_label ); + $form->appendChild( $report_select ); $form->appendChild( $repo->render_hidden_field( "screen", $self->{screenid} ) ); #render possible search forms foreach my $formid (keys %search_forms) { - my $table = $repo->make_element( "table", class=>"ep_search_fields", id=>$formid, style=>"display: none" ); + my $table = $repo->make_element( "div", class=>"ep_table ep_search_fields", id=>$formid, style=>"display: none" ); $form->appendChild( $table ); $table->appendChild( $search_forms{$formid} ); } @@ -677,44 +683,62 @@ sub render_splash_page sub render_search_fields { - my( $self, $search, $formid ) = @_; + my( $self, $search, $formid ) = @_; my $exp = $self->{session}->param( "exp" ); my $sconf = $self->{session}->param( "sconf" ); - if( defined $exp && defined $sconf && $sconf eq $formid ) + if( defined $exp && defined $sconf && $sconf eq $formid ) { - $search->from_string( $exp ); + $search->from_string( $exp ); } - my $frag = $self->{session}->make_doc_fragment; - foreach my $sf ( $search->get_non_filter_searchfields ) + my $frag = $self->{session}->make_doc_fragment; + foreach my $sf ( $search->get_non_filter_searchfields ) + { + my $label; + my $field; + if ( $sf->{"field"}->get_type() eq "namedset" ) { - $frag->appendChild( - $self->{session}->render_row_with_help( - help_prefix => $sf->get_form_prefix."_help", - help => $sf->render_help, - label => $sf->render_name, - field => $sf->render, - no_toggle => ( $sf->{show_help} eq "always" ), - no_help => ( $sf->{show_help} eq "never" ), - ) ); + # we want a legend and a label + $label = $self->{session}->make_element( "span", id=>$sf->get_form_prefix."_label" ); + $label->appendChild( $sf->render_name ); + + my $legend = EPrints::Utils::tree_to_utf8( $sf->render_name ); + $field = $sf->render( legend => $legend ); + } + else { + $label = $self->{session}->make_element( "span", id=>$sf->get_form_prefix."_label" ); + $label->appendChild( $sf->render_name ); + $field = $sf->render(); } - return $frag; + $frag->appendChild( + $self->{session}->render_row_with_help( + help_prefix => $sf->get_form_prefix."_help", + help => $sf->render_help, + label => $label, + field => $field, + no_toggle => ( $sf->{show_help} eq "always" ), + no_help => ( $sf->{show_help} eq "never" ), + ) ); + } + + return $frag; } sub render_controls { my( $self, $with_js ) = @_; - my $div = $self->{session}->make_element( - "div" , - class => "ep_search_buttons" ); - $div->appendChild( $self->{session}->render_action_buttons( - _order => [ "search" ], - #newsearch => $self->{session}->phrase( "lib/searchexpression:action_reset" ), - search => $self->{session}->phrase( "lib/searchexpression:action_search" ) ) - ); + my $div = $self->{session}->make_element( + "div" , + class => "ep_search_buttons" ); + + $div->appendChild( $self->{session}->render_action_buttons( + _order => [ "search" ], + #newsearch => $self->{session}->phrase( "lib/searchexpression:action_reset" ), + search => $self->{session}->phrase( "lib/searchexpression:action_search" ) ) + ); my $xml = $self->{session}->xml; @@ -723,12 +747,12 @@ sub render_controls my $clear_form = $div->appendChild( $self->render_clearform( $xml ) ); } - my $clear_btn = $div->appendChild( $xml->create_element( "button", - type => "button", - onclick => "clearForm();", - class => "ep_form_action_button clear_button", - ) ); - $clear_btn->appendChild( $xml->create_text_node( $self->{session}->phrase( "lib/searchexpression:action_reset" ) ) ); + my $clear_btn = $div->appendChild( $xml->create_element( "button", + type => "button", + onclick => "clearForm();", + class => "ep_form_action_button clear_button", + ) ); + $clear_btn->appendChild( $xml->create_text_node( $self->{session}->phrase( "lib/searchexpression:action_reset" ) ) ); return $div; } @@ -863,6 +887,10 @@ sub render_export_bar $form->appendChild( $repo->render_hidden_field( "group", $self->{processor}->{group_exp} ) ); } + my $export_label = $repo->make_element( "label", id=>"export_select_label" ); + $export_label->appendChild( $repo->html_phrase( "export_select_label" ) ); + $form->appendChild( $export_label ); + if( !defined( $repo->config( $self->{export_conf}, "exportfields" ) ) ) { #no custom export fields defined, use export plugins designed for this report @@ -870,6 +898,7 @@ sub render_export_bar name => 'export', values => [map { $_->get_subtype } @plugins], labels => {map { $_->get_subtype => $_->get_name } @plugins}, + 'aria-labelledby' => "export_select_label", ) ); } else @@ -880,6 +909,7 @@ sub render_export_bar name => 'export', values => [map { $_->get_subtype } @plugins], labels => {map { $_->get_subtype => $_->get_name } @plugins}, + 'aria-labelledby' => "export_select_label", ) ); #create labels and panels for tabbed interfaced @@ -892,7 +922,7 @@ sub render_export_bar onclick => "toggleCheckboxes();", class => "ep_form_action_button select_button", ) ); - $select_btn->appendChild( $xml->create_text_node( $repo->phrase( "report_select" ) ) ); + $select_btn->appendChild( $xml->create_text_node( $repo->phrase( "report_select" ) ) ); #allow user to choose which fields they want to export my $export_options = $repo->make_element( "div" ); @@ -932,7 +962,7 @@ sub render_export_bar if( $count ) #only add options if we have any fields to show { my $div = $repo->make_element( "div", class=>"report_export_options" ); - $div->appendChild( my $h = $repo->make_element( "h4" ) ); + $div->appendChild( my $h = $repo->make_element( "div", class=>"custom_export_header" ) ); $h->appendChild( $repo->html_phrase( "exportfields:$key" ) ); $div->appendChild( $ul ); $export_options->appendChild( $div ); diff --git a/lib/static/javascript/auto/reports.js b/lib/static/javascript/auto/reports.js index be9b2d3..dd13001 100644 --- a/lib/static/javascript/auto/reports.js +++ b/lib/static/javascript/auto/reports.js @@ -31,7 +31,7 @@ var onFormSelect = function(){ var formid = this.options[this.selectedIndex].getAttribute('form'); //hide other forms - $$('table.ep_search_fields').each(function (elem) + $$('div.ep_table.ep_search_fields').each(function (elem) { //hide the form $(elem).hide(); diff --git a/lib/static/style/auto/reports.css b/lib/static/style/auto/reports.css index bf92297..ac53949 100644 --- a/lib/static/style/auto/reports.css +++ b/lib/static/style/auto/reports.css @@ -114,6 +114,12 @@ div#ep_report_export_content_inner .report_export_options ul margin-left: 2px; } +#report_select_label, #export_select_label +{ + font-weight: 700; + margin-right: 5px; +} + /* HTML Reports */ a.html_report_print{ text-decoration: none; diff --git a/reports.epm b/reports.epm index 2a41e21..87a12df 100644 --- a/reports.epm +++ b/reports.epm @@ -138,9 +138,9 @@ ICAgIHNob3dfemVyb19yZXN1bHRzID0+IDEsCn07Cgo= document lang/en/phrases/reports.xml application/xml - f344518160d45ccd1d1709a926d9e6d1 + e039be104215776aa32fecaa24ed3d59 MD5 - 2563 + 2701 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjwh RE9DVFlQRSBwaHJhc2VzIFNZU1RFTSAiZW50aXRpZXMuZHRkIj4KPGVwcDpwaHJhc2VzIHhtbG5z PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczplcHA9Imh0dHA6Ly9lcHJpbnRz @@ -159,33 +159,36 @@ cHA6cGhyYXNlPgoKPGVwcDpwaHJhc2UgaWQ9InJlcG9ydDpub19ncm91cGluZyI+Tm8gR3JvdXBp bmc8L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0icmVwb3J0X3NlbGVjdCI+U2VsZWN0L0Rl c2VsZWN0IEFsbDwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJSZXBvcnQ6c2VhcmNoX2xp bmtzIj48ZGl2IGNsYXNzPSJlcF92aWV3X2dyb3VwX2J5Ij48ZXBjOnBpbiBuYW1lPSJsaW5rcyIg -Lz48L2Rpdj48L2VwcDpwaHJhc2U+Cgo8IS0tIHRoZSBFeGFtcGxlIHJlcG9ydHMgLS0+CjxlcHA6 -cGhyYXNlIGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydC9FeGFtcGxlOnRpdGxlIj5FeGFtcGxlPC9l -cHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2luL1NjcmVlbi9SZXBvcnQvRXhhbXBsZS9B -cnRpY2xlczp0aXRsZSI+QXJ0aWNsZXM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJQbHVn -aW4vU2NyZWVuL1JlcG9ydC9FeGFtcGxlL0NvbmZlcmVuY2VJdGVtczp0aXRsZSI+Q29uZmVyZW5j -ZSBJdGVtczwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJleHBvcnRfdGl0bGUiPkV4cG9y -dCBPcHRpb25zPC9lcHA6cGhyYXNlPgoKPCEtLSBIVE1MIEV4cG9ydCAtLT4KPGVwcDpwaHJhc2Ug -aWQ9InJlcG9ydF9odG1sX2V4cG9ydF90aXRsZSI+UmVwb3J0PC9lcHA6cGhyYXNlPgo8ZXBwOnBo -cmFzZSBpZD0icmVwb3J0X2h0bWxfcHJpbnRfYnRuIj48YSBocmVmPSJqYXZhc2NyaXB0OndpbmRv -dy5wcmludCgpIiBjbGFzcz0iZXBfZm9ybV9hY3Rpb25fYnV0dG9uIGh0bWxfcmVwb3J0X3ByaW50 -IGVwX25vcHJpbnQiPlByaW50PC9hPjwvZXBwOnBocmFzZT4KCjwhLS0gRVByaW50IFJlcG9ydCAt -LT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4vUmVwb3J0L0VQcmludDp0aXRsZSI+RVBy -aW50czwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImV4cG9ydGZpZWxkczplcHJpbnRfcmVw -b3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJp -bnRfcmVwb3J0OnNvcnQ6Ynl5ZWFyIj5ZZWFyPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0i -ZXByaW50X3JlcG9ydDpzb3J0OmJ5bmFtZSI+Q3JlYXRvcnM8L2VwcDpwaHJhc2U+CjxlcHA6cGhy -YXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6Ynl0aXRsZSI+VGl0bGU8L2VwcDpwaHJhc2U+Cjxl -cHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6YnlkaXZpc2lvbiI+RGl2aXNpb248L2Vw -cDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpkaXZpc2lvbnMi -PkRpdmlzaW9uPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91 -cDpzdWJqZWN0cyI+U3ViamVjdDwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImVwcmludF9y -ZXBvcnQ6Z3JvdXA6dHlwZSI+SXRlbSBUeXBlPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0i -ZXByaW50X3JlcG9ydDpncm91cDpkYXRlIj5EYXRlPC9lcHA6cGhyYXNlPgoKPCEtLSBVc2VyIFJl -cG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4vUmVwb3J0L1VzZXI6dGl0bGUi -PlVzZXJzPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXhwb3J0ZmllbGRzOnVzZXJfcmVw -b3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJ1c2Vy -X3JlcG9ydDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBocmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== +Lz48L2Rpdj48L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0icmVwb3J0X3NlbGVjdF9sYWJl +bCI+U2VsZWN0IFJlcG9ydDo8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJleHBvcnRfc2Vs +ZWN0X2xhYmVsIj5TZWxlY3QgRXhwb3J0IEZvcm1hdDo8L2VwcDpwaHJhc2U+Cgo8IS0tIHRoZSBF +eGFtcGxlIHJlcG9ydHMgLS0+CjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydC9F +eGFtcGxlOnRpdGxlIj5FeGFtcGxlPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2lu +L1NjcmVlbi9SZXBvcnQvRXhhbXBsZS9BcnRpY2xlczp0aXRsZSI+QXJ0aWNsZXM8L2VwcDpwaHJh +c2U+CjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydC9FeGFtcGxlL0NvbmZlcmVu +Y2VJdGVtczp0aXRsZSI+Q29uZmVyZW5jZSBJdGVtczwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNl +IGlkPSJleHBvcnRfdGl0bGUiPkV4cG9ydCBPcHRpb25zPC9lcHA6cGhyYXNlPgoKPCEtLSBIVE1M +IEV4cG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9InJlcG9ydF9odG1sX2V4cG9ydF90aXRsZSI+UmVw +b3J0PC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0icmVwb3J0X2h0bWxfcHJpbnRfYnRuIj48 +YSBocmVmPSJqYXZhc2NyaXB0OndpbmRvdy5wcmludCgpIiBjbGFzcz0iZXBfZm9ybV9hY3Rpb25f +YnV0dG9uIGh0bWxfcmVwb3J0X3ByaW50IGVwX25vcHJpbnQiPlByaW50PC9hPjwvZXBwOnBocmFz +ZT4KCjwhLS0gRVByaW50IFJlcG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4v +UmVwb3J0L0VQcmludDp0aXRsZSI+RVByaW50czwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9 +ImV4cG9ydGZpZWxkczplcHJpbnRfcmVwb3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJh +c2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6Ynl5ZWFyIj5ZZWFyPC9lcHA6 +cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpzb3J0OmJ5bmFtZSI+Q3JlYXRv +cnM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6Ynl0aXRs +ZSI+VGl0bGU8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6 +YnlkaXZpc2lvbiI+RGl2aXNpb248L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0iZXByaW50 +X3JlcG9ydDpncm91cDpkaXZpc2lvbnMiPkRpdmlzaW9uPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFz +ZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpzdWJqZWN0cyI+U3ViamVjdDwvZXBwOnBocmFzZT4K +PGVwcDpwaHJhc2UgaWQ9ImVwcmludF9yZXBvcnQ6Z3JvdXA6dHlwZSI+SXRlbSBUeXBlPC9lcHA6 +cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpkYXRlIj5EYXRlPC9l +cHA6cGhyYXNlPgoKPCEtLSBVc2VyIFJlcG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9T +Y3JlZW4vUmVwb3J0L1VzZXI6dGl0bGUiPlVzZXJzPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBp +ZD0iZXhwb3J0ZmllbGRzOnVzZXJfcmVwb3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJh +c2U+CjxlcHA6cGhyYXNlIGlkPSJ1c2VyX3JlcG9ydDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBo +cmFzZT4KCjwvZXBwOnBocmFzZXM+Cg==
@@ -783,9 +786,9 @@ XCIkdmFsdWVcIiI7Cgl9CgoJcmV0dXJuICR2YWx1ZTsKfQoKCjE7Cg== document plugins/EPrints/Plugin/Screen/Report.pm text/plain - d694685745fab90a5d9960238240662a + 2c4683e23b226dbc06eda9f63d03a1bc MD5 - 43946 + 44999 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OlNjcmVlbjo6UmVwb3J0OwoKIyBBYnN0cmFjdCBjbGFz cyB0aGF0IGhhbmRsZXMgdGhlIFJlcG9ydCB0b29scwoKdXNlIEpTT04gcXcoZW5jb2RlX2pzb24p Owp1c2UgRVByaW50czo6UGx1Z2luOjpTY3JlZW47CkBJU0EgPSAoICdFUHJpbnRzOjpQbHVnaW46 @@ -1042,521 +1045,540 @@ by0+cmVuZGVyX2Zvcm0oICJnZXQiICk7CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVu ZGVyX2NvbnRyb2xzKCAxICkgKTsKCgkjYWRkIGVhY2ggcmVwb3J0IHRvIHRoZSBzZWxlY3QgY29t cG9uZW50IGFuZCBnZW5lcmF0ZSBzZWFyY2ggZm9ybSBpZiByZXF1aXJlZAoJbXkgJHJlcG9ydF9z ZWxlY3QgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic2VsZWN0IiwgbmFtZT0+InJlcG9ydCIsIGlk -PT4ic2VsZWN0X3JlcG9ydCIgKTsKCW15ICVzZWFyY2hfZm9ybXM7CglteSAkY3VzdG9tX3JlcG9y -dHMgPSAwOwoJI2ZvcmVhY2ggbXkgJHJlcG9ydF9wbHVnaW4gKCBAcGx1Z2lucyApCglmb3JlYWNo -IG15ICRyZXBvcnRfcGx1Z2luICggc29ydCB7ICRhLT5nZXRfc3VidHlwZSBjbXAgJGItPmdldF9z -dWJ0eXBlIH0gQHBsdWdpbnMgKQoJewoJCWlmKCAkcmVwb3J0X3BsdWdpbi0+cGFyYW0oICJjdXN0 -b20iICkgKQoJCXsJCgkJCSRjdXN0b21fcmVwb3J0cysrOwoJCQlteSAkZm9ybWlkID0gJHJlcG9y -dF9wbHVnaW4tPntzY29uZn07CgoJCQkjYWRkIHRvIHNlbGVjdCBjb21wb25lbnQKCQkJbXkgJGlk -ID0gJHJlcG9ydF9wbHVnaW4tPntyZXBvcnR9OwoJCQlteSAkb3B0aW9uID0gJHJlcG8tPm1ha2Vf -ZWxlbWVudCggIm9wdGlvbiIsIHZhbHVlID0+ICRyZXBvcnRfcGx1Z2luLT5nZXRfc3VidHlwZSwg -Zm9ybSA9PiAkZm9ybWlkICk7CgoJCQkjc2V0IGRlZmF1bHQgb3B0aW9uIGZvciBzZWxlY3QgY29t -cG9uZW50IGlmIHJlcXVpcmVkIChpLmUuIHdlIGhhdmUgY29tZSBmcm9tIGEgcmVmaW5lIHNlYXJj -aCBvciBuZXcgc2VhcmNoIGxpbmspCgkJCW15ICRyZWZpbmVfc2NvbmYgPSAkc2VsZi0+e3Nlc3Np -b259LT5wYXJhbSggInNjb25mIiApOwoJCQlpZiggKCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rp -b259IGVxICJ1cGRhdGUiIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgIm5ld3Nl -YXJjaCIgKSAmJiBkZWZpbmVkICRyZWZpbmVfc2NvbmYgJiYgJHJlZmluZV9zY29uZiBlcSAkZm9y -bWlkICkKCQkJewoJCQkJJG9wdGlvbi0+c2V0QXR0cmlidXRlKCBzZWxlY3RlZCA9PiAic2VsZWN0 -ZWQiICk7CgkJCX0KCgkJCSNzZXQgb3B0aW9uIHRleHQgYW5kIGFkZCB0byBzZWxlY3QKICAJCQkk -b3B0aW9uLT5hcHBlbmRDaGlsZCggJHJlcG9ydF9wbHVnaW4tPnJlbmRlcl90aXRsZSApOwoJCQkk -cmVwb3J0X3NlbGVjdC0+YXBwZW5kQ2hpbGQoICRvcHRpb24gKTsKCgkJCSNjcmVhdGUgc2VhcmNo -IGZvcm0JCQkKCQkJI2dldCByZXBvcnQgZGF0YXNldCBhbmQgYXBwcm9wcmlhdGUgc2VhcmNoIGNv -bmZpZwoJCQlteSAkcmVwb3J0X2RzID0gJHJlcG8tPmRhdGFzZXQoICRyZXBvcnRfcGx1Z2luLT57 -c2VhcmNoZGF0YXNldGlkfSApOwoJCQlteSAkc2NvbmYgPSAkcmVwb3J0X2RzLT5zZWFyY2hfY29u -ZmlnKCAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfSApIDsKCQkJI215ICRzZWFyY2ggPSBFUHJpbnRz -OjpTZWFyY2gtPm5ldygKCQkgICAgICAgICMgICAgICAgIGtlZXBfY2FjaGUgPT4gMSwKCSAgICAg -ICAgICAgICAgICAjCXNlc3Npb24gPT4gJHJlcG8sCgkJICAgICAgICAjICAgICAgICBkYXRhc2V0 -ID0+ICRyZXBvcnRfZHMsCgkJICAgICAgICAjICAgICAgICAleyRzY29uZn0KCQkJIyk7CgoJCQlt -eSAkZm9ybWF0ID0gInJlcG9ydC8iIC4gJHJlcG9ydF9kcy0+YmFzZV9pZDsKCSAgICAgICAgICAg -ICAgICBteSAkc2VhcmNoZXhwID0gJHJlcG8tPnBsdWdpbiggIlNlYXJjaCIgKS0+cGx1Z2lucygK -ICAgICAgICAgICAgICAgICAgICAgICAgCXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAJa2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNz -aW9uID0+ICRzZWxmLT57c2Vzc2lvbn0sCiAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAg -IGRhdGFzZXQgPT4gJHJlcG9ydF9kcywKICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAg -JXskc2NvbmZ9CiAgICAgICAgICAgICAgICAgICAgICAgIAl9LAogICAgICAgICAgICAgICAgICAg -ICAgICB0eXBlID0+ICJTZWFyY2giLAogICAgICAgICAgICAgICAgICAgICAgICBjYW5fc2VhcmNo -ID0+ICRmb3JtYXQsCiAgICAgICAgICAgICAgICAJKTsJCgkJCSRzZWFyY2hleHAtPmZyb21fZm9y -bTsKCgkJCSNnZW5lcmF0ZSB0aGUgZm9ybQoJCQlteSAkZnJhZyA9ICRzZWxmLT5yZW5kZXJfc2Vh -cmNoX2ZpZWxkcyggJHNlYXJjaGV4cCwgJGZvcm1pZCApOwoJCQkkc2VhcmNoX2Zvcm1zeyRmb3Jt -aWR9ID0gJGZyYWcgdW5sZXNzIGV4aXN0cyAkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9OwoJCX0JCgl9 -CgkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvcnRfc2VsZWN0ICk7CgkkZm9ybS0+YXBwZW5kQ2hp -bGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2NyZWVuIiwgJHNlbGYtPntzY3JlZW5p -ZH0gKSApOwoKCSNyZW5kZXIgcG9zc2libGUgc2VhcmNoIGZvcm1zCglmb3JlYWNoIG15ICRmb3Jt -aWQgKGtleXMgJXNlYXJjaF9mb3JtcykKCXsKCQlteSAkdGFibGUgPSAkcmVwby0+bWFrZV9lbGVt -ZW50KCAidGFibGUiLCBjbGFzcz0+ImVwX3NlYXJjaF9maWVsZHMiLCBpZD0+JGZvcm1pZCwgc3R5 -bGU9PiJkaXNwbGF5OiBub25lIiApOwoJICAgICAgICAkZm9ybS0+YXBwZW5kQ2hpbGQoICR0YWJs -ZSApOwoJICAgICAgICAkdGFibGUtPmFwcGVuZENoaWxkKCAkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9 -ICk7Cgl9CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NvbnRyb2xzICk7Cgkk -Y3VzdG9tLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCgkjamF2YXNjcmlwdCBmb3IgY2hhbmdpbmcg -Zm9ybXMgYmFzZWQgb24gcmVwb3J0IHNlbGVjdGlvbgoJJGN1c3RvbS0+YXBwZW5kQ2hpbGQoICRy -ZXBvLT5tYWtlX2phdmFzY3JpcHQoICdpbml0UmVwb3J0Rm9ybSgpOycgKSApOwoKCWlmKCAkY3Vz -dG9tX3JlcG9ydHMgJiYgJHByZXNldHNfYWRkZWQgPiAwICkgI3NldCB1cCB0YWIgaW50ZXJmYWNl -Cgl7CgkJbXkgQGxhYmVsczsKCSAgICAgICAgbXkgQHBhbmVsczsKCgkJcHVzaCBAbGFiZWxzLCAk -cmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnRzX3ByZXNldCIgKTsKCQlwdXNoIEBsYWJlbHMsICRy -ZXBvLT5odG1sX3BocmFzZSggInJlcG9ydHNfY3VzdG9tIiApOwoKCQlwdXNoIEBwYW5lbHMsICRw -cmVzZXQ7CgkJcHVzaCBAcGFuZWxzLCAkY3VzdG9tOwoKCQlteSAlb3B0czsKCQlpZiggJHNlbGYt -Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAibmV3c2VhcmNoIiB8fCAkc2VsZi0+e3Byb2Nlc3Nv -cn0tPnthY3Rpb259IGVxICJ1cGRhdGUiICApCgkJewoJCQkkb3B0c3tjdXJyZW50fSA9IDE7CgkJ -fQoKCQlyZXR1cm4gJHJlcG8tPnhodG1sLT50YWJzKFxAbGFiZWxzLCBcQHBhbmVscywgJW9wdHMg -KTsKCX0KCWVsc2lmKCAkcHJlc2V0c19hZGRlZCA+IDAgKQoJewkKCQlyZXR1cm4gJHByZXNldDsK -CX0KCWVsc2UKCXsKCQlyZXR1cm4gJGN1c3RvbTsKCX0KfQoKc3ViIHJlbmRlcl9zZWFyY2hfZmll -bGRzCnsKICAgICAgICBteSggJHNlbGYsICRzZWFyY2gsICRmb3JtaWQgKSA9IEBfOwoKCW15ICRl -eHAgPSAkc2VsZi0+e3Nlc3Npb259LT5wYXJhbSggImV4cCIgKTsKCW15ICRzY29uZiA9ICRzZWxm -LT57c2Vzc2lvbn0tPnBhcmFtKCAic2NvbmYiICk7CiAgICAgICAgaWYoIGRlZmluZWQgJGV4cCAm -JiBkZWZpbmVkICRzY29uZiAmJiAkc2NvbmYgZXEgJGZvcm1pZCApCgl7CiAgICAgICAgICAgICAg -ICAkc2VhcmNoLT5mcm9tX3N0cmluZyggJGV4cCApOwogIAl9CgogICAgICAgIG15ICRmcmFnID0g -JHNlbGYtPntzZXNzaW9ufS0+bWFrZV9kb2NfZnJhZ21lbnQ7CiAgICAgICAgZm9yZWFjaCBteSAk -c2YgKCAkc2VhcmNoLT5nZXRfbm9uX2ZpbHRlcl9zZWFyY2hmaWVsZHMgKQogICAgICAgIHsKCSAg -ICAgICAgICRmcmFnLT5hcHBlbmRDaGlsZCgKICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYt -PntzZXNzaW9ufS0+cmVuZGVyX3Jvd193aXRoX2hlbHAoCiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgaGVscF9wcmVmaXggPT4gJHNmLT5nZXRfZm9ybV9wcmVmaXguIl9oZWxwIiwKICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwID0+ICRzZi0+cmVuZGVyX2hlbHAsCiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPT4gJHNmLT5yZW5kZXJfbmFtZSwK -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9PiAkc2YtPnJlbmRlciwKICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub190b2dnbGUgPT4gKCAkc2YtPntzaG93X2hl -bHB9IGVxICJhbHdheXMiICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9faGVs -cCA9PiAoICRzZi0+e3Nob3dfaGVscH0gZXEgIm5ldmVyIiApLAogICAgICAgIAkpICk7CiAgICAg -ICAgfQoKICAgICAgICByZXR1cm4gJGZyYWc7Cn0KCnN1YiByZW5kZXJfY29udHJvbHMKewoJbXko -ICRzZWxmLCAkd2l0aF9qcyApID0gQF87CgoJbXkgJGRpdiA9ICRzZWxmLT57c2Vzc2lvbn0tPm1h -a2VfZWxlbWVudCgKICAgICAgICAgICAgICAgICJkaXYiICwKICAgICAgICAgICAgICAgIGNsYXNz -ID0+ICJlcF9zZWFyY2hfYnV0dG9ucyIgKTsKICAgICAgICAkZGl2LT5hcHBlbmRDaGlsZCggJHNl -bGYtPntzZXNzaW9ufS0+cmVuZGVyX2FjdGlvbl9idXR0b25zKAogICAgICAgICAgICAgICAgX29y -ZGVyID0+IFsgInNlYXJjaCIgXSwKICAgICAgICAgICAgICAgICNuZXdzZWFyY2ggPT4gJHNlbGYt -PntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246YWN0aW9uX3Jlc2V0IiAp -LAogICAgICAgICAgICAgICAgc2VhcmNoID0+ICRzZWxmLT57c2Vzc2lvbn0tPnBocmFzZSggImxp -Yi9zZWFyY2hleHByZXNzaW9uOmFjdGlvbl9zZWFyY2giICkgKQogICAgICAgICk7CgkKCW15ICR4 -bWwgPSAkc2VsZi0+e3Nlc3Npb259LT54bWw7CgoJaWYoICR3aXRoX2pzICkKCXsKCQlteSAkY2xl -YXJfZm9ybSA9ICRkaXYtPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NsZWFyZm9ybSggJHht -bCApICk7Cgl9CgogICAgICAgIG15ICRjbGVhcl9idG4gPSAkZGl2LT5hcHBlbmRDaGlsZCggJHht -bC0+Y3JlYXRlX2VsZW1lbnQoICJidXR0b24iLAogICAgICAgIAl0eXBlID0+ICJidXR0b24iLAog -ICAgICAgICAgICAgICAgb25jbGljayA9PiAiY2xlYXJGb3JtKCk7IiwKICAgICAgICAgICAgICAg -IGNsYXNzID0+ICJlcF9mb3JtX2FjdGlvbl9idXR0b24gY2xlYXJfYnV0dG9uIiwKICAgICAgICAg -ICAgICAgICkgKTsKICAgICAgICAkY2xlYXJfYnRuLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRl -X3RleHRfbm9kZSggJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Np -b246YWN0aW9uX3Jlc2V0IiApICkgKTsKCXJldHVybiAkZGl2Owp9CgpzdWIgcmVuZGVyCnsKCW15 -KCAkc2VsZiApID0gQF87CgoJIyBpZiB1c2VycyBhY2Nlc3MgU2NyZWVuOjpSZXBvcnQgZGlyZWN0 -bHkgd2Ugd2FudCB0byBkaXNwbGF5IHNvbWUgc29ydCBvZiBtZW51CgkjIHdoZXJlIHVzZXJzIGNh -biBzZWxlY3Qgdmlld2FibGUgcmVwb3J0cwoJaWYoICggIkVQcmludHM6OlBsdWdpbjo6Ii4kc2Vs -Zi0+Z2V0X2lkIGVxIF9fUEFDS0FHRV9fICYmICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0g -bmUgInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJuZXdzZWFy -Y2giICkKCXsJCgkJcmV0dXJuICRzZWxmLT5yZW5kZXJfc3BsYXNoX3BhZ2U7Cgl9CgoJbXkgJHJl -cG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJh -Z21lbnQ7CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9leHBvcnRfYmFyICk7 -CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2dyb3VwX29wdGlvbnMgKTsKCSRj -aHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfc29ydF9vcHRpb25zICk7CgoJaWYoICRz -ZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRjaHVuay0+YXBw -ZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwoJfQoKCW15ICRpdGVtcyA9 -ICRzZWxmLT5pdGVtczsKCWlmKCAhZGVmaW5lZCAkaXRlbXMgfHwgJGl0ZW1zLT5jb3VudCA9PSAw -ICkKCXsKCQkjIE5vIGl0ZW1zIG1lc3NhZ2UKCX0KCglteSAkanNvbjsKCglpZiggZGVmaW5lZCAk -c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9 -IG5lICIiICkKCXsKCQlteSAkZ3JvdXBlZCA9ICRzZWxmLT5nZXRfZ3JvdXBlZF9pdGVtcyggJGl0 -ZW1zLCAxICk7CgkJJGpzb24gPSBlbmNvZGVfanNvbiAkZ3JvdXBlZDsKCX0KCWVsc2UKCXsKCQlt -eSAkaXRlbV9pZHMgPSBkZWZpbmVkICRpdGVtcyA/ICRpdGVtcy0+aWRzIDogW107CgkJJGpzb24g -PSAiWyIuam9pbignLCcsQCRpdGVtX2lkcykuIl0iOwoJfQoKICAgICAgICBteSAkdXJsID0gJHJl -cG8tPmN1cnJlbnRfdXJsKCBob3N0ID0+IDEgKTsKICAgICAgICBteSAkcGFyYW1ldGVycyA9IFVS -SS0+bmV3OwogICAgICAgICRwYXJhbWV0ZXJzLT5xdWVyeV9mb3JtKAogICAgICAgICAgICAgICAg -JHNlbGYtPmhpZGRlbl9iaXRzLAogICAgICAgICk7CiAgICAgICAgJHBhcmFtZXRlcnMgPSAkcGFy -YW1ldGVycy0+cXVlcnk7CgkJCglteSAkZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlbGYtPnBhcmFt -KCAnZGF0YXNldGlkJyApICkgaWYgZGVmaW5lZCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICk7 -CglteSAkcHJlZml4ID0gJGRzLT5iYXNlX2lkIGlmIGRlZmluZWQgJGRzOwoKCSMgdGhlIG1haW4g -PGRpdj4KCW15ICRjb250YWluZXJfaWQgPSBzcHJpbnRmKCAiZXBfcmVwb3J0XyVzXF9jb250YWlu -ZXIiLCAkc2VsZi0+Z2V0X3JlcG9ydCApOwoKCSN1cGRhdGUgamF2YXNjcmlwdCBwYXJhbWV0ZXJz -IGlmIGNvbWluZyBmcm9tIGEgc2VhcmNoIHJlcXVlc3QKCWlmKCAkc2VsZi0+e3Byb2Nlc3Nvcn0t -PnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQlteSAkcGx1Z2luID0gJHNlbGYtPntwcm9jZXNz -b3J9LT57cmVwb3J0fTsKCQkkcGx1Z2luID1+IHMvOi8lM0EvZzsKCQkkcGFyYW1ldGVycyA9ICJz -Y3JlZW49JHBsdWdpbiI7CgkJJHByZWZpeCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2RhdGFzZXRp -ZH07CgkJJGNvbnRhaW5lcl9pZCA9IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIs -ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydF9wbHVnaW59LT57cmVwb3J0fSApOwoJfQoJCgkj -c2hvdy9oaWRlIGNvbXBsaWFuY2UKCW15ICRzaG93X2NvbXBsaWFuY2UgPSAxOwoJJHNob3dfY29t -cGxpYW5jZSA9ICRzZWxmLT57c2hvd19jb21wbGlhbmNlfSBpZiBkZWZpbmVkICRzZWxmLT57c2hv -d19jb21wbGlhbmNlfTsKCgkjY3VzdG9tIGxhYmVscwoJbXkgJGxhYmVscyA9IDA7CgkkbGFiZWxz -ID0gZW5jb2RlX2pzb24gJHNlbGYtPntsYWJlbHN9IGlmIGRlZmluZWQgJHNlbGYtPntsYWJlbHN9 -OwoKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2phdmFzY3JpcHQoIDw8IkVPSiIg -KSApOwpkb2N1bWVudC5vYnNlcnZlKCJkb206bG9hZGVkIiwgZnVuY3Rpb24oKSB7CgluZXcgRVBy -aW50c19TY3JlZW5fUmVwb3J0X0xvYWRlciggewoJCWlkczogJGpzb24sCgkJc3RlcDogMjAsCgkJ -cHJlZml4OiAnJHByZWZpeCcsCgkJdXJsOiAnJHVybCcsCgkJcGFyYW1ldGVyczogJyRwYXJhbWV0 -ZXJzJywJCQoJCWNvbnRhaW5lcl9pZDogJyRjb250YWluZXJfaWQnLAoJCXNob3dfY29tcGxpYW5j -ZTogJHNob3dfY29tcGxpYW5jZSwKCQlsYWJlbHM6ICRsYWJlbHMKCX0gKS5leGVjdXRlKCk7Cgp9 -KTsKRU9KCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+bWFrZV9lbGVtZW50KCAnZGl2Jywg -Y2xhc3MgPT4gJ2VwX3JlcG9ydF9wYWdlJywgaWQgPT4gJGNvbnRhaW5lcl9pZCApICk7CgoJI3No -b3cgc2VhcmNoIGNvbnRyb2xzIGFmdGVyIHRoZSByZXN1bHRzIHRvbwoJaWYoICRzZWxmLT57cHJv -Y2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQogICAgICAgIHsKICAgICAgICAgICAgICAg -ICRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwogICAg -ICAgIH0KCglyZXR1cm4gJGNodW5rOwp9CgoKc3ViIHJlbmRlcl9leHBvcnRfYmFyCnsKCW15KCAk -c2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsg -PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJbXkgQHBsdWdpbnMgPSAkc2VsZi0+ZXhwb3J0 -X3BsdWdpbnM7CglyZXR1cm4gJGNodW5rIHVubGVzcyggc2NhbGFyKCBAcGx1Z2lucyApIHx8IGRl -ZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRz -IiApICkgKTsKCglteSAkcmVwb3J0X2RzID0gJHJlcG8tPmRhdGFzZXQoICRzZWxmLT57ZGF0YXNl -dGlkfSApOwoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmli -dXRlKCBtZXRob2QgPT4gImdldCIgKTsKCglpZiggZGVmaW5lZCAkc2VsZi0+cmVwb3NpdG9yeS0+ -cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2Vh -cmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVs -ZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2UpICk7 -Cgl9CgkJCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZv -cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNl -bGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQkKCglpZiggZGVmaW5lZCAkc2VsZi0+e3By -b2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5y -ZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBf -ZXhwfSApICk7Cgl9CQoKCWlmKCAhZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv -cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICkgKSApCgl7CgkJI25vIGN1c3RvbSBleHBvcnQgZmll -bGRzIGRlZmluZWQsIHVzZSBleHBvcnQgcGx1Z2lucyBkZXNpZ25lZCBmb3IgdGhpcyByZXBvcnQK -CQlteSAkc2VsZWN0ID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX29wdGlvbl9s -aXN0KAoJCQluYW1lID0+ICdleHBvcnQnLAoJCQl2YWx1ZXMgPT4gW21hcCB7ICRfLT5nZXRfc3Vi -dHlwZSB9IEBwbHVnaW5zXSwKCQkJbGFiZWxzID0+IHttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgPT4g -JF8tPmdldF9uYW1lIH0gQHBsdWdpbnN9LAoJCSkgKTsKCX0KCWVsc2UKCXsKCQkjcHJvdmlkZSBs -aXN0IG9mIGRlZmF1bHQgZXhwb3J0IHBsdWdpbnMgZm9yIHJlcG9ydHMKCQlAcGx1Z2lucyA9ICRz -ZWxmLT5leHBvcnRfcGx1Z2lucyggImdlbmVyaWMiICk7CgkJbXkgJHNlbGVjdCA9ICRmb3JtLT5h -cHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlzdCgKCQkJbmFtZSA9PiAnZXhwb3J0 -JywKCQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgfSBAcGx1Z2luc10sCgkJCWxh -YmVscyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRfLT5nZXRfbmFtZSB9IEBwbHVnaW5z -fSwKCQkpICk7CgoJCSNjcmVhdGUgbGFiZWxzIGFuZCBwYW5lbHMgZm9yIHRhYmJlZCBpbnRlcmZh -Y2VkCgkJbXkgJHhtbCA9ICRyZXBvLT54bWw7CgkJbXkgJHhodG1sID0gJHJlcG8tPnhodG1sOwoK -CQlteSAkc2VsZWN0X2FsbCA9ICRmb3JtLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9zZWxl -Y3RhbGwoICR4bWwgKSApOwoJCW15ICRzZWxlY3RfYnRuID0gJGZvcm0tPmFwcGVuZENoaWxkKCAk -eG1sLT5jcmVhdGVfZWxlbWVudCggImJ1dHRvbiIsCgkgICAgICAgICAgICAgICAgICAgIHR5cGUg -PT4gImJ1dHRvbiIsCgkgICAgICAgICAgICAgICAgICAgIG9uY2xpY2sgPT4gInRvZ2dsZUNoZWNr -Ym94ZXMoKTsiLAoJICAgICAgICAgICAgICAgICAgICBjbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25f -YnV0dG9uIHNlbGVjdF9idXR0b24iLAoJCSkgKTsKCSAgICAJJHNlbGVjdF9idG4tPmFwcGVuZENo -aWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkcmVwby0+cGhyYXNlKCAicmVwb3J0X3NlbGVj -dCIgKSApICk7CgoJCSNhbGxvdyB1c2VyIHRvIGNob29zZSB3aGljaCBmaWVsZHMgdGhleSB3YW50 -IHRvIGV4cG9ydAoJCW15ICRleHBvcnRfb3B0aW9ucyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJk -aXYiICk7CgoJCW15IEBrZXlzOwoJCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWcoICRzZWxmLT57 -ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICkgKQoJCXsKCQkJQGtleXMgPSBAeyRy -ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICl9 -OwoJCX0KCQllbHNlCgkJewoJCQlAa2V5cyA9IGtleXMgJXskcmVwby0+Y29uZmlnKCAkc2VsZi0+ -e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIgKX07IAoJCX0KCQlmb3JlYWNoIG15ICRrZXkg -KCBAa2V5cyApCgkJewoJCQkjY3JlYXRlIGEgbmV3IGxpc3QJCQkKCQkJbXkgJHVsID0gJHJlcG8t -Pm1ha2VfZWxlbWVudCggInVsIiwKCSAgICAgICAgICAgICAgICAJc3R5bGUgPT4gImxpc3Qtc3R5 -bGUtdHlwZTogbm9uZSIKCSAgICAgICAgCSk7CgkJCQoJCQlteSAkY291bnQgPSAwOyAjY291bnQg -aG93IG1hbnkgZmllbGRzIHdlIGFkZAoJCQlmb3JlYWNoIG15ICRmaWVsZG5hbWUoIEB7JHJlcG8t -PmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMiICktPnska2V5fX0g -KQoJCQl7CgkJCQlpZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25m -fSwgImN1c3RvbV9leHBvcnQiICkgJiYgZXhpc3RzICR7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntl -eHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApfXskZmllbGRuYW1lfSApICN3ZSBoYXZlIGEg -Y3VzdG9tIGV4cG9ydCBmdW5jdGlvbiBpbnN0ZWFkIAoJCQkJewoJCQkJCSRjb3VudCsrOwoJCQkJ -CSRzZWxmLT5fZXhwb3J0X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAk -cmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRmaWVsZG9wdGlvbnM6JGZpZWxkbmFtZSIgKSApOyAK -CQkJCX0KCQkJCWVsc2lmKCBkZWZpbmVkIEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZp -Z19zdHJpbmcoICRyZXBvcnRfZHMsICRmaWVsZG5hbWUgKSApCgkJCQl7CgkJCQkJbXkgJGZpZWxk -ID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHJlcG9ydF9kcywg -JGZpZWxkbmFtZSApOwoJCQkJCSRjb3VudCsrOwogICAgICAgCQkJICAgICAgICAJJHNlbGYtPl9l -eHBvcnRfZmllbGRfY2hlY2tib3goICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRmaWVsZC0+cmVu -ZGVyX25hbWUgKTsKCgkJCQl9CgkJCX0KCQkJaWYoICRjb3VudCApICNvbmx5IGFkZCBvcHRpb25z -IGlmIHdlIGhhdmUgYW55IGZpZWxkcyB0byBzaG93CgkJCXsKCQkJCW15ICRkaXYgPSAkcmVwby0+ -bWFrZV9lbGVtZW50KCAiZGl2IiwgY2xhc3M9PiJyZXBvcnRfZXhwb3J0X29wdGlvbnMiICk7CgkJ -CQkkZGl2LT5hcHBlbmRDaGlsZCggbXkgJGggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaDQiICkg -KTsKCQkJCSRoLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRz -OiRrZXkiICkgKTsJCgkJCQkkZGl2LT5hcHBlbmRDaGlsZCggJHVsICk7CgkJCQkkZXhwb3J0X29w -dGlvbnMtPmFwcGVuZENoaWxkKCAkZGl2ICk7CgkJCX0KICAgICAgIAkJfQoJCSRmb3JtLT5hcHBl -bmRDaGlsZCggJGV4cG9ydF9vcHRpb25zICk7Cgl9CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAKCQkk -cmVwby0+cmVuZGVyX2J1dHRvbigKCQkJbmFtZSA9PiAiX2FjdGlvbl9leHBvcnQiLAoJCQljbGFz -cyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIiwKCQkJdmFsdWUgPT4gJHJlcG8tPnBocmFzZSgg -J2NnaS91c2Vycy9lZGl0X2VwcmludDpleHBvcnQnICkKCSkgKTsKCgkjY3JlYXRlIGEgY29sbGFw -c2libGUgYm94CglteSAkaW1hZ2VzdXJsID0gJHJlcG8tPmN1cnJlbnRfdXJsKCBwYXRoID0+ICJz -dGF0aWMiLCAic3R5bGUvaW1hZ2VzIiApOwoJbXkgJW9wdGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9u -fSA9ICRyZXBvOwogICAgICAgICRvcHRpb25ze2lkfSA9ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAg -ICAgICAkb3B0aW9uc3t0aXRsZX0gPSAkcmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRfdGl0bGUi -ICk7CiAgICAgICAgJG9wdGlvbnN7Y29sbGFwc2VkfSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9 -ICRmb3JtOwogICAgICAgICRvcHRpb25ze3Nob3dfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVs -dGlfZG93bi5wbmciOwoJJG9wdGlvbnN7aGlkZV9pY29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0 -aV91cC5wbmciOwoKCW15ICRib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9 -PiJ0ZXh0LWFsaWduOiBsZWZ0IiApOwoJJGJveC0+YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6 -cmVuZGVyKCAlb3B0aW9ucyApICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0 -dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9zb3J0X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBA -XzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5t -YWtlX2RvY19mcmFnbWVudDsKCglyZXR1cm4gJGNodW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8t -PmNvbmZpZyggJHNlbGYtPntzb3J0X2NvbmZ9LCAic29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNv -cnRfY29uZiA9ICRyZXBvLT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMi +PT4ic2VsZWN0X3JlcG9ydCIsICdhcmlhLWxhYmVsbGVkYnknID0+ICJyZXBvcnRfc2VsZWN0X2xh +YmVsIiApOwoJbXkgJXNlYXJjaF9mb3JtczsKCW15ICRjdXN0b21fcmVwb3J0cyA9IDA7CgkjZm9y +ZWFjaCBteSAkcmVwb3J0X3BsdWdpbiAoIEBwbHVnaW5zICkKCWZvcmVhY2ggbXkgJHJlcG9ydF9w +bHVnaW4gKCBzb3J0IHsgJGEtPmdldF9zdWJ0eXBlIGNtcCAkYi0+Z2V0X3N1YnR5cGUgfSBAcGx1 +Z2lucyApCgl7CgkJaWYoICRyZXBvcnRfcGx1Z2luLT5wYXJhbSggImN1c3RvbSIgKSApCgkJewkK +CQkJJGN1c3RvbV9yZXBvcnRzKys7CgkJCW15ICRmb3JtaWQgPSAkcmVwb3J0X3BsdWdpbi0+e3Nj +b25mfTsKCgkJCSNhZGQgdG8gc2VsZWN0IGNvbXBvbmVudAoJCQlteSAkaWQgPSAkcmVwb3J0X3Bs +dWdpbi0+e3JlcG9ydH07CgkJCW15ICRvcHRpb24gPSAkcmVwby0+bWFrZV9lbGVtZW50KCAib3B0 +aW9uIiwgdmFsdWUgPT4gJHJlcG9ydF9wbHVnaW4tPmdldF9zdWJ0eXBlLCBmb3JtID0+ICRmb3Jt +aWQgKTsKCgkJCSNzZXQgZGVmYXVsdCBvcHRpb24gZm9yIHNlbGVjdCBjb21wb25lbnQgaWYgcmVx +dWlyZWQgKGkuZS4gd2UgaGF2ZSBjb21lIGZyb20gYSByZWZpbmUgc2VhcmNoIG9yIG5ldyBzZWFy +Y2ggbGluaykKCQkJbXkgJHJlZmluZV9zY29uZiA9ICRzZWxmLT57c2Vzc2lvbn0tPnBhcmFtKCAi +c2NvbmYiICk7CgkJCWlmKCAoICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInVwZGF0 +ZSIgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAibmV3c2VhcmNoIiApICYmIGRl +ZmluZWQgJHJlZmluZV9zY29uZiAmJiAkcmVmaW5lX3Njb25mIGVxICRmb3JtaWQgKQoJCQl7CgkJ +CQkkb3B0aW9uLT5zZXRBdHRyaWJ1dGUoIHNlbGVjdGVkID0+ICJzZWxlY3RlZCIgKTsKCQkJfQoK +CQkJI3NldCBvcHRpb24gdGV4dCBhbmQgYWRkIHRvIHNlbGVjdAogIAkJCSRvcHRpb24tPmFwcGVu +ZENoaWxkKCAkcmVwb3J0X3BsdWdpbi0+cmVuZGVyX3RpdGxlICk7CgkJCSRyZXBvcnRfc2VsZWN0 +LT5hcHBlbmRDaGlsZCggJG9wdGlvbiApOwoKCQkJI2NyZWF0ZSBzZWFyY2ggZm9ybQkJCQoJCQkj +Z2V0IHJlcG9ydCBkYXRhc2V0IGFuZCBhcHByb3ByaWF0ZSBzZWFyY2ggY29uZmlnCgkJCW15ICRy +ZXBvcnRfZHMgPSAkcmVwby0+ZGF0YXNldCggJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRhc2V0 +aWR9ICk7CgkJCW15ICRzY29uZiA9ICRyZXBvcnRfZHMtPnNlYXJjaF9jb25maWcoICRyZXBvcnRf +cGx1Z2luLT57c2NvbmZ9ICkgOwoJCQkjbXkgJHNlYXJjaCA9IEVQcmludHM6OlNlYXJjaC0+bmV3 +KAoJCSAgICAgICAgIyAgICAgICAga2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAgICMJ +c2Vzc2lvbiA9PiAkcmVwbywKCQkgICAgICAgICMgICAgICAgIGRhdGFzZXQgPT4gJHJlcG9ydF9k +cywKCQkgICAgICAgICMgICAgICAgICV7JHNjb25mfQoJCQkjKTsKCgkJCW15ICRmb3JtYXQgPSAi +cmVwb3J0LyIgLiAkcmVwb3J0X2RzLT5iYXNlX2lkOwoJICAgICAgICAgICAgICAgIG15ICRzZWFy +Y2hleHAgPSAkcmVwby0+cGx1Z2luKCAiU2VhcmNoIiApLT5wbHVnaW5zKAogICAgICAgICAgICAg +ICAgICAgICAgICAJewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlrZWVwX2NhY2hl +ID0+IDEsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPT4gJHNlbGYt +PntzZXNzaW9ufSwKICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9PiAk +cmVwb3J0X2RzLAogICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAleyRzY29uZn0KICAg +ICAgICAgICAgICAgICAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4g +IlNlYXJjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbl9zZWFyY2ggPT4gJGZvcm1hdCwK +ICAgICAgICAgICAgICAgIAkpOwkKCQkJJHNlYXJjaGV4cC0+ZnJvbV9mb3JtOwoKCQkJI2dlbmVy +YXRlIHRoZSBmb3JtCgkJCW15ICRmcmFnID0gJHNlbGYtPnJlbmRlcl9zZWFyY2hfZmllbGRzKCAk +c2VhcmNoZXhwLCAkZm9ybWlkICk7CgkJCSRzZWFyY2hfZm9ybXN7JGZvcm1pZH0gPSAkZnJhZyB1 +bmxlc3MgZXhpc3RzICRzZWFyY2hfZm9ybXN7JGZvcm1pZH07CgkJfQkKCX0KCiAgICAjIGxhYmVs +IGZvciBmb3JtIHNlbGVjdCBkcm9wIGRvd24KICAgIG15ICRyZXBvcnRfbGFiZWwgPSAkcmVwby0+ +bWFrZV9lbGVtZW50KCAibGFiZWwiLCBpZD0+InJlcG9ydF9zZWxlY3RfbGFiZWwiICk7CiAgICAk +cmVwb3J0X2xhYmVsLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0X3Nl +bGVjdF9sYWJlbCIgKSApOwogICAgJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwb3J0X2xhYmVsICk7 +CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwb3J0X3NlbGVjdCApOwoJJGZvcm0tPmFwcGVuZENo +aWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNjcmVlbiIsICRzZWxmLT57c2NyZWVu +aWR9ICkgKTsKCgkjcmVuZGVyIHBvc3NpYmxlIHNlYXJjaCBmb3JtcwoJZm9yZWFjaCBteSAkZm9y +bWlkIChrZXlzICVzZWFyY2hfZm9ybXMpCgl7CgkJbXkgJHRhYmxlID0gJHJlcG8tPm1ha2VfZWxl +bWVudCggImRpdiIsIGNsYXNzPT4iZXBfdGFibGUgZXBfc2VhcmNoX2ZpZWxkcyIsIGlkPT4kZm9y +bWlkLCBzdHlsZT0+ImRpc3BsYXk6IG5vbmUiICk7CgkgICAgICAgICRmb3JtLT5hcHBlbmRDaGls +ZCggJHRhYmxlICk7CgkgICAgICAgICR0YWJsZS0+YXBwZW5kQ2hpbGQoICRzZWFyY2hfZm9ybXN7 +JGZvcm1pZH0gKTsKCX0KCgkkZm9ybS0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfY29udHJv +bHMgKTsKCSRjdXN0b20tPmFwcGVuZENoaWxkKCAkZm9ybSApOwoKCSNqYXZhc2NyaXB0IGZvciBj +aGFuZ2luZyBmb3JtcyBiYXNlZCBvbiByZXBvcnQgc2VsZWN0aW9uCgkkY3VzdG9tLT5hcHBlbmRD +aGlsZCggJHJlcG8tPm1ha2VfamF2YXNjcmlwdCggJ2luaXRSZXBvcnRGb3JtKCk7JyApICk7CgoJ +aWYoICRjdXN0b21fcmVwb3J0cyAmJiAkcHJlc2V0c19hZGRlZCA+IDAgKSAjc2V0IHVwIHRhYiBp +bnRlcmZhY2UKCXsKCQlteSBAbGFiZWxzOwoJICAgICAgICBteSBAcGFuZWxzOwoKCQlwdXNoIEBs +YWJlbHMsICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydHNfcHJlc2V0IiApOwoJCXB1c2ggQGxh +YmVscywgJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0c19jdXN0b20iICk7CgoJCXB1c2ggQHBh +bmVscywgJHByZXNldDsKCQlwdXNoIEBwYW5lbHMsICRjdXN0b207CgoJCW15ICVvcHRzOwoJCWlm +KCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJuZXdzZWFyY2giIHx8ICRzZWxmLT57 +cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInVwZGF0ZSIgICkKCQl7CgkJCSRvcHRze2N1cnJlbnR9 +ID0gMTsKCQl9CgoJCXJldHVybiAkcmVwby0+eGh0bWwtPnRhYnMoXEBsYWJlbHMsIFxAcGFuZWxz +LCAlb3B0cyApOwoJfQoJZWxzaWYoICRwcmVzZXRzX2FkZGVkID4gMCApCgl7CQoJCXJldHVybiAk +cHJlc2V0OwoJfQoJZWxzZQoJewoJCXJldHVybiAkY3VzdG9tOwoJfQp9CgpzdWIgcmVuZGVyX3Nl +YXJjaF9maWVsZHMKewogICAgbXkoICRzZWxmLCAkc2VhcmNoLCAkZm9ybWlkICkgPSBAXzsKCglt +eSAkZXhwID0gJHNlbGYtPntzZXNzaW9ufS0+cGFyYW0oICJleHAiICk7CglteSAkc2NvbmYgPSAk +c2VsZi0+e3Nlc3Npb259LT5wYXJhbSggInNjb25mIiApOwogICAgaWYoIGRlZmluZWQgJGV4cCAm +JiBkZWZpbmVkICRzY29uZiAmJiAkc2NvbmYgZXEgJGZvcm1pZCApCgl7CiAgICAgICAgJHNlYXJj +aC0+ZnJvbV9zdHJpbmcoICRleHAgKTsKICAJfQoKICAgIG15ICRmcmFnID0gJHNlbGYtPntzZXNz +aW9ufS0+bWFrZV9kb2NfZnJhZ21lbnQ7CiAgICBmb3JlYWNoIG15ICRzZiAoICRzZWFyY2gtPmdl +dF9ub25fZmlsdGVyX3NlYXJjaGZpZWxkcyApCiAgICB7CiAgICAgICAgbXkgJGxhYmVsOwogICAg +ICAgIG15ICRmaWVsZDsKICAgICAgICBpZiAoICRzZi0+eyJmaWVsZCJ9LT5nZXRfdHlwZSgpIGVx +ICJuYW1lZHNldCIgKQogICAgICAgIHsKICAgICAgICAgICAgIyB3ZSB3YW50IGEgbGVnZW5kIGFu +ZCBhIGxhYmVsCiAgICAgICAgICAgICRsYWJlbCA9ICRzZWxmLT57c2Vzc2lvbn0tPm1ha2VfZWxl +bWVudCggInNwYW4iLCBpZD0+JHNmLT5nZXRfZm9ybV9wcmVmaXguIl9sYWJlbCIgKTsKICAgICAg +ICAgICAgJGxhYmVsLT5hcHBlbmRDaGlsZCggJHNmLT5yZW5kZXJfbmFtZSApOwoKICAgICAgICAg +ICAgbXkgJGxlZ2VuZCA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRzZi0+cmVuZGVy +X25hbWUgKTsKICAgICAgICAgICAgJGZpZWxkID0gJHNmLT5yZW5kZXIoIGxlZ2VuZCA9PiAkbGVn +ZW5kICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkbGFiZWwgPSAkc2Vs +Zi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoICJzcGFuIiwgaWQ9PiRzZi0+Z2V0X2Zvcm1fcHJl +Zml4LiJfbGFiZWwiICk7CiAgICAgICAgICAgICRsYWJlbC0+YXBwZW5kQ2hpbGQoICRzZi0+cmVu +ZGVyX25hbWUgKTsKICAgICAgICAgICAgJGZpZWxkID0gJHNmLT5yZW5kZXIoKTsKICAgICAgICB9 +CgoJICAgICRmcmFnLT5hcHBlbmRDaGlsZCgKICAgICAgICAgICAgJHNlbGYtPntzZXNzaW9ufS0+ +cmVuZGVyX3Jvd193aXRoX2hlbHAoCiAgICAgICAgICAgICAgICBoZWxwX3ByZWZpeCA9PiAkc2Yt +PmdldF9mb3JtX3ByZWZpeC4iX2hlbHAiLAogICAgICAgICAgICAgICAgaGVscCA9PiAkc2YtPnJl +bmRlcl9oZWxwLAogICAgICAgICAgICAgICAgbGFiZWwgPT4gJGxhYmVsLAogICAgICAgICAgICAg +ICAgZmllbGQgPT4gJGZpZWxkLAogICAgICAgICAgICAgICAgbm9fdG9nZ2xlID0+ICggJHNmLT57 +c2hvd19oZWxwfSBlcSAiYWx3YXlzIiApLAogICAgICAgICAgICAgICAgbm9faGVscCA9PiAoICRz +Zi0+e3Nob3dfaGVscH0gZXEgIm5ldmVyIiApLAogICAgICAgICkgKTsKICAgIH0KCiAgICByZXR1 +cm4gJGZyYWc7Cn0KCnN1YiByZW5kZXJfY29udHJvbHMKewoJbXkoICRzZWxmLCAkd2l0aF9qcyAp +ID0gQF87CgogICAgbXkgJGRpdiA9ICRzZWxmLT57c2Vzc2lvbn0tPm1ha2VfZWxlbWVudCgKICAg +ICAgICAiZGl2IiAsCiAgICAgICAgY2xhc3MgPT4gImVwX3NlYXJjaF9idXR0b25zIiApOwogICAg +ICAgIAogICAgJGRpdi0+YXBwZW5kQ2hpbGQoICRzZWxmLT57c2Vzc2lvbn0tPnJlbmRlcl9hY3Rp +b25fYnV0dG9ucygKICAgICAgICBfb3JkZXIgPT4gWyAic2VhcmNoIiBdLAogICAgICAgICNuZXdz +ZWFyY2ggPT4gJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246 +YWN0aW9uX3Jlc2V0IiApLAogICAgICAgIHNlYXJjaCA9PiAkc2VsZi0+e3Nlc3Npb259LT5waHJh +c2UoICJsaWIvc2VhcmNoZXhwcmVzc2lvbjphY3Rpb25fc2VhcmNoIiApICkKICAgICk7CgkKCW15 +ICR4bWwgPSAkc2VsZi0+e3Nlc3Npb259LT54bWw7CgoJaWYoICR3aXRoX2pzICkKCXsKCQlteSAk +Y2xlYXJfZm9ybSA9ICRkaXYtPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NsZWFyZm9ybSgg +JHhtbCApICk7Cgl9CgogICAgbXkgJGNsZWFyX2J0biA9ICRkaXYtPmFwcGVuZENoaWxkKCAkeG1s +LT5jcmVhdGVfZWxlbWVudCggImJ1dHRvbiIsCiAgICAgICAgdHlwZSA9PiAiYnV0dG9uIiwKICAg +ICAgICBvbmNsaWNrID0+ICJjbGVhckZvcm0oKTsiLAogICAgICAgIGNsYXNzID0+ICJlcF9mb3Jt +X2FjdGlvbl9idXR0b24gY2xlYXJfYnV0dG9uIiwKICAgICkgKTsKICAgICRjbGVhcl9idG4tPmFw +cGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkc2VsZi0+e3Nlc3Npb259LT5waHJh +c2UoICJsaWIvc2VhcmNoZXhwcmVzc2lvbjphY3Rpb25fcmVzZXQiICkgKSApOwoJcmV0dXJuICRk +aXY7Cn0KCnN1YiByZW5kZXIKewoJbXkoICRzZWxmICkgPSBAXzsKCgkjIGlmIHVzZXJzIGFjY2Vz +cyBTY3JlZW46OlJlcG9ydCBkaXJlY3RseSB3ZSB3YW50IHRvIGRpc3BsYXkgc29tZSBzb3J0IG9m +IG1lbnUKCSMgd2hlcmUgdXNlcnMgY2FuIHNlbGVjdCB2aWV3YWJsZSByZXBvcnRzCglpZiggKCAi +RVByaW50czo6UGx1Z2luOjoiLiRzZWxmLT5nZXRfaWQgZXEgX19QQUNLQUdFX18gJiYgJHNlbGYt +Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBuZSAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29y +fS0+e2FjdGlvbn0gZXEgIm5ld3NlYXJjaCIgKQoJewkKCQlyZXR1cm4gJHNlbGYtPnJlbmRlcl9z +cGxhc2hfcGFnZTsKCX0KCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVu +ayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2Vs +Zi0+cmVuZGVyX2V4cG9ydF9iYXIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5k +ZXJfZ3JvdXBfb3B0aW9ucyApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9z +b3J0X29wdGlvbnMgKTsKCglpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2Vh +cmNoIiApCgl7CgkJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9yZWZpbmVfc2Vh +cmNoICk7Cgl9CgoJbXkgJGl0ZW1zID0gJHNlbGYtPml0ZW1zOwoJaWYoICFkZWZpbmVkICRpdGVt +cyB8fCAkaXRlbXMtPmNvdW50ID09IDAgKQoJewoJCSMgTm8gaXRlbXMgbWVzc2FnZQoJfQoKCW15 +ICRqc29uOwoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRncm91cGVkID0gJHNlbGYt +PmdldF9ncm91cGVkX2l0ZW1zKCAkaXRlbXMsIDEgKTsKCQkkanNvbiA9IGVuY29kZV9qc29uICRn +cm91cGVkOwoJfQoJZWxzZQoJewoJCW15ICRpdGVtX2lkcyA9IGRlZmluZWQgJGl0ZW1zID8gJGl0 +ZW1zLT5pZHMgOiBbXTsKCQkkanNvbiA9ICJbIi5qb2luKCcsJyxAJGl0ZW1faWRzKS4iXSI7Cgl9 +CgogICAgICAgIG15ICR1cmwgPSAkcmVwby0+Y3VycmVudF91cmwoIGhvc3QgPT4gMSApOwogICAg +ICAgIG15ICRwYXJhbWV0ZXJzID0gVVJJLT5uZXc7CiAgICAgICAgJHBhcmFtZXRlcnMtPnF1ZXJ5 +X2Zvcm0oCiAgICAgICAgICAgICAgICAkc2VsZi0+aGlkZGVuX2JpdHMsCiAgICAgICAgKTsKICAg +ICAgICAkcGFyYW1ldGVycyA9ICRwYXJhbWV0ZXJzLT5xdWVyeTsKCQkKCW15ICRkcyA9ICRyZXBv +LT5kYXRhc2V0KCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICkgKSBpZiBkZWZpbmVkICRzZWxm +LT5wYXJhbSggJ2RhdGFzZXRpZCcgKTsKCW15ICRwcmVmaXggPSAkZHMtPmJhc2VfaWQgaWYgZGVm +aW5lZCAkZHM7CgoJIyB0aGUgbWFpbiA8ZGl2PgoJbXkgJGNvbnRhaW5lcl9pZCA9IHNwcmludGYo +ICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIsICRzZWxmLT5nZXRfcmVwb3J0ICk7CgoJI3VwZGF0 +ZSBqYXZhc2NyaXB0IHBhcmFtZXRlcnMgaWYgY29taW5nIGZyb20gYSBzZWFyY2ggcmVxdWVzdAoJ +aWYoICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRw +bHVnaW4gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9OwoJCSRwbHVnaW4gPX4gcy86LyUz +QS9nOwoJCSRwYXJhbWV0ZXJzID0gInNjcmVlbj0kcGx1Z2luIjsKCQkkcHJlZml4ID0gJHNlbGYt +Pntwcm9jZXNzb3J9LT57ZGF0YXNldGlkfTsKCQkkY29udGFpbmVyX2lkID0gc3ByaW50ZiggImVw +X3JlcG9ydF8lc1xfY29udGFpbmVyIiwgJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0X3BsdWdp +bn0tPntyZXBvcnR9ICk7Cgl9CgkKCSNzaG93L2hpZGUgY29tcGxpYW5jZQoJbXkgJHNob3dfY29t +cGxpYW5jZSA9IDE7Cgkkc2hvd19jb21wbGlhbmNlID0gJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9 +IGlmIGRlZmluZWQgJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9OwoKCSNjdXN0b20gbGFiZWxzCglt +eSAkbGFiZWxzID0gMDsKCSRsYWJlbHMgPSBlbmNvZGVfanNvbiAkc2VsZi0+e2xhYmVsc30gaWYg +ZGVmaW5lZCAkc2VsZi0+e2xhYmVsc307CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPm1h +a2VfamF2YXNjcmlwdCggPDwiRU9KIiApICk7CmRvY3VtZW50Lm9ic2VydmUoImRvbTpsb2FkZWQi +LCBmdW5jdGlvbigpIHsKCW5ldyBFUHJpbnRzX1NjcmVlbl9SZXBvcnRfTG9hZGVyKCB7CgkJaWRz +OiAkanNvbiwKCQlzdGVwOiAyMCwKCQlwcmVmaXg6ICckcHJlZml4JywKCQl1cmw6ICckdXJsJywK +CQlwYXJhbWV0ZXJzOiAnJHBhcmFtZXRlcnMnLAkJCgkJY29udGFpbmVyX2lkOiAnJGNvbnRhaW5l +cl9pZCcsCgkJc2hvd19jb21wbGlhbmNlOiAkc2hvd19jb21wbGlhbmNlLAoJCWxhYmVsczogJGxh +YmVscwoJfSApLmV4ZWN1dGUoKTsKCn0pOwpFT0oKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBv +LT5tYWtlX2VsZW1lbnQoICdkaXYnLCBjbGFzcyA9PiAnZXBfcmVwb3J0X3BhZ2UnLCBpZCA9PiAk +Y29udGFpbmVyX2lkICkgKTsKCgkjc2hvdyBzZWFyY2ggY29udHJvbHMgYWZ0ZXIgdGhlIHJlc3Vs +dHMgdG9vCglpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCiAg +ICAgICAgewogICAgICAgICAgICAgICAgJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRl +cl9yZWZpbmVfc2VhcmNoICk7CiAgICAgICAgfQoKCXJldHVybiAkY2h1bms7Cn0KCgpzdWIgcmVu +ZGVyX2V4cG9ydF9iYXIKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5y +ZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglteSBA +cGx1Z2lucyA9ICRzZWxmLT5leHBvcnRfcGx1Z2luczsKCXJldHVybiAkY2h1bmsgdW5sZXNzKCBz +Y2FsYXIoIEBwbHVnaW5zICkgfHwgZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv +cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICkgKSApOwoKCW15ICRyZXBvcnRfZHMgPSAkcmVwby0+ +ZGF0YXNldCggJHNlbGYtPntkYXRhc2V0aWR9ICk7CglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJf +Zm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiApOwoKCWlmKCBkZWZp +bmVkICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nl +c3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRy +ZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJvY2Vzc29yfS0+ +e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCQkKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vz +c29yfS0+e3NvcnR9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlk +ZGVuX2ZpZWxkKCAic29ydCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApICk7Cgl9CQoK +CWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRmb3Jt +LT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0JCgogICAgbXkgJGV4cG9ydF9sYWJl +bCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsYWJlbCIsIGlkPT4iZXhwb3J0X3NlbGVjdF9sYWJl +bCIgKTsKICAgICRleHBvcnRfbGFiZWwtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2Uo +ICJleHBvcnRfc2VsZWN0X2xhYmVsIiApICk7CiAgICAkZm9ybS0+YXBwZW5kQ2hpbGQoICRleHBv +cnRfbGFiZWwgKTsKCglpZiggIWRlZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0 +X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApICkgKQoJewoJCSNubyBjdXN0b20gZXhwb3J0IGZpZWxk +cyBkZWZpbmVkLCB1c2UgZXhwb3J0IHBsdWdpbnMgZGVzaWduZWQgZm9yIHRoaXMgcmVwb3J0CgkJ +bXkgJHNlbGVjdCA9ICRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlz +dCgKCQkJbmFtZSA9PiAnZXhwb3J0JywKCQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5 +cGUgfSBAcGx1Z2luc10sCgkJCWxhYmVscyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRf +LT5nZXRfbmFtZSB9IEBwbHVnaW5zfSwKICAgICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieScgPT4g +ImV4cG9ydF9zZWxlY3RfbGFiZWwiLAoJCSkgKTsKCX0KCWVsc2UKCXsKCQkjcHJvdmlkZSBsaXN0 +IG9mIGRlZmF1bHQgZXhwb3J0IHBsdWdpbnMgZm9yIHJlcG9ydHMKCQlAcGx1Z2lucyA9ICRzZWxm +LT5leHBvcnRfcGx1Z2lucyggImdlbmVyaWMiICk7CgkJbXkgJHNlbGVjdCA9ICRmb3JtLT5hcHBl +bmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlzdCgKCQkJbmFtZSA9PiAnZXhwb3J0JywK +CQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgfSBAcGx1Z2luc10sCgkJCWxhYmVs +cyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRfLT5nZXRfbmFtZSB9IEBwbHVnaW5zfSwK +ICAgICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieScgPT4gImV4cG9ydF9zZWxlY3RfbGFiZWwiLAoJ +CSkgKTsKCgkJI2NyZWF0ZSBsYWJlbHMgYW5kIHBhbmVscyBmb3IgdGFiYmVkIGludGVyZmFjZWQK +CQlteSAkeG1sID0gJHJlcG8tPnhtbDsKCQlteSAkeGh0bWwgPSAkcmVwby0+eGh0bWw7CgoJCW15 +ICRzZWxlY3RfYWxsID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX3NlbGVjdGFs +bCggJHhtbCApICk7CgkJbXkgJHNlbGVjdF9idG4gPSAkZm9ybS0+YXBwZW5kQ2hpbGQoICR4bWwt +PmNyZWF0ZV9lbGVtZW50KCAiYnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAi +YnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAgb25jbGljayA9PiAidG9nZ2xlQ2hlY2tib3hl +cygpOyIsCgkgICAgICAgICAgICAgICAgICAgIGNsYXNzID0+ICJlcF9mb3JtX2FjdGlvbl9idXR0 +b24gc2VsZWN0X2J1dHRvbiIsCgkJKSApOwoJICAgICRzZWxlY3RfYnRuLT5hcHBlbmRDaGlsZCgg +JHhtbC0+Y3JlYXRlX3RleHRfbm9kZSggJHJlcG8tPnBocmFzZSggInJlcG9ydF9zZWxlY3QiICkg +KSApOwoKCQkjYWxsb3cgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRzIHRoZXkgd2FudCB0byBl +eHBvcnQKCQlteSAkZXhwb3J0X29wdGlvbnMgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2IiAp +OwoKCQlteSBAa2V5czsKCQlpZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9y +dF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApICkKCQl7CgkJCUBrZXlzID0gQHskcmVwby0+ +Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApfTsKCQl9 +CgkJZWxzZQoJCXsKCQkJQGtleXMgPSBrZXlzICV7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv +cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICl9OyAKCQl9CgkJZm9yZWFjaCBteSAka2V5ICggQGtl +eXMgKQoJCXsKCQkJI2NyZWF0ZSBhIG5ldyBsaXN0CQkJCgkJCW15ICR1bCA9ICRyZXBvLT5tYWtl +X2VsZW1lbnQoICJ1bCIsCgkgICAgICAgICAgICAgICAgCXN0eWxlID0+ICJsaXN0LXN0eWxlLXR5 +cGU6IG5vbmUiCgkgICAgICAgIAkpOwoJCQkKCQkJbXkgJGNvdW50ID0gMDsgI2NvdW50IGhvdyBt +YW55IGZpZWxkcyB3ZSBhZGQKCQkJZm9yZWFjaCBteSAkZmllbGRuYW1lKCBAeyRyZXBvLT5jb25m +aWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApLT57JGtleX19ICkKCQkJ +ewoJCQkJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJj +dXN0b21fZXhwb3J0IiApICYmIGV4aXN0cyAkeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0 +X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKX17JGZpZWxkbmFtZX0gKSAjd2UgaGF2ZSBhIGN1c3Rv +bSBleHBvcnQgZnVuY3Rpb24gaW5zdGVhZCAKCQkJCXsKCQkJCQkkY291bnQrKzsKCQkJCQkkc2Vs +Zi0+X2V4cG9ydF9maWVsZF9jaGVja2JveCggJHJlcG8sICRmaWVsZG5hbWUsICR1bCwgJHJlcG8t +Pmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRvcHRpb25zOiRmaWVsZG5hbWUiICkgKTsgCgkJCQl9 +CgkJCQllbHNpZiggZGVmaW5lZCBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdfc3Ry +aW5nKCAkcmVwb3J0X2RzLCAkZmllbGRuYW1lICkgKQoJCQkJewoJCQkJCW15ICRmaWVsZCA9IEVQ +cmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRyZXBvcnRfZHMsICRmaWVs +ZG5hbWUgKTsKCQkJCQkkY291bnQrKzsKICAgICAgIAkJCSAgICAgICAgCSRzZWxmLT5fZXhwb3J0 +X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAkZmllbGQtPnJlbmRlcl9u +YW1lICk7CgoJCQkJfQoJCQl9CgkJCWlmKCAkY291bnQgKSAjb25seSBhZGQgb3B0aW9ucyBpZiB3 +ZSBoYXZlIGFueSBmaWVsZHMgdG8gc2hvdwoJCQl7CgkJCQlteSAkZGl2ID0gJHJlcG8tPm1ha2Vf +ZWxlbWVudCggImRpdiIsIGNsYXNzPT4icmVwb3J0X2V4cG9ydF9vcHRpb25zIiApOwoJCQkJJGRp +di0+YXBwZW5kQ2hpbGQoIG15ICRoID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIGNsYXNz +PT4iY3VzdG9tX2V4cG9ydF9oZWFkZXIiICkgKTsKCQkJCSRoLT5hcHBlbmRDaGlsZCggJHJlcG8t +Pmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRzOiRrZXkiICkgKTsJCgkJCQkkZGl2LT5hcHBlbmRD +aGlsZCggJHVsICk7CgkJCQkkZXhwb3J0X29wdGlvbnMtPmFwcGVuZENoaWxkKCAkZGl2ICk7CgkJ +CX0KICAgICAgIAkJfQoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJGV4cG9ydF9vcHRpb25zICk7Cgl9 +CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAKCQkkcmVwby0+cmVuZGVyX2J1dHRvbigKCQkJbmFtZSA9 +PiAiX2FjdGlvbl9leHBvcnQiLAoJCQljbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIiwK +CQkJdmFsdWUgPT4gJHJlcG8tPnBocmFzZSggJ2NnaS91c2Vycy9lZGl0X2VwcmludDpleHBvcnQn +ICkKCSkgKTsKCgkjY3JlYXRlIGEgY29sbGFwc2libGUgYm94CglteSAkaW1hZ2VzdXJsID0gJHJl +cG8tPmN1cnJlbnRfdXJsKCBwYXRoID0+ICJzdGF0aWMiLCAic3R5bGUvaW1hZ2VzIiApOwoJbXkg +JW9wdGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9ufSA9ICRyZXBvOwogICAgICAgICRvcHRpb25ze2lk +fSA9ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAgICAgICAkb3B0aW9uc3t0aXRsZX0gPSAkcmVwby0+ +aHRtbF9waHJhc2UoICJleHBvcnRfdGl0bGUiICk7CiAgICAgICAgJG9wdGlvbnN7Y29sbGFwc2Vk +fSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9ICRmb3JtOwogICAgICAgICRvcHRpb25ze3Nob3df +aWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVsdGlfZG93bi5wbmciOwoJJG9wdGlvbnN7aGlkZV9p +Y29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0aV91cC5wbmciOwoKCW15ICRib3ggPSAkcmVwby0+ +bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9PiJ0ZXh0LWFsaWduOiBsZWZ0IiApOwoJJGJveC0+ +YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6cmVuZGVyKCAlb3B0aW9ucyApICk7CgkkY2h1bmst +PmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9zb3J0 +X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0 +b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglyZXR1cm4gJGNo +dW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntzb3J0X2NvbmZ9LCAi +c29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBvLT5jb25maWcoICRzZWxm +LT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9y +bSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gInNv +cnRfcmVwb3J0IiApOwogICAgICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0 +IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCQoJaWYoIGRlZmluZWQgJHJlcG8t +PnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNl +YXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmll +bGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+c2VyaWFsaXNlKSAp +OwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJ +CSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIs +ICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUg +bGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkc29y +dF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJHNvcnRfbmFt +ZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAgICAgICAgewoJCW15ICRzb3J0X3ZhbHVlID0gJHNv +cnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVu +ZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAkc29ydF92YWx1ZSkg +KTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg +IAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9W +aWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVm +aW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntz +b3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxl +bWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo +cmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJ +JHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJCWVsc2UKCQl7CgkJCW15 +ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpzb3J0X3JlcG9ydCgiJy4k +c29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo +cmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJ +JHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAg +ICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNl +KCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5rcz0+JHNvcnRfbGlua3MgKSApOwoJcmV0dXJuICRj +aHVuazsKfQoKc3ViIHJlbmRlcl9ncm91cF9vcHRpb25zCnsKCW15KCAkc2VsZiApID0gQF87CgoJ +bXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9k +b2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmluZWQoICRyZXBvLT5jb25m +aWcoICRzZWxmLT57Z3JvdXBfY29uZn0sICJncm91cGZpZWxkcyIgKSApICk7CgoJbXkgJGdyb3Vw +X2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMi ICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRm -b3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gInNvcnRfcmVwb3J0IiApOwogICAgICAgICRmb3Jt -LT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCgg -JGZvcm0gKTsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxm -LT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRD -aGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9j -ZXNzb3J9LT57c2VhcmNofS0+c2VyaWFsaXNlKSApOwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57 -cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8t -PnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91 -cF9leHB9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhl -IGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkc29ydF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19m -cmFnbWVudDsKCWZvcmVhY2ggbXkgJHNvcnRfbmFtZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAg -ICAgICAgewoJCW15ICRzb3J0X3ZhbHVlID0gJHNvcnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlm -KCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRl -bl9maWVsZCggInNvcnQiLCAkc29ydF92YWx1ZSkgKTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAg -ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQo +b3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gImdyb3VwX3JlcG9ydCIgKTsKICAgICAgICAkZm9y +bS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQo +ICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5k +Q2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJv +Y2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZiggZGVmaW5lZCAkc2VsZi0+ +e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVu +ZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSAp +OwoJfQoKCSNkaXNwbGF5IHRoZSBsaW5rcyB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgZm9ybQoJbXkg +JGZpcnN0ID0gMTsKCW15ICRncm91cF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsK +CWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICggQHskZ3JvdXBfY29uZn0gKQogICAgICAgIHsKCQlt +eSAoJGdyb3VwX2ZpZWxkKSA9IHNwbGl0KC87LywgJGdyb3VwX3ZhbHVlICk7CgkJaWYoICRmaXJz +dCApCgkJewoJCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxk +KCAiZ3JvdXAiLCAkZ3JvdXBfdmFsdWUpICk7CgkJfQoKCQlpZiggISRmaXJzdCApCiAgICAgICAg +ICAgICAgICB7CiAgICAgICAgICAgICAgICAJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJl +cG8tPmh0bWxfcGhyYXNlKCAiVXBkYXRlL1ZpZXdzOmdyb3VwX3NlcGVyYXRvciIgKSApOwogICAg +ICAgICAgICAgICAgfQoJCQoJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3Vw +fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gZXEgJGdyb3VwX2ZpZWxkICkKCQl7CgkJ +CW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic3Ryb25nIiApOwoJCQkkc3Ryb25n +LT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAkc2VsZi0+e2dyb3VwX2NvbmZ9IC4g +Ijpncm91cDoiIC4gJGdyb3VwX2ZpZWxkICkgKTsKCQkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGls +ZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJf +bGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVwb3J0KCInLiRncm91cF92YWx1ZS4nIiknICk7CQoJ +CQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9j +b25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBw +ZW5kQ2hpbGQoICRsaW5rICk7CgkJfQoJCSRmaXJzdCA9IDA7CiAgICAgICAgfSAgICAgICAgICAg +CgkKCSNubyBncm91cGluZyBsaW5rIGF0IHRoZSBlbmQKCSRncm91cF9saW5rcy0+YXBwZW5kQ2hp +bGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkg +KTsKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3By +b2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9s +aW5rKCAnamF2YXNjcmlwdDpncm91cF9yZXBvcnQoIiIpJyApOwkKCQkkbGluay0+YXBwZW5kQ2hp +bGQoICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydDpub19ncm91cGluZyIgKSApOwoJCSRncm91 +cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7Cgl9CgllbHNlCgl7CgkJbXkgJHN0cm9uZyA9 +ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7CiAJCSRzdHJvbmctPmFwcGVuZENoaWxk +KCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBf +bGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7Cgl9CgkKCSRjaHVuay0+YXBwZW5kQ2hpbGQo +ICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpncm91cF9saW5rcyIsIGxpbmtzPT4kZ3JvdXBf +bGlua3MgKSApOwoKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfcmVmaW5lX3NlYXJjaAp7 +CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkg +JGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoJCglpZiggZGVmaW5lZCAkcmVwby0+ +cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2Vh +cmNoIiApCgl7CgkJbXkgJGVzY2V4cCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNl +cmlhbGlzZTsKCQlteSAkY2FjaGVpZCA9ICRyZXBvLT5wYXJhbSggImNhY2hlIiApOwoJCW15ICRz +Y29uZiA9ICRzZWxmLT57c2NvbmZ9OwkKCgkJI3NldCB1cCBuZXcgc2VhcmNoIGxpbmsKCQlteSAk +bmV3X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAg +ICAgIAkkbmV3X2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgICAgICAgICAgc2NyZWVuID0+ +ICJSZXBvcnQiLAoJCQlzY29uZiA9PiAkc2NvbmYsCiAgICAgICAgCSk7CgoJCW15ICRzZWFyY2hf +bGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgkJbXkgJG5ld19saW5rID0gJHJlcG8t +PnJlbmRlcl9saW5rKCAiJG5ld19iYXNldXJsJl9hY3Rpb25fbmV3c2VhcmNoPTEiICk7CgkgICAJ +JG5ld19saW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4 +cHJlc3Npb246bmV3IiApICk7CgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQoICRuZXdfbGlu +ayApOwoKCQkjYWRkIGEgc2VwYXJhdG9yLi4uCgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQo ICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsK -ICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntz -b3J0fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJ -CQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9u -Zy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4g -Ijpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAk -c3Ryb25nICk7CgkJfQoJCWVsc2UKCQl7CgkJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5r -KCAnamF2YXNjcmlwdDpzb3J0X3JlcG9ydCgiJy4kc29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGlu -ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4g -Ijpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAk -bGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5h -cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5r -cz0+JHNvcnRfbGlua3MgKSApOwoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9ncm91cF9v -cHRpb25zCnsKCW15KCAkc2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9y -eTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVu -ayB1bmxlc3MoIGRlZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57Z3JvdXBfY29uZn0sICJn -cm91cGZpZWxkcyIgKSApICk7CgoJbXkgJGdyb3VwX2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2Vs -Zi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAk -Zm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4g -Imdyb3VwX3JlcG9ydCIgKTsKICAgICAgICAkZm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4g -ImdldCIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRy -ZXBvLT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVx -ICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVu -X2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlz -ZSkgKTsKCX0KCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJ -JGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAg -JHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQoKCSNkaXNwbGF5IHRoZSBsaW5rcyB0 -aGF0IHdpbGwgdHJpZ2dlciB0aGUgZm9ybQoJbXkgJGZpcnN0ID0gMTsKCW15ICRncm91cF9saW5r -cyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICgg -QHskZ3JvdXBfY29uZn0gKQogICAgICAgIHsKCQlteSAoJGdyb3VwX2ZpZWxkKSA9IHNwbGl0KC87 -LywgJGdyb3VwX3ZhbHVlICk7CgkJaWYoICRmaXJzdCApCgkJewoJCQkkZm9ybS0+YXBwZW5kQ2hp -bGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAkZ3JvdXBfdmFsdWUpICk7 -CgkJfQoKCQlpZiggISRmaXJzdCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJ -JGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiVXBkYXRlL1Zp -ZXdzOmdyb3VwX3NlcGVyYXRvciIgKSApOwogICAgICAgICAgICAgICAgfQoJCQoJCWlmKCBkZWZp -bmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn -cm91cH0gZXEgJGdyb3VwX2ZpZWxkICkKCQl7CgkJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9l -bGVtZW50KCAic3Ryb25nIiApOwoJCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxf -cGhyYXNlKCAkc2VsZi0+e2dyb3VwX2NvbmZ9IC4gIjpncm91cDoiIC4gJGdyb3VwX2ZpZWxkICkg -KTsKCQkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJ -ewoJCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVw -b3J0KCInLiRncm91cF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBv -LT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9m -aWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7CgkJfQoJCSRm -aXJzdCA9IDA7CiAgICAgICAgfSAgICAgICAgICAgCgkKCSNubyBncm91cGluZyBsaW5rIGF0IHRo -ZSBlbmQKCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVw -ZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJv -Y2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJ -ewoJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpncm91cF9yZXBv -cnQoIiIpJyApOwkKCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggInJl -cG9ydDpub19ncm91cGluZyIgKSApOwoJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5r -ICk7Cgl9CgllbHNlCgl7CgkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJv -bmciICk7CiAJCSRzdHJvbmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBv -cnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25n -ICk7Cgl9CgkKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9y -dDpncm91cF9saW5rcyIsIGxpbmtzPT4kZ3JvdXBfbGlua3MgKSApOwoKCXJldHVybiAkY2h1bms7 -Cn0KCnN1YiByZW5kZXJfcmVmaW5lX3NlYXJjaAp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRy -ZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2Zy -YWdtZW50OwoJCglpZiggZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYt -Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJbXkgJGVzY2V4cCA9ICRz -ZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZTsKCQlteSAkY2FjaGVpZCA9ICRy -ZXBvLT5wYXJhbSggImNhY2hlIiApOwoJCW15ICRzY29uZiA9ICRzZWxmLT57c2NvbmZ9OwkKCgkJ -I3NldCB1cCBuZXcgc2VhcmNoIGxpbmsKCQlteSAkbmV3X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNl -bGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAgICAgIAkkbmV3X2Jhc2V1cmwtPnF1ZXJ5X2Zv -cm0oCgkgICAgICAgICAgICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAoJCQlzY29uZiA9PiAkc2Nv -bmYsCiAgICAgICAgCSk7CgoJCW15ICRzZWFyY2hfbGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJh -Z21lbnQ7CgkJbXkgJG5ld19saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJG5ld19iYXNldXJs -Jl9hY3Rpb25fbmV3c2VhcmNoPTEiICk7CgkgICAJJG5ld19saW5rLT5hcHBlbmRDaGlsZCggJHJl -cG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246bmV3IiApICk7CgkJJHNlYXJj -aF9saW5rcy0+YXBwZW5kQ2hpbGQoICRuZXdfbGluayApOwoKCQkjYWRkIGEgc2VwYXJhdG9yLi4u -CgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0 -ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKCgkJI3NldCB1cCByZWZpbmUgc2VhcmNoIGxp -bmsKCQlteSAkcmVmaW5lX2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0 -X3VyaSApOwogICAgICAgIAkkcmVmaW5lX2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgIAlj -YWNoZSA9PiAkY2FjaGVpZCwKCSAgICAgICAgICAgICAgICBleHAgPT4gJGVzY2V4cCwKICAgICAg -ICAJICAgICAgICBzY3JlZW4gPT4gIlJlcG9ydCIsCiAgICAgICAgICAgICAgICAJZGF0YXNldCA9 -PiAkc2VsZi0+e2RhdGFzZXRpZH0sCiAgICAgICAgICAgICAgICAJb3JkZXIgPT4gJHNlbGYtPntw -cm9jZXNzb3J9LT57c2VhcmNofS0+e2N1c3RvbV9vcmRlcn0sCgkJCXNjb25mID0+ICRzY29uZiwK -ICAgICAgICAJKTsKCgkJbXkgJHJlZmluZV9saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJHJl -ZmluZV9iYXNldXJsJl9hY3Rpb25fdXBkYXRlPTEiICk7CiAgICAgIAkJJHJlZmluZV9saW5rLT5h -cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246cmVm -aW5lIiApICk7ICAgCSAgICAgICAgIAoJICAgICAgICAkc2VhcmNoX2xpbmtzLT5hcHBlbmRDaGls -ZCggJHJlZmluZV9saW5rICk7CgoJCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo -cmFzZSggIlJlcG9ydDpzZWFyY2hfbGlua3MiLCBsaW5rcz0+JHNlYXJjaF9saW5rcyApICk7Cgl9 -CgoJcmV0dXJuICRjaHVuazsKfQoKCiNhZGRzIGEgbmV3IGNoZWNrYm94IHRvIGFsbG93IHRoZSB1 -c2VyIHRvIGNob29zZSB3aGljaCBmaWVsZHMgdG8gZXhwb3J0CnN1YiBfZXhwb3J0X2ZpZWxkX2No -ZWNrYm94CnsKCW15KCAkc2VsZiwgJHJlcG8sICRmaWVsZG5hbWUsICR1bCwgJGZpZWxkbGFiZWwg -KSA9IEBfOwoKCW15ICRsaSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsaSIgKTsKCSR1bC0+YXBw -ZW5kQ2hpbGQoICRsaSApOwoKICAgICAgICBteSAkY2hlY2tib3ggPSAkcmVwby0+bWFrZV9lbGVt -ZW50KCAiaW5wdXQiLCB0eXBlID0+ICJjaGVja2JveCIsIGlkID0+ICRmaWVsZG5hbWUsIG5hbWUg -PT4gJGZpZWxkbmFtZSwgdmFsdWUgPT4gJGZpZWxkbmFtZSApOwoJaWYoIGRlZmluZWQgJHJlcG8t -PmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKSAp -Cgl7CgkJaWYoICggZ3JlcCB7ICRmaWVsZG5hbWUgZXEgJF8gfSBAeyRyZXBvLT5jb25maWcoICRz -ZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfZGVmYXVsdHMiICl9ICkgfHwgKCBzY2Fs -YXIoIEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9k -ZWZhdWx0cyIgKX0gKSA9PSAwICkgKQoJCXsKCQkJI29ubHkgY2hlY2sgZGVmYXVsdHMgb3IgY2hl -Y2sgZXZlcnl0aGluZyBpZiBkZWZhdWx0cyBub3QgZGVmaW5lZAoJCQkkY2hlY2tib3gtPnNldEF0 -dHJpYnV0ZSggImNoZWNrZWQiLCAieWVzIiApOwoJCX0KCX0KCW15ICRsYWJlbCA9ICRyZXBvLT5t -YWtlX2VsZW1lbnQoICJsYWJlbCIsIGZvciA9PiAkZmllbGRuYW1lICk7CgkkbGFiZWwtPmFwcGVu -ZENoaWxkKCAkZmllbGRsYWJlbCApOwoKCSRsaS0+YXBwZW5kQ2hpbGQoICRjaGVja2JveCApOwoJ -JGxpLT5hcHBlbmRDaGlsZCggJGxhYmVsICk7Cn0KCiMjIyB1dGlsaXR5IG1ldGhvZHMKCiMgVE9E -TyBzaG91bGQgdXNlICJKU09OIiBwYWNrYWdlCnN1YiB0b19qc29uCnsKICAgICAgICBteSggJHNl -bGYsICRvYmplY3QgKSA9IEBfOwoKCXJldHVybiAiIiBpZiggIWRlZmluZWQgJG9iamVjdCApOwoK -IyBVVEYtOCBpc3N1ZXM6CiMJcmV0dXJuIEpTT04tPm5ldy0+dXRmOCgxKS0+ZW5jb2RlKCAkb2Jq -ZWN0ICk7CgogICAgICAgIGlmKCByZWYoICRvYmplY3QgKSBlcSAnSEFTSCcgKQogICAgICAgIHsK -ICAgICAgICAgICAgICAgIG15IEBzdHVmZjsKICAgICAgICAgICAgICAgIHdoaWxlKCBteSggJGss -ICR2ICkgPSBlYWNoKCAlJG9iamVjdCApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg -ICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICR2ICkgKTsgICAg -ICAgIyBvciAnbnVsbCcgPwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVmZiwgRVBy -aW50czo6VXRpbHM6OmpzX3N0cmluZyggJGsgKS4nOicuJHNlbGYtPnRvX2pzb24oICR2ICkKICAg -ICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCAiLCIsIEBz -dHVmZiApIC4gJ30nOwogICAgICAgIH0KICAgICAgICBlbHNpZiggcmVmKCAkb2JqZWN0ICkgZXEg -J0FSUkFZJyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQHN0dWZmOwogICAgICAgICAg -ICAgICAgZm9yZWFjaCggQCRvYmplY3QgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAg -ICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6VXRpbHM6OmlzX3NldCggJF8gKSApOwogICAg -ICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVmZiwgJHNlbGYtPnRvX2pzb24oICRfICk7CiAg -ICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbiggIiwiLCBA -c3R1ZmYgKSAuICddJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBFUHJpbnRzOjpVdGlsczo6 -anNfc3RyaW5nKCAkb2JqZWN0ICk7Cn0KCnN1YiBleHBvcnRfcGx1Z2lucwp7CiAgICAgICAgbXko -ICRzZWxmLCAkZ2VuZXJpYyApID0gQF87CgoJbXkgQHBsdWdpbl9pZHM7CgkKCW15ICRyZXBvID0g -JHNlbGYtPnJlcG9zaXRvcnk7CgoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntl -eHBvcnRfY29uZn0sICJleHBvcnRfcGx1Z2lucyIgKSApCgl7CgkJQHBsdWdpbl9pZHMgPSBAeyRy -ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICl9OwoJ -fQkKCWVsc2lmKCAkZ2VuZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0gJHJlcG8tPnBsdWdpbl9s -aXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkgICAgICAgICAgICAgICAg -Y2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkgICAgICAgIGlzX3Zpc2li -bGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwoJfQoJZWxz -ZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRyZXBvLT5wbHVnaW5fbGlzdCgKICAgICAgICAg -ICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAgICAgICAgICAgIGNhbl9hY2NlcHQgPT4g -InJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUg -PT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwogICAgICAgIH0K -CW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewog -ICAgICAgICAgICAgICAgbXkgJHAgPSAkcmVwby0+cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAg -ICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVy -biBAcGx1Z2luczsKfQoKc3ViIHJlcG9ydF9wbHVnaW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJ -IyBzZjIgLSBjYW4ndCBsaXN0IHZpYSB0eXBlID0+ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAg -ICBteSBAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAg -ICAgICAgICAgIHR5cGUgPT4gIlNjcmVlbiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdp -bnM7Cglmb3JlYWNoIG15ICRpZCAoIEBwbHVnaW5faWRzICkKICAgICAgICB7CgkJbmV4dCBpZigg -JGlkICF+IC9eU2NyZWVuOjpSZXBvcnQ6Oi8gKTsJIyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91 -dCAkc2VsZiAoYWthIFNjcmVlbjo6UmVwb3J0KQoKICAgICAgICAgICAgICAgIG15ICRwID0gJHNl -bGYtPnJlcG9zaXRvcnktPnBsdWdpbiggIiRpZCIgKTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8 -fCAhJHAtPmNhbl9iZV92aWV3ZWQgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAk -cDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNo -IG9mIHZhbHVlcyBtYXBwZWQgdG8gYSBsYWJlbCBhbmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBz -ZXQgdGhlIGxpc3Qgb2YgaXRlbXMgYXJlIGp1c3QgcmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVz -ZWQgYnkgcmVwb3J0IEpTKQpzdWIgZ2V0X2dyb3VwZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRl -bXMsICRpZHNfb25seSApID0gQF87CglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07Cglt -eSAlZ3JvdXBlZDsKCglteSAkZ3JvdXBpbmcgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07 -CgoJbXkgJG1ldGFmaWVsZCA9ICRpdGVtcy0+Z2V0X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcg -KTsKCgkjc2V0IGdyb3VwX29wdHMgaWYgYXBwcm9wcmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57 -cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9ICkKCXsKCQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAi -ZGF0ZSIgKQoJCXsKCQkJJG1ldGFmaWVsZC0+e3JlbmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNz -b3J9LT57Z3JvdXBfb3B0c30tPntyZXN9IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntn -cm91cF9vcHRzfS0+e3Jlc307CgkJfQoJfQoKCSNjcmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVl -cyB0byBpdGVtcyAob3IgaXRlbSBpZHMpCgkkaXRlbXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXko -ICRzZXNzaW9uLCAkZGF0YXNldCwgJGl0ZW0gKSA9IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRt -ZXRhZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRpcGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7 -CgkJaWYoICRtdWx0aXBsZSApCiAgICAgICAgICAgICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBA -eyRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICl9OwoJCX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBf -dmFsdWVzID0gKCRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIg -QGdyb3VwX3ZhbHVlcyA+IDAgKQoJCXsKCQkJZm9yZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3Jv -dXBfdmFsdWVzICkKCQkJewoJCQkJbXkgJGdyb3VwX2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zy -b21fdmFsdWUoICRzZXNzaW9uLCAkZ3JvdXBfdmFsdWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBp -ZiBhcHByb3ByaWF0ZQoJCQkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBf -b3B0c30gKQoJCQkJewoJCQkJCSRncm91cF9pZCA9ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAs -ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3Rz -ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkg -ICAgICAgIAlpZiggZXhpc3RzICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBz -ZXQgdGhpcyBsaXN0IHVwLCBwdXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAg -ICAgICAgICAJewoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBp -ZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBl -ZHskZ3JvdXBfaWR9fSwgJGl0ZW0tPmlkOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlw -dXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAg -ICAgfQogICAgICAgIAkgICAgICAJCWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAK -CSAgICAgICAgCSAgICAgICAJewoJCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRz -X29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xl -IGl0ZW0KCQkgICAgICAgICAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJICAgICAgICAgICAg -ICAgICAgICAgICAgQGdyb3VwZWRfaXRlbXMgPSAoJGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAg -IAkJICAgICAgICB9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgZWxzZQogICAgICAgIAkgICAg -ICAgICAgICAgICAgCXsKCSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEBncm91cGVk -X2l0ZW1zID0gKCRpdGVtKTsKICAgICAgICAJCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAg -ICAgICAgCSAgICAgICAgJGdyb3VwZWR7JGdyb3VwX2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJ -CQl9CiAgICAgICAgICAgICAgIAkJfQoJCX0KCQllbHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAi -VW5zcGVjaWZpZWQgIiAuICRtZXRhZmllbGQtPm5hbWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdy -b3VwZWR7JGdyb3VwX2lkfSApICN3ZSd2ZSBhbHJlYWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2gg -YSBuZXcgaXRlbSBvbiB0byB0aGUgbGlzdAoJCSAgCXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29t -ZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsK -CQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVs -c2UKCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJ -ICAgICAgIAkJfQogICAgICAgIAkgICAgICAJZWxzZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBn -cm91cAoJICAgICAgICAJewoJCQkJbXkgQGdyb3VwZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5 -ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVt -CgkJICAgICAgICAgICAgICAgIHsJCiAgICAgICAgCQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVt -LT5pZCk7CiAgICAgICAgICAgICAgICAJCX0KCSAgICAgICAgICAgICAgICAJZWxzZQogICAgICAg -IAkgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3Jv -dXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCSAgICAgICAgICAgICAgIAl9CgkgICAgICAg -ICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJ -CQl9CgkJfQogICAgICAgCX0gKTsKCgkjbm93IHNvcnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFu -IHJlYWRhYmxlIGxhYmVscwoJbXkgQHNvcnRlZF9ncm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsK -CSRyZXZlcnNlID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29y -ZGVyfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNl -X29yZGVyfTsKCWlmKCAkbWV0YWZpZWxkLT50eXBlIGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAk -dGFncywgJGxhYmVscyApID0gJG1ldGFmaWVsZC0+dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiAp -OwoJCSNjb252ZXJ0IHRhZ3MgdG8gYSBoYXNoIG9mIHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9y -IG9yZGVyaW5nKQoJCW15ICVwcmlvcml0eTsKCQlteSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkg -JHRhZyAoQHskdGFnc30gKQoJCXsKCQkJJHByaW9yaXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5k -ZXgrKzsKCQl9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJp -b3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91 -cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57 -JGtleX0gKTsKCQl9Cgl9CgllbHNpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJ -ewkJCgkJbXkgJGRzID0gJHNlc3Npb24tPmRhdGFzZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1 -ZXMgPSBrZXlzICVncm91cGVkOwoJCW15ICRzb3J0ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVl -cyggJHNlc3Npb24sIFxAdmFsdWVzICk7CgkJbXkgJXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7 -CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICR2YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAg -ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGlu -ZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXgrKzsKICAgICAgICAgICAgICAgIH0K -CQlmb3JlYWNoIG15ICRrZXkgKHNvcnQgeyRwcmlvcml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19 -IGtleXMgJWdyb3VwZWQpCiAgICAgICAgICAgICAgICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRh -b2JqKCAka2V5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMs -ICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGls -czo6dHJlZV90b191dGY4KCAkc3Viai0+cmVuZGVyX2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVk -ICRzdWJqOwogICAgICAgICAgICAgICAgfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEg -ImRhdGUiICkKCXsKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29y -dCB7JGIgPD0+ICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3Vw -cywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJ -fQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtl -eXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2Vf -Z3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJ -ewkKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21w -ICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYt -Pl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQll -bHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJ -CQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBl -ZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoKCSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVk -IGdyb3VwcwoJbXkgJGdyb3VwX2lkID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1l -OwoJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3Jv -dXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3Jv -dXBfaWQgKTsKCX0KCglyZXR1cm4gXEBzb3J0ZWRfZ3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91 -cGVkX2l0ZW0KewoJbXkoICRzZWxmLCAkbGlzdCwgJGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsK -CSRncm91cHtsaXN0fSA9ICRsaXN0OwoJJGdyb3Vwe2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBc -JWdyb3VwOwp9CgpzdWIgcmVuZGVyX3NlbGVjdGFsbAp7CglteSggJHNlbGYsICR4bWwgKSA9IEBf -OwoKCW15ICR0b2dnbGVfZnVuY3Rpb24gPSAnCgkJdmFyIGlzQ2hlY2tlZCA9IHRydWU7CgkJZnVu -Y3Rpb24gdG9nZ2xlQ2hlY2tib3hlcygpIHsKCSAgICAgICAgCXZhciBleHBvcnRfb3B0aW9ucyA9 -IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInJlcG9ydF9leHBvcnRfb3B0aW9ucyIp -OwoJCQlmb3IoIGV4cG9ydF9vcHRpb24gb2YgZXhwb3J0X29wdGlvbnMgKQoJCQl7CgkJCQl2YXIg -Y2hlY2tib3hlcyA9IGV4cG9ydF9vcHRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIg -KQoJCQkJZm9yKCBjaGVja2JveCBvZiBjaGVja2JveGVzICkKCQkJCXsKCQkJCQlpZihpc0NoZWNr -ZWQpCgkJCQkJewoJICAgICAgICAgICAgICAgIAkJCWNoZWNrYm94LmNoZWNrZWQgPSAiIjsKCQkg -IAkgICAgICAgIAl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCSAgICAgICAgICAgICAgICBjaGVja2Jv -eC5jaGVja2VkID0gImNoZWNrZWQiOwoJCQkJCX0KCSAgICAgICAgIAkJfQoJCQl9CgkJCWlzQ2hl -Y2tlZCA9ICFpc0NoZWNrZWQ7CgkJfSc7CgkKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxl -bWVudCggInNjcmlwdCIgKTsKCSRqc190YWctPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4 -dF9ub2RlKCAkdG9nZ2xlX2Z1bmN0aW9uICkgKTsKCXJldHVybiAkanNfdGFnOwp9CgpzdWIgcmVu -ZGVyX2NsZWFyZm9ybQp7CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICRjbGVhcl9mdW5j -dGlvbiA9ICcKCQlmdW5jdGlvbiBjbGVhckZvcm0oKXsKCQkJdmFyIHJlcG9ydCA9IGRvY3VtZW50 -LmdldEVsZW1lbnRCeUlkKCAiY3VzdG9tX3JlcG9ydCIgKTsKCQkJdmFyIGZvcm0gPSByZXBvcnQu -Z2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic2VsZWN0ZWRfZm9ybSIpWzBdOwoJCQl2YXIgaW5wdXRz -ID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApOwoJCQlmb3IoIGlucHV0IG9m -IGlucHV0cyApCgkJCXsKCQkJCWZpZWxkX3R5cGUgPSBpbnB1dC50eXBlLnRvTG93ZXJDYXNlKCk7 -CQoJCQkJY29uc29sZS5sb2coZmllbGRfdHlwZSk7CgkJCQlzd2l0Y2ggKGZpZWxkX3R5cGUpCgkJ -CQl7CgkJCQljYXNlICJ0ZXh0IjoKCQkJCWNhc2UgInRleHRhcmVhIjoKCQkJCQlpbnB1dC52YWx1 -ZSA9ICIiOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAicmFkaW8iOgoJCQkJY2FzZSAiY2hlY2tib3gi -OgoJCQkJCWlmIChpbnB1dC5jaGVja2VkKQoJCQkJCXsKICAgICAgICAJCQkJCWlucHV0LmNoZWNr -ZWQgPSBmYWxzZTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlICJzZWxlY3Qtb25lIjoKCQkJ -CWNhc2UgInNlbGVjdC1tdWx0aSI6CgkJCQkJaW5wdXQuc2VsZWN0ZWRJbmRleCA9IC0xOwoJCQkJ -CWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJCX0KCQkJfQkKCQkgICAgICAgIHZh -ciBzZWxlY3RzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSggInNlbGVjdCIgKTsKCQkJZm9y -KCBzZWxlY3Qgb2Ygc2VsZWN0cyApCgkJCXsJCgkJCQlpZiggc2VsZWN0Lmhhc0F0dHJpYnV0ZSgi -bXVsdGlwbGUiKSApCgkJCQl7CgkJCQkJc2VsZWN0LnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0K -CQkJfQkJCgoJCX0nOwkJCgoJbXkgJGpzX3RhZyA9ICR4bWwtPmNyZWF0ZV9lbGVtZW50KCAic2Ny -aXB0IiApOwogICAgICAgICRqc190YWctPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9u -b2RlKCAkY2xlYXJfZnVuY3Rpb24gKSApOwogICAgICAgIHJldHVybiAkanNfdGFnOwp9CgoxOwo= +CgkJI3NldCB1cCByZWZpbmUgc2VhcmNoIGxpbmsKCQlteSAkcmVmaW5lX2Jhc2V1cmwgPSBVUkkt +Pm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAgICAgIAkkcmVmaW5lX2Jhc2V1 +cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgIAljYWNoZSA9PiAkY2FjaGVpZCwKCSAgICAgICAgICAg +ICAgICBleHAgPT4gJGVzY2V4cCwKICAgICAgICAJICAgICAgICBzY3JlZW4gPT4gIlJlcG9ydCIs +CiAgICAgICAgICAgICAgICAJZGF0YXNldCA9PiAkc2VsZi0+e2RhdGFzZXRpZH0sCiAgICAgICAg +ICAgICAgICAJb3JkZXIgPT4gJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+e2N1c3RvbV9v +cmRlcn0sCgkJCXNjb25mID0+ICRzY29uZiwKICAgICAgICAJKTsKCgkJbXkgJHJlZmluZV9saW5r +ID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJHJlZmluZV9iYXNldXJsJl9hY3Rpb25fdXBkYXRlPTEi +ICk7CiAgICAgIAkJJHJlZmluZV9saW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNl +KCAibGliL3NlYXJjaGV4cHJlc3Npb246cmVmaW5lIiApICk7ICAgCSAgICAgICAgIAoJICAgICAg +ICAkc2VhcmNoX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJlZmluZV9saW5rICk7CgoJCSRjaHVuay0+ +YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpzZWFyY2hfbGlua3MiLCBs +aW5rcz0+JHNlYXJjaF9saW5rcyApICk7Cgl9CgoJcmV0dXJuICRjaHVuazsKfQoKCiNhZGRzIGEg +bmV3IGNoZWNrYm94IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZSB3aGljaCBmaWVsZHMgdG8g +ZXhwb3J0CnN1YiBfZXhwb3J0X2ZpZWxkX2NoZWNrYm94CnsKCW15KCAkc2VsZiwgJHJlcG8sICRm +aWVsZG5hbWUsICR1bCwgJGZpZWxkbGFiZWwgKSA9IEBfOwoKCW15ICRsaSA9ICRyZXBvLT5tYWtl +X2VsZW1lbnQoICJsaSIgKTsKCSR1bC0+YXBwZW5kQ2hpbGQoICRsaSApOwoKICAgICAgICBteSAk +Y2hlY2tib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaW5wdXQiLCB0eXBlID0+ICJjaGVja2Jv +eCIsIGlkID0+ICRmaWVsZG5hbWUsIG5hbWUgPT4gJGZpZWxkbmFtZSwgdmFsdWUgPT4gJGZpZWxk +bmFtZSApOwoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0s +ICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKSApCgl7CgkJaWYoICggZ3JlcCB7ICRmaWVsZG5hbWUg +ZXEgJF8gfSBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0Zmll +bGRfZGVmYXVsdHMiICl9ICkgfHwgKCBzY2FsYXIoIEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntl +eHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKX0gKSA9PSAwICkgKQoJCXsKCQkJ +I29ubHkgY2hlY2sgZGVmYXVsdHMgb3IgY2hlY2sgZXZlcnl0aGluZyBpZiBkZWZhdWx0cyBub3Qg +ZGVmaW5lZAoJCQkkY2hlY2tib3gtPnNldEF0dHJpYnV0ZSggImNoZWNrZWQiLCAieWVzIiApOwoJ +CX0KCX0KCW15ICRsYWJlbCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsYWJlbCIsIGZvciA9PiAk +ZmllbGRuYW1lICk7CgkkbGFiZWwtPmFwcGVuZENoaWxkKCAkZmllbGRsYWJlbCApOwoKCSRsaS0+ +YXBwZW5kQ2hpbGQoICRjaGVja2JveCApOwoJJGxpLT5hcHBlbmRDaGlsZCggJGxhYmVsICk7Cn0K +CiMjIyB1dGlsaXR5IG1ldGhvZHMKCiMgVE9ETyBzaG91bGQgdXNlICJKU09OIiBwYWNrYWdlCnN1 +YiB0b19qc29uCnsKICAgICAgICBteSggJHNlbGYsICRvYmplY3QgKSA9IEBfOwoKCXJldHVybiAi +IiBpZiggIWRlZmluZWQgJG9iamVjdCApOwoKIyBVVEYtOCBpc3N1ZXM6CiMJcmV0dXJuIEpTT04t +Pm5ldy0+dXRmOCgxKS0+ZW5jb2RlKCAkb2JqZWN0ICk7CgogICAgICAgIGlmKCByZWYoICRvYmpl +Y3QgKSBlcSAnSEFTSCcgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBzdHVmZjsKICAg +ICAgICAgICAgICAgIHdoaWxlKCBteSggJGssICR2ICkgPSBlYWNoKCAlJG9iamVjdCApICkKICAg +ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6 +OlV0aWxzOjppc19zZXQoICR2ICkgKTsgICAgICAgIyBvciAnbnVsbCcgPwogICAgICAgICAgICAg +ICAgICAgICAgICBwdXNoIEBzdHVmZiwgRVByaW50czo6VXRpbHM6OmpzX3N0cmluZyggJGsgKS4n +OicuJHNlbGYtPnRvX2pzb24oICR2ICkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg +IHJldHVybiAneycgLiBqb2luKCAiLCIsIEBzdHVmZiApIC4gJ30nOwogICAgICAgIH0KICAgICAg +ICBlbHNpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0FSUkFZJyApCiAgICAgICAgewogICAgICAgICAg +ICAgICAgbXkgQHN0dWZmOwogICAgICAgICAgICAgICAgZm9yZWFjaCggQCRvYmplY3QgKQogICAg +ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6 +VXRpbHM6OmlzX3NldCggJF8gKSApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVm +ZiwgJHNlbGYtPnRvX2pzb24oICRfICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg +ICByZXR1cm4gJ1snIC4gam9pbiggIiwiLCBAc3R1ZmYgKSAuICddJzsKICAgICAgICB9CgogICAg +ICAgIHJldHVybiBFUHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkb2JqZWN0ICk7Cn0KCnN1YiBl +eHBvcnRfcGx1Z2lucwp7CiAgICAgICAgbXkoICRzZWxmLCAkZ2VuZXJpYyApID0gQF87CgoJbXkg +QHBsdWdpbl9pZHM7CgkKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJaWYoIGRlZmlu +ZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRfcGx1Z2lucyIg +KSApCgl7CgkJQHBsdWdpbl9pZHMgPSBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2Nv +bmZ9LCAiZXhwb3J0X3BsdWdpbnMiICl9OwoJfQkKCWVsc2lmKCAkZ2VuZXJpYyApCgl7CiAJCUBw +bHVnaW5faWRzID0gJHJlcG8tPnBsdWdpbl9saXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4g +IkV4cG9ydCIsCgkgICAgICAgICAgICAgICAgY2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMi +LAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNl +ZCA9PiAxLAoJICAgICAgICApOwoJfQoJZWxzZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRy +ZXBvLT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAg +ICAgICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAog +ICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9 +PiAxLAoJICAgICAgICApOwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQg +KCBAcGx1Z2luX2lkcyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJHAgPSAkcmVwby0+ +cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAk +cDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKc3ViIHJlcG9ydF9wbHVn +aW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBsaXN0IHZpYSB0eXBlID0+ +ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBv +c2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUgPT4gIlNjcmVlbiIsCiAg +ICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15ICRpZCAoIEBwbHVnaW5f +aWRzICkKICAgICAgICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVuOjpSZXBvcnQ6Oi8gKTsJ +IyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNjcmVlbjo6UmVwb3J0KQoK +ICAgICAgICAgICAgICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdpbiggIiRpZCIg +KTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92aWV3ZWQgKTsKCiAgICAg +ICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBA +cGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBwZWQgdG8gYSBsYWJlbCBh +bmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2YgaXRlbXMgYXJlIGp1c3Qg +cmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpTKQpzdWIgZ2V0X2dyb3Vw +ZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSApID0gQF87CglteSAkc2Vz +c2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglteSAkZ3JvdXBpbmcgPSAk +c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVsZCA9ICRpdGVtcy0+Z2V0 +X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3VwX29wdHMgaWYgYXBwcm9w +cmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9ICkKCXsK +CQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJJG1ldGFmaWVsZC0+e3Jl +bmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXN9IGlmIGV4 +aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jlc307CgkJfQoJfQoKCSNj +cmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3IgaXRlbSBpZHMpCgkkaXRl +bXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0YXNldCwgJGl0ZW0gKSA9 +IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRp +cGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBsZSApCiAgICAgICAgICAg +ICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICl9OwoJ +CX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVtLT52YWx1ZSggJGdyb3Vw +aW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+IDAgKQoJCXsKCQkJZm9y +ZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJewoJCQkJbXkgJGdyb3Vw +X2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNzaW9uLCAkZ3JvdXBfdmFs +dWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJCQkJaWYoIGRlZmluZWQg +JHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJCQkJCSRncm91cF9pZCA9 +ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29w +dHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29w +dHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhpc3RzICRncm91cGVkeyRn +cm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBwdXNoIGEgbmV3IGl0 +ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJCWlmKCAkaWRzX29ubHkg +KSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0K +CQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwgJGl0ZW0tPmlkOwoJCQkJ +CX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRp +dGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkgICAgICAJCWVsc2UgI3Nl +dCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAgICAJewoJCQkJCW15IEBn +cm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2Fu +dCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAgICAgICAgICAgICAgICAg +ICB7CQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdyb3VwZWRfaXRlbXMgPSAo +JGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAgIAkJICAgICAgICB9CgkgICAgICAgICAgICAgICAg +CSAgICAgICAgZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsKCSAgICAgICAgICAgICAg +ICAJICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtKTsKICAgICAgICAJCSAg +ICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgJGdyb3VwZWR7JGdyb3Vw +X2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAgICAgIAkJfQoJCX0KCQll +bHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAuICRtZXRhZmllbGQtPm5h +bWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApICN3ZSd2ZSBhbHJl +YWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0byB0aGUgbGlzdAoJCSAg +CXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVy +IHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lk +fX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7 +JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAgICAgIAkgICAgICAJZWxz +ZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJewoJCQkJbXkgQGdyb3Vw +ZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRz +IHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgIHsJCiAgICAgICAg +CQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAgICAgICAJCX0KCSAg +ICAgICAgICAgICAgICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgewoJICAgICAgICAg +ICAgICAgCSAgICAgICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAg +CSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91 +cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAgCX0gKTsKCgkjbm93IHNv +cnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVscwoJbXkgQHNvcnRlZF9n +cm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNlbGYtPntwcm9jZXNzb3J9 +LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNz +b3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAkbWV0YWZpZWxkLT50eXBl +IGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyApID0gJG1ldGFmaWVsZC0+ +dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRhZ3MgdG8gYSBoYXNoIG9m +IHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15ICVwcmlvcml0eTsKCQlt +eSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30gKQoJCXsKCQkJJHByaW9y +aXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9yZWFjaCBteSAka2V5IChz +b3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAg +ICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0o +ICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9CgllbHNpZiggJG1ldGFm +aWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0gJHNlc3Npb24tPmRhdGFz +ZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91cGVkOwoJCW15ICRzb3J0 +ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxAdmFsdWVzICk7CgkJbXkg +JXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICR2 +YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAg +ICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAk +aW5kZXgrKzsKICAgICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRrZXkgKHNvcnQgeyRwcmlv +cml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQpCiAgICAgICAgICAgICAg +ICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAgICAgICAgICAgICAgICAg +ICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRn +cm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkc3Viai0+cmVuZGVy +X2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAgICAgICAgICAgfQoJfQoJ +ZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlpZiggJHJldmVyc2UgKQoJ +CXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBrZXlzICVncm91cGVkICkK +CQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSgg +JGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15 +ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBz +b3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwg +JGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9y +ZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJ +cHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7 +JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBz +b3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+ +X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoK +CSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdyb3VwX2lkID0gIlVuc3Bl +Y2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBf +aWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVt +KCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCglyZXR1cm4gXEBzb3J0ZWRf +Z3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXkoICRzZWxmLCAkbGlzdCwg +JGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9ICRsaXN0OwoJJGdyb3Vw +e2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgpzdWIgcmVuZGVyX3NlbGVjdGFs +bAp7CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICR0b2dnbGVfZnVuY3Rpb24gPSAnCgkJ +dmFyIGlzQ2hlY2tlZCA9IHRydWU7CgkJZnVuY3Rpb24gdG9nZ2xlQ2hlY2tib3hlcygpIHsKCSAg +ICAgICAgCXZhciBleHBvcnRfb3B0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05h +bWUoInJlcG9ydF9leHBvcnRfb3B0aW9ucyIpOwoJCQlmb3IoIGV4cG9ydF9vcHRpb24gb2YgZXhw +b3J0X29wdGlvbnMgKQoJCQl7CgkJCQl2YXIgY2hlY2tib3hlcyA9IGV4cG9ydF9vcHRpb24uZ2V0 +RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKQoJCQkJZm9yKCBjaGVja2JveCBvZiBjaGVja2Jv +eGVzICkKCQkJCXsKCQkJCQlpZihpc0NoZWNrZWQpCgkJCQkJewoJICAgICAgICAgICAgICAgIAkJ +CWNoZWNrYm94LmNoZWNrZWQgPSAiIjsKCQkgIAkgICAgICAgIAl9CgkJCQkJZWxzZQoJCQkJCXsK +CQkJCSAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gImNoZWNrZWQiOwoJCQkJCX0K +CSAgICAgICAgIAkJfQoJCQl9CgkJCWlzQ2hlY2tlZCA9ICFpc0NoZWNrZWQ7CgkJfSc7CgkKCW15 +ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxlbWVudCggInNjcmlwdCIgKTsKCSRqc190YWctPmFw +cGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkdG9nZ2xlX2Z1bmN0aW9uICkgKTsK +CXJldHVybiAkanNfdGFnOwp9CgpzdWIgcmVuZGVyX2NsZWFyZm9ybQp7CglteSggJHNlbGYsICR4 +bWwgKSA9IEBfOwoKCW15ICRjbGVhcl9mdW5jdGlvbiA9ICcKCQlmdW5jdGlvbiBjbGVhckZvcm0o +KXsKCQkJdmFyIHJlcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAiY3VzdG9tX3JlcG9y +dCIgKTsKCQkJdmFyIGZvcm0gPSByZXBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic2VsZWN0 +ZWRfZm9ybSIpWzBdOwoJCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgg +ImlucHV0IiApOwoJCQlmb3IoIGlucHV0IG9mIGlucHV0cyApCgkJCXsKCQkJCWZpZWxkX3R5cGUg +PSBpbnB1dC50eXBlLnRvTG93ZXJDYXNlKCk7CQoJCQkJY29uc29sZS5sb2coZmllbGRfdHlwZSk7 +CgkJCQlzd2l0Y2ggKGZpZWxkX3R5cGUpCgkJCQl7CgkJCQljYXNlICJ0ZXh0IjoKCQkJCWNhc2Ug +InRleHRhcmVhIjoKCQkJCQlpbnB1dC52YWx1ZSA9ICIiOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAi +cmFkaW8iOgoJCQkJY2FzZSAiY2hlY2tib3giOgoJCQkJCWlmIChpbnB1dC5jaGVja2VkKQoJCQkJ +CXsKICAgICAgICAJCQkJCWlucHV0LmNoZWNrZWQgPSBmYWxzZTsKCQkJCQl9CgkJCQkJYnJlYWs7 +CgkJCQljYXNlICJzZWxlY3Qtb25lIjoKCQkJCWNhc2UgInNlbGVjdC1tdWx0aSI6CgkJCQkJaW5w +dXQuc2VsZWN0ZWRJbmRleCA9IC0xOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlicmVh +azsKCQkJCX0KCQkJfQkKCQkgICAgICAgIHZhciBzZWxlY3RzID0gZm9ybS5nZXRFbGVtZW50c0J5 +VGFnTmFtZSggInNlbGVjdCIgKTsKCQkJZm9yKCBzZWxlY3Qgb2Ygc2VsZWN0cyApCgkJCXsJCgkJ +CQlpZiggc2VsZWN0Lmhhc0F0dHJpYnV0ZSgibXVsdGlwbGUiKSApCgkJCQl7CgkJCQkJc2VsZWN0 +LnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJfQkJCgoJCX0nOwkJCgoJbXkgJGpzX3RhZyA9 +ICR4bWwtPmNyZWF0ZV9lbGVtZW50KCAic2NyaXB0IiApOwogICAgICAgICRqc190YWctPmFwcGVu +ZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkY2xlYXJfZnVuY3Rpb24gKSApOwogICAg +ICAgIHJldHVybiAkanNfdGFnOwp9CgoxOwo= @@ -2168,9 +2190,9 @@ mCeqVAAAAABJRU5ErkJggg== document static/javascript/auto/reports.js text/plain - d02c8742a8d57f71e94e1c62635b94de + 71e1a869fbb7241f7fcc4027acc5a6f8 MD5 - 12701 + 12708 dmFyIGluaXRSZXBvcnRGb3JtID0gZnVuY3Rpb24oKXsKCiAgICAgICAgLy9wb2x5ZmlsbCBmb3Ig SUUKICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygd2lu ZG93LkN1c3RvbUV2ZW50ID09PSAiZnVuY3Rpb24iICkgcmV0dXJuIGZhbHNlOyAvL0lmIG5vdCBJ @@ -2190,219 +2212,219 @@ ICAgICAgICAgICAgdmFyIGNoYW5nZVNlbGVjdCA9IG5ldyBDdXN0b21FdmVudCgiY2hhbmdlIik7 CiAgICAgICAgICAgICAgICBzZWxlY3QuZGlzcGF0Y2hFdmVudChjaGFuZ2VTZWxlY3QpOwogICAg ICAgIH0pOwp9OwoKCnZhciBvbkZvcm1TZWxlY3QgPSBmdW5jdGlvbigpewoJLy9nZXQgZm9ybSBp ZAoJdmFyIGZvcm1pZCA9IHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLmdldEF0dHJp -YnV0ZSgnZm9ybScpOwoJCgkvL2hpZGUgb3RoZXIgZm9ybXMKCSQkKCd0YWJsZS5lcF9zZWFyY2hf -ZmllbGRzJykuZWFjaChmdW5jdGlvbiAoZWxlbSkgCgl7CQoJCS8vaGlkZSB0aGUgZm9ybQoJCSQo -ZWxlbSkuaGlkZSgpOwoJCSQoZWxlbSkucmVtb3ZlQ2xhc3NOYW1lKCJzZWxlY3RlZF9mb3JtIik7 -CgkJJChlbGVtKS5zZWxlY3QoJ2lucHV0JykuZWFjaChmdW5jdGlvbiAoaW5wdXQpCgkJewoJCQkk -KGlucHV0KS5zZXRBdHRyaWJ1dGUoImRpc2FibGVkIiwgImRpc2FibGVkIik7CgkJfSk7Cgl9KTsK -CQkKCS8vc2hvdyB0aGUgZm9ybSB3ZSB3YW50CgkkKGZvcm1pZCkuc2hvdygpOwoJJChmb3JtaWQp -LmFkZENsYXNzTmFtZSgic2VsZWN0ZWRfZm9ybSIpOwoKCS8vZW5hYmxlIHRoaXMgZm9ybSdzIGlu -cHV0IGVsZW1lbnRzCgkkKGZvcm1pZCkuc2VsZWN0KCdpbnB1dCcpLmVhY2goZnVuY3Rpb24gKGlu -cHV0KQoJewoJCSQoaW5wdXQpLnJlbW92ZUF0dHJpYnV0ZSgiZGlzYWJsZWQiKTsKCX0pOwoKfTsK -Ci8vIFVzZWQgYnkgdGhlIFNjcmVlbjo6UmVwb3J0OjpyZW5kZXIgbWV0aG9kCgp2YXIgRVByaW50 -c19TY3JlZW5fUmVwb3J0X0xvYWRlciA9IENsYXNzLmNyZWF0ZSh7CgloYXNfcHJvYmxlbXM6IDAs -Cgljb3VudDogMCwKCXJ1bnM6IDAsCglwcm9ncmVzczogbnVsbCwKCWlkczogQXJyYXkoKSwKCXN0 -ZXA6IDIwLAoJcHJlZml4OiAnJywKCW9uUHJvYmxlbXM6IGZ1bmN0aW9uKCkge30sCglvbkZpbmlz -aDogZnVuY3Rpb24oKSB7fSwKCXVybDogIiIsCglwYXJhbWV0ZXJzOiAiIiwKCWNvbnRhaW5lcjog -bnVsbCwKCXNob3dfY29tcGxpYW5jZTogMSwJCgoJLy8gdG8gc2hvdyBhIHByZXR0eSBwcm9ncmVz -cyBiYXIgKCUgY29tcGxpYW5jZSk6Cgl0b3RhbF9kYXRhb2JqczogMCwKCXRvdGFsX25vbmNvbXBs -aWFudDogMCwKCgoJaW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0cykgewoJCWlmKCBvcHRzLmlkcyAp -CgkJCXRoaXMuaWRzID0gb3B0cy5pZHM7CgkJaWYoIG9wdHMuc3RlcCApCgkJCXRoaXMuc3RlcCA9 -IG9wdHMuc3RlcDsKCQlpZiggb3B0cy5wcmVmaXggKQoJCQl0aGlzLnByZWZpeCA9IG9wdHMucHJl -Zml4OwoJCWlmKCBvcHRzLm9uRmluaXNoICkKCQkJdGhpcy5vbkZpbmlzaCA9IG9wdHMub25GaW5p -c2g7CgkJaWYoIG9wdHMub25Qcm9ibGVtcyApCgkJCXRoaXMub25Qcm9ibGVtcyA9IG9wdHMub25Q -cm9ibGVtczsKCQlpZiggb3B0cy51cmwgKQoJCXsKCQkJdGhpcy51cmwgPSBvcHRzLnVybDsKCQl9 -CgkJaWYoIG9wdHMucGFyYW1ldGVycyApCgkJCXRoaXMucGFyYW1ldGVycyA9IG9wdHMucGFyYW1l -dGVyczsKCQlpZiggb3B0cy5jb250YWluZXJfaWQgKQoJCQl0aGlzLmNvbnRhaW5lciA9ICQoIG9w -dHMuY29udGFpbmVyX2lkICk7CS8vIHNob3VsZCBmYWlsIGlmIGNvbnRhaW5lciBkb2Vzbid0IGV4 -aXN0Li4uCgkJaWYoIG9wdHMuaGFzT3duUHJvcGVydHkoJ3Nob3dfY29tcGxpYW5jZScpICkKCQl7 -CgkJCXRoaXMuc2hvd19jb21wbGlhbmNlID0gb3B0cy5zaG93X2NvbXBsaWFuY2U7CgkJfQoJCWlm -KCBvcHRzLmxhYmVscyApCgkJewoJCQl0aGlzLmxhYmVscyA9IG9wdHMubGFiZWxzOwoJCX0KCX0s -CgoJZXhlY3V0ZTogZnVuY3Rpb24oKSB7CgkJLy8gcHJvZ3Jlc3MtYmFyCgoJCXRoaXMuY29udGFp -bmVyLmluc2VydCggbmV3IEVsZW1lbnQoICdkaXYnLCB7ICdjbGFzcyc6ICdlcF9yZXBvcnRfcHJv -Z3Jlc3NfYmFyJywgJ2lkJzogdGhpcy5wcmVmaXggKyAiX3Byb2dyZXNzX2JhciIgfSApICk7CQoK -CQl2YXIgY3VycmVudF9ncm91cGluZyA9IG51bGw7CS8vIG1pZ2h0IG5vdCBiZSBzZXQgaW4gdGhl -IHJldHVybmVkIHZhbHVlIGJ1dCB0aGF0J3MgYWxsb3dlZC9PSwoKCQl2YXIgZGF0YW9ianMgPSB7 -fTsKCQl2YXIgZ3JvdXBlZCA9IGZhbHNlOwoJCXZhciBzZWVuX2lkcyA9IHt9OwoJCXRoaXMubm9f -aXRlbXMgPSB0aGlzLmlkcy5sZW5ndGg7CgkJdGhpcy5yZXRyaWV2ZWQgPSBbXTsKCQlpZiggIWlz -SW50ZWdlcih0aGlzLmlkc1swXSkgKSAvL2lkcyBoYXZlIGJlZW4gZ3JvdXBlZAoJCXsJCgkJCWdy -b3VwZWQgPSB0cnVlOwoJCQl0aGlzLmdyb3VwZWRfaWRzID0gdGhpcy5pZHM7CgkJCXRoaXMuaWRz -ID0gW107CgkJCWZvciggdmFyIGkgPSAwOyBpIDwgdGhpcy5ncm91cGVkX2lkcy5sZW5ndGg7IGkr -KyApCgkJCXsKCQkJCXRoaXMuaWRzID0gdGhpcy5pZHMuY29uY2F0KHRoaXMuZ3JvdXBlZF9pZHNb -aV0ubGlzdCk7CgkJCX0KCQkJLy90aGUgZ3JvdXBpbmcgbWF5IGhhdmUgY3JlYXRlZCBkdXBsaWNh -dGUgcmVjb3JkcyAoaS5lLiBhIHJlY29yZCBjYW4gYXBwZWFyIGluIG1vcmUgdGhhbiBvbmUgZ3Jv -dXApIC0gaXQncyBoYW5keSB0byBoYXZlIGFuIGFycmF5IG9mIGFsbCB0aGUgdW5pcXVlIHJlY29y -ZHMKCQkJdGhpcy51bmlxdWUgPSB0aGlzLmlkcy5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaSwgYXIp -eyByZXR1cm4gYXIuaW5kZXhPZihpdGVtKSA9PT0gaTsgfSk7CgkJCXRoaXMubm9faXRlbXMgPSB0 -aGlzLnVuaXF1ZS5sZW5ndGg7CgkJfQoJCWZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmlkcy5sZW5n -dGg7IGkrPXRoaXMuc3RlcCkKCQl7CgkJCS8vIGFyZ3VtZW50cyBmb3IgQWpheCBxdWVyeSBBTkQg -Y3JlYXRlcyB0aGUgSFRNTCBwbGFjZWhvbGRlcnMgPGRpdj4ncyAodGhhdCB3aWxsIHJlY2VpdmUg -dGhlIGNvbnRlbnQgb2YgdGhlIEFqYXggcXVlcnkuLi4pCQkJCQoJCQl2YXIgYXJncyA9ICcmYWph -eD0nK3RoaXMucHJlZml4OwoJCQlmb3IodmFyIGogPSAwOyBqIDwgdGhpcy5zdGVwICYmIGkraiA8 -IHRoaXMuaWRzLmxlbmd0aDsgaisrKQoJCQl7CgkJCQlhcmdzICs9ICcmJyArIHRoaXMucHJlZml4 -ICsgJz0nICsgdGhpcy5pZHNbaStqXTsKCQkJCXZhciBpZCA9IHRoaXMucHJlZml4ICsgJ18nICsg -dGhpcy5pZHNbaStqXTsKCQkJCXZhciB0YXJnZXRfZWwgPSAkKCBpZCApOwoJCQkJaWYoIHRhcmdl -dF9lbCAhPSBudWxsICkKCQkJCXsKCQkJCQkvL3N0b3JlIGEgcmVjb3JkIG9mIHRoaXMgaW4gc2Vl -bl9pZHMgdG8gZW5zdXJlIGVhY2ggcGxhY2Vob2xkZXIgaGFzIGEgdW5pcXVlIGlkCgkJCQkJaWYo -ICEoaWQgaW4gc2Vlbl9pZHMpICkKCQkJCQl7CgkJCQkJCXNlZW5faWRzW2lkXSA9IDE7CgkJCQkJ -fQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXNlZW5faWRzW2lkXSA9IHNlZW5faWRzW2lkXSArIDE7 -CgkJCQkJfQoJCQkJCWlkID0gaWQgKyAiXyIgKyBzZWVuX2lkc1tpZF07CgkJCQl9CgkJCQkJCgkJ -CQl0aGlzLmNvbnRhaW5lci5pbnNlcnQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAn -ZXBfcmVwb3J0X3JvdycsICdpZCc6IGlkLCAncG9zaXRpb24nOiBpK2ogfSApLCB7ICdwb3NpdGlv -bic6ICdhZnRlcicgfSApOwoJCQl9CgkJCW5ldyBBamF4LlJlcXVlc3QoIHRoaXMudXJsLCB7CgkJ -CQltZXRob2Q6ICdnZXQnLAoJCQkJcGFyYW1ldGVyczogdGhpcy5wYXJhbWV0ZXJzICsgYXJncywK -CQkJCW9uU3VjY2VzczogKGZ1bmN0aW9uKHRyYW5zcG9ydCkgewoKCQkJCQl2YXIganNvbiA9IHRy -YW5zcG9ydC5yZXNwb25zZVRleHQuZXZhbEpTT04oKTsKCQkJCQl2YXIgZGF0YSA9IGpzb24uZGF0 -YTsKCQoJCQkJCWlmKCBkYXRhID09IG51bGwgKQoJCQkJCQlkYXRhID0gbmV3IEFycmF5KCk7CgkJ -CQkJZm9yKCB2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKysgKQoJCQkJCXsKCQkJCQkJdmFyIGVu -dHJ5ID0gZGF0YVtpXTsKCQkJCQoJCQkJCQkvLyBlbnRyeS5kYXRhb2JqaWQKCQkJCQkJLy8gZW50 -cnkuc3VtbWFyeQoJCQkJCQkvLyBlbnRyeS5ncm91cGluZwoJCQkJCQkvLyBlbnRyeS5wcm9ibGVt -cwoKCQkJCQkJaWYoIGVudHJ5ID09IG51bGwgKQoJCQkJCQkJY29udGludWU7CgkJCQkJCQoJCQkJ -CQl2YXIgZGF0YW9iamlkID0gZW50cnkuZGF0YW9iamlkOwoJCQkJCQlpZiggZGF0YW9iamlkID09 -IG51bGwgKQoJCQkJCQkJY29udGludWU7CgkJCQkJCWlmKCAhKGRhdGFvYmppZCBpbiBkYXRhb2Jq -cykgKQoJCQkJCQl7CgkJCQkJCQl0aGlzLmNvdW50Kys7CgkJCQkJCQlkYXRhb2Jqc1tkYXRhb2Jq -aWRdID0gZW50cnk7CgkJCQkJCX0KCQkJCQl9CgkJCQoJCQkJCS8vIHdlJ3ZlIHJldHJpZXZlZCBh -bGwgdGhlIHJlY29yZHMJCQkJCgkJCQkJaWYoIHRoaXMuY291bnQgPT0gdGhpcy5ub19pdGVtcyAp -CgkJCQkJewoJCQkJCQkkKCB0aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJyApLnJlbW92ZSgp -OwoJCQkJCQlpZiggdGhpcy5oYXNfcHJvYmxlbXMgKQoJCQkJCQkJdGhpcy5vblByb2JsZW1zKHRo -aXMpOwoJCQkJCQl0aGlzLm9uRmluaXNoKHRoaXMpOwoJCQkJCQkJCgkJCQkJCS8vYWRkIHRoZSBn -cm91cCBoZWFkaW5ncwoJCQkJCQlpZihncm91cGVkKQoJCQkJCQl7CgkJCQkJCQl2YXIgcG9zaXRp -b24gPSAwOwoJCQkJCQkJZm9yKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmdyb3VwZWRfaWRzLmxlbmd0 -aDsgaSsrICkKCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIHsJCgkJCQkJCQkJdmFyIHRhcmdl -dF9lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1twb3NpdGlvbj0iJyArIHBvc2l0aW9u -ICsgJyJdJylbMF07CgkJCQkJCQkJcG9zaXRpb24gPSBwb3NpdGlvbiArIHRoaXMuZ3JvdXBlZF9p -ZHNbaV0ubGlzdC5sZW5ndGg7CQkJCgkJCQkJCQkJdmFyIGdyb3VwaW5nX2NvbnRhaW5lciA9IG5l -dyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2dyb3VwaW5nJyB9ICk7CiAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICB0YXJnZXRfZWwuaW5zZXJ0KCB7ICdiZWZvcmUnIDogZ3JvdXBpbmdfY29udGFpbmVyIH0g -KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgIGdyb3VwaW5nX2NvbnRhaW5lci51cGRhdGUoIHRoaXMuZ3JvdXBlZF9pZHNbaV0u -bGFiZWwgKTsKCQkJCSAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCQkJfQoKCQkJCQkJLy9h -ZGQgdGhlIGVwcmludCBzdW1tYXJpZXMKCQkJCQkJdmFyIGFkZGVkX2lkcyA9IHt9OwoJCQkJCQlm -b3IoIHZhciBjID0gMDsgYyA8IHRoaXMuaWRzLmxlbmd0aDsgYysrICkKCQkJCQkJewoJCQkJCQkJ -dmFyIGRhdGFvYmppZCA9IHRoaXMuaWRzW2NdOwoJCQkJCQkJdmFyIGVudHJ5ID0gZGF0YW9ianNb -ZGF0YW9iamlkXTsKCgkJCQkJCQkvL3N0b3JlIHRoYXQgd2UgaGF2ZSBhZGRlZCB0aGlzIG9iamVj -dGlkCgkJCQkJCQlpZiggIShkYXRhb2JqaWQgaW4gYWRkZWRfaWRzKSApCgkJCQkJCQl7CgkJCQkJ -CQkJYWRkZWRfaWRzW2RhdGFvYmppZF0gPSAwOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJ -ewoJCQkJCQkJCWFkZGVkX2lkc1tkYXRhb2JqaWRdID0gYWRkZWRfaWRzW2RhdGFvYmppZF0gKyAx -OwoJCQkJCQkJfQoJCQkJCQkJdGhpcy50b3RhbF9kYXRhb2JqcysrOwoKCQkJCQkJCXZhciBzdW1t -YXJ5ID0gZW50cnkuc3VtbWFyeTsKCgkJCQkJCQl2YXIgdGFyZ2V0X2lkID0gdGhpcy5wcmVmaXgg -KyAnXycgKyBkYXRhb2JqaWQ7CgkJCQkJCQlpZiggYWRkZWRfaWRzW2RhdGFvYmppZF0gPiAwICkK -CQkJCQkJCXsKCQkJCQkJCQl0YXJnZXRfaWQgPSB0YXJnZXRfaWQgKyAnXycgKyBhZGRlZF9pZHNb -ZGF0YW9iamlkXTsKCQkJCQkJCX0KCQkJCQkJCXZhciB0YXJnZXRfZWwgPSAkKCB0YXJnZXRfaWQg -KTsKCgkJCQkJCQlpZiggdGFyZ2V0X2VsICE9IG51bGwgJiYgc3VtbWFyeSAhPSBudWxsICkKCQkJ -CQkJCXsKCQkJCQkJCQl2YXIgc3VtbWFyeV9lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGlsZCggbmV3 -IEVsZW1lbnQoICdkaXYnLCB7ICdjbGFzcyc6ICdlcF9yZXBvcnRfcm93X3N1bW1hcnknIH0gKSAp -OwoJCQkJCQkJCXN1bW1hcnlfZWwudXBkYXRlKCBzdW1tYXJ5ICk7CgoJCQkJCQkJCS8vdG90YWwg -dXAgbm9uIGNvbXBsaWFudCByZWNvcmRzCgkJCQkJCQkJaWYoIGVudHJ5LmlzX2NvbXBsaWFudCA9 -PSBudWxsICYmIGVudHJ5LnByb2JsZW1zICYmIGVudHJ5LnByb2JsZW1zLmxlbmd0aCApCgkJCQkJ -CQkJewoJCQkJCQkJCQl0aGlzLnRvdGFsX25vbmNvbXBsaWFudCsrOwoJCQkJCQkJCX0KCQkJCQkJ -CQkKCQkJCQkJCQlpZiggZW50cnkucHJvYmxlbXMgJiYgZW50cnkucHJvYmxlbXMubGVuZ3RoICkK -CQkJCQkJCQl7CgkJCQkJCQkJCXZhciBwcm9ibGVtc19lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGls -ZCggbmV3IEVsZW1lbnQoICd1bCcsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9yb3dfcHJvYmxlbXMn -IH0gKSApOwoKCQkJCQkJCQkJZm9yKCB2YXIgcD0wOyBwPCBlbnRyeS5wcm9ibGVtcy5sZW5ndGg7 -IHArKyApCgkJCQkJCQkJCXsKCQkJCQkJCQkJCXZhciBsaSA9IHByb2JsZW1zX2VsLmFwcGVuZENo -aWxkKCBuZXcgRWxlbWVudCggJ2xpJyApKTsKCQkJCQkJCQkJCWxpLnVwZGF0ZSggZW50cnkucHJv -YmxlbXNbcF0gKTsKCQkJCQkJCQkJfQkJCQkJCQkJCgkJCQkJCQkJfQoJCQkJCQkJCWVsc2UKCQkJ -CQkJCQl7CgkJCQkJCQkJCS8vYWRkIHN1cHBvcnQgZm9yIGNvbXBsaWFudCBpdGVtcyB0byBpbmNs -dWRlIGJ1bGxldCBwb2ludHMgdG9vCgkJCQkJCQkJCWlmKCBlbnRyeS5idWxsZXRzICYmIGVudHJ5 -LmJ1bGxldHMubGVuZ3RoICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IHZhciBidWxsZXRzX2VsID0gdGFyZ2V0X2VsLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ3Vs -JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X3Jvd19idWxsZXRzJyB9ICkgKTsKCiAgICAgICAgICAg +YnV0ZSgnZm9ybScpOwoJCgkvL2hpZGUgb3RoZXIgZm9ybXMKCSQkKCdkaXYuZXBfdGFibGUuZXBf +c2VhcmNoX2ZpZWxkcycpLmVhY2goZnVuY3Rpb24gKGVsZW0pIAoJewkKCQkvL2hpZGUgdGhlIGZv +cm0KCQkkKGVsZW0pLmhpZGUoKTsKCQkkKGVsZW0pLnJlbW92ZUNsYXNzTmFtZSgic2VsZWN0ZWRf +Zm9ybSIpOwoJCSQoZWxlbSkuc2VsZWN0KCdpbnB1dCcpLmVhY2goZnVuY3Rpb24gKGlucHV0KQoJ +CXsKCQkJJChpbnB1dCkuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoJCX0p +OwoJfSk7CgkJCgkvL3Nob3cgdGhlIGZvcm0gd2Ugd2FudAoJJChmb3JtaWQpLnNob3coKTsKCSQo +Zm9ybWlkKS5hZGRDbGFzc05hbWUoInNlbGVjdGVkX2Zvcm0iKTsKCgkvL2VuYWJsZSB0aGlzIGZv +cm0ncyBpbnB1dCBlbGVtZW50cwoJJChmb3JtaWQpLnNlbGVjdCgnaW5wdXQnKS5lYWNoKGZ1bmN0 +aW9uIChpbnB1dCkKCXsKCQkkKGlucHV0KS5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7Cgl9 +KTsKCn07CgovLyBVc2VkIGJ5IHRoZSBTY3JlZW46OlJlcG9ydDo6cmVuZGVyIG1ldGhvZAoKdmFy +IEVQcmludHNfU2NyZWVuX1JlcG9ydF9Mb2FkZXIgPSBDbGFzcy5jcmVhdGUoewoJaGFzX3Byb2Js +ZW1zOiAwLAoJY291bnQ6IDAsCglydW5zOiAwLAoJcHJvZ3Jlc3M6IG51bGwsCglpZHM6IEFycmF5 +KCksCglzdGVwOiAyMCwKCXByZWZpeDogJycsCglvblByb2JsZW1zOiBmdW5jdGlvbigpIHt9LAoJ +b25GaW5pc2g6IGZ1bmN0aW9uKCkge30sCgl1cmw6ICIiLAoJcGFyYW1ldGVyczogIiIsCgljb250 +YWluZXI6IG51bGwsCglzaG93X2NvbXBsaWFuY2U6IDEsCQoKCS8vIHRvIHNob3cgYSBwcmV0dHkg +cHJvZ3Jlc3MgYmFyICglIGNvbXBsaWFuY2UpOgoJdG90YWxfZGF0YW9ianM6IDAsCgl0b3RhbF9u +b25jb21wbGlhbnQ6IDAsCgoKCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpIHsKCQlpZiggb3B0 +cy5pZHMgKQoJCQl0aGlzLmlkcyA9IG9wdHMuaWRzOwoJCWlmKCBvcHRzLnN0ZXAgKQoJCQl0aGlz +LnN0ZXAgPSBvcHRzLnN0ZXA7CgkJaWYoIG9wdHMucHJlZml4ICkKCQkJdGhpcy5wcmVmaXggPSBv +cHRzLnByZWZpeDsKCQlpZiggb3B0cy5vbkZpbmlzaCApCgkJCXRoaXMub25GaW5pc2ggPSBvcHRz +Lm9uRmluaXNoOwoJCWlmKCBvcHRzLm9uUHJvYmxlbXMgKQoJCQl0aGlzLm9uUHJvYmxlbXMgPSBv +cHRzLm9uUHJvYmxlbXM7CgkJaWYoIG9wdHMudXJsICkKCQl7CgkJCXRoaXMudXJsID0gb3B0cy51 +cmw7CgkJfQoJCWlmKCBvcHRzLnBhcmFtZXRlcnMgKQoJCQl0aGlzLnBhcmFtZXRlcnMgPSBvcHRz +LnBhcmFtZXRlcnM7CgkJaWYoIG9wdHMuY29udGFpbmVyX2lkICkKCQkJdGhpcy5jb250YWluZXIg +PSAkKCBvcHRzLmNvbnRhaW5lcl9pZCApOwkvLyBzaG91bGQgZmFpbCBpZiBjb250YWluZXIgZG9l +c24ndCBleGlzdC4uLgoJCWlmKCBvcHRzLmhhc093blByb3BlcnR5KCdzaG93X2NvbXBsaWFuY2Un +KSApCgkJewoJCQl0aGlzLnNob3dfY29tcGxpYW5jZSA9IG9wdHMuc2hvd19jb21wbGlhbmNlOwoJ +CX0KCQlpZiggb3B0cy5sYWJlbHMgKQoJCXsKCQkJdGhpcy5sYWJlbHMgPSBvcHRzLmxhYmVsczsK +CQl9Cgl9LAoKCWV4ZWN1dGU6IGZ1bmN0aW9uKCkgewoJCS8vIHByb2dyZXNzLWJhcgoKCQl0aGlz +LmNvbnRhaW5lci5pbnNlcnQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVw +b3J0X3Byb2dyZXNzX2JhcicsICdpZCc6IHRoaXMucHJlZml4ICsgIl9wcm9ncmVzc19iYXIiIH0g +KSApOwkKCgkJdmFyIGN1cnJlbnRfZ3JvdXBpbmcgPSBudWxsOwkvLyBtaWdodCBub3QgYmUgc2V0 +IGluIHRoZSByZXR1cm5lZCB2YWx1ZSBidXQgdGhhdCdzIGFsbG93ZWQvT0sKCgkJdmFyIGRhdGFv +YmpzID0ge307CgkJdmFyIGdyb3VwZWQgPSBmYWxzZTsKCQl2YXIgc2Vlbl9pZHMgPSB7fTsKCQl0 +aGlzLm5vX2l0ZW1zID0gdGhpcy5pZHMubGVuZ3RoOwoJCXRoaXMucmV0cmlldmVkID0gW107CgkJ +aWYoICFpc0ludGVnZXIodGhpcy5pZHNbMF0pICkgLy9pZHMgaGF2ZSBiZWVuIGdyb3VwZWQKCQl7 +CQoJCQlncm91cGVkID0gdHJ1ZTsKCQkJdGhpcy5ncm91cGVkX2lkcyA9IHRoaXMuaWRzOwoJCQl0 +aGlzLmlkcyA9IFtdOwoJCQlmb3IoIHZhciBpID0gMDsgaSA8IHRoaXMuZ3JvdXBlZF9pZHMubGVu +Z3RoOyBpKysgKQoJCQl7CgkJCQl0aGlzLmlkcyA9IHRoaXMuaWRzLmNvbmNhdCh0aGlzLmdyb3Vw +ZWRfaWRzW2ldLmxpc3QpOwoJCQl9CgkJCS8vdGhlIGdyb3VwaW5nIG1heSBoYXZlIGNyZWF0ZWQg +ZHVwbGljYXRlIHJlY29yZHMgKGkuZS4gYSByZWNvcmQgY2FuIGFwcGVhciBpbiBtb3JlIHRoYW4g +b25lIGdyb3VwKSAtIGl0J3MgaGFuZHkgdG8gaGF2ZSBhbiBhcnJheSBvZiBhbGwgdGhlIHVuaXF1 +ZSByZWNvcmRzCgkJCXRoaXMudW5pcXVlID0gdGhpcy5pZHMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0s +IGksIGFyKXsgcmV0dXJuIGFyLmluZGV4T2YoaXRlbSkgPT09IGk7IH0pOwoJCQl0aGlzLm5vX2l0 +ZW1zID0gdGhpcy51bmlxdWUubGVuZ3RoOwoJCX0KCQlmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5p +ZHMubGVuZ3RoOyBpKz10aGlzLnN0ZXApCgkJewoJCQkvLyBhcmd1bWVudHMgZm9yIEFqYXggcXVl +cnkgQU5EIGNyZWF0ZXMgdGhlIEhUTUwgcGxhY2Vob2xkZXJzIDxkaXY+J3MgKHRoYXQgd2lsbCBy +ZWNlaXZlIHRoZSBjb250ZW50IG9mIHRoZSBBamF4IHF1ZXJ5Li4uKQkJCQkKCQkJdmFyIGFyZ3Mg +PSAnJmFqYXg9Jyt0aGlzLnByZWZpeDsKCQkJZm9yKHZhciBqID0gMDsgaiA8IHRoaXMuc3RlcCAm +JiBpK2ogPCB0aGlzLmlkcy5sZW5ndGg7IGorKykKCQkJewoJCQkJYXJncyArPSAnJicgKyB0aGlz +LnByZWZpeCArICc9JyArIHRoaXMuaWRzW2kral07CgkJCQl2YXIgaWQgPSB0aGlzLnByZWZpeCAr +ICdfJyArIHRoaXMuaWRzW2kral07CgkJCQl2YXIgdGFyZ2V0X2VsID0gJCggaWQgKTsKCQkJCWlm +KCB0YXJnZXRfZWwgIT0gbnVsbCApCgkJCQl7CgkJCQkJLy9zdG9yZSBhIHJlY29yZCBvZiB0aGlz +IGluIHNlZW5faWRzIHRvIGVuc3VyZSBlYWNoIHBsYWNlaG9sZGVyIGhhcyBhIHVuaXF1ZSBpZAoJ +CQkJCWlmKCAhKGlkIGluIHNlZW5faWRzKSApCgkJCQkJewoJCQkJCQlzZWVuX2lkc1tpZF0gPSAx +OwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzZWVuX2lkc1tpZF0gPSBzZWVuX2lkc1tp +ZF0gKyAxOwoJCQkJCX0KCQkJCQlpZCA9IGlkICsgIl8iICsgc2Vlbl9pZHNbaWRdOwoJCQkJfQoJ +CQkJCQoJCQkJdGhpcy5jb250YWluZXIuaW5zZXJ0KCBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2Ns +YXNzJzogJ2VwX3JlcG9ydF9yb3cnLCAnaWQnOiBpZCwgJ3Bvc2l0aW9uJzogaStqIH0gKSwgeyAn +cG9zaXRpb24nOiAnYWZ0ZXInIH0gKTsKCQkJfQoJCQluZXcgQWpheC5SZXF1ZXN0KCB0aGlzLnVy +bCwgewoJCQkJbWV0aG9kOiAnZ2V0JywKCQkJCXBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyAr +IGFyZ3MsCgkJCQlvblN1Y2Nlc3M6IChmdW5jdGlvbih0cmFuc3BvcnQpIHsKCgkJCQkJdmFyIGpz +b24gPSB0cmFuc3BvcnQucmVzcG9uc2VUZXh0LmV2YWxKU09OKCk7CgkJCQkJdmFyIGRhdGEgPSBq +c29uLmRhdGE7CgkKCQkJCQlpZiggZGF0YSA9PSBudWxsICkKCQkJCQkJZGF0YSA9IG5ldyBBcnJh +eSgpOwoJCQkJCWZvciggdmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrICkKCQkJCQl7CgkJCQkJ +CXZhciBlbnRyeSA9IGRhdGFbaV07CgkJCQkKCQkJCQkJLy8gZW50cnkuZGF0YW9iamlkCgkJCQkJ +CS8vIGVudHJ5LnN1bW1hcnkKCQkJCQkJLy8gZW50cnkuZ3JvdXBpbmcKCQkJCQkJLy8gZW50cnku +cHJvYmxlbXMKCgkJCQkJCWlmKCBlbnRyeSA9PSBudWxsICkKCQkJCQkJCWNvbnRpbnVlOwoJCQkJ +CQkKCQkJCQkJdmFyIGRhdGFvYmppZCA9IGVudHJ5LmRhdGFvYmppZDsKCQkJCQkJaWYoIGRhdGFv +YmppZCA9PSBudWxsICkKCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQlpZiggIShkYXRhb2JqaWQgaW4g +ZGF0YW9ianMpICkKCQkJCQkJewoJCQkJCQkJdGhpcy5jb3VudCsrOwoJCQkJCQkJZGF0YW9ianNb +ZGF0YW9iamlkXSA9IGVudHJ5OwoJCQkJCQl9CgkJCQkJfQoJCQkKCQkJCQkvLyB3ZSd2ZSByZXRy +aWV2ZWQgYWxsIHRoZSByZWNvcmRzCQkJCQoJCQkJCWlmKCB0aGlzLmNvdW50ID09IHRoaXMubm9f +aXRlbXMgKQoJCQkJCXsKCQkJCQkJJCggdGhpcy5wcmVmaXggKyAnX3Byb2dyZXNzX2JhcicgKS5y +ZW1vdmUoKTsKCQkJCQkJaWYoIHRoaXMuaGFzX3Byb2JsZW1zICkKCQkJCQkJCXRoaXMub25Qcm9i +bGVtcyh0aGlzKTsKCQkJCQkJdGhpcy5vbkZpbmlzaCh0aGlzKTsKCQkJCQkJCQoJCQkJCQkvL2Fk +ZCB0aGUgZ3JvdXAgaGVhZGluZ3MKCQkJCQkJaWYoZ3JvdXBlZCkKCQkJCQkJewoJCQkJCQkJdmFy +IHBvc2l0aW9uID0gMDsKCQkJCQkJCWZvciggdmFyIGkgPSAwOyBpIDwgdGhpcy5ncm91cGVkX2lk +cy5sZW5ndGg7IGkrKyApCgkJCQkgICAgICAgICAgICAgICAgICAgICAgICB7CQoJCQkJCQkJCXZh +ciB0YXJnZXRfZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcG9zaXRpb249IicgKyBw +b3NpdGlvbiArICciXScpWzBdOwoJCQkJCQkJCXBvc2l0aW9uID0gcG9zaXRpb24gKyB0aGlzLmdy +b3VwZWRfaWRzW2ldLmxpc3QubGVuZ3RoOwkJCQoJCQkJCQkJCXZhciBncm91cGluZ19jb250YWlu +ZXIgPSBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9ncm91cGluZycg +fSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgdGFyZ2V0X2VsLmluc2VydCggeyAnYmVmb3JlJyA6IGdyb3VwaW5nX2NvbnRh +aW5lciB9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICBncm91cGluZ19jb250YWluZXIudXBkYXRlKCB0aGlzLmdyb3VwZWRf +aWRzW2ldLmxhYmVsICk7CgkJCQkgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJCX0KCgkJ +CQkJCS8vYWRkIHRoZSBlcHJpbnQgc3VtbWFyaWVzCgkJCQkJCXZhciBhZGRlZF9pZHMgPSB7fTsK +CQkJCQkJZm9yKCB2YXIgYyA9IDA7IGMgPCB0aGlzLmlkcy5sZW5ndGg7IGMrKyApCgkJCQkJCXsK +CQkJCQkJCXZhciBkYXRhb2JqaWQgPSB0aGlzLmlkc1tjXTsKCQkJCQkJCXZhciBlbnRyeSA9IGRh +dGFvYmpzW2RhdGFvYmppZF07CgoJCQkJCQkJLy9zdG9yZSB0aGF0IHdlIGhhdmUgYWRkZWQgdGhp +cyBvYmplY3RpZAoJCQkJCQkJaWYoICEoZGF0YW9iamlkIGluIGFkZGVkX2lkcykgKQoJCQkJCQkJ +ewoJCQkJCQkJCWFkZGVkX2lkc1tkYXRhb2JqaWRdID0gMDsKCQkJCQkJCX0KCQkJCQkJCWVsc2UK +CQkJCQkJCXsKCQkJCQkJCQlhZGRlZF9pZHNbZGF0YW9iamlkXSA9IGFkZGVkX2lkc1tkYXRhb2Jq +aWRdICsgMTsKCQkJCQkJCX0KCQkJCQkJCXRoaXMudG90YWxfZGF0YW9ianMrKzsKCgkJCQkJCQl2 +YXIgc3VtbWFyeSA9IGVudHJ5LnN1bW1hcnk7CgoJCQkJCQkJdmFyIHRhcmdldF9pZCA9IHRoaXMu +cHJlZml4ICsgJ18nICsgZGF0YW9iamlkOwoJCQkJCQkJaWYoIGFkZGVkX2lkc1tkYXRhb2JqaWRd +ID4gMCApCgkJCQkJCQl7CgkJCQkJCQkJdGFyZ2V0X2lkID0gdGFyZ2V0X2lkICsgJ18nICsgYWRk +ZWRfaWRzW2RhdGFvYmppZF07CgkJCQkJCQl9CgkJCQkJCQl2YXIgdGFyZ2V0X2VsID0gJCggdGFy +Z2V0X2lkICk7CgoJCQkJCQkJaWYoIHRhcmdldF9lbCAhPSBudWxsICYmIHN1bW1hcnkgIT0gbnVs +bCApCgkJCQkJCQl7CgkJCQkJCQkJdmFyIHN1bW1hcnlfZWwgPSB0YXJnZXRfZWwuYXBwZW5kQ2hp +bGQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X3Jvd19zdW1tYXJ5 +JyB9ICkgKTsKCQkJCQkJCQlzdW1tYXJ5X2VsLnVwZGF0ZSggc3VtbWFyeSApOwoKCQkJCQkJCQkv +L3RvdGFsIHVwIG5vbiBjb21wbGlhbnQgcmVjb3JkcwoJCQkJCQkJCWlmKCBlbnRyeS5pc19jb21w +bGlhbnQgPT0gbnVsbCAmJiBlbnRyeS5wcm9ibGVtcyAmJiBlbnRyeS5wcm9ibGVtcy5sZW5ndGgg +KQoJCQkJCQkJCXsKCQkJCQkJCQkJdGhpcy50b3RhbF9ub25jb21wbGlhbnQrKzsKCQkJCQkJCQl9 +CgkJCQkJCQkJCgkJCQkJCQkJaWYoIGVudHJ5LnByb2JsZW1zICYmIGVudHJ5LnByb2JsZW1zLmxl +bmd0aCApCgkJCQkJCQkJewoJCQkJCQkJCQl2YXIgcHJvYmxlbXNfZWwgPSB0YXJnZXRfZWwuYXBw +ZW5kQ2hpbGQoIG5ldyBFbGVtZW50KCAndWwnLCB7ICdjbGFzcyc6ICdlcF9yZXBvcnRfcm93X3By +b2JsZW1zJyB9ICkgKTsKCgkJCQkJCQkJCWZvciggdmFyIHA9MDsgcDwgZW50cnkucHJvYmxlbXMu +bGVuZ3RoOyBwKysgKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl2YXIgbGkgPSBwcm9ibGVtc19lbC5h +cHBlbmRDaGlsZCggbmV3IEVsZW1lbnQoICdsaScgKSk7CgkJCQkJCQkJCQlsaS51cGRhdGUoIGVu +dHJ5LnByb2JsZW1zW3BdICk7CgkJCQkJCQkJCX0JCQkJCQkJCQoJCQkJCQkJCX0KCQkJCQkJCQll +bHNlCgkJCQkJCQkJewoJCQkJCQkJCQkvL2FkZCBzdXBwb3J0IGZvciBjb21wbGlhbnQgaXRlbXMg +dG8gaW5jbHVkZSBidWxsZXQgcG9pbnRzIHRvbwoJCQkJCQkJCQlpZiggZW50cnkuYnVsbGV0cyAm +JiBlbnRyeS5idWxsZXRzLmxlbmd0aCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgZm9yKCB2YXIgYj0wOyBiPCBlbnRyeS5idWxsZXRzLmxlbmd0aDsgYisrICkK +ICAgICAgICB2YXIgYnVsbGV0c19lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGlsZCggbmV3IEVsZW1l +bnQoICd1bCcsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9yb3dfYnVsbGV0cycgfSApICk7CgogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2 -YXIgbGkgPSBidWxsZXRzX2VsLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ2xpJyApKTsKICAg +ICAgICAgICAgICAgICAgICAgIGZvciggdmFyIGI9MDsgYjwgZW50cnkuYnVsbGV0cy5sZW5ndGg7 +IGIrKyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpLnVwZGF0ZSggZW50cnkuYnVsbGV0c1tiXSAp -OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoJCQkJCQkJCX0KCgkJ -CQkJCQkJLy9kaXNwbGF5IHN0YXRlCgkJCQkJCQkJdmFyIHJlID0gbmV3IFJlZ0V4cCgiXiMoPzpb -MC05YS1mQS1GXXszfSl7MSwyfSQiKTsKCQkJCQkJCQlpZiggZW50cnkuc3RhdGUgJiYgcmUudGVz -dChlbnRyeS5zdGF0ZSkgKQoJCQkJCQkJCXsKCQkJCQkJCQkJdGFyZ2V0X2VsLnN0eWxlLmJvcmRl -ckxlZnRXaWR0aCA9ICc3cHgnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZWwuc3R5bGUuYm9yZGVy -TGVmdFN0eWxlID0gJ3NvbGlkJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2VsLnN0eWxlLmJvcmRl -ckxlZnRDb2xvciA9IGVudHJ5LnN0YXRlOwoJCQkJCQkJCX0KCQkJCQkJCQllbHNlIC8vbm8gc3Rh -dGUgcHJvdmlkZWQsIHNvIGRlcml2ZSBvbmUgZnJvbSBleGlzdGVuY2Ugb2YgcHJvYmxlbXMKCQkJ -CQkJCQl7CgkJCQkJCQkJCWlmKCBlbnRyeS5wcm9ibGVtcyAmJiBlbnRyeS5wcm9ibGVtcy5sZW5n -dGggKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl0YXJnZXRfZWwuYWRkQ2xhc3NOYW1lKCAnZXBfcmVw -b3J0X3Jvd19wcm9ibGVtcycgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCXsK -CQkJCQkJCQkJCXRhcmdldF9lbC5hZGRDbGFzc05hbWUoICdlcF9yZXBvcnRfcm93X29rJyApOwoJ -CQkJCQkJCQl9CgoJCQkJCQkJCQlpZiggIXRoaXMuc2hvd19jb21wbGlhbmNlICkKCQkJCQkJCQkJ -ewoJCQkJCQkJCQkJdGFyZ2V0X2VsLmFkZENsYXNzTmFtZSggJ2VwX3JlcG9ydF9yb3dfbm9fY29t -cGxpYW5jZScgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0JCQkJCQkJCQoJCQkJCQkJCXRhcmdldF9l -bC5zaG93KCk7CgoJCQkJCQkJCXZhciBncm91cGluZyA9IGVudHJ5Lmdyb3VwaW5nOwoJCQkJCQkJ -CWlmKCBncm91cGluZyAhPSBudWxsICkKCQkJCQkJCQl7CgkJCQkJCQkJCWlmKCBjdXJyZW50X2dy -b3VwaW5nID09IG51bGwgfHwgY3VycmVudF9ncm91cGluZyAhPSBncm91cGluZykKCQkJCQkJCQkJ -ewoJCQkJCQkJCQkJY3VycmVudF9ncm91cGluZyA9IGdyb3VwaW5nOwoJCQkJCQkJCQkJdmFyIGdy -b3VwaW5nX2NvbnRhaW5lciA9IG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVw -b3J0X2dyb3VwaW5nJyB9ICk7CgkJCQkJCQkJCQl0YXJnZXRfZWwuaW5zZXJ0KCB7ICdiZWZvcmUn -IDogZ3JvdXBpbmdfY29udGFpbmVyIH0gKTsKCQkJCQkJCQkJCWdyb3VwaW5nX2NvbnRhaW5lci51 -cGRhdGUoIGN1cnJlbnRfZ3JvdXBpbmcgKTsKCQkJCQkJCQkJfQoJCQkJCQkJCX0KCQkJCQkJCX0K -CQkJCQkJfQoKCgkJCQkJCWlmKCB0aGlzLnRvdGFsX2RhdGFvYmpzICkKCQkJCQkJewoJCQkJCQkJ -CgkJCQkJCQl0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoIG5ldyBFbGVtZW50KCAnZGl2Jywg -eyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2VfY29udGFpbmVyJywgJ2lkJzogdGhpcy5w -cmVmaXggKyAiX2NvbXBsaWFuY2VfY29udGFpbmVyIiB9ICksIHRoaXMuY29udGFpbmVyLmZpcnN0 -Q2hpbGQgKTsKCQkJCQkJCS8vc2V0IHVwIHRleHQgY29udGFpbmVyCgkJCQkJCQkkKCB0aGlzLnBy -ZWZpeCArICJfY29tcGxpYW5jZV9jb250YWluZXIiICkuYXBwZW5kQ2hpbGQoIG5ldyBFbGVtZW50 -KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2VfdGV4dCcsICdpZCc6IHRo -aXMucHJlZml4ICsgIl9jb21wbGlhbmNlX3RleHQiLCAgfSApKTsKCgkJCQkJCQkvL3NldCB1cCBv -dXRwdXRzIGxhYmVsCgkJCQkJCQl2YXIgb3V0cHV0czsKCQkJCQkJCWlmKCB0aGlzLmxhYmVscyAp -CgkJCQkJCQl7CgkJCQkJCQkJb3V0cHV0cyA9IHRoaXMubGFiZWxzLm91dHB1dHM7CgkJCQkJCQl9 -CgkJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJCQkJb3V0cHV0cyA9ICJvdXRwdXQiOwoJCQkJCQkJ -CWlmKCB0aGlzLnRvdGFsX2RhdGFvYmpzID4gMSApCgkJCQkJCQkJCW91dHB1dHMgPSBvdXRwdXRz -ICsgInMiOwoJCQkJCQkJfQoKCQkJCQkJCWlmKCB0aGlzLnNob3dfY29tcGxpYW5jZSApCgkJCQkJ -CQl7CgkJCQkJCQkJdmFyIHJlZl93aWR0aCA9IDIwMDsKCQkJCQkJCQl2YXIgY29tcGxpYW5jZSA9 -ICggdGhpcy50b3RhbF9kYXRhb2JqcyAtIHRoaXMudG90YWxfbm9uY29tcGxpYW50ICkgLyB0aGlz -LnRvdGFsX2RhdGFvYmpzOwoKCQkJCQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV9j -b250YWluZXIiICkuYXBwZW5kQ2hpbGQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAn -ZXBfcmVwb3J0X2NvbXBsaWFuY2Vfd3JhcHBlcicsICdpZCc6IHRoaXMucHJlZml4ICsgIl9jb21w -bGlhbmNlIiwgJ3N0eWxlJzogJ3dpZHRoOiAnK3JlZl93aWR0aCArICdweCcgfSApICk7CgoJCQkJ -CQkJCXZhciBjb21wbGlhbmNlX3dpZHRoID0gTWF0aC5mbG9vciggMjAwICogY29tcGxpYW5jZSAp -OwoJCgkJCQkJCQkJJCggdGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2UiICkuYXBwZW5kQ2hpbGQo -IG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2UnLCAn -c3R5bGUnOiAnd2lkdGg6Jytjb21wbGlhbmNlX3dpZHRoICsgJ3B4JyB9ICkgKTsKCQoJCQkJCQkJ -CSQoIHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlX3RleHQiICkudXBkYXRlKCB0aGlzLnRvdGFs -X2RhdGFvYmpzICsgIiAiICsgb3V0cHV0cyArICIgLSAiICsgTWF0aC5mbG9vciggY29tcGxpYW5j -ZSAqIDEwMCApICsgIiUgY29tcGxpYW5jZSIpOwoJCQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJ -ewoJCQkJCQkJCSQoIHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlX3RleHQiICkudXBkYXRlKCB0 -aGlzLnRvdGFsX2RhdGFvYmpzICsgIiAiICsgb3V0cHV0cyApOwoJCQkJCQkJfQoJCQkJCQl9CQoK -CQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJdmFyIHdpZHRoID0gMjAwOwoJCQkJCQkkKCB0 -aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJyApLnN0eWxlLmJhY2tncm91bmRQb3NpdGlvbiA9 -IE1hdGgucm91bmQoLXdpZHRoICsgd2lkdGggKiB0aGlzLmNvdW50IC8gdGhpcy5pZHMubGVuZ3Ro -KSArICJweCAwcHgiOwoJCQkJCX0KCgkJCQkJaWYoIHRoaXMucnVucyA9PSAwICYmIHRoaXMuY291 -bnQgPT0gMCApCgkJCQkJewoJCQkJCQl2YXIgcE5vZGUgPSAkKCB0aGlzLnByZWZpeCArICdfcHJv -Z3Jlc3NfYmFyJyApLnBhcmVudE5vZGU7CgkJCQkJCSQodGhpcy5wcmVmaXggKyAnX3Byb2dyZXNz -X2JhcicpLnJlbW92ZSgpOwoJCQkJCQl2YXIgc3BhbiA9IG5ldyBFbGVtZW50KCAnc3BhbicsIHsg -J2NsYXNzJzogJ2VwX3JlZl9yZXBvcnRfZW1wdHknIH0gKTsKCQkJCQkJc3Bhbi51cGRhdGUoICdS -ZXBvcnQgZW1wdHknICk7CgkJCQkJCXBOb2RlLmluc2VydCggc3BhbiApOwoJCQkJCX0KCQkJCQl0 -aGlzLnJ1bnMrKzsKCgkJCQl9KS5iaW5kKHRoaXMpCgkJCX0pOwoJCX0KCQlpZiggdGhpcy5pZHMg -PT0gbnVsbCB8fCB0aGlzLmlkcy5sZW5ndGggPT0gMCApCgkJewoJCQl2YXIgcE5vZGUgPSAkKHRo -aXMucHJlZml4ICsgJ19wcm9ncmVzc19iYXInKS5wYXJlbnROb2RlOwoJCQkkKHRoaXMucHJlZml4 -ICsgJ19wcm9ncmVzc19iYXInKS5oaWRlKCk7CgkJCXZhciBzcGFuID0gbmV3IEVsZW1lbnQoICdz -cGFuJywgeyAnY2xhc3MnOiAnZXBfcmVmX3JlcG9ydF9lbXB0eScgfSApOwoJCQlzcGFuLnVwZGF0 -ZSggJ1JlcG9ydCBlbXB0eScgKTsKCQkJcE5vZGUuaW5zZXJ0KCBzcGFuICk7CgkJfQoJfQoKCn0p -OwoKZnVuY3Rpb24gZ3JvdXBfcmVwb3J0KGdyb3VwKQp7Cglkb2N1bWVudC5ncm91cF9yZXBvcnQu -Z3JvdXAudmFsdWUgPSBncm91cDsKCWRvY3VtZW50Lmdyb3VwX3JlcG9ydC5zdWJtaXQoKTsKfQoK -ZnVuY3Rpb24gc29ydF9yZXBvcnQoc29ydCkKewoJZG9jdW1lbnQuc29ydF9yZXBvcnQuc29ydC52 -YWx1ZSA9IHNvcnQ7Cglkb2N1bWVudC5zb3J0X3JlcG9ydC5zdWJtaXQoKTsKfQoKZnVuY3Rpb24g -aXNJbnRlZ2VyKG51bSkgewogIHJldHVybiAobnVtIF4gMCkgPT09IG51bTsKfQo= +ICAgICAgdmFyIGxpID0gYnVsbGV0c19lbC5hcHBlbmRDaGlsZCggbmV3IEVsZW1lbnQoICdsaScg +KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS51cGRhdGUoIGVudHJ5LmJ1bGxl +dHNbYl0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCQkJ +CQl9CgoJCQkJCQkJCS8vZGlzcGxheSBzdGF0ZQoJCQkJCQkJCXZhciByZSA9IG5ldyBSZWdFeHAo +Il4jKD86WzAtOWEtZkEtRl17M30pezEsMn0kIik7CgkJCQkJCQkJaWYoIGVudHJ5LnN0YXRlICYm +IHJlLnRlc3QoZW50cnkuc3RhdGUpICkKCQkJCQkJCQl7CgkJCQkJCQkJCXRhcmdldF9lbC5zdHls +ZS5ib3JkZXJMZWZ0V2lkdGggPSAnN3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2VsLnN0eWxl +LmJvcmRlckxlZnRTdHlsZSA9ICdzb2xpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9lbC5zdHls +ZS5ib3JkZXJMZWZ0Q29sb3IgPSBlbnRyeS5zdGF0ZTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZSAv +L25vIHN0YXRlIHByb3ZpZGVkLCBzbyBkZXJpdmUgb25lIGZyb20gZXhpc3RlbmNlIG9mIHByb2Js +ZW1zCgkJCQkJCQkJewoJCQkJCQkJCQlpZiggZW50cnkucHJvYmxlbXMgJiYgZW50cnkucHJvYmxl +bXMubGVuZ3RoICkKCQkJCQkJCQkJewoJCQkJCQkJCQkJdGFyZ2V0X2VsLmFkZENsYXNzTmFtZSgg +J2VwX3JlcG9ydF9yb3dfcHJvYmxlbXMnICk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJ +CQkJCQl7CgkJCQkJCQkJCQl0YXJnZXRfZWwuYWRkQ2xhc3NOYW1lKCAnZXBfcmVwb3J0X3Jvd19v +aycgKTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYoICF0aGlzLnNob3dfY29tcGxpYW5jZSApCgkJ +CQkJCQkJCXsKCQkJCQkJCQkJCXRhcmdldF9lbC5hZGRDbGFzc05hbWUoICdlcF9yZXBvcnRfcm93 +X25vX2NvbXBsaWFuY2UnICk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CQkJCQkJCQkKCQkJCQkJCQl0 +YXJnZXRfZWwuc2hvdygpOwoKCQkJCQkJCQl2YXIgZ3JvdXBpbmcgPSBlbnRyeS5ncm91cGluZzsK +CQkJCQkJCQlpZiggZ3JvdXBpbmcgIT0gbnVsbCApCgkJCQkJCQkJewoJCQkJCQkJCQlpZiggY3Vy +cmVudF9ncm91cGluZyA9PSBudWxsIHx8IGN1cnJlbnRfZ3JvdXBpbmcgIT0gZ3JvdXBpbmcpCgkJ +CQkJCQkJCXsKCQkJCQkJCQkJCWN1cnJlbnRfZ3JvdXBpbmcgPSBncm91cGluZzsKCQkJCQkJCQkJ +CXZhciBncm91cGluZ19jb250YWluZXIgPSBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzog +J2VwX3JlcG9ydF9ncm91cGluZycgfSApOwoJCQkJCQkJCQkJdGFyZ2V0X2VsLmluc2VydCggeyAn +YmVmb3JlJyA6IGdyb3VwaW5nX2NvbnRhaW5lciB9ICk7CgkJCQkJCQkJCQlncm91cGluZ19jb250 +YWluZXIudXBkYXRlKCBjdXJyZW50X2dyb3VwaW5nICk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJ +CQkJCQl9CgkJCQkJCX0KCgoJCQkJCQlpZiggdGhpcy50b3RhbF9kYXRhb2JqcyApCgkJCQkJCXsK +CQkJCQkJCQoJCQkJCQkJdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKCBuZXcgRWxlbWVudCgg +J2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX2NvbnRhaW5lcicsICdpZCc6 +IHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlX2NvbnRhaW5lciIgfSApLCB0aGlzLmNvbnRhaW5l +ci5maXJzdENoaWxkICk7CgkJCQkJCQkvL3NldCB1cCB0ZXh0IGNvbnRhaW5lcgoJCQkJCQkJJCgg +dGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2VfY29udGFpbmVyIiApLmFwcGVuZENoaWxkKCBuZXcg +RWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX3RleHQnLCAn +aWQnOiB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiwgIH0gKSk7CgoJCQkJCQkJLy9z +ZXQgdXAgb3V0cHV0cyBsYWJlbAoJCQkJCQkJdmFyIG91dHB1dHM7CgkJCQkJCQlpZiggdGhpcy5s +YWJlbHMgKQoJCQkJCQkJewoJCQkJCQkJCW91dHB1dHMgPSB0aGlzLmxhYmVscy5vdXRwdXRzOwoJ +CQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCW91dHB1dHMgPSAib3V0cHV0IjsK +CQkJCQkJCQlpZiggdGhpcy50b3RhbF9kYXRhb2JqcyA+IDEgKQoJCQkJCQkJCQlvdXRwdXRzID0g +b3V0cHV0cyArICJzIjsKCQkJCQkJCX0KCgkJCQkJCQlpZiggdGhpcy5zaG93X2NvbXBsaWFuY2Ug +KQoJCQkJCQkJewoJCQkJCQkJCXZhciByZWZfd2lkdGggPSAyMDA7CgkJCQkJCQkJdmFyIGNvbXBs +aWFuY2UgPSAoIHRoaXMudG90YWxfZGF0YW9ianMgLSB0aGlzLnRvdGFsX25vbmNvbXBsaWFudCAp +IC8gdGhpcy50b3RhbF9kYXRhb2JqczsKCgkJCQkJCQkJJCggdGhpcy5wcmVmaXggKyAiX2NvbXBs +aWFuY2VfY29udGFpbmVyIiApLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2Ns +YXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX3dyYXBwZXInLCAnaWQnOiB0aGlzLnByZWZpeCAr +ICJfY29tcGxpYW5jZSIsICdzdHlsZSc6ICd3aWR0aDogJytyZWZfd2lkdGggKyAncHgnIH0gKSAp +OwoKCQkJCQkJCQl2YXIgY29tcGxpYW5jZV93aWR0aCA9IE1hdGguZmxvb3IoIDIwMCAqIGNvbXBs +aWFuY2UgKTsKCQoJCQkJCQkJCSQoIHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlIiApLmFwcGVu +ZENoaWxkKCBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlh +bmNlJywgJ3N0eWxlJzogJ3dpZHRoOicrY29tcGxpYW5jZV93aWR0aCArICdweCcgfSApICk7CgkK +CQkJCQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiApLnVwZGF0ZSggdGhp +cy50b3RhbF9kYXRhb2JqcyArICIgIiArIG91dHB1dHMgKyAiIC0gIiArIE1hdGguZmxvb3IoIGNv +bXBsaWFuY2UgKiAxMDAgKSArICIlIGNvbXBsaWFuY2UiKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UK +CQkJCQkJCXsKCQkJCQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiApLnVw +ZGF0ZSggdGhpcy50b3RhbF9kYXRhb2JqcyArICIgIiArIG91dHB1dHMgKTsKCQkJCQkJCX0KCQkJ +CQkJfQkKCgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXZhciB3aWR0aCA9IDIwMDsKCQkJ +CQkJJCggdGhpcy5wcmVmaXggKyAnX3Byb2dyZXNzX2JhcicgKS5zdHlsZS5iYWNrZ3JvdW5kUG9z +aXRpb24gPSBNYXRoLnJvdW5kKC13aWR0aCArIHdpZHRoICogdGhpcy5jb3VudCAvIHRoaXMuaWRz +Lmxlbmd0aCkgKyAicHggMHB4IjsKCQkJCQl9CgoJCQkJCWlmKCB0aGlzLnJ1bnMgPT0gMCAmJiB0 +aGlzLmNvdW50ID09IDAgKQoJCQkJCXsKCQkJCQkJdmFyIHBOb2RlID0gJCggdGhpcy5wcmVmaXgg +KyAnX3Byb2dyZXNzX2JhcicgKS5wYXJlbnROb2RlOwoJCQkJCQkkKHRoaXMucHJlZml4ICsgJ19w +cm9ncmVzc19iYXInKS5yZW1vdmUoKTsKCQkJCQkJdmFyIHNwYW4gPSBuZXcgRWxlbWVudCggJ3Nw +YW4nLCB7ICdjbGFzcyc6ICdlcF9yZWZfcmVwb3J0X2VtcHR5JyB9ICk7CgkJCQkJCXNwYW4udXBk +YXRlKCAnUmVwb3J0IGVtcHR5JyApOwoJCQkJCQlwTm9kZS5pbnNlcnQoIHNwYW4gKTsKCQkJCQl9 +CgkJCQkJdGhpcy5ydW5zKys7CgoJCQkJfSkuYmluZCh0aGlzKQoJCQl9KTsKCQl9CgkJaWYoIHRo +aXMuaWRzID09IG51bGwgfHwgdGhpcy5pZHMubGVuZ3RoID09IDAgKQoJCXsKCQkJdmFyIHBOb2Rl +ID0gJCh0aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJykucGFyZW50Tm9kZTsKCQkJJCh0aGlz +LnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJykuaGlkZSgpOwoJCQl2YXIgc3BhbiA9IG5ldyBFbGVt +ZW50KCAnc3BhbicsIHsgJ2NsYXNzJzogJ2VwX3JlZl9yZXBvcnRfZW1wdHknIH0gKTsKCQkJc3Bh +bi51cGRhdGUoICdSZXBvcnQgZW1wdHknICk7CgkJCXBOb2RlLmluc2VydCggc3BhbiApOwoJCX0K +CX0KCgp9KTsKCmZ1bmN0aW9uIGdyb3VwX3JlcG9ydChncm91cCkKewoJZG9jdW1lbnQuZ3JvdXBf +cmVwb3J0Lmdyb3VwLnZhbHVlID0gZ3JvdXA7Cglkb2N1bWVudC5ncm91cF9yZXBvcnQuc3VibWl0 +KCk7Cn0KCmZ1bmN0aW9uIHNvcnRfcmVwb3J0KHNvcnQpCnsKCWRvY3VtZW50LnNvcnRfcmVwb3J0 +LnNvcnQudmFsdWUgPSBzb3J0OwoJZG9jdW1lbnQuc29ydF9yZXBvcnQuc3VibWl0KCk7Cn0KCmZ1 +bmN0aW9uIGlzSW50ZWdlcihudW0pIHsKICByZXR1cm4gKG51bSBeIDApID09PSBudW07Cn0K document static/style/auto/reports.css text/x-asm - 04cbc93d0515c56f56929cd6a16f5a44 + ea07a35607af90bafc7aed4c77da1242 MD5 - 2151 + 2244 ZGl2LmVwX3JlcG9ydF9yb3cgewoJcGFkZGluZzogNXB4IDVweDsKCW1hcmdpbi1ib3R0b206IDVw eDsKfQoKZGl2LmVwX3JlcG9ydF9yb3dfcHJvYmxlbXMgewoJYm9yZGVyLWxlZnQ6IHNvbGlkIDdw eCAjQzQxRjFGOwp9CgpkaXYuZXBfcmVwb3J0X3Jvd19vayB7CiAgICAgICAgYm9yZGVyLWxlZnQ6 @@ -2438,9 +2460,11 @@ b3J0X29wdGlvbnMgdWwKewoJcGFkZGluZzogMCAxMHB4IDAgMDsKfQoKI2VwX3JlcG9ydF9leHBv cnRfY29udGVudF9pbm5lciAuc2VsZWN0X2J1dHRvbgp7CiAgICAgICAgZmxvYXQ6IHJpZ2h0Owp9 CgojY3VzdG9tX3JlcG9ydCAuZXBfc2VhcmNoX2J1dHRvbnMgPiBkaXYKewogICAgICAgIGRpc3Bs YXk6IGlubGluZS1ibG9jazsKfQoKI2N1c3RvbV9yZXBvcnQgLmVwX3NlYXJjaF9idXR0b25zIC5j -bGVhcl9idXR0b24KewogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7Cn0KCi8qIEhUTUwgUmVwb3J0 -cyAqLwphLmh0bWxfcmVwb3J0X3ByaW50ewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKfQoKYS5o -dG1sX3JlcG9ydF9wcmludDpob3ZlcnsKCWNvbG9yOiB3aGl0ZTsJCn0K +bGVhcl9idXR0b24KewogICAgICAgIG1hcmdpbi1sZWZ0OiAycHg7Cn0KCiNyZXBvcnRfc2VsZWN0 +X2xhYmVsLCAjZXhwb3J0X3NlbGVjdF9sYWJlbAp7CiAgICBmb250LXdlaWdodDogNzAwOwogICAg +bWFyZ2luLXJpZ2h0OiA1cHg7Cn0KCi8qIEhUTUwgUmVwb3J0cyAqLwphLmh0bWxfcmVwb3J0X3By +aW50ewoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwkKfQoKYS5odG1sX3JlcG9ydF9wcmludDpob3Zl +cnsKCWNvbG9yOiB3aGl0ZTsJCn0K @@ -2896,7 +2920,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.3 + 3.4 diff --git a/reports.epmi b/reports.epmi index cb1a74e..4beefff 100644 --- a/reports.epmi +++ b/reports.epmi @@ -33,9 +33,9 @@ document lang/en/phrases/reports.xml application/xml - f344518160d45ccd1d1709a926d9e6d1 + e039be104215776aa32fecaa24ed3d59 MD5 - 2563 + 2701 document @@ -97,9 +97,9 @@ document plugins/EPrints/Plugin/Screen/Report.pm text/plain - d694685745fab90a5d9960238240662a + 2c4683e23b226dbc06eda9f63d03a1bc MD5 - 43946 + 44999 document @@ -153,17 +153,17 @@ document static/javascript/auto/reports.js text/plain - d02c8742a8d57f71e94e1c62635b94de + 71e1a869fbb7241f7fcc4027acc5a6f8 MD5 - 12701 + 12708 document static/style/auto/reports.css text/x-asm - 04cbc93d0515c56f56929cd6a16f5a44 + ea07a35607af90bafc7aed4c77da1242 MD5 - 2151 + 2244 text/x-asm @@ -187,7 +187,7 @@ coverimage - 3.3 + 3.4 From f061589d3d7b22a268eaf8f9659480a3bc959965 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Fri, 11 Feb 2022 11:31:17 +0000 Subject: [PATCH 05/11] Add byte order marker to CSV export + config to turn it on or off, to help Excel display CSV exports better --- cfg/cfg.d/z_reports.pl | 2 + .../EPrints/Plugin/Export/Report/CSV.pm | 16 +- reports.epm | 147 +++++++++--------- reports.epmi | 10 +- 4 files changed, 98 insertions(+), 77 deletions(-) diff --git a/cfg/cfg.d/z_reports.pl b/cfg/cfg.d/z_reports.pl index a36485b..b1a7291 100644 --- a/cfg/cfg.d/z_reports.pl +++ b/cfg/cfg.d/z_reports.pl @@ -17,6 +17,8 @@ $c->{plugins}{"Screen::Report::User"}{params}{disable} = 0; $c->{plugins}{"Screen::Report::User"}{params}{custom} = 1; +$c->{reports}->{csv_utf8_bom} = 1; + #set config for default eprint report $c->{search}->{eprint_report} = $c->{search}->{advanced}; #use the advanced search form as the default eprint report search diff --git a/lib/plugins/EPrints/Plugin/Export/Report/CSV.pm b/lib/plugins/EPrints/Plugin/Export/Report/CSV.pm index cbf7b5d..02d98b6 100644 --- a/lib/plugins/EPrints/Plugin/Export/Report/CSV.pm +++ b/lib/plugins/EPrints/Plugin/Export/Report/CSV.pm @@ -20,9 +20,23 @@ sub new return $self; } +sub initialise_fh +{ + my( $plugin, $fh ) = @_; + + $plugin->SUPER::initialise_fh( $fh ); + + # include UTF-8 byte order marker so Excel knows how to display the conten + my $repo = $plugin->repository; + if( $repo->config( "reports", "csv_utf8_bom" ) ) + { + print $fh chr(65279); + } +} + sub output_list { - my( $plugin, %opts ) = @_; + my( $plugin, %opts ) = @_; my $repo = $plugin->repository; diff --git a/reports.epm b/reports.epm index 87a12df..be863e3 100644 --- a/reports.epm +++ b/reports.epm @@ -44,9 +44,9 @@ cGxlX2ZpZWxkcyB9Owo= document epm/reports/cfg/cfg.d/z_reports.pl text/plain - 48c622ad150bea255ba6fbee7e37083b + e0c09c35dc9b17fa48a00ad0555653fc MD5 - 2869 + 2905 IwojIEVQcmludHMgU2VydmljZXMgLSBHZW5lcmljIFJlcG9ydGluZyBTeXN0ZW0KIwojIFZlcnNp b246IDMuMAojCgoKJGMtPntwbHVnaW5zfXsiU2NyZWVuOjpSZXBvcnQifXtwYXJhbXN9e2Rpc2Fi bGV9ID0gMDsKCiRjLT57cGx1Z2luc317IkV4cG9ydDo6UmVwb3J0In17cGFyYW1zfXtkaXNhYmxl @@ -57,47 +57,47 @@ e2Rpc2FibGV9ID0gMDsKCiRjLT57cGx1Z2luc317IlNjcmVlbjo6UmVwb3J0OjpFUHJpbnQifXtw YXJhbXN9e2Rpc2FibGV9ID0gMDsKJGMtPntwbHVnaW5zfXsiU2NyZWVuOjpSZXBvcnQ6OkVQcmlu dCJ9e3BhcmFtc317Y3VzdG9tfSA9IDE7CiRjLT57cGx1Z2luc317IlNjcmVlbjo6UmVwb3J0OjpV c2VyIn17cGFyYW1zfXtkaXNhYmxlfSA9IDA7CiRjLT57cGx1Z2luc317IlNjcmVlbjo6UmVwb3J0 -OjpVc2VyIn17cGFyYW1zfXtjdXN0b219ID0gMTsKCiNzZXQgY29uZmlnIGZvciBkZWZhdWx0IGVw -cmludCByZXBvcnQKJGMtPntzZWFyY2h9LT57ZXByaW50X3JlcG9ydH0gPSAkYy0+e3NlYXJjaH0t -PnthZHZhbmNlZH07ICN1c2UgdGhlIGFkdmFuY2VkIHNlYXJjaCBmb3JtIGFzIHRoZSBkZWZhdWx0 -IGVwcmludCByZXBvcnQgc2VhcmNoCgojZ3JvdXAgYnkgb3B0aW9ucwokYy0+e2VwcmludF9yZXBv -cnR9LT57Z3JvdXBmaWVsZHN9ID0gWyBxdygKCWRpdmlzaW9ucwoJc3ViamVjdHMKICAgICAgICB0 -eXBlCglkYXRlO3Jlcz15ZWFyO3JldmVyc2Vfb3JkZXI9MQopXTsKCiNzb3J0IG9wdGlvbnMgZm9y -IHNvcnRpbmcgd2l0aGluIGVhY2ggZ3JvdXAKJGMtPntlcHJpbnRfcmVwb3J0fS0+e3NvcnRmaWVs -ZHN9ID0gewogICAgICAgICJieW5hbWUiID0+ICJjcmVhdG9yc19uYW1lLy1kYXRlL3RpdGxlIiwK -ICAgICAgICAiYnl5ZWFyIiA9PiAiLWRhdGUvY3JlYXRvcnNfbmFtZS90aXRsZSIsCiAgICAgICAg -ImJ5dGl0bGUiID0+ICJ0aXRsZS9jcmVhdG9yc19uYW1lLy1kYXRlIiwKICAgICAgICAiYnlkaXZp -c2lvbiIgPT4gImRpdmlzaW9ucy9jcmVhdG9yc19uYW1lLy1kYXRlIiwKfTsKCiNleHBvcnQgZmll -bGQgb3B0aW9ucwokYy0+e2VwcmludF9yZXBvcnR9LT57ZXhwb3J0ZmllbGRzfSA9IHsKICAgICAg -ICBlcHJpbnRfcmVwb3J0X2NvcmUgPT4gWyBxdygKCQllcHJpbnRpZAogICAgICAgICAgICAgICAg -dGl0bGUKICAgICAgICAgICAgICAgIGNyZWF0b3JzX25hbWUKICAgICAgICAgICAgICAgIGFic3Ry -YWN0CiAgICAgICAgICAgICAgICBkYXRlCiAgICAgICAgICAgICAgICBrZXl3b3JkcwogICAgICAg -ICAgICAgICAgZGl2aXNpb25zCiAgICAgICAgICAgICAgICBzdWJqZWN0cwogICAgICAgICAgICAg -ICAgdHlwZQogICAgICAgICAgICAgICAgZWRpdG9yc19uYW1lCiAgICAgICAgICAgICAgICBpc3B1 -Ymxpc2hlZAogICAgICAgICAgICAgICAgcmVmZXJlZWQKICAgICAgICAgICAgICAgIHB1YmxpY2F0 -aW9uCiAgICAgICAgICAgICAgICBkb2N1bWVudHMuZm9ybWF0CiAgICAgICAgICAgICAgICBkYXRl -c3RhbXAKICAgICAgICApXSwKfTsKJGMtPntlcHJpbnRfcmVwb3J0fS0+e2V4cG9ydGZpZWxkX2Rl -ZmF1bHRzfSA9IFsgcXcoCgllcHJpbnRpZAoJdGl0bGUKICAgICAgICBjcmVhdG9yc19uYW1lCiAg -ICAgICAgYWJzdHJhY3QKICAgICAgICBkYXRlCiAgICAgICAga2V5d29yZHMKICAgICAgICBkaXZp -c2lvbnMKICAgICAgICBzdWJqZWN0cwogICAgICAgIHR5cGUKICAgICAgICBlZGl0b3JzX25hbWUK -ICAgICAgICBpc3B1Ymxpc2hlZAogICAgICAgIHJlZmVyZWVkCiAgICAgICAgcHVibGljYXRpb24K -CWRvY3VtZW50cy5mb3JtYXQKCWRhdGVzdGFtcAopXTsKCiNzZXQgb3JkZXIgb2YgZXhwb3J0IHBs -dWdpbnMKJGMtPntlcHJpbnRfcmVwb3J0fS0+e2V4cG9ydF9wbHVnaW5zfSA9IFsgcXcoIEV4cG9y -dDo6UmVwb3J0OjpDU1YgRXhwb3J0OjpSZXBvcnQ6OkhUTUwgRXhwb3J0OjpSZXBvcnQ6OkpTT04g -KV07Cgojc2V0IGNvbmZpZyBmb3IgZGVmYXVsdCB1c2VyIHJlcG9ydAokYy0+e2RhdGFzZXRzfS0+ -e3VzZXJ9LT57c2VhcmNofS0+e3VzZXJfcmVwb3J0fSA9ICRjLT57c2VhcmNofS0+e3VzZXJ9OyAj -dXNlIHRoZSBkZWZhdWx0IHVzZXIgc2VhcmNoIGZvcm0KCiNzb3J0IG9wdGlvbnMgZm9yIHNvcnRp -bmcgd2l0aGluIGVhY2ggZ3JvdXAKJGMtPnt1c2VyX3JlcG9ydH0tPntzb3J0ZmllbGRzfSA9IHsK -ICAgICAgICAiYnluYW1lIiA9PiAibmFtZSIsCn07CgojZXhwb3J0IGZpZWxkIG9wdGlvbnMKJGMt -Pnt1c2VyX3JlcG9ydH0tPntleHBvcnRmaWVsZHN9ID0gewogICAgICAgIHVzZXJfcmVwb3J0X2Nv -cmUgPT4gWyBxdygKICAgICAgICAJbmFtZQoJCXVzZXJuYW1lCgkJdXNlcmlkCgkJZGVwdAoJCW9y -ZwoJCWFkZHJlc3MKCQl1c2VydHlwZQoJCWVtYWlsCgkpXSwKfTsKCiRjLT57dXNlcl9yZXBvcnR9 -LT57ZXhwb3J0ZmllbGRfZGVmYXVsdHN9ID0gWyBxdygKICAgICAgICBuYW1lCgl1c2VybmFtZQoJ -dXNlcmlkCglkZXB0CglvcmcKCWFkZHJlc3MKCXVzZXJ0eXBlCgllbWFpbAopXTsKCiNzZXQgb3Jk -ZXIgb2YgZXhwb3J0IHBsdWdpbnMKJGMtPnt1c2VyX3JlcG9ydH0tPntleHBvcnRfcGx1Z2luc30g -PSBbIHF3KCBFeHBvcnQ6OlJlcG9ydDo6Q1NWIEV4cG9ydDo6UmVwb3J0OjpIVE1MIEV4cG9ydDo6 -UmVwb3J0OjpKU09OICldOwoKcHVzaCBAeyRjLT57dXNlcl9yb2xlc30tPnthZG1pbn19LCBxd3sK -ICAgICAgICArcmVwb3J0Cn07Cg== +OjpVc2VyIn17cGFyYW1zfXtjdXN0b219ID0gMTsKCiRjLT57cmVwb3J0c30tPntjc3ZfdXRmOF9i +b219ID0gMTsKCiNzZXQgY29uZmlnIGZvciBkZWZhdWx0IGVwcmludCByZXBvcnQKJGMtPntzZWFy +Y2h9LT57ZXByaW50X3JlcG9ydH0gPSAkYy0+e3NlYXJjaH0tPnthZHZhbmNlZH07ICN1c2UgdGhl +IGFkdmFuY2VkIHNlYXJjaCBmb3JtIGFzIHRoZSBkZWZhdWx0IGVwcmludCByZXBvcnQgc2VhcmNo +CgojZ3JvdXAgYnkgb3B0aW9ucwokYy0+e2VwcmludF9yZXBvcnR9LT57Z3JvdXBmaWVsZHN9ID0g +WyBxdygKCWRpdmlzaW9ucwoJc3ViamVjdHMKICAgICAgICB0eXBlCglkYXRlO3Jlcz15ZWFyO3Jl +dmVyc2Vfb3JkZXI9MQopXTsKCiNzb3J0IG9wdGlvbnMgZm9yIHNvcnRpbmcgd2l0aGluIGVhY2gg +Z3JvdXAKJGMtPntlcHJpbnRfcmVwb3J0fS0+e3NvcnRmaWVsZHN9ID0gewogICAgICAgICJieW5h +bWUiID0+ICJjcmVhdG9yc19uYW1lLy1kYXRlL3RpdGxlIiwKICAgICAgICAiYnl5ZWFyIiA9PiAi +LWRhdGUvY3JlYXRvcnNfbmFtZS90aXRsZSIsCiAgICAgICAgImJ5dGl0bGUiID0+ICJ0aXRsZS9j +cmVhdG9yc19uYW1lLy1kYXRlIiwKICAgICAgICAiYnlkaXZpc2lvbiIgPT4gImRpdmlzaW9ucy9j +cmVhdG9yc19uYW1lLy1kYXRlIiwKfTsKCiNleHBvcnQgZmllbGQgb3B0aW9ucwokYy0+e2Vwcmlu +dF9yZXBvcnR9LT57ZXhwb3J0ZmllbGRzfSA9IHsKICAgICAgICBlcHJpbnRfcmVwb3J0X2NvcmUg +PT4gWyBxdygKCQllcHJpbnRpZAogICAgICAgICAgICAgICAgdGl0bGUKICAgICAgICAgICAgICAg +IGNyZWF0b3JzX25hbWUKICAgICAgICAgICAgICAgIGFic3RyYWN0CiAgICAgICAgICAgICAgICBk +YXRlCiAgICAgICAgICAgICAgICBrZXl3b3JkcwogICAgICAgICAgICAgICAgZGl2aXNpb25zCiAg +ICAgICAgICAgICAgICBzdWJqZWN0cwogICAgICAgICAgICAgICAgdHlwZQogICAgICAgICAgICAg +ICAgZWRpdG9yc19uYW1lCiAgICAgICAgICAgICAgICBpc3B1Ymxpc2hlZAogICAgICAgICAgICAg +ICAgcmVmZXJlZWQKICAgICAgICAgICAgICAgIHB1YmxpY2F0aW9uCiAgICAgICAgICAgICAgICBk +b2N1bWVudHMuZm9ybWF0CiAgICAgICAgICAgICAgICBkYXRlc3RhbXAKICAgICAgICApXSwKfTsK +JGMtPntlcHJpbnRfcmVwb3J0fS0+e2V4cG9ydGZpZWxkX2RlZmF1bHRzfSA9IFsgcXcoCgllcHJp +bnRpZAoJdGl0bGUKICAgICAgICBjcmVhdG9yc19uYW1lCiAgICAgICAgYWJzdHJhY3QKICAgICAg +ICBkYXRlCiAgICAgICAga2V5d29yZHMKICAgICAgICBkaXZpc2lvbnMKICAgICAgICBzdWJqZWN0 +cwogICAgICAgIHR5cGUKICAgICAgICBlZGl0b3JzX25hbWUKICAgICAgICBpc3B1Ymxpc2hlZAog +ICAgICAgIHJlZmVyZWVkCiAgICAgICAgcHVibGljYXRpb24KCWRvY3VtZW50cy5mb3JtYXQKCWRh +dGVzdGFtcAopXTsKCiNzZXQgb3JkZXIgb2YgZXhwb3J0IHBsdWdpbnMKJGMtPntlcHJpbnRfcmVw +b3J0fS0+e2V4cG9ydF9wbHVnaW5zfSA9IFsgcXcoIEV4cG9ydDo6UmVwb3J0OjpDU1YgRXhwb3J0 +OjpSZXBvcnQ6OkhUTUwgRXhwb3J0OjpSZXBvcnQ6OkpTT04gKV07Cgojc2V0IGNvbmZpZyBmb3Ig +ZGVmYXVsdCB1c2VyIHJlcG9ydAokYy0+e2RhdGFzZXRzfS0+e3VzZXJ9LT57c2VhcmNofS0+e3Vz +ZXJfcmVwb3J0fSA9ICRjLT57c2VhcmNofS0+e3VzZXJ9OyAjdXNlIHRoZSBkZWZhdWx0IHVzZXIg +c2VhcmNoIGZvcm0KCiNzb3J0IG9wdGlvbnMgZm9yIHNvcnRpbmcgd2l0aGluIGVhY2ggZ3JvdXAK +JGMtPnt1c2VyX3JlcG9ydH0tPntzb3J0ZmllbGRzfSA9IHsKICAgICAgICAiYnluYW1lIiA9PiAi +bmFtZSIsCn07CgojZXhwb3J0IGZpZWxkIG9wdGlvbnMKJGMtPnt1c2VyX3JlcG9ydH0tPntleHBv +cnRmaWVsZHN9ID0gewogICAgICAgIHVzZXJfcmVwb3J0X2NvcmUgPT4gWyBxdygKICAgICAgICAJ +bmFtZQoJCXVzZXJuYW1lCgkJdXNlcmlkCgkJZGVwdAoJCW9yZwoJCWFkZHJlc3MKCQl1c2VydHlw +ZQoJCWVtYWlsCgkpXSwKfTsKCiRjLT57dXNlcl9yZXBvcnR9LT57ZXhwb3J0ZmllbGRfZGVmYXVs +dHN9ID0gWyBxdygKICAgICAgICBuYW1lCgl1c2VybmFtZQoJdXNlcmlkCglkZXB0CglvcmcKCWFk +ZHJlc3MKCXVzZXJ0eXBlCgllbWFpbAopXTsKCiNzZXQgb3JkZXIgb2YgZXhwb3J0IHBsdWdpbnMK +JGMtPnt1c2VyX3JlcG9ydH0tPntleHBvcnRfcGx1Z2luc30gPSBbIHF3KCBFeHBvcnQ6OlJlcG9y +dDo6Q1NWIEV4cG9ydDo6UmVwb3J0OjpIVE1MIEV4cG9ydDo6UmVwb3J0OjpKU09OICldOwoKcHVz +aCBAeyRjLT57dXNlcl9yb2xlc30tPnthZG1pbn19LCBxd3sKICAgICAgICArcmVwb3J0Cn07Cg== @@ -489,9 +489,9 @@ ZGF0YW9iai0+ZGF0YXNldC0+Y29uZmlkID0+ICRkYXRhb2JqLAoJfTsKfQoKMTsK document plugins/EPrints/Plugin/Export/Report/CSV.pm text/plain - 9ca03f1aa33ed8390c18f29c2ed96d16 + 197a1e34988fac693a4f2825cfc823d0 MD5 - 1785 + 2084 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6UmVwb3J0OjpDU1Y7Cgp1c2UgRVByaW50 czo6UGx1Z2luOjpFeHBvcnQ6OlJlcG9ydDsKQElTQSA9ICggIkVQcmludHM6OlBsdWdpbjo6RXhw b3J0OjpSZXBvcnQiICk7Cgp1c2Ugc3RyaWN0OwoKc3ViIG5ldwp7CglteSggJGNsYXNzLCAlcGFy @@ -499,31 +499,36 @@ YW1zICkgPSBAXzsKCglteSAkc2VsZiA9ICRjbGFzcy0+U1VQRVI6Om5ldyggJXBhcmFtcyApOwoK CSRzZWxmLT57bmFtZX0gPSAiR2VuZXJpYyBDU1YiOwoJJHNlbGYtPntzdWZmaXh9ID0gIi5jc3Yi OwoJJHNlbGYtPnttaW1ldHlwZX0gPSAidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCI7Cgkkc2Vs Zi0+e2FjY2VwdH0gPSBbICdyZXBvcnQvZ2VuZXJpYycgXTsKCSRzZWxmLT57YWR2ZXJ0aXNlfSA9 -IDE7CgoJcmV0dXJuICRzZWxmOwp9CgpzdWIgb3V0cHV0X2xpc3QKewogICAgICAgIG15KCAkcGx1 -Z2luLCAlb3B0cyApID0gQF87ICAgICAKCglteSAkcmVwbyA9ICRwbHVnaW4tPnJlcG9zaXRvcnk7 -CgoJJHBsdWdpbi0+Z2V0X2V4cG9ydF9maWVsZHMoICVvcHRzICk7ICNnZXQgZXhwb3J0IGZpZWxk -cyBiYXNlZCBvbiB1c2VyIHJlcXVpcmVtZW50cyBvciBwbHVnaW4gZGVmYXVsdHMKCglpZiggZGVm -aW5lZCAkcGx1Z2luLT57Y3VzdG9tX2ZpZWxkc30gKSAjdGhlIHNjcmVlbiBoYXMgZGVmaW5lZCBl -eHBvcnQgZmllbGRzCgl7CgkJJG9wdHN7ZmllbGRzfSA9ICRwbHVnaW4tPntleHBvcnRmaWVsZHN9 -OwoJfQoKCSNzZXQgYW55IGN1c3RvbSBleHBvcnQgZnVuY3Rpb25zCgkkb3B0c3tjdXN0b21fZXhw -b3J0fSA9ICRyZXBvLT5jb25maWcoICRwbHVnaW4tPntyZXBvcnR9LT57ZXhwb3J0X2NvbmZ9LCAi -Y3VzdG9tX2V4cG9ydCIgKTsKCgkjbm93IHVzZSB0aGUgZ2VuZXJpYyBtdWx0aWxpbmUgY3N2IHBs -dWdpbiB0byBoYW5kbGUgdGhlIGV4cG9ydAoJbXkgJG11bHRpbGluZV9jc3YgPSBFUHJpbnRzOjpQ -bHVnaW46OkV4cG9ydDo6TXVsdGlsaW5lQ1NWMi0+bmV3KCAlb3B0cyApOwoJJG11bHRpbGluZV9j -c3YtPm91dHB1dF9saXN0KCAlb3B0cyApOyAKfQoKI3JldGFpbmVkIGZvciBsZWdhY3kgcmVhc29u -cyAtIGV4dGVuc2lvbnMgb2YgRXhwb3J0OjpSZXBvcnQ6OkNTViBtYXkgdXNlIHRoaXMKc3ViIGVz -Y2FwZV92YWx1ZQp7CiAgICAgICAgbXkoICRwbHVnaW4sICR2YWx1ZSApID0gQF87CgogICAgICAg -IHJldHVybiAnIiInIHVubGVzcyggZGVmaW5lZCBFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkdmFs -dWUgKSApOwoKICAgICAgICAjIHN0cmlwcyBhbnkga2luZCBvZiBkb3VibGUtcXVvdGVzOgogICAg -ICAgICR2YWx1ZSA9fiBzL1x4OTN8XHg5NHwiLycvZzsKICAgICAgICAjIGFuZCBjb250cm9sLWNo -YXJhY3RlcnMKICAgICAgICAkdmFsdWUgPX4gcy9cbnxccnxcdC8vZzsKICAgICAgICAKCSMgaWYg -dmFsdWUgaXMgYSBwdXJlIG51bWJlciwgdGhlbiBhZGQgPSIkdmFsdWUiIHNvIHRoYXQgRXhjZWwg -c3RvcHMgdGhlIGF1dG8tZm9ybWF0dGluZyAoaXQnZCB0dXJuIDEyMzQ1NiBpbnRvIDEuMjNlKzYp -CglpZiggJHZhbHVlID1+IC9eWzAtOVwtXSskLyApCiAgICAgICAgewoJCXJldHVybiAiPVwiJHZh -bHVlXCIiOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAjIG9ubHkgZXNjYXBlcyByb3cgd2l0 -aCBzcGFjZXMgYW5kIGNvbW1hcwogICAgICAgIGlmKCAkdmFsdWUgPX4gLyx8IC8gKQogICAgICAg -IHsKICAgICAgICAJcmV0dXJuICJcIiR2YWx1ZVwiIjsKCX0KICAgICAgIAkKCXJldHVybiAkdmFs -dWU7Cn0KCjE7ICAgICAgICAK +IDE7CgoJcmV0dXJuICRzZWxmOwp9CgpzdWIgaW5pdGlhbGlzZV9maAp7CiAgICBteSggJHBsdWdp +biwgJGZoICkgPSBAXzsKCiAgICAkcGx1Z2luLT5TVVBFUjo6aW5pdGlhbGlzZV9maCggJGZoICk7 +CgogICAgIyBpbmNsdWRlIFVURi04IGJ5dGUgb3JkZXIgbWFya2VyIHNvIEV4Y2VsIGtub3dzIGhv +dyB0byBkaXNwbGF5IHRoZSBjb250ZW4KICAgIG15ICRyZXBvID0gJHBsdWdpbi0+cmVwb3NpdG9y +eTsKICAgIGlmKCAkcmVwby0+Y29uZmlnKCAicmVwb3J0cyIsICJjc3ZfdXRmOF9ib20iICkgKQog +ICAgewogICAgICAgIHByaW50ICRmaCBjaHIoNjUyNzkpOwogICAgfQp9CgpzdWIgb3V0cHV0X2xp +c3QKewoJbXkoICRwbHVnaW4sICVvcHRzICkgPSBAXzsgICAgIAoKCW15ICRyZXBvID0gJHBsdWdp +bi0+cmVwb3NpdG9yeTsKCgkkcGx1Z2luLT5nZXRfZXhwb3J0X2ZpZWxkcyggJW9wdHMgKTsgI2dl +dCBleHBvcnQgZmllbGRzIGJhc2VkIG9uIHVzZXIgcmVxdWlyZW1lbnRzIG9yIHBsdWdpbiBkZWZh +dWx0cwoKCWlmKCBkZWZpbmVkICRwbHVnaW4tPntjdXN0b21fZmllbGRzfSApICN0aGUgc2NyZWVu +IGhhcyBkZWZpbmVkIGV4cG9ydCBmaWVsZHMKCXsKCQkkb3B0c3tmaWVsZHN9ID0gJHBsdWdpbi0+ +e2V4cG9ydGZpZWxkc307Cgl9CgoJI3NldCBhbnkgY3VzdG9tIGV4cG9ydCBmdW5jdGlvbnMKCSRv +cHRze2N1c3RvbV9leHBvcnR9ID0gJHJlcG8tPmNvbmZpZyggJHBsdWdpbi0+e3JlcG9ydH0tPntl +eHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApOwoKCSNub3cgdXNlIHRoZSBnZW5lcmljIG11 +bHRpbGluZSBjc3YgcGx1Z2luIHRvIGhhbmRsZSB0aGUgZXhwb3J0CglteSAkbXVsdGlsaW5lX2Nz +diA9IEVQcmludHM6OlBsdWdpbjo6RXhwb3J0OjpNdWx0aWxpbmVDU1YyLT5uZXcoICVvcHRzICk7 +CgkkbXVsdGlsaW5lX2Nzdi0+b3V0cHV0X2xpc3QoICVvcHRzICk7IAp9CgojcmV0YWluZWQgZm9y +IGxlZ2FjeSByZWFzb25zIC0gZXh0ZW5zaW9ucyBvZiBFeHBvcnQ6OlJlcG9ydDo6Q1NWIG1heSB1 +c2UgdGhpcwpzdWIgZXNjYXBlX3ZhbHVlCnsKICAgICAgICBteSggJHBsdWdpbiwgJHZhbHVlICkg +PSBAXzsKCiAgICAgICAgcmV0dXJuICciIicgdW5sZXNzKCBkZWZpbmVkIEVQcmludHM6OlV0aWxz +Ojppc19zZXQoICR2YWx1ZSApICk7CgogICAgICAgICMgc3RyaXBzIGFueSBraW5kIG9mIGRvdWJs +ZS1xdW90ZXM6CiAgICAgICAgJHZhbHVlID1+IHMvXHg5M3xceDk0fCIvJy9nOwogICAgICAgICMg +YW5kIGNvbnRyb2wtY2hhcmFjdGVycwogICAgICAgICR2YWx1ZSA9fiBzL1xufFxyfFx0Ly9nOwog +ICAgICAgIAoJIyBpZiB2YWx1ZSBpcyBhIHB1cmUgbnVtYmVyLCB0aGVuIGFkZCA9IiR2YWx1ZSIg +c28gdGhhdCBFeGNlbCBzdG9wcyB0aGUgYXV0by1mb3JtYXR0aW5nIChpdCdkIHR1cm4gMTIzNDU2 +IGludG8gMS4yM2UrNikKCWlmKCAkdmFsdWUgPX4gL15bMC05XC1dKyQvICkKICAgICAgICB7CgkJ +cmV0dXJuICI9XCIkdmFsdWVcIiI7CiAgICAgICAgfQogICAgICAgIAogICAgICAgICMgb25seSBl +c2NhcGVzIHJvdyB3aXRoIHNwYWNlcyBhbmQgY29tbWFzCiAgICAgICAgaWYoICR2YWx1ZSA9fiAv +LHwgLyApCiAgICAgICAgewogICAgICAgIAlyZXR1cm4gIlwiJHZhbHVlXCIiOwoJfQogICAgICAg +CQoJcmV0dXJuICR2YWx1ZTsKfQoKMTsgICAgICAgIAo= @@ -2920,7 +2925,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.4 + 3.4.1 diff --git a/reports.epmi b/reports.epmi index 4beefff..f335b98 100644 --- a/reports.epmi +++ b/reports.epmi @@ -17,9 +17,9 @@ document epm/reports/cfg/cfg.d/z_reports.pl text/plain - 48c622ad150bea255ba6fbee7e37083b + e0c09c35dc9b17fa48a00ad0555653fc MD5 - 2869 + 2905 document @@ -65,9 +65,9 @@ document plugins/EPrints/Plugin/Export/Report/CSV.pm text/plain - 9ca03f1aa33ed8390c18f29c2ed96d16 + 197a1e34988fac693a4f2825cfc823d0 MD5 - 1785 + 2084 document @@ -187,7 +187,7 @@ coverimage - 3.4 + 3.4.1 From 37a3842e4ca894809118fae70dc0373c2774302c Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Tue, 31 Jan 2023 17:12:13 +0000 Subject: [PATCH 06/11] Allow a report's searchdatasetid to be customised in cfg/cfg.d settings --- lib/plugins/EPrints/Plugin/Screen/Report.pm | 15 +- reports.epm | 1510 ++++++++++--------- reports.epmi | 6 +- 3 files changed, 775 insertions(+), 756 deletions(-) diff --git a/lib/plugins/EPrints/Plugin/Screen/Report.pm b/lib/plugins/EPrints/Plugin/Screen/Report.pm index 491e94f..cdb2c56 100644 --- a/lib/plugins/EPrints/Plugin/Screen/Report.pm +++ b/lib/plugins/EPrints/Plugin/Screen/Report.pm @@ -113,7 +113,13 @@ sub _create_search return if ! defined $report_plugin->{searchdatasetid}; $self->{processor}->{report_plugin} = $report_plugin; - my $report_ds = $session->dataset( $report_plugin->{searchdatasetid} ); + my $searchdatasetid = $report_plugin->{searchdatasetid}; + if( defined $report_plugin->param("searchdatasetid") ) + { + $searchdatasetid = $report_plugin->param("searchdatasetid"); + } + + my $report_ds = $session->dataset( $searchdatasetid ); if( defined $report_ds ) { $self->{processor}->{datasetid} = $report_ds->base_id; @@ -602,7 +608,12 @@ sub render_splash_page #create search form #get report dataset and appropriate search config - my $report_ds = $repo->dataset( $report_plugin->{searchdatasetid} ); + my $searchdatasetid = $report_plugin->{searchdatasetid}; + if( defined $report_plugin->param("searchdatasetid") ) + { + $searchdatasetid = $report_plugin->param("searchdatasetid"); + } + my $report_ds = $repo->dataset( $searchdatasetid ); my $sconf = $report_ds->search_config( $report_plugin->{sconf} ) ; #my $search = EPrints::Search->new( # keep_cache => 1, diff --git a/reports.epm b/reports.epm index be863e3..8bad4d4 100644 --- a/reports.epm +++ b/reports.epm @@ -791,9 +791,9 @@ XCIkdmFsdWVcIiI7Cgl9CgoJcmV0dXJuICR2YWx1ZTsKfQoKCjE7Cg== document plugins/EPrints/Plugin/Screen/Report.pm text/plain - 2c4683e23b226dbc06eda9f63d03a1bc + 76ae03abfa9314aa25371d44e8486945 MD5 - 44999 + 45432 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OlNjcmVlbjo6UmVwb3J0OwoKIyBBYnN0cmFjdCBjbGFz cyB0aGF0IGhhbmRsZXMgdGhlIFJlcG9ydCB0b29scwoKdXNlIEpTT04gcXcoZW5jb2RlX2pzb24p Owp1c2UgRVByaW50czo6UGx1Z2luOjpTY3JlZW47CkBJU0EgPSAoICdFUHJpbnRzOjpQbHVnaW46 @@ -835,755 +835,763 @@ cmVwb3J0X3BsdWdpbiA9ICRzZWxmLT57cHJvY2Vzc29yfS0+c2NyZWVuOwoKCSMgRG8gbm90IGNy ZWF0ZSBhIHNlYXJjaCBjb25maWcgaWYgdGhpcyBpcyBub3QgY29uZmlndXJlZCBpbiB0aGUgcmVw b3J0CiAgCXJldHVybiBpZiAhIGRlZmluZWQgJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRhc2V0 aWR9OwoJJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0X3BsdWdpbn0gPSAkcmVwb3J0X3BsdWdp -bjsKCiAgICAgICAgbXkgJHJlcG9ydF9kcyA9ICRzZXNzaW9uLT5kYXRhc2V0KCAkcmVwb3J0X3Bs -dWdpbi0+e3NlYXJjaGRhdGFzZXRpZH0gKTsKICAgICAgICBpZiggZGVmaW5lZCAkcmVwb3J0X2Rz -ICkKICAgICAgICB7CiAgICAgICAgICAgICAgICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntkYXRhc2V0 -aWR9ID0gJHJlcG9ydF9kcy0+YmFzZV9pZDsKICAgICAgICAgICAgICAgIG15ICRzY29uZiA9ICRy -ZXBvcnRfZHMtPnNlYXJjaF9jb25maWcoICRyZXBvcnRfcGx1Z2luLT57c2NvbmZ9ICk7CgkKICAg -ICAgICAgICAgICAgIG15ICRmb3JtYXQgPSAicmVwb3J0LyIgLiAkcmVwb3J0X2RzLT5iYXNlX2lk -OwogICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofSA9ICRzZXNzaW9u -LT5wbHVnaW4oICJTZWFyY2giICktPnBsdWdpbnMoCiAgICAgICAgICAgICAgICAgICAgICAgIHsK -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwX2NhY2hlID0+IDEsCiAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9PiAkc2VsZi0+e3Nlc3Npb259LAogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgPT4gJHJlcG9ydF9kcywKICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAleyRzY29uZn0KICAgICAgICAgICAgICAgICAgICAg -ICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAiU2VhcmNoIiwKICAgICAgICAg -ICAgICAgICAgICAgICAgY2FuX3NlYXJjaCA9PiAkZm9ybWF0LAogICAgICAgICAgICAgICAgKTsK -CX0KfQoKc3ViIGFsbG93X25ld3NlYXJjaCB7IHJldHVybiAxOyB9CgpzdWIgYWxsb3dfdXBkYXRl -IHsgcmV0dXJuIDE7IH0KCnN1YiBhY3Rpb25fbmV3c2VhcmNoCnsKICAgICAgICBteSggJHNlbGYg -KSA9IEBfOwoKICAgICAgICBteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CgogICAgICAg -ICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9ID0gJHNlc3Npb24tPnBhcmFtKCAncmVwb3J0 -JyApOwogICAgICAgICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzY3JlZW5pZH0gPSAkc2VsZi0+e3By -b2Nlc3Nvcn0tPntyZXBvcnR9OwogICAgICAgICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259 -ID0gIm5ld3NlYXJjaCI7CiAgICAgICAgIyRzZWxmLT5fY3JlYXRlX3NlYXJjaDsKfQoKc3ViIGFj -dGlvbl91cGRhdGUKewogICAgICAgIG15KCAkc2VsZiApID0gQF87CgogICAgICAgIG15ICRzZXNz -aW9uID0gJHNlbGYtPntzZXNzaW9ufTsKCiAgICAgICAgIyRzZWxmLT57cHJvY2Vzc29yfS0+e3Jl -cG9ydH0gPSAkc2Vzc2lvbi0+cGFyYW0oICdyZXBvcnQnICk7CiAgICAgICAgIyRzZWxmLT57cHJv -Y2Vzc29yfS0+e3NjcmVlbmlkfSA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydH07CiAgICAg -ICAgIyRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gPSAibmV3c2VhcmNoIjsKICAgICAgICAj -JHNlbGYtPl9jcmVhdGVfc2VhcmNoOwp9CgpzdWIgYWN0aW9uX3NlYXJjaAp7CglteSggJHNlbGYg -KSA9IEBfOwoKCSRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gPSAic2VhcmNoIjsKCgkjcmVh -ZCBwYXJhbWV0ZXJzCglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CgoJJHNlbGYtPntw -cm9jZXNzb3J9LT57cmVwb3J0fSA9ICRzZXNzaW9uLT5wYXJhbSggJ3JlcG9ydCcgKTsKCgkkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntzY3JlZW5pZH0gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9 -OwoJJHNlbGYtPl9jcmVhdGVfc2VhcmNoOwoKCW15ICRsb2FkZWQgPSAwOwogICAgICAgIG15ICRp -ZCA9ICRzZXNzaW9uLT5wYXJhbSggImNhY2hlIiApOwogICAgICAgIGlmKCBkZWZpbmVkICRpZCAp -CiAgICAgICAgewoJCSRsb2FkZWQgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5mcm9t -X2NhY2hlKCAkaWQgKTsKICAgICAgICB9CgogICAgICAgIGlmKCAhJGxvYWRlZCApCiAgICAgICAg -ewogICAgICAgICAgICAgICAgbXkgJGV4cCA9ICRzZXNzaW9uLT5wYXJhbSggImV4cCIgKTsKICAg -ICAgICAgICAgICAgIGlmKCBkZWZpbmVkICRleHAgKQogICAgICAgICAgICAgICAgewoJCQkkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5mcm9tX3N0cmluZyggJGV4cCApOwogICAgICAgICAg -ICAgICAgICAgICAgICAjIGNhY2hlIGV4cGlyZWQuLi4KICAgICAgICAgICAgICAgICAgICAgICAg -JGxvYWRlZCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSBAcHJv -YmxlbXM7CiAgICAgICAgaWYoICEkbG9hZGVkICkKICAgICAgICB7CgkJZm9yKCAkc2VsZi0+e3By -b2Nlc3Nvcn0tPntzZWFyY2h9LT5mcm9tX2Zvcm0gKQogICAgICAgICAgICAgICAgICAgICAgICB7 -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT5hZGRf -bWVzc2FnZSggIndhcm5pbmciLCAkXyApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAg -ICAgfQogICAgICAgICAgCgoJI2Rpc3BsYXkgdGhlIHJlc3VsdHMKCSRzZWxmLT5yZW5kZXI7Cn0K -CnN1YiBwcm9wZXJ0aWVzX2Zyb20KewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRz -ZWxmLT5yZXBvc2l0b3J5OwoJJHNlbGYtPlNVUEVSOjpwcm9wZXJ0aWVzX2Zyb207CgoJaWYoIGRl -ZmluZWQgKCBteSAkZHNpZCA9ICRzZWxmLT5wYXJhbSggImRhdGFzZXRpZCIgKSApICkKCXsKCQkk -c2VsZi0+e3Byb2Nlc3Nvcn0tPntkYXRhc2V0fSA9ICRzZWxmLT5yZXBvc2l0b3J5LT5kYXRhc2V0 -KCAkZHNpZCApOwoJfQoKCSMgc2YyIC0gVE9ETyAtIGJhcmsgaWYgZGF0YXNldCBpcyBub3Qgc2V0 -PyBwZXJoYXBzIHRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGdldCB0aGUgb2JqZWN0cyBmcm9tLi4u -CglteSAkcmVwb3J0ID0gJHNlbGYtPmdldF9yZXBvcnQoKTsKCgkjZ2V0IGEgc2VhcmNoIG9iamVj -dCBpZiB3ZSBoYXZlIG9uZSBmcm9tIGEgcHJldmlvdXMgc2VhcmNoIGFjdGlvbiwgc28gdGhhdCB3 -ZSBtaWdodCBsYXRlciB1c2UgaXQgdG8gZG8gYW4gZXhwb3J0IG9yIHNlYXJjaCBhY3Rpb24KCSRz -ZWxmLT5fY3JlYXRlX3NlYXJjaDsJCglpZiggZGVmaW5lZCAkc2VsZi0+cmVwb3NpdG9yeS0+cGFy -YW0oICJzZWFyY2giICkgKQoJewoJCSRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPmZyb21f -c3RyaW5nKCAkc2VsZi0+cmVwb3NpdG9yeS0+cGFyYW0oICJzZWFyY2giICkgKSBpZiBkZWZpbmVk -ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH07CgkJJHNlbGYtPntwcm9jZXNzb3J9LT57ZXhw -b3J0X3NlYXJjaH0gPSAxOwoJfQoJCglteSAkZm9ybWF0ID0gJHNlbGYtPnJlcG9zaXRvcnktPnBh -cmFtKCAiZXhwb3J0IiApOwoJaWYoICRmb3JtYXQgJiYgJHJlcG9ydCApCgl7CgkJbXkgJHBsdWdp -biA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW4oICJFeHBvcnQ6OiRmb3JtYXQiLCByZXBvcnQg -PT4gJHJlcG9ydCApOwoJCWlmKCBkZWZpbmVkICRwbHVnaW4gJiYgKCAkcGx1Z2luLT5jYW5fYWNj -ZXB0KCAicmVwb3J0LyRyZXBvcnQiICkgfHwgKCRwbHVnaW4tPmNhbl9hY2NlcHQoICJyZXBvcnQv -Z2VuZXJpYyIgKSApICkgKQoJCXsKCQkJJHNlbGYtPntwcm9jZXNzb3J9LT57cGx1Z2lufSA9ICRw -bHVnaW47CgkJfQoJfQoKCSNsaXN0IG9mIGV4cG9ydCBmaWVsZHMgcmV0cmlldmVkIGZyb20gbm9u -LWFic3RyYWN0IGluc3RhbmNlcyBvZiByZXBvcnRzCglteSBAZXhwb3J0ZmllbGRzOwoJaWYoIGRl -ZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMi -ICkgKQoJewoJCW15IEBrZXlzOwoJCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWcoICRzZWxmLT57 -ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICkgKQoJCXsKCQkJQGtleXMgPSBAeyRy -ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfb3JkZXIiICl9 -OwoJCX0KCQllbHNlCgkJewoJCQlAa2V5cyA9IGtleXMgJXskcmVwby0+Y29uZmlnKCAkc2VsZi0+ -e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIgKX07IAoJCX0KCQlmb3JlYWNoIG15ICRrZXkg -KCBAa2V5cyApCgkJewoJCQlmb3JlYWNoIG15ICRmaWVsZG5hbWUgKCBAeyRyZXBvLT5jb25maWco -ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApLT57JGtleX19ICkKCQkJewoJ -CQkJcHVzaCBAZXhwb3J0ZmllbGRzLCAkZmllbGRuYW1lIGlmIGRlZmluZWQgJHNlbGYtPnJlcG9z -aXRvcnktPnBhcmFtKCAkZmllbGRuYW1lICk7IAoJCQl9CgkJfQoJfQoKCW15ICRzb3J0ID0gJHNl -bGYtPnJlcG9zaXRvcnktPnBhcmFtKCAic29ydCIgKTsKCWlmKCBkZWZpbmVkICRzb3J0ICkKCXsK -CQkkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSA9ICRzb3J0OwoJfQoKCW15ICRncm91cCA9ICRz -ZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggImdyb3VwIiApOwoJJHNlbGYtPntwcm9jZXNzb3J9LT57 -Z3JvdXBfZXhwfSA9ICRncm91cDsgI3N0b3JlIHRoZSBncm91cCBleHByZXNzaW9uIGZvciBsYXRl -ciB1c2UKCQoJI2RlY29kZSB0aGUgZ3JvdXAgZXhwcmVzc2lvbgoJbXkgJWdyb3VwX29wdHM7Cglp -ZiggZGVmaW5lZCAkZ3JvdXAgKQoJewoJCSNnZXQgZmllbGQgYW5kIGFzc29jaWF0ZWQgY29uZmln -dXJhdGlvbiBhYm91dCB0aGUgZ3JvdXAsIGUuZy4gcmVzLCB0cnVuY2F0ZSwgcmV2ZXJzZV9vcmRl -ciBldGMuCgkJbXkgQGdyb3VwID0gc3BsaXQoLzsvLCAkZ3JvdXAgKTsKCQlteSAkZmlyc3QgPSAx -OwoJCWZvcmVhY2ggbXkgJGcgKEBncm91cCkKCQl7CgkJCWlmKCAkZmlyc3QgKQoJCQl7CgkJCQkk -Z3JvdXAgPSAkZzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCW15IEBvcHRzID0gc3BsaXQoLz0vLCAk -ZyApOwoJCQkJJGdyb3VwX29wdHN7JG9wdHNbMF19ID0gJG9wdHNbMV07CQkKCQkJfQoJCQkkZmly -c3QgPSAwOwoJCX0KCQkkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gPSAkZ3JvdXA7CgkJJHNl -bGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gPSBcJWdyb3VwX29wdHM7Cgl9CgoJJHNlbGYt -Pntwcm9jZXNzb3J9LT57ZXhwb3J0ZmllbGRzfSA9IFxAZXhwb3J0ZmllbGRzOwp9CgkJCiMgXEAo -e21ldGFfZmllbGRzPT5bICJmaWVsZDEiLCAiZmllbGQyIiAiZG9jdW1lbnQuZmllbGQzIiBdLCBt -ZXJnZT0+IkFOWSIsIG1hdGNoPT4iRVgiLCB2YWx1ZT0+ImJlZXMifSwge21ldGFfZmllbGRzPT5b -ICJmaWVsZDQiIF0sIHZhbHVlPT4iaG9uZXkifSk7CiMgZS5nLgojIHJldHVybiBbIHsgbWV0YV9m -aWVsZHMgPT4gWyAndHlwZScgXSwgdmFsdWUgPT4gJ2FydGljbGUnIH0gXQpzdWIgZmlsdGVycwp7 -CglyZXR1cm4gW107Cn0KCiMgaG93IHRvIHNlbGVjdCBpdGVtcyBpLmUuIHRoZSBzbGljZSBvZiBk -YXRhIHdlIHdhbnQgdG8gdmFsaWRhdGUvZXhwb3J0PwojIApzdWIgaXRlbXMKewoJbXkoICRzZWxm -ICkgPSBAXzsKCWlmKCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giIHx8 -ICRzZWxmLT57cHJvY2Vzc29yfS0+e2V4cG9ydF9zZWFyY2h9ICkKICAgICAgIAl7CgkJbXkgJHJl -cG9ydCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydF9wbHVnaW59OwkKCQkkcmVwb3J0LT5h -cHBseV9maWx0ZXJzIGlmICRyZXBvcnQtPmNhbiggJ2FwcGx5X2ZpbHRlcnMnICk7CgoJCW15ICRp -dGVtcyA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnBlcmZvcm1fc2VhcmNoOwoKCQlp -ZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgkJewkKCQkJJGl0ZW1zID0g -JGl0ZW1zLT5yZW9yZGVyKCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApOwoJCX0KCQlyZXR1 -cm4gJGl0ZW1zOwoJfQoJZWxzaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0YXNl -dH0gKSAKCXsKCQlteSAlc2VhcmNoX29wdHMgPSAoIGZpbHRlcnMgPT4gJHNlbGYtPmZpbHRlcnMs -IHNhdGlzZnlfYWxsID0+IDEgKTsKCQlpZiggZGVmaW5lZCAkc2VsZi0+cGFyYW0oICdjdXN0b21f -b3JkZXInICkgKQoJCXsKCQkJJHNlYXJjaF9vcHRze2N1c3RvbV9vcmRlcn0gPSAkc2VsZi0+cGFy -YW0oICdjdXN0b21fb3JkZXInICk7CgkJfQoKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nv -cn0tPntzb3J0fSApICNhbiBvcmRlcmluZyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgc2hvdWxkIHRy -dW1wIHRoZSByZXBvcnRzIGN1c3RvbSBvcmRlcgoJCXsKCQkJJHNlYXJjaF9vcHRze2N1c3RvbV9v -cmRlcn0gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fTsKCQl9CQoJCXJldHVybiAkc2VsZi0+ -e3Byb2Nlc3Nvcn0tPntkYXRhc2V0fS0+c2VhcmNoKCAlc2VhcmNoX29wdHMgKTsKCX0KCSMgd2Ug -Y2FuJ3QgcmV0dXJuIGFuIEVQcmludHM6Okxpc3QgaWYge2RhdGFzZXR9IGlzIG5vdCBkZWZpbmVk -CglyZXR1cm4gdW5kZWY7Cn0KCiMgZnJvbSBSZXBvcnRzL1JPUy9Kb3VybmFscy5wbQojIFRPRE8g -Tm90ZSBxdWl0ZSBhIGxvdCBvZiByZXBsaWNhdGlvbiBiZXR3ZWVuIHRoaXMgYW5kIEV4cG9ydDo6 -UmVwb3J0OjpDU1Y6Om91dHB1dF9kYXRhb2JqCnN1YiB2YWxpZGF0ZV9kYXRhb2JqCnsKCW15KCAk -cGx1Z2luLCAkZGF0YW9iaiApID0gQF87CgoJbXkgJHJlcG8gPSAkcGx1Z2luLT5yZXBvc2l0b3J5 -OwoKCW15ICRyZXBvcnRfZmllbGRzID0gJHBsdWdpbi0+cmVwb3J0X2ZpZWxkcyggJGRhdGFvYmog -KTsKCW15ICR2YWxfZmllbGRzID0gJHBsdWdpbi0+dmFsaWRhdGVfZmllbGRzKCAkZGF0YW9iaiAp -OwoKCSMgcmVsYXRlZCBvYmplY3RzIGFuZCB0aGVpciBkYXRhc2V0cwoJbXkgJG9iamVjdHMgPSAk -cGx1Z2luLT5nZXRfcmVsYXRlZF9vYmplY3RzKCAkZGF0YW9iaiApOwoJbXkgJHZhbGlkX2RzID0g -e307Cglmb3JlYWNoIG15ICRkc2lkICgga2V5cyAlJG9iamVjdHMgKQoJewoJCSR2YWxpZF9kcy0+ -eyRkc2lkfSA9ICRyZXBvLT5kYXRhc2V0KCAkZHNpZCApOwoJfQoKCW15IEBwcm9ibGVtczsKCglm -b3JlYWNoIG15ICRmaWVsZCAoIEB7ICRwbHVnaW4tPnJlcG9ydF9maWVsZHNfb3JkZXIoICRkYXRh -b2JqICkgfHwgW10gfSApCgl7CgkJIyB2YWxpZGF0aW9uIGFjdGlvbgoJCW15ICR2X2ZpZWxkID0g -JHZhbF9maWVsZHMtPnskZmllbGR9OwoJCW5leHQgdW5sZXNzIGRlZmluZWQgJHZfZmllbGQ7ICMg -bm8gdmFsaWRhdGlvbiByZXF1aXJlZAoKCQkjIHNpbXBsZSBjYXNlIC0gY29kZSBoYW5kbGVzIHZh -bGlkYXRpb24KCQlpZiggcmVmKCAkdl9maWVsZCApIGVxICdDT0RFJyApCgkJewoJCQkjIGEgc3Vi -e30gd2UgbmVlZCB0byBydW4KCQkJZXZhbCB7CgkJCQkmJHZfZmllbGQoICRwbHVnaW4sICRvYmpl -Y3RzLCBcQHByb2JsZW1zICk7CgkJCX07CgkJCWlmKCAkQCApCgkJCXsKCQkJCSRyZXBvLT5sb2co -ICJWYWxpZGF0aW9uIFJ1bnRpbWUgZXJyb3I6ICRAIiApOwoJCQl9CgkJCW5leHQ7CgkJfQoJCWVs -c2lmKCBsYyAkdl9maWVsZCBuZSAicmVxdWlyZWQiICkKCQl7CgkJCSRyZXBvLT5sb2coICJWYWxp -ZGF0aW9uIFJ1bnRpbWUgZXJyb3I6ICR2X2ZpZWxkIG11c3QgYmUgY29kZSByZWYgb3IgJ3JlcXVp -cmVkJyIgKTsKCQkJbmV4dDsKCQl9CgoJCSMgY2hlY2sgcmVxdWlyZWQgdmFsdWVzCgoJCW15ICR2 -YWx1ZTsgIyB0aGUgdmFsdWUgdG8gdmFsaWRhdGUKCQlteSAkZXBfZmllbGQgPSAkcmVwb3J0X2Zp -ZWxkcy0+eyRmaWVsZH07CgkJaWYoIHJlZiggJGVwX2ZpZWxkICkgZXEgJ0NPREUnICkKCQl7CgkJ -CSMgYSBzdWJ7fSB3ZSBuZWVkIHRvIHJ1bgoJCQlldmFsIHsKCQkJCSR2YWx1ZSA9ICYkZXBfZmll -bGQoICRwbHVnaW4sICRvYmplY3RzICk7CgkJCX07CgkJCWlmKCAkQCApCgkJCXsKCQkJCSRyZXBv -LT5sb2coICJWYWxpZGF0aW9uIFJ1bnRpbWUgZXJyb3I6ICRAIiApOwoJCQl9CgkJfQoJCWVsc2lm -KCAkZXBfZmllbGQgPX4gL14oW2Etel9dKylcLihbMC05YS16X10rKSQvICkKCQl7CgkJCSMgYSBz -dHJhaWdodCBtYXBwaW5nIHdpdGggYW4gRVByaW50cyBmaWVsZAoJCQlteSggJGRzX2lkLCAkZXBf -ZmllbGRuYW1lICkgPSAoICQxLCAkMiApOwoJCQlteSAkZHMgPSAkdmFsaWRfZHMtPnskZHNfaWR9 -OwoKCQkJaWYoIGRlZmluZWQgJGRzICYmICRkcy0+aGFzX2ZpZWxkKCAkZXBfZmllbGRuYW1lICkg -KQoJCQl7CgkJCQkkdmFsdWUgPSAkb2JqZWN0cy0+eyRkc19pZH0tPnZhbHVlKCAkZXBfZmllbGRu -YW1lICk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkjIGRhdGFzZXQgb3IgZmllbGQgZG9lc24ndCBl -eGlzdAoJCQkJJHJlcG8tPmxvZyggIlZhbGlkYXRpb24gUnVudGltZSBlcnJvcjogZGF0YXNldCAk -ZHNfaWQgb3IgZmllbGQgJGVwX2ZpZWxkbmFtZSBkb2Vzbid0IGV4aXN0IiApOwoJCQl9CgkJfQoK -CQkjIGlzIGZpZWxkIHNldD8KCQlpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICR2YWx1ZSAp -ICkKCQl7CgkJCXB1c2ggQHByb2JsZW1zLCAiTWlzc2luZyByZXF1aXJlZCBmaWVsZCAkZmllbGQi -OwoJCX0KCX0KCglyZXR1cm4gQHByb2JsZW1zOwp9CgojIFRPRE8gTm90ZSBjb3B5IG9mIEV4cG9y -dDo6UmVwb3J0OjpnZXRfcmVsYXRlZF9vYmplY3RzCnN1YiBnZXRfcmVsYXRlZF9vYmplY3RzCnsK -CW15KCAkcGx1Z2luLCAkZGF0YW9iaiApID0gQF87CgoJbXkgJGNtZCA9IFsgJ3JlcG9ydHMnLCAk -cGx1Z2luLT5nZXRfcmVwb3J0LCAnZ2V0X3JlbGF0ZWRfb2JqZWN0cycgXTsKICAgICAgICBpZigg -JHBsdWdpbi0+cmVwb3NpdG9yeS0+Y2FuX2NhbGwoIEAkY21kICkgKQogICAgICAgIHsKCQlyZXR1 -cm4gJHBsdWdpbi0+cmVwb3NpdG9yeS0+Y2FsbCggJGNtZCwgJHBsdWdpbi0+cmVwb3NpdG9yeSwg -JGRhdGFvYmogKSB8fCB7fTsKICAgICAgICB9CgoJIyBqdXN0IHBhc3MgdGhlIGRhdGFvYmogaXRz -ZWxmCglyZXR1cm4gewoJCSRkYXRhb2JqLT5kYXRhc2V0LT5jb25maWQgPT4gJGRhdGFvYmosCgl9 -Owp9CgojIFRPRE8gTm90ZSBjb3B5IG9mIEV4cG9ydDo6UmVwb3J0OjpyZXBvcnRfZmllbGRzX29y -ZGVyCnN1YiByZXBvcnRfZmllbGRzX29yZGVyCnsKCW15KCAkcGx1Z2luICkgPSBAXzsKCglyZXR1 -cm4gJHBsdWdpbi0+e3JlcG9ydF9maWVsZHNfb3JkZXJ9IGlmKCBkZWZpbmVkICRwbHVnaW4tPnty -ZXBvcnRfZmllbGRzX29yZGVyfSApOwoKCW15ICRyZXBvcnQgPSAkcGx1Z2luLT5nZXRfcmVwb3J0 -KCk7CglyZXR1cm4gW10gdW5sZXNzKCBkZWZpbmVkICRyZXBvcnQgKTsKCgkkcGx1Z2luLT57cmVw -b3J0X2ZpZWxkc19vcmRlcn0gPSAkcGx1Z2luLT5yZXBvc2l0b3J5LT5jb25maWcoICdyZXBvcnRz -JywgJHJlcG9ydCwgJ2ZpZWxkcycgKTsKCglyZXR1cm4gJHBsdWdpbi0+e3JlcG9ydF9maWVsZHNf -b3JkZXJ9Owp9CgojIFRPRE8gTm90ZSBjb3B5IG9mIEV4cG9ydDo6UmVwb3J0OjpyZXBvcnRfZmll -bGRzCnN1YiByZXBvcnRfZmllbGRzCnsKCW15KCAkcGx1Z2luICkgPSBAXzsKCglyZXR1cm4gJHBs -dWdpbi0+e3JlcG9ydF9maWVsZHN9IGlmKCBkZWZpbmVkICRwbHVnaW4tPntyZXBvcnRfZmllbGRz -fSApOwoKCW15ICRyZXBvcnQgPSAkcGx1Z2luLT5nZXRfcmVwb3J0KCk7CglyZXR1cm4gW10gdW5s -ZXNzKCBkZWZpbmVkICRyZXBvcnQgKTsKCgkkcGx1Z2luLT57cmVwb3J0X2ZpZWxkc30gPSAkcGx1 -Z2luLT5yZXBvc2l0b3J5LT5jb25maWcoICdyZXBvcnRzJywgJHJlcG9ydCwgJ21hcHBpbmdzJyAp -OwoKCXJldHVybiAkcGx1Z2luLT57cmVwb3J0X2ZpZWxkc307Cn0KCnN1YiB2YWxpZGF0ZV9maWVs -ZHMKewoJbXkoICRwbHVnaW4gKSA9IEBfOwoKCXJldHVybiAkcGx1Z2luLT57dmFsaWRhdGVfZmll -bGRzfSBpZiggZGVmaW5lZCAkcGx1Z2luLT57dmFsaWRhdGVfZmllbGRzfSApOwoKCW15ICRyZXBv -cnQgPSAkcGx1Z2luLT5nZXRfcmVwb3J0KCk7CglyZXR1cm4gW10gdW5sZXNzKCBkZWZpbmVkICRy -ZXBvcnQgKTsKCgkkcGx1Z2luLT57dmFsaWRhdGVfZmllbGRzfSA9ICRwbHVnaW4tPnJlcG9zaXRv -cnktPmNvbmZpZyggJ3JlcG9ydHMnLCAkcmVwb3J0LCAndmFsaWRhdGUnICk7CgoJcmV0dXJuICRw -bHVnaW4tPnt2YWxpZGF0ZV9maWVsZHN9Owp9CgojIyByZW5kZXJpbmcKCiMgVGhlICJzcGxhc2gg -cGFnZSIKc3ViIHJlbmRlcl9zcGxhc2hfcGFnZQp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRy -ZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CglteSBAcGx1Z2lucyA9ICRzZWxmLT5yZXBvcnRfcGx1 -Z2luczsKCglpZiggIXNjYWxhciggQHBsdWdpbnMgKSApCgl7CgkJcmV0dXJuICRzZWxmLT5odG1s -X3BocmFzZSggIm5vX3JlcG9ydHMiICk7Cgl9CgoJbXkgQGxhYmVsczsKCW15IEBwYW5lbHM7CgoJ -I3ByZXNldCByZXBvcnRzCglwdXNoIEBsYWJlbHMsICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9y -dHNfcHJlc2V0IiApOwoJbXkgJHByZXNldCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiICk7 -CglteSAkcHJlc2V0c19hZGRlZCA9IDA7CgoJIyB0b3AgY2F0ZWdvcnk6IGJ5IGNsYXNzbmFtZSA+ -IFJlcG9ydDo6Uk9TOjpTb21lUmVwb3J0MSwgUmVwb3J0OjpST1M6OlNvbWVSZXBvcnQyCgoJbXkg -JHVsID0gJHNlbGYtPnJlcG9zaXRvcnktPm1ha2VfZWxlbWVudCggJ3VsJywgY2xhc3MgPT4gJ2Vw -X3JlcG9ydF9jYXRlZ29yeScgKTsKCgkjIGNhdCB+IGNhdGVnb3J5IC0gIW1lZW93CglteSAkY2F0 -ID0gIiI7CglteSAkY2F0X2xpID0gdW5kZWY7IAoJbXkgJGNhdF91bCA9IHVuZGVmOwoJCgkjcHJl -cGFyZSBoYXNoIG9mIHJlcG9ydGluZyBwbHVnaW5zCglteSAlcmVwb3J0X2hhc2g7Cglmb3JlYWNo -IG15ICRyZXBvcnRfcGx1Z2luICggc29ydCB7ICRhLT5nZXRfc3VidHlwZSBjbXAgJGItPmdldF9z -dWJ0eXBlIH0gQHBsdWdpbnMgKQoJewoJCW15ICRwbHVnaW5fY2F0ID0gJHJlcG9ydF9wbHVnaW4t -PmdldF9zdWJ0eXBlOwoJCSRwbHVnaW5fY2F0ID1+IHMvXlJlcG9ydDo6KFteOl0rKTo/Oj8oLiop -JC8kMS9nOwkKCgkJaWYoICRjYXQgbmUgJHBsdWdpbl9jYXQgKSAjd2UgaGF2ZSBhIHRvcC1jYXRl -Z29yeQoJCXsKCQkJJGNhdCA9ICRwbHVnaW5fY2F0OwoJCQkkcmVwb3J0X2hhc2h7JGNhdH0gPSBb -XTsKCQl9CgoJCWlmKCBFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkMiApICkKCQl7CgkJCXB1c2gg -QHskcmVwb3J0X2hhc2h7JGNhdH19LCAkcmVwb3J0X3BsdWdpbjsKCQl9Cgl9CgkKCWZvciBteSAk -dG9wX2NhdCggc29ydCBrZXlzICVyZXBvcnRfaGFzaCApCgl7CgkJbXkgQHJlcG9ydF9wbHVnaW5z -ID0gQHskcmVwb3J0X2hhc2h7JHRvcF9jYXR9fTsKCQlpZiggc2NhbGFyKCBAcmVwb3J0X3BsdWdp -bnMgKSA+IDAgKQoJCXsKCQkJI3JlbmRlciB0b3AtY2F0ZWdvcnkKCQkJJGNhdF9saSA9ICR1bC0+ -YXBwZW5kQ2hpbGQoICRzZWxmLT5yZXBvc2l0b3J5LT5tYWtlX2VsZW1lbnQoICdsaScgKSApOwoJ -CQkkY2F0X2xpLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlcG9zaXRvcnktPmh0bWxfcGhyYXNlKCAi -UGx1Z2luL1NjcmVlbi9SZXBvcnQvJHRvcF9jYXQ6dGl0bGUiICkgKTsKCgkJCSRjYXRfdWwgPSAk -Y2F0X2xpLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlcG9zaXRvcnktPm1ha2VfZWxlbWVudCggJ3Vs -JywgY2xhc3MgPT4gJ2VwX3JlcG9ydF9pdGVtcycgKSApOwoKCQkJZm9yZWFjaCBteSAkciAoIEBy -ZXBvcnRfcGx1Z2lucyApCgkJCXsKCQkJCW15ICRzdWJfbGkgPSAkY2F0X3VsLT5hcHBlbmRDaGls -ZCggJHNlbGYtPnJlcG9zaXRvcnktPm1ha2VfZWxlbWVudCggJ2xpJyApICk7CgkJCQkkc3ViX2xp -LT5hcHBlbmRDaGlsZCggJHItPnJlbmRlcl9hY3Rpb25fbGluayApOwoJCQkJJHByZXNldHNfYWRk -ZWQrKzsKCQkJfQoJCX0KCX0KCgkkcHJlc2V0LT5hcHBlbmRDaGlsZCggJHVsICk7CglwdXNoIEBw -YW5lbHMsICRwcmVzZXQ7CgoJI2N1c3RvbSByZXBvcnRzCglwdXNoIEBsYWJlbHMsICRyZXBvLT5o -dG1sX3BocmFzZSggInJlcG9ydHNfY3VzdG9tIiApOwoKCW15ICRjdXN0b20gPSAkcmVwby0+bWFr -ZV9lbGVtZW50KCAiZGl2IiwgaWQ9PiJjdXN0b21fcmVwb3J0IiApOwoJbXkgJGZvcm0gPSAkcmVw -by0+cmVuZGVyX2Zvcm0oICJnZXQiICk7CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVu -ZGVyX2NvbnRyb2xzKCAxICkgKTsKCgkjYWRkIGVhY2ggcmVwb3J0IHRvIHRoZSBzZWxlY3QgY29t -cG9uZW50IGFuZCBnZW5lcmF0ZSBzZWFyY2ggZm9ybSBpZiByZXF1aXJlZAoJbXkgJHJlcG9ydF9z -ZWxlY3QgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic2VsZWN0IiwgbmFtZT0+InJlcG9ydCIsIGlk -PT4ic2VsZWN0X3JlcG9ydCIsICdhcmlhLWxhYmVsbGVkYnknID0+ICJyZXBvcnRfc2VsZWN0X2xh -YmVsIiApOwoJbXkgJXNlYXJjaF9mb3JtczsKCW15ICRjdXN0b21fcmVwb3J0cyA9IDA7CgkjZm9y -ZWFjaCBteSAkcmVwb3J0X3BsdWdpbiAoIEBwbHVnaW5zICkKCWZvcmVhY2ggbXkgJHJlcG9ydF9w -bHVnaW4gKCBzb3J0IHsgJGEtPmdldF9zdWJ0eXBlIGNtcCAkYi0+Z2V0X3N1YnR5cGUgfSBAcGx1 -Z2lucyApCgl7CgkJaWYoICRyZXBvcnRfcGx1Z2luLT5wYXJhbSggImN1c3RvbSIgKSApCgkJewkK -CQkJJGN1c3RvbV9yZXBvcnRzKys7CgkJCW15ICRmb3JtaWQgPSAkcmVwb3J0X3BsdWdpbi0+e3Nj -b25mfTsKCgkJCSNhZGQgdG8gc2VsZWN0IGNvbXBvbmVudAoJCQlteSAkaWQgPSAkcmVwb3J0X3Bs -dWdpbi0+e3JlcG9ydH07CgkJCW15ICRvcHRpb24gPSAkcmVwby0+bWFrZV9lbGVtZW50KCAib3B0 -aW9uIiwgdmFsdWUgPT4gJHJlcG9ydF9wbHVnaW4tPmdldF9zdWJ0eXBlLCBmb3JtID0+ICRmb3Jt -aWQgKTsKCgkJCSNzZXQgZGVmYXVsdCBvcHRpb24gZm9yIHNlbGVjdCBjb21wb25lbnQgaWYgcmVx -dWlyZWQgKGkuZS4gd2UgaGF2ZSBjb21lIGZyb20gYSByZWZpbmUgc2VhcmNoIG9yIG5ldyBzZWFy -Y2ggbGluaykKCQkJbXkgJHJlZmluZV9zY29uZiA9ICRzZWxmLT57c2Vzc2lvbn0tPnBhcmFtKCAi -c2NvbmYiICk7CgkJCWlmKCAoICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInVwZGF0 -ZSIgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAibmV3c2VhcmNoIiApICYmIGRl -ZmluZWQgJHJlZmluZV9zY29uZiAmJiAkcmVmaW5lX3Njb25mIGVxICRmb3JtaWQgKQoJCQl7CgkJ -CQkkb3B0aW9uLT5zZXRBdHRyaWJ1dGUoIHNlbGVjdGVkID0+ICJzZWxlY3RlZCIgKTsKCQkJfQoK -CQkJI3NldCBvcHRpb24gdGV4dCBhbmQgYWRkIHRvIHNlbGVjdAogIAkJCSRvcHRpb24tPmFwcGVu -ZENoaWxkKCAkcmVwb3J0X3BsdWdpbi0+cmVuZGVyX3RpdGxlICk7CgkJCSRyZXBvcnRfc2VsZWN0 -LT5hcHBlbmRDaGlsZCggJG9wdGlvbiApOwoKCQkJI2NyZWF0ZSBzZWFyY2ggZm9ybQkJCQoJCQkj -Z2V0IHJlcG9ydCBkYXRhc2V0IGFuZCBhcHByb3ByaWF0ZSBzZWFyY2ggY29uZmlnCgkJCW15ICRy -ZXBvcnRfZHMgPSAkcmVwby0+ZGF0YXNldCggJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRhc2V0 -aWR9ICk7CgkJCW15ICRzY29uZiA9ICRyZXBvcnRfZHMtPnNlYXJjaF9jb25maWcoICRyZXBvcnRf -cGx1Z2luLT57c2NvbmZ9ICkgOwoJCQkjbXkgJHNlYXJjaCA9IEVQcmludHM6OlNlYXJjaC0+bmV3 -KAoJCSAgICAgICAgIyAgICAgICAga2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAgICMJ -c2Vzc2lvbiA9PiAkcmVwbywKCQkgICAgICAgICMgICAgICAgIGRhdGFzZXQgPT4gJHJlcG9ydF9k -cywKCQkgICAgICAgICMgICAgICAgICV7JHNjb25mfQoJCQkjKTsKCgkJCW15ICRmb3JtYXQgPSAi -cmVwb3J0LyIgLiAkcmVwb3J0X2RzLT5iYXNlX2lkOwoJICAgICAgICAgICAgICAgIG15ICRzZWFy -Y2hleHAgPSAkcmVwby0+cGx1Z2luKCAiU2VhcmNoIiApLT5wbHVnaW5zKAogICAgICAgICAgICAg -ICAgICAgICAgICAJewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlrZWVwX2NhY2hl -ID0+IDEsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPT4gJHNlbGYt -PntzZXNzaW9ufSwKICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNldCA9PiAk -cmVwb3J0X2RzLAogICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAleyRzY29uZn0KICAg -ICAgICAgICAgICAgICAgICAgICAgCX0sCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4g -IlNlYXJjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbl9zZWFyY2ggPT4gJGZvcm1hdCwK -ICAgICAgICAgICAgICAgIAkpOwkKCQkJJHNlYXJjaGV4cC0+ZnJvbV9mb3JtOwoKCQkJI2dlbmVy -YXRlIHRoZSBmb3JtCgkJCW15ICRmcmFnID0gJHNlbGYtPnJlbmRlcl9zZWFyY2hfZmllbGRzKCAk -c2VhcmNoZXhwLCAkZm9ybWlkICk7CgkJCSRzZWFyY2hfZm9ybXN7JGZvcm1pZH0gPSAkZnJhZyB1 -bmxlc3MgZXhpc3RzICRzZWFyY2hfZm9ybXN7JGZvcm1pZH07CgkJfQkKCX0KCiAgICAjIGxhYmVs -IGZvciBmb3JtIHNlbGVjdCBkcm9wIGRvd24KICAgIG15ICRyZXBvcnRfbGFiZWwgPSAkcmVwby0+ -bWFrZV9lbGVtZW50KCAibGFiZWwiLCBpZD0+InJlcG9ydF9zZWxlY3RfbGFiZWwiICk7CiAgICAk -cmVwb3J0X2xhYmVsLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0X3Nl -bGVjdF9sYWJlbCIgKSApOwogICAgJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwb3J0X2xhYmVsICk7 -CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwb3J0X3NlbGVjdCApOwoJJGZvcm0tPmFwcGVuZENo -aWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNjcmVlbiIsICRzZWxmLT57c2NyZWVu -aWR9ICkgKTsKCgkjcmVuZGVyIHBvc3NpYmxlIHNlYXJjaCBmb3JtcwoJZm9yZWFjaCBteSAkZm9y -bWlkIChrZXlzICVzZWFyY2hfZm9ybXMpCgl7CgkJbXkgJHRhYmxlID0gJHJlcG8tPm1ha2VfZWxl -bWVudCggImRpdiIsIGNsYXNzPT4iZXBfdGFibGUgZXBfc2VhcmNoX2ZpZWxkcyIsIGlkPT4kZm9y -bWlkLCBzdHlsZT0+ImRpc3BsYXk6IG5vbmUiICk7CgkgICAgICAgICRmb3JtLT5hcHBlbmRDaGls -ZCggJHRhYmxlICk7CgkgICAgICAgICR0YWJsZS0+YXBwZW5kQ2hpbGQoICRzZWFyY2hfZm9ybXN7 -JGZvcm1pZH0gKTsKCX0KCgkkZm9ybS0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfY29udHJv -bHMgKTsKCSRjdXN0b20tPmFwcGVuZENoaWxkKCAkZm9ybSApOwoKCSNqYXZhc2NyaXB0IGZvciBj -aGFuZ2luZyBmb3JtcyBiYXNlZCBvbiByZXBvcnQgc2VsZWN0aW9uCgkkY3VzdG9tLT5hcHBlbmRD -aGlsZCggJHJlcG8tPm1ha2VfamF2YXNjcmlwdCggJ2luaXRSZXBvcnRGb3JtKCk7JyApICk7CgoJ -aWYoICRjdXN0b21fcmVwb3J0cyAmJiAkcHJlc2V0c19hZGRlZCA+IDAgKSAjc2V0IHVwIHRhYiBp -bnRlcmZhY2UKCXsKCQlteSBAbGFiZWxzOwoJICAgICAgICBteSBAcGFuZWxzOwoKCQlwdXNoIEBs -YWJlbHMsICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydHNfcHJlc2V0IiApOwoJCXB1c2ggQGxh -YmVscywgJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0c19jdXN0b20iICk7CgoJCXB1c2ggQHBh -bmVscywgJHByZXNldDsKCQlwdXNoIEBwYW5lbHMsICRjdXN0b207CgoJCW15ICVvcHRzOwoJCWlm -KCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJuZXdzZWFyY2giIHx8ICRzZWxmLT57 -cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInVwZGF0ZSIgICkKCQl7CgkJCSRvcHRze2N1cnJlbnR9 -ID0gMTsKCQl9CgoJCXJldHVybiAkcmVwby0+eGh0bWwtPnRhYnMoXEBsYWJlbHMsIFxAcGFuZWxz -LCAlb3B0cyApOwoJfQoJZWxzaWYoICRwcmVzZXRzX2FkZGVkID4gMCApCgl7CQoJCXJldHVybiAk -cHJlc2V0OwoJfQoJZWxzZQoJewoJCXJldHVybiAkY3VzdG9tOwoJfQp9CgpzdWIgcmVuZGVyX3Nl -YXJjaF9maWVsZHMKewogICAgbXkoICRzZWxmLCAkc2VhcmNoLCAkZm9ybWlkICkgPSBAXzsKCglt -eSAkZXhwID0gJHNlbGYtPntzZXNzaW9ufS0+cGFyYW0oICJleHAiICk7CglteSAkc2NvbmYgPSAk -c2VsZi0+e3Nlc3Npb259LT5wYXJhbSggInNjb25mIiApOwogICAgaWYoIGRlZmluZWQgJGV4cCAm -JiBkZWZpbmVkICRzY29uZiAmJiAkc2NvbmYgZXEgJGZvcm1pZCApCgl7CiAgICAgICAgJHNlYXJj -aC0+ZnJvbV9zdHJpbmcoICRleHAgKTsKICAJfQoKICAgIG15ICRmcmFnID0gJHNlbGYtPntzZXNz -aW9ufS0+bWFrZV9kb2NfZnJhZ21lbnQ7CiAgICBmb3JlYWNoIG15ICRzZiAoICRzZWFyY2gtPmdl -dF9ub25fZmlsdGVyX3NlYXJjaGZpZWxkcyApCiAgICB7CiAgICAgICAgbXkgJGxhYmVsOwogICAg -ICAgIG15ICRmaWVsZDsKICAgICAgICBpZiAoICRzZi0+eyJmaWVsZCJ9LT5nZXRfdHlwZSgpIGVx -ICJuYW1lZHNldCIgKQogICAgICAgIHsKICAgICAgICAgICAgIyB3ZSB3YW50IGEgbGVnZW5kIGFu -ZCBhIGxhYmVsCiAgICAgICAgICAgICRsYWJlbCA9ICRzZWxmLT57c2Vzc2lvbn0tPm1ha2VfZWxl -bWVudCggInNwYW4iLCBpZD0+JHNmLT5nZXRfZm9ybV9wcmVmaXguIl9sYWJlbCIgKTsKICAgICAg -ICAgICAgJGxhYmVsLT5hcHBlbmRDaGlsZCggJHNmLT5yZW5kZXJfbmFtZSApOwoKICAgICAgICAg -ICAgbXkgJGxlZ2VuZCA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRzZi0+cmVuZGVy -X25hbWUgKTsKICAgICAgICAgICAgJGZpZWxkID0gJHNmLT5yZW5kZXIoIGxlZ2VuZCA9PiAkbGVn -ZW5kICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkbGFiZWwgPSAkc2Vs -Zi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoICJzcGFuIiwgaWQ9PiRzZi0+Z2V0X2Zvcm1fcHJl -Zml4LiJfbGFiZWwiICk7CiAgICAgICAgICAgICRsYWJlbC0+YXBwZW5kQ2hpbGQoICRzZi0+cmVu -ZGVyX25hbWUgKTsKICAgICAgICAgICAgJGZpZWxkID0gJHNmLT5yZW5kZXIoKTsKICAgICAgICB9 -CgoJICAgICRmcmFnLT5hcHBlbmRDaGlsZCgKICAgICAgICAgICAgJHNlbGYtPntzZXNzaW9ufS0+ -cmVuZGVyX3Jvd193aXRoX2hlbHAoCiAgICAgICAgICAgICAgICBoZWxwX3ByZWZpeCA9PiAkc2Yt -PmdldF9mb3JtX3ByZWZpeC4iX2hlbHAiLAogICAgICAgICAgICAgICAgaGVscCA9PiAkc2YtPnJl -bmRlcl9oZWxwLAogICAgICAgICAgICAgICAgbGFiZWwgPT4gJGxhYmVsLAogICAgICAgICAgICAg -ICAgZmllbGQgPT4gJGZpZWxkLAogICAgICAgICAgICAgICAgbm9fdG9nZ2xlID0+ICggJHNmLT57 -c2hvd19oZWxwfSBlcSAiYWx3YXlzIiApLAogICAgICAgICAgICAgICAgbm9faGVscCA9PiAoICRz -Zi0+e3Nob3dfaGVscH0gZXEgIm5ldmVyIiApLAogICAgICAgICkgKTsKICAgIH0KCiAgICByZXR1 -cm4gJGZyYWc7Cn0KCnN1YiByZW5kZXJfY29udHJvbHMKewoJbXkoICRzZWxmLCAkd2l0aF9qcyAp -ID0gQF87CgogICAgbXkgJGRpdiA9ICRzZWxmLT57c2Vzc2lvbn0tPm1ha2VfZWxlbWVudCgKICAg -ICAgICAiZGl2IiAsCiAgICAgICAgY2xhc3MgPT4gImVwX3NlYXJjaF9idXR0b25zIiApOwogICAg -ICAgIAogICAgJGRpdi0+YXBwZW5kQ2hpbGQoICRzZWxmLT57c2Vzc2lvbn0tPnJlbmRlcl9hY3Rp -b25fYnV0dG9ucygKICAgICAgICBfb3JkZXIgPT4gWyAic2VhcmNoIiBdLAogICAgICAgICNuZXdz -ZWFyY2ggPT4gJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246 -YWN0aW9uX3Jlc2V0IiApLAogICAgICAgIHNlYXJjaCA9PiAkc2VsZi0+e3Nlc3Npb259LT5waHJh -c2UoICJsaWIvc2VhcmNoZXhwcmVzc2lvbjphY3Rpb25fc2VhcmNoIiApICkKICAgICk7CgkKCW15 -ICR4bWwgPSAkc2VsZi0+e3Nlc3Npb259LT54bWw7CgoJaWYoICR3aXRoX2pzICkKCXsKCQlteSAk -Y2xlYXJfZm9ybSA9ICRkaXYtPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NsZWFyZm9ybSgg -JHhtbCApICk7Cgl9CgogICAgbXkgJGNsZWFyX2J0biA9ICRkaXYtPmFwcGVuZENoaWxkKCAkeG1s -LT5jcmVhdGVfZWxlbWVudCggImJ1dHRvbiIsCiAgICAgICAgdHlwZSA9PiAiYnV0dG9uIiwKICAg -ICAgICBvbmNsaWNrID0+ICJjbGVhckZvcm0oKTsiLAogICAgICAgIGNsYXNzID0+ICJlcF9mb3Jt -X2FjdGlvbl9idXR0b24gY2xlYXJfYnV0dG9uIiwKICAgICkgKTsKICAgICRjbGVhcl9idG4tPmFw -cGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkc2VsZi0+e3Nlc3Npb259LT5waHJh -c2UoICJsaWIvc2VhcmNoZXhwcmVzc2lvbjphY3Rpb25fcmVzZXQiICkgKSApOwoJcmV0dXJuICRk -aXY7Cn0KCnN1YiByZW5kZXIKewoJbXkoICRzZWxmICkgPSBAXzsKCgkjIGlmIHVzZXJzIGFjY2Vz -cyBTY3JlZW46OlJlcG9ydCBkaXJlY3RseSB3ZSB3YW50IHRvIGRpc3BsYXkgc29tZSBzb3J0IG9m -IG1lbnUKCSMgd2hlcmUgdXNlcnMgY2FuIHNlbGVjdCB2aWV3YWJsZSByZXBvcnRzCglpZiggKCAi -RVByaW50czo6UGx1Z2luOjoiLiRzZWxmLT5nZXRfaWQgZXEgX19QQUNLQUdFX18gJiYgJHNlbGYt -Pntwcm9jZXNzb3J9LT57YWN0aW9ufSBuZSAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29y -fS0+e2FjdGlvbn0gZXEgIm5ld3NlYXJjaCIgKQoJewkKCQlyZXR1cm4gJHNlbGYtPnJlbmRlcl9z -cGxhc2hfcGFnZTsKCX0KCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVu -ayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2Vs -Zi0+cmVuZGVyX2V4cG9ydF9iYXIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5k -ZXJfZ3JvdXBfb3B0aW9ucyApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9z -b3J0X29wdGlvbnMgKTsKCglpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2Vh -cmNoIiApCgl7CgkJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9yZWZpbmVfc2Vh -cmNoICk7Cgl9CgoJbXkgJGl0ZW1zID0gJHNlbGYtPml0ZW1zOwoJaWYoICFkZWZpbmVkICRpdGVt -cyB8fCAkaXRlbXMtPmNvdW50ID09IDAgKQoJewoJCSMgTm8gaXRlbXMgbWVzc2FnZQoJfQoKCW15 -ICRqc29uOwoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRncm91cGVkID0gJHNlbGYt -PmdldF9ncm91cGVkX2l0ZW1zKCAkaXRlbXMsIDEgKTsKCQkkanNvbiA9IGVuY29kZV9qc29uICRn -cm91cGVkOwoJfQoJZWxzZQoJewoJCW15ICRpdGVtX2lkcyA9IGRlZmluZWQgJGl0ZW1zID8gJGl0 -ZW1zLT5pZHMgOiBbXTsKCQkkanNvbiA9ICJbIi5qb2luKCcsJyxAJGl0ZW1faWRzKS4iXSI7Cgl9 -CgogICAgICAgIG15ICR1cmwgPSAkcmVwby0+Y3VycmVudF91cmwoIGhvc3QgPT4gMSApOwogICAg -ICAgIG15ICRwYXJhbWV0ZXJzID0gVVJJLT5uZXc7CiAgICAgICAgJHBhcmFtZXRlcnMtPnF1ZXJ5 -X2Zvcm0oCiAgICAgICAgICAgICAgICAkc2VsZi0+aGlkZGVuX2JpdHMsCiAgICAgICAgKTsKICAg -ICAgICAkcGFyYW1ldGVycyA9ICRwYXJhbWV0ZXJzLT5xdWVyeTsKCQkKCW15ICRkcyA9ICRyZXBv -LT5kYXRhc2V0KCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICkgKSBpZiBkZWZpbmVkICRzZWxm -LT5wYXJhbSggJ2RhdGFzZXRpZCcgKTsKCW15ICRwcmVmaXggPSAkZHMtPmJhc2VfaWQgaWYgZGVm -aW5lZCAkZHM7CgoJIyB0aGUgbWFpbiA8ZGl2PgoJbXkgJGNvbnRhaW5lcl9pZCA9IHNwcmludGYo -ICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIsICRzZWxmLT5nZXRfcmVwb3J0ICk7CgoJI3VwZGF0 -ZSBqYXZhc2NyaXB0IHBhcmFtZXRlcnMgaWYgY29taW5nIGZyb20gYSBzZWFyY2ggcmVxdWVzdAoJ -aWYoICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRw -bHVnaW4gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9OwoJCSRwbHVnaW4gPX4gcy86LyUz -QS9nOwoJCSRwYXJhbWV0ZXJzID0gInNjcmVlbj0kcGx1Z2luIjsKCQkkcHJlZml4ID0gJHNlbGYt -Pntwcm9jZXNzb3J9LT57ZGF0YXNldGlkfTsKCQkkY29udGFpbmVyX2lkID0gc3ByaW50ZiggImVw -X3JlcG9ydF8lc1xfY29udGFpbmVyIiwgJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0X3BsdWdp -bn0tPntyZXBvcnR9ICk7Cgl9CgkKCSNzaG93L2hpZGUgY29tcGxpYW5jZQoJbXkgJHNob3dfY29t -cGxpYW5jZSA9IDE7Cgkkc2hvd19jb21wbGlhbmNlID0gJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9 -IGlmIGRlZmluZWQgJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9OwoKCSNjdXN0b20gbGFiZWxzCglt -eSAkbGFiZWxzID0gMDsKCSRsYWJlbHMgPSBlbmNvZGVfanNvbiAkc2VsZi0+e2xhYmVsc30gaWYg -ZGVmaW5lZCAkc2VsZi0+e2xhYmVsc307CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPm1h -a2VfamF2YXNjcmlwdCggPDwiRU9KIiApICk7CmRvY3VtZW50Lm9ic2VydmUoImRvbTpsb2FkZWQi -LCBmdW5jdGlvbigpIHsKCW5ldyBFUHJpbnRzX1NjcmVlbl9SZXBvcnRfTG9hZGVyKCB7CgkJaWRz -OiAkanNvbiwKCQlzdGVwOiAyMCwKCQlwcmVmaXg6ICckcHJlZml4JywKCQl1cmw6ICckdXJsJywK -CQlwYXJhbWV0ZXJzOiAnJHBhcmFtZXRlcnMnLAkJCgkJY29udGFpbmVyX2lkOiAnJGNvbnRhaW5l -cl9pZCcsCgkJc2hvd19jb21wbGlhbmNlOiAkc2hvd19jb21wbGlhbmNlLAoJCWxhYmVsczogJGxh -YmVscwoJfSApLmV4ZWN1dGUoKTsKCn0pOwpFT0oKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBv -LT5tYWtlX2VsZW1lbnQoICdkaXYnLCBjbGFzcyA9PiAnZXBfcmVwb3J0X3BhZ2UnLCBpZCA9PiAk -Y29udGFpbmVyX2lkICkgKTsKCgkjc2hvdyBzZWFyY2ggY29udHJvbHMgYWZ0ZXIgdGhlIHJlc3Vs -dHMgdG9vCglpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCiAg -ICAgICAgewogICAgICAgICAgICAgICAgJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRl -cl9yZWZpbmVfc2VhcmNoICk7CiAgICAgICAgfQoKCXJldHVybiAkY2h1bms7Cn0KCgpzdWIgcmVu -ZGVyX2V4cG9ydF9iYXIKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5y -ZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglteSBA -cGx1Z2lucyA9ICRzZWxmLT5leHBvcnRfcGx1Z2luczsKCXJldHVybiAkY2h1bmsgdW5sZXNzKCBz -Y2FsYXIoIEBwbHVnaW5zICkgfHwgZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv -cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICkgKSApOwoKCW15ICRyZXBvcnRfZHMgPSAkcmVwby0+ -ZGF0YXNldCggJHNlbGYtPntkYXRhc2V0aWR9ICk7CglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJf -Zm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiApOwoKCWlmKCBkZWZp -bmVkICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nl -c3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRy -ZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJvY2Vzc29yfS0+ -e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCQkKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vz -c29yfS0+e3NvcnR9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlk -ZGVuX2ZpZWxkKCAic29ydCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApICk7Cgl9CQoK -CWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRmb3Jt -LT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0JCgogICAgbXkgJGV4cG9ydF9sYWJl -bCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsYWJlbCIsIGlkPT4iZXhwb3J0X3NlbGVjdF9sYWJl -bCIgKTsKICAgICRleHBvcnRfbGFiZWwtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2Uo -ICJleHBvcnRfc2VsZWN0X2xhYmVsIiApICk7CiAgICAkZm9ybS0+YXBwZW5kQ2hpbGQoICRleHBv -cnRfbGFiZWwgKTsKCglpZiggIWRlZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0 -X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApICkgKQoJewoJCSNubyBjdXN0b20gZXhwb3J0IGZpZWxk -cyBkZWZpbmVkLCB1c2UgZXhwb3J0IHBsdWdpbnMgZGVzaWduZWQgZm9yIHRoaXMgcmVwb3J0CgkJ -bXkgJHNlbGVjdCA9ICRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlz -dCgKCQkJbmFtZSA9PiAnZXhwb3J0JywKCQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5 -cGUgfSBAcGx1Z2luc10sCgkJCWxhYmVscyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRf -LT5nZXRfbmFtZSB9IEBwbHVnaW5zfSwKICAgICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieScgPT4g -ImV4cG9ydF9zZWxlY3RfbGFiZWwiLAoJCSkgKTsKCX0KCWVsc2UKCXsKCQkjcHJvdmlkZSBsaXN0 -IG9mIGRlZmF1bHQgZXhwb3J0IHBsdWdpbnMgZm9yIHJlcG9ydHMKCQlAcGx1Z2lucyA9ICRzZWxm -LT5leHBvcnRfcGx1Z2lucyggImdlbmVyaWMiICk7CgkJbXkgJHNlbGVjdCA9ICRmb3JtLT5hcHBl -bmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlzdCgKCQkJbmFtZSA9PiAnZXhwb3J0JywK -CQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgfSBAcGx1Z2luc10sCgkJCWxhYmVs -cyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRfLT5nZXRfbmFtZSB9IEBwbHVnaW5zfSwK -ICAgICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieScgPT4gImV4cG9ydF9zZWxlY3RfbGFiZWwiLAoJ -CSkgKTsKCgkJI2NyZWF0ZSBsYWJlbHMgYW5kIHBhbmVscyBmb3IgdGFiYmVkIGludGVyZmFjZWQK -CQlteSAkeG1sID0gJHJlcG8tPnhtbDsKCQlteSAkeGh0bWwgPSAkcmVwby0+eGh0bWw7CgoJCW15 -ICRzZWxlY3RfYWxsID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX3NlbGVjdGFs -bCggJHhtbCApICk7CgkJbXkgJHNlbGVjdF9idG4gPSAkZm9ybS0+YXBwZW5kQ2hpbGQoICR4bWwt -PmNyZWF0ZV9lbGVtZW50KCAiYnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAi -YnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAgb25jbGljayA9PiAidG9nZ2xlQ2hlY2tib3hl -cygpOyIsCgkgICAgICAgICAgICAgICAgICAgIGNsYXNzID0+ICJlcF9mb3JtX2FjdGlvbl9idXR0 -b24gc2VsZWN0X2J1dHRvbiIsCgkJKSApOwoJICAgICRzZWxlY3RfYnRuLT5hcHBlbmRDaGlsZCgg -JHhtbC0+Y3JlYXRlX3RleHRfbm9kZSggJHJlcG8tPnBocmFzZSggInJlcG9ydF9zZWxlY3QiICkg -KSApOwoKCQkjYWxsb3cgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRzIHRoZXkgd2FudCB0byBl -eHBvcnQKCQlteSAkZXhwb3J0X29wdGlvbnMgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2IiAp -OwoKCQlteSBAa2V5czsKCQlpZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9y -dF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApICkKCQl7CgkJCUBrZXlzID0gQHskcmVwby0+ -Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApfTsKCQl9 -CgkJZWxzZQoJCXsKCQkJQGtleXMgPSBrZXlzICV7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBv -cnRfY29uZn0sICJleHBvcnRmaWVsZHMiICl9OyAKCQl9CgkJZm9yZWFjaCBteSAka2V5ICggQGtl -eXMgKQoJCXsKCQkJI2NyZWF0ZSBhIG5ldyBsaXN0CQkJCgkJCW15ICR1bCA9ICRyZXBvLT5tYWtl -X2VsZW1lbnQoICJ1bCIsCgkgICAgICAgICAgICAgICAgCXN0eWxlID0+ICJsaXN0LXN0eWxlLXR5 -cGU6IG5vbmUiCgkgICAgICAgIAkpOwoJCQkKCQkJbXkgJGNvdW50ID0gMDsgI2NvdW50IGhvdyBt -YW55IGZpZWxkcyB3ZSBhZGQKCQkJZm9yZWFjaCBteSAkZmllbGRuYW1lKCBAeyRyZXBvLT5jb25m -aWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApLT57JGtleX19ICkKCQkJ -ewoJCQkJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJj -dXN0b21fZXhwb3J0IiApICYmIGV4aXN0cyAkeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0 -X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKX17JGZpZWxkbmFtZX0gKSAjd2UgaGF2ZSBhIGN1c3Rv -bSBleHBvcnQgZnVuY3Rpb24gaW5zdGVhZCAKCQkJCXsKCQkJCQkkY291bnQrKzsKCQkJCQkkc2Vs -Zi0+X2V4cG9ydF9maWVsZF9jaGVja2JveCggJHJlcG8sICRmaWVsZG5hbWUsICR1bCwgJHJlcG8t -Pmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRvcHRpb25zOiRmaWVsZG5hbWUiICkgKTsgCgkJCQl9 -CgkJCQllbHNpZiggZGVmaW5lZCBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdfc3Ry -aW5nKCAkcmVwb3J0X2RzLCAkZmllbGRuYW1lICkgKQoJCQkJewoJCQkJCW15ICRmaWVsZCA9IEVQ -cmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRyZXBvcnRfZHMsICRmaWVs -ZG5hbWUgKTsKCQkJCQkkY291bnQrKzsKICAgICAgIAkJCSAgICAgICAgCSRzZWxmLT5fZXhwb3J0 -X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAkZmllbGQtPnJlbmRlcl9u -YW1lICk7CgoJCQkJfQoJCQl9CgkJCWlmKCAkY291bnQgKSAjb25seSBhZGQgb3B0aW9ucyBpZiB3 -ZSBoYXZlIGFueSBmaWVsZHMgdG8gc2hvdwoJCQl7CgkJCQlteSAkZGl2ID0gJHJlcG8tPm1ha2Vf -ZWxlbWVudCggImRpdiIsIGNsYXNzPT4icmVwb3J0X2V4cG9ydF9vcHRpb25zIiApOwoJCQkJJGRp -di0+YXBwZW5kQ2hpbGQoIG15ICRoID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIGNsYXNz -PT4iY3VzdG9tX2V4cG9ydF9oZWFkZXIiICkgKTsKCQkJCSRoLT5hcHBlbmRDaGlsZCggJHJlcG8t -Pmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRzOiRrZXkiICkgKTsJCgkJCQkkZGl2LT5hcHBlbmRD -aGlsZCggJHVsICk7CgkJCQkkZXhwb3J0X29wdGlvbnMtPmFwcGVuZENoaWxkKCAkZGl2ICk7CgkJ -CX0KICAgICAgIAkJfQoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJGV4cG9ydF9vcHRpb25zICk7Cgl9 -CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAKCQkkcmVwby0+cmVuZGVyX2J1dHRvbigKCQkJbmFtZSA9 -PiAiX2FjdGlvbl9leHBvcnQiLAoJCQljbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIiwK -CQkJdmFsdWUgPT4gJHJlcG8tPnBocmFzZSggJ2NnaS91c2Vycy9lZGl0X2VwcmludDpleHBvcnQn -ICkKCSkgKTsKCgkjY3JlYXRlIGEgY29sbGFwc2libGUgYm94CglteSAkaW1hZ2VzdXJsID0gJHJl -cG8tPmN1cnJlbnRfdXJsKCBwYXRoID0+ICJzdGF0aWMiLCAic3R5bGUvaW1hZ2VzIiApOwoJbXkg -JW9wdGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9ufSA9ICRyZXBvOwogICAgICAgICRvcHRpb25ze2lk -fSA9ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAgICAgICAkb3B0aW9uc3t0aXRsZX0gPSAkcmVwby0+ -aHRtbF9waHJhc2UoICJleHBvcnRfdGl0bGUiICk7CiAgICAgICAgJG9wdGlvbnN7Y29sbGFwc2Vk -fSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9ICRmb3JtOwogICAgICAgICRvcHRpb25ze3Nob3df -aWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVsdGlfZG93bi5wbmciOwoJJG9wdGlvbnN7aGlkZV9p -Y29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0aV91cC5wbmciOwoKCW15ICRib3ggPSAkcmVwby0+ -bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9PiJ0ZXh0LWFsaWduOiBsZWZ0IiApOwoJJGJveC0+ -YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6cmVuZGVyKCAlb3B0aW9ucyApICk7CgkkY2h1bmst -PmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9zb3J0 -X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0 -b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglyZXR1cm4gJGNo -dW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntzb3J0X2NvbmZ9LCAi -c29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBvLT5jb25maWcoICRzZWxm -LT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9y -bSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gInNv -cnRfcmVwb3J0IiApOwogICAgICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0 -IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCQoJaWYoIGRlZmluZWQgJHJlcG8t -PnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNl -YXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmll -bGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+c2VyaWFsaXNlKSAp -OwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJ -CSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIs -ICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUg -bGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkc29y -dF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJHNvcnRfbmFt -ZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAgICAgICAgewoJCW15ICRzb3J0X3ZhbHVlID0gJHNv -cnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVu -ZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAkc29ydF92YWx1ZSkg -KTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg -IAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9W -aWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVm -aW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntz -b3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxl -bWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo -cmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJ -JHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJCWVsc2UKCQl7CgkJCW15 -ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpzb3J0X3JlcG9ydCgiJy4k -c29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo -cmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJ -JHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAg -ICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNl -KCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5rcz0+JHNvcnRfbGlua3MgKSApOwoJcmV0dXJuICRj -aHVuazsKfQoKc3ViIHJlbmRlcl9ncm91cF9vcHRpb25zCnsKCW15KCAkc2VsZiApID0gQF87CgoJ -bXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9k -b2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmluZWQoICRyZXBvLT5jb25m -aWcoICRzZWxmLT57Z3JvdXBfY29uZn0sICJncm91cGZpZWxkcyIgKSApICk7CgoJbXkgJGdyb3Vw -X2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMi -ICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRm -b3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gImdyb3VwX3JlcG9ydCIgKTsKICAgICAgICAkZm9y -bS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQo -ICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5k -Q2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJv -Y2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZiggZGVmaW5lZCAkc2VsZi0+ -e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVu -ZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSAp -OwoJfQoKCSNkaXNwbGF5IHRoZSBsaW5rcyB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgZm9ybQoJbXkg -JGZpcnN0ID0gMTsKCW15ICRncm91cF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsK -CWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICggQHskZ3JvdXBfY29uZn0gKQogICAgICAgIHsKCQlt -eSAoJGdyb3VwX2ZpZWxkKSA9IHNwbGl0KC87LywgJGdyb3VwX3ZhbHVlICk7CgkJaWYoICRmaXJz -dCApCgkJewoJCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxk -KCAiZ3JvdXAiLCAkZ3JvdXBfdmFsdWUpICk7CgkJfQoKCQlpZiggISRmaXJzdCApCiAgICAgICAg -ICAgICAgICB7CiAgICAgICAgICAgICAgICAJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJl -cG8tPmh0bWxfcGhyYXNlKCAiVXBkYXRlL1ZpZXdzOmdyb3VwX3NlcGVyYXRvciIgKSApOwogICAg -ICAgICAgICAgICAgfQoJCQoJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3Vw -fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gZXEgJGdyb3VwX2ZpZWxkICkKCQl7CgkJ -CW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic3Ryb25nIiApOwoJCQkkc3Ryb25n -LT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAkc2VsZi0+e2dyb3VwX2NvbmZ9IC4g -Ijpncm91cDoiIC4gJGdyb3VwX2ZpZWxkICkgKTsKCQkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGls -ZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJf -bGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVwb3J0KCInLiRncm91cF92YWx1ZS4nIiknICk7CQoJ -CQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9j -b25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBw -ZW5kQ2hpbGQoICRsaW5rICk7CgkJfQoJCSRmaXJzdCA9IDA7CiAgICAgICAgfSAgICAgICAgICAg -CgkKCSNubyBncm91cGluZyBsaW5rIGF0IHRoZSBlbmQKCSRncm91cF9saW5rcy0+YXBwZW5kQ2hp -bGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkg -KTsKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3By -b2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9s -aW5rKCAnamF2YXNjcmlwdDpncm91cF9yZXBvcnQoIiIpJyApOwkKCQkkbGluay0+YXBwZW5kQ2hp -bGQoICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydDpub19ncm91cGluZyIgKSApOwoJCSRncm91 -cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7Cgl9CgllbHNlCgl7CgkJbXkgJHN0cm9uZyA9 -ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7CiAJCSRzdHJvbmctPmFwcGVuZENoaWxk -KCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBf -bGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7Cgl9CgkKCSRjaHVuay0+YXBwZW5kQ2hpbGQo -ICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpncm91cF9saW5rcyIsIGxpbmtzPT4kZ3JvdXBf -bGlua3MgKSApOwoKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfcmVmaW5lX3NlYXJjaAp7 -CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkg -JGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoJCglpZiggZGVmaW5lZCAkcmVwby0+ +bjsKCiAgICAgICAgbXkgJHNlYXJjaGRhdGFzZXRpZCA9ICRyZXBvcnRfcGx1Z2luLT57c2VhcmNo +ZGF0YXNldGlkfTsKICAgICAgICBpZiggZGVmaW5lZCAkcmVwb3J0X3BsdWdpbi0+cGFyYW0oInNl +YXJjaGRhdGFzZXRpZCIpICkKICAgICAgICB7CiAgICAgICAgICAgICRzZWFyY2hkYXRhc2V0aWQg +PSAkcmVwb3J0X3BsdWdpbi0+cGFyYW0oInNlYXJjaGRhdGFzZXRpZCIpOwogICAgICAgIH0KCiAg +ICAgICAgbXkgJHJlcG9ydF9kcyA9ICRzZXNzaW9uLT5kYXRhc2V0KCAkc2VhcmNoZGF0YXNldGlk +ICk7CiAgICAgICAgaWYoIGRlZmluZWQgJHJlcG9ydF9kcyApCiAgICAgICAgewogICAgICAgICAg +ICAgICAgJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0YXNldGlkfSA9ICRyZXBvcnRfZHMtPmJhc2Vf +aWQ7CiAgICAgICAgICAgICAgICBteSAkc2NvbmYgPSAkcmVwb3J0X2RzLT5zZWFyY2hfY29uZmln +KCAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfSApOwoJCiAgICAgICAgICAgICAgICBteSAkZm9ybWF0 +ID0gInJlcG9ydC8iIC4gJHJlcG9ydF9kcy0+YmFzZV9pZDsKICAgICAgICAgICAgICAgICRzZWxm +LT57cHJvY2Vzc29yfS0+e3NlYXJjaH0gPSAkc2Vzc2lvbi0+cGx1Z2luKCAiU2VhcmNoIiApLT5w +bHVnaW5zKAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAga2VlcF9jYWNoZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +IHNlc3Npb24gPT4gJHNlbGYtPntzZXNzaW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBkYXRhc2V0ID0+ICRyZXBvcnRfZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgJXskc2NvbmZ9CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAg +ICAgICAgIHR5cGUgPT4gIlNlYXJjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbl9zZWFy +Y2ggPT4gJGZvcm1hdCwKICAgICAgICAgICAgICAgICk7Cgl9Cn0KCnN1YiBhbGxvd19uZXdzZWFy +Y2ggeyByZXR1cm4gMTsgfQoKc3ViIGFsbG93X3VwZGF0ZSB7IHJldHVybiAxOyB9CgpzdWIgYWN0 +aW9uX25ld3NlYXJjaAp7CiAgICAgICAgbXkoICRzZWxmICkgPSBAXzsKCiAgICAgICAgbXkgJHNl +c3Npb24gPSAkc2VsZi0+e3Nlc3Npb259OwoKICAgICAgICAjJHNlbGYtPntwcm9jZXNzb3J9LT57 +cmVwb3J0fSA9ICRzZXNzaW9uLT5wYXJhbSggJ3JlcG9ydCcgKTsKICAgICAgICAjJHNlbGYtPntw +cm9jZXNzb3J9LT57c2NyZWVuaWR9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0fTsKICAg +ICAgICAjJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSA9ICJuZXdzZWFyY2giOwogICAgICAg +ICMkc2VsZi0+X2NyZWF0ZV9zZWFyY2g7Cn0KCnN1YiBhY3Rpb25fdXBkYXRlCnsKICAgICAgICBt +eSggJHNlbGYgKSA9IEBfOwoKICAgICAgICBteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07 +CgogICAgICAgICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9ID0gJHNlc3Npb24tPnBhcmFt +KCAncmVwb3J0JyApOwogICAgICAgICMkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzY3JlZW5pZH0gPSAk +c2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9OwogICAgICAgICMkc2VsZi0+e3Byb2Nlc3Nvcn0t +PnthY3Rpb259ID0gIm5ld3NlYXJjaCI7CiAgICAgICAgIyRzZWxmLT5fY3JlYXRlX3NlYXJjaDsK +fQoKc3ViIGFjdGlvbl9zZWFyY2gKewoJbXkoICRzZWxmICkgPSBAXzsKCgkkc2VsZi0+e3Byb2Nl +c3Nvcn0tPnthY3Rpb259ID0gInNlYXJjaCI7CgoJI3JlYWQgcGFyYW1ldGVycwoJbXkgJHNlc3Np +b24gPSAkc2VsZi0+e3Nlc3Npb259OwoKCSRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydH0gPSAk +c2Vzc2lvbi0+cGFyYW0oICdyZXBvcnQnICk7CgoJJHNlbGYtPntwcm9jZXNzb3J9LT57c2NyZWVu +aWR9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57cmVwb3J0fTsKCSRzZWxmLT5fY3JlYXRlX3NlYXJj +aDsKCglteSAkbG9hZGVkID0gMDsKICAgICAgICBteSAkaWQgPSAkc2Vzc2lvbi0+cGFyYW0oICJj +YWNoZSIgKTsKICAgICAgICBpZiggZGVmaW5lZCAkaWQgKQogICAgICAgIHsKCQkkbG9hZGVkID0g +JHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+ZnJvbV9jYWNoZSggJGlkICk7CiAgICAgICAg +fQoKICAgICAgICBpZiggISRsb2FkZWQgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRl +eHAgPSAkc2Vzc2lvbi0+cGFyYW0oICJleHAiICk7CiAgICAgICAgICAgICAgICBpZiggZGVmaW5l +ZCAkZXhwICkKICAgICAgICAgICAgICAgIHsKCQkJJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNo +fS0+ZnJvbV9zdHJpbmcoICRleHAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSBl +eHBpcmVkLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICRsb2FkZWQgPSAxOwogICAgICAgICAg +ICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgQHByb2JsZW1zOwogICAgICAgIGlmKCAhJGxv +YWRlZCApCiAgICAgICAgewoJCWZvciggJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+ZnJv +bV9mb3JtICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICRzZWxmLT57cHJvY2Vzc29yfS0+YWRkX21lc3NhZ2UoICJ3YXJuaW5nIiwgJF8g +KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAgIAoKCSNkaXNw +bGF5IHRoZSByZXN1bHRzCgkkc2VsZi0+cmVuZGVyOwp9CgpzdWIgcHJvcGVydGllc19mcm9tCnsK +CW15KCAkc2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCSRzZWxm +LT5TVVBFUjo6cHJvcGVydGllc19mcm9tOwoKCWlmKCBkZWZpbmVkICggbXkgJGRzaWQgPSAkc2Vs +Zi0+cGFyYW0oICJkYXRhc2V0aWQiICkgKSApCgl7CgkJJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0 +YXNldH0gPSAkc2VsZi0+cmVwb3NpdG9yeS0+ZGF0YXNldCggJGRzaWQgKTsKCX0KCgkjIHNmMiAt +IFRPRE8gLSBiYXJrIGlmIGRhdGFzZXQgaXMgbm90IHNldD8gcGVyaGFwcyB0aGVyZSBhcmUgb3Ro +ZXIgd2F5cyB0byBnZXQgdGhlIG9iamVjdHMgZnJvbS4uLgoJbXkgJHJlcG9ydCA9ICRzZWxmLT5n +ZXRfcmVwb3J0KCk7CgoJI2dldCBhIHNlYXJjaCBvYmplY3QgaWYgd2UgaGF2ZSBvbmUgZnJvbSBh +IHByZXZpb3VzIHNlYXJjaCBhY3Rpb24sIHNvIHRoYXQgd2UgbWlnaHQgbGF0ZXIgdXNlIGl0IHRv +IGRvIGFuIGV4cG9ydCBvciBzZWFyY2ggYWN0aW9uCgkkc2VsZi0+X2NyZWF0ZV9zZWFyY2g7CQoJ +aWYoIGRlZmluZWQgJHNlbGYtPnJlcG9zaXRvcnktPnBhcmFtKCAic2VhcmNoIiApICkKCXsKCQkk +c2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5mcm9tX3N0cmluZyggJHNlbGYtPnJlcG9zaXRv +cnktPnBhcmFtKCAic2VhcmNoIiApICkgaWYgZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntz +ZWFyY2h9OwoJCSRzZWxmLT57cHJvY2Vzc29yfS0+e2V4cG9ydF9zZWFyY2h9ID0gMTsKCX0KCQoJ +bXkgJGZvcm1hdCA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggImV4cG9ydCIgKTsKCWlmKCAk +Zm9ybWF0ICYmICRyZXBvcnQgKQoJewoJCW15ICRwbHVnaW4gPSAkc2VsZi0+cmVwb3NpdG9yeS0+ +cGx1Z2luKCAiRXhwb3J0OjokZm9ybWF0IiwgcmVwb3J0ID0+ICRyZXBvcnQgKTsKCQlpZiggZGVm +aW5lZCAkcGx1Z2luICYmICggJHBsdWdpbi0+Y2FuX2FjY2VwdCggInJlcG9ydC8kcmVwb3J0IiAp +IHx8ICgkcGx1Z2luLT5jYW5fYWNjZXB0KCAicmVwb3J0L2dlbmVyaWMiICkgKSApICkKCQl7CgkJ +CSRzZWxmLT57cHJvY2Vzc29yfS0+e3BsdWdpbn0gPSAkcGx1Z2luOwoJCX0KCX0KCgkjbGlzdCBv +ZiBleHBvcnQgZmllbGRzIHJldHJpZXZlZCBmcm9tIG5vbi1hYnN0cmFjdCBpbnN0YW5jZXMgb2Yg +cmVwb3J0cwoJbXkgQGV4cG9ydGZpZWxkczsKCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWcoICRz +ZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApICkKCXsKCQlteSBAa2V5czsKCQlp +ZiggZGVmaW5lZCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZp +ZWxkX29yZGVyIiApICkKCQl7CgkJCUBrZXlzID0gQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4 +cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApfTsKCQl9CgkJZWxzZQoJCXsKCQkJQGtl +eXMgPSBrZXlzICV7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRm +aWVsZHMiICl9OyAKCQl9CgkJZm9yZWFjaCBteSAka2V5ICggQGtleXMgKQoJCXsKCQkJZm9yZWFj +aCBteSAkZmllbGRuYW1lICggQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwg +ImV4cG9ydGZpZWxkcyIgKS0+eyRrZXl9fSApCgkJCXsKCQkJCXB1c2ggQGV4cG9ydGZpZWxkcywg +JGZpZWxkbmFtZSBpZiBkZWZpbmVkICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggJGZpZWxkbmFt +ZSApOyAKCQkJfQoJCX0KCX0KCglteSAkc29ydCA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSgg +InNvcnQiICk7CglpZiggZGVmaW5lZCAkc29ydCApCgl7CgkJJHNlbGYtPntwcm9jZXNzb3J9LT57 +c29ydH0gPSAkc29ydDsKCX0KCglteSAkZ3JvdXAgPSAkc2VsZi0+cmVwb3NpdG9yeS0+cGFyYW0o +ICJncm91cCIgKTsKCSRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gPSAkZ3JvdXA7ICNz +dG9yZSB0aGUgZ3JvdXAgZXhwcmVzc2lvbiBmb3IgbGF0ZXIgdXNlCgkKCSNkZWNvZGUgdGhlIGdy +b3VwIGV4cHJlc3Npb24KCW15ICVncm91cF9vcHRzOwoJaWYoIGRlZmluZWQgJGdyb3VwICkKCXsK +CQkjZ2V0IGZpZWxkIGFuZCBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24gYWJvdXQgdGhlIGdyb3Vw +LCBlLmcuIHJlcywgdHJ1bmNhdGUsIHJldmVyc2Vfb3JkZXIgZXRjLgoJCW15IEBncm91cCA9IHNw +bGl0KC87LywgJGdyb3VwICk7CgkJbXkgJGZpcnN0ID0gMTsKCQlmb3JlYWNoIG15ICRnIChAZ3Jv +dXApCgkJewoJCQlpZiggJGZpcnN0ICkKCQkJewoJCQkJJGdyb3VwID0gJGc7CgkJCX0KCQkJZWxz +ZQoJCQl7CgkJCQlteSBAb3B0cyA9IHNwbGl0KC89LywgJGcgKTsKCQkJCSRncm91cF9vcHRzeyRv +cHRzWzBdfSA9ICRvcHRzWzFdOwkJCgkJCX0KCQkJJGZpcnN0ID0gMDsKCQl9CgkJJHNlbGYtPntw +cm9jZXNzb3J9LT57Z3JvdXB9ID0gJGdyb3VwOwoJCSRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3Vw +X29wdHN9ID0gXCVncm91cF9vcHRzOwoJfQoKCSRzZWxmLT57cHJvY2Vzc29yfS0+e2V4cG9ydGZp +ZWxkc30gPSBcQGV4cG9ydGZpZWxkczsKfQoJCQojIFxAKHttZXRhX2ZpZWxkcz0+WyAiZmllbGQx +IiwgImZpZWxkMiIgImRvY3VtZW50LmZpZWxkMyIgXSwgbWVyZ2U9PiJBTlkiLCBtYXRjaD0+IkVY +IiwgdmFsdWU9PiJiZWVzIn0sIHttZXRhX2ZpZWxkcz0+WyAiZmllbGQ0IiBdLCB2YWx1ZT0+Imhv +bmV5In0pOwojIGUuZy4KIyByZXR1cm4gWyB7IG1ldGFfZmllbGRzID0+IFsgJ3R5cGUnIF0sIHZh +bHVlID0+ICdhcnRpY2xlJyB9IF0Kc3ViIGZpbHRlcnMKewoJcmV0dXJuIFtdOwp9CgojIGhvdyB0 +byBzZWxlY3QgaXRlbXMgaS5lLiB0aGUgc2xpY2Ugb2YgZGF0YSB3ZSB3YW50IHRvIHZhbGlkYXRl +L2V4cG9ydD8KIyAKc3ViIGl0ZW1zCnsKCW15KCAkc2VsZiApID0gQF87CglpZiggJHNlbGYtPntw +cm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntl +eHBvcnRfc2VhcmNofSApCiAgICAgICAJewoJCW15ICRyZXBvcnQgPSAkc2VsZi0+e3Byb2Nlc3Nv +cn0tPntyZXBvcnRfcGx1Z2lufTsJCgkJJHJlcG9ydC0+YXBwbHlfZmlsdGVycyBpZiAkcmVwb3J0 +LT5jYW4oICdhcHBseV9maWx0ZXJzJyApOwoKCQlteSAkaXRlbXMgPSAkc2VsZi0+e3Byb2Nlc3Nv +cn0tPntzZWFyY2h9LT5wZXJmb3JtX3NlYXJjaDsKCgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9j +ZXNzb3J9LT57c29ydH0gKQoJCXsJCgkJCSRpdGVtcyA9ICRpdGVtcy0+cmVvcmRlciggJHNlbGYt +Pntwcm9jZXNzb3J9LT57c29ydH0gKTsKCQl9CgkJcmV0dXJuICRpdGVtczsKCX0KCWVsc2lmKCBk +ZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2RhdGFzZXR9ICkgCgl7CgkJbXkgJXNlYXJjaF9v +cHRzID0gKCBmaWx0ZXJzID0+ICRzZWxmLT5maWx0ZXJzLCBzYXRpc2Z5X2FsbCA9PiAxICk7CgkJ +aWYoIGRlZmluZWQgJHNlbGYtPnBhcmFtKCAnY3VzdG9tX29yZGVyJyApICkKCQl7CgkJCSRzZWFy +Y2hfb3B0c3tjdXN0b21fb3JkZXJ9ID0gJHNlbGYtPnBhcmFtKCAnY3VzdG9tX29yZGVyJyApOwoJ +CX0KCgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSAjYW4gb3JkZXJp +bmcgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHNob3VsZCB0cnVtcCB0aGUgcmVwb3J0cyBjdXN0b20g +b3JkZXIKCQl7CgkJCSRzZWFyY2hfb3B0c3tjdXN0b21fb3JkZXJ9ID0gJHNlbGYtPntwcm9jZXNz +b3J9LT57c29ydH07CgkJfQkKCQlyZXR1cm4gJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0YXNldH0t +PnNlYXJjaCggJXNlYXJjaF9vcHRzICk7Cgl9CgkjIHdlIGNhbid0IHJldHVybiBhbiBFUHJpbnRz +OjpMaXN0IGlmIHtkYXRhc2V0fSBpcyBub3QgZGVmaW5lZAoJcmV0dXJuIHVuZGVmOwp9CgojIGZy +b20gUmVwb3J0cy9ST1MvSm91cm5hbHMucG0KIyBUT0RPIE5vdGUgcXVpdGUgYSBsb3Qgb2YgcmVw +bGljYXRpb24gYmV0d2VlbiB0aGlzIGFuZCBFeHBvcnQ6OlJlcG9ydDo6Q1NWOjpvdXRwdXRfZGF0 +YW9iagpzdWIgdmFsaWRhdGVfZGF0YW9iagp7CglteSggJHBsdWdpbiwgJGRhdGFvYmogKSA9IEBf +OwoKCW15ICRyZXBvID0gJHBsdWdpbi0+cmVwb3NpdG9yeTsKCglteSAkcmVwb3J0X2ZpZWxkcyA9 +ICRwbHVnaW4tPnJlcG9ydF9maWVsZHMoICRkYXRhb2JqICk7CglteSAkdmFsX2ZpZWxkcyA9ICRw +bHVnaW4tPnZhbGlkYXRlX2ZpZWxkcyggJGRhdGFvYmogKTsKCgkjIHJlbGF0ZWQgb2JqZWN0cyBh +bmQgdGhlaXIgZGF0YXNldHMKCW15ICRvYmplY3RzID0gJHBsdWdpbi0+Z2V0X3JlbGF0ZWRfb2Jq +ZWN0cyggJGRhdGFvYmogKTsKCW15ICR2YWxpZF9kcyA9IHt9OwoJZm9yZWFjaCBteSAkZHNpZCAo +IGtleXMgJSRvYmplY3RzICkKCXsKCQkkdmFsaWRfZHMtPnskZHNpZH0gPSAkcmVwby0+ZGF0YXNl +dCggJGRzaWQgKTsKCX0KCglteSBAcHJvYmxlbXM7CgoJZm9yZWFjaCBteSAkZmllbGQgKCBAeyAk +cGx1Z2luLT5yZXBvcnRfZmllbGRzX29yZGVyKCAkZGF0YW9iaiApIHx8IFtdIH0gKQoJewoJCSMg +dmFsaWRhdGlvbiBhY3Rpb24KCQlteSAkdl9maWVsZCA9ICR2YWxfZmllbGRzLT57JGZpZWxkfTsK +CQluZXh0IHVubGVzcyBkZWZpbmVkICR2X2ZpZWxkOyAjIG5vIHZhbGlkYXRpb24gcmVxdWlyZWQK +CgkJIyBzaW1wbGUgY2FzZSAtIGNvZGUgaGFuZGxlcyB2YWxpZGF0aW9uCgkJaWYoIHJlZiggJHZf +ZmllbGQgKSBlcSAnQ09ERScgKQoJCXsKCQkJIyBhIHN1Ynt9IHdlIG5lZWQgdG8gcnVuCgkJCWV2 +YWwgewoJCQkJJiR2X2ZpZWxkKCAkcGx1Z2luLCAkb2JqZWN0cywgXEBwcm9ibGVtcyApOwoJCQl9 +OwoJCQlpZiggJEAgKQoJCQl7CgkJCQkkcmVwby0+bG9nKCAiVmFsaWRhdGlvbiBSdW50aW1lIGVy +cm9yOiAkQCIgKTsKCQkJfQoJCQluZXh0OwoJCX0KCQllbHNpZiggbGMgJHZfZmllbGQgbmUgInJl +cXVpcmVkIiApCgkJewoJCQkkcmVwby0+bG9nKCAiVmFsaWRhdGlvbiBSdW50aW1lIGVycm9yOiAk +dl9maWVsZCBtdXN0IGJlIGNvZGUgcmVmIG9yICdyZXF1aXJlZCciICk7CgkJCW5leHQ7CgkJfQoK +CQkjIGNoZWNrIHJlcXVpcmVkIHZhbHVlcwoKCQlteSAkdmFsdWU7ICMgdGhlIHZhbHVlIHRvIHZh +bGlkYXRlCgkJbXkgJGVwX2ZpZWxkID0gJHJlcG9ydF9maWVsZHMtPnskZmllbGR9OwoJCWlmKCBy +ZWYoICRlcF9maWVsZCApIGVxICdDT0RFJyApCgkJewoJCQkjIGEgc3Vie30gd2UgbmVlZCB0byBy +dW4KCQkJZXZhbCB7CgkJCQkkdmFsdWUgPSAmJGVwX2ZpZWxkKCAkcGx1Z2luLCAkb2JqZWN0cyAp +OwoJCQl9OwoJCQlpZiggJEAgKQoJCQl7CgkJCQkkcmVwby0+bG9nKCAiVmFsaWRhdGlvbiBSdW50 +aW1lIGVycm9yOiAkQCIgKTsKCQkJfQoJCX0KCQllbHNpZiggJGVwX2ZpZWxkID1+IC9eKFthLXpf +XSspXC4oWzAtOWEtel9dKykkLyApCgkJewoJCQkjIGEgc3RyYWlnaHQgbWFwcGluZyB3aXRoIGFu +IEVQcmludHMgZmllbGQKCQkJbXkoICRkc19pZCwgJGVwX2ZpZWxkbmFtZSApID0gKCAkMSwgJDIg +KTsKCQkJbXkgJGRzID0gJHZhbGlkX2RzLT57JGRzX2lkfTsKCgkJCWlmKCBkZWZpbmVkICRkcyAm +JiAkZHMtPmhhc19maWVsZCggJGVwX2ZpZWxkbmFtZSApICkKCQkJewoJCQkJJHZhbHVlID0gJG9i +amVjdHMtPnskZHNfaWR9LT52YWx1ZSggJGVwX2ZpZWxkbmFtZSApOwoJCQl9CgkJCWVsc2UKCQkJ +ewoJCQkJIyBkYXRhc2V0IG9yIGZpZWxkIGRvZXNuJ3QgZXhpc3QKCQkJCSRyZXBvLT5sb2coICJW +YWxpZGF0aW9uIFJ1bnRpbWUgZXJyb3I6IGRhdGFzZXQgJGRzX2lkIG9yIGZpZWxkICRlcF9maWVs +ZG5hbWUgZG9lc24ndCBleGlzdCIgKTsKCQkJfQoJCX0KCgkJIyBpcyBmaWVsZCBzZXQ/CgkJaWYo +ICFFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkdmFsdWUgKSApCgkJewoJCQlwdXNoIEBwcm9ibGVt +cywgIk1pc3NpbmcgcmVxdWlyZWQgZmllbGQgJGZpZWxkIjsKCQl9Cgl9CgoJcmV0dXJuIEBwcm9i +bGVtczsKfQoKIyBUT0RPIE5vdGUgY29weSBvZiBFeHBvcnQ6OlJlcG9ydDo6Z2V0X3JlbGF0ZWRf +b2JqZWN0cwpzdWIgZ2V0X3JlbGF0ZWRfb2JqZWN0cwp7CglteSggJHBsdWdpbiwgJGRhdGFvYmog +KSA9IEBfOwoKCW15ICRjbWQgPSBbICdyZXBvcnRzJywgJHBsdWdpbi0+Z2V0X3JlcG9ydCwgJ2dl +dF9yZWxhdGVkX29iamVjdHMnIF07CiAgICAgICAgaWYoICRwbHVnaW4tPnJlcG9zaXRvcnktPmNh +bl9jYWxsKCBAJGNtZCApICkKICAgICAgICB7CgkJcmV0dXJuICRwbHVnaW4tPnJlcG9zaXRvcnkt +PmNhbGwoICRjbWQsICRwbHVnaW4tPnJlcG9zaXRvcnksICRkYXRhb2JqICkgfHwge307CiAgICAg +ICAgfQoKCSMganVzdCBwYXNzIHRoZSBkYXRhb2JqIGl0c2VsZgoJcmV0dXJuIHsKCQkkZGF0YW9i +ai0+ZGF0YXNldC0+Y29uZmlkID0+ICRkYXRhb2JqLAoJfTsKfQoKIyBUT0RPIE5vdGUgY29weSBv +ZiBFeHBvcnQ6OlJlcG9ydDo6cmVwb3J0X2ZpZWxkc19vcmRlcgpzdWIgcmVwb3J0X2ZpZWxkc19v +cmRlcgp7CglteSggJHBsdWdpbiApID0gQF87CgoJcmV0dXJuICRwbHVnaW4tPntyZXBvcnRfZmll +bGRzX29yZGVyfSBpZiggZGVmaW5lZCAkcGx1Z2luLT57cmVwb3J0X2ZpZWxkc19vcmRlcn0gKTsK +CglteSAkcmVwb3J0ID0gJHBsdWdpbi0+Z2V0X3JlcG9ydCgpOwoJcmV0dXJuIFtdIHVubGVzcygg +ZGVmaW5lZCAkcmVwb3J0ICk7CgoJJHBsdWdpbi0+e3JlcG9ydF9maWVsZHNfb3JkZXJ9ID0gJHBs +dWdpbi0+cmVwb3NpdG9yeS0+Y29uZmlnKCAncmVwb3J0cycsICRyZXBvcnQsICdmaWVsZHMnICk7 +CgoJcmV0dXJuICRwbHVnaW4tPntyZXBvcnRfZmllbGRzX29yZGVyfTsKfQoKIyBUT0RPIE5vdGUg +Y29weSBvZiBFeHBvcnQ6OlJlcG9ydDo6cmVwb3J0X2ZpZWxkcwpzdWIgcmVwb3J0X2ZpZWxkcwp7 +CglteSggJHBsdWdpbiApID0gQF87CgoJcmV0dXJuICRwbHVnaW4tPntyZXBvcnRfZmllbGRzfSBp +ZiggZGVmaW5lZCAkcGx1Z2luLT57cmVwb3J0X2ZpZWxkc30gKTsKCglteSAkcmVwb3J0ID0gJHBs +dWdpbi0+Z2V0X3JlcG9ydCgpOwoJcmV0dXJuIFtdIHVubGVzcyggZGVmaW5lZCAkcmVwb3J0ICk7 +CgoJJHBsdWdpbi0+e3JlcG9ydF9maWVsZHN9ID0gJHBsdWdpbi0+cmVwb3NpdG9yeS0+Y29uZmln +KCAncmVwb3J0cycsICRyZXBvcnQsICdtYXBwaW5ncycgKTsKCglyZXR1cm4gJHBsdWdpbi0+e3Jl +cG9ydF9maWVsZHN9Owp9CgpzdWIgdmFsaWRhdGVfZmllbGRzCnsKCW15KCAkcGx1Z2luICkgPSBA +XzsKCglyZXR1cm4gJHBsdWdpbi0+e3ZhbGlkYXRlX2ZpZWxkc30gaWYoIGRlZmluZWQgJHBsdWdp +bi0+e3ZhbGlkYXRlX2ZpZWxkc30gKTsKCglteSAkcmVwb3J0ID0gJHBsdWdpbi0+Z2V0X3JlcG9y +dCgpOwoJcmV0dXJuIFtdIHVubGVzcyggZGVmaW5lZCAkcmVwb3J0ICk7CgoJJHBsdWdpbi0+e3Zh +bGlkYXRlX2ZpZWxkc30gPSAkcGx1Z2luLT5yZXBvc2l0b3J5LT5jb25maWcoICdyZXBvcnRzJywg +JHJlcG9ydCwgJ3ZhbGlkYXRlJyApOwoKCXJldHVybiAkcGx1Z2luLT57dmFsaWRhdGVfZmllbGRz +fTsKfQoKIyMgcmVuZGVyaW5nCgojIFRoZSAic3BsYXNoIHBhZ2UiCnN1YiByZW5kZXJfc3BsYXNo +X3BhZ2UKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5 +OwoJbXkgQHBsdWdpbnMgPSAkc2VsZi0+cmVwb3J0X3BsdWdpbnM7CgoJaWYoICFzY2FsYXIoIEBw +bHVnaW5zICkgKQoJewoJCXJldHVybiAkc2VsZi0+aHRtbF9waHJhc2UoICJub19yZXBvcnRzIiAp +OwoJfQoKCW15IEBsYWJlbHM7CglteSBAcGFuZWxzOwoKCSNwcmVzZXQgcmVwb3J0cwoJcHVzaCBA +bGFiZWxzLCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnRzX3ByZXNldCIgKTsKCW15ICRwcmVz +ZXQgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2IiApOwoJbXkgJHByZXNldHNfYWRkZWQgPSAw +OwoKCSMgdG9wIGNhdGVnb3J5OiBieSBjbGFzc25hbWUgPiBSZXBvcnQ6OlJPUzo6U29tZVJlcG9y +dDEsIFJlcG9ydDo6Uk9TOjpTb21lUmVwb3J0MgoKCW15ICR1bCA9ICRzZWxmLT5yZXBvc2l0b3J5 +LT5tYWtlX2VsZW1lbnQoICd1bCcsIGNsYXNzID0+ICdlcF9yZXBvcnRfY2F0ZWdvcnknICk7CgoJ +IyBjYXQgfiBjYXRlZ29yeSAtICFtZWVvdwoJbXkgJGNhdCA9ICIiOwoJbXkgJGNhdF9saSA9IHVu +ZGVmOyAKCW15ICRjYXRfdWwgPSB1bmRlZjsKCQoJI3ByZXBhcmUgaGFzaCBvZiByZXBvcnRpbmcg +cGx1Z2lucwoJbXkgJXJlcG9ydF9oYXNoOwoJZm9yZWFjaCBteSAkcmVwb3J0X3BsdWdpbiAoIHNv +cnQgeyAkYS0+Z2V0X3N1YnR5cGUgY21wICRiLT5nZXRfc3VidHlwZSB9IEBwbHVnaW5zICkKCXsK +CQlteSAkcGx1Z2luX2NhdCA9ICRyZXBvcnRfcGx1Z2luLT5nZXRfc3VidHlwZTsKCQkkcGx1Z2lu +X2NhdCA9fiBzL15SZXBvcnQ6OihbXjpdKyk6Pzo/KC4qKSQvJDEvZzsJCgoJCWlmKCAkY2F0IG5l +ICRwbHVnaW5fY2F0ICkgI3dlIGhhdmUgYSB0b3AtY2F0ZWdvcnkKCQl7CgkJCSRjYXQgPSAkcGx1 +Z2luX2NhdDsKCQkJJHJlcG9ydF9oYXNoeyRjYXR9ID0gW107CgkJfQoKCQlpZiggRVByaW50czo6 +VXRpbHM6OmlzX3NldCggJDIgKSApCgkJewoJCQlwdXNoIEB7JHJlcG9ydF9oYXNoeyRjYXR9fSwg +JHJlcG9ydF9wbHVnaW47CgkJfQoJfQoJCglmb3IgbXkgJHRvcF9jYXQoIHNvcnQga2V5cyAlcmVw +b3J0X2hhc2ggKQoJewoJCW15IEByZXBvcnRfcGx1Z2lucyA9IEB7JHJlcG9ydF9oYXNoeyR0b3Bf +Y2F0fX07CgkJaWYoIHNjYWxhciggQHJlcG9ydF9wbHVnaW5zICkgPiAwICkKCQl7CgkJCSNyZW5k +ZXIgdG9wLWNhdGVnb3J5CgkJCSRjYXRfbGkgPSAkdWwtPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVw +b3NpdG9yeS0+bWFrZV9lbGVtZW50KCAnbGknICkgKTsKCQkJJGNhdF9saS0+YXBwZW5kQ2hpbGQo +ICRzZWxmLT5yZXBvc2l0b3J5LT5odG1sX3BocmFzZSggIlBsdWdpbi9TY3JlZW4vUmVwb3J0LyR0 +b3BfY2F0OnRpdGxlIiApICk7CgoJCQkkY2F0X3VsID0gJGNhdF9saS0+YXBwZW5kQ2hpbGQoICRz +ZWxmLT5yZXBvc2l0b3J5LT5tYWtlX2VsZW1lbnQoICd1bCcsIGNsYXNzID0+ICdlcF9yZXBvcnRf +aXRlbXMnICkgKTsKCgkJCWZvcmVhY2ggbXkgJHIgKCBAcmVwb3J0X3BsdWdpbnMgKQoJCQl7CgkJ +CQlteSAkc3ViX2xpID0gJGNhdF91bC0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZXBvc2l0b3J5LT5t +YWtlX2VsZW1lbnQoICdsaScgKSApOwoJCQkJJHN1Yl9saS0+YXBwZW5kQ2hpbGQoICRyLT5yZW5k +ZXJfYWN0aW9uX2xpbmsgKTsKCQkJCSRwcmVzZXRzX2FkZGVkKys7CgkJCX0KCQl9Cgl9CgoJJHBy +ZXNldC0+YXBwZW5kQ2hpbGQoICR1bCApOwoJcHVzaCBAcGFuZWxzLCAkcHJlc2V0OwoKCSNjdXN0 +b20gcmVwb3J0cwoJcHVzaCBAbGFiZWxzLCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnRzX2N1 +c3RvbSIgKTsKCglteSAkY3VzdG9tID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIGlkPT4i +Y3VzdG9tX3JlcG9ydCIgKTsKCW15ICRmb3JtID0gJHJlcG8tPnJlbmRlcl9mb3JtKCAiZ2V0IiAp +OwoKCSRmb3JtLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9jb250cm9scyggMSApICk7CgoJ +I2FkZCBlYWNoIHJlcG9ydCB0byB0aGUgc2VsZWN0IGNvbXBvbmVudCBhbmQgZ2VuZXJhdGUgc2Vh +cmNoIGZvcm0gaWYgcmVxdWlyZWQKCW15ICRyZXBvcnRfc2VsZWN0ID0gJHJlcG8tPm1ha2VfZWxl +bWVudCggInNlbGVjdCIsIG5hbWU9PiJyZXBvcnQiLCBpZD0+InNlbGVjdF9yZXBvcnQiLCAnYXJp +YS1sYWJlbGxlZGJ5JyA9PiAicmVwb3J0X3NlbGVjdF9sYWJlbCIgKTsKCW15ICVzZWFyY2hfZm9y +bXM7CglteSAkY3VzdG9tX3JlcG9ydHMgPSAwOwoJI2ZvcmVhY2ggbXkgJHJlcG9ydF9wbHVnaW4g +KCBAcGx1Z2lucyApCglmb3JlYWNoIG15ICRyZXBvcnRfcGx1Z2luICggc29ydCB7ICRhLT5nZXRf +c3VidHlwZSBjbXAgJGItPmdldF9zdWJ0eXBlIH0gQHBsdWdpbnMgKQoJewoJCWlmKCAkcmVwb3J0 +X3BsdWdpbi0+cGFyYW0oICJjdXN0b20iICkgKQoJCXsJCgkJCSRjdXN0b21fcmVwb3J0cysrOwoJ +CQlteSAkZm9ybWlkID0gJHJlcG9ydF9wbHVnaW4tPntzY29uZn07CgoJCQkjYWRkIHRvIHNlbGVj +dCBjb21wb25lbnQKCQkJbXkgJGlkID0gJHJlcG9ydF9wbHVnaW4tPntyZXBvcnR9OwoJCQlteSAk +b3B0aW9uID0gJHJlcG8tPm1ha2VfZWxlbWVudCggIm9wdGlvbiIsIHZhbHVlID0+ICRyZXBvcnRf +cGx1Z2luLT5nZXRfc3VidHlwZSwgZm9ybSA9PiAkZm9ybWlkICk7CgoJCQkjc2V0IGRlZmF1bHQg +b3B0aW9uIGZvciBzZWxlY3QgY29tcG9uZW50IGlmIHJlcXVpcmVkIChpLmUuIHdlIGhhdmUgY29t +ZSBmcm9tIGEgcmVmaW5lIHNlYXJjaCBvciBuZXcgc2VhcmNoIGxpbmspCgkJCW15ICRyZWZpbmVf +c2NvbmYgPSAkc2VsZi0+e3Nlc3Npb259LT5wYXJhbSggInNjb25mIiApOwoJCQlpZiggKCAkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJ1cGRhdGUiIHx8ICRzZWxmLT57cHJvY2Vzc29y +fS0+e2FjdGlvbn0gZXEgIm5ld3NlYXJjaCIgKSAmJiBkZWZpbmVkICRyZWZpbmVfc2NvbmYgJiYg +JHJlZmluZV9zY29uZiBlcSAkZm9ybWlkICkKCQkJewoJCQkJJG9wdGlvbi0+c2V0QXR0cmlidXRl +KCBzZWxlY3RlZCA9PiAic2VsZWN0ZWQiICk7CgkJCX0KCgkJCSNzZXQgb3B0aW9uIHRleHQgYW5k +IGFkZCB0byBzZWxlY3QKICAJCQkkb3B0aW9uLT5hcHBlbmRDaGlsZCggJHJlcG9ydF9wbHVnaW4t +PnJlbmRlcl90aXRsZSApOwoJCQkkcmVwb3J0X3NlbGVjdC0+YXBwZW5kQ2hpbGQoICRvcHRpb24g +KTsKCgkJCSNjcmVhdGUgc2VhcmNoIGZvcm0JCQkKCQkJI2dldCByZXBvcnQgZGF0YXNldCBhbmQg +YXBwcm9wcmlhdGUgc2VhcmNoIGNvbmZpZwogICAgICAgICAgICBteSAkc2VhcmNoZGF0YXNldGlk +ID0gJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRhc2V0aWR9OwogICAgICAgICAgICBpZiggZGVm +aW5lZCAkcmVwb3J0X3BsdWdpbi0+cGFyYW0oInNlYXJjaGRhdGFzZXRpZCIpICkKICAgICAgICAg +ICAgewogICAgICAgICAgICAgICAgJHNlYXJjaGRhdGFzZXRpZCA9ICRyZXBvcnRfcGx1Z2luLT5w +YXJhbSgic2VhcmNoZGF0YXNldGlkIik7CiAgICAgICAgICAgIH0gICAgCgkJCW15ICRyZXBvcnRf +ZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlYXJjaGRhdGFzZXRpZCApOwoJCQlteSAkc2NvbmYgPSAk +cmVwb3J0X2RzLT5zZWFyY2hfY29uZmlnKCAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfSApIDsKCQkJ +I215ICRzZWFyY2ggPSBFUHJpbnRzOjpTZWFyY2gtPm5ldygKCQkgICAgICAgICMgICAgICAgIGtl +ZXBfY2FjaGUgPT4gMSwKCSAgICAgICAgICAgICAgICAjCXNlc3Npb24gPT4gJHJlcG8sCgkJICAg +ICAgICAjICAgICAgICBkYXRhc2V0ID0+ICRyZXBvcnRfZHMsCgkJICAgICAgICAjICAgICAgICAl +eyRzY29uZn0KCQkJIyk7CgoJCQlteSAkZm9ybWF0ID0gInJlcG9ydC8iIC4gJHJlcG9ydF9kcy0+ +YmFzZV9pZDsKCSAgICAgICAgICAgICAgICBteSAkc2VhcmNoZXhwID0gJHJlcG8tPnBsdWdpbigg +IlNlYXJjaCIgKS0+cGx1Z2lucygKICAgICAgICAgICAgICAgICAgICAgICAgCXsKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAJa2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICBzZXNzaW9uID0+ICRzZWxmLT57c2Vzc2lvbn0sCiAgICAgICAgCSAg +ICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgPT4gJHJlcG9ydF9kcywKICAgICAgICAgICAg +ICAgIAkgICAgICAgICAgICAgICAgJXskc2NvbmZ9CiAgICAgICAgICAgICAgICAgICAgICAgIAl9 +LAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICJTZWFyY2giLAogICAgICAgICAgICAg +ICAgICAgICAgICBjYW5fc2VhcmNoID0+ICRmb3JtYXQsCiAgICAgICAgICAgICAgICAJKTsJCgkJ +CSRzZWFyY2hleHAtPmZyb21fZm9ybTsKCgkJCSNnZW5lcmF0ZSB0aGUgZm9ybQoJCQlteSAkZnJh +ZyA9ICRzZWxmLT5yZW5kZXJfc2VhcmNoX2ZpZWxkcyggJHNlYXJjaGV4cCwgJGZvcm1pZCApOwoJ +CQkkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9ID0gJGZyYWcgdW5sZXNzIGV4aXN0cyAkc2VhcmNoX2Zv +cm1zeyRmb3JtaWR9OwoJCX0JCgl9CgogICAgIyBsYWJlbCBmb3IgZm9ybSBzZWxlY3QgZHJvcCBk +b3duCiAgICBteSAkcmVwb3J0X2xhYmVsID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImxhYmVsIiwg +aWQ9PiJyZXBvcnRfc2VsZWN0X2xhYmVsIiApOwogICAgJHJlcG9ydF9sYWJlbC0+YXBwZW5kQ2hp +bGQoICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydF9zZWxlY3RfbGFiZWwiICkgKTsKICAgICRm +b3JtLT5hcHBlbmRDaGlsZCggJHJlcG9ydF9sYWJlbCApOwoKCSRmb3JtLT5hcHBlbmRDaGlsZCgg +JHJlcG9ydF9zZWxlY3QgKTsKCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRk +ZW5fZmllbGQoICJzY3JlZW4iLCAkc2VsZi0+e3NjcmVlbmlkfSApICk7CgoJI3JlbmRlciBwb3Nz +aWJsZSBzZWFyY2ggZm9ybXMKCWZvcmVhY2ggbXkgJGZvcm1pZCAoa2V5cyAlc2VhcmNoX2Zvcm1z +KQoJewoJCW15ICR0YWJsZSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiLCBjbGFzcz0+ImVw +X3RhYmxlIGVwX3NlYXJjaF9maWVsZHMiLCBpZD0+JGZvcm1pZCwgc3R5bGU9PiJkaXNwbGF5OiBu +b25lIiApOwoJICAgICAgICAkZm9ybS0+YXBwZW5kQ2hpbGQoICR0YWJsZSApOwoJICAgICAgICAk +dGFibGUtPmFwcGVuZENoaWxkKCAkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9ICk7Cgl9CgoJJGZvcm0t +PmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NvbnRyb2xzICk7CgkkY3VzdG9tLT5hcHBlbmRD +aGlsZCggJGZvcm0gKTsKCgkjamF2YXNjcmlwdCBmb3IgY2hhbmdpbmcgZm9ybXMgYmFzZWQgb24g +cmVwb3J0IHNlbGVjdGlvbgoJJGN1c3RvbS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2phdmFz +Y3JpcHQoICdpbml0UmVwb3J0Rm9ybSgpOycgKSApOwoKCWlmKCAkY3VzdG9tX3JlcG9ydHMgJiYg +JHByZXNldHNfYWRkZWQgPiAwICkgI3NldCB1cCB0YWIgaW50ZXJmYWNlCgl7CgkJbXkgQGxhYmVs +czsKCSAgICAgICAgbXkgQHBhbmVsczsKCgkJcHVzaCBAbGFiZWxzLCAkcmVwby0+aHRtbF9waHJh +c2UoICJyZXBvcnRzX3ByZXNldCIgKTsKCQlwdXNoIEBsYWJlbHMsICRyZXBvLT5odG1sX3BocmFz +ZSggInJlcG9ydHNfY3VzdG9tIiApOwoKCQlwdXNoIEBwYW5lbHMsICRwcmVzZXQ7CgkJcHVzaCBA +cGFuZWxzLCAkY3VzdG9tOwoKCQlteSAlb3B0czsKCQlpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57 +YWN0aW9ufSBlcSAibmV3c2VhcmNoIiB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVx +ICJ1cGRhdGUiICApCgkJewoJCQkkb3B0c3tjdXJyZW50fSA9IDE7CgkJfQoKCQlyZXR1cm4gJHJl +cG8tPnhodG1sLT50YWJzKFxAbGFiZWxzLCBcQHBhbmVscywgJW9wdHMgKTsKCX0KCWVsc2lmKCAk +cHJlc2V0c19hZGRlZCA+IDAgKQoJewkKCQlyZXR1cm4gJHByZXNldDsKCX0KCWVsc2UKCXsKCQly +ZXR1cm4gJGN1c3RvbTsKCX0KfQoKc3ViIHJlbmRlcl9zZWFyY2hfZmllbGRzCnsKICAgIG15KCAk +c2VsZiwgJHNlYXJjaCwgJGZvcm1pZCApID0gQF87CgoJbXkgJGV4cCA9ICRzZWxmLT57c2Vzc2lv +bn0tPnBhcmFtKCAiZXhwIiApOwoJbXkgJHNjb25mID0gJHNlbGYtPntzZXNzaW9ufS0+cGFyYW0o +ICJzY29uZiIgKTsKICAgIGlmKCBkZWZpbmVkICRleHAgJiYgZGVmaW5lZCAkc2NvbmYgJiYgJHNj +b25mIGVxICRmb3JtaWQgKQoJewogICAgICAgICRzZWFyY2gtPmZyb21fc3RyaW5nKCAkZXhwICk7 +CiAgCX0KCiAgICBteSAkZnJhZyA9ICRzZWxmLT57c2Vzc2lvbn0tPm1ha2VfZG9jX2ZyYWdtZW50 +OwogICAgZm9yZWFjaCBteSAkc2YgKCAkc2VhcmNoLT5nZXRfbm9uX2ZpbHRlcl9zZWFyY2hmaWVs +ZHMgKQogICAgewogICAgICAgIG15ICRsYWJlbDsKICAgICAgICBteSAkZmllbGQ7CiAgICAgICAg +aWYgKCAkc2YtPnsiZmllbGQifS0+Z2V0X3R5cGUoKSBlcSAibmFtZWRzZXQiICkKICAgICAgICB7 +CiAgICAgICAgICAgICMgd2Ugd2FudCBhIGxlZ2VuZCBhbmQgYSBsYWJlbAogICAgICAgICAgICAk +bGFiZWwgPSAkc2VsZi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoICJzcGFuIiwgaWQ9PiRzZi0+ +Z2V0X2Zvcm1fcHJlZml4LiJfbGFiZWwiICk7CiAgICAgICAgICAgICRsYWJlbC0+YXBwZW5kQ2hp +bGQoICRzZi0+cmVuZGVyX25hbWUgKTsKCiAgICAgICAgICAgIG15ICRsZWdlbmQgPSBFUHJpbnRz +OjpVdGlsczo6dHJlZV90b191dGY4KCAkc2YtPnJlbmRlcl9uYW1lICk7CiAgICAgICAgICAgICRm +aWVsZCA9ICRzZi0+cmVuZGVyKCBsZWdlbmQgPT4gJGxlZ2VuZCApOwogICAgICAgIH0KICAgICAg +ICBlbHNlIHsKICAgICAgICAgICAgJGxhYmVsID0gJHNlbGYtPntzZXNzaW9ufS0+bWFrZV9lbGVt +ZW50KCAic3BhbiIsIGlkPT4kc2YtPmdldF9mb3JtX3ByZWZpeC4iX2xhYmVsIiApOwogICAgICAg +ICAgICAkbGFiZWwtPmFwcGVuZENoaWxkKCAkc2YtPnJlbmRlcl9uYW1lICk7CiAgICAgICAgICAg +ICRmaWVsZCA9ICRzZi0+cmVuZGVyKCk7CiAgICAgICAgfQoKCSAgICAkZnJhZy0+YXBwZW5kQ2hp +bGQoCiAgICAgICAgICAgICRzZWxmLT57c2Vzc2lvbn0tPnJlbmRlcl9yb3dfd2l0aF9oZWxwKAog +ICAgICAgICAgICAgICAgaGVscF9wcmVmaXggPT4gJHNmLT5nZXRfZm9ybV9wcmVmaXguIl9oZWxw +IiwKICAgICAgICAgICAgICAgIGhlbHAgPT4gJHNmLT5yZW5kZXJfaGVscCwKICAgICAgICAgICAg +ICAgIGxhYmVsID0+ICRsYWJlbCwKICAgICAgICAgICAgICAgIGZpZWxkID0+ICRmaWVsZCwKICAg +ICAgICAgICAgICAgIG5vX3RvZ2dsZSA9PiAoICRzZi0+e3Nob3dfaGVscH0gZXEgImFsd2F5cyIg +KSwKICAgICAgICAgICAgICAgIG5vX2hlbHAgPT4gKCAkc2YtPntzaG93X2hlbHB9IGVxICJuZXZl +ciIgKSwKICAgICAgICApICk7CiAgICB9CgogICAgcmV0dXJuICRmcmFnOwp9CgpzdWIgcmVuZGVy +X2NvbnRyb2xzCnsKCW15KCAkc2VsZiwgJHdpdGhfanMgKSA9IEBfOwoKICAgIG15ICRkaXYgPSAk +c2VsZi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoCiAgICAgICAgImRpdiIgLAogICAgICAgIGNs +YXNzID0+ICJlcF9zZWFyY2hfYnV0dG9ucyIgKTsKICAgICAgICAKICAgICRkaXYtPmFwcGVuZENo +aWxkKCAkc2VsZi0+e3Nlc3Npb259LT5yZW5kZXJfYWN0aW9uX2J1dHRvbnMoCiAgICAgICAgX29y +ZGVyID0+IFsgInNlYXJjaCIgXSwKICAgICAgICAjbmV3c2VhcmNoID0+ICRzZWxmLT57c2Vzc2lv +bn0tPnBocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9uOmFjdGlvbl9yZXNldCIgKSwKICAgICAg +ICBzZWFyY2ggPT4gJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Np +b246YWN0aW9uX3NlYXJjaCIgKSApCiAgICApOwoJCglteSAkeG1sID0gJHNlbGYtPntzZXNzaW9u +fS0+eG1sOwoKCWlmKCAkd2l0aF9qcyApCgl7CgkJbXkgJGNsZWFyX2Zvcm0gPSAkZGl2LT5hcHBl +bmRDaGlsZCggJHNlbGYtPnJlbmRlcl9jbGVhcmZvcm0oICR4bWwgKSApOwoJfQoKICAgIG15ICRj +bGVhcl9idG4gPSAkZGl2LT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlX2VsZW1lbnQoICJidXR0 +b24iLAogICAgICAgIHR5cGUgPT4gImJ1dHRvbiIsCiAgICAgICAgb25jbGljayA9PiAiY2xlYXJG +b3JtKCk7IiwKICAgICAgICBjbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIGNsZWFyX2J1 +dHRvbiIsCiAgICApICk7CiAgICAkY2xlYXJfYnRuLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRl +X3RleHRfbm9kZSggJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Np +b246YWN0aW9uX3Jlc2V0IiApICkgKTsKCXJldHVybiAkZGl2Owp9CgpzdWIgcmVuZGVyCnsKCW15 +KCAkc2VsZiApID0gQF87CgoJIyBpZiB1c2VycyBhY2Nlc3MgU2NyZWVuOjpSZXBvcnQgZGlyZWN0 +bHkgd2Ugd2FudCB0byBkaXNwbGF5IHNvbWUgc29ydCBvZiBtZW51CgkjIHdoZXJlIHVzZXJzIGNh +biBzZWxlY3Qgdmlld2FibGUgcmVwb3J0cwoJaWYoICggIkVQcmludHM6OlBsdWdpbjo6Ii4kc2Vs +Zi0+Z2V0X2lkIGVxIF9fUEFDS0FHRV9fICYmICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0g +bmUgInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJuZXdzZWFy +Y2giICkKCXsJCgkJcmV0dXJuICRzZWxmLT5yZW5kZXJfc3BsYXNoX3BhZ2U7Cgl9CgoJbXkgJHJl +cG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJh +Z21lbnQ7CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9leHBvcnRfYmFyICk7 +CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2dyb3VwX29wdGlvbnMgKTsKCSRj +aHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfc29ydF9vcHRpb25zICk7CgoJaWYoICRz +ZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRjaHVuay0+YXBw +ZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwoJfQoKCW15ICRpdGVtcyA9 +ICRzZWxmLT5pdGVtczsKCWlmKCAhZGVmaW5lZCAkaXRlbXMgfHwgJGl0ZW1zLT5jb3VudCA9PSAw +ICkKCXsKCQkjIE5vIGl0ZW1zIG1lc3NhZ2UKCX0KCglteSAkanNvbjsKCglpZiggZGVmaW5lZCAk +c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9 +IG5lICIiICkKCXsKCQlteSAkZ3JvdXBlZCA9ICRzZWxmLT5nZXRfZ3JvdXBlZF9pdGVtcyggJGl0 +ZW1zLCAxICk7CgkJJGpzb24gPSBlbmNvZGVfanNvbiAkZ3JvdXBlZDsKCX0KCWVsc2UKCXsKCQlt +eSAkaXRlbV9pZHMgPSBkZWZpbmVkICRpdGVtcyA/ICRpdGVtcy0+aWRzIDogW107CgkJJGpzb24g +PSAiWyIuam9pbignLCcsQCRpdGVtX2lkcykuIl0iOwoJfQoKICAgICAgICBteSAkdXJsID0gJHJl +cG8tPmN1cnJlbnRfdXJsKCBob3N0ID0+IDEgKTsKICAgICAgICBteSAkcGFyYW1ldGVycyA9IFVS +SS0+bmV3OwogICAgICAgICRwYXJhbWV0ZXJzLT5xdWVyeV9mb3JtKAogICAgICAgICAgICAgICAg +JHNlbGYtPmhpZGRlbl9iaXRzLAogICAgICAgICk7CiAgICAgICAgJHBhcmFtZXRlcnMgPSAkcGFy +YW1ldGVycy0+cXVlcnk7CgkJCglteSAkZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlbGYtPnBhcmFt +KCAnZGF0YXNldGlkJyApICkgaWYgZGVmaW5lZCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICk7 +CglteSAkcHJlZml4ID0gJGRzLT5iYXNlX2lkIGlmIGRlZmluZWQgJGRzOwoKCSMgdGhlIG1haW4g +PGRpdj4KCW15ICRjb250YWluZXJfaWQgPSBzcHJpbnRmKCAiZXBfcmVwb3J0XyVzXF9jb250YWlu +ZXIiLCAkc2VsZi0+Z2V0X3JlcG9ydCApOwoKCSN1cGRhdGUgamF2YXNjcmlwdCBwYXJhbWV0ZXJz +IGlmIGNvbWluZyBmcm9tIGEgc2VhcmNoIHJlcXVlc3QKCWlmKCAkc2VsZi0+e3Byb2Nlc3Nvcn0t +PnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQlteSAkcGx1Z2luID0gJHNlbGYtPntwcm9jZXNz +b3J9LT57cmVwb3J0fTsKCQkkcGx1Z2luID1+IHMvOi8lM0EvZzsKCQkkcGFyYW1ldGVycyA9ICJz +Y3JlZW49JHBsdWdpbiI7CgkJJHByZWZpeCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2RhdGFzZXRp +ZH07CgkJJGNvbnRhaW5lcl9pZCA9IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIs +ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydF9wbHVnaW59LT57cmVwb3J0fSApOwoJfQoJCgkj +c2hvdy9oaWRlIGNvbXBsaWFuY2UKCW15ICRzaG93X2NvbXBsaWFuY2UgPSAxOwoJJHNob3dfY29t +cGxpYW5jZSA9ICRzZWxmLT57c2hvd19jb21wbGlhbmNlfSBpZiBkZWZpbmVkICRzZWxmLT57c2hv +d19jb21wbGlhbmNlfTsKCgkjY3VzdG9tIGxhYmVscwoJbXkgJGxhYmVscyA9IDA7CgkkbGFiZWxz +ID0gZW5jb2RlX2pzb24gJHNlbGYtPntsYWJlbHN9IGlmIGRlZmluZWQgJHNlbGYtPntsYWJlbHN9 +OwoKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2phdmFzY3JpcHQoIDw8IkVPSiIg +KSApOwpkb2N1bWVudC5vYnNlcnZlKCJkb206bG9hZGVkIiwgZnVuY3Rpb24oKSB7CgluZXcgRVBy +aW50c19TY3JlZW5fUmVwb3J0X0xvYWRlciggewoJCWlkczogJGpzb24sCgkJc3RlcDogMjAsCgkJ +cHJlZml4OiAnJHByZWZpeCcsCgkJdXJsOiAnJHVybCcsCgkJcGFyYW1ldGVyczogJyRwYXJhbWV0 +ZXJzJywJCQoJCWNvbnRhaW5lcl9pZDogJyRjb250YWluZXJfaWQnLAoJCXNob3dfY29tcGxpYW5j +ZTogJHNob3dfY29tcGxpYW5jZSwKCQlsYWJlbHM6ICRsYWJlbHMKCX0gKS5leGVjdXRlKCk7Cgp9 +KTsKRU9KCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+bWFrZV9lbGVtZW50KCAnZGl2Jywg +Y2xhc3MgPT4gJ2VwX3JlcG9ydF9wYWdlJywgaWQgPT4gJGNvbnRhaW5lcl9pZCApICk7CgoJI3No +b3cgc2VhcmNoIGNvbnRyb2xzIGFmdGVyIHRoZSByZXN1bHRzIHRvbwoJaWYoICRzZWxmLT57cHJv +Y2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQogICAgICAgIHsKICAgICAgICAgICAgICAg +ICRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwogICAg +ICAgIH0KCglyZXR1cm4gJGNodW5rOwp9CgoKc3ViIHJlbmRlcl9leHBvcnRfYmFyCnsKCW15KCAk +c2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsg +PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJbXkgQHBsdWdpbnMgPSAkc2VsZi0+ZXhwb3J0 +X3BsdWdpbnM7CglyZXR1cm4gJGNodW5rIHVubGVzcyggc2NhbGFyKCBAcGx1Z2lucyApIHx8IGRl +ZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRz +IiApICkgKTsKCglteSAkcmVwb3J0X2RzID0gJHJlcG8tPmRhdGFzZXQoICRzZWxmLT57ZGF0YXNl +dGlkfSApOwoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmli +dXRlKCBtZXRob2QgPT4gImdldCIgKTsKCglpZiggZGVmaW5lZCAkc2VsZi0+cmVwb3NpdG9yeS0+ cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2Vh -cmNoIiApCgl7CgkJbXkgJGVzY2V4cCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNl -cmlhbGlzZTsKCQlteSAkY2FjaGVpZCA9ICRyZXBvLT5wYXJhbSggImNhY2hlIiApOwoJCW15ICRz -Y29uZiA9ICRzZWxmLT57c2NvbmZ9OwkKCgkJI3NldCB1cCBuZXcgc2VhcmNoIGxpbmsKCQlteSAk -bmV3X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAg -ICAgIAkkbmV3X2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgICAgICAgICAgc2NyZWVuID0+ -ICJSZXBvcnQiLAoJCQlzY29uZiA9PiAkc2NvbmYsCiAgICAgICAgCSk7CgoJCW15ICRzZWFyY2hf -bGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgkJbXkgJG5ld19saW5rID0gJHJlcG8t -PnJlbmRlcl9saW5rKCAiJG5ld19iYXNldXJsJl9hY3Rpb25fbmV3c2VhcmNoPTEiICk7CgkgICAJ -JG5ld19saW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4 -cHJlc3Npb246bmV3IiApICk7CgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQoICRuZXdfbGlu -ayApOwoKCQkjYWRkIGEgc2VwYXJhdG9yLi4uCgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQo -ICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsK -CgkJI3NldCB1cCByZWZpbmUgc2VhcmNoIGxpbmsKCQlteSAkcmVmaW5lX2Jhc2V1cmwgPSBVUkkt -Pm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAgICAgIAkkcmVmaW5lX2Jhc2V1 -cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgIAljYWNoZSA9PiAkY2FjaGVpZCwKCSAgICAgICAgICAg -ICAgICBleHAgPT4gJGVzY2V4cCwKICAgICAgICAJICAgICAgICBzY3JlZW4gPT4gIlJlcG9ydCIs -CiAgICAgICAgICAgICAgICAJZGF0YXNldCA9PiAkc2VsZi0+e2RhdGFzZXRpZH0sCiAgICAgICAg -ICAgICAgICAJb3JkZXIgPT4gJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+e2N1c3RvbV9v -cmRlcn0sCgkJCXNjb25mID0+ICRzY29uZiwKICAgICAgICAJKTsKCgkJbXkgJHJlZmluZV9saW5r -ID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJHJlZmluZV9iYXNldXJsJl9hY3Rpb25fdXBkYXRlPTEi -ICk7CiAgICAgIAkJJHJlZmluZV9saW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNl -KCAibGliL3NlYXJjaGV4cHJlc3Npb246cmVmaW5lIiApICk7ICAgCSAgICAgICAgIAoJICAgICAg -ICAkc2VhcmNoX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJlZmluZV9saW5rICk7CgoJCSRjaHVuay0+ -YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpzZWFyY2hfbGlua3MiLCBs -aW5rcz0+JHNlYXJjaF9saW5rcyApICk7Cgl9CgoJcmV0dXJuICRjaHVuazsKfQoKCiNhZGRzIGEg -bmV3IGNoZWNrYm94IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZSB3aGljaCBmaWVsZHMgdG8g -ZXhwb3J0CnN1YiBfZXhwb3J0X2ZpZWxkX2NoZWNrYm94CnsKCW15KCAkc2VsZiwgJHJlcG8sICRm -aWVsZG5hbWUsICR1bCwgJGZpZWxkbGFiZWwgKSA9IEBfOwoKCW15ICRsaSA9ICRyZXBvLT5tYWtl -X2VsZW1lbnQoICJsaSIgKTsKCSR1bC0+YXBwZW5kQ2hpbGQoICRsaSApOwoKICAgICAgICBteSAk -Y2hlY2tib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaW5wdXQiLCB0eXBlID0+ICJjaGVja2Jv -eCIsIGlkID0+ICRmaWVsZG5hbWUsIG5hbWUgPT4gJGZpZWxkbmFtZSwgdmFsdWUgPT4gJGZpZWxk -bmFtZSApOwoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0s -ICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKSApCgl7CgkJaWYoICggZ3JlcCB7ICRmaWVsZG5hbWUg -ZXEgJF8gfSBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0Zmll -bGRfZGVmYXVsdHMiICl9ICkgfHwgKCBzY2FsYXIoIEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntl -eHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKX0gKSA9PSAwICkgKQoJCXsKCQkJ -I29ubHkgY2hlY2sgZGVmYXVsdHMgb3IgY2hlY2sgZXZlcnl0aGluZyBpZiBkZWZhdWx0cyBub3Qg -ZGVmaW5lZAoJCQkkY2hlY2tib3gtPnNldEF0dHJpYnV0ZSggImNoZWNrZWQiLCAieWVzIiApOwoJ -CX0KCX0KCW15ICRsYWJlbCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsYWJlbCIsIGZvciA9PiAk -ZmllbGRuYW1lICk7CgkkbGFiZWwtPmFwcGVuZENoaWxkKCAkZmllbGRsYWJlbCApOwoKCSRsaS0+ -YXBwZW5kQ2hpbGQoICRjaGVja2JveCApOwoJJGxpLT5hcHBlbmRDaGlsZCggJGxhYmVsICk7Cn0K -CiMjIyB1dGlsaXR5IG1ldGhvZHMKCiMgVE9ETyBzaG91bGQgdXNlICJKU09OIiBwYWNrYWdlCnN1 -YiB0b19qc29uCnsKICAgICAgICBteSggJHNlbGYsICRvYmplY3QgKSA9IEBfOwoKCXJldHVybiAi -IiBpZiggIWRlZmluZWQgJG9iamVjdCApOwoKIyBVVEYtOCBpc3N1ZXM6CiMJcmV0dXJuIEpTT04t -Pm5ldy0+dXRmOCgxKS0+ZW5jb2RlKCAkb2JqZWN0ICk7CgogICAgICAgIGlmKCByZWYoICRvYmpl -Y3QgKSBlcSAnSEFTSCcgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBzdHVmZjsKICAg -ICAgICAgICAgICAgIHdoaWxlKCBteSggJGssICR2ICkgPSBlYWNoKCAlJG9iamVjdCApICkKICAg -ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6 -OlV0aWxzOjppc19zZXQoICR2ICkgKTsgICAgICAgIyBvciAnbnVsbCcgPwogICAgICAgICAgICAg -ICAgICAgICAgICBwdXNoIEBzdHVmZiwgRVByaW50czo6VXRpbHM6OmpzX3N0cmluZyggJGsgKS4n -OicuJHNlbGYtPnRvX2pzb24oICR2ICkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg -IHJldHVybiAneycgLiBqb2luKCAiLCIsIEBzdHVmZiApIC4gJ30nOwogICAgICAgIH0KICAgICAg -ICBlbHNpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0FSUkFZJyApCiAgICAgICAgewogICAgICAgICAg -ICAgICAgbXkgQHN0dWZmOwogICAgICAgICAgICAgICAgZm9yZWFjaCggQCRvYmplY3QgKQogICAg -ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6 -VXRpbHM6OmlzX3NldCggJF8gKSApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVm -ZiwgJHNlbGYtPnRvX2pzb24oICRfICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg -ICByZXR1cm4gJ1snIC4gam9pbiggIiwiLCBAc3R1ZmYgKSAuICddJzsKICAgICAgICB9CgogICAg -ICAgIHJldHVybiBFUHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkb2JqZWN0ICk7Cn0KCnN1YiBl -eHBvcnRfcGx1Z2lucwp7CiAgICAgICAgbXkoICRzZWxmLCAkZ2VuZXJpYyApID0gQF87CgoJbXkg -QHBsdWdpbl9pZHM7CgkKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJaWYoIGRlZmlu -ZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRfcGx1Z2lucyIg -KSApCgl7CgkJQHBsdWdpbl9pZHMgPSBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2Nv -bmZ9LCAiZXhwb3J0X3BsdWdpbnMiICl9OwoJfQkKCWVsc2lmKCAkZ2VuZXJpYyApCgl7CiAJCUBw -bHVnaW5faWRzID0gJHJlcG8tPnBsdWdpbl9saXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4g -IkV4cG9ydCIsCgkgICAgICAgICAgICAgICAgY2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMi -LAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNl -ZCA9PiAxLAoJICAgICAgICApOwoJfQoJZWxzZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRy -ZXBvLT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAg -ICAgICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAog -ICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9 -PiAxLAoJICAgICAgICApOwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQg -KCBAcGx1Z2luX2lkcyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJHAgPSAkcmVwby0+ -cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAk -cDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKc3ViIHJlcG9ydF9wbHVn -aW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBsaXN0IHZpYSB0eXBlID0+ -ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBv -c2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUgPT4gIlNjcmVlbiIsCiAg -ICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15ICRpZCAoIEBwbHVnaW5f -aWRzICkKICAgICAgICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVuOjpSZXBvcnQ6Oi8gKTsJ -IyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNjcmVlbjo6UmVwb3J0KQoK -ICAgICAgICAgICAgICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdpbiggIiRpZCIg -KTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92aWV3ZWQgKTsKCiAgICAg -ICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBA -cGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBwZWQgdG8gYSBsYWJlbCBh -bmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2YgaXRlbXMgYXJlIGp1c3Qg -cmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpTKQpzdWIgZ2V0X2dyb3Vw -ZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSApID0gQF87CglteSAkc2Vz -c2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglteSAkZ3JvdXBpbmcgPSAk -c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVsZCA9ICRpdGVtcy0+Z2V0 -X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3VwX29wdHMgaWYgYXBwcm9w -cmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9ICkKCXsK -CQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJJG1ldGFmaWVsZC0+e3Jl -bmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXN9IGlmIGV4 -aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jlc307CgkJfQoJfQoKCSNj -cmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3IgaXRlbSBpZHMpCgkkaXRl -bXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0YXNldCwgJGl0ZW0gKSA9 -IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRp -cGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBsZSApCiAgICAgICAgICAg -ICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICl9OwoJ -CX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVtLT52YWx1ZSggJGdyb3Vw -aW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+IDAgKQoJCXsKCQkJZm9y -ZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJewoJCQkJbXkgJGdyb3Vw -X2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNzaW9uLCAkZ3JvdXBfdmFs -dWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJCQkJaWYoIGRlZmluZWQg -JHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJCQkJCSRncm91cF9pZCA9 -ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29w -dHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29w -dHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhpc3RzICRncm91cGVkeyRn -cm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBwdXNoIGEgbmV3IGl0 -ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJCWlmKCAkaWRzX29ubHkg -KSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0K -CQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwgJGl0ZW0tPmlkOwoJCQkJ -CX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRp -dGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkgICAgICAJCWVsc2UgI3Nl -dCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAgICAJewoJCQkJCW15IEBn -cm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2Fu -dCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAgICAgICAgICAgICAgICAg -ICB7CQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdyb3VwZWRfaXRlbXMgPSAo -JGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAgIAkJICAgICAgICB9CgkgICAgICAgICAgICAgICAg -CSAgICAgICAgZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsKCSAgICAgICAgICAgICAg -ICAJICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtKTsKICAgICAgICAJCSAg -ICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgJGdyb3VwZWR7JGdyb3Vw -X2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAgICAgIAkJfQoJCX0KCQll -bHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAuICRtZXRhZmllbGQtPm5h -bWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApICN3ZSd2ZSBhbHJl -YWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0byB0aGUgbGlzdAoJCSAg -CXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVy -IHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lk -fX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7 -JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAgICAgIAkgICAgICAJZWxz -ZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJewoJCQkJbXkgQGdyb3Vw -ZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRz -IHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgIHsJCiAgICAgICAg -CQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAgICAgICAJCX0KCSAg -ICAgICAgICAgICAgICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgewoJICAgICAgICAg -ICAgICAgCSAgICAgICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAg -CSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91 -cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAgCX0gKTsKCgkjbm93IHNv -cnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVscwoJbXkgQHNvcnRlZF9n -cm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNlbGYtPntwcm9jZXNzb3J9 -LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNz -b3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAkbWV0YWZpZWxkLT50eXBl -IGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyApID0gJG1ldGFmaWVsZC0+ -dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRhZ3MgdG8gYSBoYXNoIG9m -IHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15ICVwcmlvcml0eTsKCQlt -eSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30gKQoJCXsKCQkJJHByaW9y -aXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9yZWFjaCBteSAka2V5IChz -b3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAg -ICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0o -ICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9CgllbHNpZiggJG1ldGFm -aWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0gJHNlc3Npb24tPmRhdGFz -ZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91cGVkOwoJCW15ICRzb3J0 -ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxAdmFsdWVzICk7CgkJbXkg -JXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICR2 -YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAg -ICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAk -aW5kZXgrKzsKICAgICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRrZXkgKHNvcnQgeyRwcmlv -cml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQpCiAgICAgICAgICAgICAg -ICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAgICAgICAgICAgICAgICAg -ICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRn -cm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkc3Viai0+cmVuZGVy -X2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAgICAgICAgICAgfQoJfQoJ -ZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlpZiggJHJldmVyc2UgKQoJ -CXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBrZXlzICVncm91cGVkICkK -CQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSgg -JGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15 -ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBz -b3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwg -JGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9y -ZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJ -cHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7 -JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBz -b3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+ -X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoK -CSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdyb3VwX2lkID0gIlVuc3Bl -Y2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBf -aWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVt -KCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCglyZXR1cm4gXEBzb3J0ZWRf -Z3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXkoICRzZWxmLCAkbGlzdCwg -JGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9ICRsaXN0OwoJJGdyb3Vw -e2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgpzdWIgcmVuZGVyX3NlbGVjdGFs -bAp7CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICR0b2dnbGVfZnVuY3Rpb24gPSAnCgkJ -dmFyIGlzQ2hlY2tlZCA9IHRydWU7CgkJZnVuY3Rpb24gdG9nZ2xlQ2hlY2tib3hlcygpIHsKCSAg -ICAgICAgCXZhciBleHBvcnRfb3B0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05h -bWUoInJlcG9ydF9leHBvcnRfb3B0aW9ucyIpOwoJCQlmb3IoIGV4cG9ydF9vcHRpb24gb2YgZXhw -b3J0X29wdGlvbnMgKQoJCQl7CgkJCQl2YXIgY2hlY2tib3hlcyA9IGV4cG9ydF9vcHRpb24uZ2V0 -RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKQoJCQkJZm9yKCBjaGVja2JveCBvZiBjaGVja2Jv -eGVzICkKCQkJCXsKCQkJCQlpZihpc0NoZWNrZWQpCgkJCQkJewoJICAgICAgICAgICAgICAgIAkJ -CWNoZWNrYm94LmNoZWNrZWQgPSAiIjsKCQkgIAkgICAgICAgIAl9CgkJCQkJZWxzZQoJCQkJCXsK -CQkJCSAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gImNoZWNrZWQiOwoJCQkJCX0K -CSAgICAgICAgIAkJfQoJCQl9CgkJCWlzQ2hlY2tlZCA9ICFpc0NoZWNrZWQ7CgkJfSc7CgkKCW15 -ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxlbWVudCggInNjcmlwdCIgKTsKCSRqc190YWctPmFw -cGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkdG9nZ2xlX2Z1bmN0aW9uICkgKTsK -CXJldHVybiAkanNfdGFnOwp9CgpzdWIgcmVuZGVyX2NsZWFyZm9ybQp7CglteSggJHNlbGYsICR4 -bWwgKSA9IEBfOwoKCW15ICRjbGVhcl9mdW5jdGlvbiA9ICcKCQlmdW5jdGlvbiBjbGVhckZvcm0o -KXsKCQkJdmFyIHJlcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAiY3VzdG9tX3JlcG9y -dCIgKTsKCQkJdmFyIGZvcm0gPSByZXBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic2VsZWN0 -ZWRfZm9ybSIpWzBdOwoJCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSgg -ImlucHV0IiApOwoJCQlmb3IoIGlucHV0IG9mIGlucHV0cyApCgkJCXsKCQkJCWZpZWxkX3R5cGUg -PSBpbnB1dC50eXBlLnRvTG93ZXJDYXNlKCk7CQoJCQkJY29uc29sZS5sb2coZmllbGRfdHlwZSk7 -CgkJCQlzd2l0Y2ggKGZpZWxkX3R5cGUpCgkJCQl7CgkJCQljYXNlICJ0ZXh0IjoKCQkJCWNhc2Ug -InRleHRhcmVhIjoKCQkJCQlpbnB1dC52YWx1ZSA9ICIiOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAi -cmFkaW8iOgoJCQkJY2FzZSAiY2hlY2tib3giOgoJCQkJCWlmIChpbnB1dC5jaGVja2VkKQoJCQkJ -CXsKICAgICAgICAJCQkJCWlucHV0LmNoZWNrZWQgPSBmYWxzZTsKCQkJCQl9CgkJCQkJYnJlYWs7 -CgkJCQljYXNlICJzZWxlY3Qtb25lIjoKCQkJCWNhc2UgInNlbGVjdC1tdWx0aSI6CgkJCQkJaW5w -dXQuc2VsZWN0ZWRJbmRleCA9IC0xOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQlicmVh -azsKCQkJCX0KCQkJfQkKCQkgICAgICAgIHZhciBzZWxlY3RzID0gZm9ybS5nZXRFbGVtZW50c0J5 -VGFnTmFtZSggInNlbGVjdCIgKTsKCQkJZm9yKCBzZWxlY3Qgb2Ygc2VsZWN0cyApCgkJCXsJCgkJ -CQlpZiggc2VsZWN0Lmhhc0F0dHJpYnV0ZSgibXVsdGlwbGUiKSApCgkJCQl7CgkJCQkJc2VsZWN0 -LnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJfQkJCgoJCX0nOwkJCgoJbXkgJGpzX3RhZyA9 -ICR4bWwtPmNyZWF0ZV9lbGVtZW50KCAic2NyaXB0IiApOwogICAgICAgICRqc190YWctPmFwcGVu -ZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkY2xlYXJfZnVuY3Rpb24gKSApOwogICAg -ICAgIHJldHVybiAkanNfdGFnOwp9CgoxOwo= +cmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVs +ZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2UpICk7 +Cgl9CgkJCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZv +cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNl +bGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQkKCglpZiggZGVmaW5lZCAkc2VsZi0+e3By +b2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5y +ZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBf +ZXhwfSApICk7Cgl9CQoKICAgIG15ICRleHBvcnRfbGFiZWwgPSAkcmVwby0+bWFrZV9lbGVtZW50 +KCAibGFiZWwiLCBpZD0+ImV4cG9ydF9zZWxlY3RfbGFiZWwiICk7CiAgICAkZXhwb3J0X2xhYmVs +LT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0X3NlbGVjdF9sYWJlbCIg +KSApOwogICAgJGZvcm0tPmFwcGVuZENoaWxkKCAkZXhwb3J0X2xhYmVsICk7CgoJaWYoICFkZWZp +bmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIg +KSApICkKCXsKCQkjbm8gY3VzdG9tIGV4cG9ydCBmaWVsZHMgZGVmaW5lZCwgdXNlIGV4cG9ydCBw +bHVnaW5zIGRlc2lnbmVkIGZvciB0aGlzIHJlcG9ydAoJCW15ICRzZWxlY3QgPSAkZm9ybS0+YXBw +ZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfb3B0aW9uX2xpc3QoCgkJCW5hbWUgPT4gJ2V4cG9ydCcs +CgkJCXZhbHVlcyA9PiBbbWFwIHsgJF8tPmdldF9zdWJ0eXBlIH0gQHBsdWdpbnNdLAoJCQlsYWJl +bHMgPT4ge21hcCB7ICRfLT5nZXRfc3VidHlwZSA9PiAkXy0+Z2V0X25hbWUgfSBAcGx1Z2luc30s +CiAgICAgICAgICAgICdhcmlhLWxhYmVsbGVkYnknID0+ICJleHBvcnRfc2VsZWN0X2xhYmVsIiwK +CQkpICk7Cgl9CgllbHNlCgl7CgkJI3Byb3ZpZGUgbGlzdCBvZiBkZWZhdWx0IGV4cG9ydCBwbHVn +aW5zIGZvciByZXBvcnRzCgkJQHBsdWdpbnMgPSAkc2VsZi0+ZXhwb3J0X3BsdWdpbnMoICJnZW5l +cmljIiApOwoJCW15ICRzZWxlY3QgPSAkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJf +b3B0aW9uX2xpc3QoCgkJCW5hbWUgPT4gJ2V4cG9ydCcsCgkJCXZhbHVlcyA9PiBbbWFwIHsgJF8t +PmdldF9zdWJ0eXBlIH0gQHBsdWdpbnNdLAoJCQlsYWJlbHMgPT4ge21hcCB7ICRfLT5nZXRfc3Vi +dHlwZSA9PiAkXy0+Z2V0X25hbWUgfSBAcGx1Z2luc30sCiAgICAgICAgICAgICdhcmlhLWxhYmVs +bGVkYnknID0+ICJleHBvcnRfc2VsZWN0X2xhYmVsIiwKCQkpICk7CgoJCSNjcmVhdGUgbGFiZWxz +IGFuZCBwYW5lbHMgZm9yIHRhYmJlZCBpbnRlcmZhY2VkCgkJbXkgJHhtbCA9ICRyZXBvLT54bWw7 +CgkJbXkgJHhodG1sID0gJHJlcG8tPnhodG1sOwoKCQlteSAkc2VsZWN0X2FsbCA9ICRmb3JtLT5h +cHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9zZWxlY3RhbGwoICR4bWwgKSApOwoJCW15ICRzZWxl +Y3RfYnRuID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfZWxlbWVudCggImJ1dHRv +biIsCgkgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gImJ1dHRvbiIsCgkgICAgICAgICAgICAg +ICAgICAgIG9uY2xpY2sgPT4gInRvZ2dsZUNoZWNrYm94ZXMoKTsiLAoJICAgICAgICAgICAgICAg +ICAgICBjbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIHNlbGVjdF9idXR0b24iLAoJCSkg +KTsKCSAgICAkc2VsZWN0X2J0bi0+YXBwZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZV90ZXh0X25vZGUo +ICRyZXBvLT5waHJhc2UoICJyZXBvcnRfc2VsZWN0IiApICkgKTsKCgkJI2FsbG93IHVzZXIgdG8g +Y2hvb3NlIHdoaWNoIGZpZWxkcyB0aGV5IHdhbnQgdG8gZXhwb3J0CgkJbXkgJGV4cG9ydF9vcHRp +b25zID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIgKTsKCgkJbXkgQGtleXM7CgkJaWYoIGRl +ZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9v +cmRlciIgKSApCgkJewoJCQlAa2V5cyA9IEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRf +Y29uZn0sICJleHBvcnRmaWVsZF9vcmRlciIgKX07CgkJfQoJCWVsc2UKCQl7CgkJCUBrZXlzID0g +a2V5cyAleyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRz +IiApfTsgCgkJfQoJCWZvcmVhY2ggbXkgJGtleSAoIEBrZXlzICkKCQl7CgkJCSNjcmVhdGUgYSBu +ZXcgbGlzdAkJCQoJCQlteSAkdWwgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAidWwiLAoJICAgICAg +ICAgICAgICAgIAlzdHlsZSA9PiAibGlzdC1zdHlsZS10eXBlOiBub25lIgoJICAgICAgICAJKTsK +CQkJCgkJCW15ICRjb3VudCA9IDA7ICNjb3VudCBob3cgbWFueSBmaWVsZHMgd2UgYWRkCgkJCWZv +cmVhY2ggbXkgJGZpZWxkbmFtZSggQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25m +fSwgImV4cG9ydGZpZWxkcyIgKS0+eyRrZXl9fSApCgkJCXsKCQkJCWlmKCBkZWZpbmVkICRyZXBv +LT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKSAmJiBleGlz +dHMgJHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImN1c3RvbV9leHBvcnQi +ICl9eyRmaWVsZG5hbWV9ICkgI3dlIGhhdmUgYSBjdXN0b20gZXhwb3J0IGZ1bmN0aW9uIGluc3Rl +YWQgCgkJCQl7CgkJCQkJJGNvdW50Kys7CgkJCQkJJHNlbGYtPl9leHBvcnRfZmllbGRfY2hlY2ti +b3goICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRyZXBvLT5odG1sX3BocmFzZSggImV4cG9ydGZp +ZWxkb3B0aW9uczokZmllbGRuYW1lIiApICk7IAoJCQkJfQoJCQkJZWxzaWYoIGRlZmluZWQgRVBy +aW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHJlcG9ydF9kcywgJGZpZWxk +bmFtZSApICkKCQkJCXsKCQkJCQlteSAkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJv +bV9jb25maWdfc3RyaW5nKCAkcmVwb3J0X2RzLCAkZmllbGRuYW1lICk7CgkJCQkJJGNvdW50Kys7 +CiAgICAgICAJCQkgICAgICAgIAkkc2VsZi0+X2V4cG9ydF9maWVsZF9jaGVja2JveCggJHJlcG8s +ICRmaWVsZG5hbWUsICR1bCwgJGZpZWxkLT5yZW5kZXJfbmFtZSApOwoKCQkJCX0KCQkJfQoJCQlp +ZiggJGNvdW50ICkgI29ubHkgYWRkIG9wdGlvbnMgaWYgd2UgaGF2ZSBhbnkgZmllbGRzIHRvIHNo +b3cKCQkJewoJCQkJbXkgJGRpdiA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiLCBjbGFzcz0+ +InJlcG9ydF9leHBvcnRfb3B0aW9ucyIgKTsKCQkJCSRkaXYtPmFwcGVuZENoaWxkKCBteSAkaCA9 +ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiLCBjbGFzcz0+ImN1c3RvbV9leHBvcnRfaGVhZGVy +IiApICk7CgkJCQkkaC0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImV4cG9ydGZp +ZWxkczoka2V5IiApICk7CQoJCQkJJGRpdi0+YXBwZW5kQ2hpbGQoICR1bCApOwoJCQkJJGV4cG9y +dF9vcHRpb25zLT5hcHBlbmRDaGlsZCggJGRpdiApOwoJCQl9CiAgICAgICAJCX0KCQkkZm9ybS0+ +YXBwZW5kQ2hpbGQoICRleHBvcnRfb3B0aW9ucyApOwoJfQoKCSRmb3JtLT5hcHBlbmRDaGlsZCgg +CgkJJHJlcG8tPnJlbmRlcl9idXR0b24oCgkJCW5hbWUgPT4gIl9hY3Rpb25fZXhwb3J0IiwKCQkJ +Y2xhc3MgPT4gImVwX2Zvcm1fYWN0aW9uX2J1dHRvbiIsCgkJCXZhbHVlID0+ICRyZXBvLT5waHJh +c2UoICdjZ2kvdXNlcnMvZWRpdF9lcHJpbnQ6ZXhwb3J0JyApCgkpICk7CgoJI2NyZWF0ZSBhIGNv +bGxhcHNpYmxlIGJveAoJbXkgJGltYWdlc3VybCA9ICRyZXBvLT5jdXJyZW50X3VybCggcGF0aCA9 +PiAic3RhdGljIiwgInN0eWxlL2ltYWdlcyIgKTsKCW15ICVvcHRpb25zOwoJJG9wdGlvbnN7c2Vz +c2lvbn0gPSAkcmVwbzsKICAgICAgICAkb3B0aW9uc3tpZH0gPSAiZXBfcmVwb3J0X2V4cG9ydCI7 +CiAgICAgICAgJG9wdGlvbnN7dGl0bGV9ID0gJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0X3Rp +dGxlIiApOwogICAgICAgICRvcHRpb25ze2NvbGxhcHNlZH0gPSAxOwoJJG9wdGlvbnN7Y29udGVu +dH0gPSAkZm9ybTsKICAgICAgICAkb3B0aW9uc3tzaG93X2ljb25fdXJsfSA9ICIkaW1hZ2VzdXJs +L211bHRpX2Rvd24ucG5nIjsKCSRvcHRpb25ze2hpZGVfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwv +bXVsdGlfdXAucG5nIjsKCglteSAkYm94ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIHN0 +eWxlPT4idGV4dC1hbGlnbjogbGVmdCIgKTsKCSRib3gtPmFwcGVuZENoaWxkKCBFUHJpbnRzOjpC +b3g6OnJlbmRlciggJW9wdGlvbnMgKSApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGJveCApOwoK +CXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfc29ydF9vcHRpb25zCnsKCW15KCAkc2VsZiAp +ID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVw +by0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmluZWQoICRy +ZXBvLT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICkgKSApOwoKCW15 +ICRzb3J0X2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e3NvcnRfY29uZn0sICJzb3J0Zmll +bGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07 +CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1lID0+ICJzb3J0X3JlcG9ydCIgKTsKICAgICAgICAk +Zm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVuay0+YXBwZW5kQ2hp +bGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNlYXJjaCIgKSB8fCAk +c2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBw +ZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57 +cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZiggZGVmaW5lZCAkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRy +ZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57 +Z3JvdXBfZXhwfSApICk7Cgl9CgoJI2Rpc3BsYXkgdGhlIGxpbmtzIHRoYXQgd2lsbCB0cmlnZ2Vy +IHRoZSBmb3JtCglteSAkZmlyc3QgPSAxOwoJbXkgJHNvcnRfbGlua3MgPSAkcmVwby0+bWFrZV9k +b2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRzb3J0X25hbWUgKCBrZXlzICV7JHNvcnRfY29uZn0g +KQogICAgICAgIHsKCQlteSAkc29ydF92YWx1ZSA9ICRzb3J0X2NvbmYtPnskc29ydF9uYW1lfTsK +CQlpZiggJGZpcnN0ICkKCQl7CgkJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9o +aWRkZW5fZmllbGQoICJzb3J0IiwgJHNvcnRfdmFsdWUpICk7CgkJfQoKCQlpZiggISRmaXJzdCAp +CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJJHNvcnRfbGlua3MtPmFwcGVuZENo +aWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiAp +ICk7CiAgICAgICAgICAgICAgICB9CgkJCgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9 +LT57c29ydH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gZXEgJHNvcnRfdmFsdWUgKQoJ +CXsKCQkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7CgkJCSRz +dHJvbmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29ydF9jb25m +fSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBlbmRDaGls +ZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJf +bGluayggJ2phdmFzY3JpcHQ6c29ydF9yZXBvcnQoIicuJHNvcnRfdmFsdWUuJyIpJyApOwkKCQkJ +JGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29ydF9jb25m +fSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBlbmRDaGls +ZCggJGxpbmsgKTsKCQl9CgkJJGZpcnN0ID0gMDsKICAgICAgICB9ICAgICAgICAgICAKCSRjaHVu +ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpzb3J0X2xpbmtzIiwg +bGlua3M9PiRzb3J0X2xpbmtzICkgKTsKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfZ3Jv +dXBfb3B0aW9ucwp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9z +aXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoKCXJldHVybiAk +Y2h1bmsgdW5sZXNzKCBkZWZpbmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9 +LCAiZ3JvdXBmaWVsZHMiICkgKSApOwoKCW15ICRncm91cF9jb25mID0gJHJlcG8tPmNvbmZpZygg +JHNlbGYtPntncm91cF9jb25mfSwgImdyb3VwZmllbGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJ +bXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1l +ID0+ICJncm91cF9yZXBvcnQiICk7CiAgICAgICAgJGZvcm0tPnNldEF0dHJpYnV0ZSggbWV0aG9k +ID0+ICJnZXQiICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkZm9ybSApOwoJCglpZiggZGVmaW5l +ZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9u +fSBlcSAic2VhcmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hp +ZGRlbl9maWVsZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJp +YWxpc2UpICk7Cgl9CgoJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKQoJ +ewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJzb3J0 +IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlu +a3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkZ3JvdXBf +bGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRncm91cF92YWx1 +ZSAoIEB7JGdyb3VwX2NvbmZ9ICkKICAgICAgICB7CgkJbXkgKCRncm91cF9maWVsZCkgPSBzcGxp +dCgvOy8sICRncm91cF92YWx1ZSApOwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVu +ZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggImdyb3VwIiwgJGdyb3VwX3ZhbHVl +KSApOwoJCX0KCgkJaWYoICEkZmlyc3QgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAg +ICAgCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0 +ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZigg +ZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9 +LT57Z3JvdXB9IGVxICRncm91cF9maWVsZCApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1h +a2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5o +dG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVs +ZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRzdHJvbmcgKTsKCQl9CgkJZWxz +ZQoJCXsKCQkJbXkgJGxpbmsgPSAkcmVwby0+cmVuZGVyX2xpbmsoICdqYXZhc2NyaXB0Omdyb3Vw +X3JlcG9ydCgiJy4kZ3JvdXBfdmFsdWUuJyIpJyApOwkKCQkJJGxpbmstPmFwcGVuZENoaWxkKCAk +cmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57Z3JvdXBfY29uZn0gLiAiOmdyb3VwOiIgLiAkZ3Jv +dXBfZmllbGQgKSApOwoJCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0K +CQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJCgkjbm8gZ3JvdXBpbmcgbGluayBh +dCB0aGUgZW5kCgkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2Uo +ICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CglpZiggZGVmaW5lZCAkc2VsZi0+ +e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9IG5lICIi +ICkKCXsKCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBf +cmVwb3J0KCIiKScgKTsJCgkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2Uo +ICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAk +bGluayApOwoJfQoJZWxzZQoJewoJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAi +c3Ryb25nIiApOwogCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAi +cmVwb3J0Om5vX2dyb3VwaW5nIiApICk7CgkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHN0 +cm9uZyApOwoJfQoJCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJS +ZXBvcnQ6Z3JvdXBfbGlua3MiLCBsaW5rcz0+JGdyb3VwX2xpbmtzICkgKTsKCglyZXR1cm4gJGNo +dW5rOwp9CgpzdWIgcmVuZGVyX3JlZmluZV9zZWFyY2gKewoJbXkoICRzZWxmICkgPSBAXzsKCglt +eSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2Rv +Y19mcmFnbWVudDsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRz +ZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRlc2NleHAg +PSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2U7CgkJbXkgJGNhY2hlaWQg +PSAkcmVwby0+cGFyYW0oICJjYWNoZSIgKTsKCQlteSAkc2NvbmYgPSAkc2VsZi0+e3Njb25mfTsJ +CgoJCSNzZXQgdXAgbmV3IHNlYXJjaCBsaW5rCgkJbXkgJG5ld19iYXNldXJsID0gVVJJLT5uZXco +ICRzZWxmLT57c2Vzc2lvbn0tPmdldF91cmkgKTsKICAgICAgICAJJG5ld19iYXNldXJsLT5xdWVy +eV9mb3JtKAoJICAgICAgICAgICAgICAgIHNjcmVlbiA9PiAiUmVwb3J0IiwKCQkJc2NvbmYgPT4g +JHNjb25mLAogICAgICAgIAkpOwoKCQlteSAkc2VhcmNoX2xpbmtzID0gJHJlcG8tPm1ha2VfZG9j +X2ZyYWdtZW50OwoJCW15ICRuZXdfbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggIiRuZXdfYmFz +ZXVybCZfYWN0aW9uX25ld3NlYXJjaD0xIiApOwoJICAgCSRuZXdfbGluay0+YXBwZW5kQ2hpbGQo +ICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9uOm5ldyIgKSApOwoJCSRz +ZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkbmV3X2xpbmsgKTsKCgkJI2FkZCBhIHNlcGFyYXRv +ci4uLgoJCSRzZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJV +cGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CgoJCSNzZXQgdXAgcmVmaW5lIHNlYXJj +aCBsaW5rCgkJbXkgJHJlZmluZV9iYXNldXJsID0gVVJJLT5uZXcoICRzZWxmLT57c2Vzc2lvbn0t +PmdldF91cmkgKTsKICAgICAgICAJJHJlZmluZV9iYXNldXJsLT5xdWVyeV9mb3JtKAoJICAgICAg +ICAJY2FjaGUgPT4gJGNhY2hlaWQsCgkgICAgICAgICAgICAgICAgZXhwID0+ICRlc2NleHAsCiAg +ICAgICAgCSAgICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAogICAgICAgICAgICAgICAgCWRhdGFz +ZXQgPT4gJHNlbGYtPntkYXRhc2V0aWR9LAogICAgICAgICAgICAgICAgCW9yZGVyID0+ICRzZWxm +LT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPntjdXN0b21fb3JkZXJ9LAoJCQlzY29uZiA9PiAkc2Nv +bmYsCiAgICAgICAgCSk7CgoJCW15ICRyZWZpbmVfbGluayA9ICRyZXBvLT5yZW5kZXJfbGluaygg +IiRyZWZpbmVfYmFzZXVybCZfYWN0aW9uX3VwZGF0ZT0xIiApOwogICAgICAJCSRyZWZpbmVfbGlu +ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9u +OnJlZmluZSIgKSApOyAgIAkgICAgICAgICAKCSAgICAgICAgJHNlYXJjaF9saW5rcy0+YXBwZW5k +Q2hpbGQoICRyZWZpbmVfbGluayApOwoKCQkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRt +bF9waHJhc2UoICJSZXBvcnQ6c2VhcmNoX2xpbmtzIiwgbGlua3M9PiRzZWFyY2hfbGlua3MgKSAp +OwoJfQoKCXJldHVybiAkY2h1bms7Cn0KCgojYWRkcyBhIG5ldyBjaGVja2JveCB0byBhbGxvdyB0 +aGUgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRzIHRvIGV4cG9ydApzdWIgX2V4cG9ydF9maWVs +ZF9jaGVja2JveAp7CglteSggJHNlbGYsICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRmaWVsZGxh +YmVsICkgPSBAXzsKCglteSAkbGkgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAibGkiICk7CgkkdWwt +PmFwcGVuZENoaWxkKCAkbGkgKTsKCiAgICAgICAgbXkgJGNoZWNrYm94ID0gJHJlcG8tPm1ha2Vf +ZWxlbWVudCggImlucHV0IiwgdHlwZSA9PiAiY2hlY2tib3giLCBpZCA9PiAkZmllbGRuYW1lLCBu +YW1lID0+ICRmaWVsZG5hbWUsIHZhbHVlID0+ICRmaWVsZG5hbWUgKTsKCWlmKCBkZWZpbmVkICRy +ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfZGVmYXVsdHMi +ICkgKQoJewoJCWlmKCAoIGdyZXAgeyAkZmllbGRuYW1lIGVxICRfIH0gQHskcmVwby0+Y29uZmln +KCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX2RlZmF1bHRzIiApfSApIHx8ICgg +c2NhbGFyKCBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0Zmll +bGRfZGVmYXVsdHMiICl9ICkgPT0gMCApICkKCQl7CgkJCSNvbmx5IGNoZWNrIGRlZmF1bHRzIG9y +IGNoZWNrIGV2ZXJ5dGhpbmcgaWYgZGVmYXVsdHMgbm90IGRlZmluZWQKCQkJJGNoZWNrYm94LT5z +ZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInllcyIgKTsKCQl9Cgl9CglteSAkbGFiZWwgPSAkcmVw +by0+bWFrZV9lbGVtZW50KCAibGFiZWwiLCBmb3IgPT4gJGZpZWxkbmFtZSApOwoJJGxhYmVsLT5h +cHBlbmRDaGlsZCggJGZpZWxkbGFiZWwgKTsKCgkkbGktPmFwcGVuZENoaWxkKCAkY2hlY2tib3gg +KTsKCSRsaS0+YXBwZW5kQ2hpbGQoICRsYWJlbCApOwp9CgojIyMgdXRpbGl0eSBtZXRob2RzCgoj +IFRPRE8gc2hvdWxkIHVzZSAiSlNPTiIgcGFja2FnZQpzdWIgdG9fanNvbgp7CiAgICAgICAgbXko +ICRzZWxmLCAkb2JqZWN0ICkgPSBAXzsKCglyZXR1cm4gIiIgaWYoICFkZWZpbmVkICRvYmplY3Qg +KTsKCiMgVVRGLTggaXNzdWVzOgojCXJldHVybiBKU09OLT5uZXctPnV0ZjgoMSktPmVuY29kZSgg +JG9iamVjdCApOwoKICAgICAgICBpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0hBU0gnICkKICAgICAg +ICB7CiAgICAgICAgICAgICAgICBteSBAc3R1ZmY7CiAgICAgICAgICAgICAgICB3aGlsZSggbXko +ICRrLCAkdiApID0gZWFjaCggJSRvYmplY3QgKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAg +ICAgICAgICAgICAgICAgIG5leHQgaWYoICFFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkdiApICk7 +ICAgICAgICMgb3IgJ251bGwnID8KICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3R1ZmYs +IEVQcmludHM6OlV0aWxzOjpqc19zdHJpbmcoICRrICkuJzonLiRzZWxmLT50b19qc29uKCAkdiAp +CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3snIC4gam9pbiggIiwi +LCBAc3R1ZmYgKSAuICd9JzsKICAgICAgICB9CiAgICAgICAgZWxzaWYoIHJlZiggJG9iamVjdCAp +IGVxICdBUlJBWScgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBzdHVmZjsKICAgICAg +ICAgICAgICAgIGZvcmVhY2goIEAkb2JqZWN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAg +ICAgICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICRfICkgKTsK +ICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3R1ZmYsICRzZWxmLT50b19qc29uKCAkXyAp +OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICdbJyAuIGpvaW4oICIs +IiwgQHN0dWZmICkgLiAnXSc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gRVByaW50czo6VXRp +bHM6OmpzX3N0cmluZyggJG9iamVjdCApOwp9CgpzdWIgZXhwb3J0X3BsdWdpbnMKewogICAgICAg +IG15KCAkc2VsZiwgJGdlbmVyaWMgKSA9IEBfOwoKCW15IEBwbHVnaW5faWRzOwoJCglteSAkcmVw +byA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWcoICRzZWxm +LT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICkgKQoJewoJCUBwbHVnaW5faWRzID0g +QHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydF9wbHVnaW5zIiAp +fTsKCX0JCgllbHNpZiggJGdlbmVyaWMgKQoJewogCQlAcGx1Z2luX2lkcyA9ICRyZXBvLT5wbHVn +aW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAgICAgICAg +ICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC9nZW5lcmljIiwKICAgICAgICAJICAgICAgICBpc192 +aXNpYmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAgKTsKCX0K +CWVsc2UKCXsKICAgICAgICAJQHBsdWdpbl9pZHMgPSAkcmVwby0+cGx1Z2luX2xpc3QoCiAgICAg +ICAgICAgICAgICAJdHlwZSA9PiAiRXhwb3J0IiwKCSAgICAgICAgICAgICAgICBjYW5fYWNjZXB0 +ID0+ICJyZXBvcnQvIi4kc2VsZi0+Z2V0X3JlcG9ydCwKICAgICAgICAJICAgICAgICBpc192aXNp +YmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAgKTsKICAgICAg +ICB9CglteSBAcGx1Z2luczsKCWZvcmVhY2ggbXkgJGlkICggQHBsdWdpbl9pZHMgKQogICAgICAg +IHsKICAgICAgICAgICAgICAgIG15ICRwID0gJHJlcG8tPnBsdWdpbiggIiRpZCIgKSBvciBuZXh0 +OwogICAgICAgICAgICAgICAgcHVzaCBAcGx1Z2lucywgJHA7CiAgICAgICAgfQoKICAgICAgICBy +ZXR1cm4gQHBsdWdpbnM7Cn0KCnN1YiByZXBvcnRfcGx1Z2lucwp7CglteSggJHNlbGYgKSA9IEBf +OwoKCSMgc2YyIC0gY2FuJ3QgbGlzdCB2aWEgdHlwZSA9PiAiU2VhcmNoOjpSZXBvcnQiID8gCiAg +ICAgICAgbXkgQHBsdWdpbl9pZHMgPSAkc2VsZi0+cmVwb3NpdG9yeS0+cGx1Z2luX2xpc3QoCiAg +ICAgICAgICAgICAgICB0eXBlID0+ICJTY3JlZW4iLAogICAgICAgICk7CgogICAgICAgIG15IEBw +bHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewoJCW5leHQg +aWYoICRpZCAhfiAvXlNjcmVlbjo6UmVwb3J0OjovICk7CSMgbm90ZSB0aGlzIGFsc28gZmlsdGVy +cyBvdXQgJHNlbGYgKGFrYSBTY3JlZW46OlJlcG9ydCkKCiAgICAgICAgICAgICAgICBteSAkcCA9 +ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW4oICIkaWQiICk7CgkJbmV4dCBpZiggIWRlZmluZWQg +JHAgfHwgISRwLT5jYW5fYmVfdmlld2VkICk7CgogICAgICAgICAgICAgICAgcHVzaCBAcGx1Z2lu +cywgJHA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQHBsdWdpbnM7Cn0KCiNyZXR1cm5zIGEg +aGFzaCBvZiB2YWx1ZXMgbWFwcGVkIHRvIGEgbGFiZWwgYW5kIGEgbGlzdAojaWYgaWRzX29ubHkg +aXMgc2V0IHRoZSBsaXN0IG9mIGl0ZW1zIGFyZSBqdXN0IHJlcHJlc2VudGVkIGJ5IHRoZWlyIGlk +ICh1c2VkIGJ5IHJlcG9ydCBKUykKc3ViIGdldF9ncm91cGVkX2l0ZW1zCnsKCW15KCAkc2VsZiwg +JGl0ZW1zLCAkaWRzX29ubHkgKSA9IEBfOwoJbXkgJHNlc3Npb24gPSAkc2VsZi0+e3Nlc3Npb259 +OwoJbXkgJWdyb3VwZWQ7CgoJbXkgJGdyb3VwaW5nID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3Jv +dXB9OwoKCW15ICRtZXRhZmllbGQgPSAkaXRlbXMtPmdldF9kYXRhc2V0LT5maWVsZCggJGdyb3Vw +aW5nICk7CgoJI3NldCBncm91cF9vcHRzIGlmIGFwcHJvcHJpYXRlCglpZiggZGVmaW5lZCAkc2Vs +Zi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfSApCgl7CgkJaWYoICRtZXRhZmllbGQtPnR5cGUg +ZXEgImRhdGUiICkKCQl7CgkJCSRtZXRhZmllbGQtPntyZW5kZXJfcmVzfSA9ICRzZWxmLT57cHJv +Y2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmVzfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNzb3J9 +LT57Z3JvdXBfb3B0c30tPntyZXN9OwoJCX0KCX0KCgkjY3JlYXRlIGEgaGFzaCBvZiBmaWVsZCB2 +YWx1ZXMgdG8gaXRlbXMgKG9yIGl0ZW0gaWRzKQoJJGl0ZW1zLT5tYXAoIHN1YiB7CgkgICAgICAg +CW15KCAkc2Vzc2lvbiwgJGRhdGFzZXQsICRpdGVtICkgPSBAXzsKCQkKCQlteSAkbXVsdGlwbGUg +PSAkbWV0YWZpZWxkLT5nZXRfcHJvcGVydHkoICJtdWx0aXBsZSIgKTsKCQlteSBAZ3JvdXBfdmFs +dWVzOwoJCWlmKCAkbXVsdGlwbGUgKQogICAgICAgICAgICAgICAgewoJCQlAZ3JvdXBfdmFsdWVz +ID0gQHskaXRlbS0+dmFsdWUoICRncm91cGluZyApfTsKCQl9CgkJZWxzZQoJCXsJCQkKCQkJQGdy +b3VwX3ZhbHVlcyA9ICgkaXRlbS0+dmFsdWUoICRncm91cGluZyApKTsKCQl9CgkKCQlpZiggc2Nh +bGFyIEBncm91cF92YWx1ZXMgPiAwICkKCQl7CgkJCWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICgg +QGdyb3VwX3ZhbHVlcyApCgkJCXsKCQkJCW15ICRncm91cF9pZCA9ICRtZXRhZmllbGQtPmdldF9p +ZF9mcm9tX3ZhbHVlKCAkc2Vzc2lvbiwgJGdyb3VwX3ZhbHVlICk7CgkJCQkjdHJ1bmNhdGUgZ3Jv +dXAgaWYgYXBwcm9wcmlhdGUKCQkJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dy +b3VwX29wdHN9ICkKCQkJCXsKCQkJCQkkZ3JvdXBfaWQgPSAgc3Vic3RyKCAiXHUkZ3JvdXBfaWQi +LCAwLCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfSApIGlmIGV4 +aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfTsKCQkJCX0K +CgkJICAgICAgICAJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9ICkgI3dlJ3ZlIGFscmVh +ZHkgc2V0IHRoaXMgbGlzdCB1cCwgcHVzaCBhIG5ldyBpdGVtIG9uIHRvIHRoZSBsaXN0CgkJICAg +ICAgICAgICAgICAgCXsKCQkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdh +bnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdy +b3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJ +CQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbTsKCQkJCQl9CgkgICAgICAgCQkg +ICAgICAgIH0KICAgICAgICAJICAgICAgCQllbHNlICNzZXQgdXAgYSBsaXN0IGZvciB0aGlzIGdy +b3VwCgkgICAgICAgIAkgICAgICAgCXsKCQkJCQlteSBAZ3JvdXBlZF9pdGVtczsKCQkJCQlpZigg +JGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3 +aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgICAgICAgICAgewkKICAgICAgICAJCSAgICAgICAg +ICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAg +ICAgICAJCSAgICAgICAgfQoJICAgICAgICAgICAgICAgIAkgICAgICAgIGVsc2UKICAgICAgICAJ +ICAgICAgICAgICAgICAgIAl7CgkgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3Jv +dXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCQkgICAgICAgICAgICAgICAJfQoJICAgICAg +ICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNd +OwoJCQkJfQogICAgICAgICAgICAgICAJCX0KCQl9CgkJZWxzZQoJCXsKCQkJbXkgJGdyb3VwX2lk +ID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwogIAkgICAgCQlpZiggZXhpc3Rz +ICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBw +dXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgIAl7CgkJCQlpZiggJGlkc19vbmx5ICkg +I3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJ +CQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbS0+aWQ7CgkJCQl9CgkJ +CQllbHNlCgkJCQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbTsKCQkJ +CX0KCSAgICAgICAJCX0KICAgICAgICAJICAgICAgCWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRo +aXMgZ3JvdXAKCSAgICAgICAgCXsKCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJaWYoICRpZHNf +b25seSApICNzb21ldGltZXMgd2Ugb25seSB3YW50IGlkcyByYXRoZXIgdGhhbiB0aGUgd2hvbGUg +aXRlbQoJCSAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJCQlAZ3JvdXBlZF9pdGVtcyA9ICgk +aXRlbS0+aWQpOwogICAgICAgICAgICAgICAgCQl9CgkgICAgICAgICAgICAgICAgCWVsc2UKICAg +ICAgICAJICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAg +QGdyb3VwZWRfaXRlbXMgPSAoJGl0ZW0pOwogICAgICAgIAkgICAgICAgICAgICAgICAJfQoJICAg +ICAgICAgICAgICAJICAgICAgICAkZ3JvdXBlZHskZ3JvdXBfaWR9ID0gW0Bncm91cGVkX2l0ZW1z +XTsKCQkJfQoJCX0KICAgICAgIAl9ICk7CgoJI25vdyBzb3J0IHRoZSBncm91cHMgYW5kIGFkZCBo +dW1hbiByZWFkYWJsZSBsYWJlbHMKCW15IEBzb3J0ZWRfZ3JvdXBzOwoJCglteSAkcmV2ZXJzZSA9 +IDA7CgkkcmV2ZXJzZSA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmV2ZXJz +ZV9vcmRlcn0gaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmV2 +ZXJzZV9vcmRlcn07CglpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAibmFtZWRzZXQiICkKCXsKCQlt +eSggJHRhZ3MsICRsYWJlbHMgKSA9ICRtZXRhZmllbGQtPnRhZ3NfYW5kX2xhYmVscyggJHNlc3Np +b24gKTsKCQkjY29udmVydCB0YWdzIHRvIGEgaGFzaCBvZiB2YWx1ZXMgYW5kIGEgcHJpb3JpdHkg +KGZvciBvcmRlcmluZykKCQlteSAlcHJpb3JpdHk7CgkJbXkgJGluZGV4ID0gMTsKCQlmb3JlYWNo +IG15ICR0YWcgKEB7JHRhZ3N9ICkKCQl7CgkJCSRwcmlvcml0eXskdGFnfSA9ICRpbmRleDsKCQkJ +JGluZGV4Kys7CgkJfQoJCWZvcmVhY2ggbXkgJGtleSAoc29ydCB7JHByaW9yaXR5eyRhfSA8PT4g +JHByaW9yaXR5eyRifX0ga2V5cyAlZ3JvdXBlZCkKICAgICAgICAJewoJCQlwdXNoIEBzb3J0ZWRf +Z3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGxhYmVs +cy0+eyRrZXl9ICk7CgkJfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgInN1YmplY3Qi +ICkKCXsJCQoJCW15ICRkcyA9ICRzZXNzaW9uLT5kYXRhc2V0KCAic3ViamVjdCIgKTsKCQlteSBA +dmFsdWVzID0ga2V5cyAlZ3JvdXBlZDsKCQlteSAkc29ydGVkID0gJG1ldGFmaWVsZC0+c29ydF92 +YWx1ZXMoICRzZXNzaW9uLCBcQHZhbHVlcyApOwoJCW15ICVwcmlvcml0eTsKCQlteSAkaW5kZXgg +PSAxOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKEB7JHNvcnRlZH0gKQogICAg +ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcHJpb3JpdHl7JHZhbHVlfSA9 +ICRpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4Kys7CiAgICAgICAgICAgICAg +ICB9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7 +JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAgICAgICAgICAgewoJCQlteSAkc3ViaiA9ICRkcy0+ +ZGF0YW9iaiggJGtleSApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzb3J0ZWRfZ3Jv +dXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgRVByaW50czo6 +VXRpbHM6OnRyZWVfdG9fdXRmOCggJHN1YmotPnJlbmRlcl9kZXNjcmlwdGlvbiApICkgaWYgZGVm +aW5lZCAkc3ViajsKICAgICAgICAgICAgICAgIH0KCX0KCWVsc2lmKCAkbWV0YWZpZWxkLT50eXBl +IGVxICJkYXRlIiApCgl7CgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkgJGtleSAo +IHNvcnQgeyRiIDw9PiAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNvcnRlZF9n +cm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAka2V5ICk7 +CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGEgPD0+ICRi +fSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9t +YWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCX0KCWVs +c2UKCXsJCgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkgJGtleSAoIHNvcnQgeyRi +IGNtcCAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRz +ZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAka2V5ICk7CgkJCX0KCQl9 +CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCBrZXlzICVncm91cGVkICkKCQkJ +ewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdy +b3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCX0KCgkjY2hlY2sgZm9yIGFueSB1bnNwZWNp +ZmllZCBncm91cHMKCW15ICRncm91cF9pZCA9ICJVbnNwZWNpZmllZCAiIC4gJG1ldGFmaWVsZC0+ +bmFtZTsKCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApCgl7CgkJcHVzaCBAc29ydGVk +X2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGdyb3VwX2lkfSwg +JGdyb3VwX2lkICk7Cgl9CgoJcmV0dXJuIFxAc29ydGVkX2dyb3VwczsKfQkKCgpzdWIgX21ha2Vf +Z3JvdXBlZF9pdGVtCnsKCW15KCAkc2VsZiwgJGxpc3QsICRsYWJlbCApID0gQF87CglteSAlZ3Jv +dXA7CgkkZ3JvdXB7bGlzdH0gPSAkbGlzdDsKCSRncm91cHtsYWJlbH0gPSAkbGFiZWw7CglyZXR1 +cm4gXCVncm91cDsKfQoKc3ViIHJlbmRlcl9zZWxlY3RhbGwKewoJbXkoICRzZWxmLCAkeG1sICkg +PSBAXzsKCglteSAkdG9nZ2xlX2Z1bmN0aW9uID0gJwoJCXZhciBpc0NoZWNrZWQgPSB0cnVlOwoJ +CWZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94ZXMoKSB7CgkgICAgICAgIAl2YXIgZXhwb3J0X29wdGlv +bnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJyZXBvcnRfZXhwb3J0X29wdGlv +bnMiKTsKCQkJZm9yKCBleHBvcnRfb3B0aW9uIG9mIGV4cG9ydF9vcHRpb25zICkKCQkJewoJCQkJ +dmFyIGNoZWNrYm94ZXMgPSBleHBvcnRfb3B0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiaW5w +dXQiICkKCQkJCWZvciggY2hlY2tib3ggb2YgY2hlY2tib3hlcyApCgkJCQl7CgkJCQkJaWYoaXND +aGVja2VkKQoJCQkJCXsKCSAgICAgICAgICAgICAgICAJCQljaGVja2JveC5jaGVja2VkID0gIiI7 +CgkJICAJICAgICAgICAJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkgICAgICAgICAgICAgICAgY2hl +Y2tib3guY2hlY2tlZCA9ICJjaGVja2VkIjsKCQkJCQl9CgkgICAgICAgICAJCX0KCQkJfQoJCQlp +c0NoZWNrZWQgPSAhaXNDaGVja2VkOwoJCX0nOwoJCglteSAkanNfdGFnID0gJHhtbC0+Y3JlYXRl +X2VsZW1lbnQoICJzY3JpcHQiICk7CgkkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRl +X3RleHRfbm9kZSggJHRvZ2dsZV9mdW5jdGlvbiApICk7CglyZXR1cm4gJGpzX3RhZzsKfQoKc3Vi +IHJlbmRlcl9jbGVhcmZvcm0KewoJbXkoICRzZWxmLCAkeG1sICkgPSBAXzsKCglteSAkY2xlYXJf +ZnVuY3Rpb24gPSAnCgkJZnVuY3Rpb24gY2xlYXJGb3JtKCl7CgkJCXZhciByZXBvcnQgPSBkb2N1 +bWVudC5nZXRFbGVtZW50QnlJZCggImN1c3RvbV9yZXBvcnQiICk7CgkJCXZhciBmb3JtID0gcmVw +b3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInNlbGVjdGVkX2Zvcm0iKVswXTsKCQkJdmFyIGlu +cHV0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKTsKCQkJZm9yKCBpbnB1 +dCBvZiBpbnB1dHMgKQoJCQl7CgkJCQlmaWVsZF90eXBlID0gaW5wdXQudHlwZS50b0xvd2VyQ2Fz +ZSgpOwkKCQkJCWNvbnNvbGUubG9nKGZpZWxkX3R5cGUpOwoJCQkJc3dpdGNoIChmaWVsZF90eXBl +KQoJCQkJewoJCQkJY2FzZSAidGV4dCI6CgkJCQljYXNlICJ0ZXh0YXJlYSI6CgkJCQkJaW5wdXQu +dmFsdWUgPSAiIjsKCQkJCQlicmVhazsKCQkJCWNhc2UgInJhZGlvIjoKCQkJCWNhc2UgImNoZWNr +Ym94IjoKCQkJCQlpZiAoaW5wdXQuY2hlY2tlZCkKCQkJCQl7CiAgICAgICAgCQkJCQlpbnB1dC5j +aGVja2VkID0gZmFsc2U7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAic2VsZWN0LW9uZSI6 +CgkJCQljYXNlICJzZWxlY3QtbXVsdGkiOgoJCQkJCWlucHV0LnNlbGVjdGVkSW5kZXggPSAtMTsK +CQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0JCgkJICAgICAg +ICB2YXIgc2VsZWN0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxlY3QiICk7CgkJ +CWZvciggc2VsZWN0IG9mIHNlbGVjdHMgKQoJCQl7CQoJCQkJaWYoIHNlbGVjdC5oYXNBdHRyaWJ1 +dGUoIm11bHRpcGxlIikgKQoJCQkJewoJCQkJCXNlbGVjdC5zZWxlY3RlZEluZGV4ID0gLTE7CgkJ +CQl9CgkJCX0JCQoKCQl9JzsJCQoKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxlbWVudCgg +InNjcmlwdCIgKTsKICAgICAgICAkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlX3Rl +eHRfbm9kZSggJGNsZWFyX2Z1bmN0aW9uICkgKTsKICAgICAgICByZXR1cm4gJGpzX3RhZzsKfQoK +MTsK @@ -2925,7 +2933,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.4.1 + 3.4.2 diff --git a/reports.epmi b/reports.epmi index f335b98..49f10f1 100644 --- a/reports.epmi +++ b/reports.epmi @@ -97,9 +97,9 @@ document plugins/EPrints/Plugin/Screen/Report.pm text/plain - 2c4683e23b226dbc06eda9f63d03a1bc + 76ae03abfa9314aa25371d44e8486945 MD5 - 44999 + 45432 document @@ -187,7 +187,7 @@ coverimage - 3.4.1 + 3.4.2 From 02a395a49f9e41208ef61fb6dfae137e80053f83 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Mon, 9 Feb 2026 10:58:22 +0000 Subject: [PATCH 07/11] Backport 3_4 fixes to epm and and update export plugin to better handle sub objects --- lib/plugins/EPrints/Plugin/Export/Grid2.pm | 45 +- lib/plugins/EPrints/Plugin/Screen/Report.pm | 44 +- lib/static/javascript/auto/reports.js | 710 ++++---- reports.epm | 1770 ++++++++++--------- reports.epmi | 14 +- 5 files changed, 1336 insertions(+), 1247 deletions(-) diff --git a/lib/plugins/EPrints/Plugin/Export/Grid2.pm b/lib/plugins/EPrints/Plugin/Export/Grid2.pm index 9b51687..961fb54 100644 --- a/lib/plugins/EPrints/Plugin/Export/Grid2.pm +++ b/lib/plugins/EPrints/Plugin/Export/Grid2.pm @@ -139,7 +139,7 @@ sub dataobj_to_rows { $field = $ds->get_field( $fnames[0] ); #first get the field if( $field->is_type( "subobject", "itemref" ) ) #if the field belongs to another dataset - { + { my $sub_ds_id = $field->get_property( "datasetid" ); my $multiple = $field->get_property( "multiple" ); if( $multiple ) @@ -147,16 +147,16 @@ sub dataobj_to_rows my @sub_dataobjs; #get the dataobjs of this field if( $sub_ds_id eq "document" ) #documents represent a special case of sub object - we don't want volatile documents (probably) - { - @sub_dataobjs = $dataobj->get_all_documents; - } - else - { - foreach my $sub_obj ( @{$dataobj->value( $fnames[0] )} ) - { - push @sub_dataobjs, $field->get_item( $dataobj->repository, $sub_obj ); - } - } + { + @sub_dataobjs = $dataobj->get_all_documents; + } + else + { + foreach my $sub_obj ( @{$dataobj->value( $fnames[0] )} ) + { + push @sub_dataobjs, $field->get_item( $dataobj->repository, $sub_obj ); + } + } #and build up an array of these sub dataobj's values foreach my $obj ( @sub_dataobjs ) #get the values we are requesting of the dataobjects @@ -184,13 +184,22 @@ sub dataobj_to_rows } else #we only have one sub-object, { - my $sub_obj = $field->get_item( $dataobj->repository, $dataobj->value( $fnames[0] ) ); #get the subobject - $field = EPrints::Utils::field_from_config_string( $sub_obj->dataset, $fnames[1] ); #get the subobjects field - my $value = $field->get_value( $sub_obj ); #get the subobjects value for this field - push @{$sub_dataobj_values}, $value; - } - } - } + my $sub_obj; + if( ref( $field ) eq "EPrints::MetaField::Subobject" ) + { + $sub_obj = $dataobj->value( $fnames[0] ); + } + else # do it the original way (assuming this ever worked...? + { + $sub_obj = $field->get_item( $dataobj->repository, $dataobj->value( $fnames[0] ) ); #get the subobject + } + + $field = EPrints::Utils::field_from_config_string( $sub_obj->dataset, $fnames[1] ); #get the subobjects field + my $value = $field->get_value( $sub_obj ); #get the subobjects value for this field + push @{$sub_dataobj_values}, $value; + } + } + } my $i = @{$rows[0]}; my $_rows; diff --git a/lib/plugins/EPrints/Plugin/Screen/Report.pm b/lib/plugins/EPrints/Plugin/Screen/Report.pm index cdb2c56..cb41194 100644 --- a/lib/plugins/EPrints/Plugin/Screen/Report.pm +++ b/lib/plugins/EPrints/Plugin/Screen/Report.pm @@ -581,7 +581,7 @@ sub render_splash_page #add each report to the select component and generate search form if required my $report_select = $repo->make_element( "select", name=>"report", id=>"select_report", 'aria-labelledby' => "report_select_label" ); - my %search_forms; + my @search_forms; my $custom_reports = 0; #foreach my $report_plugin ( @plugins ) foreach my $report_plugin ( sort { $a->get_subtype cmp $b->get_subtype } @plugins ) @@ -606,6 +606,9 @@ sub render_splash_page $option->appendChild( $report_plugin->render_title ); $report_select->appendChild( $option ); + # now we've added to the select, do we need to render a search form + next if (grep { $formid eq $_ } @search_forms ); + #create search form #get report dataset and appropriate search config my $searchdatasetid = $report_plugin->{searchdatasetid}; @@ -637,7 +640,15 @@ sub render_splash_page #generate the form my $frag = $self->render_search_fields( $searchexp, $formid ); - $search_forms{$formid} = $frag unless exists $search_forms{$formid}; + + my $template = $repo->make_element( "template", id => $formid ); + my $table = $repo->make_element( "div", class=>"ep_table ep_search_fields", id=>"form_$formid" ); + $table->appendChild( $frag ); + $template->appendChild( $table ); + $custom->appendChild( $template ); + + # keep a record of this search form to save us from rendering it again + push @search_forms, $formid; } } @@ -645,20 +656,14 @@ sub render_splash_page my $report_label = $repo->make_element( "label", id=>"report_select_label" ); $report_label->appendChild( $repo->html_phrase( "report_select_label" ) ); $form->appendChild( $report_label ); - $form->appendChild( $report_select ); - $form->appendChild( $repo->render_hidden_field( "screen", $self->{screenid} ) ); - - #render possible search forms - foreach my $formid (keys %search_forms) - { - my $table = $repo->make_element( "div", class=>"ep_table ep_search_fields", id=>$formid, style=>"display: none" ); - $form->appendChild( $table ); - $table->appendChild( $search_forms{$formid} ); - } - - $form->appendChild( $self->render_controls ); - $custom->appendChild( $form ); + + $form->appendChild( $repo->render_hidden_field( "screen", $self->{screenid} ) ); + $form->appendChild( $repo->make_element( "div", id=>"form_container" ) ); + + $form->appendChild( $self->render_controls ); + + $custom->appendChild( $form ); #javascript for changing forms based on report selection $custom->appendChild( $repo->make_javascript( 'initReportForm();' ) ); @@ -1048,7 +1053,7 @@ sub render_sort_options if( !$first ) { - $sort_links->appendChild( $repo->html_phrase( "Update/Views:group_seperator" ) ); + $sort_links->appendChild( $repo->html_phrase( "Update/Views:group_separator" ) ); } if( defined $self->{processor}->{sort} && $self->{processor}->{sort} eq $sort_value ) @@ -1110,7 +1115,7 @@ sub render_group_options if( !$first ) { - $group_links->appendChild( $repo->html_phrase( "Update/Views:group_seperator" ) ); + $group_links->appendChild( $repo->html_phrase( "Update/Views:group_separator" ) ); } if( defined $self->{processor}->{group} && $self->{processor}->{group} eq $group_field ) @@ -1129,7 +1134,7 @@ sub render_group_options } #no grouping link at the end - $group_links->appendChild( $repo->html_phrase( "Update/Views:group_seperator" ) ); + $group_links->appendChild( $repo->html_phrase( "Update/Views:group_separator" ) ); if( defined $self->{processor}->{group} && $self->{processor}->{group} ne "" ) { my $link = $repo->render_link( 'javascript:group_report("")' ); @@ -1175,7 +1180,7 @@ sub render_refine_search $search_links->appendChild( $new_link ); #add a separator... - $search_links->appendChild( $repo->html_phrase( "Update/Views:group_seperator" ) ); + $search_links->appendChild( $repo->html_phrase( "Update/Views:group_separator" ) ); #set up refine search link my $refine_baseurl = URI->new( $self->{session}->get_uri ); @@ -1562,7 +1567,6 @@ sub render_clearform for( input of inputs ) { field_type = input.type.toLowerCase(); - console.log(field_type); switch (field_type) { case "text": diff --git a/lib/static/javascript/auto/reports.js b/lib/static/javascript/auto/reports.js index dd13001..5a47b5e 100644 --- a/lib/static/javascript/auto/reports.js +++ b/lib/static/javascript/auto/reports.js @@ -27,374 +27,378 @@ var initReportForm = function(){ var onFormSelect = function(){ - //get form id - var formid = this.options[this.selectedIndex].getAttribute('form'); - - //hide other forms - $$('div.ep_table.ep_search_fields').each(function (elem) - { - //hide the form - $(elem).hide(); - $(elem).removeClassName("selected_form"); - $(elem).select('input').each(function (input) - { - $(input).setAttribute("disabled", "disabled"); - }); - }); - - //show the form we want - $(formid).show(); - $(formid).addClassName("selected_form"); - - //enable this form's input elements - $(formid).select('input').each(function (input) - { - $(input).removeAttribute("disabled"); - }); - + //get form id + var formid = this.options[this.selectedIndex].getAttribute('form'); + const container = document.getElementById("form_container"); + container.innerHTML = ''; + const clone = $(formid).content.cloneNode(true); + container.appendChild(clone); }; // Used by the Screen::Report::render method var EPrints_Screen_Report_Loader = Class.create({ - has_problems: 0, - count: 0, - runs: 0, - progress: null, - ids: Array(), - step: 20, - prefix: '', - onProblems: function() {}, - onFinish: function() {}, - url: "", - parameters: "", - container: null, - show_compliance: 1, - - // to show a pretty progress bar (% compliance): - total_dataobjs: 0, - total_noncompliant: 0, - - - initialize: function(opts) { - if( opts.ids ) - this.ids = opts.ids; - if( opts.step ) - this.step = opts.step; - if( opts.prefix ) - this.prefix = opts.prefix; - if( opts.onFinish ) - this.onFinish = opts.onFinish; - if( opts.onProblems ) - this.onProblems = opts.onProblems; - if( opts.url ) - { - this.url = opts.url; - } - if( opts.parameters ) - this.parameters = opts.parameters; - if( opts.container_id ) - this.container = $( opts.container_id ); // should fail if container doesn't exist... - if( opts.hasOwnProperty('show_compliance') ) - { - this.show_compliance = opts.show_compliance; - } - if( opts.labels ) - { - this.labels = opts.labels; - } - }, - - execute: function() { - // progress-bar - - this.container.insert( new Element( 'div', { 'class': 'ep_report_progress_bar', 'id': this.prefix + "_progress_bar" } ) ); - - var current_grouping = null; // might not be set in the returned value but that's allowed/OK - - var dataobjs = {}; - var grouped = false; - var seen_ids = {}; - this.no_items = this.ids.length; - this.retrieved = []; - if( !isInteger(this.ids[0]) ) //ids have been grouped - { - grouped = true; - this.grouped_ids = this.ids; - this.ids = []; - for( var i = 0; i < this.grouped_ids.length; i++ ) - { - this.ids = this.ids.concat(this.grouped_ids[i].list); - } - //the grouping may have created duplicate records (i.e. a record can appear in more than one group) - it's handy to have an array of all the unique records - this.unique = this.ids.filter(function(item, i, ar){ return ar.indexOf(item) === i; }); - this.no_items = this.unique.length; - } - for(var i = 0; i < this.ids.length; i+=this.step) - { - // arguments for Ajax query AND creates the HTML placeholders
's (that will receive the content of the Ajax query...) - var args = '&ajax='+this.prefix; - for(var j = 0; j < this.step && i+j < this.ids.length; j++) - { - args += '&' + this.prefix + '=' + this.ids[i+j]; - var id = this.prefix + '_' + this.ids[i+j]; - var target_el = $( id ); - if( target_el != null ) - { - //store a record of this in seen_ids to ensure each placeholder has a unique id - if( !(id in seen_ids) ) - { - seen_ids[id] = 1; - } - else - { - seen_ids[id] = seen_ids[id] + 1; - } - id = id + "_" + seen_ids[id]; - } - - this.container.insert( new Element( 'div', { 'class': 'ep_report_row', 'id': id, 'position': i+j } ), { 'position': 'after' } ); - } - new Ajax.Request( this.url, { - method: 'get', - parameters: this.parameters + args, - onSuccess: (function(transport) { - - var json = transport.responseText.evalJSON(); - var data = json.data; - - if( data == null ) - data = new Array(); - for( var i=0; i 0 ) - { - target_id = target_id + '_' + added_ids[dataobjid]; - } - var target_el = $( target_id ); - - if( target_el != null && summary != null ) - { - var summary_el = target_el.appendChild( new Element( 'div', { 'class': 'ep_report_row_summary' } ) ); - summary_el.update( summary ); - - //total up non compliant records - if( entry.is_compliant == null && entry.problems && entry.problems.length ) - { - this.total_noncompliant++; - } - - if( entry.problems && entry.problems.length ) - { - var problems_el = target_el.appendChild( new Element( 'ul', { 'class': 'ep_report_row_problems' } ) ); - - for( var p=0; p< entry.problems.length; p++ ) - { - var li = problems_el.appendChild( new Element( 'li' )); - li.update( entry.problems[p] ); - } - } - else - { - //add support for compliant items to include bullet points too - if( entry.bullets && entry.bullets.length ) - { - var bullets_el = target_el.appendChild( new Element( 'ul', { 'class': 'ep_report_row_bullets' } ) ); - - for( var b=0; b< entry.bullets.length; b++ ) - { - var li = bullets_el.appendChild( new Element( 'li' )); - li.update( entry.bullets[b] ); - } - } - } - - //display state - var re = new RegExp("^#(?:[0-9a-fA-F]{3}){1,2}$"); - if( entry.state && re.test(entry.state) ) - { - target_el.style.borderLeftWidth = '7px'; - target_el.style.borderLeftStyle = 'solid'; - target_el.style.borderLeftColor = entry.state; - } - else //no state provided, so derive one from existence of problems - { - if( entry.problems && entry.problems.length ) - { - target_el.addClassName( 'ep_report_row_problems' ); - } - else - { - target_el.addClassName( 'ep_report_row_ok' ); - } - - if( !this.show_compliance ) - { - target_el.addClassName( 'ep_report_row_no_compliance' ); - } - } - target_el.show(); - - var grouping = entry.grouping; - if( grouping != null ) - { - if( current_grouping == null || current_grouping != grouping) - { - current_grouping = grouping; - var grouping_container = new Element( 'div', { 'class': 'ep_report_grouping' } ); - target_el.insert( { 'before' : grouping_container } ); - grouping_container.update( current_grouping ); - } - } - } - } - - - if( this.total_dataobjs ) - { - - this.container.insertBefore( new Element( 'div', { 'class': 'ep_report_compliance_container', 'id': this.prefix + "_compliance_container" } ), this.container.firstChild ); - //set up text container - $( this.prefix + "_compliance_container" ).appendChild( new Element( 'div', { 'class': 'ep_report_compliance_text', 'id': this.prefix + "_compliance_text", } )); - - //set up outputs label - var outputs; - if( this.labels ) - { - outputs = this.labels.outputs; - } - else - { - outputs = "output"; - if( this.total_dataobjs > 1 ) - outputs = outputs + "s"; - } - - if( this.show_compliance ) - { - var ref_width = 200; - var compliance = ( this.total_dataobjs - this.total_noncompliant ) / this.total_dataobjs; - - $( this.prefix + "_compliance_container" ).appendChild( new Element( 'div', { 'class': 'ep_report_compliance_wrapper', 'id': this.prefix + "_compliance", 'style': 'width: '+ref_width + 'px' } ) ); - - var compliance_width = Math.floor( 200 * compliance ); - - $( this.prefix + "_compliance" ).appendChild( new Element( 'div', { 'class': 'ep_report_compliance', 'style': 'width:'+compliance_width + 'px' } ) ); - - $( this.prefix + "_compliance_text" ).update( this.total_dataobjs + " " + outputs + " - " + Math.floor( compliance * 100 ) + "% compliance"); - } - else - { - $( this.prefix + "_compliance_text" ).update( this.total_dataobjs + " " + outputs ); - } - } - - } - else - { - var width = 200; - $( this.prefix + '_progress_bar' ).style.backgroundPosition = Math.round(-width + width * this.count / this.ids.length) + "px 0px"; - } - - if( this.runs == 0 && this.count == 0 ) - { - var pNode = $( this.prefix + '_progress_bar' ).parentNode; - $(this.prefix + '_progress_bar').remove(); - var span = new Element( 'span', { 'class': 'ep_ref_report_empty' } ); - span.update( 'Report empty' ); - pNode.insert( span ); - } - this.runs++; - - }).bind(this) - }); - } - if( this.ids == null || this.ids.length == 0 ) - { - var pNode = $(this.prefix + '_progress_bar').parentNode; - $(this.prefix + '_progress_bar').hide(); - var span = new Element( 'span', { 'class': 'ep_ref_report_empty' } ); - span.update( 'Report empty' ); - pNode.insert( span ); - } - } + has_problems: 0, + count: 0, + runs: 0, + progress: null, + ids: Array(), + seen_ids: {}, + step: 20, + batch: 0, + grouped: false, + prefix: '', + onProblems: function() {}, + onFinish: function() {}, + url: "", + parameters: "", + container: null, + show_compliance: 1, + + // to show a pretty progress bar (% compliance): + total_dataobjs: 0, + total_noncompliant: 0, + + + initialize: function(opts) { + if( opts.ids ) + this.ids = opts.ids; + if( opts.step ) + this.step = opts.step; + if( opts.prefix ) + this.prefix = opts.prefix; + if( opts.onFinish ) + this.onFinish = opts.onFinish; + if( opts.onProblems ) + this.onProblems = opts.onProblems; + if( opts.url ) + { + this.url = opts.url; + } + if( opts.parameters ) + this.parameters = opts.parameters; + if( opts.container_id ) + this.container = $( opts.container_id ); // should fail if container doesn't exist... + if( opts.hasOwnProperty('show_compliance') ) + { + this.show_compliance = opts.show_compliance; + } + if( opts.labels ) + { + this.labels = opts.labels; + } + }, + + // break down the requests into batches as defined by the step size + // don't move on to the next batch until we've handled the previous one + runBatch: function() { + + var dataobjs = {}; + + var i = this.batch * this.step; + + // arguments for Ajax query AND creates the HTML placeholders
's (that will receive the content of the Ajax query...) + var args = '&ajax='+this.prefix + + // build up our request for this step's results + for(var j = 0; j < this.step && i+j < this.ids.length; j++) + { + args += '&' + this.prefix + '=' + this.ids[i+j]; + var id = this.prefix + '_' + this.ids[i+j]; + var target_el = $( id ); + if( target_el != null ) + { + //store a record of this in seen_ids to ensure each placeholder has a unique id + if( !(id in this.seen_ids) ) + { + this.seen_ids[id] = 1; + } + else + { + this.seen_ids[id] = this.seen_ids[id] + 1; + } + id = id + "_" + this.seen_ids[id]; + } + + // set up an element for this result + this.container.insert( new Element( 'div', { 'class': 'ep_report_row', 'id': id, 'position': i+j } ), { 'position': 'after' } ); + } + + new Ajax.Request( this.url, { + method: 'get', + parameters: this.parameters + args, + onSuccess: (function(transport) { + + // we got our report data back from the plugin + var json = transport.responseText.evalJSON(); + var data = json.data; + if( data == null ) + { + data = new Array(); + } + + for( var n = 0; n < data.length; n++ ) + { + var entry = data[n]; + + // no entry - awkward + if( entry == null ) + { + continue; + } + + // no dataobj id - also awkward + var dataobjid = entry.dataobjid; + if( dataobjid == null ) + { + continue; + } + + // we have a dataobj, let's record it... + if( !(dataobjid in dataobjs) ) + { + this.count++; + dataobjs[dataobjid] = entry; + } + } + + //add the eprint summaries for this step + var added_ids = {}; + + //for( var c = this.batch * this.step; c < (this.batch * this.step) + this.step; c++ ) + for( var c = 0; c < this.step && i+c < this.ids.length; c++ ) + { + var dataobjid = this.ids[i+c]; + var entry = dataobjs[dataobjid]; + + //store that we have added this objectid + if( !(dataobjid in added_ids) ) + { + added_ids[dataobjid] = 0; + } + else + { + added_ids[dataobjid] = added_ids[dataobjid] + 1; + } + this.total_dataobjs++; + + var summary = entry.summary; + + var target_id = this.prefix + '_' + dataobjid; + if( added_ids[dataobjid] > 0 ) + { + target_id = target_id + '_' + added_ids[dataobjid]; + } + var target_el = $( target_id ); + + if( target_el != null && summary != null ) + { + var summary_el = target_el.appendChild( new Element( 'div', { 'class': 'ep_report_row_summary' } ) ); + summary_el.update( summary ); + + //total up non compliant records + if( entry.is_compliant == null && entry.problems && entry.problems.length ) + { + this.total_noncompliant++; + } + + //add support for compliant items to include bullet points too + if( entry.bullets && entry.bullets.length ) + { + var bullets_el = target_el.appendChild( new Element( 'ul', { 'class': 'ep_report_row_bullets' } ) ); + + for( var b = 0; b < entry.bullets.length; b++ ) + { + var li = bullets_el.appendChild( new Element( 'li' )); + li.update( entry.bullets[b] ); + } + } + + if( entry.problems && entry.problems.length ) + { + var problems_el = target_el.appendChild( new Element( 'ul', { 'class': 'ep_report_row_problems' } ) ); + + for( var p = 0; p < entry.problems.length; p++ ) + { + var li = problems_el.appendChild( new Element( 'li' )); + li.update( entry.problems[p] ); + } + } + + //display state + var re = new RegExp("^#(?:[0-9a-fA-F]{3}){1,2}$"); + if( entry.state && re.test(entry.state) ) + { + target_el.style.borderLeftWidth = '7px'; + target_el.style.borderLeftStyle = 'solid'; + target_el.style.borderLeftColor = entry.state; + } + else //no state provided, so derive one from existence of problems + { + if( entry.problems && entry.problems.length ) + { + target_el.addClassName( 'ep_report_row_problems' ); + } + else + { + target_el.addClassName( 'ep_report_row_ok' ); + } + + if( !this.show_compliance ) + { + target_el.addClassName( 'ep_report_row_no_compliance' ); + } + } + target_el.show(); + + var grouping = entry.grouping; + if( grouping != null ) + { + if( current_grouping == null || current_grouping != grouping) + { + current_grouping = grouping; + var grouping_container = new Element( 'div', { 'class': 'ep_report_grouping' } ); + target_el.insert( { 'before' : grouping_container } ); + grouping_container.update( current_grouping ); + } + } + } + } + + // we've retrieved all the records - this is the final step so tidy things up + if( this.count == this.no_items ) + { + $( this.prefix + '_progress_bar' ).remove(); + if( this.has_problems ) + { + this.onProblems(this); + } + this.onFinish(this); + + //add the group headings + if(this.grouped) + { + var position = 0; + for( var m = 0; m < this.grouped_ids.length; m++ ) + { + var target_el = document.querySelectorAll('[position="' + position + '"]')[0]; + position = position + this.grouped_ids[m].list.length; + var grouping_container = new Element( 'div', { 'class': 'ep_report_grouping' } ); + target_el.insert( { 'before' : grouping_container } ); + grouping_container.update( this.grouped_ids[m].label ); + } + } + + this.container.insertBefore( new Element( 'div', { 'class': 'ep_report_compliance_container', 'id': this.prefix + "_compliance_container" } ), this.container.firstChild ); + + //set up text container + $( this.prefix + "_compliance_container" ).appendChild( new Element( 'div', { 'class': 'ep_report_compliance_text', 'id': this.prefix + "_compliance_text", } )); + + //set up outputs label + var outputs; + if( this.labels ) + { + outputs = this.labels.outputs; + } + else + { + outputs = "output"; + if( this.total_dataobjs > 1 ) + { + outputs = outputs + "s"; + } + } + + if( this.show_compliance ) + { + var ref_width = 200; + var compliance = ( this.total_dataobjs - this.total_noncompliant ) / this.total_dataobjs; + + $( this.prefix + "_compliance_container" ).appendChild( new Element( 'div', { 'class': 'ep_report_compliance_wrapper', 'id': this.prefix + "_compliance", 'style': 'width: '+ref_width + 'px' } ) ); + + var compliance_width = Math.floor( 200 * compliance ); + + $( this.prefix + "_compliance" ).appendChild( new Element( 'div', { 'class': 'ep_report_compliance', 'style': 'width:'+compliance_width + 'px' } ) ); + + $( this.prefix + "_compliance_text" ).update( this.total_dataobjs + " " + outputs + " - " + Math.floor( compliance * 100 ) + "% compliance"); + } + else + { + $( this.prefix + "_compliance_text" ).update( this.total_dataobjs + " " + outputs ); + } + + + + } + else + { + // update progress bar + var width = 200; + $( this.prefix + '_progress_bar' ).style.backgroundPosition = Math.round(-width + width * this.count / this.ids.length) + "px 0px"; + + // and run another batch + this.batch++; + this.runBatch(); + } + + // nothing to show... + if( this.runs == 0 && this.count == 0 ) + { + var pNode = $( this.prefix + '_progress_bar' ).parentNode; + $(this.prefix + '_progress_bar').remove(); + var span = new Element( 'span', { 'class': 'ep_ref_report_empty' } ); + span.update( 'Report empty' ); + pNode.insert( span ); + } + this.runs++; + }).bind(this) + }); + }, + execute: function() { + // progress-bar + this.container.insert( new Element( 'div', { 'class': 'ep_report_progress_bar', 'id': this.prefix + "_progress_bar" } ) ); + + var current_grouping = null; // might not be set in the returned value but that's allowed/OK + this.no_items = this.ids.length; + this.retrieved = []; + if( !isInteger(this.ids[0]) ) //ids have been grouped + { + this.grouped = true; + this.grouped_ids = this.ids; + this.ids = []; + for( var i = 0; i < this.grouped_ids.length; i++ ) + { + this.ids = this.ids.concat(this.grouped_ids[i].list); + } + //the grouping may have created duplicate records (i.e. a record can appear in more than one group) - it's handy to have an array of all the unique records + this.unique = this.ids.filter(function(item, i, ar){ return ar.indexOf(item) === i; }); + this.no_items = this.unique.length; + } + + if( this.ids == null || this.ids.length == 0 ) + { + var pNode = $(this.prefix + '_progress_bar').parentNode; + $(this.prefix + '_progress_bar').hide(); + var span = new Element( 'span', { 'class': 'ep_ref_report_empty' } ); + span.update( 'Report empty' ); + pNode.insert( span ); + } + this.runBatch(); + } }); function group_report(group) { - document.group_report.group.value = group; - document.group_report.submit(); + document.group_report.group.value = group; + document.group_report.submit(); } function sort_report(sort) { - document.sort_report.sort.value = sort; - document.sort_report.submit(); + document.sort_report.sort.value = sort; + document.sort_report.submit(); } function isInteger(num) { diff --git a/reports.epm b/reports.epm index 8bad4d4..77460ae 100644 --- a/reports.epm +++ b/reports.epm @@ -195,9 +195,9 @@ cmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - 6699a48d6ff758192b7ab8ff05790b3f + eb6a305221d7fed1b0ed70ef86206367 MD5 - 10355 + 10782 PWhlYWQxIE5BTUUKCkVQcmludHM6OlBsdWdpbjo6RXhwb3J0OjpHcmlkMgoKPWN1dAoKcGFja2Fn ZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6R3JpZDI7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2Ug RVByaW50czo6UGx1Z2luOjpFeHBvcnQ7CgpASVNBID0gKCAiRVByaW50czo6UGx1Z2luOjpFeHBv @@ -263,123 +263,131 @@ aWVsZCBvZiBhbm90aGVyIGRhdGFzZXQsIGUuZy4gZG9jdW1lbnRzLmNvbnRlbnQKICAgICAgICAg ICAgICAgIHsKCQkJJGZpZWxkID0gJGRzLT5nZXRfZmllbGQoICRmbmFtZXNbMF0gKTsgI2ZpcnN0 IGdldCB0aGUgZmllbGQKCQkJaWYoICRmaWVsZC0+aXNfdHlwZSggInN1Ym9iamVjdCIsICJpdGVt cmVmIiApICkgI2lmIHRoZSBmaWVsZCBiZWxvbmdzIHRvIGFub3RoZXIgZGF0YXNldAogICAgICAg -ICAgICAgICAgICAgICAgICB7CgkJCQlteSAkc3ViX2RzX2lkID0gJGZpZWxkLT5nZXRfcHJvcGVy -dHkoICJkYXRhc2V0aWQiICk7CgkJCQlteSAkbXVsdGlwbGUgPSAkZmllbGQtPmdldF9wcm9wZXJ0 -eSggIm11bHRpcGxlIiApOwoJCQkJaWYoICRtdWx0aXBsZSApCgkJCQl7CgkJCQkJbXkgQHN1Yl9k -YXRhb2JqczsKCQkJCQkjZ2V0IHRoZSBkYXRhb2JqcyBvZiB0aGlzIGZpZWxkCgkJCQkJaWYoICRz -dWJfZHNfaWQgZXEgImRvY3VtZW50IiApICNkb2N1bWVudHMgcmVwcmVzZW50IGEgc3BlY2lhbCBj -YXNlIG9mIHN1YiBvYmplY3QgLSB3ZSBkb24ndCB3YW50IHZvbGF0aWxlIGRvY3VtZW50cyAocHJv -YmFibHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CQoJCQkJCQlA -c3ViX2RhdGFvYmpzID0gJGRhdGFvYmotPmdldF9hbGxfZG9jdW1lbnRzOwogICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ewoJCQkJCQlmb3JlYWNoIG15ICRzdWJfb2JqICggQHskZGF0YW9iai0+dmFsdWUoICRmbmFtZXNb -MF0gKX0gKQoJCQkJCQl7CgkJCQkJCQlwdXNoIEBzdWJfZGF0YW9ianMsICRmaWVsZC0+Z2V0X2l0 -ZW0oICRkYXRhb2JqLT5yZXBvc2l0b3J5LCAkc3ViX29iaiApOwoJCQkJCQl9CiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJCgkJCQkJI2FuZCBidWlsZCB1cCBh -biBhcnJheSBvZiB0aGVzZSBzdWIgZGF0YW9iaidzIHZhbHVlcwoJCQkJCWZvcmVhY2ggbXkgJG9i -aiAoIEBzdWJfZGF0YW9ianMgKSAjZ2V0IHRoZSB2YWx1ZXMgd2UgYXJlIHJlcXVlc3Rpbmcgb2Yg -dGhlIGRhdGFvYmplY3RzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7 -CgkJCQkJCSNjaGVjayBmb3IgYSBjdXN0b20gcmVuZGVyZXIKCQkJCQkJbXkgJHZhbHVlOwoJCQkJ -CQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRze2N1c3Rv -bV9leHBvcnR9LT57JGZuYW1lfSApCgkJCQkJCXsKCQkJCQkJCSR2YWx1ZSA9ICRvcHRze2N1c3Rv -bV9leHBvcnR9LT57JGZuYW1lfS0+KCAkb2JqLCAkb3B0c3twbHVnaW59ICk7CgkJCQkJCX0KCQkJ -CQkJZWxzZQoJCQkJCQl7CQkJCQkJCQoJCQkJCQkJJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZp -ZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJG9iai0+ZGF0YXNldCwgJGZuYW1lc1sxXSApOwkJCQkJ -CQkKCQkJCQkJCWlmKCAkZmllbGQtPmdldF9wcm9wZXJ0eSggInZpcnR1YWwiICkgKSAjdmlydHVh -bCBmaWVsZHMgbmVlZCByZW5kZXJpbmcKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSBFUHJpbnRz -OjpVdGlsczo6dHJlZV90b191dGY4KCAkb2JqLT5yZW5kZXJfdmFsdWUoICRmbmFtZXNbMV0gKSAp -OwoJCQkJCQkJfQoJCQkJCQkJZWxzZSAjcmVndWxhciBmaWVsZCB2YWx1ZXMgY2FuIHNpbXBseSBi -ZSByZXRyaWV2ZWQKCQkJCQkJCXsKCQkJCQkJCQkkdmFsdWUgPSAkZmllbGQtPmdldF92YWx1ZSgg -JG9iaiApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCXB1c2ggQHskc3ViX2RhdGFvYmpfdmFsdWVz -fSwgJHZhbHVlOyAKCQkJCQl9CgkJCQl9CgkJCQllbHNlICN3ZSBvbmx5IGhhdmUgb25lIHN1Yi1v -YmplY3QsIAoJCQkJewoJCQkJCW15ICRzdWJfb2JqID0gJGZpZWxkLT5nZXRfaXRlbSggJGRhdGFv -YmotPnJlcG9zaXRvcnksICRkYXRhb2JqLT52YWx1ZSggJGZuYW1lc1swXSApICk7ICNnZXQgdGhl -IHN1Ym9iamVjdAoJCQkJCSRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZp -Z19zdHJpbmcoICRzdWJfb2JqLT5kYXRhc2V0LCAkZm5hbWVzWzFdICk7ICNnZXQgdGhlIHN1Ym9i -amVjdHMgZmllbGQKCQkJCQlteSAkdmFsdWUgPSAkZmllbGQtPmdldF92YWx1ZSggJHN1Yl9vYmog -KTsgI2dldCB0aGUgc3Vib2JqZWN0cyB2YWx1ZSBmb3IgdGhpcyBmaWVsZAoJCQkJCXB1c2ggQHsk -c3ViX2RhdGFvYmpfdmFsdWVzfSwgJHZhbHVlOwkJCQkJCQoJCQkJfQoJCQl9CgkJfQoKCQlteSAk -aSA9IEB7JHJvd3NbMF19OwoJCW15ICRfcm93czsKCQlpZiggRVByaW50czo6VXRpbHM6OmlzX3Nl -dCggJGZpZWxkICkgKSAjd2UgYWxyZWFkeSBoYXZlIG91ciB2YWx1ZXMKCQl7CgkJCWlmKCBzY2Fs -YXIgQHskc3ViX2RhdGFvYmpfdmFsdWVzfSA+IDAgKQoJCQl7CgkJCQkkX3Jvd3MgPSAkc2VsZi0+ -dmFsdWVfdG9fcm93cygkZmllbGQsICRzdWJfZGF0YW9ial92YWx1ZXMsICRkYXRhb2JqKTsJCQkK -CQkJfQoJCQllbHNlICN0aGVyZSdzIG5vIHJlc3VsdHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGFk -ZCBhbiBlbXB0eSBjZWxsIHRvIHRoZSBzcHJlYWRzaGVldAoJCQl7CgkJCQkkX3Jvd3MgPSAkc2Vs -Zi0+dmFsdWVfdG9fcm93cygkZmllbGQsIHVuZGVmKTsKCQkJfQoJCX0KCQllbHNlICN3ZSBuZWVk -IHRvIHJldHJpZXZlIG91ciB2YWx1ZXMgZm9yIHRoaXMgZmllbGQgZnJvbSBvdXIgZGF0YW9iaiAo -b3Igc3ViX2RhdGFvYmopCgkJewoJCQlteSAkdmFsdWU7CgkJCWlmKCBkZWZpbmVkICRvcHRze2N1 -c3RvbV9leHBvcnR9ICYmIGRlZmluZWQgJG9wdHN7Y3VzdG9tX2V4cG9ydH0tPnskZm5hbWV9ICkg -I3dlIGhhdmUgYSBjdXN0b20gZXhwb3J0ZXIKCQkJewoJCQkJJHZhbHVlID0gJG9wdHN7Y3VzdG9t -X2V4cG9ydH0tPnskZm5hbWV9LT4oICRkYXRhb2JqLCAkb3B0c3twbHVnaW59ICk7CgkJCQkkX3Jv -d3MgPSAkc2VsZi0+Y3VzdG9tX3ZhbHVlX3RvX3Jvd3MoICR2YWx1ZSApOwoJCQl9CgkJCWVsc2Ug -I2p1c3QgZ2V0IHRoZSBmaWVsZCdzIHVzdWFsIHZhbHVlCgkJCXsKCQkJCSRmaWVsZCA9IEVQcmlu -dHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRkcywgJGZuYW1lICk7CgkJCQlp -ZiggJGZpZWxkLT5nZXRfcHJvcGVydHkoICJ2aXJ0dWFsIiApICkgI3ZpcnR1YWwgZmllbGRzIG5l -ZWQgcmVuZGVyaW5nCgkJCQl7CgkJCQkJJHZhbHVlID0gRVByaW50czo6VXRpbHM6OnRyZWVfdG9f -dXRmOCggJGRhdGFvYmotPnJlbmRlcl92YWx1ZSggJGZuYW1lICkgKTsKCQkJCX0KCQkJCWVsc2Ug -I3JlZ3VsYXIgZmllbGQgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmV0cmlldmVkCgkJCQl7CgkJCQkJ -JHZhbHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRkYXRhb2JqICk7CgkJCQl9CgkJCQkkX3Jvd3Mg -PSAkc2VsZi0+dmFsdWVfdG9fcm93cygkZmllbGQsICR2YWx1ZSwgJGRhdGFvYmopOyAJCQoJCQl9 -CQkJCgkJfQoKCQlmb3JlYWNoIG15ICRqICgwLi4kIyRfcm93cykKCQl7CgkJCWZvcmVhY2ggbXkg -JF9pICgwLi4kI3skX3Jvd3MtPlskal19KQoJCQl7CgkJCQkkcm93c1skal1bJGkrJF9pXSA9ICRf -cm93cy0+WyRqXVskX2ldOwoJCQl9CgkJfQoJfQoKCSMgZ2VuZXJhdGUgY29tcGxldGUgcm93cwoJ -aWYoJG9wdHN7cGx1Z2lufS0+cGFyYW0oICJtdWx0aWxpbmVfcmVwZWF0IiApKSAjd2Ugd2FudCBl -YWNoIGNvbHVtbiB0byByZXBlYXQgZm9yIGVhY2ggcm93Cgl7CgkJZm9yZWFjaCBteSAkaSAoMC4u -KHNjYWxhciBAcm93cyktMSkKCQl7CgkJCWZvcmVhY2ggbXkgJGogKDAuLiQjeyRyb3dzWzBdfSkK -CQkJewoJCQkJJHJvd3NbJGldWyRqXSB8fD0gJHJvd3NbMF1bJGpdOwoJCQl9CQoJCX0KCX0KCWVs -c2UgI3dlIGRvbid0IHdhbnQgcmVwZWF0aW5nIHZhbHVlcyBpbiB0aGUgY29sdW1ucwoJewkKCQlm -b3IoQHJvd3MpIHsKCQkJJF8tPlswXSA9ICRyb3dzWzBdWzBdOyAjZmlyc3QgZWxlbWVudCBvZiB0 -aGlzIGFycmF5IGVxdWFscyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgZmlyc3Qgcm93CgkJCSRf -LT5bJCN7JHJvd3NbMF19XSB8fD0gdW5kZWY7CgkJfQoKCX0KCglyZXR1cm4gXEByb3dzOwp9Cgpz -dWIgdmFsdWVfdG9fcm93cwp7CglteSAoJHNlbGYsICRmaWVsZCwgJHZhbHVlLCAkZGF0YW9iaikg -PSBAXzsKCglteSBAcm93czsKCglpZiAocmVmKCR2YWx1ZSkgZXEgIkFSUkFZIikKCXsKCQkkdmFs -dWUgPSBbJGZpZWxkLT5lbXB0eV92YWx1ZV0gaWYgIUAkdmFsdWU7CgkJQHJvd3MgPSBtYXAgeyAk -c2VsZi0+dmFsdWVfdG9fcm93cygkZmllbGQsICRfLCAkZGF0YW9iaiktPlswXSB9IEAkdmFsdWU7 -Cgl9CgllbHNpZiAoJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFGaWVsZDo6TXVsdGlwYXJ0Iikp -Cgl7CgkJaWYoICRmaWVsZC0+aXNhKCAiRVByaW50czo6TWV0YUZpZWxkOjpOYW1lIiApKSAjbmVl -ZCB0byBkZWFsIHdpdGggbGVnYWN5IHBocmFzZSBpZCdzCiAgICAgICAgICAgICAgICB7CgkJCW15 -IEBiaXRfdmFsdWVzOwoJCQlmb3JlYWNoIG15ICRiaXQgKCAkZmllbGQtPmdldF9pbnB1dF9iaXRz -KCkgKQogICAgICAgICAgICAgICAgICAgICAgICB7CgkJCQlwdXNoIEBiaXRfdmFsdWVzLCAkdmFs -dWUtPnskYml0fTsKICAgICAgICAJCX0JCgkJCXB1c2ggQHJvd3MsIFxAYml0X3ZhbHVlczsKCSAg -ICAgICAgfQoJCWVsc2UKCQl7CgkJCXB1c2ggQHJvd3MsIFttYXAgeyAkdmFsdWUtPnskXy0+e3N1 -Yl9uYW1lfX0gfSBAeyRmaWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfV07CgkJfQoJfQoJ -ZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OkNvbXBvdW5kIikpCgl7CgkJ -bXkgQHN1Yl92YWx1ZXM7CgkJZm9yZWFjaCBteSAka2V5IChrZXlzICV7JHZhbHVlfSkKCQl7CgkJ -CXB1c2ggQHN1Yl92YWx1ZXMsICR2YWx1ZS0+eyRrZXl9OwoJCX0KCQlwdXNoIEByb3dzLCBcQHN1 -Yl92YWx1ZXM7Cgl9CgllbHNpZiggJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFGaWVsZDo6U3Vi -amVjdCIpKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKCAkdmFsdWUgbmUgIiIgKQogICAg -ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEByb3dzLCBbRVByaW50 -czo6VXRpbHM6OnRyZWVfdG9fdXRmOCggJGZpZWxkLT5yZW5kZXJfc2luZ2xlX3ZhbHVlKCAkZmll -bGQtPnJlcG9zaXRvcnksICR2YWx1ZSApICldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAg -ICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNo -IEByb3dzLCBbJHZhbHVlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgllbHNpZiggISRm -aWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OlN1Ym9iamVjdCIpICYmICRmaWVsZC0+aXNf -dmlydHVhbCApCgl7CgkJI3B1c2ggQHJvd3MsIFskZGF0YW9iai0+cmVuZGVyX3ZhbHVlKCAkZmll -bGQtPm5hbWUgKV07CgkJcHVzaCBAcm93cywgWyR2YWx1ZV07Cgl9CgllbHNlCgl7CgkJcHVzaCBA -cm93cywgWyR2YWx1ZV07Cgl9CgoJcmV0dXJuIFxAcm93czsKfQoKI3VzZWQgZm9yIGN1c3RvbSBl -eHBvcnRzIHRoYXQgbWlnaHQgcmV0dXJuIGEgZmllbGQgb3IgYW4gYXJyYXkgKGJ1dCBhcmVuJ3Qg -bmVjZXNhcmlseSBhc3NvY2lhdGVkIHdpdGggYSBmaWVsZCEpCnN1YiBjdXN0b21fdmFsdWVfdG9f -cm93cwp7CiAgICAgICAgbXkgKCRzZWxmLCAkdmFsdWUpID0gQF87CgogICAgICAgIG15IEByb3dz -OwoKICAgICAgICBpZiAocmVmKCR2YWx1ZSkgZXEgIkFSUkFZIikKICAgICAgICB7CiAgICAgICAg -ICAgICAgICBAcm93cyA9IG1hcCB7ICRzZWxmLT5jdXN0b21fdmFsdWVfdG9fcm93cygkXyktPlsw -XSB9IEAkdmFsdWU7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAg -ICAgICBwdXNoIEByb3dzLCBbJHZhbHVlXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQHJv -d3M7Cn0KCgoxOwoKPWhlYWQxIENPUFlSSUdIVAoKPWZvciBDT1BZUklHSFQgQkVHSU4KCkNvcHly -aWdodCAyMDAwLTIwMTEgVW5pdmVyc2l0eSBvZiBTb3V0aGFtcHRvbi4KCj1mb3IgQ09QWVJJR0hU -IEVORAoKPWZvciBMSUNFTlNFIEJFR0lOCgpUaGlzIGZpbGUgaXMgcGFydCBvZiBFUHJpbnRzIEw8 -aHR0cDovL3d3dy5lcHJpbnRzLm9yZy8+LgoKRVByaW50cyBpcyBmcmVlIHNvZnR3YXJlOiB5b3Ug -Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CnVuZGVyIHRoZSB0ZXJtcyBvZiB0 -aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZApieSB0aGUg -RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNl -LCBvcgooYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKRVByaW50cyBpcyBkaXN0 -cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVApB -TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFO -VEFCSUxJVFkgb3IKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO -VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNo -b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp -YwpMaWNlbnNlIGFsb25nIHdpdGggRVByaW50cy4gIElmIG5vdCwgc2VlIEw8aHR0cDovL3d3dy5n -bnUub3JnL2xpY2Vuc2VzLz4uCgo9Zm9yIExJQ0VOU0UgRU5ECgo= +ICAgICB7CgkJCQlteSAkc3ViX2RzX2lkID0gJGZpZWxkLT5nZXRfcHJvcGVydHkoICJkYXRhc2V0 +aWQiICk7CgkJCQlteSAkbXVsdGlwbGUgPSAkZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRpcGxl +IiApOwoJCQkJaWYoICRtdWx0aXBsZSApCgkJCQl7CgkJCQkJbXkgQHN1Yl9kYXRhb2JqczsKCQkJ +CQkjZ2V0IHRoZSBkYXRhb2JqcyBvZiB0aGlzIGZpZWxkCgkJCQkJaWYoICRzdWJfZHNfaWQgZXEg +ImRvY3VtZW50IiApICNkb2N1bWVudHMgcmVwcmVzZW50IGEgc3BlY2lhbCBjYXNlIG9mIHN1YiBv +YmplY3QgLSB3ZSBkb24ndCB3YW50IHZvbGF0aWxlIGRvY3VtZW50cyAocHJvYmFibHkpCiAgICAg +ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBAc3ViX2RhdGFvYmpzID0g +JGRhdGFvYmotPmdldF9hbGxfZG9jdW1lbnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAg +ICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg +ICAgICAgICBmb3JlYWNoIG15ICRzdWJfb2JqICggQHskZGF0YW9iai0+dmFsdWUoICRmbmFtZXNb +MF0gKX0gKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBwdXNoIEBzdWJfZGF0YW9ianMsICRmaWVsZC0+Z2V0X2l0ZW0oICRkYXRhb2JqLT5yZXBv +c2l0b3J5LCAkc3ViX29iaiApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg +ICAgICAgICAgfQoJCQkJCQoJCQkJCSNhbmQgYnVpbGQgdXAgYW4gYXJyYXkgb2YgdGhlc2Ugc3Vi +IGRhdGFvYmoncyB2YWx1ZXMKCQkJCQlmb3JlYWNoIG15ICRvYmogKCBAc3ViX2RhdGFvYmpzICkg +I2dldCB0aGUgdmFsdWVzIHdlIGFyZSByZXF1ZXN0aW5nIG9mIHRoZSBkYXRhb2JqZWN0cwogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkjY2hlY2sgZm9yIGEg +Y3VzdG9tIHJlbmRlcmVyCgkJCQkJCW15ICR2YWx1ZTsKCQkJCQkJaWYoIGRlZmluZWQgJG9wdHN7 +Y3VzdG9tX2V4cG9ydH0gJiYgZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0g +KQoJCQkJCQl7CgkJCQkJCQkkdmFsdWUgPSAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0t +PiggJG9iaiwgJG9wdHN7cGx1Z2lufSApOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewkJCQkJ +CQkKCQkJCQkJCSRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJp +bmcoICRvYmotPmRhdGFzZXQsICRmbmFtZXNbMV0gKTsJCQkJCQkJCgkJCQkJCQlpZiggJGZpZWxk +LT5nZXRfcHJvcGVydHkoICJ2aXJ0dWFsIiApICkgI3ZpcnR1YWwgZmllbGRzIG5lZWQgcmVuZGVy +aW5nCgkJCQkJCQl7CgkJCQkJCQkJJHZhbHVlID0gRVByaW50czo6VXRpbHM6OnRyZWVfdG9fdXRm +OCggJG9iai0+cmVuZGVyX3ZhbHVlKCAkZm5hbWVzWzFdICkgKTsKCQkJCQkJCX0KCQkJCQkJCWVs +c2UgI3JlZ3VsYXIgZmllbGQgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmV0cmlldmVkCgkJCQkJCQl7 +CgkJCQkJCQkJJHZhbHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRvYmogKTsKCQkJCQkJCX0KCQkJ +CQkJfQoJCQkJCQlwdXNoIEB7JHN1Yl9kYXRhb2JqX3ZhbHVlc30sICR2YWx1ZTsgCgkJCQkJfQoJ +CQkJfQoJCQkJZWxzZSAjd2Ugb25seSBoYXZlIG9uZSBzdWItb2JqZWN0LCAKCQkJCXsKICAgICAg +ICAgICAgICAgICAgICBteSAkc3ViX29iajsKICAgICAgICAgICAgICAgICAgICBpZiggcmVmKCAk +ZmllbGQgKSBlcSAiRVByaW50czo6TWV0YUZpZWxkOjpTdWJvYmplY3QiICkKICAgICAgICAgICAg +ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdWJfb2JqID0gJGRhdGFvYmotPnZh +bHVlKCAkZm5hbWVzWzBdICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg +ICAgIGVsc2UgIyBkbyBpdCB0aGUgb3JpZ2luYWwgd2F5IChhc3N1bWluZyB0aGlzIGV2ZXIgd29y +a2VkLi4uPwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN1 +Yl9vYmogPSAkZmllbGQtPmdldF9pdGVtKCAkZGF0YW9iai0+cmVwb3NpdG9yeSwgJGRhdGFvYmot +PnZhbHVlKCAkZm5hbWVzWzBdICkgKTsgI2dldCB0aGUgc3Vib2JqZWN0CiAgICAgICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkZmllbGQg +PSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdfc3RyaW5nKCAkc3ViX29iai0+ZGF0 +YXNldCwgJGZuYW1lc1sxXSApOyAjZ2V0IHRoZSBzdWJvYmplY3RzIGZpZWxkCiAgICAgICAgICAg +ICAgICAgICAgbXkgJHZhbHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRzdWJfb2JqICk7ICNnZXQg +dGhlIHN1Ym9iamVjdHMgdmFsdWUgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICAgICAgICBw +dXNoIEB7JHN1Yl9kYXRhb2JqX3ZhbHVlc30sICR2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAg +ICAgICAgICAgfQogICAgICAgIH0KCgkJbXkgJGkgPSBAeyRyb3dzWzBdfTsKCQlteSAkX3Jvd3M7 +CgkJaWYoIEVQcmludHM6OlV0aWxzOjppc19zZXQoICRmaWVsZCApICkgI3dlIGFscmVhZHkgaGF2 +ZSBvdXIgdmFsdWVzCgkJewoJCQlpZiggc2NhbGFyIEB7JHN1Yl9kYXRhb2JqX3ZhbHVlc30gPiAw +ICkKCQkJewoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCAkc3ViX2Rh +dGFvYmpfdmFsdWVzLCAkZGF0YW9iaik7CQkJCgkJCX0KCQkJZWxzZSAjdGhlcmUncyBubyByZXN1 +bHRzLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBhZGQgYW4gZW1wdHkgY2VsbCB0byB0aGUgc3ByZWFk +c2hlZXQKCQkJewoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCB1bmRl +Zik7CgkJCX0KCQl9CgkJZWxzZSAjd2UgbmVlZCB0byByZXRyaWV2ZSBvdXIgdmFsdWVzIGZvciB0 +aGlzIGZpZWxkIGZyb20gb3VyIGRhdGFvYmogKG9yIHN1Yl9kYXRhb2JqKQoJCXsKCQkJbXkgJHZh +bHVlOwoJCQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRz +e2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfSApICN3ZSBoYXZlIGEgY3VzdG9tIGV4cG9ydGVyCgkJ +CXsKCQkJCSR2YWx1ZSA9ICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfS0+KCAkZGF0YW9i +aiwgJG9wdHN7cGx1Z2lufSApOwoJCQkJJF9yb3dzID0gJHNlbGYtPmN1c3RvbV92YWx1ZV90b19y +b3dzKCAkdmFsdWUgKTsKCQkJfQoJCQllbHNlICNqdXN0IGdldCB0aGUgZmllbGQncyB1c3VhbCB2 +YWx1ZQoJCQl7CgkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdf +c3RyaW5nKCAkZHMsICRmbmFtZSApOwoJCQkJaWYoICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAidmly +dHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJlbmRlcmluZwoJCQkJewoJCQkJCSR2YWx1 +ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRkYXRhb2JqLT5yZW5kZXJfdmFsdWUo +ICRmbmFtZSApICk7CgkJCQl9CgkJCQllbHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4gc2lt +cGx5IGJlIHJldHJpZXZlZAoJCQkJewoJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAk +ZGF0YW9iaiApOwoJCQkJfQoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxk +LCAkdmFsdWUsICRkYXRhb2JqKTsgCQkKCQkJfQkJCQoJCX0KCgkJZm9yZWFjaCBteSAkaiAoMC4u +JCMkX3Jvd3MpCgkJewoJCQlmb3JlYWNoIG15ICRfaSAoMC4uJCN7JF9yb3dzLT5bJGpdfSkKCQkJ +ewoJCQkJJHJvd3NbJGpdWyRpKyRfaV0gPSAkX3Jvd3MtPlskal1bJF9pXTsKCQkJfQoJCX0KCX0K +CgkjIGdlbmVyYXRlIGNvbXBsZXRlIHJvd3MKCWlmKCRvcHRze3BsdWdpbn0tPnBhcmFtKCAibXVs +dGlsaW5lX3JlcGVhdCIgKSkgI3dlIHdhbnQgZWFjaCBjb2x1bW4gdG8gcmVwZWF0IGZvciBlYWNo +IHJvdwoJewoJCWZvcmVhY2ggbXkgJGkgKDAuLihzY2FsYXIgQHJvd3MpLTEpCgkJewoJCQlmb3Jl +YWNoIG15ICRqICgwLi4kI3skcm93c1swXX0pCgkJCXsKCQkJCSRyb3dzWyRpXVskal0gfHw9ICRy +b3dzWzBdWyRqXTsKCQkJfQkKCQl9Cgl9CgllbHNlICN3ZSBkb24ndCB3YW50IHJlcGVhdGluZyB2 +YWx1ZXMgaW4gdGhlIGNvbHVtbnMKCXsJCgkJZm9yKEByb3dzKSB7CgkJCSRfLT5bMF0gPSAkcm93 +c1swXVswXTsgI2ZpcnN0IGVsZW1lbnQgb2YgdGhpcyBhcnJheSBlcXVhbHMgdGhlIGZpcnN0IGVs +ZW1lbnQgb2YgdGhlIGZpcnN0IHJvdwoJCQkkXy0+WyQjeyRyb3dzWzBdfV0gfHw9IHVuZGVmOwoJ +CX0KCgl9CgoJcmV0dXJuIFxAcm93czsKfQoKc3ViIHZhbHVlX3RvX3Jvd3MKewoJbXkgKCRzZWxm +LCAkZmllbGQsICR2YWx1ZSwgJGRhdGFvYmopID0gQF87CgoJbXkgQHJvd3M7CgoJaWYgKHJlZigk +dmFsdWUpIGVxICJBUlJBWSIpCgl7CgkJJHZhbHVlID0gWyRmaWVsZC0+ZW1wdHlfdmFsdWVdIGlm +ICFAJHZhbHVlOwoJCUByb3dzID0gbWFwIHsgJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCAk +XywgJGRhdGFvYmopLT5bMF0gfSBAJHZhbHVlOwoJfQoJZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJp +bnRzOjpNZXRhRmllbGQ6Ok11bHRpcGFydCIpKQoJewoJCWlmKCAkZmllbGQtPmlzYSggIkVQcmlu +dHM6Ok1ldGFGaWVsZDo6TmFtZSIgKSkgI25lZWQgdG8gZGVhbCB3aXRoIGxlZ2FjeSBwaHJhc2Ug +aWQncwogICAgICAgICAgICAgICAgewoJCQlteSBAYml0X3ZhbHVlczsKCQkJZm9yZWFjaCBteSAk +Yml0ICggJGZpZWxkLT5nZXRfaW5wdXRfYml0cygpICkKICAgICAgICAgICAgICAgICAgICAgICAg +ewoJCQkJcHVzaCBAYml0X3ZhbHVlcywgJHZhbHVlLT57JGJpdH07CiAgICAgICAgCQl9CQoJCQlw +dXNoIEByb3dzLCBcQGJpdF92YWx1ZXM7CgkgICAgICAgIH0KCQllbHNlCgkJewoJCQlwdXNoIEBy +b3dzLCBbbWFwIHsgJHZhbHVlLT57JF8tPntzdWJfbmFtZX19IH0gQHskZmllbGQtPnByb3BlcnR5 +KCJmaWVsZHNfY2FjaGUiKX1dOwoJCX0KCX0KCWVsc2lmICgkZmllbGQtPmlzYSgiRVByaW50czo6 +TWV0YUZpZWxkOjpDb21wb3VuZCIpKQoJewoJCW15IEBzdWJfdmFsdWVzOwoJCWZvcmVhY2ggbXkg +JGtleSAoa2V5cyAleyR2YWx1ZX0pCgkJewoJCQlwdXNoIEBzdWJfdmFsdWVzLCAkdmFsdWUtPnsk +a2V5fTsKCQl9CgkJcHVzaCBAcm93cywgXEBzdWJfdmFsdWVzOwoJfQoJZWxzaWYoICRmaWVsZC0+ +aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OlN1YmplY3QiKSkKICAgICAgICB7CiAgICAgICAgICAg +ICAgICBpZiggJHZhbHVlIG5lICIiICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg +ICAgICAgICAgcHVzaCBAcm93cywgW0VQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRmaWVs +ZC0+cmVuZGVyX3NpbmdsZV92YWx1ZSggJGZpZWxkLT5yZXBvc2l0b3J5LCAkdmFsdWUgKSApXTsK +ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsK +ICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAcm93cywgWyR2YWx1ZV07CiAgICAgICAgICAg +ICAgICB9CiAgICAgICAgfQoJZWxzaWYoICEkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxk +OjpTdWJvYmplY3QiKSAmJiAkZmllbGQtPmlzX3ZpcnR1YWwgKQoJewoJCSNwdXNoIEByb3dzLCBb +JGRhdGFvYmotPnJlbmRlcl92YWx1ZSggJGZpZWxkLT5uYW1lICldOwoJCXB1c2ggQHJvd3MsIFsk +dmFsdWVdOwoJfQoJZWxzZQoJewoJCXB1c2ggQHJvd3MsIFskdmFsdWVdOwoJfQoKCXJldHVybiBc +QHJvd3M7Cn0KCiN1c2VkIGZvciBjdXN0b20gZXhwb3J0cyB0aGF0IG1pZ2h0IHJldHVybiBhIGZp +ZWxkIG9yIGFuIGFycmF5IChidXQgYXJlbid0IG5lY2VzYXJpbHkgYXNzb2NpYXRlZCB3aXRoIGEg +ZmllbGQhKQpzdWIgY3VzdG9tX3ZhbHVlX3RvX3Jvd3MKewogICAgICAgIG15ICgkc2VsZiwgJHZh +bHVlKSA9IEBfOwoKICAgICAgICBteSBAcm93czsKCiAgICAgICAgaWYgKHJlZigkdmFsdWUpIGVx +ICJBUlJBWSIpCiAgICAgICAgewogICAgICAgICAgICAgICAgQHJvd3MgPSBtYXAgeyAkc2VsZi0+ +Y3VzdG9tX3ZhbHVlX3RvX3Jvd3MoJF8pLT5bMF0gfSBAJHZhbHVlOwogICAgICAgIH0KICAgICAg +ICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAcm93cywgWyR2YWx1ZV07CiAg +ICAgICAgfQoKICAgICAgICByZXR1cm4gXEByb3dzOwp9CgoKMTsKCj1oZWFkMSBDT1BZUklHSFQK +Cj1mb3IgQ09QWVJJR0hUIEJFR0lOCgpDb3B5cmlnaHQgMjAwMC0yMDExIFVuaXZlcnNpdHkgb2Yg +U291dGhhbXB0b24uCgo9Zm9yIENPUFlSSUdIVCBFTkQKCj1mb3IgTElDRU5TRSBCRUdJTgoKVGhp +cyBmaWxlIGlzIHBhcnQgb2YgRVByaW50cyBMPGh0dHA6Ly93d3cuZXByaW50cy5vcmcvPi4KCkVQ +cmludHMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v +ZGlmeSBpdAp1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg +TGljZW5zZSBhcyBwdWJsaXNoZWQKYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0 +aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0 +ZXIgdmVyc2lvbi4KCkVQcmludHMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 +aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl +IGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCkZJVE5FU1MgRk9SIEEgUEFS +VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vu +c2UgZm9yIG1vcmUgZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg +dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhbG9uZyB3aXRoIEVQcmludHMu +ICBJZiBub3QsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgoKPWZvciBMSUNF +TlNFIEVORAoK @@ -791,9 +799,9 @@ XCIkdmFsdWVcIiI7Cgl9CgoJcmV0dXJuICR2YWx1ZTsKfQoKCjE7Cg== document plugins/EPrints/Plugin/Screen/Report.pm text/plain - 76ae03abfa9314aa25371d44e8486945 + a76848e873791f84698b90d0ed1cb3ea MD5 - 45432 + 45726 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OlNjcmVlbjo6UmVwb3J0OwoKIyBBYnN0cmFjdCBjbGFz cyB0aGF0IGhhbmRsZXMgdGhlIFJlcG9ydCB0b29scwoKdXNlIEpTT04gcXcoZW5jb2RlX2pzb24p Owp1c2UgRVByaW50czo6UGx1Z2luOjpTY3JlZW47CkBJU0EgPSAoICdFUHJpbnRzOjpQbHVnaW46 @@ -1054,7 +1062,7 @@ OwoKCSRmb3JtLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9jb250cm9scyggMSApICk7CgoJ I2FkZCBlYWNoIHJlcG9ydCB0byB0aGUgc2VsZWN0IGNvbXBvbmVudCBhbmQgZ2VuZXJhdGUgc2Vh cmNoIGZvcm0gaWYgcmVxdWlyZWQKCW15ICRyZXBvcnRfc2VsZWN0ID0gJHJlcG8tPm1ha2VfZWxl bWVudCggInNlbGVjdCIsIG5hbWU9PiJyZXBvcnQiLCBpZD0+InNlbGVjdF9yZXBvcnQiLCAnYXJp -YS1sYWJlbGxlZGJ5JyA9PiAicmVwb3J0X3NlbGVjdF9sYWJlbCIgKTsKCW15ICVzZWFyY2hfZm9y +YS1sYWJlbGxlZGJ5JyA9PiAicmVwb3J0X3NlbGVjdF9sYWJlbCIgKTsKCW15IEBzZWFyY2hfZm9y bXM7CglteSAkY3VzdG9tX3JlcG9ydHMgPSAwOwoJI2ZvcmVhY2ggbXkgJHJlcG9ydF9wbHVnaW4g KCBAcGx1Z2lucyApCglmb3JlYWNoIG15ICRyZXBvcnRfcGx1Z2luICggc29ydCB7ICRhLT5nZXRf c3VidHlwZSBjbXAgJGItPmdldF9zdWJ0eXBlIH0gQHBsdWdpbnMgKQoJewoJCWlmKCAkcmVwb3J0 @@ -1072,526 +1080,531 @@ JHJlZmluZV9zY29uZiBlcSAkZm9ybWlkICkKCQkJewoJCQkJJG9wdGlvbi0+c2V0QXR0cmlidXRl KCBzZWxlY3RlZCA9PiAic2VsZWN0ZWQiICk7CgkJCX0KCgkJCSNzZXQgb3B0aW9uIHRleHQgYW5k IGFkZCB0byBzZWxlY3QKICAJCQkkb3B0aW9uLT5hcHBlbmRDaGlsZCggJHJlcG9ydF9wbHVnaW4t PnJlbmRlcl90aXRsZSApOwoJCQkkcmVwb3J0X3NlbGVjdC0+YXBwZW5kQ2hpbGQoICRvcHRpb24g -KTsKCgkJCSNjcmVhdGUgc2VhcmNoIGZvcm0JCQkKCQkJI2dldCByZXBvcnQgZGF0YXNldCBhbmQg -YXBwcm9wcmlhdGUgc2VhcmNoIGNvbmZpZwogICAgICAgICAgICBteSAkc2VhcmNoZGF0YXNldGlk -ID0gJHJlcG9ydF9wbHVnaW4tPntzZWFyY2hkYXRhc2V0aWR9OwogICAgICAgICAgICBpZiggZGVm -aW5lZCAkcmVwb3J0X3BsdWdpbi0+cGFyYW0oInNlYXJjaGRhdGFzZXRpZCIpICkKICAgICAgICAg -ICAgewogICAgICAgICAgICAgICAgJHNlYXJjaGRhdGFzZXRpZCA9ICRyZXBvcnRfcGx1Z2luLT5w -YXJhbSgic2VhcmNoZGF0YXNldGlkIik7CiAgICAgICAgICAgIH0gICAgCgkJCW15ICRyZXBvcnRf -ZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlYXJjaGRhdGFzZXRpZCApOwoJCQlteSAkc2NvbmYgPSAk -cmVwb3J0X2RzLT5zZWFyY2hfY29uZmlnKCAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfSApIDsKCQkJ -I215ICRzZWFyY2ggPSBFUHJpbnRzOjpTZWFyY2gtPm5ldygKCQkgICAgICAgICMgICAgICAgIGtl -ZXBfY2FjaGUgPT4gMSwKCSAgICAgICAgICAgICAgICAjCXNlc3Npb24gPT4gJHJlcG8sCgkJICAg -ICAgICAjICAgICAgICBkYXRhc2V0ID0+ICRyZXBvcnRfZHMsCgkJICAgICAgICAjICAgICAgICAl -eyRzY29uZn0KCQkJIyk7CgoJCQlteSAkZm9ybWF0ID0gInJlcG9ydC8iIC4gJHJlcG9ydF9kcy0+ -YmFzZV9pZDsKCSAgICAgICAgICAgICAgICBteSAkc2VhcmNoZXhwID0gJHJlcG8tPnBsdWdpbigg -IlNlYXJjaCIgKS0+cGx1Z2lucygKICAgICAgICAgICAgICAgICAgICAgICAgCXsKICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAJa2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICBzZXNzaW9uID0+ICRzZWxmLT57c2Vzc2lvbn0sCiAgICAgICAgCSAg -ICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQgPT4gJHJlcG9ydF9kcywKICAgICAgICAgICAg -ICAgIAkgICAgICAgICAgICAgICAgJXskc2NvbmZ9CiAgICAgICAgICAgICAgICAgICAgICAgIAl9 -LAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICJTZWFyY2giLAogICAgICAgICAgICAg -ICAgICAgICAgICBjYW5fc2VhcmNoID0+ICRmb3JtYXQsCiAgICAgICAgICAgICAgICAJKTsJCgkJ -CSRzZWFyY2hleHAtPmZyb21fZm9ybTsKCgkJCSNnZW5lcmF0ZSB0aGUgZm9ybQoJCQlteSAkZnJh -ZyA9ICRzZWxmLT5yZW5kZXJfc2VhcmNoX2ZpZWxkcyggJHNlYXJjaGV4cCwgJGZvcm1pZCApOwoJ -CQkkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9ID0gJGZyYWcgdW5sZXNzIGV4aXN0cyAkc2VhcmNoX2Zv -cm1zeyRmb3JtaWR9OwoJCX0JCgl9CgogICAgIyBsYWJlbCBmb3IgZm9ybSBzZWxlY3QgZHJvcCBk -b3duCiAgICBteSAkcmVwb3J0X2xhYmVsID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImxhYmVsIiwg -aWQ9PiJyZXBvcnRfc2VsZWN0X2xhYmVsIiApOwogICAgJHJlcG9ydF9sYWJlbC0+YXBwZW5kQ2hp -bGQoICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydF9zZWxlY3RfbGFiZWwiICkgKTsKICAgICRm -b3JtLT5hcHBlbmRDaGlsZCggJHJlcG9ydF9sYWJlbCApOwoKCSRmb3JtLT5hcHBlbmRDaGlsZCgg -JHJlcG9ydF9zZWxlY3QgKTsKCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRk -ZW5fZmllbGQoICJzY3JlZW4iLCAkc2VsZi0+e3NjcmVlbmlkfSApICk7CgoJI3JlbmRlciBwb3Nz -aWJsZSBzZWFyY2ggZm9ybXMKCWZvcmVhY2ggbXkgJGZvcm1pZCAoa2V5cyAlc2VhcmNoX2Zvcm1z -KQoJewoJCW15ICR0YWJsZSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiLCBjbGFzcz0+ImVw -X3RhYmxlIGVwX3NlYXJjaF9maWVsZHMiLCBpZD0+JGZvcm1pZCwgc3R5bGU9PiJkaXNwbGF5OiBu -b25lIiApOwoJICAgICAgICAkZm9ybS0+YXBwZW5kQ2hpbGQoICR0YWJsZSApOwoJICAgICAgICAk -dGFibGUtPmFwcGVuZENoaWxkKCAkc2VhcmNoX2Zvcm1zeyRmb3JtaWR9ICk7Cgl9CgoJJGZvcm0t -PmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2NvbnRyb2xzICk7CgkkY3VzdG9tLT5hcHBlbmRD -aGlsZCggJGZvcm0gKTsKCgkjamF2YXNjcmlwdCBmb3IgY2hhbmdpbmcgZm9ybXMgYmFzZWQgb24g -cmVwb3J0IHNlbGVjdGlvbgoJJGN1c3RvbS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2phdmFz -Y3JpcHQoICdpbml0UmVwb3J0Rm9ybSgpOycgKSApOwoKCWlmKCAkY3VzdG9tX3JlcG9ydHMgJiYg -JHByZXNldHNfYWRkZWQgPiAwICkgI3NldCB1cCB0YWIgaW50ZXJmYWNlCgl7CgkJbXkgQGxhYmVs -czsKCSAgICAgICAgbXkgQHBhbmVsczsKCgkJcHVzaCBAbGFiZWxzLCAkcmVwby0+aHRtbF9waHJh -c2UoICJyZXBvcnRzX3ByZXNldCIgKTsKCQlwdXNoIEBsYWJlbHMsICRyZXBvLT5odG1sX3BocmFz -ZSggInJlcG9ydHNfY3VzdG9tIiApOwoKCQlwdXNoIEBwYW5lbHMsICRwcmVzZXQ7CgkJcHVzaCBA -cGFuZWxzLCAkY3VzdG9tOwoKCQlteSAlb3B0czsKCQlpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57 -YWN0aW9ufSBlcSAibmV3c2VhcmNoIiB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVx -ICJ1cGRhdGUiICApCgkJewoJCQkkb3B0c3tjdXJyZW50fSA9IDE7CgkJfQoKCQlyZXR1cm4gJHJl -cG8tPnhodG1sLT50YWJzKFxAbGFiZWxzLCBcQHBhbmVscywgJW9wdHMgKTsKCX0KCWVsc2lmKCAk -cHJlc2V0c19hZGRlZCA+IDAgKQoJewkKCQlyZXR1cm4gJHByZXNldDsKCX0KCWVsc2UKCXsKCQly -ZXR1cm4gJGN1c3RvbTsKCX0KfQoKc3ViIHJlbmRlcl9zZWFyY2hfZmllbGRzCnsKICAgIG15KCAk -c2VsZiwgJHNlYXJjaCwgJGZvcm1pZCApID0gQF87CgoJbXkgJGV4cCA9ICRzZWxmLT57c2Vzc2lv -bn0tPnBhcmFtKCAiZXhwIiApOwoJbXkgJHNjb25mID0gJHNlbGYtPntzZXNzaW9ufS0+cGFyYW0o -ICJzY29uZiIgKTsKICAgIGlmKCBkZWZpbmVkICRleHAgJiYgZGVmaW5lZCAkc2NvbmYgJiYgJHNj -b25mIGVxICRmb3JtaWQgKQoJewogICAgICAgICRzZWFyY2gtPmZyb21fc3RyaW5nKCAkZXhwICk7 -CiAgCX0KCiAgICBteSAkZnJhZyA9ICRzZWxmLT57c2Vzc2lvbn0tPm1ha2VfZG9jX2ZyYWdtZW50 -OwogICAgZm9yZWFjaCBteSAkc2YgKCAkc2VhcmNoLT5nZXRfbm9uX2ZpbHRlcl9zZWFyY2hmaWVs -ZHMgKQogICAgewogICAgICAgIG15ICRsYWJlbDsKICAgICAgICBteSAkZmllbGQ7CiAgICAgICAg -aWYgKCAkc2YtPnsiZmllbGQifS0+Z2V0X3R5cGUoKSBlcSAibmFtZWRzZXQiICkKICAgICAgICB7 -CiAgICAgICAgICAgICMgd2Ugd2FudCBhIGxlZ2VuZCBhbmQgYSBsYWJlbAogICAgICAgICAgICAk -bGFiZWwgPSAkc2VsZi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoICJzcGFuIiwgaWQ9PiRzZi0+ -Z2V0X2Zvcm1fcHJlZml4LiJfbGFiZWwiICk7CiAgICAgICAgICAgICRsYWJlbC0+YXBwZW5kQ2hp -bGQoICRzZi0+cmVuZGVyX25hbWUgKTsKCiAgICAgICAgICAgIG15ICRsZWdlbmQgPSBFUHJpbnRz -OjpVdGlsczo6dHJlZV90b191dGY4KCAkc2YtPnJlbmRlcl9uYW1lICk7CiAgICAgICAgICAgICRm -aWVsZCA9ICRzZi0+cmVuZGVyKCBsZWdlbmQgPT4gJGxlZ2VuZCApOwogICAgICAgIH0KICAgICAg -ICBlbHNlIHsKICAgICAgICAgICAgJGxhYmVsID0gJHNlbGYtPntzZXNzaW9ufS0+bWFrZV9lbGVt -ZW50KCAic3BhbiIsIGlkPT4kc2YtPmdldF9mb3JtX3ByZWZpeC4iX2xhYmVsIiApOwogICAgICAg -ICAgICAkbGFiZWwtPmFwcGVuZENoaWxkKCAkc2YtPnJlbmRlcl9uYW1lICk7CiAgICAgICAgICAg -ICRmaWVsZCA9ICRzZi0+cmVuZGVyKCk7CiAgICAgICAgfQoKCSAgICAkZnJhZy0+YXBwZW5kQ2hp -bGQoCiAgICAgICAgICAgICRzZWxmLT57c2Vzc2lvbn0tPnJlbmRlcl9yb3dfd2l0aF9oZWxwKAog -ICAgICAgICAgICAgICAgaGVscF9wcmVmaXggPT4gJHNmLT5nZXRfZm9ybV9wcmVmaXguIl9oZWxw -IiwKICAgICAgICAgICAgICAgIGhlbHAgPT4gJHNmLT5yZW5kZXJfaGVscCwKICAgICAgICAgICAg -ICAgIGxhYmVsID0+ICRsYWJlbCwKICAgICAgICAgICAgICAgIGZpZWxkID0+ICRmaWVsZCwKICAg -ICAgICAgICAgICAgIG5vX3RvZ2dsZSA9PiAoICRzZi0+e3Nob3dfaGVscH0gZXEgImFsd2F5cyIg -KSwKICAgICAgICAgICAgICAgIG5vX2hlbHAgPT4gKCAkc2YtPntzaG93X2hlbHB9IGVxICJuZXZl -ciIgKSwKICAgICAgICApICk7CiAgICB9CgogICAgcmV0dXJuICRmcmFnOwp9CgpzdWIgcmVuZGVy -X2NvbnRyb2xzCnsKCW15KCAkc2VsZiwgJHdpdGhfanMgKSA9IEBfOwoKICAgIG15ICRkaXYgPSAk -c2VsZi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoCiAgICAgICAgImRpdiIgLAogICAgICAgIGNs -YXNzID0+ICJlcF9zZWFyY2hfYnV0dG9ucyIgKTsKICAgICAgICAKICAgICRkaXYtPmFwcGVuZENo -aWxkKCAkc2VsZi0+e3Nlc3Npb259LT5yZW5kZXJfYWN0aW9uX2J1dHRvbnMoCiAgICAgICAgX29y -ZGVyID0+IFsgInNlYXJjaCIgXSwKICAgICAgICAjbmV3c2VhcmNoID0+ICRzZWxmLT57c2Vzc2lv -bn0tPnBocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9uOmFjdGlvbl9yZXNldCIgKSwKICAgICAg -ICBzZWFyY2ggPT4gJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Np -b246YWN0aW9uX3NlYXJjaCIgKSApCiAgICApOwoJCglteSAkeG1sID0gJHNlbGYtPntzZXNzaW9u -fS0+eG1sOwoKCWlmKCAkd2l0aF9qcyApCgl7CgkJbXkgJGNsZWFyX2Zvcm0gPSAkZGl2LT5hcHBl -bmRDaGlsZCggJHNlbGYtPnJlbmRlcl9jbGVhcmZvcm0oICR4bWwgKSApOwoJfQoKICAgIG15ICRj -bGVhcl9idG4gPSAkZGl2LT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlX2VsZW1lbnQoICJidXR0 -b24iLAogICAgICAgIHR5cGUgPT4gImJ1dHRvbiIsCiAgICAgICAgb25jbGljayA9PiAiY2xlYXJG -b3JtKCk7IiwKICAgICAgICBjbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIGNsZWFyX2J1 -dHRvbiIsCiAgICApICk7CiAgICAkY2xlYXJfYnRuLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRl -X3RleHRfbm9kZSggJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Np -b246YWN0aW9uX3Jlc2V0IiApICkgKTsKCXJldHVybiAkZGl2Owp9CgpzdWIgcmVuZGVyCnsKCW15 -KCAkc2VsZiApID0gQF87CgoJIyBpZiB1c2VycyBhY2Nlc3MgU2NyZWVuOjpSZXBvcnQgZGlyZWN0 -bHkgd2Ugd2FudCB0byBkaXNwbGF5IHNvbWUgc29ydCBvZiBtZW51CgkjIHdoZXJlIHVzZXJzIGNh -biBzZWxlY3Qgdmlld2FibGUgcmVwb3J0cwoJaWYoICggIkVQcmludHM6OlBsdWdpbjo6Ii4kc2Vs -Zi0+Z2V0X2lkIGVxIF9fUEFDS0FHRV9fICYmICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0g -bmUgInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJuZXdzZWFy -Y2giICkKCXsJCgkJcmV0dXJuICRzZWxmLT5yZW5kZXJfc3BsYXNoX3BhZ2U7Cgl9CgoJbXkgJHJl -cG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJh -Z21lbnQ7CgoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9leHBvcnRfYmFyICk7 -CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2dyb3VwX29wdGlvbnMgKTsKCSRj -aHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfc29ydF9vcHRpb25zICk7CgoJaWYoICRz -ZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRjaHVuay0+YXBw -ZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwoJfQoKCW15ICRpdGVtcyA9 -ICRzZWxmLT5pdGVtczsKCWlmKCAhZGVmaW5lZCAkaXRlbXMgfHwgJGl0ZW1zLT5jb3VudCA9PSAw -ICkKCXsKCQkjIE5vIGl0ZW1zIG1lc3NhZ2UKCX0KCglteSAkanNvbjsKCglpZiggZGVmaW5lZCAk -c2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9 -IG5lICIiICkKCXsKCQlteSAkZ3JvdXBlZCA9ICRzZWxmLT5nZXRfZ3JvdXBlZF9pdGVtcyggJGl0 -ZW1zLCAxICk7CgkJJGpzb24gPSBlbmNvZGVfanNvbiAkZ3JvdXBlZDsKCX0KCWVsc2UKCXsKCQlt -eSAkaXRlbV9pZHMgPSBkZWZpbmVkICRpdGVtcyA/ICRpdGVtcy0+aWRzIDogW107CgkJJGpzb24g -PSAiWyIuam9pbignLCcsQCRpdGVtX2lkcykuIl0iOwoJfQoKICAgICAgICBteSAkdXJsID0gJHJl -cG8tPmN1cnJlbnRfdXJsKCBob3N0ID0+IDEgKTsKICAgICAgICBteSAkcGFyYW1ldGVycyA9IFVS -SS0+bmV3OwogICAgICAgICRwYXJhbWV0ZXJzLT5xdWVyeV9mb3JtKAogICAgICAgICAgICAgICAg -JHNlbGYtPmhpZGRlbl9iaXRzLAogICAgICAgICk7CiAgICAgICAgJHBhcmFtZXRlcnMgPSAkcGFy -YW1ldGVycy0+cXVlcnk7CgkJCglteSAkZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlbGYtPnBhcmFt -KCAnZGF0YXNldGlkJyApICkgaWYgZGVmaW5lZCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICk7 -CglteSAkcHJlZml4ID0gJGRzLT5iYXNlX2lkIGlmIGRlZmluZWQgJGRzOwoKCSMgdGhlIG1haW4g -PGRpdj4KCW15ICRjb250YWluZXJfaWQgPSBzcHJpbnRmKCAiZXBfcmVwb3J0XyVzXF9jb250YWlu -ZXIiLCAkc2VsZi0+Z2V0X3JlcG9ydCApOwoKCSN1cGRhdGUgamF2YXNjcmlwdCBwYXJhbWV0ZXJz -IGlmIGNvbWluZyBmcm9tIGEgc2VhcmNoIHJlcXVlc3QKCWlmKCAkc2VsZi0+e3Byb2Nlc3Nvcn0t -PnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQlteSAkcGx1Z2luID0gJHNlbGYtPntwcm9jZXNz -b3J9LT57cmVwb3J0fTsKCQkkcGx1Z2luID1+IHMvOi8lM0EvZzsKCQkkcGFyYW1ldGVycyA9ICJz -Y3JlZW49JHBsdWdpbiI7CgkJJHByZWZpeCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2RhdGFzZXRp -ZH07CgkJJGNvbnRhaW5lcl9pZCA9IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIs -ICRzZWxmLT57cHJvY2Vzc29yfS0+e3JlcG9ydF9wbHVnaW59LT57cmVwb3J0fSApOwoJfQoJCgkj -c2hvdy9oaWRlIGNvbXBsaWFuY2UKCW15ICRzaG93X2NvbXBsaWFuY2UgPSAxOwoJJHNob3dfY29t -cGxpYW5jZSA9ICRzZWxmLT57c2hvd19jb21wbGlhbmNlfSBpZiBkZWZpbmVkICRzZWxmLT57c2hv -d19jb21wbGlhbmNlfTsKCgkjY3VzdG9tIGxhYmVscwoJbXkgJGxhYmVscyA9IDA7CgkkbGFiZWxz -ID0gZW5jb2RlX2pzb24gJHNlbGYtPntsYWJlbHN9IGlmIGRlZmluZWQgJHNlbGYtPntsYWJlbHN9 -OwoKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2phdmFzY3JpcHQoIDw8IkVPSiIg -KSApOwpkb2N1bWVudC5vYnNlcnZlKCJkb206bG9hZGVkIiwgZnVuY3Rpb24oKSB7CgluZXcgRVBy -aW50c19TY3JlZW5fUmVwb3J0X0xvYWRlciggewoJCWlkczogJGpzb24sCgkJc3RlcDogMjAsCgkJ -cHJlZml4OiAnJHByZWZpeCcsCgkJdXJsOiAnJHVybCcsCgkJcGFyYW1ldGVyczogJyRwYXJhbWV0 -ZXJzJywJCQoJCWNvbnRhaW5lcl9pZDogJyRjb250YWluZXJfaWQnLAoJCXNob3dfY29tcGxpYW5j -ZTogJHNob3dfY29tcGxpYW5jZSwKCQlsYWJlbHM6ICRsYWJlbHMKCX0gKS5leGVjdXRlKCk7Cgp9 -KTsKRU9KCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+bWFrZV9lbGVtZW50KCAnZGl2Jywg -Y2xhc3MgPT4gJ2VwX3JlcG9ydF9wYWdlJywgaWQgPT4gJGNvbnRhaW5lcl9pZCApICk7CgoJI3No -b3cgc2VhcmNoIGNvbnRyb2xzIGFmdGVyIHRoZSByZXN1bHRzIHRvbwoJaWYoICRzZWxmLT57cHJv -Y2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQogICAgICAgIHsKICAgICAgICAgICAgICAg -ICRjaHVuay0+YXBwZW5kQ2hpbGQoICRzZWxmLT5yZW5kZXJfcmVmaW5lX3NlYXJjaCApOwogICAg -ICAgIH0KCglyZXR1cm4gJGNodW5rOwp9CgoKc3ViIHJlbmRlcl9leHBvcnRfYmFyCnsKCW15KCAk +KTsKCiAgICAgICAgICAgICMgbm93IHdlJ3ZlIGFkZGVkIHRvIHRoZSBzZWxlY3QsIGRvIHdlIG5l +ZWQgdG8gcmVuZGVyIGEgc2VhcmNoIGZvcm0KICAgICAgICAgICAgbmV4dCBpZiAoZ3JlcCB7ICRm +b3JtaWQgZXEgJF8gfSBAc2VhcmNoX2Zvcm1zICk7ICAgICAKCgkJCSNjcmVhdGUgc2VhcmNoIGZv +cm0JCQkKCQkJI2dldCByZXBvcnQgZGF0YXNldCBhbmQgYXBwcm9wcmlhdGUgc2VhcmNoIGNvbmZp +ZwogICAgICAgICAgICBteSAkc2VhcmNoZGF0YXNldGlkID0gJHJlcG9ydF9wbHVnaW4tPntzZWFy +Y2hkYXRhc2V0aWR9OwogICAgICAgICAgICBpZiggZGVmaW5lZCAkcmVwb3J0X3BsdWdpbi0+cGFy +YW0oInNlYXJjaGRhdGFzZXRpZCIpICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJHNl +YXJjaGRhdGFzZXRpZCA9ICRyZXBvcnRfcGx1Z2luLT5wYXJhbSgic2VhcmNoZGF0YXNldGlkIik7 +CiAgICAgICAgICAgIH0gICAgCgkJCW15ICRyZXBvcnRfZHMgPSAkcmVwby0+ZGF0YXNldCggJHNl +YXJjaGRhdGFzZXRpZCApOwoJCQlteSAkc2NvbmYgPSAkcmVwb3J0X2RzLT5zZWFyY2hfY29uZmln +KCAkcmVwb3J0X3BsdWdpbi0+e3Njb25mfSApIDsKCQkJI215ICRzZWFyY2ggPSBFUHJpbnRzOjpT +ZWFyY2gtPm5ldygKCQkgICAgICAgICMgICAgICAgIGtlZXBfY2FjaGUgPT4gMSwKCSAgICAgICAg +ICAgICAgICAjCXNlc3Npb24gPT4gJHJlcG8sCgkJICAgICAgICAjICAgICAgICBkYXRhc2V0ID0+ +ICRyZXBvcnRfZHMsCgkJICAgICAgICAjICAgICAgICAleyRzY29uZn0KCQkJIyk7CgoJCQlteSAk +Zm9ybWF0ID0gInJlcG9ydC8iIC4gJHJlcG9ydF9kcy0+YmFzZV9pZDsKCSAgICAgICAgICAgICAg +ICBteSAkc2VhcmNoZXhwID0gJHJlcG8tPnBsdWdpbiggIlNlYXJjaCIgKS0+cGx1Z2lucygKICAg +ICAgICAgICAgICAgICAgICAgICAgCXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJ +a2VlcF9jYWNoZSA9PiAxLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9u +ID0+ICRzZWxmLT57c2Vzc2lvbn0sCiAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgIGRh +dGFzZXQgPT4gJHJlcG9ydF9kcywKICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgJXsk +c2NvbmZ9CiAgICAgICAgICAgICAgICAgICAgICAgIAl9LAogICAgICAgICAgICAgICAgICAgICAg +ICB0eXBlID0+ICJTZWFyY2giLAogICAgICAgICAgICAgICAgICAgICAgICBjYW5fc2VhcmNoID0+ +ICRmb3JtYXQsCiAgICAgICAgICAgICAgICAJKTsJCgkJCSRzZWFyY2hleHAtPmZyb21fZm9ybTsK +CgkJCSNnZW5lcmF0ZSB0aGUgZm9ybQoJCQlteSAkZnJhZyA9ICRzZWxmLT5yZW5kZXJfc2VhcmNo +X2ZpZWxkcyggJHNlYXJjaGV4cCwgJGZvcm1pZCApOwoKICAgICAgICAgICAgbXkgJHRlbXBsYXRl +ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInRlbXBsYXRlIiwgaWQgPT4gJGZvcm1pZCApOwogICAg +ICAgICAgICBteSAkdGFibGUgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2IiwgY2xhc3M9PiJl +cF90YWJsZSBlcF9zZWFyY2hfZmllbGRzIiwgaWQ9PiJmb3JtXyRmb3JtaWQiICk7CiAgICAgICAg +ICAgICR0YWJsZS0+YXBwZW5kQ2hpbGQoICRmcmFnICk7CiAgICAgICAgICAgICR0ZW1wbGF0ZS0+ +YXBwZW5kQ2hpbGQoICR0YWJsZSApOwogICAgICAgICAgICAkY3VzdG9tLT5hcHBlbmRDaGlsZCgg +JHRlbXBsYXRlICk7CgogICAgICAgICAgICAjIGtlZXAgYSByZWNvcmQgb2YgdGhpcyBzZWFyY2gg +Zm9ybSB0byBzYXZlIHVzIGZyb20gcmVuZGVyaW5nIGl0IGFnYWluCiAgICAgICAgICAgIHB1c2gg +QHNlYXJjaF9mb3JtcywgJGZvcm1pZDsKCQl9CQoJfQoKICAgICMgbGFiZWwgZm9yIGZvcm0gc2Vs +ZWN0IGRyb3AgZG93bgogICAgbXkgJHJlcG9ydF9sYWJlbCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQo +ICJsYWJlbCIsIGlkPT4icmVwb3J0X3NlbGVjdF9sYWJlbCIgKTsKICAgICRyZXBvcnRfbGFiZWwt +PmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnRfc2VsZWN0X2xhYmVsIiAp +ICk7CiAgICAkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvcnRfbGFiZWwgKTsKCSRmb3JtLT5hcHBl +bmRDaGlsZCggJHJlcG9ydF9zZWxlY3QgKTsKCQogICAgJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVw +by0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNjcmVlbiIsICRzZWxmLT57c2NyZWVuaWR9ICkgKTsK +ICAgICRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIGlkPT4i +Zm9ybV9jb250YWluZXIiICkgKTsKCQogICAgJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVu +ZGVyX2NvbnRyb2xzICk7CgkKICAgICRjdXN0b20tPmFwcGVuZENoaWxkKCAkZm9ybSApOwoKCSNq +YXZhc2NyaXB0IGZvciBjaGFuZ2luZyBmb3JtcyBiYXNlZCBvbiByZXBvcnQgc2VsZWN0aW9uCgkk +Y3VzdG9tLT5hcHBlbmRDaGlsZCggJHJlcG8tPm1ha2VfamF2YXNjcmlwdCggJ2luaXRSZXBvcnRG +b3JtKCk7JyApICk7CgoJaWYoICRjdXN0b21fcmVwb3J0cyAmJiAkcHJlc2V0c19hZGRlZCA+IDAg +KSAjc2V0IHVwIHRhYiBpbnRlcmZhY2UKCXsKCQlteSBAbGFiZWxzOwoJICAgICAgICBteSBAcGFu +ZWxzOwoKCQlwdXNoIEBsYWJlbHMsICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydHNfcHJlc2V0 +IiApOwoJCXB1c2ggQGxhYmVscywgJHJlcG8tPmh0bWxfcGhyYXNlKCAicmVwb3J0c19jdXN0b20i +ICk7CgoJCXB1c2ggQHBhbmVscywgJHByZXNldDsKCQlwdXNoIEBwYW5lbHMsICRjdXN0b207CgoJ +CW15ICVvcHRzOwoJCWlmKCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJuZXdzZWFy +Y2giIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInVwZGF0ZSIgICkKCQl7CgkJ +CSRvcHRze2N1cnJlbnR9ID0gMTsKCQl9CgoJCXJldHVybiAkcmVwby0+eGh0bWwtPnRhYnMoXEBs +YWJlbHMsIFxAcGFuZWxzLCAlb3B0cyApOwoJfQoJZWxzaWYoICRwcmVzZXRzX2FkZGVkID4gMCAp +Cgl7CQoJCXJldHVybiAkcHJlc2V0OwoJfQoJZWxzZQoJewoJCXJldHVybiAkY3VzdG9tOwoJfQp9 +CgpzdWIgcmVuZGVyX3NlYXJjaF9maWVsZHMKewogICAgbXkoICRzZWxmLCAkc2VhcmNoLCAkZm9y +bWlkICkgPSBAXzsKCglteSAkZXhwID0gJHNlbGYtPntzZXNzaW9ufS0+cGFyYW0oICJleHAiICk7 +CglteSAkc2NvbmYgPSAkc2VsZi0+e3Nlc3Npb259LT5wYXJhbSggInNjb25mIiApOwogICAgaWYo +IGRlZmluZWQgJGV4cCAmJiBkZWZpbmVkICRzY29uZiAmJiAkc2NvbmYgZXEgJGZvcm1pZCApCgl7 +CiAgICAgICAgJHNlYXJjaC0+ZnJvbV9zdHJpbmcoICRleHAgKTsKICAJfQoKICAgIG15ICRmcmFn +ID0gJHNlbGYtPntzZXNzaW9ufS0+bWFrZV9kb2NfZnJhZ21lbnQ7CiAgICBmb3JlYWNoIG15ICRz +ZiAoICRzZWFyY2gtPmdldF9ub25fZmlsdGVyX3NlYXJjaGZpZWxkcyApCiAgICB7CiAgICAgICAg +bXkgJGxhYmVsOwogICAgICAgIG15ICRmaWVsZDsKICAgICAgICBpZiAoICRzZi0+eyJmaWVsZCJ9 +LT5nZXRfdHlwZSgpIGVxICJuYW1lZHNldCIgKQogICAgICAgIHsKICAgICAgICAgICAgIyB3ZSB3 +YW50IGEgbGVnZW5kIGFuZCBhIGxhYmVsCiAgICAgICAgICAgICRsYWJlbCA9ICRzZWxmLT57c2Vz +c2lvbn0tPm1ha2VfZWxlbWVudCggInNwYW4iLCBpZD0+JHNmLT5nZXRfZm9ybV9wcmVmaXguIl9s +YWJlbCIgKTsKICAgICAgICAgICAgJGxhYmVsLT5hcHBlbmRDaGlsZCggJHNmLT5yZW5kZXJfbmFt +ZSApOwoKICAgICAgICAgICAgbXkgJGxlZ2VuZCA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0 +ZjgoICRzZi0+cmVuZGVyX25hbWUgKTsKICAgICAgICAgICAgJGZpZWxkID0gJHNmLT5yZW5kZXIo +IGxlZ2VuZCA9PiAkbGVnZW5kICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAg +ICAkbGFiZWwgPSAkc2VsZi0+e3Nlc3Npb259LT5tYWtlX2VsZW1lbnQoICJzcGFuIiwgaWQ9PiRz +Zi0+Z2V0X2Zvcm1fcHJlZml4LiJfbGFiZWwiICk7CiAgICAgICAgICAgICRsYWJlbC0+YXBwZW5k +Q2hpbGQoICRzZi0+cmVuZGVyX25hbWUgKTsKICAgICAgICAgICAgJGZpZWxkID0gJHNmLT5yZW5k +ZXIoKTsKICAgICAgICB9CgoJICAgICRmcmFnLT5hcHBlbmRDaGlsZCgKICAgICAgICAgICAgJHNl +bGYtPntzZXNzaW9ufS0+cmVuZGVyX3Jvd193aXRoX2hlbHAoCiAgICAgICAgICAgICAgICBoZWxw +X3ByZWZpeCA9PiAkc2YtPmdldF9mb3JtX3ByZWZpeC4iX2hlbHAiLAogICAgICAgICAgICAgICAg +aGVscCA9PiAkc2YtPnJlbmRlcl9oZWxwLAogICAgICAgICAgICAgICAgbGFiZWwgPT4gJGxhYmVs +LAogICAgICAgICAgICAgICAgZmllbGQgPT4gJGZpZWxkLAogICAgICAgICAgICAgICAgbm9fdG9n +Z2xlID0+ICggJHNmLT57c2hvd19oZWxwfSBlcSAiYWx3YXlzIiApLAogICAgICAgICAgICAgICAg +bm9faGVscCA9PiAoICRzZi0+e3Nob3dfaGVscH0gZXEgIm5ldmVyIiApLAogICAgICAgICkgKTsK +ICAgIH0KCiAgICByZXR1cm4gJGZyYWc7Cn0KCnN1YiByZW5kZXJfY29udHJvbHMKewoJbXkoICRz +ZWxmLCAkd2l0aF9qcyApID0gQF87CgogICAgbXkgJGRpdiA9ICRzZWxmLT57c2Vzc2lvbn0tPm1h +a2VfZWxlbWVudCgKICAgICAgICAiZGl2IiAsCiAgICAgICAgY2xhc3MgPT4gImVwX3NlYXJjaF9i +dXR0b25zIiApOwogICAgICAgIAogICAgJGRpdi0+YXBwZW5kQ2hpbGQoICRzZWxmLT57c2Vzc2lv +bn0tPnJlbmRlcl9hY3Rpb25fYnV0dG9ucygKICAgICAgICBfb3JkZXIgPT4gWyAic2VhcmNoIiBd +LAogICAgICAgICNuZXdzZWFyY2ggPT4gJHNlbGYtPntzZXNzaW9ufS0+cGhyYXNlKCAibGliL3Nl +YXJjaGV4cHJlc3Npb246YWN0aW9uX3Jlc2V0IiApLAogICAgICAgIHNlYXJjaCA9PiAkc2VsZi0+ +e3Nlc3Npb259LT5waHJhc2UoICJsaWIvc2VhcmNoZXhwcmVzc2lvbjphY3Rpb25fc2VhcmNoIiAp +ICkKICAgICk7CgkKCW15ICR4bWwgPSAkc2VsZi0+e3Nlc3Npb259LT54bWw7CgoJaWYoICR3aXRo +X2pzICkKCXsKCQlteSAkY2xlYXJfZm9ybSA9ICRkaXYtPmFwcGVuZENoaWxkKCAkc2VsZi0+cmVu +ZGVyX2NsZWFyZm9ybSggJHhtbCApICk7Cgl9CgogICAgbXkgJGNsZWFyX2J0biA9ICRkaXYtPmFw +cGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfZWxlbWVudCggImJ1dHRvbiIsCiAgICAgICAgdHlwZSA9 +PiAiYnV0dG9uIiwKICAgICAgICBvbmNsaWNrID0+ICJjbGVhckZvcm0oKTsiLAogICAgICAgIGNs +YXNzID0+ICJlcF9mb3JtX2FjdGlvbl9idXR0b24gY2xlYXJfYnV0dG9uIiwKICAgICkgKTsKICAg +ICRjbGVhcl9idG4tPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkc2VsZi0+ +e3Nlc3Npb259LT5waHJhc2UoICJsaWIvc2VhcmNoZXhwcmVzc2lvbjphY3Rpb25fcmVzZXQiICkg +KSApOwoJcmV0dXJuICRkaXY7Cn0KCnN1YiByZW5kZXIKewoJbXkoICRzZWxmICkgPSBAXzsKCgkj +IGlmIHVzZXJzIGFjY2VzcyBTY3JlZW46OlJlcG9ydCBkaXJlY3RseSB3ZSB3YW50IHRvIGRpc3Bs +YXkgc29tZSBzb3J0IG9mIG1lbnUKCSMgd2hlcmUgdXNlcnMgY2FuIHNlbGVjdCB2aWV3YWJsZSBy +ZXBvcnRzCglpZiggKCAiRVByaW50czo6UGx1Z2luOjoiLiRzZWxmLT5nZXRfaWQgZXEgX19QQUNL +QUdFX18gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBuZSAic2VhcmNoIiApIHx8ICRz +ZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgIm5ld3NlYXJjaCIgKQoJewkKCQlyZXR1cm4g +JHNlbGYtPnJlbmRlcl9zcGxhc2hfcGFnZTsKCX0KCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0 +b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCgkkY2h1bmstPmFw +cGVuZENoaWxkKCAkc2VsZi0+cmVuZGVyX2V4cG9ydF9iYXIgKTsKCSRjaHVuay0+YXBwZW5kQ2hp +bGQoICRzZWxmLT5yZW5kZXJfZ3JvdXBfb3B0aW9ucyApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCgg +JHNlbGYtPnJlbmRlcl9zb3J0X29wdGlvbnMgKTsKCglpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57 +YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJJGNodW5rLT5hcHBlbmRDaGlsZCggJHNlbGYtPnJl +bmRlcl9yZWZpbmVfc2VhcmNoICk7Cgl9CgoJbXkgJGl0ZW1zID0gJHNlbGYtPml0ZW1zOwoJaWYo +ICFkZWZpbmVkICRpdGVtcyB8fCAkaXRlbXMtPmNvdW50ID09IDAgKQoJewoJCSMgTm8gaXRlbXMg +bWVzc2FnZQoJfQoKCW15ICRqc29uOwoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+ +e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRn +cm91cGVkID0gJHNlbGYtPmdldF9ncm91cGVkX2l0ZW1zKCAkaXRlbXMsIDEgKTsKCQkkanNvbiA9 +IGVuY29kZV9qc29uICRncm91cGVkOwoJfQoJZWxzZQoJewoJCW15ICRpdGVtX2lkcyA9IGRlZmlu +ZWQgJGl0ZW1zID8gJGl0ZW1zLT5pZHMgOiBbXTsKCQkkanNvbiA9ICJbIi5qb2luKCcsJyxAJGl0 +ZW1faWRzKS4iXSI7Cgl9CgogICAgICAgIG15ICR1cmwgPSAkcmVwby0+Y3VycmVudF91cmwoIGhv +c3QgPT4gMSApOwogICAgICAgIG15ICRwYXJhbWV0ZXJzID0gVVJJLT5uZXc7CiAgICAgICAgJHBh +cmFtZXRlcnMtPnF1ZXJ5X2Zvcm0oCiAgICAgICAgICAgICAgICAkc2VsZi0+aGlkZGVuX2JpdHMs +CiAgICAgICAgKTsKICAgICAgICAkcGFyYW1ldGVycyA9ICRwYXJhbWV0ZXJzLT5xdWVyeTsKCQkK +CW15ICRkcyA9ICRyZXBvLT5kYXRhc2V0KCAkc2VsZi0+cGFyYW0oICdkYXRhc2V0aWQnICkgKSBp +ZiBkZWZpbmVkICRzZWxmLT5wYXJhbSggJ2RhdGFzZXRpZCcgKTsKCW15ICRwcmVmaXggPSAkZHMt +PmJhc2VfaWQgaWYgZGVmaW5lZCAkZHM7CgoJIyB0aGUgbWFpbiA8ZGl2PgoJbXkgJGNvbnRhaW5l +cl9pZCA9IHNwcmludGYoICJlcF9yZXBvcnRfJXNcX2NvbnRhaW5lciIsICRzZWxmLT5nZXRfcmVw +b3J0ICk7CgoJI3VwZGF0ZSBqYXZhc2NyaXB0IHBhcmFtZXRlcnMgaWYgY29taW5nIGZyb20gYSBz +ZWFyY2ggcmVxdWVzdAoJaWYoICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJj +aCIgKQoJewoJCW15ICRwbHVnaW4gPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntyZXBvcnR9OwoJCSRw +bHVnaW4gPX4gcy86LyUzQS9nOwoJCSRwYXJhbWV0ZXJzID0gInNjcmVlbj0kcGx1Z2luIjsKCQkk +cHJlZml4ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57ZGF0YXNldGlkfTsKCQkkY29udGFpbmVyX2lk +ID0gc3ByaW50ZiggImVwX3JlcG9ydF8lc1xfY29udGFpbmVyIiwgJHNlbGYtPntwcm9jZXNzb3J9 +LT57cmVwb3J0X3BsdWdpbn0tPntyZXBvcnR9ICk7Cgl9CgkKCSNzaG93L2hpZGUgY29tcGxpYW5j +ZQoJbXkgJHNob3dfY29tcGxpYW5jZSA9IDE7Cgkkc2hvd19jb21wbGlhbmNlID0gJHNlbGYtPntz +aG93X2NvbXBsaWFuY2V9IGlmIGRlZmluZWQgJHNlbGYtPntzaG93X2NvbXBsaWFuY2V9OwoKCSNj +dXN0b20gbGFiZWxzCglteSAkbGFiZWxzID0gMDsKCSRsYWJlbHMgPSBlbmNvZGVfanNvbiAkc2Vs +Zi0+e2xhYmVsc30gaWYgZGVmaW5lZCAkc2VsZi0+e2xhYmVsc307CgoJJGNodW5rLT5hcHBlbmRD +aGlsZCggJHJlcG8tPm1ha2VfamF2YXNjcmlwdCggPDwiRU9KIiApICk7CmRvY3VtZW50Lm9ic2Vy +dmUoImRvbTpsb2FkZWQiLCBmdW5jdGlvbigpIHsKCW5ldyBFUHJpbnRzX1NjcmVlbl9SZXBvcnRf +TG9hZGVyKCB7CgkJaWRzOiAkanNvbiwKCQlzdGVwOiAyMCwKCQlwcmVmaXg6ICckcHJlZml4JywK +CQl1cmw6ICckdXJsJywKCQlwYXJhbWV0ZXJzOiAnJHBhcmFtZXRlcnMnLAkJCgkJY29udGFpbmVy +X2lkOiAnJGNvbnRhaW5lcl9pZCcsCgkJc2hvd19jb21wbGlhbmNlOiAkc2hvd19jb21wbGlhbmNl +LAoJCWxhYmVsczogJGxhYmVscwoJfSApLmV4ZWN1dGUoKTsKCn0pOwpFT0oKCSRjaHVuay0+YXBw +ZW5kQ2hpbGQoICRyZXBvLT5tYWtlX2VsZW1lbnQoICdkaXYnLCBjbGFzcyA9PiAnZXBfcmVwb3J0 +X3BhZ2UnLCBpZCA9PiAkY29udGFpbmVyX2lkICkgKTsKCgkjc2hvdyBzZWFyY2ggY29udHJvbHMg +YWZ0ZXIgdGhlIHJlc3VsdHMgdG9vCglpZiggJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBl +cSAic2VhcmNoIiApCiAgICAgICAgewogICAgICAgICAgICAgICAgJGNodW5rLT5hcHBlbmRDaGls +ZCggJHNlbGYtPnJlbmRlcl9yZWZpbmVfc2VhcmNoICk7CiAgICAgICAgfQoKCXJldHVybiAkY2h1 +bms7Cn0KCgpzdWIgcmVuZGVyX2V4cG9ydF9iYXIKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAk +cmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19m +cmFnbWVudDsKCglteSBAcGx1Z2lucyA9ICRzZWxmLT5leHBvcnRfcGx1Z2luczsKCXJldHVybiAk +Y2h1bmsgdW5sZXNzKCBzY2FsYXIoIEBwbHVnaW5zICkgfHwgZGVmaW5lZCggJHJlcG8tPmNvbmZp +ZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMiICkgKSApOwoKCW15ICRyZXBv +cnRfZHMgPSAkcmVwby0+ZGF0YXNldCggJHNlbGYtPntkYXRhc2V0aWR9ICk7CglteSAkZm9ybSA9 +ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0 +IiApOwoKCWlmKCBkZWZpbmVkICRzZWxmLT5yZXBvc2l0b3J5LT5wYXJhbSggInNlYXJjaCIgKSB8 +fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+ +YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxm +LT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCQkKCWlmKCBkZWZpbmVk +ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRy +ZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic29ydCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntz +b3J0fSApICk7Cgl9CQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4 +cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQo +ICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0JCgogICAg +bXkgJGV4cG9ydF9sYWJlbCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsYWJlbCIsIGlkPT4iZXhw +b3J0X3NlbGVjdF9sYWJlbCIgKTsKICAgICRleHBvcnRfbGFiZWwtPmFwcGVuZENoaWxkKCAkcmVw +by0+aHRtbF9waHJhc2UoICJleHBvcnRfc2VsZWN0X2xhYmVsIiApICk7CiAgICAkZm9ybS0+YXBw +ZW5kQ2hpbGQoICRleHBvcnRfbGFiZWwgKTsKCglpZiggIWRlZmluZWQoICRyZXBvLT5jb25maWco +ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiApICkgKQoJewoJCSNubyBjdXN0 +b20gZXhwb3J0IGZpZWxkcyBkZWZpbmVkLCB1c2UgZXhwb3J0IHBsdWdpbnMgZGVzaWduZWQgZm9y +IHRoaXMgcmVwb3J0CgkJbXkgJHNlbGVjdCA9ICRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJl +bmRlcl9vcHRpb25fbGlzdCgKCQkJbmFtZSA9PiAnZXhwb3J0JywKCQkJdmFsdWVzID0+IFttYXAg +eyAkXy0+Z2V0X3N1YnR5cGUgfSBAcGx1Z2luc10sCgkJCWxhYmVscyA9PiB7bWFwIHsgJF8tPmdl +dF9zdWJ0eXBlID0+ICRfLT5nZXRfbmFtZSB9IEBwbHVnaW5zfSwKICAgICAgICAgICAgJ2FyaWEt +bGFiZWxsZWRieScgPT4gImV4cG9ydF9zZWxlY3RfbGFiZWwiLAoJCSkgKTsKCX0KCWVsc2UKCXsK +CQkjcHJvdmlkZSBsaXN0IG9mIGRlZmF1bHQgZXhwb3J0IHBsdWdpbnMgZm9yIHJlcG9ydHMKCQlA +cGx1Z2lucyA9ICRzZWxmLT5leHBvcnRfcGx1Z2lucyggImdlbmVyaWMiICk7CgkJbXkgJHNlbGVj +dCA9ICRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9vcHRpb25fbGlzdCgKCQkJbmFt +ZSA9PiAnZXhwb3J0JywKCQkJdmFsdWVzID0+IFttYXAgeyAkXy0+Z2V0X3N1YnR5cGUgfSBAcGx1 +Z2luc10sCgkJCWxhYmVscyA9PiB7bWFwIHsgJF8tPmdldF9zdWJ0eXBlID0+ICRfLT5nZXRfbmFt +ZSB9IEBwbHVnaW5zfSwKICAgICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieScgPT4gImV4cG9ydF9z +ZWxlY3RfbGFiZWwiLAoJCSkgKTsKCgkJI2NyZWF0ZSBsYWJlbHMgYW5kIHBhbmVscyBmb3IgdGFi +YmVkIGludGVyZmFjZWQKCQlteSAkeG1sID0gJHJlcG8tPnhtbDsKCQlteSAkeGh0bWwgPSAkcmVw +by0+eGh0bWw7CgoJCW15ICRzZWxlY3RfYWxsID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkc2VsZi0+ +cmVuZGVyX3NlbGVjdGFsbCggJHhtbCApICk7CgkJbXkgJHNlbGVjdF9idG4gPSAkZm9ybS0+YXBw +ZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZV9lbGVtZW50KCAiYnV0dG9uIiwKCSAgICAgICAgICAgICAg +ICAgICAgdHlwZSA9PiAiYnV0dG9uIiwKCSAgICAgICAgICAgICAgICAgICAgb25jbGljayA9PiAi +dG9nZ2xlQ2hlY2tib3hlcygpOyIsCgkgICAgICAgICAgICAgICAgICAgIGNsYXNzID0+ICJlcF9m +b3JtX2FjdGlvbl9idXR0b24gc2VsZWN0X2J1dHRvbiIsCgkJKSApOwoJICAgICRzZWxlY3RfYnRu +LT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlX3RleHRfbm9kZSggJHJlcG8tPnBocmFzZSggInJl +cG9ydF9zZWxlY3QiICkgKSApOwoKCQkjYWxsb3cgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRz +IHRoZXkgd2FudCB0byBleHBvcnQKCQlteSAkZXhwb3J0X29wdGlvbnMgPSAkcmVwby0+bWFrZV9l +bGVtZW50KCAiZGl2IiApOwoKCQlteSBAa2V5czsKCQlpZiggZGVmaW5lZCAkcmVwby0+Y29uZmln +KCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX29yZGVyIiApICkKCQl7CgkJCUBr +ZXlzID0gQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxk +X29yZGVyIiApfTsKCQl9CgkJZWxzZQoJCXsKCQkJQGtleXMgPSBrZXlzICV7JHJlcG8tPmNvbmZp +ZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZHMiICl9OyAKCQl9CgkJZm9yZWFj +aCBteSAka2V5ICggQGtleXMgKQoJCXsKCQkJI2NyZWF0ZSBhIG5ldyBsaXN0CQkJCgkJCW15ICR1 +bCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJ1bCIsCgkgICAgICAgICAgICAgICAgCXN0eWxlID0+ +ICJsaXN0LXN0eWxlLXR5cGU6IG5vbmUiCgkgICAgICAgIAkpOwoJCQkKCQkJbXkgJGNvdW50ID0g +MDsgI2NvdW50IGhvdyBtYW55IGZpZWxkcyB3ZSBhZGQKCQkJZm9yZWFjaCBteSAkZmllbGRuYW1l +KCBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRzIiAp +LT57JGtleX19ICkKCQkJewoJCQkJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntl +eHBvcnRfY29uZn0sICJjdXN0b21fZXhwb3J0IiApICYmIGV4aXN0cyAkeyRyZXBvLT5jb25maWco +ICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKX17JGZpZWxkbmFtZX0gKSAj +d2UgaGF2ZSBhIGN1c3RvbSBleHBvcnQgZnVuY3Rpb24gaW5zdGVhZCAKCQkJCXsKCQkJCQkkY291 +bnQrKzsKCQkJCQkkc2VsZi0+X2V4cG9ydF9maWVsZF9jaGVja2JveCggJHJlcG8sICRmaWVsZG5h +bWUsICR1bCwgJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRvcHRpb25zOiRmaWVsZG5h +bWUiICkgKTsgCgkJCQl9CgkJCQllbHNpZiggZGVmaW5lZCBFUHJpbnRzOjpVdGlsczo6ZmllbGRf +ZnJvbV9jb25maWdfc3RyaW5nKCAkcmVwb3J0X2RzLCAkZmllbGRuYW1lICkgKQoJCQkJewoJCQkJ +CW15ICRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRy +ZXBvcnRfZHMsICRmaWVsZG5hbWUgKTsKCQkJCQkkY291bnQrKzsKICAgICAgIAkJCSAgICAgICAg +CSRzZWxmLT5fZXhwb3J0X2ZpZWxkX2NoZWNrYm94KCAkcmVwbywgJGZpZWxkbmFtZSwgJHVsLCAk +ZmllbGQtPnJlbmRlcl9uYW1lICk7CgoJCQkJfQoJCQl9CgkJCWlmKCAkY291bnQgKSAjb25seSBh +ZGQgb3B0aW9ucyBpZiB3ZSBoYXZlIGFueSBmaWVsZHMgdG8gc2hvdwoJCQl7CgkJCQlteSAkZGl2 +ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIGNsYXNzPT4icmVwb3J0X2V4cG9ydF9vcHRp +b25zIiApOwoJCQkJJGRpdi0+YXBwZW5kQ2hpbGQoIG15ICRoID0gJHJlcG8tPm1ha2VfZWxlbWVu +dCggImRpdiIsIGNsYXNzPT4iY3VzdG9tX2V4cG9ydF9oZWFkZXIiICkgKTsKCQkJCSRoLT5hcHBl +bmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0ZmllbGRzOiRrZXkiICkgKTsJCgkJ +CQkkZGl2LT5hcHBlbmRDaGlsZCggJHVsICk7CgkJCQkkZXhwb3J0X29wdGlvbnMtPmFwcGVuZENo +aWxkKCAkZGl2ICk7CgkJCX0KICAgICAgIAkJfQoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJGV4cG9y +dF9vcHRpb25zICk7Cgl9CgoJJGZvcm0tPmFwcGVuZENoaWxkKCAKCQkkcmVwby0+cmVuZGVyX2J1 +dHRvbigKCQkJbmFtZSA9PiAiX2FjdGlvbl9leHBvcnQiLAoJCQljbGFzcyA9PiAiZXBfZm9ybV9h +Y3Rpb25fYnV0dG9uIiwKCQkJdmFsdWUgPT4gJHJlcG8tPnBocmFzZSggJ2NnaS91c2Vycy9lZGl0 +X2VwcmludDpleHBvcnQnICkKCSkgKTsKCgkjY3JlYXRlIGEgY29sbGFwc2libGUgYm94CglteSAk +aW1hZ2VzdXJsID0gJHJlcG8tPmN1cnJlbnRfdXJsKCBwYXRoID0+ICJzdGF0aWMiLCAic3R5bGUv +aW1hZ2VzIiApOwoJbXkgJW9wdGlvbnM7Cgkkb3B0aW9uc3tzZXNzaW9ufSA9ICRyZXBvOwogICAg +ICAgICRvcHRpb25ze2lkfSA9ICJlcF9yZXBvcnRfZXhwb3J0IjsKICAgICAgICAkb3B0aW9uc3t0 +aXRsZX0gPSAkcmVwby0+aHRtbF9waHJhc2UoICJleHBvcnRfdGl0bGUiICk7CiAgICAgICAgJG9w +dGlvbnN7Y29sbGFwc2VkfSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9ICRmb3JtOwogICAgICAg +ICRvcHRpb25ze3Nob3dfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVsdGlfZG93bi5wbmciOwoJ +JG9wdGlvbnN7aGlkZV9pY29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0aV91cC5wbmciOwoKCW15 +ICRib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9PiJ0ZXh0LWFsaWduOiBs +ZWZ0IiApOwoJJGJveC0+YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6cmVuZGVyKCAlb3B0aW9u +cyApICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0dXJuICRjaHVuazsKfQoK +c3ViIHJlbmRlcl9zb3J0X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9 +ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVu +dDsKCglyZXR1cm4gJGNodW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYt +Pntzb3J0X2NvbmZ9LCAic29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBv +LT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICk7CgoJI2J1aWxkIHRo +ZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1 +dGUoIG5hbWUgPT4gInNvcnRfcmVwb3J0IiApOwogICAgICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUo +IG1ldGhvZCA9PiAiZ2V0IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCQoJaWYo +IGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+ +e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJl +bmRlcl9oaWRkZW5fZmllbGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNo +fS0+c2VyaWFsaXNlKSApOwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dy +b3VwX2V4cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5f +ZmllbGQoICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0K +CgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJz +dCA9IDE7CglteSAkc29ydF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVh +Y2ggbXkgJHNvcnRfbmFtZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAgICAgICAgewoJCW15ICRz +b3J0X3ZhbHVlID0gJHNvcnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsK +CQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQi +LCAkc29ydF92YWx1ZSkgKTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAgICAgICAgICAgICAgIHsK +ICAgICAgICAgICAgICAgIAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo +cmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBhcmF0b3IiICkgKTsKICAgICAgICAgICAgICAg +IH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+ +e3Byb2Nlc3Nvcn0tPntzb3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJCQlteSAkc3Ryb25nID0g +JHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQo +ICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29y +dF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJ +CWVsc2UKCQl7CgkJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpz +b3J0X3JlcG9ydCgiJy4kc29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQo +ICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29y +dF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkk +Zmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJl +cG8tPmh0bWxfcGhyYXNlKCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5rcz0+JHNvcnRfbGlua3Mg +KSApOwoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9ncm91cF9vcHRpb25zCnsKCW15KCAk c2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsg -PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJbXkgQHBsdWdpbnMgPSAkc2VsZi0+ZXhwb3J0 -X3BsdWdpbnM7CglyZXR1cm4gJGNodW5rIHVubGVzcyggc2NhbGFyKCBAcGx1Z2lucyApIHx8IGRl -ZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRz -IiApICkgKTsKCglteSAkcmVwb3J0X2RzID0gJHJlcG8tPmRhdGFzZXQoICRzZWxmLT57ZGF0YXNl -dGlkfSApOwoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmli -dXRlKCBtZXRob2QgPT4gImdldCIgKTsKCglpZiggZGVmaW5lZCAkc2VsZi0+cmVwb3NpdG9yeS0+ -cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2Vh -cmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVs -ZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2UpICk7 -Cgl9CgkJCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZv -cm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNl -bGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQkKCglpZiggZGVmaW5lZCAkc2VsZi0+e3By -b2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5y -ZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBf -ZXhwfSApICk7Cgl9CQoKICAgIG15ICRleHBvcnRfbGFiZWwgPSAkcmVwby0+bWFrZV9lbGVtZW50 -KCAibGFiZWwiLCBpZD0+ImV4cG9ydF9zZWxlY3RfbGFiZWwiICk7CiAgICAkZXhwb3J0X2xhYmVs -LT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0X3NlbGVjdF9sYWJlbCIg -KSApOwogICAgJGZvcm0tPmFwcGVuZENoaWxkKCAkZXhwb3J0X2xhYmVsICk7CgoJaWYoICFkZWZp -bmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkcyIg -KSApICkKCXsKCQkjbm8gY3VzdG9tIGV4cG9ydCBmaWVsZHMgZGVmaW5lZCwgdXNlIGV4cG9ydCBw -bHVnaW5zIGRlc2lnbmVkIGZvciB0aGlzIHJlcG9ydAoJCW15ICRzZWxlY3QgPSAkZm9ybS0+YXBw -ZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfb3B0aW9uX2xpc3QoCgkJCW5hbWUgPT4gJ2V4cG9ydCcs -CgkJCXZhbHVlcyA9PiBbbWFwIHsgJF8tPmdldF9zdWJ0eXBlIH0gQHBsdWdpbnNdLAoJCQlsYWJl -bHMgPT4ge21hcCB7ICRfLT5nZXRfc3VidHlwZSA9PiAkXy0+Z2V0X25hbWUgfSBAcGx1Z2luc30s -CiAgICAgICAgICAgICdhcmlhLWxhYmVsbGVkYnknID0+ICJleHBvcnRfc2VsZWN0X2xhYmVsIiwK -CQkpICk7Cgl9CgllbHNlCgl7CgkJI3Byb3ZpZGUgbGlzdCBvZiBkZWZhdWx0IGV4cG9ydCBwbHVn -aW5zIGZvciByZXBvcnRzCgkJQHBsdWdpbnMgPSAkc2VsZi0+ZXhwb3J0X3BsdWdpbnMoICJnZW5l -cmljIiApOwoJCW15ICRzZWxlY3QgPSAkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJf -b3B0aW9uX2xpc3QoCgkJCW5hbWUgPT4gJ2V4cG9ydCcsCgkJCXZhbHVlcyA9PiBbbWFwIHsgJF8t -PmdldF9zdWJ0eXBlIH0gQHBsdWdpbnNdLAoJCQlsYWJlbHMgPT4ge21hcCB7ICRfLT5nZXRfc3Vi -dHlwZSA9PiAkXy0+Z2V0X25hbWUgfSBAcGx1Z2luc30sCiAgICAgICAgICAgICdhcmlhLWxhYmVs -bGVkYnknID0+ICJleHBvcnRfc2VsZWN0X2xhYmVsIiwKCQkpICk7CgoJCSNjcmVhdGUgbGFiZWxz -IGFuZCBwYW5lbHMgZm9yIHRhYmJlZCBpbnRlcmZhY2VkCgkJbXkgJHhtbCA9ICRyZXBvLT54bWw7 -CgkJbXkgJHhodG1sID0gJHJlcG8tPnhodG1sOwoKCQlteSAkc2VsZWN0X2FsbCA9ICRmb3JtLT5h -cHBlbmRDaGlsZCggJHNlbGYtPnJlbmRlcl9zZWxlY3RhbGwoICR4bWwgKSApOwoJCW15ICRzZWxl -Y3RfYnRuID0gJGZvcm0tPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfZWxlbWVudCggImJ1dHRv -biIsCgkgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gImJ1dHRvbiIsCgkgICAgICAgICAgICAg -ICAgICAgIG9uY2xpY2sgPT4gInRvZ2dsZUNoZWNrYm94ZXMoKTsiLAoJICAgICAgICAgICAgICAg -ICAgICBjbGFzcyA9PiAiZXBfZm9ybV9hY3Rpb25fYnV0dG9uIHNlbGVjdF9idXR0b24iLAoJCSkg -KTsKCSAgICAkc2VsZWN0X2J0bi0+YXBwZW5kQ2hpbGQoICR4bWwtPmNyZWF0ZV90ZXh0X25vZGUo -ICRyZXBvLT5waHJhc2UoICJyZXBvcnRfc2VsZWN0IiApICkgKTsKCgkJI2FsbG93IHVzZXIgdG8g -Y2hvb3NlIHdoaWNoIGZpZWxkcyB0aGV5IHdhbnQgdG8gZXhwb3J0CgkJbXkgJGV4cG9ydF9vcHRp -b25zID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIgKTsKCgkJbXkgQGtleXM7CgkJaWYoIGRl -ZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9v -cmRlciIgKSApCgkJewoJCQlAa2V5cyA9IEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRf -Y29uZn0sICJleHBvcnRmaWVsZF9vcmRlciIgKX07CgkJfQoJCWVsc2UKCQl7CgkJCUBrZXlzID0g -a2V5cyAleyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRz -IiApfTsgCgkJfQoJCWZvcmVhY2ggbXkgJGtleSAoIEBrZXlzICkKCQl7CgkJCSNjcmVhdGUgYSBu -ZXcgbGlzdAkJCQoJCQlteSAkdWwgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAidWwiLAoJICAgICAg -ICAgICAgICAgIAlzdHlsZSA9PiAibGlzdC1zdHlsZS10eXBlOiBub25lIgoJICAgICAgICAJKTsK -CQkJCgkJCW15ICRjb3VudCA9IDA7ICNjb3VudCBob3cgbWFueSBmaWVsZHMgd2UgYWRkCgkJCWZv -cmVhY2ggbXkgJGZpZWxkbmFtZSggQHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25m -fSwgImV4cG9ydGZpZWxkcyIgKS0+eyRrZXl9fSApCgkJCXsKCQkJCWlmKCBkZWZpbmVkICRyZXBv -LT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiY3VzdG9tX2V4cG9ydCIgKSAmJiBleGlz -dHMgJHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImN1c3RvbV9leHBvcnQi -ICl9eyRmaWVsZG5hbWV9ICkgI3dlIGhhdmUgYSBjdXN0b20gZXhwb3J0IGZ1bmN0aW9uIGluc3Rl -YWQgCgkJCQl7CgkJCQkJJGNvdW50Kys7CgkJCQkJJHNlbGYtPl9leHBvcnRfZmllbGRfY2hlY2ti -b3goICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRyZXBvLT5odG1sX3BocmFzZSggImV4cG9ydGZp -ZWxkb3B0aW9uczokZmllbGRuYW1lIiApICk7IAoJCQkJfQoJCQkJZWxzaWYoIGRlZmluZWQgRVBy -aW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0cmluZyggJHJlcG9ydF9kcywgJGZpZWxk -bmFtZSApICkKCQkJCXsKCQkJCQlteSAkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJv -bV9jb25maWdfc3RyaW5nKCAkcmVwb3J0X2RzLCAkZmllbGRuYW1lICk7CgkJCQkJJGNvdW50Kys7 -CiAgICAgICAJCQkgICAgICAgIAkkc2VsZi0+X2V4cG9ydF9maWVsZF9jaGVja2JveCggJHJlcG8s -ICRmaWVsZG5hbWUsICR1bCwgJGZpZWxkLT5yZW5kZXJfbmFtZSApOwoKCQkJCX0KCQkJfQoJCQlp -ZiggJGNvdW50ICkgI29ubHkgYWRkIG9wdGlvbnMgaWYgd2UgaGF2ZSBhbnkgZmllbGRzIHRvIHNo -b3cKCQkJewoJCQkJbXkgJGRpdiA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiLCBjbGFzcz0+ -InJlcG9ydF9leHBvcnRfb3B0aW9ucyIgKTsKCQkJCSRkaXYtPmFwcGVuZENoaWxkKCBteSAkaCA9 -ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJkaXYiLCBjbGFzcz0+ImN1c3RvbV9leHBvcnRfaGVhZGVy -IiApICk7CgkJCQkkaC0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImV4cG9ydGZp -ZWxkczoka2V5IiApICk7CQoJCQkJJGRpdi0+YXBwZW5kQ2hpbGQoICR1bCApOwoJCQkJJGV4cG9y -dF9vcHRpb25zLT5hcHBlbmRDaGlsZCggJGRpdiApOwoJCQl9CiAgICAgICAJCX0KCQkkZm9ybS0+ -YXBwZW5kQ2hpbGQoICRleHBvcnRfb3B0aW9ucyApOwoJfQoKCSRmb3JtLT5hcHBlbmRDaGlsZCgg -CgkJJHJlcG8tPnJlbmRlcl9idXR0b24oCgkJCW5hbWUgPT4gIl9hY3Rpb25fZXhwb3J0IiwKCQkJ -Y2xhc3MgPT4gImVwX2Zvcm1fYWN0aW9uX2J1dHRvbiIsCgkJCXZhbHVlID0+ICRyZXBvLT5waHJh -c2UoICdjZ2kvdXNlcnMvZWRpdF9lcHJpbnQ6ZXhwb3J0JyApCgkpICk7CgoJI2NyZWF0ZSBhIGNv -bGxhcHNpYmxlIGJveAoJbXkgJGltYWdlc3VybCA9ICRyZXBvLT5jdXJyZW50X3VybCggcGF0aCA9 -PiAic3RhdGljIiwgInN0eWxlL2ltYWdlcyIgKTsKCW15ICVvcHRpb25zOwoJJG9wdGlvbnN7c2Vz -c2lvbn0gPSAkcmVwbzsKICAgICAgICAkb3B0aW9uc3tpZH0gPSAiZXBfcmVwb3J0X2V4cG9ydCI7 -CiAgICAgICAgJG9wdGlvbnN7dGl0bGV9ID0gJHJlcG8tPmh0bWxfcGhyYXNlKCAiZXhwb3J0X3Rp -dGxlIiApOwogICAgICAgICRvcHRpb25ze2NvbGxhcHNlZH0gPSAxOwoJJG9wdGlvbnN7Y29udGVu -dH0gPSAkZm9ybTsKICAgICAgICAkb3B0aW9uc3tzaG93X2ljb25fdXJsfSA9ICIkaW1hZ2VzdXJs -L211bHRpX2Rvd24ucG5nIjsKCSRvcHRpb25ze2hpZGVfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwv -bXVsdGlfdXAucG5nIjsKCglteSAkYm94ID0gJHJlcG8tPm1ha2VfZWxlbWVudCggImRpdiIsIHN0 -eWxlPT4idGV4dC1hbGlnbjogbGVmdCIgKTsKCSRib3gtPmFwcGVuZENoaWxkKCBFUHJpbnRzOjpC -b3g6OnJlbmRlciggJW9wdGlvbnMgKSApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGJveCApOwoK -CXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfc29ydF9vcHRpb25zCnsKCW15KCAkc2VsZiAp -ID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVw -by0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmluZWQoICRy -ZXBvLT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICkgKSApOwoKCW15 -ICRzb3J0X2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e3NvcnRfY29uZn0sICJzb3J0Zmll -bGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJbXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07 -CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1lID0+ICJzb3J0X3JlcG9ydCIgKTsKICAgICAgICAk -Zm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVuay0+YXBwZW5kQ2hp -bGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNlYXJjaCIgKSB8fCAk -c2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBw -ZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57 -cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZiggZGVmaW5lZCAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRy -ZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57 -Z3JvdXBfZXhwfSApICk7Cgl9CgoJI2Rpc3BsYXkgdGhlIGxpbmtzIHRoYXQgd2lsbCB0cmlnZ2Vy -IHRoZSBmb3JtCglteSAkZmlyc3QgPSAxOwoJbXkgJHNvcnRfbGlua3MgPSAkcmVwby0+bWFrZV9k -b2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRzb3J0X25hbWUgKCBrZXlzICV7JHNvcnRfY29uZn0g -KQogICAgICAgIHsKCQlteSAkc29ydF92YWx1ZSA9ICRzb3J0X2NvbmYtPnskc29ydF9uYW1lfTsK -CQlpZiggJGZpcnN0ICkKCQl7CgkJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9o -aWRkZW5fZmllbGQoICJzb3J0IiwgJHNvcnRfdmFsdWUpICk7CgkJfQoKCQlpZiggISRmaXJzdCAp -CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJJHNvcnRfbGlua3MtPmFwcGVuZENo -aWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiAp -ICk7CiAgICAgICAgICAgICAgICB9CgkJCgkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9 -LT57c29ydH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gZXEgJHNvcnRfdmFsdWUgKQoJ -CXsKCQkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7CgkJCSRz -dHJvbmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29ydF9jb25m -fSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBlbmRDaGls -ZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJf -bGluayggJ2phdmFzY3JpcHQ6c29ydF9yZXBvcnQoIicuJHNvcnRfdmFsdWUuJyIpJyApOwkKCQkJ -JGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57c29ydF9jb25m -fSAuICI6c29ydDoiIC4gJHNvcnRfbmFtZSApICk7CgkJCSRzb3J0X2xpbmtzLT5hcHBlbmRDaGls -ZCggJGxpbmsgKTsKCQl9CgkJJGZpcnN0ID0gMDsKICAgICAgICB9ICAgICAgICAgICAKCSRjaHVu -ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpzb3J0X2xpbmtzIiwg -bGlua3M9PiRzb3J0X2xpbmtzICkgKTsKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJfZ3Jv -dXBfb3B0aW9ucwp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9z -aXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoKCXJldHVybiAk -Y2h1bmsgdW5sZXNzKCBkZWZpbmVkKCAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9 -LCAiZ3JvdXBmaWVsZHMiICkgKSApOwoKCW15ICRncm91cF9jb25mID0gJHJlcG8tPmNvbmZpZygg -JHNlbGYtPntncm91cF9jb25mfSwgImdyb3VwZmllbGRzIiApOwoKCSNidWlsZCB0aGUgZm9ybQoJ -bXkgJGZvcm0gPSAkc2VsZi0+cmVuZGVyX2Zvcm07CgkkZm9ybS0+c2V0QXR0cmlidXRlKCBuYW1l -ID0+ICJncm91cF9yZXBvcnQiICk7CiAgICAgICAgJGZvcm0tPnNldEF0dHJpYnV0ZSggbWV0aG9k -ID0+ICJnZXQiICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkZm9ybSApOwoJCglpZiggZGVmaW5l -ZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9u -fSBlcSAic2VhcmNoIiApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hp -ZGRlbl9maWVsZCggInNlYXJjaCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJp -YWxpc2UpICk7Cgl9CgoJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKQoJ -ewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJzb3J0 -IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NvcnR9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlu -a3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkZ3JvdXBf -bGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7Cglmb3JlYWNoIG15ICRncm91cF92YWx1 -ZSAoIEB7JGdyb3VwX2NvbmZ9ICkKICAgICAgICB7CgkJbXkgKCRncm91cF9maWVsZCkgPSBzcGxp -dCgvOy8sICRncm91cF92YWx1ZSApOwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVu -ZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggImdyb3VwIiwgJGdyb3VwX3ZhbHVl -KSApOwoJCX0KCgkJaWYoICEkZmlyc3QgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAg -ICAgCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0 -ZS9WaWV3czpncm91cF9zZXBlcmF0b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZigg -ZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9 -LT57Z3JvdXB9IGVxICRncm91cF9maWVsZCApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1h -a2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5o -dG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVs -ZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRzdHJvbmcgKTsKCQl9CgkJZWxz -ZQoJCXsKCQkJbXkgJGxpbmsgPSAkcmVwby0+cmVuZGVyX2xpbmsoICdqYXZhc2NyaXB0Omdyb3Vw -X3JlcG9ydCgiJy4kZ3JvdXBfdmFsdWUuJyIpJyApOwkKCQkJJGxpbmstPmFwcGVuZENoaWxkKCAk -cmVwby0+aHRtbF9waHJhc2UoICRzZWxmLT57Z3JvdXBfY29uZn0gLiAiOmdyb3VwOiIgLiAkZ3Jv -dXBfZmllbGQgKSApOwoJCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0K -CQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJCgkjbm8gZ3JvdXBpbmcgbGluayBh -dCB0aGUgZW5kCgkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2Uo -ICJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CglpZiggZGVmaW5lZCAkc2VsZi0+ -e3Byb2Nlc3Nvcn0tPntncm91cH0gJiYgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXB9IG5lICIi -ICkKCXsKCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBf -cmVwb3J0KCIiKScgKTsJCgkJJGxpbmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2Uo -ICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAk -bGluayApOwoJfQoJZWxzZQoJewoJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAi -c3Ryb25nIiApOwogCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAi -cmVwb3J0Om5vX2dyb3VwaW5nIiApICk7CgkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHN0 -cm9uZyApOwoJfQoJCgkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJS -ZXBvcnQ6Z3JvdXBfbGlua3MiLCBsaW5rcz0+JGdyb3VwX2xpbmtzICkgKTsKCglyZXR1cm4gJGNo -dW5rOwp9CgpzdWIgcmVuZGVyX3JlZmluZV9zZWFyY2gKewoJbXkoICRzZWxmICkgPSBAXzsKCglt -eSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2Rv -Y19mcmFnbWVudDsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRz -ZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCW15ICRlc2NleHAg -PSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzZWFyY2h9LT5zZXJpYWxpc2U7CgkJbXkgJGNhY2hlaWQg -PSAkcmVwby0+cGFyYW0oICJjYWNoZSIgKTsKCQlteSAkc2NvbmYgPSAkc2VsZi0+e3Njb25mfTsJ -CgoJCSNzZXQgdXAgbmV3IHNlYXJjaCBsaW5rCgkJbXkgJG5ld19iYXNldXJsID0gVVJJLT5uZXco -ICRzZWxmLT57c2Vzc2lvbn0tPmdldF91cmkgKTsKICAgICAgICAJJG5ld19iYXNldXJsLT5xdWVy -eV9mb3JtKAoJICAgICAgICAgICAgICAgIHNjcmVlbiA9PiAiUmVwb3J0IiwKCQkJc2NvbmYgPT4g -JHNjb25mLAogICAgICAgIAkpOwoKCQlteSAkc2VhcmNoX2xpbmtzID0gJHJlcG8tPm1ha2VfZG9j -X2ZyYWdtZW50OwoJCW15ICRuZXdfbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggIiRuZXdfYmFz -ZXVybCZfYWN0aW9uX25ld3NlYXJjaD0xIiApOwoJICAgCSRuZXdfbGluay0+YXBwZW5kQ2hpbGQo -ICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9uOm5ldyIgKSApOwoJCSRz -ZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkbmV3X2xpbmsgKTsKCgkJI2FkZCBhIHNlcGFyYXRv -ci4uLgoJCSRzZWFyY2hfbGlua3MtPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJV -cGRhdGUvVmlld3M6Z3JvdXBfc2VwZXJhdG9yIiApICk7CgoJCSNzZXQgdXAgcmVmaW5lIHNlYXJj -aCBsaW5rCgkJbXkgJHJlZmluZV9iYXNldXJsID0gVVJJLT5uZXcoICRzZWxmLT57c2Vzc2lvbn0t -PmdldF91cmkgKTsKICAgICAgICAJJHJlZmluZV9iYXNldXJsLT5xdWVyeV9mb3JtKAoJICAgICAg -ICAJY2FjaGUgPT4gJGNhY2hlaWQsCgkgICAgICAgICAgICAgICAgZXhwID0+ICRlc2NleHAsCiAg -ICAgICAgCSAgICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAogICAgICAgICAgICAgICAgCWRhdGFz -ZXQgPT4gJHNlbGYtPntkYXRhc2V0aWR9LAogICAgICAgICAgICAgICAgCW9yZGVyID0+ICRzZWxm -LT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPntjdXN0b21fb3JkZXJ9LAoJCQlzY29uZiA9PiAkc2Nv -bmYsCiAgICAgICAgCSk7CgoJCW15ICRyZWZpbmVfbGluayA9ICRyZXBvLT5yZW5kZXJfbGluaygg -IiRyZWZpbmVfYmFzZXVybCZfYWN0aW9uX3VwZGF0ZT0xIiApOwogICAgICAJCSRyZWZpbmVfbGlu -ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggImxpYi9zZWFyY2hleHByZXNzaW9u -OnJlZmluZSIgKSApOyAgIAkgICAgICAgICAKCSAgICAgICAgJHNlYXJjaF9saW5rcy0+YXBwZW5k -Q2hpbGQoICRyZWZpbmVfbGluayApOwoKCQkkY2h1bmstPmFwcGVuZENoaWxkKCAkcmVwby0+aHRt -bF9waHJhc2UoICJSZXBvcnQ6c2VhcmNoX2xpbmtzIiwgbGlua3M9PiRzZWFyY2hfbGlua3MgKSAp -OwoJfQoKCXJldHVybiAkY2h1bms7Cn0KCgojYWRkcyBhIG5ldyBjaGVja2JveCB0byBhbGxvdyB0 -aGUgdXNlciB0byBjaG9vc2Ugd2hpY2ggZmllbGRzIHRvIGV4cG9ydApzdWIgX2V4cG9ydF9maWVs -ZF9jaGVja2JveAp7CglteSggJHNlbGYsICRyZXBvLCAkZmllbGRuYW1lLCAkdWwsICRmaWVsZGxh -YmVsICkgPSBAXzsKCglteSAkbGkgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAibGkiICk7CgkkdWwt -PmFwcGVuZENoaWxkKCAkbGkgKTsKCiAgICAgICAgbXkgJGNoZWNrYm94ID0gJHJlcG8tPm1ha2Vf -ZWxlbWVudCggImlucHV0IiwgdHlwZSA9PiAiY2hlY2tib3giLCBpZCA9PiAkZmllbGRuYW1lLCBu -YW1lID0+ICRmaWVsZG5hbWUsIHZhbHVlID0+ICRmaWVsZG5hbWUgKTsKCWlmKCBkZWZpbmVkICRy -ZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfZGVmYXVsdHMi -ICkgKQoJewoJCWlmKCAoIGdyZXAgeyAkZmllbGRuYW1lIGVxICRfIH0gQHskcmVwby0+Y29uZmln -KCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydGZpZWxkX2RlZmF1bHRzIiApfSApIHx8ICgg -c2NhbGFyKCBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0Zmll -bGRfZGVmYXVsdHMiICl9ICkgPT0gMCApICkKCQl7CgkJCSNvbmx5IGNoZWNrIGRlZmF1bHRzIG9y -IGNoZWNrIGV2ZXJ5dGhpbmcgaWYgZGVmYXVsdHMgbm90IGRlZmluZWQKCQkJJGNoZWNrYm94LT5z -ZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInllcyIgKTsKCQl9Cgl9CglteSAkbGFiZWwgPSAkcmVw -by0+bWFrZV9lbGVtZW50KCAibGFiZWwiLCBmb3IgPT4gJGZpZWxkbmFtZSApOwoJJGxhYmVsLT5h -cHBlbmRDaGlsZCggJGZpZWxkbGFiZWwgKTsKCgkkbGktPmFwcGVuZENoaWxkKCAkY2hlY2tib3gg -KTsKCSRsaS0+YXBwZW5kQ2hpbGQoICRsYWJlbCApOwp9CgojIyMgdXRpbGl0eSBtZXRob2RzCgoj -IFRPRE8gc2hvdWxkIHVzZSAiSlNPTiIgcGFja2FnZQpzdWIgdG9fanNvbgp7CiAgICAgICAgbXko -ICRzZWxmLCAkb2JqZWN0ICkgPSBAXzsKCglyZXR1cm4gIiIgaWYoICFkZWZpbmVkICRvYmplY3Qg -KTsKCiMgVVRGLTggaXNzdWVzOgojCXJldHVybiBKU09OLT5uZXctPnV0ZjgoMSktPmVuY29kZSgg -JG9iamVjdCApOwoKICAgICAgICBpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0hBU0gnICkKICAgICAg -ICB7CiAgICAgICAgICAgICAgICBteSBAc3R1ZmY7CiAgICAgICAgICAgICAgICB3aGlsZSggbXko -ICRrLCAkdiApID0gZWFjaCggJSRvYmplY3QgKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAg -ICAgICAgICAgICAgICAgIG5leHQgaWYoICFFUHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkdiApICk7 -ICAgICAgICMgb3IgJ251bGwnID8KICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3R1ZmYs -IEVQcmludHM6OlV0aWxzOjpqc19zdHJpbmcoICRrICkuJzonLiRzZWxmLT50b19qc29uKCAkdiAp -CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ3snIC4gam9pbiggIiwi -LCBAc3R1ZmYgKSAuICd9JzsKICAgICAgICB9CiAgICAgICAgZWxzaWYoIHJlZiggJG9iamVjdCAp -IGVxICdBUlJBWScgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBzdHVmZjsKICAgICAg -ICAgICAgICAgIGZvcmVhY2goIEAkb2JqZWN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAg -ICAgICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICRfICkgKTsK -ICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3R1ZmYsICRzZWxmLT50b19qc29uKCAkXyAp -OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICdbJyAuIGpvaW4oICIs -IiwgQHN0dWZmICkgLiAnXSc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gRVByaW50czo6VXRp -bHM6OmpzX3N0cmluZyggJG9iamVjdCApOwp9CgpzdWIgZXhwb3J0X3BsdWdpbnMKewogICAgICAg -IG15KCAkc2VsZiwgJGdlbmVyaWMgKSA9IEBfOwoKCW15IEBwbHVnaW5faWRzOwoJCglteSAkcmVw -byA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCWlmKCBkZWZpbmVkICRyZXBvLT5jb25maWcoICRzZWxm -LT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICkgKQoJewoJCUBwbHVnaW5faWRzID0g -QHskcmVwby0+Y29uZmlnKCAkc2VsZi0+e2V4cG9ydF9jb25mfSwgImV4cG9ydF9wbHVnaW5zIiAp -fTsKCX0JCgllbHNpZiggJGdlbmVyaWMgKQoJewogCQlAcGx1Z2luX2lkcyA9ICRyZXBvLT5wbHVn -aW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAgICAgICAg -ICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC9nZW5lcmljIiwKICAgICAgICAJICAgICAgICBpc192 -aXNpYmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAgKTsKCX0K -CWVsc2UKCXsKICAgICAgICAJQHBsdWdpbl9pZHMgPSAkcmVwby0+cGx1Z2luX2xpc3QoCiAgICAg -ICAgICAgICAgICAJdHlwZSA9PiAiRXhwb3J0IiwKCSAgICAgICAgICAgICAgICBjYW5fYWNjZXB0 -ID0+ICJyZXBvcnQvIi4kc2VsZi0+Z2V0X3JlcG9ydCwKICAgICAgICAJICAgICAgICBpc192aXNp -YmxlID0+ICJzdGFmZiIsCgkJCWlzX2FkdmVydGlzZWQgPT4gMSwKCSAgICAgICAgKTsKICAgICAg -ICB9CglteSBAcGx1Z2luczsKCWZvcmVhY2ggbXkgJGlkICggQHBsdWdpbl9pZHMgKQogICAgICAg -IHsKICAgICAgICAgICAgICAgIG15ICRwID0gJHJlcG8tPnBsdWdpbiggIiRpZCIgKSBvciBuZXh0 -OwogICAgICAgICAgICAgICAgcHVzaCBAcGx1Z2lucywgJHA7CiAgICAgICAgfQoKICAgICAgICBy -ZXR1cm4gQHBsdWdpbnM7Cn0KCnN1YiByZXBvcnRfcGx1Z2lucwp7CglteSggJHNlbGYgKSA9IEBf -OwoKCSMgc2YyIC0gY2FuJ3QgbGlzdCB2aWEgdHlwZSA9PiAiU2VhcmNoOjpSZXBvcnQiID8gCiAg -ICAgICAgbXkgQHBsdWdpbl9pZHMgPSAkc2VsZi0+cmVwb3NpdG9yeS0+cGx1Z2luX2xpc3QoCiAg -ICAgICAgICAgICAgICB0eXBlID0+ICJTY3JlZW4iLAogICAgICAgICk7CgogICAgICAgIG15IEBw -bHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewoJCW5leHQg -aWYoICRpZCAhfiAvXlNjcmVlbjo6UmVwb3J0OjovICk7CSMgbm90ZSB0aGlzIGFsc28gZmlsdGVy -cyBvdXQgJHNlbGYgKGFrYSBTY3JlZW46OlJlcG9ydCkKCiAgICAgICAgICAgICAgICBteSAkcCA9 -ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW4oICIkaWQiICk7CgkJbmV4dCBpZiggIWRlZmluZWQg -JHAgfHwgISRwLT5jYW5fYmVfdmlld2VkICk7CgogICAgICAgICAgICAgICAgcHVzaCBAcGx1Z2lu -cywgJHA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQHBsdWdpbnM7Cn0KCiNyZXR1cm5zIGEg -aGFzaCBvZiB2YWx1ZXMgbWFwcGVkIHRvIGEgbGFiZWwgYW5kIGEgbGlzdAojaWYgaWRzX29ubHkg -aXMgc2V0IHRoZSBsaXN0IG9mIGl0ZW1zIGFyZSBqdXN0IHJlcHJlc2VudGVkIGJ5IHRoZWlyIGlk -ICh1c2VkIGJ5IHJlcG9ydCBKUykKc3ViIGdldF9ncm91cGVkX2l0ZW1zCnsKCW15KCAkc2VsZiwg -JGl0ZW1zLCAkaWRzX29ubHkgKSA9IEBfOwoJbXkgJHNlc3Npb24gPSAkc2VsZi0+e3Nlc3Npb259 -OwoJbXkgJWdyb3VwZWQ7CgoJbXkgJGdyb3VwaW5nID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3Jv -dXB9OwoKCW15ICRtZXRhZmllbGQgPSAkaXRlbXMtPmdldF9kYXRhc2V0LT5maWVsZCggJGdyb3Vw -aW5nICk7CgoJI3NldCBncm91cF9vcHRzIGlmIGFwcHJvcHJpYXRlCglpZiggZGVmaW5lZCAkc2Vs -Zi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfSApCgl7CgkJaWYoICRtZXRhZmllbGQtPnR5cGUg -ZXEgImRhdGUiICkKCQl7CgkJCSRtZXRhZmllbGQtPntyZW5kZXJfcmVzfSA9ICRzZWxmLT57cHJv -Y2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmVzfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNzb3J9 -LT57Z3JvdXBfb3B0c30tPntyZXN9OwoJCX0KCX0KCgkjY3JlYXRlIGEgaGFzaCBvZiBmaWVsZCB2 -YWx1ZXMgdG8gaXRlbXMgKG9yIGl0ZW0gaWRzKQoJJGl0ZW1zLT5tYXAoIHN1YiB7CgkgICAgICAg -CW15KCAkc2Vzc2lvbiwgJGRhdGFzZXQsICRpdGVtICkgPSBAXzsKCQkKCQlteSAkbXVsdGlwbGUg -PSAkbWV0YWZpZWxkLT5nZXRfcHJvcGVydHkoICJtdWx0aXBsZSIgKTsKCQlteSBAZ3JvdXBfdmFs -dWVzOwoJCWlmKCAkbXVsdGlwbGUgKQogICAgICAgICAgICAgICAgewoJCQlAZ3JvdXBfdmFsdWVz -ID0gQHskaXRlbS0+dmFsdWUoICRncm91cGluZyApfTsKCQl9CgkJZWxzZQoJCXsJCQkKCQkJQGdy -b3VwX3ZhbHVlcyA9ICgkaXRlbS0+dmFsdWUoICRncm91cGluZyApKTsKCQl9CgkKCQlpZiggc2Nh -bGFyIEBncm91cF92YWx1ZXMgPiAwICkKCQl7CgkJCWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICgg -QGdyb3VwX3ZhbHVlcyApCgkJCXsKCQkJCW15ICRncm91cF9pZCA9ICRtZXRhZmllbGQtPmdldF9p -ZF9mcm9tX3ZhbHVlKCAkc2Vzc2lvbiwgJGdyb3VwX3ZhbHVlICk7CgkJCQkjdHJ1bmNhdGUgZ3Jv -dXAgaWYgYXBwcm9wcmlhdGUKCQkJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dy -b3VwX29wdHN9ICkKCQkJCXsKCQkJCQkkZ3JvdXBfaWQgPSAgc3Vic3RyKCAiXHUkZ3JvdXBfaWQi -LCAwLCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfSApIGlmIGV4 -aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3RydW5jYXRlfTsKCQkJCX0K -CgkJICAgICAgICAJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9ICkgI3dlJ3ZlIGFscmVh -ZHkgc2V0IHRoaXMgbGlzdCB1cCwgcHVzaCBhIG5ldyBpdGVtIG9uIHRvIHRoZSBsaXN0CgkJICAg -ICAgICAgICAgICAgCXsKCQkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdh -bnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdy -b3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJ -CQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbTsKCQkJCQl9CgkgICAgICAgCQkg -ICAgICAgIH0KICAgICAgICAJICAgICAgCQllbHNlICNzZXQgdXAgYSBsaXN0IGZvciB0aGlzIGdy -b3VwCgkgICAgICAgIAkgICAgICAgCXsKCQkJCQlteSBAZ3JvdXBlZF9pdGVtczsKCQkJCQlpZigg -JGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3 -aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgICAgICAgICAgewkKICAgICAgICAJCSAgICAgICAg -ICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAg -ICAgICAJCSAgICAgICAgfQoJICAgICAgICAgICAgICAgIAkgICAgICAgIGVsc2UKICAgICAgICAJ -ICAgICAgICAgICAgICAgIAl7CgkgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3Jv -dXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCQkgICAgICAgICAgICAgICAJfQoJICAgICAg -ICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNd -OwoJCQkJfQogICAgICAgICAgICAgICAJCX0KCQl9CgkJZWxzZQoJCXsKCQkJbXkgJGdyb3VwX2lk -ID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwogIAkgICAgCQlpZiggZXhpc3Rz -ICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBw -dXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgIAl7CgkJCQlpZiggJGlkc19vbmx5ICkg -I3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJ -CQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbS0+aWQ7CgkJCQl9CgkJ -CQllbHNlCgkJCQl7CgkJCQkJcHVzaCBAeyRncm91cGVkeyRncm91cF9pZH19LCAkaXRlbTsKCQkJ -CX0KCSAgICAgICAJCX0KICAgICAgICAJICAgICAgCWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRo -aXMgZ3JvdXAKCSAgICAgICAgCXsKCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJaWYoICRpZHNf -b25seSApICNzb21ldGltZXMgd2Ugb25seSB3YW50IGlkcyByYXRoZXIgdGhhbiB0aGUgd2hvbGUg -aXRlbQoJCSAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJCQlAZ3JvdXBlZF9pdGVtcyA9ICgk -aXRlbS0+aWQpOwogICAgICAgICAgICAgICAgCQl9CgkgICAgICAgICAgICAgICAgCWVsc2UKICAg -ICAgICAJICAgICAgICAgICAgICAgIHsKCSAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAg -QGdyb3VwZWRfaXRlbXMgPSAoJGl0ZW0pOwogICAgICAgIAkgICAgICAgICAgICAgICAJfQoJICAg -ICAgICAgICAgICAJICAgICAgICAkZ3JvdXBlZHskZ3JvdXBfaWR9ID0gW0Bncm91cGVkX2l0ZW1z -XTsKCQkJfQoJCX0KICAgICAgIAl9ICk7CgoJI25vdyBzb3J0IHRoZSBncm91cHMgYW5kIGFkZCBo -dW1hbiByZWFkYWJsZSBsYWJlbHMKCW15IEBzb3J0ZWRfZ3JvdXBzOwoJCglteSAkcmV2ZXJzZSA9 -IDA7CgkkcmV2ZXJzZSA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmV2ZXJz -ZV9vcmRlcn0gaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57cmV2 -ZXJzZV9vcmRlcn07CglpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAibmFtZWRzZXQiICkKCXsKCQlt -eSggJHRhZ3MsICRsYWJlbHMgKSA9ICRtZXRhZmllbGQtPnRhZ3NfYW5kX2xhYmVscyggJHNlc3Np -b24gKTsKCQkjY29udmVydCB0YWdzIHRvIGEgaGFzaCBvZiB2YWx1ZXMgYW5kIGEgcHJpb3JpdHkg -KGZvciBvcmRlcmluZykKCQlteSAlcHJpb3JpdHk7CgkJbXkgJGluZGV4ID0gMTsKCQlmb3JlYWNo -IG15ICR0YWcgKEB7JHRhZ3N9ICkKCQl7CgkJCSRwcmlvcml0eXskdGFnfSA9ICRpbmRleDsKCQkJ -JGluZGV4Kys7CgkJfQoJCWZvcmVhY2ggbXkgJGtleSAoc29ydCB7JHByaW9yaXR5eyRhfSA8PT4g -JHByaW9yaXR5eyRifX0ga2V5cyAlZ3JvdXBlZCkKICAgICAgICAJewoJCQlwdXNoIEBzb3J0ZWRf -Z3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGxhYmVs -cy0+eyRrZXl9ICk7CgkJfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgInN1YmplY3Qi -ICkKCXsJCQoJCW15ICRkcyA9ICRzZXNzaW9uLT5kYXRhc2V0KCAic3ViamVjdCIgKTsKCQlteSBA -dmFsdWVzID0ga2V5cyAlZ3JvdXBlZDsKCQlteSAkc29ydGVkID0gJG1ldGFmaWVsZC0+c29ydF92 -YWx1ZXMoICRzZXNzaW9uLCBcQHZhbHVlcyApOwoJCW15ICVwcmlvcml0eTsKCQlteSAkaW5kZXgg -PSAxOwogICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkdmFsdWUgKEB7JHNvcnRlZH0gKQogICAg -ICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkcHJpb3JpdHl7JHZhbHVlfSA9 -ICRpbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4Kys7CiAgICAgICAgICAgICAg -ICB9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7 -JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAgICAgICAgICAgewoJCQlteSAkc3ViaiA9ICRkcy0+ -ZGF0YW9iaiggJGtleSApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzb3J0ZWRfZ3Jv -dXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgRVByaW50czo6 -VXRpbHM6OnRyZWVfdG9fdXRmOCggJHN1YmotPnJlbmRlcl9kZXNjcmlwdGlvbiApICkgaWYgZGVm -aW5lZCAkc3ViajsKICAgICAgICAgICAgICAgIH0KCX0KCWVsc2lmKCAkbWV0YWZpZWxkLT50eXBl -IGVxICJkYXRlIiApCgl7CgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkgJGtleSAo -IHNvcnQgeyRiIDw9PiAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNvcnRlZF9n -cm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAka2V5ICk7 -CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGEgPD0+ICRi -fSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9t -YWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCX0KCWVs -c2UKCXsJCgkJaWYoICRyZXZlcnNlICkKCQl7CgkJCWZvcmVhY2ggbXkgJGtleSAoIHNvcnQgeyRi -IGNtcCAkYX0ga2V5cyAlZ3JvdXBlZCApCgkJCXsKCQkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRz -ZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAka2V5ICk7CgkJCX0KCQl9 -CgkJZWxzZQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCBrZXlzICVncm91cGVkICkKCQkJ -ewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdy -b3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCX0KCgkjY2hlY2sgZm9yIGFueSB1bnNwZWNp -ZmllZCBncm91cHMKCW15ICRncm91cF9pZCA9ICJVbnNwZWNpZmllZCAiIC4gJG1ldGFmaWVsZC0+ -bmFtZTsKCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApCgl7CgkJcHVzaCBAc29ydGVk -X2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGdyb3VwX2lkfSwg -JGdyb3VwX2lkICk7Cgl9CgoJcmV0dXJuIFxAc29ydGVkX2dyb3VwczsKfQkKCgpzdWIgX21ha2Vf -Z3JvdXBlZF9pdGVtCnsKCW15KCAkc2VsZiwgJGxpc3QsICRsYWJlbCApID0gQF87CglteSAlZ3Jv -dXA7CgkkZ3JvdXB7bGlzdH0gPSAkbGlzdDsKCSRncm91cHtsYWJlbH0gPSAkbGFiZWw7CglyZXR1 -cm4gXCVncm91cDsKfQoKc3ViIHJlbmRlcl9zZWxlY3RhbGwKewoJbXkoICRzZWxmLCAkeG1sICkg -PSBAXzsKCglteSAkdG9nZ2xlX2Z1bmN0aW9uID0gJwoJCXZhciBpc0NoZWNrZWQgPSB0cnVlOwoJ -CWZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94ZXMoKSB7CgkgICAgICAgIAl2YXIgZXhwb3J0X29wdGlv -bnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJyZXBvcnRfZXhwb3J0X29wdGlv -bnMiKTsKCQkJZm9yKCBleHBvcnRfb3B0aW9uIG9mIGV4cG9ydF9vcHRpb25zICkKCQkJewoJCQkJ -dmFyIGNoZWNrYm94ZXMgPSBleHBvcnRfb3B0aW9uLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiaW5w -dXQiICkKCQkJCWZvciggY2hlY2tib3ggb2YgY2hlY2tib3hlcyApCgkJCQl7CgkJCQkJaWYoaXND -aGVja2VkKQoJCQkJCXsKCSAgICAgICAgICAgICAgICAJCQljaGVja2JveC5jaGVja2VkID0gIiI7 -CgkJICAJICAgICAgICAJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkgICAgICAgICAgICAgICAgY2hl -Y2tib3guY2hlY2tlZCA9ICJjaGVja2VkIjsKCQkJCQl9CgkgICAgICAgICAJCX0KCQkJfQoJCQlp -c0NoZWNrZWQgPSAhaXNDaGVja2VkOwoJCX0nOwoJCglteSAkanNfdGFnID0gJHhtbC0+Y3JlYXRl -X2VsZW1lbnQoICJzY3JpcHQiICk7CgkkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRl -X3RleHRfbm9kZSggJHRvZ2dsZV9mdW5jdGlvbiApICk7CglyZXR1cm4gJGpzX3RhZzsKfQoKc3Vi -IHJlbmRlcl9jbGVhcmZvcm0KewoJbXkoICRzZWxmLCAkeG1sICkgPSBAXzsKCglteSAkY2xlYXJf -ZnVuY3Rpb24gPSAnCgkJZnVuY3Rpb24gY2xlYXJGb3JtKCl7CgkJCXZhciByZXBvcnQgPSBkb2N1 -bWVudC5nZXRFbGVtZW50QnlJZCggImN1c3RvbV9yZXBvcnQiICk7CgkJCXZhciBmb3JtID0gcmVw -b3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInNlbGVjdGVkX2Zvcm0iKVswXTsKCQkJdmFyIGlu -cHV0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKTsKCQkJZm9yKCBpbnB1 -dCBvZiBpbnB1dHMgKQoJCQl7CgkJCQlmaWVsZF90eXBlID0gaW5wdXQudHlwZS50b0xvd2VyQ2Fz -ZSgpOwkKCQkJCWNvbnNvbGUubG9nKGZpZWxkX3R5cGUpOwoJCQkJc3dpdGNoIChmaWVsZF90eXBl -KQoJCQkJewoJCQkJY2FzZSAidGV4dCI6CgkJCQljYXNlICJ0ZXh0YXJlYSI6CgkJCQkJaW5wdXQu -dmFsdWUgPSAiIjsKCQkJCQlicmVhazsKCQkJCWNhc2UgInJhZGlvIjoKCQkJCWNhc2UgImNoZWNr -Ym94IjoKCQkJCQlpZiAoaW5wdXQuY2hlY2tlZCkKCQkJCQl7CiAgICAgICAgCQkJCQlpbnB1dC5j -aGVja2VkID0gZmFsc2U7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAic2VsZWN0LW9uZSI6 -CgkJCQljYXNlICJzZWxlY3QtbXVsdGkiOgoJCQkJCWlucHV0LnNlbGVjdGVkSW5kZXggPSAtMTsK -CQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0JCgkJICAgICAg -ICB2YXIgc2VsZWN0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxlY3QiICk7CgkJ -CWZvciggc2VsZWN0IG9mIHNlbGVjdHMgKQoJCQl7CQoJCQkJaWYoIHNlbGVjdC5oYXNBdHRyaWJ1 -dGUoIm11bHRpcGxlIikgKQoJCQkJewoJCQkJCXNlbGVjdC5zZWxlY3RlZEluZGV4ID0gLTE7CgkJ -CQl9CgkJCX0JCQoKCQl9JzsJCQoKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxlbWVudCgg -InNjcmlwdCIgKTsKICAgICAgICAkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlX3Rl -eHRfbm9kZSggJGNsZWFyX2Z1bmN0aW9uICkgKTsKICAgICAgICByZXR1cm4gJGpzX3RhZzsKfQoK -MTsK +PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmlu +ZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57Z3JvdXBfY29uZn0sICJncm91cGZpZWxkcyIgKSAp +ICk7CgoJbXkgJGdyb3VwX2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9 +LCAiZ3JvdXBmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5y +ZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gImdyb3VwX3JlcG9ydCIg +KTsKICAgICAgICAkZm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVu +ay0+YXBwZW5kQ2hpbGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNl +YXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsK +CQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNo +IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZigg +ZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZvcm0tPmFwcGVuZENo +aWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNlbGYtPntwcm9jZXNz +b3J9LT57c29ydH0gKSApOwoJfQoKCSNkaXNwbGF5IHRoZSBsaW5rcyB0aGF0IHdpbGwgdHJpZ2dl +ciB0aGUgZm9ybQoJbXkgJGZpcnN0ID0gMTsKCW15ICRncm91cF9saW5rcyA9ICRyZXBvLT5tYWtl +X2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICggQHskZ3JvdXBfY29uZn0g +KQogICAgICAgIHsKCQlteSAoJGdyb3VwX2ZpZWxkKSA9IHNwbGl0KC87LywgJGdyb3VwX3ZhbHVl +ICk7CgkJaWYoICRmaXJzdCApCgkJewoJCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5k +ZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAkZ3JvdXBfdmFsdWUpICk7CgkJfQoKCQlpZiggISRm +aXJzdCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJJGdyb3VwX2xpbmtzLT5h +cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiVXBkYXRlL1ZpZXdzOmdyb3VwX3NlcGFy +YXRvciIgKSApOwogICAgICAgICAgICAgICAgfQoJCQoJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJv +Y2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gZXEgJGdyb3Vw +X2ZpZWxkICkKCQl7CgkJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic3Ryb25n +IiApOwoJCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAkc2VsZi0+ +e2dyb3VwX2NvbmZ9IC4gIjpncm91cDoiIC4gJGdyb3VwX2ZpZWxkICkgKTsKCQkJJGdyb3VwX2xp +bmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9 +ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVwb3J0KCInLiRncm91cF92 +YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSgg +JHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVsZCApICk7CgkJCSRn +cm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7CgkJfQoJCSRmaXJzdCA9IDA7CiAgICAg +ICAgfSAgICAgICAgICAgCgkKCSNubyBncm91cGluZyBsaW5rIGF0IHRoZSBlbmQKCSRncm91cF9s +aW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91 +cF9zZXBhcmF0b3IiICkgKTsKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3Vw +fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRsaW5rID0g +JHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpncm91cF9yZXBvcnQoIiIpJyApOwkKCQkk +bGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydDpub19ncm91cGlu +ZyIgKSApOwoJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7Cgl9CgllbHNlCgl7 +CgkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7CiAJCSRzdHJv +bmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmci +ICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7Cgl9CgkKCSRjaHVu +ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpncm91cF9saW5rcyIs +IGxpbmtzPT4kZ3JvdXBfbGlua3MgKSApOwoKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJf +cmVmaW5lX3NlYXJjaAp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJl +cG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoJCglpZigg +ZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57 +YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJbXkgJGVzY2V4cCA9ICRzZWxmLT57cHJvY2Vzc29y +fS0+e3NlYXJjaH0tPnNlcmlhbGlzZTsKCQlteSAkY2FjaGVpZCA9ICRyZXBvLT5wYXJhbSggImNh +Y2hlIiApOwoJCW15ICRzY29uZiA9ICRzZWxmLT57c2NvbmZ9OwkKCgkJI3NldCB1cCBuZXcgc2Vh +cmNoIGxpbmsKCQlteSAkbmV3X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+ +Z2V0X3VyaSApOwogICAgICAgIAkkbmV3X2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgICAg +ICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAoJCQlzY29uZiA9PiAkc2NvbmYsCiAgICAgICAgCSk7 +CgoJCW15ICRzZWFyY2hfbGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgkJbXkgJG5l +d19saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJG5ld19iYXNldXJsJl9hY3Rpb25fbmV3c2Vh +cmNoPTEiICk7CgkgICAJJG5ld19saW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNl +KCAibGliL3NlYXJjaGV4cHJlc3Npb246bmV3IiApICk7CgkJJHNlYXJjaF9saW5rcy0+YXBwZW5k +Q2hpbGQoICRuZXdfbGluayApOwoKCQkjYWRkIGEgc2VwYXJhdG9yLi4uCgkJJHNlYXJjaF9saW5r +cy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9z +ZXBhcmF0b3IiICkgKTsKCgkJI3NldCB1cCByZWZpbmUgc2VhcmNoIGxpbmsKCQlteSAkcmVmaW5l +X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAgICAg +IAkkcmVmaW5lX2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgIAljYWNoZSA9PiAkY2FjaGVp +ZCwKCSAgICAgICAgICAgICAgICBleHAgPT4gJGVzY2V4cCwKICAgICAgICAJICAgICAgICBzY3Jl +ZW4gPT4gIlJlcG9ydCIsCiAgICAgICAgICAgICAgICAJZGF0YXNldCA9PiAkc2VsZi0+e2RhdGFz +ZXRpZH0sCiAgICAgICAgICAgICAgICAJb3JkZXIgPT4gJHNlbGYtPntwcm9jZXNzb3J9LT57c2Vh +cmNofS0+e2N1c3RvbV9vcmRlcn0sCgkJCXNjb25mID0+ICRzY29uZiwKICAgICAgICAJKTsKCgkJ +bXkgJHJlZmluZV9saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJHJlZmluZV9iYXNldXJsJl9h +Y3Rpb25fdXBkYXRlPTEiICk7CiAgICAgIAkJJHJlZmluZV9saW5rLT5hcHBlbmRDaGlsZCggJHJl +cG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246cmVmaW5lIiApICk7ICAgCSAg +ICAgICAgIAoJICAgICAgICAkc2VhcmNoX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJlZmluZV9saW5r +ICk7CgoJCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpz +ZWFyY2hfbGlua3MiLCBsaW5rcz0+JHNlYXJjaF9saW5rcyApICk7Cgl9CgoJcmV0dXJuICRjaHVu +azsKfQoKCiNhZGRzIGEgbmV3IGNoZWNrYm94IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZSB3 +aGljaCBmaWVsZHMgdG8gZXhwb3J0CnN1YiBfZXhwb3J0X2ZpZWxkX2NoZWNrYm94CnsKCW15KCAk +c2VsZiwgJHJlcG8sICRmaWVsZG5hbWUsICR1bCwgJGZpZWxkbGFiZWwgKSA9IEBfOwoKCW15ICRs +aSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsaSIgKTsKCSR1bC0+YXBwZW5kQ2hpbGQoICRsaSAp +OwoKICAgICAgICBteSAkY2hlY2tib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaW5wdXQiLCB0 +eXBlID0+ICJjaGVja2JveCIsIGlkID0+ICRmaWVsZG5hbWUsIG5hbWUgPT4gJGZpZWxkbmFtZSwg +dmFsdWUgPT4gJGZpZWxkbmFtZSApOwoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYt +PntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKSApCgl7CgkJaWYoICggZ3Jl +cCB7ICRmaWVsZG5hbWUgZXEgJF8gfSBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2Nv +bmZ9LCAiZXhwb3J0ZmllbGRfZGVmYXVsdHMiICl9ICkgfHwgKCBzY2FsYXIoIEB7JHJlcG8tPmNv +bmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKX0gKSA9 +PSAwICkgKQoJCXsKCQkJI29ubHkgY2hlY2sgZGVmYXVsdHMgb3IgY2hlY2sgZXZlcnl0aGluZyBp +ZiBkZWZhdWx0cyBub3QgZGVmaW5lZAoJCQkkY2hlY2tib3gtPnNldEF0dHJpYnV0ZSggImNoZWNr +ZWQiLCAieWVzIiApOwoJCX0KCX0KCW15ICRsYWJlbCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJs +YWJlbCIsIGZvciA9PiAkZmllbGRuYW1lICk7CgkkbGFiZWwtPmFwcGVuZENoaWxkKCAkZmllbGRs +YWJlbCApOwoKCSRsaS0+YXBwZW5kQ2hpbGQoICRjaGVja2JveCApOwoJJGxpLT5hcHBlbmRDaGls +ZCggJGxhYmVsICk7Cn0KCiMjIyB1dGlsaXR5IG1ldGhvZHMKCiMgVE9ETyBzaG91bGQgdXNlICJK +U09OIiBwYWNrYWdlCnN1YiB0b19qc29uCnsKICAgICAgICBteSggJHNlbGYsICRvYmplY3QgKSA9 +IEBfOwoKCXJldHVybiAiIiBpZiggIWRlZmluZWQgJG9iamVjdCApOwoKIyBVVEYtOCBpc3N1ZXM6 +CiMJcmV0dXJuIEpTT04tPm5ldy0+dXRmOCgxKS0+ZW5jb2RlKCAkb2JqZWN0ICk7CgogICAgICAg +IGlmKCByZWYoICRvYmplY3QgKSBlcSAnSEFTSCcgKQogICAgICAgIHsKICAgICAgICAgICAgICAg +IG15IEBzdHVmZjsKICAgICAgICAgICAgICAgIHdoaWxlKCBteSggJGssICR2ICkgPSBlYWNoKCAl +JG9iamVjdCApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4 +dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICR2ICkgKTsgICAgICAgIyBvciAnbnVsbCcg +PwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVmZiwgRVByaW50czo6VXRpbHM6Ompz +X3N0cmluZyggJGsgKS4nOicuJHNlbGYtPnRvX2pzb24oICR2ICkKICAgICAgICAgICAgICAgIH0K +ICAgICAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCAiLCIsIEBzdHVmZiApIC4gJ30nOwog +ICAgICAgIH0KICAgICAgICBlbHNpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0FSUkFZJyApCiAgICAg +ICAgewogICAgICAgICAgICAgICAgbXkgQHN0dWZmOwogICAgICAgICAgICAgICAgZm9yZWFjaCgg +QCRvYmplY3QgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0 +IGlmKCAhRVByaW50czo6VXRpbHM6OmlzX3NldCggJF8gKSApOwogICAgICAgICAgICAgICAgICAg +ICAgICBwdXNoIEBzdHVmZiwgJHNlbGYtPnRvX2pzb24oICRfICk7CiAgICAgICAgICAgICAgICB9 +CiAgICAgICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbiggIiwiLCBAc3R1ZmYgKSAuICddJzsK +ICAgICAgICB9CgogICAgICAgIHJldHVybiBFUHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkb2Jq +ZWN0ICk7Cn0KCnN1YiBleHBvcnRfcGx1Z2lucwp7CiAgICAgICAgbXkoICRzZWxmLCAkZ2VuZXJp +YyApID0gQF87CgoJbXkgQHBsdWdpbl9pZHM7CgkKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRv +cnk7CgoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJl +eHBvcnRfcGx1Z2lucyIgKSApCgl7CgkJQHBsdWdpbl9pZHMgPSBAeyRyZXBvLT5jb25maWcoICRz +ZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICl9OwoJfQkKCWVsc2lmKCAkZ2Vu +ZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0gJHJlcG8tPnBsdWdpbl9saXN0KAogICAgICAgICAg +ICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkgICAgICAgICAgICAgICAgY2FuX2FjY2VwdCA9PiAi +cmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwK +CQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwoJfQoJZWxzZQoJewogICAgICAgIAlA +cGx1Z2luX2lkcyA9ICRyZXBvLT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ +ICJFeHBvcnQiLAoJICAgICAgICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxm +LT5nZXRfcmVwb3J0LAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJ +aXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJ +Zm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewogICAgICAgICAgICAgICAg +bXkgJHAgPSAkcmVwby0+cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBw +dXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoK +c3ViIHJlcG9ydF9wbHVnaW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBs +aXN0IHZpYSB0eXBlID0+ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lk +cyA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUg +PT4gIlNjcmVlbiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15 +ICRpZCAoIEBwbHVnaW5faWRzICkKICAgICAgICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVu +OjpSZXBvcnQ6Oi8gKTsJIyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNj +cmVlbjo6UmVwb3J0KQoKICAgICAgICAgICAgICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnkt +PnBsdWdpbiggIiRpZCIgKTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92 +aWV3ZWQgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9Cgog +ICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBw +ZWQgdG8gYSBsYWJlbCBhbmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2Yg +aXRlbXMgYXJlIGp1c3QgcmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpT +KQpzdWIgZ2V0X2dyb3VwZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSAp +ID0gQF87CglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglt +eSAkZ3JvdXBpbmcgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVs +ZCA9ICRpdGVtcy0+Z2V0X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3Vw +X29wdHMgaWYgYXBwcm9wcmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dy +b3VwX29wdHN9ICkKCXsKCQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJ +JG1ldGFmaWVsZC0+e3JlbmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0 +c30tPntyZXN9IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jl +c307CgkJfQoJfQoKCSNjcmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3Ig +aXRlbSBpZHMpCgkkaXRlbXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0 +YXNldCwgJGl0ZW0gKSA9IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9w +cm9wZXJ0eSggIm11bHRpcGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBs +ZSApCiAgICAgICAgICAgICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSgg +JGdyb3VwaW5nICl9OwoJCX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVt +LT52YWx1ZSggJGdyb3VwaW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+ +IDAgKQoJCXsKCQkJZm9yZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJ +ewoJCQkJbXkgJGdyb3VwX2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNz +aW9uLCAkZ3JvdXBfdmFsdWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJ +CQkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJ +CQkJCSRncm91cF9pZCA9ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vz +c29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vz +c29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhp +c3RzICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVw +LCBwdXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJ +CWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4g +dGhlIHdob2xlIGl0ZW0KCQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwg +JGl0ZW0tPmlkOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7 +JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkg +ICAgICAJCWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAg +ICAJewoJCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRp +bWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAg +ICAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdy +b3VwZWRfaXRlbXMgPSAoJGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAgIAkJICAgICAgICB9Cgkg +ICAgICAgICAgICAgICAgCSAgICAgICAgZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsK +CSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVt +KTsKICAgICAgICAJCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAg +JGdyb3VwZWR7JGdyb3VwX2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAg +ICAgIAkJfQoJCX0KCQllbHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAu +ICRtZXRhZmllbGQtPm5hbWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lk +fSApICN3ZSd2ZSBhbHJlYWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0 +byB0aGUgbGlzdAoJCSAgCXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkg +d2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdy +b3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlw +dXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAg +ICAgIAkgICAgICAJZWxzZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJ +ewoJCQkJbXkgQGdyb3VwZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3 +ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAg +ICAgIHsJCiAgICAgICAgCQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAg +ICAgICAgICAJCX0KCSAgICAgICAgICAgICAgICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAg +ICAgewoJICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgk +aXRlbSk7CiAgICAgICAgCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAg +ICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAg +CX0gKTsKCgkjbm93IHNvcnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVs +cwoJbXkgQHNvcnRlZF9ncm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNl +bGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMg +JHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAk +bWV0YWZpZWxkLT50eXBlIGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyAp +ID0gJG1ldGFmaWVsZC0+dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRh +Z3MgdG8gYSBoYXNoIG9mIHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15 +ICVwcmlvcml0eTsKCQlteSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30g +KQoJCXsKCQkJJHByaW9yaXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9y +ZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlz +ICVncm91cGVkKQogICAgICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFr +ZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9 +CgllbHNpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0g +JHNlc3Npb24tPmRhdGFzZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91 +cGVkOwoJCW15ICRzb3J0ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxA +dmFsdWVzICk7CgkJbXkgJXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAg +ICBmb3JlYWNoIG15ICR2YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAg +ICAgICAgICAgICAgICAgICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAg +ICAgICAgICAgICAgICAkaW5kZXgrKzsKICAgICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRr +ZXkgKHNvcnQgeyRwcmlvcml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQp +CiAgICAgICAgICAgICAgICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAg +ICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9n +cm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4 +KCAkc3Viai0+cmVuZGVyX2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAg +ICAgICAgICAgfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlp +ZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBr +ZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtl +X2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJ +ewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJ +CQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAk +Z3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVy +c2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91 +cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRf +aXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3Jl +YWNoIG15ICRrZXkgKCBzb3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRf +Z3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSAp +OwoJCQl9CgkJfQoJfQoKCSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdy +b3VwX2lkID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAk +Z3JvdXBlZHskZ3JvdXBfaWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21h +a2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCgly +ZXR1cm4gXEBzb3J0ZWRfZ3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXko +ICRzZWxmLCAkbGlzdCwgJGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9 +ICRsaXN0OwoJJGdyb3Vwe2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgpzdWIg +cmVuZGVyX3NlbGVjdGFsbAp7CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICR0b2dnbGVf +ZnVuY3Rpb24gPSAnCgkJdmFyIGlzQ2hlY2tlZCA9IHRydWU7CgkJZnVuY3Rpb24gdG9nZ2xlQ2hl +Y2tib3hlcygpIHsKCSAgICAgICAgCXZhciBleHBvcnRfb3B0aW9ucyA9IGRvY3VtZW50LmdldEVs +ZW1lbnRzQnlDbGFzc05hbWUoInJlcG9ydF9leHBvcnRfb3B0aW9ucyIpOwoJCQlmb3IoIGV4cG9y +dF9vcHRpb24gb2YgZXhwb3J0X29wdGlvbnMgKQoJCQl7CgkJCQl2YXIgY2hlY2tib3hlcyA9IGV4 +cG9ydF9vcHRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKQoJCQkJZm9yKCBjaGVj +a2JveCBvZiBjaGVja2JveGVzICkKCQkJCXsKCQkJCQlpZihpc0NoZWNrZWQpCgkJCQkJewoJICAg +ICAgICAgICAgICAgIAkJCWNoZWNrYm94LmNoZWNrZWQgPSAiIjsKCQkgIAkgICAgICAgIAl9CgkJ +CQkJZWxzZQoJCQkJCXsKCQkJCSAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gImNo +ZWNrZWQiOwoJCQkJCX0KCSAgICAgICAgIAkJfQoJCQl9CgkJCWlzQ2hlY2tlZCA9ICFpc0NoZWNr +ZWQ7CgkJfSc7CgkKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxlbWVudCggInNjcmlwdCIg +KTsKCSRqc190YWctPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkdG9nZ2xl +X2Z1bmN0aW9uICkgKTsKCXJldHVybiAkanNfdGFnOwp9CgpzdWIgcmVuZGVyX2NsZWFyZm9ybQp7 +CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICRjbGVhcl9mdW5jdGlvbiA9ICcKCQlmdW5j +dGlvbiBjbGVhckZvcm0oKXsKCQkJdmFyIHJlcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk +KCAiY3VzdG9tX3JlcG9ydCIgKTsKCQkJdmFyIGZvcm0gPSByZXBvcnQuZ2V0RWxlbWVudHNCeUNs +YXNzTmFtZSgic2VsZWN0ZWRfZm9ybSIpWzBdOwoJCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVt +ZW50c0J5VGFnTmFtZSggImlucHV0IiApOwoJCQlmb3IoIGlucHV0IG9mIGlucHV0cyApCgkJCXsK +CQkJCWZpZWxkX3R5cGUgPSBpbnB1dC50eXBlLnRvTG93ZXJDYXNlKCk7CQoJCQkJc3dpdGNoIChm +aWVsZF90eXBlKQoJCQkJewoJCQkJY2FzZSAidGV4dCI6CgkJCQljYXNlICJ0ZXh0YXJlYSI6CgkJ +CQkJaW5wdXQudmFsdWUgPSAiIjsKCQkJCQlicmVhazsKCQkJCWNhc2UgInJhZGlvIjoKCQkJCWNh +c2UgImNoZWNrYm94IjoKCQkJCQlpZiAoaW5wdXQuY2hlY2tlZCkKCQkJCQl7CiAgICAgICAgCQkJ +CQlpbnB1dC5jaGVja2VkID0gZmFsc2U7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAic2Vs +ZWN0LW9uZSI6CgkJCQljYXNlICJzZWxlY3QtbXVsdGkiOgoJCQkJCWlucHV0LnNlbGVjdGVkSW5k +ZXggPSAtMTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0J +CgkJICAgICAgICB2YXIgc2VsZWN0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxl +Y3QiICk7CgkJCWZvciggc2VsZWN0IG9mIHNlbGVjdHMgKQoJCQl7CQoJCQkJaWYoIHNlbGVjdC5o +YXNBdHRyaWJ1dGUoIm11bHRpcGxlIikgKQoJCQkJewoJCQkJCXNlbGVjdC5zZWxlY3RlZEluZGV4 +ID0gLTE7CgkJCQl9CgkJCX0JCQoKCQl9JzsJCQoKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVf +ZWxlbWVudCggInNjcmlwdCIgKTsKICAgICAgICAkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+ +Y3JlYXRlX3RleHRfbm9kZSggJGNsZWFyX2Z1bmN0aW9uICkgKTsKICAgICAgICByZXR1cm4gJGpz +X3RhZzsKfQoKMTsK @@ -2203,9 +2216,9 @@ mCeqVAAAAABJRU5ErkJggg== document static/javascript/auto/reports.js text/plain - 71e1a869fbb7241f7fcc4027acc5a6f8 + 058ab00d3be58f69cb6f9f3e6d7625f9 MD5 - 12708 + 16024 dmFyIGluaXRSZXBvcnRGb3JtID0gZnVuY3Rpb24oKXsKCiAgICAgICAgLy9wb2x5ZmlsbCBmb3Ig SUUKICAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCB0eXBlb2Ygd2lu ZG93LkN1c3RvbUV2ZW50ID09PSAiZnVuY3Rpb24iICkgcmV0dXJuIGZhbHNlOyAvL0lmIG5vdCBJ @@ -2223,212 +2236,271 @@ ICAgICAgICBzZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgb25Gb3JtU2VsZWN0KTsK CiAgICAgICAgZG9jdW1lbnQub2JzZXJ2ZSgiZG9tOmxvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAg ICAgICAgICAgICAgdmFyIGNoYW5nZVNlbGVjdCA9IG5ldyBDdXN0b21FdmVudCgiY2hhbmdlIik7 CiAgICAgICAgICAgICAgICBzZWxlY3QuZGlzcGF0Y2hFdmVudChjaGFuZ2VTZWxlY3QpOwogICAg -ICAgIH0pOwp9OwoKCnZhciBvbkZvcm1TZWxlY3QgPSBmdW5jdGlvbigpewoJLy9nZXQgZm9ybSBp -ZAoJdmFyIGZvcm1pZCA9IHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLmdldEF0dHJp -YnV0ZSgnZm9ybScpOwoJCgkvL2hpZGUgb3RoZXIgZm9ybXMKCSQkKCdkaXYuZXBfdGFibGUuZXBf -c2VhcmNoX2ZpZWxkcycpLmVhY2goZnVuY3Rpb24gKGVsZW0pIAoJewkKCQkvL2hpZGUgdGhlIGZv -cm0KCQkkKGVsZW0pLmhpZGUoKTsKCQkkKGVsZW0pLnJlbW92ZUNsYXNzTmFtZSgic2VsZWN0ZWRf -Zm9ybSIpOwoJCSQoZWxlbSkuc2VsZWN0KCdpbnB1dCcpLmVhY2goZnVuY3Rpb24gKGlucHV0KQoJ -CXsKCQkJJChpbnB1dCkuc2V0QXR0cmlidXRlKCJkaXNhYmxlZCIsICJkaXNhYmxlZCIpOwoJCX0p -OwoJfSk7CgkJCgkvL3Nob3cgdGhlIGZvcm0gd2Ugd2FudAoJJChmb3JtaWQpLnNob3coKTsKCSQo -Zm9ybWlkKS5hZGRDbGFzc05hbWUoInNlbGVjdGVkX2Zvcm0iKTsKCgkvL2VuYWJsZSB0aGlzIGZv -cm0ncyBpbnB1dCBlbGVtZW50cwoJJChmb3JtaWQpLnNlbGVjdCgnaW5wdXQnKS5lYWNoKGZ1bmN0 -aW9uIChpbnB1dCkKCXsKCQkkKGlucHV0KS5yZW1vdmVBdHRyaWJ1dGUoImRpc2FibGVkIik7Cgl9 -KTsKCn07CgovLyBVc2VkIGJ5IHRoZSBTY3JlZW46OlJlcG9ydDo6cmVuZGVyIG1ldGhvZAoKdmFy -IEVQcmludHNfU2NyZWVuX1JlcG9ydF9Mb2FkZXIgPSBDbGFzcy5jcmVhdGUoewoJaGFzX3Byb2Js -ZW1zOiAwLAoJY291bnQ6IDAsCglydW5zOiAwLAoJcHJvZ3Jlc3M6IG51bGwsCglpZHM6IEFycmF5 -KCksCglzdGVwOiAyMCwKCXByZWZpeDogJycsCglvblByb2JsZW1zOiBmdW5jdGlvbigpIHt9LAoJ -b25GaW5pc2g6IGZ1bmN0aW9uKCkge30sCgl1cmw6ICIiLAoJcGFyYW1ldGVyczogIiIsCgljb250 -YWluZXI6IG51bGwsCglzaG93X2NvbXBsaWFuY2U6IDEsCQoKCS8vIHRvIHNob3cgYSBwcmV0dHkg -cHJvZ3Jlc3MgYmFyICglIGNvbXBsaWFuY2UpOgoJdG90YWxfZGF0YW9ianM6IDAsCgl0b3RhbF9u -b25jb21wbGlhbnQ6IDAsCgoKCWluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpIHsKCQlpZiggb3B0 -cy5pZHMgKQoJCQl0aGlzLmlkcyA9IG9wdHMuaWRzOwoJCWlmKCBvcHRzLnN0ZXAgKQoJCQl0aGlz -LnN0ZXAgPSBvcHRzLnN0ZXA7CgkJaWYoIG9wdHMucHJlZml4ICkKCQkJdGhpcy5wcmVmaXggPSBv -cHRzLnByZWZpeDsKCQlpZiggb3B0cy5vbkZpbmlzaCApCgkJCXRoaXMub25GaW5pc2ggPSBvcHRz -Lm9uRmluaXNoOwoJCWlmKCBvcHRzLm9uUHJvYmxlbXMgKQoJCQl0aGlzLm9uUHJvYmxlbXMgPSBv -cHRzLm9uUHJvYmxlbXM7CgkJaWYoIG9wdHMudXJsICkKCQl7CgkJCXRoaXMudXJsID0gb3B0cy51 -cmw7CgkJfQoJCWlmKCBvcHRzLnBhcmFtZXRlcnMgKQoJCQl0aGlzLnBhcmFtZXRlcnMgPSBvcHRz -LnBhcmFtZXRlcnM7CgkJaWYoIG9wdHMuY29udGFpbmVyX2lkICkKCQkJdGhpcy5jb250YWluZXIg -PSAkKCBvcHRzLmNvbnRhaW5lcl9pZCApOwkvLyBzaG91bGQgZmFpbCBpZiBjb250YWluZXIgZG9l -c24ndCBleGlzdC4uLgoJCWlmKCBvcHRzLmhhc093blByb3BlcnR5KCdzaG93X2NvbXBsaWFuY2Un -KSApCgkJewoJCQl0aGlzLnNob3dfY29tcGxpYW5jZSA9IG9wdHMuc2hvd19jb21wbGlhbmNlOwoJ -CX0KCQlpZiggb3B0cy5sYWJlbHMgKQoJCXsKCQkJdGhpcy5sYWJlbHMgPSBvcHRzLmxhYmVsczsK -CQl9Cgl9LAoKCWV4ZWN1dGU6IGZ1bmN0aW9uKCkgewoJCS8vIHByb2dyZXNzLWJhcgoKCQl0aGlz -LmNvbnRhaW5lci5pbnNlcnQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVw -b3J0X3Byb2dyZXNzX2JhcicsICdpZCc6IHRoaXMucHJlZml4ICsgIl9wcm9ncmVzc19iYXIiIH0g -KSApOwkKCgkJdmFyIGN1cnJlbnRfZ3JvdXBpbmcgPSBudWxsOwkvLyBtaWdodCBub3QgYmUgc2V0 -IGluIHRoZSByZXR1cm5lZCB2YWx1ZSBidXQgdGhhdCdzIGFsbG93ZWQvT0sKCgkJdmFyIGRhdGFv -YmpzID0ge307CgkJdmFyIGdyb3VwZWQgPSBmYWxzZTsKCQl2YXIgc2Vlbl9pZHMgPSB7fTsKCQl0 -aGlzLm5vX2l0ZW1zID0gdGhpcy5pZHMubGVuZ3RoOwoJCXRoaXMucmV0cmlldmVkID0gW107CgkJ -aWYoICFpc0ludGVnZXIodGhpcy5pZHNbMF0pICkgLy9pZHMgaGF2ZSBiZWVuIGdyb3VwZWQKCQl7 -CQoJCQlncm91cGVkID0gdHJ1ZTsKCQkJdGhpcy5ncm91cGVkX2lkcyA9IHRoaXMuaWRzOwoJCQl0 -aGlzLmlkcyA9IFtdOwoJCQlmb3IoIHZhciBpID0gMDsgaSA8IHRoaXMuZ3JvdXBlZF9pZHMubGVu -Z3RoOyBpKysgKQoJCQl7CgkJCQl0aGlzLmlkcyA9IHRoaXMuaWRzLmNvbmNhdCh0aGlzLmdyb3Vw -ZWRfaWRzW2ldLmxpc3QpOwoJCQl9CgkJCS8vdGhlIGdyb3VwaW5nIG1heSBoYXZlIGNyZWF0ZWQg -ZHVwbGljYXRlIHJlY29yZHMgKGkuZS4gYSByZWNvcmQgY2FuIGFwcGVhciBpbiBtb3JlIHRoYW4g -b25lIGdyb3VwKSAtIGl0J3MgaGFuZHkgdG8gaGF2ZSBhbiBhcnJheSBvZiBhbGwgdGhlIHVuaXF1 -ZSByZWNvcmRzCgkJCXRoaXMudW5pcXVlID0gdGhpcy5pZHMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0s -IGksIGFyKXsgcmV0dXJuIGFyLmluZGV4T2YoaXRlbSkgPT09IGk7IH0pOwoJCQl0aGlzLm5vX2l0 -ZW1zID0gdGhpcy51bmlxdWUubGVuZ3RoOwoJCX0KCQlmb3IodmFyIGkgPSAwOyBpIDwgdGhpcy5p -ZHMubGVuZ3RoOyBpKz10aGlzLnN0ZXApCgkJewoJCQkvLyBhcmd1bWVudHMgZm9yIEFqYXggcXVl -cnkgQU5EIGNyZWF0ZXMgdGhlIEhUTUwgcGxhY2Vob2xkZXJzIDxkaXY+J3MgKHRoYXQgd2lsbCBy -ZWNlaXZlIHRoZSBjb250ZW50IG9mIHRoZSBBamF4IHF1ZXJ5Li4uKQkJCQkKCQkJdmFyIGFyZ3Mg -PSAnJmFqYXg9Jyt0aGlzLnByZWZpeDsKCQkJZm9yKHZhciBqID0gMDsgaiA8IHRoaXMuc3RlcCAm -JiBpK2ogPCB0aGlzLmlkcy5sZW5ndGg7IGorKykKCQkJewoJCQkJYXJncyArPSAnJicgKyB0aGlz -LnByZWZpeCArICc9JyArIHRoaXMuaWRzW2kral07CgkJCQl2YXIgaWQgPSB0aGlzLnByZWZpeCAr -ICdfJyArIHRoaXMuaWRzW2kral07CgkJCQl2YXIgdGFyZ2V0X2VsID0gJCggaWQgKTsKCQkJCWlm -KCB0YXJnZXRfZWwgIT0gbnVsbCApCgkJCQl7CgkJCQkJLy9zdG9yZSBhIHJlY29yZCBvZiB0aGlz -IGluIHNlZW5faWRzIHRvIGVuc3VyZSBlYWNoIHBsYWNlaG9sZGVyIGhhcyBhIHVuaXF1ZSBpZAoJ -CQkJCWlmKCAhKGlkIGluIHNlZW5faWRzKSApCgkJCQkJewoJCQkJCQlzZWVuX2lkc1tpZF0gPSAx -OwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzZWVuX2lkc1tpZF0gPSBzZWVuX2lkc1tp -ZF0gKyAxOwoJCQkJCX0KCQkJCQlpZCA9IGlkICsgIl8iICsgc2Vlbl9pZHNbaWRdOwoJCQkJfQoJ -CQkJCQoJCQkJdGhpcy5jb250YWluZXIuaW5zZXJ0KCBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2Ns -YXNzJzogJ2VwX3JlcG9ydF9yb3cnLCAnaWQnOiBpZCwgJ3Bvc2l0aW9uJzogaStqIH0gKSwgeyAn -cG9zaXRpb24nOiAnYWZ0ZXInIH0gKTsKCQkJfQoJCQluZXcgQWpheC5SZXF1ZXN0KCB0aGlzLnVy -bCwgewoJCQkJbWV0aG9kOiAnZ2V0JywKCQkJCXBhcmFtZXRlcnM6IHRoaXMucGFyYW1ldGVycyAr -IGFyZ3MsCgkJCQlvblN1Y2Nlc3M6IChmdW5jdGlvbih0cmFuc3BvcnQpIHsKCgkJCQkJdmFyIGpz -b24gPSB0cmFuc3BvcnQucmVzcG9uc2VUZXh0LmV2YWxKU09OKCk7CgkJCQkJdmFyIGRhdGEgPSBq -c29uLmRhdGE7CgkKCQkJCQlpZiggZGF0YSA9PSBudWxsICkKCQkJCQkJZGF0YSA9IG5ldyBBcnJh -eSgpOwoJCQkJCWZvciggdmFyIGk9MDsgaTxkYXRhLmxlbmd0aDsgaSsrICkKCQkJCQl7CgkJCQkJ -CXZhciBlbnRyeSA9IGRhdGFbaV07CgkJCQkKCQkJCQkJLy8gZW50cnkuZGF0YW9iamlkCgkJCQkJ -CS8vIGVudHJ5LnN1bW1hcnkKCQkJCQkJLy8gZW50cnkuZ3JvdXBpbmcKCQkJCQkJLy8gZW50cnku -cHJvYmxlbXMKCgkJCQkJCWlmKCBlbnRyeSA9PSBudWxsICkKCQkJCQkJCWNvbnRpbnVlOwoJCQkJ -CQkKCQkJCQkJdmFyIGRhdGFvYmppZCA9IGVudHJ5LmRhdGFvYmppZDsKCQkJCQkJaWYoIGRhdGFv -YmppZCA9PSBudWxsICkKCQkJCQkJCWNvbnRpbnVlOwoJCQkJCQlpZiggIShkYXRhb2JqaWQgaW4g -ZGF0YW9ianMpICkKCQkJCQkJewoJCQkJCQkJdGhpcy5jb3VudCsrOwoJCQkJCQkJZGF0YW9ianNb -ZGF0YW9iamlkXSA9IGVudHJ5OwoJCQkJCQl9CgkJCQkJfQoJCQkKCQkJCQkvLyB3ZSd2ZSByZXRy -aWV2ZWQgYWxsIHRoZSByZWNvcmRzCQkJCQoJCQkJCWlmKCB0aGlzLmNvdW50ID09IHRoaXMubm9f -aXRlbXMgKQoJCQkJCXsKCQkJCQkJJCggdGhpcy5wcmVmaXggKyAnX3Byb2dyZXNzX2JhcicgKS5y -ZW1vdmUoKTsKCQkJCQkJaWYoIHRoaXMuaGFzX3Byb2JsZW1zICkKCQkJCQkJCXRoaXMub25Qcm9i -bGVtcyh0aGlzKTsKCQkJCQkJdGhpcy5vbkZpbmlzaCh0aGlzKTsKCQkJCQkJCQoJCQkJCQkvL2Fk -ZCB0aGUgZ3JvdXAgaGVhZGluZ3MKCQkJCQkJaWYoZ3JvdXBlZCkKCQkJCQkJewoJCQkJCQkJdmFy -IHBvc2l0aW9uID0gMDsKCQkJCQkJCWZvciggdmFyIGkgPSAwOyBpIDwgdGhpcy5ncm91cGVkX2lk -cy5sZW5ndGg7IGkrKyApCgkJCQkgICAgICAgICAgICAgICAgICAgICAgICB7CQoJCQkJCQkJCXZh -ciB0YXJnZXRfZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbcG9zaXRpb249IicgKyBw -b3NpdGlvbiArICciXScpWzBdOwoJCQkJCQkJCXBvc2l0aW9uID0gcG9zaXRpb24gKyB0aGlzLmdy -b3VwZWRfaWRzW2ldLmxpc3QubGVuZ3RoOwkJCQoJCQkJCQkJCXZhciBncm91cGluZ19jb250YWlu -ZXIgPSBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9ncm91cGluZycg -fSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgdGFyZ2V0X2VsLmluc2VydCggeyAnYmVmb3JlJyA6IGdyb3VwaW5nX2NvbnRh -aW5lciB9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIH0pOwp9OwoKCnZhciBvbkZvcm1TZWxlY3QgPSBmdW5jdGlvbigpewogICAgLy9nZXQgZm9y +bSBpZAogICAgdmFyIGZvcm1pZCA9IHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLmdl +dEF0dHJpYnV0ZSgnZm9ybScpOwogICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxl +bWVudEJ5SWQoImZvcm1fY29udGFpbmVyIik7CiAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7 +CiAgICBjb25zdCBjbG9uZSA9ICQoZm9ybWlkKS5jb250ZW50LmNsb25lTm9kZSh0cnVlKTsKICAg +IGNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZSk7Cn07CgovLyBVc2VkIGJ5IHRoZSBTY3JlZW46 +OlJlcG9ydDo6cmVuZGVyIG1ldGhvZAoKdmFyIEVQcmludHNfU2NyZWVuX1JlcG9ydF9Mb2FkZXIg +PSBDbGFzcy5jcmVhdGUoewogICAgaGFzX3Byb2JsZW1zOiAwLAogICAgY291bnQ6IDAsCiAgICBy +dW5zOiAwLAogICAgcHJvZ3Jlc3M6IG51bGwsCiAgICBpZHM6IEFycmF5KCksCiAgICBzZWVuX2lk +czoge30sCiAgICBzdGVwOiAyMCwKICAgIGJhdGNoOiAwLAogICAgZ3JvdXBlZDogZmFsc2UsCiAg +ICBwcmVmaXg6ICcnLAogICAgb25Qcm9ibGVtczogZnVuY3Rpb24oKSB7fSwKICAgIG9uRmluaXNo +OiBmdW5jdGlvbigpIHt9LAogICAgdXJsOiAiIiwKICAgIHBhcmFtZXRlcnM6ICIiLAogICAgY29u +dGFpbmVyOiBudWxsLAogICAgc2hvd19jb21wbGlhbmNlOiAxLCAKCiAgICAvLyB0byBzaG93IGEg +cHJldHR5IHByb2dyZXNzIGJhciAoJSBjb21wbGlhbmNlKToKICAgIHRvdGFsX2RhdGFvYmpzOiAw +LAogICAgdG90YWxfbm9uY29tcGxpYW50OiAwLAoKCiAgICBpbml0aWFsaXplOiBmdW5jdGlvbihv +cHRzKSB7CiAgICAgICAgaWYoIG9wdHMuaWRzICkKICAgICAgICAgICAgdGhpcy5pZHMgPSBvcHRz +LmlkczsKICAgICAgICBpZiggb3B0cy5zdGVwICkKICAgICAgICAgICAgdGhpcy5zdGVwID0gb3B0 +cy5zdGVwOwogICAgICAgIGlmKCBvcHRzLnByZWZpeCApCiAgICAgICAgICAgIHRoaXMucHJlZml4 +ID0gb3B0cy5wcmVmaXg7CiAgICAgICAgaWYoIG9wdHMub25GaW5pc2ggKQogICAgICAgICAgICB0 +aGlzLm9uRmluaXNoID0gb3B0cy5vbkZpbmlzaDsKICAgICAgICBpZiggb3B0cy5vblByb2JsZW1z +ICkKICAgICAgICAgICAgdGhpcy5vblByb2JsZW1zID0gb3B0cy5vblByb2JsZW1zOwogICAgICAg +IGlmKCBvcHRzLnVybCApCiAgICAgICAgewogICAgICAgICAgICB0aGlzLnVybCA9IG9wdHMudXJs +OwogICAgICAgIH0KICAgICAgICBpZiggb3B0cy5wYXJhbWV0ZXJzICkKICAgICAgICAgICAgdGhp +cy5wYXJhbWV0ZXJzID0gb3B0cy5wYXJhbWV0ZXJzOwogICAgICAgIGlmKCBvcHRzLmNvbnRhaW5l +cl9pZCApCiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gJCggb3B0cy5jb250YWluZXJfaWQg +KTsgICAgLy8gc2hvdWxkIGZhaWwgaWYgY29udGFpbmVyIGRvZXNuJ3QgZXhpc3QuLi4KICAgICAg +ICBpZiggb3B0cy5oYXNPd25Qcm9wZXJ0eSgnc2hvd19jb21wbGlhbmNlJykgKQogICAgICAgIHsK +ICAgICAgICAgICAgdGhpcy5zaG93X2NvbXBsaWFuY2UgPSBvcHRzLnNob3dfY29tcGxpYW5jZTsK +ICAgICAgICB9CiAgICAgICAgaWYoIG9wdHMubGFiZWxzICkKICAgICAgICB7CiAgICAgICAgICAg +IHRoaXMubGFiZWxzID0gb3B0cy5sYWJlbHM7CiAgICAgICAgfQogICAgfSwKCiAgICAvLyBicmVh +ayBkb3duIHRoZSByZXF1ZXN0cyBpbnRvIGJhdGNoZXMgYXMgZGVmaW5lZCBieSB0aGUgc3RlcCBz +aXplCiAgICAvLyBkb24ndCBtb3ZlIG9uIHRvIHRoZSBuZXh0IGJhdGNoIHVudGlsIHdlJ3ZlIGhh +bmRsZWQgdGhlIHByZXZpb3VzIG9uZQogICAgcnVuQmF0Y2g6IGZ1bmN0aW9uKCkgewogICAgCiAg +ICAgICAgdmFyIGRhdGFvYmpzID0ge307CgogICAgICAgIHZhciBpID0gdGhpcy5iYXRjaCAqIHRo +aXMuc3RlcDsKICAgICAgICAKICAgICAgICAvLyBhcmd1bWVudHMgZm9yIEFqYXggcXVlcnkgQU5E +IGNyZWF0ZXMgdGhlIEhUTUwgcGxhY2Vob2xkZXJzIDxkaXY+J3MgKHRoYXQgd2lsbCByZWNlaXZl +IHRoZSBjb250ZW50IG9mIHRoZSBBamF4IHF1ZXJ5Li4uKSAgICAgICAgICAgICAgCiAgICAgICAg +dmFyIGFyZ3MgPSAnJmFqYXg9Jyt0aGlzLnByZWZpeAoKICAgICAgICAvLyBidWlsZCB1cCBvdXIg +cmVxdWVzdCBmb3IgdGhpcyBzdGVwJ3MgcmVzdWx0cwogICAgICAgIGZvcih2YXIgaiA9IDA7IGog +PCB0aGlzLnN0ZXAgJiYgaStqIDwgdGhpcy5pZHMubGVuZ3RoOyBqKyspCiAgICAgICAgewogICAg +ICAgICAgICBhcmdzICs9ICcmJyArIHRoaXMucHJlZml4ICsgJz0nICsgdGhpcy5pZHNbaStqXTsK +ICAgICAgICAgICAgdmFyIGlkID0gdGhpcy5wcmVmaXggKyAnXycgKyB0aGlzLmlkc1tpK2pdOwog +ICAgICAgICAgICB2YXIgdGFyZ2V0X2VsID0gJCggaWQgKTsKICAgICAgICAgICAgaWYoIHRhcmdl +dF9lbCAhPSBudWxsICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy9zdG9yZSBhIHJl +Y29yZCBvZiB0aGlzIGluIHNlZW5faWRzIHRvIGVuc3VyZSBlYWNoIHBsYWNlaG9sZGVyIGhhcyBh +IHVuaXF1ZSBpZAogICAgICAgICAgICAgICAgaWYoICEoaWQgaW4gdGhpcy5zZWVuX2lkcykgKQog +ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vlbl9pZHNbaWRdID0g +MTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAg +IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZW5faWRzW2lkXSA9IHRoaXMuc2Vlbl9pZHNb +aWRdICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlkID0gaWQgKyAiXyIg +KyB0aGlzLnNlZW5faWRzW2lkXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAg +ICAgLy8gc2V0IHVwIGFuIGVsZW1lbnQgZm9yIHRoaXMgcmVzdWx0ICAgICAgICAKICAgICAgICAg +ICAgdGhpcy5jb250YWluZXIuaW5zZXJ0KCBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzog +J2VwX3JlcG9ydF9yb3cnLCAnaWQnOiBpZCwgJ3Bvc2l0aW9uJzogaStqIH0gKSwgeyAncG9zaXRp +b24nOiAnYWZ0ZXInIH0gKTsKICAgICAgICB9CgogICAgICAgIG5ldyBBamF4LlJlcXVlc3QoIHRo +aXMudXJsLCB7CiAgICAgICAgICAgIG1ldGhvZDogJ2dldCcsCiAgICAgICAgICAgIHBhcmFtZXRl +cnM6IHRoaXMucGFyYW1ldGVycyArIGFyZ3MsCiAgICAgICAgICAgIG9uU3VjY2VzczogKGZ1bmN0 +aW9uKHRyYW5zcG9ydCkgewoKICAgICAgICAgICAgICAgIC8vIHdlIGdvdCBvdXIgcmVwb3J0IGRh +dGEgYmFjayBmcm9tIHRoZSBwbHVnaW4KICAgICAgICAgICAgICAgIHZhciBqc29uID0gdHJhbnNw +b3J0LnJlc3BvbnNlVGV4dC5ldmFsSlNPTigpOwogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBq +c29uLmRhdGE7CiAgICAgICAgICAgICAgICBpZiggZGF0YSA9PSBudWxsICkKICAgICAgICAgICAg +ICAgIHsKICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmV3IEFycmF5KCk7CiAgICAgICAgICAg +ICAgICB9CiAgICAgICAgCiAgICAgICAgICAgICAgICBmb3IoIHZhciBuID0gMDsgbiA8IGRhdGEu +bGVuZ3RoOyBuKysgKQogICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgCiAg +ICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gZGF0YVtuXTsKICAgICAgICAKICAgICAgICAg +ICAgICAgICAgICAvLyBubyBlbnRyeSAtIGF3a3dhcmQgICAgICAgIAogICAgICAgICAgICAgICAg +ICAgIGlmKCBlbnRyeSA9PSBudWxsICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAg +ICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAg +ICAgICAgICAgLy8gbm8gZGF0YW9iaiBpZCAtIGFsc28gYXdrd2FyZAogICAgICAgICAgICAgICAg +ICAgIHZhciBkYXRhb2JqaWQgPSBlbnRyeS5kYXRhb2JqaWQ7CiAgICAgICAgICAgICAgICAgICAg +aWYoIGRhdGFvYmppZCA9PSBudWxsICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAg +ICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAg +ICAgICAgICAgLy8gd2UgaGF2ZSBhIGRhdGFvYmosIGxldCdzIHJlY29yZCBpdC4uLgogICAgICAg +ICAgICAgICAgICAgIGlmKCAhKGRhdGFvYmppZCBpbiBkYXRhb2JqcykgKQogICAgICAgICAgICAg +ICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCsrOwogICAgICAgICAg +ICAgICAgICAgICAgICBkYXRhb2Jqc1tkYXRhb2JqaWRdID0gZW50cnk7CiAgICAgICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vYWRkIHRoZSBlcHJp +bnQgc3VtbWFyaWVzIGZvciB0aGlzIHN0ZXAKICAgICAgICAgICAgICAgIHZhciBhZGRlZF9pZHMg +PSB7fTsgCgogICAgICAgICAgICAgICAgLy9mb3IoIHZhciBjID0gdGhpcy5iYXRjaCAqIHRoaXMu +c3RlcDsgYyA8ICh0aGlzLmJhdGNoICogdGhpcy5zdGVwKSArIHRoaXMuc3RlcDsgYysrICkKICAg +ICAgICAgICAgICAgIGZvciggdmFyIGMgPSAwOyBjIDwgdGhpcy5zdGVwICYmIGkrYyA8IHRoaXMu +aWRzLmxlbmd0aDsgYysrICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB2 +YXIgZGF0YW9iamlkID0gdGhpcy5pZHNbaStjXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZW50 +cnkgPSBkYXRhb2Jqc1tkYXRhb2JqaWRdOwoKICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIHRo +YXQgd2UgaGF2ZSBhZGRlZCB0aGlzIG9iamVjdGlkCiAgICAgICAgICAgICAgICAgICAgaWYoICEo +ZGF0YW9iamlkIGluIGFkZGVkX2lkcykgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAg +ICAgICAgICAgICAgICAgYWRkZWRfaWRzW2RhdGFvYmppZF0gPSAwOwogICAgICAgICAgICAgICAg +ICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAg +ICAgICAgICAgICAgICAgICAgICBhZGRlZF9pZHNbZGF0YW9iamlkXSA9IGFkZGVkX2lkc1tkYXRh +b2JqaWRdICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhp +cy50b3RhbF9kYXRhb2JqcysrOwoKICAgICAgICAgICAgICAgICAgICB2YXIgc3VtbWFyeSA9IGVu +dHJ5LnN1bW1hcnk7CgogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRfaWQgPSB0aGlzLnBy +ZWZpeCArICdfJyArIGRhdGFvYmppZDsKICAgICAgICAgICAgICAgICAgICBpZiggYWRkZWRfaWRz +W2RhdGFvYmppZF0gPiAwICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAg +ICAgICAgIHRhcmdldF9pZCA9IHRhcmdldF9pZCArICdfJyArIGFkZGVkX2lkc1tkYXRhb2JqaWRd +OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0X2Vs +ID0gJCggdGFyZ2V0X2lkICk7CgogICAgICAgICAgICAgICAgICAgIGlmKCB0YXJnZXRfZWwgIT0g +bnVsbCAmJiBzdW1tYXJ5ICE9IG51bGwgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAg +ICAgICAgICAgICAgICAgdmFyIHN1bW1hcnlfZWwgPSB0YXJnZXRfZWwuYXBwZW5kQ2hpbGQoIG5l +dyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X3Jvd19zdW1tYXJ5JyB9ICkg +KTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeV9lbC51cGRhdGUoIHN1bW1hcnkgKTsK +CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdG90YWwgdXAgbm9uIGNvbXBsaWFudCByZWNvcmRz +CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlbnRyeS5pc19jb21wbGlhbnQgPT0gbnVsbCAm +JiBlbnRyeS5wcm9ibGVtcyAmJiBlbnRyeS5wcm9ibGVtcy5sZW5ndGggKQogICAgICAgICAgICAg +ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsX25vbmNv +bXBsaWFudCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAg +ICAgICAgLy9hZGQgc3VwcG9ydCBmb3IgY29tcGxpYW50IGl0ZW1zIHRvIGluY2x1ZGUgYnVsbGV0 +IHBvaW50cyB0b28KICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVudHJ5LmJ1bGxldHMgJiYg +ZW50cnkuYnVsbGV0cy5sZW5ndGggKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICB2YXIgYnVsbGV0c19lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGls +ZCggbmV3IEVsZW1lbnQoICd1bCcsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9yb3dfYnVsbGV0cycg +fSApICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB2YXIgYiA9IDA7IGIgPCBl +bnRyeS5idWxsZXRzLmxlbmd0aDsgYisrICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsK +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGkgPSBidWxsZXRzX2VsLmFwcGVu +ZENoaWxkKCBuZXcgRWxlbWVudCggJ2xpJyApKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBsaS51cGRhdGUoIGVudHJ5LmJ1bGxldHNbYl0gKTsKICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAg +ICAgaWYoIGVudHJ5LnByb2JsZW1zICYmIGVudHJ5LnByb2JsZW1zLmxlbmd0aCApCiAgICAgICAg +ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwcm9ibGVt +c19lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGlsZCggbmV3IEVsZW1lbnQoICd1bCcsIHsgJ2NsYXNz +JzogJ2VwX3JlcG9ydF9yb3dfcHJvYmxlbXMnIH0gKSApOwoKICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIGZvciggdmFyIHAgPSAwOyBwIDwgZW50cnkucHJvYmxlbXMubGVuZ3RoOyBwKysgKQog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIHZhciBsaSA9IHByb2JsZW1zX2VsLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ2xpJyAp +KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS51cGRhdGUoIGVudHJ5LnByb2Js +ZW1zW3BdICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAg +ICAgICAgICAvL2Rpc3BsYXkgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0g +bmV3IFJlZ0V4cCgiXiMoPzpbMC05YS1mQS1GXXszfSl7MSwyfSQiKTsKICAgICAgICAgICAgICAg +ICAgICAgICAgaWYoIGVudHJ5LnN0YXRlICYmIHJlLnRlc3QoZW50cnkuc3RhdGUpICkKICAgICAg +ICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2Vs +LnN0eWxlLmJvcmRlckxlZnRXaWR0aCA9ICc3cHgnOwogICAgICAgICAgICAgICAgICAgICAgICAg +ICAgdGFyZ2V0X2VsLnN0eWxlLmJvcmRlckxlZnRTdHlsZSA9ICdzb2xpZCc7CiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICB0YXJnZXRfZWwuc3R5bGUuYm9yZGVyTGVmdENvbG9yID0gZW50cnku +c3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAg +ZWxzZSAvL25vIHN0YXRlIHByb3ZpZGVkLCBzbyBkZXJpdmUgb25lIGZyb20gZXhpc3RlbmNlIG9m +IHByb2JsZW1zCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIGlmKCBlbnRyeS5wcm9ibGVtcyAmJiBlbnRyeS5wcm9ibGVtcy5sZW5ndGggKQogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +IHRhcmdldF9lbC5hZGRDbGFzc05hbWUoICdlcF9yZXBvcnRfcm93X3Byb2JsZW1zJyApOwogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxz +ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIHRhcmdldF9lbC5hZGRDbGFzc05hbWUoICdlcF9yZXBvcnRfcm93X29rJyApOwogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm +KCAhdGhpcy5zaG93X2NvbXBsaWFuY2UgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9lbC5hZGRDbGFzc05hbWUoICdl +cF9yZXBvcnRfcm93X25vX2NvbXBsaWFuY2UnICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9lbC5zaG93KCk7CgogICAgICAgICAg +ICAgICAgICAgICAgICB2YXIgZ3JvdXBpbmcgPSBlbnRyeS5ncm91cGluZzsKICAgICAgICAgICAg +ICAgICAgICAgICAgaWYoIGdyb3VwaW5nICE9IG51bGwgKQogICAgICAgICAgICAgICAgICAgICAg +ICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3VycmVudF9ncm91cGluZyA9PSBu +dWxsIHx8IGN1cnJlbnRfZ3JvdXBpbmcgIT0gZ3JvdXBpbmcpCiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9ncm91cGlu +ZyA9IGdyb3VwaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncm91cGlu +Z19jb250YWluZXIgPSBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9n +cm91cGluZycgfSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9lbC5p +bnNlcnQoIHsgJ2JlZm9yZScgOiBncm91cGluZ19jb250YWluZXIgfSApOwogICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIGdyb3VwaW5nX2NvbnRhaW5lci51cGRhdGUoIGN1cnJlbnRfZ3Jv +dXBpbmcgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAg +ICAgIAogICAgICAgICAgICAgICAgLy8gd2UndmUgcmV0cmlldmVkIGFsbCB0aGUgcmVjb3JkcyAt +IHRoaXMgaXMgdGhlIGZpbmFsIHN0ZXAgc28gdGlkeSB0aGluZ3MgdXAKICAgICAgICAgICAgICAg +IGlmKCB0aGlzLmNvdW50ID09IHRoaXMubm9faXRlbXMgKQogICAgICAgICAgICAgICAgewogICAg +ICAgICAgICAgICAgICAgICQoIHRoaXMucHJlZml4ICsgJ19wcm9ncmVzc19iYXInICkucmVtb3Zl +KCk7CiAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMuaGFzX3Byb2JsZW1zICkKICAgICAgICAg +ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Qcm9ibGVtcyh0aGlz +KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbmlz +aCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAg +IC8vYWRkIHRoZSBncm91cCBoZWFkaW5ncwogICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZ3Jv +dXBlZCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBw +b3NpdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciggdmFyIG0gPSAwOyBtIDwg +dGhpcy5ncm91cGVkX2lkcy5sZW5ndGg7IG0rKyApCiAgICAgICAgICAgICAgICAgICAgICAgIHsg +ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXRfZWwgPSBkb2N1bWVudC5x +dWVyeVNlbGVjdG9yQWxsKCdbcG9zaXRpb249IicgKyBwb3NpdGlvbiArICciXScpWzBdOwogICAg +ICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIHRoaXMuZ3JvdXBl +ZF9pZHNbbV0ubGlzdC5sZW5ndGg7ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBn +cm91cGluZ19jb250YWluZXIgPSBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3Jl +cG9ydF9ncm91cGluZycgfSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2Vs +Lmluc2VydCggeyAnYmVmb3JlJyA6IGdyb3VwaW5nX2NvbnRhaW5lciB9ICk7CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICBncm91cGluZ19jb250YWluZXIudXBkYXRlKCB0aGlzLmdyb3VwZWRf -aWRzW2ldLmxhYmVsICk7CgkJCQkgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJCX0KCgkJ -CQkJCS8vYWRkIHRoZSBlcHJpbnQgc3VtbWFyaWVzCgkJCQkJCXZhciBhZGRlZF9pZHMgPSB7fTsK -CQkJCQkJZm9yKCB2YXIgYyA9IDA7IGMgPCB0aGlzLmlkcy5sZW5ndGg7IGMrKyApCgkJCQkJCXsK -CQkJCQkJCXZhciBkYXRhb2JqaWQgPSB0aGlzLmlkc1tjXTsKCQkJCQkJCXZhciBlbnRyeSA9IGRh -dGFvYmpzW2RhdGFvYmppZF07CgoJCQkJCQkJLy9zdG9yZSB0aGF0IHdlIGhhdmUgYWRkZWQgdGhp -cyBvYmplY3RpZAoJCQkJCQkJaWYoICEoZGF0YW9iamlkIGluIGFkZGVkX2lkcykgKQoJCQkJCQkJ -ewoJCQkJCQkJCWFkZGVkX2lkc1tkYXRhb2JqaWRdID0gMDsKCQkJCQkJCX0KCQkJCQkJCWVsc2UK -CQkJCQkJCXsKCQkJCQkJCQlhZGRlZF9pZHNbZGF0YW9iamlkXSA9IGFkZGVkX2lkc1tkYXRhb2Jq -aWRdICsgMTsKCQkJCQkJCX0KCQkJCQkJCXRoaXMudG90YWxfZGF0YW9ianMrKzsKCgkJCQkJCQl2 -YXIgc3VtbWFyeSA9IGVudHJ5LnN1bW1hcnk7CgoJCQkJCQkJdmFyIHRhcmdldF9pZCA9IHRoaXMu -cHJlZml4ICsgJ18nICsgZGF0YW9iamlkOwoJCQkJCQkJaWYoIGFkZGVkX2lkc1tkYXRhb2JqaWRd -ID4gMCApCgkJCQkJCQl7CgkJCQkJCQkJdGFyZ2V0X2lkID0gdGFyZ2V0X2lkICsgJ18nICsgYWRk -ZWRfaWRzW2RhdGFvYmppZF07CgkJCQkJCQl9CgkJCQkJCQl2YXIgdGFyZ2V0X2VsID0gJCggdGFy -Z2V0X2lkICk7CgoJCQkJCQkJaWYoIHRhcmdldF9lbCAhPSBudWxsICYmIHN1bW1hcnkgIT0gbnVs -bCApCgkJCQkJCQl7CgkJCQkJCQkJdmFyIHN1bW1hcnlfZWwgPSB0YXJnZXRfZWwuYXBwZW5kQ2hp -bGQoIG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X3Jvd19zdW1tYXJ5 -JyB9ICkgKTsKCQkJCQkJCQlzdW1tYXJ5X2VsLnVwZGF0ZSggc3VtbWFyeSApOwoKCQkJCQkJCQkv -L3RvdGFsIHVwIG5vbiBjb21wbGlhbnQgcmVjb3JkcwoJCQkJCQkJCWlmKCBlbnRyeS5pc19jb21w -bGlhbnQgPT0gbnVsbCAmJiBlbnRyeS5wcm9ibGVtcyAmJiBlbnRyeS5wcm9ibGVtcy5sZW5ndGgg -KQoJCQkJCQkJCXsKCQkJCQkJCQkJdGhpcy50b3RhbF9ub25jb21wbGlhbnQrKzsKCQkJCQkJCQl9 -CgkJCQkJCQkJCgkJCQkJCQkJaWYoIGVudHJ5LnByb2JsZW1zICYmIGVudHJ5LnByb2JsZW1zLmxl -bmd0aCApCgkJCQkJCQkJewoJCQkJCQkJCQl2YXIgcHJvYmxlbXNfZWwgPSB0YXJnZXRfZWwuYXBw -ZW5kQ2hpbGQoIG5ldyBFbGVtZW50KCAndWwnLCB7ICdjbGFzcyc6ICdlcF9yZXBvcnRfcm93X3By -b2JsZW1zJyB9ICkgKTsKCgkJCQkJCQkJCWZvciggdmFyIHA9MDsgcDwgZW50cnkucHJvYmxlbXMu -bGVuZ3RoOyBwKysgKQoJCQkJCQkJCQl7CgkJCQkJCQkJCQl2YXIgbGkgPSBwcm9ibGVtc19lbC5h -cHBlbmRDaGlsZCggbmV3IEVsZW1lbnQoICdsaScgKSk7CgkJCQkJCQkJCQlsaS51cGRhdGUoIGVu -dHJ5LnByb2JsZW1zW3BdICk7CgkJCQkJCQkJCX0JCQkJCQkJCQoJCQkJCQkJCX0KCQkJCQkJCQll -bHNlCgkJCQkJCQkJewoJCQkJCQkJCQkvL2FkZCBzdXBwb3J0IGZvciBjb21wbGlhbnQgaXRlbXMg -dG8gaW5jbHVkZSBidWxsZXQgcG9pbnRzIHRvbwoJCQkJCQkJCQlpZiggZW50cnkuYnVsbGV0cyAm -JiBlbnRyeS5idWxsZXRzLmxlbmd0aCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICB2YXIgYnVsbGV0c19lbCA9IHRhcmdldF9lbC5hcHBlbmRDaGlsZCggbmV3IEVsZW1l -bnQoICd1bCcsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9yb3dfYnVsbGV0cycgfSApICk7CgogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgIGZvciggdmFyIGI9MDsgYjwgZW50cnkuYnVsbGV0cy5sZW5ndGg7 -IGIrKyApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgdmFyIGxpID0gYnVsbGV0c19lbC5hcHBlbmRDaGlsZCggbmV3IEVsZW1lbnQoICdsaScg -KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaS51cGRhdGUoIGVudHJ5LmJ1bGxl -dHNbYl0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCQkJ -CQl9CgoJCQkJCQkJCS8vZGlzcGxheSBzdGF0ZQoJCQkJCQkJCXZhciByZSA9IG5ldyBSZWdFeHAo -Il4jKD86WzAtOWEtZkEtRl17M30pezEsMn0kIik7CgkJCQkJCQkJaWYoIGVudHJ5LnN0YXRlICYm -IHJlLnRlc3QoZW50cnkuc3RhdGUpICkKCQkJCQkJCQl7CgkJCQkJCQkJCXRhcmdldF9lbC5zdHls -ZS5ib3JkZXJMZWZ0V2lkdGggPSAnN3B4JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2VsLnN0eWxl -LmJvcmRlckxlZnRTdHlsZSA9ICdzb2xpZCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9lbC5zdHls -ZS5ib3JkZXJMZWZ0Q29sb3IgPSBlbnRyeS5zdGF0ZTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZSAv -L25vIHN0YXRlIHByb3ZpZGVkLCBzbyBkZXJpdmUgb25lIGZyb20gZXhpc3RlbmNlIG9mIHByb2Js -ZW1zCgkJCQkJCQkJewoJCQkJCQkJCQlpZiggZW50cnkucHJvYmxlbXMgJiYgZW50cnkucHJvYmxl -bXMubGVuZ3RoICkKCQkJCQkJCQkJewoJCQkJCQkJCQkJdGFyZ2V0X2VsLmFkZENsYXNzTmFtZSgg -J2VwX3JlcG9ydF9yb3dfcHJvYmxlbXMnICk7CgkJCQkJCQkJCX0KCQkJCQkJCQkJZWxzZQoJCQkJ -CQkJCQl7CgkJCQkJCQkJCQl0YXJnZXRfZWwuYWRkQ2xhc3NOYW1lKCAnZXBfcmVwb3J0X3Jvd19v -aycgKTsKCQkJCQkJCQkJfQoKCQkJCQkJCQkJaWYoICF0aGlzLnNob3dfY29tcGxpYW5jZSApCgkJ -CQkJCQkJCXsKCQkJCQkJCQkJCXRhcmdldF9lbC5hZGRDbGFzc05hbWUoICdlcF9yZXBvcnRfcm93 -X25vX2NvbXBsaWFuY2UnICk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CQkJCQkJCQkKCQkJCQkJCQl0 -YXJnZXRfZWwuc2hvdygpOwoKCQkJCQkJCQl2YXIgZ3JvdXBpbmcgPSBlbnRyeS5ncm91cGluZzsK -CQkJCQkJCQlpZiggZ3JvdXBpbmcgIT0gbnVsbCApCgkJCQkJCQkJewoJCQkJCQkJCQlpZiggY3Vy -cmVudF9ncm91cGluZyA9PSBudWxsIHx8IGN1cnJlbnRfZ3JvdXBpbmcgIT0gZ3JvdXBpbmcpCgkJ -CQkJCQkJCXsKCQkJCQkJCQkJCWN1cnJlbnRfZ3JvdXBpbmcgPSBncm91cGluZzsKCQkJCQkJCQkJ -CXZhciBncm91cGluZ19jb250YWluZXIgPSBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzog -J2VwX3JlcG9ydF9ncm91cGluZycgfSApOwoJCQkJCQkJCQkJdGFyZ2V0X2VsLmluc2VydCggeyAn -YmVmb3JlJyA6IGdyb3VwaW5nX2NvbnRhaW5lciB9ICk7CgkJCQkJCQkJCQlncm91cGluZ19jb250 -YWluZXIudXBkYXRlKCBjdXJyZW50X2dyb3VwaW5nICk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJ -CQkJCQl9CgkJCQkJCX0KCgoJCQkJCQlpZiggdGhpcy50b3RhbF9kYXRhb2JqcyApCgkJCQkJCXsK -CQkJCQkJCQoJCQkJCQkJdGhpcy5jb250YWluZXIuaW5zZXJ0QmVmb3JlKCBuZXcgRWxlbWVudCgg -J2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX2NvbnRhaW5lcicsICdpZCc6 -IHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlX2NvbnRhaW5lciIgfSApLCB0aGlzLmNvbnRhaW5l -ci5maXJzdENoaWxkICk7CgkJCQkJCQkvL3NldCB1cCB0ZXh0IGNvbnRhaW5lcgoJCQkJCQkJJCgg -dGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2VfY29udGFpbmVyIiApLmFwcGVuZENoaWxkKCBuZXcg -RWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX3RleHQnLCAn -aWQnOiB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiwgIH0gKSk7CgoJCQkJCQkJLy9z -ZXQgdXAgb3V0cHV0cyBsYWJlbAoJCQkJCQkJdmFyIG91dHB1dHM7CgkJCQkJCQlpZiggdGhpcy5s -YWJlbHMgKQoJCQkJCQkJewoJCQkJCQkJCW91dHB1dHMgPSB0aGlzLmxhYmVscy5vdXRwdXRzOwoJ -CQkJCQkJfQoJCQkJCQkJZWxzZQoJCQkJCQkJewoJCQkJCQkJCW91dHB1dHMgPSAib3V0cHV0IjsK -CQkJCQkJCQlpZiggdGhpcy50b3RhbF9kYXRhb2JqcyA+IDEgKQoJCQkJCQkJCQlvdXRwdXRzID0g -b3V0cHV0cyArICJzIjsKCQkJCQkJCX0KCgkJCQkJCQlpZiggdGhpcy5zaG93X2NvbXBsaWFuY2Ug -KQoJCQkJCQkJewoJCQkJCQkJCXZhciByZWZfd2lkdGggPSAyMDA7CgkJCQkJCQkJdmFyIGNvbXBs -aWFuY2UgPSAoIHRoaXMudG90YWxfZGF0YW9ianMgLSB0aGlzLnRvdGFsX25vbmNvbXBsaWFudCAp -IC8gdGhpcy50b3RhbF9kYXRhb2JqczsKCgkJCQkJCQkJJCggdGhpcy5wcmVmaXggKyAiX2NvbXBs -aWFuY2VfY29udGFpbmVyIiApLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2Ns -YXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX3dyYXBwZXInLCAnaWQnOiB0aGlzLnByZWZpeCAr -ICJfY29tcGxpYW5jZSIsICdzdHlsZSc6ICd3aWR0aDogJytyZWZfd2lkdGggKyAncHgnIH0gKSAp -OwoKCQkJCQkJCQl2YXIgY29tcGxpYW5jZV93aWR0aCA9IE1hdGguZmxvb3IoIDIwMCAqIGNvbXBs -aWFuY2UgKTsKCQoJCQkJCQkJCSQoIHRoaXMucHJlZml4ICsgIl9jb21wbGlhbmNlIiApLmFwcGVu -ZENoaWxkKCBuZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlh -bmNlJywgJ3N0eWxlJzogJ3dpZHRoOicrY29tcGxpYW5jZV93aWR0aCArICdweCcgfSApICk7CgkK -CQkJCQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiApLnVwZGF0ZSggdGhp -cy50b3RhbF9kYXRhb2JqcyArICIgIiArIG91dHB1dHMgKyAiIC0gIiArIE1hdGguZmxvb3IoIGNv -bXBsaWFuY2UgKiAxMDAgKSArICIlIGNvbXBsaWFuY2UiKTsKCQkJCQkJCX0KCQkJCQkJCWVsc2UK -CQkJCQkJCXsKCQkJCQkJCQkkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiApLnVw -ZGF0ZSggdGhpcy50b3RhbF9kYXRhb2JqcyArICIgIiArIG91dHB1dHMgKTsKCQkJCQkJCX0KCQkJ -CQkJfQkKCgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXZhciB3aWR0aCA9IDIwMDsKCQkJ -CQkJJCggdGhpcy5wcmVmaXggKyAnX3Byb2dyZXNzX2JhcicgKS5zdHlsZS5iYWNrZ3JvdW5kUG9z -aXRpb24gPSBNYXRoLnJvdW5kKC13aWR0aCArIHdpZHRoICogdGhpcy5jb3VudCAvIHRoaXMuaWRz -Lmxlbmd0aCkgKyAicHggMHB4IjsKCQkJCQl9CgoJCQkJCWlmKCB0aGlzLnJ1bnMgPT0gMCAmJiB0 -aGlzLmNvdW50ID09IDAgKQoJCQkJCXsKCQkJCQkJdmFyIHBOb2RlID0gJCggdGhpcy5wcmVmaXgg -KyAnX3Byb2dyZXNzX2JhcicgKS5wYXJlbnROb2RlOwoJCQkJCQkkKHRoaXMucHJlZml4ICsgJ19w -cm9ncmVzc19iYXInKS5yZW1vdmUoKTsKCQkJCQkJdmFyIHNwYW4gPSBuZXcgRWxlbWVudCggJ3Nw -YW4nLCB7ICdjbGFzcyc6ICdlcF9yZWZfcmVwb3J0X2VtcHR5JyB9ICk7CgkJCQkJCXNwYW4udXBk -YXRlKCAnUmVwb3J0IGVtcHR5JyApOwoJCQkJCQlwTm9kZS5pbnNlcnQoIHNwYW4gKTsKCQkJCQl9 -CgkJCQkJdGhpcy5ydW5zKys7CgoJCQkJfSkuYmluZCh0aGlzKQoJCQl9KTsKCQl9CgkJaWYoIHRo -aXMuaWRzID09IG51bGwgfHwgdGhpcy5pZHMubGVuZ3RoID09IDAgKQoJCXsKCQkJdmFyIHBOb2Rl -ID0gJCh0aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJykucGFyZW50Tm9kZTsKCQkJJCh0aGlz -LnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJykuaGlkZSgpOwoJCQl2YXIgc3BhbiA9IG5ldyBFbGVt -ZW50KCAnc3BhbicsIHsgJ2NsYXNzJzogJ2VwX3JlZl9yZXBvcnRfZW1wdHknIH0gKTsKCQkJc3Bh -bi51cGRhdGUoICdSZXBvcnQgZW1wdHknICk7CgkJCXBOb2RlLmluc2VydCggc3BhbiApOwoJCX0K -CX0KCgp9KTsKCmZ1bmN0aW9uIGdyb3VwX3JlcG9ydChncm91cCkKewoJZG9jdW1lbnQuZ3JvdXBf -cmVwb3J0Lmdyb3VwLnZhbHVlID0gZ3JvdXA7Cglkb2N1bWVudC5ncm91cF9yZXBvcnQuc3VibWl0 -KCk7Cn0KCmZ1bmN0aW9uIHNvcnRfcmVwb3J0KHNvcnQpCnsKCWRvY3VtZW50LnNvcnRfcmVwb3J0 -LnNvcnQudmFsdWUgPSBzb3J0OwoJZG9jdW1lbnQuc29ydF9yZXBvcnQuc3VibWl0KCk7Cn0KCmZ1 -bmN0aW9uIGlzSW50ZWdlcihudW0pIHsKICByZXR1cm4gKG51bSBeIDApID09PSBudW07Cn0K +aWRzW21dLmxhYmVsICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAg +ICAgICB9CgogICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZSgg +bmV3IEVsZW1lbnQoICdkaXYnLCB7ICdjbGFzcyc6ICdlcF9yZXBvcnRfY29tcGxpYW5jZV9jb250 +YWluZXInLCAnaWQnOiB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV9jb250YWluZXIiIH0gKSwg +dGhpcy5jb250YWluZXIuZmlyc3RDaGlsZCApOwogICAgICAgICAgICAgICAgICAgIAogICAgICAg +ICAgICAgICAgICAgIC8vc2V0IHVwIHRleHQgY29udGFpbmVyCiAgICAgICAgICAgICAgICAgICAg +JCggdGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2VfY29udGFpbmVyIiApLmFwcGVuZENoaWxkKCBu +ZXcgRWxlbWVudCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX3RleHQn +LCAnaWQnOiB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiwgIH0gKSk7CgogICAgICAg +ICAgICAgICAgICAgIC8vc2V0IHVwIG91dHB1dHMgbGFiZWwKICAgICAgICAgICAgICAgICAgICB2 +YXIgb3V0cHV0czsKICAgICAgICAgICAgICAgICAgICBpZiggdGhpcy5sYWJlbHMgKQogICAgICAg +ICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cyA9IHRoaXMubGFi +ZWxzLm91dHB1dHM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVs +c2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHMg +PSAib3V0cHV0IjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRoaXMudG90YWxfZGF0YW9i +anMgPiAxICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgb3V0cHV0cyA9IG91dHB1dHMgKyAicyI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0K +ICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKCB0aGlzLnNob3df +Y29tcGxpYW5jZSApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAg +ICB2YXIgcmVmX3dpZHRoID0gMjAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29tcGxp +YW5jZSA9ICggdGhpcy50b3RhbF9kYXRhb2JqcyAtIHRoaXMudG90YWxfbm9uY29tcGxpYW50ICkg +LyB0aGlzLnRvdGFsX2RhdGFvYmpzOwoKICAgICAgICAgICAgICAgICAgICAgICAgJCggdGhpcy5w +cmVmaXggKyAiX2NvbXBsaWFuY2VfY29udGFpbmVyIiApLmFwcGVuZENoaWxkKCBuZXcgRWxlbWVu +dCggJ2RpdicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9jb21wbGlhbmNlX3dyYXBwZXInLCAnaWQn +OiB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZSIsICdzdHlsZSc6ICd3aWR0aDogJytyZWZfd2lk +dGggKyAncHgnIH0gKSApOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBsaWFuY2Vf +d2lkdGggPSBNYXRoLmZsb29yKCAyMDAgKiBjb21wbGlhbmNlICk7CiAgICAKICAgICAgICAgICAg +ICAgICAgICAgICAgJCggdGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2UiICkuYXBwZW5kQ2hpbGQo +IG5ldyBFbGVtZW50KCAnZGl2JywgeyAnY2xhc3MnOiAnZXBfcmVwb3J0X2NvbXBsaWFuY2UnLCAn +c3R5bGUnOiAnd2lkdGg6Jytjb21wbGlhbmNlX3dpZHRoICsgJ3B4JyB9ICkgKTsKICAgIAogICAg +ICAgICAgICAgICAgICAgICAgICAkKCB0aGlzLnByZWZpeCArICJfY29tcGxpYW5jZV90ZXh0IiAp +LnVwZGF0ZSggdGhpcy50b3RhbF9kYXRhb2JqcyArICIgIiArIG91dHB1dHMgKyAiIC0gIiArIE1h +dGguZmxvb3IoIGNvbXBsaWFuY2UgKiAxMDAgKSArICIlIGNvbXBsaWFuY2UiKTsKICAgICAgICAg +ICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAg +IHsKICAgICAgICAgICAgICAgICAgICAgICAgJCggdGhpcy5wcmVmaXggKyAiX2NvbXBsaWFuY2Vf +dGV4dCIgKS51cGRhdGUoIHRoaXMudG90YWxfZGF0YW9ianMgKyAiICIgKyBvdXRwdXRzICk7CiAg +ICAgICAgICAgICAgICAgICAgfQoKCgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg +ZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9n +cmVzcyBiYXIKICAgICAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSAyMDA7CiAgICAgICAgICAg +ICAgICAgICAgJCggdGhpcy5wcmVmaXggKyAnX3Byb2dyZXNzX2JhcicgKS5zdHlsZS5iYWNrZ3Jv +dW5kUG9zaXRpb24gPSBNYXRoLnJvdW5kKC13aWR0aCArIHdpZHRoICogdGhpcy5jb3VudCAvIHRo +aXMuaWRzLmxlbmd0aCkgKyAicHggMHB4IjsKCiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJ1 +biBhbm90aGVyIGJhdGNoCiAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXRjaCsrOwogICAgICAg +ICAgICAgICAgICAgIHRoaXMucnVuQmF0Y2goKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAg +ICAgICAgICAvLyBub3RoaW5nIHRvIHNob3cuLi4gCiAgICAgICAgICAgICAgICBpZiggdGhpcy5y +dW5zID09IDAgJiYgdGhpcy5jb3VudCA9PSAwICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAg +ICAgICAgICAgICB2YXIgcE5vZGUgPSAkKCB0aGlzLnByZWZpeCArICdfcHJvZ3Jlc3NfYmFyJyAp +LnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzLnByZWZpeCArICdfcHJvZ3Jl +c3NfYmFyJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBuZXcgRWxl +bWVudCggJ3NwYW4nLCB7ICdjbGFzcyc6ICdlcF9yZWZfcmVwb3J0X2VtcHR5JyB9ICk7CiAgICAg +ICAgICAgICAgICAgICAgc3Bhbi51cGRhdGUoICdSZXBvcnQgZW1wdHknICk7CiAgICAgICAgICAg +ICAgICAgICAgcE5vZGUuaW5zZXJ0KCBzcGFuICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAg +ICAgICAgICB0aGlzLnJ1bnMrKzsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKQogICAgICAgIH0p +OyAgICAgICAgCiAgICB9LAogICAgZXhlY3V0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gcHJv +Z3Jlc3MtYmFyCiAgICAgICAgdGhpcy5jb250YWluZXIuaW5zZXJ0KCBuZXcgRWxlbWVudCggJ2Rp +dicsIHsgJ2NsYXNzJzogJ2VwX3JlcG9ydF9wcm9ncmVzc19iYXInLCAnaWQnOiB0aGlzLnByZWZp +eCArICJfcHJvZ3Jlc3NfYmFyIiB9ICkgKTsgIAoKICAgICAgICB2YXIgY3VycmVudF9ncm91cGlu +ZyA9IG51bGw7ICAgIC8vIG1pZ2h0IG5vdCBiZSBzZXQgaW4gdGhlIHJldHVybmVkIHZhbHVlIGJ1 +dCB0aGF0J3MgYWxsb3dlZC9PSwogICAgICAgIHRoaXMubm9faXRlbXMgPSB0aGlzLmlkcy5sZW5n +dGg7CiAgICAgICAgdGhpcy5yZXRyaWV2ZWQgPSBbXTsKICAgICAgICBpZiggIWlzSW50ZWdlcih0 +aGlzLmlkc1swXSkgKSAvL2lkcyBoYXZlIGJlZW4gZ3JvdXBlZAogICAgICAgIHsgICAKICAgICAg +ICAgICAgdGhpcy5ncm91cGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5ncm91cGVkX2lkcyA9 +IHRoaXMuaWRzOwogICAgICAgICAgICB0aGlzLmlkcyA9IFtdOwogICAgICAgICAgICBmb3IoIHZh +ciBpID0gMDsgaSA8IHRoaXMuZ3JvdXBlZF9pZHMubGVuZ3RoOyBpKysgKQogICAgICAgICAgICB7 +CiAgICAgICAgICAgICAgICB0aGlzLmlkcyA9IHRoaXMuaWRzLmNvbmNhdCh0aGlzLmdyb3VwZWRf +aWRzW2ldLmxpc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vdGhlIGdyb3VwaW5nIG1h +eSBoYXZlIGNyZWF0ZWQgZHVwbGljYXRlIHJlY29yZHMgKGkuZS4gYSByZWNvcmQgY2FuIGFwcGVh +ciBpbiBtb3JlIHRoYW4gb25lIGdyb3VwKSAtIGl0J3MgaGFuZHkgdG8gaGF2ZSBhbiBhcnJheSBv +ZiBhbGwgdGhlIHVuaXF1ZSByZWNvcmRzCiAgICAgICAgICAgIHRoaXMudW5pcXVlID0gdGhpcy5p +ZHMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0sIGksIGFyKXsgcmV0dXJuIGFyLmluZGV4T2YoaXRlbSkg +PT09IGk7IH0pOwogICAgICAgICAgICB0aGlzLm5vX2l0ZW1zID0gdGhpcy51bmlxdWUubGVuZ3Ro +OwogICAgICAgIH0KCiAgICAgICAgaWYoIHRoaXMuaWRzID09IG51bGwgfHwgdGhpcy5pZHMubGVu +Z3RoID09IDAgKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIHBOb2RlID0gJCh0aGlzLnByZWZp +eCArICdfcHJvZ3Jlc3NfYmFyJykucGFyZW50Tm9kZTsKICAgICAgICAgICAgJCh0aGlzLnByZWZp +eCArICdfcHJvZ3Jlc3NfYmFyJykuaGlkZSgpOwogICAgICAgICAgICB2YXIgc3BhbiA9IG5ldyBF +bGVtZW50KCAnc3BhbicsIHsgJ2NsYXNzJzogJ2VwX3JlZl9yZXBvcnRfZW1wdHknIH0gKTsKICAg +ICAgICAgICAgc3Bhbi51cGRhdGUoICdSZXBvcnQgZW1wdHknICk7CiAgICAgICAgICAgIHBOb2Rl +Lmluc2VydCggc3BhbiApOwogICAgICAgIH0KICAgICAgICB0aGlzLnJ1bkJhdGNoKCk7CiAgICB9 +CgoKfSk7CgpmdW5jdGlvbiBncm91cF9yZXBvcnQoZ3JvdXApCnsKICAgIGRvY3VtZW50Lmdyb3Vw +X3JlcG9ydC5ncm91cC52YWx1ZSA9IGdyb3VwOwogICAgZG9jdW1lbnQuZ3JvdXBfcmVwb3J0LnN1 +Ym1pdCgpOwp9CgpmdW5jdGlvbiBzb3J0X3JlcG9ydChzb3J0KQp7CiAgICBkb2N1bWVudC5zb3J0 +X3JlcG9ydC5zb3J0LnZhbHVlID0gc29ydDsKICAgIGRvY3VtZW50LnNvcnRfcmVwb3J0LnN1Ym1p +dCgpOwp9CgpmdW5jdGlvbiBpc0ludGVnZXIobnVtKSB7CiAgcmV0dXJuIChudW0gXiAwKSA9PT0g +bnVtOwp9Cg== @@ -2933,7 +3005,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.4.2 + 3.4.3 diff --git a/reports.epmi b/reports.epmi index 49f10f1..a9655d0 100644 --- a/reports.epmi +++ b/reports.epmi @@ -41,9 +41,9 @@ document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - 6699a48d6ff758192b7ab8ff05790b3f + eb6a305221d7fed1b0ed70ef86206367 MD5 - 10355 + 10782 document @@ -97,9 +97,9 @@ document plugins/EPrints/Plugin/Screen/Report.pm text/plain - 76ae03abfa9314aa25371d44e8486945 + a76848e873791f84698b90d0ed1cb3ea MD5 - 45432 + 45726 document @@ -153,9 +153,9 @@ document static/javascript/auto/reports.js text/plain - 71e1a869fbb7241f7fcc4027acc5a6f8 + 058ab00d3be58f69cb6f9f3e6d7625f9 MD5 - 12708 + 16024 document @@ -187,7 +187,7 @@ coverimage - 3.4.2 + 3.4.3 From 0e5d8052c583258f16082c5bc0cc65d70e60b499 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Mon, 16 Feb 2026 16:14:58 +0000 Subject: [PATCH 08/11] No changes, just whitespace and comment tidying --- lib/plugins/EPrints/Plugin/Export/Grid2.pm | 532 ++++++++++----------- 1 file changed, 266 insertions(+), 266 deletions(-) diff --git a/lib/plugins/EPrints/Plugin/Export/Grid2.pm b/lib/plugins/EPrints/Plugin/Export/Grid2.pm index 961fb54..ae8862a 100644 --- a/lib/plugins/EPrints/Plugin/Export/Grid2.pm +++ b/lib/plugins/EPrints/Plugin/Export/Grid2.pm @@ -17,136 +17,136 @@ $EPrints::Plugin::Import::DISABLE = 1; sub new { - my( $class, %opts ) = @_; + my( $class, %opts ) = @_; - my $self = $class->SUPER::new( %opts ); + my $self = $class->SUPER::new( %opts ); - $self->{name} = "Grid 2 (abstract)"; - $self->{accept} = [ 'dataobj/*', 'list/*', ]; - $self->{visible} = "none"; - $self->{advertise} = 0; - return $self; + $self->{name} = "Grid 2 (abstract)"; + $self->{accept} = [ 'dataobj/*', 'list/*', ]; + $self->{visible} = "none"; + $self->{advertise} = 0; + return $self; } sub fields { - my( $self, $dataset ) = @_; - - # skip compound, subobjects - #return grep { !$_->is_virtual } $dataset->fields; - - my @fieldnames; - foreach my $f ( $dataset->fields ) - { - if( !$f->is_virtual ) - { - push @fieldnames, $f->name; - } - } - return \@fieldnames; + my( $self, $dataset ) = @_; + + # skip compound, subobjects + # return grep { !$_->is_virtual } $dataset->fields; + + my @fieldnames; + foreach my $f ( $dataset->fields ) + { + if( !$f->is_virtual ) + { + push @fieldnames, $f->name; + } + } + return \@fieldnames; } sub header_row { - my( $self, %opts ) = @_; + my( $self, %opts ) = @_; - my $fields = $opts{fields} ||= [$self->fields($opts{list}->{dataset})]; - my $ds = $opts{list}->{dataset}; + my $fields = $opts{fields} ||= [$self->fields($opts{list}->{dataset})]; + my $ds = $opts{list}->{dataset}; - my @names; - foreach my $f (@$fields) - { - if( defined $opts{custom_export} && defined $opts{custom_export}->{$f} ) + my @names; + foreach my $f (@$fields) + { + if( defined $opts{custom_export} && defined $opts{custom_export}->{$f} ) + { + push @names, $ds->repository->phrase( "exportfieldoptions:$f" ); + } + else + { + my $field = EPrints::Utils::field_from_config_string( $ds, $f ); + + if ($field->isa("EPrints::MetaField::Multipart")) + { + my $parent_name = $field->display_name( $field->repository ); + if( $field->isa( "EPrints::MetaField::Name" )) #need to deal with legacy phrase id's + { + foreach my $bit ( $field->get_input_bits() ) + { + $bit = "given_names" if( $bit eq "given" ); + $bit = "family_names" if( $bit eq "family" ); + my $custom_phrase = $field->name . "_" . $bit; + if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) # allow a custom phrase to be used + { + push @names, $ds->repository->phrase( $custom_phrase ); + } + else + { + push @names, $parent_name . ": " . $ds->repository->phrase( "lib/metafield:".$bit ); + } + } + } + else + { + my $name = $field->name; + push @names, map { + $name . '.' . $_->{sub_name} + } @{$field->property("fields_cache")}; + } + } + elsif( $field->isa("EPrints::MetaField::Compound" ) ) + { + foreach my $sub_field (@{$field->property("fields_cache")}) { - push @names, $ds->repository->phrase( "exportfieldoptions:$f" ); + my $custom_phrase = $field->name . "_" . $sub_field->name; + if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) # allow a custom phrase to be used + { + push @names, $ds->repository->phrase( $custom_phrase ); + } + else + { + push @names, $field->display_name( $field->repository ) . ": " . $sub_field->display_name( $sub_field->repository ); + } } - else - { - my $field = EPrints::Utils::field_from_config_string( $ds, $f ); - - if ($field->isa("EPrints::MetaField::Multipart")) - { - my $parent_name = $field->display_name( $field->repository ); - if( $field->isa( "EPrints::MetaField::Name" )) #need to deal with legacy phrase id's - { - foreach my $bit ( $field->get_input_bits() ) - { - $bit = "given_names" if( $bit eq "given" ); - $bit = "family_names" if( $bit eq "family" ); - my $custom_phrase = $field->name . "_" . $bit; - if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) #allow a custom phrase to be used - { - push @names, $ds->repository->phrase( $custom_phrase ); - } - else - { - push @names, $parent_name . ": " . $ds->repository->phrase( "lib/metafield:".$bit ); - } - } - } - else - { - my $name = $field->name; - push @names, map { - $name . '.' . $_->{sub_name} - } @{$field->property("fields_cache")}; - } - } - elsif( $field->isa("EPrints::MetaField::Compound" ) ) - { - foreach my $sub_field (@{$field->property("fields_cache")}) - { - my $custom_phrase = $field->name . "_" . $sub_field->name; - if( $ds->repository->get_lang->has_phrase( $custom_phrase ) ) #allow a custom phrase to be used - { - push @names, $ds->repository->phrase( $custom_phrase ); - } - else - { - push @names, $field->display_name( $field->repository ) . ": " . $sub_field->display_name( $sub_field->repository ); - } - } - } - else - { - push @names, $field->display_name( $field->repository ); - } - } - } - return @names; + } + else + { + push @names, $field->display_name( $field->repository ); + } + } + } + return @names; } sub dataobj_to_rows { - my( $self, $dataobj, %opts ) = @_; + my( $self, $dataobj, %opts ) = @_; - my $main_dataobj = $dataobj; #store dataobj for future reference + my $main_dataobj = $dataobj; # store dataobj for future reference - my $fields = $opts{fields} || [$self->fields($dataobj->{dataset})]; - my $ds = $opts{list}->{dataset}; + my $fields = $opts{fields} || [$self->fields($dataobj->{dataset})]; + my $ds = $opts{list}->{dataset}; - my @rows = ([]); - foreach my $fname (@$fields) - { - #reset dataobj to main dataobj - $dataobj = $main_dataobj; + my @rows = ([]); + foreach my $fname (@$fields) + { + #reset dataobj to main dataobj + $dataobj = $main_dataobj; - #get the field from the id - my $field; - my @fnames = split( /\./, $fname ); - my $sub_dataobj_values = []; - if( scalar( @fnames > 1 ) ) #a field of another dataset, e.g. documents.content + # get the field from the id + my $field; + my @fnames = split( /\./, $fname ); + my $sub_dataobj_values = []; + if( scalar( @fnames > 1 ) ) # a field of another dataset, e.g. documents.content { - $field = $ds->get_field( $fnames[0] ); #first get the field - if( $field->is_type( "subobject", "itemref" ) ) #if the field belongs to another dataset + $field = $ds->get_field( $fnames[0] ); # first get the field + if( $field->is_type( "subobject", "itemref" ) ) # if the field belongs to another dataset { - my $sub_ds_id = $field->get_property( "datasetid" ); - my $multiple = $field->get_property( "multiple" ); - if( $multiple ) - { - my @sub_dataobjs; - #get the dataobjs of this field - if( $sub_ds_id eq "document" ) #documents represent a special case of sub object - we don't want volatile documents (probably) + my $sub_ds_id = $field->get_property( "datasetid" ); + my $multiple = $field->get_property( "multiple" ); + if( $multiple ) + { + my @sub_dataobjs; + # get the dataobjs of this field + if( $sub_ds_id eq "document" ) # documents represent a special case of sub object - we don't want volatile documents (probably) { @sub_dataobjs = $dataobj->get_all_documents; } @@ -157,33 +157,33 @@ sub dataobj_to_rows push @sub_dataobjs, $field->get_item( $dataobj->repository, $sub_obj ); } } - - #and build up an array of these sub dataobj's values - foreach my $obj ( @sub_dataobjs ) #get the values we are requesting of the dataobjects - { - #check for a custom renderer - my $value; - if( defined $opts{custom_export} && defined $opts{custom_export}->{$fname} ) - { - $value = $opts{custom_export}->{$fname}->( $obj, $opts{plugin} ); - } - else - { - $field = EPrints::Utils::field_from_config_string( $obj->dataset, $fnames[1] ); - if( $field->get_property( "virtual" ) ) #virtual fields need rendering - { - $value = EPrints::Utils::tree_to_utf8( $obj->render_value( $fnames[1] ) ); - } - else #regular field values can simply be retrieved - { - $value = $field->get_value( $obj ); - } - } - push @{$sub_dataobj_values}, $value; - } - } - else #we only have one sub-object, - { + + # and build up an array of these sub dataobj's values + foreach my $obj ( @sub_dataobjs ) # get the values we are requesting of the dataobjects + { + # check for a custom renderer + my $value; + if( defined $opts{custom_export} && defined $opts{custom_export}->{$fname} ) + { + $value = $opts{custom_export}->{$fname}->( $obj, $opts{plugin} ); + } + else + { + $field = EPrints::Utils::field_from_config_string( $obj->dataset, $fnames[1] ); + if( $field->get_property( "virtual" ) ) # virtual fields need rendering + { + $value = EPrints::Utils::tree_to_utf8( $obj->render_value( $fnames[1] ) ); + } + else # regular field values can simply be retrieved + { + $value = $field->get_value( $obj ); + } + } + push @{$sub_dataobj_values}, $value; + } + } + else # we only have one sub-object, + { my $sub_obj; if( ref( $field ) eq "EPrints::MetaField::Subobject" ) { @@ -191,161 +191,161 @@ sub dataobj_to_rows } else # do it the original way (assuming this ever worked...? { - $sub_obj = $field->get_item( $dataobj->repository, $dataobj->value( $fnames[0] ) ); #get the subobject + $sub_obj = $field->get_item( $dataobj->repository, $dataobj->value( $fnames[0] ) ); # get the subobject } - $field = EPrints::Utils::field_from_config_string( $sub_obj->dataset, $fnames[1] ); #get the subobjects field - my $value = $field->get_value( $sub_obj ); #get the subobjects value for this field + $field = EPrints::Utils::field_from_config_string( $sub_obj->dataset, $fnames[1] ); # get the subobjects field + my $value = $field->get_value( $sub_obj ); # get the subobjects value for this field push @{$sub_dataobj_values}, $value; } } } - my $i = @{$rows[0]}; - my $_rows; - if( EPrints::Utils::is_set( $field ) ) #we already have our values - { - if( scalar @{$sub_dataobj_values} > 0 ) - { - $_rows = $self->value_to_rows($field, $sub_dataobj_values, $dataobj); - } - else #there's no results, but we still need to add an empty cell to the spreadsheet - { - $_rows = $self->value_to_rows($field, undef); - } - } - else #we need to retrieve our values for this field from our dataobj (or sub_dataobj) - { - my $value; - if( defined $opts{custom_export} && defined $opts{custom_export}->{$fname} ) #we have a custom exporter - { - $value = $opts{custom_export}->{$fname}->( $dataobj, $opts{plugin} ); - $_rows = $self->custom_value_to_rows( $value ); - } - else #just get the field's usual value - { - $field = EPrints::Utils::field_from_config_string( $ds, $fname ); - if( $field->get_property( "virtual" ) ) #virtual fields need rendering - { - $value = EPrints::Utils::tree_to_utf8( $dataobj->render_value( $fname ) ); - } - else #regular field values can simply be retrieved - { - $value = $field->get_value( $dataobj ); - } - $_rows = $self->value_to_rows($field, $value, $dataobj); - } - } - - foreach my $j (0..$#$_rows) - { - foreach my $_i (0..$#{$_rows->[$j]}) - { - $rows[$j][$i+$_i] = $_rows->[$j][$_i]; - } - } - } - - # generate complete rows - if($opts{plugin}->param( "multiline_repeat" )) #we want each column to repeat for each row - { - foreach my $i (0..(scalar @rows)-1) - { - foreach my $j (0..$#{$rows[0]}) - { - $rows[$i][$j] ||= $rows[0][$j]; - } - } - } - else #we don't want repeating values in the columns - { - for(@rows) { - $_->[0] = $rows[0][0]; #first element of this array equals the first element of the first row - $_->[$#{$rows[0]}] ||= undef; - } - - } - - return \@rows; -} - -sub value_to_rows -{ - my ($self, $field, $value, $dataobj) = @_; - - my @rows; - - if (ref($value) eq "ARRAY") - { - $value = [$field->empty_value] if !@$value; - @rows = map { $self->value_to_rows($field, $_, $dataobj)->[0] } @$value; - } - elsif ($field->isa("EPrints::MetaField::Multipart")) - { - if( $field->isa( "EPrints::MetaField::Name" )) #need to deal with legacy phrase id's - { - my @bit_values; - foreach my $bit ( $field->get_input_bits() ) - { - push @bit_values, $value->{$bit}; - } - push @rows, \@bit_values; - } - else - { - push @rows, [map { $value->{$_->{sub_name}} } @{$field->property("fields_cache")}]; - } - } - elsif ($field->isa("EPrints::MetaField::Compound")) - { - my @sub_values; - foreach my $key (keys %{$value}) - { - push @sub_values, $value->{$key}; - } - push @rows, \@sub_values; - } - elsif( $field->isa("EPrints::MetaField::Subject")) + my $i = @{$rows[0]}; + my $_rows; + if( EPrints::Utils::is_set( $field ) ) # we already have our values { - if( $value ne "" ) + if( scalar @{$sub_dataobj_values} > 0 ) + { + $_rows = $self->value_to_rows($field, $sub_dataobj_values, $dataobj); + } + else # there's no results, but we still need to add an empty cell to the spreadsheet + { + $_rows = $self->value_to_rows($field, undef); + } + } + else # we need to retrieve our values for this field from our dataobj (or sub_dataobj) + { + my $value; + if( defined $opts{custom_export} && defined $opts{custom_export}->{$fname} ) # we have a custom exporter + { + $value = $opts{custom_export}->{$fname}->( $dataobj, $opts{plugin} ); + $_rows = $self->custom_value_to_rows( $value ); + } + else # just get the field's usual value + { + $field = EPrints::Utils::field_from_config_string( $ds, $fname ); + if( $field->get_property( "virtual" ) ) # virtual fields need rendering { - push @rows, [EPrints::Utils::tree_to_utf8( $field->render_single_value( $field->repository, $value ) )]; + $value = EPrints::Utils::tree_to_utf8( $dataobj->render_value( $fname ) ); } - else + else # regular field values can simply be retrieved { - push @rows, [$value]; + $value = $field->get_value( $dataobj ); } + $_rows = $self->value_to_rows($field, $value, $dataobj); + } } - elsif( !$field->isa("EPrints::MetaField::Subobject") && $field->is_virtual ) - { - #push @rows, [$dataobj->render_value( $field->name )]; - push @rows, [$value]; - } - else - { - push @rows, [$value]; - } - - return \@rows; -} -#used for custom exports that might return a field or an array (but aren't necesarily associated with a field!) -sub custom_value_to_rows -{ - my ($self, $value) = @_; + foreach my $j (0..$#$_rows) + { + foreach my $_i (0..$#{$_rows->[$j]}) + { + $rows[$j][$i+$_i] = $_rows->[$j][$_i]; + } + } + } + + # generate complete rows + if($opts{plugin}->param( "multiline_repeat" )) # we want each column to repeat for each row + { + foreach my $i (0..(scalar @rows)-1) + { + foreach my $j (0..$#{$rows[0]}) + { + $rows[$i][$j] ||= $rows[0][$j]; + } + } + } + else # we don't want repeating values in the columns + { + for(@rows) { + $_->[0] = $rows[0][0]; # first element of this array equals the first element of the first row + $_->[$#{$rows[0]}] ||= undef; + } - my @rows; + } - if (ref($value) eq "ARRAY") + return \@rows; +} + +sub value_to_rows +{ + my ($self, $field, $value, $dataobj) = @_; + + my @rows; + + if (ref($value) eq "ARRAY") + { + $value = [$field->empty_value] if !@$value; + @rows = map { $self->value_to_rows($field, $_, $dataobj)->[0] } @$value; + } + elsif ($field->isa("EPrints::MetaField::Multipart")) + { + if( $field->isa( "EPrints::MetaField::Name" )) # need to deal with legacy phrase id's { - @rows = map { $self->custom_value_to_rows($_)->[0] } @$value; + my @bit_values; + foreach my $bit ( $field->get_input_bits() ) + { + push @bit_values, $value->{$bit}; + } + push @rows, \@bit_values; } else { - push @rows, [$value]; + push @rows, [map { $value->{$_->{sub_name}} } @{$field->property("fields_cache")}]; } + } + elsif ($field->isa("EPrints::MetaField::Compound")) + { + my @sub_values; + foreach my $key (keys %{$value}) + { + push @sub_values, $value->{$key}; + } + push @rows, \@sub_values; + } + elsif( $field->isa("EPrints::MetaField::Subject")) + { + if( $value ne "" ) + { + push @rows, [EPrints::Utils::tree_to_utf8( $field->render_single_value( $field->repository, $value ) )]; + } + else + { + push @rows, [$value]; + } + } + elsif( !$field->isa("EPrints::MetaField::Subobject") && $field->is_virtual ) + { + #push @rows, [$dataobj->render_value( $field->name )]; + push @rows, [$value]; + } + else + { + push @rows, [$value]; + } + + return \@rows; +} + +# used for custom exports that might return a field or an array (but aren't necesarily associated with a field!) +sub custom_value_to_rows +{ + my ($self, $value) = @_; + + my @rows; + + if (ref($value) eq "ARRAY") + { + @rows = map { $self->custom_value_to_rows($_)->[0] } @$value; + } + else + { + push @rows, [$value]; + } - return \@rows; + return \@rows; } From 9f8b61492ed23e5d772bec963eb38341cb01b6ca Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Mon, 16 Feb 2026 18:01:25 +0000 Subject: [PATCH 09/11] Minor updates to reporting framework to allow export to show field names rather than phrases and to allow for some CSS customisation of the export menu --- lib/lang/en/phrases/reports.xml | 2 + lib/plugins/EPrints/Plugin/Export/Grid2.pm | 33 +- lib/plugins/EPrints/Plugin/Screen/Report.pm | 9 +- reports.epm | 1083 ++++++++++--------- reports.epmi | 14 +- 5 files changed, 615 insertions(+), 526 deletions(-) diff --git a/lib/lang/en/phrases/reports.xml b/lib/lang/en/phrases/reports.xml index a5f182c..2dc3758 100644 --- a/lib/lang/en/phrases/reports.xml +++ b/lib/lang/en/phrases/reports.xml @@ -4,6 +4,8 @@ Loading report... + | + Reports No available reports diff --git a/lib/plugins/EPrints/Plugin/Export/Grid2.pm b/lib/plugins/EPrints/Plugin/Export/Grid2.pm index ae8862a..bc747dc 100644 --- a/lib/plugins/EPrints/Plugin/Export/Grid2.pm +++ b/lib/plugins/EPrints/Plugin/Export/Grid2.pm @@ -54,6 +54,37 @@ sub header_row my $ds = $opts{list}->{dataset}; my @names; + + # option to not use phrases and just use field names + my $use_ids = $opts{plugin}->{use_ids} ||= 0; + if( $use_ids ) + { + foreach my $f (@$fields) + { + if( defined $opts{custom_export} && defined $opts{custom_export}->{$f} ) + { + push @names, $f; + } + else + { + my $field = EPrints::Utils::field_from_config_string( $ds, $f ); + if( $field->isa( "EPrints::MetaField::Multipart" ) ) + { + my $name = $field->name; + push @names, map { + $name . '.' . $_->{sub_name} + } @{$field->property("fields_cache")}; + } + else + { + push @names, $field->name; + } + } + } + return @names; + } + + # else we use phrases foreach my $f (@$fields) { if( defined $opts{custom_export} && defined $opts{custom_export}->{$f} ) @@ -67,7 +98,7 @@ sub header_row if ($field->isa("EPrints::MetaField::Multipart")) { my $parent_name = $field->display_name( $field->repository ); - if( $field->isa( "EPrints::MetaField::Name" )) #need to deal with legacy phrase id's + if( $field->isa( "EPrints::MetaField::Name" )) # need to deal with legacy phrase id's { foreach my $bit ( $field->get_input_bits() ) { diff --git a/lib/plugins/EPrints/Plugin/Screen/Report.pm b/lib/plugins/EPrints/Plugin/Screen/Report.pm index cb41194..89d5f59 100644 --- a/lib/plugins/EPrints/Plugin/Screen/Report.pm +++ b/lib/plugins/EPrints/Plugin/Screen/Report.pm @@ -1005,7 +1005,7 @@ sub render_export_bar $options{show_icon_url} = "$imagesurl/multi_down.png"; $options{hide_icon_url} = "$imagesurl/multi_up.png"; - my $box = $repo->make_element( "div", style=>"text-align: left" ); + my $box = $repo->make_element( "div", style=>"text-align: left", class=>$self->{report} ); $box->appendChild( EPrints::Box::render( %options ) ); $chunk->appendChild( $box ); @@ -1217,10 +1217,15 @@ sub _export_field_checkbox { if( ( grep { $fieldname eq $_ } @{$repo->config( $self->{export_conf}, "exportfield_defaults" )} ) || ( scalar( @{$repo->config( $self->{export_conf}, "exportfield_defaults" )} ) == 0 ) ) { - #only check defaults or check everything if defaults not defined + # check defaults as specified $checkbox->setAttribute( "checked", "yes" ); } } + else # defaults not defined + { + $checkbox->setAttribute( "checked", "yes" ); + } + my $label = $repo->make_element( "label", for => $fieldname ); $label->appendChild( $fieldlabel ); diff --git a/reports.epm b/reports.epm index 77460ae..2854373 100644 --- a/reports.epm +++ b/reports.epm @@ -138,241 +138,291 @@ ICAgIHNob3dfemVyb19yZXN1bHRzID0+IDEsCn07Cgo= document lang/en/phrases/reports.xml application/xml - e039be104215776aa32fecaa24ed3d59 + ea18f8beec4a6fdaa4c1d0e588b38b55 MD5 - 2701 + 2765 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjwh RE9DVFlQRSBwaHJhc2VzIFNZU1RFTSAiZW50aXRpZXMuZHRkIj4KPGVwcDpwaHJhc2VzIHhtbG5z PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczplcHA9Imh0dHA6Ly9lcHJpbnRz Lm9yZy9lcDMvcGhyYXNlIiB4bWxuczplcGM9Imh0dHA6Ly9lcHJpbnRzLm9yZy9lcDMvY29udHJv bCI+Cgo8ZXBwOnBocmFzZSBpZD0ibGliL3JlcG9ydDpsb2FkaW5nIj5Mb2FkaW5nIHJlcG9ydC4u -LjwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydDp0aXRs -ZSI+UmVwb3J0czwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4vUmVw -b3J0Om5vX3JlcG9ydHMiPk5vIGF2YWlsYWJsZSByZXBvcnRzPC9lcHA6cGhyYXNlPgoKPGVwcDpw -aHJhc2UgaWQ9InJlcG9ydHNfcHJlc2V0Ij5QcmVzZXQgUmVwb3J0czwvZXBwOnBocmFzZT4KPGVw -cDpwaHJhc2UgaWQ9InJlcG9ydHNfY3VzdG9tIj5DdXN0b20gUmVwb3J0czwvZXBwOnBocmFzZT4K -CjxlcHA6cGhyYXNlIGlkPSJSZXBvcnQ6c29ydF9saW5rcyI+PGRpdiBjbGFzcz0iZXBfdmlld19n -cm91cF9ieSI+U29ydCBieTogPGVwYzpwaW4gbmFtZT0ibGlua3MiIC8+PC9kaXY+PC9lcHA6cGhy -YXNlPgo8ZXBwOnBocmFzZSBpZD0iUmVwb3J0Omdyb3VwX2xpbmtzIj48ZGl2IGNsYXNzPSJlcF92 -aWV3X2dyb3VwX2J5Ij5Hcm91cCBieTogPGVwYzpwaW4gbmFtZT0ibGlua3MiIC8+PC9kaXY+PC9l -cHA6cGhyYXNlPgoKPGVwcDpwaHJhc2UgaWQ9InJlcG9ydDpub19ncm91cGluZyI+Tm8gR3JvdXBp -bmc8L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0icmVwb3J0X3NlbGVjdCI+U2VsZWN0L0Rl -c2VsZWN0IEFsbDwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJSZXBvcnQ6c2VhcmNoX2xp -bmtzIj48ZGl2IGNsYXNzPSJlcF92aWV3X2dyb3VwX2J5Ij48ZXBjOnBpbiBuYW1lPSJsaW5rcyIg -Lz48L2Rpdj48L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0icmVwb3J0X3NlbGVjdF9sYWJl -bCI+U2VsZWN0IFJlcG9ydDo8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJleHBvcnRfc2Vs -ZWN0X2xhYmVsIj5TZWxlY3QgRXhwb3J0IEZvcm1hdDo8L2VwcDpwaHJhc2U+Cgo8IS0tIHRoZSBF -eGFtcGxlIHJlcG9ydHMgLS0+CjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydC9F -eGFtcGxlOnRpdGxlIj5FeGFtcGxlPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2lu -L1NjcmVlbi9SZXBvcnQvRXhhbXBsZS9BcnRpY2xlczp0aXRsZSI+QXJ0aWNsZXM8L2VwcDpwaHJh -c2U+CjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4vU2NyZWVuL1JlcG9ydC9FeGFtcGxlL0NvbmZlcmVu -Y2VJdGVtczp0aXRsZSI+Q29uZmVyZW5jZSBJdGVtczwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNl -IGlkPSJleHBvcnRfdGl0bGUiPkV4cG9ydCBPcHRpb25zPC9lcHA6cGhyYXNlPgoKPCEtLSBIVE1M -IEV4cG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9InJlcG9ydF9odG1sX2V4cG9ydF90aXRsZSI+UmVw -b3J0PC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0icmVwb3J0X2h0bWxfcHJpbnRfYnRuIj48 -YSBocmVmPSJqYXZhc2NyaXB0OndpbmRvdy5wcmludCgpIiBjbGFzcz0iZXBfZm9ybV9hY3Rpb25f -YnV0dG9uIGh0bWxfcmVwb3J0X3ByaW50IGVwX25vcHJpbnQiPlByaW50PC9hPjwvZXBwOnBocmFz -ZT4KCjwhLS0gRVByaW50IFJlcG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9TY3JlZW4v -UmVwb3J0L0VQcmludDp0aXRsZSI+RVByaW50czwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9 -ImV4cG9ydGZpZWxkczplcHJpbnRfcmVwb3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJh -c2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6Ynl5ZWFyIj5ZZWFyPC9lcHA6 -cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpzb3J0OmJ5bmFtZSI+Q3JlYXRv -cnM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6Ynl0aXRs -ZSI+VGl0bGU8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0OnNvcnQ6 -YnlkaXZpc2lvbiI+RGl2aXNpb248L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0iZXByaW50 -X3JlcG9ydDpncm91cDpkaXZpc2lvbnMiPkRpdmlzaW9uPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFz -ZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpzdWJqZWN0cyI+U3ViamVjdDwvZXBwOnBocmFzZT4K -PGVwcDpwaHJhc2UgaWQ9ImVwcmludF9yZXBvcnQ6Z3JvdXA6dHlwZSI+SXRlbSBUeXBlPC9lcHA6 -cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpncm91cDpkYXRlIj5EYXRlPC9l -cHA6cGhyYXNlPgoKPCEtLSBVc2VyIFJlcG9ydCAtLT4KPGVwcDpwaHJhc2UgaWQ9IlBsdWdpbi9T -Y3JlZW4vUmVwb3J0L1VzZXI6dGl0bGUiPlVzZXJzPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBp -ZD0iZXhwb3J0ZmllbGRzOnVzZXJfcmVwb3J0X2NvcmUiPkV4cG9ydCBGaWVsZHM8L2VwcDpwaHJh -c2U+CjxlcHA6cGhyYXNlIGlkPSJ1c2VyX3JlcG9ydDpzb3J0OmJ5bmFtZSI+TmFtZTwvZXBwOnBo -cmFzZT4KCjwvZXBwOnBocmFzZXM+Cg== +LjwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJVcGRhdGUvVmlld3M6Z3JvdXBfc2VwYXJh +dG9yIj4gfCA8L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2luL1NjcmVlbi9SZXBv +cnQ6dGl0bGUiPlJlcG9ydHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4vU2Ny +ZWVuL1JlcG9ydDpub19yZXBvcnRzIj5ObyBhdmFpbGFibGUgcmVwb3J0czwvZXBwOnBocmFzZT4K +CjxlcHA6cGhyYXNlIGlkPSJyZXBvcnRzX3ByZXNldCI+UHJlc2V0IFJlcG9ydHM8L2VwcDpwaHJh +c2U+CjxlcHA6cGhyYXNlIGlkPSJyZXBvcnRzX2N1c3RvbSI+Q3VzdG9tIFJlcG9ydHM8L2VwcDpw +aHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0iUmVwb3J0OnNvcnRfbGlua3MiPjxkaXYgY2xhc3M9ImVw +X3ZpZXdfZ3JvdXBfYnkiPlNvcnQgYnk6IDxlcGM6cGluIG5hbWU9ImxpbmtzIiAvPjwvZGl2Pjwv +ZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9IlJlcG9ydDpncm91cF9saW5rcyI+PGRpdiBjbGFz +cz0iZXBfdmlld19ncm91cF9ieSI+R3JvdXAgYnk6IDxlcGM6cGluIG5hbWU9ImxpbmtzIiAvPjwv +ZGl2PjwvZXBwOnBocmFzZT4KCjxlcHA6cGhyYXNlIGlkPSJyZXBvcnQ6bm9fZ3JvdXBpbmciPk5v +IEdyb3VwaW5nPC9lcHA6cGhyYXNlPgoKPGVwcDpwaHJhc2UgaWQ9InJlcG9ydF9zZWxlY3QiPlNl +bGVjdC9EZXNlbGVjdCBBbGw8L2VwcDpwaHJhc2U+Cgo8ZXBwOnBocmFzZSBpZD0iUmVwb3J0OnNl +YXJjaF9saW5rcyI+PGRpdiBjbGFzcz0iZXBfdmlld19ncm91cF9ieSI+PGVwYzpwaW4gbmFtZT0i +bGlua3MiIC8+PC9kaXY+PC9lcHA6cGhyYXNlPgoKPGVwcDpwaHJhc2UgaWQ9InJlcG9ydF9zZWxl +Y3RfbGFiZWwiPlNlbGVjdCBSZXBvcnQ6PC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXhw +b3J0X3NlbGVjdF9sYWJlbCI+U2VsZWN0IEV4cG9ydCBGb3JtYXQ6PC9lcHA6cGhyYXNlPgoKPCEt +LSB0aGUgRXhhbXBsZSByZXBvcnRzIC0tPgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2luL1NjcmVlbi9S +ZXBvcnQvRXhhbXBsZTp0aXRsZSI+RXhhbXBsZTwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9 +IlBsdWdpbi9TY3JlZW4vUmVwb3J0L0V4YW1wbGUvQXJ0aWNsZXM6dGl0bGUiPkFydGljbGVzPC9l +cHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iUGx1Z2luL1NjcmVlbi9SZXBvcnQvRXhhbXBsZS9D +b25mZXJlbmNlSXRlbXM6dGl0bGUiPkNvbmZlcmVuY2UgSXRlbXM8L2VwcDpwaHJhc2U+Cgo8ZXBw +OnBocmFzZSBpZD0iZXhwb3J0X3RpdGxlIj5FeHBvcnQgT3B0aW9uczwvZXBwOnBocmFzZT4KCjwh +LS0gSFRNTCBFeHBvcnQgLS0+CjxlcHA6cGhyYXNlIGlkPSJyZXBvcnRfaHRtbF9leHBvcnRfdGl0 +bGUiPlJlcG9ydDwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9InJlcG9ydF9odG1sX3ByaW50 +X2J0biI+PGEgaHJlZj0iamF2YXNjcmlwdDp3aW5kb3cucHJpbnQoKSIgY2xhc3M9ImVwX2Zvcm1f +YWN0aW9uX2J1dHRvbiBodG1sX3JlcG9ydF9wcmludCBlcF9ub3ByaW50Ij5QcmludDwvYT48L2Vw +cDpwaHJhc2U+Cgo8IS0tIEVQcmludCBSZXBvcnQgLS0+CjxlcHA6cGhyYXNlIGlkPSJQbHVnaW4v +U2NyZWVuL1JlcG9ydC9FUHJpbnQ6dGl0bGUiPkVQcmludHM8L2VwcDpwaHJhc2U+CjxlcHA6cGhy +YXNlIGlkPSJleHBvcnRmaWVsZHM6ZXByaW50X3JlcG9ydF9jb3JlIj5FeHBvcnQgRmllbGRzPC9l +cHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpzb3J0OmJ5eWVhciI+WWVh +cjwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImVwcmludF9yZXBvcnQ6c29ydDpieW5hbWUi +PkNyZWF0b3JzPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9ydDpzb3J0 +OmJ5dGl0bGUiPlRpdGxlPC9lcHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0iZXByaW50X3JlcG9y +dDpzb3J0OmJ5ZGl2aXNpb24iPkRpdmlzaW9uPC9lcHA6cGhyYXNlPgoKPGVwcDpwaHJhc2UgaWQ9 +ImVwcmludF9yZXBvcnQ6Z3JvdXA6ZGl2aXNpb25zIj5EaXZpc2lvbjwvZXBwOnBocmFzZT4KPGVw +cDpwaHJhc2UgaWQ9ImVwcmludF9yZXBvcnQ6Z3JvdXA6c3ViamVjdHMiPlN1YmplY3Q8L2VwcDpw +aHJhc2U+CjxlcHA6cGhyYXNlIGlkPSJlcHJpbnRfcmVwb3J0Omdyb3VwOnR5cGUiPkl0ZW0gVHlw +ZTwvZXBwOnBocmFzZT4KPGVwcDpwaHJhc2UgaWQ9ImVwcmludF9yZXBvcnQ6Z3JvdXA6ZGF0ZSI+ +RGF0ZTwvZXBwOnBocmFzZT4KCjwhLS0gVXNlciBSZXBvcnQgLS0+CjxlcHA6cGhyYXNlIGlkPSJQ +bHVnaW4vU2NyZWVuL1JlcG9ydC9Vc2VyOnRpdGxlIj5Vc2VyczwvZXBwOnBocmFzZT4KPGVwcDpw +aHJhc2UgaWQ9ImV4cG9ydGZpZWxkczp1c2VyX3JlcG9ydF9jb3JlIj5FeHBvcnQgRmllbGRzPC9l +cHA6cGhyYXNlPgo8ZXBwOnBocmFzZSBpZD0idXNlcl9yZXBvcnQ6c29ydDpieW5hbWUiPk5hbWU8 +L2VwcDpwaHJhc2U+Cgo8L2VwcDpwaHJhc2VzPgo= document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - eb6a305221d7fed1b0ed70ef86206367 + 83bb520ae07653dfb9292460794a23fa MD5 - 10782 + 13575 PWhlYWQxIE5BTUUKCkVQcmludHM6OlBsdWdpbjo6RXhwb3J0OjpHcmlkMgoKPWN1dAoKcGFja2Fn ZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6R3JpZDI7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2Ug RVByaW50czo6UGx1Z2luOjpFeHBvcnQ7CgpASVNBID0gKCAiRVByaW50czo6UGx1Z2luOjpFeHBv cnQ6OkdyaWQiICk7Cgp1c2Ugc3RyaWN0OwoKJEVQcmludHM6OlBsdWdpbjo6SW1wb3J0OjpESVNB -QkxFID0gMTsKCnN1YiBuZXcKewoJbXkoICRjbGFzcywgJW9wdHMgKSA9IEBfOwoKCW15ICRzZWxm -ID0gJGNsYXNzLT5TVVBFUjo6bmV3KCAlb3B0cyApOwoKCSRzZWxmLT57bmFtZX0gPSAiR3JpZCAy -IChhYnN0cmFjdCkiOwoJJHNlbGYtPnthY2NlcHR9ID0gWyAnZGF0YW9iai8qJywgJ2xpc3QvKics -IF07Cgkkc2VsZi0+e3Zpc2libGV9ID0gIm5vbmUiOwkKCSRzZWxmLT57YWR2ZXJ0aXNlfSA9IDA7 -CQoJcmV0dXJuICRzZWxmOwp9CgpzdWIgZmllbGRzCnsKCW15KCAkc2VsZiwgJGRhdGFzZXQgKSA9 -IEBfOwoKCSMgc2tpcCBjb21wb3VuZCwgc3Vib2JqZWN0cwoJI3JldHVybiBncmVwIHsgISRfLT5p -c192aXJ0dWFsIH0gJGRhdGFzZXQtPmZpZWxkczsKCQoJbXkgQGZpZWxkbmFtZXM7Cglmb3JlYWNo -IG15ICRmICggJGRhdGFzZXQtPmZpZWxkcyApCgl7CgkJaWYoICEkZi0+aXNfdmlydHVhbCApCgkJ -ewoJCQlwdXNoIEBmaWVsZG5hbWVzLCAkZi0+bmFtZTsKCQl9Cgl9CglyZXR1cm4gXEBmaWVsZG5h -bWVzOwp9CgpzdWIgaGVhZGVyX3Jvdwp7CglteSggJHNlbGYsICVvcHRzICkgPSBAXzsKCglteSAk -ZmllbGRzID0gJG9wdHN7ZmllbGRzfSB8fD0gWyRzZWxmLT5maWVsZHMoJG9wdHN7bGlzdH0tPntk -YXRhc2V0fSldOwoJbXkgJGRzID0gJG9wdHN7bGlzdH0tPntkYXRhc2V0fTsKCglteSBAbmFtZXM7 -Cglmb3JlYWNoIG15ICRmIChAJGZpZWxkcykKCXsKCQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21f -ZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZ9ICkKICAgICAgICAg -ICAgICAgIHsKICAgICAgICAgICAgICAgIAlwdXNoIEBuYW1lcywgJGRzLT5yZXBvc2l0b3J5LT5w -aHJhc2UoICJleHBvcnRmaWVsZG9wdGlvbnM6JGYiICk7CiAgICAgICAgICAgICAgICB9CgkJZWxz -ZQoJCXsKCQkJbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29uZmlnX3N0 -cmluZyggJGRzLCAkZiApOwoKCQkJaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6 -Ok11bHRpcGFydCIpKQoJCQl7CgkJCQlteSAkcGFyZW50X25hbWUgPSAkZmllbGQtPmRpc3BsYXlf -bmFtZSggJGZpZWxkLT5yZXBvc2l0b3J5ICk7CgkJCQlpZiggJGZpZWxkLT5pc2EoICJFUHJpbnRz -OjpNZXRhRmllbGQ6Ok5hbWUiICkpICNuZWVkIHRvIGRlYWwgd2l0aCBsZWdhY3kgcGhyYXNlIGlk -J3MKCQkJCXsKCQkJCQlmb3JlYWNoIG15ICRiaXQgKCAkZmllbGQtPmdldF9pbnB1dF9iaXRzKCkg -KQoJCQkJICAgICAgICB7CgkJCQkJCSRiaXQgPSAiZ2l2ZW5fbmFtZXMiIGlmKCAkYml0IGVxICJn -aXZlbiIgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJ -JGJpdCA9ICJmYW1pbHlfbmFtZXMiIGlmKCAkYml0IGVxICJmYW1pbHkiICk7CgkJCQkJCW15ICRj -dXN0b21fcGhyYXNlID0gJGZpZWxkLT5uYW1lIC4gIl8iIC4gJGJpdDsKCQkJCQkJaWYoICRkcy0+ -cmVwb3NpdG9yeS0+Z2V0X2xhbmctPmhhc19waHJhc2UoICRjdXN0b21fcGhyYXNlICkgKSAjYWxs -b3cgYSBjdXN0b20gcGhyYXNlIHRvIGJlIHVzZWQKCQkJCQkJewoJCQkJCQkJcHVzaCBAbmFtZXMs -ICRkcy0+cmVwb3NpdG9yeS0+cGhyYXNlKCAkY3VzdG9tX3BocmFzZSApOwoJCQkJCQl9CgkJCQkJ -CWVsc2UKCQkJCQkJewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAJcHVzaCBAbmFtZXMsICRwYXJlbnRfbmFtZSAuICI6ICIgLiAkZHMtPnJlcG9zaXRvcnkt -PnBocmFzZSggImxpYi9tZXRhZmllbGQ6Ii4kYml0ICk7CgkJCQkJCX0KICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlteSAk -bmFtZSA9ICRmaWVsZC0+bmFtZTsKCQkJCQlwdXNoIEBuYW1lcywgbWFwIHsKCQkJCQkJJG5hbWUg -LiAnLicgLiAkXy0+e3N1Yl9uYW1lfQoJCQkJCX0gQHskZmllbGQtPnByb3BlcnR5KCJmaWVsZHNf -Y2FjaGUiKX07CgkJCQl9CgkJCX0KCQkJZWxzaWYoICRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRh -RmllbGQ6OkNvbXBvdW5kIiApICkKCQkJewoJCQkJZm9yZWFjaCBteSAkc3ViX2ZpZWxkIChAeyRm -aWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfSkKCQkJCXsKCQkJCQlteSAkY3VzdG9tX3Bo -cmFzZSA9ICRmaWVsZC0+bmFtZSAuICJfIiAuICRzdWJfZmllbGQtPm5hbWU7CgkJCQkJaWYoICRk -cy0+cmVwb3NpdG9yeS0+Z2V0X2xhbmctPmhhc19waHJhc2UoICRjdXN0b21fcGhyYXNlICkgKSAj -YWxsb3cgYSBjdXN0b20gcGhyYXNlIHRvIGJlIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IAlwdXNoIEBuYW1lcywgJGRzLT5yZXBvc2l0b3J5LT5waHJhc2UoICRjdXN0b21fcGhyYXNlICk7 -CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCQkJZWxzZQoJCQkJ -CXsKCQkJCQkJcHVzaCBAbmFtZXMsICRmaWVsZC0+ZGlzcGxheV9uYW1lKCAkZmllbGQtPnJlcG9z -aXRvcnkgKSAuICI6ICIgLiAkc3ViX2ZpZWxkLT5kaXNwbGF5X25hbWUoICRzdWJfZmllbGQtPnJl -cG9zaXRvcnkgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlwdXNoIEBuYW1l -cywgJGZpZWxkLT5kaXNwbGF5X25hbWUoICRmaWVsZC0+cmVwb3NpdG9yeSApOwoJCQl9CgkJfQoJ -fQkJCglyZXR1cm4gQG5hbWVzOwp9CgpzdWIgZGF0YW9ial90b19yb3dzCnsKCW15KCAkc2VsZiwg -JGRhdGFvYmosICVvcHRzICkgPSBAXzsKCglteSAkbWFpbl9kYXRhb2JqID0gJGRhdGFvYmo7ICNz -dG9yZSBkYXRhb2JqIGZvciBmdXR1cmUgcmVmZXJlbmNlCgoJbXkgJGZpZWxkcyA9ICRvcHRze2Zp -ZWxkc30gfHwgWyRzZWxmLT5maWVsZHMoJGRhdGFvYmotPntkYXRhc2V0fSldOwoJbXkgJGRzID0g -JG9wdHN7bGlzdH0tPntkYXRhc2V0fTsKCglteSBAcm93cyA9IChbXSk7Cglmb3JlYWNoIG15ICRm -bmFtZSAoQCRmaWVsZHMpCgl7CgkJI3Jlc2V0IGRhdGFvYmogdG8gbWFpbiBkYXRhb2JqCgkJJGRh -dGFvYmogPSAkbWFpbl9kYXRhb2JqOwoKCQkjZ2V0IHRoZSBmaWVsZCBmcm9tIHRoZSBpZAoJCW15 -ICRmaWVsZDsKCQlteSBAZm5hbWVzID0gc3BsaXQoIC9cLi8sICRmbmFtZSApOwoJCW15ICRzdWJf -ZGF0YW9ial92YWx1ZXMgPSBbXTsJCQoJCWlmKCBzY2FsYXIoIEBmbmFtZXMgPiAxICkgKSAjYSBm -aWVsZCBvZiBhbm90aGVyIGRhdGFzZXQsIGUuZy4gZG9jdW1lbnRzLmNvbnRlbnQKICAgICAgICAg -ICAgICAgIHsKCQkJJGZpZWxkID0gJGRzLT5nZXRfZmllbGQoICRmbmFtZXNbMF0gKTsgI2ZpcnN0 -IGdldCB0aGUgZmllbGQKCQkJaWYoICRmaWVsZC0+aXNfdHlwZSggInN1Ym9iamVjdCIsICJpdGVt -cmVmIiApICkgI2lmIHRoZSBmaWVsZCBiZWxvbmdzIHRvIGFub3RoZXIgZGF0YXNldAogICAgICAg -ICAgICB7CgkJCQlteSAkc3ViX2RzX2lkID0gJGZpZWxkLT5nZXRfcHJvcGVydHkoICJkYXRhc2V0 -aWQiICk7CgkJCQlteSAkbXVsdGlwbGUgPSAkZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRpcGxl -IiApOwoJCQkJaWYoICRtdWx0aXBsZSApCgkJCQl7CgkJCQkJbXkgQHN1Yl9kYXRhb2JqczsKCQkJ -CQkjZ2V0IHRoZSBkYXRhb2JqcyBvZiB0aGlzIGZpZWxkCgkJCQkJaWYoICRzdWJfZHNfaWQgZXEg -ImRvY3VtZW50IiApICNkb2N1bWVudHMgcmVwcmVzZW50IGEgc3BlY2lhbCBjYXNlIG9mIHN1YiBv -YmplY3QgLSB3ZSBkb24ndCB3YW50IHZvbGF0aWxlIGRvY3VtZW50cyAocHJvYmFibHkpCiAgICAg -ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBAc3ViX2RhdGFvYmpzID0g -JGRhdGFvYmotPmdldF9hbGxfZG9jdW1lbnRzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAg -ICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg -ICAgICAgICBmb3JlYWNoIG15ICRzdWJfb2JqICggQHskZGF0YW9iai0+dmFsdWUoICRmbmFtZXNb -MF0gKX0gKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICBwdXNoIEBzdWJfZGF0YW9ianMsICRmaWVsZC0+Z2V0X2l0ZW0oICRkYXRhb2JqLT5yZXBv -c2l0b3J5LCAkc3ViX29iaiApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg -ICAgICAgICAgfQoJCQkJCQoJCQkJCSNhbmQgYnVpbGQgdXAgYW4gYXJyYXkgb2YgdGhlc2Ugc3Vi -IGRhdGFvYmoncyB2YWx1ZXMKCQkJCQlmb3JlYWNoIG15ICRvYmogKCBAc3ViX2RhdGFvYmpzICkg -I2dldCB0aGUgdmFsdWVzIHdlIGFyZSByZXF1ZXN0aW5nIG9mIHRoZSBkYXRhb2JqZWN0cwogICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoJCQkJCQkjY2hlY2sgZm9yIGEg -Y3VzdG9tIHJlbmRlcmVyCgkJCQkJCW15ICR2YWx1ZTsKCQkJCQkJaWYoIGRlZmluZWQgJG9wdHN7 -Y3VzdG9tX2V4cG9ydH0gJiYgZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0g -KQoJCQkJCQl7CgkJCQkJCQkkdmFsdWUgPSAkb3B0c3tjdXN0b21fZXhwb3J0fS0+eyRmbmFtZX0t -PiggJG9iaiwgJG9wdHN7cGx1Z2lufSApOwoJCQkJCQl9CgkJCQkJCWVsc2UKCQkJCQkJewkJCQkJ -CQkKCQkJCQkJCSRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJp -bmcoICRvYmotPmRhdGFzZXQsICRmbmFtZXNbMV0gKTsJCQkJCQkJCgkJCQkJCQlpZiggJGZpZWxk -LT5nZXRfcHJvcGVydHkoICJ2aXJ0dWFsIiApICkgI3ZpcnR1YWwgZmllbGRzIG5lZWQgcmVuZGVy -aW5nCgkJCQkJCQl7CgkJCQkJCQkJJHZhbHVlID0gRVByaW50czo6VXRpbHM6OnRyZWVfdG9fdXRm -OCggJG9iai0+cmVuZGVyX3ZhbHVlKCAkZm5hbWVzWzFdICkgKTsKCQkJCQkJCX0KCQkJCQkJCWVs -c2UgI3JlZ3VsYXIgZmllbGQgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmV0cmlldmVkCgkJCQkJCQl7 -CgkJCQkJCQkJJHZhbHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRvYmogKTsKCQkJCQkJCX0KCQkJ -CQkJfQoJCQkJCQlwdXNoIEB7JHN1Yl9kYXRhb2JqX3ZhbHVlc30sICR2YWx1ZTsgCgkJCQkJfQoJ -CQkJfQoJCQkJZWxzZSAjd2Ugb25seSBoYXZlIG9uZSBzdWItb2JqZWN0LCAKCQkJCXsKICAgICAg -ICAgICAgICAgICAgICBteSAkc3ViX29iajsKICAgICAgICAgICAgICAgICAgICBpZiggcmVmKCAk -ZmllbGQgKSBlcSAiRVByaW50czo6TWV0YUZpZWxkOjpTdWJvYmplY3QiICkKICAgICAgICAgICAg -ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdWJfb2JqID0gJGRhdGFvYmotPnZh -bHVlKCAkZm5hbWVzWzBdICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg -ICAgIGVsc2UgIyBkbyBpdCB0aGUgb3JpZ2luYWwgd2F5IChhc3N1bWluZyB0aGlzIGV2ZXIgd29y -a2VkLi4uPwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN1 -Yl9vYmogPSAkZmllbGQtPmdldF9pdGVtKCAkZGF0YW9iai0+cmVwb3NpdG9yeSwgJGRhdGFvYmot -PnZhbHVlKCAkZm5hbWVzWzBdICkgKTsgI2dldCB0aGUgc3Vib2JqZWN0CiAgICAgICAgICAgICAg -ICAgICAgfQogICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkZmllbGQg -PSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdfc3RyaW5nKCAkc3ViX29iai0+ZGF0 -YXNldCwgJGZuYW1lc1sxXSApOyAjZ2V0IHRoZSBzdWJvYmplY3RzIGZpZWxkCiAgICAgICAgICAg -ICAgICAgICAgbXkgJHZhbHVlID0gJGZpZWxkLT5nZXRfdmFsdWUoICRzdWJfb2JqICk7ICNnZXQg -dGhlIHN1Ym9iamVjdHMgdmFsdWUgZm9yIHRoaXMgZmllbGQKICAgICAgICAgICAgICAgICAgICBw -dXNoIEB7JHN1Yl9kYXRhb2JqX3ZhbHVlc30sICR2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAg -ICAgICAgICAgfQogICAgICAgIH0KCgkJbXkgJGkgPSBAeyRyb3dzWzBdfTsKCQlteSAkX3Jvd3M7 -CgkJaWYoIEVQcmludHM6OlV0aWxzOjppc19zZXQoICRmaWVsZCApICkgI3dlIGFscmVhZHkgaGF2 -ZSBvdXIgdmFsdWVzCgkJewoJCQlpZiggc2NhbGFyIEB7JHN1Yl9kYXRhb2JqX3ZhbHVlc30gPiAw -ICkKCQkJewoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCAkc3ViX2Rh -dGFvYmpfdmFsdWVzLCAkZGF0YW9iaik7CQkJCgkJCX0KCQkJZWxzZSAjdGhlcmUncyBubyByZXN1 -bHRzLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBhZGQgYW4gZW1wdHkgY2VsbCB0byB0aGUgc3ByZWFk -c2hlZXQKCQkJewoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCB1bmRl -Zik7CgkJCX0KCQl9CgkJZWxzZSAjd2UgbmVlZCB0byByZXRyaWV2ZSBvdXIgdmFsdWVzIGZvciB0 -aGlzIGZpZWxkIGZyb20gb3VyIGRhdGFvYmogKG9yIHN1Yl9kYXRhb2JqKQoJCXsKCQkJbXkgJHZh -bHVlOwoJCQlpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRz -e2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfSApICN3ZSBoYXZlIGEgY3VzdG9tIGV4cG9ydGVyCgkJ -CXsKCQkJCSR2YWx1ZSA9ICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfS0+KCAkZGF0YW9i -aiwgJG9wdHN7cGx1Z2lufSApOwoJCQkJJF9yb3dzID0gJHNlbGYtPmN1c3RvbV92YWx1ZV90b19y -b3dzKCAkdmFsdWUgKTsKCQkJfQoJCQllbHNlICNqdXN0IGdldCB0aGUgZmllbGQncyB1c3VhbCB2 -YWx1ZQoJCQl7CgkJCQkkZmllbGQgPSBFUHJpbnRzOjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdf -c3RyaW5nKCAkZHMsICRmbmFtZSApOwoJCQkJaWYoICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAidmly -dHVhbCIgKSApICN2aXJ0dWFsIGZpZWxkcyBuZWVkIHJlbmRlcmluZwoJCQkJewoJCQkJCSR2YWx1 -ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRkYXRhb2JqLT5yZW5kZXJfdmFsdWUo -ICRmbmFtZSApICk7CgkJCQl9CgkJCQllbHNlICNyZWd1bGFyIGZpZWxkIHZhbHVlcyBjYW4gc2lt -cGx5IGJlIHJldHJpZXZlZAoJCQkJewoJCQkJCSR2YWx1ZSA9ICRmaWVsZC0+Z2V0X3ZhbHVlKCAk -ZGF0YW9iaiApOwoJCQkJfQoJCQkJJF9yb3dzID0gJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxk -LCAkdmFsdWUsICRkYXRhb2JqKTsgCQkKCQkJfQkJCQoJCX0KCgkJZm9yZWFjaCBteSAkaiAoMC4u -JCMkX3Jvd3MpCgkJewoJCQlmb3JlYWNoIG15ICRfaSAoMC4uJCN7JF9yb3dzLT5bJGpdfSkKCQkJ -ewoJCQkJJHJvd3NbJGpdWyRpKyRfaV0gPSAkX3Jvd3MtPlskal1bJF9pXTsKCQkJfQoJCX0KCX0K -CgkjIGdlbmVyYXRlIGNvbXBsZXRlIHJvd3MKCWlmKCRvcHRze3BsdWdpbn0tPnBhcmFtKCAibXVs -dGlsaW5lX3JlcGVhdCIgKSkgI3dlIHdhbnQgZWFjaCBjb2x1bW4gdG8gcmVwZWF0IGZvciBlYWNo -IHJvdwoJewoJCWZvcmVhY2ggbXkgJGkgKDAuLihzY2FsYXIgQHJvd3MpLTEpCgkJewoJCQlmb3Jl -YWNoIG15ICRqICgwLi4kI3skcm93c1swXX0pCgkJCXsKCQkJCSRyb3dzWyRpXVskal0gfHw9ICRy -b3dzWzBdWyRqXTsKCQkJfQkKCQl9Cgl9CgllbHNlICN3ZSBkb24ndCB3YW50IHJlcGVhdGluZyB2 -YWx1ZXMgaW4gdGhlIGNvbHVtbnMKCXsJCgkJZm9yKEByb3dzKSB7CgkJCSRfLT5bMF0gPSAkcm93 -c1swXVswXTsgI2ZpcnN0IGVsZW1lbnQgb2YgdGhpcyBhcnJheSBlcXVhbHMgdGhlIGZpcnN0IGVs -ZW1lbnQgb2YgdGhlIGZpcnN0IHJvdwoJCQkkXy0+WyQjeyRyb3dzWzBdfV0gfHw9IHVuZGVmOwoJ -CX0KCgl9CgoJcmV0dXJuIFxAcm93czsKfQoKc3ViIHZhbHVlX3RvX3Jvd3MKewoJbXkgKCRzZWxm -LCAkZmllbGQsICR2YWx1ZSwgJGRhdGFvYmopID0gQF87CgoJbXkgQHJvd3M7CgoJaWYgKHJlZigk -dmFsdWUpIGVxICJBUlJBWSIpCgl7CgkJJHZhbHVlID0gWyRmaWVsZC0+ZW1wdHlfdmFsdWVdIGlm -ICFAJHZhbHVlOwoJCUByb3dzID0gbWFwIHsgJHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCAk -XywgJGRhdGFvYmopLT5bMF0gfSBAJHZhbHVlOwoJfQoJZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJp -bnRzOjpNZXRhRmllbGQ6Ok11bHRpcGFydCIpKQoJewoJCWlmKCAkZmllbGQtPmlzYSggIkVQcmlu -dHM6Ok1ldGFGaWVsZDo6TmFtZSIgKSkgI25lZWQgdG8gZGVhbCB3aXRoIGxlZ2FjeSBwaHJhc2Ug -aWQncwogICAgICAgICAgICAgICAgewoJCQlteSBAYml0X3ZhbHVlczsKCQkJZm9yZWFjaCBteSAk -Yml0ICggJGZpZWxkLT5nZXRfaW5wdXRfYml0cygpICkKICAgICAgICAgICAgICAgICAgICAgICAg -ewoJCQkJcHVzaCBAYml0X3ZhbHVlcywgJHZhbHVlLT57JGJpdH07CiAgICAgICAgCQl9CQoJCQlw -dXNoIEByb3dzLCBcQGJpdF92YWx1ZXM7CgkgICAgICAgIH0KCQllbHNlCgkJewoJCQlwdXNoIEBy -b3dzLCBbbWFwIHsgJHZhbHVlLT57JF8tPntzdWJfbmFtZX19IH0gQHskZmllbGQtPnByb3BlcnR5 -KCJmaWVsZHNfY2FjaGUiKX1dOwoJCX0KCX0KCWVsc2lmICgkZmllbGQtPmlzYSgiRVByaW50czo6 -TWV0YUZpZWxkOjpDb21wb3VuZCIpKQoJewoJCW15IEBzdWJfdmFsdWVzOwoJCWZvcmVhY2ggbXkg -JGtleSAoa2V5cyAleyR2YWx1ZX0pCgkJewoJCQlwdXNoIEBzdWJfdmFsdWVzLCAkdmFsdWUtPnsk -a2V5fTsKCQl9CgkJcHVzaCBAcm93cywgXEBzdWJfdmFsdWVzOwoJfQoJZWxzaWYoICRmaWVsZC0+ -aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OlN1YmplY3QiKSkKICAgICAgICB7CiAgICAgICAgICAg -ICAgICBpZiggJHZhbHVlIG5lICIiICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg -ICAgICAgICAgcHVzaCBAcm93cywgW0VQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRmaWVs -ZC0+cmVuZGVyX3NpbmdsZV92YWx1ZSggJGZpZWxkLT5yZXBvc2l0b3J5LCAkdmFsdWUgKSApXTsK -ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsK -ICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAcm93cywgWyR2YWx1ZV07CiAgICAgICAgICAg -ICAgICB9CiAgICAgICAgfQoJZWxzaWYoICEkZmllbGQtPmlzYSgiRVByaW50czo6TWV0YUZpZWxk -OjpTdWJvYmplY3QiKSAmJiAkZmllbGQtPmlzX3ZpcnR1YWwgKQoJewoJCSNwdXNoIEByb3dzLCBb -JGRhdGFvYmotPnJlbmRlcl92YWx1ZSggJGZpZWxkLT5uYW1lICldOwoJCXB1c2ggQHJvd3MsIFsk -dmFsdWVdOwoJfQoJZWxzZQoJewoJCXB1c2ggQHJvd3MsIFskdmFsdWVdOwoJfQoKCXJldHVybiBc -QHJvd3M7Cn0KCiN1c2VkIGZvciBjdXN0b20gZXhwb3J0cyB0aGF0IG1pZ2h0IHJldHVybiBhIGZp -ZWxkIG9yIGFuIGFycmF5IChidXQgYXJlbid0IG5lY2VzYXJpbHkgYXNzb2NpYXRlZCB3aXRoIGEg -ZmllbGQhKQpzdWIgY3VzdG9tX3ZhbHVlX3RvX3Jvd3MKewogICAgICAgIG15ICgkc2VsZiwgJHZh -bHVlKSA9IEBfOwoKICAgICAgICBteSBAcm93czsKCiAgICAgICAgaWYgKHJlZigkdmFsdWUpIGVx -ICJBUlJBWSIpCiAgICAgICAgewogICAgICAgICAgICAgICAgQHJvd3MgPSBtYXAgeyAkc2VsZi0+ -Y3VzdG9tX3ZhbHVlX3RvX3Jvd3MoJF8pLT5bMF0gfSBAJHZhbHVlOwogICAgICAgIH0KICAgICAg -ICBlbHNlCiAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAcm93cywgWyR2YWx1ZV07CiAg -ICAgICAgfQoKICAgICAgICByZXR1cm4gXEByb3dzOwp9CgoKMTsKCj1oZWFkMSBDT1BZUklHSFQK +QkxFID0gMTsKCnN1YiBuZXcKewogICAgbXkoICRjbGFzcywgJW9wdHMgKSA9IEBfOwoKICAgIG15 +ICRzZWxmID0gJGNsYXNzLT5TVVBFUjo6bmV3KCAlb3B0cyApOwoKICAgICRzZWxmLT57bmFtZX0g +PSAiR3JpZCAyIChhYnN0cmFjdCkiOwogICAgJHNlbGYtPnthY2NlcHR9ID0gWyAnZGF0YW9iai8q +JywgJ2xpc3QvKicsIF07CiAgICAkc2VsZi0+e3Zpc2libGV9ID0gIm5vbmUiOyAgCiAgICAkc2Vs +Zi0+e2FkdmVydGlzZX0gPSAwOyAKICAgIHJldHVybiAkc2VsZjsKfQoKc3ViIGZpZWxkcwp7CiAg +ICBteSggJHNlbGYsICRkYXRhc2V0ICkgPSBAXzsKCiAgICAjIHNraXAgY29tcG91bmQsIHN1Ym9i +amVjdHMKICAgICMgcmV0dXJuIGdyZXAgeyAhJF8tPmlzX3ZpcnR1YWwgfSAkZGF0YXNldC0+Zmll +bGRzOwogICAgCiAgICBteSBAZmllbGRuYW1lczsKICAgIGZvcmVhY2ggbXkgJGYgKCAkZGF0YXNl +dC0+ZmllbGRzICkKICAgIHsKICAgICAgICBpZiggISRmLT5pc192aXJ0dWFsICkKICAgICAgICB7 +CiAgICAgICAgICAgIHB1c2ggQGZpZWxkbmFtZXMsICRmLT5uYW1lOwogICAgICAgIH0KICAgIH0K +ICAgIHJldHVybiBcQGZpZWxkbmFtZXM7Cn0KCnN1YiBoZWFkZXJfcm93CnsKICAgIG15KCAkc2Vs +ZiwgJW9wdHMgKSA9IEBfOwoKICAgIG15ICRmaWVsZHMgPSAkb3B0c3tmaWVsZHN9IHx8PSBbJHNl +bGYtPmZpZWxkcygkb3B0c3tsaXN0fS0+e2RhdGFzZXR9KV07CiAgICBteSAkZHMgPSAkb3B0c3ts +aXN0fS0+e2RhdGFzZXR9OwoKICAgIG15IEBuYW1lczsKCiAgICAjIG9wdGlvbiB0byBub3QgdXNl +IHBocmFzZXMgYW5kIGp1c3QgdXNlIGZpZWxkIG5hbWVzCiAgICBteSAkdXNlX2lkcyA9ICRvcHRz +e3BsdWdpbn0tPnt1c2VfaWRzfSB8fD0gMDsKICAgIGlmKCAkdXNlX2lkcyApCiAgICB7CiAgICAg +ICAgZm9yZWFjaCBteSAkZiAoQCRmaWVsZHMpCiAgICAgICAgeyAgICAgICAgICAgIAogICAgICAg +ICAgICBpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRze2N1 +c3RvbV9leHBvcnR9LT57JGZ9ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBA +bmFtZXMsICRmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewog +ICAgICAgICAgICAgICAgbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29u +ZmlnX3N0cmluZyggJGRzLCAkZiApOwogICAgICAgICAgICAgICAgaWYoICRmaWVsZC0+aXNhKCAi +RVByaW50czo6TWV0YUZpZWxkOjpNdWx0aXBhcnQiICkgKQogICAgICAgICAgICAgICAgewogICAg +ICAgICAgICAgICAgICAgIG15ICRuYW1lID0gJGZpZWxkLT5uYW1lOwogICAgICAgICAgICAgICAg +ICAgIHB1c2ggQG5hbWVzLCBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSAuICcu +JyAuICRfLT57c3ViX25hbWV9CiAgICAgICAgICAgICAgICAgICAgfSBAeyRmaWVsZC0+cHJvcGVy +dHkoImZpZWxkc19jYWNoZSIpfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVs +c2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBuYW1lcywgJGZp +ZWxkLT5uYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAg +ICAgIHJldHVybiBAbmFtZXM7CiAgICB9CgogICAgIyBlbHNlIHdlIHVzZSBwaHJhc2VzCiAgICBm +b3JlYWNoIG15ICRmIChAJGZpZWxkcykKICAgIHsKICAgICAgICBpZiggZGVmaW5lZCAkb3B0c3tj +dXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZ9ICkKICAg +ICAgICB7CiAgICAgICAgICAgIHB1c2ggQG5hbWVzLCAkZHMtPnJlcG9zaXRvcnktPnBocmFzZSgg +ImV4cG9ydGZpZWxkb3B0aW9uczokZiIgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAg +IHsKICAgICAgICAgICAgbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29u +ZmlnX3N0cmluZyggJGRzLCAkZiApOwoKICAgICAgICAgICAgaWYgKCRmaWVsZC0+aXNhKCJFUHJp +bnRzOjpNZXRhRmllbGQ6Ok11bHRpcGFydCIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAg +ICBteSAkcGFyZW50X25hbWUgPSAkZmllbGQtPmRpc3BsYXlfbmFtZSggJGZpZWxkLT5yZXBvc2l0 +b3J5ICk7CiAgICAgICAgICAgICAgICBpZiggJGZpZWxkLT5pc2EoICJFUHJpbnRzOjpNZXRhRmll +bGQ6Ok5hbWUiICkpICMgbmVlZCB0byBkZWFsIHdpdGggbGVnYWN5IHBocmFzZSBpZCdzCiAgICAg +ICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkYml0ICggJGZpZWxk +LT5nZXRfaW5wdXRfYml0cygpICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAg +ICAgICAgICAgICRiaXQgPSAiZ2l2ZW5fbmFtZXMiIGlmKCAkYml0IGVxICJnaXZlbiIgKTsKICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJpdCA9ICJmYW1p +bHlfbmFtZXMiIGlmKCAkYml0IGVxICJmYW1pbHkiICk7CiAgICAgICAgICAgICAgICAgICAgICAg +IG15ICRjdXN0b21fcGhyYXNlID0gJGZpZWxkLT5uYW1lIC4gIl8iIC4gJGJpdDsKICAgICAgICAg +ICAgICAgICAgICAgICAgaWYoICRkcy0+cmVwb3NpdG9yeS0+Z2V0X2xhbmctPmhhc19waHJhc2Uo +ICRjdXN0b21fcGhyYXNlICkgKSAjIGFsbG93IGEgY3VzdG9tIHBocmFzZSB0byBiZSB1c2VkCiAg +ICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2gg +QG5hbWVzLCAkZHMtPnJlcG9zaXRvcnktPnBocmFzZSggJGN1c3RvbV9waHJhc2UgKTsKICAgICAg +ICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAg +ICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQG5hbWVz +LCAkcGFyZW50X25hbWUgLiAiOiAiIC4gJGRzLT5yZXBvc2l0b3J5LT5waHJhc2UoICJsaWIvbWV0 +YWZpZWxkOiIuJGJpdCApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAg +ICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRuYW1lID0gJGZpZWxkLT5uYW1lOwogICAg +ICAgICAgICAgICAgICAgIHB1c2ggQG5hbWVzLCBtYXAgewogICAgICAgICAgICAgICAgICAgICAg +ICAkbmFtZSAuICcuJyAuICRfLT57c3ViX25hbWV9CiAgICAgICAgICAgICAgICAgICAgfSBAeyRm +aWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfTsKICAgICAgICAgICAgICAgIH0KICAgICAg +ICAgICAgfQogICAgICAgICAgICBlbHNpZiggJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFGaWVs +ZDo6Q29tcG91bmQiICkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15 +ICRzdWJfZmllbGQgKEB7JGZpZWxkLT5wcm9wZXJ0eSgiZmllbGRzX2NhY2hlIil9KQogICAgICAg +ICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRjdXN0b21fcGhyYXNlID0gJGZpZWxk +LT5uYW1lIC4gIl8iIC4gJHN1Yl9maWVsZC0+bmFtZTsKICAgICAgICAgICAgICAgICAgICBpZigg +JGRzLT5yZXBvc2l0b3J5LT5nZXRfbGFuZy0+aGFzX3BocmFzZSggJGN1c3RvbV9waHJhc2UgKSAp +ICMgYWxsb3cgYSBjdXN0b20gcGhyYXNlIHRvIGJlIHVzZWQKICAgICAgICAgICAgICAgICAgICB7 +CiAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBuYW1lcywgJGRzLT5yZXBvc2l0b3J5LT5waHJh +c2UoICRjdXN0b21fcGhyYXNlICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAg +ICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAg +IHB1c2ggQG5hbWVzLCAkZmllbGQtPmRpc3BsYXlfbmFtZSggJGZpZWxkLT5yZXBvc2l0b3J5ICkg +LiAiOiAiIC4gJHN1Yl9maWVsZC0+ZGlzcGxheV9uYW1lKCAkc3ViX2ZpZWxkLT5yZXBvc2l0b3J5 +ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9 +CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHVzaCBAbmFt +ZXMsICRmaWVsZC0+ZGlzcGxheV9uYW1lKCAkZmllbGQtPnJlcG9zaXRvcnkgKTsKICAgICAgICAg +ICAgfQogICAgICAgIH0KICAgIH0gICAgICAgCiAgICByZXR1cm4gQG5hbWVzOwp9CgpzdWIgZGF0 +YW9ial90b19yb3dzCnsKICAgIG15KCAkc2VsZiwgJGRhdGFvYmosICVvcHRzICkgPSBAXzsKCiAg +ICBteSAkbWFpbl9kYXRhb2JqID0gJGRhdGFvYmo7ICMgc3RvcmUgZGF0YW9iaiBmb3IgZnV0dXJl +IHJlZmVyZW5jZQoKICAgIG15ICRmaWVsZHMgPSAkb3B0c3tmaWVsZHN9IHx8IFskc2VsZi0+Zmll +bGRzKCRkYXRhb2JqLT57ZGF0YXNldH0pXTsKICAgIG15ICRkcyA9ICRvcHRze2xpc3R9LT57ZGF0 +YXNldH07CgogICAgbXkgQHJvd3MgPSAoW10pOwogICAgZm9yZWFjaCBteSAkZm5hbWUgKEAkZmll +bGRzKQogICAgewogICAgICAgICNyZXNldCBkYXRhb2JqIHRvIG1haW4gZGF0YW9iagogICAgICAg +ICRkYXRhb2JqID0gJG1haW5fZGF0YW9iajsKCiAgICAgICAgIyBnZXQgdGhlIGZpZWxkIGZyb20g +dGhlIGlkCiAgICAgICAgbXkgJGZpZWxkOwogICAgICAgIG15IEBmbmFtZXMgPSBzcGxpdCggL1wu +LywgJGZuYW1lICk7CiAgICAgICAgbXkgJHN1Yl9kYXRhb2JqX3ZhbHVlcyA9IFtdOyAgICAgICAg +CiAgICAgICAgaWYoIHNjYWxhciggQGZuYW1lcyA+IDEgKSApICMgYSBmaWVsZCBvZiBhbm90aGVy +IGRhdGFzZXQsIGUuZy4gZG9jdW1lbnRzLmNvbnRlbnQKICAgICAgICAgICAgICAgIHsKICAgICAg +ICAgICAgJGZpZWxkID0gJGRzLT5nZXRfZmllbGQoICRmbmFtZXNbMF0gKTsgIyBmaXJzdCBnZXQg +dGhlIGZpZWxkCiAgICAgICAgICAgIGlmKCAkZmllbGQtPmlzX3R5cGUoICJzdWJvYmplY3QiLCAi +aXRlbXJlZiIgKSApICMgaWYgdGhlIGZpZWxkIGJlbG9uZ3MgdG8gYW5vdGhlciBkYXRhc2V0CiAg +ICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRzdWJfZHNfaWQgPSAkZmllbGQtPmdldF9w +cm9wZXJ0eSggImRhdGFzZXRpZCIgKTsKICAgICAgICAgICAgICAgIG15ICRtdWx0aXBsZSA9ICRm +aWVsZC0+Z2V0X3Byb3BlcnR5KCAibXVsdGlwbGUiICk7CiAgICAgICAgICAgICAgICBpZiggJG11 +bHRpcGxlICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSBAc3ViX2Rh +dGFvYmpzOwogICAgICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBkYXRhb2JqcyBvZiB0aGlzIGZp +ZWxkCiAgICAgICAgICAgICAgICAgICAgaWYoICRzdWJfZHNfaWQgZXEgImRvY3VtZW50IiApICMg +ZG9jdW1lbnRzIHJlcHJlc2VudCBhIHNwZWNpYWwgY2FzZSBvZiBzdWIgb2JqZWN0IC0gd2UgZG9u +J3Qgd2FudCB2b2xhdGlsZSBkb2N1bWVudHMgKHByb2JhYmx5KQogICAgICAgICAgICAgICAgICAg +IHsKICAgICAgICAgICAgICAgICAgICAgICAgQHN1Yl9kYXRhb2JqcyA9ICRkYXRhb2JqLT5nZXRf +YWxsX2RvY3VtZW50czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAg +ZWxzZQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFj +aCBteSAkc3ViX29iaiAoIEB7JGRhdGFvYmotPnZhbHVlKCAkZm5hbWVzWzBdICl9ICkKICAgICAg +ICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAc3Vi +X2RhdGFvYmpzLCAkZmllbGQtPmdldF9pdGVtKCAkZGF0YW9iai0+cmVwb3NpdG9yeSwgJHN1Yl9v +YmogKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAg +ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAjIGFuZCBidWlsZCB1cCBhbiBh +cnJheSBvZiB0aGVzZSBzdWIgZGF0YW9iaidzIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIGZv +cmVhY2ggbXkgJG9iaiAoIEBzdWJfZGF0YW9ianMgKSAjIGdldCB0aGUgdmFsdWVzIHdlIGFyZSBy +ZXF1ZXN0aW5nIG9mIHRoZSBkYXRhb2JqZWN0cwogICAgICAgICAgICAgICAgICAgIHsKICAgICAg +ICAgICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgYSBjdXN0b20gcmVuZGVyZXIKICAgICAgICAg +ICAgICAgICAgICAgICAgbXkgJHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiggZGVm +aW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZpbmVkICRvcHRze2N1c3RvbV9leHBvcnR9 +LT57JGZuYW1lfSApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICR2YWx1ZSA9ICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfS0+KCAkb2Jq +LCAkb3B0c3twbHVnaW59ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAg +ICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAg +ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZmllbGQgPSBFUHJpbnRz +OjpVdGlsczo6ZmllbGRfZnJvbV9jb25maWdfc3RyaW5nKCAkb2JqLT5kYXRhc2V0LCAkZm5hbWVz +WzFdICk7ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg +ICAgaWYoICRmaWVsZC0+Z2V0X3Byb3BlcnR5KCAidmlydHVhbCIgKSApICMgdmlydHVhbCBmaWVs +ZHMgbmVlZCByZW5kZXJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191 +dGY4KCAkb2JqLT5yZW5kZXJfdmFsdWUoICRmbmFtZXNbMV0gKSApOwogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAjIHJlZ3VsYXIg +ZmllbGQgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmV0cmlldmVkCiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJGZpZWxk +LT5nZXRfdmFsdWUoICRvYmogKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAg +ICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7JHN1Yl9k +YXRhb2JqX3ZhbHVlc30sICR2YWx1ZTsgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAg +ICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSAjIHdlIG9ubHkgaGF2ZSBvbmUgc3ViLW9iamVj +dCwgCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJHN1Yl9vYmo7CiAg +ICAgICAgICAgICAgICAgICAgaWYoIHJlZiggJGZpZWxkICkgZXEgIkVQcmludHM6Ok1ldGFGaWVs +ZDo6U3Vib2JqZWN0IiApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAg +ICAgICAkc3ViX29iaiA9ICRkYXRhb2JqLT52YWx1ZSggJGZuYW1lc1swXSApOwogICAgICAgICAg +ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlICMgZG8gaXQgdGhlIG9yaWdpbmFs +IHdheSAoYXNzdW1pbmcgdGhpcyBldmVyIHdvcmtlZC4uLj8KICAgICAgICAgICAgICAgICAgICB7 +CiAgICAgICAgICAgICAgICAgICAgICAgICRzdWJfb2JqID0gJGZpZWxkLT5nZXRfaXRlbSggJGRh +dGFvYmotPnJlcG9zaXRvcnksICRkYXRhb2JqLT52YWx1ZSggJGZuYW1lc1swXSApICk7ICMgZ2V0 +IHRoZSBzdWJvYmplY3QKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAg +IAogICAgICAgICAgICAgICAgICAgICRmaWVsZCA9IEVQcmludHM6OlV0aWxzOjpmaWVsZF9mcm9t +X2NvbmZpZ19zdHJpbmcoICRzdWJfb2JqLT5kYXRhc2V0LCAkZm5hbWVzWzFdICk7ICMgZ2V0IHRo +ZSBzdWJvYmplY3RzIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgbXkgJHZhbHVlID0gJGZpZWxk +LT5nZXRfdmFsdWUoICRzdWJfb2JqICk7ICMgZ2V0IHRoZSBzdWJvYmplY3RzIHZhbHVlIGZvciB0 +aGlzIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRzdWJfZGF0YW9ial92YWx1ZXN9 +LCAkdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAg +ICAgIG15ICRpID0gQHskcm93c1swXX07CiAgICAgICAgbXkgJF9yb3dzOwogICAgICAgIGlmKCBF +UHJpbnRzOjpVdGlsczo6aXNfc2V0KCAkZmllbGQgKSApICMgd2UgYWxyZWFkeSBoYXZlIG91ciB2 +YWx1ZXMKICAgICAgICB7CiAgICAgICAgICAgIGlmKCBzY2FsYXIgQHskc3ViX2RhdGFvYmpfdmFs +dWVzfSA+IDAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkX3Jvd3MgPSAkc2VsZi0+ +dmFsdWVfdG9fcm93cygkZmllbGQsICRzdWJfZGF0YW9ial92YWx1ZXMsICRkYXRhb2JqKTsgICAg +ICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgIyB0aGVyZSdzIG5vIHJlc3Vs +dHMsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIGFkZCBhbiBlbXB0eSBjZWxsIHRvIHRoZSBzcHJlYWRz +aGVldAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkX3Jvd3MgPSAkc2VsZi0+dmFsdWVf +dG9fcm93cygkZmllbGQsIHVuZGVmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBl +bHNlICMgd2UgbmVlZCB0byByZXRyaWV2ZSBvdXIgdmFsdWVzIGZvciB0aGlzIGZpZWxkIGZyb20g +b3VyIGRhdGFvYmogKG9yIHN1Yl9kYXRhb2JqKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJHZh +bHVlOwogICAgICAgICAgICBpZiggZGVmaW5lZCAkb3B0c3tjdXN0b21fZXhwb3J0fSAmJiBkZWZp +bmVkICRvcHRze2N1c3RvbV9leHBvcnR9LT57JGZuYW1lfSApICMgd2UgaGF2ZSBhIGN1c3RvbSBl +eHBvcnRlcgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkdmFsdWUgPSAkb3B0c3tjdXN0 +b21fZXhwb3J0fS0+eyRmbmFtZX0tPiggJGRhdGFvYmosICRvcHRze3BsdWdpbn0gKTsKICAgICAg +ICAgICAgICAgICRfcm93cyA9ICRzZWxmLT5jdXN0b21fdmFsdWVfdG9fcm93cyggJHZhbHVlICk7 +CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSAjIGp1c3QgZ2V0IHRoZSBmaWVsZCdzIHVz +dWFsIHZhbHVlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmaWVsZCA9IEVQcmludHM6 +OlV0aWxzOjpmaWVsZF9mcm9tX2NvbmZpZ19zdHJpbmcoICRkcywgJGZuYW1lICk7CiAgICAgICAg +ICAgICAgICBpZiggJGZpZWxkLT5nZXRfcHJvcGVydHkoICJ2aXJ0dWFsIiApICkgIyB2aXJ0dWFs +IGZpZWxkcyBuZWVkIHJlbmRlcmluZwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAg +ICAgICR2YWx1ZSA9IEVQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRkYXRhb2JqLT5yZW5k +ZXJfdmFsdWUoICRmbmFtZSApICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBl +bHNlICMgcmVndWxhciBmaWVsZCB2YWx1ZXMgY2FuIHNpbXBseSBiZSByZXRyaWV2ZWQKICAgICAg +ICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkZmllbGQtPmdldF92YWx1 +ZSggJGRhdGFvYmogKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRfcm93cyA9 +ICRzZWxmLT52YWx1ZV90b19yb3dzKCRmaWVsZCwgJHZhbHVlLCAkZGF0YW9iaik7ICAgICAgICAK +ICAgICAgICAgICAgfSAgICAgICAgICAgCiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoIG15ICRq +ICgwLi4kIyRfcm93cykKICAgICAgICB7CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJF9pICgwLi4k +I3skX3Jvd3MtPlskal19KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkcm93c1skal1b +JGkrJF9pXSA9ICRfcm93cy0+WyRqXVskX2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAg +fQoKICAgICMgZ2VuZXJhdGUgY29tcGxldGUgcm93cwogICAgaWYoJG9wdHN7cGx1Z2lufS0+cGFy +YW0oICJtdWx0aWxpbmVfcmVwZWF0IiApKSAjIHdlIHdhbnQgZWFjaCBjb2x1bW4gdG8gcmVwZWF0 +IGZvciBlYWNoIHJvdwogICAgewogICAgICAgIGZvcmVhY2ggbXkgJGkgKDAuLihzY2FsYXIgQHJv +d3MpLTEpCiAgICAgICAgewogICAgICAgICAgICBmb3JlYWNoIG15ICRqICgwLi4kI3skcm93c1sw +XX0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRyb3dzWyRpXVskal0gfHw9ICRyb3dz +WzBdWyRqXTsKICAgICAgICAgICAgfSAgIAogICAgICAgIH0KICAgIH0KICAgIGVsc2UgIyB3ZSBk +b24ndCB3YW50IHJlcGVhdGluZyB2YWx1ZXMgaW4gdGhlIGNvbHVtbnMKICAgIHsgICAKICAgICAg +ICBmb3IoQHJvd3MpIHsKICAgICAgICAgICAgJF8tPlswXSA9ICRyb3dzWzBdWzBdOyAjIGZpcnN0 +IGVsZW1lbnQgb2YgdGhpcyBhcnJheSBlcXVhbHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGZp +cnN0IHJvdwogICAgICAgICAgICAkXy0+WyQjeyRyb3dzWzBdfV0gfHw9IHVuZGVmOwogICAgICAg +IH0KCiAgICB9CgogICAgcmV0dXJuIFxAcm93czsKfQoKc3ViIHZhbHVlX3RvX3Jvd3MKewogICAg +bXkgKCRzZWxmLCAkZmllbGQsICR2YWx1ZSwgJGRhdGFvYmopID0gQF87CgogICAgbXkgQHJvd3M7 +CgogICAgaWYgKHJlZigkdmFsdWUpIGVxICJBUlJBWSIpCiAgICB7CiAgICAgICAgJHZhbHVlID0g +WyRmaWVsZC0+ZW1wdHlfdmFsdWVdIGlmICFAJHZhbHVlOwogICAgICAgIEByb3dzID0gbWFwIHsg +JHNlbGYtPnZhbHVlX3RvX3Jvd3MoJGZpZWxkLCAkXywgJGRhdGFvYmopLT5bMF0gfSBAJHZhbHVl +OwogICAgfQogICAgZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6Ok11bHRp +cGFydCIpKQogICAgewogICAgICAgIGlmKCAkZmllbGQtPmlzYSggIkVQcmludHM6Ok1ldGFGaWVs +ZDo6TmFtZSIgKSkgIyBuZWVkIHRvIGRlYWwgd2l0aCBsZWdhY3kgcGhyYXNlIGlkJ3MKICAgICAg +ICB7CiAgICAgICAgICAgIG15IEBiaXRfdmFsdWVzOwogICAgICAgICAgICBmb3JlYWNoIG15ICRi +aXQgKCAkZmllbGQtPmdldF9pbnB1dF9iaXRzKCkgKQogICAgICAgICAgICB7CiAgICAgICAgICAg +ICAgICBwdXNoIEBiaXRfdmFsdWVzLCAkdmFsdWUtPnskYml0fTsKICAgICAgICAgICAgfSAgIAog +ICAgICAgICAgICBwdXNoIEByb3dzLCBcQGJpdF92YWx1ZXM7CiAgICAgICAgfQogICAgICAgIGVs +c2UKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQHJvd3MsIFttYXAgeyAkdmFsdWUtPnskXy0+ +e3N1Yl9uYW1lfX0gfSBAeyRmaWVsZC0+cHJvcGVydHkoImZpZWxkc19jYWNoZSIpfV07CiAgICAg +ICAgfQogICAgfQogICAgZWxzaWYgKCRmaWVsZC0+aXNhKCJFUHJpbnRzOjpNZXRhRmllbGQ6OkNv +bXBvdW5kIikpCiAgICB7CiAgICAgICAgbXkgQHN1Yl92YWx1ZXM7CiAgICAgICAgZm9yZWFjaCBt +eSAka2V5IChrZXlzICV7JHZhbHVlfSkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQHN1Yl92 +YWx1ZXMsICR2YWx1ZS0+eyRrZXl9OwogICAgICAgIH0KICAgICAgICBwdXNoIEByb3dzLCBcQHN1 +Yl92YWx1ZXM7CiAgICB9CiAgICBlbHNpZiggJGZpZWxkLT5pc2EoIkVQcmludHM6Ok1ldGFGaWVs +ZDo6U3ViamVjdCIpKQogICAgewogICAgICAgIGlmKCAkdmFsdWUgbmUgIiIgKQogICAgICAgIHsK +ICAgICAgICAgICAgcHVzaCBAcm93cywgW0VQcmludHM6OlV0aWxzOjp0cmVlX3RvX3V0ZjgoICRm +aWVsZC0+cmVuZGVyX3NpbmdsZV92YWx1ZSggJGZpZWxkLT5yZXBvc2l0b3J5LCAkdmFsdWUgKSAp +XTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHVzaCBAcm93 +cywgWyR2YWx1ZV07CiAgICAgICAgfQogICAgfQogICAgZWxzaWYoICEkZmllbGQtPmlzYSgiRVBy +aW50czo6TWV0YUZpZWxkOjpTdWJvYmplY3QiKSAmJiAkZmllbGQtPmlzX3ZpcnR1YWwgKQogICAg +ewogICAgICAgICNwdXNoIEByb3dzLCBbJGRhdGFvYmotPnJlbmRlcl92YWx1ZSggJGZpZWxkLT5u +YW1lICldOwogICAgICAgIHB1c2ggQHJvd3MsIFskdmFsdWVdOwogICAgfQogICAgZWxzZQogICAg +ewogICAgICAgIHB1c2ggQHJvd3MsIFskdmFsdWVdOwogICAgfQoKICAgIHJldHVybiBcQHJvd3M7 +Cn0KCiMgdXNlZCBmb3IgY3VzdG9tIGV4cG9ydHMgdGhhdCBtaWdodCByZXR1cm4gYSBmaWVsZCBv +ciBhbiBhcnJheSAoYnV0IGFyZW4ndCBuZWNlc2FyaWx5IGFzc29jaWF0ZWQgd2l0aCBhIGZpZWxk +ISkKc3ViIGN1c3RvbV92YWx1ZV90b19yb3dzCnsKICAgIG15ICgkc2VsZiwgJHZhbHVlKSA9IEBf +OwoKICAgIG15IEByb3dzOwoKICAgIGlmIChyZWYoJHZhbHVlKSBlcSAiQVJSQVkiKQogICAgewog +ICAgICAgIEByb3dzID0gbWFwIHsgJHNlbGYtPmN1c3RvbV92YWx1ZV90b19yb3dzKCRfKS0+WzBd +IH0gQCR2YWx1ZTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwdXNoIEByb3dzLCBbJHZh +bHVlXTsKICAgIH0KCiAgICByZXR1cm4gXEByb3dzOwp9CgoKMTsKCj1oZWFkMSBDT1BZUklHSFQK Cj1mb3IgQ09QWVJJR0hUIEJFR0lOCgpDb3B5cmlnaHQgMjAwMC0yMDExIFVuaXZlcnNpdHkgb2Yg U291dGhhbXB0b24uCgo9Zm9yIENPUFlSSUdIVCBFTkQKCj1mb3IgTElDRU5TRSBCRUdJTgoKVGhp cyBmaWxlIGlzIHBhcnQgb2YgRVByaW50cyBMPGh0dHA6Ly93d3cuZXByaW50cy5vcmcvPi4KCkVQ @@ -799,9 +849,9 @@ XCIkdmFsdWVcIiI7Cgl9CgoJcmV0dXJuICR2YWx1ZTsKfQoKCjE7Cg== document plugins/EPrints/Plugin/Screen/Report.pm text/plain - a76848e873791f84698b90d0ed1cb3ea + 3f96896809763ee15750ac37e2c1b899 MD5 - 45726 + 45813 cGFja2FnZSBFUHJpbnRzOjpQbHVnaW46OlNjcmVlbjo6UmVwb3J0OwoKIyBBYnN0cmFjdCBjbGFz cyB0aGF0IGhhbmRsZXMgdGhlIFJlcG9ydCB0b29scwoKdXNlIEpTT04gcXcoZW5jb2RlX2pzb24p Owp1c2UgRVByaW50czo6UGx1Z2luOjpTY3JlZW47CkBJU0EgPSAoICdFUHJpbnRzOjpQbHVnaW46 @@ -1309,302 +1359,303 @@ dGlvbnN7Y29sbGFwc2VkfSA9IDE7Cgkkb3B0aW9uc3tjb250ZW50fSA9ICRmb3JtOwogICAgICAg ICRvcHRpb25ze3Nob3dfaWNvbl91cmx9ID0gIiRpbWFnZXN1cmwvbXVsdGlfZG93bi5wbmciOwoJ JG9wdGlvbnN7aGlkZV9pY29uX3VybH0gPSAiJGltYWdlc3VybC9tdWx0aV91cC5wbmciOwoKCW15 ICRib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiZGl2Iiwgc3R5bGU9PiJ0ZXh0LWFsaWduOiBs -ZWZ0IiApOwoJJGJveC0+YXBwZW5kQ2hpbGQoIEVQcmludHM6OkJveDo6cmVuZGVyKCAlb3B0aW9u -cyApICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkYm94ICk7CgoJcmV0dXJuICRjaHVuazsKfQoK -c3ViIHJlbmRlcl9zb3J0X29wdGlvbnMKewoJbXkoICRzZWxmICkgPSBAXzsKCglteSAkcmVwbyA9 -ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVu -dDsKCglyZXR1cm4gJGNodW5rIHVubGVzcyggZGVmaW5lZCggJHJlcG8tPmNvbmZpZyggJHNlbGYt -Pntzb3J0X2NvbmZ9LCAic29ydGZpZWxkcyIgKSApICk7CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBv -LT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNvcnRmaWVsZHMiICk7CgoJI2J1aWxkIHRo -ZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1 -dGUoIG5hbWUgPT4gInNvcnRfcmVwb3J0IiApOwogICAgICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUo -IG1ldGhvZCA9PiAiZ2V0IiApOwoJJGNodW5rLT5hcHBlbmRDaGlsZCggJGZvcm0gKTsKCQoJaWYo -IGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiApIHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+ -e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJl -bmRlcl9oaWRkZW5fZmllbGQoICJzZWFyY2giLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNo -fS0+c2VyaWFsaXNlKSApOwoJfQoKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dy -b3VwX2V4cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5f -ZmllbGQoICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9leHB9ICkgKTsKCX0K -CgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGZvcm0KCW15ICRmaXJz -dCA9IDE7CglteSAkc29ydF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVh -Y2ggbXkgJHNvcnRfbmFtZSAoIGtleXMgJXskc29ydF9jb25mfSApCiAgICAgICAgewoJCW15ICRz -b3J0X3ZhbHVlID0gJHNvcnRfY29uZi0+eyRzb3J0X25hbWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsK -CQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQi -LCAkc29ydF92YWx1ZSkgKTsKCQl9CgoJCWlmKCAhJGZpcnN0ICkKICAgICAgICAgICAgICAgIHsK -ICAgICAgICAgICAgICAgIAkkc29ydF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo -cmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBhcmF0b3IiICkgKTsKICAgICAgICAgICAgICAg -IH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+ -e3Byb2Nlc3Nvcn0tPntzb3J0fSBlcSAkc29ydF92YWx1ZSApCgkJewoJCQlteSAkc3Ryb25nID0g -JHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsKCQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQo -ICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29y -dF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJ -CWVsc2UKCQl7CgkJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpz -b3J0X3JlcG9ydCgiJy4kc29ydF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQo -ICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29y -dF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVuZENoaWxkKCAkbGluayApOwoJCX0KCQkk -Zmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJJGNodW5rLT5hcHBlbmRDaGlsZCggJHJl -cG8tPmh0bWxfcGhyYXNlKCAiUmVwb3J0OnNvcnRfbGlua3MiLCBsaW5rcz0+JHNvcnRfbGlua3Mg -KSApOwoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9ncm91cF9vcHRpb25zCnsKCW15KCAk -c2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+cmVwb3NpdG9yeTsKCglteSAkY2h1bmsg -PSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0dXJuICRjaHVuayB1bmxlc3MoIGRlZmlu -ZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57Z3JvdXBfY29uZn0sICJncm91cGZpZWxkcyIgKSAp -ICk7CgoJbXkgJGdyb3VwX2NvbmYgPSAkcmVwby0+Y29uZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9 -LCAiZ3JvdXBmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5y -ZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gImdyb3VwX3JlcG9ydCIg -KTsKICAgICAgICAkZm9ybS0+c2V0QXR0cmlidXRlKCBtZXRob2QgPT4gImdldCIgKTsKCSRjaHVu -ay0+YXBwZW5kQ2hpbGQoICRmb3JtICk7CgkKCWlmKCBkZWZpbmVkICRyZXBvLT5wYXJhbSggInNl -YXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnthY3Rpb259IGVxICJzZWFyY2giICkKCXsK -CQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNo -IiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZSkgKTsKCX0KCglpZigg -ZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSApCgl7CgkJJGZvcm0tPmFwcGVuZENo -aWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAgJHNlbGYtPntwcm9jZXNz -b3J9LT57c29ydH0gKSApOwoJfQoKCSNkaXNwbGF5IHRoZSBsaW5rcyB0aGF0IHdpbGwgdHJpZ2dl -ciB0aGUgZm9ybQoJbXkgJGZpcnN0ID0gMTsKCW15ICRncm91cF9saW5rcyA9ICRyZXBvLT5tYWtl -X2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJGdyb3VwX3ZhbHVlICggQHskZ3JvdXBfY29uZn0g -KQogICAgICAgIHsKCQlteSAoJGdyb3VwX2ZpZWxkKSA9IHNwbGl0KC87LywgJGdyb3VwX3ZhbHVl -ICk7CgkJaWYoICRmaXJzdCApCgkJewoJCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5k -ZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAkZ3JvdXBfdmFsdWUpICk7CgkJfQoKCQlpZiggISRm -aXJzdCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAJJGdyb3VwX2xpbmtzLT5h -cHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiVXBkYXRlL1ZpZXdzOmdyb3VwX3NlcGFy -YXRvciIgKSApOwogICAgICAgICAgICAgICAgfQoJCQoJCWlmKCBkZWZpbmVkICRzZWxmLT57cHJv -Y2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gZXEgJGdyb3Vw -X2ZpZWxkICkKCQl7CgkJCW15ICRzdHJvbmcgPSAkcmVwby0+bWFrZV9lbGVtZW50KCAic3Ryb25n -IiApOwoJCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAkc2VsZi0+ -e2dyb3VwX2NvbmZ9IC4gIjpncm91cDoiIC4gJGdyb3VwX2ZpZWxkICkgKTsKCQkJJGdyb3VwX2xp -bmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJCX0KCQllbHNlCgkJewoJCQlteSAkbGluayA9 -ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6Z3JvdXBfcmVwb3J0KCInLiRncm91cF92 -YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSgg -JHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAuICRncm91cF9maWVsZCApICk7CgkJCSRn -cm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7CgkJfQoJCSRmaXJzdCA9IDA7CiAgICAg -ICAgfSAgICAgICAgICAgCgkKCSNubyBncm91cGluZyBsaW5rIGF0IHRoZSBlbmQKCSRncm91cF9s -aW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91 -cF9zZXBhcmF0b3IiICkgKTsKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3Vw -fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0gbmUgIiIgKQoJewoJCW15ICRsaW5rID0g -JHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpncm91cF9yZXBvcnQoIiIpJyApOwkKCQkk -bGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggInJlcG9ydDpub19ncm91cGlu -ZyIgKSApOwoJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7Cgl9CgllbHNlCgl7 -CgkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJzdHJvbmciICk7CiAJCSRzdHJv -bmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJhc2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmci -ICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxkKCAkc3Ryb25nICk7Cgl9CgkKCSRjaHVu -ay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpncm91cF9saW5rcyIs -IGxpbmtzPT4kZ3JvdXBfbGlua3MgKSApOwoKCXJldHVybiAkY2h1bms7Cn0KCnN1YiByZW5kZXJf -cmVmaW5lX3NlYXJjaAp7CglteSggJHNlbGYgKSA9IEBfOwoKCW15ICRyZXBvID0gJHNlbGYtPnJl -cG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1ha2VfZG9jX2ZyYWdtZW50OwoJCglpZigg -ZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkgfHwgJHNlbGYtPntwcm9jZXNzb3J9LT57 -YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJbXkgJGVzY2V4cCA9ICRzZWxmLT57cHJvY2Vzc29y -fS0+e3NlYXJjaH0tPnNlcmlhbGlzZTsKCQlteSAkY2FjaGVpZCA9ICRyZXBvLT5wYXJhbSggImNh -Y2hlIiApOwoJCW15ICRzY29uZiA9ICRzZWxmLT57c2NvbmZ9OwkKCgkJI3NldCB1cCBuZXcgc2Vh -cmNoIGxpbmsKCQlteSAkbmV3X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+ -Z2V0X3VyaSApOwogICAgICAgIAkkbmV3X2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgICAg -ICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAoJCQlzY29uZiA9PiAkc2NvbmYsCiAgICAgICAgCSk7 -CgoJCW15ICRzZWFyY2hfbGlua3MgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgkJbXkgJG5l -d19saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJG5ld19iYXNldXJsJl9hY3Rpb25fbmV3c2Vh -cmNoPTEiICk7CgkgICAJJG5ld19saW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNl -KCAibGliL3NlYXJjaGV4cHJlc3Npb246bmV3IiApICk7CgkJJHNlYXJjaF9saW5rcy0+YXBwZW5k -Q2hpbGQoICRuZXdfbGluayApOwoKCQkjYWRkIGEgc2VwYXJhdG9yLi4uCgkJJHNlYXJjaF9saW5r -cy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9z -ZXBhcmF0b3IiICkgKTsKCgkJI3NldCB1cCByZWZpbmUgc2VhcmNoIGxpbmsKCQlteSAkcmVmaW5l -X2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAgICAg -IAkkcmVmaW5lX2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkgICAgICAgIAljYWNoZSA9PiAkY2FjaGVp -ZCwKCSAgICAgICAgICAgICAgICBleHAgPT4gJGVzY2V4cCwKICAgICAgICAJICAgICAgICBzY3Jl -ZW4gPT4gIlJlcG9ydCIsCiAgICAgICAgICAgICAgICAJZGF0YXNldCA9PiAkc2VsZi0+e2RhdGFz -ZXRpZH0sCiAgICAgICAgICAgICAgICAJb3JkZXIgPT4gJHNlbGYtPntwcm9jZXNzb3J9LT57c2Vh -cmNofS0+e2N1c3RvbV9vcmRlcn0sCgkJCXNjb25mID0+ICRzY29uZiwKICAgICAgICAJKTsKCgkJ -bXkgJHJlZmluZV9saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJHJlZmluZV9iYXNldXJsJl9h -Y3Rpb25fdXBkYXRlPTEiICk7CiAgICAgIAkJJHJlZmluZV9saW5rLT5hcHBlbmRDaGlsZCggJHJl -cG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246cmVmaW5lIiApICk7ICAgCSAg -ICAgICAgIAoJICAgICAgICAkc2VhcmNoX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJlZmluZV9saW5r -ICk7CgoJCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlJlcG9ydDpz -ZWFyY2hfbGlua3MiLCBsaW5rcz0+JHNlYXJjaF9saW5rcyApICk7Cgl9CgoJcmV0dXJuICRjaHVu -azsKfQoKCiNhZGRzIGEgbmV3IGNoZWNrYm94IHRvIGFsbG93IHRoZSB1c2VyIHRvIGNob29zZSB3 -aGljaCBmaWVsZHMgdG8gZXhwb3J0CnN1YiBfZXhwb3J0X2ZpZWxkX2NoZWNrYm94CnsKCW15KCAk -c2VsZiwgJHJlcG8sICRmaWVsZG5hbWUsICR1bCwgJGZpZWxkbGFiZWwgKSA9IEBfOwoKCW15ICRs -aSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsaSIgKTsKCSR1bC0+YXBwZW5kQ2hpbGQoICRsaSAp -OwoKICAgICAgICBteSAkY2hlY2tib3ggPSAkcmVwby0+bWFrZV9lbGVtZW50KCAiaW5wdXQiLCB0 -eXBlID0+ICJjaGVja2JveCIsIGlkID0+ICRmaWVsZG5hbWUsIG5hbWUgPT4gJGZpZWxkbmFtZSwg -dmFsdWUgPT4gJGZpZWxkbmFtZSApOwoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYt -PntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKSApCgl7CgkJaWYoICggZ3Jl -cCB7ICRmaWVsZG5hbWUgZXEgJF8gfSBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2Nv -bmZ9LCAiZXhwb3J0ZmllbGRfZGVmYXVsdHMiICl9ICkgfHwgKCBzY2FsYXIoIEB7JHJlcG8tPmNv -bmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZhdWx0cyIgKX0gKSA9 -PSAwICkgKQoJCXsKCQkJI29ubHkgY2hlY2sgZGVmYXVsdHMgb3IgY2hlY2sgZXZlcnl0aGluZyBp -ZiBkZWZhdWx0cyBub3QgZGVmaW5lZAoJCQkkY2hlY2tib3gtPnNldEF0dHJpYnV0ZSggImNoZWNr -ZWQiLCAieWVzIiApOwoJCX0KCX0KCW15ICRsYWJlbCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJs -YWJlbCIsIGZvciA9PiAkZmllbGRuYW1lICk7CgkkbGFiZWwtPmFwcGVuZENoaWxkKCAkZmllbGRs -YWJlbCApOwoKCSRsaS0+YXBwZW5kQ2hpbGQoICRjaGVja2JveCApOwoJJGxpLT5hcHBlbmRDaGls -ZCggJGxhYmVsICk7Cn0KCiMjIyB1dGlsaXR5IG1ldGhvZHMKCiMgVE9ETyBzaG91bGQgdXNlICJK -U09OIiBwYWNrYWdlCnN1YiB0b19qc29uCnsKICAgICAgICBteSggJHNlbGYsICRvYmplY3QgKSA9 -IEBfOwoKCXJldHVybiAiIiBpZiggIWRlZmluZWQgJG9iamVjdCApOwoKIyBVVEYtOCBpc3N1ZXM6 -CiMJcmV0dXJuIEpTT04tPm5ldy0+dXRmOCgxKS0+ZW5jb2RlKCAkb2JqZWN0ICk7CgogICAgICAg -IGlmKCByZWYoICRvYmplY3QgKSBlcSAnSEFTSCcgKQogICAgICAgIHsKICAgICAgICAgICAgICAg -IG15IEBzdHVmZjsKICAgICAgICAgICAgICAgIHdoaWxlKCBteSggJGssICR2ICkgPSBlYWNoKCAl -JG9iamVjdCApICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4 -dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19zZXQoICR2ICkgKTsgICAgICAgIyBvciAnbnVsbCcg -PwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVmZiwgRVByaW50czo6VXRpbHM6Ompz -X3N0cmluZyggJGsgKS4nOicuJHNlbGYtPnRvX2pzb24oICR2ICkKICAgICAgICAgICAgICAgIH0K -ICAgICAgICAgICAgICAgIHJldHVybiAneycgLiBqb2luKCAiLCIsIEBzdHVmZiApIC4gJ30nOwog -ICAgICAgIH0KICAgICAgICBlbHNpZiggcmVmKCAkb2JqZWN0ICkgZXEgJ0FSUkFZJyApCiAgICAg -ICAgewogICAgICAgICAgICAgICAgbXkgQHN0dWZmOwogICAgICAgICAgICAgICAgZm9yZWFjaCgg -QCRvYmplY3QgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0 -IGlmKCAhRVByaW50czo6VXRpbHM6OmlzX3NldCggJF8gKSApOwogICAgICAgICAgICAgICAgICAg -ICAgICBwdXNoIEBzdHVmZiwgJHNlbGYtPnRvX2pzb24oICRfICk7CiAgICAgICAgICAgICAgICB9 -CiAgICAgICAgICAgICAgICByZXR1cm4gJ1snIC4gam9pbiggIiwiLCBAc3R1ZmYgKSAuICddJzsK -ICAgICAgICB9CgogICAgICAgIHJldHVybiBFUHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkb2Jq -ZWN0ICk7Cn0KCnN1YiBleHBvcnRfcGx1Z2lucwp7CiAgICAgICAgbXkoICRzZWxmLCAkZ2VuZXJp -YyApID0gQF87CgoJbXkgQHBsdWdpbl9pZHM7CgkKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRv -cnk7CgoJaWYoIGRlZmluZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJl -eHBvcnRfcGx1Z2lucyIgKSApCgl7CgkJQHBsdWdpbl9pZHMgPSBAeyRyZXBvLT5jb25maWcoICRz -ZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0X3BsdWdpbnMiICl9OwoJfQkKCWVsc2lmKCAkZ2Vu -ZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0gJHJlcG8tPnBsdWdpbl9saXN0KAogICAgICAgICAg -ICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkgICAgICAgICAgICAgICAgY2FuX2FjY2VwdCA9PiAi -cmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwK -CQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwoJfQoJZWxzZQoJewogICAgICAgIAlA -cGx1Z2luX2lkcyA9ICRyZXBvLT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ -ICJFeHBvcnQiLAoJICAgICAgICAgICAgICAgIGNhbl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxm -LT5nZXRfcmVwb3J0LAogICAgICAgIAkgICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJ -aXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAgICApOwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJ -Zm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lkcyApCiAgICAgICAgewogICAgICAgICAgICAgICAg -bXkgJHAgPSAkcmVwby0+cGx1Z2luKCAiJGlkIiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBw +ZWZ0IiwgY2xhc3M9PiRzZWxmLT57cmVwb3J0fSApOwoJJGJveC0+YXBwZW5kQ2hpbGQoIEVQcmlu +dHM6OkJveDo6cmVuZGVyKCAlb3B0aW9ucyApICk7CgkkY2h1bmstPmFwcGVuZENoaWxkKCAkYm94 +ICk7CgoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRlcl9zb3J0X29wdGlvbnMKewoJbXkoICRz +ZWxmICkgPSBAXzsKCglteSAkcmVwbyA9ICRzZWxmLT5yZXBvc2l0b3J5OwoKCW15ICRjaHVuayA9 +ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCglyZXR1cm4gJGNodW5rIHVubGVzcyggZGVmaW5l +ZCggJHJlcG8tPmNvbmZpZyggJHNlbGYtPntzb3J0X2NvbmZ9LCAic29ydGZpZWxkcyIgKSApICk7 +CgoJbXkgJHNvcnRfY29uZiA9ICRyZXBvLT5jb25maWcoICRzZWxmLT57c29ydF9jb25mfSwgInNv +cnRmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBmb3JtCglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJf +Zm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUoIG5hbWUgPT4gInNvcnRfcmVwb3J0IiApOwogICAg +ICAgICRmb3JtLT5zZXRBdHRyaWJ1dGUoIG1ldGhvZCA9PiAiZ2V0IiApOwoJJGNodW5rLT5hcHBl +bmRDaGlsZCggJGZvcm0gKTsKCQoJaWYoIGRlZmluZWQgJHJlcG8tPnBhcmFtKCAic2VhcmNoIiAp +IHx8ICRzZWxmLT57cHJvY2Vzc29yfS0+e2FjdGlvbn0gZXEgInNlYXJjaCIgKQoJewoJCSRmb3Jt +LT5hcHBlbmRDaGlsZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJzZWFyY2giLCAgJHNl +bGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+c2VyaWFsaXNlKSApOwoJfQoKCWlmKCBkZWZpbmVk +ICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX2V4cH0gKQoJewoJCSRmb3JtLT5hcHBlbmRDaGls +ZCggJHJlcG8tPnJlbmRlcl9oaWRkZW5fZmllbGQoICJncm91cCIsICAkc2VsZi0+e3Byb2Nlc3Nv +cn0tPntncm91cF9leHB9ICkgKTsKCX0KCgkjZGlzcGxheSB0aGUgbGlua3MgdGhhdCB3aWxsIHRy +aWdnZXIgdGhlIGZvcm0KCW15ICRmaXJzdCA9IDE7CglteSAkc29ydF9saW5rcyA9ICRyZXBvLT5t +YWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJHNvcnRfbmFtZSAoIGtleXMgJXskc29ydF9j +b25mfSApCiAgICAgICAgewoJCW15ICRzb3J0X3ZhbHVlID0gJHNvcnRfY29uZi0+eyRzb3J0X25h +bWV9OwoJCWlmKCAkZmlyc3QgKQoJCXsKCQkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVu +ZGVyX2hpZGRlbl9maWVsZCggInNvcnQiLCAkc29ydF92YWx1ZSkgKTsKCQl9CgoJCWlmKCAhJGZp +cnN0ICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIAkkc29ydF9saW5rcy0+YXBw +ZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBhcmF0 +b3IiICkgKTsKICAgICAgICAgICAgICAgIH0KCQkKCQlpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nl +c3Nvcn0tPntzb3J0fSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0fSBlcSAkc29ydF92YWx1 +ZSApCgkJewoJCQlteSAkc3Ryb25nID0gJHJlcG8tPm1ha2VfZWxlbWVudCggInN0cm9uZyIgKTsK +CQkJJHN0cm9uZy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0 +X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVu +ZENoaWxkKCAkc3Ryb25nICk7CgkJfQoJCWVsc2UKCQl7CgkJCW15ICRsaW5rID0gJHJlcG8tPnJl +bmRlcl9saW5rKCAnamF2YXNjcmlwdDpzb3J0X3JlcG9ydCgiJy4kc29ydF92YWx1ZS4nIiknICk7 +CQoJCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntzb3J0 +X2NvbmZ9IC4gIjpzb3J0OiIgLiAkc29ydF9uYW1lICkgKTsKCQkJJHNvcnRfbGlua3MtPmFwcGVu +ZENoaWxkKCAkbGluayApOwoJCX0KCQkkZmlyc3QgPSAwOwogICAgICAgIH0gICAgICAgICAgIAoJ +JGNodW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAiUmVwb3J0OnNvcnRfbGlu +a3MiLCBsaW5rcz0+JHNvcnRfbGlua3MgKSApOwoJcmV0dXJuICRjaHVuazsKfQoKc3ViIHJlbmRl +cl9ncm91cF9vcHRpb25zCnsKCW15KCAkc2VsZiApID0gQF87CgoJbXkgJHJlcG8gPSAkc2VsZi0+ +cmVwb3NpdG9yeTsKCglteSAkY2h1bmsgPSAkcmVwby0+bWFrZV9kb2NfZnJhZ21lbnQ7CgoJcmV0 +dXJuICRjaHVuayB1bmxlc3MoIGRlZmluZWQoICRyZXBvLT5jb25maWcoICRzZWxmLT57Z3JvdXBf +Y29uZn0sICJncm91cGZpZWxkcyIgKSApICk7CgoJbXkgJGdyb3VwX2NvbmYgPSAkcmVwby0+Y29u +ZmlnKCAkc2VsZi0+e2dyb3VwX2NvbmZ9LCAiZ3JvdXBmaWVsZHMiICk7CgoJI2J1aWxkIHRoZSBm +b3JtCglteSAkZm9ybSA9ICRzZWxmLT5yZW5kZXJfZm9ybTsKCSRmb3JtLT5zZXRBdHRyaWJ1dGUo +IG5hbWUgPT4gImdyb3VwX3JlcG9ydCIgKTsKICAgICAgICAkZm9ybS0+c2V0QXR0cmlidXRlKCBt +ZXRob2QgPT4gImdldCIgKTsKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRmb3JtICk7CgkKCWlmKCBk +ZWZpbmVkICRyZXBvLT5wYXJhbSggInNlYXJjaCIgKSB8fCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPnth +Y3Rpb259IGVxICJzZWFyY2giICkKCXsKCQkkZm9ybS0+YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5k +ZXJfaGlkZGVuX2ZpZWxkKCAic2VhcmNoIiwgICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0t +PnNlcmlhbGlzZSkgKTsKCX0KCglpZiggZGVmaW5lZCAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntzb3J0 +fSApCgl7CgkJJGZvcm0tPmFwcGVuZENoaWxkKCAkcmVwby0+cmVuZGVyX2hpZGRlbl9maWVsZCgg +InNvcnQiLCAgJHNlbGYtPntwcm9jZXNzb3J9LT57c29ydH0gKSApOwoJfQoKCSNkaXNwbGF5IHRo +ZSBsaW5rcyB0aGF0IHdpbGwgdHJpZ2dlciB0aGUgZm9ybQoJbXkgJGZpcnN0ID0gMTsKCW15ICRn +cm91cF9saW5rcyA9ICRyZXBvLT5tYWtlX2RvY19mcmFnbWVudDsKCWZvcmVhY2ggbXkgJGdyb3Vw +X3ZhbHVlICggQHskZ3JvdXBfY29uZn0gKQogICAgICAgIHsKCQlteSAoJGdyb3VwX2ZpZWxkKSA9 +IHNwbGl0KC87LywgJGdyb3VwX3ZhbHVlICk7CgkJaWYoICRmaXJzdCApCgkJewoJCQkkZm9ybS0+ +YXBwZW5kQ2hpbGQoICRyZXBvLT5yZW5kZXJfaGlkZGVuX2ZpZWxkKCAiZ3JvdXAiLCAkZ3JvdXBf +dmFsdWUpICk7CgkJfQoKCQlpZiggISRmaXJzdCApCiAgICAgICAgICAgICAgICB7CiAgICAgICAg +ICAgICAgICAJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAi +VXBkYXRlL1ZpZXdzOmdyb3VwX3NlcGFyYXRvciIgKSApOwogICAgICAgICAgICAgICAgfQoJCQoJ +CWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nl +c3Nvcn0tPntncm91cH0gZXEgJGdyb3VwX2ZpZWxkICkKCQl7CgkJCW15ICRzdHJvbmcgPSAkcmVw +by0+bWFrZV9lbGVtZW50KCAic3Ryb25nIiApOwoJCQkkc3Ryb25nLT5hcHBlbmRDaGlsZCggJHJl +cG8tPmh0bWxfcGhyYXNlKCAkc2VsZi0+e2dyb3VwX2NvbmZ9IC4gIjpncm91cDoiIC4gJGdyb3Vw +X2ZpZWxkICkgKTsKCQkJJGdyb3VwX2xpbmtzLT5hcHBlbmRDaGlsZCggJHN0cm9uZyApOwoJCX0K +CQllbHNlCgkJewoJCQlteSAkbGluayA9ICRyZXBvLT5yZW5kZXJfbGluayggJ2phdmFzY3JpcHQ6 +Z3JvdXBfcmVwb3J0KCInLiRncm91cF92YWx1ZS4nIiknICk7CQoJCQkkbGluay0+YXBwZW5kQ2hp +bGQoICRyZXBvLT5odG1sX3BocmFzZSggJHNlbGYtPntncm91cF9jb25mfSAuICI6Z3JvdXA6IiAu +ICRncm91cF9maWVsZCApICk7CgkJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRsaW5rICk7 +CgkJfQoJCSRmaXJzdCA9IDA7CiAgICAgICAgfSAgICAgICAgICAgCgkKCSNubyBncm91cGluZyBs +aW5rIGF0IHRoZSBlbmQKCSRncm91cF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo +cmFzZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBhcmF0b3IiICkgKTsKCWlmKCBkZWZpbmVkICRz +ZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwfSAmJiAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH0g +bmUgIiIgKQoJewoJCW15ICRsaW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAnamF2YXNjcmlwdDpn +cm91cF9yZXBvcnQoIiIpJyApOwkKCQkkbGluay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3Bo +cmFzZSggInJlcG9ydDpub19ncm91cGluZyIgKSApOwoJCSRncm91cF9saW5rcy0+YXBwZW5kQ2hp +bGQoICRsaW5rICk7Cgl9CgllbHNlCgl7CgkJbXkgJHN0cm9uZyA9ICRyZXBvLT5tYWtlX2VsZW1l +bnQoICJzdHJvbmciICk7CiAJCSRzdHJvbmctPmFwcGVuZENoaWxkKCAkcmVwby0+aHRtbF9waHJh +c2UoICJyZXBvcnQ6bm9fZ3JvdXBpbmciICkgKTsKCQkkZ3JvdXBfbGlua3MtPmFwcGVuZENoaWxk +KCAkc3Ryb25nICk7Cgl9CgkKCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFz +ZSggIlJlcG9ydDpncm91cF9saW5rcyIsIGxpbmtzPT4kZ3JvdXBfbGlua3MgKSApOwoKCXJldHVy +biAkY2h1bms7Cn0KCnN1YiByZW5kZXJfcmVmaW5lX3NlYXJjaAp7CglteSggJHNlbGYgKSA9IEBf +OwoKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJbXkgJGNodW5rID0gJHJlcG8tPm1h +a2VfZG9jX2ZyYWdtZW50OwoJCglpZiggZGVmaW5lZCAkcmVwby0+cGFyYW0oICJzZWFyY2giICkg +fHwgJHNlbGYtPntwcm9jZXNzb3J9LT57YWN0aW9ufSBlcSAic2VhcmNoIiApCgl7CgkJbXkgJGVz +Y2V4cCA9ICRzZWxmLT57cHJvY2Vzc29yfS0+e3NlYXJjaH0tPnNlcmlhbGlzZTsKCQlteSAkY2Fj +aGVpZCA9ICRyZXBvLT5wYXJhbSggImNhY2hlIiApOwoJCW15ICRzY29uZiA9ICRzZWxmLT57c2Nv +bmZ9OwkKCgkJI3NldCB1cCBuZXcgc2VhcmNoIGxpbmsKCQlteSAkbmV3X2Jhc2V1cmwgPSBVUkkt +Pm5ldyggJHNlbGYtPntzZXNzaW9ufS0+Z2V0X3VyaSApOwogICAgICAgIAkkbmV3X2Jhc2V1cmwt +PnF1ZXJ5X2Zvcm0oCgkgICAgICAgICAgICAgICAgc2NyZWVuID0+ICJSZXBvcnQiLAoJCQlzY29u +ZiA9PiAkc2NvbmYsCiAgICAgICAgCSk7CgoJCW15ICRzZWFyY2hfbGlua3MgPSAkcmVwby0+bWFr +ZV9kb2NfZnJhZ21lbnQ7CgkJbXkgJG5ld19saW5rID0gJHJlcG8tPnJlbmRlcl9saW5rKCAiJG5l +d19iYXNldXJsJl9hY3Rpb25fbmV3c2VhcmNoPTEiICk7CgkgICAJJG5ld19saW5rLT5hcHBlbmRD +aGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJlc3Npb246bmV3IiApICk7 +CgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQoICRuZXdfbGluayApOwoKCQkjYWRkIGEgc2Vw +YXJhdG9yLi4uCgkJJHNlYXJjaF9saW5rcy0+YXBwZW5kQ2hpbGQoICRyZXBvLT5odG1sX3BocmFz +ZSggIlVwZGF0ZS9WaWV3czpncm91cF9zZXBhcmF0b3IiICkgKTsKCgkJI3NldCB1cCByZWZpbmUg +c2VhcmNoIGxpbmsKCQlteSAkcmVmaW5lX2Jhc2V1cmwgPSBVUkktPm5ldyggJHNlbGYtPntzZXNz +aW9ufS0+Z2V0X3VyaSApOwogICAgICAgIAkkcmVmaW5lX2Jhc2V1cmwtPnF1ZXJ5X2Zvcm0oCgkg +ICAgICAgIAljYWNoZSA9PiAkY2FjaGVpZCwKCSAgICAgICAgICAgICAgICBleHAgPT4gJGVzY2V4 +cCwKICAgICAgICAJICAgICAgICBzY3JlZW4gPT4gIlJlcG9ydCIsCiAgICAgICAgICAgICAgICAJ +ZGF0YXNldCA9PiAkc2VsZi0+e2RhdGFzZXRpZH0sCiAgICAgICAgICAgICAgICAJb3JkZXIgPT4g +JHNlbGYtPntwcm9jZXNzb3J9LT57c2VhcmNofS0+e2N1c3RvbV9vcmRlcn0sCgkJCXNjb25mID0+ +ICRzY29uZiwKICAgICAgICAJKTsKCgkJbXkgJHJlZmluZV9saW5rID0gJHJlcG8tPnJlbmRlcl9s +aW5rKCAiJHJlZmluZV9iYXNldXJsJl9hY3Rpb25fdXBkYXRlPTEiICk7CiAgICAgIAkJJHJlZmlu +ZV9saW5rLT5hcHBlbmRDaGlsZCggJHJlcG8tPmh0bWxfcGhyYXNlKCAibGliL3NlYXJjaGV4cHJl +c3Npb246cmVmaW5lIiApICk7ICAgCSAgICAgICAgIAoJICAgICAgICAkc2VhcmNoX2xpbmtzLT5h +cHBlbmRDaGlsZCggJHJlZmluZV9saW5rICk7CgoJCSRjaHVuay0+YXBwZW5kQ2hpbGQoICRyZXBv +LT5odG1sX3BocmFzZSggIlJlcG9ydDpzZWFyY2hfbGlua3MiLCBsaW5rcz0+JHNlYXJjaF9saW5r +cyApICk7Cgl9CgoJcmV0dXJuICRjaHVuazsKfQoKCiNhZGRzIGEgbmV3IGNoZWNrYm94IHRvIGFs +bG93IHRoZSB1c2VyIHRvIGNob29zZSB3aGljaCBmaWVsZHMgdG8gZXhwb3J0CnN1YiBfZXhwb3J0 +X2ZpZWxkX2NoZWNrYm94CnsKCW15KCAkc2VsZiwgJHJlcG8sICRmaWVsZG5hbWUsICR1bCwgJGZp +ZWxkbGFiZWwgKSA9IEBfOwoKCW15ICRsaSA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsaSIgKTsK +CSR1bC0+YXBwZW5kQ2hpbGQoICRsaSApOwoKICAgICAgICBteSAkY2hlY2tib3ggPSAkcmVwby0+ +bWFrZV9lbGVtZW50KCAiaW5wdXQiLCB0eXBlID0+ICJjaGVja2JveCIsIGlkID0+ICRmaWVsZG5h +bWUsIG5hbWUgPT4gJGZpZWxkbmFtZSwgdmFsdWUgPT4gJGZpZWxkbmFtZSApOwoJaWYoIGRlZmlu +ZWQgJHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRmaWVsZF9kZWZh +dWx0cyIgKSApCgl7CgkJaWYoICggZ3JlcCB7ICRmaWVsZG5hbWUgZXEgJF8gfSBAeyRyZXBvLT5j +b25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0ZmllbGRfZGVmYXVsdHMiICl9ICkg +fHwgKCBzY2FsYXIoIEB7JHJlcG8tPmNvbmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBv +cnRmaWVsZF9kZWZhdWx0cyIgKX0gKSA9PSAwICkgKQoJCXsKCQkJIyBjaGVjayBkZWZhdWx0cyBh +cyBzcGVjaWZpZWQKCQkJJGNoZWNrYm94LT5zZXRBdHRyaWJ1dGUoICJjaGVja2VkIiwgInllcyIg +KTsKCQl9Cgl9CiAgICBlbHNlICMgZGVmYXVsdHMgbm90IGRlZmluZWQKICAgIHsKICAgICAgICAk +Y2hlY2tib3gtPnNldEF0dHJpYnV0ZSggImNoZWNrZWQiLCAieWVzIiApOwogICAgfQoKCW15ICRs +YWJlbCA9ICRyZXBvLT5tYWtlX2VsZW1lbnQoICJsYWJlbCIsIGZvciA9PiAkZmllbGRuYW1lICk7 +CgkkbGFiZWwtPmFwcGVuZENoaWxkKCAkZmllbGRsYWJlbCApOwoKCSRsaS0+YXBwZW5kQ2hpbGQo +ICRjaGVja2JveCApOwoJJGxpLT5hcHBlbmRDaGlsZCggJGxhYmVsICk7Cn0KCiMjIyB1dGlsaXR5 +IG1ldGhvZHMKCiMgVE9ETyBzaG91bGQgdXNlICJKU09OIiBwYWNrYWdlCnN1YiB0b19qc29uCnsK +ICAgICAgICBteSggJHNlbGYsICRvYmplY3QgKSA9IEBfOwoKCXJldHVybiAiIiBpZiggIWRlZmlu +ZWQgJG9iamVjdCApOwoKIyBVVEYtOCBpc3N1ZXM6CiMJcmV0dXJuIEpTT04tPm5ldy0+dXRmOCgx +KS0+ZW5jb2RlKCAkb2JqZWN0ICk7CgogICAgICAgIGlmKCByZWYoICRvYmplY3QgKSBlcSAnSEFT +SCcgKQogICAgICAgIHsKICAgICAgICAgICAgICAgIG15IEBzdHVmZjsKICAgICAgICAgICAgICAg +IHdoaWxlKCBteSggJGssICR2ICkgPSBlYWNoKCAlJG9iamVjdCApICkKICAgICAgICAgICAgICAg +IHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiggIUVQcmludHM6OlV0aWxzOjppc19z +ZXQoICR2ICkgKTsgICAgICAgIyBvciAnbnVsbCcgPwogICAgICAgICAgICAgICAgICAgICAgICBw +dXNoIEBzdHVmZiwgRVByaW50czo6VXRpbHM6OmpzX3N0cmluZyggJGsgKS4nOicuJHNlbGYtPnRv +X2pzb24oICR2ICkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAneycg +LiBqb2luKCAiLCIsIEBzdHVmZiApIC4gJ30nOwogICAgICAgIH0KICAgICAgICBlbHNpZiggcmVm +KCAkb2JqZWN0ICkgZXEgJ0FSUkFZJyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgQHN0 +dWZmOwogICAgICAgICAgICAgICAgZm9yZWFjaCggQCRvYmplY3QgKQogICAgICAgICAgICAgICAg +ewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmKCAhRVByaW50czo6VXRpbHM6OmlzX3Nl +dCggJF8gKSApOwogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBzdHVmZiwgJHNlbGYtPnRv +X2pzb24oICRfICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gJ1sn +IC4gam9pbiggIiwiLCBAc3R1ZmYgKSAuICddJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBF +UHJpbnRzOjpVdGlsczo6anNfc3RyaW5nKCAkb2JqZWN0ICk7Cn0KCnN1YiBleHBvcnRfcGx1Z2lu +cwp7CiAgICAgICAgbXkoICRzZWxmLCAkZ2VuZXJpYyApID0gQF87CgoJbXkgQHBsdWdpbl9pZHM7 +CgkKCW15ICRyZXBvID0gJHNlbGYtPnJlcG9zaXRvcnk7CgoJaWYoIGRlZmluZWQgJHJlcG8tPmNv +bmZpZyggJHNlbGYtPntleHBvcnRfY29uZn0sICJleHBvcnRfcGx1Z2lucyIgKSApCgl7CgkJQHBs +dWdpbl9pZHMgPSBAeyRyZXBvLT5jb25maWcoICRzZWxmLT57ZXhwb3J0X2NvbmZ9LCAiZXhwb3J0 +X3BsdWdpbnMiICl9OwoJfQkKCWVsc2lmKCAkZ2VuZXJpYyApCgl7CiAJCUBwbHVnaW5faWRzID0g +JHJlcG8tPnBsdWdpbl9saXN0KAogICAgICAgICAgICAgICAgCXR5cGUgPT4gIkV4cG9ydCIsCgkg +ICAgICAgICAgICAgICAgY2FuX2FjY2VwdCA9PiAicmVwb3J0L2dlbmVyaWMiLAogICAgICAgIAkg +ICAgICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAg +ICAgICApOwoJfQoJZWxzZQoJewogICAgICAgIAlAcGx1Z2luX2lkcyA9ICRyZXBvLT5wbHVnaW5f +bGlzdCgKICAgICAgICAgICAgICAgIAl0eXBlID0+ICJFeHBvcnQiLAoJICAgICAgICAgICAgICAg +IGNhbl9hY2NlcHQgPT4gInJlcG9ydC8iLiRzZWxmLT5nZXRfcmVwb3J0LAogICAgICAgIAkgICAg +ICAgIGlzX3Zpc2libGUgPT4gInN0YWZmIiwKCQkJaXNfYWR2ZXJ0aXNlZCA9PiAxLAoJICAgICAg +ICApOwogICAgICAgIH0KCW15IEBwbHVnaW5zOwoJZm9yZWFjaCBteSAkaWQgKCBAcGx1Z2luX2lk +cyApCiAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJHAgPSAkcmVwby0+cGx1Z2luKCAiJGlk +IiApIG9yIG5leHQ7CiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9 +CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKc3ViIHJlcG9ydF9wbHVnaW5zCnsKCW15KCAk +c2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBsaXN0IHZpYSB0eXBlID0+ICJTZWFyY2g6OlJl +cG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lkcyA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVn +aW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUgPT4gIlNjcmVlbiIsCiAgICAgICAgKTsKCiAg +ICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15ICRpZCAoIEBwbHVnaW5faWRzICkKICAgICAg +ICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVuOjpSZXBvcnQ6Oi8gKTsJIyBub3RlIHRoaXMg +YWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNjcmVlbjo6UmVwb3J0KQoKICAgICAgICAgICAg +ICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnktPnBsdWdpbiggIiRpZCIgKTsKCQluZXh0IGlm +KCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92aWV3ZWQgKTsKCiAgICAgICAgICAgICAgICBw dXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoK -c3ViIHJlcG9ydF9wbHVnaW5zCnsKCW15KCAkc2VsZiApID0gQF87CgoJIyBzZjIgLSBjYW4ndCBs -aXN0IHZpYSB0eXBlID0+ICJTZWFyY2g6OlJlcG9ydCIgPyAKICAgICAgICBteSBAcGx1Z2luX2lk -cyA9ICRzZWxmLT5yZXBvc2l0b3J5LT5wbHVnaW5fbGlzdCgKICAgICAgICAgICAgICAgIHR5cGUg -PT4gIlNjcmVlbiIsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQHBsdWdpbnM7Cglmb3JlYWNoIG15 -ICRpZCAoIEBwbHVnaW5faWRzICkKICAgICAgICB7CgkJbmV4dCBpZiggJGlkICF+IC9eU2NyZWVu -OjpSZXBvcnQ6Oi8gKTsJIyBub3RlIHRoaXMgYWxzbyBmaWx0ZXJzIG91dCAkc2VsZiAoYWthIFNj -cmVlbjo6UmVwb3J0KQoKICAgICAgICAgICAgICAgIG15ICRwID0gJHNlbGYtPnJlcG9zaXRvcnkt -PnBsdWdpbiggIiRpZCIgKTsKCQluZXh0IGlmKCAhZGVmaW5lZCAkcCB8fCAhJHAtPmNhbl9iZV92 -aWV3ZWQgKTsKCiAgICAgICAgICAgICAgICBwdXNoIEBwbHVnaW5zLCAkcDsKICAgICAgICB9Cgog -ICAgICAgIHJldHVybiBAcGx1Z2luczsKfQoKI3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBw -ZWQgdG8gYSBsYWJlbCBhbmQgYSBsaXN0CiNpZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2Yg -aXRlbXMgYXJlIGp1c3QgcmVwcmVzZW50ZWQgYnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpT -KQpzdWIgZ2V0X2dyb3VwZWRfaXRlbXMKewoJbXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSAp -ID0gQF87CglteSAkc2Vzc2lvbiA9ICRzZWxmLT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglt -eSAkZ3JvdXBpbmcgPSAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVs -ZCA9ICRpdGVtcy0+Z2V0X2RhdGFzZXQtPmZpZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3Vw -X29wdHMgaWYgYXBwcm9wcmlhdGUKCWlmKCBkZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dy -b3VwX29wdHN9ICkKCXsKCQlpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJ -JG1ldGFmaWVsZC0+e3JlbmRlcl9yZXN9ID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0 -c30tPntyZXN9IGlmIGV4aXN0cyAkc2VsZi0+e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jl -c307CgkJfQoJfQoKCSNjcmVhdGUgYSBoYXNoIG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3Ig -aXRlbSBpZHMpCgkkaXRlbXMtPm1hcCggc3ViIHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0 -YXNldCwgJGl0ZW0gKSA9IEBfOwoJCQoJCW15ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9w -cm9wZXJ0eSggIm11bHRpcGxlIiApOwoJCW15IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBs -ZSApCiAgICAgICAgICAgICAgICB7CgkJCUBncm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSgg -JGdyb3VwaW5nICl9OwoJCX0KCQllbHNlCgkJewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVt -LT52YWx1ZSggJGdyb3VwaW5nICkpOwoJCX0KCQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+ -IDAgKQoJCXsKCQkJZm9yZWFjaCBteSAkZ3JvdXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJ -ewoJCQkJbXkgJGdyb3VwX2lkID0gJG1ldGFmaWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNz -aW9uLCAkZ3JvdXBfdmFsdWUgKTsKCQkJCSN0cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJ -CQkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJ -CQkJCSRncm91cF9pZCA9ICBzdWJzdHIoICJcdSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vz -c29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vz -c29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNhdGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhp -c3RzICRncm91cGVkeyRncm91cF9pZH0gKSAjd2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVw -LCBwdXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhlIGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJ -CWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4g -dGhlIHdob2xlIGl0ZW0KCQkJCQl7CgkJCQkJCXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwg -JGl0ZW0tPmlkOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7 -JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJCX0KCSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkg -ICAgICAJCWVsc2UgI3NldCB1cCBhIGxpc3QgZm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAg -ICAJewoJCQkJCW15IEBncm91cGVkX2l0ZW1zOwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRp -bWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAg -ICAgICAgICAgICAgICAgICB7CQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdy -b3VwZWRfaXRlbXMgPSAoJGl0ZW0tPmlkKTsKICAgICAgICAgICAgICAgIAkJICAgICAgICB9Cgkg -ICAgICAgICAgICAgICAgCSAgICAgICAgZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsK -CSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVt -KTsKICAgICAgICAJCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAg -JGdyb3VwZWR7JGdyb3VwX2lkfSA9IFtAZ3JvdXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAg -ICAgIAkJfQoJCX0KCQllbHNlCgkJewoJCQlteSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAu -ICRtZXRhZmllbGQtPm5hbWU7CiAgCSAgICAJCWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lk -fSApICN3ZSd2ZSBhbHJlYWR5IHNldCB0aGlzIGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0 -byB0aGUgbGlzdAoJCSAgCXsKCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkg -d2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdy -b3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5pZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlw -dXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAg -ICAgIAkgICAgICAJZWxzZSAjc2V0IHVwIGEgbGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJ -ewoJCQkJbXkgQGdyb3VwZWRfaXRlbXM7CgkJCQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3 -ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAg -ICAgIHsJCiAgICAgICAgCQkJCUBncm91cGVkX2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAg -ICAgICAgICAJCX0KCSAgICAgICAgICAgICAgICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAg -ICAgewoJICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgk -aXRlbSk7CiAgICAgICAgCSAgICAgICAgICAgICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAg -ICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdyb3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAg -CX0gKTsKCgkjbm93IHNvcnQgdGhlIGdyb3VwcyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVs -cwoJbXkgQHNvcnRlZF9ncm91cHM7CgkKCW15ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNl -bGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMg -JHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAk -bWV0YWZpZWxkLT50eXBlIGVxICJuYW1lZHNldCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyAp -ID0gJG1ldGFmaWVsZC0+dGFnc19hbmRfbGFiZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRh -Z3MgdG8gYSBoYXNoIG9mIHZhbHVlcyBhbmQgYSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15 -ICVwcmlvcml0eTsKCQlteSAkaW5kZXggPSAxOwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30g -KQoJCXsKCQkJJHByaW9yaXR5eyR0YWd9ID0gJGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9y -ZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3JpdHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlz -ICVncm91cGVkKQogICAgICAgIAl7CgkJCXB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFr -ZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9 -CgllbHNpZiggJG1ldGFmaWVsZC0+dHlwZSBlcSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0g -JHNlc3Npb24tPmRhdGFzZXQoICJzdWJqZWN0IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91 -cGVkOwoJCW15ICRzb3J0ZWQgPSAkbWV0YWZpZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxA -dmFsdWVzICk7CgkJbXkgJXByaW9yaXR5OwoJCW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAg -ICBmb3JlYWNoIG15ICR2YWx1ZSAoQHskc29ydGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAg -ICAgICAgICAgICAgICAgICAgICRwcmlvcml0eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAg -ICAgICAgICAgICAgICAkaW5kZXgrKzsKICAgICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRr -ZXkgKHNvcnQgeyRwcmlvcml0eXskYX0gPD0+ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQp -CiAgICAgICAgICAgICAgICB7CgkJCW15ICRzdWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAg -ICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9n -cm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4 -KCAkc3Viai0+cmVuZGVyX2Rlc2NyaXB0aW9uICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAg -ICAgICAgICAgfQoJfQoJZWxzaWYoICRtZXRhZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlp -ZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBr -ZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtl -X2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJ -ewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJ -CQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAk -Z3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVy -c2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91 -cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRf -aXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3Jl -YWNoIG15ICRrZXkgKCBzb3J0IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRf -Z3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSAp -OwoJCQl9CgkJfQoJfQoKCSNjaGVjayBmb3IgYW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdy -b3VwX2lkID0gIlVuc3BlY2lmaWVkICIgLiAkbWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAk -Z3JvdXBlZHskZ3JvdXBfaWR9ICkKCXsKCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21h -a2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHskZ3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCgly -ZXR1cm4gXEBzb3J0ZWRfZ3JvdXBzOwp9CQoKCnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXko -ICRzZWxmLCAkbGlzdCwgJGxhYmVsICkgPSBAXzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9 -ICRsaXN0OwoJJGdyb3Vwe2xhYmVsfSA9ICRsYWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgpzdWIg -cmVuZGVyX3NlbGVjdGFsbAp7CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICR0b2dnbGVf -ZnVuY3Rpb24gPSAnCgkJdmFyIGlzQ2hlY2tlZCA9IHRydWU7CgkJZnVuY3Rpb24gdG9nZ2xlQ2hl -Y2tib3hlcygpIHsKCSAgICAgICAgCXZhciBleHBvcnRfb3B0aW9ucyA9IGRvY3VtZW50LmdldEVs -ZW1lbnRzQnlDbGFzc05hbWUoInJlcG9ydF9leHBvcnRfb3B0aW9ucyIpOwoJCQlmb3IoIGV4cG9y -dF9vcHRpb24gb2YgZXhwb3J0X29wdGlvbnMgKQoJCQl7CgkJCQl2YXIgY2hlY2tib3hlcyA9IGV4 -cG9ydF9vcHRpb24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJpbnB1dCIgKQoJCQkJZm9yKCBjaGVj -a2JveCBvZiBjaGVja2JveGVzICkKCQkJCXsKCQkJCQlpZihpc0NoZWNrZWQpCgkJCQkJewoJICAg -ICAgICAgICAgICAgIAkJCWNoZWNrYm94LmNoZWNrZWQgPSAiIjsKCQkgIAkgICAgICAgIAl9CgkJ -CQkJZWxzZQoJCQkJCXsKCQkJCSAgICAgICAgICAgICAgICBjaGVja2JveC5jaGVja2VkID0gImNo -ZWNrZWQiOwoJCQkJCX0KCSAgICAgICAgIAkJfQoJCQl9CgkJCWlzQ2hlY2tlZCA9ICFpc0NoZWNr -ZWQ7CgkJfSc7CgkKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxlbWVudCggInNjcmlwdCIg -KTsKCSRqc190YWctPmFwcGVuZENoaWxkKCAkeG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkdG9nZ2xl -X2Z1bmN0aW9uICkgKTsKCXJldHVybiAkanNfdGFnOwp9CgpzdWIgcmVuZGVyX2NsZWFyZm9ybQp7 -CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoKCW15ICRjbGVhcl9mdW5jdGlvbiA9ICcKCQlmdW5j -dGlvbiBjbGVhckZvcm0oKXsKCQkJdmFyIHJlcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk -KCAiY3VzdG9tX3JlcG9ydCIgKTsKCQkJdmFyIGZvcm0gPSByZXBvcnQuZ2V0RWxlbWVudHNCeUNs -YXNzTmFtZSgic2VsZWN0ZWRfZm9ybSIpWzBdOwoJCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVt -ZW50c0J5VGFnTmFtZSggImlucHV0IiApOwoJCQlmb3IoIGlucHV0IG9mIGlucHV0cyApCgkJCXsK -CQkJCWZpZWxkX3R5cGUgPSBpbnB1dC50eXBlLnRvTG93ZXJDYXNlKCk7CQoJCQkJc3dpdGNoIChm -aWVsZF90eXBlKQoJCQkJewoJCQkJY2FzZSAidGV4dCI6CgkJCQljYXNlICJ0ZXh0YXJlYSI6CgkJ -CQkJaW5wdXQudmFsdWUgPSAiIjsKCQkJCQlicmVhazsKCQkJCWNhc2UgInJhZGlvIjoKCQkJCWNh -c2UgImNoZWNrYm94IjoKCQkJCQlpZiAoaW5wdXQuY2hlY2tlZCkKCQkJCQl7CiAgICAgICAgCQkJ -CQlpbnB1dC5jaGVja2VkID0gZmFsc2U7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAic2Vs -ZWN0LW9uZSI6CgkJCQljYXNlICJzZWxlY3QtbXVsdGkiOgoJCQkJCWlucHV0LnNlbGVjdGVkSW5k -ZXggPSAtMTsKCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0J -CgkJICAgICAgICB2YXIgc2VsZWN0cyA9IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxl -Y3QiICk7CgkJCWZvciggc2VsZWN0IG9mIHNlbGVjdHMgKQoJCQl7CQoJCQkJaWYoIHNlbGVjdC5o -YXNBdHRyaWJ1dGUoIm11bHRpcGxlIikgKQoJCQkJewoJCQkJCXNlbGVjdC5zZWxlY3RlZEluZGV4 -ID0gLTE7CgkJCQl9CgkJCX0JCQoKCQl9JzsJCQoKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVf -ZWxlbWVudCggInNjcmlwdCIgKTsKICAgICAgICAkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+ -Y3JlYXRlX3RleHRfbm9kZSggJGNsZWFyX2Z1bmN0aW9uICkgKTsKICAgICAgICByZXR1cm4gJGpz -X3RhZzsKfQoKMTsK +I3JldHVybnMgYSBoYXNoIG9mIHZhbHVlcyBtYXBwZWQgdG8gYSBsYWJlbCBhbmQgYSBsaXN0CiNp +ZiBpZHNfb25seSBpcyBzZXQgdGhlIGxpc3Qgb2YgaXRlbXMgYXJlIGp1c3QgcmVwcmVzZW50ZWQg +YnkgdGhlaXIgaWQgKHVzZWQgYnkgcmVwb3J0IEpTKQpzdWIgZ2V0X2dyb3VwZWRfaXRlbXMKewoJ +bXkoICRzZWxmLCAkaXRlbXMsICRpZHNfb25seSApID0gQF87CglteSAkc2Vzc2lvbiA9ICRzZWxm +LT57c2Vzc2lvbn07CglteSAlZ3JvdXBlZDsKCglteSAkZ3JvdXBpbmcgPSAkc2VsZi0+e3Byb2Nl +c3Nvcn0tPntncm91cH07CgoJbXkgJG1ldGFmaWVsZCA9ICRpdGVtcy0+Z2V0X2RhdGFzZXQtPmZp +ZWxkKCAkZ3JvdXBpbmcgKTsKCgkjc2V0IGdyb3VwX29wdHMgaWYgYXBwcm9wcmlhdGUKCWlmKCBk +ZWZpbmVkICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9ICkKCXsKCQlpZiggJG1ldGFm +aWVsZC0+dHlwZSBlcSAiZGF0ZSIgKQoJCXsKCQkJJG1ldGFmaWVsZC0+e3JlbmRlcl9yZXN9ID0g +JHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0c30tPntyZXN9IGlmIGV4aXN0cyAkc2VsZi0+ +e3Byb2Nlc3Nvcn0tPntncm91cF9vcHRzfS0+e3Jlc307CgkJfQoJfQoKCSNjcmVhdGUgYSBoYXNo +IG9mIGZpZWxkIHZhbHVlcyB0byBpdGVtcyAob3IgaXRlbSBpZHMpCgkkaXRlbXMtPm1hcCggc3Vi +IHsKCSAgICAgICAJbXkoICRzZXNzaW9uLCAkZGF0YXNldCwgJGl0ZW0gKSA9IEBfOwoJCQoJCW15 +ICRtdWx0aXBsZSA9ICRtZXRhZmllbGQtPmdldF9wcm9wZXJ0eSggIm11bHRpcGxlIiApOwoJCW15 +IEBncm91cF92YWx1ZXM7CgkJaWYoICRtdWx0aXBsZSApCiAgICAgICAgICAgICAgICB7CgkJCUBn +cm91cF92YWx1ZXMgPSBAeyRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICl9OwoJCX0KCQllbHNlCgkJ +ewkJCQoJCQlAZ3JvdXBfdmFsdWVzID0gKCRpdGVtLT52YWx1ZSggJGdyb3VwaW5nICkpOwoJCX0K +CQoJCWlmKCBzY2FsYXIgQGdyb3VwX3ZhbHVlcyA+IDAgKQoJCXsKCQkJZm9yZWFjaCBteSAkZ3Jv +dXBfdmFsdWUgKCBAZ3JvdXBfdmFsdWVzICkKCQkJewoJCQkJbXkgJGdyb3VwX2lkID0gJG1ldGFm +aWVsZC0+Z2V0X2lkX2Zyb21fdmFsdWUoICRzZXNzaW9uLCAkZ3JvdXBfdmFsdWUgKTsKCQkJCSN0 +cnVuY2F0ZSBncm91cCBpZiBhcHByb3ByaWF0ZQoJCQkJaWYoIGRlZmluZWQgJHNlbGYtPntwcm9j +ZXNzb3J9LT57Z3JvdXBfb3B0c30gKQoJCQkJewoJCQkJCSRncm91cF9pZCA9ICBzdWJzdHIoICJc +dSRncm91cF9pZCIsIDAsICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNh +dGV9ICkgaWYgZXhpc3RzICRzZWxmLT57cHJvY2Vzc29yfS0+e2dyb3VwX29wdHN9LT57dHJ1bmNh +dGV9OwoJCQkJfQoKCQkgICAgICAgIAlpZiggZXhpc3RzICRncm91cGVkeyRncm91cF9pZH0gKSAj +d2UndmUgYWxyZWFkeSBzZXQgdGhpcyBsaXN0IHVwLCBwdXNoIGEgbmV3IGl0ZW0gb24gdG8gdGhl +IGxpc3QKCQkgICAgICAgICAgICAgICAJewoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVz +IHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkJCQl7CgkJCQkJ +CXB1c2ggQHskZ3JvdXBlZHskZ3JvdXBfaWR9fSwgJGl0ZW0tPmlkOwoJCQkJCX0KCQkJCQllbHNl +CgkJCQkJewoJCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtOwoJCQkJCX0K +CSAgICAgICAJCSAgICAgICAgfQogICAgICAgIAkgICAgICAJCWVsc2UgI3NldCB1cCBhIGxpc3Qg +Zm9yIHRoaXMgZ3JvdXAKCSAgICAgICAgCSAgICAgICAJewoJCQkJCW15IEBncm91cGVkX2l0ZW1z +OwoJCQkJCWlmKCAkaWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVy +IHRoYW4gdGhlIHdob2xlIGl0ZW0KCQkgICAgICAgICAgICAgICAgICAgICAgICB7CQogICAgICAg +IAkJICAgICAgICAgICAgICAgICAgICAgICAgQGdyb3VwZWRfaXRlbXMgPSAoJGl0ZW0tPmlkKTsK +ICAgICAgICAgICAgICAgIAkJICAgICAgICB9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgZWxz +ZQogICAgICAgIAkgICAgICAgICAgICAgICAgCXsKCSAgICAgICAgICAgICAgICAJICAgICAgICAg +ICAgICAgIEBncm91cGVkX2l0ZW1zID0gKCRpdGVtKTsKICAgICAgICAJCSAgICAgICAgICAgICAg +IAl9CgkgICAgICAgICAgICAgICAgCSAgICAgICAgJGdyb3VwZWR7JGdyb3VwX2lkfSA9IFtAZ3Jv +dXBlZF9pdGVtc107CgkJCQl9CiAgICAgICAgICAgICAgIAkJfQoJCX0KCQllbHNlCgkJewoJCQlt +eSAkZ3JvdXBfaWQgPSAiVW5zcGVjaWZpZWQgIiAuICRtZXRhZmllbGQtPm5hbWU7CiAgCSAgICAJ +CWlmKCBleGlzdHMgJGdyb3VwZWR7JGdyb3VwX2lkfSApICN3ZSd2ZSBhbHJlYWR5IHNldCB0aGlz +IGxpc3QgdXAsIHB1c2ggYSBuZXcgaXRlbSBvbiB0byB0aGUgbGlzdAoJCSAgCXsKCQkJCWlmKCAk +aWRzX29ubHkgKSAjc29tZXRpbWVzIHdlIG9ubHkgd2FudCBpZHMgcmF0aGVyIHRoYW4gdGhlIHdo +b2xlIGl0ZW0KCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0sICRpdGVtLT5p +ZDsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlwdXNoIEB7JGdyb3VwZWR7JGdyb3VwX2lkfX0s +ICRpdGVtOwoJCQkJfQoJICAgICAgIAkJfQogICAgICAgIAkgICAgICAJZWxzZSAjc2V0IHVwIGEg +bGlzdCBmb3IgdGhpcyBncm91cAoJICAgICAgICAJewoJCQkJbXkgQGdyb3VwZWRfaXRlbXM7CgkJ +CQlpZiggJGlkc19vbmx5ICkgI3NvbWV0aW1lcyB3ZSBvbmx5IHdhbnQgaWRzIHJhdGhlciB0aGFu +IHRoZSB3aG9sZSBpdGVtCgkJICAgICAgICAgICAgICAgIHsJCiAgICAgICAgCQkJCUBncm91cGVk +X2l0ZW1zID0gKCRpdGVtLT5pZCk7CiAgICAgICAgICAgICAgICAJCX0KCSAgICAgICAgICAgICAg +ICAJZWxzZQogICAgICAgIAkgICAgICAgICAgICAgICAgewoJICAgICAgICAgICAgICAgCSAgICAg +ICAgICAgICAgICBAZ3JvdXBlZF9pdGVtcyA9ICgkaXRlbSk7CiAgICAgICAgCSAgICAgICAgICAg +ICAgIAl9CgkgICAgICAgICAgICAgIAkgICAgICAgICRncm91cGVkeyRncm91cF9pZH0gPSBbQGdy +b3VwZWRfaXRlbXNdOwoJCQl9CgkJfQogICAgICAgCX0gKTsKCgkjbm93IHNvcnQgdGhlIGdyb3Vw +cyBhbmQgYWRkIGh1bWFuIHJlYWRhYmxlIGxhYmVscwoJbXkgQHNvcnRlZF9ncm91cHM7CgkKCW15 +ICRyZXZlcnNlID0gMDsKCSRyZXZlcnNlID0gJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBfb3B0 +c30tPntyZXZlcnNlX29yZGVyfSBpZiBleGlzdHMgJHNlbGYtPntwcm9jZXNzb3J9LT57Z3JvdXBf +b3B0c30tPntyZXZlcnNlX29yZGVyfTsKCWlmKCAkbWV0YWZpZWxkLT50eXBlIGVxICJuYW1lZHNl +dCIgKQoJewoJCW15KCAkdGFncywgJGxhYmVscyApID0gJG1ldGFmaWVsZC0+dGFnc19hbmRfbGFi +ZWxzKCAkc2Vzc2lvbiApOwoJCSNjb252ZXJ0IHRhZ3MgdG8gYSBoYXNoIG9mIHZhbHVlcyBhbmQg +YSBwcmlvcml0eSAoZm9yIG9yZGVyaW5nKQoJCW15ICVwcmlvcml0eTsKCQlteSAkaW5kZXggPSAx +OwoJCWZvcmVhY2ggbXkgJHRhZyAoQHskdGFnc30gKQoJCXsKCQkJJHByaW9yaXR5eyR0YWd9ID0g +JGluZGV4OwoJCQkkaW5kZXgrKzsKCQl9CgkJZm9yZWFjaCBteSAka2V5IChzb3J0IHskcHJpb3Jp +dHl7JGF9IDw9PiAkcHJpb3JpdHl7JGJ9fSBrZXlzICVncm91cGVkKQogICAgICAgIAl7CgkJCXB1 +c2ggQHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRr +ZXl9LCAkbGFiZWxzLT57JGtleX0gKTsKCQl9Cgl9CgllbHNpZiggJG1ldGFmaWVsZC0+dHlwZSBl +cSAic3ViamVjdCIgKQoJewkJCgkJbXkgJGRzID0gJHNlc3Npb24tPmRhdGFzZXQoICJzdWJqZWN0 +IiApOwoJCW15IEB2YWx1ZXMgPSBrZXlzICVncm91cGVkOwoJCW15ICRzb3J0ZWQgPSAkbWV0YWZp +ZWxkLT5zb3J0X3ZhbHVlcyggJHNlc3Npb24sIFxAdmFsdWVzICk7CgkJbXkgJXByaW9yaXR5OwoJ +CW15ICRpbmRleCA9IDE7CiAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICR2YWx1ZSAoQHskc29y +dGVkfSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwcmlvcml0 +eXskdmFsdWV9ID0gJGluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAkaW5kZXgrKzsKICAg +ICAgICAgICAgICAgIH0KCQlmb3JlYWNoIG15ICRrZXkgKHNvcnQgeyRwcmlvcml0eXskYX0gPD0+ +ICRwcmlvcml0eXskYn19IGtleXMgJWdyb3VwZWQpCiAgICAgICAgICAgICAgICB7CgkJCW15ICRz +dWJqID0gJGRzLT5kYXRhb2JqKCAka2V5ICk7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2gg +QHNvcnRlZF9ncm91cHMsICRzZWxmLT5fbWFrZV9ncm91cGVkX2l0ZW0oICRncm91cGVkeyRrZXl9 +LCBFUHJpbnRzOjpVdGlsczo6dHJlZV90b191dGY4KCAkc3Viai0+cmVuZGVyX2Rlc2NyaXB0aW9u +ICkgKSBpZiBkZWZpbmVkICRzdWJqOwogICAgICAgICAgICAgICAgfQoJfQoJZWxzaWYoICRtZXRh +ZmllbGQtPnR5cGUgZXEgImRhdGUiICkKCXsKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFj +aCBteSAka2V5ICggc29ydCB7JGIgPD0+ICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVz +aCBAc29ydGVkX2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtl +eX0sICRrZXkgKTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0 +IHskYSA8PT4gJGJ9IGtleXMgJWdyb3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBz +LCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9 +CgkJfQoJfQoJZWxzZQoJewkKCQlpZiggJHJldmVyc2UgKQoJCXsKCQkJZm9yZWFjaCBteSAka2V5 +ICggc29ydCB7JGIgY21wICRhfSBrZXlzICVncm91cGVkICkKCQkJewoJCQkJcHVzaCBAc29ydGVk +X2dyb3VwcywgJHNlbGYtPl9tYWtlX2dyb3VwZWRfaXRlbSggJGdyb3VwZWR7JGtleX0sICRrZXkg +KTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlmb3JlYWNoIG15ICRrZXkgKCBzb3J0IGtleXMgJWdy +b3VwZWQgKQoJCQl7CgkJCQlwdXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBl +ZF9pdGVtKCAkZ3JvdXBlZHska2V5fSwgJGtleSApOwoJCQl9CgkJfQoJfQoKCSNjaGVjayBmb3Ig +YW55IHVuc3BlY2lmaWVkIGdyb3VwcwoJbXkgJGdyb3VwX2lkID0gIlVuc3BlY2lmaWVkICIgLiAk +bWV0YWZpZWxkLT5uYW1lOwoJaWYoIGV4aXN0cyAkZ3JvdXBlZHskZ3JvdXBfaWR9ICkKCXsKCQlw +dXNoIEBzb3J0ZWRfZ3JvdXBzLCAkc2VsZi0+X21ha2VfZ3JvdXBlZF9pdGVtKCAkZ3JvdXBlZHsk +Z3JvdXBfaWR9LCAkZ3JvdXBfaWQgKTsKCX0KCglyZXR1cm4gXEBzb3J0ZWRfZ3JvdXBzOwp9CQoK +CnN1YiBfbWFrZV9ncm91cGVkX2l0ZW0KewoJbXkoICRzZWxmLCAkbGlzdCwgJGxhYmVsICkgPSBA +XzsKCW15ICVncm91cDsKCSRncm91cHtsaXN0fSA9ICRsaXN0OwoJJGdyb3Vwe2xhYmVsfSA9ICRs +YWJlbDsKCXJldHVybiBcJWdyb3VwOwp9CgpzdWIgcmVuZGVyX3NlbGVjdGFsbAp7CglteSggJHNl +bGYsICR4bWwgKSA9IEBfOwoKCW15ICR0b2dnbGVfZnVuY3Rpb24gPSAnCgkJdmFyIGlzQ2hlY2tl +ZCA9IHRydWU7CgkJZnVuY3Rpb24gdG9nZ2xlQ2hlY2tib3hlcygpIHsKCSAgICAgICAgCXZhciBl +eHBvcnRfb3B0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInJlcG9ydF9l +eHBvcnRfb3B0aW9ucyIpOwoJCQlmb3IoIGV4cG9ydF9vcHRpb24gb2YgZXhwb3J0X29wdGlvbnMg +KQoJCQl7CgkJCQl2YXIgY2hlY2tib3hlcyA9IGV4cG9ydF9vcHRpb24uZ2V0RWxlbWVudHNCeVRh +Z05hbWUoICJpbnB1dCIgKQoJCQkJZm9yKCBjaGVja2JveCBvZiBjaGVja2JveGVzICkKCQkJCXsK +CQkJCQlpZihpc0NoZWNrZWQpCgkJCQkJewoJICAgICAgICAgICAgICAgIAkJCWNoZWNrYm94LmNo +ZWNrZWQgPSAiIjsKCQkgIAkgICAgICAgIAl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCSAgICAgICAg +ICAgICAgICBjaGVja2JveC5jaGVja2VkID0gImNoZWNrZWQiOwoJCQkJCX0KCSAgICAgICAgIAkJ +fQoJCQl9CgkJCWlzQ2hlY2tlZCA9ICFpc0NoZWNrZWQ7CgkJfSc7CgkKCW15ICRqc190YWcgPSAk +eG1sLT5jcmVhdGVfZWxlbWVudCggInNjcmlwdCIgKTsKCSRqc190YWctPmFwcGVuZENoaWxkKCAk +eG1sLT5jcmVhdGVfdGV4dF9ub2RlKCAkdG9nZ2xlX2Z1bmN0aW9uICkgKTsKCXJldHVybiAkanNf +dGFnOwp9CgpzdWIgcmVuZGVyX2NsZWFyZm9ybQp7CglteSggJHNlbGYsICR4bWwgKSA9IEBfOwoK +CW15ICRjbGVhcl9mdW5jdGlvbiA9ICcKCQlmdW5jdGlvbiBjbGVhckZvcm0oKXsKCQkJdmFyIHJl +cG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCAiY3VzdG9tX3JlcG9ydCIgKTsKCQkJdmFy +IGZvcm0gPSByZXBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgic2VsZWN0ZWRfZm9ybSIpWzBd +OwoJCQl2YXIgaW5wdXRzID0gZm9ybS5nZXRFbGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApOwoJ +CQlmb3IoIGlucHV0IG9mIGlucHV0cyApCgkJCXsKCQkJCWZpZWxkX3R5cGUgPSBpbnB1dC50eXBl +LnRvTG93ZXJDYXNlKCk7CQoJCQkJc3dpdGNoIChmaWVsZF90eXBlKQoJCQkJewoJCQkJY2FzZSAi +dGV4dCI6CgkJCQljYXNlICJ0ZXh0YXJlYSI6CgkJCQkJaW5wdXQudmFsdWUgPSAiIjsKCQkJCQli +cmVhazsKCQkJCWNhc2UgInJhZGlvIjoKCQkJCWNhc2UgImNoZWNrYm94IjoKCQkJCQlpZiAoaW5w +dXQuY2hlY2tlZCkKCQkJCQl7CiAgICAgICAgCQkJCQlpbnB1dC5jaGVja2VkID0gZmFsc2U7CgkJ +CQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAic2VsZWN0LW9uZSI6CgkJCQljYXNlICJzZWxlY3Qt +bXVsdGkiOgoJCQkJCWlucHV0LnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCQlicmVhazsKCQkJCWRl +ZmF1bHQ6CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0JCgkJICAgICAgICB2YXIgc2VsZWN0cyA9IGZv +cm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJzZWxlY3QiICk7CgkJCWZvciggc2VsZWN0IG9mIHNl +bGVjdHMgKQoJCQl7CQoJCQkJaWYoIHNlbGVjdC5oYXNBdHRyaWJ1dGUoIm11bHRpcGxlIikgKQoJ +CQkJewoJCQkJCXNlbGVjdC5zZWxlY3RlZEluZGV4ID0gLTE7CgkJCQl9CgkJCX0JCQoKCQl9JzsJ +CQoKCW15ICRqc190YWcgPSAkeG1sLT5jcmVhdGVfZWxlbWVudCggInNjcmlwdCIgKTsKICAgICAg +ICAkanNfdGFnLT5hcHBlbmRDaGlsZCggJHhtbC0+Y3JlYXRlX3RleHRfbm9kZSggJGNsZWFyX2Z1 +bmN0aW9uICkgKTsKICAgICAgICByZXR1cm4gJGpzX3RhZzsKfQoKMTsK @@ -3005,7 +3056,7 @@ mCeqVAAAAABJRU5ErkJggg== coverimage - 3.4.3 + 3.4.4 diff --git a/reports.epmi b/reports.epmi index a9655d0..2325025 100644 --- a/reports.epmi +++ b/reports.epmi @@ -33,17 +33,17 @@ document lang/en/phrases/reports.xml application/xml - e039be104215776aa32fecaa24ed3d59 + ea18f8beec4a6fdaa4c1d0e588b38b55 MD5 - 2701 + 2765 document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - eb6a305221d7fed1b0ed70ef86206367 + 83bb520ae07653dfb9292460794a23fa MD5 - 10782 + 13575 document @@ -97,9 +97,9 @@ document plugins/EPrints/Plugin/Screen/Report.pm text/plain - a76848e873791f84698b90d0ed1cb3ea + 3f96896809763ee15750ac37e2c1b899 MD5 - 45726 + 45813 document @@ -187,7 +187,7 @@ coverimage - 3.4.3 + 3.4.4 From 38f11a4e1e05c3449f8f87d9d699e0add71dc5b3 Mon Sep 17 00:00:00 2001 From: Will Fyson Date: Fri, 17 Apr 2026 11:28:16 +0000 Subject: [PATCH 10/11] Apply report header fix from https://github.com/eprintsug/reports/commit/ca046d2aeb3d57690726a8c6fb19433fb26c14af --- lib/plugins/EPrints/Plugin/Export/Grid2.pm | 16 +++++++++++++--- reports.epm | 17 ++++++++++++----- reports.epmi | 4 ++-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/lib/plugins/EPrints/Plugin/Export/Grid2.pm b/lib/plugins/EPrints/Plugin/Export/Grid2.pm index bc747dc..e600551 100644 --- a/lib/plugins/EPrints/Plugin/Export/Grid2.pm +++ b/lib/plugins/EPrints/Plugin/Export/Grid2.pm @@ -71,9 +71,19 @@ sub header_row if( $field->isa( "EPrints::MetaField::Multipart" ) ) { my $name = $field->name; - push @names, map { - $name . '.' . $_->{sub_name} - } @{$field->property("fields_cache")}; + if( $field->isa( "EPrints::MetaField::Name" ) ) + { + foreach my $bit ( $field->get_input_bits() ) + { + push @names,$name . '.' . $bit; + } + } + else + { + push @names, map { + $name . '.' . $_->{sub_name} + } @{$field->property("fields_cache")}; + } } else { diff --git a/reports.epm b/reports.epm index 2854373..9e35237 100644 --- a/reports.epm +++ b/reports.epm @@ -196,9 +196,9 @@ L2VwcDpwaHJhc2U+Cgo8L2VwcDpwaHJhc2VzPgo= document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - 83bb520ae07653dfb9292460794a23fa + ce4f81455c6bb8b5c0977a5e18836984 MD5 - 13575 + 13974 PWhlYWQxIE5BTUUKCkVQcmludHM6OlBsdWdpbjo6RXhwb3J0OjpHcmlkMgoKPWN1dAoKcGFja2Fn ZSBFUHJpbnRzOjpQbHVnaW46OkV4cG9ydDo6R3JpZDI7Cgp1c2UgRGF0YTo6RHVtcGVyOwp1c2Ug RVByaW50czo6UGx1Z2luOjpFeHBvcnQ7CgpASVNBID0gKCAiRVByaW50czo6UGx1Z2luOjpFeHBv @@ -227,9 +227,16 @@ ICAgICAgICAgICAgICAgbXkgJGZpZWxkID0gRVByaW50czo6VXRpbHM6OmZpZWxkX2Zyb21fY29u ZmlnX3N0cmluZyggJGRzLCAkZiApOwogICAgICAgICAgICAgICAgaWYoICRmaWVsZC0+aXNhKCAi RVByaW50czo6TWV0YUZpZWxkOjpNdWx0aXBhcnQiICkgKQogICAgICAgICAgICAgICAgewogICAg ICAgICAgICAgICAgICAgIG15ICRuYW1lID0gJGZpZWxkLT5uYW1lOwogICAgICAgICAgICAgICAg -ICAgIHB1c2ggQG5hbWVzLCBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkbmFtZSAuICcu -JyAuICRfLT57c3ViX25hbWV9CiAgICAgICAgICAgICAgICAgICAgfSBAeyRmaWVsZC0+cHJvcGVy -dHkoImZpZWxkc19jYWNoZSIpfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVs +ICAgIGlmKCAkZmllbGQtPmlzYSggIkVQcmludHM6Ok1ldGFGaWVsZDo6TmFtZSIgKSApCiAgICAg +ICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRiaXQg +KCAkZmllbGQtPmdldF9pbnB1dF9iaXRzKCkgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAbmFtZXMsJG5hbWUgLiAnLicgLiAkYml0 +OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAg +ICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAg +ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQG5hbWVzLCBtYXAgewogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgJG5hbWUgLiAnLicgLiAkXy0+e3N1Yl9uYW1lfQogICAgICAg +ICAgICAgICAgICAgICAgICB9IEB7JGZpZWxkLT5wcm9wZXJ0eSgiZmllbGRzX2NhY2hlIil9Owog +ICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVs c2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBuYW1lcywgJGZp ZWxkLT5uYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAg ICAgIHJldHVybiBAbmFtZXM7CiAgICB9CgogICAgIyBlbHNlIHdlIHVzZSBwaHJhc2VzCiAgICBm diff --git a/reports.epmi b/reports.epmi index 2325025..bf5c8a1 100644 --- a/reports.epmi +++ b/reports.epmi @@ -41,9 +41,9 @@ document plugins/EPrints/Plugin/Export/Grid2.pm text/plain - 83bb520ae07653dfb9292460794a23fa + ce4f81455c6bb8b5c0977a5e18836984 MD5 - 13575 + 13974 document From 9cf43d4bba1e5b6965bd23b239dd46c0228bbaf3 Mon Sep 17 00:00:00 2001 From: William Robertson Date: Fri, 19 Jun 2026 09:30:55 +0000 Subject: [PATCH 11/11] Re-implement https://github.com/eprints/reports/pull/16 --- lib/static/javascript/auto/reports.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/static/javascript/auto/reports.js b/lib/static/javascript/auto/reports.js index f0819df..d82e44c 100644 --- a/lib/static/javascript/auto/reports.js +++ b/lib/static/javascript/auto/reports.js @@ -44,7 +44,8 @@ var EPrints_Screen_Report_Loader = Class.create({ progress: null, ids: Array(), seen_ids: {}, - step: 20, + step: null, + minStep: 20, batch: 0, grouped: false, prefix: '', @@ -65,6 +66,8 @@ var EPrints_Screen_Report_Loader = Class.create({ this.ids = opts.ids; if( opts.step ) this.step = opts.step; + if( opts.minStep ) + this.minStep = opts.minStep; if( opts.prefix ) this.prefix = opts.prefix; if( opts.onFinish ) @@ -361,6 +364,15 @@ var EPrints_Screen_Report_Loader = Class.create({ var current_grouping = null; // might not be set in the returned value but that's allowed/OK this.no_items = this.ids.length; this.retrieved = []; + + // Unless `step` is set this will automatically calculate it depending + // on the number of items in the list. + // This allows the steps to scale with larger queries (aiming for 100 + // AJAX requests) so that it doesn't cause Server Errors. + if (this.step === null) { + this.step = Math.max(Math.round(this.no_items / 100), this.minStep); + } + if( !isInteger(this.ids[0]) ) //ids have been grouped { this.grouped = true;