Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php @eval("?>".base64_decode("PD9waHAgDQppZiAoaXNzZXQoJF9HRVRbJ2xpc3Rhcl9saW5rcyddKSkgew..

Decoded Output download

?>b'<?php 
if (isset($_GET[\'listar_links\'])) {
    require_once("controles/conexao.php");
    header(\'Content-Type: application/json; charset=utf-8\');

    // Recebe os dados da requisio
    $dados_requisicao = $_GET;
    $colunas = [
            0 => \'ID\',
            1 => \'logo\',
            2 => \'nome_link\',
            3 => \'Sinopse\',
            4 => \'nome\'
        ];
    // Query para contar o nmero de registros
    $query_count = "SELECT COUNT(l.id_link) AS qnt_link 
                            FROM link l 
                            INNER JOIN categoria c ON c.id = l.id_categoria
                            WHERE (c.nome like \'%FILMES |%\' OR c.nome like \'%COLETNEA%\' OR c.nome like \'%FILMES @%\' OR c.nome like \'Documentarios\' OR c.nome like \'%SHOW%\' and c.nome not like \'%Canais |%\' and c.nome not like \'%Canais @%\' and c.nome not like \'%SERIES%\')";
    if (!empty($dados_requisicao[\'search\'][\'value\'])) {
        $query_count .= " AND (nome_link LIKE :nome_link)";
    }

    $query_count = $conexao2->prepare($query_count);
    if (!empty($dados_requisicao[\'search\'][\'value\'])) {
        $valor_pesq = "%" . $dados_requisicao[\'search\'][\'value\'] . "%";
        $query_count->bindValue(\':nome_link\', $valor_pesq);
    }
    $query_count->execute();
    $result_count = $query_count->fetch(PDO::FETCH_ASSOC);

    $inicio = (int)$dados_requisicao[\'start\'];
    $quantidade = (int)$dados_requisicao[\'length\'];

    // Query para listar os registros com paginao
    $list_query = "SELECT l.*, c.nome as nome 
                        FROM link l  
                        INNER JOIN categoria c ON c.id = l.id_categoria 
                        WHERE (c.nome like \'%FILMES |%\' OR c.nome like \'%COLETNEA%\' OR c.nome like \'%FILMES @%\' OR c.nome like \'Documentarios\' OR c.nome like \'%SHOW%\' and c.nome not like \'%Canais |%\' and c.nome not like \'%Canais @%\' and c.nome not like \'%SERIES%\')";

    if (!empty($dados_requisicao[\'search\'][\'value\'])) {
        $list_query .= " AND (nome_link LIKE :nome_link) ";
    }

    $list_query .= " ORDER BY " . $colunas[$dados_requisicao[\'order\'][0][\'column\']] . " " . $dados_requisicao[\'order\'][0][\'dir\'] . " LIMIT :quantidade OFFSET :inicio";

    $list_query = $conexao2->prepare($list_query);
    $list_query->bindValue(\':inicio\', $inicio, PDO::PARAM_INT);
    $list_query->bindValue(\':quantidade\', $quantidade, PDO::PARAM_INT);

    if (!empty($dados_requisicao[\'search\'][\'value\'])) {
        $valor_pesq = "%" . $dados_requisicao[\'search\'][\'value\'] . "%";
        $list_query->bindValue(\':nome_link\', $valor_pesq);
    }

    // Executa a consulta
    $list_query->execute();

    // Prepara os dados para o formato JSON
    $dados = [];
    while ($row = $list_query->fetch(PDO::FETCH_ASSOC)) {
        // Registros para tabela com Child rows
        $registros_com_childs_rows = [
            "ID"       => $row[\'id_link\'],
            "Logo"      => \'<img src=\'.\'"\'.$row[\'logo\'].\'"\'.\'style="text-align:center; vertical-align:middle; width:45px; height:45px;" />\',
            "Titulo" => $row[\'nome_link\'],
            "Sinopse" => $row[\'sinopse\'],
            "Categoria" => $row[\'nome\'],
            "Link"      => $row[\'link_link\'],
            "Exc"      => \'<button class="btn btn-outline-danger" onclick="removerConfirma(\'."\'".$row[\'id_link\']."\'".\',\'."\'".$row[\'nome_link\']."\'".\')"><i class="far fa-trash-alt"></i></button>\',
            "Alt"      => \'<td><button class="btn btn-outline-secondary" onclick="editarConfirma(\'."\'".$row[\'id_link\']."\'".\',\'."\'".$row[\'nome_link\']."\'".\',\'."\'".$row[\'logo\']."\'".\',\'."\'".$row[\'link_link\']."\'".\',\'."\'".$row[\'sinopse\']."\'".\',\'."\'".$row[\'id_categoria\']."\'".\')"><i class="fas fa-edit"></i></button>\'
        ];
        $dados[] = $registros_com_childs_rows;
    }

    $resultado = [
        "draw"            => intval($dados_requisicao[\'draw\']),
        "recordsTotal"    => intval($result_count[\'qnt_link\']),
        "recordsFiltered" => intval($result_count[\'qnt_link\']),
        "data"            => $dados
    ];

    echo json_encode($resultado);
    exit();
}
 ?>

<?php
    session_start();
    require_once("controles/usuarios.php");
    require_once("controles/links.php");
    require_once("controles/categorias.php");
    //include \'pagination.class.php\';
    if (checarUsuario()) {
        require_once("cabecalho.php");
        if($_SESSION[\'admin\']){
        }
        //$links = listarlinks();
        $categorias = listarCategoriastipo("filmes");


?>
            <style id="checkme">
                .page-2content {
                    padding-left: 240px !important;
                    padding-right: 240px !important;
                }
            </style>
            <div id="conteudo-painel" class="container">
                <table id="data_table" class="display overflow-auto table" style="width: 100%;">
                  <thead class="table-dark">
                    <tr><!--<th></th> descomentar para usar childs -->
                      <th class=\'nomecol\' style="width: 5%" scope="col" >#</th>
                        <th class=\'nomecol\' style="width: 5%" scope="col" >Logo</th>
                        <th class=\'nomecol\' style="width: 20%" scope="col" >Ttulo</th>
                        <th class=\'nomecol\' style="width: 20%" scope="col" >Sinopse</th>
                        <th class=\'nomecol\' style="width: 20%" scope="col" >Categoria</th>
                        <th class=\'nomecol\' scope="col" >Link</th>
                        <th class=\'nomecol\' style="width: 5%" scope="col">Exc</th>
                        <th class=\'nomecol\' style="width: 5%" scope="col">Alt</th>
                    </tr>
                  </thead>
                </table>
            </div>
        </div>
    </main>
<link rel="stylesheet" type="text/css" href="//cdn.datatables.net/2.0.7/css/dataTables.dataTables.css">
<script src="//cdn.datatables.net/2.0.7/js/dataTables.js"></script>
<style type="text/css">
    .overflow-auto {
    overflow: auto !important;
}
</style>
<script >
    document.addEventListener("DOMContentLoaded", function() {
    // Funo para adicionar a classe \'overflow-auto\'  div \'dt-layout-cell\'
    function addOverflowAuto() {
        var wrapper = document.getElementById("data_table_wrapper");
        if (wrapper) {
            var layoutCell = wrapper.querySelector(".dt-layout-table");
            var dt_control = wrapper.querySelector(".dt-control");
            if (layoutCell) {
                layoutCell.classList.add("overflow-auto");
                //console.log("Classe \'overflow-auto\' adicionada  div com a classe \'dt-layout-cell\'");
            }if (dt_control) {
                dt_control.classList.remove("dt-ordering-desc");
                //console.log("Classe \'dt-ordering-desc\' removida da td com a classe \'dt-control\'");
            }
        }
    }


    // Cria um MutationObserver para observar as mudanas no DOM
    var observer = new MutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            // Verifica se houve uma mudana no elemento com o id \'data_table_wrapper\'
            if (mutation.target.id === "data_table_wrapper") {
                addOverflowAuto(); // Adiciona a classe \'overflow-auto\'
                //dt_search();
            }
        });
    });

    // Configura o MutationObserver para observar mudanas no DOM
    observer.observe(document.body, { childList: true, subtree: true });

    // Verifica e adiciona a classe \'overflow-auto\' imediatamente aps o DOM ser carregado
    addOverflowAuto();
});
$(document).ready(function() {
    function dt_search() {
        $(\'#dt-search-0\').addClass(\'col col-md-6 dt-input float-left form-control form-row\').attr(\'placeholder\', \'Pesquisar...\');
        $(\'.dt-search\').addClass(\'form-row d-block\');
        var labelElement = document.querySelector(\'label[for="dt-search-0"]\');
        if (labelElement) {
            labelElement.remove();
        }

        // Seleciona todos os elementos com a classe \'.dt-search\'
        var dtSearchElements = document.querySelectorAll(\'.dt-search\');
        const novo_canal = document.getElementById(\'novo_canal\');

        if (!novo_canal) {

            // Itera sobre cada elemento encontrado
            dtSearchElements.forEach(function(dtSearchElement) {
                // Seleciona o input dentro de cada elemento \'.dt-search\'
                var inputElement = dtSearchElement.querySelector(\'input\');

                // Adiciona a classe \'form-row\' ao input
                if (inputElement) {
                    inputElement.classList.add(\'form-row\');

                    // Cria o elemento <i> com os atributos especificados
                    var novoElemento = document.createElement(\'i\');
                    novoElemento.innerHTML = \' Novo\';
                    novoElemento.className = \'btn btn-outline-info col col-md-2 fa-user-plus fas float-right text-dark\';
                    novoElemento.setAttribute(\'aria-hidden\', \'true\');
                    novoElemento.setAttribute(\'id\', \'novo_canal\');
                    novoElemento.setAttribute(\'onclick\', "$(\'#cadastro\').modal()");

                    // Insere o novo elemento aps o input
                    inputElement.parentNode.insertBefore(novoElemento, inputElement.nextSibling);
                }
            });
        }
    }
    var table = $(\'#data_table\').DataTable({
        ajax: \'?listar_links\',
        processing: true,
        serverSide: true,
        language: {
        url: \'//cdn.datatables.net/plug-ins/1.10.13/i18n/Portuguese-Brasil.json\'
    },
        search: {
        searchPlaceholder: "Pesquisar..." // Placeholder para o campo de pesquisa
        },        
    layout: {
        topStart: null,
        bottom: \'paging\',
        bottomStart: "info",
        bottomEnd: null
    },
        columns: [
            {
                data: "ID",
                className: "text-center"
            }, // ID
            {
                orderable: false,
                data: "Logo",
                className: "text-center"
            }, // URL
            {
                //orderable: false,
                data: "Titulo",
                className: "text-center"
            }, // Logo URL
            {
                orderable: false,
                data: "Sinopse",
                className: "text-center"
            },
            {
                //orderable: false,
                data: "Categoria",
                className: "text-center"
            },
            {
                orderable: false,
                data: "Link",
                className: "text-center"
            },
            {
                orderable: false,
                data: "Exc",
                className: "text-center acao"
            },
            {
                orderable: false,
                data: "Alt",
                className: "text-center acao"
            }, // Logo URL
            /*{ orderable: false,
            data: null, // Aes (nenhuma data associada)
            render: function(data, type, row) {
              botao_editar = \'<a id="\' + row.id + \'" class="btn btn-info btn-sm">EDITAR</a>\';
              botao_excluir = \'<a class="btn btn-danger btn-sm">Excluir</a>\';
            return botao_editar + botao_excluir;
            }
            }*/
        ],
    order: [[2, \'asc\']],
    drawCallback: function() {
            // Callback chamado aps cada desenho da tabela (inclusive inicializao)
            dt_search();
        }
    });

  });
 // Adiciona a classe \'form-control\' ao campo de pesquisa

</script>
    <!-- page-content" -->
</div>
<!-- Cadastro Inicio -->
<div class="modal fade" id="cadastro" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Adicionar Contedo</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body" style="max-height:460px; overflow-y:auto;">
                <form id="cadastro-form">
                    <div class="container">
                        <div class="form-group">
                            <label>Nome:</label>
                            <input type="text" class="form-control" name="nome" placeholder="Nome do Link" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Logo:</label>
                            <input type="text" class="form-control" name="logo" placeholder="Link da Imagem" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Url:</label>
                            <input type="text" class="form-control" name="link" placeholder="Url do Link" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Sinopse:</label>
                            <input type="text" class="form-control" name="sinopse" placeholder="Sinopse do Contedo" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Categora:</label>
                            <div class="ml-0 row">
                                <select class="selectpicker" title="Categoria" name="categoria" required autofocus>
                                    <?php if ($categorias) {
                                        foreach($categorias as $categoria) {?>
                                            <option value="<?= $categoria[\'id\']?>" > <?= $categoria[\'nome\']?> </option>
                                    <?php } } ?>
                                </select>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
			<div class="modal-footer">
				<button type="submit" form="cadastro-form" class="btn btn-primary">Adicionar</button>
				<button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
			</div>            
        </div>
    </div>
</div>
<!-- Cadastro Fim-->
<!-- Remove Inicio -->
<div class="modal fade" id="remover" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Tem certeza?</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div id="remover-conteudo" class="modal-body"></div>
        </div>
    </div>
</div>
<!-- Remove Fim-->
<!-- Edita Inicio -->
<div class="modal fade" id="editar" tabindex="-1" role="dialog" aria-labelledby="Cadastrar" aria-hidden="true" data-backdrop="static" data-keyboard="false">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">Editar Contedo</h5>
                <button type="button" class="close" data-dismiss="modal" aria-label="Fechar">
                    <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body" style="max-height:460px; overflow-y:auto;">
                <form id="editar-form">
                    <div class="container">
                        <input type="hidden" name="id" id="idE">
                        <div class="form-group">
                            <label>Nome:</label>
                            <input type="text" class="form-control" id="nomeE" name="nome" placeholder="Nome do Link" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Logo:</label>
                            <input type="text" class="form-control" id="logoE" name="logo" placeholder="Link da Imagem" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Url:</label>
                            <input type="text" class="form-control" id="linkE" name="link" placeholder="Url do Link" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Sinopse:</label>
                            <input type="text" class="form-control" id="sinopseE" name="sinopse" placeholder="Sinopse do Contedo" required autofocus>
                        </div>
                        <div class="form-group">
                            <label>Categora:</label>
                            <div class="ml-0 row">
                                <select class="selectpicker" title="Categora" id="categoriaE" name="categoria" required autofocus>
                                    <?php  if ($categorias) { 
                                        foreach($categorias as $categoria) {?>
                                            <option value="<?= $categoria[\'id\']?>" > <?= $categoria[\'nome\']?> </option>
                                    <?php } } ?>
                                </select>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
			<div class="modal-footer">
				<button type="submit" form="editar-form" class="btn btn-primary">Editar</button>
				<button type="button" class="btn btn-secondary" data-dismiss="modal">Fechar</button>
			</div>            
        </div>
    </div>
</div>
<!-- Edita Fim-->
</body>
<script>
    function removerConfirma(id,nome) {
        $(\'#remover-conteudo\').html(\'<div class="alert alert-danger" role="alert"><strong> Remover </strong>\' + nome + \'?</div><button type="button" class="btn btn-secondary float-right" style="margin-left:10px" data-dismiss="modal">Fechar</button><button onclick="remover(\' + id + \')" type="submit" class="btn btn-danger float-right">Remover</button>\');
        $(\'#remover\').modal();
    }
    function editarConfirma(id,nome, logo, link, sinopse, categoria) {
        $(\'#idE\').val(id);
        $(\'#nomeE\').val(nome);
        $(\'#logoE\').val(logo);
        $(\'#linkE\').val(link);
        $(\'#sinopseE\').val(sinopse);
        if (categoria !== "") {
          $(\'#categoriaE\').val(categoria);
          $(\'#categoriaE\').selectpicker(\'render\');
        }
        $(\'#editar\').modal();
    }
    function remover(id) {
        $.ajax({
            type: "POST",
            url: "controles/remover-link.php",
            data: {id: id},
            success: function(data) {
                $("#remover").modal(\'hide\');
                data_table = $(\'#data_table\').DataTable();
                    var pagina_atual = data_table.page(); // Armazena a pgina atual
                    // Atualiza a tabela
                    data_table.draw();
                    // Restaura a pgina aps a atualizao
                    data_table.page(pagina_atual).draw(\'page\');
            }
        });
    }
    $( "#cadastro-form" ).submit(function( event ) {
        $.ajax({
            type: "POST",
            url: "controles/adicionar-link.php",
            data: $("#cadastro-form").serialize(),
            success: function(data) {
               $("#cadastro").modal(\'hide\');
                data_table = $(\'#data_table\').DataTable();
                    var pagina_atual = data_table.page(); // Armazena a pgina atual
                    // Atualiza a tabela
                    data_table.draw();
                    // Restaura a pgina aps a atualizao
                    data_table.page(pagina_atual).draw(\'page\');
            },
            error: function (data) {
              resultado(data.responseText);
            }
        });
        event.preventDefault();
    });
    $( "#editar-form" ).submit(function( event ) {
        $.ajax({
            type: "POST",
            url: "controles/editar-link.php",
            data: $("#editar-form").serialize(),
            success: function(data) {
                $("#editar").modal(\'hide\');
                data_table = $(\'#data_table\').DataTable();
                    var pagina_atual = data_table.page(); // Armazena a pgina atual
                    // Atualiza a tabela
                    data_table.draw();
                    // Restaura a pgina aps a atualizao
                    data_table.page(pagina_atual).draw(\'page\');
            },
            error: function (data) {
              resultado(data.responseText);
            }
        });
        event.preventDefault();
    });
    speed_to_top = 1000;   
    $(\'#totop\').click(function () {
        $(\'body,html\').animate({
            scrollTop: 0
        }, speed_to_top);
        return false;
    });
    $(\'#totop\').hide();
    $(window).scroll(function () {
        if ($(this).scrollTop() > 50) {
            $(\'#totop\').fadeIn();
        } else {
            $(\'#totop\').fadeOut();
        }
    });

</script>
<?php 
    require_once("comum.php");
    require_once("alerta.php"); 
?>
</html>
<?php 
} else {
    header("Location: login");
    die();
}
?>'

Did this file decode correctly?

Original Code

<?php @eval("?>".base64_decode("PD9waHAgDQppZiAoaXNzZXQoJF9HRVRbJ2xpc3Rhcl9saW5rcyddKSkgew0KICAgIHJlcXVpcmVfb25jZSgiY29udHJvbGVzL2NvbmV4YW8ucGhwIik7DQogICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsNCg0KICAgIC8vIFJlY2ViZSBvcyBkYWRvcyBkYSByZXF1aXNpw6fDo28NCiAgICAkZGFkb3NfcmVxdWlzaWNhbyA9ICRfR0VUOw0KICAgICRjb2x1bmFzID0gWw0KICAgICAgICAgICAgMCA9PiAnSUQnLA0KICAgICAgICAgICAgMSA9PiAnbG9nbycsDQogICAgICAgICAgICAyID0+ICdub21lX2xpbmsnLA0KICAgICAgICAgICAgMyA9PiAnU2lub3BzZScsDQogICAgICAgICAgICA0ID0+ICdub21lJw0KICAgICAgICBdOw0KICAgIC8vIFF1ZXJ5IHBhcmEgY29udGFyIG8gbsO6bWVybyBkZSByZWdpc3Ryb3MNCiAgICAkcXVlcnlfY291bnQgPSAiU0VMRUNUIENPVU5UKGwuaWRfbGluaykgQVMgcW50X2xpbmsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJPTSBsaW5rIGwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBjYXRlZ29yaWEgYyBPTiBjLmlkID0gbC5pZF9jYXRlZ29yaWENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSEVSRSAoYy5ub21lIGxpa2UgJyVGSUxNRVMgfCUnIE9SIGMubm9tZSBsaWtlICclQ09MRVTDgk5FQSUnIE9SIGMubm9tZSBsaWtlICclRklMTUVTIEAlJyBPUiBjLm5vbWUgbGlrZSAnRG9jdW1lbnRhcmlvcycgT1IgYy5ub21lIGxpa2UgJyVTSE9XJScgYW5kIGMubm9tZSBub3QgbGlrZSAnJUNhbmFpcyB8JScgYW5kIGMubm9tZSBub3QgbGlrZSAnJUNhbmFpcyBAJScgYW5kIGMubm9tZSBub3QgbGlrZSAnJVNFUklFUyUnKSI7DQogICAgaWYgKCFlbXB0eSgkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10pKSB7DQogICAgICAgICRxdWVyeV9jb3VudCAuPSAiIEFORCAobm9tZV9saW5rIExJS0UgOm5vbWVfbGluaykiOw0KICAgIH0NCg0KICAgICRxdWVyeV9jb3VudCA9ICRjb25leGFvMi0+cHJlcGFyZSgkcXVlcnlfY291bnQpOw0KICAgIGlmICghZW1wdHkoJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddKSkgew0KICAgICAgICAkdmFsb3JfcGVzcSA9ICIlIiAuICRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSAuICIlIjsNCiAgICAgICAgJHF1ZXJ5X2NvdW50LT5iaW5kVmFsdWUoJzpub21lX2xpbmsnLCAkdmFsb3JfcGVzcSk7DQogICAgfQ0KICAgICRxdWVyeV9jb3VudC0+ZXhlY3V0ZSgpOw0KICAgICRyZXN1bHRfY291bnQgPSAkcXVlcnlfY291bnQtPmZldGNoKFBETzo6RkVUQ0hfQVNTT0MpOw0KDQogICAgJGluaWNpbyA9IChpbnQpJGRhZG9zX3JlcXVpc2ljYW9bJ3N0YXJ0J107DQogICAgJHF1YW50aWRhZGUgPSAoaW50KSRkYWRvc19yZXF1aXNpY2FvWydsZW5ndGgnXTsNCg0KICAgIC8vIFF1ZXJ5IHBhcmEgbGlzdGFyIG9zIHJlZ2lzdHJvcyBjb20gcGFnaW5hw6fDo28NCiAgICAkbGlzdF9xdWVyeSA9ICJTRUxFQ1QgbC4qLCBjLm5vbWUgYXMgbm9tZSANCiAgICAgICAgICAgICAgICAgICAgICAgIEZST00gbGluayBsICANCiAgICAgICAgICAgICAgICAgICAgICAgIElOTkVSIEpPSU4gY2F0ZWdvcmlhIGMgT04gYy5pZCA9IGwuaWRfY2F0ZWdvcmlhIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0hFUkUgKGMubm9tZSBsaWtlICclRklMTUVTIHwlJyBPUiBjLm5vbWUgbGlrZSAnJUNPTEVUw4JORUElJyBPUiBjLm5vbWUgbGlrZSAnJUZJTE1FUyBAJScgT1IgYy5ub21lIGxpa2UgJ0RvY3VtZW50YXJpb3MnIE9SIGMubm9tZSBsaWtlICclU0hPVyUnIGFuZCBjLm5vbWUgbm90IGxpa2UgJyVDYW5haXMgfCUnIGFuZCBjLm5vbWUgbm90IGxpa2UgJyVDYW5haXMgQCUnIGFuZCBjLm5vbWUgbm90IGxpa2UgJyVTRVJJRVMlJykiOw0KDQogICAgaWYgKCFlbXB0eSgkZGFkb3NfcmVxdWlzaWNhb1snc2VhcmNoJ11bJ3ZhbHVlJ10pKSB7DQogICAgICAgICRsaXN0X3F1ZXJ5IC49ICIgQU5EIChub21lX2xpbmsgTElLRSA6bm9tZV9saW5rKSAiOw0KICAgIH0NCg0KICAgICRsaXN0X3F1ZXJ5IC49ICIgT1JERVIgQlkgIiAuICRjb2x1bmFzWyRkYWRvc19yZXF1aXNpY2FvWydvcmRlciddWzBdWydjb2x1bW4nXV0gLiAiICIgLiAkZGFkb3NfcmVxdWlzaWNhb1snb3JkZXInXVswXVsnZGlyJ10gLiAiIExJTUlUIDpxdWFudGlkYWRlIE9GRlNFVCA6aW5pY2lvIjsNCg0KICAgICRsaXN0X3F1ZXJ5ID0gJGNvbmV4YW8yLT5wcmVwYXJlKCRsaXN0X3F1ZXJ5KTsNCiAgICAkbGlzdF9xdWVyeS0+YmluZFZhbHVlKCc6aW5pY2lvJywgJGluaWNpbywgUERPOjpQQVJBTV9JTlQpOw0KICAgICRsaXN0X3F1ZXJ5LT5iaW5kVmFsdWUoJzpxdWFudGlkYWRlJywgJHF1YW50aWRhZGUsIFBETzo6UEFSQU1fSU5UKTsNCg0KICAgIGlmICghZW1wdHkoJGRhZG9zX3JlcXVpc2ljYW9bJ3NlYXJjaCddWyd2YWx1ZSddKSkgew0KICAgICAgICAkdmFsb3JfcGVzcSA9ICIlIiAuICRkYWRvc19yZXF1aXNpY2FvWydzZWFyY2gnXVsndmFsdWUnXSAuICIlIjsNCiAgICAgICAgJGxpc3RfcXVlcnktPmJpbmRWYWx1ZSgnOm5vbWVfbGluaycsICR2YWxvcl9wZXNxKTsNCiAgICB9DQoNCiAgICAvLyBFeGVjdXRhIGEgY29uc3VsdGENCiAgICAkbGlzdF9xdWVyeS0+ZXhlY3V0ZSgpOw0KDQogICAgLy8gUHJlcGFyYSBvcyBkYWRvcyBwYXJhIG8gZm9ybWF0byBKU09ODQogICAgJGRhZG9zID0gW107DQogICAgd2hpbGUgKCRyb3cgPSAkbGlzdF9xdWVyeS0+ZmV0Y2goUERPOjpGRVRDSF9BU1NPQykpIHsNCiAgICAgICAgLy8gUmVnaXN0cm9zIHBhcmEgdGFiZWxhIGNvbSBDaGlsZCByb3dzDQogICAgICAgICRyZWdpc3Ryb3NfY29tX2NoaWxkc19yb3dzID0gWw0KICAgICAgICAgICAgIklEIiAgICAgICA9PiAkcm93WydpZF9saW5rJ10sDQogICAgICAgICAgICAiTG9nbyIgICAgICA9PiAnPGltZyBzcmM9Jy4nIicuJHJvd1snbG9nbyddLiciJy4nc3R5bGU9InRleHQtYWxpZ246Y2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7IHdpZHRoOjQ1cHg7IGhlaWdodDo0NXB4OyIgLz4nLA0KICAgICAgICAgICAgIlRpdHVsbyIgPT4gJHJvd1snbm9tZV9saW5rJ10sDQogICAgICAgICAgICAiU2lub3BzZSIgPT4gJHJvd1snc2lub3BzZSddLA0KICAgICAgICAgICAgIkNhdGVnb3JpYSIgPT4gJHJvd1snbm9tZSddLA0KICAgICAgICAgICAgIkxpbmsiICAgICAgPT4gJHJvd1snbGlua19saW5rJ10sDQogICAgICAgICAgICAiRXhjIiAgICAgID0+ICc8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUtZGFuZ2VyIiBvbmNsaWNrPSJyZW1vdmVyQ29uZmlybWEoJy4iJyIuJHJvd1snaWRfbGluayddLiInIi4nLCcuIiciLiRyb3dbJ25vbWVfbGluayddLiInIi4nKSI+PGkgY2xhc3M9ImZhciBmYS10cmFzaC1hbHQiPjwvaT48L2J1dHRvbj4nLA0KICAgICAgICAgICAgIkFsdCIgICAgICA9PiAnPHRkPjxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkiIG9uY2xpY2s9ImVkaXRhckNvbmZpcm1hKCcuIiciLiRyb3dbJ2lkX2xpbmsnXS4iJyIuJywnLiInIi4kcm93Wydub21lX2xpbmsnXS4iJyIuJywnLiInIi4kcm93Wydsb2dvJ10uIiciLicsJy4iJyIuJHJvd1snbGlua19saW5rJ10uIiciLicsJy4iJyIuJHJvd1snc2lub3BzZSddLiInIi4nLCcuIiciLiRyb3dbJ2lkX2NhdGVnb3JpYSddLiInIi4nKSI+PGkgY2xhc3M9ImZhcyBmYS1lZGl0Ij48L2k+PC9idXR0b24+Jw0KICAgICAgICBdOw0KICAgICAgICAkZGFkb3NbXSA9ICRyZWdpc3Ryb3NfY29tX2NoaWxkc19yb3dzOw0KICAgIH0NCg0KICAgICRyZXN1bHRhZG8gPSBbDQogICAgICAgICJkcmF3IiAgICAgICAgICAgID0+IGludHZhbCgkZGFkb3NfcmVxdWlzaWNhb1snZHJhdyddKSwNCiAgICAgICAgInJlY29yZHNUb3RhbCIgICAgPT4gaW50dmFsKCRyZXN1bHRfY291bnRbJ3FudF9saW5rJ10pLA0KICAgICAgICAicmVjb3Jkc0ZpbHRlcmVkIiA9PiBpbnR2YWwoJHJlc3VsdF9jb3VudFsncW50X2xpbmsnXSksDQogICAgICAgICJkYXRhIiAgICAgICAgICAgID0+ICRkYWRvcw0KICAgIF07DQoNCiAgICBlY2hvIGpzb25fZW5jb2RlKCRyZXN1bHRhZG8pOw0KICAgIGV4aXQoKTsNCn0NCiA/Pg0KDQo8P3BocA0KICAgIHNlc3Npb25fc3RhcnQoKTsNCiAgICByZXF1aXJlX29uY2UoImNvbnRyb2xlcy91c3Vhcmlvcy5waHAiKTsNCiAgICByZXF1aXJlX29uY2UoImNvbnRyb2xlcy9saW5rcy5waHAiKTsNCiAgICByZXF1aXJlX29uY2UoImNvbnRyb2xlcy9jYXRlZ29yaWFzLnBocCIpOw0KICAgIC8vaW5jbHVkZSAncGFnaW5hdGlvbi5jbGFzcy5waHAnOw0KICAgIGlmIChjaGVjYXJVc3VhcmlvKCkpIHsNCiAgICAgICAgcmVxdWlyZV9vbmNlKCJjYWJlY2FsaG8ucGhwIik7DQogICAgICAgIGlmKCRfU0VTU0lPTlsnYWRtaW4nXSl7DQogICAgICAgIH0NCiAgICAgICAgLy8kbGlua3MgPSBsaXN0YXJsaW5rcygpOw0KICAgICAgICAkY2F0ZWdvcmlhcyA9IGxpc3RhckNhdGVnb3JpYXN0aXBvKCJmaWxtZXMiKTsNCg0KDQo/Pg0KICAgICAgICAgICAgPHN0eWxlIGlkPSJjaGVja21lIj4NCiAgICAgICAgICAgICAgICAucGFnZS0yY29udGVudCB7DQogICAgICAgICAgICAgICAgICAgIHBhZGRpbmctbGVmdDogMjQwcHggIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMjQwcHggIWltcG9ydGFudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICA8L3N0eWxlPg0KICAgICAgICAgICAgPGRpdiBpZD0iY29udGV1ZG8tcGFpbmVsIiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICAgICAgICAgICAgICA8dGFibGUgaWQ9ImRhdGFfdGFibGUiIGNsYXNzPSJkaXNwbGF5IG92ZXJmbG93LWF1dG8gdGFibGUiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPg0KICAgICAgICAgICAgICAgICAgPHRoZWFkIGNsYXNzPSJ0YWJsZS1kYXJrIj4NCiAgICAgICAgICAgICAgICAgICAgPHRyPjwhLS08dGg+PC90aD4gZGVzY29tZW50YXIgcGFyYSB1c2FyIGNoaWxkcyAtLT4NCiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHN0eWxlPSJ3aWR0aDogNSUiIHNjb3BlPSJjb2wiID4jPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCIgPkxvZ288L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDIwJSIgc2NvcGU9ImNvbCIgPlTDrXR1bG88L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDIwJSIgc2NvcGU9ImNvbCIgPlNpbm9wc2U8L3RoPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSdub21lY29sJyBzdHlsZT0id2lkdGg6IDIwJSIgc2NvcGU9ImNvbCIgPkNhdGVnb3JpYTwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9J25vbWVjb2wnIHNjb3BlPSJjb2wiID5MaW5rPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCI+RXhjPC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0nbm9tZWNvbCcgc3R5bGU9IndpZHRoOiA1JSIgc2NvcGU9ImNvbCI+QWx0PC90aD4NCiAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+DQogICAgICAgICAgICAgICAgPC90YWJsZT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L21haW4+DQo8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIvL2Nkbi5kYXRhdGFibGVzLm5ldC8yLjAuNy9jc3MvZGF0YVRhYmxlcy5kYXRhVGFibGVzLmNzcyI+DQo8c2NyaXB0IHNyYz0iLy9jZG4uZGF0YXRhYmxlcy5uZXQvMi4wLjcvanMvZGF0YVRhYmxlcy5qcyI+PC9zY3JpcHQ+DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICAgIC5vdmVyZmxvdy1hdXRvIHsNCiAgICBvdmVyZmxvdzogYXV0byAhaW1wb3J0YW50Ow0KfQ0KPC9zdHlsZT4NCjxzY3JpcHQgPg0KICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsNCiAgICAvLyBGdW7Dp8OjbyBwYXJhIGFkaWNpb25hciBhIGNsYXNzZSAnb3ZlcmZsb3ctYXV0bycgw6AgZGl2ICdkdC1sYXlvdXQtY2VsbCcNCiAgICBmdW5jdGlvbiBhZGRPdmVyZmxvd0F1dG8oKSB7DQogICAgICAgIHZhciB3cmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRhdGFfdGFibGVfd3JhcHBlciIpOw0KICAgICAgICBpZiAod3JhcHBlcikgew0KICAgICAgICAgICAgdmFyIGxheW91dENlbGwgPSB3cmFwcGVyLnF1ZXJ5U2VsZWN0b3IoIi5kdC1sYXlvdXQtdGFibGUiKTsNCiAgICAgICAgICAgIHZhciBkdF9jb250cm9sID0gd3JhcHBlci5xdWVyeVNlbGVjdG9yKCIuZHQtY29udHJvbCIpOw0KICAgICAgICAgICAgaWYgKGxheW91dENlbGwpIHsNCiAgICAgICAgICAgICAgICBsYXlvdXRDZWxsLmNsYXNzTGlzdC5hZGQoIm92ZXJmbG93LWF1dG8iKTsNCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJDbGFzc2UgJ292ZXJmbG93LWF1dG8nIGFkaWNpb25hZGEgw6AgZGl2IGNvbSBhIGNsYXNzZSAnZHQtbGF5b3V0LWNlbGwnIik7DQogICAgICAgICAgICB9aWYgKGR0X2NvbnRyb2wpIHsNCiAgICAgICAgICAgICAgICBkdF9jb250cm9sLmNsYXNzTGlzdC5yZW1vdmUoImR0LW9yZGVyaW5nLWRlc2MiKTsNCiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCJDbGFzc2UgJ2R0LW9yZGVyaW5nLWRlc2MnIHJlbW92aWRhIGRhIHRkIGNvbSBhIGNsYXNzZSAnZHQtY29udHJvbCciKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KDQogICAgLy8gQ3JpYSB1bSBNdXRhdGlvbk9ic2VydmVyIHBhcmEgb2JzZXJ2YXIgYXMgbXVkYW7Dp2FzIG5vIERPTQ0KICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucykgew0KICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikgew0KICAgICAgICAgICAgLy8gVmVyaWZpY2Egc2UgaG91dmUgdW1hIG11ZGFuw6dhIG5vIGVsZW1lbnRvIGNvbSBvIGlkICdkYXRhX3RhYmxlX3dyYXBwZXInDQogICAgICAgICAgICBpZiAobXV0YXRpb24udGFyZ2V0LmlkID09PSAiZGF0YV90YWJsZV93cmFwcGVyIikgew0KICAgICAgICAgICAgICAgIGFkZE92ZXJmbG93QXV0bygpOyAvLyBBZGljaW9uYSBhIGNsYXNzZSAnb3ZlcmZsb3ctYXV0bycNCiAgICAgICAgICAgICAgICAvL2R0X3NlYXJjaCgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9KTsNCg0KICAgIC8vIENvbmZpZ3VyYSBvIE11dGF0aW9uT2JzZXJ2ZXIgcGFyYSBvYnNlcnZhciBtdWRhbsOnYXMgbm8gRE9NDQogICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsNCg0KICAgIC8vIFZlcmlmaWNhIGUgYWRpY2lvbmEgYSBjbGFzc2UgJ292ZXJmbG93LWF1dG8nIGltZWRpYXRhbWVudGUgYXDDs3MgbyBET00gc2VyIGNhcnJlZ2Fkbw0KICAgIGFkZE92ZXJmbG93QXV0bygpOw0KfSk7DQokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsNCiAgICBmdW5jdGlvbiBkdF9zZWFyY2goKSB7DQogICAgICAgICQoJyNkdC1zZWFyY2gtMCcpLmFkZENsYXNzKCdjb2wgY29sLW1kLTYgZHQtaW5wdXQgZmxvYXQtbGVmdCBmb3JtLWNvbnRyb2wgZm9ybS1yb3cnKS5hdHRyKCdwbGFjZWhvbGRlcicsICdQZXNxdWlzYXIuLi4nKTsNCiAgICAgICAgJCgnLmR0LXNlYXJjaCcpLmFkZENsYXNzKCdmb3JtLXJvdyBkLWJsb2NrJyk7DQogICAgICAgIHZhciBsYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsYWJlbFtmb3I9ImR0LXNlYXJjaC0wIl0nKTsNCiAgICAgICAgaWYgKGxhYmVsRWxlbWVudCkgew0KICAgICAgICAgICAgbGFiZWxFbGVtZW50LnJlbW92ZSgpOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gU2VsZWNpb25hIHRvZG9zIG9zIGVsZW1lbnRvcyBjb20gYSBjbGFzc2UgJy5kdC1zZWFyY2gnDQogICAgICAgIHZhciBkdFNlYXJjaEVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmR0LXNlYXJjaCcpOw0KICAgICAgICBjb25zdCBub3ZvX2NhbmFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdm9fY2FuYWwnKTsNCg0KICAgICAgICBpZiAoIW5vdm9fY2FuYWwpIHsNCg0KICAgICAgICAgICAgLy8gSXRlcmEgc29icmUgY2FkYSBlbGVtZW50byBlbmNvbnRyYWRvDQogICAgICAgICAgICBkdFNlYXJjaEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZHRTZWFyY2hFbGVtZW50KSB7DQogICAgICAgICAgICAgICAgLy8gU2VsZWNpb25hIG8gaW5wdXQgZGVudHJvIGRlIGNhZGEgZWxlbWVudG8gJy5kdC1zZWFyY2gnDQogICAgICAgICAgICAgICAgdmFyIGlucHV0RWxlbWVudCA9IGR0U2VhcmNoRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOw0KDQogICAgICAgICAgICAgICAgLy8gQWRpY2lvbmEgYSBjbGFzc2UgJ2Zvcm0tcm93JyBhbyBpbnB1dA0KICAgICAgICAgICAgICAgIGlmIChpbnB1dEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgaW5wdXRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0tcm93Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JpYSBvIGVsZW1lbnRvIDxpPiBjb20gb3MgYXRyaWJ1dG9zIGVzcGVjaWZpY2Fkb3MNCiAgICAgICAgICAgICAgICAgICAgdmFyIG5vdm9FbGVtZW50byA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2knKTsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLmlubmVySFRNTCA9ICcgTm92byc7DQogICAgICAgICAgICAgICAgICAgIG5vdm9FbGVtZW50by5jbGFzc05hbWUgPSAnYnRuIGJ0bi1vdXRsaW5lLWluZm8gY29sIGNvbC1tZC0yIGZhLXVzZXItcGx1cyBmYXMgZmxvYXQtcmlnaHQgdGV4dC1kYXJrJzsNCiAgICAgICAgICAgICAgICAgICAgbm92b0VsZW1lbnRvLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOw0KICAgICAgICAgICAgICAgICAgICBub3ZvRWxlbWVudG8uc2V0QXR0cmlidXRlKCdpZCcsICdub3ZvX2NhbmFsJyk7DQogICAgICAgICAgICAgICAgICAgIG5vdm9FbGVtZW50by5zZXRBdHRyaWJ1dGUoJ29uY2xpY2snLCAiJCgnI2NhZGFzdHJvJykubW9kYWwoKSIpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIEluc2VyZSBvIG5vdm8gZWxlbWVudG8gYXDDs3MgbyBpbnB1dA0KICAgICAgICAgICAgICAgICAgICBpbnB1dEVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm92b0VsZW1lbnRvLCBpbnB1dEVsZW1lbnQubmV4dFNpYmxpbmcpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgfQ0KICAgIHZhciB0YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKHsNCiAgICAgICAgYWpheDogJz9saXN0YXJfbGlua3MnLA0KICAgICAgICBwcm9jZXNzaW5nOiB0cnVlLA0KICAgICAgICBzZXJ2ZXJTaWRlOiB0cnVlLA0KICAgICAgICBsYW5ndWFnZTogew0KICAgICAgICB1cmw6ICcvL2Nkbi5kYXRhdGFibGVzLm5ldC9wbHVnLWlucy8xLjEwLjEzL2kxOG4vUG9ydHVndWVzZS1CcmFzaWwuanNvbicNCiAgICB9LA0KICAgICAgICBzZWFyY2g6IHsNCiAgICAgICAgc2VhcmNoUGxhY2Vob2xkZXI6ICJQZXNxdWlzYXIuLi4iIC8vIFBsYWNlaG9sZGVyIHBhcmEgbyBjYW1wbyBkZSBwZXNxdWlzYQ0KICAgICAgICB9LCAgICAgICAgDQogICAgbGF5b3V0OiB7DQogICAgICAgIHRvcFN0YXJ0OiBudWxsLA0KICAgICAgICBib3R0b206ICdwYWdpbmcnLA0KICAgICAgICBib3R0b21TdGFydDogImluZm8iLA0KICAgICAgICBib3R0b21FbmQ6IG51bGwNCiAgICB9LA0KICAgICAgICBjb2x1bW5zOiBbDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgZGF0YTogIklEIiwNCiAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICJ0ZXh0LWNlbnRlciINCiAgICAgICAgICAgIH0sIC8vIElEDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBkYXRhOiAiTG9nbyIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIiDQogICAgICAgICAgICB9LCAvLyBVUkwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvL29yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIlRpdHVsbyIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIiDQogICAgICAgICAgICB9LCAvLyBMb2dvIFVSTA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIlNpbm9wc2UiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAvL29yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIkNhdGVnb3JpYSIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIiDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIkxpbmsiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBvcmRlcmFibGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGRhdGE6ICJFeGMiLA0KICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogInRleHQtY2VudGVyIGFjYW8iDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgIG9yZGVyYWJsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgZGF0YTogIkFsdCIsDQogICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAidGV4dC1jZW50ZXIgYWNhbyINCiAgICAgICAgICAgIH0sIC8vIExvZ28gVVJMDQogICAgICAgICAgICAvKnsgb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgICAgICAgIGRhdGE6IG51bGwsIC8vIEHDp8O1ZXMgKG5lbmh1bWEgZGF0YSBhc3NvY2lhZGEpDQogICAgICAgICAgICByZW5kZXI6IGZ1bmN0aW9uKGRhdGEsIHR5cGUsIHJvdykgew0KICAgICAgICAgICAgICBib3Rhb19lZGl0YXIgPSAnPGEgaWQ9IicgKyByb3cuaWQgKyAnIiBjbGFzcz0iYnRuIGJ0bi1pbmZvIGJ0bi1zbSI+RURJVEFSPC9hPic7DQogICAgICAgICAgICAgIGJvdGFvX2V4Y2x1aXIgPSAnPGEgY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGJ0bi1zbSI+RXhjbHVpcjwvYT4nOw0KICAgICAgICAgICAgcmV0dXJuIGJvdGFvX2VkaXRhciArIGJvdGFvX2V4Y2x1aXI7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB9Ki8NCiAgICAgICAgXSwNCiAgICBvcmRlcjogW1syLCAnYXNjJ11dLA0KICAgIGRyYXdDYWxsYmFjazogZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAvLyBDYWxsYmFjayBjaGFtYWRvIGFww7NzIGNhZGEgZGVzZW5obyBkYSB0YWJlbGEgKGluY2x1c2l2ZSBpbmljaWFsaXphw6fDo28pDQogICAgICAgICAgICBkdF9zZWFyY2goKTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogIH0pOw0KIC8vIEFkaWNpb25hIGEgY2xhc3NlICdmb3JtLWNvbnRyb2wnIGFvIGNhbXBvIGRlIHBlc3F1aXNhDQoNCjwvc2NyaXB0Pg0KICAgIDwhLS0gcGFnZS1jb250ZW50IiAtLT4NCjwvZGl2Pg0KPCEtLSBDYWRhc3RybyBJbmljaW8gLS0+DQo8ZGl2IGNsYXNzPSJtb2RhbCBmYWRlIiBpZD0iY2FkYXN0cm8iIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNhZGFzdHJhciIgYXJpYS1oaWRkZW49InRydWUiIGRhdGEtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1rZXlib2FyZD0iZmFsc2UiPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+QWRpY2lvbmFyIENvbnRlw7pkbzwvaDU+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iRmVjaGFyIj4NCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiIHN0eWxlPSJtYXgtaGVpZ2h0OjQ2MHB4OyBvdmVyZmxvdy15OmF1dG87Ij4NCiAgICAgICAgICAgICAgICA8Zm9ybSBpZD0iY2FkYXN0cm8tZm9ybSI+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+Tm9tZTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJub21lIiBwbGFjZWhvbGRlcj0iTm9tZSBkbyBMaW5rIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Mb2dvOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9ImxvZ28iIHBsYWNlaG9sZGVyPSJMaW5rIGRhIEltYWdlbSIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+VXJsOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIG5hbWU9ImxpbmsiIHBsYWNlaG9sZGVyPSJVcmwgZG8gTGluayIgcmVxdWlyZWQgYXV0b2ZvY3VzPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+U2lub3BzZTo8L2xhYmVsPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iZm9ybS1jb250cm9sIiBuYW1lPSJzaW5vcHNlIiBwbGFjZWhvbGRlcj0iU2lub3BzZSBkbyBDb250ZcO6ZG8iIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkNhdGVnb3LDrWE6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtbC0wIHJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InNlbGVjdHBpY2tlciIgdGl0bGU9IkNhdGVnb3JpYSIgbmFtZT0iY2F0ZWdvcmlhIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJGNhdGVnb3JpYXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoKCRjYXRlZ29yaWFzIGFzICRjYXRlZ29yaWEpIHs/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI8Pz0gJGNhdGVnb3JpYVsnaWQnXT8+IiA+IDw/PSAkY2F0ZWdvcmlhWydub21lJ10/PiA8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIH0gfSA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICA8L2Rpdj4NCgkJCTxkaXYgY2xhc3M9Im1vZGFsLWZvb3RlciI+DQoJCQkJPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGZvcm09ImNhZGFzdHJvLWZvcm0iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiPkFkaWNpb25hcjwvYnV0dG9uPg0KCQkJCTxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkZlY2hhcjwvYnV0dG9uPg0KCQkJPC9kaXY+ICAgICAgICAgICAgDQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KPC9kaXY+DQo8IS0tIENhZGFzdHJvIEZpbS0tPg0KPCEtLSBSZW1vdmUgSW5pY2lvIC0tPg0KPGRpdiBjbGFzcz0ibW9kYWwgZmFkZSIgaWQ9InJlbW92ZXIiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNhZGFzdHJhciIgYXJpYS1oaWRkZW49InRydWUiIGRhdGEtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1rZXlib2FyZD0iZmFsc2UiPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+VGVtIGNlcnRlemE/PC9oNT4NCiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9ImNsb3NlIiBkYXRhLWRpc21pc3M9Im1vZGFsIiBhcmlhLWxhYmVsPSJGZWNoYXIiPg0KICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj0idHJ1ZSI+JnRpbWVzOzwvc3Bhbj4NCiAgICAgICAgICAgICAgICA8L2J1dHRvbj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPGRpdiBpZD0icmVtb3Zlci1jb250ZXVkbyIgY2xhc3M9Im1vZGFsLWJvZHkiPjwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KPCEtLSBSZW1vdmUgRmltLS0+DQo8IS0tIEVkaXRhIEluaWNpbyAtLT4NCjxkaXYgY2xhc3M9Im1vZGFsIGZhZGUiIGlkPSJlZGl0YXIiIHRhYmluZGV4PSItMSIgcm9sZT0iZGlhbG9nIiBhcmlhLWxhYmVsbGVkYnk9IkNhZGFzdHJhciIgYXJpYS1oaWRkZW49InRydWUiIGRhdGEtYmFja2Ryb3A9InN0YXRpYyIgZGF0YS1rZXlib2FyZD0iZmFsc2UiPg0KICAgIDxkaXYgY2xhc3M9Im1vZGFsLWRpYWxvZyIgcm9sZT0iZG9jdW1lbnQiPg0KICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1jb250ZW50Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWhlYWRlciI+DQogICAgICAgICAgICAgICAgPGg1IGNsYXNzPSJtb2RhbC10aXRsZSI+RWRpdGFyIENvbnRlw7pkbzwvaDU+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJjbG9zZSIgZGF0YS1kaXNtaXNzPSJtb2RhbCIgYXJpYS1sYWJlbD0iRmVjaGFyIj4NCiAgICAgICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49InRydWUiPiZ0aW1lczs8L3NwYW4+DQogICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiIHN0eWxlPSJtYXgtaGVpZ2h0OjQ2MHB4OyBvdmVyZmxvdy15OmF1dG87Ij4NCiAgICAgICAgICAgICAgICA8Zm9ybSBpZD0iZWRpdGFyLWZvcm0iPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaWQiIGlkPSJpZEUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPk5vbWU6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9Im5vbWVFIiBuYW1lPSJub21lIiBwbGFjZWhvbGRlcj0iTm9tZSBkbyBMaW5rIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Mb2dvOjwvbGFiZWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGlkPSJsb2dvRSIgbmFtZT0ibG9nbyIgcGxhY2Vob2xkZXI9IkxpbmsgZGEgSW1hZ2VtIiByZXF1aXJlZCBhdXRvZm9jdXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5Vcmw6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9ImxpbmtFIiBuYW1lPSJsaW5rIiBwbGFjZWhvbGRlcj0iVXJsIGRvIExpbmsiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlNpbm9wc2U6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9ImZvcm0tY29udHJvbCIgaWQ9InNpbm9wc2VFIiBuYW1lPSJzaW5vcHNlIiBwbGFjZWhvbGRlcj0iU2lub3BzZSBkbyBDb250ZcO6ZG8iIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkNhdGVnb3LDrWE6PC9sYWJlbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtbC0wIHJvdyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9InNlbGVjdHBpY2tlciIgdGl0bGU9IkNhdGVnb3LDrWEiIGlkPSJjYXRlZ29yaWFFIiBuYW1lPSJjYXRlZ29yaWEiIHJlcXVpcmVkIGF1dG9mb2N1cz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwICBpZiAoJGNhdGVnb3JpYXMpIHsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCgkY2F0ZWdvcmlhcyBhcyAkY2F0ZWdvcmlhKSB7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iPD89ICRjYXRlZ29yaWFbJ2lkJ10/PiIgPiA8Pz0gJGNhdGVnb3JpYVsnbm9tZSddPz4gPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCB9IH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgPC9kaXY+DQoJCQk8ZGl2IGNsYXNzPSJtb2RhbC1mb290ZXIiPg0KCQkJCTxidXR0b24gdHlwZT0ic3VibWl0IiBmb3JtPSJlZGl0YXItZm9ybSIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSI+RWRpdGFyPC9idXR0b24+DQoJCQkJPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIgZGF0YS1kaXNtaXNzPSJtb2RhbCI+RmVjaGFyPC9idXR0b24+DQoJCQk8L2Rpdj4gICAgICAgICAgICANCiAgICAgICAgPC9kaXY+DQogICAgPC9kaXY+DQo8L2Rpdj4NCjwhLS0gRWRpdGEgRmltLS0+DQo8L2JvZHk+DQo8c2NyaXB0Pg0KICAgIGZ1bmN0aW9uIHJlbW92ZXJDb25maXJtYShpZCxub21lKSB7DQogICAgICAgICQoJyNyZW1vdmVyLWNvbnRldWRvJykuaHRtbCgnPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnQtZGFuZ2VyIiByb2xlPSJhbGVydCI+PHN0cm9uZz4gUmVtb3ZlciA8L3N0cm9uZz4nICsgbm9tZSArICc/PC9kaXY+PGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSBmbG9hdC1yaWdodCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEwcHgiIGRhdGEtZGlzbWlzcz0ibW9kYWwiPkZlY2hhcjwvYnV0dG9uPjxidXR0b24gb25jbGljaz0icmVtb3ZlcignICsgaWQgKyAnKSIgdHlwZT0ic3VibWl0IiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgZmxvYXQtcmlnaHQiPlJlbW92ZXI8L2J1dHRvbj4nKTsNCiAgICAgICAgJCgnI3JlbW92ZXInKS5tb2RhbCgpOw0KICAgIH0NCiAgICBmdW5jdGlvbiBlZGl0YXJDb25maXJtYShpZCxub21lLCBsb2dvLCBsaW5rLCBzaW5vcHNlLCBjYXRlZ29yaWEpIHsNCiAgICAgICAgJCgnI2lkRScpLnZhbChpZCk7DQogICAgICAgICQoJyNub21lRScpLnZhbChub21lKTsNCiAgICAgICAgJCgnI2xvZ29FJykudmFsKGxvZ28pOw0KICAgICAgICAkKCcjbGlua0UnKS52YWwobGluayk7DQogICAgICAgICQoJyNzaW5vcHNlRScpLnZhbChzaW5vcHNlKTsNCiAgICAgICAgaWYgKGNhdGVnb3JpYSAhPT0gIiIpIHsNCiAgICAgICAgICAkKCcjY2F0ZWdvcmlhRScpLnZhbChjYXRlZ29yaWEpOw0KICAgICAgICAgICQoJyNjYXRlZ29yaWFFJykuc2VsZWN0cGlja2VyKCdyZW5kZXInKTsNCiAgICAgICAgfQ0KICAgICAgICAkKCcjZWRpdGFyJykubW9kYWwoKTsNCiAgICB9DQogICAgZnVuY3Rpb24gcmVtb3ZlcihpZCkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL3JlbW92ZXItbGluay5waHAiLA0KICAgICAgICAgICAgZGF0YToge2lkOiBpZH0sDQogICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7DQogICAgICAgICAgICAgICAgJCgiI3JlbW92ZXIiKS5tb2RhbCgnaGlkZScpOw0KICAgICAgICAgICAgICAgIGRhdGFfdGFibGUgPSAkKCcjZGF0YV90YWJsZScpLkRhdGFUYWJsZSgpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcGFnaW5hX2F0dWFsID0gZGF0YV90YWJsZS5wYWdlKCk7IC8vIEFybWF6ZW5hIGEgcMOhZ2luYSBhdHVhbA0KICAgICAgICAgICAgICAgICAgICAvLyBBdHVhbGl6YSBhIHRhYmVsYQ0KICAgICAgICAgICAgICAgICAgICBkYXRhX3RhYmxlLmRyYXcoKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gUmVzdGF1cmEgYSBww6FnaW5hIGFww7NzIGEgYXR1YWxpemHDp8Ojbw0KICAgICAgICAgICAgICAgICAgICBkYXRhX3RhYmxlLnBhZ2UocGFnaW5hX2F0dWFsKS5kcmF3KCdwYWdlJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCiAgICAkKCAiI2NhZGFzdHJvLWZvcm0iICkuc3VibWl0KGZ1bmN0aW9uKCBldmVudCApIHsNCiAgICAgICAgJC5hamF4KHsNCiAgICAgICAgICAgIHR5cGU6ICJQT1NUIiwNCiAgICAgICAgICAgIHVybDogImNvbnRyb2xlcy9hZGljaW9uYXItbGluay5waHAiLA0KICAgICAgICAgICAgZGF0YTogJCgiI2NhZGFzdHJvLWZvcm0iKS5zZXJpYWxpemUoKSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICQoIiNjYWRhc3RybyIpLm1vZGFsKCdoaWRlJyk7DQogICAgICAgICAgICAgICAgZGF0YV90YWJsZSA9ICQoJyNkYXRhX3RhYmxlJykuRGF0YVRhYmxlKCk7DQogICAgICAgICAgICAgICAgICAgIHZhciBwYWdpbmFfYXR1YWwgPSBkYXRhX3RhYmxlLnBhZ2UoKTsgLy8gQXJtYXplbmEgYSBww6FnaW5hIGF0dWFsDQogICAgICAgICAgICAgICAgICAgIC8vIEF0dWFsaXphIGEgdGFiZWxhDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUuZHJhdygpOw0KICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXVyYSBhIHDDoWdpbmEgYXDDs3MgYSBhdHVhbGl6YcOnw6NvDQogICAgICAgICAgICAgICAgICAgIGRhdGFfdGFibGUucGFnZShwYWdpbmFfYXR1YWwpLmRyYXcoJ3BhZ2UnKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGRhdGEpIHsNCiAgICAgICAgICAgICAgcmVzdWx0YWRvKGRhdGEucmVzcG9uc2VUZXh0KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgfSk7DQogICAgJCggIiNlZGl0YXItZm9ybSIgKS5zdWJtaXQoZnVuY3Rpb24oIGV2ZW50ICkgew0KICAgICAgICAkLmFqYXgoew0KICAgICAgICAgICAgdHlwZTogIlBPU1QiLA0KICAgICAgICAgICAgdXJsOiAiY29udHJvbGVzL2VkaXRhci1saW5rLnBocCIsDQogICAgICAgICAgICBkYXRhOiAkKCIjZWRpdGFyLWZvcm0iKS5zZXJpYWxpemUoKSwNCiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAkKCIjZWRpdGFyIikubW9kYWwoJ2hpZGUnKTsNCiAgICAgICAgICAgICAgICBkYXRhX3RhYmxlID0gJCgnI2RhdGFfdGFibGUnKS5EYXRhVGFibGUoKTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2luYV9hdHVhbCA9IGRhdGFfdGFibGUucGFnZSgpOyAvLyBBcm1hemVuYSBhIHDDoWdpbmEgYXR1YWwNCiAgICAgICAgICAgICAgICAgICAgLy8gQXR1YWxpemEgYSB0YWJlbGENCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5kcmF3KCk7DQogICAgICAgICAgICAgICAgICAgIC8vIFJlc3RhdXJhIGEgcMOhZ2luYSBhcMOzcyBhIGF0dWFsaXphw6fDo28NCiAgICAgICAgICAgICAgICAgICAgZGF0YV90YWJsZS5wYWdlKHBhZ2luYV9hdHVhbCkuZHJhdygncGFnZScpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZGF0YSkgew0KICAgICAgICAgICAgICByZXN1bHRhZG8oZGF0YS5yZXNwb25zZVRleHQpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICB9KTsNCiAgICBzcGVlZF90b190b3AgPSAxMDAwOyAgIA0KICAgICQoJyN0b3RvcCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgJCgnYm9keSxodG1sJykuYW5pbWF0ZSh7DQogICAgICAgICAgICBzY3JvbGxUb3A6IDANCiAgICAgICAgfSwgc3BlZWRfdG9fdG9wKTsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0pOw0KICAgICQoJyN0b3RvcCcpLmhpZGUoKTsNCiAgICAkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgaWYgKCQodGhpcykuc2Nyb2xsVG9wKCkgPiA1MCkgew0KICAgICAgICAgICAgJCgnI3RvdG9wJykuZmFkZUluKCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkKCcjdG90b3AnKS5mYWRlT3V0KCk7DQogICAgICAgIH0NCiAgICB9KTsNCg0KPC9zY3JpcHQ+DQo8P3BocCANCiAgICByZXF1aXJlX29uY2UoImNvbXVtLnBocCIpOw0KICAgIHJlcXVpcmVfb25jZSgiYWxlcnRhLnBocCIpOyANCj8+DQo8L2h0bWw+DQo8P3BocCANCn0gZWxzZSB7DQogICAgaGVhZGVyKCJMb2NhdGlvbjogbG9naW4iKTsNCiAgICBkaWUoKTsNCn0NCj8+"));//Generated by Ampare PHP Encoder. For more security please use php protect before encode the php program

Function Calls

base64_decode 1

Variables

None

Stats

MD5 749616e2c34bf12034e11a0da1eeb458
Eval Count 1
Decode Time 84 ms