quarta-feira, 17 de julho de 2024

VIDEO 4074 - Webservice - Windev29 webdev mobile - Consumir webservice cadastro no Webdev uninfe -dll





bom dia
VIDEO 4074 - Webservice - Windev29 webdev mobile - Consumir webservice cadastro no Webdev uninfe -dll

00:00:00 Introdução
00:00:11 Vamos entrar no cadastro de cliente, e no botao busca cnpj
00:00:29 Vamos perguntar se já existe cnpj digitado
00:00:38 vamos criar as variaveis
00:01:20 vamos instanciar request e response e informar url e metodo
00:01:41 vamos informar os parametors e o tipo
00:02:13 vamos pegar o retorno 
00:02:27 vamos adicionar as informações nos campos com xmlExtractString
00:03:44 Vamos gerar deploy do projeto erp_web_matos
00:04:22 Executando o Site webdev Erp_web_matos
00:04:59 Próxima Aula 
00:05:13 Propaganda Windev Webde Mobile com Adriano boller
00:05:23 Erpmatos 
00:05:29 Representantes ErpMatos
00:05:40 Video Encerramento




=========================================

// vamos verificar se tem cnpj digitado

IF edt_cnpj_cpf<>"" THEN
// buscar cnpj pelo uninfe dll
// criar as variaveis 
s_cnpj_emitente is string = ""
s_certificado_senha is string = ""
s_cnpj_consultar is string = ""
n_cuf is int = 43 
sEDT_Url_string is string = "http://www.amarildomatos.com.br/uninfe_consulta_cadastro"
s_cnpj_consultar = edt_cnpj_cpf
// vamos instanciar request e response
oRequest is httpRequest
oResponse is httpResponse
// vamos informar a url e metodo
oRequest.URL = sEDT_Url_string 
oRequest.Method = httpPost
// vamos informar os parametros
oRequest..Header["s_recebe_cnpj"] = s_cnpj_emitente
oRequest..Header["s_recebe_senha"] = s_certificado_senha
oRequest..Header["n_recebe_CUF"] = n_cuf
oRequest..Header["s_recebe_cnpj_cadastro"] = s_cnpj_consultar
// vamos colocar tipo 
oRequest.Content = ""
oRequest.ContentType = typeMimeJSON

//vamos pegar o retorno 
oResponse = RESTSend(oRequest)
sRetorno_webservice is string = oResponse.Content
    //vamos adicionar as informações nos campos
IF edt_razao_social_nome="" THEN
edt_razao_social_nome=XMLExtractString(sRetorno_webservice,"xNome")
END
IF edt_nome_fantasia="" THEN
edt_nome_fantasia=XMLExtractString(sRetorno_webservice,"xFant")
END
IF EDT_Endereco_cep="" OR EDT_Endereco_cep=0 THEN
EDT_Endereco_cep = XMLExtractString(sRetorno_webservice,"CEP")
END
IF EDT_Endereco_rua="" THEN
EDT_Endereco_rua=XMLExtractString(sRetorno_webservice,"xLgr")
END
IF EDT_Endereco_numero="" OR EDT_Endereco_numero=0 THEN
EDT_Endereco_numero=XMLExtractString(sRetorno_webservice,"nro")
END
IF EDT_Endereco_complemento="" THEN
EDT_Endereco_complemento=XMLExtractString(sRetorno_webservice,"xCpl")
END
IF EDT_Endereco_bairro="" THEN
EDT_Endereco_bairro=XMLExtractString(sRetorno_webservice,"xBairro")
END
IF EDT_Endereco_cidade="" THEN
EDT_Endereco_cidade=XMLExtractString(sRetorno_webservice,"xMun")
END
IF EDT_Endereco_uf="" THEN
EDT_Endereco_uf=XMLExtractString(sRetorno_webservice,"UF")
END
IF EDT_Email=""
EDT_Email=XMLExtractString(sRetorno_webservice,"email")
END
IF edt_inscricao_estadual=""
edt_inscricao_estadual=XMLExtractString(sRetorno_webservice,"IE")
END
IF EDT_Endereco_cmun=0 OR EDT_Endereco_cmun="" THEN
EDT_Endereco_cmun = XMLExtractString(sRetorno_webservice,"cMun")
EDT_Endereco_pais = "BRASIL"
EDT_Endereco_cpais = "1058"
END
IF EDT_Cnae="" THEN
EDT_Cnae=XMLExtractString(sRetorno_webservice,"CNAE")
END
//EDT_Observacao_texto=XMLExtractString(sRetorno_webservice,"")
IF gnRecebe_tipo_cliente_fornecedor=2 THEN
//cliente
CBOX_Tabela_cliente=True
ELSE IF gnRecebe_tipo_cliente_fornecedor=3 
//fornecedor
CBOX_Tabela_fornecedor=True
END
END




terça-feira, 16 de julho de 2024

VIDEO 4073 - Webservice - Windev29 webdev mobile - Consumir webservice cadastro no windev uninfe -dll



bom dia
VIDEO 4073 - Webservice - Windev29 webdev mobile - Consumir webservice cadastro no windev uninfe -dll


00:00:00 Introdução
00:00:12 Criar um botao e um edt resposta 
00:00:58 Vamos criar as variaveis 
00:01:22 vamos instanciar request e response
00:01:33 vamos informar a url e metodo
00:01:47 vamos informar os parametros
00:02:16 vamos colocar tipo 
00:02:28 vamos pegar retorno 
00:02:47 vamos testar 
00:03:06 Próxima Aula 
00:03:10 Propaganda Windev Webde Mobile com Adriano boller
00:03:18 Erpmatos 
00:03:27 Representantes ErpMatos
00:04:38 Video Encerramento





// criar as variaveis 
s_cnpj_emitente is string = ""
s_certificado_senha is string = ""
s_cnpj_consultar is string = ""
n_cuf is int = 43 
sEDT_Url_string is string = "http://www.dominio.com.br/uninfe_consulta_cadastro"
s_cnpj_emitente = "019"
s_certificado_senha = "19"
s_cnpj_consultar = "893"
// vamos instanciar request e response
oRequest is httpRequest
oResponse is httpResponse
// vamos informar a url e metodo
oRequest.URL = sEDT_Url_string 
oRequest.Method = httpPost
// vamos informar os parametros
oRequest..Header["s_recebe_cnpj"] = s_cnpj_emitente
oRequest..Header["s_recebe_senha"] = s_certificado_senha
oRequest..Header["n_recebe_CUF"] = n_cuf
oRequest..Header["s_recebe_cnpj_cadastro"] = s_cnpj_consultar
// vamos colocar tipo 
oRequest.Content = ""
oRequest.ContentType = typeMimeJSON
//vamos pegar o retorno 
oResponse = RESTSend(oRequest)
sRetorno_webservice is string = oResponse.Content
edt_Resposta = sRetorno_webservice


VIDEO 4072 - Webservice - Windev29 webdev mobile - Criar Webservice Rest Cadastro Contribuinte Uninfe Dll





bom dia
VIDEO 4072 - Webservice - Windev29 webdev mobile - Criar Webservice Rest Cadastro Contribuinte Uninfe Dll


00:00:00 Introdução
00:00:15 Explicando o que será feito 
00:00:32 Criando Rest com botao direito 
00:00:41 Criando Rest - nome do Rest 
00:00:51 Criar Point
00:01:02 Associando a procedure
00:01:29 Identificado o metodo como Post
00:01:45 Definir o nome do metodo
00:02:00 Definindo Request formato e Response
00:02:20 Mostrando Metodo
00:02:23 Gerando Webservice para o servidor 
00:03:07 Mostrando servico webservice 
00:03:19 Próxima Aula 
00:03:24 Propaganda Windev Webde Mobile com Adriano boller
00:03:32 Erpmatos 
00:03:41 Representantes ErpMatos
00:04:52 Video Encerramento





// PROCEDURE uninfe_consulta_cadastro()

s_auditoria is string = ""
retorno_xml is string = ""
s_recebe_cnpj is string = WebserviceReadHTTPHeader("s_recebe_cnpj") // cnpj do emitente-> certificado
s_recebe_senha is string = WebserviceReadHTTPHeader("s_recebe_senha") // senha certificado
n_recebe_CUF is int = WebserviceReadHTTPHeader("n_recebe_CUF") // 43 - res
s_recebe_cnpj_cadastro  is string = WebserviceReadHTTPHeader("s_recebe_cnpj_cadastro")

s_arquivo_certificado is string = fCurrentDir()+"\erpmatos\"+s_recebe_cnpj+".pfx"
s_diretorio is string = fCurrentDir()+"\erpmatos\xml_"+s_recebe_cnpj+"\retorno"
IF fMakeDir(s_diretorio)=False THEN
END

s_diretorio_log is string=fCurrentDir()+"\erpmatos\xml_"+s_recebe_cnpj+"\retorno"
IF fMakeDir(s_diretorio_log)=False THEN
END

s_auditoria+="Versao 27.03.15.31"
s_auditoria+=CR+"s_recebe_cnpj["+s_recebe_cnpj+"]"
//s_auditoria+=CR+"s_recebe_senha["+s_recebe_senha+"]"
s_auditoria+=CR+"n_recebe_CUF["+n_recebe_CUF+"]"
s_auditoria+=CR+"s_recebe_cnpj_cadastro["+s_recebe_cnpj_cadastro+"]"
s_auditoria+=CR+"s_arquivo_certificado["+s_arquivo_certificado+"]"
s_auditoria+=CR+"s_diretorio["+s_diretorio+"]"
s_auditoria+=CR+"s_diretorio_log["+s_diretorio_log+"]"

//Revisar acima 
//https://www.youtube.com/live/qUosXijsuPw?si=plDq6F3j8mz9yfgI //comeca 27.32 

// configurações minimas 
o_configuracao is Unimake.Business.DFe.Servicos.Configuracao
o_configuracao.TipoDFe = TipoDFe.NFe //1 // nfe
o_configuracao.CertificadoArquivo = s_arquivo_certificado
o_configuracao.CertificadoSenha = s_recebe_senha

//criar o xml
oConsCad is Unimake.Business.DFe.XML.NFe.ConsCad()
oConsCad.VERSAO = "2.00"

oInfCons is Unimake.Business.DFe.XML.NFe.InfCons()
oInfCons.CNPJ=s_recebe_cnpj_cadastro
oInfCons.uf=UFBrasil.RS // cuf=43 direto //perguntar

oConsCad.InfCons=oInfCons

WHEN EXCEPTION IN
// vamos consumir o servico // Criado um objeto oconsultacadastro
oConsultaCadastro is Unimake.Business.DFe.Servicos.NFe.ConsultaCadastro() 
    
    // vamos chamar ele, passando o xml e a configuração
  oConsultaCadastro.Executar(oConsCad,o_configuracao)
oRetConsCad is Unimake.Business.DFe.XML.NFe.RetConsCad <- oConsultaCadastro.Result
    cstat is string=oRetConsCad.InfCons.CStat
    xmotivo is string=oRetConsCad.InfCons.XMotivo
razao_social is string=oRetConsCad.InfCons.InfCad.XNome
retorno_xml = oConsultaCadastro.RetornoWSString 
DO
retorno_xml="ERRO:"+ExceptionInfo(errFullDetails)
END

// vamos gravar auditoria no servidor
s_auditoria+=CR+retorno_xml+CR
fSaveText(s_diretorio_log+"\cadastro_log.txt",s_auditoria)
fSaveText(s_diretorio+"\cadastro_retorno.xml",retorno_xml)


RESULT retorno_xml


segunda-feira, 6 de maio de 2024

Video 4060 - windev webdev Mobile - Stc Vertical





// youtube : Amarildo Matos - Programador dos pampas


// 06 05 2024
fonte is Font 
fonte..Name="ARIAL"
fonte..Size=13
fonte..Orientation=90
STC_titulo..Font=fonte 
STC_titulo..Width=177
STC_titulo..Height=150









terça-feira, 26 de março de 2024

Video 4044 - windev webdev Mobile - Validar Cpf

Video 4044 - windev webdev Mobile - Validar Cpf

Repositorio





Video 4044 - windev webdev Mobile - Validar Cpf

00:00:00 Introducao
00:00:07 no Windev criar window para pedir o cpf 
00:00:22 Criando a procedure e codigo valida cpf 
00:02:39 Voltando a window digita cpf e chamar a procedure 
00:03:48 Executando e testando cpf 
00:04:02 fazer cpf dentro do windev mobile 
00:05:35 fazer cpf dentro do webdev 
00:07:02 Propaganda wxsolucoes
00:07:24 Progranda Erpmatos 
00:07:33 Representantes erpmatos 
00:07:36 Video encerramento 

=======================================================

validar_cpf(pCpf is string)

_CPF is string
_Peso is 2-byte unsigned int
_Resto is 1-byte int
_Digito is 1-byte int

FOR i=1 _TO_ Length(pCpf)
IF 47 < Asc(pCpf[[i]]) < 58 THEN 
_CPF+=pCpf[[i]]
END
END

IF Length(_CPF) <> 11 THEN RESULT False

FOR i=1 TO 10
_Peso = _Peso + (Asc(_CPF[[1 TO 10]][[i]]) -48)  * (10-i+2)
END

_Resto = modulo(_Peso,11)
IF _Resto < 2 THEN 
_Digito = 0 
ELSE 
_Digito = 11 - _Resto
END

IF Val(_CPF[[11]]) <> _Digito THEN
RESULT False 
ELSE 
RESULT True
END

====================================

terça-feira, 19 de março de 2024

Video 4039 - windev webdev Mobile - novidade 2024 - Alinhamento

00:00:00 Introducao 
00:00:08 Mostrando alinhamento windev 
00:01:18 Mostrando alinhamento webdev  
00:01:51 Mostrando alinhamento Windev mobile 
00:02:21 Propaganda wxsolucoes
00:02:29 Progranda Erpmatos 
00:02:38 Representantes erpmatos 
00:02:41 Video encerramento 


segunda-feira, 18 de março de 2024

Video 4038 - windev webdev Mobile - novidade 2024 - Token

00:00:00 Introducao 
00:00:09 Mostrando o que sera feito 
00:00:24 Criando o botao token 
00:00:36 Escolhendo o tipo de botao token 
00:00:39 Marcando para multiplos escolhas
00:00:50 Marcando para poder mudar de posicao 
00:00:59 Vamos testar 
00:01:25 Propaganda wxsolucoes
00:01:33 Progranda Erpmatos 
00:01:41 Representantes erpmatos 
00:01:45 Video encerramento 



domingo, 17 de março de 2024

segunda-feira, 18 de setembro de 2023

DICA 3909 - Tabela Como imprimir table - Windev-Webdev-Mobile



bom dia

DICA 3909 - Tabela Como imprimir table - Windev-Webdev-Mobile

Indice..

00:00:00 Apresentação
00:00:29 Criando botao 
00:00:39 Colocando codigo tableprint
00:00:50 Testando relatorio
00:01:20 Criando segunda opcao relatorio table
00:01:53 Mostrando Relatorio Gerado
00:02:07 Mostrando Repositorio Windev

Blog

Repositorio Windev

Video Youtube















sexta-feira, 7 de julho de 2023

DICA 3897 - Array e Struture - Como Criar - windev 28 - curso array 28



Video Youtube





Repositorio 


============================

Vamos Criar uma estrutura dados com nome e cidade
Vamos crir um array em cima da estrutura 
Vamos criar dois edt 
Vamos criar um botao onde vamos adicionar os dados no array 
vamos criar outro botao onde vamos ler todos os array e colocar em uma tabela 


============================


------------------ INDICE DO CURSO DE ARRAY e ESTRUTURA


WinDev - Array - 001/... Adiciona/Classifica Ordem/Mostra
WinDev - Array - 002/... Quantas Ocorrencias Array
WinDev - Array - 003/... ArrayDeleteLine - Eliminha uma Linha do Array
WinDev - Array - 004/... ArrayToString - Leva Array Para String
WinDev - Array - 005/... Seek - Procura Por Valor
WinDev - Array - 006/... ArrayDeleteDuplicate - Elimina itens duplos
WinDev - Array - 007/... Delete - Elimina Uma Linha
WinDev - Array - 008/... DeleteAll - Limpa Array
WinDev - Array - 009/... SwapLine - Mover de Lugar
WinDev - Array - 010/... Sum - Somar Array
ARRAYREVERSE - ARRAY - 011/ ... AULA 1185 
ARRAY INICIO - ARRAY 012 / AULA 1229

----------------------------------------------------









quinta-feira, 25 de maio de 2023

Dica 3889 - CommandLine - Linha comando para Programa - Windev 28 - Comandos 96




Dica 3889 - CommandLine - Linha comando para Programa - Windev 28 - Comandos 96

Video Youtube






Link Help


Repositorio do Exemplo





================

GLOBAL
RECEBER_CODIGO is string=CommandLine(1)
RECEBER_NOME is string=CommandLine(2)








-------------------------------INDICES COMANDOS

DICAS 1979 - WINDEV - COMANDOS 29 sidebar control Barra Lateral
DICAS 2147 WINDEV WEBDEV MOBILE COMANDOS 63 MAIS 1 PARAMETRO RETORNO JANELA
DICAS 2148 WINDEV WEBDEV MOBILE COMANDOS 64 The Splitter control
DICAS 2156 WINDEV WEBDEV MOBILE COMANDOS 65 HourGlass Lupa Ampuleta
DICAS 2157 WINDEV WEBDEV MOBILE COMANDOS 66 CEP
DICAS 2168 WINDEV WEBDEV MOBILE WEBSERVICE COMANDOS 67 SysListScreen
DICAS 2196 WINDEV WEBDEV MOBILE COMANDOS 68 eDT TOKEN
DICAS 2198 WINDEV WEBDEV MOBILE COMANDOS 69 eDT TOKEN PROGRAMACAO
DICAS 2213 WINDEV WEBDEV MOBILE COMANDOS 70 LEAPYEAR ANO BISSEXTO
DICAS 2215 WINDEV WEBDEV MOBILE 24 NOVIDADES 18 COMANDOS 71 BCToImage -GERAR IMAGEN CODIGO DE BARRA
DICAS 2229 WINDEV WEBDEV MOBILE 24 NOVIDADES 28 COMANDOS 72 PLANOS NOME
DICAS 2230 WINDEV WEBDEV MOBILE 24 NOVIDADES 29 COMANDOS 73 CONDICOES DEBUG
DICAS 2237 WINDEV WEBDEV MOBILE 24 NOVIDADES 33 COMANDOS 76 MININIZAR Iconize
DICAS 2240 WINDEV WEBDEV MOBILE 24 novidades 34 Comandos 77 Maximize
DICAS 2256 WINDEV WEBDEV MOBILE 24 Novidades 45 Comandos 78 Manual Fonte
DICAS 2257 WINDEV WEBDEV MOBILE 24 Novidades 46 Comandos 79 Help Como Fazer
DICAS 2258 WINDEV WEBDEV MOBILE 24 Novidades 47 Comandos 80 TraceDeleteAll
DICAS 2260 WINDEV WEBDEV MOBILE 24 Novidades 49 Comandos 82 Edit AddAssi...
DICAS 2272 WINDEV WEBDEV MOBILE COMANDOS 82 ExeListProcess
DICAS 2273 WINDEV WEBDEV MOBILE COMANDOS 83 DLL LINKADAS PROCESSOS AddChildDelayed
dica 2631 extrair conteudo com Middle

======================

sexta-feira, 19 de maio de 2023

Dica 3887 - Selecionar Impressoras - iListPrinter - Windev 28 - Relatorios 79





Video Youtube





Help

Blog

Playlist Somente sobre Relatorios

Repositorio Exemplo











=============== INDICE CURSO DE RELATORIOS

Blog - WinDev - Relatorio - 001/... Configura e Filtro
Blog - WinDev - Relatorio - 002/... IParameterReport
Blog - WinDev - Relatório - 003/... Marca D´Agua
Blog - WinDev - Relatorio - 004/... Layout 
Blog - WinDev - Relatorio - 005/... Campo Vertical - Angle 
Blog - WinDev - Relatorio - 006/... Como fazer quando sai duas paginas? 
Blog - WinDev - Relatorio - 007/... Imprimir Linha Multi Line
Blog - WinDev - Relatorio - 008/... Relatorio Valor Zero deixar Branco
Blog - WinDev - Relatorio - 009/... Relatorio Alinhar Texto 
Blog - WinDev - Relatorio - 010/... Colocar Totalizador
Blog - WinDev - Relatorio - 011/... Imprime Somente os Selecionados ou Todos da Tabela 
Blog - WinDev - Relatorio - 012/... Break e totalizadores de valores
Blog - WinDev - Relatorio - 013/... Retorno de Relatorio - Result 
Blog - WinDev - Relatorio - 014/... Zerar Totalizador  
Blog - WinDev - Relatorio - 015/... Relatorio - Totalmente Manual
Blog - WinDev - Relatorio - 016/... Linha Zebrada
Blog - WinDev - Relatorio - 017/... Posicoes do Relatorio Alterar
Blog - WinDev - Relatorio - 018/... Alterar Fonte
Blog - WinDev - Relatorio - 019/... Linha Acrescentar
Blog - WinDev - Relatorio - 020/... Relatorio - Gerar Pdf
Blog - WinDev - Relatorio - 021/... Filtro
Blog - WinDev - Relatorio - 022/... Pagina Inicial/Final - Data Hora
Blog - WinDev - Relatorio - 023/... Pular Página Break - IpageEnd()
Blog - WinDev - Relatorio - 024/... Imprimir Tabela com TablePrint
Blog - WinDev - Relatorio - 025/... Relatorio Mudar Orientação
Blog - WinDev - Relatorio - 026/... Mostrar impressoras/Selecionar e Imprimir
Blog - WinDev - Relatorio - 027/... IDestination - Destino do Relatorio
Blog - WinDev - Relatorio - 028/... Iprint - Relatorio Manual
Blog - WinDev - Relatorio - 029/... Dica Tabela e print
Blog - WinDev - Relatorio - 030/... Totalizadores
Blog - WinDev - Relatorio - 031/... Caption Mudar
Blog - WinDev - Relatorio - 032/... Intervalo Bancos
Blog - WinDev - Relatorio - 033/... Manual Linha - IHLine
Blog - WinDev - Relatorio - 034/... Borda - Iborder
Blog - WinDev - Relatorio - 035/... IPageNum
Blog - WinDev - Relatorio - 036/... Numero Com Espaco
Blog - WinDev - Relatorio - 037/... Fonte Seleciona - ISelectFont -
Blog - WinDev - Relatorio - 038/... Linha Mais de 2 - Mais informacoes no Campo
Blog - WinDev - Relatorio - 039/... Copias - IParameter - Icopies
Blog - WinDev - Relatorio - 040/... Pdf - Ler e Extrair Texto
Blog - WinDev - Relatorio - 041/... Imprimir Numero 000.001.500
Blog - WinDev - Relatorio - 042/... IListPrinter - Mostra Impressoras e Lista
Relatorio Inventario com Query - Relatorio 043/...
Relatorio - Sem Template - Dica Pedrosão - Relatorio - 044
Titulo Cabecalho - Alterar - WinDev - Relatorio - 045
Totais - Colocar Totais Abaixo ultima Linha Detalhe - WinDev - Relatorio - 046
Relatorio String Angulo 90% - WinDev - Relatorio - 047/...
Links Pagina e Email no Relatorio - WinDev - Relatorio - 048
PREVIEW TRADUZIR - WINDEV - RELATORIO - 049 - AULA 1211
TABELA E RELATORIO - COMO FAZER - RELATORIO 050 - AULA 1223
MANUAL - RELATORIO TOTALMENTE MANUAL - WINDEV RELATORIO 051 - AULA 1224
MEMORIA RELATORIO - AULA 1257 relatorio 052 tabela memoria
TOTAL BREAK - DICAS 1711 - PUBLICA - WINDEV RELATORIO 053 
GERAR PDF - DICAS 1889 - PUBLICA - WINDEV_23 - RELATORIO 54 - 
DICA 2150 - HANGOUT AO VIVO 10 06 2019 AS 19:00 - MOSTRAR CONSULTORIA COm joao sobre relatorios de como criar
DICAS 2151 WINDEV WEBDEV MOBILE RELATORIOS 59 CONSULTORIA JOAO 08062019
DICAS 2152 WINDEV WEBDEV MOBILE RELATORIOS 60 TOTAL RELATORIO
DICAS 2193 WINDEV WEBDEV MOBILE RELATORIO 61 IPREVIEW iMiniPreview
DICAS 2597 - WINDEV WEBDEV MOBILE - Relatorio 62 - Como eu Fiz Danf no Windev.
AO VIVO FACEBOOK - 2882 20:00 - 06/05/2020 - RELATORIOS COM TABELAS WINDEV
2885 RELATORIO SQL WINDEV TRASMITIDO FACEBOOK ERPAMARILDO
DICA 2912 PREVIEW PORTUGUES WINDEV

=============== INDICE CURSO DE RELATORIOS









Teste

Teste
teste