diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..549e00a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..c1dd12f
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..b7cb93e
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
diff --git a/README.md b/README.md
index adb0deb..1d305ba 100644
--- a/README.md
+++ b/README.md
@@ -1,154 +1,85 @@
-# Desafío 3: Complemento valores UF
+# DESAFIO 3
-El desafío consiste en lo siguiente:
- - Existe la siguiente librería en el directorio "lib\Generador_Datos_Desafio_Tres-1.0.0.jar" que se encuentra en este proyecto. Este debe ser integrado en la solución.
- - Este jar contiene 2 class que debe ser utilizadas para resolver el desafío
- - La clase com.previred.desafio.tres.uf.Valores con el método getRango, este retorna una estructura con un rango de fechas y un listado de valores de UF
- - El método getRango retorna el objeto UFs, este contiene fecha de inicio, fecha de fin del rango, ademas contiene un set de UF que tiene como atributos de: valor de UF y la fecha de la UF
- - La lista de UF están dentro del rango de fechas (inicio y fin)
- - La cantidad de valores para uf son máximo 100
- - El listado entregado con los valores UF no son secuenciales (contiene laguna de valores) y no se encuentra ordenado
- - La clase com.previred.desafio.tres.uf.DatosUf este es un singleton que contiene 2 métodos
- - El método getUf retorna el valor UF para una fecha
- - El método getUfs retorna una lista de valores de UF para un rango dado
+La siguiente app permite consumir una libreria de previred, obtener las uf
+## Descripcion de la implementación:
-1. Consumir la función getRango de la clase com.previred.desafio.tres.uf.Valores
-2. Escribir un algoritmo para complementar los valores de UF para las fechas faltantes en la lista contenidas en la clase Ufs que retorna getRango
-3. Para complementar los valores de UF se pueden utilizar los métodos getUf y getUfs de la clase com.previred.desafio.tres.uf.DatosUf.
-4. La lista de salida debe esta ordenada de forma descendente.
-5. Para la implementación debe elegir uno de los siguientes formatos de salida.
+Se realiza en base al requerimiento un aplicativo que permite consumir la libreria jar de previred, en el cual por medio de el metodo getRange(), se obtienen valores de uf y la fecha a la que pertenece, estos valores vienen desordenados y no secuenciales hay lagunas muchas veces entre ellos, en base al requerimiento entregado se entiende que en base al rango entregado hay que completar la secuencia hasta obtener todos los valores comprendidos en ese rango, lo que se hace es por medio del metodo getUfs, se obtienen todos los valores, luego se valida que los encontrados previamente existan en la lista obtenida por rango luego se ordena de manera descendente y finalmente se exporta a un archivo con nombre valores.json que se encuentra en la carpeta files, la libreria esta en la carpeta lib y el detalle de la jerarquia y estructura de carpetas se detalla a continuacion, se agrega logger para ver el trace del aplicativo. se documenta el codigo, se agregan pruebas unitarias y se realiza un scan con sonarlint para asegurar la calidad de codigo.
-### Formato 1
-
-Crear un archivo CSV con todos los datos calculados, las columnas deben contemplar el siguiente formato:
- - La primera columna representa el tipo, tipo 1 cabecera y tipo 2 es detalle de las UFs
- - Para las filas de tipo 1 el formato es fecha de inicio y fecha de fin
- - Para las filas de tipo 2 el formato es fecha uf y valor uf
+## Tecnologia utilizada:
+ - Springboot
+ - Java 1.8
+ - Libreria Gson version 2.9.0 (para la gestion de json)
+ - Libreria commons-collections y commons-beansutils ( para el ordenamiento)
+ - Libreria lof4j-springboot (para todo el registro, seguimiento)
+ - Libreria springboot configuration-processor para los configurationProperties.
+ - Libreria mockito y powermock-module (este incorpora alguno assert parael control de excepciones)
+ - Maven para la gestion de repositorio.
+ - Libreria jar proporcionada por previred para el desafio(Generador_Datos_Desafio_Tres-1.0.0.jar)
- *Ejemplo*
+## Pruebas unitarias y calidad de codigo:
+ - Se realizan pruebas unitarias, y ejecucion de analisis para verificar cobertura, se cumple con los standares minimos de un 90% de cobertura del proyecto, se adjunta evidencia en carpeta /evidencia con el detalle de cobrtura.
+ - Se realiza analisis con Plugin SonarLint, para reducir deuda tecnica. y cumplir con los standares minimos.
+
+## Comenzando 🚀
+La jerarquía de carpetas del proyecto es de la siguiente manera.
```
-1; 2014-04-01; 2015-03-05
-2; 2014-01-04; 23.321,57
-2; 2014-01-05; 23.324,58
-2; 2014-01-06; 23.327,58
-2; 2014-01-07; 23.330,58
-2; 2014-01-08; 23.333,59
-2; 2014-01-09; 23.336,59
- :
-2; 2014-04-01; 23.610,77
+src/main/java
+ cl.zco.desafio3 -> lanzador, configuraciones, proveedor de contexto
+ cl.zco.desafio3.dto -> los dto que se utilizaran para la generacion con la estructura deseada
+ cl.zco.desafio3.negocio -> Definicion logica del requerimiento
+ cl.zco.desafio3.util-> las utilidades que se crearon para que el codigo estuviera limpio y fuera mantenible
+src/test/java
+ cl.zco.desafio3 -> prueba unitaria lanzador
+ cl.zco.desafio3.negocio -> pruebas unitarias negocio
+ cl.zco.desafio3.util -> pruebas unitarias de las utilidades
+lib/
+ Generador_Datos_Desafio_Tres-1.0.0.jar
+doc/
+ javadoc > index.html
+resumen/cobertura
+ index.html > aqui esta el detalle y resultado de junit + coverage
+files/
+ valores.json (archivo con la salida en json)
+evidencia/
+ imagen1 -> evidencia de cobertura junit
+ imagen2, imagen3 y imagen4 -> ejecucion desde IDE
+ imagen5, imagen6 y imagen7 -> ejecucion desde CMD
+ mvn_install.log -> log de maven install build success
+ valores.json -> archivo generado
+jar/
+ desafio3-0.0.1-SNAPSHOT.jar ->ultimo jar compilado con todas las librerias
```
-### Formato 2
-Crear un archivo XML que contenga el siguiente formato:
- - Debe contener un tag general llamado valores
- - Dentro de tag valores se deben crear los tag inicio, fin y UFs
- - El tag inicio debe contener la fecha de inicio recibida
- - El tag fin debe contener la fecha de fin recibida
- - El tag UFs debe contener un lista de tag UF con el siguiente formato
- - El tag UF debe contener el tag fecha con la fecha inicial y el tag dato con el valor de la UF
+## Pre-requisitos. 📋
-*Ejemplo*
+Java 1.8
+Maven configurado
-```xml
-
-
- 2014-04-01
- 2015-03-05
-
-
- 2014-01-04
- 23.321,57
-
-
- 2014-01-05
- 23.324,58
-
-
- 2014-01-06
- 23.327,58
-
-
- 2014-01-07
- 23.330,58
-
-
- 2014-01-08
- 23.333,59
-
-
- 2014-01-09
- 23.336,59
-
+## Configuraciones para arrancar: 📦
+En el problema si indicaba que solo mostraba 100 valores de UF, como la salida es mas extensa se crea una propiedad en el fichero desafio3.properties donde se puede colocar la cantidad maxima de UF de la lista en el json de salida, si se quiere cambiar simplemente se debe modificar el property, si se deja en valor 0 (cero) se mostrará todos los valores de UF dentro del rango.
- :
-
-
- 2014-04-01
- 23.610,77
-
-
-
-```
+Los datos entregados para desplegar la aplicación son:
-### Formato 3
-Crear un archivo JSON que contenga el siguiente formato:
- - Debe contener la fecha de inicio “inicio”
- - Debe contener la fecha de fin “fin”
- - La lista de valores de “UFs” con los valores de fecha de uf “fecha” y valor de la uf “dato”
+### Arrancar directamente desde el jar:
+1. Ir a la consola (CMD)
+2. Ir a la ruta donde esta el jar
+3. Escribir esta sentencia-> java -jar desafio3-0.0.1-SNAPSHOT.jar
+4. Aparecerá mensaje dando la bienvenida, indicando que es necesario tener una carpeta en C:\files\ porque en esa ubicacion se guardara el archivo 'valores.json'
+5. Al terminar mostrará un mensaje indicando que el proceso a finalizado.
-*Ejemplo*
+### Arranchar desde el ambiente de desarrollo (eclipse > SpringToolSuite4)
+1. Sincronizar repositorio
+2. Realizar un maven install
+3. Ir a la clase 'Desafio3Application.java' boton derecho > Run As > Spring Boot App
+4. Aparecerá mensaje dando la bienvenida, indicando que se creará el archivo json en la carpeta /files dentro del workspacecon el nombre solicitado 'valores.json'
+5. Al terminar mostrará un mensaje indicando que el proceso a finalizado.
-```json
-{
- "inicio":"2014-04-01",
- "fin":"2015-03-05",
- "UFs":[
- {
- "fecha":"2014-01-04",
- "dato":"23.321,57"
- },
- {
- "fecha":"2014-01-05",
- "dato":"23.324,58"
- },
- {
- "fecha":"2014-01-06",
- "dato":"23.327,58"
- },
- {
- "fecha":"2014-01-07",
- "dato":"23.330,58"
- },
- {
- "fecha":"2014-01-08",
- "dato":"23.333,59"
- },
- {
- "fecha":"2014-01-09",
- "dato":"23.336,59"
- },
+## Autor ✒️
+**Patricio Angel Astorga Toledo** - *Ingeniería informática* - [mail] pastorgatoledo@gmail.com
- :
+---
- {
- "fecha":"2014-04-01",
- "dato":"23.610,77"
- }
- ]
-}
-```
-
- - Se deben implementar las soluciones en Java (con maven, gradle u otro).
- - La solución debe ser enviada vía un pull request a este repositorio.
- - La solución debe contener un README.md con:
- - Descripción de la implementación
- - Tecnología y librerías utilizadas
- - Detalles de compilación y ejecución
- - El archivo de salida debe tener como nombre “valores” con su respectiva extensión y debe ser entregado junto con la solución
- - Por ultimo en el detalle del commit debes indicar los siguientes datos:
- - Nombre Completo.
- - Correo Electrónico.
- - Vía por la que te entérate del desafío. Estas pueden ser: Empresa de outsourcing (indicar cuál), twitter, LinkedIn, etc.
-
-`NOTA`: Todos los pull requests serán rechazados, esto no quiere decir que ha sido rechazada la solución.
+Patricio Angel Astorga Toledo
+pastorgatoledo@gmail.com
+me enteré del desafio luego de hablar con Maria Paz Coloma
diff --git a/doc/allclasses-index.html b/doc/allclasses-index.html
new file mode 100644
index 0000000..bac47de
--- /dev/null
+++ b/doc/allclasses-index.html
@@ -0,0 +1,102 @@
+
+
+
public staticStringobtenerFechaFormato(Date fecha,
+ String formato)
+
Metodo que obtiene la fecha y le da el formato recibido.
+
+
Parameters:
+
fecha - parametro con la fecha
+
formato - the formato
+
Returns:
+
String con la fecha de salida
+
+
+
+
+
+
clasificarColeccion
+
public static<T>voidclasificarColeccion(List<T> list,
+ boolean esAscendente,
+ String... bean)
+
Metodo que ordena lo que reciba y en base al nombre del atributo.
+
+
Type Parameters:
+
T - cualquier elemento
+
Parameters:
+
list - lista del elemento T
+
esAscendente - boolean que indica si la lista sera asc o desc
+
bean - este es el atributo de la clase por el cual se va a ordenar
+
+
+
+
+
+
convertiraJsonDTO
+
public staticFormatoJsonDTOconvertiraJsonDTO(com.previred.desafio.tres.uf.vo.Ufs ufs,
+ List<com.previred.desafio.tres.uf.vo.Uf> listUfRango,
+ int maxJson)
+
Convertir a json DTO.
+ Metodo que convierte el ufs a formato json dto
+
+
Parameters:
+
ufs - the ufs
+
listUfRango - the list uf rango
+
maxJson - the max json
+
Returns:
+
the formato json DTO
+
+
+
+
+
+
convertiraJsonUfDTO
+
public staticList<FormatoUfJsonDTO>convertiraJsonUfDTO(List<com.previred.desafio.tres.uf.vo.Uf> listUf,
+ int maxJson)
+
Convertira json uf DTO.
+Metodo que convierte al DTO jsonUF en base al UF recibido.
+
+
Parameters:
+
listUf - the list uf
+
maxJson - the max json
+
Returns:
+
the list
+
+
+
+
+
+
validacionElementosEnRango
+
public staticbooleanvalidacionElementosEnRango(List<com.previred.desafio.tres.uf.vo.Uf> listUf,
+ List<com.previred.desafio.tres.uf.vo.Uf> listUfRango)
+
metodo que valida que los elementos retornados de getRange() esten en la lista.
+
+
Parameters:
+
listUf - the list uf
+
listUfRango - the list uf rango
+
Returns:
+
verdadero si todos los elementos de la lista a se encuetran en la lista b.
+
+
+
+
+
+
controlExcepcion
+
public staticvoidcontrolExcepcion(String msg)
+ throws Throwable
+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces
+
+
Search
+
You can search for definitions of modules, packages, types, fields, methods, system properties and other terms defined in the API, using some or all of the name, optionally using "camelCase" abbreviations. For example:
+
+
j.l.obj will match "java.lang.Object"
+
InpStr will match "java.io.InputStream"
+
HM.cK will match "java.util.HashMap.containsKey(Object)"
+The following sections describe the different kinds of pages in this collection.
+
+
Overview
+
The Overview page is the front page of this API document and provides a list of all packages with a summary for each. This page can also contain an overall description of the set of packages.
+
+
+
Package
+
Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:
+
+
Interfaces
+
Classes
+
Enums
+
Exceptions
+
Errors
+
Annotation Types
+
+
+
+
Class or Interface
+
Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.
+
+
Class Inheritance Diagram
+
Direct Subclasses
+
All Known Subinterfaces
+
All Known Implementing Classes
+
Class or Interface Declaration
+
Class or Interface Description
+
+
+
+
Nested Class Summary
+
Enum Constant Summary
+
Field Summary
+
Property Summary
+
Constructor Summary
+
Method Summary
+
Required Element Summary
+
Optional Element Summary
+
+
+
+
Enum Constant Details
+
Field Details
+
Property Details
+
Constructor Details
+
Method Details
+
Element Details
+
+
Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.
+
The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.
+
+
+
Other Files
+
Packages and modules may contain pages with additional information related to the declarations nearby.
+
+
+
Use
+
Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the USE link in the navigation bar.
+
+
+
Tree (Class Hierarchy)
+
There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.
+
+
When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
+
When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
The All Packages page contains an alphabetic index of all packages contained in the documentation.
+
+
+
All Classes and Interfaces
+
The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.
+
+
+
Index
+
The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.
+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
+
+
diff --git a/doc/jquery-ui.overrides.css b/doc/jquery-ui.overrides.css
new file mode 100644
index 0000000..f89acb6
--- /dev/null
+++ b/doc/jquery-ui.overrides.css
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+.ui-state-active,
+.ui-widget-content .ui-state-active,
+.ui-widget-header .ui-state-active,
+a.ui-button:active,
+.ui-button:active,
+.ui-button.ui-state-active:hover {
+ /* Overrides the color of selection used in jQuery UI */
+ background: #F8981D;
+}
diff --git a/doc/legal/ADDITIONAL_LICENSE_INFO b/doc/legal/ADDITIONAL_LICENSE_INFO
new file mode 100644
index 0000000..b62cc3e
--- /dev/null
+++ b/doc/legal/ADDITIONAL_LICENSE_INFO
@@ -0,0 +1 @@
+Please see ..\java.base\ADDITIONAL_LICENSE_INFO
diff --git a/doc/legal/ASSEMBLY_EXCEPTION b/doc/legal/ASSEMBLY_EXCEPTION
new file mode 100644
index 0000000..0d4cfb4
--- /dev/null
+++ b/doc/legal/ASSEMBLY_EXCEPTION
@@ -0,0 +1 @@
+Please see ..\java.base\ASSEMBLY_EXCEPTION
diff --git a/doc/legal/LICENSE b/doc/legal/LICENSE
new file mode 100644
index 0000000..4ad9fe4
--- /dev/null
+++ b/doc/legal/LICENSE
@@ -0,0 +1 @@
+Please see ..\java.base\LICENSE
diff --git a/doc/legal/jquery.md b/doc/legal/jquery.md
new file mode 100644
index 0000000..8054a34
--- /dev/null
+++ b/doc/legal/jquery.md
@@ -0,0 +1,72 @@
+## jQuery v3.5.1
+
+### jQuery License
+```
+jQuery v 3.5.1
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+******************************************
+
+The jQuery JavaScript Library v3.5.1 also includes Sizzle.js
+
+Sizzle.js includes the following license:
+
+Copyright JS Foundation and other contributors, https://js.foundation/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/sizzle
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+*********************
+
+```
diff --git a/doc/legal/jqueryUI.md b/doc/legal/jqueryUI.md
new file mode 100644
index 0000000..8031bdb
--- /dev/null
+++ b/doc/legal/jqueryUI.md
@@ -0,0 +1,49 @@
+## jQuery UI v1.12.1
+
+### jQuery UI License
+```
+Copyright jQuery Foundation and other contributors, https://jquery.org/
+
+This software consists of voluntary contributions made by many
+individuals. For exact contribution history, see the revision history
+available at https://github.com/jquery/jquery-ui
+
+The following license applies to all parts of this software except as
+documented below:
+
+====
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+====
+
+Copyright and related rights for sample code are waived via CC0. Sample
+code is defined as all source code contained within the demos directory.
+
+CC0: http://creativecommons.org/publicdomain/zero/1.0/
+
+====
+
+All files located in the node_modules and external directories are
+externally maintained libraries used by this software which have their
+own licenses; we recommend you read them, as their terms may differ from
+the terms above.
+
+```
diff --git a/doc/member-search-index.js b/doc/member-search-index.js
new file mode 100644
index 0000000..afb638d
--- /dev/null
+++ b/doc/member-search-index.js
@@ -0,0 +1 @@
+memberSearchIndex = [{"p":"cl.zco.desafio3.util","c":"Constantes","l":"ATRIB_FECHA"},{"p":"cl.zco.desafio3.util","c":"Util","l":"clasificarColeccion(List, boolean, String...)","u":"clasificarColeccion(java.util.List,boolean,java.lang.String...)"},{"p":"cl.zco.desafio3","c":"Configuracion","l":"Configuracion()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3","c":"Configuracion","l":"Configuracion(int)","u":"%3Cinit%3E(int)"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"Constantes()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3.negocio","c":"ConsumirJarPrevired","l":"ConsumirJarPrevired()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3.util","c":"Util","l":"controlExcepcion(String)","u":"controlExcepcion(java.lang.String)"},{"p":"cl.zco.desafio3.util","c":"Util","l":"controlExcepcion(String, Integer)","u":"controlExcepcion(java.lang.String,java.lang.Integer)"},{"p":"cl.zco.desafio3.util","c":"Util","l":"convertiraJsonDTO(Ufs, List, int)","u":"convertiraJsonDTO(com.previred.desafio.tres.uf.vo.Ufs,java.util.List,int)"},{"p":"cl.zco.desafio3.util","c":"Util","l":"convertiraJsonUfDTO(List, int)","u":"convertiraJsonUfDTO(java.util.List,int)"},{"p":"cl.zco.desafio3.negocio","c":"ManejadorArchivos","l":"crearFicheroJson(FormatoJsonDTO, String)","u":"crearFicheroJson(cl.zco.desafio3.dto.FormatoJsonDTO,java.lang.String)"},{"p":"cl.zco.desafio3.negocio","c":"ManejadorArchivos","l":"crearFicheroJson(FormatoJsonDTO, String, boolean)","u":"crearFicheroJson(cl.zco.desafio3.dto.FormatoJsonDTO,java.lang.String,boolean)"},{"p":"cl.zco.desafio3","c":"Desafio3Application","l":"Desafio3Application()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3.negocio","c":"ManejadorArchivos","l":"existeCarpeta(String)","u":"existeCarpeta(java.lang.String)"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"FORMATO_DD_MMM_YYYY"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"FORMATO_YYYY_MM_DD"},{"p":"cl.zco.desafio3.dto","c":"FormatoJsonDTO","l":"FormatoJsonDTO()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3.dto","c":"FormatoUfJsonDTO","l":"FormatoUfJsonDTO(String, String)","u":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"cl.zco.desafio3.negocio","c":"ConsumirJarPrevired","l":"generarCSV(Ufs)","u":"generarCSV(com.previred.desafio.tres.uf.vo.Ufs)"},{"p":"cl.zco.desafio3.negocio","c":"ConsumirJarPrevired","l":"generarJson(Ufs, List)","u":"generarJson(com.previred.desafio.tres.uf.vo.Ufs,java.util.List)"},{"p":"cl.zco.desafio3.negocio","c":"ConsumirJarPrevired","l":"generarXML(Ufs)","u":"generarXML(com.previred.desafio.tres.uf.vo.Ufs)"},{"p":"cl.zco.desafio3","c":"Configuracion","l":"getCantidadjson()"},{"p":"cl.zco.desafio3","c":"Proveedor","l":"getContexto()"},{"p":"cl.zco.desafio3.dto","c":"FormatoUfJsonDTO","l":"getDato()"},{"p":"cl.zco.desafio3.dto","c":"FormatoUfJsonDTO","l":"getFecha()"},{"p":"cl.zco.desafio3.dto","c":"FormatoJsonDTO","l":"getFin()"},{"p":"cl.zco.desafio3.dto","c":"FormatoJsonDTO","l":"getInicio()"},{"p":"cl.zco.desafio3.dto","c":"FormatoJsonDTO","l":"getUFs()"},{"p":"cl.zco.desafio3.negocio","c":"ConsumirJarPrevired","l":"iniciar()"},{"p":"cl.zco.desafio3","c":"Desafio3Application","l":"iniciarAplicacion()"},{"p":"cl.zco.desafio3","c":"Desafio3Application","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"cl.zco.desafio3.negocio","c":"ManejadorArchivos","l":"ManejadorArchivos()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"obtenerEtiqueta(String)","u":"obtenerEtiqueta(java.lang.String)"},{"p":"cl.zco.desafio3.util","c":"Util","l":"obtenerFechaFormato(Date, String)","u":"obtenerFechaFormato(java.util.Date,java.lang.String)"},{"p":"cl.zco.desafio3.negocio","c":"ConsumirJarPrevired","l":"obtenerValoresUF()"},{"p":"cl.zco.desafio3","c":"Proveedor","l":"Proveedor()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"RUTA_JAR_JSON"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"RUTA_WKS_JSON"},{"p":"cl.zco.desafio3","c":"Proveedor","l":"setApplicationContext(ApplicationContext)","u":"setApplicationContext(org.springframework.context.ApplicationContext)"},{"p":"cl.zco.desafio3","c":"Configuracion","l":"setCantidadjson(int)"},{"p":"cl.zco.desafio3.dto","c":"FormatoUfJsonDTO","l":"setDato(String)","u":"setDato(java.lang.String)"},{"p":"cl.zco.desafio3.dto","c":"FormatoUfJsonDTO","l":"setFecha(String)","u":"setFecha(java.lang.String)"},{"p":"cl.zco.desafio3.dto","c":"FormatoJsonDTO","l":"setFin(String)","u":"setFin(java.lang.String)"},{"p":"cl.zco.desafio3.dto","c":"FormatoJsonDTO","l":"setInicio(String)","u":"setInicio(java.lang.String)"},{"p":"cl.zco.desafio3.dto","c":"FormatoJsonDTO","l":"setUFs(List)","u":"setUFs(java.util.List)"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"SIMBOLO_NUEVA_LINEA"},{"p":"cl.zco.desafio3","c":"Configuracion","l":"toString()"},{"p":"cl.zco.desafio3.util","c":"Util","l":"Util()","u":"%3Cinit%3E()"},{"p":"cl.zco.desafio3.util","c":"Constantes","l":"VACIO"},{"p":"cl.zco.desafio3.util","c":"Util","l":"validacionElementosEnRango(List, List)","u":"validacionElementosEnRango(java.util.List,java.util.List)"}];updateSearchResults();
\ No newline at end of file
diff --git a/doc/module-search-index.js b/doc/module-search-index.js
new file mode 100644
index 0000000..0d59754
--- /dev/null
+++ b/doc/module-search-index.js
@@ -0,0 +1 @@
+moduleSearchIndex = [];updateSearchResults();
\ No newline at end of file
diff --git a/doc/overview-summary.html b/doc/overview-summary.html
new file mode 100644
index 0000000..7aa9245
--- /dev/null
+++ b/doc/overview-summary.html
@@ -0,0 +1,26 @@
+
+
+
+
+Generated Documentation (Untitled)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete});
\ No newline at end of file
diff --git a/doc/script-dir/jquery-ui.structure.min.css b/doc/script-dir/jquery-ui.structure.min.css
new file mode 100644
index 0000000..e880892
--- /dev/null
+++ b/doc/script-dir/jquery-ui.structure.min.css
@@ -0,0 +1,5 @@
+/*! jQuery UI - v1.12.1 - 2018-12-06
+* http://jqueryui.com
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}
\ No newline at end of file
diff --git a/doc/script.js b/doc/script.js
new file mode 100644
index 0000000..864989c
--- /dev/null
+++ b/doc/script.js
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var moduleSearchIndex;
+var packageSearchIndex;
+var typeSearchIndex;
+var memberSearchIndex;
+var tagSearchIndex;
+function loadScripts(doc, tag) {
+ createElem(doc, tag, 'search.js');
+
+ createElem(doc, tag, 'module-search-index.js');
+ createElem(doc, tag, 'package-search-index.js');
+ createElem(doc, tag, 'type-search-index.js');
+ createElem(doc, tag, 'member-search-index.js');
+ createElem(doc, tag, 'tag-search-index.js');
+}
+
+function createElem(doc, tag, path) {
+ var script = doc.createElement(tag);
+ var scriptElement = doc.getElementsByTagName(tag)[0];
+ script.src = pathtoroot + path;
+ scriptElement.parentNode.insertBefore(script, scriptElement);
+}
+
+function show(tableId, selected, columns) {
+ if (tableId !== selected) {
+ document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')')
+ .forEach(function(elem) {
+ elem.style.display = 'none';
+ });
+ }
+ document.querySelectorAll('div.' + selected)
+ .forEach(function(elem, index) {
+ elem.style.display = '';
+ var isEvenRow = index % (columns * 2) < columns;
+ elem.classList.remove(isEvenRow ? oddRowColor : evenRowColor);
+ elem.classList.add(isEvenRow ? evenRowColor : oddRowColor);
+ });
+ updateTabs(tableId, selected);
+}
+
+function updateTabs(tableId, selected) {
+ document.querySelector('div#' + tableId +' .summary-table')
+ .setAttribute('aria-labelledby', selected);
+ document.querySelectorAll('button[id^="' + tableId + '"]')
+ .forEach(function(tab, index) {
+ if (selected === tab.id || (tableId === selected && index === 0)) {
+ tab.className = activeTableTab;
+ tab.setAttribute('aria-selected', true);
+ tab.setAttribute('tabindex',0);
+ } else {
+ tab.className = tableTab;
+ tab.setAttribute('aria-selected', false);
+ tab.setAttribute('tabindex',-1);
+ }
+ });
+}
+
+function switchTab(e) {
+ var selected = document.querySelector('[aria-selected=true]');
+ if (selected) {
+ if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) {
+ // left or up arrow key pressed: move focus to previous tab
+ selected.previousSibling.click();
+ selected.previousSibling.focus();
+ e.preventDefault();
+ } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) {
+ // right or down arrow key pressed: move focus to next tab
+ selected.nextSibling.click();
+ selected.nextSibling.focus();
+ e.preventDefault();
+ }
+ }
+}
+
+var updateSearchResults = function() {};
+
+function indexFilesLoaded() {
+ return moduleSearchIndex
+ && packageSearchIndex
+ && typeSearchIndex
+ && memberSearchIndex
+ && tagSearchIndex;
+}
+
+// Workaround for scroll position not being included in browser history (8249133)
+document.addEventListener("DOMContentLoaded", function(e) {
+ var contentDiv = document.querySelector("div.flex-content");
+ window.addEventListener("popstate", function(e) {
+ if (e.state !== null) {
+ contentDiv.scrollTop = e.state;
+ }
+ });
+ window.addEventListener("hashchange", function(e) {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ });
+ contentDiv.addEventListener("scroll", function(e) {
+ var timeoutID;
+ if (!timeoutID) {
+ timeoutID = setTimeout(function() {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ timeoutID = null;
+ }, 100);
+ }
+ });
+ if (!location.hash) {
+ history.replaceState(contentDiv.scrollTop, document.title);
+ }
+});
diff --git a/doc/search.js b/doc/search.js
new file mode 100644
index 0000000..2246cdd
--- /dev/null
+++ b/doc/search.js
@@ -0,0 +1,354 @@
+/*
+ * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+var noResult = {l: "No results found"};
+var loading = {l: "Loading search index..."};
+var catModules = "Modules";
+var catPackages = "Packages";
+var catTypes = "Types";
+var catMembers = "Members";
+var catSearchTags = "Search Tags";
+var highlight = "$&";
+var searchPattern = "";
+var fallbackPattern = "";
+var RANKING_THRESHOLD = 2;
+var NO_MATCH = 0xffff;
+var MIN_RESULTS = 3;
+var MAX_RESULTS = 500;
+var UNNAMED = "";
+function escapeHtml(str) {
+ return str.replace(//g, ">");
+}
+function getHighlightedText(item, matcher, fallbackMatcher) {
+ var escapedItem = escapeHtml(item);
+ var highlighted = escapedItem.replace(matcher, highlight);
+ if (highlighted === escapedItem) {
+ highlighted = escapedItem.replace(fallbackMatcher, highlight)
+ }
+ return highlighted;
+}
+function getURLPrefix(ui) {
+ var urlPrefix="";
+ var slash = "/";
+ if (ui.item.category === catModules) {
+ return ui.item.l + slash;
+ } else if (ui.item.category === catPackages && ui.item.m) {
+ return ui.item.m + slash;
+ } else if (ui.item.category === catTypes || ui.item.category === catMembers) {
+ if (ui.item.m) {
+ urlPrefix = ui.item.m + slash;
+ } else {
+ $.each(packageSearchIndex, function(index, item) {
+ if (item.m && ui.item.p === item.l) {
+ urlPrefix = item.m + slash;
+ }
+ });
+ }
+ }
+ return urlPrefix;
+}
+function createSearchPattern(term) {
+ var pattern = "";
+ var isWordToken = false;
+ term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) {
+ if (index > 0) {
+ // whitespace between identifiers is significant
+ pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*";
+ }
+ var tokens = w.split(/(?=[A-Z,.()<>[\/])/);
+ for (var i = 0; i < tokens.length; i++) {
+ var s = tokens[i];
+ if (s === "") {
+ continue;
+ }
+ pattern += $.ui.autocomplete.escapeRegex(s);
+ isWordToken = /\w$/.test(s);
+ if (isWordToken) {
+ pattern += "([a-z0-9_$<>\\[\\]]*?)";
+ }
+ }
+ });
+ return pattern;
+}
+function createMatcher(pattern, flags) {
+ var isCamelCase = /[A-Z]/.test(pattern);
+ return new RegExp(pattern, flags + (isCamelCase ? "" : "i"));
+}
+var watermark = 'Search';
+$(function() {
+ var search = $("#search-input");
+ var reset = $("#reset-button");
+ search.val('');
+ search.prop("disabled", false);
+ reset.prop("disabled", false);
+ search.val(watermark).addClass('watermark');
+ search.blur(function() {
+ if ($(this).val().length === 0) {
+ $(this).val(watermark).addClass('watermark');
+ }
+ });
+ search.on('click keydown paste', function() {
+ if ($(this).val() === watermark) {
+ $(this).val('').removeClass('watermark');
+ }
+ });
+ reset.click(function() {
+ search.val('').focus();
+ });
+ search.focus()[0].setSelectionRange(0, 0);
+});
+$.widget("custom.catcomplete", $.ui.autocomplete, {
+ _create: function() {
+ this._super();
+ this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
+ },
+ _renderMenu: function(ul, items) {
+ var rMenu = this;
+ var currentCategory = "";
+ rMenu.menu.bindings = $();
+ $.each(items, function(index, item) {
+ var li;
+ if (item.category && item.category !== currentCategory) {
+ ul.append("
" + item.category + "
");
+ currentCategory = item.category;
+ }
+ li = rMenu._renderItemData(ul, item);
+ if (item.category) {
+ li.attr("aria-label", item.category + " : " + item.l);
+ li.attr("class", "result-item");
+ } else {
+ li.attr("aria-label", item.l);
+ li.attr("class", "result-item");
+ }
+ });
+ },
+ _renderItem: function(ul, item) {
+ var label = "";
+ var matcher = createMatcher(escapeHtml(searchPattern), "g");
+ var fallbackMatcher = new RegExp(fallbackPattern, "gi")
+ if (item.category === catModules) {
+ label = getHighlightedText(item.l, matcher, fallbackMatcher);
+ } else if (item.category === catPackages) {
+ label = getHighlightedText(item.l, matcher, fallbackMatcher);
+ } else if (item.category === catTypes) {
+ label = (item.p && item.p !== UNNAMED)
+ ? getHighlightedText(item.p + "." + item.l, matcher, fallbackMatcher)
+ : getHighlightedText(item.l, matcher, fallbackMatcher);
+ } else if (item.category === catMembers) {
+ label = (item.p && item.p !== UNNAMED)
+ ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher, fallbackMatcher)
+ : getHighlightedText(item.c + "." + item.l, matcher, fallbackMatcher);
+ } else if (item.category === catSearchTags) {
+ label = getHighlightedText(item.l, matcher, fallbackMatcher);
+ } else {
+ label = item.l;
+ }
+ var li = $("").appendTo(ul);
+ var div = $("").appendTo(li);
+ if (item.category === catSearchTags && item.h) {
+ if (item.d) {
+ div.html(label + " (" + item.h + ") "
+ + item.d + " ");
+ } else {
+ div.html(label + " (" + item.h + ")");
+ }
+ } else {
+ if (item.m) {
+ div.html(item.m + "/" + label);
+ } else {
+ div.html(label);
+ }
+ }
+ return li;
+ }
+});
+function rankMatch(match, category) {
+ if (!match) {
+ return NO_MATCH;
+ }
+ var index = match.index;
+ var input = match.input;
+ var leftBoundaryMatch = 2;
+ var periferalMatch = 0;
+ // make sure match is anchored on a left word boundary
+ if (index === 0 || /\W/.test(input[index - 1]) || "_" === input[index]) {
+ leftBoundaryMatch = 0;
+ } else if ("_" === input[index - 1] || (input[index] === input[index].toUpperCase() && !/^[A-Z0-9_$]+$/.test(input))) {
+ leftBoundaryMatch = 1;
+ }
+ var matchEnd = index + match[0].length;
+ var leftParen = input.indexOf("(");
+ var endOfName = leftParen > -1 ? leftParen : input.length;
+ // exclude peripheral matches
+ if (category !== catModules && category !== catSearchTags) {
+ var delim = category === catPackages ? "/" : ".";
+ if (leftParen > -1 && leftParen < index) {
+ periferalMatch += 2;
+ } else if (input.lastIndexOf(delim, endOfName) >= matchEnd) {
+ periferalMatch += 2;
+ }
+ }
+ var delta = match[0].length === endOfName ? 0 : 1; // rank full match higher than partial match
+ for (var i = 1; i < match.length; i++) {
+ // lower ranking if parts of the name are missing
+ if (match[i])
+ delta += match[i].length;
+ }
+ if (category === catTypes) {
+ // lower ranking if a type name contains unmatched camel-case parts
+ if (/[A-Z]/.test(input.substring(matchEnd)))
+ delta += 5;
+ if (/[A-Z]/.test(input.substring(0, index)))
+ delta += 5;
+ }
+ return leftBoundaryMatch + periferalMatch + (delta / 200);
+
+}
+function doSearch(request, response) {
+ var result = [];
+ searchPattern = createSearchPattern(request.term);
+ fallbackPattern = createSearchPattern(request.term.toLowerCase());
+ if (searchPattern === "") {
+ return this.close();
+ }
+ var camelCaseMatcher = createMatcher(searchPattern, "");
+ var fallbackMatcher = new RegExp(fallbackPattern, "i");
+
+ function searchIndexWithMatcher(indexArray, matcher, category, nameFunc) {
+ if (indexArray) {
+ var newResults = [];
+ $.each(indexArray, function (i, item) {
+ item.category = category;
+ var ranking = rankMatch(matcher.exec(nameFunc(item)), category);
+ if (ranking < RANKING_THRESHOLD) {
+ newResults.push({ranking: ranking, item: item});
+ }
+ return newResults.length <= MAX_RESULTS;
+ });
+ return newResults.sort(function(e1, e2) {
+ return e1.ranking - e2.ranking;
+ }).map(function(e) {
+ return e.item;
+ });
+ }
+ return [];
+ }
+ function searchIndex(indexArray, category, nameFunc) {
+ var primaryResults = searchIndexWithMatcher(indexArray, camelCaseMatcher, category, nameFunc);
+ result = result.concat(primaryResults);
+ if (primaryResults.length <= MIN_RESULTS && !camelCaseMatcher.ignoreCase) {
+ var secondaryResults = searchIndexWithMatcher(indexArray, fallbackMatcher, category, nameFunc);
+ result = result.concat(secondaryResults.filter(function (item) {
+ return primaryResults.indexOf(item) === -1;
+ }));
+ }
+ }
+
+ searchIndex(moduleSearchIndex, catModules, function(item) { return item.l; });
+ searchIndex(packageSearchIndex, catPackages, function(item) {
+ return (item.m && request.term.indexOf("/") > -1)
+ ? (item.m + "/" + item.l) : item.l;
+ });
+ searchIndex(typeSearchIndex, catTypes, function(item) {
+ return request.term.indexOf(".") > -1 ? item.p + "." + item.l : item.l;
+ });
+ searchIndex(memberSearchIndex, catMembers, function(item) {
+ return request.term.indexOf(".") > -1
+ ? item.p + "." + item.c + "." + item.l : item.l;
+ });
+ searchIndex(tagSearchIndex, catSearchTags, function(item) { return item.l; });
+
+ if (!indexFilesLoaded()) {
+ updateSearchResults = function() {
+ doSearch(request, response);
+ }
+ result.unshift(loading);
+ } else {
+ updateSearchResults = function() {};
+ }
+ response(result);
+}
+$(function() {
+ $("#search-input").catcomplete({
+ minLength: 1,
+ delay: 300,
+ source: doSearch,
+ response: function(event, ui) {
+ if (!ui.content.length) {
+ ui.content.push(noResult);
+ } else {
+ $("#search-input").empty();
+ }
+ },
+ autoFocus: true,
+ focus: function(event, ui) {
+ return false;
+ },
+ position: {
+ collision: "flip"
+ },
+ select: function(event, ui) {
+ if (ui.item.category) {
+ var url = getURLPrefix(ui);
+ if (ui.item.category === catModules) {
+ url += "module-summary.html";
+ } else if (ui.item.category === catPackages) {
+ if (ui.item.u) {
+ url = ui.item.u;
+ } else {
+ url += ui.item.l.replace(/\./g, '/') + "/package-summary.html";
+ }
+ } else if (ui.item.category === catTypes) {
+ if (ui.item.u) {
+ url = ui.item.u;
+ } else if (ui.item.p === UNNAMED) {
+ url += ui.item.l + ".html";
+ } else {
+ url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html";
+ }
+ } else if (ui.item.category === catMembers) {
+ if (ui.item.p === UNNAMED) {
+ url += ui.item.c + ".html" + "#";
+ } else {
+ url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#";
+ }
+ if (ui.item.u) {
+ url += ui.item.u;
+ } else {
+ url += ui.item.l;
+ }
+ } else if (ui.item.category === catSearchTags) {
+ url += ui.item.u;
+ }
+ if (top !== window) {
+ parent.classFrame.location = pathtoroot + url;
+ } else {
+ window.location.href = pathtoroot + url;
+ }
+ $("#search-input").focus();
+ }
+ }
+ });
+});
diff --git a/doc/stylesheet.css b/doc/stylesheet.css
new file mode 100644
index 0000000..836c62d
--- /dev/null
+++ b/doc/stylesheet.css
@@ -0,0 +1,865 @@
+/*
+ * Javadoc style sheet
+ */
+
+@import url('resources/fonts/dejavu.css');
+
+/*
+ * Styles for individual HTML elements.
+ *
+ * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular
+ * HTML element throughout the page.
+ */
+
+body {
+ background-color:#ffffff;
+ color:#353833;
+ font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size:14px;
+ margin:0;
+ padding:0;
+ height:100%;
+ width:100%;
+}
+iframe {
+ margin:0;
+ padding:0;
+ height:100%;
+ width:100%;
+ overflow-y:scroll;
+ border:none;
+}
+a:link, a:visited {
+ text-decoration:none;
+ color:#4A6782;
+}
+a[href]:hover, a[href]:focus {
+ text-decoration:none;
+ color:#bb7a2a;
+}
+a[name] {
+ color:#353833;
+}
+pre {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+}
+h1 {
+ font-size:20px;
+}
+h2 {
+ font-size:18px;
+}
+h3 {
+ font-size:16px;
+}
+h4 {
+ font-size:15px;
+}
+h5 {
+ font-size:14px;
+}
+h6 {
+ font-size:13px;
+}
+ul {
+ list-style-type:disc;
+}
+code, tt {
+ font-family:'DejaVu Sans Mono', monospace;
+}
+:not(h1, h2, h3, h4, h5, h6) > code,
+:not(h1, h2, h3, h4, h5, h6) > tt {
+ font-size:14px;
+ padding-top:4px;
+ margin-top:8px;
+ line-height:1.4em;
+}
+dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ padding-top:4px;
+}
+.summary-table dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ vertical-align:top;
+ padding-top:4px;
+}
+sup {
+ font-size:8px;
+}
+button {
+ font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size: 14px;
+}
+/*
+ * Styles for HTML generated by javadoc.
+ *
+ * These are style classes that are used by the standard doclet to generate HTML documentation.
+ */
+
+/*
+ * Styles for document title and copyright.
+ */
+.clear {
+ clear:both;
+ height:0;
+ overflow:hidden;
+}
+.about-language {
+ float:right;
+ padding:0 21px 8px 8px;
+ font-size:11px;
+ margin-top:-9px;
+ height:2.9em;
+}
+.legal-copy {
+ margin-left:.5em;
+}
+.tab {
+ background-color:#0066FF;
+ color:#ffffff;
+ padding:8px;
+ width:5em;
+ font-weight:bold;
+}
+/*
+ * Styles for navigation bar.
+ */
+@media screen {
+ .flex-box {
+ position:fixed;
+ display:flex;
+ flex-direction:column;
+ height: 100%;
+ width: 100%;
+ }
+ .flex-header {
+ flex: 0 0 auto;
+ }
+ .flex-content {
+ flex: 1 1 auto;
+ overflow-y: auto;
+ }
+}
+.top-nav {
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ float:left;
+ padding:0;
+ width:100%;
+ clear:right;
+ min-height:2.8em;
+ padding-top:10px;
+ overflow:hidden;
+ font-size:12px;
+}
+.sub-nav {
+ background-color:#dee3e9;
+ float:left;
+ width:100%;
+ overflow:hidden;
+ font-size:12px;
+}
+.sub-nav div {
+ clear:left;
+ float:left;
+ padding:0 0 5px 6px;
+ text-transform:uppercase;
+}
+.sub-nav .nav-list {
+ padding-top:5px;
+}
+ul.nav-list {
+ display:block;
+ margin:0 25px 0 0;
+ padding:0;
+}
+ul.sub-nav-list {
+ float:left;
+ margin:0 25px 0 0;
+ padding:0;
+}
+ul.nav-list li {
+ list-style:none;
+ float:left;
+ padding: 5px 6px;
+ text-transform:uppercase;
+}
+.sub-nav .nav-list-search {
+ float:right;
+ margin:0 0 0 0;
+ padding:5px 6px;
+ clear:none;
+}
+.nav-list-search label {
+ position:relative;
+ right:-16px;
+}
+ul.sub-nav-list li {
+ list-style:none;
+ float:left;
+ padding-top:10px;
+}
+.top-nav a:link, .top-nav a:active, .top-nav a:visited {
+ color:#FFFFFF;
+ text-decoration:none;
+ text-transform:uppercase;
+}
+.top-nav a:hover {
+ text-decoration:none;
+ color:#bb7a2a;
+ text-transform:uppercase;
+}
+.nav-bar-cell1-rev {
+ background-color:#F8981D;
+ color:#253441;
+ margin: auto 5px;
+}
+.skip-nav {
+ position:absolute;
+ top:auto;
+ left:-9999px;
+ overflow:hidden;
+}
+/*
+ * Hide navigation links and search box in print layout
+ */
+@media print {
+ ul.nav-list, div.sub-nav {
+ display:none;
+ }
+}
+/*
+ * Styles for page header and footer.
+ */
+.title {
+ color:#2c4557;
+ margin:10px 0;
+}
+.sub-title {
+ margin:5px 0 0 0;
+}
+.header ul {
+ margin:0 0 15px 0;
+ padding:0;
+}
+.header ul li, .footer ul li {
+ list-style:none;
+ font-size:13px;
+}
+/*
+ * Styles for headings.
+ */
+body.class-declaration-page .summary h2,
+body.class-declaration-page .details h2,
+body.class-use-page h2,
+body.module-declaration-page .block-list h2 {
+ font-style: italic;
+ padding:0;
+ margin:15px 0;
+}
+body.class-declaration-page .summary h3,
+body.class-declaration-page .details h3,
+body.class-declaration-page .summary .inherited-list h2 {
+ background-color:#dee3e9;
+ border:1px solid #d0d9e0;
+ margin:0 0 6px -8px;
+ padding:7px 5px;
+}
+/*
+ * Styles for page layout containers.
+ */
+main {
+ clear:both;
+ padding:10px 20px;
+ position:relative;
+}
+dl.notes > dt {
+ font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size:12px;
+ font-weight:bold;
+ margin:10px 0 0 0;
+ color:#4E4E4E;
+}
+dl.notes > dd {
+ margin:5px 10px 10px 0;
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+}
+dl.name-value > dt {
+ margin-left:1px;
+ font-size:1.1em;
+ display:inline;
+ font-weight:bold;
+}
+dl.name-value > dd {
+ margin:0 0 0 1px;
+ font-size:1.1em;
+ display:inline;
+}
+/*
+ * Styles for lists.
+ */
+li.circle {
+ list-style:circle;
+}
+ul.horizontal li {
+ display:inline;
+ font-size:0.9em;
+}
+div.inheritance {
+ margin:0;
+ padding:0;
+}
+div.inheritance div.inheritance {
+ margin-left:2em;
+}
+ul.block-list,
+ul.details-list,
+ul.member-list,
+ul.summary-list {
+ margin:10px 0 10px 0;
+ padding:0;
+}
+ul.block-list > li,
+ul.details-list > li,
+ul.member-list > li,
+ul.summary-list > li {
+ list-style:none;
+ margin-bottom:15px;
+ line-height:1.4;
+}
+.summary-table dl, .summary-table dl dt, .summary-table dl dd {
+ margin-top:0;
+ margin-bottom:1px;
+}
+ul.see-list, ul.see-list-long {
+ padding-left: 0;
+ list-style: none;
+}
+ul.see-list li {
+ display: inline;
+}
+ul.see-list li:not(:last-child):after,
+ul.see-list-long li:not(:last-child):after {
+ content: ", ";
+ white-space: pre-wrap;
+}
+/*
+ * Styles for tables.
+ */
+.summary-table, .details-table {
+ width:100%;
+ border-spacing:0;
+ border-left:1px solid #EEE;
+ border-right:1px solid #EEE;
+ border-bottom:1px solid #EEE;
+ padding:0;
+}
+.caption {
+ position:relative;
+ text-align:left;
+ background-repeat:no-repeat;
+ color:#253441;
+ font-weight:bold;
+ clear:none;
+ overflow:hidden;
+ padding:0;
+ padding-top:10px;
+ padding-left:1px;
+ margin:0;
+ white-space:pre;
+}
+.caption a:link, .caption a:visited {
+ color:#1f389c;
+}
+.caption a:hover,
+.caption a:active {
+ color:#FFFFFF;
+}
+.caption span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ padding-bottom:7px;
+ display:inline-block;
+ float:left;
+ background-color:#F8981D;
+ border: none;
+ height:16px;
+}
+div.table-tabs {
+ padding:10px 0 0 1px;
+ margin:0;
+}
+div.table-tabs > button {
+ border: none;
+ cursor: pointer;
+ padding: 5px 12px 7px 12px;
+ font-weight: bold;
+ margin-right: 3px;
+}
+div.table-tabs > button.active-table-tab {
+ background: #F8981D;
+ color: #253441;
+}
+div.table-tabs > button.table-tab {
+ background: #4D7A97;
+ color: #FFFFFF;
+}
+.two-column-summary {
+ display: grid;
+ grid-template-columns: minmax(15%, max-content) minmax(15%, auto);
+}
+.three-column-summary {
+ display: grid;
+ grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, auto);
+}
+.four-column-summary {
+ display: grid;
+ grid-template-columns: minmax(10%, max-content) minmax(10%, max-content) minmax(10%, max-content) minmax(10%, auto);
+}
+@media screen and (max-width: 600px) {
+ .two-column-summary {
+ display: grid;
+ grid-template-columns: 1fr;
+ }
+}
+@media screen and (max-width: 800px) {
+ .three-column-summary {
+ display: grid;
+ grid-template-columns: minmax(10%, max-content) minmax(25%, auto);
+ }
+ .three-column-summary .col-last {
+ grid-column-end: span 2;
+ }
+}
+@media screen and (max-width: 1000px) {
+ .four-column-summary {
+ display: grid;
+ grid-template-columns: minmax(15%, max-content) minmax(15%, auto);
+ }
+}
+.summary-table > div, .details-table > div {
+ text-align:left;
+ padding: 8px 3px 3px 7px;
+}
+.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name {
+ vertical-align:top;
+ padding-right:0;
+ padding-top:8px;
+ padding-bottom:3px;
+}
+.table-header {
+ background:#dee3e9;
+ font-weight: bold;
+}
+.col-first, .col-first {
+ font-size:13px;
+}
+.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last {
+ font-size:13px;
+}
+.col-first, .col-second, .col-constructor-name {
+ vertical-align:top;
+ overflow: auto;
+}
+.col-last {
+ white-space:normal;
+}
+.col-first a:link, .col-first a:visited,
+.col-second a:link, .col-second a:visited,
+.col-first a:link, .col-first a:visited,
+.col-second a:link, .col-second a:visited,
+.col-constructor-name a:link, .col-constructor-name a:visited,
+.col-summary-item-name a:link, .col-summary-item-name a:visited,
+.constant-values-container a:link, .constant-values-container a:visited,
+.all-classes-container a:link, .all-classes-container a:visited,
+.all-packages-container a:link, .all-packages-container a:visited {
+ font-weight:bold;
+}
+.table-sub-heading-color {
+ background-color:#EEEEFF;
+}
+.even-row-color, .even-row-color .table-header {
+ background-color:#FFFFFF;
+}
+.odd-row-color, .odd-row-color .table-header {
+ background-color:#EEEEEF;
+}
+/*
+ * Styles for contents.
+ */
+.deprecated-content {
+ margin:0;
+ padding:10px 0;
+}
+div.block {
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+}
+.col-last div {
+ padding-top:0;
+}
+.col-last a {
+ padding-bottom:3px;
+}
+.module-signature,
+.package-signature,
+.type-signature,
+.member-signature {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ margin:14px 0;
+ white-space: pre-wrap;
+}
+.module-signature,
+.package-signature,
+.type-signature {
+ margin-top: 0;
+}
+.member-signature .type-parameters-long,
+.member-signature .parameters,
+.member-signature .exceptions {
+ display: inline-block;
+ vertical-align: top;
+ white-space: pre;
+}
+.member-signature .type-parameters {
+ white-space: normal;
+}
+/*
+ * Styles for formatting effect.
+ */
+.source-line-no {
+ color:green;
+ padding:0 30px 0 0;
+}
+h1.hidden {
+ visibility:hidden;
+ overflow:hidden;
+ font-size:10px;
+}
+.block {
+ display:block;
+ margin:0 10px 5px 0;
+ color:#474747;
+}
+.deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link,
+.module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type,
+.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label {
+ font-weight:bold;
+}
+.deprecation-comment, .help-footnote, .preview-comment {
+ font-style:italic;
+}
+.deprecation-block {
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+ border-style:solid;
+ border-width:thin;
+ border-radius:10px;
+ padding:10px;
+ margin-bottom:10px;
+ margin-right:10px;
+ display:inline-block;
+}
+.preview-block {
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+ border-style:solid;
+ border-width:thin;
+ border-radius:10px;
+ padding:10px;
+ margin-bottom:10px;
+ margin-right:10px;
+ display:inline-block;
+}
+div.block div.deprecation-comment {
+ font-style:normal;
+}
+/*
+ * Styles specific to HTML5 elements.
+ */
+main, nav, header, footer, section {
+ display:block;
+}
+/*
+ * Styles for javadoc search.
+ */
+.ui-autocomplete-category {
+ font-weight:bold;
+ font-size:15px;
+ padding:7px 0 7px 3px;
+ background-color:#4D7A97;
+ color:#FFFFFF;
+}
+.result-item {
+ font-size:13px;
+}
+.ui-autocomplete {
+ max-height:85%;
+ max-width:65%;
+ overflow-y:scroll;
+ overflow-x:scroll;
+ white-space:nowrap;
+ box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
+}
+ul.ui-autocomplete {
+ position:fixed;
+ z-index:999999;
+}
+ul.ui-autocomplete li {
+ float:left;
+ clear:both;
+ width:100%;
+}
+.result-highlight {
+ font-weight:bold;
+}
+#search-input {
+ background-image:url('resources/glass.png');
+ background-size:13px;
+ background-repeat:no-repeat;
+ background-position:2px 3px;
+ padding-left:20px;
+ position:relative;
+ right:-18px;
+ width:400px;
+}
+#reset-button {
+ background-color: rgb(255,255,255);
+ background-image:url('resources/x.png');
+ background-position:center;
+ background-repeat:no-repeat;
+ background-size:12px;
+ border:0 none;
+ width:16px;
+ height:16px;
+ position:relative;
+ left:-4px;
+ top:-4px;
+ font-size:0px;
+}
+.watermark {
+ color:#545454;
+}
+.search-tag-desc-result {
+ font-style:italic;
+ font-size:11px;
+}
+.search-tag-holder-result {
+ font-style:italic;
+ font-size:12px;
+}
+.search-tag-result:target {
+ background-color:yellow;
+}
+.module-graph span {
+ display:none;
+ position:absolute;
+}
+.module-graph:hover span {
+ display:block;
+ margin: -100px 0 0 100px;
+ z-index: 1;
+}
+.inherited-list {
+ margin: 10px 0 10px 0;
+}
+section.class-description {
+ line-height: 1.4;
+}
+.summary section[class$="-summary"], .details section[class$="-details"],
+.class-uses .detail, .serialized-class-details {
+ padding: 0px 20px 5px 10px;
+ border: 1px solid #ededed;
+ background-color: #f8f8f8;
+}
+.inherited-list, section[class$="-details"] .detail {
+ padding:0 0 5px 8px;
+ background-color:#ffffff;
+ border:none;
+}
+.vertical-separator {
+ padding: 0 5px;
+}
+ul.help-section-list {
+ margin: 0;
+}
+ul.help-subtoc > li {
+ display: inline-block;
+ padding-right: 5px;
+ font-size: smaller;
+}
+ul.help-subtoc > li::before {
+ content: "\2022" ;
+ padding-right:2px;
+}
+span.help-note {
+ font-style: italic;
+}
+/*
+ * Indicator icon for external links.
+ */
+main a[href*="://"]::after {
+ content:"";
+ display:inline-block;
+ background-image:url('data:image/svg+xml; utf8, \
+ ');
+ background-size:100% 100%;
+ width:7px;
+ height:7px;
+ margin-left:2px;
+ margin-bottom:4px;
+}
+main a[href*="://"]:hover::after,
+main a[href*="://"]:focus::after {
+ background-image:url('data:image/svg+xml; utf8, \
+ ');
+}
+
+/*
+ * Styles for user-provided tables.
+ *
+ * borderless:
+ * No borders, vertical margins, styled caption.
+ * This style is provided for use with existing doc comments.
+ * In general, borderless tables should not be used for layout purposes.
+ *
+ * plain:
+ * Plain borders around table and cells, vertical margins, styled caption.
+ * Best for small tables or for complex tables for tables with cells that span
+ * rows and columns, when the "striped" style does not work well.
+ *
+ * striped:
+ * Borders around the table and vertical borders between cells, striped rows,
+ * vertical margins, styled caption.
+ * Best for tables that have a header row, and a body containing a series of simple rows.
+ */
+
+table.borderless,
+table.plain,
+table.striped {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+table.borderless > caption,
+table.plain > caption,
+table.striped > caption {
+ font-weight: bold;
+ font-size: smaller;
+}
+table.borderless th, table.borderless td,
+table.plain th, table.plain td,
+table.striped th, table.striped td {
+ padding: 2px 5px;
+}
+table.borderless,
+table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th,
+table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td {
+ border: none;
+}
+table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr {
+ background-color: transparent;
+}
+table.plain {
+ border-collapse: collapse;
+ border: 1px solid black;
+}
+table.plain > thead > tr, table.plain > tbody tr, table.plain > tr {
+ background-color: transparent;
+}
+table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th,
+table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td {
+ border: 1px solid black;
+}
+table.striped {
+ border-collapse: collapse;
+ border: 1px solid black;
+}
+table.striped > thead {
+ background-color: #E3E3E3;
+}
+table.striped > thead > tr > th, table.striped > thead > tr > td {
+ border: 1px solid black;
+}
+table.striped > tbody > tr:nth-child(even) {
+ background-color: #EEE
+}
+table.striped > tbody > tr:nth-child(odd) {
+ background-color: #FFF
+}
+table.striped > tbody > tr > th, table.striped > tbody > tr > td {
+ border-left: 1px solid black;
+ border-right: 1px solid black;
+}
+table.striped > tbody > tr > th {
+ font-weight: normal;
+}
+/**
+ * Tweak font sizes and paddings for small screens.
+ */
+@media screen and (max-width: 1050px) {
+ #search-input {
+ width: 300px;
+ }
+}
+@media screen and (max-width: 800px) {
+ #search-input {
+ width: 200px;
+ }
+ .top-nav,
+ .bottom-nav {
+ font-size: 11px;
+ padding-top: 6px;
+ }
+ .sub-nav {
+ font-size: 11px;
+ }
+ .about-language {
+ padding-right: 16px;
+ }
+ ul.nav-list li,
+ .sub-nav .nav-list-search {
+ padding: 6px;
+ }
+ ul.sub-nav-list li {
+ padding-top: 5px;
+ }
+ main {
+ padding: 10px;
+ }
+ .summary section[class$="-summary"], .details section[class$="-details"],
+ .class-uses .detail, .serialized-class-details {
+ padding: 0 8px 5px 8px;
+ }
+ body {
+ -webkit-text-size-adjust: none;
+ }
+}
+@media screen and (max-width: 500px) {
+ #search-input {
+ width: 150px;
+ }
+ .top-nav,
+ .bottom-nav {
+ font-size: 10px;
+ }
+ .sub-nav {
+ font-size: 10px;
+ }
+ .about-language {
+ font-size: 10px;
+ padding-right: 12px;
+ }
+}
diff --git a/doc/tag-search-index.js b/doc/tag-search-index.js
new file mode 100644
index 0000000..f2a440c
--- /dev/null
+++ b/doc/tag-search-index.js
@@ -0,0 +1 @@
+tagSearchIndex = [{"l":"Constant Field Values","h":"","u":"constant-values.html"}];updateSearchResults();
\ No newline at end of file
diff --git a/doc/type-search-index.js b/doc/type-search-index.js
new file mode 100644
index 0000000..eba0e11
--- /dev/null
+++ b/doc/type-search-index.js
@@ -0,0 +1 @@
+typeSearchIndex = [{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"cl.zco.desafio3","l":"Configuracion"},{"p":"cl.zco.desafio3.util","l":"Constantes"},{"p":"cl.zco.desafio3.negocio","l":"ConsumirJarPrevired"},{"p":"cl.zco.desafio3","l":"Desafio3Application"},{"p":"cl.zco.desafio3.dto","l":"FormatoJsonDTO"},{"p":"cl.zco.desafio3.dto","l":"FormatoUfJsonDTO"},{"p":"cl.zco.desafio3.negocio","l":"ManejadorArchivos"},{"p":"cl.zco.desafio3","l":"Proveedor"},{"p":"cl.zco.desafio3.util","l":"Util"}];updateSearchResults();
\ No newline at end of file
diff --git a/evidencia/imagen1.png b/evidencia/imagen1.png
new file mode 100644
index 0000000..1650a68
Binary files /dev/null and b/evidencia/imagen1.png differ
diff --git a/evidencia/imagen2.png b/evidencia/imagen2.png
new file mode 100644
index 0000000..59d640f
Binary files /dev/null and b/evidencia/imagen2.png differ
diff --git a/evidencia/imagen3.png b/evidencia/imagen3.png
new file mode 100644
index 0000000..13d47c8
Binary files /dev/null and b/evidencia/imagen3.png differ
diff --git a/evidencia/imagen4.png b/evidencia/imagen4.png
new file mode 100644
index 0000000..275f911
Binary files /dev/null and b/evidencia/imagen4.png differ
diff --git a/evidencia/imagen5.png b/evidencia/imagen5.png
new file mode 100644
index 0000000..7b93d1d
Binary files /dev/null and b/evidencia/imagen5.png differ
diff --git a/evidencia/imagen6.png b/evidencia/imagen6.png
new file mode 100644
index 0000000..a9a4c05
Binary files /dev/null and b/evidencia/imagen6.png differ
diff --git a/evidencia/imagen7.png b/evidencia/imagen7.png
new file mode 100644
index 0000000..9f4fd15
Binary files /dev/null and b/evidencia/imagen7.png differ
diff --git a/evidencia/mvn_install.log b/evidencia/mvn_install.log
new file mode 100644
index 0000000..fd230ff
--- /dev/null
+++ b/evidencia/mvn_install.log
@@ -0,0 +1,114 @@
+[INFO] Scanning for projects...
+[WARNING]
+[WARNING] Some problems were encountered while building the effective model for cl.zco:desafio3:jar:0.0.1-SNAPSHOT
+[WARNING] 'dependencies.dependency.systemPath' for Generador_Datos_Desafio_Tres:Generador_Datos_Desafio_Tres:jar should not point at files within the project directory, ${basedir}\lib\Generador_Datos_Desafio_Tres-1.0.0.jar will be unresolvable by dependent projects @ line 73, column 16
+[WARNING]
+[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
+[WARNING]
+[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
+[WARNING]
+[INFO]
+[INFO] --------------------------< cl.zco:desafio3 >---------------------------
+[INFO] Building desafio3 0.0.1-SNAPSHOT
+[INFO] --------------------------------[ jar ]---------------------------------
+[INFO]
+[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ desafio3 ---
+[INFO] Using 'UTF-8' encoding to copy filtered resources.
+[INFO] Using 'UTF-8' encoding to copy filtered properties files.
+[INFO] Copying 2 resources
+[INFO]
+[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ desafio3 ---
+[INFO] Nothing to compile - all classes are up to date
+[INFO]
+[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ desafio3 ---
+[INFO] Using 'UTF-8' encoding to copy filtered resources.
+[INFO] Using 'UTF-8' encoding to copy filtered properties files.
+[INFO] skip non existing resourceDirectory C:\develop\wks_previred\desafio3\src\test\resources
+[INFO]
+[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ desafio3 ---
+[INFO] Nothing to compile - all classes are up to date
+[INFO]
+[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ desafio3 ---
+[INFO]
+[INFO] -------------------------------------------------------
+[INFO] T E S T S
+[INFO] -------------------------------------------------------
+[INFO] Running cl.zco.desafio3.Desafio3ApplicationTests
+15:59:58.636 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating CacheAwareContextLoaderDelegate from class [org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate]
+15:59:58.648 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating BootstrapContext using constructor [public org.springframework.test.context.support.DefaultBootstrapContext(java.lang.Class,org.springframework.test.context.CacheAwareContextLoaderDelegate)]
+15:59:58.698 [main] DEBUG org.springframework.test.context.BootstrapUtils - Instantiating TestContextBootstrapper for test class [cl.zco.desafio3.Desafio3ApplicationTests] from class [org.springframework.boot.test.context.SpringBootTestContextBootstrapper]
+15:59:58.711 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Neither @ContextConfiguration nor @ContextHierarchy found for test class [cl.zco.desafio3.Desafio3ApplicationTests], using SpringBootContextLoader
+15:59:58.716 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [cl.zco.desafio3.Desafio3ApplicationTests]: class path resource [cl/zco/desafio3/Desafio3ApplicationTests-context.xml] does not exist
+15:59:58.716 [main] DEBUG org.springframework.test.context.support.AbstractContextLoader - Did not detect default resource location for test class [cl.zco.desafio3.Desafio3ApplicationTests]: class path resource [cl/zco/desafio3/Desafio3ApplicationTestsContext.groovy] does not exist
+15:59:58.717 [main] INFO org.springframework.test.context.support.AbstractContextLoader - Could not detect default resource locations for test class [cl.zco.desafio3.Desafio3ApplicationTests]: no resource found for suffixes {-context.xml, Context.groovy}.
+15:59:58.718 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils - Could not detect default configuration classes for test class [cl.zco.desafio3.Desafio3ApplicationTests]: Desafio3ApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
+15:59:58.808 [main] DEBUG org.springframework.test.context.support.ActiveProfilesUtils - Could not find an 'annotation declaring class' for annotation type [org.springframework.test.context.ActiveProfiles] and class [cl.zco.desafio3.Desafio3ApplicationTests]
+15:59:58.915 [main] DEBUG org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider - Identified candidate component class: file [C:\develop\wks_previred\desafio3\target\classes\cl\zco\desafio3\Desafio3Application.class]
+15:59:58.917 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Found @SpringBootConfiguration cl.zco.desafio3.Desafio3Application for test class cl.zco.desafio3.Desafio3ApplicationTests
+15:59:59.153 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - @TestExecutionListeners is not present for class [cl.zco.desafio3.Desafio3ApplicationTests]: using defaults.
+15:59:59.155 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Loaded default TestExecutionListener class names from location [META-INF/spring.factories]: [org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener, org.springframework.test.context.web.ServletTestExecutionListener, org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener, org.springframework.test.context.event.ApplicationEventsTestExecutionListener, org.springframework.test.context.support.DependencyInjectionTestExecutionListener, org.springframework.test.context.support.DirtiesContextTestExecutionListener, org.springframework.test.context.transaction.TransactionalTestExecutionListener, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener, org.springframework.test.context.event.EventPublishingTestExecutionListener]
+15:59:59.190 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required dependencies available. Offending class: [javax/servlet/ServletContext]
+15:59:59.195 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.context.transaction.TransactionalTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required dependencies available. Offending class: [org/springframework/transaction/interceptor/TransactionAttributeSource]
+15:59:59.196 [main] DEBUG org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Skipping candidate TestExecutionListener [org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener] due to a missing dependency. Specify custom listener classes or make the default listener classes and their required dependencies available. Offending class: [org/springframework/transaction/interceptor/TransactionAttribute]
+15:59:59.197 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper - Using TestExecutionListeners: [org.springframework.test.context.support.DirtiesContextBeforeModesTestExecutionListener@dfddc9a, org.springframework.test.context.event.ApplicationEventsTestExecutionListener@4b9df8a, org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener@5e8ac0e1, org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@aafcffa, org.springframework.test.context.support.DirtiesContextTestExecutionListener@6955cb39, org.springframework.test.context.event.EventPublishingTestExecutionListener@235a0c16, org.springframework.boot.test.mock.mockito.ResetMocksTestExecutionListener@2b5f4d54, org.springframework.boot.test.autoconfigure.restdocs.RestDocsTestExecutionListener@5f7b97da, org.springframework.boot.test.autoconfigure.web.client.MockRestServiceServerResetTestExecutionListener@18b0930f, org.springframework.boot.test.autoconfigure.web.servlet.MockMvcPrintOnlyOnFailureTestExecutionListener@6b7906b3, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverTestExecutionListener@3a1dd365, org.springframework.boot.test.autoconfigure.webservices.client.MockWebServiceServerTestExecutionListener@395b56bb]
+15:59:59.206 [main] DEBUG org.springframework.test.context.support.AbstractDirtiesContextTestExecutionListener - Before test class: context [DefaultTestContext@5b529706 testClass = Desafio3ApplicationTests, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@63fdab07 testClass = Desafio3ApplicationTests, locations = '{}', classes = '{class cl.zco.desafio3.Desafio3Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@6aa8e115, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@5f20155b, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@352ff4da, org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7a3793c7, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@a37aefe, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@6580cfdd], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map[[empty]]], class annotated with @DirtiesContext [false] with mode [null].
+15:59:59.243 [main] DEBUG org.springframework.test.context.support.DependencyInjectionTestExecutionListener - Performing dependency injection for test context [[DefaultTestContext@5b529706 testClass = Desafio3ApplicationTests, testInstance = cl.zco.desafio3.Desafio3ApplicationTests@1ae67cad, testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@63fdab07 testClass = Desafio3ApplicationTests, locations = '{}', classes = '{class cl.zco.desafio3.Desafio3Application}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@6aa8e115, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@5f20155b, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@352ff4da, org.springframework.boot.test.autoconfigure.actuate.metrics.MetricsExportContextCustomizerFactory$DisableMetricExportContextCustomizer@7a3793c7, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@a37aefe, org.springframework.boot.test.context.SpringBootTestArgs@1, org.springframework.boot.test.context.SpringBootTestWebEnvironment@6580cfdd], contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.event.ApplicationEventsTestExecutionListener.recordApplicationEvents' -> false]]].
+
+ . ____ _ __ _ _
+ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
+( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
+ \\/ ___)| |_)| | | | | || (_| | ) ) ) )
+ ' |____| .__|_| |_|_| |_\__, | / / / /
+ =========|_|==============|___/=/_/_/_/
+ :: Spring Boot :: (v2.6.6)
+
+2022-04-20 15:59:59.953 INFO 58964 --- [ main] c.zco.desafio3.Desafio3ApplicationTests : Starting Desafio3ApplicationTests using Java 17.0.2 on DESKTOP-T3DQ8O1 with PID 58964 (started by Patricio Angel in C:\develop\wks_previred\desafio3)
+2022-04-20 15:59:59.956 INFO 58964 --- [ main] c.zco.desafio3.Desafio3ApplicationTests : No active profile set, falling back to 1 default profile: "default"
+2022-04-20 16:00:00.683 INFO 58964 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation is not supported on static fields: private static org.springframework.context.ApplicationContext cl.zco.desafio3.Proveedor.contexto
+2022-04-20 16:00:01.197 WARN 58964 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
+2022-04-20 16:00:01.332 INFO 58964 --- [ main] c.zco.desafio3.Desafio3ApplicationTests : Started Desafio3ApplicationTests in 1.981 seconds (JVM running for 3.802)
+
+ . ____ _ __ _ _
+ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
+( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
+ \\/ ___)| |_)| | | | | || (_| | ) ) ) )
+ ' |____| .__|_| |_|_| |_\__, | / / / /
+ =========|_|==============|___/=/_/_/_/
+ :: Spring Boot :: (v2.6.6)
+
+2022-04-20 16:00:02.189 INFO 58964 --- [ main] cl.zco.desafio3.Desafio3Application : Starting Desafio3Application using Java 17.0.2 on DESKTOP-T3DQ8O1 with PID 58964 (started by Patricio Angel in C:\develop\wks_previred\desafio3)
+2022-04-20 16:00:02.190 INFO 58964 --- [ main] cl.zco.desafio3.Desafio3Application : No active profile set, falling back to 1 default profile: "default"
+2022-04-20 16:00:02.353 INFO 58964 --- [ main] f.a.AutowiredAnnotationBeanPostProcessor : Autowired annotation is not supported on static fields: private static org.springframework.context.ApplicationContext cl.zco.desafio3.Proveedor.contexto
+2022-04-20 16:00:02.416 WARN 58964 --- [ main] ion$DefaultTemplateResolverConfiguration : Cannot find template location: classpath:/templates/ (please add some templates or check your Thymeleaf configuration)
+2022-04-20 16:00:02.440 INFO 58964 --- [ main] cl.zco.desafio3.Desafio3Application : Started Desafio3Application in 0.297 seconds (JVM running for 4.911)
+[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.441 s - in cl.zco.desafio3.Desafio3ApplicationTests
+[INFO] Running cl.zco.desafio3.negocio.ConsumirJarPreviredTest
+[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.438 s - in cl.zco.desafio3.negocio.ConsumirJarPreviredTest
+[INFO] Running cl.zco.desafio3.negocio.ManejadorArchivosTest
+2022-04-20 16:00:03.539 ERROR 58964 --- [ main] c.z.desafio3.negocio.ManejadorArchivos : null
+[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 s - in cl.zco.desafio3.negocio.ManejadorArchivosTest
+[INFO] Running cl.zco.desafio3.util.DtoTest
+[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 s - in cl.zco.desafio3.util.DtoTest
+[INFO] Running cl.zco.desafio3.util.UtilTest
+[INFO] Tests run: 8, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s - in cl.zco.desafio3.util.UtilTest
+[INFO]
+[INFO] Results:
+[INFO]
+[INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0
+[INFO]
+[INFO]
+[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ desafio3 ---
+[INFO] Building jar: C:\develop\wks_previred\desafio3\target\desafio3-0.0.1-SNAPSHOT.jar
+[INFO]
+[INFO] --- spring-boot-maven-plugin:2.6.6:repackage (repackage) @ desafio3 ---
+[INFO] Replacing main artifact with repackaged archive
+[INFO]
+[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ desafio3 ---
+[INFO] Installing C:\develop\wks_previred\desafio3\target\desafio3-0.0.1-SNAPSHOT.jar to C:\Users\Patricio Angel\.m2\repository\cl\zco\desafio3\0.0.1-SNAPSHOT\desafio3-0.0.1-SNAPSHOT.jar
+[INFO] Installing C:\develop\wks_previred\desafio3\pom.xml to C:\Users\Patricio Angel\.m2\repository\cl\zco\desafio3\0.0.1-SNAPSHOT\desafio3-0.0.1-SNAPSHOT.pom
+[INFO] ------------------------------------------------------------------------
+[INFO] BUILD SUCCESS
+[INFO] ------------------------------------------------------------------------
+[INFO] Total time: 12.360 s
+[INFO] Finished at: 2022-04-20T16:00:06-04:00
+[INFO] ------------------------------------------------------------------------
diff --git a/evidencia/valores.json b/evidencia/valores.json
new file mode 100644
index 0000000..f60c529
--- /dev/null
+++ b/evidencia/valores.json
@@ -0,0 +1,406 @@
+{
+ "inicio": "2010-03-08",
+ "fin": "2013-07-15",
+ "UFs": [
+ {
+ "fecha": "2013-07-15",
+ "dato": "22879.14"
+ },
+ {
+ "fecha": "2013-07-14",
+ "dato": "22874.73"
+ },
+ {
+ "fecha": "2013-07-13",
+ "dato": "22870.32"
+ },
+ {
+ "fecha": "2013-07-12",
+ "dato": "22865.9"
+ },
+ {
+ "fecha": "2013-07-11",
+ "dato": "22861.49"
+ },
+ {
+ "fecha": "2013-07-10",
+ "dato": "22857.08"
+ },
+ {
+ "fecha": "2013-07-09",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-08",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-07",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-06",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-05",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-04",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-03",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-02",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-07-01",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-30",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-29",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-28",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-27",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-26",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-25",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-24",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-23",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-22",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-21",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-20",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-19",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-18",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-17",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-16",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-15",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-14",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-13",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-12",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-11",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-10",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-09",
+ "dato": "22852.67"
+ },
+ {
+ "fecha": "2013-06-08",
+ "dato": "22856.37"
+ },
+ {
+ "fecha": "2013-06-07",
+ "dato": "22860.06"
+ },
+ {
+ "fecha": "2013-06-06",
+ "dato": "22863.76"
+ },
+ {
+ "fecha": "2013-06-05",
+ "dato": "22867.46"
+ },
+ {
+ "fecha": "2013-06-04",
+ "dato": "22871.16"
+ },
+ {
+ "fecha": "2013-06-03",
+ "dato": "22874.85"
+ },
+ {
+ "fecha": "2013-06-02",
+ "dato": "22878.55"
+ },
+ {
+ "fecha": "2013-06-01",
+ "dato": "22882.25"
+ },
+ {
+ "fecha": "2013-05-31",
+ "dato": "22885.95"
+ },
+ {
+ "fecha": "2013-05-30",
+ "dato": "22889.65"
+ },
+ {
+ "fecha": "2013-05-29",
+ "dato": "22893.36"
+ },
+ {
+ "fecha": "2013-05-28",
+ "dato": "22897.06"
+ },
+ {
+ "fecha": "2013-05-27",
+ "dato": "22900.76"
+ },
+ {
+ "fecha": "2013-05-26",
+ "dato": "22904.46"
+ },
+ {
+ "fecha": "2013-05-25",
+ "dato": "22908.17"
+ },
+ {
+ "fecha": "2013-05-24",
+ "dato": "22911.87"
+ },
+ {
+ "fecha": "2013-05-23",
+ "dato": "22915.58"
+ },
+ {
+ "fecha": "2013-05-22",
+ "dato": "22919.28"
+ },
+ {
+ "fecha": "2013-05-21",
+ "dato": "22922.99"
+ },
+ {
+ "fecha": "2013-05-20",
+ "dato": "22926.7"
+ },
+ {
+ "fecha": "2013-05-19",
+ "dato": "22930.4"
+ },
+ {
+ "fecha": "2013-05-18",
+ "dato": "22934.11"
+ },
+ {
+ "fecha": "2013-05-17",
+ "dato": "22937.82"
+ },
+ {
+ "fecha": "2013-05-16",
+ "dato": "22941.53"
+ },
+ {
+ "fecha": "2013-05-15",
+ "dato": "22945.24"
+ },
+ {
+ "fecha": "2013-05-14",
+ "dato": "22948.95"
+ },
+ {
+ "fecha": "2013-05-13",
+ "dato": "22952.66"
+ },
+ {
+ "fecha": "2013-05-12",
+ "dato": "22956.37"
+ },
+ {
+ "fecha": "2013-05-11",
+ "dato": "22960.08"
+ },
+ {
+ "fecha": "2013-05-10",
+ "dato": "22963.8"
+ },
+ {
+ "fecha": "2013-05-09",
+ "dato": "22967.51"
+ },
+ {
+ "fecha": "2013-05-08",
+ "dato": "22964.46"
+ },
+ {
+ "fecha": "2013-05-07",
+ "dato": "22961.4"
+ },
+ {
+ "fecha": "2013-05-06",
+ "dato": "22958.35"
+ },
+ {
+ "fecha": "2013-05-05",
+ "dato": "22955.29"
+ },
+ {
+ "fecha": "2013-05-04",
+ "dato": "22952.24"
+ },
+ {
+ "fecha": "2013-05-03",
+ "dato": "22949.18"
+ },
+ {
+ "fecha": "2013-05-02",
+ "dato": "22946.13"
+ },
+ {
+ "fecha": "2013-05-01",
+ "dato": "22943.08"
+ },
+ {
+ "fecha": "2013-04-30",
+ "dato": "22940.02"
+ },
+ {
+ "fecha": "2013-04-29",
+ "dato": "22936.97"
+ },
+ {
+ "fecha": "2013-04-28",
+ "dato": "22933.92"
+ },
+ {
+ "fecha": "2013-04-27",
+ "dato": "22930.87"
+ },
+ {
+ "fecha": "2013-04-26",
+ "dato": "22927.82"
+ },
+ {
+ "fecha": "2013-04-25",
+ "dato": "22924.77"
+ },
+ {
+ "fecha": "2013-04-24",
+ "dato": "22921.72"
+ },
+ {
+ "fecha": "2013-04-23",
+ "dato": "22918.67"
+ },
+ {
+ "fecha": "2013-04-22",
+ "dato": "22915.62"
+ },
+ {
+ "fecha": "2013-04-21",
+ "dato": "22912.57"
+ },
+ {
+ "fecha": "2013-04-20",
+ "dato": "22909.52"
+ },
+ {
+ "fecha": "2013-04-19",
+ "dato": "22906.47"
+ },
+ {
+ "fecha": "2013-04-18",
+ "dato": "22903.42"
+ },
+ {
+ "fecha": "2013-04-17",
+ "dato": "22900.38"
+ },
+ {
+ "fecha": "2013-04-16",
+ "dato": "22897.33"
+ },
+ {
+ "fecha": "2013-04-15",
+ "dato": "22894.28"
+ },
+ {
+ "fecha": "2013-04-14",
+ "dato": "22891.24"
+ },
+ {
+ "fecha": "2013-04-13",
+ "dato": "22888.19"
+ },
+ {
+ "fecha": "2013-04-12",
+ "dato": "22885.14"
+ },
+ {
+ "fecha": "2013-04-11",
+ "dato": "22882.1"
+ },
+ {
+ "fecha": "2013-04-10",
+ "dato": "22879.05"
+ },
+ {
+ "fecha": "2013-04-09",
+ "dato": "22876.01"
+ },
+ {
+ "fecha": "2013-04-08",
+ "dato": "22875.28"
+ },
+ {
+ "fecha": "2013-04-07",
+ "dato": "22874.54"
+ }
+ ]
+}
diff --git a/files/valores.json b/files/valores.json
new file mode 100644
index 0000000..dfabc42
--- /dev/null
+++ b/files/valores.json
@@ -0,0 +1,406 @@
+{
+ "inicio": "2010-11-23",
+ "fin": "2012-10-25",
+ "UFs": [
+ {
+ "fecha": "2012-10-25",
+ "dato": "22697.76"
+ },
+ {
+ "fecha": "2012-10-24",
+ "dato": "22691.92"
+ },
+ {
+ "fecha": "2012-10-23",
+ "dato": "22686.09"
+ },
+ {
+ "fecha": "2012-10-22",
+ "dato": "22680.26"
+ },
+ {
+ "fecha": "2012-10-21",
+ "dato": "22674.43"
+ },
+ {
+ "fecha": "2012-10-20",
+ "dato": "22668.6"
+ },
+ {
+ "fecha": "2012-10-19",
+ "dato": "22662.78"
+ },
+ {
+ "fecha": "2012-10-18",
+ "dato": "22656.95"
+ },
+ {
+ "fecha": "2012-10-17",
+ "dato": "22651.13"
+ },
+ {
+ "fecha": "2012-10-16",
+ "dato": "22645.31"
+ },
+ {
+ "fecha": "2012-10-15",
+ "dato": "22639.49"
+ },
+ {
+ "fecha": "2012-10-14",
+ "dato": "22633.67"
+ },
+ {
+ "fecha": "2012-10-13",
+ "dato": "22627.85"
+ },
+ {
+ "fecha": "2012-10-12",
+ "dato": "22622.04"
+ },
+ {
+ "fecha": "2012-10-11",
+ "dato": "22616.22"
+ },
+ {
+ "fecha": "2012-10-10",
+ "dato": "22610.41"
+ },
+ {
+ "fecha": "2012-10-09",
+ "dato": "22604.6"
+ },
+ {
+ "fecha": "2012-10-08",
+ "dato": "22603.09"
+ },
+ {
+ "fecha": "2012-10-07",
+ "dato": "22601.59"
+ },
+ {
+ "fecha": "2012-10-06",
+ "dato": "22600.08"
+ },
+ {
+ "fecha": "2012-10-05",
+ "dato": "22598.58"
+ },
+ {
+ "fecha": "2012-10-04",
+ "dato": "22597.07"
+ },
+ {
+ "fecha": "2012-10-03",
+ "dato": "22595.57"
+ },
+ {
+ "fecha": "2012-10-02",
+ "dato": "22594.06"
+ },
+ {
+ "fecha": "2012-10-01",
+ "dato": "22592.56"
+ },
+ {
+ "fecha": "2012-09-30",
+ "dato": "22591.05"
+ },
+ {
+ "fecha": "2012-09-29",
+ "dato": "22589.55"
+ },
+ {
+ "fecha": "2012-09-28",
+ "dato": "22588.04"
+ },
+ {
+ "fecha": "2012-09-27",
+ "dato": "22586.54"
+ },
+ {
+ "fecha": "2012-09-26",
+ "dato": "22585.04"
+ },
+ {
+ "fecha": "2012-09-25",
+ "dato": "22583.53"
+ },
+ {
+ "fecha": "2012-09-24",
+ "dato": "22582.03"
+ },
+ {
+ "fecha": "2012-09-23",
+ "dato": "22580.52"
+ },
+ {
+ "fecha": "2012-09-22",
+ "dato": "22579.02"
+ },
+ {
+ "fecha": "2012-09-21",
+ "dato": "22577.52"
+ },
+ {
+ "fecha": "2012-09-20",
+ "dato": "22576.01"
+ },
+ {
+ "fecha": "2012-09-19",
+ "dato": "22574.51"
+ },
+ {
+ "fecha": "2012-09-18",
+ "dato": "22573.01"
+ },
+ {
+ "fecha": "2012-09-17",
+ "dato": "22571.5"
+ },
+ {
+ "fecha": "2012-09-16",
+ "dato": "22570.0"
+ },
+ {
+ "fecha": "2012-09-15",
+ "dato": "22568.5"
+ },
+ {
+ "fecha": "2012-09-14",
+ "dato": "22566.99"
+ },
+ {
+ "fecha": "2012-09-13",
+ "dato": "22565.49"
+ },
+ {
+ "fecha": "2012-09-12",
+ "dato": "22563.99"
+ },
+ {
+ "fecha": "2012-09-11",
+ "dato": "22562.49"
+ },
+ {
+ "fecha": "2012-09-10",
+ "dato": "22560.98"
+ },
+ {
+ "fecha": "2012-09-09",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-08",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-07",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-06",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-05",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-04",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-03",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-02",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-09-01",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-31",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-30",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-29",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-28",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-27",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-26",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-25",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-24",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-23",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-22",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-21",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-20",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-19",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-18",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-17",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-16",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-15",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-14",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-13",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-12",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-11",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-10",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-09",
+ "dato": "22559.48"
+ },
+ {
+ "fecha": "2012-08-08",
+ "dato": "22561.66"
+ },
+ {
+ "fecha": "2012-08-07",
+ "dato": "22563.85"
+ },
+ {
+ "fecha": "2012-08-06",
+ "dato": "22566.04"
+ },
+ {
+ "fecha": "2012-08-05",
+ "dato": "22568.23"
+ },
+ {
+ "fecha": "2012-08-04",
+ "dato": "22570.41"
+ },
+ {
+ "fecha": "2012-08-03",
+ "dato": "22572.6"
+ },
+ {
+ "fecha": "2012-08-02",
+ "dato": "22574.79"
+ },
+ {
+ "fecha": "2012-08-01",
+ "dato": "22576.98"
+ },
+ {
+ "fecha": "2012-07-31",
+ "dato": "22579.16"
+ },
+ {
+ "fecha": "2012-07-30",
+ "dato": "22581.35"
+ },
+ {
+ "fecha": "2012-07-29",
+ "dato": "22583.54"
+ },
+ {
+ "fecha": "2012-07-28",
+ "dato": "22585.73"
+ },
+ {
+ "fecha": "2012-07-27",
+ "dato": "22587.92"
+ },
+ {
+ "fecha": "2012-07-26",
+ "dato": "22590.11"
+ },
+ {
+ "fecha": "2012-07-25",
+ "dato": "22592.3"
+ },
+ {
+ "fecha": "2012-07-24",
+ "dato": "22594.49"
+ },
+ {
+ "fecha": "2012-07-23",
+ "dato": "22596.68"
+ },
+ {
+ "fecha": "2012-07-22",
+ "dato": "22598.87"
+ },
+ {
+ "fecha": "2012-07-21",
+ "dato": "22601.06"
+ },
+ {
+ "fecha": "2012-07-20",
+ "dato": "22603.25"
+ },
+ {
+ "fecha": "2012-07-19",
+ "dato": "22605.44"
+ },
+ {
+ "fecha": "2012-07-18",
+ "dato": "22607.63"
+ }
+ ]
+}
diff --git a/jar/desafio3-0.0.1-SNAPSHOT.jar b/jar/desafio3-0.0.1-SNAPSHOT.jar
new file mode 100644
index 0000000..635e9cc
Binary files /dev/null and b/jar/desafio3-0.0.1-SNAPSHOT.jar differ
diff --git a/jar/desafio3-0.0.1-SNAPSHOT.jar.original b/jar/desafio3-0.0.1-SNAPSHOT.jar.original
new file mode 100644
index 0000000..9168191
Binary files /dev/null and b/jar/desafio3-0.0.1-SNAPSHOT.jar.original differ
diff --git a/mvnw b/mvnw
new file mode 100644
index 0000000..8a8fb22
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,316 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /usr/local/etc/mavenrc ] ; then
+ . /usr/local/etc/mavenrc
+ fi
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`\\unset -f command; \\command -v java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ if [ -n "$MVNW_REPOURL" ]; then
+ jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+ fi
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+ if $cygwin; then
+ wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+ fi
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+ fi
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ curl -o "$wrapperJarPath" "$jarUrl" -f
+ else
+ curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+ fi
+
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ # For Cygwin, switch paths to Windows format before running javac
+ if $cygwin; then
+ javaClass=`cygpath --path --windows "$javaClass"`
+ fi
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ $MAVEN_DEBUG_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" \
+ "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..1d8ab01
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,188 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+
+FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Found %WRAPPER_JAR%
+ )
+) else (
+ if not "%MVNW_REPOURL%" == "" (
+ SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+ )
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ )
+
+ powershell -Command "&{"^
+ "$webclient = new-object System.Net.WebClient;"^
+ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+ "}"^
+ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+ "}"
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Finished downloading %WRAPPER_JAR%
+ )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% ^
+ %JVM_CONFIG_MAVEN_PROPS% ^
+ %MAVEN_OPTS% ^
+ %MAVEN_DEBUG_OPTS% ^
+ -classpath %WRAPPER_JAR% ^
+ "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
+ %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%"=="on" pause
+
+if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
+
+cmd /C exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..97f09af
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,104 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.6
+
+
+ cl.zco
+ desafio3
+ 0.0.1-SNAPSHOT
+ desafio3
+ Desafio 3 previred
+
+ 1.8
+ 1.6.4
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ com.google.code.gson
+ gson
+ 2.9.0
+
+
+ commons-collections
+ commons-collections
+ 3.2.1
+
+
+ commons-beanutils
+ commons-beanutils
+ 1.8.3
+
+
+ org.apache.logging.log4j
+ log4j-spring-boot
+ 2.17.2
+
+
+ org.mockito
+ mockito-all
+ 2.0.2-beta
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ Generador_Datos_Desafio_Tres
+ Generador_Datos_Desafio_Tres
+ system
+ 1.0
+ ${basedir}\lib\Generador_Datos_Desafio_Tres-1.0.0.jar
+
+
+ org.powermock
+ powermock-module-junit4
+ ${powermock.version}
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+ src/test/java
+
+
+ src/main/resources
+
+ **/*.jar
+
+
+
+
+
+
diff --git a/resumen/cobertura/desafio3/index.html b/resumen/cobertura/desafio3/index.html
new file mode 100644
index 0000000..d3272ea
--- /dev/null
+++ b/resumen/cobertura/desafio3/index.html
@@ -0,0 +1 @@
+desafio3
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoJsonDTO.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoJsonDTO.html
new file mode 100644
index 0000000..8d1b35c
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoJsonDTO.html
@@ -0,0 +1 @@
+FormatoJsonDTO
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoJsonDTO.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoJsonDTO.java.html
new file mode 100644
index 0000000..ec6eed8
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoJsonDTO.java.html
@@ -0,0 +1,82 @@
+FormatoJsonDTO.java
package cl.zco.desafio3.dto;
+
+import java.util.List;
+
+/**
+ * Clase FormatoJsonDTO.
+ * @author Patricio Angel
+ */
+public class FormatoJsonDTO {
+
+ /** The inicio. */
+ private String inicio;
+
+ /** The fin. */
+ private String fin;
+
+ /** The U fs. */
+ private List<FormatoUfJsonDTO> UFs;
+
+ /**
+ * Instantiates a new formato json DTO.
+ */
+ public FormatoJsonDTO() {
+ super();
+ }
+
+ /**
+ * Gets the inicio.
+ *
+ * @return the inicio
+ */
+ public String getInicio() {
+ return inicio;
+ }
+
+ /**
+ * Sets the inicio.
+ *
+ * @param inicio the new inicio
+ */
+ public void setInicio(String inicio) {
+ this.inicio = inicio;
+ }
+
+ /**
+ * Gets the fin.
+ *
+ * @return the fin
+ */
+ public String getFin() {
+ return fin;
+ }
+
+ /**
+ * Sets the fin.
+ *
+ * @param fin the new fin
+ */
+ public void setFin(String fin) {
+ this.fin = fin;
+ }
+
+ /**
+ * Gets the u fs.
+ *
+ * @return the u fs
+ */
+ public List<FormatoUfJsonDTO> getUFs() {
+ return UFs;
+ }
+
+ /**
+ * Sets the u fs.
+ *
+ * @param uFs the new u fs
+ */
+ public void setUFs(List<FormatoUfJsonDTO> uFs) {
+ UFs = uFs;
+ }
+
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoUfJsonDTO.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoUfJsonDTO.html
new file mode 100644
index 0000000..850e1c2
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoUfJsonDTO.html
@@ -0,0 +1 @@
+FormatoUfJsonDTO
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoUfJsonDTO.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoUfJsonDTO.java.html
new file mode 100644
index 0000000..c578d93
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/FormatoUfJsonDTO.java.html
@@ -0,0 +1,63 @@
+FormatoUfJsonDTO.java
package cl.zco.desafio3.dto;
+
+/**
+ * Clase FormatoUfJsonDTO.
+ * @author Patricio Angel
+ */
+public class FormatoUfJsonDTO {
+
+ /** The fecha. */
+ private String fecha;
+
+ /** The dato. */
+ private String dato;
+
+ /**
+ * Instantiates a new formato uf json DTO.
+ *
+ * @param fecha the fecha
+ * @param dato the dato
+ */
+ public FormatoUfJsonDTO(String fecha, String dato) {
+ this.fecha = fecha;
+ this.dato = dato;
+ }
+
+ /**
+ * Gets the fecha.
+ *
+ * @return the fecha
+ */
+ public String getFecha() {
+ return fecha;
+ }
+
+ /**
+ * Sets the fecha.
+ *
+ * @param fecha the new fecha
+ */
+ public void setFecha(String fecha) {
+ this.fecha = fecha;
+ }
+
+ /**
+ * Gets the dato.
+ *
+ * @return the dato
+ */
+ public String getDato() {
+ return dato;
+ }
+
+ /**
+ * Sets the dato.
+ *
+ * @param dato the new dato
+ */
+ public void setDato(String dato) {
+ this.dato = dato;
+ }
+
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/index.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/index.html
new file mode 100644
index 0000000..6709825
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/index.html
@@ -0,0 +1 @@
+cl.zco.desafio3.dto
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/index.source.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/index.source.html
new file mode 100644
index 0000000..a51e55c
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.dto/index.source.html
@@ -0,0 +1 @@
+cl.zco.desafio3.dto
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ConsumirJarPrevired.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ConsumirJarPrevired.html
new file mode 100644
index 0000000..9429fad
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ConsumirJarPrevired.html
@@ -0,0 +1 @@
+ConsumirJarPrevired
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ConsumirJarPrevired.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ConsumirJarPrevired.java.html
new file mode 100644
index 0000000..d9b4541
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ConsumirJarPrevired.java.html
@@ -0,0 +1,122 @@
+ConsumirJarPrevired.java
package cl.zco.desafio3.negocio;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.previred.desafio.tres.uf.DatosUf;
+import com.previred.desafio.tres.uf.Valores;
+import com.previred.desafio.tres.uf.vo.Uf;
+import com.previred.desafio.tres.uf.vo.Ufs;
+
+import cl.zco.desafio3.Configuracion;
+import cl.zco.desafio3.Proveedor;
+import cl.zco.desafio3.util.Constantes;
+import cl.zco.desafio3.util.Util;
+
+/**
+ * The Class ConsumirJarPrevired.
+ * @author Patricio Angel
+ */
+public class ConsumirJarPrevired {
+
+ /** The log. */
+ private static Logger log = LogManager.getLogger(ConsumirJarPrevired.class);
+
+ /** The max elementos json. */
+ private int maxElementosJson = 0;
+
+ /**
+ * Iniciar.
+ * @return true, if successful
+ */
+ public boolean iniciar() {
+ cargarConfiguraciones();
+ return obtenerValoresUF();
+ }
+
+ private void cargarConfiguraciones() {
+ maxElementosJson = Proveedor.getContexto().getBean(Configuracion.class).getCantidadjson();
+ }
+
+ /**
+ * Metodo que obtiene los valores de las UF.
+ *
+ * @return true, if successful
+ */
+ public boolean obtenerValoresUF() {
+ boolean resultado = false;
+
+ // Punto 1: se obtienen los valores y se consume el jar.
+ Valores valores = new Valores();
+ Ufs ufs = valores.getRango();
+ List<Uf> listUf = new ArrayList<>( ufs.getUfs());
+
+ /**
+ * Punto 2: el algoritmo que entiendo que hay que hacer es llenar las fechas faltantes
+ * pero siento que es innesacio hacer un algoritmo para validar si está o no dado que
+ * el singleton que se llena al inicio ya tiene los valores, entonces con solo obtener
+ * todo entre el rango deberia bastar.
+ */
+ // Punto 3: aqui se utiliza el .getUfs() este trae todos los valores.
+ List<Uf> listUfRango = DatosUf.getInstance().getUfs(ufs.getInicio(), ufs.getFin());
+ boolean igualCantidad = Util.validacionElementosEnRango(listUf, listUfRango);
+
+ /**
+ * Aqui podemos hacer de 2 maneras para agregar los que faltan entre el rango, una es con la lista
+ * tomar los extremos e ir consultando 1 a 1 y agreando si la fecha no esta, pero revisando es lo
+ * mismo traer la lista completa segun el rango y luego sobre esa lista ordenar.
+ * > Validacion: de igual manera se validará que los que se encontraron dentro del rango estén todos en
+ * el ultimo listado.
+ */
+ // Punto 4: se ordena de forma descendente
+ Util.clasificarColeccion(listUfRango, false, Constantes.ATRIB_FECHA);
+
+ if(igualCantidad) {
+ log.trace("Todos los elementos de getRange() estan en el listado final.");
+ resultado = true;
+ resultado &= generarCSV(ufs); //FORMATO 1 //TODO: Pendiente para una nueva version
+ resultado &= generarXML(ufs); //FORMATO 2 //TODO: Pendiente para una nueva version
+ resultado &= generarJson(ufs, listUfRango); //FORMATO 3
+ }
+
+ return resultado;
+ }
+
+ /**
+ * Metodo para generar los CSV
+ * @param ufs parametro de entrada con data de ufs
+ * @return boolean generacion exitosa
+ */
+ public boolean generarCSV(Ufs ufs) {
+ log.trace("Se comienza con la generacion del csv");
+ //TODO: solo era un formato de salida, asique queda pendiente.
+ return true;
+ }
+
+ /**
+ * Metodo para generar los XML
+ * @param ufs parametro de entrada con data de ufs
+ * @return boolean generacion exitosa
+ */
+ public boolean generarXML(Ufs ufs) {
+ log.trace("Se comienza con la generacion del xml");
+ //TODO: solo era un formato de salida, asique queda pendiente.
+ return true;
+ }
+
+ /**
+ * Metodo que genera el json.
+ * @param ufs parametro de entrada con data de ufs
+ * @param listUfRango the list uf rango
+ * @return boolean generacion exitosa
+ */
+ public boolean generarJson(Ufs ufs, List<Uf> listUfRango) {
+ log.trace("Se comienza con la generacion del json");
+ return ManejadorArchivos.crearFicheroJson(Util.convertiraJsonDTO(ufs,listUfRango,maxElementosJson), Constantes.RUTA_WKS_JSON);
+ }
+
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ManejadorArchivos.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ManejadorArchivos.html
new file mode 100644
index 0000000..04f98cf
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ManejadorArchivos.html
@@ -0,0 +1 @@
+ManejadorArchivos
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ManejadorArchivos.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ManejadorArchivos.java.html
new file mode 100644
index 0000000..fa769b0
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/ManejadorArchivos.java.html
@@ -0,0 +1,79 @@
+ManejadorArchivos.java
package cl.zco.desafio3.negocio;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.PrintWriter;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.core.NestedExceptionUtils;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import cl.zco.desafio3.dto.FormatoJsonDTO;
+import cl.zco.desafio3.util.Constantes;
+
+/**
+ * Clase que manejará los archivos.
+ * @author Patricio Angel
+ *
+ */
+public class ManejadorArchivos {
+
+ /** The log. */
+ private static Logger log = LogManager.getLogger(ManejadorArchivos.class);
+
+ /**
+ * Instantiates a new manejador archivos.
+ */
+ public ManejadorArchivos() {super();}
+
+ /**
+ * Crear fichero json.
+ * @param jsonDTO the json DTO
+ * @param destino the destino
+ * @return true, if successful
+ */
+ public static boolean crearFicheroJson(FormatoJsonDTO jsonDTO, String destino) {
+ return crearFicheroJson(jsonDTO, destino, false);
+ }
+
+ /**
+ * Crear fichero json.
+ * Metodo que crea el fichero valores.json.
+ * @param jsonDTO the json DTO
+ * @param destino the destino
+ * @param ignorarValidacion the ignorar validacion
+ * @return true, if successful
+ */
+ public static boolean crearFicheroJson(FormatoJsonDTO jsonDTO, String destino, boolean ignorarValidacion) {
+ try {
+ if (!ignorarValidacion && !existeCarpeta(destino)) {
+ destino = Constantes.RUTA_JAR_JSON;
+ }
+ PrintWriter out = new PrintWriter(destino);
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ String json = gson.toJson(jsonDTO);
+ json = json.replace(Constantes.SIMBOLO_NUEVA_LINEA, System.lineSeparator());
+ out.println(json);
+ out.close();
+ return true;
+ } catch (FileNotFoundException e) {
+ log.error(NestedExceptionUtils.getRootCause(e));
+ return false;
+ }
+ }
+
+ /**
+ * Existe carpeta.
+ * Metodo que valida que exista carpeta segun ruta
+ * @param ruta the ruta
+ * @return true, if successful
+ */
+ public static boolean existeCarpeta(String ruta) {
+ File file = new File(ruta);
+ return file.exists();
+ }
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/index.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/index.html
new file mode 100644
index 0000000..52da7b7
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/index.html
@@ -0,0 +1 @@
+cl.zco.desafio3.negocio
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/index.source.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/index.source.html
new file mode 100644
index 0000000..60e319d
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.negocio/index.source.html
@@ -0,0 +1 @@
+cl.zco.desafio3.negocio
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Constantes.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Constantes.html
new file mode 100644
index 0000000..f5257a0
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Constantes.html
@@ -0,0 +1 @@
+Constantes
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Constantes.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Constantes.java.html
new file mode 100644
index 0000000..14c4966
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Constantes.java.html
@@ -0,0 +1,65 @@
+Constantes.java
package cl.zco.desafio3.util;
+
+import java.util.HashMap;
+
+// TODO: Auto-generated Javadoc
+/**
+ * Clase que contiene las constantes.
+ * @author Patricio Angel
+ */
+public class Constantes {
+
+ /** The Constant FORMATO_DD_MMM_YYYY. */
+ public static final String FORMATO_DD_MMM_YYYY = "dd/MM/yyyy";
+
+ /** The Constant FORMATO_YYYY_MM_DD. */
+ public static final String FORMATO_YYYY_MM_DD = "yyyy-MM-dd";
+
+ /** The Constant RUTA_WKS_JSON. */
+ public static final String RUTA_WKS_JSON = "files/valores.json";
+
+ /** The Constant RUTA_JAR_JSON. */
+ public static final String RUTA_JAR_JSON = "C:\\files\\valores.json";
+
+ /** The Constant SIMBOLO_NUEVA_LINEA. */
+ public static final String SIMBOLO_NUEVA_LINEA = "\\n";
+
+ /** The Constant ATRIB_FECHA. */
+ public static final String ATRIB_FECHA = "fecha";
+
+ /** The Constant VACIO. */
+ public static final String VACIO = "";
+
+ /** The etiquetas. */
+ private static HashMap<String,String> etiquetas = new HashMap<>();
+
+ /**
+ * Bloque de codigo para inicializar las etiquetas.
+ */
+ static {
+ etiquetas.put("mensaj.portada.desa","Bienvenido al desafio número 3, el archivo json generado quedará en la ruta /files/valores.json");
+ etiquetas.put("mensaj.portada.jar","Bienvenido al desafio número 3, no olvidar tener creada la carpeta en C:\\files\\ para poder ver el json resultante");
+ etiquetas.put("mensaj.final.ok.desa","Se ha creado correctamente el archivo en /files/valores.json");
+ etiquetas.put("mensaj.final.ok.jar","Se ha creado correctamente el archivo en C:\\files\\valores.json");
+ etiquetas.put("mensaj.final.error","El proceso de creación a fallado, intente nuevamente");
+ etiquetas.put("mensaj.final.ok.ini","Se ha creado correctamente el archivo en ");
+ }
+
+ /**
+ * Instantiates a new constantes.
+ */
+ public Constantes() {super();}
+
+ /**
+ * Metodo que obtiene la etiqueta mapeaa
+ * (alternativa rapida concentrar todas las etiquetas, la idea es luego pasar estos codigo
+ * de etiquetas a i18).
+ *
+ * @param codigo the codigo
+ * @return the string
+ */
+ public static String obtenerEtiqueta(String codigo) {
+ return etiquetas.get(codigo) == null ? VACIO : etiquetas.get(codigo);
+ }
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Util.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Util.html
new file mode 100644
index 0000000..db403bc
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Util.html
@@ -0,0 +1 @@
+Util
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Util.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Util.java.html
new file mode 100644
index 0000000..1867f18
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/Util.java.html
@@ -0,0 +1,143 @@
+Util.java
package cl.zco.desafio3.util;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import javax.swing.JOptionPane;
+
+import org.apache.commons.beanutils.BeanComparator;
+import org.apache.commons.collections.ComparatorUtils;
+import org.apache.commons.collections.comparators.NullComparator;
+import org.apache.commons.collections.comparators.ReverseComparator;
+
+import com.previred.desafio.tres.uf.vo.Uf;
+import com.previred.desafio.tres.uf.vo.Ufs;
+
+import cl.zco.desafio3.dto.FormatoJsonDTO;
+import cl.zco.desafio3.dto.FormatoUfJsonDTO;
+
+// TODO: Auto-generated Javadoc
+/**
+ * Clase que contiene las utilidades del aplicativo.
+ */
+public class Util {
+
+ /**
+ * Metodo que obtiene la fecha y le da el formato recibido.
+ *
+ * @param fecha parametro con la fecha
+ * @param formato the formato
+ * @return String con la fecha de salida
+ */
+ public static String obtenerFechaFormato(Date fecha,String formato) {
+ SimpleDateFormat formatoFecha = new SimpleDateFormat(formato);
+ return formatoFecha.format(fecha);
+ }
+
+ /**
+ * Metodo que ordena lo que reciba y en base al nombre del atributo.
+ * @param <T> cualquier elemento
+ * @param list lista del elemento T
+ * @param esAscendente boolean que indica si la lista sera asc o desc
+ * @param bean este es el atributo de la clase por el cual se va a ordenar
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> void clasificarColeccion(List<T> list, boolean esAscendente, String... bean) {
+ Comparator<T> nullComparator = new NullComparator(esAscendente);
+ Collection<Comparator<T>> beanComparatorCollection = new ArrayList<>( bean.length);
+ for (int i = 0; i < bean.length; i++) {
+ beanComparatorCollection.add(new BeanComparator(bean[i], nullComparator));
+ }
+ Comparator<T> finalComparator = ComparatorUtils.chainedComparator(beanComparatorCollection);
+ if (!esAscendente) {
+ finalComparator = new ReverseComparator(finalComparator);
+ }
+ Collections.sort(list, finalComparator);
+ }
+
+ /**
+ * Convertir a json DTO.
+ * Metodo que convierte el ufs a formato json dto
+ *
+ * @param ufs the ufs
+ * @param listUfRango the list uf rango
+ * @param maxJson the max json
+ * @return the formato json DTO
+ */
+ public static FormatoJsonDTO convertiraJsonDTO(Ufs ufs,List<Uf> listUfRango, int maxJson) {
+ FormatoJsonDTO dto = new FormatoJsonDTO();
+ dto.setInicio(obtenerFechaFormato(ufs.getInicio(), Constantes.FORMATO_YYYY_MM_DD));
+ dto.setFin(obtenerFechaFormato(ufs.getFin(), Constantes.FORMATO_YYYY_MM_DD));
+ if(listUfRango == null){
+ dto.setUFs(new ArrayList<>());
+ }else {
+ dto.setUFs(convertiraJsonUfDTO(listUfRango, maxJson));
+ }
+ return dto;
+ }
+
+ /**
+ * Convertira json uf DTO.
+ *Metodo que convierte al DTO jsonUF en base al UF recibido.
+ * @param listUf the list uf
+ * @param maxJson the max json
+ * @return the list
+ */
+ public static List<FormatoUfJsonDTO> convertiraJsonUfDTO( List<Uf> listUf,int maxJson) {
+ List<FormatoUfJsonDTO> listUfDTO = new ArrayList<>();
+ if(maxJson != 0 && listUf.size()>maxJson) {
+ listUf = listUf.subList(0, maxJson);
+ }
+ listUf.forEach(uf ->
+ listUfDTO.add(new FormatoUfJsonDTO(obtenerFechaFormato(uf.getFecha(), Constantes.FORMATO_YYYY_MM_DD),
+ uf.getValor().toString()))
+ );
+ return listUfDTO;
+ }
+
+ /**
+ * metodo que valida que los elementos retornados de getRange() esten en la lista.
+ *
+ * @param listUf the list uf
+ * @param listUfRango the list uf rango
+ * @return verdadero si todos los elementos de la lista a se encuetran en la lista b.
+ */
+ public static boolean validacionElementosEnRango(List<Uf> listUf, List<Uf> listUfRango) {
+ int cantidad = listUf.size();
+ Long encontrado = listUfRango.stream().filter(uf -> listUf.contains(uf)).count();
+ return cantidad == encontrado.intValue();
+ }
+
+ /**
+ * Metodo sobrecargado para controlar la excepcion.
+ *
+ * @param msg mensaje a mostrar por pantalla
+ * @throws Throwable the throwable
+ */
+ public static void controlExcepcion(String msg) throws Throwable {
+ controlExcepcion(msg, JOptionPane.INFORMATION_MESSAGE);
+ }
+
+ /**
+ * Control excepcion.
+ * Metodo creado para controlar la excepcion en caso de inconveniente
+ * @param msg the msg
+ * @param optionMsg the option msg
+ * @throws Throwable the throwable
+ */
+ public static void controlExcepcion(String msg , Integer optionMsg) throws Throwable {
+ try {
+ JOptionPane.showMessageDialog(null, msg,
+ optionMsg.equals(JOptionPane.INFORMATION_MESSAGE) ? "Información" : "Error", optionMsg );
+ } catch (Exception e) {
+ throw new Throwable();
+ }
+ }
+
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/index.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/index.html
new file mode 100644
index 0000000..29653d6
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/index.html
@@ -0,0 +1 @@
+cl.zco.desafio3.util
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/index.source.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/index.source.html
new file mode 100644
index 0000000..0c079c0
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3.util/index.source.html
@@ -0,0 +1 @@
+cl.zco.desafio3.util
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Configuracion.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Configuracion.html
new file mode 100644
index 0000000..c9bc3a2
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Configuracion.html
@@ -0,0 +1 @@
+Configuracion
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Configuracion.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Configuracion.java.html
new file mode 100644
index 0000000..3b28820
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Configuracion.java.html
@@ -0,0 +1,64 @@
+Configuracion.java
package cl.zco.desafio3;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+// TODO: Auto-generated Javadoc
+/**
+ * Clase de configuracion, en esta tendremos las configuraciones de un archivo
+ * propierties y que tengan el prefijo 'desafio3'.
+ *
+ * @author Patricio Angel
+ */
+@ConfigurationProperties(prefix = "desafio3")
+public class Configuracion {
+
+ /** The cantidadjson. */
+ private int cantidadjson;
+
+ /**
+ * Constructor de la clase Configuracion con parametros.
+ *
+ * @param cantidadjson the cantidadjson
+ */
+ public Configuracion( int cantidadjson) {
+ super();
+ this.cantidadjson = cantidadjson;
+ }
+
+ /**
+ * Constructor de la clase Configuracion sin parametros.
+ */
+ public Configuracion() {
+ }
+
+ /**
+ * Gets the cantidadjson.
+ *
+ * @return the cantidadjson
+ */
+ public int getCantidadjson() {
+ return cantidadjson;
+ }
+
+ /**
+ * Sets the cantidadjson.
+ *
+ * @param cantidadjson the new cantidadjson
+ */
+ public void setCantidadjson(int cantidadjson) {
+ this.cantidadjson = cantidadjson;
+ }
+
+ /**
+ * To string.
+ *
+ * @return the string
+ */
+ @Override
+ public String toString() {
+ return "Configuracion [cantidadjson=" + cantidadjson + "]";
+ }
+
+
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Desafio3Application.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Desafio3Application.html
new file mode 100644
index 0000000..6d10245
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Desafio3Application.html
@@ -0,0 +1 @@
+Desafio3Application
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Desafio3Application.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Desafio3Application.java.html
new file mode 100644
index 0000000..712e559
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Desafio3Application.java.html
@@ -0,0 +1,61 @@
+Desafio3Application.java
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Proveedor.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Proveedor.html
new file mode 100644
index 0000000..b6d8b2c
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Proveedor.html
@@ -0,0 +1 @@
+Proveedor
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Proveedor.java.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Proveedor.java.html
new file mode 100644
index 0000000..962c8c1
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/Proveedor.java.html
@@ -0,0 +1,40 @@
+Proveedor.java
package cl.zco.desafio3;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+/**
+ * Clase con el proveedor del contexto.
+ * @author Patricio Angel
+ *
+ */
+@Component
+public class Proveedor implements ApplicationContextAware{
+
+ /** The contexto. */
+ @Autowired
+ private static ApplicationContext contexto;
+
+ /**
+ * Sets the application context.
+ * @param applicationContext the new application context
+ * @throws BeansException the beans exception
+ */
+ @Override
+ public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+ contexto = applicationContext;
+ }
+
+ /**
+ * Gets the contexto.
+ * @return the contexto
+ */
+ public static ApplicationContext getContexto() {
+ return contexto;
+ }
+
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/index.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/index.html
new file mode 100644
index 0000000..6f275ea
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/index.html
@@ -0,0 +1 @@
+cl.zco.desafio3
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/index.source.html b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/index.source.html
new file mode 100644
index 0000000..2163c12
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/cl.zco.desafio3/index.source.html
@@ -0,0 +1 @@
+cl.zco.desafio3
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_java/index.html b/resumen/cobertura/desafio3/src_main_java/index.html
new file mode 100644
index 0000000..cd0a7b7
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_java/index.html
@@ -0,0 +1 @@
+src/main/java
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_main_resources/index.html b/resumen/cobertura/desafio3/src_main_resources/index.html
new file mode 100644
index 0000000..41f0b8b
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_main_resources/index.html
@@ -0,0 +1 @@
+src/main/resources
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ConsumirJarPreviredTest.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ConsumirJarPreviredTest.html
new file mode 100644
index 0000000..cbf6982
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ConsumirJarPreviredTest.html
@@ -0,0 +1 @@
+ConsumirJarPreviredTest
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ConsumirJarPreviredTest.java.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ConsumirJarPreviredTest.java.html
new file mode 100644
index 0000000..12ec25b
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ConsumirJarPreviredTest.java.html
@@ -0,0 +1,38 @@
+ConsumirJarPreviredTest.java
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ManejadorArchivosTest.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ManejadorArchivosTest.html
new file mode 100644
index 0000000..c5e3abc
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ManejadorArchivosTest.html
@@ -0,0 +1 @@
+ManejadorArchivosTest
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ManejadorArchivosTest.java.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ManejadorArchivosTest.java.html
new file mode 100644
index 0000000..286e4f3
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/ManejadorArchivosTest.java.html
@@ -0,0 +1,81 @@
+ManejadorArchivosTest.java
package cl.zco.desafio3.negocio;
+
+import static org.assertj.core.api.Assertions.assertThatNoException;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockitoAnnotations;
+
+import cl.zco.desafio3.dto.FormatoJsonDTO;
+import cl.zco.desafio3.util.Constantes;
+
+/**
+ * The Class ManejadorArchivosTest.
+ */
+@SuppressWarnings({ "unused", "deprecation" })
+class ManejadorArchivosTest {
+
+ /** The json DTO. */
+ private FormatoJsonDTO jsonDTO;
+
+ /**
+ * Sets the up.
+ */
+
+ @BeforeEach
+ void setUp() {
+ MockitoAnnotations.initMocks(this);
+ ManejadorArchivos ma = new ManejadorArchivos();
+ jsonDTO = new FormatoJsonDTO();
+ jsonDTO.setInicio("");
+ jsonDTO.setFin("");
+
+ }
+
+ /**
+ * Caso cuando se quiere crear un fichero pero con ruta nula.
+ */
+ @Test
+ void crearFicheroJsonRutaNula() {
+ assertThrows(NullPointerException.class, () -> ManejadorArchivos.crearFicheroJson(jsonDTO, null));
+ }
+
+ /**
+ * Caso cuando se quiere crear un fichero pero con ruta inexistente.
+ */
+ @Test
+ void crearFicheroJsonRutaInexistenteNoValidacion() {
+ ManejadorArchivos.crearFicheroJson(jsonDTO, "/nopath",true);
+ assertThatNoException(); //Excepcion controlada
+ }
+
+ /**
+ * Crear fichero json ruta inexistente.
+ */
+ @Test
+ void crearFicheroJsonRutaInexistente() {
+ ManejadorArchivos.crearFicheroJson(jsonDTO, "/nopath",false);
+ assertThatNoException(); //Excepcion controlada
+ }
+
+ /**
+ * Caso cuando va sin el jsonDTO.
+ */
+ @Test
+ void crearFicheroJsonSinJsonDTO() {
+ ManejadorArchivos.crearFicheroJson(null, Constantes.RUTA_WKS_JSON);
+ assertThatNoException();
+ }
+
+ /**
+ * Caso con todos los parametros.
+ */
+ @Test
+ void crearFicheroJson() {
+ ManejadorArchivos.crearFicheroJson(jsonDTO, Constantes.RUTA_WKS_JSON);
+ assertThatNoException();
+ }
+
+}
+
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/index.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/index.html
new file mode 100644
index 0000000..a7380d0
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/index.html
@@ -0,0 +1 @@
+cl.zco.desafio3.negocio
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/index.source.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/index.source.html
new file mode 100644
index 0000000..41e1ae3
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.negocio/index.source.html
@@ -0,0 +1 @@
+cl.zco.desafio3.negocio
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/DtoTest.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/DtoTest.html
new file mode 100644
index 0000000..e1a3ee9
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/DtoTest.html
@@ -0,0 +1 @@
+DtoTest
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/DtoTest.java.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/DtoTest.java.html
new file mode 100644
index 0000000..a40aa3b
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/DtoTest.java.html
@@ -0,0 +1,71 @@
+DtoTest.java
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/UtilTest.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/UtilTest.html
new file mode 100644
index 0000000..90ea643
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/UtilTest.html
@@ -0,0 +1 @@
+UtilTest
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/UtilTest.java.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/UtilTest.java.html
new file mode 100644
index 0000000..0dea897
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/UtilTest.java.html
@@ -0,0 +1,141 @@
+UtilTest.java
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/index.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/index.html
new file mode 100644
index 0000000..01753ea
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/index.html
@@ -0,0 +1 @@
+cl.zco.desafio3.util
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/index.source.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/index.source.html
new file mode 100644
index 0000000..3fbef8c
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3.util/index.source.html
@@ -0,0 +1 @@
+cl.zco.desafio3.util
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/Desafio3ApplicationTests.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/Desafio3ApplicationTests.html
new file mode 100644
index 0000000..0ae874b
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/Desafio3ApplicationTests.html
@@ -0,0 +1 @@
+Desafio3ApplicationTests
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/Desafio3ApplicationTests.java.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/Desafio3ApplicationTests.java.html
new file mode 100644
index 0000000..d3564a3
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/Desafio3ApplicationTests.java.html
@@ -0,0 +1,25 @@
+Desafio3ApplicationTests.java
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/index.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/index.html
new file mode 100644
index 0000000..e4b0613
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/index.html
@@ -0,0 +1 @@
+cl.zco.desafio3
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/index.source.html b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/index.source.html
new file mode 100644
index 0000000..b05ef82
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/cl.zco.desafio3/index.source.html
@@ -0,0 +1 @@
+cl.zco.desafio3
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/src_test_java/index.html b/resumen/cobertura/desafio3/src_test_java/index.html
new file mode 100644
index 0000000..cb600f3
--- /dev/null
+++ b/resumen/cobertura/desafio3/src_test_java/index.html
@@ -0,0 +1 @@
+src/test/java
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/target_generated-sources_annotations/index.html b/resumen/cobertura/desafio3/target_generated-sources_annotations/index.html
new file mode 100644
index 0000000..f0bbe32
--- /dev/null
+++ b/resumen/cobertura/desafio3/target_generated-sources_annotations/index.html
@@ -0,0 +1 @@
+target/generated-sources/annotations
\ No newline at end of file
diff --git a/resumen/cobertura/desafio3/target_generated-test-sources_test-annotations/index.html b/resumen/cobertura/desafio3/target_generated-test-sources_test-annotations/index.html
new file mode 100644
index 0000000..45c8587
--- /dev/null
+++ b/resumen/cobertura/desafio3/target_generated-test-sources_test-annotations/index.html
@@ -0,0 +1 @@
+target/generated-test-sources/test-annotations
\ No newline at end of file
diff --git a/resumen/cobertura/index.html b/resumen/cobertura/index.html
new file mode 100644
index 0000000..bac5e3b
--- /dev/null
+++ b/resumen/cobertura/index.html
@@ -0,0 +1 @@
+desafio3 (20-04-2022 15:54:59)
\ No newline at end of file
diff --git a/resumen/cobertura/jacoco-resources/branchfc.gif b/resumen/cobertura/jacoco-resources/branchfc.gif
new file mode 100644
index 0000000..989b46d
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/branchfc.gif differ
diff --git a/resumen/cobertura/jacoco-resources/branchnc.gif b/resumen/cobertura/jacoco-resources/branchnc.gif
new file mode 100644
index 0000000..1933e07
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/branchnc.gif differ
diff --git a/resumen/cobertura/jacoco-resources/branchpc.gif b/resumen/cobertura/jacoco-resources/branchpc.gif
new file mode 100644
index 0000000..cbf711b
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/branchpc.gif differ
diff --git a/resumen/cobertura/jacoco-resources/bundle.gif b/resumen/cobertura/jacoco-resources/bundle.gif
new file mode 100644
index 0000000..fca9c53
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/bundle.gif differ
diff --git a/resumen/cobertura/jacoco-resources/class.gif b/resumen/cobertura/jacoco-resources/class.gif
new file mode 100644
index 0000000..eb348fb
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/class.gif differ
diff --git a/resumen/cobertura/jacoco-resources/down.gif b/resumen/cobertura/jacoco-resources/down.gif
new file mode 100644
index 0000000..440a14d
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/down.gif differ
diff --git a/resumen/cobertura/jacoco-resources/greenbar.gif b/resumen/cobertura/jacoco-resources/greenbar.gif
new file mode 100644
index 0000000..0ba6567
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/greenbar.gif differ
diff --git a/resumen/cobertura/jacoco-resources/group.gif b/resumen/cobertura/jacoco-resources/group.gif
new file mode 100644
index 0000000..a4ea580
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/group.gif differ
diff --git a/resumen/cobertura/jacoco-resources/method.gif b/resumen/cobertura/jacoco-resources/method.gif
new file mode 100644
index 0000000..7d24707
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/method.gif differ
diff --git a/resumen/cobertura/jacoco-resources/package.gif b/resumen/cobertura/jacoco-resources/package.gif
new file mode 100644
index 0000000..131c28d
Binary files /dev/null and b/resumen/cobertura/jacoco-resources/package.gif differ
diff --git a/resumen/cobertura/jacoco-resources/prettify.css b/resumen/cobertura/jacoco-resources/prettify.css
new file mode 100644
index 0000000..be5166e
--- /dev/null
+++ b/resumen/cobertura/jacoco-resources/prettify.css
@@ -0,0 +1,13 @@
+/* Pretty printing styles. Used with prettify.js. */
+
+.str { color: #2A00FF; }
+.kwd { color: #7F0055; font-weight:bold; }
+.com { color: #3F5FBF; }
+.typ { color: #606; }
+.lit { color: #066; }
+.pun { color: #660; }
+.pln { color: #000; }
+.tag { color: #008; }
+.atn { color: #606; }
+.atv { color: #080; }
+.dec { color: #606; }
diff --git a/resumen/cobertura/jacoco-resources/prettify.js b/resumen/cobertura/jacoco-resources/prettify.js
new file mode 100644
index 0000000..b2766fe
--- /dev/null
+++ b/resumen/cobertura/jacoco-resources/prettify.js
@@ -0,0 +1,1510 @@
+// Copyright (C) 2006 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+/**
+ * @fileoverview
+ * some functions for browser-side pretty printing of code contained in html.
+ *
+ *
+ * For a fairly comprehensive set of languages see the
+ * README
+ * file that came with this source. At a minimum, the lexer should work on a
+ * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
+ * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk
+ * and a subset of Perl, but, because of commenting conventions, doesn't work on
+ * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
+ *
+ * Usage:
+ *
include this source file in an html page via
+ * {@code }
+ *
define style rules. See the example page for examples.
+ *
mark the {@code
} and {@code } tags in your source with
+ * {@code class=prettyprint.}
+ * You can also use the (html deprecated) {@code } tag, but the pretty
+ * printer needs to do more substantial DOM manipulations to support that, so
+ * some css styles may not be preserved.
+ *
+ * That's it. I wanted to keep the API as simple as possible, so there's no
+ * need to specify which language the code is in, but if you wish, you can add
+ * another class to the {@code
} or {@code } element to specify the
+ * language, as in {@code
}. Any class that
+ * starts with "lang-" followed by a file extension, specifies the file type.
+ * See the "lang-*.js" files in this directory for code that implements
+ * per-language file handlers.
+ *
+ * Change log:
+ * cbeust, 2006/08/22
+ *
+ * Java annotations (start with "@") are now captured as literals ("lit")
+ *
+ * @requires console
+ */
+
+// JSLint declarations
+/*global console, document, navigator, setTimeout, window */
+
+/**
+ * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
+ * UI events.
+ * If set to {@code false}, {@code prettyPrint()} is synchronous.
+ */
+window['PR_SHOULD_USE_CONTINUATION'] = true;
+
+/** the number of characters between tab columns */
+window['PR_TAB_WIDTH'] = 8;
+
+/** Walks the DOM returning a properly escaped version of innerHTML.
+ * @param {Node} node
+ * @param {Array.} out output buffer that receives chunks of HTML.
+ */
+window['PR_normalizedHtml']
+
+/** Contains functions for creating and registering new language handlers.
+ * @type {Object}
+ */
+ = window['PR']
+
+/** Pretty print a chunk of code.
+ *
+ * @param {string} sourceCodeHtml code as html
+ * @return {string} code as html, but prettier
+ */
+ = window['prettyPrintOne']
+/** Find all the {@code
} and {@code } tags in the DOM with
+ * {@code class=prettyprint} and prettify them.
+ * @param {Function?} opt_whenDone if specified, called when the last entry
+ * has been finished.
+ */
+ = window['prettyPrint'] = void 0;
+
+/** browser detection. @extern @returns false if not IE, otherwise the major version. */
+window['_pr_isIE6'] = function () {
+ var ieVersion = navigator && navigator.userAgent &&
+ navigator.userAgent.match(/\bMSIE ([678])\./);
+ ieVersion = ieVersion ? +ieVersion[1] : false;
+ window['_pr_isIE6'] = function () { return ieVersion; };
+ return ieVersion;
+};
+
+
+(function () {
+ // Keyword lists for various languages.
+ var FLOW_CONTROL_KEYWORDS =
+ "break continue do else for if return while ";
+ var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
+ "double enum extern float goto int long register short signed sizeof " +
+ "static struct switch typedef union unsigned void volatile ";
+ var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
+ "new operator private protected public this throw true try typeof ";
+ var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
+ "concept concept_map const_cast constexpr decltype " +
+ "dynamic_cast explicit export friend inline late_check " +
+ "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
+ "template typeid typename using virtual wchar_t where ";
+ var JAVA_KEYWORDS = COMMON_KEYWORDS +
+ "abstract boolean byte extends final finally implements import " +
+ "instanceof null native package strictfp super synchronized throws " +
+ "transient ";
+ var CSHARP_KEYWORDS = JAVA_KEYWORDS +
+ "as base by checked decimal delegate descending event " +
+ "fixed foreach from group implicit in interface internal into is lock " +
+ "object out override orderby params partial readonly ref sbyte sealed " +
+ "stackalloc string select uint ulong unchecked unsafe ushort var ";
+ var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
+ "debugger eval export function get null set undefined var with " +
+ "Infinity NaN ";
+ var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
+ "goto if import last local my next no our print package redo require " +
+ "sub undef unless until use wantarray while BEGIN END ";
+ var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
+ "elif except exec finally from global import in is lambda " +
+ "nonlocal not or pass print raise try with yield " +
+ "False True None ";
+ var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
+ " defined elsif end ensure false in module next nil not or redo rescue " +
+ "retry self super then true undef unless until when yield BEGIN END ";
+ var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
+ "function in local set then until ";
+ var ALL_KEYWORDS = (
+ CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
+ PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
+
+ // token style names. correspond to css classes
+ /** token style for a string literal */
+ var PR_STRING = 'str';
+ /** token style for a keyword */
+ var PR_KEYWORD = 'kwd';
+ /** token style for a comment */
+ var PR_COMMENT = 'com';
+ /** token style for a type */
+ var PR_TYPE = 'typ';
+ /** token style for a literal value. e.g. 1, null, true. */
+ var PR_LITERAL = 'lit';
+ /** token style for a punctuation string. */
+ var PR_PUNCTUATION = 'pun';
+ /** token style for a punctuation string. */
+ var PR_PLAIN = 'pln';
+
+ /** token style for an sgml tag. */
+ var PR_TAG = 'tag';
+ /** token style for a markup declaration such as a DOCTYPE. */
+ var PR_DECLARATION = 'dec';
+ /** token style for embedded source. */
+ var PR_SOURCE = 'src';
+ /** token style for an sgml attribute name. */
+ var PR_ATTRIB_NAME = 'atn';
+ /** token style for an sgml attribute value. */
+ var PR_ATTRIB_VALUE = 'atv';
+
+ /**
+ * A class that indicates a section of markup that is not code, e.g. to allow
+ * embedding of line numbers within code listings.
+ */
+ var PR_NOCODE = 'nocode';
+
+ /** A set of tokens that can precede a regular expression literal in
+ * javascript.
+ * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
+ * list, but I've removed ones that might be problematic when seen in
+ * languages that don't support regular expression literals.
+ *
+ *
Specifically, I've removed any keywords that can't precede a regexp
+ * literal in a syntactically legal javascript program, and I've removed the
+ * "in" keyword since it's not a keyword in many languages, and might be used
+ * as a count of inches.
+ *
+ *
The link a above does not accurately describe EcmaScript rules since
+ * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
+ * very well in practice.
+ *
+ * @private
+ */
+ var REGEXP_PRECEDER_PATTERN = function () {
+ var preceders = [
+ "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
+ "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
+ "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
+ "<", "<<", "<<=", "<=", "=", "==", "===", ">",
+ ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
+ "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
+ "||=", "~" /* handles =~ and !~ */,
+ "break", "case", "continue", "delete",
+ "do", "else", "finally", "instanceof",
+ "return", "throw", "try", "typeof"
+ ];
+ var pattern = '(?:^^|[+-]';
+ for (var i = 0; i < preceders.length; ++i) {
+ pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
+ }
+ pattern += ')\\s*'; // matches at end, and matches empty string
+ return pattern;
+ // CAVEAT: this does not properly handle the case where a regular
+ // expression immediately follows another since a regular expression may
+ // have flags for case-sensitivity and the like. Having regexp tokens
+ // adjacent is not valid in any language I'm aware of, so I'm punting.
+ // TODO: maybe style special characters inside a regexp as punctuation.
+ }();
+
+ // Define regexps here so that the interpreter doesn't have to create an
+ // object each time the function containing them is called.
+ // The language spec requires a new object created even if you don't access
+ // the $1 members.
+ var pr_amp = /&/g;
+ var pr_lt = //g;
+ var pr_quot = /\"/g;
+ /** like textToHtml but escapes double quotes to be attribute safe. */
+ function attribToHtml(str) {
+ return str.replace(pr_amp, '&')
+ .replace(pr_lt, '<')
+ .replace(pr_gt, '>')
+ .replace(pr_quot, '"');
+ }
+
+ /** escapest html special characters to html. */
+ function textToHtml(str) {
+ return str.replace(pr_amp, '&')
+ .replace(pr_lt, '<')
+ .replace(pr_gt, '>');
+ }
+
+
+ var pr_ltEnt = /</g;
+ var pr_gtEnt = />/g;
+ var pr_aposEnt = /'/g;
+ var pr_quotEnt = /"/g;
+ var pr_ampEnt = /&/g;
+ var pr_nbspEnt = / /g;
+ /** unescapes html to plain text. */
+ function htmlToText(html) {
+ var pos = html.indexOf('&');
+ if (pos < 0) { return html; }
+ // Handle numeric entities specially. We can't use functional substitution
+ // since that doesn't work in older versions of Safari.
+ // These should be rare since most browsers convert them to normal chars.
+ for (--pos; (pos = html.indexOf('', pos + 1)) >= 0;) {
+ var end = html.indexOf(';', pos);
+ if (end >= 0) {
+ var num = html.substring(pos + 3, end);
+ var radix = 10;
+ if (num && num.charAt(0) === 'x') {
+ num = num.substring(1);
+ radix = 16;
+ }
+ var codePoint = parseInt(num, radix);
+ if (!isNaN(codePoint)) {
+ html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
+ html.substring(end + 1));
+ }
+ }
+ }
+
+ return html.replace(pr_ltEnt, '<')
+ .replace(pr_gtEnt, '>')
+ .replace(pr_aposEnt, "'")
+ .replace(pr_quotEnt, '"')
+ .replace(pr_nbspEnt, ' ')
+ .replace(pr_ampEnt, '&');
+ }
+
+ /** is the given node's innerHTML normally unescaped? */
+ function isRawContent(node) {
+ return 'XMP' === node.tagName;
+ }
+
+ var newlineRe = /[\r\n]/g;
+ /**
+ * Are newlines and adjacent spaces significant in the given node's innerHTML?
+ */
+ function isPreformatted(node, content) {
+ // PRE means preformatted, and is a very common case, so don't create
+ // unnecessary computed style objects.
+ if ('PRE' === node.tagName) { return true; }
+ if (!newlineRe.test(content)) { return true; } // Don't care
+ var whitespace = '';
+ // For disconnected nodes, IE has no currentStyle.
+ if (node.currentStyle) {
+ whitespace = node.currentStyle.whiteSpace;
+ } else if (window.getComputedStyle) {
+ // Firefox makes a best guess if node is disconnected whereas Safari
+ // returns the empty string.
+ whitespace = window.getComputedStyle(node, null).whiteSpace;
+ }
+ return !whitespace || whitespace === 'pre';
+ }
+
+ function normalizedHtml(node, out, opt_sortAttrs) {
+ switch (node.nodeType) {
+ case 1: // an element
+ var name = node.tagName.toLowerCase();
+
+ out.push('<', name);
+ var attrs = node.attributes;
+ var n = attrs.length;
+ if (n) {
+ if (opt_sortAttrs) {
+ var sortedAttrs = [];
+ for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; }
+ sortedAttrs.sort(function (a, b) {
+ return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1;
+ });
+ attrs = sortedAttrs;
+ }
+ for (var i = 0; i < n; ++i) {
+ var attr = attrs[i];
+ if (!attr.specified) { continue; }
+ out.push(' ', attr.name.toLowerCase(),
+ '="', attribToHtml(attr.value), '"');
+ }
+ }
+ out.push('>');
+ for (var child = node.firstChild; child; child = child.nextSibling) {
+ normalizedHtml(child, out, opt_sortAttrs);
+ }
+ if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
+ out.push('<\/', name, '>');
+ }
+ break;
+ case 3: case 4: // text
+ out.push(textToHtml(node.nodeValue));
+ break;
+ }
+ }
+
+ /**
+ * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
+ * matches the union o the sets o strings matched d by the input RegExp.
+ * Since it matches globally, if the input strings have a start-of-input
+ * anchor (/^.../), it is ignored for the purposes of unioning.
+ * @param {Array.} regexs non multiline, non-global regexs.
+ * @return {RegExp} a global regex.
+ */
+ function combinePrefixPatterns(regexs) {
+ var capturedGroupIndex = 0;
+
+ var needToFoldCase = false;
+ var ignoreCase = false;
+ for (var i = 0, n = regexs.length; i < n; ++i) {
+ var regex = regexs[i];
+ if (regex.ignoreCase) {
+ ignoreCase = true;
+ } else if (/[a-z]/i.test(regex.source.replace(
+ /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
+ needToFoldCase = true;
+ ignoreCase = false;
+ break;
+ }
+ }
+
+ function decodeEscape(charsetPart) {
+ if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
+ switch (charsetPart.charAt(1)) {
+ case 'b': return 8;
+ case 't': return 9;
+ case 'n': return 0xa;
+ case 'v': return 0xb;
+ case 'f': return 0xc;
+ case 'r': return 0xd;
+ case 'u': case 'x':
+ return parseInt(charsetPart.substring(2), 16)
+ || charsetPart.charCodeAt(1);
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7':
+ return parseInt(charsetPart.substring(1), 8);
+ default: return charsetPart.charCodeAt(1);
+ }
+ }
+
+ function encodeEscape(charCode) {
+ if (charCode < 0x20) {
+ return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
+ }
+ var ch = String.fromCharCode(charCode);
+ if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
+ ch = '\\' + ch;
+ }
+ return ch;
+ }
+
+ function caseFoldCharset(charSet) {
+ var charsetParts = charSet.substring(1, charSet.length - 1).match(
+ new RegExp(
+ '\\\\u[0-9A-Fa-f]{4}'
+ + '|\\\\x[0-9A-Fa-f]{2}'
+ + '|\\\\[0-3][0-7]{0,2}'
+ + '|\\\\[0-7]{1,2}'
+ + '|\\\\[\\s\\S]'
+ + '|-'
+ + '|[^-\\\\]',
+ 'g'));
+ var groups = [];
+ var ranges = [];
+ var inverse = charsetParts[0] === '^';
+ for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
+ var p = charsetParts[i];
+ switch (p) {
+ case '\\B': case '\\b':
+ case '\\D': case '\\d':
+ case '\\S': case '\\s':
+ case '\\W': case '\\w':
+ groups.push(p);
+ continue;
+ }
+ var start = decodeEscape(p);
+ var end;
+ if (i + 2 < n && '-' === charsetParts[i + 1]) {
+ end = decodeEscape(charsetParts[i + 2]);
+ i += 2;
+ } else {
+ end = start;
+ }
+ ranges.push([start, end]);
+ // If the range might intersect letters, then expand it.
+ if (!(end < 65 || start > 122)) {
+ if (!(end < 65 || start > 90)) {
+ ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
+ }
+ if (!(end < 97 || start > 122)) {
+ ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
+ }
+ }
+ }
+
+ // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
+ // -> [[1, 12], [14, 14], [16, 17]]
+ ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1] - a[1]); });
+ var consolidatedRanges = [];
+ var lastRange = [NaN, NaN];
+ for (var i = 0; i < ranges.length; ++i) {
+ var range = ranges[i];
+ if (range[0] <= lastRange[1] + 1) {
+ lastRange[1] = Math.max(lastRange[1], range[1]);
+ } else {
+ consolidatedRanges.push(lastRange = range);
+ }
+ }
+
+ var out = ['['];
+ if (inverse) { out.push('^'); }
+ out.push.apply(out, groups);
+ for (var i = 0; i < consolidatedRanges.length; ++i) {
+ var range = consolidatedRanges[i];
+ out.push(encodeEscape(range[0]));
+ if (range[1] > range[0]) {
+ if (range[1] + 1 > range[0]) { out.push('-'); }
+ out.push(encodeEscape(range[1]));
+ }
+ }
+ out.push(']');
+ return out.join('');
+ }
+
+ function allowAnywhereFoldCaseAndRenumberGroups(regex) {
+ // Split into character sets, escape sequences, punctuation strings
+ // like ('(', '(?:', ')', '^'), and runs of characters that do not
+ // include any of the above.
+ var parts = regex.source.match(
+ new RegExp(
+ '(?:'
+ + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]' // a character set
+ + '|\\\\u[A-Fa-f0-9]{4}' // a unicode escape
+ + '|\\\\x[A-Fa-f0-9]{2}' // a hex escape
+ + '|\\\\[0-9]+' // a back-reference or octal escape
+ + '|\\\\[^ux0-9]' // other escape sequence
+ + '|\\(\\?[:!=]' // start of a non-capturing group
+ + '|[\\(\\)\\^]' // start/emd of a group, or line start
+ + '|[^\\x5B\\x5C\\(\\)\\^]+' // run of other characters
+ + ')',
+ 'g'));
+ var n = parts.length;
+
+ // Maps captured group numbers to the number they will occupy in
+ // the output or to -1 if that has not been determined, or to
+ // undefined if they need not be capturing in the output.
+ var capturedGroups = [];
+
+ // Walk over and identify back references to build the capturedGroups
+ // mapping.
+ for (var i = 0, groupIndex = 0; i < n; ++i) {
+ var p = parts[i];
+ if (p === '(') {
+ // groups are 1-indexed, so max group index is count of '('
+ ++groupIndex;
+ } else if ('\\' === p.charAt(0)) {
+ var decimalValue = +p.substring(1);
+ if (decimalValue && decimalValue <= groupIndex) {
+ capturedGroups[decimalValue] = -1;
+ }
+ }
+ }
+
+ // Renumber groups and reduce capturing groups to non-capturing groups
+ // where possible.
+ for (var i = 1; i < capturedGroups.length; ++i) {
+ if (-1 === capturedGroups[i]) {
+ capturedGroups[i] = ++capturedGroupIndex;
+ }
+ }
+ for (var i = 0, groupIndex = 0; i < n; ++i) {
+ var p = parts[i];
+ if (p === '(') {
+ ++groupIndex;
+ if (capturedGroups[groupIndex] === undefined) {
+ parts[i] = '(?:';
+ }
+ } else if ('\\' === p.charAt(0)) {
+ var decimalValue = +p.substring(1);
+ if (decimalValue && decimalValue <= groupIndex) {
+ parts[i] = '\\' + capturedGroups[groupIndex];
+ }
+ }
+ }
+
+ // Remove any prefix anchors so that the output will match anywhere.
+ // ^^ really does mean an anchored match though.
+ for (var i = 0, groupIndex = 0; i < n; ++i) {
+ if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
+ }
+
+ // Expand letters to groupts to handle mixing of case-sensitive and
+ // case-insensitive patterns if necessary.
+ if (regex.ignoreCase && needToFoldCase) {
+ for (var i = 0; i < n; ++i) {
+ var p = parts[i];
+ var ch0 = p.charAt(0);
+ if (p.length >= 2 && ch0 === '[') {
+ parts[i] = caseFoldCharset(p);
+ } else if (ch0 !== '\\') {
+ // TODO: handle letters in numeric escapes.
+ parts[i] = p.replace(
+ /[a-zA-Z]/g,
+ function (ch) {
+ var cc = ch.charCodeAt(0);
+ return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
+ });
+ }
+ }
+ }
+
+ return parts.join('');
+ }
+
+ var rewritten = [];
+ for (var i = 0, n = regexs.length; i < n; ++i) {
+ var regex = regexs[i];
+ if (regex.global || regex.multiline) { throw new Error('' + regex); }
+ rewritten.push(
+ '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
+ }
+
+ return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
+ }
+
+ var PR_innerHtmlWorks = null;
+ function getInnerHtml(node) {
+ // inner html is hopelessly broken in Safari 2.0.4 when the content is
+ // an html description of well formed XML and the containing tag is a PRE
+ // tag, so we detect that case and emulate innerHTML.
+ if (null === PR_innerHtmlWorks) {
+ var testNode = document.createElement('PRE');
+ testNode.appendChild(
+ document.createTextNode('\n'));
+ PR_innerHtmlWorks = !/)[\r\n]+/g, '$1')
+ .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
+ }
+ return content;
+ }
+
+ var out = [];
+ for (var child = node.firstChild; child; child = child.nextSibling) {
+ normalizedHtml(child, out);
+ }
+ return out.join('');
+ }
+
+ /** returns a function that expand tabs to spaces. This function can be fed
+ * successive chunks of text, and will maintain its own internal state to
+ * keep track of how tabs are expanded.
+ * @return {function (string) : string} a function that takes
+ * plain text and return the text with tabs expanded.
+ * @private
+ */
+ function makeTabExpander(tabWidth) {
+ var SPACES = ' ';
+ var charInLine = 0;
+
+ return function (plainText) {
+ // walk over each character looking for tabs and newlines.
+ // On tabs, expand them. On newlines, reset charInLine.
+ // Otherwise increment charInLine
+ var out = null;
+ var pos = 0;
+ for (var i = 0, n = plainText.length; i < n; ++i) {
+ var ch = plainText.charAt(i);
+
+ switch (ch) {
+ case '\t':
+ if (!out) { out = []; }
+ out.push(plainText.substring(pos, i));
+ // calculate how much space we need in front of this part
+ // nSpaces is the amount of padding -- the number of spaces needed
+ // to move us to the next column, where columns occur at factors of
+ // tabWidth.
+ var nSpaces = tabWidth - (charInLine % tabWidth);
+ charInLine += nSpaces;
+ for (; nSpaces >= 0; nSpaces -= SPACES.length) {
+ out.push(SPACES.substring(0, nSpaces));
+ }
+ pos = i + 1;
+ break;
+ case '\n':
+ charInLine = 0;
+ break;
+ default:
+ ++charInLine;
+ }
+ }
+ if (!out) { return plainText; }
+ out.push(plainText.substring(pos));
+ return out.join('');
+ };
+ }
+
+ var pr_chunkPattern = new RegExp(
+ '[^<]+' // A run of characters other than '<'
+ + '|<\!--[\\s\\S]*?--\>' // an HTML comment
+ + '|' // a CDATA section
+ // a probable tag that should not be highlighted
+ + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
+ + '|<', // A '<' that does not begin a larger chunk
+ 'g');
+ var pr_commentPrefix = /^<\!--/;
+ var pr_cdataPrefix = /^) into their textual equivalent.
+ *
+ * @param {string} s html where whitespace is considered significant.
+ * @return {Object} source code and extracted tags.
+ * @private
+ */
+ function extractTags(s) {
+ // since the pattern has the 'g' modifier and defines no capturing groups,
+ // this will return a list of all chunks which we then classify and wrap as
+ // PR_Tokens
+ var matches = s.match(pr_chunkPattern);
+ var sourceBuf = [];
+ var sourceBufLen = 0;
+ var extractedTags = [];
+ if (matches) {
+ for (var i = 0, n = matches.length; i < n; ++i) {
+ var match = matches[i];
+ if (match.length > 1 && match.charAt(0) === '<') {
+ if (pr_commentPrefix.test(match)) { continue; }
+ if (pr_cdataPrefix.test(match)) {
+ // strip CDATA prefix and suffix. Don't unescape since it's CDATA
+ sourceBuf.push(match.substring(9, match.length - 3));
+ sourceBufLen += match.length - 12;
+ } else if (pr_brPrefix.test(match)) {
+ // tags are lexically significant so convert them to text.
+ // This is undone later.
+ sourceBuf.push('\n');
+ ++sourceBufLen;
+ } else {
+ if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
+ // A will start a section that should be
+ // ignored. Continue walking the list until we see a matching end
+ // tag.
+ var name = match.match(pr_tagNameRe)[2];
+ var depth = 1;
+ var j;
+ end_tag_loop:
+ for (j = i + 1; j < n; ++j) {
+ var name2 = matches[j].match(pr_tagNameRe);
+ if (name2 && name2[2] === name) {
+ if (name2[1] === '/') {
+ if (--depth === 0) { break end_tag_loop; }
+ } else {
+ ++depth;
+ }
+ }
+ }
+ if (j < n) {
+ extractedTags.push(
+ sourceBufLen, matches.slice(i, j + 1).join(''));
+ i = j;
+ } else { // Ignore unclosed sections.
+ extractedTags.push(sourceBufLen, match);
+ }
+ } else {
+ extractedTags.push(sourceBufLen, match);
+ }
+ }
+ } else {
+ var literalText = htmlToText(match);
+ sourceBuf.push(literalText);
+ sourceBufLen += literalText.length;
+ }
+ }
+ }
+ return { source: sourceBuf.join(''), tags: extractedTags };
+ }
+
+ /** True if the given tag contains a class attribute with the nocode class. */
+ function isNoCodeTag(tag) {
+ return !!tag
+ // First canonicalize the representation of attributes
+ .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
+ ' $1="$2$3$4"')
+ // Then look for the attribute we want.
+ .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
+ }
+
+ /**
+ * Apply the given language handler to sourceCode and add the resulting
+ * decorations to out.
+ * @param {number} basePos the index of sourceCode within the chunk of source
+ * whose decorations are already present on out.
+ */
+ function appendDecorations(basePos, sourceCode, langHandler, out) {
+ if (!sourceCode) { return; }
+ var job = {
+ source: sourceCode,
+ basePos: basePos
+ };
+ langHandler(job);
+ out.push.apply(out, job.decorations);
+ }
+
+ /** Given triples of [style, pattern, context] returns a lexing function,
+ * The lexing function interprets the patterns to find token boundaries and
+ * returns a decoration list of the form
+ * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
+ * where index_n is an index into the sourceCode, and style_n is a style
+ * constant like PR_PLAIN. index_n-1 <= index_n, and style_n-1 applies to
+ * all characters in sourceCode[index_n-1:index_n].
+ *
+ * The stylePatterns is a list whose elements have the form
+ * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
+ *
+ * Style is a style constant like PR_PLAIN, or can be a string of the
+ * form 'lang-FOO', where FOO is a language extension describing the
+ * language of the portion of the token in $1 after pattern executes.
+ * E.g., if style is 'lang-lisp', and group 1 contains the text
+ * '(hello (world))', then that portion of the token will be passed to the
+ * registered lisp handler for formatting.
+ * The text before and after group 1 will be restyled using this decorator
+ * so decorators should take care that this doesn't result in infinite
+ * recursion. For example, the HTML lexer rule for SCRIPT elements looks
+ * something like ['lang-js', /<[s]cript>(.+?)<\/script>/]. This may match
+ * '