Análise de Impacto de Mudanças de Software – Preparação dos Dados Universidade Federal de Campina Grande Departamento de Sistemas e Computação Disciplina: Mineração de Dados Professor: Marcus Sampaio Aluno: Fernando Cardoso Para proceder à execução dos algoritmos de descoberta de regras de associação nos logs de CVS fornecidos e descobrir os acoplamentos de mudanças nas classes que compões o software que se quer analisar, é necessário proceder a uma série de passos de preparação dos dados, uma vez que os mesmos não estão apresentados de maneira correta, além de apresentarem uma série de informações que devem ser desconsideradas. O primeiro destes passos é filtrar do log do CVS os arquivos que não dizem respeito ao software. Por este ter sido escrito na linguagem de programação Java, é sabido que os códigos fontes de suas classes (a palavra classe, neste documento, se refere às classes às interfaces Java) apresentam a extensão de arquivo “.java”. Desta maneira, todos os arquivos que não apresentavam tal extensão foram desconsiderado da análise de associações. Tendo restado apenas as informações referentes aos commits efetuados nos arquivos de código fonte das classes ou, simplesmente, arquivos que compõem o software, foi necessário agregar os commits de modo a decidir quais arquivos sofreram commits que satisfazem as seguintes condições: (i) efetuados pelo mesmo autor, (ii) com o mesmo comentário sobre as razões do conjunto de commits e (iii) dentro de uma mesma janela de tempo. Segundo Zimmermann e Weißgerber, os melhores resultados da mineração de dados em repositórios CVS são obtidos utilizando uma janela de tempo deslizante, de tamanho de 200 segundos [ZW04]. O passo seguinte da preparação dos dados foi a limpeza dos mesmos, para retirar as informações consideradas como sujeira. Foram desconsideradas todas as classes que apenas sofreram um commit no CVS, uma vez que se esta classe não sofreu alterações, ela não está acoplada a nenhuma outra; desta forma, obteve-se uma significativa redução dos dados a minerar. Os grupos de commits que envolvem muitos arquivos (mais de 20) também foram descartadas por serem, geralmente, correspondentes a mudanças infra-estruturais no software e não a mudanças devidas à evolução do mesmo. Após este processo, os grupos de commits vazios foram retirados do conjunto de dados, para não interferir no cômputo dos valores de suporte dos itemsets encontrados. Por fim, uma vez que os algoritmos, para serem executados pela plataforma Weka, exigem que os dados estejam no formato ARFF [WF05], foi montado um arquivo nestes moldes, no qual cada atributo corresponde a uma classe do software analisado, e cada linha representa um conjunto de commits efetuados pelo mesmo autor, com o mesmo comentário, e dentro de uma mesma janela de tempo (vide arquivo em anexo). As classes que não fazem parte de um commit têm seu valor indefinido (?) uma vez que o algoritmo Apriori gera regras do tipo “Se a classe_A não estiver no commit, então a classe_B também não está”, enquanto o interesse é por regras positivas, tanto no antecedente quanto no conseqüente da regra. REFERÊNCIAS BIBLIOGRÁFICAS [WF05] Ian H. Witten and Eibe Frank (2005) "Data Mining: Practical machine learning tools and techniques", 2nd Edition, Morgan Kaufmann, San Francisco, 2005. [ZW04] T. Zimmerman and P. Weißgerber (2004) " Preprocessing CVS data for fine-grained analysis ", Proc. International Workshop on Mining Software Repositories (MSR 2004) 2004. Anexo I – Arquivo ARFF referente ao log do CVS @relation changelog @attribute design_wizard/design_wizard/resources/test_aplications/AttibuteRedefined/SubClass.java {y,n} @attribute design_wizard/design_wizard/resources/test_aplications/Patterns/SingletonBadConstructor/Single tonBadConstructor.java {y,n} @attribute design_wizard/design_wizard/resources/test_aplications/Patterns/SingletonWrong1/SingletonBadCo nstructor.java {y,n} @attribute design_wizard/design_wizard/src/SubClass.java {y,n} @attribute design_wizard/design_wizard/src/SuperClass.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/common/Config.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/comparator/CalculateDiffAction.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/comparator/DesignDiff.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/comparator/SimpleCalculateDiffAction.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/AbstractEntity.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/ClassNode.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/Design.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/DesignIF.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/Entity.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/FieldNode.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/MethodNode.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/Modifier.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/AbstractEntity.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/ClassBL.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/ClassNode.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/Entity.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/FieldBL.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/FieldNode.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/MethodBL.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/MethodNode.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/factory/ElementsFactory.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/test/ClassNodeTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/test/FieldNodeTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/test/GetConstructorsTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/test/ReturnTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/test/ThrowsTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/test/VisibilityTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/ui/Class.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/ui/Field.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/entity/ui/Method.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/factory/ElementsFactory.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/manager/DesignManager.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/manager/test/DesignManagerTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/manager/util/TranslatorUtil.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/relation/Relation.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/relation/test/RelationTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/test/ClassNodeTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/test/FieldNodeTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/test/InheritanceTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/test/MethodNodeTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/test/ReturnTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/design/test/VisibilityTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/main/DesignWizard.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/main/ResultOfImpact.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/main/test/DesignWizardTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/main/util/FileUtil.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/patternchecker/CheckError.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/patternchecker/CheckWarning.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/patternchecker/CheckingResult.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/patternchecker/SingletonPatternChecker.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/patternchecker/test/SingletonPatternCheckerTest.j ava {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/AllTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/DescriptionTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/EARTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/ImpactTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/TraceForMethods.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/AllClassesInSuiteTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/CatchBlockTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/CatchedExceptionsTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/DesignWizardTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/EJBTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/ImpactTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/RedBarTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/UseFieldTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/design/WarningTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/impact/DescriptionTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/impact/EARFilesTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/impact/ImpactTest.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/test/impact/TraceForMethods.java {y,n} @attribute design_wizard/design_wizard/src/designwizard/testcases/InheritanceTest.java {y,n} @data ?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,y,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,y,y,?,y,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?,?,?,y,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,y,y,?,y,?,?,y,?,?,?,?,?,?,y,y,y,?,y,y,y,?,?,?,y,?,?,?,?,?,?, ?,?,y,?,?,?,?,?,?,y,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,y,?,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,y,y,?,?,y,?,y,?,?,?,?,?,?,?,?,y,?,?,?,y,?,?,y,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,y,?,y,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,y,?,?,?,?,?,?, y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,y,y,?,y,?,?,?,?,?,?,?,?,y,y,y,?,y,?,?,?,?,?,?,?,?,?,?, ?,y,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?, y,y,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,y,y,y,y,y,y,y,y,y,?,?,?,?,?,?,y,y,y,?,y,?,?,?,y,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? y,?,?,?,?,?,y,?,?,?,?,y,y,?,?,?,?,y,?,y,y,?,y,?,y,y,?,y,?,?,?,?,?,?,y,?,y,?,?,y,y,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,y,?,y,y,?,y,?,?,?,y,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,y,?,?,y,?,?,?,y,y,?,?,y,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,y,?,y,y,?,?,?,?,?,?,?,?,?,y,?,y,y,? ?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,?,?,y,?,?,y,?,?,?,y,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,y,?,y,?,?,?,?,?,?,y,y,?,?,?,?,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,y,?,?,?,?,y,?,y,?,?,y,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,y,y,y,?,?,?,y,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,? ?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?, ?,?,?,y,?,?,?,?,?,y,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,?,?,y,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,y,?,?,?,y,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,y,?,?,?,?,?,?,?,?,?,? y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,y,y, y,?,y,y,?,?,?,?,?,?,?,?,?,?,y,y,y,y,?,?,y,y,y,y,?,y,y,? ?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,y,?,?,?,?,?,y,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,y,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,y,?,?,?,?,y,?,?,y,y,?,?,?,?,y,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,y,y,?,?,y,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,y,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,y,?,y,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,y, y,?,y,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,y,y,?,y,?,?, ?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,y,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,? ?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,y,y,?,?,?,?,y,y,?,?,y,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,y,?,?,y,y,?,?,?,?, ?,?,?,?,?,?,?,y,?,y,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,y,?,?,?,?,y,y,?,y,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,y,?,?,y,y,y,?,?,?, ?,?,y,?,?,?,y,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?, ?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,? y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? y,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,y,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,y,?,?,?, ?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y ?,?,?,?,?,y,?,?,?,?,y,y,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,y,?,y,?,y,y,?,?, ?,?,y,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,y,?,y,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,? ?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,y,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,y,?,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,?,?, ?,?,y,?,y,y,y,y,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,y,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,?,?,?,?,?, y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,y,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,y,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,y,?,?,?,y,?,?,?,?,?, ?,?,y,?,?,?,?,?,?,y,?,?,?,?,y,?,?,y,?,?,?,?,?,?,?,?,?,?