#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
typedef struct no{
    int pontuacao, id;
    struct no *dir, *esq, *pai;
}No;
 
No *cria_no(int nova_pontuacao, int ID){
    No 
*novo 
= malloc(sizeof(No
));    novo->pontuacao = nova_pontuacao;
    novo->dir = novo->esq = NULL;
    novo->id = ID;
    novo->pai = NULL;
    return novo;
}
 
No *insere_no(No *raiz, int nova_pontuacao, int ID){
    No *pai_aux = NULL;
    No *aux = NULL;
    No *nova = cria_no(nova_pontuacao, ID);
    if (raiz == NULL)
        raiz = nova;
    else
    {
        aux = raiz;
        while (aux != NULL)
        {
            pai_aux = aux;
            if (nova_pontuacao < aux->pontuacao)
                aux = aux->esq;
            else
                aux = aux->dir;
        }
        nova->pai = pai_aux;
        if (nova_pontuacao < pai_aux->pontuacao)
            pai_aux->esq = nova;
        else
            pai_aux->dir = nova;
    }
    return raiz;
}
 
void em_ordem(No *raiz)
{
    if (raiz != NULL)
    {
        em_ordem(raiz->esq);
        printf("%d ", raiz
->pontuacao
);         em_ordem(raiz->dir);
    }
}
 
void pre_ordem(No *raiz)
{
    if (raiz != NULL)
    {
        printf("%d ", raiz
->pontuacao
);         pre_ordem(raiz->esq);
        pre_ordem(raiz->dir);
    }
}
 
No* sucessor(No *no_remover)
{
 
    // por sucessor
    No *suc = no_remover->dir;
 
    while (suc->esq != NULL)
    {
        suc = suc->esq;
    }
 
    return suc;
}
 
No* antecessor(No *no_remover)
{
 
    // por sucessor
    No *ant = no_remover->esq;
 
    while (ant->dir != NULL)
    {
        ant = ant->dir;
    }
 
    return ant;
}
 
No *remove_noavl(No *raiz, int chave)
{
 
    No *no_remover = raiz;
    No *pai_no_remover = NULL;
    No *copia = NULL;
 
    while (no_remover != NULL && no_remover->pontuacao != chave)
    {
        if (no_remover->pontuacao < chave)
            no_remover = no_remover->dir;
        else
            no_remover = no_remover->esq;
    }
 
    while (no_remover != NULL) // encontrou o valor a ser removido
    {
        if (no_remover->esq == NULL && no_remover->dir == NULL)//eh folha
        {
            if (raiz == no_remover)
            {
                no_remover = raiz = NULL;
            }
            else
            {
                if (no_remover->pai->esq != NULL && no_remover->pai->esq->pontuacao == chave)
                    no_remover->pai->esq = NULL;
                else
                    no_remover->pai->dir = NULL;
 
                no_remover = NULL;
            }
        }
        else // tem um filho ou dois filhos
        {
 
            if (no_remover->dir != NULL)
                copia = sucessor(no_remover);
            else
                copia = antecessor(no_remover);
 
                //substitui o valor da ser removido pelo valor
                //do sucessor ou do antecessor
            no_remover->pontuacao = copia->pontuacao;
            no_remover->id = copia->id;
            //muda o no a ser removido para o sucessor ou antecessor
            no_remover = copia;
            chave = copia->pontuacao;
        }
 
    }
    return raiz;
}
 
No* registrar(No *raiz){
    int pontuacao;
    int id;
    return insere_no(raiz, pontuacao, id);
}
 
int verifica_existencia(No*raiz, int id, int *pontuacao_velha, int*flag){
    if(raiz != NULL && (*flag) != 1){
        verifica_existencia(raiz->dir, id, pontuacao_velha, flag);
        if(raiz->id == id){
            (*flag) = 1;
            (*pontuacao_velha) = raiz->pontuacao;
        }
        verifica_existencia(raiz->esq, id, pontuacao_velha, flag);
    }
}
 
No* UPDATE(No *raiz){
    int pontuacao_nova, pontuacao_velha, id, flag = 0;
 
    scanf("%d", &pontuacao_nova
);  
    if(raiz != NULL){
        verifica_existencia(raiz, id, &pontuacao_velha, &flag);
 
        if(flag == 1){
            raiz = remove_noavl(raiz, pontuacao_velha);
            raiz = insere_no(raiz, pontuacao_nova, id);
        }
    }
    return raiz;
}
 
int ID_MAX(No *raiz){
    No* aux = raiz;
    while(aux->esq != NULL)
        aux = aux->esq;
    return aux->id;
}
 
void posicao_calc(No *raiz, int id, int *CAT, int *flag){
    if(raiz != NULL && (*flag) != 1){
        posicao_calc(raiz->dir, id, CAT, flag);
        if(raiz->id == id){
            (*flag) = 1;
            (*CAT)++;
        }
        else if((*flag) != 1){
            (*CAT)++;
        }
        posicao_calc(raiz->esq, id, CAT, flag);
    }
}
 
void posicao(No *raiz){
    int id = 0;
 
    if(raiz != NULL){
        int rez_01, rez_02, aux_id, pos;
        rez_01 = rez_02 = aux_id = pos = 0;
 
        aux_id = ID_MAX(raiz);
 
        posicao_calc(raiz, id, &rez_01, &pos);
 
        pos = 0;
 
        posicao_calc(raiz, aux_id, &rez_02, &pos);
 
        if(rez_01>rez_02)
        else
    }
 
}
 
void top(No *raiz){
    if(raiz != NULL){
        No* aux = raiz;
        while(aux->dir != NULL)
            aux = aux->dir;
    }
    else{
    }
}
 
void BOTTOM(No *raiz){
    if(raiz != NULL){
        No* aux = raiz;
        while(aux->esq != NULL)
            aux = aux->esq;
    }
    else{
    }
 
}
 
void RANGE_CALC(No *raiz, int pont_min, int pont_max){
    if(raiz != NULL){
        RANGE_CALC(raiz->dir, pont_min, pont_max);
        if(pont_min <= raiz->pontuacao && raiz->pontuacao <= pont_max){
        }
        RANGE_CALC(raiz->esq, pont_min, pont_max);
    }
}
 
void RANGE(No *raiz){
    int min;
    int max;
    min = max = 0;
 
    scanf("%d %d", &min
, &max
);     if(raiz != NULL){
        RANGE_CALC(raiz, min, max);
    }
    else
}
 
void COUNT_ABOVE(No *raiz, int ac, int* cont_0x){
    if (raiz != NULL)
    {
        COUNT_ABOVE(raiz->dir, ac, cont_0x);
        if(raiz->pontuacao > ac)
            (*cont_0x)++;
        COUNT_ABOVE(raiz->esq, ac, cont_0x);
    }
}
 
void COUNT_BELOW(No *raiz, int ac, int* cont_0x){
    if (raiz != NULL)
    {
        COUNT_BELOW(raiz->dir, ac, cont_0x);
        if(raiz->pontuacao < ac)
            (*cont_0x)++;
        COUNT_BELOW(raiz->esq, ac, cont_0x);
    }
}
 
int main(){
 
No *ABB = NULL;
int n, cont = 0;
int ac = 0;
int cont_02 = 0;
char rep[20];
 
 
while(cont < n){
 
    if(strcmp(rep
, "REGISTER") == 0)         ABB = registrar(ABB); 
    else if(strcmp(rep
, "UPDATE") == 0)         ABB = UPDATE(ABB);    
    else if(strcmp(rep
, "POSITION") == 0)         posicao(ABB);
    else if(strcmp(rep
, "RANGE") == 0)         RANGE(ABB);
    else if(strcmp(rep
, "TOP") == 0)         top(ABB);
    else if(strcmp(rep
, "BOTTOM") == 0)         BOTTOM(ABB);
    else if(strcmp(rep
, "COUNT_ABOVE") == 0){         ac = cont_02 = 0;
        COUNT_ABOVE(ABB, ac, &cont_02);
    }
    else if(strcmp(rep
, "COUNT_BELOW") == 0){         ac = cont_02 = 0;
        COUNT_BELOW(ABB, ac, &cont_02);
    }
    cont++;
}
 
return 0;}
				I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3Qgbm97CiAgICBpbnQgcG9udHVhY2FvLCBpZDsKICAgIHN0cnVjdCBubyAqZGlyLCAqZXNxLCAqcGFpOwp9Tm87CgpObyAqY3JpYV9ubyhpbnQgbm92YV9wb250dWFjYW8sIGludCBJRCl7CiAgICBObyAqbm92byA9IG1hbGxvYyhzaXplb2YoTm8pKTsKICAgIG5vdm8tPnBvbnR1YWNhbyA9IG5vdmFfcG9udHVhY2FvOwogICAgbm92by0+ZGlyID0gbm92by0+ZXNxID0gTlVMTDsKICAgIG5vdm8tPmlkID0gSUQ7CiAgICBub3ZvLT5wYWkgPSBOVUxMOwogICAgcmV0dXJuIG5vdm87Cn0KCk5vICppbnNlcmVfbm8oTm8gKnJhaXosIGludCBub3ZhX3BvbnR1YWNhbywgaW50IElEKXsKICAgIE5vICpwYWlfYXV4ID0gTlVMTDsKICAgIE5vICphdXggPSBOVUxMOwogICAgTm8gKm5vdmEgPSBjcmlhX25vKG5vdmFfcG9udHVhY2FvLCBJRCk7CiAgICBpZiAocmFpeiA9PSBOVUxMKQogICAgICAgIHJhaXogPSBub3ZhOwogICAgZWxzZQogICAgewogICAgICAgIGF1eCA9IHJhaXo7CiAgICAgICAgd2hpbGUgKGF1eCAhPSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgcGFpX2F1eCA9IGF1eDsKICAgICAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvIDwgYXV4LT5wb250dWFjYW8pCiAgICAgICAgICAgICAgICBhdXggPSBhdXgtPmVzcTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYXV4ID0gYXV4LT5kaXI7CiAgICAgICAgfQogICAgICAgIG5vdmEtPnBhaSA9IHBhaV9hdXg7CiAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvIDwgcGFpX2F1eC0+cG9udHVhY2FvKQogICAgICAgICAgICBwYWlfYXV4LT5lc3EgPSBub3ZhOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcGFpX2F1eC0+ZGlyID0gbm92YTsKICAgIH0KICAgIHJldHVybiByYWl6Owp9Cgp2b2lkIGVtX29yZGVtKE5vICpyYWl6KQp7CiAgICBpZiAocmFpeiAhPSBOVUxMKQogICAgewogICAgICAgIGVtX29yZGVtKHJhaXotPmVzcSk7CiAgICAgICAgcHJpbnRmKCIlZCAiLCByYWl6LT5wb250dWFjYW8pOwogICAgICAgIGVtX29yZGVtKHJhaXotPmRpcik7CiAgICB9Cn0KCnZvaWQgcHJlX29yZGVtKE5vICpyYWl6KQp7CiAgICBpZiAocmFpeiAhPSBOVUxMKQogICAgewogICAgICAgIHByaW50ZigiJWQgIiwgcmFpei0+cG9udHVhY2FvKTsKICAgICAgICBwcmVfb3JkZW0ocmFpei0+ZXNxKTsKICAgICAgICBwcmVfb3JkZW0ocmFpei0+ZGlyKTsKICAgIH0KfQoKTm8qIHN1Y2Vzc29yKE5vICpub19yZW1vdmVyKQp7CgogICAgLy8gcG9yIHN1Y2Vzc29yCiAgICBObyAqc3VjID0gbm9fcmVtb3Zlci0+ZGlyOwoKICAgIHdoaWxlIChzdWMtPmVzcSAhPSBOVUxMKQogICAgewogICAgICAgIHN1YyA9IHN1Yy0+ZXNxOwogICAgfQoKICAgIHJldHVybiBzdWM7Cn0KCk5vKiBhbnRlY2Vzc29yKE5vICpub19yZW1vdmVyKQp7CgogICAgLy8gcG9yIHN1Y2Vzc29yCiAgICBObyAqYW50ID0gbm9fcmVtb3Zlci0+ZXNxOwoKICAgIHdoaWxlIChhbnQtPmRpciAhPSBOVUxMKQogICAgewogICAgICAgIGFudCA9IGFudC0+ZGlyOwogICAgfQoKICAgIHJldHVybiBhbnQ7Cn0KCk5vICpyZW1vdmVfbm9hdmwoTm8gKnJhaXosIGludCBjaGF2ZSkKewoKICAgIE5vICpub19yZW1vdmVyID0gcmFpejsKICAgIE5vICpwYWlfbm9fcmVtb3ZlciA9IE5VTEw7CiAgICBObyAqY29waWEgPSBOVUxMOwoKICAgIHdoaWxlIChub19yZW1vdmVyICE9IE5VTEwgJiYgbm9fcmVtb3Zlci0+cG9udHVhY2FvICE9IGNoYXZlKQogICAgewogICAgICAgIGlmIChub19yZW1vdmVyLT5wb250dWFjYW8gPCBjaGF2ZSkKICAgICAgICAgICAgbm9fcmVtb3ZlciA9IG5vX3JlbW92ZXItPmRpcjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5vX3JlbW92ZXIgPSBub19yZW1vdmVyLT5lc3E7CiAgICB9CgogICAgd2hpbGUgKG5vX3JlbW92ZXIgIT0gTlVMTCkgLy8gZW5jb250cm91IG8gdmFsb3IgYSBzZXIgcmVtb3ZpZG8KICAgIHsKICAgICAgICBpZiAobm9fcmVtb3Zlci0+ZXNxID09IE5VTEwgJiYgbm9fcmVtb3Zlci0+ZGlyID09IE5VTEwpLy9laCBmb2xoYQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHJhaXogPT0gbm9fcmVtb3ZlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZnJlZShyYWl6KTsKICAgICAgICAgICAgICAgIG5vX3JlbW92ZXIgPSByYWl6ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChub19yZW1vdmVyLT5wYWktPmVzcSAhPSBOVUxMICYmIG5vX3JlbW92ZXItPnBhaS0+ZXNxLT5wb250dWFjYW8gPT0gY2hhdmUpCiAgICAgICAgICAgICAgICAgICAgbm9fcmVtb3Zlci0+cGFpLT5lc3EgPSBOVUxMOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIG5vX3JlbW92ZXItPnBhaS0+ZGlyID0gTlVMTDsKCiAgICAgICAgICAgICAgICBmcmVlKG5vX3JlbW92ZXIpOwogICAgICAgICAgICAgICAgbm9fcmVtb3ZlciA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSAvLyB0ZW0gdW0gZmlsaG8gb3UgZG9pcyBmaWxob3MKICAgICAgICB7CgogICAgICAgICAgICBpZiAobm9fcmVtb3Zlci0+ZGlyICE9IE5VTEwpCiAgICAgICAgICAgICAgICBjb3BpYSA9IHN1Y2Vzc29yKG5vX3JlbW92ZXIpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjb3BpYSA9IGFudGVjZXNzb3Iobm9fcmVtb3Zlcik7CgogICAgICAgICAgICAgICAgLy9zdWJzdGl0dWkgbyB2YWxvciBkYSBzZXIgcmVtb3ZpZG8gcGVsbyB2YWxvcgogICAgICAgICAgICAgICAgLy9kbyBzdWNlc3NvciBvdSBkbyBhbnRlY2Vzc29yCiAgICAgICAgICAgIG5vX3JlbW92ZXItPnBvbnR1YWNhbyA9IGNvcGlhLT5wb250dWFjYW87CiAgICAgICAgICAgIG5vX3JlbW92ZXItPmlkID0gY29waWEtPmlkOwogICAgICAgICAgICAvL211ZGEgbyBubyBhIHNlciByZW1vdmlkbyBwYXJhIG8gc3VjZXNzb3Igb3UgYW50ZWNlc3NvcgogICAgICAgICAgICBub19yZW1vdmVyID0gY29waWE7CiAgICAgICAgICAgIGNoYXZlID0gY29waWEtPnBvbnR1YWNhbzsKICAgICAgICB9CiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gcmFpejsKfQoKTm8qIHJlZ2lzdHJhcihObyAqcmFpeil7CiAgICBpbnQgcG9udHVhY2FvOwogICAgaW50IGlkOwogICAgc2NhbmYoIiVkIiwgJmlkKTsKICAgIHNjYW5mKCIlZCIsICZwb250dWFjYW8pOwogICAgcmV0dXJuIGluc2VyZV9ubyhyYWl6LCBwb250dWFjYW8sIGlkKTsKfQoKaW50IHZlcmlmaWNhX2V4aXN0ZW5jaWEoTm8qcmFpeiwgaW50IGlkLCBpbnQgKnBvbnR1YWNhb192ZWxoYSwgaW50KmZsYWcpewogICAgaWYocmFpeiAhPSBOVUxMICYmICgqZmxhZykgIT0gMSl7CiAgICAgICAgdmVyaWZpY2FfZXhpc3RlbmNpYShyYWl6LT5kaXIsIGlkLCBwb250dWFjYW9fdmVsaGEsIGZsYWcpOwogICAgICAgIGlmKHJhaXotPmlkID09IGlkKXsKICAgICAgICAgICAgKCpmbGFnKSA9IDE7CiAgICAgICAgICAgICgqcG9udHVhY2FvX3ZlbGhhKSA9IHJhaXotPnBvbnR1YWNhbzsKICAgICAgICB9CiAgICAgICAgdmVyaWZpY2FfZXhpc3RlbmNpYShyYWl6LT5lc3EsIGlkLCBwb250dWFjYW9fdmVsaGEsIGZsYWcpOwogICAgfQp9CgpObyogVVBEQVRFKE5vICpyYWl6KXsKICAgIGludCBwb250dWFjYW9fbm92YSwgcG9udHVhY2FvX3ZlbGhhLCBpZCwgZmxhZyA9IDA7CgogICAgc2NhbmYoIiVkIiwgJmlkKTsKICAgIHNjYW5mKCIlZCIsICZwb250dWFjYW9fbm92YSk7CiAgICAKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgdmVyaWZpY2FfZXhpc3RlbmNpYShyYWl6LCBpZCwgJnBvbnR1YWNhb192ZWxoYSwgJmZsYWcpOwoKICAgICAgICBpZihmbGFnID09IDEpewogICAgICAgICAgICByYWl6ID0gcmVtb3ZlX25vYXZsKHJhaXosIHBvbnR1YWNhb192ZWxoYSk7CiAgICAgICAgICAgIHJhaXogPSBpbnNlcmVfbm8ocmFpeiwgcG9udHVhY2FvX25vdmEsIGlkKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmFpejsKfQoKaW50IElEX01BWChObyAqcmFpeil7CiAgICBObyogYXV4ID0gcmFpejsKICAgIHdoaWxlKGF1eC0+ZXNxICE9IE5VTEwpCiAgICAgICAgYXV4ID0gYXV4LT5lc3E7CiAgICByZXR1cm4gYXV4LT5pZDsKfQoKdm9pZCBwb3NpY2FvX2NhbGMoTm8gKnJhaXosIGludCBpZCwgaW50ICpDQVQsIGludCAqZmxhZyl7CiAgICBpZihyYWl6ICE9IE5VTEwgJiYgKCpmbGFnKSAhPSAxKXsKICAgICAgICBwb3NpY2FvX2NhbGMocmFpei0+ZGlyLCBpZCwgQ0FULCBmbGFnKTsKICAgICAgICBpZihyYWl6LT5pZCA9PSBpZCl7CiAgICAgICAgICAgICgqZmxhZykgPSAxOwogICAgICAgICAgICAoKkNBVCkrKzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZigoKmZsYWcpICE9IDEpewogICAgICAgICAgICAoKkNBVCkrKzsKICAgICAgICB9CiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXotPmVzcSwgaWQsIENBVCwgZmxhZyk7CiAgICB9Cn0KCnZvaWQgcG9zaWNhbyhObyAqcmFpeil7CiAgICBpbnQgaWQgPSAwOwogICAgc2NhbmYoIiVkIiwgJmlkKTsKICAgIAogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBpbnQgcmV6XzAxLCByZXpfMDIsIGF1eF9pZCwgcG9zOwogICAgICAgIHJlel8wMSA9IHJlel8wMiA9IGF1eF9pZCA9IHBvcyA9IDA7CgogICAgICAgIGF1eF9pZCA9IElEX01BWChyYWl6KTsKCiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXosIGlkLCAmcmV6XzAxLCAmcG9zKTsKCiAgICAgICAgcG9zID0gMDsKCiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXosIGF1eF9pZCwgJnJlel8wMiwgJnBvcyk7CgogICAgICAgIGlmKHJlel8wMT5yZXpfMDIpCiAgICAgICAgICAgIHByaW50ZigiRU1QVFlcbiIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRmKCIlZFxuIiwgcmV6XzAxKTsKICAgIH0KICAgIAp9Cgp2b2lkIHRvcChObyAqcmFpeil7CiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIE5vKiBhdXggPSByYWl6OwogICAgICAgIHdoaWxlKGF1eC0+ZGlyICE9IE5VTEwpCiAgICAgICAgICAgIGF1eCA9IGF1eC0+ZGlyOwogICAgICAgIHByaW50ZigiJWRcbiIsIGF1eC0+aWQpOwogICAgfQogICAgZWxzZXsKICAgICAgICBwcmludGYoIkVNUFRZXG4iKTsKICAgIH0KfQoKdm9pZCBCT1RUT00oTm8gKnJhaXopewogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBObyogYXV4ID0gcmFpejsKICAgICAgICB3aGlsZShhdXgtPmVzcSAhPSBOVUxMKQogICAgICAgICAgICBhdXggPSBhdXgtPmVzcTsKICAgICAgICBwcmludGYoIiVkXG4iLCBhdXgtPmlkKTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgcHJpbnRmKCJFTVBUWVxuIik7CiAgICB9CiAgICAKfQoKdm9pZCBSQU5HRV9DQUxDKE5vICpyYWl6LCBpbnQgcG9udF9taW4sIGludCBwb250X21heCl7CiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIFJBTkdFX0NBTEMocmFpei0+ZGlyLCBwb250X21pbiwgcG9udF9tYXgpOwogICAgICAgIGlmKHBvbnRfbWluIDw9IHJhaXotPnBvbnR1YWNhbyAmJiByYWl6LT5wb250dWFjYW8gPD0gcG9udF9tYXgpewogICAgICAgICAgICBwcmludGYoIiVkICIsIHJhaXotPmlkKTsKICAgICAgICB9CiAgICAgICAgUkFOR0VfQ0FMQyhyYWl6LT5lc3EsIHBvbnRfbWluLCBwb250X21heCk7CiAgICB9Cn0KCnZvaWQgUkFOR0UoTm8gKnJhaXopewogICAgaW50IG1pbjsKICAgIGludCBtYXg7CiAgICBtaW4gPSBtYXggPSAwOwoKICAgIHNjYW5mKCIlZCAlZCIsICZtaW4sICZtYXgpOwogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBSQU5HRV9DQUxDKHJhaXosIG1pbiwgbWF4KTsKICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcHJpbnRmKCJFTVBUWVxuIik7Cn0KCnZvaWQgQ09VTlRfQUJPVkUoTm8gKnJhaXosIGludCBhYywgaW50KiBjb250XzB4KXsKICAgIGlmIChyYWl6ICE9IE5VTEwpCiAgICB7CiAgICAgICAgQ09VTlRfQUJPVkUocmFpei0+ZGlyLCBhYywgY29udF8weCk7CiAgICAgICAgaWYocmFpei0+cG9udHVhY2FvID4gYWMpCiAgICAgICAgICAgICgqY29udF8weCkrKzsKICAgICAgICBDT1VOVF9BQk9WRShyYWl6LT5lc3EsIGFjLCBjb250XzB4KTsKICAgIH0KfQoKdm9pZCBDT1VOVF9CRUxPVyhObyAqcmFpeiwgaW50IGFjLCBpbnQqIGNvbnRfMHgpewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBDT1VOVF9CRUxPVyhyYWl6LT5kaXIsIGFjLCBjb250XzB4KTsKICAgICAgICBpZihyYWl6LT5wb250dWFjYW8gPCBhYykKICAgICAgICAgICAgKCpjb250XzB4KSsrOwogICAgICAgIENPVU5UX0JFTE9XKHJhaXotPmVzcSwgYWMsIGNvbnRfMHgpOwogICAgfQp9CgppbnQgbWFpbigpewoKTm8gKkFCQiA9IE5VTEw7CmludCBuLCBjb250ID0gMDsKaW50IGFjID0gMDsKaW50IGNvbnRfMDIgPSAwOwpjaGFyIHJlcFsyMF07CgpzY2FuZigiJWQiLCAmbik7Cgp3aGlsZShjb250IDwgbil7CiAgICBzdHJjcHkocmVwLCIgIik7CiAgICBmZmx1c2goc3RkaW4pOwogICAgc2NhbmYoIiVzIiwgJnJlcCk7CgogICAgaWYoc3RyY21wKHJlcCwgIlJFR0lTVEVSIikgPT0gMCkKICAgICAgICBBQkIgPSByZWdpc3RyYXIoQUJCKTsgCiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJVUERBVEUiKSA9PSAwKQogICAgICAgIEFCQiA9IFVQREFURShBQkIpOyAgICAKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlBPU0lUSU9OIikgPT0gMCkKICAgICAgICBwb3NpY2FvKEFCQik7CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJSQU5HRSIpID09IDApCiAgICAgICAgUkFOR0UoQUJCKTsKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlRPUCIpID09IDApCiAgICAgICAgdG9wKEFCQik7CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJCT1RUT00iKSA9PSAwKQogICAgICAgIEJPVFRPTShBQkIpOwogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiQ09VTlRfQUJPVkUiKSA9PSAwKXsKICAgICAgICBhYyA9IGNvbnRfMDIgPSAwOwogICAgICAgIHNjYW5mKCIlZCIsICZhYyk7CiAgICAgICAgQ09VTlRfQUJPVkUoQUJCLCBhYywgJmNvbnRfMDIpOwogICAgICAgIHByaW50ZigiJWRcbiIsIGNvbnRfMDIpOwogICAgfQogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiQ09VTlRfQkVMT1ciKSA9PSAwKXsKICAgICAgICBhYyA9IGNvbnRfMDIgPSAwOwogICAgICAgIHNjYW5mKCIlZCIsICZhYyk7CiAgICAgICAgQ09VTlRfQkVMT1coQUJCLCBhYywgJmNvbnRfMDIpOwogICAgICAgIHByaW50ZigiJWRcbiIsIGNvbnRfMDIpOwogICAgfQogICAgY29udCsrOwp9CgpyZXR1cm4gMDt9