Well it is more about consistency and reliability than speed here.
Comoilabtion result is just corrupted :(

Le 25 janv. 2018 20:33, "Lukasz Cwik" <lc...@google.com> a écrit :

> You can only get incremental support at the build system level, not at the
> individual tool level like javac. The task the represents compilation would
> need to be broken up into smaller tasks with smaller source sets to speed
> up compilation of really large modules.
>
> On Wed, Jan 24, 2018 at 11:12 PM, Romain Manni-Bucau <
> rmannibu...@gmail.com> wrote:
>
>> One pitfall I noted with javac wrappers is that if you dont clean - and
>> loose javac incremental support then deleted classes stay here and are
>> considered in the output. Common example is a nested class which has been
>> deleted leading to a corrupted enclosing class or a test which is ran but
>> deleted from java/. Any known way to protect us from it and keep the
>> uncremental support for big modules?
>>
>> Le 25 janv. 2018 01:22, "Lukasz Cwik" <lc...@google.com> a écrit :
>>
>>> Dependency driven works, incremental works for most java modules.
>>> I use incremental almost all the time and just do one validation pass at
>>> the end before opening the PR where I use '--rerun-tasks' to be sure.
>>> Allows me to iterate on a task in seconds.
>>>
>>> On Wed, Jan 24, 2018 at 4:07 PM, Kenneth Knowles <k...@google.com> wrote:
>>>
>>>> These are two different things: dependency-driven build (which works)
>>>> and incremental build (which seems not to, at least right now?).
>>>>
>>>> On Wed, Jan 24, 2018 at 2:24 PM, Romain Manni-Bucau <
>>>> rmannibu...@gmail.com> wrote:
>>>>
>>>>> Hmm, I'll try to refine it then next time we work with Ismael but can
>>>>> be a setup issue or a human (bad command) issue at the end. Thanks for the
>>>>> help, will make next iteration way easier probably :)
>>>>>
>>>>>
>>>>> Romain Manni-Bucau
>>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>> <https://rmannibucau.metawerx.net/> | Old Blog
>>>>> <http://rmannibucau.wordpress.com> | Github
>>>>> <https://github.com/rmannibucau> | LinkedIn
>>>>> <https://www.linkedin.com/in/rmannibucau>
>>>>>
>>>>> 2018-01-24 23:05 GMT+01:00 Lukasz Cwik <lc...@google.com>:
>>>>>
>>>>>> Tasks always run any dependencies that are required. So if you ask to
>>>>>> run test it shouldn't run javadoc/checkstyle/... but should compile the
>>>>>> code and compile the code of all dependencies. test should never have a
>>>>>> dependency on checkstyle or javadoc or similar 'check' like tasks as they
>>>>>> shouldn't be needed.
>>>>>>
>>>>>> I set up the gradle build so that everytime you run a command in
>>>>>> gradle, it generates a task dependency tree dot file (look for visteg.dot
>>>>>> inside build/reports). I uploaded this one to imgur[1] for the
>>>>>> ':sdks:java:core:build' task to show what tasks are required. Note that
>>>>>> 'sdks:java:core:test' doesn't depend on checkstyle or spotless.
>>>>>>
>>>>>> 1: https://imgur.com/a/ZvYUX
>>>>>>
>>>>>> On Wed, Jan 24, 2018 at 12:50 PM, Romain Manni-Bucau <
>>>>>> rmannibu...@gmail.com> wrote:
>>>>>>
>>>>>>> Hmm, do I miss something or it only works for iterative runs when
>>>>>>> trying to identify an issue and not for the case you rebuild due to code
>>>>>>> changes (where you would need like 5-6 tasks at least - generate, 
>>>>>>> compile,
>>>>>>> test, ...)?
>>>>>>>
>>>>>>> In case it is unclear: there are 2 needs: direct execution/task ->
>>>>>>> fulfilled and clarified now (just a doc issue I think), fast cycle 
>>>>>>> skipping
>>>>>>> not mandatory tasks like style related ones
>>>>>>>
>>>>>>>
>>>>>>> Romain Manni-Bucau
>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>>>> <https://rmannibucau.metawerx.net/> | Old Blog
>>>>>>> <http://rmannibucau.wordpress.com> | Github
>>>>>>> <https://github.com/rmannibucau> | LinkedIn
>>>>>>> <https://www.linkedin.com/in/rmannibucau>
>>>>>>>
>>>>>>> 2018-01-24 19:50 GMT+01:00 Lukasz Cwik <lc...@google.com>:
>>>>>>>
>>>>>>>> Gradle already has each task explicitly broken out. Kenn is
>>>>>>>> pointing out that you your development use case shouldn't use the
>>>>>>>> './gradlew :sdks:java:core:build' task since it is really an aggregator
>>>>>>>> that represents do everything within that project. This is the current 
>>>>>>>> list
>>>>>>>> of tasks available for :sdks:java:core:
>>>>>>>> :sdks:java:core:assemble  - Assembles the outputs of this project.
>>>>>>>> :sdks:java:core:build  - Assembles and tests this project.
>>>>>>>> :sdks:java:core:buildDependents  - Assembles and tests this
>>>>>>>> project and all projects that depend on it.
>>>>>>>> :sdks:java:core:buildEnvironment  - Displays all buildscript
>>>>>>>> dependencies declared in project :sdks:java:core.
>>>>>>>> :sdks:java:core:buildNeeded  - Assembles and tests this project and
>>>>>>>> all projects it depends on.
>>>>>>>> :sdks:java:core:check  - Runs all checks.
>>>>>>>> :sdks:java:core:checkstyleMain  - Run Checkstyle analysis for main
>>>>>>>> classes
>>>>>>>> :sdks:java:core:checkstyleTest  - Run Checkstyle analysis for test
>>>>>>>> classes
>>>>>>>> :sdks:java:core:classes  - Assembles main classes.
>>>>>>>> :sdks:java:core:clean  - Deletes the build directory.
>>>>>>>> :sdks:java:core:compileJava  - Compiles main Java source.
>>>>>>>> :sdks:java:core:compileTestJava  - Compiles test Java source.
>>>>>>>> :sdks:java:core:components  - Displays the components produced by
>>>>>>>> project :sdks:java:core. [incubating]
>>>>>>>> :sdks:java:core:dependencies  - Displays all dependencies declared
>>>>>>>> in project :sdks:java:core.
>>>>>>>> :sdks:java:core:dependencyInsight  - Displays the insight into a
>>>>>>>> specific dependency in project :sdks:java:core.
>>>>>>>> :sdks:java:core:dependencyReport  - Generates a report about your
>>>>>>>> library dependencies.
>>>>>>>> :sdks:java:core:dependentComponents  - Displays the dependent
>>>>>>>> components of components in project :sdks:java:core. [incubating]
>>>>>>>> :sdks:java:core:findbugsMain  - Run FindBugs analysis for main
>>>>>>>> classes
>>>>>>>> :sdks:java:core:findbugsTest  - Run FindBugs analysis for test
>>>>>>>> classes
>>>>>>>> :sdks:java:core:generateAvroJava  - Generates main Avro Java
>>>>>>>> source files from schema/protocol definition files.
>>>>>>>> :sdks:java:core:generateAvroProtocol  - Generates main Avro
>>>>>>>> protocol definition files from IDL files.
>>>>>>>> :sdks:java:core:generateTestAvroJava  - Generates test Avro Java
>>>>>>>> source files from schema/protocol definition files.
>>>>>>>> :sdks:java:core:generateTestAvroProtocol  - Generates test Avro
>>>>>>>> protocol definition files from IDL files.
>>>>>>>> :sdks:java:core:help  - Displays a help message.
>>>>>>>> :sdks:java:core:htmlDependencyReport  - Generates an HTML report
>>>>>>>> about your library dependencies.
>>>>>>>> :sdks:java:core:install  - Installs the archives artifacts into the
>>>>>>>> local Maven repository.
>>>>>>>> :sdks:java:core:jacocoTestCoverageVerification  - Verifies code
>>>>>>>> coverage metrics based on specified rules for the test task.
>>>>>>>> :sdks:java:core:jacocoTestReport  - Generates code coverage report
>>>>>>>> for the test task.
>>>>>>>> :sdks:java:core:jar  - Assembles a jar archive containing the main
>>>>>>>> classes.
>>>>>>>> :sdks:java:core:javadoc  - Generates Javadoc API documentation for
>>>>>>>> the main source code.
>>>>>>>> :sdks:java:core:knows  - Do you know who knows?
>>>>>>>> :sdks:java:core:model  - Displays the configuration model of
>>>>>>>> project :sdks:java:core. [incubating]
>>>>>>>> :sdks:java:core:packageTests  -
>>>>>>>> :sdks:java:core:processResources  - Processes main resources.
>>>>>>>> :sdks:java:core:processTestResources  - Processes test resources.
>>>>>>>> :sdks:java:core:projectReport  - Generates a report about your
>>>>>>>> project.
>>>>>>>> :sdks:java:core:projects  - Displays the sub-projects of project
>>>>>>>> :sdks:java:core.
>>>>>>>> :sdks:java:core:properties  - Displays the properties of project
>>>>>>>> :sdks:java:core.
>>>>>>>> :sdks:java:core:propertyReport  - Generates a report about your
>>>>>>>> properties.
>>>>>>>> :sdks:java:core:shadowJar  - Create a combined JAR of project and
>>>>>>>> runtime dependencies
>>>>>>>> :sdks:java:core:shadowTestJar  -
>>>>>>>> :sdks:java:core:spotlessApply  - Applies code formatting steps to
>>>>>>>> sourcecode in-place.
>>>>>>>> :sdks:java:core:spotlessCheck  - Checks that sourcecode satisfies
>>>>>>>> formatting steps.
>>>>>>>> :sdks:java:core:spotlessJava  -
>>>>>>>> :sdks:java:core:spotlessJavaApply  -
>>>>>>>> :sdks:java:core:spotlessJavaCheck  -
>>>>>>>> :sdks:java:core:taskReport  - Generates a report about your tasks.
>>>>>>>> :sdks:java:core:tasks  - Displays the tasks runnable from project
>>>>>>>> :sdks:java:core.
>>>>>>>> :sdks:java:core:testClasses  - Assembles test classes.
>>>>>>>> :sdks:java:core:test  - Runs the unit tests.
>>>>>>>> :sdks:java:core:updateOfflineRepository  -
>>>>>>>>
>>>>>>>> So if you specify the ':sdks:java:core:test' task then only the
>>>>>>>> tests run (and any dependent tasks which are not up to date), while 
>>>>>>>> ':sdks:java:core:check'
>>>>>>>> runs the suite of all checks. If your working on two modules and want 
>>>>>>>> to
>>>>>>>> run the tests for both you really want to specify each explicit end 
>>>>>>>> goal
>>>>>>>> that you want like ':sdks:java:core:test' and 
>>>>>>>> ':sdks:java:harness:test'.
>>>>>>>> Unfortunately incremental builds (https://issues.apache.org/jir
>>>>>>>> a/browse/BEAM-3253) are unreliable in a few of the modules (like
>>>>>>>> sql and python) so you may find that you need to specify --rerun-tasks 
>>>>>>>> to
>>>>>>>> make sure that all tasks are rerun even if Gradle thinks they are up to
>>>>>>>> date.
>>>>>>>>
>>>>>>>> On Tue, Jan 23, 2018 at 3:38 PM, Romain Manni-Bucau <
>>>>>>>> rmannibu...@gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Can have mischecked gradle setup but I don't think we are here
>>>>>>>>> yet, if you are not bound in a module and work accross 2 modules and
>>>>>>>>> iterate between working on both and one, you will likely not bypass 
>>>>>>>>> the
>>>>>>>>> "checks" in  a satisfying way without a long -x command, is there a 
>>>>>>>>> magic
>>>>>>>>> flag I missed?
>>>>>>>>> Also not sure about the last point and how gradle helps here - it
>>>>>>>>> is rather the opposite due to the way it loads it model IMHO - so not 
>>>>>>>>> sure
>>>>>>>>> what would be the consequence in terms of action(s) but can have 
>>>>>>>>> missed the
>>>>>>>>> point.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Romain Manni-Bucau
>>>>>>>>> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>>>>>> <https://rmannibucau.metawerx.net/> | Old Blog
>>>>>>>>> <http://rmannibucau.wordpress.com> | Github
>>>>>>>>> <https://github.com/rmannibucau> | LinkedIn
>>>>>>>>> <https://www.linkedin.com/in/rmannibucau>
>>>>>>>>>
>>>>>>>>> 2018-01-24 0:20 GMT+01:00 Kenneth Knowles <k...@google.com>:
>>>>>>>>>
>>>>>>>>>> On Tue, Jan 23, 2018 at 2:51 PM, Romain Manni-Bucau <
>>>>>>>>>> rmannibu...@gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>> Hmm, did you read it right Kenn? I think the idea was to skip all
>>>>>>>>>>> validation/sanity checks tasks at once (gradle xxxx -Pfast) instead 
>>>>>>>>>>> of
>>>>>>>>>>> doing it manually (gradle -x findbugs -x checkstyle etc...)
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Yes, I read it right. We all want the same thing - not doing a
>>>>>>>>>> bunch of extra useless unrequested stuff when developing. The 
>>>>>>>>>> concept of
>>>>>>>>>> skipping is backwards. We don't need configs that skip things, 
>>>>>>>>>> because in a
>>>>>>>>>> correct dependency-driven build they are already not running.
>>>>>>>>>>
>>>>>>>>>> So since I don't want to pretend to know gradle's invocations yet
>>>>>>>>>> I will call it $TOOL. Here's a collection of imaginary commands:
>>>>>>>>>>
>>>>>>>>>>     $TOOL :sdks:java:core:unittest  # or $TOOL test
>>>>>>>>>> :sdks:java:core or whatever
>>>>>>>>>>     $TOOL :sdks:java:core:findbugs
>>>>>>>>>>     $TOOL :sdks:java:core:checkstyle
>>>>>>>>>>     $TOOL :sdks:java:core:javadoc
>>>>>>>>>>
>>>>>>>>>> None of these causes any of the others to run. Anything else is a
>>>>>>>>>> bug. The `findbugs` and `test` cause a build of the needed jars and 
>>>>>>>>>> nothing
>>>>>>>>>> else.
>>>>>>>>>>
>>>>>>>>>> Another example:
>>>>>>>>>>
>>>>>>>>>>     $TOOL :runners:core-java:unittest
>>>>>>>>>>
>>>>>>>>>> This builds the model, the core SDK, and the runners-core module,
>>>>>>>>>> then runs the unit tests of the runners-core module. It does not 
>>>>>>>>>> test SDK
>>>>>>>>>> core, or run any javadoc, findbugs, or checkstyle on any module. 
>>>>>>>>>> Anything
>>>>>>>>>> else is a bug.
>>>>>>>>>>
>>>>>>>>>> Now, to build a precommit that is easy to reproduce on one line,
>>>>>>>>>> you could build a compound task
>>>>>>>>>>
>>>>>>>>>>     $TOOL :sdks:java:core:precommit  # runs a selection of
>>>>>>>>>> targets that we define
>>>>>>>>>>
>>>>>>>>>> At this point you might want to skip things from the :verify task
>>>>>>>>>> here. But really, you probably just want to run the things you are
>>>>>>>>>> interested in and you don't need custom hooks in the aggregated task.
>>>>>>>>>>
>>>>>>>>>> My understanding is that gradle can support all of this, if we
>>>>>>>>>> are disciplined. Getting to this point is the main/only reason I 
>>>>>>>>>> supported
>>>>>>>>>> gradle.
>>>>>>>>>>
>>>>>>>>>> Kenn
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>> Kenn
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> diff --git a/examples/java/build.gradle
>>>>>>>>>>>>> b/examples/java/build.gradle
>>>>>>>>>>>>> >> index 0fc0b17df..001bd8b38 100644
>>>>>>>>>>>>> >> --- a/examples/java/build.gradle
>>>>>>>>>>>>> >> +++ b/examples/java/build.gradle
>>>>>>>>>>>>> >> @@ -130,7 +130,7 @@ def preCommitAdditionalFlags = [
>>>>>>>>>>>>> >>    dataflowStreamingRunner: [ "--streaming=true" ],
>>>>>>>>>>>>> >>  ]
>>>>>>>>>>>>> >>  for (String runner : preCommitRunners) {
>>>>>>>>>>>>> >> -  tasks.create(name: runner + "PreCommit", type: Test) {
>>>>>>>>>>>>> >> +  tasks.create(name: runner + "PreCommit", type: Test,
>>>>>>>>>>>>> description: "Run tests
>>>>>>>>>>>>> >> for runner ${runner.replace('Runner', '')}") {
>>>>>>>>>>>>> >>      def preCommitBeamTestPipelineOptions = [
>>>>>>>>>>>>> >>         "--project=apache-beam-testing",
>>>>>>>>>>>>> >>         "--tempRoot=gs://temp-storage
>>>>>>>>>>>>> -for-end-to-end-tests",
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> Romain Manni-Bucau
>>>>>>>>>>>>> >> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
>>>>>>>>>>>>> >> <https://rmannibucau.metawerx.net/> | Old Blog
>>>>>>>>>>>>> >> <http://rmannibucau.wordpress.com> | Github <
>>>>>>>>>>>>> https://github.com/rmannibucau> |
>>>>>>>>>>>>> >> LinkedIn <https://www.linkedin.com/in/rmannibucau>
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >> 2018-01-23 8:45 GMT+01:00 Jean-Baptiste Onofré <
>>>>>>>>>>>>> j...@nanthrax.net
>>>>>>>>>>>>> >> <mailto:j...@nanthrax.net>>:
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>     Hi Romain,
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>     I think we are pretty close: agree to add some explicit
>>>>>>>>>>>>> tasks & projects names.
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>     We can add additional tasks like skipAudit, for
>>>>>>>>>>>>> instance.
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>     As reminder, gradle tasks provides the list of tasks
>>>>>>>>>>>>> and gradle projects
>>>>>>>>>>>>> >>     provides the list of projects/modules.
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>     Regards
>>>>>>>>>>>>> >>     JB
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>     On 01/23/2018 08:12 AM, Romain Manni-Bucau wrote:
>>>>>>>>>>>>> >>     > Hmm, I have to admit docs dont have my favor cause
>>>>>>>>>>>>> they are easily outdated and
>>>>>>>>>>>>> >>     > hard to search but you hit a good point. Starting by
>>>>>>>>>>>>> renaming properly the tasks
>>>>>>>>>>>>> >>     > and maybe writing what is done in build files - since
>>>>>>>>>>>>> it is code and even "api
>>>>>>>>>>>>> >>     > for dev", it requires as much comments than the main
>>>>>>>>>>>>> api - can be better to start.
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     > Also a big switch flag to bypass
>>>>>>>>>>>>> checkstyle/findbugs/... can be good while in
>>>>>>>>>>>>> >>     > dev since these phases cost a looot for nothing while
>>>>>>>>>>>>> you validates your code in
>>>>>>>>>>>>> >>     > runners modules for instance.
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     > Le 23 janv. 2018 07:15, "Kenneth Knowles" <
>>>>>>>>>>>>> k...@google.com <mailto:k...@google.com>
>>>>>>>>>>>>> >>     > <mailto:k...@google.com <mailto:k...@google.com>>> a
>>>>>>>>>>>>> écrit :
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >     On Mon, Jan 22, 2018 at 10:03 PM, Romain
>>>>>>>>>>>>> Manni-Bucau <rmannibu...@gmail.com <mailto:
>>>>>>>>>>>>> rmannibu...@gmail.com>
>>>>>>>>>>>>> >>     >     <mailto:rmannibu...@gmail.com <mailto:
>>>>>>>>>>>>> rmannibu...@gmail.com>>> wrote:
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >         @Kenneth: why not dropping the doc for a
>>>>>>>>>>>>> script with comments in the
>>>>>>>>>>>>> >>     >         project? A "RUNME.sh" ;).
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >     That's cool, too, but also any shell one liner
>>>>>>>>>>>>> can be a gradle one
>>>>>>>>>>>>> >>     liner or
>>>>>>>>>>>>> >>     >     mvn two/three liner :-). it is just trading one
>>>>>>>>>>>>> command that you cannot
>>>>>>>>>>>>> >>     >     guess easily for a different one that you still
>>>>>>>>>>>>> can't guess easily.
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >     For example, are the SparkRunner ValidatesRunner
>>>>>>>>>>>>> tests in the
>>>>>>>>>>>>> >>     SparkRunner or
>>>>>>>>>>>>> >>     >     the core SDK or a third module that integrates
>>>>>>>>>>>>> the two? And why would you
>>>>>>>>>>>>> >>     >     know that the example ITs are called
>>>>>>>>>>>>> "sparkRunnerPreCommit"? It
>>>>>>>>>>>>> >>     doesn't even
>>>>>>>>>>>>> >>     >     make sense really to have "precommit" or
>>>>>>>>>>>>> "postcommit" except as aliases to
>>>>>>>>>>>>> >>     >     make it easy to repro Jenkins' behavior - they
>>>>>>>>>>>>> have no other intrinsic
>>>>>>>>>>>>> >>     meaning.
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >     So I was proposing a mapping from "full sentence
>>>>>>>>>>>>> + description" to one
>>>>>>>>>>>>> >>     liner
>>>>>>>>>>>>> >>     >     to help people navigate the targets that we set
>>>>>>>>>>>>> up. Some web page or doc
>>>>>>>>>>>>> >>     >     that people can just quickly scan to find out to
>>>>>>>>>>>>> do common things, easier
>>>>>>>>>>>>> >>     >     than groovy or XML.
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >     Kenn
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>     >
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>     --
>>>>>>>>>>>>> >>     Jean-Baptiste Onofré
>>>>>>>>>>>>> >>     jbono...@apache.org <mailto:jbono...@apache.org>
>>>>>>>>>>>>> >>     http://blog.nanthrax.net
>>>>>>>>>>>>> >>     Talend - http://www.talend.com
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >>
>>>>>>>>>>>>> >
>>>>>>>>>>>>> > --
>>>>>>>>>>>>> > Jean-Baptiste Onofré
>>>>>>>>>>>>> > jbono...@apache.org
>>>>>>>>>>>>> > http://blog.nanthrax.net
>>>>>>>>>>>>> > Talend - http://www.talend.com
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>

Reply via email to