Commits

Germano Gabbianelli committed 977ad20

initial commit

  • Participants

Comments (0)

Files changed (64)

+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="src" path="java/server/src"/>
+	<classpathentry kind="src" path="java/client/src"/>
+	<classpathentry kind="src" path="java/client/test"/>
+	<classpathentry kind="src" path="java/server/test"/>
+	<classpathentry kind="lib" path="third_party/java/junit/junit-dep-4.8.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/easymock/easymockclassextension-2.4.jar"/>
+	<classpathentry kind="lib" path="third_party/java/htmlunit/htmlunit-core-js-2.8.jar"/>
+	<classpathentry kind="lib" path="third_party/java/bcprov/bcprov-jdk15-135.jar"/>
+	<classpathentry kind="lib" path="third_party/java/htmlunit/htmlunit-2.8.jar"/>
+	<classpathentry kind="lib" path="third_party/java/easymock/easymock-2.4.jar"/>
+	<classpathentry kind="lib" path="third_party/java/apache-httpclient/httpclient-4.0.2.jar"/>
+	<classpathentry kind="lib" path="third_party/java/apache-httpclient/httpcore-4.0.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/apache-httpclient/httpmime-4.0.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/cglib/cglib-nodep-2.1_3.jar"/>
+	<classpathentry kind="lib" path="third_party/java/commons-collections/commons-collections-3.2.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/commons-io/commons-io-1.4.jar"/>
+	<classpathentry kind="lib" path="third_party/java/commons-lang/commons-lang-2.4.jar"/>
+	<classpathentry kind="lib" path="third_party/java/commons-codec/commons-codec-1.4.jar"/>
+	<classpathentry kind="lib" path="third_party/java/hamcrest/hamcrest-all-1.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/commons-logging/commons-logging-1.1.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jna/jna.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-lite-7.2.0-repackaged-for-android.jar"/>
+	<classpathentry kind="lib" path="third_party/java/mx4j/mx4j-tools-3.0.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-webapp-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/json/json-20080701.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-server-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-continuation-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-xml-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-http-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-websocket-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/testng/testng-5.14.1.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-io-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jmock/jmock-2.4.0.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-servlets-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jmock/jmock-junit3-2.4.0.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-security-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-util-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/servlet-api/servlet-api-2.5-6.1.9.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jetty/jetty-servlet-7.2.0.v20101020.jar"/>
+	<classpathentry kind="lib" path="third_party/java/guava-libraries/guava-r08.jar" sourcepath="third_party/java/guava-libraries/guava-r08-src.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jasper/jasper-compiler-jdt-5.5.15.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jasper/jasper-compiler-5.5.15.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jasper/jsp-api-2.0.jar"/>
+	<classpathentry kind="lib" path="third_party/java/jasper/jasper-runtime-5.5.15.jar"/>
+	<classpathentry kind="lib" path="third_party/java/yaml/snakeyaml-1.8.jar"/>
+	<classpathentry kind="output" path="out/production/selenium"/>
+</classpath>
+projectFilesBackup/
+*.iws
+.DS_Store
+.svn
+mockpiframe.log
+mockpiframe.log.lck
+junitvmwatcher*.properties
+test-output/
+.*.swp
+common/build
+firefox/build
+htmlunit/build
+jobbie/build
+selenium/build
+support/build
+iphone/lib/buildtime-src/cocoahttpserver/build/CocoaHTTPServerLibrary.build/Release-iphonesimulator/CocoaHTTPServer.build
+iphone/lib/buildtime-src/build/
+iphone/build/
+/build/
+android/client/bin/
+android/server/bin/
+cpp/IEDriver/IEReturnTypes.h
+java/org/openqa/selenium/ie/IeReturnTypes.java
+java/client/src/org/openqa/selenium/ie/IeReturnTypes.java
+.idea/vcs.xml
+.idea/misc.xml
+.idea/workspace.xml
+.idea/projectCodeStyle.xml
+
+syntax:glob
+*.pyc
+*~
+.*.swp
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>selenium</name>
+	<comment/>
+	<projects/>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments/>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2007-2009 Google Inc.
+   Copyright 2007-2009 WebDriver committers
+
+   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.
+
+Credits
+=======
+
+The following people have offered help, support and/or code to
+WebDriver. If you feel that you should be on this list but aren't,
+then please feel free to raise a ticket on the project site
+(http://webdriver.googlecode.com) or send an email directly to one of
+the project's maintainers.
+
+Cast
+====
+
+Joe Walnes
+Vyvyan Codd
+Zoltar - Knower of All
+Carlos Villela
+Michael Tamm
+James Cooper
+Malcolm Rowe
+Mirko Nasato
+Marc Guillemot
+Alexis Vuillemin
+Noel Gordon
+David Wang
+Amitabh Saikia
+Julian Harty
+Philippe Hanrigou
+Jon Spalding
+James Strachen
+Aslak Hellesoy
+Rune Flobakk
+Dan Fabulich
+Michele Sama
+Kenneth Leftin
+Darrell Deboer
+Muthu Kannan
+Terence Haddock
+Jean-Francois Roche
+Godefroid Chapelle
+Kristian Rosenvold
+prune *
+recursive-include py/selenium/webdriver *.py
+recursive-include py/selenium/webdriver/common *.py
+recursive-include py/selenium/common *.py
+recursive-include py/selenium/webdriver/chrome *.py *.zip
+recursive-include py/selenium/webdriver/firefox *.py *.xpi
+recursive-include py/selenium/webdriver/ie *.py *.dll
+recursive-include py/selenium/webdriver/remote *.py
+include py/selenium/selenium.py
+include py/selenium/__init__.py
+include __init__.py
+include docs/api/py/index.rst
+recursive-include selenium.egg-info *
+
+Metadata-Version: 1.0
+Name: selenium
+Version: 2.0b4dev
+Summary: Python bindings for Selenium
+Home-page: http://code.google.com/p/selenium/
+Author: UNKNOWN
+Author-email: UNKNOWN
+License: UNKNOWN
+Description: ============
+        Introduction
+        ============
+        :Author: Miki Tebeka <miki@saucelabs.com>
+        
+        Selenium Python Client Driver is a Python language binding for Selenium Remote
+        Control (version 1.0 and 2.0).
+        
+        Currently the remote protocol, Firefox and Chrome for Selenium 2.0 are
+        supported, as well as the Selenium 1.0 bindings. As work will progresses we'll
+        add more "native" drivers.
+        
+        See here_ for more information.
+        
+        .. _here: http://code.google.com/p/selenium/
+        
+        Installing
+        ==========
+        
+        Python Client
+        -------------
+        ::
+        
+            pip install -U selenium
+        
+        Java Server
+        -----------
+        
+        Download the server from http://selenium.googlecode.com/files/selenium-server-standalone-2.0b3.jar
+        ::
+        
+            java -jar selenium-server-standalone-2.0b3.jar
+        
+        Example
+        =======
+        ::
+        
+            from selenium import webdriver 
+            from selenium.common.exceptions import NoSuchElementException
+            from selenium.webdriver.common.keys import Keys
+            import time 
+        
+            browser = webdriver.Firefox() # Get local session of firefox
+            browser.get("http://www.yahoo.com") # Load page
+            assert "Yahoo!" in browser.title
+            elem = browser.find_element_by_name("p") # Find the query box
+            elem.send_keys("seleniumhq" + Keys.RETURN)
+            time.sleep(0.2) # Let the page load, will be added to the API
+            try:
+                browser.find_element_by_xpath("//a[contains(@href,'http://seleniumhq.org')]")
+            except NoSuchElementException:
+                assert 0, "can't find seleniumhq"
+            browser.close()
+        
+        Documentation
+        =============
+        Coming soon, in the meantime - `"Use the source Luke"`_
+        
+        .. _"Use the source Luke": http://code.google.com/p/selenium/source/browse/trunk/remote/client/src/py/webdriver.py
+        
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: License :: OSI Approved :: Apache Software License
+Classifier: Operating System :: POSIX
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: MacOS :: MacOS X
+Classifier: Topic :: Software Development :: Testing
+Classifier: Topic :: Software Development :: Libraries
+Classifier: Programming Language :: Python
+Selenium 2.0 builds with its own build technology that's good for Windows, Linux and Mac.
+
+# Quick intro
+
+In the same directory as this file, do ...
+
+   ./go
+
+The order of building modules is determined by the 'go' system itself.  If you want to
+build an individual module (assuming all dependent modules have previously been build)
+try something like ...
+
+   ./go //javascript/atoms:test:run
+
+In this case, javascript/atoms is the module directory, and "test" is a target
+in that directory's build.desc file
+
+As you see 'build targets' scroll past in the log, you may want to run them individually.  
+'Go' can run them individually, by target name as long as ":run" is appended (see above).
+
+# Requirements
+
+* Java 6 JDK
+* "java" and "jar" on the PATH
+
+Although the build system is based on rake it's **strongly advised** to rely on the version of JRuby in third_party/ that is invoked by "go".  The only developer type who would want to deviate from this is the "build maintainer" who's experimenting with a JRuby upgrade. 
+
+## Optional Requirements
+
+* Python 2.6.x to 2.7  (without this, Python tests will be skipped)
+
+## Internet Explorer Driver
+
+If you plan to compile the IE driver you also need:
+
+* Visual Studio 2008
+* 32 and 64 bit cross compilers
+
+The build will work on any platform, but the tests for IE will be skipped silently, if you are not building on Windows.
+
+# Common Tasks
+
+For an express build of the binaries we release run the following from the directory containing the Rakefile:
+
+  ./go clean release
+
+All build output is placed under the "build" directory. The output can be found under "build/dist". If an error occurs while running this task complaining about a missing Albacore gem, the chances are you're using rvm. If this is the case, switch to the system ruby:
+
+  rvm system
+
+Of course, building the entire project can take too long. If you just want to build a single driver, then you can run one of these targets:
+
+  ./go chrome
+  ./go firefox
+  ./go htmlunit
+  ./go ie
+
+As the build progresses, you'll see it report where the build outputs are being placed. Of course, just building isn't enough. We should really be able to run the tests too. Try:
+
+  ./go test_chrome
+  ./go test_firefox
+  ./go test_htmlunit
+  ./go test_ie
+
+Note that the "test_chrome" target requires that you have the separate chromedriver binary available on your PATH. 
+
+If you are interested in a single language binding, try one of:
+
+  ./go test_java 
+
+To run all the tests just run:
+
+  ./go test
+
+This will detect your OS and run all the tests that are known to be stable for every browser that's appropriate to use for all language bindings. This can take a healthy amount of time to run.
+
+As a side note, none of the developers run tests using cygwin. It is very unlikely that the build will work as expected if you try and use cygwin.
+
+# Tour
+
+The code base is generally segmented around the languages used to write the component. Selenium makes extensive use of Javascript, so let's start there. Working on the javascript is easy. First of all, start the development server:
+
+  ./go debug-server
+  
+Now navigate to [http://localhost:2310/javascript](http://localhost:2310/javascript) You'll find the contents of the javascript directory being shown. We use the Closure Library for developing much of the javascript, so now navigate to [http://localhost:2310/javascript/atoms/test](http://localhost:2310/javascript/atoms/test)
+
+The tests in this directory are normal HTML files with names ending with "_test.html". Click on one to load the page and run the test. You can run all the javascript tests using:
+
+  ./go test_javascript
+
+# Maven POM files
+
+Ignore the Maven POM file present in the same directory. It is only used for releasing to jars to Maven Repository (public or local), and is not considered the main build mechanism.
+
+# Build Output
+
+"./go" only makes a top-level "build" directory. Outputs are placed under that relative to the target name. Which is probably best described with an example. For the target:
+
+  //java/client/src/org/openqa/selenium:selenium-api
+
+The output is found under:
+
+  build/java/client/src/org/openqa/selenium/selenium-api.jar
+
+If you watch the build, each step should print where its output is going. Java test outputs appear in one of two places: either under build/test_logs for junit or in build/build_log.xml for TestNG tests. If you'd like the build to be chattier, just append "log=true" to the build command line.
+
+# Help with 'Go'
+
+More general, but basic, help for 'go' ...
+
+   ./go --help
+
+Remember, "go" is just a wrapper around "rake", so you can use the standard rake commands such as "rake -T" to get more information about available targets.
+
+# Last word on building the bits and pieces of Selenium
+
+Refer [Building Web Driver wiki page](http://code.google.com/p/selenium/wiki/BuildingWebDriver)
+
+
+$LOAD_PATH.unshift File.expand_path(".")
+
+require 'rake'
+require 'rake/testtask'
+require 'rake/rdoctask'
+require 'rake-tasks/files'
+require 'yaml'
+require 'net/telnet'
+
+Rake.application.instance_variable_set "@name", "go"
+verbose false
+
+# The CrazyFun build grammar. There's no magic here, just ruby
+require 'rake-tasks/crazy_fun'
+require 'rake-tasks/crazy_fun/mappings/android'
+require 'rake-tasks/crazy_fun/mappings/gcc'
+require 'rake-tasks/crazy_fun/mappings/java'
+require 'rake-tasks/crazy_fun/mappings/javascript'
+require 'rake-tasks/crazy_fun/mappings/mozilla'
+require 'rake-tasks/crazy_fun/mappings/rake'
+require 'rake-tasks/crazy_fun/mappings/ruby'
+require 'rake-tasks/crazy_fun/mappings/visualstudio'
+
+# The original build rules
+require 'rake-tasks/task-gen'
+require 'rake-tasks/checks'
+require 'rake-tasks/dotnet'
+require 'rake-tasks/zip'
+require 'rake-tasks/c'
+require 'rake-tasks/java'
+require 'rake-tasks/iphone'
+require 'rake-tasks/selenium'
+require 'rake-tasks/se-ide'
+require 'rake-tasks/ie_code_generator'
+
+version = "2.0rc1"
+ide_version = "1.0.12"
+
+# The build system used by webdriver is layered on top of rake, and we call it
+# "crazy fun" for no readily apparent reason.
+
+# First off, create a new CrazyFun object.
+crazy_fun = CrazyFun.new
+
+# Secondly, we add the handlers, which are responsible for turning a build
+# rule into a (series of) rake tasks. For example if we're looking at a file
+# in subdirectory "subdir" contains the line:
+#
+# java_library(:name => "example", :srcs => ["foo.java"])
+#
+# we would generate a rake target of "//subdir:example" which would generate
+# a Java JAR at "build/subdir/example.jar".
+#
+# If crazy fun doesn't know how to handle a particular output type ("java_library"
+# in the example above) then it will throw an exception, stopping the build
+AndroidMappings.new.add_all(crazy_fun)
+GccMappings.new.add_all(crazy_fun)
+JavaMappings.new.add_all(crazy_fun)
+JavascriptMappings.new.add_all(crazy_fun)
+MozillaMappings.new.add_all(crazy_fun)
+RakeMappings.new.add_all(crazy_fun)
+RubyMappings.new.add_all(crazy_fun)
+VisualStudioMappings.new.add_all(crazy_fun)
+
+# Not every platform supports building every binary needed, so we sometimes
+# need to fall back to prebuilt binaries. The prebuilt binaries are stored in
+# a directory structure identical to that used in the "build" folder, but
+# rooted at one of the following locations:
+["android/prebuilt", "cpp/prebuilt", "ide/main/prebuilt", "javascript/firefox-driver/prebuilt"].each do |pre|
+  crazy_fun.prebuilt_roots << pre
+end
+
+# Finally, find every file named "build.desc" in the project, and generate
+# rake tasks from them. These tasks are normal rake tasks, and can be invoked
+# from rake.
+crazy_fun.create_tasks(Dir["**/build.desc"])
+
+# Notice that because we're using rake, anything you can do in a normal rake
+# build can also be done here. For example, here we set the default task
+task :default => [:test]
+
+
+task :all => [:'selenium-java', :'android']
+task :all_zip => [:'selenium-java_zip']
+task :chrome => [ "//java/client/src/org/openqa/selenium/chrome" ]
+task :common_core => [ "//common:core" ]
+task :grid => [ "//java/server/src/org/openqa/grid/selenium" ]
+task :htmlunit => [ "//java/client/src/org/openqa/selenium/htmlunit" ]
+task :ie => [ "//java/client/src/org/openqa/selenium/ie" ]
+task :firefox => [ "//java/client/src/org/openqa/selenium/firefox" ]
+task :'debug-server' => "//java/client/test/org/openqa/selenium/environment/webserver:webserver:run"
+task :remote => [:remote_common, :remote_server, :remote_client]
+task :remote_common => ["//java/client/src/org/openqa/selenium/remote:common"]
+task :remote_client => ["//java/client/src/org/openqa/selenium/remote"]
+task :remote_server => ["//java/server/src/org/openqa/selenium/remote/server"]
+task :server_lite => ["//java/server/src/org/openqa/selenium/server:server_lite"]
+task :selenium => [ "//java/client/src/org/openqa/selenium" ]
+task :support => [
+  "//java/client/src/org/openqa/selenium/lift",
+  "//java/client/src/org/openqa/selenium/support",
+]
+task :iphone_client => ['//java/client/src/org/openqa/selenium/iphone']
+task :iphone => [:iphone_server, :iphone_client]
+task :'selenium-server-standalone' => ["//java/server/src/org/openqa/selenium/remote/server:server:uber"]
+
+task :ide => [ "//ide:selenium-ide-multi" ]
+task :ide_proxy_setup => [ "//common/src/js/selenium:core", "se_ide:setup_proxy" ]
+task :ide_proxy_remove => [ "se_ide:remove_proxy" ]
+
+task :test_javascript => [
+  '//javascript/atoms:test:run',
+  '//javascript/webdriver-atoms:test:run',
+  '//javascript/selenium-atoms:test:run',
+  '//javascript/selenium-core:test:run']
+task :test_android => ["//java/client/test/org/openqa/selenium/android:android-test:run"]
+task :test_chrome => [ "//java/client/test/org/openqa/selenium/chrome:test:run" ]
+task :test_htmlunit => [ "//java/client/test/org/openqa/selenium/htmlunit:test:run" ]
+task :test_grid => [
+  "//java/server/test/org/openqa/grid/common:test:run",
+  "//java/server/test/org/openqa/grid:test:run",
+  "//java/server/test/org/openqa/grid/e2e:test:run"
+]
+task :test_ie => [ "//java/client/test/org/openqa/selenium/ie:test:run" ]
+task :test_jobbie => [ :test_ie ]
+task :test_firefox => [ "//java/client/test/org/openqa/selenium/firefox:test:run" ]
+task :test_remote => [ "//java/server/test/org/openqa/selenium/remote/server:test:run" ]
+task :test_support => [
+  "//java/client/test/org/openqa/selenium/lift:test:run",
+  "//java/client/test/org/openqa/selenium/support:test:run"
+]
+task :test_iphone_client => [:'webdriver-iphone-client-test']
+task :test_iphone => [:test_iphone_server, :test_iphone_client]
+task :android => [:android_client, :android_server]
+task :android_client => ['//java/client/src/org/openqa/selenium/android']
+task :android_server => ['//android:android-server']
+
+# TODO(simon): test-core should go first, but it's changing the least for now.
+task :test_selenium => [ :'test-rc', :'test-v1-emulation', :'test-selenium-backed-webdriver', :'test-core']
+
+task :'test-selenium-backed-webdriver' => ['//java/client/test/org/openqa/selenium/v1:selenium-backed-webdriver-test:run']
+task :'test-v1-emulation' => [ '//java/client/test/com/thoughtworks/selenium:firefox-emulation-test:run' ]
+task :'test-rc' => [ '//java/client/test/com/thoughtworks/selenium:firefox-rc-test:run' ]
+task :'test-core' => [:'test-core-firefox']
+
+if (windows?)
+  task :'test-v1-emulation' => ['//java/client/test/com/thoughtworks/selenium:ie-emulation-test:run']
+  task :'test-rc' => ['//java/client/test/com/thoughtworks/selenium:ie-rc-test:run']
+  task :'test-core' => [:'test-core-ie']
+#elsif (mac?)
+#  task :'test-rc' => ['//java/client/test/com/thoughtworks/selenium:safari-rc-test:run']
+#  task :'test-core' => [:'test-core-safari']
+end
+
+task :test_java => [
+  "//java/client/test/org/openqa/selenium/atoms:test:run",
+  "//java/client/test/org/openqa/selenium/support:test:run",
+  "//java/client/test/org/openqa/selenium/htmlunit:test:run",
+  "//java/client/test/org/openqa/selenium/firefox:test:run",
+  "//java/client/test/org/openqa/selenium/ie:test:run",
+  "//java/server/test/org/openqa/selenium/remote/server:test:run",
+  :test_selenium,
+  "test_grid"
+# Can't be sure that android is installed.
+#  :test_android,
+# Chrome isn't stable enough to include here.
+#  "//chrome:test:run"
+]
+
+task :test_rb => [
+  "//rb:unit-test",
+  "//rb:rc-client-unit-test",
+  "//rb:firefox-test",
+  "//rb:remote-test",
+  "//rb:rc-client-integration-test",
+ ("//rb:ie-test" if windows?),
+  "//rb:chrome-test"
+].compact
+
+task :test_py => [
+  "test_firefox_py"
+]
+
+task :test_dotnet => [
+  "//dotnet:firefox-test"
+]
+
+task :test => [ :test_javascript, :test_java, :test_rb ]
+if (msbuild_installed?)
+  task :test => [ :test_dotnet ]
+end
+if (python?)
+  task :test => [ :test_py ]
+end
+
+
+task :build => [:all, :iphone, :remote, :selenium]
+
+desc 'Clean build artifacts.'
+task :clean do
+  rm_rf 'build/'
+  rm_rf 'iphone/build/'
+  rm_rf 'android/bin/'
+  rm_rf 'android/build/'
+  rm_rf 'android/libs/'
+  rm_rf 'android/client/bin/'
+  Android::Clean.new()
+end
+
+task :dotnet => [ "//dotnet:ie", "//dotnet:firefox", "//dotnet:chrome", "//dotnet:support", "//dotnet:core", "//dotnet:webdriverbackedselenium" ]
+
+# Generate a C++ Header file for mapping between magic numbers and #defines
+# in the C++ code.
+ie_generate_type_mapping(:name => "ie_result_type_cpp",
+                         :src => "cpp/IEDriver/result_types.txt",
+                         :type => "cpp",
+                         :out => "cpp/IEDriver/IEReturnTypes.h")
+
+# Generate a Java class for mapping between magic numbers and Java static
+# class members describing them.
+ie_generate_type_mapping(:name => "ie_result_type_java",
+                         :src => "cpp/IEDriver/result_types.txt",
+                         :type => "java",
+                         :out => "java/client/src/org/openqa/selenium/ie/IeReturnTypes.java")
+
+gecko_sdk = "third_party/gecko-1.9.0.11/linux/"
+
+dll(:name => "libwebdriver_firefox_so",
+    :src  => FileList.new('cpp/webdriver-interactions/*_linux*.cpp') +
+             FileList.new('cpp/webdriver-firefox/*.cpp'),
+    :arch => "i386",
+    :args => " -DXPCOM_GLUE  -DXPCOM_GLUE_USE_NSPR -I cpp/webdriver-interactions -I cpp/imehandler/common -I #{gecko_sdk}include -I /usr/include/nspr " + "`pkg-config gtk+-2.0 --cflags`",
+    :link_args => "-Wall -fno-rtti -fno-exceptions -shared  -fPIC -L#{gecko_sdk}lib -L#{gecko_sdk}bin -Wl,-rpath-link,#{gecko_sdk}bin -lxpcomglue_s -lxpcom -lnspr4 -lrt `pkg-config gtk+-2.0 --libs`",
+    :prebuilt => "cpp/prebuilt/i386/libwebdriver-firefox.so",
+    :out  => "cpp/i386/libwebdriver-firefox.so")
+
+# There is no official 64 bit gecko SDK. Fall back to trying to use the one on
+# system, but be ready for this to fail. I have a Ubuntu machine, so that's
+# what I'm basing this on. I understand that's a Bad Idea
+begin
+  pkg_config_gecko = sh "pkg-config --exists libxul"
+rescue
+  pkg_config_gecko = false
+end
+
+if pkg_config_gecko
+  libs_cmd = open("| pkg-config --libs libxul")
+  local_gecko_libs = libs_cmd.readline.gsub "\n", ""
+  cflags_cmd = open("| pkg-config --cflags libxul")
+  local_gecko_include = cflags_cmd.readline.gsub "\n", ""
+else
+  puts 'No Gecko SDK detected. Install xulrunner-dev (xulrunner-devel for macports) to compile 64-bit Firefox extension.'
+  local_gecko_include = ""
+  local_gecko_libs = ""
+end
+
+dll(:name => "libwebdriver_firefox_so64",
+    :src  => FileList.new('cpp/webdriver-interactions/*_linux*.cpp') +
+             FileList.new('cpp/webdriver-firefox/*.cpp'),
+    :arch => "amd64",
+    :args => " -DXPCOM_GLUE  -DXPCOM_GLUE_USE_NSPR -fPIC -fshort-wchar -I cpp/webdriver-interactions -I cpp/imehandler/common #{local_gecko_include} `pkg-config gtk+-2.0 --cflags` ",
+    :link_args => "-Wall -Os #{local_gecko_libs} -lrt `pkg-config gtk+-2.0 --libs` -fno-rtti -fno-exceptions -shared  -fPIC",
+    :prebuilt => "cpp/prebuilt/amd64/libwebdriver-firefox.so",
+    :out  => "cpp/amd64/libwebdriver-firefox.so")
+
+task :'selenium-server_zip' do
+  temp = "build/selenium-server_zip"
+  mkdir_p temp
+  sh "cd #{temp} && jar xf ../selenium-server.zip"
+  rm_f "build/selenium-server.zip"
+  Dir["#{temp}/webdriver-*.jar"].each { |file| rm_rf file }
+  mv "#{temp}/selenium-server.jar", "#{temp}/selenium-server-#{version}.jar"
+  sh "cd #{temp} && jar cMf ../selenium-server.zip *"
+end
+
+{"firefox" => "*chrome",
+ "ie" => "*iexploreproxy",
+ "opera" => "*opera",
+ "safari" => "*safari"}.each_pair do |k,v|
+  selenium_test(:name => "test-core-#{k}",
+                :srcs => [ "common/test/js/core/*.js" ],
+                :deps => [
+                  "//java/server/test/org/openqa/selenium:server-with-tests:uber",
+                ],
+                :browser => v )
+end
+
+task :javadocs => [:common, :firefox, :htmlunit, :ie, :remote, :support, :chrome, :selenium] do
+  mkdir_p "build/javadoc"
+   sourcepath = ""
+   classpath = '.'
+   Dir["third_party/java/*/*.jar"].each do |jar|
+     classpath << ":" + jar
+   end
+   [File.join(%w(java client src))].each do |m|
+     sourcepath += File::PATH_SEPARATOR + m
+   end
+   p sourcepath
+   cmd = "javadoc -d build/javadoc -sourcepath #{sourcepath} -classpath #{classpath} -subpackages org.openqa.selenium -subpackages com.thoughtworks "
+   cmd << " -exclude org.openqa.selenium.internal.selenesedriver:org.openqa.selenium.internal.seleniumemulation:org.openqa.selenium.remote.internal"
+   if (windows?)
+     cmd = cmd.gsub(/\//, "\\").gsub(/:/, ";")
+   end
+   sh cmd
+end
+
+# Installs the webdriver python bindings using virtualenv for testing.
+task :webdriver_py do
+  if python? then
+    pip_pkg = "pip install simplejson py pytest rdflib"
+    virtualenv = "virtualenv --no-site-packages build/python"
+    pip_install = 'build/python/bin/' + pip_pkg 
+    if (windows?) then
+       virtualenv = "virtualenv build\\python"
+       pip_install = "build\\python\\Scripts\\" + pip_pkg 
+    end
+
+    sh virtualenv, :verbose => true do |ok, res|
+        if ! ok
+            puts ""
+            puts "PYTHON DEPENDENCY ERROR: Virtualenv not found."
+            puts "Please run '[sudo] pip install virtualenv'"
+            puts ""
+        end
+    end
+
+    sh pip_install, :verbose => true
+  end
+end
+
+task :test_ie_py => :webdriver_py do
+  win = windows?
+  if win != nil then
+    if python? then
+      cp 'cpp\\prebuilt\\Win32\\Release\\IEDriver.dll', "py\\selenium\\webdriver\\ie", :verbose => true
+      sh "build\\python\\Scripts\\python setup.py build", :verbose => true
+    
+      if File.exists?('build\\python\\Scripts\\py.test.exe')
+          py_test = 'build\\python\\Scripts\\py.test.exe'
+      else
+          py_test = 'py.test.exe'
+      end
+    
+      test_dir = Dir.glob('build/lib**/selenium/test/selenium/webdriver/ie').first
+      sh py_test, test_dir, :verbose => true
+      rm "py\\selenium\\webdriver\\ie\\IEDriver.dll"
+    end
+  end
+end
+
+task :test_chrome_py => [:webdriver_py, :chrome] do
+  if python? then
+    py_test_path = 'build/python/bin/py.test'
+    py_setup = "build/python/bin/python " + 'setup.py build'
+    if (windows?) then
+      py_test_path = 'build\\python\\Scripts\\py.test.exe'
+      py_setup = 'build\\python\\Scripts\\python ' + 'setup.py build'
+    end
+
+    sh py_setup , :verbose => true
+
+    if File.exists?(py_test_path)
+        py_test = py_test_path 
+    else
+        py_test = 'py.test'
+    end
+    test_dir = Dir.glob('build/lib**/selenium/test/selenium/webdriver/chrome').first
+    sh py_test, test_dir, "-k -ignore_chrome", :verbose => true
+  end
+end
+
+task :test_firefox_py => [:webdriver_py, :firefox, "//javascript/firefox-driver:webdriver"] do
+  if python? then
+    xpi_zip_build = 'build/javascript/firefox-driver/webdriver.xpi'
+    firefox_py_home = "py/selenium/webdriver/firefox/"
+    py_test_path = 'build/python/bin/py.test'
+    py_setup = "build/python/bin/python " + 'setup.py build'
+    if (windows?) then
+      xpi_zip_build = xpi_zip_build.gsub(/\//, "\\")
+      firefox_py_home = firefox_py_home .gsub(/\//, "\\")
+      py_test_path = 'build\\python\\Scripts\\py.test.exe'
+      py_setup = 'build\\python\\Scripts\\python ' + 'setup.py build'
+    end
+
+    cp xpi_zip_build , firefox_py_home, :verbose => true
+
+    sh py_setup , :verbose => true
+
+
+    if File.exists?(py_test_path)
+        py_test = py_test_path 
+    else
+        py_test = 'py.test'
+    end
+    test_dir = Dir.glob('build/lib**/selenium/test/selenium/webdriver/firefox').first
+    sh py_test, test_dir, :verbose => true
+    webdriver_zip = firefox_py_home + 'webdriver.xpi'
+    rm webdriver_zip , :verbose => true
+  end
+end
+
+task :test_remote_py => [:webdriver_py, :remote_client, :'selenium-server-standalone',
+                         '//java/server/test/org/openqa/selenium/remote/server/auth:server:uber'] do
+  if python? then
+    py_setup = "build/python/bin/python " + 'setup.py build'
+    py_test_path = 'build/python/bin/py.test'
+
+    if (windows?) then
+      py_test_path = 'build\\python\\Scripts\\py.test.exe'
+      py_setup = 'build\\python\\Scripts\\python ' + 'setup.py build'
+    end
+
+    sh py_setup , :verbose => true
+    
+    if File.exists?(py_test_path)
+        py_test = py_test_path 
+    else
+        py_test = 'py.test'
+    end
+    test_dir = Dir.glob('build/lib**/selenium/test/selenium/webdriver/remote').first
+    sh py_test, test_dir, :verbose => true
+  end
+end
+
+task :py_prep_for_install_release => ["//javascript/firefox-driver:webdriver", :chrome] do
+    if python? then
+
+        firefox_py_home = "py/selenium/webdriver/firefox/"
+        xpi_zip_build = 'build/javascript/firefox-driver/webdriver.xpi'
+        
+        ie_driver = 'cpp/prebuilt/Win32/Release/IEDriver.dll' 
+        ie_py_home = "py/selenium/webdriver/ie"
+        if (windows?) then
+            xpi_zip_build = xpi_zip_build.gsub(/\//, "\\")
+            firefox_py_home = firefox_py_home .gsub(/\//, "\\")
+            ie_driver = ie_driver.gsub(/\//, "\\")
+            ie_py_home = ie_py_home.gsub(/\//, "\\")
+        end
+        
+        cp xpi_zip_build , firefox_py_home, :verbose => true
+        cp ie_driver, ie_py_home, :verbose => true
+    end
+end
+
+task :py_install => :py_prep_for_install_release do
+    sh "python setup.py install"
+end
+
+task :py_release => :py_prep_for_install_release do
+    sh "python setup.py sdist upload"
+end
+
+
+task :test_selenium_py => [:'selenium-core', :'selenium-server-standalone'] do
+    if python? then
+        sh "python2.6 selenium/test/py/runtests.py", :verbose => true
+    end
+end
+
+
+iphone_test(:name => "webdriver-iphone-client-test",
+            :srcs => [ "iphone/test/java/**/*.java" ],
+            :deps => [
+                       :test_common,
+                       :iphone_server,
+                       :iphone_client
+                     ])
+
+
+#### iPhone ####
+task :iphone_server do
+  sdk = iPhoneSDK?
+  if sdk != nil then
+    puts "Building iWebDriver iphone app."
+    sh "cd iphone && xcodebuild -sdk #{sdk} ARCHS=i386 -target iWebDriver", :verbose => false
+  else
+    puts "XCode not found. Not building the iphone driver."
+  end
+end
+
+# This does not depend on :iphone_server because the dependancy is specified in xcode
+task :test_iphone_server do
+  sdk = iPhoneSDK?
+  if sdk != nil then
+    sh "cd iphone && xcodebuild -sdk #{sdk} ARCHS=i386 -target Tests"
+  else
+    puts "XCode and/or iPhoneSDK not found. Not testing iphone_server."
+  end
+end
+
+file "iphone/src/objc/atoms.h" => ["//iphone:atoms"] do |task|
+  puts "Writing: #{task}"
+  cp "build/iphone/atoms.h", "iphone/src/objc/atoms.h"
+end
+task :iphone_atoms => ["iphone/src/objc/atoms.h"]
+
+file "cpp/IEDriver/sizzle.h" => [ "//third_party/js/sizzle:sizzle:header" ] do
+  cp "build/third_party/js/sizzle/sizzle.h", "cpp/IEDriver/sizzle.h"
+end
+task :sizzle_header => [ "cpp/IEDriver/sizzle.h" ]
+
+file "javascript/deps.js" => FileList["third_party/closure/goog/**/*.js", "javascript/*-atom*/*.js"] do
+  our_cmd = "java -jar third_party/py/jython.jar third_party/closure/bin/calcdeps.py "
+  our_cmd << "--output_mode=deps --path=javascript "
+  our_cmd << "--dep=third_party/closure/goog"
+
+  # Generate the deps. The file paths will be as they appear on the filesystem,
+  # but for our tests, the WebDriverJS source files are served from /js/src and
+  # the Closure Library source is under /third_party/closure/goog, so we need
+  # to modify the generated paths to match that scheme.
+  output = ""
+  io = IO.popen(our_cmd)
+    io.each do |line|
+      line = line.gsub("\\\\", "/")
+      output << line.gsub(/common\/(.*)\/js/, 'js/\1')
+    end
+  File.open("javascript/deps.js", "w") do |f| f.write(output); end
+end
+
+desc "Calculate dependencies required for testing the automation atoms"
+task :calcdeps => "javascript/deps.js"
+
+def version
+  `svn info | grep Revision | awk -F: '{print $2}' | tr -d '[:space:]' | tr -d '\n'`
+end
+
+task :release => [
+    '//java/server/src/org/openqa/selenium/server:server:zip',
+    '//java/server/src/org/openqa/selenium/server:server:uber',
+    '//java/server/src/org/openqa/grid/selenium:selenium:uber',
+    '//java/client/src/org/openqa/selenium:client-combined:zip'
+  ] do |t|
+  # Unzip each of the deps and rename the pieces that need renaming
+  renames = {
+    "client-combined-nodeps-srcs.jar" => "selenium-java-#{version}-srcs.jar",
+    "client-combined-nodeps.jar" => "selenium-java-#{version}.jar",
+    "server-nodeps-srcs.jar" => "selenium-server-#{version}-srcs.jar",
+    "server-nodeps.jar" => "selenium-server-#{version}.jar",
+    "server-standalone.jar" => "selenium-server-standalone-#{version}.jar",
+  }
+
+  t.prerequisites.each do |pre|
+    zip = Rake::Task[pre].out
+    
+    next unless zip =~ /\.zip$/
+    
+    temp =  zip + "rename"
+    rm_rf temp
+    deep = File.join(temp, "/selenium-#{version}")
+    mkdir_p deep
+
+    sh "cd #{deep} && jar xf ../../#{zip.split('/')[-1]}"
+    renames.each do |from, to|
+      src = File.join(deep, from)
+            next unless File.exists?(src)
+
+      mv src, File.join(deep, to)
+    end
+    rm_f File.join(deep, "client-combined-standalone.jar")
+    rm zip
+    sh "cd #{temp} && jar cMf ../#{zip.split('/')[-1]} *"
+
+    rm_rf temp
+  end
+
+  mkdir_p "build/dist"
+  cp "build/java/server/src/org/openqa/selenium/server/server-standalone.jar", "build/dist/selenium-server-standalone-#{version}-without-grid.jar"
+  cp "build/java/server/src/org/openqa/grid/selenium/selenium-standalone.jar", "build/dist/selenium-server-standalone-#{version}.jar"
+  cp "build/java/server/src/org/openqa/selenium/server/server.zip", "build/dist/selenium-server-#{version}.zip"
+  cp "build/java/client/src/org/openqa/selenium/client-combined.zip", "build/dist/selenium-java-#{version}.zip"
+end
+
+desc 'Build the selenium client jars'
+task 'selenium-java' => '//java/client/src/org/openqa/selenium:client-combined:project'
+
+desc 'Build the standalone server'
+task 'selenium-server-standalone' => '//java/server/src/org/openqa/selenium/server:server:uber'
+
+desc 'Build and package Selenium IDE'
+task :release_ide  => [:ide] do
+  cp 'build/ide/selenium-ide.xpi', "build/ide/selenium-ide-#{ide_version}.xpi"
+end

File WebDriver.sln

+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "web", "common\src\web\", "{DB560F4B-1F41-4E8E-AC06-640D736E8A72}"
+	ProjectSection(WebsiteProperties) = preProject
+		TargetFramework = "2.0"
+		Debug.AspNetCompiler.VirtualPath = "/web"
+		Debug.AspNetCompiler.PhysicalPath = "common\src\web\"
+		Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\web\"
+		Debug.AspNetCompiler.Updateable = "true"
+		Debug.AspNetCompiler.ForceOverwrite = "true"
+		Debug.AspNetCompiler.FixedNames = "false"
+		Debug.AspNetCompiler.Debug = "True"
+		Release.AspNetCompiler.VirtualPath = "/web"
+		Release.AspNetCompiler.PhysicalPath = "common\src\web\"
+		Release.AspNetCompiler.TargetPath = "PrecompiledWeb\web\"
+		Release.AspNetCompiler.Updateable = "true"
+		Release.AspNetCompiler.ForceOverwrite = "true"
+		Release.AspNetCompiler.FixedNames = "false"
+		Release.AspNetCompiler.Debug = "False"
+		VWDPort = "2310"
+		VWDDynamicPort = "false"
+		VWDVirtualPath = "/common"
+		DefaultWebSiteLanguage = "Visual C#"
+		StartServerOnDebug = "false"
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "webdriver-interactions", "cpp\webdriver-interactions\webdriver-interactions.vcproj", "{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "webdriver-firefox", "cpp\webdriver-firefox\webdriver-firefox.vcproj", "{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "npchromedriver", "cpp\npchromedriver\npchromedriver.vcproj", "{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IEDriver", "cpp\IEDriver\IEDriver.vcproj", "{BB72383B-427F-4191-B692-E4345A30E33C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228} = {9AEBD612-232D-40CB-BE2C-F2B911FD6228}
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD} = {320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "json-cpp", "third_party\json-cpp\json-cpp.vcproj", "{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mongoose", "third_party\mongoose\mongoose.vcproj", "{9AEBD612-232D-40CB-BE2C-F2B911FD6228}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Selenium.Core", "dotnet\src\Selenium.Core\Selenium.Core.csproj", "{69F4FF0E-13DE-4AF6-B8AF-572A36239083}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Selenium.WebDriverBackedSelenium", "dotnet\src\Selenium.WebDriverBackedSelenium\Selenium.WebDriverBackedSelenium.csproj", "{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Chrome", "dotnet\src\WebDriver.Chrome\WebDriver.Chrome.csproj", "{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Common", "dotnet\src\WebDriver.Common\WebDriver.Common.csproj", "{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Remote.Common", "dotnet\src\WebDriver.Remote.Common\WebDriver.Remote.Common.csproj", "{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Remote", "dotnet\src\WebDriver.Remote\WebDriver.Remote.csproj", "{32122F8D-CD64-495A-B9B0-5516FF67C79F}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Firefox", "dotnet\src\WebDriver.Firefox\WebDriver.Firefox.csproj", "{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.IE", "dotnet\src\WebDriver.IE\WebDriver.IE.csproj", "{388643B5-2270-4E89-99CC-DA761E4E4AC1}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Support", "dotnet\src\WebDriver.Support\WebDriver.Support.csproj", "{A9779443-E254-47E9-B733-8AC6D3662CA6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Common.Tests", "dotnet\test\WebDriver.Common.Tests\WebDriver.Common.Tests.csproj", "{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Remote.Tests", "dotnet\test\WebDriver.Remote.Tests\WebDriver.Remote.Tests.csproj", "{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Chrome.Tests", "dotnet\test\WebDriver.Chrome.Tests\WebDriver.Chrome.Tests.csproj", "{81D664AA-FC03-425E-98A8-B4EAF8236776}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Firefox.Tests", "dotnet\test\WebDriver.Firefox.Tests\WebDriver.Firefox.Tests.csproj", "{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.IE.Tests", "dotnet\test\WebDriver.IE.Tests\WebDriver.IE.Tests.csproj", "{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDriver.Support.Tests", "dotnet\test\WebDriver.Support.Tests\WebDriver.Support.Tests.csproj", "{1B70379B-5325-4243-8629-5C32802E9826}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Selenium.Core.Tests", "dotnet\test\Selenium.Core.Tests\Selenium.Core.Tests.csproj", "{42D1B587-9544-452F-8B76-4F2A65BC9BE5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Selenium.WebDriverBackedSelenium.Tests", "dotnet\test\Selenium.WebDriverBackedSelenium.Tests\Selenium.WebDriverBackedSelenium.Tests.csproj", "{68CF4628-4148-4627-ACA1-D4C225365D3F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "imehandler", "cpp\imehandler\imehandler.vcproj", "{37F9EF6B-F69C-4764-9687-C63C608C476B}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|.NET = Debug|.NET
+		Debug|Any CPU = Debug|Any CPU
+		Debug|Mixed Platforms = Debug|Mixed Platforms
+		Debug|Win32 = Debug|Win32
+		Debug|x64 = Debug|x64
+		Release|.NET = Release|.NET
+		Release|Any CPU = Release|Any CPU
+		Release|Mixed Platforms = Release|Mixed Platforms
+		Release|Win32 = Release|Win32
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Debug|.NET.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Debug|Any CPU.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Debug|Mixed Platforms.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Debug|Win32.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Debug|x64.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Release|.NET.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Release|Any CPU.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Release|Mixed Platforms.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Release|Win32.ActiveCfg = Debug|.NET
+		{DB560F4B-1F41-4E8E-AC06-640D736E8A72}.Release|x64.ActiveCfg = Debug|.NET
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|.NET.ActiveCfg = Debug|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|Win32.ActiveCfg = Debug|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|Win32.Build.0 = Debug|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|x64.ActiveCfg = Debug|x64
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Debug|x64.Build.0 = Debug|x64
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|.NET.ActiveCfg = Release|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|Any CPU.ActiveCfg = Release|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|Win32.ActiveCfg = Release|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|Win32.Build.0 = Release|Win32
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|x64.ActiveCfg = Release|x64
+		{87FA39A1-958E-478A-8AB9-6D5E5AAA3886}.Release|x64.Build.0 = Release|x64
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Debug|.NET.ActiveCfg = Debug|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Debug|Win32.ActiveCfg = Debug|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Debug|Win32.Build.0 = Debug|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Debug|x64.ActiveCfg = Debug|x64
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Release|.NET.ActiveCfg = Release|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Release|Any CPU.ActiveCfg = Release|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Release|Win32.ActiveCfg = Release|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Release|Win32.Build.0 = Release|Win32
+		{A9D3BB2D-FD1E-43A2-80F6-F8320682323E}.Release|x64.ActiveCfg = Release|x64
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|.NET.ActiveCfg = Debug|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|Win32.ActiveCfg = Debug|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|Win32.Build.0 = Debug|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|x64.ActiveCfg = Debug|x64
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Debug|x64.Build.0 = Debug|x64
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|.NET.ActiveCfg = Release|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|Any CPU.ActiveCfg = Release|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|Win32.ActiveCfg = Release|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|Win32.Build.0 = Release|Win32
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|x64.ActiveCfg = Release|x64
+		{2A4FDEBC-1AB8-4E35-8806-E4CC12285526}.Release|x64.Build.0 = Release|x64
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|.NET.ActiveCfg = Debug|x64
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|Win32.ActiveCfg = Debug|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|Win32.Build.0 = Debug|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|x64.ActiveCfg = Debug|x64
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Debug|x64.Build.0 = Debug|x64
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|.NET.ActiveCfg = Release|x64
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|Any CPU.ActiveCfg = Release|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|Win32.ActiveCfg = Release|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|Win32.Build.0 = Release|Win32
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|x64.ActiveCfg = Release|x64
+		{BB72383B-427F-4191-B692-E4345A30E33C}.Release|x64.Build.0 = Release|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|.NET.ActiveCfg = Debug|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|Any CPU.ActiveCfg = Debug|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|Win32.ActiveCfg = Debug|Win32
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|Win32.Build.0 = Debug|Win32
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|x64.ActiveCfg = Debug|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Debug|x64.Build.0 = Debug|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|.NET.ActiveCfg = Release|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|Any CPU.ActiveCfg = Release|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|Mixed Platforms.Build.0 = Release|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|Win32.ActiveCfg = Release|Win32
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|Win32.Build.0 = Release|Win32
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|x64.ActiveCfg = Release|x64
+		{320F3BBE-8223-4E7F-ABEE-18D3BD57B1FD}.Release|x64.Build.0 = Release|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|.NET.ActiveCfg = Debug|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|Any CPU.ActiveCfg = Debug|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|Mixed Platforms.ActiveCfg = Debug|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|Mixed Platforms.Build.0 = Debug|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|Win32.ActiveCfg = Debug|Win32
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|Win32.Build.0 = Debug|Win32
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|x64.ActiveCfg = Debug|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Debug|x64.Build.0 = Debug|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|.NET.ActiveCfg = Release|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|Any CPU.ActiveCfg = Release|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|Mixed Platforms.ActiveCfg = Release|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|Mixed Platforms.Build.0 = Release|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|Win32.ActiveCfg = Release|Win32
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|Win32.Build.0 = Release|Win32
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|x64.ActiveCfg = Release|x64
+		{9AEBD612-232D-40CB-BE2C-F2B911FD6228}.Release|x64.Build.0 = Release|x64
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Release|.NET.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Release|Any CPU.Build.0 = Release|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Release|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Release|Mixed Platforms.Build.0 = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Release|Win32.ActiveCfg = Debug|Any CPU
+		{69F4FF0E-13DE-4AF6-B8AF-572A36239083}.Release|x64.ActiveCfg = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Release|.NET.ActiveCfg = Release|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Release|Win32.ActiveCfg = Release|Any CPU
+		{0EAF6AA9-B712-464B-A11B-FA3CF7577D80}.Release|x64.ActiveCfg = Release|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Release|.NET.ActiveCfg = Release|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Release|Win32.ActiveCfg = Release|Any CPU
+		{FC3000BD-6144-46E6-BA7B-1CCE7E85DD27}.Release|x64.ActiveCfg = Release|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Release|.NET.ActiveCfg = Release|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Release|Win32.ActiveCfg = Release|Any CPU
+		{ABB9B87F-FEEA-410E-ACBF-26479B8C72B0}.Release|x64.ActiveCfg = Release|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Release|.NET.ActiveCfg = Release|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Release|Win32.ActiveCfg = Release|Any CPU
+		{C2A1DAE4-BB20-4367-8ADC-D32EEA392D17}.Release|x64.ActiveCfg = Release|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Release|.NET.ActiveCfg = Release|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Release|Win32.ActiveCfg = Release|Any CPU
+		{32122F8D-CD64-495A-B9B0-5516FF67C79F}.Release|x64.ActiveCfg = Release|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Release|.NET.ActiveCfg = Release|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Release|Win32.ActiveCfg = Release|Any CPU
+		{5E7C67A1-1BF2-4A46-8C29-8A6DCF6E4543}.Release|x64.ActiveCfg = Release|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Release|.NET.ActiveCfg = Release|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Release|Win32.ActiveCfg = Release|Any CPU
+		{388643B5-2270-4E89-99CC-DA761E4E4AC1}.Release|x64.ActiveCfg = Release|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Release|.NET.ActiveCfg = Release|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Release|Win32.ActiveCfg = Release|Any CPU
+		{A9779443-E254-47E9-B733-8AC6D3662CA6}.Release|x64.ActiveCfg = Release|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Release|.NET.ActiveCfg = Release|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Release|Win32.ActiveCfg = Release|Any CPU
+		{1580564D-B6B8-4BD8-A120-001E3E8E5BE6}.Release|x64.ActiveCfg = Release|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Release|.NET.ActiveCfg = Release|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Release|Win32.ActiveCfg = Release|Any CPU
+		{1D3DF4DB-6C11-480D-9774-F489B2EF62D8}.Release|x64.ActiveCfg = Release|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Release|.NET.ActiveCfg = Release|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Release|Any CPU.Build.0 = Release|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Release|Win32.ActiveCfg = Release|Any CPU
+		{81D664AA-FC03-425E-98A8-B4EAF8236776}.Release|x64.ActiveCfg = Release|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Release|.NET.ActiveCfg = Release|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Release|Win32.ActiveCfg = Release|Any CPU
+		{630FC167-169E-4CFD-83ED-9BA4AA8A0FB4}.Release|x64.ActiveCfg = Release|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Release|.NET.ActiveCfg = Release|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Release|Win32.ActiveCfg = Release|Any CPU
+		{ECF3B49F-68B0-4A2A-8559-6D7FB906AA88}.Release|x64.ActiveCfg = Release|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Release|.NET.ActiveCfg = Release|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Release|Win32.ActiveCfg = Release|Any CPU
+		{1B70379B-5325-4243-8629-5C32802E9826}.Release|x64.ActiveCfg = Release|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Release|.NET.ActiveCfg = Release|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Release|Win32.ActiveCfg = Release|Any CPU
+		{42D1B587-9544-452F-8B76-4F2A65BC9BE5}.Release|x64.ActiveCfg = Release|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Debug|.NET.ActiveCfg = Debug|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Debug|Win32.ActiveCfg = Debug|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Debug|x64.ActiveCfg = Debug|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Release|.NET.ActiveCfg = Release|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Release|Any CPU.Build.0 = Release|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Release|Win32.ActiveCfg = Release|Any CPU
+		{68CF4628-4148-4627-ACA1-D4C225365D3F}.Release|x64.ActiveCfg = Release|Any CPU
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Debug|.NET.ActiveCfg = Debug|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Debug|Any CPU.ActiveCfg = Debug|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Debug|Mixed Platforms.Build.0 = Debug|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Debug|Win32.ActiveCfg = Debug|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Debug|Win32.Build.0 = Debug|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Debug|x64.ActiveCfg = Debug|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Release|.NET.ActiveCfg = Release|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Release|Any CPU.ActiveCfg = Release|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Release|Mixed Platforms.ActiveCfg = Release|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Release|Mixed Platforms.Build.0 = Release|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Release|Win32.ActiveCfg = Release|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Release|Win32.Build.0 = Release|Win32
+		{37F9EF6B-F69C-4764-9687-C63C608C476B}.Release|x64.ActiveCfg = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

File docs/api/py/index.rst

+============
+Introduction
+============
+:Author: Miki Tebeka <miki@saucelabs.com>
+
+Selenium Python Client Driver is a Python language binding for Selenium Remote
+Control (version 1.0 and 2.0).
+
+Currently the remote protocol, Firefox and Chrome for Selenium 2.0 are
+supported, as well as the Selenium 1.0 bindings. As work will progresses we'll
+add more "native" drivers.
+
+See here_ for more information.
+
+.. _here: http://code.google.com/p/selenium/
+
+Installing
+==========
+
+Python Client
+-------------
+::
+
+    pip install -U selenium
+
+Java Server
+-----------
+
+Download the server from http://selenium.googlecode.com/files/selenium-server-standalone-2.0b3.jar
+::
+
+    java -jar selenium-server-standalone-2.0b3.jar
+
+Example
+=======
+::
+
+    from selenium import webdriver 
+    from selenium.common.exceptions import NoSuchElementException
+    from selenium.webdriver.common.keys import Keys
+    import time 
+
+    browser = webdriver.Firefox() # Get local session of firefox
+    browser.get("http://www.yahoo.com") # Load page
+    assert "Yahoo!" in browser.title
+    elem = browser.find_element_by_name("p") # Find the query box
+    elem.send_keys("seleniumhq" + Keys.RETURN)
+    time.sleep(0.2) # Let the page load, will be added to the API
+    try:
+        browser.find_element_by_xpath("//a[contains(@href,'http://seleniumhq.org')]")
+    except NoSuchElementException:
+        assert 0, "can't find seleniumhq"
+    browser.close()
+
+Documentation
+=============
+Coming soon, in the meantime - `"Use the source Luke"`_
+
+.. _"Use the source Luke": http://code.google.com/p/selenium/source/browse/trunk/remote/client/src/py/webdriver.py
+#!/bin/bash
+
+java -jar third_party/jruby/jruby-complete.jar -S rake $*
+@echo off
+java -jar third_party\jruby\jruby-complete.jar -S rake %*

File properties.yml

+default: 
+  android:
+    # Path to the android sdk
+    androidsdkpath : "../android_sdk/"
+    # Target id. To get a list of all targets do "./android list targets".
+    # We want whatever matches android 2.2 (API level 8)
+    # Note: Android WebDriver will not work on Gingerbread (SDK 2.3) emulator because of
+    # an emulator bug. However it will work with Gingerbread (SDK 2.3) devices.
+    androidtarget : 13
+    # Android platform. You can find supported platforms under androidsdkpath/platforms/
+    androidplatform : "android-8"

File py/selenium/__init__.py

+# Copyright 2008-2010 WebDriver committers
+# Copyright 2008-2010 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.
+
+from selenium import selenium

File py/selenium/common/__init__.py

+# Copyright 2008-2010 WebDriver committers
+# Copyright 2008-2010 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.
+
+import exceptions

File py/selenium/common/exceptions.py

+# Copyright 2008-2009 WebDriver committers
+# Copyright 2008-2009 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.
+
+"""Exceptions that may happen in all the webdriver code."""
+class WebDriverException(Exception):
+    def __init__(self, msg=None):
+        Exception.__init__(self, msg)
+
+class ErrorInResponseException(WebDriverException):
+    """An error has occurred on the server side.
+
+    This may happen when communicating with the firefox extension
+    or the remote driver server."""
+    def __init__(self, response, msg):
+        WebDriverException.__init__(self, msg)
+        self.response = response
+
+class InvalidSwitchToTargetException(WebDriverException):
+    """The frame or window target to be switched doesn't exist."""
+    pass
+
+class NoSuchFrameException(InvalidSwitchToTargetException):
+    pass
+
+class NoSuchWindowException(InvalidSwitchToTargetException):
+    pass
+
+class NoSuchElementException(WebDriverException):
+    """find_element_by_* can't find the element."""
+    pass
+
+class NoSuchAttributeException(WebDriverException):
+    """find_element_by_* can't find the element."""
+    pass
+
+class StaleElementReferenceException(WebDriverException):
+    pass
+
+class InvalidElementStateException(WebDriverException):
+    pass
+
+class ElementNotVisibleException(InvalidElementStateException):
+    pass
+
+class ElementNotSelectableException(InvalidElementStateException):
+    pass
+
+class InvalidCookieDomainException(WebDriverException):
+    pass
+
+class UnableToSetCookieException(WebDriverException):
+    pass
+
+class RemoteDriverServerException(WebDriverException):
+    pass
+
+class TimeoutException(WebDriverException):
+    pass

File py/selenium/selenium.py

+
+"""
+Copyright 2006 ThoughtWorks, 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.
+"""
+__docformat__ = "restructuredtext en"
+
+import httplib
+import urllib
+
+class selenium(object):
+    """
+    Defines an object that runs Selenium commands.
+    
+    Element Locators
+    ~~~~~~~~~~~~~~~~
+    
+    Element Locators tell Selenium which HTML element a command refers to.
+    The format of a locator is:
+    
+    \ *locatorType*\ **=**\ \ *argument*
+    
+    
+    We support the following strategies for locating elements:
+    
+    
+    *   \ **identifier**\ =\ *id*: 
+        Select the element with the specified @id attribute. If no match is
+        found, select the first element whose @name attribute is \ *id*.
+        (This is normally the default; see below.)
+    *   \ **id**\ =\ *id*:
+        Select the element with the specified @id attribute.
+    *   \ **name**\ =\ *name*:
+        Select the first element with the specified @name attribute.
+        
+        *   username
+        *   name=username
+        
+        
+        The name may optionally be followed by one or more \ *element-filters*, separated from the name by whitespace.  If the \ *filterType* is not specified, \ **value**\  is assumed.
+        
+        *   name=flavour value=chocolate
+        
+        
+    *   \ **dom**\ =\ *javascriptExpression*: 
+        
+        Find an element by evaluating the specified string.  This allows you to traverse the HTML Document Object
+        Model using JavaScript.  Note that you must not return a value in this string; simply make it the last expression in the block.
+        
+        *   dom=document.forms['myForm'].myDropdown
+        *   dom=document.images[56]
+        *   dom=function foo() { return document.links[1]; }; foo();
+        
+        
+    *   \ **xpath**\ =\ *xpathExpression*: 
+        Locate an element using an XPath expression.
+        
+        *   xpath=//img[@alt='The image alt text']
+        *   xpath=//table[@id='table1']//tr[4]/td[2]
+        *   xpath=//a[contains(@href,'#id1')]
+        *   xpath=//a[contains(@href,'#id1')]/@class
+        *   xpath=(//table[@class='stylee'])//th[text()='theHeaderText']/../td
+        *   xpath=//input[@name='name2' and @value='yes']
+        *   xpath=//\*[text()="right"]
+        
+        
+    *   \ **link**\ =\ *textPattern*:
+        Select the link (anchor) element which contains text matching the
+        specified \ *pattern*.
+        
+        *   link=The link text
+        
+        
+    *   \ **css**\ =\ *cssSelectorSyntax*:
+        Select the element using css selectors. Please refer to CSS2 selectors, CSS3 selectors for more information. You can also check the TestCssLocators test in the selenium test suite for an example of usage, which is included in the downloaded selenium core package.
+        
+        *   css=a[href="#id3"]
+        *   css=span#firstChild + span
+        
+        
+        Currently the css selector locator supports all css1, css2 and css3 selectors except namespace in css3, some pseudo classes(:nth-of-type, :nth-last-of-type, :first-of-type, :last-of-type, :only-of-type, :visited, :hover, :active, :focus, :indeterminate) and pseudo elements(::first-line, ::first-letter, ::selection, ::before, ::after). 
+        
+    *   \ **ui**\ =\ *uiSpecifierString*:
+        Locate an element by resolving the UI specifier string to another locator, and evaluating it. See the Selenium UI-Element Reference for more details.
+        
+        *   ui=loginPages::loginButton()
+        *   ui=settingsPages::toggle(label=Hide Email)
+        *   ui=forumPages::postBody(index=2)//a[2]
+        
+        
+    
+    
+    
+    Without an explicit locator prefix, Selenium uses the following default
+    strategies:
+    
+    
+    *   \ **dom**\ , for locators starting with "document."
+    *   \ **xpath**\ , for locators starting with "//"
+    *   \ **identifier**\ , otherwise
+    
+    Element Filters
+    ~~~~~~~~~~~~~~~
+    
+    Element filters can be used with a locator to refine a list of candidate elements.  They are currently used only in the 'name' element-locator.
+    
+    Filters look much like locators, ie.
+    
+    \ *filterType*\ **=**\ \ *argument*
+    
+    Supported element-filters are:
+    
+    \ **value=**\ \ *valuePattern*
+    
+    
+    Matches elements based on their values.  This is particularly useful for refining a list of similarly-named toggle-buttons.
+    
+    \ **index=**\ \ *index*
+    
+    
+    Selects a single element based on its position in the list (offset from zero).
+    
+    String-match Patterns
+    ~~~~~~~~~~~~~~~~~~~~~
+    
+    Various Pattern syntaxes are available for matching string values:
+    
+    
+    *   \ **glob:**\ \ *pattern*:
+        Match a string against a "glob" (aka "wildmat") pattern. "Glob" is a
+        kind of limited regular-expression syntax typically used in command-line
+        shells. In a glob pattern, "\*" represents any sequence of characters, and "?"
+        represents any single character. Glob patterns match against the entire
+        string.
+    *   \ **regexp:**\ \ *regexp*:
+        Match a string using a regular-expression. The full power of JavaScript
+        regular-expressions is available.
+    *   \ **regexpi:**\ \ *regexpi*:
+        Match a string using a case-insensitive regular-expression.
+    *   \ **exact:**\ \ *string*:
+        
+        Match a string exactly, verbatim, without any of that fancy wildcard
+        stuff.
+    
+    
+    
+    If no pattern prefix is specified, Selenium assumes that it's a "glob"
+    pattern.
+    
+    
+    
+    For commands that return multiple values (such as verifySelectOptions),
+    the string being matched is a comma-separated list of the return values,
+    where both commas and backslashes in the values are backslash-escaped.
+    When providing a pattern, the optional matching syntax (i.e. glob,
+    regexp, etc.) is specified once, as usual, at the beginning of the
+    pattern.
+    
+    
+    """
+
+### This part is hard-coded in the XSL
+    def __init__(self, host, port, browserStartCommand, browserURL):
+        self.host = host
+        self.port = port
+        self.browserStartCommand = browserStartCommand
+        self.browserURL = browserURL
+        self.sessionId = None
+        self.extensionJs = ""
+
+    def setExtensionJs(self, extensionJs):
+        self.extensionJs = extensionJs
+        
+    def start(self, browserConfigurationOptions=None):
+        start_args = [self.browserStartCommand, self.browserURL, self.extensionJs]
+        if browserConfigurationOptions:
+          start_args.append(browserConfigurationOptions)
+        result = self.get_string("getNewBrowserSession", start_args)
+        try:
+            self.sessionId = result
+        except ValueError:
+            raise Exception, result
+        
+    def stop(self):
+        self.do_command("testComplete", [])
+        self.sessionId = None
+
+    def do_command(self, verb, args):
+        conn = httplib.HTTPConnection(self.host, self.port)
+        try:
+            body = u'cmd=' + urllib.quote_plus(unicode(verb).encode('utf-8'))
+            for i in range(len(args)):
+                body += '&' + unicode(i+1) + '=' + \
+                        urllib.quote_plus(unicode(args[i]).encode('utf-8'))
+            if (None != self.sessionId):
+                body += "&sessionId=" + unicode(self.sessionId)
+            headers = {
+                "Content-Type":
+                "application/x-www-form-urlencoded; charset=utf-8"
+            }
+            conn.request("POST", "/selenium-server/driver/", body, headers)
+
+            response = conn.getresponse()
+            data = unicode(response.read(), "UTF-8")
+            if (not data.startswith('OK')):
+                raise Exception, data
+            return data
+        finally:
+            conn.close()
+
+    def get_string(self, verb, args):
+        result = self.do_command(verb, args)
+        return result[3:]
+
+    def get_string_array(self, verb, args):
+        csv = self.get_string(verb, args)
+        if not csv:
+            return []
+        token = ""
+        tokens = []
+        escape = False
+        for i in range(len(csv)):
+            letter = csv[i]
+            if (escape):
+                token = token + letter
+                escape = False
+                continue
+            if (letter == '\\'):
+                escape = True
+            elif (letter == ','):
+                tokens.append(token)
+                token = ""
+            else: