From 6be059186980bd177d33e72bb1d2bf06f02bbe40 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Mon, 6 May 2013 15:46:49 +0200 Subject: [PATCH 01/61] initial commit for export --- .gitignore | 19 ++ LICENSE | 202 ++++++++++++++ README.md | 24 ++ eclipse-launch-profiles/DevAppServer.launch | 14 + .../UpdateApplication.launch | 14 + nbactions.xml | 52 ++++ pom.xml | 255 ++++++++++++++++++ .../google/gwt/site/webapp/GWTProject.gwt.xml | 9 + .../webapp/client/GWTProjectEntryPoint.java | 28 ++ .../server/guice/GuiceServletConfig.java | 29 ++ .../webapp/server/guice/MyServletModule.java | 50 ++++ .../resources/DocumentationServlet.java | 118 ++++++++ .../server/resources/PrivacyResource.java | 16 ++ .../server/resources/StandardResource.java | 33 +++ .../resources/TermsOfServiceResource.java | 16 ++ src/main/resources/META-INF/jdoconfig.xml | 17 ++ src/main/webapp/WEB-INF/appengine-web.xml | 10 + src/main/webapp/WEB-INF/jsp/index.jsp | 25 ++ src/main/webapp/WEB-INF/jsp/privacy.jsp | 18 ++ .../webapp/WEB-INF/jsp/termsofservice.jsp | 15 ++ src/main/webapp/WEB-INF/logging.properties | 13 + src/main/webapp/WEB-INF/tags/main.tag | 56 ++++ src/main/webapp/WEB-INF/web.xml | 54 ++++ src/main/webapp/css/main.css | 137 ++++++++++ src/main/webapp/gwt.html | 13 + src/main/webapp/images/gwt-logo.png | Bin 0 -> 103265 bytes 26 files changed, 1237 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 eclipse-launch-profiles/DevAppServer.launch create mode 100644 eclipse-launch-profiles/UpdateApplication.launch create mode 100644 nbactions.xml create mode 100644 pom.xml create mode 100644 src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml create mode 100644 src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java create mode 100644 src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java create mode 100644 src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java create mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/DocumentationServlet.java create mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java create mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java create mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java create mode 100644 src/main/resources/META-INF/jdoconfig.xml create mode 100644 src/main/webapp/WEB-INF/appengine-web.xml create mode 100644 src/main/webapp/WEB-INF/jsp/index.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/privacy.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/termsofservice.jsp create mode 100644 src/main/webapp/WEB-INF/logging.properties create mode 100644 src/main/webapp/WEB-INF/tags/main.tag create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/css/main.css create mode 100644 src/main/webapp/gwt.html create mode 100644 src/main/webapp/images/gwt-logo.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..760004a2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +hotspot.log +*.iml +*.ipr +*.iws +target/ +classes/ +/var +pom.xml.versionsBackup +test-output/ +/atlassian-ide-plugin.xml +.idea +.DS_Store +.classpath +.settings +.project +temp-testng-customsuite.xml +test-output +.externalToolBuilders +*~ diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + 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 [yyyy] [name of copyright owner] + + 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. diff --git a/README.md b/README.md new file mode 100644 index 000000000..3236b1b6d --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +App Engine Java Application +Copyright (C) 2010-2012 Google Inc. + +## Skeleton application for use with App Engine Java. + +Requires [Apache Maven](http://maven.apache.org) 3.0 or greater, and JDK 6+ in order to run. + +To build, run + + mvn package + +Building will run the tests, but to explicitly run tests you can use the test target + + mvn test + +To start the app, use the [App Engine Maven Plugin](http://code.google.com/p/appengine-maven-plugin/) that is already included in this demo. Just run the command. + + mvn appengine:devserver + +For further information, consult the [Java App Engine](https://developers.google.com/appengine/docs/java/overview) documentation. + +To see all the available goals for the App Engine plugin, run + + mvn help:describe -Dplugin=appengine diff --git a/eclipse-launch-profiles/DevAppServer.launch b/eclipse-launch-profiles/DevAppServer.launch new file mode 100644 index 000000000..2290cd0ce --- /dev/null +++ b/eclipse-launch-profiles/DevAppServer.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eclipse-launch-profiles/UpdateApplication.launch b/eclipse-launch-profiles/UpdateApplication.launch new file mode 100644 index 000000000..caa7ec79d --- /dev/null +++ b/eclipse-launch-profiles/UpdateApplication.launch @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/nbactions.xml b/nbactions.xml new file mode 100644 index 000000000..cfa22117a --- /dev/null +++ b/nbactions.xml @@ -0,0 +1,52 @@ + + + + CUSTOM-appengine:devserver + appengine:devserver + + appengine:devserver + + + + CUSTOM-appengine:update + appengine:update + + appengine:update + + + + CUSTOM-appengine:rollback + appengine:rollback + + appengine:rollback + + + + CUSTOM-appengine:update_cron + appengine:update_cron + + appengine:update_cron + + + + CUSTOM-appengine:update_dos + appengine:update_dos + + appengine:update_dos + + + + CUSTOM-appengine:update_indexes + appengine:update_indexes + + appengine:update_indexes + + + + CUSTOM-appengine:update_queues + appengine:update_queues + + appengine:update_queues + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..0eb9f7ca0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,255 @@ + + + + 4.0.0 + com.google.gwt.site.webapp + gwt-site-webapp + 1.0-SNAPSHOT + war + + + + + + + + 1 + 1.7.6 + UTF-8 + 2.5.1 + + + + + + com.google.appengine + appengine-api-1.0-sdk + ${appengine.target.version} + + + javax.servlet + servlet-api + 2.5 + provided + + + jstl + jstl + 1.2 + + + + com.sun.jersey + jersey-server + 1.9 + + + com.sun.jersey + jersey-grizzly2 + 1.9 + + + + commons-codec + commons-codec + 1.7 + + + + + com.google.appengine + appengine-testing + ${appengine.target.version} + test + + + com.google.appengine + appengine-api-stubs + ${appengine.target.version} + test + + + + com.sun.jersey.contribs + jersey-guice + 1.7 + + + + javax.jdo + jdo-api + 3.0.1 + + + org.datanucleus + datanucleus-core + 3.1.1 + runtime + + + org.datanucleus + datanucleus-api-jdo + 3.1.2 + + + com.google.appengine.orm + datanucleus-appengine + 2.1.2 + + + + com.google.gwt + gwt-user + ${gwtversion} + provided + + + javax.validation + validation-api + 1.0.0.GA + provided + + + javax.validation + validation-api + 1.0.0.GA + sources + provided + + + + javax.persistence + persistence-api + 1.0 + + + + + + + + org.apache.maven.plugins + 2.5.1 + maven-compiler-plugin + + 1.6 + 1.6 + + + + + org.apache.maven.plugins + maven-war-plugin + 2.3 + + + + + + ${basedir}/src/main/webapp/WEB-INF + true + WEB-INF + + + + + + + com.google.appengine + appengine-maven-plugin + ${appengine.target.version} + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + + true + false + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + + org.eclipse.jdt.core.javanature + com.google.gdt.eclipse.core.webAppNature + com.google.appengine.eclipse.core.gaeNature + com.google.gwt.eclipse.core.gwtNature + + + org.eclipse.jdt.core.javabuilder + com.google.gdt.eclipse.core.webAppProjectValidator + + com.google.appengine.eclipse.core.projectValidator + com.google.gwt.eclipse.core.gwtProjectValidator + com.google.appengine.eclipse.core.enhancerbuilder + + + + org.eclipse.jdt.launching.JRE_CONTAINER + com.google.appengine.eclipse.core.GAE_CONTAINER + com.google.gwt.eclipse.core.GWT_CONTAINER + + + com.google.gwt:gwt-servlet + com.google.gwt:gwt-user + com.google.gwt:gwt-dev + javax.validation:validation-api + com.google.appengine:appengine-api-1.0-sdk + com.google.appengine:appengine-api-stubs + com.google.appengine:appengine-testing + org.datanucleus:datanucleus-core + org.datanucleus:datanucleus-enhancer + org.datanucleus:datanucleus-jpa + org.datanucleus:datanucleus-api-jdo + com.google.appengine.orm:datanucleus-appengine + + + + + + + + + + + org.datanucleus + maven-datanucleus-plugin + 3.1.2 + + ${basedir}/log4j.properties + false + false + + + + process-classes + + enhance + + + + + + + org.codehaus.mojo + gwt-maven-plugin + 2.5.1 + + + + com.google.gwt.site.webapp.GWTProject + index.html + true + + + compile + test + + + + + + + + diff --git a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml new file mode 100644 index 000000000..0407f776d --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java new file mode 100644 index 000000000..b16d71fe6 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -0,0 +1,28 @@ +/* + * Copyright 2013 Daniel Kurka + * + * 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. + */ +package com.google.gwt.site.webapp.client; + +import com.google.gwt.core.client.EntryPoint; + +public class GWTProjectEntryPoint implements EntryPoint { + + @Override + public void onModuleLoad() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java b/src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java new file mode 100644 index 000000000..549146798 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java @@ -0,0 +1,29 @@ +/* + * Copyright 2013 Daniel Kurka + * + * 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. + */ +package com.google.gwt.site.webapp.server.guice; + +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.servlet.GuiceServletContextListener; + +public class GuiceServletConfig extends GuiceServletContextListener { + + @Override + protected Injector getInjector() { + return Guice.createInjector(new MyServletModule()); + } + +} diff --git a/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java new file mode 100644 index 000000000..c3f324507 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java @@ -0,0 +1,50 @@ +/* + * Copyright 2013 Daniel Kurka + * + * 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. + */ +package com.google.gwt.site.webapp.server.guice; + +import com.google.apphosting.utils.remoteapi.RemoteApiServlet; +import com.google.gwt.site.webapp.server.resources.DocumentationServlet; +import com.google.gwt.site.webapp.server.resources.PrivacyResource; +import com.google.gwt.site.webapp.server.resources.StandardResource; +import com.google.gwt.site.webapp.server.resources.TermsOfServiceResource; +import com.google.inject.Singleton; +import com.google.inject.servlet.ServletModule; + +import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; + +import java.util.HashMap; +import java.util.Map; + +public class MyServletModule extends ServletModule { + @Override + protected void configureServlets() { + // web resources + bind(StandardResource.class); + bind(TermsOfServiceResource.class); + bind(PrivacyResource.class); + + //docs + bind(RemoteApiServlet.class).in(Singleton.class); + bind(DocumentationServlet.class).in(Singleton.class); + + serve("/remote_api").with( RemoteApiServlet.class); + serve("/docs/*").with( DocumentationServlet.class); + + Map params = new HashMap(); + params.put("com.sun.jersey.config.property.JSPTemplatesBasePath", "/WEB-INF/jsp"); + serve("/*").with(GuiceContainer.class, params); + } +} diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/DocumentationServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/DocumentationServlet.java new file mode 100644 index 000000000..002483a08 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/DocumentationServlet.java @@ -0,0 +1,118 @@ +/* + * Copyright 2013 Daniel Kurka + * + * 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. + */ +package com.google.gwt.site.webapp.server.resources; + +import com.google.appengine.api.datastore.DatastoreService; +import com.google.appengine.api.datastore.DatastoreServiceFactory; +import com.google.appengine.api.datastore.Entity; +import com.google.appengine.api.datastore.Key; +import com.google.appengine.api.datastore.KeyFactory; +import com.google.appengine.api.datastore.Query; +import com.google.appengine.api.datastore.Text; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class DocumentationServlet extends HttpServlet { + + /** + * + */ + private static final long serialVersionUID = 458719890608890896L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + + String fullPath = normalizePath(req.getRequestURI()); + + Key key = KeyFactory.createKey("DocModel", fullPath); + Query query = new Query("DocModel", key); + Entity e = datastore.prepare(query).asSingleEntity(); + + if (e == null) { + resp.sendError(404); + return; + } + String html = ((Text) e.getProperty("html")).getValue(); + + setContentTypeByFileEnding(resp, fullPath); + + if (isBinaryFile(fullPath)) { + byte[] decodeBase64 = + org.apache.commons.codec.binary.Base64.decodeBase64(html.getBytes("UTF-8")); + resp.getOutputStream().write(decodeBase64); + + } else { + resp.getWriter().write(html); + + } + + } + + private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPath) { + + if (fullPath.endsWith(".html")) { + resp.setContentType("text/html"); + return; + } + + if (fullPath.endsWith(".js")) { + resp.setContentType("application/javascript"); + return; + } + if (fullPath.endsWith(".css")) { + resp.setContentType("text/css"); + return; + } + + if (fullPath.endsWith(".png")) { + resp.setContentType("image/png"); + return; + } + + if (fullPath.endsWith(".jpg")) { + resp.setContentType("image/jpg"); + return; + } + + if (fullPath.endsWith(".gif")) { + resp.setContentType("image/gif"); + return; + } + + // TODO: what is a good default value? + + } + + private boolean isBinaryFile(String path) { + return path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".gif"); + } + + private String normalizePath(String fullPath) { + + fullPath = fullPath.substring("/docs/".length(), fullPath.length()); + + if ("".equals(fullPath) || fullPath.endsWith("/")) { + fullPath += "index.html"; + } + return fullPath; + } +} diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java b/src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java new file mode 100644 index 000000000..3499d1476 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java @@ -0,0 +1,16 @@ +package com.google.gwt.site.webapp.server.resources; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import com.sun.jersey.api.view.Viewable; +@Path("/privacy") +public class PrivacyResource { + + @GET + @Produces("text/html") + public Viewable getHTML() { + return new Viewable("/privacy", null); + } +} diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java b/src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java new file mode 100644 index 000000000..5c5729297 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java @@ -0,0 +1,33 @@ +/* + * Copyright 2013 Daniel Kurka + * + * 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. + */ +package com.google.gwt.site.webapp.server.resources; + +import com.sun.jersey.api.view.Viewable; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +@Path("/") +public class StandardResource { + + @GET + @Produces("text/html") + public Viewable getHTML() { + return new Viewable("/index", "World"); + } + +} diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java b/src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java new file mode 100644 index 000000000..ea4325429 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java @@ -0,0 +1,16 @@ +package com.google.gwt.site.webapp.server.resources; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import com.sun.jersey.api.view.Viewable; +@Path("/termsofservice") +public class TermsOfServiceResource { + + @GET + @Produces("text/html") + public Viewable getHTML() { + return new Viewable("/termsofservice", null); + } +} diff --git a/src/main/resources/META-INF/jdoconfig.xml b/src/main/resources/META-INF/jdoconfig.xml new file mode 100644 index 000000000..f52844ab2 --- /dev/null +++ b/src/main/resources/META-INF/jdoconfig.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/appengine-web.xml b/src/main/webapp/WEB-INF/appengine-web.xml new file mode 100644 index 000000000..f44cd5319 --- /dev/null +++ b/src/main/webapp/WEB-INF/appengine-web.xml @@ -0,0 +1,10 @@ + + + gwtproject-demo + 1 + true + + + + + diff --git a/src/main/webapp/WEB-INF/jsp/index.jsp b/src/main/webapp/WEB-INF/jsp/index.jsp new file mode 100644 index 000000000..a494b0798 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/index.jsp @@ -0,0 +1,25 @@ +<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> + + +

GWT

+ +
+ GWT (pronounced 'gwit') is the official open source project for GWT releases 2.5 and onwards. This site houses links to the documentation, source code repository, issues list and information related to GWT roadmap and release. It is intended for developers interested in contributing to GWT, and for keeping people informed on new and upcoming changes to GWT, GWT related events and other news. + + + +
+ + +
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/privacy.jsp b/src/main/webapp/WEB-INF/jsp/privacy.jsp new file mode 100644 index 000000000..83ead421a --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/privacy.jsp @@ -0,0 +1,18 @@ +<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> + + +

Privacy Policy

+ +
+ Google is a member of the GWT Open Source Project and operates this GWT website as a contribution to GWT. The Google Privacy Policy applies to Google's operation of this website. + +
+ + +
+ + + + + + diff --git a/src/main/webapp/WEB-INF/jsp/termsofservice.jsp b/src/main/webapp/WEB-INF/jsp/termsofservice.jsp new file mode 100644 index 000000000..f5674d966 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/termsofservice.jsp @@ -0,0 +1,15 @@ +<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> + + +

Terms of Service

+ +
+ Google is a member of the GWT Open Source Project and operates this GWT website as a contribution to GWT. The Google Terms of Service apply to Google's operation of this website. + +
+ + +
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/logging.properties b/src/main/webapp/WEB-INF/logging.properties new file mode 100644 index 000000000..a17206681 --- /dev/null +++ b/src/main/webapp/WEB-INF/logging.properties @@ -0,0 +1,13 @@ +# A default java.util.logging configuration. +# (All App Engine logging is through java.util.logging by default). +# +# To use this configuration, copy it into your application's WEB-INF +# folder and add the following to your appengine-web.xml: +# +# +# +# +# + +# Set the default logging level for all loggers to WARNING +.level = WARNING diff --git a/src/main/webapp/WEB-INF/tags/main.tag b/src/main/webapp/WEB-INF/tags/main.tag new file mode 100644 index 000000000..4132f0b27 --- /dev/null +++ b/src/main/webapp/WEB-INF/tags/main.tag @@ -0,0 +1,56 @@ +<%@tag description="main navigation" pageEncoding="UTF-8"%> + + + + + + + + + + +
+ +
+ + GWT Logo + + + + + +
+ + + + + +
+ +
+ +
+ + + + + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..44c3d17ba --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + guiceFilter + com.google.inject.servlet.GuiceFilter + + + + guiceFilter + /* + + + + com.google.gwt.site.webapp.server.guice.GuiceServletConfig + + + + + /* + + + * + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/css/main.css b/src/main/webapp/css/main.css new file mode 100644 index 000000000..975ec515c --- /dev/null +++ b/src/main/webapp/css/main.css @@ -0,0 +1,137 @@ +body{ + margin:0; + padding:0; + +} +#nav a, #nav a:visited, #container a, #container a:VISITED, #footer a, #footer a:visited { + text-decoration: none; + +} + + +#container a, #container a:VISITED { + color: #464646; +} + + +#nav { + background-color: #464646; + font-size: 15px; + +} + + + +#nav > div{ + line-height: 40px; + margin: 0; + padding: 0; + margin-left: 10px; + +} + +#nav > div ul{ + list-style-type: disc; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} + +#nav > div ul li{ + padding-left: 5px; + padding-right: 5px; + list-style-image: none; + list-style-type: none; + margin-left: 0; + white-space: nowrap; + display: inline; + float: left; + +} + +#nav a, #nav a:visited, #container a { + color: #fff; + +} + +.content { + margin: 10px; + +} + + +/* + +E8DDCB +HEX + +CDB380 +HEX + + +036564 +HEX + +033649 +HEX + +031634 +HEX + +*/ + + + + + +#footer { + background-color: #464646; + font-size: 15px; + +} + + + +#footer > div{ + line-height: 20px; + margin: 0; + padding: 0; + margin-left: 10px; + +} + +#footer > div ul{ + list-style-type: disc; + margin: 0; + padding: 0; + border: 0; + overflow: hidden; +} + +#footer > div ul li{ + padding-left: 5px; + padding-right: 5px; + list-style-image: none; + list-style-type: none; + margin-left: 0; + white-space: nowrap; + display: inline; + float: left; + font-size: 10px; + +} + +#footer a, #footer a:visited { + color: #fff; + +} + + + + + + + + + diff --git a/src/main/webapp/gwt.html b/src/main/webapp/gwt.html new file mode 100644 index 000000000..861ab157e --- /dev/null +++ b/src/main/webapp/gwt.html @@ -0,0 +1,13 @@ + + + + + index + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/images/gwt-logo.png b/src/main/webapp/images/gwt-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..df942d3a6b82953d2de5eb05817b189700589c0f GIT binary patch literal 103265 zcmYIQ1yq*L(|zfZZlyzzmhMhLx>E#1q`O19yOb_T0qO1%B&53~B?W2t_VuU#?+AG0 zz_ZWJ&fK|kXVx%fMHzI|$EXkp1YJ&6QWXM$+X0_t$cW%ObMMkK!Cx?rsxsn`@)43< z@DIe-@-mW;2k4*d*1`nv9TYoR9Y+X+g&O(^<5nQz0=|jlB==GZX$c+|9UfL|{aYFY zLIIJJ6jOJb|JiD3rGNEd`6^v6Lyc!T$n=DYTVwL`lxlPDp-PN^i&BqE9Y=L0P4dRs z8xFBLGm1F_R{xqinPS_gH!Og-Q{KC62tSX6U;y zPvU2{wvP%C@tcFYUpUD1m4PfiyY(NK*KrB>#@O$C|VpKNr7bJ+K%&ki;=&LJLCE%U$oS<*7+;daMERM-%Tx@dNT^;A&9_|>|ycd!)3GL9Hb&KoPS0;Rk zI+^%loZB)14`>hI2(*Xx`{b4KUKf5Bq>e50_5s%mIR zEP~uVqjB20rJT)2LOWAXt&?Bfc!vpb!aY%Ml3dPkFkFT!L9Q6Dnkc1(tQcPl{Lc(a zRLe8gyU&)y1IqAf&+828=@1%^5b{sjcO%Z1H&Q_A2 zm_8;;2|hnSCeWJxQkT&FlVH7=vyRH%O6s*8WrT|PgsBkhYMPZNc;bJD8%?+Fh_G9? zFm8=~j;IOr}Fn(vKW!RVTctjz}m;tZn$1e^dv}^k}@2rlt5AjOYA{Z?VXxF1+ zN46^Q!;H;Lki>dB^5w-vg?>MqTR>1T=K}uvpGy@}uGRT1;2*bH%GWclM%5K~rav~- z30&C-UfJmS*_goVNX5F5GLjkCUu^6(8`7KP%v4^salheQW-U``XWMub9plCjl@vuP znWyyp0Q>oFe6*TI4CIo3yYQcP5IbSl7kFZLFD7TQ16LxMO}42(yWr&-h!1Q`$?Ogt zjo4OtX>2tcbCQi&ZLS0hAvk0UqM~fX2LM{;3am4mF~dMl%=n2n`qGZE%$eE~bMqPx((2ag+*9cE@p%JrD^4*jom3 z6xXOAZH@q31TSd*`hBd6EbqcN8VP5KRSU(&)GGhU;hWvB1j(6Juji@PbRKd_cUSWB z{~ejdr_cph;Sd-bc~&wF?)8h+E45MeNCrkjLc?ewiS+#*&lnTUiD$e2JRgI3-Ep?U z57Sid+E_YiDxnehNjdJ31k}Z=z66-xg&3wO%Kh_bRm!zq>s>mul)A(VPT+D{PoQh8 zgZTK&Us6WqB7c3C#8r+(CeBU^o3rX;K|eq;Fuami@@i;UP#+>>|KyN-9q zv#Kp4aD%Tqs9$n~^C#q6A(+@wysC^F$5+j5ERB8D`?Ve@7j z9S+TvoH9dh_=UuCHggWdlBmS6}EDsq=spMwhei zPOM~JEo<%wFiWPb{bcPHNvO(cN9En6lRLiUf{Om5!Bi)%8hY>h>ESEe(+b(Yi6VpW zgzwQ?y=!}!q^W>|-8&inGzst__+iB8)3~hp=}axGPCQm7QKvfnEQXwU)j#{y$aNvr zF}J#@f7nt!-YYP_kWL~sGjQXY&0IE;T>mO`GE#xd6Rm+R!s1hbwymT{)^xCxe5Td+ z_?>GE#O(yU1T7iNUq2cr!6qN5J9`t&P>M7$af2j~&5R>YFdbHit@I}QiL{nY1(TfH z{TbdZ*-Xy;iVUVEmizqi$1`XmZtu$r_={;6056F;>dxNf4YFiqz3(q3^-!M^JFRP| zYMaRf0pAJ0oy<)rm~`xoR`)(a%{eM~t=C?&u0`Ij3Y**6KXJ1A9|(YFKKRLC{tchR z7j6x*EeCZ@&Em@o>*|GI!v<~~V5@ zSMQX_#J@P{lW9=Q7{!lhx&nSeK~gP^ObN^lr4xCh3*!gLPBCf$KNF8@Q!1g>_t|oe zo4yVYe2p{5Mt55=eXcmKN)v4EY`6Z5>ku+{XUXPb?}dKXJlJKUs# z_U`nG__CFy<+`hy89*kwX0K<&y1iKd*4Q*=JXsjs7duzt!VsGD$0ZAUWH4+1F9oyw zK%70DT~|cT3B=UaYs%+`QTZ0b;Q7fpZ}2g8^Sa6#kXavD@2mdVoL)r?<310-xC?(m z%&sGQXo9?1P*G^;^~eL{pbdT1bFmvdkW3rUgGce9m*@7}NMzvIPR z&qHFI4eznD(3T$1apmQo$;B0yO?wp~K$)*ayGU@{W-Fh@ZsU=kzAy8d~E<&CZVZ+!sugfi(nBr*5U#UXf_?pGcSmM{GtzDWRsZ2~S*M=tHn} z;w7smAf3eJzmz-ze}0(brB4huFH7y!bPHeMW`I;KgQ*nxnzAkuNhvA-{;nAUoq7Xvi`6k@vohUU=Vahl@&iGTZXi`?=7Wk^)T{b}iX+KNZ7hdzz7m9*FOL2u4H5(VbrZT=bcFCfTs77`~=BOY(POZ%P2(f&nLyX?Fg%B2lMw&cumYB z^cnPn(Tupr+5LjLX4w4}X1)wy;vrKCAu#R)#@ZzQ;)D2xV<5EczA-jz=!PMsQs_k) z-tDR`{3HN!DK_s&nS2j@W?(s?De!{)0KmD1Mu$Zm>79KKmtqLwMz$Uo=Z-Em@wHFF z64w`6f1?!f&eO@s!iLzwT~_aFd!@<1|3`>I5`I|@XpQJ8`WQ6$H589n%ur)V7|yzyjw1?{x*T|$U#sg-hVEpm8>ohYDMwtmI&Bvy^UoDOIFQnkCW3;DfOAJS?CJgfY}5 zN%41{oZLw-L*Mfc$dKbxpIB@{V>?T_CB&ZUCBnG^MADuKjn6ES(oZkB|P?F4yD)0 zxRgRvl+$ogmGqa=wF|B3)ZAr6-g2u-=&69W#pf5nnoOGVkYQ>iUYsAvx z-{dck+8j{YFM0_**6kfy-ENAw%OgRoGp`#;`KgVdHE3Z|L<~1SBpMs@m>6@Iy{4PE z=@Rxlq`4*28eY)icByQrinfReG{37YJ=k7uuV?#hw-j?&5v?|j@~3*Vs7sHDjHD>P zKKZfY0b}cPZtHU3apFL1#H8LY=lBI~e*LS{*Lgd{8uZ{uPg3!FRf{8wNE_HE7Py$1 zk7ai?l@29_b5@hKM<;zEgWtP~G+}BZ`j{`O{OZP7d4tEgcz;eo>hsT%e6H^v2lw|q zzZnPn@~Lm`Nnf+J=B3_hsCwUHBZFB2%h_ng?$c~X+=pG#QTlZm|NOXzz6+O{%ht%F zDyV=ijaP_fZBqGw;To;p7k%Z86NS-7`u#stF+Xeb_VHt)0)n#}JNMscm#yu0E2~!= z83tO4#I~e=V946ejsV3?6hG%{QT^{mm6K>l1Kg|PWBf*EN1vR|nL@tJZCmnG-tx4L zyFx^=UeA4Pp|{*k22xt^xE0YenOVYhHSZmdmPpSeQvbT0hwexP?Bzs&kBuOwzwc?E zMvKpnA=0^#AkU%1lc!yN+_0N^lfNu`5!~>_g@%V+w#z*$&348pZm#TqFf8`z7jqp^xem~zo>6RDE!3z z!?jP%f@x8&@2)HI1XLMy>f~FI@c`N)pVk+36CC?TvH~>oZ4NPEp54hZS(Fl*19?p$ObVmr$KtvDdkXASn5Gfso)ibXx8o|GH zkMJ1kT4>rlKe&Ok8Tj0dPCE#3`5fGSm5apGA~&|s`cAh*#e(=w>-%V{E2fFOKD#6U zPZGip&3;(pT?twu7_wGbB$#VPx79pP;(yg<(EGS-bD+AT6OBn@y`5(3Ky{3aVQ5Jk55F1N2Q#Fs*Y z;(Hv`uBSG#QOtS26l1%_y4=bUdt=*x|BZZ7(ySlT|KNd|k>8QDt3mi2+)>bs@q z>=1$r$D2{XP=EnI9ios=f<3fS5V6OD&ZmbLmAtF&)#JOzUh(pJ=aOEGSe@ zI9$d#1AGi<5rK5lCCg-)M7>>0W@S%bDm0alJ1x)!$GKRJ;r!eImJ^Rg)mucNe7Swj zQ|{fIneDmAa+`K^Z_7)XS>ABKdVei(d*XW;<6SGlTOLV5&@9!eJ^->1`eMfiwo__q zR(uw7@^6`4;QjGM7A%eJt7z7eww1I#=fYiKDsdF!8Io$fTkfA7M;vK&O+k8*w(2_3_!g&9X*YJLns`dP_-J5rh)N)=qqecFq%qcQSA7KI<6#IvK z?}azhN8myM;PJs)+0zAbrrFNKJ3@#^F;!3$X4-Z>d9qz(TB>)d-aB zstxJZn-3OYoWbO_CO18HU(XX*P%g3_k9ihOkTO0I;6hkBvhUoOw0p21NRcVc65k7t zoN`P^y&t9~Q_gsAeH?hk3uRp&`}S@1(Ws4tD#9gHj;9|kpBlEG{)pdiuKg?ov^*U7 zLyhid>-j3Pxy!ihhWe!SL5seVHxbd-$7_p(4CN2Q<y!|!^M(iJLeV^uQZhgY80B=!}xtAbU7iqo%5~S7|ff>GgD}KY#=J~dHlhpR2wtK zp2fqp6ZoePER@rIQr7lt)7y6m$z3h=Jvv(Ry$bOylni~CdpJ1~;9v1##Oc=L4E`*e zzTf-xeWg^Zx#^-&tbMbAcR6XhtB_!DGi%o8hWnAa=qS9>oqR^%h~s8|LYQEs{N^IR(m2N#e0;~lam;(IPd9&v*{msA0gvJ*`!rt4uX%c62f=w}!U@}pfW@sQiyOs7z24KHaqM^)4L>ykk9V88!pIyb?fn|(zd=SP z5Haelktvyzs`9db3@8E@rY1oFRkYh5Jl+drBtE1t^t=j+-@m_nxKgqf_^R(w z6;^AlX^*To>8U=jJs2psIJ_X>Uava#{#N&F<>%S-&KH0VsY0Grd)CxGm;_ohR{7A7 z6$#7D6V6|HTmuis{V#`ROqOLzV8vR4I)xRQ$jsRu}> zIpjuUpigSMGdr|Pq&MH;!K==2$by|EHKs;A^Ya-2S)t|?FD(jC?8vNartq8~ZcfIJ zx0joT0@D8SgLyII8r@;e&9d&O>QRMPf~iJBL;x%EvTkRRtz&G6v;nIDy6U|>Vjw|n z5i88)GvHnCD6=GX=k0w(1j}(R$h468A?atE+qoAwAZU1f9l-9?av++3*~PJAJ7}hy zo!cQ75|D|G>{&6n-1+-+L#{5@+Id~Y6;DX(Z@VS%u(&806( zbM+uj+MY(R5F~hBiqo$$AS(i2A=U?7Al;>oPi5=={ly0b^$)-;KeqiA%zUviQ9#FB zI+!rMk%;g%-Yi1ioBh`9i7r(@jUIEO&p7RQdN$B^UoqhMF=<4r zC(xp7bPJa~r9v*6Qet$L>iZpL9LfBdeD`9%@>Pd81_7sBSLM2>r~?IsKxL`<2}MFj zd1ep<4kI+t8Tc?rKLZ`A)gC|vFS^f(-@Eelx#<2hbk(&aV`Xtf`GRrXO65p}n6*55 zLHuw#v)J@>*+ei^NW;NEbeR06`NMLY(-Ird^Jmf{gz-_=mttJ(-VKyotN_9=1xIfjP+^MPV_{Zb ze14*t&~et|a}Er{<9x{Xqvggp!ea&5-M*B+bR*=Il?7Z3i=u?q3#Iy}ORcm!qCT6t z%wjVnsC^;cZg>$JI_>J`=HoW_An`rFb!*3cE2~n}DFk^D%8W=sEDy)rtHR$Ymhc_@8Wnm{N1%QEI9s+)ZgkAxiT`|si`FWAM)*s_IUq2 zTpZ)mo3#BmgFQQMg(*fhCL!4t2M6*>bwtQBPeJs$vXe<$#4eCryx9MaWAR928F;s$|ME1yf=xZb{*YgtBcOauJ4H*$v~s8*$E_>6 z_#7G1x#u>sz7VNN+UW95c27(!W)ct7SyJr}$0|?&FcRG8KU!JX``9n}zmw(!C(RuB z*d)n?{poF{m*}D!Th?W>o$b|ZI|q&u6^^{aHaRSKdTs1zj?)2ef4Vc@1i47pQp#wu zzPYdRw0zj%pJej=W7wfj3|jnFkIhr9UtHS(_N@2Q-K1{~W>=K{w;0u$E>Djm0jH9W z_qukD|MDX-b4yQaVEPMoGL{7UXuf^1zU1kXS1zAkZ_b0J3*hkD_}+A?YGd!c0E}&C zQD%r6zv3eJOUm{Ldi){8Lbp!?-ZgCPhNTB6T(d?ak+94lSg`KiU9qx~1hOW}h1)bIxQ2dX@v}s1KD{@VUC9E&0=2wJ3 z=njR-v7B_^6+LJceczpZ+ZaQK(~BdLzFqz(!okJuFVnow%cbtkaxKx0i+QK`O;XkS zq`sgGh!;@Rrzt#Lr!m;U+SAV9JAqwcdPQtCNGoQGF?SHq=uG8Mm0zbqx#Z3ZjZO|O zd)d&NiQ@#(UI?4UhsxB4RyJ$u88?@&x)yl+{|8!5r!PPIyN&oWC277`FLrupk4>&E zTEIUw0sQ8W@br|Tp6vqFBJoQ>6sj1=YfqP6D-BBl-`ET8h3S~xLDn>R!nK|2%XZkS zMRrILJAL!}=;gmdsrmTva}yv9r`{Z@i~S+qAp6g0i2ICFf06RGGZl;+r>N&U#CH%B zGwKI$FWWp7zfWhNs)W+SybHMb(#(-SnqI2YR9j5@N0jv^SyqpFR@zi_QYb|~K@9?M zPdr*;uyXZn=iNID1fPmh%dYjz^C7NMF(kVu0Q3+jvlwwtp|6j~U)EZY^Mg*-h+e1$ z_Fdb})8ze(I7Qj<}CQUczMd8y9BSA8jxuPn3N}_$kEw@?>XG%rc+_ z$flitc^<7l24q9bR|~mGjo@*dBZ%;5D1Pu-z`PObL5J|AV!^{uN=YfZP~^Wow${7k zX$o`FK^v*5ua_<_sOIZY+YLV~e*H-t#>>UF{!@0L8Fsr{UrdGIBJu1-L1tN@vFbFS zG$7Yg_7{FYIRu#*bfzVE_@CseQ%AX>bi{yDF~mCM1Brb*m17*w0h*)BDYo*$!=LMP zrsh&oFxo|!73w#Iq3NM`u^B$D0!V)XO)<-Q8fU-g=q$6WUf?XYK~$ylw~*yLnfY`6 znNpW_=cS?@Ir(p6vph#SyQ)y#sbBTBOX&|}59ozpqd(QYjJ9ocfa#bv+mY4ty$iJg9qE4P-j zqT_H^Bhw{4`13>U4j^3C0^ujdMhCcxa{fENC3y0<0=RrnB4hq@ZB%~HwcJE@$`5Lu zFt&%Oz1E@aUgoFzi!;0y(N+W+eNp1hUJ5GMv8PEVev6CwQSIk;gb(+q$kXs?H1lrC@;#SB^4v`b()sW;`D)jN*(B+Yhjq z^k9$8r<;;}00~areoS(;O8m4a#8YTX3e#n|4?h$j4`*6f^xu-+U8E4L zp^7sG*zj7u%op_v;|r|>OL{jGA+%%|{qZ1Gz%7>hnT*IL&|^4oyb{9-Y=zV-8y~op zmTp9`V~?(aFoskvv~YO|?v-n&87kO2-@S%}{y6=7oT1+g8d#WkPQy8`41Pn3mQc>M zI67PJ#B^!*{h)-?PWf+e?7H*oave%)>t`JLnUP_H;QWOtK9*iF8<*5HBNqx&q(-?H z{UsYRapz%fh(@|$RLl`>tFG$_{$(?z<(~L3hEhPfL1{v<${()NnyIIXLTHH!lCC^4 zEq-&ng|uOKd*90ZcBy5jEyh$x;-BMg7dIX1CLmauS9`8_rt8Z4xYKp5x1i1(kc#zn z)1y12Z5UDxi?Y7c;CUs62M^e)*xYyLsS}gdY5X?@Mzb#Ny7Nj1MRT`C!6AwK^C}Q5ft&-XwTv0@eop)|$>=+#+WN#=ZoEHHuJk{| zhBRso*cTIQ62y|G(w7mFt4&hJ@a=Pjm+nK3PePwy!YO*OuM4X>gX)5^fJbY#J{Jj% zA5xS_*^_(nk=*CrYfwfEgybMU6iOejf#y%a%t`}+m`;417Peom*|zIpZTXF7&(Zr9 zs#+nY=$~KRh{~c92$ab-pQdQ^_v0lA6#E$%JluKe%}$wmsbc+>220zS>-9^QxPRW% zi{rJcg4sB3sKlOHmHM=IV4>3kEIT6g|7)7&=ntA=k2w~6Z3eR}K)PSPC1jQB3S9}P zJ$PGq(Je|7Nm#PsIBO&@^4xrLHr3Oz@1nq~Y%JHt2;+tGZ3Fx`e_IWX5ZGc~nA)&Y z_uHajQV2;Kh3c0nU0n8KEe>gZ9QKM5K~RieDd~T?3V4XgUY(s`^6_ZYBQ>oq&f_G5rTgt4iMot};qXNY zzYdSiysa4qnhs_1*lL-I)XJ2p;F-X4+%CArbxjObvEiO=dizEy^p>}bJscs(M!C;KJJUEy$0q@;87-O`uL-r z{yIg`3jiP|+lU;eZ54Vr+;&_w^^X#RJ{2}r97sMUaGLl5$F9d^`_RiF?6r}A4qebA z>Aa=;F&oYg?ItU;S+4<+^sTM-qV%BTfQ}mf*4P^N1%P~vD@|w3 zemS+GKaoQehp*Z1sW?`xfnbpEk##3d8wXJHj}m;x=H7r9Xu4u2mimrecQz0jxiTZ+ARVmW%Lv`2UUSK?1tta(c*ylo0N;SsbZeVlV6V3>CFCijt^CEA)kgvKRkT^x=te&&b=(+~GgkoMOu9 z&?P!UL1!{2cUUM>mWqw(HKX-wYdVl=eTQc9l!E-3F(W31;T9Gva#1wSx>Bpx0f!@d zv)Q1HKv~bY!OukR9~zrWMK7RDN{%d6VffTmDqbKqD-7B(1w%GtqXJ%Hs}|?ATL24i zV+P|aLF&{ggf=vVP^}N~XPV(j{X%<_xFV6fnF-Haf_iInhwl(az9pf!r^*oU)sZCC zlxznq!dAg01aWPcgbzM9hYS9cHs(}K^>wMVM$s4OM2`v1fI{*J8?{91D<~E?ZaGw^ z8;AZoGQQaQxC*kP99=$H|8UT1(ZAVS>FH|yG2ND0`;6(Z!TJ!mqoy+Rz_5xYDY=^Z zA-yWsR|A4yMxS@cl*}E`<(rt~2HpwN?=F?p%cP?|_$4|IU}X~oW;8A1SNS}-vKg$e zFnQj!Bmr&1Bl&8w?Cd%{h8Yg~Tr+oCyT*Nh93fzp=9$9}CRu7XfMZ0zEVo)}5ZYpT zRY95p98pdK)`AqXRR2gr^5+}f>NZa>&jw@(^v_bRZg-+jQML6g6?H0@_xT^uKn6Wr z2d<~OW-x76zb*VZw|oJ&Cmom(6=0~7hz#{LBYKb8hdL`s;FMs*QhekwYl+U?=O?_5 zI5#N!fg};{#B6Njq?H};Ocw!%l4kj(xRTX6z8x#8S!T2teB0Cwrr;;EaEsDwz9fH(c?@< z^fjq^a@GbfLgv-2w@lvC*3IDxC?V}tReX987OIs1Dgw=40R z5qL8dytr?sy33lZsIbyC^SPYYR|J@-stlq*$K1{QWFhY#DZu07({T}w@U>oAD`634 zNVxT_b%o}3Jv+7j$VpgevtIFr0d4_Lr9-u>R*lW6yJutqUc57>B;M!Z7nkI^9K6Pt zl5F3DU+~f#(gr$tpn`a|FGRb)HiLz?+&NOX$PBdW||{@n2aCEuO6tuW5`qz9rNsQFbzU{ z2d?zE2N_~|=-YzNTe%QHw|6zSuIA39Pnwn1>@7SG4#7a$MuCRaPhkW|I$8W$B4ZZX z!>S62P3!X|XqgD!tdq&_;hqb=qBZ!{Di=JVwgwb$KFYeMH5;cQN5RK&`b{nIRy8eW z^1PAi)6B1JkFh??C#qH^9>uFI(Su!8BSE%g5j;9ws~3bxclFRAr6b)=P~qV=hz{R( z&u$5)s-rnnmu^soggYv- z8qy;-8jxPdvX^e;Th2NNFuciu>#&)YWSSASoI`+&HD!U=H<3ct>9t*n*=C>3j>{CU_wLj%5rrHpoA;czLslDDoA z6LHFakqL&#z9?1G;L?A{NRSeV9u@wL>mGE~=+X zcj06E1iH~>Uu}p38>9cCV3q%~sjvw}OcqbrROcIPO#cjM4)JJ0{ULA!m)MM8zso9yFvp$ zv7i(SQ|iR^eEX-4&CS5}+f zDWdjVtb=)w_vmcBWg;T5c;lA>DkeM1&pn-dv?X;apy`VSA%Cb^e)k5Z#SzZD&4)Ci z9%&7x8rlzHz!WwNO>g7%#P8sRXeT2Ss&&W8TYIK?0&l27WYfqS7TR`N{h*}frtE|Q z${mYTT9c8d8t8=j5^moQDvF|U$78(M_oNq9JiHil$C7C-KE7r`b7N7yO84AQfi*X2 zjJ8T(LbgM}xy^;Gr;vDM=AHe@tkrTX*4Ev~2T1@8N^JOOg19eM76f(^%r09F>*^cf zK4V4| zpUY=`q0+5cYo0zSyqviO7z99FMm+YuN!ytqdfG2RYT-x@+Tj(lV^Px@LELI@hASHm zz8VABc?$6-<=e)6U42TI-BL8X7B-M5h*C`qZ(ZE{6qj~F(tbrvTxTY@NkJO#? zF!~J5`lZ8)0408Dh|PU{DN4iHq1r1AtQ=H~x=u`btAHbVk(T!y4bi<jNN*)H6%-Oen_R{3MI>R2_=*giAiRb#w!Jyu?K6Vu3P=Yqp(vhtTd&|GZ8vU^33TRZI&EMM0Mlx#bT=tGai zqNd6QPnb8Eet-DYA&4NycEtWKiD0ncF^^qej8|&^VqOgSRSK)Z(b8{Dg6`B$U9@Pj zdj~>u@0_*unanB8wCyxO9>XVIpwpHT!2kj6=k=f9K??jDA^p*#s@RIb;-I|-HD0e) zGfson(t*4hBQn^MP&ut1zb<^;j%yf8w~@S+y9TdURV%78-v>Q{z#x)ft@%NaF58?X zZwHY2hxPkk|52=N#D(>+P8oxSbZ+X##u392gswTGzkJ7jWJwi&@;eyIJ^eALeNNQ( z``%U!xALVTps*%8KtNX~@+&HAyou5v3Nc=~KfH`sk46sPK~?RWaDgAcQGw9LCZO-m ze|_qLs5R{=&<-ZxpakftSu0=seIdj!4}dwMM&BJ|D?HGve0kI|jB_y#9><3VLXo6M zoi;?d8hhf7RObtBlz@>v=H`bfNm4NpZ20Ak=j!Oq44EmXUe=40q3)Dg>Vc@1{QztN z{F#v5u|tqQQ*3?)l_IJLsbjMKwzUa@0l|CuZuZTp5Z;g6$DfJGljtKfJK_1DSLJ{5Ntmf zH(xI#WbtsJ__7~7!#;PNab(5}Pmo$YEmA#s@26L9ch{X!HzIU&wohf|ZTBqY{IytK z8IJ;dN5ssR1}Na4B}9gNS;_Tz1={)JHt0v*=cmgTpyBPft!N@-w*JfQ#{9sisbzk= zc84&)VahoXVz<7`pvWvplxi{vL><%=pr-D*$*N!{k^-{)UIM?TRnr-%Ct0&UhGFjr z)ADk+{QZ)`zUlW;6K1q+V87 z5)BvPz)IUm#{vy;K)< zC<_a13kw*%(i}_2DIZaR4--veK^@x&PyhR&7>tFQypKl4j#`tF)-L6Yx_sw zy74q_{yQ$@xpLED7+9#}R5si?Wo+L%zGZ_SxL6*!AZF9yYV-vb%|tCT9(;L zM@a_}C%Kc9{Z(a^q4+940d?yw#H~+C_F~Y@zNG2yDAUx+qE&J%?+ekR?w-o0RCDjS zFTk{Nfqz?Exq*}sW{h)LczH@q$q`axBQ5bLJqu|2mTs74(_=cQA=U6JdStB+Hld)Q z42gD4KHG(jEof%C4eu& zk{_Q!AvUGo4;c2V?HtwbUsoM%^F6Vn&HurE*zW^w$GgdMy-1Eb2F%{H&Io)leRnW-^Rrkxw|6xZpUX2 zp%KBf-zPRLAL>(xh>h6dI&=pK&IsZayVq&0Ogp!3A7VFv@OZ<#2d4*w>{Eb_ZikB& zUIe)O<6Hk-d1&M!hlE~nUg);mCS2suGR$-kYW1RP_M;fbKB2S@tP-A`vOx% zEQL^#WT2A?#i814v28PzgPp#}ANgf05%4!8kgF?;wRA=aF(1)*$V_|I4QCvA1WqRZ z88or4Aj!IDyLOOEYo?Lob>4a;ygVgPB?MYe;1-zeS8t^zDg8(4gqF-W{l$7mFu*A! z!o#zFiWbFIDh^O|Q1FO*z~K_8CWi$UP#Zt?6w5bd+xb3tJ?_jj0t(b!Ys#$dd#IwM zCt1sVVXmmK`epYJ?7@cUaxSC!b6gDE{Nls?L5%%!tTrhfoP>RB8bfFqAc>`2Z-}9# zJnO(UG%<`>-lUobnJSz8>B{LGCjDjuqYvU^Gdy*xS!Yi9!v@JTU{+Tbhrm@i&2vi< z`7ntd6LmZV)b9+x^}uZF-Fv;*RRS8({4&hNmA3l%)fISAF}i&DAg^+TfxAVC*vKI%Ww2up(gc37;j((x&q-ycXLr!IzG%9S~?bHCm5#uXM7#(%q`JP_ibH)6XbCC=VI(7#PS@kl^{&x^Qbq2*%il>MXowXR0_arUJvv@1_d2K(T3^mBYyBVjESDKN%_ zcRXi9(4=$a3vS^6eH~mjh%MOCIuSN7wEn8=RLHbCbuym;^RV~eiTrsU?rDB6Anb({ z&%t4g6QAUjxsnDK5Sj|Umt^smJUrf(LX`9hG=EY4i{im>f)ZN6*j{||N&FB_8j zqWc^Iwis)Z*HD%DMWKg@6h%J7MrC?IYDD2kV?fP=#6rma=S||Pt`Jil{3ZYS#*iy6 zh!FLTm-*9-_!G82V+!QTVET>8C|%lVQp>;!9Sw{nYQI#kV965U1M-TITKz7#Bcg{x zz;h7yuC5U@Wmd@_Jfe``Ef_#Gg#nEXaSy~nkA3>`$igVe-s=0sH0!FiM%|{94;XY#>j@224GZuMrbTSs&QQj`7cI z-4E|;rvncaOZtl^vC?i}BnV6}X$AJr{d~jZMerSa=%8Kfrj_MerqEoCH5e%XL+|yp zF-J+y3*MyN@CeVnN)xb1U6*wJ&spII>Prj516zm>_WIWxADJL!wjP-wA3NIwor9}5 zmp}m~#`}jWU%$vc!y(H^>-atQjEGCpo6BOoQw{E!(8HG3RU@%my6!|>j)t-QpF3x- z(**cP9yx#;{DU4`KV8mi;)?hW%O)h(x^SfB%lE-cK;X+wo{yg&-FSH215kHc{C87&5R~&*`iO<($W?pL>s^l(^lF&z=Dp;Scu6HdmSnSrZRv zFOl}lhufPkiK1dG_DX)J8Or#k_@Obnx4>rEyeu2D{7*OH4H{qR#-?nl6qQYV86n4~ zx9*fF&}xuGrU++5QuT8C==17>mwQP`zIpt~C)Df9$_iTlwvTLbKJ=M4D|Wt?Z(&meQ1w(ydDjVnRxe|VUl-7Y6amjP{|{nvUPcs>@PJ9WVN zB!q&BX1jC)+HsMIm>EMHpAs>4N!8g2hS7PqjOJ4cS~Y6mQb_*IGYp5Jp+8|5Sk{3d{u)>g&FqF`(EjU< zm`(in+1{o7TzJoO;h&cCcL3IGsLhP$)$Zy*PQpETgxU8WfQ#!?$kfMxHKyhlt1HJk zs|PG0Z8BnX!~YPBu3wzhLW33EVMwcgs!p^2iSZjAgg{1_3U@r1A%VD0sQeIxApe&} z5#Vb0-KVVNXTBMM(99sNBO*KPX}ze!!{$$saN zHX3V<03!0?Y~B1J_^;)fK!XWORbg6|GI>disW~8#OoIKw>4+N>Lg$C)2k%GXs@2V# z-5tiHDiw90qrJ0AypslQH|C2EY*)5J*{6dkV2v3| zh)Lro`5`;4lEQg!>FN*JK+^lu(BDYqaG=2e+*h8xuRuIjPi)`@{UwiO`P6jOR*bxb zhBk=>*&l;BUpd#4Z zS=hV$A~H4>mAq&R`ay4~yck)b$rd#JJ8iU-wlb-}VNCCQ^JFk<<(805LT(b0Dv}_t zF+wyD37^izTmK6CgVw!i1lsxUdR zM)k1$Kc>DrkP7$v-`?ZeWJ?L560*6GJyJGTMkHL@waL8pN|KpTGAnyaR`!-Hdt~qZ zdoH~{-`_v=m;2o3Jm%7i+o{JCQDT@=p6AZNAcz(IjB^O&Ay326QAn9}jO})2T=c*X1#sC6= z+`<1xSF4 zqdSZ#{}!*xt9#-j=}HlRg3T+%Yl`tdqEp8Zn`x&WtuN*B7fhWHZi-lg0- z07W_|c!0ce)0CBYMvJ>GVrYB#nH9AN+Hz1||MX<|*GHcX44-3unG&aa8hD<2jb4M9 zqjTLSn!`_{o%DZqNw_CVuz$nsnL5z+v4M*S;#)Z82>fnOI746b)bgLb>+ z?b#vy3C!GR9~!HLFmsB=+1HxA7Hli2zb~)-n|4fiBY)bCx(>tZ_S%(yj2;Uje9B8I z4+9k_HCt`y(&h#d83Mtv=(mU2k|S<`aZUl1C5032|~|sHbQn11MSK(m@I!aV&24HV0!LU_|r~ z41;MhmYUD&@m01GhY{w+D>3m}->NdHZ~u?5Lgjz%HCFJ0J|&q9LlW)SsRSX#@>QOY z{O~pyy#{;c#v_kphS=HMil?TXx>8(Nl~e)AdrTh&Q&%^h{+z7|Rd;S0>x7@?5ngXz z=foIwTB3L?PuZ5Wr283D=qd#fm==v!lA5h@r$ty(ax|v!oi^g%ASx2_BM+%5wylQ< zs`@{T>}3WuV-K#<9~sbdE&q>W;t5B4Gb4t3zF(AV4b_f+2*ecmF01$5k$ zmvZmKgb8QMFjQC=>F+l&5t~fv5XS&MxPxB3>!}q6cwYyo38j3gaztTCPTGpw%Itws zdbS$}RDKhKQ0HV+(DhFvGtu!fy}`f8%+rWZi{@CBY2LkC=fBw`kib!hNqrwxRmW~T z{+`h_2`UKhIw8*G{e`n}Y+(y-QO+L|`us5Q|6i!kWzJZ59rbJ=;-H2q;;1H=+^LA| zxr&|7io)L`W*y2~xv1I=dP4srTe|8VCZ`zsN+lig4?bSu7_+icPZ!I%&w0hHd!*=^ zt;~GhN(k>%i=NHKYm2c7i|UVEwQE?Q(|?41#`(TUm0+F(&w(4<8qiQZNegi;J0Yy) zg4zxUh9A`i6NDulXlZ>Dm~2wA3Z`&EaoRRtg5yBCHX3u5)Z|BlmqH0?XuoZ>`M{X& zdBpI7--Zmes#y%zYwMmyD6WTL5&97mwwF=21$qspRu}F&U|$BmijfQ^u6#x?Irp4F zuBxwWS^$jB^v8Ai8(GV;WN9+x8Nt37y|Dm-LIBb2ey~_VnrLkFIPJU0quQRWW1lm! z)F)cP8`fy{Y(@&3i-Lz}M8y+|zS#@t5zS;DMqMMbqiFJmuIqD1d3 zOVx!+RQRb1Z>rt+pJw8q1BQgewx1Vj#Eu`iqh|fi5*_Olx0zJvkL1)G>=bTXMh8G1 zywE5#a3kAUAiQO{hMTIdYpxJDQKBdrp(^g``#YGK&G}NogxMSU_e2CCh>ms#du5>7 zl^zJU>tB=^^@b5t4G0{KUcgQm7HT9P-D&IkuZ#B)+9<->Dw}uzwMs9)&3KU0CvT~V zEPXHEB||WXaGt)eU6AuuAn5l^?+#s3yO+|H~ie!4X55_Ul`e&@Q=4=$U3``%M!t&EZgO4g5Kio*9VQt+n=GY)UU1{PD_ zNVPFaGbc43&2uVC))rvZK7wp)9=WWDIlL@b6;6?cOR+BI_bdS)FNt^8T~=+*N0$;S zeR^00uMfcdHa2n*5=co>WPXH24sD~(6uD3qt{E9T$HICppq(43U7lw_O&wih_mO?! zOClYUwMhs(im(cU>OT9oQ2CYbZ%=JD#^rj$p1w}Q#%*+CdP?a~@SsqrjVJf0_cQ2R zPz5GKIDS+0%w+#~)wOUgy;Nsos5@e7fB36`@x1PX%jq{65>i8*r8qe}R(-UEE!Z8s zm!3`uE2|a5g{d@^{b>td4O4#eH3VuM<_8~s!~H@aJ@T&eWWvhP$7~!=#FrHPQA>H~ zVVh=2E@6uKe%ETn0Y~0klVg!-uwJXs1Kml2Dm9#qsXub%^*fliK2W$$b6eYh{pSPH+vNV7wKj(;1pDjkpYt%*kPh0Mio3*A5)}_*$`J%}9BRfVzj*kT zo1K@KXY`xAI*A;@xavRwdaGge(Kdre!m|b)qk?pc6kUG_AIG7RWXy)5`jYTInRjXo zsF!To|I}ue&S~Y&NdcnncF8(E6rvv>&bv(TeD7xDEhn2gBNm9WZNe1#i#0-#N0i+H z-!<1-)-+p7f31q1OSdG)bf2MVBwGf4sIGgyy$Q}u^u(*m;i67kyK*BL0u>9b$t?Q) zNx~r3q4;5_sA;tbxb=@Ijb=%@X-cX=S{+5eC<)m)!8hQOVj0Fh80YIfRX>CNq86b4J|ox$Xyqgn_HBy79>nK8jUe zuW(k~p~XUs4RGbYEI*y5-fL#ih5k-a=+fHr)>F?nUDEK-v?2TN&XTVjxCEWrhu1^( zIu>?a?afIbZWF_qFS3;S3O+>LayZ&gc=yfpW)DXQ1j>*x`kp`HiM_=KWNS~#V+Zq~ z_0_Do=%+ei8w+)HtAdE9Z})sfW2`tn-)}+E|}`%C*F+(1AOFVN^0{K2y z2B&fNEzG#*;@GiR6SBnaYL-3vti{`ZGkt^g-7` z2|T$}@p1PIUUm#X&b0F z_<*bkggVQw-z%gU(=-j;vjNV~vc2G-thc`^473|MvX8QL))BeK);AO@j$cF~)u2rr zAB9+0lMGrL8=d#$Pu5pO1$SIWvLE68AcGsC1Ech_^^mH z1Oz?1__Au!={L^ssFcRNzgi$)j-RW%Fps8JM+&d)9)p@-+%KJ-MsJAqCOaqISjEGe z`SPzyPV{34*htVO(JS{hk!pTy=t|sq6>c_E+cL2xs27{E;@=l{O_#2=rhGF@iB^O% z(d^xOAOO@OVB1_V{25byXm8m1`Z)YiGN@>tHU~>&KWZzuGaq0*YE;L0>lxifZ zL+~Nj5Pc(cdwym|n%o^q=p#xQmKnJQ+lgH!HTD<ywYyn%Calc{ zjzGKe+j-A#vtAMZo}W0gg1;<}qF>&ZknR2Mmc(jlW!~4N!`9obuQ~wA{VKS?pt(b2 z$A4oU$6BkkR1$1gKQX;Tmx@%0z|%$~ahPIHSuiX+UK1@(V8mJWW_JD3E|&&9eNYrx z7d`{5Yi1*fzGBJzMoe-$$9o7=x&L*i?uzI2K|}K?FlH8F%KUXkEFEd^DsL`FmR5=y zBRR^(!bSl&%m zH{43TYu18O@wG=e3%(_(w=1}Jd*v*lnY^WyX-?4I@sl_eV^5+6tCSr!9_IN^#Et_4 z+t+AktvM!)BChhdzbdF5Kb7VQkvV=czW&tYc!ZfN##s2ZOr zi!!HAQtc`5)w6Wu&AR!&=P!`;vanx&1p0&>7du0ruBu)UQc(~_P#DKX`1)!9#c&QZ@s5wn-<7iu+UR`!E(a9pD)%wc?N=bS6H5&8O$OO7&9p1{y+?wU!m<2}7E$7!>feC#x;Uhot-+rH<1r?N39-6SB)YKHuV2HB z917TEOQ=e4bXYzHGXJg7Y#)Hm!x9%~n;d#@jHB*tXpLwZOjE5)SzK6#Xl+um4JoC| z9Oz>G_I@P6c}tb|`NCC&+1wKV;)*_Z?iw`B z)@GfhN30xsq#Cjy7Gv>5yIT(byRO6$THc1vu<+4JIIpp2hffo{JR9z>m*pY`%N{3ow4J}eF|mx;bl|K1aVzl3 zhe~cO=I>QYr(6L8v<6v!WHkKq^mi22;y1d{cz-F9#sXDs{qc$MzS)bnaj|tl$?(oG z`c10e{MKH?RfChk4Izkly-98!*c*8qMV?J_^`g6MlH$P=hu&?gRULMyk{J>K0@2MW zp>}Bd-=>@h>?!poYZY-Ml3O=IJD|~IfmV}66rb;TwL}uzj8Y$d!f8T>taZry9QXXG zU+dap^m(=rf8qJ@1I*e@$iKz|cYacIM)E%Temk4P^eL;uv{%U5$hh)8OF2s($O_-R zBq?0>sPqPHB89o}-Tv)PB>pSlO}-3`Z7hLOi6w+GljGUJXusK(LAQ>wr4_AaF)O)f zl?X|A^yYF)a1C?T<)YIAGKHXZ^w}0|;}~Wk{p)wxRLx2{=p7wqhSv7*^8CpKE`OWE zDaOu#qZsCIdveaQFIJ;-SJ*oqcb(Q5?^|T|T>jg*wE*?Zy5OPg-VE0X7jM{)rFXdC zMVt~ItIWUDdvRzN-Cr`JgF-91x%U1@&lHgA(Cm5DA1^J}ZWe&`?;Wm8|L7{ZPOQrWMc7F5f=gmo- zU%OQqJ!{ma5t^`*G3NGn@h&Os2?{6uv5ECU6ad4igbfvJ&7}-nH;oximbJNfDWEKA zIzMM6y>UkBj_l>%K+ZU(h+qD-TSy6fo|9#vcUkv1tE@c7%74Nynv81^C6kY)wq?c_ zth$gmaN}31UI%Gbg9;ia>E<+fl^q=>Rf2QoJ;)fgma1`8kCh*9ve%F0qR=B!+h=53 z`s2ghX~!=oPEwyyIlvA`vtSBB;BYntVA$p ztJoSurze_Db}x4%A=R4&B58~9)53SXkBch~nxh`aQ(;Z*gq32>?>H#&Z0hR{`uCe_ zCZjBC=JAYo)}=K$ULtm_3B^<)(9Vw-@A)oPG(m4V5BVGq&U^+>Y?=Ff?;NR(b#9E7 z=Df-=?Hd}PT=e{h84{%l3@DC9nb=%AWJjsos>Iv1M)KE;Y8iLlA@DeV`_> zUg=u4BMp~UFn0zuY}tKKB-?}ub9*t2gj^wdz;7jjz|v*dEmFFrZ}i6xSV^UxAcD&( z$Az1{`hTT~=v(-mZl&+rI8WQBx!vbG_4qqg&f%8nrn`ue7s1S_o3gX-xYO6-D z>|G#k9!@4iACHx@yc=flX|_ilWOVM*BeRB+9)UNsOdGdk0YC6l9Z&{?W^7p9tQY3L`PQjYhJT zQ5wZd_A6?agb$(tL~pdCJJ`H(!zEZ7C^kB!{@zn!yCQj=%Fg>C_|i<=%38MCoryvJ z(o7Sh7Fv^djZYr(1+^%E3#c?+Ar<+ls{--@M2sfPRIha<4ebe*)L;gd9d6m4$(f}I zNBkYBd+9z_E!f7RlOK5WP{Hv)@i{zegzW1il{lm)({P}7h z2mVNvr>xG|gt4im+Q@T`+cO@MHuAs*PQh*QYR|7(=+q-X`#;iLv0BjLhHkkec`%bx zfh+%XcmWgksd3L}H*G$3P4c4H@#n5#x~KOZ_L^bWMn(%!Ix-6L)l0baBtgVINvSUu z)xPaCDka%l$NEyLU|KTEaJ^Xj7IWeOalfp7v(znp{CSfly7MYCT01HZZ9m|&;s(_|ft?Rq7&p#PtaX1e*Zh1xabHC)eB~x}X(9-Qsz>4-^t<`(8t?tyy0=X5o~!bKH% z4UGWDm9%-GmFI=u*KPqw17G2XZ$0~*biF;5#O{zS+j)Y~AG$yg`z(5$iDDuKu{$mq z%_$2q)VUwHk;0%DU^UZ+$Qfr;Yb#t4E@4`~@EniCWe+uD_u+QNzpw1UnQ(NDiLh); zJ@9xJ9%!K5QUH9B=)99JbMu7C;QVvX&05F&ds5x$3x@Ar%J@lRoudc%vj+G}cSu^y z*pN0LT=_K8&d3MDMqJH-9Y~sg0X|xLoxR!)*#Fu~liqxGC9)3I8j9eD*=)GrRb^t% z?g)|~!zOnZTcB{oPWoSN3+EW3@E^Z@&WQ7qy{W?z%vnsDJL_JM#PCXDB*Fu{jIl7i zkElFau-Y=KA?I7CF&7<0EWidke?d=-QA)OR^tatONSrUPeIej&CK?`wyoW0@?zhOi z-v%1_P!>XTl#oWMOXVc0H<5t8C$dj5m0!I2XPx7@Qf#4&$5vI3chTxAdFT1+Z|~_l zDlbY9Xl)!LUr%Nckkv?51}?4EKrAv+jKqTylleLyCi*l_47SQ2#YC(Du2`JpTtxPc zEPxX#h5gHF0kkn#U+4dvcl;}ZArGp6?3(r{aE0I8c0$9=g<#H9wcV}OwbXao9lLgI z3p~75-RC?!Z@^Wp97~Y!D+W$9b!v_TtXGH^Gqk98XQ~$6`iPYreLO02bK^1c;+HMU zeoT*}FVILU0a~u_=V!ssPwG#MFyw1RS#bTNZeu%F{uZHahwdz}4nO8maU1cfk;jXf_9lIx z=E=BHe=gGV5M;I|$$%+(!B_v~Re7Z}%RBk9YHqH~r_tb1n*W47bWb}a0{2>UdzFPW z=DN?fIE%uR z(E;?e-!g8%&#O9ORxADieL#u-m856ZEaHSF|CnW_dm~)M`0V{Cm~F&94*=UVq;k47 z7P0kP`XK|6_GSVL=KZ3x;Ka_o)efu~Qs|U00htkM)pVQ(QR{5D=;i(5Qv`mk~0 zn5RJ^USBTV-N74|asQ5Ct-7tj8zi4?Sxr$On(?NR(o|pAa`1Figqj!rs0D0BHy8qS zvb(vc{P><0J4=l-E?hIDQg!<-$RT?5ghJ`nQ8W#7WY+Y7={hJkURu-s`l9A&D8gzs zuFmMVXy$D2-yUm}EAGSzM{T5GXqI;w1`>^?JUK+5y~;~x-uFw_hxstAJaOH7fw>KD z{N2%{=a;kUBE-2=HIiVM&;ecD2=1RGbvCBP2$_9*n10T)i9(0CX(@-*0fPipywO+y z7m8LbDWSpxz1MXvXkFaILe-!Hw%20aC(wGU^OF#JWg{B6zm$>HuR`c1eoUQVoTXZ`L!qAYJ{+S-9br>QVe7yn*v%E6kbi~s71b$TTyJl)(!MJfJJJc z?3{{vRG2|}{M~uUG6%1+n4}i;KuFUX_vY5g_Y^*RlcP(OerXohBP$v^T=H6X_s zFJoWI*hoNQOYx)J2zua-wR&ddTQXes4pFECE=Av1VB2`!Il7owEqKi+p=E5|uGL+P zAl8ha+AGt-csUR_;C6g~G@}x2+c4eCG&3d!wbw(J5jAUqBC{O@vPJIYMyJwReBq+0 zC@OnUqIqOOvHg-IV1jGai>BG{H#u>O6E8}8Ss4D#I&iKer=1zu>@WL=hG zr4awCk#q`l36MjYwWNc8uCE`9BxCB!~BHeSWGxy>FmNr>)jxPLB-4d&ZuN7wP)IwHmtQ-9{IvsGMlqsuxzP zTw+4*2qGKNDw`f;y`bD_la~KRug(YaM~+tyvmGf(V!JufaMVyh!(SSN2@i}7FQ-sJ5tZ$g`U~-OOy7k~?)jb;2E|RwXE!6%4amXs8T8j(t>sdeksQHz;yn!=h zZ;^P!h2mHNkYGGF&&$2B34V3-sM1P=by)Qfvb2iIDczfD@-?>Mxav>mmBqY80f)l! zjT*4)(69iIcF_Hd3^(oA8amyi*Ya_t>+$q3$n-x&!k;%0X&&qE*{#|Vv|Oob=^tVza{lED4uLZOjGukjFL zA@XUCb{J4b>K2w%!i+PsDEf6>S%F|Ea*cCx-TrUTWCX|eHvIyu5si1A_iILN07WDq zMmpDe!3~ECixNTJ2jpNqawoObc19$I4? zrh^|kX!ot?Z9{MSQy6=s$W!>3#<@waKhA;BWFtRWdo#*c$B2t4I_yB|#$UgFNBY4^ z*&M=xA~yWm!xS_r1&$`^8i-?=n;`kipA!!9MMeJ>%)knZP263+z>a=Qq>#_1QFRvx z!x-O1BQ~NiT${e9tAXy2uW9|Cp}1XN=H<}$)2hxM)n7eSo+_Lr(Kwzi)bz~_lN~q_ zuq6czf>$LlqFaMlh!3D%>xvzHmT#S)W5J;H4zbs|y#Uu>M7;Y@-*|=lX7pqjki-8k z>C8u_gGbnU|7`g_svb_0Bc0OZ%qUQG7$JlGk`F3CR@yieB5I#f>W@0VW-?jF$pVCO zC1{Y!*P&G+hfqnqs6?f}eyx^3pc$ZhNgG=c z{wB1eU!Basg3*1GvPBJu({X@H=Fni(N}6vsKNV-`KKPOho%T=>i@e7`J7O*@WbJ_~ zZ@(%!apbvDBsCgkw< zaP6mD?MZJh-{mfw~!s#DhL1n~hX!du>*AHRl2% z+x!rMBuym)VV9-n7&z3tLs6V-S#=!G#`2IKJCZ1 zjD^QPsYN2Y9Njtx46_csld+wScqg;-EHnCQERKi1ABl71CbOxEclP(< zt*$NGl42iW=~rm`CM|`J=7zt+;~$M{($)hD)G04xijGwkVJvD+wtU{2QjqF}{)>Fj#GF&Tpfrt~NRXixKFlmRh}xOpuWitiwXg*04p+M9RfQGA-P1bW?@D zaw~ZpU_RfgbLx20{M~nNWEIk8$rGu+WSI$eIK9)Xr*nf%PJtsurV{CaLTRy$ zyTx^WrH&Rc9}CR>k9#|+7xIX@@0qa-T@GFaMWsupqhBgN?X3ANOmX)u zS1(SS7hWH#L)HhWE~%SpQXJq8%z=H*+nUIT=N~`to}z2|J%sodl@qQmVCM*FbFO3+ zOX`SGJC+?s7KDoejxo2?&Fc0C<2nJ);@9vlqmWrdotB!$&H|zOkaCYRTur1>&Mj%D z=Vm!`Fa$$m(&b<{Z@CdT(Wnc;-+38hk-bh=n8ti_V5Z6dXSH8I-q0%=Iw=Lipv2z! z%@d8|{;?Yt*!G^DR9b-puEFH^seln7`hU3zTF>#g>-00XxlsrkZV)*mYlXMivrs83Z5Py9hB5+PpIJ`OOvET z@V{6KJ9G+4WXrija`$1Xo zB#+)>!9y6opLb)Qk>Z+sVLZBhA7(3e;P*&m81+bo(!1=5-1j47uO`>^>1an@j6ZRh zk{WD&LeAz$=dh{TK*Q;&`Kc`$K}^jyx=5`|90T%j^_NKDxK?V={u)#=`bVS=L7UaV5vB*XgO~Eq1p#+Djq)Zz>SmLu4yCQ z==Xp>=Yog#9>~WRh#~U2Ce;BjOcB25{F3tPMm}NrcN}r|({082`23D?I(9t&?7!4p zYvy^2@V3fCffe^tUMv|CVzydz;WEtV$Ju%FDPDo{Wnm*MTEp~;?iXiPZ4$c}J=R%u z;a2x8^s1}mKqI|xFr=30r>cg-ema6w7RD}{2?MfJqX3u-5` zxP_=)^A4?K+nsqSRm`%hS(mcw*Cu$Ag4|6D?@95Fk>)h}e`-@dSP#pM}x z16dPF035E`9svHReV$4^PfgsC4XP>bQ3qXWnh;8dX~`b`3F;?c>=8^& z-Bm?KqXfKX$J*5D+vRO@1veIS!m82I$50DFjTls9a}#|S=JuDqmI+RVzAsnk zR#CGS3bnQRdb{?85LeTVfV>yM4595*yP2x{vX^93)8&3J@CViUOyx!*-!11~eZRV&PMa6BAW`P3H3U3GAGe5`; zI%&Herly``X^EH_dseeB$U#oJM;(~r7)i5O%bF!7eqZD%2ba`(`$S>Mz}5)6R{gA0 z2Wnf!Hu-#Lg3tlZ@>j&@-Fr*>9`F66{8SH0AW|x89lpATlhrY*{8Xe`S+mx_!9qwY9LuY} zl0#u|$gr4dPyX2M(Hdb>0lquG)dWw`bQ#y8YI|kh2WN^_-P{wGcA0&HTGxU2RKuPl&fdrIoT@mJ zmJpmI>x|b^g2Lqo#R_$~q4^>B8`ieADXJmBxiFX#PSdPGw#ZZelaZK zFC5Epsv9!3)Q5kh9S^6Ir(l`=5et2}^Mmncw};b{UI)Ww&4~_U=s6n*m(aBT{`xs@4%qk0F@V5bv44Suytyo!Upctt-Lg-8nEdAV z2Sx}@?fH9bV|YO*ufpwHMmqWF`c%6({p-5I!Dy5|3kagyw<|oH6)Uut-vY|H^I!QG zU`<+cm$wjqNmQcs^Oka0Si|-A}#KXZBYw&jhw_+rhKG z9=q#4uATeo;$>&83K*G{ZjY3+&!`e?>sm8<@d_AZjXUuFK3}wk{@dcfwuE+Xgzj1n zy1ilr;m6525mlYb3ynCdzOEukIf`c!Diei2vJf4bj-vB5eJ*($H;+Aie~VqP*?zzdEiUwLvQXfX%fY9`fjjP<17P`3^ zl))~bD=tK?SKU03pPWQyn^$hhvV=Wwplx7g?pGaj*<^24chbe><~t4yJ!!4u&AAJG=0$Uj>73mwywnlQ*<0(O;FHMYJLvxgQEO! zf9o}PF{bGQcjJXq1SsEXXd2!>^LX))rP~SH>+&h)TKtC{i#1hS6Vt{(f2q+N{mA&W zpNH@p#5op7E7N3^%PBx$y*TNg?bhn4^W9(3M$Ji~c2f3mh{~xsh2VrvTsm#fFFgtP zB%|c(yPt@Ie4hK@*pJ}%y z{{rJr86t%R%xXn^#aCrEnBvhuy@GDap&7fCc zipIc=Ih>b@d$!26d~v~gbP}u>W2phK*ZqN!vys(WkLQ}C>4Ylfy`c@*()3OY@$o47=Oh@sv8~shAwBC~K zIOTf$T`R)YPQP!qp(3cYUi4tGA~UFJyk^3!90XxClTq?!%Kxa5`SNz(`thZo;o#F@3$`dSd` zmD%ood}A-X*7oUT2>u<@pYmSwgxPpys^P-iK3%T{hO~Qm{`=%6bB!%+{O=xX zJ$cxZ-w52hrF6Q8kh_PZKc*$K_*rWb@9wp{>fh4H5YWdMj^bEa`d=6@z#??>VE!A6SckD7oX=<(7$6BnH@~8K zLlMaE=`VC?!aw5mL_0N#+2BuV^et1$*%qHTtowoqP|EPP)M>wmreM1URJ(1pk<^G! zD%w{J1cemc&%~Q2vx)W;fylqs`TZEPjIj*(`C2r3q`L9whN<4 zb=lU53Z+K8gBfuWT(zG;oVFeO=%_!|Cah8-v$Dv$(orVQPIgDAZhbwca{6Kz zJ4pig>}v`(+n4mW=WBON&|@m_IYqFL2PG9A*ae2-0zTN>7OAbPqcs29GY>3frjX{_ z?aCUp)LbxyDp+Ux>aecyWY^s-?La&A1Qk{f-fI)Dr+m-qkyd}5Zyk*3XcsU z@JB96n9j8gT~g2_#E%dgDssjNT*sNkM|O`W(u6dU~? zUPiA=<0v-QPe$qtV0m?Zk)uW%q{i}EnPt1!M@aY!c`cLOA?O{HdPMlr=@&_dt?Q{) zR*md^A@WthUzIMERS!sC9-&b-+*cSG8!ElVM<+_H;CJM}luSSJta`0(4jcSYE=?C5 zo=xS~=@ft1dz27as)^6%^@sVsogGoD&!33stlKz^x3s~JHoO+10x z)F;zSWz!*#h~>RRSu7mXY2afQ?gRg&lmxc2^Grj{D{DsTBcUfpE%m{rxpuL9caQNx=dO5@Fzc}82|MT8JPa|wVpmUt$S8UA{WKWTmX@y~id?Rc5U z%4GU}Eu#Yoo>bRk!=zvadTdI%or1?;#m5o}(k@=5cjo_z)U2s8Ib1+f#4&TjyYX%I zLpt}Xb^5pY-NmQtk|%eAqL_cAnr7l*-6be^)0RL!tY>&=u|$cGYpU5f;3+K;igjGK zUF(2MibnS+wl!;i+ZhXcpLoJ}o#&cPQEw>8KM>*i+fR8&Ae~TaXE*z+rCe9PfN$V( z$LA7VYcZ~Ek)WU#gPN;5;sU&={b_?Q_ad*Dm^(__D^XXtsIu1ASjl4r!#F89;oavV zUY6Pl-=;viBV62G=Xt!I8`ps0^hmdri39n_Jq9{Bzix#+8Nsjz`YLl^H_qNK`2AA5 zh9q^itwy&0ZhB+Zw5}VaX4^22JRnu9HRI40! z1^Ob3Sia{m*KNSj8Vc%nxbZf}TlsIG2oz{lhmV!5x68AJz9cecGSz8dYU&GP=_F3+ z)~@`bjiK`LdHmq`>5Hz*-%qHV&?=5P5!?Rt7Y}Bw$OB&2^3;C(DpY|uzr2C0r{c7| zv)GvY9#BPGW$muOoSR#vJ_WS2<@dr;=j1*H{PczVKGd(rzI9_k7j-${YEG#8y+DCt z9dfcF)T<)IP(Gc$(nLTkNVe^EJ^7Y=)7XH!pLfeThmB?FwoM6<)6KfwzMk2|ykcZg z2etxD*X3t|KB*dF_L|giq45XPTMqs%ZiFUq0|A=htXgTM>J6J6;hf##<+?Rqd2h)x zQI{8oJ|}8od0_Y*?7jbENvwT3^a;7RP79>agqiv)E;p^rjXxj8ablpfA(4`>$g+x& zQ?14vFGEx3p$VZImpf^fXkX&7X4go(G5c3f_CICSM3}&qo`$oK6vkgrEL!zQee*%-NTOR^lLy0*y(Fb=k-=+rKo3&#fu0Fv2hfG zT@T<8BEQd3vuzc2)B;ZUm?1hmGn>nOZLMdVbD{C5tPJVK&9ko3=C-{vv7k-Ha0BYP z36sJL7dyG5KZ$BWqE_n!LVaFr(MM)oEEP#r(s$`j=IP_Psp&>et9@%jB}=vs>o)(~ z6ec42a7wZ`TRi=fwEn0*MiujmnPdE38MZm?uUab35h|1SuYGJ8Qij`EDssm)iTwwd zX|*|zCCsAh9)=Z)Zut7VKvR4e8Y9QNKo@y^o;*@FjPqagI>Z~0GCM4Pf27p~=<)}E zXL*F1n^hcPsqZU8_gCtV=^sxDA;QC(qA zcWg%f&12&YImu0zX)oj?g1N^WwL5!K-NpMXO|eLtwx3b#?sgQ_D1#y=k(nbJ@ik0Z zI6vv|tLD3-AAz!rALhFA;I;_)nfJ^E?t`sU6>GlK1|jdwo@iY)mYC@1E*+;eE%u4< za9~?t*f^^$(9-brm1K!_KfVPV#(kp_7wz7TReg&V0_8Ck!MQuM5R+JefN$#gu|_}d zy!%SQDU*~NJ0gGlf)-K#lJEBP{jtFp6*b)wcbJ6X?eu+M^3ZsxPPUKq{E<%ptQtqu%F-w8mQnRRnA1i4ybcNISyn$+-SP4@0zW89`}=A#kO5&v_}y12rNKUYEj9QSjH^!Q{G3>!yIbRc?fBW^!wEFw#^~doh}+BDDMyVO zXWrrBM>w4lhj)GNZq#vv*@{s}4YNEGm#9ZBU953zw@hE|H&QV0;nk*Q(O~?^y1g)7 zwLZ?apo*-dT7iFm4Ld)4kw9uiV-C5&7)Tz{Fftyt{O4!I!k^&#yTAV*Q(qkxWw^Yp zf~16!vUE2h(j{F2g3{eccZalehja-FEZr<1v2-Kd4brf5eedEqzw=!e|L-u*%suzq zGtc`N3G~BxF`%)K|IiHbdablRo1K3{7YxrLPs|tOT;^pkJzo>dWJSH-fQi&LB{kJx z+-H3L2eQxazEFt>qc7*H?#5fPW33ikR=bGsb-x2%M6bW^ zBYxXk%@p+)Df5fHZO}*N;1w#@)xMoAd9!@qL&f`7Kyc+)x*-QXnGB0x@NQu=C?Pys zy#2`gDd@s9xXT?tp^bS%xu&ReOT;EG^#-?>qa7hR;*?LmW;Pvm_2fmb{?NO^%M5x< zw4PcT4BuZS%^4~VENSxxj8`Wc5(616UmFNa%e~wyth*WfVyL1lo^_ zTi6ydg+l(;nsO}d0_^-NwHyEfcq&dbL=sEu)Yr6h6}PZ)0S@>~8d$^(pk1>>sRPTF zqBbn3oP2m2*)Yygud6M$c)-{&1?&vt4Wl%^KrM>;$XX^tNMzn3yTJc8EV4#rKK*+a z*z=^`UF>ayUYf8YsTrB?GbytBEB~0{-?K%52Pt2fCk7ZSF&t@Nv3P7QBM678796_r+W`&%$A6w;5o;=5Z~NBzZrOVMeJfzo2F{cg$&qPvwi;u( z-0tx3yH_xv{vSi*f5%{ax^z{X53+h2+8HT9EHnn#v$J$hxOl(S8uDH(hcc~K`db;o zf(|43%rQ7Y#=g!Hqj3lS5*SEtF16ndkL9OZ)}cvytEXkKlt{3tjwYJp-jI5}Fk8HL zS;s-m?0xi=v{YPhEA_hEx7rPMmq+vrs&xiz1aVK=ox)z2rbdWZa!;^ZRu)Qj;)Tt) zp~-=4#UG3m1kEv@@sb$qML+Eb*sP0}rx~r<#b4NMbY1YjJbV7lil}aH$jDwvgb(a{ z#Bof0@}1eHVQXlRj#VuMivUyIy`A~<2uO7<&D_;hVxZV&DKJGV*6~S<_ge>$`}(IZ zh^~jMIv`Sz*vW)ih0i(j@ZKY~<{PO?;!eHnu$&I%g&946xxiCyiYj@_<8;VUf5YN= z{HfIo7fxs-0VE-+Dx_?^?jtU}?SDORzwhX_AG&3C2Mw?1YTfHK5)A1Jv%`LSJ0y3# zmDxTv?x9vcwrVp~hs%`AO8Ez;y&C!V&QT+cj?0=;MK267DJ+BG zfNr^Dn$`CoUw*6R%PyZd+uDzDXo5mycnJneED4^q*$A&zRef8um--ck`2_BDHQ@{1 z%#BBve>1Z$0?^p*i4-Yh;+)Z)^?TPKkS_Mu&s6oki zj-8|mwza&6I)1#p2l_Y*8M20pvlQ~)m=suwk(NiNO(2nNsNC@Jnc$S7S7n}76o7#YD)+5YUf+kNw&^pi=B z)j+?dqb^3c!}Uid;H9u6CM>zKcRxxbTu--iaGb#IH0X6Fs55&*@LHhLnQ{^rOQJ*t zz0v3oKgvvcplM}SS-KDDy)^D<+wA=%0EHFEOCRH49a4Y0%S={fyx_K`UuH-#v9?yc z*xN(Cl_z7t5so)kolZ+UG3|sr=e5oG(R|JoBuvRJyh^~DU0f9Avz$i;J)_GKw=oII zLVApYPP{mjB*t|Bb2iwk85@!mZRi?|iHgexR=NN{cK0YKkhO8s6S|9h!wGH9v)(*$ zZ4Ck}`TCK$fN7^g>Yx+A!nH}kphL&MGS?ehy1#=S4wuRg!NRJIA5{Ey<$jlvd}Zcj zSgu8FXj^kv8YsSBumW@>sNc6|GD+CJ#}b_fO}3{J3v=OfLNE%*NgLJ)Sn-j|61Rmi z@_vnrILso1m;bX3-gyD0&x%%)kM z_;vCvsQ1$On;zijy75kV5wOFDnJspwEfMh$E~XO;(t019=@~Y1t=D_3f%0`YNvvGS zo;Ie>Amz1LENX*;y}ab)y|3B@eW=;A-%rI-;iYEuq^ z=%}0krR+~_i?3nN`TmlCU_hc;>GI~zYpZG8fTXkS(?sV&KS=PWlylW^&nC&4ttt&| zM%6LARz0;b?nza9N7LCiRDw8)t7#8+!^cU&w}X9j@6hMflgb@`=T^@$tb=76aNrX# z13syRpN*vt(fWTv)*Xm`p%aXpHBPC_Z~T@L4m)f;j=Wt5_O}4r&M%SHl^^KbB}v!DM&S5-*fLtbpC|iXHR|6+3F`$0Fq**BSR+SKzB03 ztjenMZa`X(=jQE@?~WzUrK2r)-iN5Z;l&HstjcR{igjR*1Z1d7wZ-)rs324~`TqH> zCuq6InD5c76i#>3(mRLZ>Fn=%>8`%~^H!>8aU2^}7^1(md&Hx^gdDQT+P*DK?puns zT%TxnJhgRMoo4P`oV`)sf^eAP(NS|9ByX{1)LBpgaXB`&94@k{ROe=|PfY*_ zaEqfN);Sqj*L`SC?dM)O@NU__4A(Mv<8HOT_+@bc;vH^*TEUxxY27Ods^Zf-S%EKy zYXhxrm|;tLsjIpyJ5(1fEeWwcPNKq8cgVhH7xia;sIYy|uZDw7v}MrGDx1ZyI&P|U z$qP#peQo$8WK88|M05gj&DF+Aw#xnW%yG*CF{8rrAAd5>afvEOFaLU#0H0J_e&}zab#r6QgkRlkO3C~us;uI5?1(bJJ8vVll^Ew^}HGH zwh&huL_p_8d%Yu6^$F<%SgTI1Pv?~*!uQfdo0RxVr2XR+QsKD%-RXL-*ExcojI}%` zept(6-NI3S_Lzk;96c46(Uw5-Ia0H&OwtHqV)~8vIeC7=k=al+`Qb#ry7%e&}V*|BtIihb;n=s+JsM$!4r8a6h>%JX}?AUZ|<)+y5F# z)$5b4dnYionh$f4ZP*8>(>!O>j3%+x&nE1KBp%-u$&sh}OCdsmWI`t>!r*^)(Wi+n z205h#mOx~I2Ih&;2wxy%=q(aiNT+q~A6~+lbVSSM722#AEBvZq!SFfSB}89pWyj{p zXTBS-Qy#upF)k(pgO(GS+cv#BL7V0WLXV4yK0Q8!fu$$G{WQ(5U)O2%%`t2Szgm#4 zH&9rW?{E3K7mxk-+`!0(bmj-m<;@M#fqQ=k*4p1Kp^%Njtj*V9@W?VoU;dmZz(vT4 zdUYR4F$X;M2Kfev6a4rAlZ#uOX;#@Tizy%vAGC2rt(PzsK?$a;!BypoxYFd<#sAUY z(a?6|i@y;t+lNuJqeG!%iiLf%${@_IZ9?e4$SZrFh|uiZMHQ+ol@w`fsk$n!;8g~E zc&fWg6F>BHYxHJ0fV0Va4)E6@{EavuwD?Xh+I0WB5cBtWI0h?PD>-c)yApAKw=8z?D@~gPPvZ z(v5QS_A)+hR7!`$h?jq+fTKe+4(LU4AiVlaByW`;&0j^8#er5PQfk~L^xs1>7R*!9 zH#NhX(w5Y%N=gj@zT?a>_CE%^5CJ3ex+g2Yxi{J#|Kf}cgnG`C5xk0=j0Nc)px|g3 z>N+~(s5s&{lrGSYX?@d{Q&7yinXX7B3sM0dxB`5`hMwuDauSPxK$u0?4uGXKPQauM zVU?+LN7UJ0wVM)xbG~>mj+W_GY=ct;^_s_C!-dad8?16W9c^;_=Tjm-EF;svApS9#Q zep>Joy`8NAy>h{@h_g}aZxT~pv;l@>c2y3#TU;wCWFX7e)IOJDIwEFx@Y?_sof`k? ztii~&@&6Hx7!guRB7$4|}rhmCr#xNY9Ach)^;?c3E$%)eS~x1}_R==_%J7Hr=IQSS+e@ z5?~fCKLGA?AJ^DHiZ&Q|b%@?`^xVYQW>MV3hqP^FC3WFH*5!NWudvmW@GH@f@$!77 z!dje7V!Tof6R|vWJdjszd}+CfCCTyMU4YVra8RFAP&RN$t`E11WR73h*w}gV_DlRo z#<~N$4-0Pij;x2z14&PYa6lbISD%H|z$V8oWAd+0Hyfn+pq4{p`LChU*uEPH5A6om zH}|uB7M1nEn(C?e8@p(-nMi>+;p^D{izP$0)QB>Q`Ez&yxmV`mH5&P*!UsHLW8G_3 z^;jObu4pf*VrS{>>PNaV`F)XWg>zOzeUsz@mUVA;eLD|sqH$bw?%Bv{FTV4HAI2->t)lSP>H2evgvWb(gWHYYvOzk-M9xEQDs;Qw|vUtWyY&11ve;Y&op1c?9 z=?QkpnIR#{n_U&s(@K;V>+Ipvq47_U5IaE~>T~>>ZZ)$R6Yn?)oU01c1~wg3Mv)qC7>B+Ug*8gGfo|61(ggwXPeej?}x)R?v`KtCu>k7rm#;;W!&=&b(OaDqy{Xd&%S?oM|;dE z#8#0=8*fK=J6X5wd9e^yykhIK#!Vf@isDa>;y*%uLo+d{^_m7b?5&U>_acm*7xDSx zVl|gJ*f`CupuyH52m?t`<_OzmE_qEXbE27PWE7=QW1}=^jgg4;=j2`*Qb-8%9W+ZV z(aG{!$BrZy#B|%Sgh{zGLre@&Upe(Xvvs>@z0XKJ^mTfn1VXw2B^>jeR*Uz|QEb)( zHr=l9=5B5PUA$xu@usxTy}OD?GJPXp7&(flbLF%I!%|+|k1S4}S8N4f#oRdUJ7Jy+3z7C~S8O34B(cg9rN< zvDZ?b{qX8Cn?z3CTK|60U~6iz?L_WtQJjr%3eCl~**s;Nt#6uPG%Wfd`5`0ZVO+TM z=3dJayMn@EDmptvtPk|knl*Ds_x?y!>9p_k?1iMXRROQhb#-nw!u(x;@NziW{l};x z`00^DV)MV@k5A6Mq+!bkD-OMo0lmxFNT}1`5F0&evKO%hO(1PtE4S_=yBB z6@8pptPCCSPMgomIv!dOuaLT)+){MEez=!fyuWGHSPe}yakoadi9%vH#OQUCKNc!X zsQWaq8|DPQ;Pd?h@zTuauE$Hz&}`@DYu`H*uDay*IYPjHIKra&7g6mXD&`;*cYn9J z-1Yd25Uoih>x)s!rYwPEE^`vffjW`Cxf17}@8=cS7`F}SX{@~N849c&O-@`SWa`KU zVm)D1p9IH%q1i(qXzA8s{v62a@|E{bf;R8(dKzgqkZsqg9@k~+>a4LyYi zyB}`#j*hw?>I;|^L8EhgpX>?j85u5Rp7XiteW`1LwDB<#?Bxw3Q`S!1%pdx>t zHDuxCE3$ivgEl|n8blFnM3HTeSrQtu3_|_uJNtqyfF#iXu34ceVVR86`C|x9&91|n zpaIQqviS^U9Nt=gUV8uNnpLlJ`-;k&^DVu~bG6p>P3~6Jjv9o}0ppbku6bhXYAN@s z9}p4t){k1Xr{CP2S4tU^=Meia99c&#iCz(t3VWtWzQ!49`Mt7|jbcu}hAq|6?P?{U|i`gWt%q}{Wm95*^h)qilzR$u3&A{91 zV^Jzsm^pPY+zaTlxtpW1hd=sm=fz$(S+}kj=w~D3FEIXg1wu5G7iHPmeE&jz9b*)< z>>?G-ct#B$gi}4Sxy|zpd>Q)LtCv9dmSWfUw%Z{A4{jPof)k^x5Ie{G7?*j7qUw*| zS_D<{Jm^sCM~D>Uj#xO~xQsEwSimbc{$xR{7ZCdamue@GdLi8dl%ZfBiRW`;`{jO6 zQP|`roUP$}s5w~3=;FQ6_f)?YM>Kc-AGef-x`&)wJ3oA)e!B1M%4@ycspui$H`aw@ zo0%4@_S<+p+)!>mrhQ;AvkSXuCi&tC{nfHGgnoV8(MaC+LDY}?OMpwSHbZ{@Mj|wS zKL)F^ly;l!Db`%YlL=MDw|MOVd1aw#Xc-@t1v0zu`?wj){ygF&3)khoZO8CEaAZdbhEoSoeqzg&Cym=lFC;NTnwJV|-kuy?T#@3zMki_xwpLa=tSGB(V8 zNa2x<9jNe;aUC2LhX74D+i5sX67T(iF}p!mBC*=1RpR_DT32mkPO^sfxciI50_*^D z_0VcrC=;tIL+!WE8?C+Ama4jbf`{RU?kS%my~)`9_`{|Kg!2?yqA#C&c0c^tVt7CG zl)a2%B5`v9W67L{wEcD#c_h#zV?T+64Yh=0Bp~PQl z&g(qB2){!nFj63xwa!l&rnbB?r(|4h3sSNY{|0wLl9rPN%3erRPf=$a@%o$uGA-TN zKLtHOu;V7<&FMa7P5t`89}VbWzZ z>u33`N;5W2x(hwKx?%(U1-p*kb&UR553W{kMEO=?bhS$ux1Y--haEinT3)yfUGswvJb`L40>^jpE#^Gb> z5u|q);@jV2d%qP))>D<5h*9somaeSJA-dFQ?j8=k^>SF8o<5hJr#}~0WMh5R>RGp{ zCHEgM=qBS(98%2%%N>q}J}p?n8k^L5Ni)1ht?;81{h5Cl{F*^L;AHinGg;t-ri1+3RasfH>VUww} zj#8G@dL+=JUWa;{B)181L3Bkm2DrZnowjpBgI?8)_3IQ)`+(#A19G9lnOmFjzP*!m z_sF+=4dg#`-Q95OH!gcDrCkQ6-c2js-jks<&e?67mE`}W%YX&v7lol#iCYsci`FNtq zR1RZ>gr0tX2T|9*JmRRmX;ogTlH>UxDu5Q?Js5Xl;ovRuYl`6K{bCn@9H#}=`VtuP z5mFxZv5Ux9j9E{FFQ4r8;W6OT!3&~jtZ0H4TUN`W#XqEnF0PLu$)kV_NHWq(YVpTuq1Jyw^{WlUsVrlZVRm%`CfTT3|F z6)*4=XG2}N`u;*r?KhaK2wYOmh$Q*y>5nXB2acTXzV*{tkeP&95q@p;#AmkcAis&{ zIV(kSmqrIQEOi2ribbMd{K^K+Texsab+<2&h(J?D5fMhd8z7ZJ{w(hZd!yimn}@F* z`4;qnx-shGUwd~GJ@T_Y^%V|_wgk5`Hs5II^zpWbDtRFrdeRq@lSV#0`Rx9IpZk*B+I+1L|>-=97Zx3JPMWy3F_LXCrmm1OLJ@1 zIe@$*Panx4-QFT%(vlkyenwhr6j}@}FlO`;F3JP77Oz;BWUmUQe6m$jKjn&TuwA=9 z5q^8^dKlX)QlNVm`Dz9x;8ueXKLy&4UHpmC8kI0baC+K*<*r#f5uKVW{Ow%B_!V!I z?^$t?Kc?N<&Cgyf!Miq${WeUp7CkXbfMr6WOEei64lc##4rb-$8b;rz(n zLjGM!MqSNrO_NGgSE8i2d6QFlISq&w(y6q%z5ukt*MsODC*c5!@gWM1N{l=QVz->! zLH9dQ(*BEG-Enn{vObr_iG!_f%t{Uvp949ef+TVHmWX2AX_VX6d9&UT>5ieb+EWa* zdd1W`d<_8(apF|X5g1=4>r?_NiS67F*|j*{O*1k8kHys3+;+7?J0Y2N+_p6{V;c~ys8krTQcOV^XwRVmN!cctVg-!7ITTBK#V?}0!N_1yjl$4`y%*%DN|qcpp+ z_jEWs(OVU*Cy`Z$4=0}nR)DWbM1ZKi2w+7;fn3eM{&0r=!H{Pj6Jf9oOG$3t%-z|; zK=CbEYJc;2!Q$Zf7sIug8EhR*AsuGUZrz*#kG~v4+Y{Bg{~)R86wV_1c40t{ zsTsb}4uq{d^~$s?AlE^zraV$?*kdqs^M)T(4;Vt4zTdnr{P28J%?Dw>VZMIzXzWY2 zlt(C!Cnm*}TsI73G~ zu9fITmRgmd$jSs+_L@lp{nXoW7L|Dw0@(X9hHU^hce>{-=i;>J9q=-j_ya?aUW@uybz(=aRTxsuCF$@Tp}G0KHIjnJg6K??B803fvW(Hx@-j@J2{;LN;6%#jO~mtQffTGwrkOQb-t zZqaWUP&(FTUm zMxM}`1vhYWcLD7bfTRK0ztiCPdhmNMZlh%DyR~JFD!6FTzVT!lCg)ml>307i+R4}Y zDW?bWge%@!9}2r|eA?7IORc}!4$WCl<^o4^Obg4!@`5&oST@Z}znGT67+;l9Oq#{d z4#(c!o~HT>UAG~79e0rR#VTMo;<8Z?jQNjL-l6|1b{Dz(Uxs^u#wDdzh?j%fdIT{C zBhdLsveGcTCMv%^tH~}gzh2K+4ED~xs#myt7k92KBMt^teA9a3O8!bh=k+F9lUvKC zO7k_PiE?8Na_w_9kLzsYqjZkjL;oa@QO?RPSQ=Q zB!k4)#>o@!!sU~-^F}(iCDl}~ID4FKjFav0%gGUza;wj_!aTe-x^k-xVV(BQ6lI+! zOwf$9RP|~lhBC^{#VIsINkF?Y36G;w ztDW(#?m3_vhW~gvf^c=e$-DJb@TOQMr_KnLaTUMZ>}gJrYnby}zf(8T8>S_c%*S{& zn$JMzDrf3=GEXcQr}fFW5+fg+43qY)K)axAtNkMD3;PIf^&3xBeX?t4X9@Q3f3dZ8 z4x0izm`#-W@lfgqoZiX;0r0t`5n$km6cD!@9aa_E<|50L*4#^wMP7RQdOziKL7woWiGlesr8F>q;&u?wQFd#5`K5qqQL;oCZ`Z@jHqIfa~xmC%IYrwG1E#hhO5(+INf|1(` zOV@aQZbyhZdS_FmewH_5Jd60)@D$nIs`oHRy}TgIedZS9oBPg?5K4=X#F3e ziFK%`3V~dY&7b!kOv^IcRZ+I@P2ai!91kvTe zHu&g02AYH&d9c6oHj&pQHknmY*9I}0K6jc_iPK`Vn`fKCW`7_~LgT8_>^OAs6jhK9 zRt}Ya`4S$@pcnuYO{#U&RqMMwpic|Oo60JY_2U-7W*p1GwqN$$I>wPA! zWuL3(l1t=8woiQT7`i%}pkMmJ^k3+#g|*5Ijau#hnw41VE7;!?V}7QFtox~NSK5BA z^LC)43obdIYgh1kZ8$*6KYki16Y`?x4}>!tB7q3QKmifRzS4<*3?Qi1&`~%CO zSCfKeW0#H-G%S-ucrbVUT9T#g*`BX(Mh?lF^K$KQ4%?r)O=No`SxD~jR`r8KE}>d5 zp-FPOScl*kdSzo}Z1SKVk)e)CDI5J6!LNHCR(9dLKp``-Gilo+bTi$SlB;n*Xx{#x zpt6ma5fKMi;b;qB#7zg#pkN0^t*MmvVNTfDe$TE0PiWR`!qt>PkqKM0(ty*MZt<4m zy5r0{&dnw)MO!yPZ^GFv{F`-R9)*dd6Nkw-X>O3Mb~QUuQTxW`$nC-+#xGPxPyY`dtRw-OOQzZs3U9ZG+%y(?w+s_Yr*PGauv4zqw>a2>5IHC#2uWiO-JDw`-}F|RXC z2?O5o`g>11C3N|9L-?9%h6m32(LYIR90HjM$EFhxrk;P2iT_A*pvq{RwUCSIO1qJs z7$;J5nzW~oQ~gSFU4`huu&?MInSw}l;lKz+M6A7s8}v^k@vz!wc?LFuKTfoS@ubyt z{EBV$F#tebK%_f`$j6N0WG;<$Tc}-bTqdqceGWYzwZ`^_9z%kle+lu(IvwB@v)!a~ z?*rmpJLZBp-bJkez_U>n9(gtzG$R)F<9T}Y1IfATL)%Pfupj$7$+D(Cu>D|PF%k{` z1MEQLXsH+YGPspF6k>Jn_|4rw(~De`cE#>?T}EDn4CuOm=F1LiJu?Xi!H*fr6t=E# zSOSjU4LJTFF7u#2&J0JiD9O=p4ktFOCnH!bDkgtsqvIWkIhB!LYzep3vq!pLG*^v% zNhPG3dcBJGJ;KzpwKgHS$`$39Ub|@)5Uc2b#;>vT6d~zD^qE#R=MLZg&;- z;aC!JfH2TE#O!M)5YzX;ff<dxM_p*M81FC}+jYAnqW7{yAS%sq13f(h~h0PiUOtIy$7rA1*zk7b`Ez zV=umG=evg}hjXq~;)UMCn8^um>VgQQA5q!BK%n{~>ca%((C`DxdEGr}pODrU6$v9k zF{%&cVvINu?6%TBPepGXNLI}}^0}Mz=Xs&G1D@P!19G8Q(>!02VPmiEs;X3$Bxk{> z0AKlTTp^basoMu0tLGSKZeXW9#HuU7(ELBu1Uqm<)lM-aA4+tj)Q_n1Giuk8nM%Ob zc>YSb19FGC32xF)Z}!ahxPIf6#sSFh#s2Stn3itoBY3z+THz(M%3n(3Gz!sk@|HfK3QF9EkH!IPyoFHj}m!Jbqw>ly$c8%$j=Xd)~td3OQVuk2W?oaB$YME98$7%G>))DXD;brpw(mChET zUSrg0HC-R&zyY$IhFYQ;uHo6@=&!Hm4Vl-CTkqqNV&jr& zneQBKbc+ffa&PnXCfmPJ0YOmwk4&*AaW9Mv4KxyxYBd75YBh_wB$s)>F;ybokZ#`~ z_X|sr=NFb!OkqFmodbVP&ZkMAY&ay6?x=KfrHu=CquMI|eLrS7R0i@W+Beh{YHlk! zJbs$C*8FZJ5+iqQqFYP42~eN|`$t_mX zHW3jHH z{YRW@i6J@*IE~3f2O$sqEHLo={0Ha7VKUvDq^VFXip#dy;@}G zQK{)5mkeiRHH8wMEKwJg#z{#QXxH1wWIaQ`cy;7QAcd^ZozDmo_`8zB{`F;4c(QX3 zNdb>Xg@}cB^4bK6gA@ZKB7CS(#G|QfbQWE6@>>GB|3|;_S`9hJYf00P57s+pHjMAO z6#YUnApJ_3?%F>iFK&}lTw83yqqs0MnT#J8FRWx$-6}@%*oQbqwElE zwfUADJ-NOP3P7yVvnIaI#^_Ilg%iB++126{J^;qRd%mz(s|Y{>F%UL0#HCu#2!mH= zyy8;sVvN-DyZ5ymm^QRh7N=ifvzQ^ny0MG0%O;h;|KOtS)h%T?GK)3jx1Zpk;_w{& z{&n`}Bjl^!%~GxyZg_|}dEKy2ed8vABg0hN)`ALZlmzX5m@Sxx)+QI@S+B0Z5BT0r z-)gCTE&>-|E$Aa+*@Gb}%CED)3rHJW!$W?wh8<^?TV#5=N&}$3k&B}2!W=ruOXI(z z((?5nKb!8Qd>?y6K*y5(UuC_&f>+i>GS+iCTm0Ga%cy{~zF4_@Y4E-s%pna{Ecn(_ z%1r}Vcx!cw*lQSzwec1cwIMe7xIIgm{>PgSK?X!ANl%Fcy6KYbj~z6rb+ASKaaK*3 z2%M_=(K<7vfbQXwfZQZjS@umD+cAECbR!TPeyp*uG4N!2y-S9c2g&fn9_b|hlEW|E zrQmNE9RUOhC#s?D3sc(6xup9w(l&)Mt!^T>Lm5S6Ec=rHFKBmeQ~efqI3BK5Lv6jA z0tgQt3B>Q4NOil~`gx6AqNG`^9U!%G4qtHCc2{{ZeY#N5AUn5L;DsqR;0js_+PE^I zD*38kKGO@T7{|G&?1Xk#PK6-}%gDn9^OsH{C?RHnZZq%!we+y>ET)L9rHlnA=#$6+ zmn)u8$6LZ8rFq2%;?v1F?9dgmJ;Q0G1n*kz?8-bssidJ6cqg9xMI>xde`(rWj*Jsf-tC@FM!8whlUOBEbl@)FnT$B9-YGO| zmQ!OxKj^)^B328RLX?10nSBo^asXo|36CT2i09^zjVe6WL8jY}SrA%wb5346(;3qW z;gMpPH%4OHUv9vh?T@B86i?FQWMBinD~cT{QBFylWNnDQ4tyF?_IdIckr$S>*or%8 z--~q;8i`#*3S3Owu?<;We|*cWm#`l$K6(0Yd@rMaN0Hr|!0?5-Qm>H24VP~&=RhfI zb&MC%hdUiD1r7UF$FPkZ;6O;O*JY*xf@q*>1)K%;ZRYO4#dIqVge)?$hZ9%t@F&Bz7j!kbS5Bp^@>582F7- zeb>$3$C?b)7^v6(>7>phi+)gA?fsrEw=&-n*?P;=H=Q%j#D=55_rX6t3&yfisBpD`f<3Qip z(N9Hk`O{T72+2=VpOnG9OGp4=^wsh$*vJF)p45j&v*eg!c$Rki^tTm%OM=G6)yG=R z-8hWNtMw(EEB=SUUQSCclFzPWL}2EfjwwR>%J)eGmPH58ZGZhPd@Hh2|0}I=(9lPL zSGX{RpnQ!sSj6bd0Tx-@{hDwRRRJ*D2>3^%sQTXkdkwIgHK6*|P|ND-UyM4skg_<` zm&>|55K3x-61etKOu8l->f>lbc~ z5sF3}c~0?J_vP5eNnaGMX>#e(DT>EjpHeYn$jY6#YlJ)&)&1mK;IFHu7ia4O=?W9V z+Fxmj22M%aHv>eWYs5`A6OfuptHZs3FTXp_rT_?r3pb~qgV^xHt7O<%CkbGO-qFsF zNs<~!BP;a1tR6m7|409bnM*2ewy$Qw`<+58sgm*CIS|;{aNVk?@Lm42NBq?P(4a!O zeI;reti)BI&FR>ND1s8H7ULhLiXP^kc#Z?S|i%@O!V#CcoHiy+&xAV=%_%4;R6# z+hbUO-na4snDfGykff3f{-@Ee+8HEfNQLhSc_^6Dy=)=NGu$|fH*dgWugIf~RnO;1 z5|Fl6gR*Z!&6_MnS3|SVMa{Ph@GVu77w7q-vmbEH!>vCT*Cv1HRXFC`UK4{5WEm{F zAO1PLKfn*(EXhY8MB3bzr=90i{*v{%pd}?4?KXUZJkH1YYxs`}SJ8p~LN&KTbG`Ci zW4-1ghHXII-w6TaK$yz^&z`eX1w+cW>yS{ z#(LyMBEcy+n$4zGE)cHFFowE8ND7E>Lt^oBNNYGy@SL-Nii9aKf;GpmZH@8NrQdt3 zWJ$-r)KOzTD4KnVC0=%^drrH9xJij}ho&`zgyt<@UqV%HdwBf0Wn_MnC#itO=lNDG zk+CMgrHie`#2$aIP8)Z%uXE7-k7$?S&b)!S*+8P{GS@?z(^E`^jHLrlWXNoHR13nzP}%@4{SP0mUY;=KZ|MmkJkMku2LS?y8SG zc%4><*uh99TW(GzGlY_s!?lotwDqO$br@hJJzFhro@jg{C z(?L*OTS=h4m^~7`ph8c4V7K?mvf3*AT!Z+Kwzsqlr`bNQF}t4!C_JnT47q!w{X)&e zIQuPxqtW+s0wj=0p=rEE8D z^3w5DCgv2Eq{H}k#7BI;oq!Xe16ZSVM*H=Q>i=Qox*Z!w#r;6g~>qoIS( zKLUpz&(SfT1~LNVi2k{35+M68cF-$5rP_{{rrPSa6)^2TeP%c?UGI+Bn#s zh=?nOWD|5{Wii6=X&JEQP5_-v`@$tQ+jVzkO~Ak9&(L#@M(W;$&B1VH6I0EgrHScaq|drLlNXFCv} zSsOw2*`KoTF@D%%z9I9bmU0%sZjADep!??f?!Vom4ybw`vFUV}*Q;^pzD(C&*?d^c zlW6}YqnVkVM=(i1I0^!(*LsKF7M4PTHx;n$23@tGAXpZSFppt?5PE_x^J0Tq$}RG|d_+b7{<*8@qXZkWrtsy=#vJXF=G%_EJX#|0W^971*2r z%7y1r!vwJG1rLc$0vQ2M2@fMIFlS3~+XVu{VRcT@88vr_C|_e=cwKuX3#Ag1-aJ?m zdS(+pA7^p;N}eFlZUm63N?3*TrO9BX+5>K>KWDr_eyuhBtu+z$*15R@*HR(boLxO` z684o9#t$sVAcp226q|zFuNB6OR>*v`J?e=yc(jC9Y=@~$^wR%4PsBms-5TPRaMv` zXs~j(e*`U{jhII6vt|21Q(vn*ydcf3EqIJ_mQ z&Np(nnlW&*%EnHr@EK1>`1^aPN702eSyS)A06MAgcp;!?C@*;1(-3yJ?*El2s;$!+ zU>YR*>=2?)>~RaOD?)F?4Z}gC5QmRo7I)~cU^gP5YE{Wz#TpUdGcSQyL6bz_fInwZ zVR|Bx=%XiN&um}Dn+y1pFuaztA);d$kLcH$2dAuNl5w!XE8^A{+$N5#ngZPPO1|Tq zNRk95vY-nbhllE4{Iln1_p`}_+(lS=M=o4%Y9!Av((zO}$Q@4cvD7!Jo@ZH=vWK$v z9G>EBM~Wx{tDCm@^opQPNIinYix&vW!&y_fPAFYDWP`)~l5{AdQuHWSq~6B-3GWH^ zE54_{W>nR&RRz7vi1xZE4RP^G{~WxQthMLUGO&1SID#a7u}5?loBhwLAn!5ADdR^#(x^8$Fk{}&z*Wu%Gv6Hc?kJ&8aD*Z-N5L-g^te* z>*A$Hh$(W9Vco5W!F@C<`6an~p;b8p2h&TqMygmhM^ zQLEJ+JKDsw9Mor!$qjvpRfXcZB-)1Ji}zEFqV)Nz3(&*xaos;bkJoKAZ>l~?tQsfd zBjzL(CrAto4l#H2E1&=}aLE3pi%X)I{aYH4e${949)=6ajU0WiON2?zbJ}fEsrTt5(l~uFPsKK=&SIr;Lqo5OaPI&;=!& zDM6-oqt+A|0c%|=VLeEgw z7k$s%8TDKMqQ<0-4$|0h{1@}rnc)1|3kAjipqnQ_UK($!Xc!mlQ^a%sbY;IrTcBYcZi*c` z17+V3Nq~sPa<2_8ZgSEI7v|Rj@=K)b&OS+4wrjrhya<1*L0trA-}Qp;>az-#{g0M`>!dM`$?ZwMfvm zJmPHGUHMT(%wl5)GmQT;OZvTox}JzGO{}oWuin$=qkA*(KlOLTBYXD-wA;80wAZq{ z80X=fgp9l$e8VcUafXl5SjJhp6`qeSielGjt`W)ob8yznlR#nRGY|10N&86l9`#_? z-3iV>ooTW7sN#k61()g@+xb$r%6FxajwFNjd~N5t)(mXP3(aC~wI%i3?xX(p`#7g# z-2lE1%n~6iT}lo*&kOT2-2qEIKfm^c^Xf||9TO@H(Inf;FvUl3$-G+oMks{jgUl*` z1mCZ)^+?bTICQ_%NS-%{>o6%$^4Fz^~=1_QJF-o7f8!e6K{Xo=1U7 zryFF(~566qSGyM>{;EsC7%+I zjZ@P!v@U4;;#xKrb-iQ21I_rL%sKyydC|e?=XvGn{Yj#jQ{efo>3ie%bTeX^!0f9Y z9%kqAx8PEzhCUPXsKRYbzeU=;%;pcSgwoTJKF6j3O+)GA1w!tL#ejM?z$fPd1!V_? ze2#%&IL5?W)Ug=yN1l0FtzjItS#@$~1zXS`mEK1aGO%t11WTL7Z}K|NFc7O7QtUW* z#y3IQL`;q8#8LX*h`rCEEgDJgNAEG^97~*_{%_ExiL-(zipSm9R@*&6b3^Evu@dHA zaf7QFUUZ~QG|QuXVan-j6X=n>2f7T2Jp$aoOWIs!M&OBm))1H)Zn)Lpa)}64@uC|5 z|0K|{pG_fbe&6aX?ok&PrRVVPDa7=RH#aFp@gv2KNzrZTy)%fqP0CVIw1{bbA~Jfw zJKFBp3-$e|7kcd5+S@hbHl6ukHPJJ{cdLUm@kVXVjg~PGS8Z+#G~8;P6ot+6(-t*4 z)P#YeF*-RmLFA<2RVBN!G(019OX0ZV5qI~=Aw_bkB9;`^ zWP|`AFQqcTr(VfP+g@4znCpMA)q366uJJRs{Tu95)ZuRqmD}Gh1Nd|ynsoj^lH81h zziTHY)AFh$+%nBG&C~s@87M(P$z@xY3Ioe?u~%rGY%lOkQqIA*(RB(1$X9{-u1lnc zBGsxFGX2Ll>a>W2*M2LObh$ar*iUvYUtJE^uC%ldG2lV~Ss~sEp2O5M194c8Sd>-H zt0gWniN}c&C8F0WBnn0J9seFbkSvzMZ_;in%VT||esY^Kn{e+;K3a3mx}dcGccE%t zG(XdeTs<`znMf2Q`xGr<-k&NtuIX%ESj zKDyZ9ndVwr8<}gBE%wDKS!DW}^jcOpIo6`eB4A?5M3+H{ds%Pp@d{3KnihS;HMlj8 z^Cj2I_dxH-$Z2gmdB94x)x$t0`-dpGPX(zIi&#Eb|kwnA#Z23&0Hbkd9 zN$+mcJ{~0Eyu=-ec^Q~h0b2Oh-Dx4{WwQgExW3U_&3F9pzjWb6dF6pbJGxuhBcT89 z&-N3Z(6$!8(!)o+zch`gK z9G@Y~xKRWXO`?$!Kqb)ZWxAo^k@HTdxZH0>_G%*{HnIV3G#W?9?~#dYxFM%MRipsS zj@=!8GoRQOl&!Xxyb{6OZrC}*$W*D_twfq1p8kA`BW|q2)Ixj~_e$-Ja>;rfE3OO7 zZNInuQ_+C=UL@;LwH7@NE%M6tmQ;8eoI5;mw7nywcQs$)}711F$K@J$W`0kT#}Mh@C9a{4JTo3V6J0cOGtms$H$DnF4)&MRP`+I7BnQ zSi!urLsZJCoN9dEXkVKK@lwQ%kAF0J(nndn z)v^&J1SRKJ4UXLd4SVh9xr!%?)mvzTs+tr=sNRF8%|Nps3Pkm`Iw1FI$}S=i|9@zGx1t4~ zzP82Q6h$~IWRQdk&TM+!hlH1$cP~5sQtZ%MWqqt(v9c_jxVDS)r$UHM5-jm~`#ZfF z$)*8rkBS6SP?Xx>KhmQ6MD{YN6`)5iB%Q;eyr!qeB{Zb1N`F3Og3^M0uA;}$nFY@0 zIsX3r>xgF?{kHL-2Lj;-3i*%4gnkZHTsC^5pJ7uQ!0-$UJ|rNOE}GwL^m3hX^!e|q zg^tt5BkQK$ei-eluo4fz?P{X*1dGxn_PBwF7y~0ErP|De9NqPuPswvC&Yy@{qji@5 zDgq-g8V8Fc!Meo1Y9>0~+1112_Og0fLlP=Q0p z*P~&T_r(aSDE?x%)CTl#0jjWHi5=|TqC`4)g1%z+w~pgNW50=5K~ft46$X94CzOqo zPC#DZ98Xx7dB2rCe@;5|){CG21s1@b+fRD`e#67W#R*Zp`lI-5zT`}uk!f#^}hCPWKfb9GiM;8?7pd)SG zn9w}|J4Qj_|3vbEAW$XR2Se@o^!d;dfSESuoou07#EzunA*mrxM5QAa$ zEr*40u9Zl$BA#)mCB9ym!Ht+YbWLeV<(xJ*Lru#GdxD_Z_w^0PX7GBg+x~ujp>*i-`SZPu0 zq^eD#QQOS{25ioZ>q;T$3H(Qk00c{oL+`SJ?Hx5k zCO}K`NdWi?Ap03ke;&$p!jk3rqeG5Q-&sT_IFUF@hD=N~8r}^gVOl%-7DIseh0PcOF7@>@XTOIG%l-dm0j|^86Na=Z9sUBs34W!n zQq+hV@JX)BeMsNq^)^vec(0)ky+eSlew@P;X6_w-b zD;*Gq;93u?>&h22;o#-03B+0f7i~VXefIyPqPajK3bPSMcVCYhMLF@_M6@q_5f&pU zYOD~$xO&ufl{N71f$9f*99?e$WHt`;Ny(ALd}MF+wk!jU$<%M!=P!rnQd+m3(!{pR*ox+_G9<*(daHY zEKQ=@@vptMGyT%+WjDzwD$fH1Q23jrt+RS4)hd>#@OT!UGfT-i%bhW`-fLRJ3&vf^ zPzB<$|16}Px-@3;VvEtI*cLmWDOM51F=#{*-Ot(zo|R{S4j-#zHmD$b>tT$qh|LA9 z$_rb4DvdeU#AkCD<7C;fP(D(ik@3iF)>Czkj(7UfdCKv^gH%eLeXn{wM%+A&WY%+n zf7NZ)qp@vRHEWRi*JSxU8fEu*rtXQ8c8jmFEw$$z0 zyN}WnnuDiAaq>mtv^zM{b61#`iTj?0lULs@wBLo#Yc~>T=r(z zM!peFN5B{Nx`ThAYhJ*SxnIDCDy?o-EKvL1>D&}ad&8BV{xgx9&suVDWc~L&fi0P9 zX?{g%Eow&Xexq|-5O+4Ubg@G~6pkO#?xlKZOw@jZ3+6so^+fk%X(qtuIoc}vwT+%o zglCknut?t25t=HqY4LGiN%L2=<~FmD+e!qy|CBcT2s*>BOlsyyx*|Hpc;^kG2UNi7 zW>dUy5#8VCYZYi_Dov@D8RS;EU719ELi;*>AoPULKX3PwaxdZ1x$7GH;a#|?J^{Z# zo5@FBp+1FOJ|jW*4_H@$oNX+R&Y~9$1d2uzHW7DxJ4D11li4fxTYqD@gU`~WL-9tQ zlzf<%!oSFQi535whE=o+D)D_y4&yW&?{VSGaYztwcXAO{qL94b`LOT=ukz$mRaY1<0=fiS%JMl_#xnaHt8J zxBqLNrrvIs&R=O-Q9pvVy7wkbxXBC?LdO+g! zdDz!L$#yySB?WbMnC9R+TO>Va7Zu?%)ZptDBE&n_y=Sh`-d22<;YM7huuuk{FYY>X zQj1>POv?G<zQg zA}Yh5wL1`i&3x2J^RGT!8`NAME3ZRAZb zp+W9`HrOFE2-4;+iUQWWEuW?tC8w_WEQq6FUkR>uaTq=b_@EI)UySqgZ|vFF9&?^I zQY%xbpPOT@wn4nvMfx_RRzA}uFNcgs0o_%9yD~0z=p}||uW%v2Qy{@b2kdXDSljv? zq7q)h2%#q*smM|Mioo{m0_t+1*|G+rNOsr6&TD$sN4NJD23)VLAXB z(GAGTg|d}uA1fB=Tg7H0`7c6l!BP(&m;w3EPFlBeR#I)bM`>}UcZ_F$xNis{!O!8; zRLxMhb8n-=JKXC?>0JT659z}p?yjHE7_G>ffWc5_z~L$3QpR)h?wqGhUwd;UCbp$z zX-S@ZMB8NazwH1fKmhhX=6D@i##z7|%_3VM`wqHiPPc5^cFZr{P}v0e3iBqI6BhlW zEuKhnw}9N{m%6?`%WN`Um~fS0qRK{5RbZaAvxQ{eCsXT>hxY((;C7EI4vnvBwKc?iYZ6Nn;`z; zsQroyaLMogfm8vEIQMGjS2rgYL^^|U*HXBRDsWYVN9)QB$k7r34$gO~U=Pv(I;lY* zLXOsDyww%&S&OjPt8k@O&Y5@RJ0t`d7-_wY=^yC6!dW=!$veEir)iN$IQDyec8t)^&4IqBZ?~6#9~z|A4C2+8Hw=R9y{5%#Vai z>j)lCwBDOFG31mZoi3Y?4_)jh;#6xHjmjh3Ur_WGIu_?f;zkvYD+WAn0bL~Hm(DA* z__-NCc@&c-mjeTNeG5AUeo4`Opc^j}j~b$z?~AKppe0JqGXb|Y%gZPE)eRrU8pU155$}4(<7<~g;-3`wKp%wc4YnxUuTRqx;{vyHR4^=7&qpftD0)Q^pZdnM(b5Nw5dPNZM3?yiIFp3mi&tooILm$|3? z+a1Y$n=#_w_s?$B)$qKvA5#o?$r?ay0cKd7>q0`5Nf^OGN4fPzHU(+;#g+#ntraZp z4~@1Wfay5s8R%*CAJ_jc$3NA+BvU)JadaWE=MT-iajg5By_6Mb9wI8gRs_9$bd3SB z<9-a$H8}i_bX|Zoa;V_?+QU%DU6+`tD_gwQGD?X>0TLE~)VOK66YSy6u|S zre9^{721~YErdz_-8zrX&vm5EyGyFy-=zO})iW81b~_at_)ic15FW>ng%AG*YH`2nHuj@ks+Vs7BmQ%?Tg~BcR9NM`NCB^bPJDViCarQ7>$A)A+EUaU z?1w=&N7|zzZ-o>(N*1>#cF71=;KynW%4&rf_0Mxbs7Wk_dF|(j4&WD(Wal>y%(4k_ zl}t0`8eQ*yfs!-i(F@9b_PjLu=lrnFNv_j>Mu~%V-39x|~8SCK0jZyl|8VvOQja7EnG=*^i)N`8tgsyF!!;pf;TKNRHOi+EsoN*@1ABSGio5{eZs=wV8dz75 zQA_WiD{;C;b#=|Q_sTe*e%&yF3OcIdc@x!jT|5sr{GL;V`@7t`JU4U`+Xi2M(SrTJ zIJm~i2hA`nn-FZM!W7-|d-FHp6BpkGJTjVTJ*FJMKEcQLWjq|-`9bM^fux$2)Z6>|IV(nA?H>TbrBlBZ; z)k{4MZOw+kiV3b??{wlX%pzJH-5qrcH5j&4Rm8Pu!VXjS;W>I62;@>%^SpNy@z&Y{ z*}t?Al%3Sh8H!XV%TbxUDO6}2`yxO7xpNtaHe0s_#?i|Lz^ceB=H{d?3QF(HJ-&73 z&X)2Vi}aZ`ymFbjL|{O<8Bw0p0=qv>t+U&t!_CuTuxqV}CNugpe%?Xh>4YI>dXUW6 z5=;LwdUCOY^SdbC%rv?x#lBiu@>JI5*PVP7m`;#z?PmR{yZivt9`%l)LF`!Fi(*i~Xuw-56jmc8mOw~_& z146z#CH%08@hD^LT&arU`i<+ml_`mUS9*0dCNM8HwVKW2ijawk>DXshO&VO^Z6&FV z!p{HD@UEt$xq?$Ui&I1N9r`=s%0!Q`as3qcT z*IG9(4MVQ(XmgNlnqFq=yd-~|IukBg60kzMe?EJ#eG~ZU;@aj}TYWp0sfRmmsAECc zo4J3xO0ROIg|egST(=$TlD{L+^$1vJr>!tcWPwIvtXPv{Uj$&O0wy+$)2U`}5~Ajha7sK~iEhGLcy z3|V|Q<)GVSPn+L1KgGQn$vwq|LXt06mKNb3wqNZY3Oqn$ax-^=&OB~k{Mr>vF}#L+ zS78;UIo`8Z{e3f$ck4GD57M*|6^5PT8Jxr$^Z28tQbYI-<8}}l(l1FM9@#eOtvcz- z$KzMPqfHv<4oLYVHWjB&`b-j(w(wh|7Jf#)cTp1O95^XriVeRQ|=lmmv_RO!ioXCn1Q;2Oyd_U2*uvNn$A_Ht$^PNI$C)ont4K^lk z0Wq*>gNo{9A8fbjC^0tS^b(Pg)PHDr0H*!&Sj!oq?lx_m4J*UPl*&lpT7Qc$NI(}S zRnCRJhbxS1jpPFTaTQ#5wSSNELs;5zgCY4YQl&~YH!V+tK2{+!8>W54<|{jH7}Gb1 zK+d|!z6i-W%)_@wYjymG_^3SNia6pY%w2LynSQ5@6xM-$x}y%=X}a+pI`F8zeD)rl zcxiWIVkceR#W(8q=zNoi4eYwA&bCq`60i26KN&wWxpz*G?+|Cjj%SRM9uLRv@>4{Y zVv}P#&7ZDlD?yLcD?4b`IN}`De(*xhRPpkqEhGF;{j;=v&KYtPE44y`akZRm>a6U6 zQT-DBwr@Et->N5!58W7MQTolXS*N866&dz~@kL8Xx$)u2Lq{ap4I-yw)?ALsNpMsr zN&kV=-9nLy$749{u)0^GA^}OHx3{YU%l8aPKlT?;eVS%6nmS+5Gc!B44-)qWVegY*Q~|kuh-*G; z*l7@8Nkot=T+C@;LwZfy436m5>Z>tv_|$Ufw#qu4P7jxZh1+A&^6j@5rJTY(3RhDJ zoDpvkrW|G?J!~Pdsqzry0Yrwez|*S2stPt=Of#|^P|#stlkr!?T^7~!oMN?HiR9sZ zGWhJ5ML5a8?yX-r_QKjWRKzp(pQ+_0?m(aXpvA-JN zBBu$9xnyGup_J)7G9mc=x+8DM$gT{CGZ8hv-%Mrf`YTX^pTv z!b&b%pkG46!8hM$Wb70b>;|EwAI`~Vpj&Q{yUw%P7VB7?D^c!@oQboZhqE00(Wc2) zR5py#Bo)BQ%s*~pTXR}QRngsj;L=S(tuu<`+4F+kypB8@i!FM)NCvDCus)-ar2Y)5 z&IEzkCeuz4T(5-GduEW9^3kCL0{#>UvW42t=M#M$^FGcu?v=O%Zs7UAg(dYODl zVrhT9^PU_gb*CrEFAAEH%19$K52Mrc%hH@A^z#2UD|LbXm7-zJ5bbHsa9u06@C*KT zmK`6ery<|bSr3(+4t3`q-DIPu4Z_EbPLM*W5A@;f@WTvPx&7sIYGwh$`;%J?O9724 zv`#eE(P!9OwQw7F04XEHs?HQ38D%DWuBno$;SE_dOcw_If-9SW+A9&Ty>e3NNwwj{ zolb8KOV6Rs%8-Isrd23m|M{v>N=rX`SjHwnZxD8HB+b}L;coqgvI@jvqb6jWo&1Fs z`Ss7HQC%e=YZJ=-^a9mp_B05N44^9H( z(kG(QDR+MlcK4RzLIr-WO&rp_zsZe)*oym#fn_B7sycqxbV}IC-@hvc!LIBAeJ{Tm zU)Vf-I1p&c1b-aycrlI5eSD5I0}!D9^9b~UF*SyDcj;wWPeZX zT@cfG3wW=dqK*oq5`vOM2|dJlbb*mwt<_q*x88+Z!gL#o2(QI)l(0U3DIcFG{Hk7d z$XOgtuV9D5p{i`rt|5j*?fSkTh+Rpp5J$>-xP+8y$V4)@RHVu?Lab#sSS}80Lkxb`l42^Y}FFaewtFkb0-d zu{rT#exhwE+&pFp!%f7_8CtyP1>pJ*Utq@MJrb#mI6a$WOad#IXQIjPT$4uiva9?k zVcl-DZ>CdjmF4)j4h^q;p!}QWHJ1B5R*7(QPMN4%#37V=ICb??>PXqoV3yA+G@lS& zE$+KM{U+ciIrv9gH-apyqSnU*CVxg*-$LhYg5WDOQfREwYvvdbN4@_*l-Q7ZYmfT5 zJo}cVS;XDfwNrfhB(gMZL<_cZdgxI-ZLM?ax5%54=Fnl8@SF5S|Dxi|hsNf4{-Fp? zvc6v8V6zWSq*P)uQZm+2Z&0fo_e`xvwe5a)w}av%Vme@!@N2gXYPAf5inN_7K?HLbMXYrHp)3#=OtYk?=}kCHM z^^7(J&mB9O9~S2%xJh)7uW4*!jnyi~-fsw|4{Q?02w{I{%ZzPF7!14nJ= z1Hwv;r*e1$$bQ4O*FYA_V?R6T^%wSiZROcPp*3P7=pO9C!Jjd@fK+Q31LtbX?&w2B znKOb=Q|x=f9)QrYWcxd%CgW#Q8re9$aO<5XiiDnZo-MSrpU1iFcie0kNrmTGDglSo z@5ZRLW?#NUI zO6K=N&KY%=q|!a)lF~OcKa%7u>ffAuCIQWw11v*Jj)(_2hNkSRrPv6+pe~(P(sSm> zVks0%+kI^CPp=$>GP7|vh&_&w%xf;YEBP?Ih2rmpI9Tm*Pye>E%gq+?C~I^X%(s2=SiRjqWuT~T4asN z?3ML8oqSBT&zdeTQq>So^q0I|MC>7AP@)9a*w+oj-k+g?A5>e=i**^c)a$6QuhI^@ z0uT5Cy|aJnQZs#KD|XJXGbs0S_hGh^q{p&+;BnS)r>q4h3G6wBAFU}Q%#b7RW$#uC zexe~2c{ERA71j*&d&jC7!BgP)OvJh?aNI1|8S4+@hTk|Ze*8TkbaNm+i73R^VcGUm za|Z%MeQ!JbL8-jIkRtDdYo1K0vrnH-2!TIt-VeCP3JT+5Li1-z+KI{6@^s65_1gI+ z+M4h`h9>|!#iTQ5_QAFF!JX%5;PbSH-#0Xl$ZF+6IckvCYmtU;85!b=;{~Ob<#VOT zKd_&+?Gf$X_NQ?ccHq&kvEOoiS3#n)n{K!vkevf89QGz#k_t7*9uW3ia)UL>D zzW-~)1Mh+Tgcx%i>n%9p`4$y=4O3>>L9+87r9ZzpfcvwFreRTo9MZthd837YSNL)y z?BraZhB5q*h|k9L3Q~P5p0g#JBf@_%XFb+4QfnwG8oQ#^8hRT zA>!s)0j~F^-ZP^-I8c%j?oB?r9pWn(=CtEbbaT)6X*lqQmR@mOJtJK*xgyP(05|x3 zm8x7&O6EbRVQS#FLy71--5_^l)r5ue>v6LxwyIv&-cd+%r{H_@Mp*3Lslr#+c zs{*h`-cl*I&KqsF6z!e7oA7B#Mm^-0c(XQuNv!sf0B) zphovzXC|5)41&|kDA3C2SD5(Z`~6-bTaEeY4b9=c+#Bqq$vvvtCAO(Wm5l5@*0D`) zL*oLaU6^sB-0R_c7tz5VvCNm?1B1Yv5y>NyDTI!ASh%hoPR)f3GgMs06kt-5kX4cN zzrfcCQVbW~C+sWZcp{Y%-~n;R$J@JIhxj}~F>?RXDgP%x{20ox{L%R0cMX25G`1e> zzw6F#qTIImBSSZy^ygAyFnS4<=?0Pz%P+SIs_*^FrS4`}i{EBAz82B)#2NQ0FjVLZ z@iY?T@nDE{W@Ms+v#NZfo$Z}zyi2jMEa-RhQPeHLyF8E~bt?H|i3WM4CcEg%9C+>k z>bBvjv^+7qTUFfg3%-hmA$(>eV{ZM|@L8qG4&a2W4z<5AMPb2j_l;GQi z;rN=)hZDa`jy_oD79!Qt>;uw3SRO>=_S1)fSGJNvkg}=8WHKrT7K7}~eh*fct($HD z>Z>6tzK^)E0;VK;96(JhiC5DfIa(M)q_K~%4AiARGr$+el?lr7`UV`DqZyR5t7iu+ z;)wcwpB^O|hK}T>yJpuf-bb0b52QNp{r1s~Ms%tRkK~_R?FD=QyloJv;2*krQCetyjJ|X2P>gJ1MwRJo<%$M?5WsHnaop8(6iC%8Y zYx@MmwB63pBzp$29TeChS@@W9PqdTrX?^Hs`&2HY1mNl5N|NzZj>P`Te*uq+Wkcei z!D^u+hJUU4WM~50>8;us_uR$-95ngK0c-g_T9RASf2dz>Pllb8DnjVxv^2u#A%^y? z`}2xJ( z;Zwj>gf^1Ijp4aD$Fq9X|b-;ipu&G%^LsO({xTHACfIq#DWW zety*o$v-D?uDZR-XN5UJ!C!)OJwhhkRK^S1B?a2trUyZo&994b<`z!MPd~O|1z*WW z4zt9Mop`IE$YwGetleJh#q&9gX*Rz`70rp8&HYg$w>H0_2z3ml?H_6{V6eU6`ch_68`=+5Y+MgE7O58ajyBBgcu`-n z!0KyF18=_4z__tnTZL*1zK%2LW#*d?(AegOp;%9zIyh&Q67Vb{(9D4aC-eSg^8;uZ>cMC>`n;fZdciw@o`Brsq2Rb?XOjP zf}bgSqQ#N0fe$i!!{xhyqxS3#fbneKOR}nPffkR5yIzIl&RfXZ4#ta)(RA#)tFBHF zZ}iz;oBa(?hXLk>#yeor^)3+%xv3b`@XhPEsiYEsS6xpRdn4E4GlxQ!1Ot*XtunFGt>Q>0z+PMAGI zZ}=2+{G&y4r%|f7XeQ}aSh>gmFO;%y@Myv#RhxriU;1?ankgnM{^7_H9kxmSRUuGq4QM;fZ2KA!LlkHw@2CrlqNAY`{XX{%W1}gBqn32_q{KKG`u#iiyo;=Pcghk zY37lPjH~^LKd%zXc7S{{^hjAQFV2Jn|E=IN6Sx5v`d(MIQVL5+O{G=%>~esik>laO z`tx=bL}M}8SW*pOsr+W*8o2E0Gq>>$-8F$t`4qJ$``VA9)7G1%C8~>qcf8wD5%O5= z4ZJq81!1R=w9T4uO|>z)-eIfyQZU^lZ#&m%(YD*n;1fXt)| z%JQ?TKD-b||G`HR`Iv&OSX@%Sh?a|vDVaM}Q*fb{oTD;{aka0nbTpK?dNr%GV`1w` z#LxX-A+a=9{K>}gBFv24>j=-r;}oYI7y0A95&QiN6DXPa^%<;om`j4qjS~DLPAny0&F@ zULu}Eht&w{2?I0_llFYe|5^Td*r7(H&DBw=r(jNOEh3@jrnCk>T3)NP`C`R&@xH8Z zo6KS|n1f6h{Nit)SM$M%7;1jh-*5;qf}w}-i4SlZK>RoNbmadWVY%@)D`oCq_<~%B zHFNSZE9U9Cso6!FWce1T9N7=EkSk~vnf4#u4}sRKaq=+(>N&OeG3r3!O9|B;ENG}# zZatvhd{CPh{=9u#*!UiH%yNI|)028>7IC*O4qj5i9$*I7o!P8BZ%{a~ZY(@qQ}%(* z-L~ML&q*JZLAQl32|qQNq4e}XXUYH324WICQhD4J4Df^NjD^R&3+PG?<7WS)QYJI(9pU%YgT-E&z^W*;QX&UUus}abk`WdgC|7w^mTI4 zTwg;N0}z2e$cqjy@O4nrf5^keC~6#xckkz1@vmcPBb&vzI8W(Pe3QzZ_R3F9<7Re& zc1;J>ESSF6@>Wdw{F(dFsr&BO#BRuT_$Q|I9#8SX{GA6*zW$nlu-oSef=4VlX)5G_ zJaOxRGycw;i>_v5?-H(jbbjJ7?mx6euVPQQen6D4`wetKzVxJlKt;6v+4%b3iYS!% z-J%EMxgT-|O!CgUF1`U|&cXYqfyZtC$57CV$cuoF5l;{ODP9LLxly6iuL_XlY7(s& z-oH-A#E*Z~C)snFEU!DK=UL@1IeF(!v0qpVwryWIAmnT&qDhEXHArNmuj(Z=P*rg| z*<_!td0);8)MM?mkux%(T2~@n%N8yC(mZwa}El=ka zg3|;E{ch0N^}5lE-r|VO-}j1Q#!QgqU$LN23czD~I+INgMJKsYu9GzN-k3Avoj0u~ z6d6SgDMd?tk_L;hXB(PE>)yn+r9p=c?AeI3{iq7{;Yt+sOWDhc44ub5R%4$i#0hlY zbcabcr%ALW36?IUrt_X@D>-3I^@gy#CTqWuY=-nZFcp^U8mSLsusQlK@13#!xw-I- z;w~#s7g|y@N?TuhAT;u)J|GgQdtiNr_;(!(Xx*)g-03aFYE>JN95p4bx8SMNxQ*`1=C?FDz1eQdE3p%htlx4ou?EZM2bKaWO! zwn+WFhhH(IJ?8GBE~Ap=sBU|IQZzbJn~9R=%RklWiQpC)&64UQl>UZ>DA$Rh)?E|3 z7ftc6jg(D#VSh?%-|!0cs_(19cu)%ACau61<<4G(@o1^Pa;5-()c}nB3`G2SL9fR5 zz8ik+sp{x)N~F_=iG2<1`Tf<)@!7M`H#^xHbkRwqkoGXu%LCNe6YC=$d)BDOr`8d| zzkUT!%z}f6gv^dEXz~z)w;Vx&>%`o$VQs{=I9mx}o^Aw?)nH!cfZZj}ho_E@pOMy$ zp0r+=QyqMRLiE-=JKOCRSOn;uP8ZGLfXRkwh*V8wpQj=S~*ulNQL z%5TgJhKN=P4REHCALeb6@E;l{xVPpk4>5I`$h9hBWi??5;|Ht8cA>UAw2f5C!asRd z!lj!xef%YLbnNji7W^A@5;P-w_p=u?kjLC53|2nB@%dL*)d4x=xEBtTigU+epfpTwei81FwgGc zlU_cWw&Rl3&79xmAG$<^&ajq2Gk`pVvpsVwB>#^NW!RFntNy4{u-~cE_*MrKs^?Qc z-77|(=-|Teop(f%G$9?K^!vI0knVc*8dl;sxT$Rl%D_Kun-w?gy?;<-GkI16AGLs& zXj)zlz7?H;B4J?vkU6Q?&|DVMyT#)2MaC}uwe{TRmCk{+yAJ=}<51FH?t9}gc0R#N zYGAplxIMdzUBRh-;&4FCGzdwA{Ym4{7TDm4eoNdG^REk8(T2yp~u4Xw0V#lf(|7(wiJL zKo*Z}_n4&?vBkp4pUplnhhR&CgDb`6)@F4f%xU7ZaIMt|g`Tt;I9z~ckmD_%v_8TI z@E+{>(rweQd&cMJq4TENZJ$L+>#6;ATm5+hp zj2RWBrAqK3utaHs(&0i?W$&E&9{p|m=Z#+4vA_u#1>{zk<{_PMK1=7udC>j zQGX zD8K10qyHNF9>1{n1F4h8aYCptdrlQ)tfVEwhM}k>?duP1u}$Z7RLP6DXZR z0-csHfL{R;V%y{C%i~qO)P2tAsY-U{0;VYIYar%Od%ODRzI&}&_ZiX7<`9?~xxg3e zL6T}qy*a!qgqG79BfGhQe{Ee|Q}_JH_vM-m(T%Pozq*<)VVK&huF@h6QgckW(aGmpA;2{S#}BJ?@mvS3w?|^ zy}!CooGL0LH&GrqP2}ts*A)n2{_=FOZ{z;U9fGf@59V~RGQVNW2-|KyA3Dkg9@Srr z=R?os#BWHJORpAa)A~6|_(%TuRJ_OEh~r<}S`>ErA<`obXp~YAM*P&>>aUU}!cTYE zPB>7p;D7XpC4CEci9KoKBZtZbqV_P@&Oi?uYQhZcq`ktevEHTa6;j@yLGiEm>`bHT zOb-mX-6B8GrPq*}0VgZ1{gGhSs0oobRbVUH2!oZ$g-xZzy)QKXd%F$W=`l;4dy0G| z+UNh2OI)%e=vO$r-N@OpEF|WU6(x_ixgwv8ykOeh$I9t!r@a7oRZK7@U8D5eBeaf& z8f5A}>397dZ>B(N)<16SdmxnzAzlLmzwPl1IU4x+CLe zqn^IZt9Bos03h+f!5q|hc_B0>;?ETQ`Q67(vLBG#j+;flL3?;h_Pd6a1Gi?wMVsO0&UOMs z`Q13}lyGZ?I=oQb&T<#BJBTKdm}go&x8{{ZP2v~VT>mR8c9Aihn=QFJ%*!(YyT2l2 z`_(Gg;iAI-+U`6DsZ$&A?9C6{1SMEQ%osG}@aBKDZba)qp1-Sl_s*~temvgRwg_|I z1i6~@mY@T3a|+%Q%VtLAgbj&1`6EA*YMovE;N2=A)i+w1(wl3C)1oP7X^&^SMJ;eh zjZ*&MOmLz)Rp!X(P_0^f zi*ooC876cFgCQliU~g@dM;E;2jwCq2LkPsF*tFIbU?=uZ{S-&6dX=mVZz^`M-`p2h zs4w51TG%fe4pRO5D&&6(DobSzJsJV$68luJj!;GVWbm!_W6rhYqe&&H1s7vsH}L2G zqC0aAzsHLRFj1|P&%^16bTBJrHBqr$e4|knlbd0-IVM@H?~9H7ov!$22T6xCN+6jX zDMP65*`BnDTzDC3H{HO3Gcrogypj`-S$$1y{q4qE3LY(|6SP0Q=Fe(=qkFBhsm5=2 zhZ}?@P)ELFyc9Z|`@Afb3W}I!`27F)T3uLzgN1(TUt*jhFsHSWLfiJ3yc$p!QwAwc z?QKKZ&l;X&2aIXP`gCKlhKXzMo%tkL(6?Dp{t(}1ln$QGkPLq~my3@I6Xy*r3qp#f zBS8)9@6CR0gWgMyB5W+9ct;M$to3B^2gf%1Sn4A@iE0Y?P5${V^A$epq;@+pwCw0C z_fz8)U{u*HPjhHkycY5?nW*djwSn}qfkyIjfM0J|eSE7&@}HglsdGCO<#oFYpkt*{ z0V60O2Sr8~bo{Los!#O2)wdqjO>p}JiY_o-+l0v@w|&=E1@Bxbnb42F-dJT~VJBm` zF7E9dHrv(K(kGT-X@lDI-s8+NIymo4Q%A86xR^-t8n%Kpai5?T2f!!Gc3@cM0yUL4r$ghv4oW+}(nO1oy=)xVyV7Zj0NS+(j>+IGj2_F7~!B`tif!ULQ2 z<*({guReu+v{X0@v@R)*feKES+1{>&^3yG<=5Hg#$lTxC>s}ypmK}K<^)dxdx7>^< zhYz#I-_W~7idNg^72_+kKXF&pO8H7JSQY~{L{kMS2ap;cpn z5Sd{k2fvKp19B`Tv_N{~pXQ3R9%U#^nC5=@GZJO{M(P~I=^c=;0#uWy%qlzwk%f2% zav8f3GwZ74{b0O}WAwX*26A+H6G4jQLdc@JRBJJQqTD+ZPQ>tbC%BIvRc<`3aX%s- zsX?4jh*N11dM73eqlerH#NL28ig*vTs6D)<|59($ew7vv=G{E!&!Y8wKOQ9<&#K)p z!7Kc;f%3E6RV)SO%pb*v<1nwg52#RXUk~6vcjhR~YQi36!A|3%BR} zMQW^#c+b9nUOezibKQTmz4}z;A2>bTlGBAHe)?8Kag*VTYre{Qz=Jg1i~vEO^(T^_PIrZOar36JtMdi;P%tgw)-~&)AB3ckDx+#oo4c_0BZ^Y?CrmSR=Y!glS zRYE{Z$inm{b5upGMzU3x+e-WRe6-+6`3 z<^FI}{44?%Dkro#n@O$YL;1JE_@XNEVBr|lB<)@`Wn#ct&`N(y|TWWhk+we ztN}+G+2f?(JB*3%UOty3BKGK_PNh_$r9r98%lH&Wd`WU4=ad0ND+0y&PkU~AwiAD< zo+DaKSRff}N)OsOdg@ZndYXAgjqtv-C_7Av{-``UI))9`iI>2VyXw5lqylp&y;YCVsbB!8P7D`BBMD7`+vgB85JigO3 zFvI-Ks+IUFT+uizBd<-Bd4^>A)h;FT`o;D*@9@qMm&J&=Q}pJDYrU;S2CPGcEDvuK z!EIg+|2*lK3cJ^Rpk6!9|9#x#y4jNw`5**HX{F9w?T;eu6n^-ZoF4s`oYorP6Om_O z{egCWWimT=7xrnd5cfK1^$}!lzPpPW6t5_JgdcxxyRJqjlT98=o=CgSar#tG$w&EJ z8YFm^9O-tMihq^jA7yEbYMqoWpH`*^?teZJm>Z(&aSAdj>2d_wVmvTme=w1S`BCFl%_FjHwNt3 z;m^GRoU^2Ie_$%g;M%x5s)|N?iYmz-W=lJ=g`E!C8aj*W%6oc+Q;uS0&JQ5uhy3i$ z>TAk6+^uQCUq|qj>V-OaB?7#PFVkjnSX?ggQbP@FkgjZ5whaPg2JDizjke_yXQ345 z$b7V(2ulANjQ0Pp1!!(QQNm19gMYc32+GGbR)QAuCe$0Xd1j{0a-TAe31s;n9eH2*E|sLc&Uwo4N_ zcl)wl5cXWss2ARh<{|Jy$qF@2j8`681He%gSAw^*sxK|yGrs+dt<=c)wSW@*p%~{e zT1j76g9CCvRXx7#%xRM6*oqzE{5gyn;&&RGE6(T4heVQ%AUbgmM@#--Kjcw6)90S~ zOYX%()i<6K#G&KY<)#Y)VW=x05EOF(9rdPwo6f}|_ zq$E|6`j)nL&j|cQ-y&Mw{rXzLq(kO}|3b}4%mb8qJyR*}SS`OGujBprBA;gCj`NkX zq#~2*+l3ErjMRhnmUG~c!W(|QRKCP z{!gKrttI-Q7As$1ecrn~W}5Lz-1K!@a^L^@^KM)2{;FlD3SvV_n{tBD$8M-JAWa`f zFp}_7U3@|P@jY^z;>`eG?UY2TqXt6~hBr#berU85C5M2~=cTD2plhMBi8Qpu z$#MxK_Cs54O=a3WBJY)#JikFsH~+!e+gwvepizfR*m{-kyC-Sdm;8DVOGt*LWa(Pb z%IP34txnR#$zX1-G#P=UjxP(Vj#9)Y^o-`NCyjV^8!*pl2IN!>oI`(dFGX{IlSUKo zll@%9sl&HY??}#x zxf4Exf6B)F>8oLMfGuh`v7swQ(={v8m0k4<6%i`z%YDnbjpIO<2e+rJi zh9x5bZJx!2fuBGBq4h$f1r1ZX@DY2dkc0Vtgt6ff=eN}Il#28D?Q$=});oi(6_O9 z&D;%d|KrFeifv?yueCL)Q`i7Q954;mYXKq~v~^yv3qbUZ?x45V8X8Xu3XUMtAFb6O z`@N;e;^#rj2dh4xiL5~x@ed(EgJ3udVp-do$ljF`@|0n3YR6eo>jK z-Z6N-4I%xRW`sAQ#CCn><*pgTlQiQ8)Xn%Uq$aN)SzE0dqZT$XGY)ds0-T+1xQd8k ziS2~#Ki#vt$?7^7a79z8F zE88-SAAD{VE%>5C1`MS&x*u#SHpa{j1r-2Ab`yW8_m4d2-?mBoOmMh(TYFPLL^)?1 zth|<8SIZM=51v7vu(c-bPGrdA!t%oQ;;XrzvKZM^8be#cx*V?9(aI`w+sh3wizelPArp1|?3BQ3z9X!%@AwcNyM{$+1b?+bpuV zMyhR!a!G5zwykL1Ta+ccu*|RPIfa3i<2f?F=K5YQ&9uzrFj!R;PX9yL!y5BN2ToDn zat1b3IRJDm@cU29Hdk}*je3lp5j)|gZDn9x{@75lULWve=Q*R>R;IV3jSRht?15$E zm8gsLyed~nM;_OPclI6aK^GOJteEp5)zlF|BUrZiGU(eiZ_84bt^GGI;^9j9ALv7Q;RVAll>v23 zYkW*HspjaN;d4ju5=b~X3FsV5GM;|;A{pAN6%|F%=1dU@i+gl`TN*uMD1K%u)-*?M z-yp;NnYLj8ncHAf!*HAMouyqq-@D%(kyqRmis3yB2=iFm)n1%xT`8*Sa53}jfAv0$ z6STvguh@%Dlp#GHYGXr@mh@Kh*pe0iU{|D&$ptzXCpesjccZS9_yK zGN|d}czXU*MMozom9m$9qCIHA%0yRj^$~6L$a%Y;erlL~XkXs^1l3hwz0}ifT6Ujr ztfa%_zg?7Mf~9h};(QGh6}cpvE^%|9vkBO!^YC;(n>bhn^|7~2c=dX3oA@HuH9O(R zZHI&Bs1d09{}y1=qZ3X^_dW?0PD`Rd7TdC&CjDaM)Wk|WZCe*TwB7T$_D%=?&gQq!h`fb$f{ml$)s z1dljXw%lj-lhV3X$uR_@#ebd`-o6l!eHF9D8}+}0?nn*|DTbGDwzO5zoY=Uj9onr<~tU_gQFLv6YFr)CWlicR*gonNf4d6s*^S7JNL}^vaZ` zD$2vPqiTFAu%1ikn%KM=X-pf6@W?(WN%dLuV0&&#{z0}+ucQ??l6bm_BJwRf?ObvV zniQMX`ghPs*@(-<&l1y{X9{W_FKxCOU>WcyK*~H`LF)evmwWiQDQacWfY2c-fp+{ZE?5!s z;(Z$BJx_l>TaH`Suca>T`EMpMmcB9hby7?^qLTU%ChF6@i@#WQ+$di<$@PN`P=frH zU$)+xCQ%lwof%h%@43CG%J8|1;t9#Bgr6X2qdsG}PZZ@_Jd0whihkvBscxugQ=3#~ z*ek`kHfd94w2*;wDpR*_T95g5ewob46cpx~xtlnRUxAL!$n%@v< zV;^tJ4Jog{_?+5Yl=aIX+?vQ}`+Yx^rGv`4nM-&tmbEf3r`CD6@UOa5%GwO-ci8Y- zK3J!6D7gC+C*b!T6VKRp|I6hr{&BfglyRT7B|W4p^jQhgl4OwPXw$zqse#}9AF+%F zXIW7HH84sp#&(^gUl}@G_XcE92VFoFx?s&3(|x+uqOwM*wk6C#;6Ut-PC~!umpt!L zK~hAb+_a0mXE_?gP+6{>`>Tl*dq@TSU%hkAHC8~KRa?Lp6C5-!s z*5m)VMj9am+!c{JnV6gnbtLq#FV8n;&e0nNt-f-q=9)WwUg)Hvk@^s_4e^{0oow1z z-e&X=Z1HJd2iLD=ID6RCs7SPeW!u2AvsP0!oJ$^HcpG^}DfgOoMQrW_cTNoezCk32Y|27PB<)HgpBnD5}@$o*A(_c4|MGJ_k=0tk_v zftfl%M-P8U=#M2F`;7I20)Vxe<(0i;6-2K3zN$a+#f|G?8Jq!U9!<)ODs?0Wz z023=Ju-N$QIeoLC(i9xLplWpPOP})c%2ks}87tGGpEyPhhu@i8553E6URlab?KnTvj%xUrM!Cq-BPpm?CB1rB4ekiD<3{Ft zr)~qcuqx6-sGfv4O!aMtQ|^qZh2<8!k-<}uZ}Y_w*RZT0oC&gSl1zR{vUf!|&LBdE zzlYMpN@pF(rJKFPXQ4CckNP|&AiN123S1qruAgT9UQxteoGPj}0Mb!GY_{_mJK~l< zbH@wXNgUM3V*RllzHn0(6jC~+^cp`*o-1i{not~PDGpt#*O(husH~eJxCtk9!ZrBx z1+BOvvyK(A6r&YCMNTnGZ9NuG@Hlg%bC%^J-DD)p#%hY}3V1|jqxNY3{H3<)4untF zXx+I>>^2!#KO?Bf>4+@;YXL9gLNR0>9Q%C!1pBy=UdMEP2PRkseaiO4#&al3_~713 zYjQDe8hM3b}wz`k%S0`G#RJ35ZnMJ7Q!ZOL+PlMtS)gS1b?#wP;X8S4DOV9WE zNG7aChi-US<_SB5LrQP)g+46PuWzkR+q_~Tn4D;rHcU0pseO(I3+Tk;1PLXEIJUjI z0aMj7RvuFGpGK+Hct&EzCk|bK!4g?v4o!0kJbe?F>v6lZ+MqQaquT%Sz5+A3mL_tf zrEiL80$BiNz63`x{SI0Qv za`7od)8zF<5erXae2Z2|4TlYNM`s3nn&@c$VVO&W)xvJ}zm%L%IEpa&-T;a8z5YV7 z3i@tNG1kDn*s5Zx8yRx%CqM^^Q#88V%fSR$a$lSFM57^!v#)fttbeXoJp-lrKAo%= zu&9CE6qOPI#lcM^NwzEWC-MQ&0VV!pdTx23e=L2^si5QRn7bKp69kR-IOw}|e{mnd zu7u@rckOKn^5Y&d z+_(Au!IEl_&>7NelL`O7rK3FF@i%LOSp;clj99!K`S{qSRN;vop2-2!P$O)JWWu5b*i6(H`A0xbif$p)*6j zuXyrM!95tX;a?HWf;haFPmq-o??}u(%{uy5r*C}YMTbpR<;UDX3A*sYZWz@8BB$oI zjx!+Lue3fu9`$EVIj}QhDbzEsrtf+W){i%PP}``#Pz84z7~pA1C%nJ&q+}@kwH+99 z5pqK1TiyZ`R!OqycN&bCeyLQXOck^L!P2y9B)6}8<&Wm~zL_;SpaXT{PsWm)kF@LU zXqBZiL~9(nAX6OU&P1Z1@pUBCzFHYso* z|0X(5L&}cdJPg~g%SjMWv!^M4D`0AnA%8I%l=sIF_J-l$P-f?fDFgoS4n3yj8GRP& zmat3a)4h|Hu8~{yR%TIxP=#d(AP_e&9b$^$hRk5#dTj8WpeN@nVA^P-c##QNVqd@2 zxqqH;)N^k+=sYmhz*&b8tC!JEl^D5*Dp{j=ymfUCX^+Qls^Z@cGwC_%%*SUtj+}S< z2(j-!sd~XpkBv>QaHTNcGr(()-(N2&m0i=&O?{V9{R?-RT(oUo-aOaYJmKrNKzNw| z2{SY5+_+#e{Gtf4d0in_B_ZL=m@5HfjxlWpoKD{~OP>5V2BPFt56rx z@0FyJbOQkl4(RKBrj0O;=#Fq$TwwkOoZ5%FzB-HVb!ZA>V^irl2PbtCn35R%I_&2U zK073RY-DxmU#dPEnMi+_L~%(X$*J#VObtW1XPs|w5&SHfd+S=?*Hl4CF^@ed-A&Rw zM0{q4KQ5@28#kh6=g5-ANJXiyP<*KN+;=>RxMl2{;smEV&~Y#hwmon1Hp)Q&$!l3xMfx%{?&g4g^DTWf1pA_e?U?G z2pr0GjU(=lf~7-_N_Clpl~^~tgP0j1u^0)LAwq;Wuek&P-zch6Cr+KA=6T)YqciC_ z0~5IgH5ceCK6a5qU@%asu1rKQTK~OMs1iBb_Dv4wjgNJx2rWi z?nTWZY7i^*in&@5+|-21*s>Mq z9pI6xsv_RXfo;1NUiv)}Jrb4k-kd$o%u2?6BI_pnGY-KB3fT^tpOv-te9uP7-P8Bw zwaC?87PhwJK~j#S_$C=PoEPsVnw7qa3Fp&TB_g?0-6Bvrv39x9YL-o7$Bz|X2UdOM$StQU{arbc1q(9HQ zd%P;Y!OaucV&@EQ_?F;1jwl7xgnW5n$TT7R?&l&L%J$&;_V5>Rht~wJcHJhb zb#N!xo@CHHfc_NgXi@-DVM(Mh{9V9yjU@f(KDm?+e{oH~$J~==nDM$xJUAG1KYfAQ z+rGkgK~DZ3iGo02L$)OksaASU{;AZAmqC5|*HbC1)uFgpwEoH7#1edJ!j0YCFLO2i z3}Sjee-M2RLozatY#j4m2HEo7bWO7EIC!smvM$YOnCB$HQqJqME5sf>r150?hu z-+yrv!ohxcZ{?)p{3)*iMsKKIoE=%U8euyst%=S3K-U#3jbOBKQ)n%AA~SjuSor4S z?T%g*Gr4New{?fHap8Ez+m)5gNZ-Lbt-Rg1JwdFQnR_X$jX$p+dq(>x>n5t7a^7Nw zRO*|PaODJ_{yJPz_os{CiK}F@J+U-R@|R|tf2H%`f1NNR^?1Rb2zMGOPbJUCy?L!K zD4m4?Ng>ob9}QV~C}?8gh$a0DI+)+hTd*Y4 zS1Kd<4r)dyUtr9JqXd;_Yi8dQ~A_dee~j;Q0C`Pf2b4S z78O3V1`Fk5BqWAGeK6YZ7ifdYJSJ}Kvr?}|b1$@qp|hNRPMF+(lAzHDHdm=TV-WQA zIzy`0;m_%wm&c>o{L0Se1SgjBy3{|}9O^kABw%dbl?bbdoM$`fs5e}k4#9fSal0C_ zj9f+>d(aHvskVoVV0Dt0#NS?R=TPiB#Pa=6EYOn}&YM7aVLB^-P`SXZd%G?3k5UVo z>(YGQSi$R^oyA_-T)X zPAi`NK$HoGK`&mf4d2f{Ui^OF5|K<@aBy8pcK^IFb}@O1QQN=SzOz2hZQ&)Do+H>@ zZ(*sRFd0=s`($8c^NAyMwEjNXdGWx|=u!DKc?s9h*yvKhsA+xCXQd3ZBVh1w^spWZ zA#Xtc_29Z^r*wd~AKYIa(=E)9A9odV8Xu>5{(qRP{|}STAFM2JIoxk80ZjhyHR6lV zXw{#;`Vw-`N8HEmHer9h`&W5Qn61I^fXm5?+#>#;y z!|Vs@DK!7#DF0hxYTS=f9mcPdCf%8S5+pM}8!GwJ2>#e?twgq|=UwFqS03d2)^zri z^Iloi%^r2#TRvkZ|0)alpx0Fjb0Dye@H0r`i+(j;-j!IJIA;*3CWk9TN^hBXy38uR zq2zvNRuh@!6=lNbdSz7bO#mw?X$R%Q3kbd(Wk-Kb?Ti2DB^zJWuXvKXrfM6G)9yb9 zCYiwxOLA_%`JTI;OwvWOK95~ye=YH1QqZ&keyDJ0;UiD zKoRP}t}mKm#aAn$@GOhoNpD{2lc3&E(}{H_L=RMQ4!nuHuAk@_-Tw2IaJ_Ml=qPZO z*!cWRS;tf!SY!LlAr7OykWcDEdf4_8s-(8Hav2xn3!xLHE=GZbMr-SuH%u-+{)60* z15wrafc3R@(qA9~@a>|CZQMg0K~moGUz2JhD-yD*ehHz_OeFp7Z4iVJp9X1#9=YCpKEqKikZa1 zaydF;Xl89(%NZ9;OFxv7FV(tA>Jt=3Ips)ud`MB+dU4u3o!B>JrlGu--hi`t)_ zrYCxC8YuhE7`?wuclX51+C|6GFS=p!|cqG%oWHn=%&vN_rU>3mv!#No?(io1hvF z?LP7pWq^G6H1gdl$o;){(4Xdhos(V85?+*fOfX3-qPB3hbpK9JF@~o=*eJfOaF>O$ z$5;zeqThxBO(r?-HLR}T>wAliSJ!cYHyj-`jt?ny>)g;0m@H~4$DK?yo2xgvGI^A; zi_^mt)4t_lt9KAWFJzL7{tBD$VJ5{Zsk`7taUnaS>@zP6I!B%j?--nV^<3wRf(G281YzJCSBihR*q?h75O7pcRT z$@PrYop`0Qc-#Hj;k5;OxeJZ-yJtm>6@hPN-8U`&#$4=W@aw`ZnVdLC4DQjpEAEF6 zlmCT}v2UG^yNGh#9^K^?u+L`p%ii+DH7ji;bf{Q)1MDRjHsC9U9bZc`K?51mT!A7t#+Yjp~W zTA2wnj(1gww|GIIbRP4jhQY_Q*N{+$ww@6d|D5?}e4r(*Y8<@lQ^an8Pqhv+ji+9g znMXU=pu_}o;buIRtq7E@PT4{$k-KYJ(;l3WEx7ch>U7Z`#+*F4=Ll%geX%=b5!m_cDU=`C3Q zzZM`cIstX#2Ty-7UY*8ovsH4q$4rtS&G3gmBorCfdzW6KYUEBn7-sn*IV*>7YuTWE7V)c8C z?A-ubz7jT@;uh@IMwm6H?_{f|t^Y`=g|g#srn5O7<b|E!5c9ib} zd3eNDKY7GJ6Cc&Kba`PP(=DUCG05%06R~{f?0fs5zy=g_`@AiPSx66PO2`q-40Q2& zwKFp_X(G&YuvxzN$Jx3-meenB1jj&uXYnT3mWlhpa4A`;vYfjNxCK+=n zYWS0B+H1|Dsz$<#My}MySre;z~fv3v2KhOCdI;SKmcwas(y!IMb;x~Mp*hilmkFyQ3! z8;(47{l=3|+RDmI^fK`yBAGIqBP^Z>nNVye^G z{snHIKdW9Zd^GOu(bFU!V*qbvCL@O^3w2|-qWASm;SYw52?~Uv>v-om(0!T8=ezm; zpzm9xbyaW%olx=s8XDg{xvCF4=?+)tM`Y&Wx(21|6YvpY9j3z=NL#A5Rlc@v==AO_ z#{11JM|j9jex_85P)7d4_&@R=Y$ykDQm6O%6NXeJN;>mrTxuy+-cEB8#DKqeidSz< zr|ibPLv|`!cmrSX951}_R`)uyVU+jw82FabUmiJVWrFN+VA;e!$`?0>`iRnz;#upK zb^A!n?eH3y_4fF7)p_tCDTv`;sYv1ON!+fj|($b90Vk^4QIBe9oP#V9@#9!FO3Pckd+cKb^(xw-|Rq zj{)b4SrQ4|Qt^DmG-V_>9dk7Kafc?&cS_zO{-Apmm5ov33lMzK&DfP7k9TIMK}CR& zp#Sq1KP}dUa1L^E5F7P}w$g>;?O^U-LUT{4cSSkx*G}z(9!`-Km0!Esmlt7Ccj-#vRuK;onEMk6mv(vKH?m{r zz7QD}F=!&@b>Y$~7&LQumo!`(ZE6w4;`c&J?wufznbV}Ori)r25`I`v~1waIb27VjyHuOetD{3d(d@i!%<{%9X`t6LAC$48ge z1I>K83U3WAJ!T%7YigI_m08^8&_eED8hO=Pd%_vJ>%X1)CfB_no=)%JDpTD>$EwdH zb*QvZVarK=2%V6!RH%dNWWf-z`I6}mkv_`QzmEE@22Ks{AsAuMfHdfe`@4f&x(WGq zw`NU+>A=Xcq<4F$=j7z#=TV4xh~sz>dWy`^+=y6`A+|0zUxnlkU0a?nlY}Q*YliFc zUKyfvo3u_`BYW^{>cYf5dDi_c{=<^IdyC6P1$J@d#S(ZZ|LAnFEY=8mqpj|e@=JPy z*dYf#erP;(`eyfHX=i2Io5flw0M?KGJkU5rgJuy6J4GZz2~@9wR??#Wn+Kzrl6w81 zvZ2H!+Fr1GZ2f}S!MZ-T{d4Zv#xwtf-E)|^LyoFKrDsppxBpDujSWuMAO=%k&gP(Q z92te9oUx7Zad5KMS7*~%vFn=O%mQKmHr5YzgYb1nz+%dr7bv?qb(M)n@9LXK9|mZ! zCnZgZ@C5}VTfB~D@nsV0KkDjS<7{HAN{??%Cl{@mAKV_4zaDj7(=@G{Sue0{$XI{h z>>>!}3LAtD3?HkPxdFfgLb+VG_LK^y4&zv?Wl2xH+HIK(=omffH%mo*-g@sRQtr@$ zc5ow+SQ_tEu;kV9<+ZsgDk7S<;GD}cZfAvXa2oqu-;aWx4{1dLgF5!IeLeEET{|(p z-hJue1naEQZ?OM~^lESSj+20RpP+zSwow?7*aV#*)PNM&^*F_n<^j$ug;Si4vDm5$ zMHqdhi%|O6gE6Rjb`!OJdZrpJZh}|1GwGFKhyWWd{%8=5ymvFbVX*yaWVmyl8PrR# zQRprCb}Vk`dCftqi&RtYVy|DEog`XRxI!RX7~#urT6L*pD%(8L)un=`6f^ z%zuj6@r^fqet-&x&-2|wa|5lA*MGuit1cJ`jvb@C7gk+nBzYcUy~aPq9AKD7E|du; zqb!w#AuBpjkw3A}4!U`#mBPnZ?49rW33NN3;#ut0Ho<4ajaU;W@N?RAe76s)n~%;w zF;w#3I=emU^{Fk5GZ+oGRvcgIV7<14SGz&!Yq18Kd+mya>%%U79Zbu z3JLus&k@9Gb==7&p9M=V4R{ln^gK?wPNJCE#~W5hG_BVxvq7UhX`v{}N|D&l+6pli@@Def+o!j-M0{groR#+TVnpdJ#&=F!lJg+F*UvZ$Fn^A1$5#* zDxy2@vH0-2@fe!BD#8ffO<>pmCB9Ozc@1>01YmIuqpVW4a`TU7qyN`~^nzy@|4N73 zZOOBWa!7iVOaY8w$SW7*Me@WrIDep&Zr#iyw%NC}Gv|d8_DX94#Y^9@ zwkfDxI(GZW=YN0azjNmO)<3#N*v47Y{TxEZffz2B0+KeV_b}iFwjdm7pzv!m5W@JC z1o&-)<)R|B4f0mxYhIbs%d>gIyx_s;@l#6_$yK=q&t1bBwxGl0QA7FcrVY}Xm&$Ko z#;22S_o-L%)+wLvKLa!480tPdT#eO*4Mj#MpvcIHggV@?;l(x1k;Z8R_cZM^1MYiM zyWZ>w4;2GRg^&quMsMHh12OC{R-y}vmt?VEdba2A7lZo_6^w+!Jt@SfgMtf9Ive!U z9OBVOyJ;4oUTR`X#RKQR6@T%9W5~-JQr2IysZesp6#3lGul}Cm}z28=sYZ|MM z(ZwZxV@==f|5RJ$-bqfcTG2HH;?UO_!)F~*VkO&`Jci%I)nlq459-o3Nj3A+{ z>yQ(Qnnq?Z5vYW)A=-i)!;lUjr?$@LGs;WNml$WD&c7Rva4cc2;|hF<9}Y%RN}s!N zeY(8kNU?F`i~uws4ZgIrqqZ_mul(nQQr=SQaMk0#^_rr-pH>%+b@ zEiJA5Iol5d7?l{}b)u`8WL8RSyzXHc8CI$$)mT`4fW9RXC38%p7xyLNoR`R zdGt0)|E#|h>ynN!Q>iE6G zNN$315E#(#O}fVG0UQ0p*7e-^cVP?3T}_5J7TZm%V5I0683n9pvek%({3jx;q}0FQ zbnnW)Ee>oP9Amqq=qod75@R2&u#KpxBXyD#SeV)QIcDC7y7rCQr@Ek;t4IrdS+7V4 z=9bST?y>ew;ua=JH_8sRtw6)>F+#?Z)!o%yW;!;5NC<|z%WHR(^{O<+K44|IfR)|d z_7`fGKtp&3i|JPf9TA|%U4MVBcY%C9HI2AiK#3HNDUy!Dpv{gy3w+Z5kyjpZzT9aI z3nD03v@726ZMtw1j%lU$4p-W+p);6-vr{H=1*2dkpG&ZNb{Cr))&xC9YP2Nl+u8&x z*dwfe6n$*y<4jW02k8*0=#2FK`jYCgkK8{lRV199f)2~9wxy!E!s-`x=40ZTuaEDL zKl>>=?||A`(&Lr1r}IC*4CM6T+eBoh($)eIsucfZZt6cq;vtY(+TC}^P3#fjajAv( zoKWbktHWP+2;S)TjO#kgjk zWMSwPStW2MaBO4qytU^35O-LW5!pf+#imbsNck86vnCa0PL#k+NXZRXc>G^(2=KNh z9s)XO-pgnkvDPs^%5&p5@<(9U8F^uW?0kqO+KFJO9=yjLriawSJBJVsh{k@1Q~L zNegC8#Pqx>pRjN*rBL;M{V$lB2|bD)0K3mXZ1-z8hFDYN&0_QBXGg~0O;QhD!wtrb zoCNynulM?s2Nu5lB*MucrB%NthMx}4(!}x@bY`lZ!f}tBFRRchCsMiS-M_9$D$Q@< z7f8(VQq;R;Yy1A?2iW6z0ztLtzKt=#{ogliIIXjz(`zRZ4&Iplp!K@db0-0T~h-0H&D{ccvQund&%XZbw$X zOw7hx8}>1bgavfW+kUD32;XCtE-E6dLA&t6Om61q$iJC3j#HdJV1NvBE@+jyC?d4iydbS+NT1&C{qY)%MI9*QD)@K2 zc-O{r%=`R^4!=Z6x()k`tbsx`pK;H2W90f~zG$x%$QGK3|@c8aBSx1&cof(tP5Z!b!M7D*gaF z&YOMbLHY?IC@1Af4sW`tD$^QUl$CJHKHaxvldJmmUL#3O^aLRFX|lk(&m%sh-ZHp8 z7WCs!R>9#$-AjcFlDRGKwTgSaFS)6a{cD&(tmQrWrLvltoa!Bfqz$d89s4{hBtI@; zk4~vy!5^BMO2cOw;RgJFi#t+B2LCbJtxHQbwj?bbuLdGB);E-k z9WxD^&%}%**MUrsaDn@wniV!wDW@wR#758U0s#Z9Pb-rlViriMs;XvDj2SO>^xl3)AWc(61Sh8A8KR}>VUeB z^B&?9pinpe+yDJG5jCHE)YFc#0C1CIcYXNB`|1d6lF4gBsk+I%z9j2GSnbS&8v*U@ zL9bZ*R_W;>8ShxeA|4ChkC79~wB zo$dv;9SmYFu!N7i>7{`EK5f9TuU)5bO>6QMtw3rDo?jQ>&P*DbqhvhcQbw}-%ZFx=obwD(_NU_= z%+8DIn_4N?%1KAz$bvV2zi9mrB|zP9%P@x>sh=N~KDE1=yJ}KChT*|k$k$|ELAY<* z@$jRU!f*e1@M+x$5#|L02tA5W3+V4fE`;(VE11r%ihv3ZACo+h)x^~LX=441AJ5%= zw9gRu=Tqmu4MSmbPv0Zq@D6pj_L?Fr=DM;OshWLQzM_YR9!vVw{d0NM|8seS;#{=V zL%!UcXlQc9ZfpHSlN}LTG7^(~q)Zu{2HsaIhgUrR8V?(1afvO(?Vx8 zv6bjE*Y=}KBh-P5&y|oME|s;or)g?s^VRy{$9rjBSg(TL&G=>vH=Go`Vrne!=lJO^ zPng&Q*^{Fp)IXWth__sUi5}QE>Qe;e1+2Cqz-P&czo~7v8N1UMW4P`5ALQ;Y1lsH- zrBh4oOi3N{Jy<`i=rFMuiWoBV!pO+IIv(Uy7UJNi^nXq8zUPCAi$7pAwtoKj(M3Vh z)HYCFb8j%g_;X>XVksI zdKf)2L#EEkUX|&80rv9009zE~H(l{Bz#j3XDdVjCc~IAF5)n%@OuDcw-iOe;Rk|uC;kNdvdsPMet@58&L`$z2r=l=o0eQ>@9Hl9b`e7s& z-hS^~xgGk<$(PROM+E_e++m+bIjcv%139l{XH0# z$1vxA{~<}7x#jN*JLo)5@y^r{=KsfyuN9~De;lQO_Y7+Dx246!C{t~$kW5cb;!h1e z9!>J2J%<8NRDUenVkN{~AvSgbz(bnomTow{4xYLCJ-2nKpMZ`&te4T>|HAFQEuE?# z?6?4%%T~nCdW&43XAwjG)0P1Tb^rZy{(qHOQ+6~i{IZ=XYv*GeRbs4~|4v%qd$G1^ z-gEz%yHe2+-Rh$3s2bSFZiY5sUOYq8v9C;0f2}x9kYltS)Lqo>RcR zML_-tBqWIUEsfIEw^n{t8ra_8ed$|}Ig|L}$!A7@qb7`F2(7dzshLgJA3$jSHO z_JZGJ$IcxP1Y%SGI1&UBbaa@AYs-V(LDNm-Q2 zPmkONd1h#gzD%-68$eUhLtRR}>uV819f(V;j50K6Nx5RA)kHQdDh3_qyS{(H{+|Nv zZ*Q94oRzQ^4Mnpd zOBqL?K1YLZp;xNF%%+PLNZD|$s%BdHg$gYW1@Se2> z%suT0KU(^jRa~Ly(z3Ah-+Gjx`QZQ8)|ZD-zP_xvo0ZvKBHCSYA&U*zJ!GS>RYA)@gSmeqo;%teY%UTe|gwUpz1HrksQ6O5g?jIiXSB9>9h}?tbL|Zr9(i!;>*e0Y)`#OTO)I(W4$mpi-qf}=}Q(1z`!jYw$gH+ zLwu+-EUoyt&ouB;8JO)F<3@M83neIp5(}0Ld{idh*p@l!2GCRS+O#(LH_6#Vt};9^ z*B}(MbGz8-mUKm;e)N;E;{`8U(p_5~V3<;JK*AD$Yuw zHBp+7cHF#++t2wkgtY_)uoxl@cGFbw*x?Oo5*FE001)OzZT%EV-*M(mE- z5_0R(7$M3LqIaKX)RsQo_tlgax_5!?ZT!Q)Q9jT1CYQSBODz|=3}Nzf2_`>HL&oES zB|t!VX-Kd$$~xv%!ZN;4*z2N(`Zmc&4};;>FBEppZVAcu2%iqqIxe>?tt`a8#28O4 z>`dtD#!E@;S@<|v0-K-FuRcqrG8Uee_k##?50w3ST6Bn_!9xn#I@pEqe3%`0YN&J)L#g!H+8*M6ElT_QUHd{s=Zhd2* zvn8vNb24}OtojFk+B(c5OwBy>I!nUkkmWf|A}XNy>RvuQOPzr zHiPxnU~sv(n?W-AxzX4v;bu`MO?AhcmAndm$Ud#)-?d)*%-VU$zeUxrU7Kw1USgli zx>f|kwM`$1pnwEACZ;E57sN(4tZyDHq%~NxZe=q|#Zq3~9@CNStx+t9SZ~Sl3(K1D zEi0saUipy!!RM(Lz*&nIg3{nnLXQDd!pyfvYnLCIpO{U>N>EXS`B%8}J$1`g49~hY z98l4h+V?8(fiK!hE|WN&r%~UxXg||>r{|Nmu!V{DDE%bu5T(q9pkK)h=wjn+e^qI{ zcoT=@bCi({=;<||ma;;=Se;(Ui$5-0ZzNMA6Of@&TqI!(;ktWbw*9SfWe0ZjDE&uU zHwr$qlowsy#&eYkvuiV^UR(0SSFWk>nS~OCv`d%G6b`>OeiC?JfkyAU#B-kR0H)Y8 z-+3B!RWFP^Z#olT_2QC3?&25IyxMvKuUn>ac{Y0Na?^t3oJKKT64*Aytjd4J--X6( zkUw{kfZzHs9Urv4pu`&p^$rV4g_?3@}LP9m-N9H!@wK7PfmuutawjcA^-f6%cV#ErM) z#WlU|4L?T7(5YW{=9tXP>8kW&wfxUQ)u%ED1E|c#R%?CX&C!B3{#{TElaAu*WaS~-@NM&+UJc!D7s(0 zR+&(Fyu>CaiQDvCZ)O@Y(CfK!I?O&vnQVWc`uH-FklvrO0K?A%JB%ABeC6)1UZ|(< z-sM}iYr4-AEfHMw<3D@P6!Kh zYWwm8@8m9Sr*tXo9PKY%3rMdLnT|MUExGd3pdezb*PYZ2Ylj>7c3|sipF+%Bp)bqa zfpJBq5wW9u?!9yyVOVF;92wpdsokE7ir{?~o8AP1@fFai)}i-^)5(hC zkruPXDihbPT~n9%hw@;KP1nVLH+NZ~KZR0zFyrg}37n_=a(R=1WdPIm`os4-wTr8p z<=@=WTc-uq+zh7H7N!B(tFkB7+zy$qdoPEmtx>ppmAPZp=6-N)Yj1#SF1Y7y-)6N2 z%DsKHqj|)+Bn!yUh8%*@OV_>Y&?BUop10&5)okPeHPrsy5S#2@u5+|3C#WtbrO7a_ zPI)Rl6ARVzFIw_GU0IX5bZ}`&fp2ynTiMDOkLD8lbg0h66p!{)HahgUfU{A8-(@{e z**j^tCcAZ^(YJjy>L-7vZQEa|4;`IuW36ARy3F4Y15*Ye?V%tRi#}DlflvDEOR1X* zJA*NLJHjjFQbI9{gn=fqil%< zo?cA5`&KK%Je>+oW&!tA2OO`dDLi>_A+##;6oHtCXo6b0#JtI}r`!tV;lQQ`18?&P;}gF}>!+qap|gK@o}I|PfN4HaOC#`go)j(V6Vc`b;j z()0GL&k{#9FP5x@9{4WjAiSH|-Qd{}<6mG?&lcHKcS=r|syvK6@M5~eN7cES79z#J zChy6rqe||7uL$dMEPwfRWK_#$F*WMIr*9{%ftBD`41Jw>&e=ut5+}FJ+9%7B4k<)? zrg2iz-^Oo^8^|EaK{zBE=}~)~MK$HUUW@xMMb5h7d{ri_hug}ly*3BWqp7K=7~q8z zE2(bX(Jq!OG6@@AUb6$6t*5RB^Qf?kxUGH5^J&%pZtJQRS{!eFo7*(;ad@t`FVLUwg%vQHK$h@3G?6 z^t}f7*zr@%Mm)vyfL3L{tu%o(Yv*cdvZy8^k%)DjA^&_QWSlt&-%}Q@t$pS^$VN>s z&S?6V9qXv-=G7`y8Cg;d<_>?-QP!bm*{!OpE|)IzGj$ZU?ZM8fg1^L|$E|LB4-~TdVxcNS?VP$>E`ta$p8{h27qY5xObg%2&KN(X-InbD# z+P7Nu)$G+Uo-g^ln==9lc22&)@x|!5l5ZufGD}A_x3xL29mdZ_)pz@xqT+S&9vxIZ zymi^|Ydxb}VquDD>7FLv6vYngGv#h@5Bk6da zRQe1P#!ar3c9G$HK*7lF1tGNCxck#l^?tWt?PI+~SE~XbB1ju~nSbzRQJZw~Nw7W{ zN|?YMk*5O1RRlG6vj#o0|h zcP0QTDnwvet@ZYM_>E@9&6a$XiI1kR?TR?%)v7}MalWbG{lTxat+^=Z=z_Lu8_RY7 z#9Vb=V70MAE2cTm=8dR&@K3J8_g?@0x>?-*_7|6?dmCFQ z^kNbxvI1Diz9NRREHw9UrZvi)>We&8+(yPS?fvpM{ZSL)RQzzIZz6&D ztn@}`?hUYs7jaC;vUStW@hpvF4*D)^5=gPyYXPtn7(S0HfrJbHJk{>-z1 zKG_j`>Rr|)hGYIWJj32Ly7Vn~ah2FxP-l0+&_`zDmf0H}mUkwho-` zFmktuyNnYgm0m*pAqqZ_p+zdohnfZ(<0g&QR`#V2R}0uyq0xrYTnmI(Xw#DZI#*z z_?A;Q)+KFq#p3Sy6G4+Kq6PM>o+%wHDu&I0c77uQPvfjX3|<#LUX^D8;%pPU{R5}d z4zs*~a-WpBc>A!H+^Gf4!?r_8^D4EF^JrDTOP$x1A+;b46F{!(Fsnz5O$5Ks;7 z%g)S%iIK&+nx8{hMvm3Y2a#MauQ-fOjy!5eXry#+rF7mp@-`|lAmFnfK;WS-!?U;# z!hRok!b3)AVHiovLPAA^BR1j?dR=`hn#mEG6sdmj7YBz3GMY%CPoh`0(Z_mHYwZ#RCaa`y4&S^Z!&(OItR)_|`^y*STPmxjIhW zA$f;$!uQZ_b{UTLq!My+tiEuUiyS4ejwpy#-Wv-b#JPub9M7UZyZXIbUi2&T9$Ai;0Y@vcd_`=3;SA7`Pf<-oJo=zN!wSFJSh;TX0eDmR+V z9R@OxE*kXTVS_{*7^9u}Wbb)*J`lZuJgFg{6B;h57&AI8sLP(+uO8J#BG76F+dQ79 z?>~#hbTWt92*Y?lDbKEc#Y)Xz0jj0hn>&n~@0ZDg)_x@j34o)E>tadVS#z!aNcssx z<^ut~4E5X>QMEZLC(yeXk8kQ}umyEC5*O)pq0#ShbcTnp8Jf#eAej*xMH z<>(cIuM6o?qO6^drS++xN?bcyOT)hZ(LCCi@F0u7d@dDR@qT?)&Rq>-myO=tBK$75 z+a-C5gM%2N*EzCQ_(PrdXp?a?FFx6&7S?lN+R z^y(r!8g}~%^wJZBKQ6S3k&=;&nq~enSaJtrXA>%39n*XdV>iORNuNb6}AP& z#J1m5jtIOF07qVQ|ET(8#r(7d%_l`m@-5<3fgd*K6NB#DeyeaR4_o0>VBonT6V=>j z^!08~bwDCMJp?S~E~qv}es>l|$`c^v5{}Nc=rEVlN!^&S+;?zyV8;S}v938q$0>I= zRdi`P=S;5Cl5a>)OZ^vE=zx8L*!DV1AG9fr;!B|G=1((m&Mn_U6gQ-$>w-zh0oV5W zEJhGr?b5z7;=eL4j$d*-azFIo-y#R&mjY}> z@1tKuB!>(TrQsh4b;Dcskx&E4uOT}y2B@pBlLnmQuo4%*AnT<`1SEQuKi!f{30sXV6}Ow5I7c=gBYMCf-)VIi>Cm4 z0MY&r5jB53$&T6h)%#G80|=^^(?u|LI-}z5hf**|jp)_}uio(mlHxwML|@k#wyr_D zz9Fq;IV9w6&^vzW@-WVI_e6|dm3*7Z#F1xqyYSz--NgnzA%7LN<+-nKM6Fwg-=K%`W?@)p^JSKb3u79 zBSu;(Erj=8a8-BoumVQUVj!+ScLePF%Rcpdy;daqp~>WaI1570t@r{*6mx^a?J$)I zWY)q7Odv<08p2Q(%iZf-!tv{YA%A5aGH+?dS>L|#6@*}+gvONW#9N=4?C-Zhk^Jp_ zkSjhi2K!{mu^b{I$fE@#9Ajbr!s>C#*qatXez5X6J4I-FkcC?We8qD~;t?d4DmCT$ zOP5&lPFN0^2$+DA05nv37EdQcRAanNw9>H^T+zI#GBjAZDwG5=54ieN!L^IX+G!|9 z5WVIk`#yR9RkAyW$Ur|M*sjQu_02q5@S^0I58Z%2O?fs2rTP)dIm~%-{w$Ep*J^eN8?ssdgIKWSIPRN~}-R%-m$Vpx((YHiRev+<0CK7gH)1?zS@jcZ!jMztx?0n%s25Qp(b{J@nLsj_RgmKU1zq#^Eq?1x(b!A!b^ zinESUnRslU?lD8nad1^blqc%r>YXd4?>b%sH#Q$xBd~%nW>UOOVVQ~kM1}y}Dc#G&@#;-y4 zAlneTdeZ=*$6bouP|W{Zns_e)_SQYEirNTdvf4_*ica+Vq#Utx8aT7lIhE>iu}+RWkDGe`GLI*xQ+gVI_XV;W0^poF zF_H=@SlotTWcQTueiou>Um*-zG&#}pEbf6K`H$;8_>73jScqw^J-PSpX88h?%uU%2 zP^Q4K5>#QDKypUDF23Z`bHWN5*>|q%PI!(F##8tM>9pG^>_Dv@Avmy%v+jpUEr^}H zF*k%9FDpaN&jcdvb3SnB6jB$#hxS+5_ger*2qtRXhF5>}&66ll5c&E~isTI@dS0dD znMv^M8lB5M!yMI#FHjqFxRxl{n0MT$=>=!?&S@cp!WMMS{3TfR=(p3=W$r$vorJ#J z+cNTRQHsCbFY}>&YcAw}#Mm9lYyF%qYW-^ncF;CE$0uS9cX+_#|5|yVqX;H2*YyyV zM-uuJ)+E~uE@9b2#PPp0+FO+8j!Gn`QrbpLeP46MA62Fct`Yu%gbhG-`US2YgIqXR z0mF*U;{f-rjyt6xoA>$NIO4B#L1fZ>z{w!ixg;H7(EtM1xvM)}K5S8QVnn7vPi9{^ z>LzBd!cDr=u15)=Z_Cp&2mvTB#fpEupKOFy@!y#fQ6rDEF77+TD6AO%+ly}MLSSWxp8TVWS_P=COd9%FoY zWwYeDp#3}K>g|yn7%c`v#I7U$NPe!}-C`Ek2dQ6mY_H~Kd2XON2}oiik5M3ejOv7| z;ED_P#CFarnaM!||AQ}p?I$MvG>l={Fg134Y&s{>Bs2Z3?|0RJ^$J|Y4|a&hmOnaH za}}Ar0B6`NJM=-Yg0_??uuXb>o z&Z|44CKhvdRkRt!75<^S2dvBK_j{5k8#SyXo!5F{uv<(qtQR@&FB699eh@Dt3O7Ky zX2kEE|F<=G1B`IJzo!JCdszVQM#v_X>95`YMrvoS5PxEQBol%x{E`6~NwE!!Cd!eT zxTRIG4-;4P+0|Syszn092r&yGN;F|9b&pFb6GJWa zT&`0>xMNh83E&RBsVi1NdSzhs3ExI>gt{0AjRFkvLp_PM?4ZzdMo$w`M!}+$p_5v^ zf-;Qr+bByu!x0iju<32kP}S%n@Q?h>AhDT>HaPyH=eO2Vt?t=2tP`VGn`tY^AyT&~ z&#R;4l`D64e_do)FseDK3&J;K(6b$ps1E6oO&2ZZF!VrsqKCwl=~#YfL9`{_cU8>a z)y5cUdC=86b>m16FeD)=YN4ji4mN8Lp1Aq0lQ{*F@)w~|5jkFtKmXsD=$e@$;$ApI zELQCP9+`g@9p59XNN*H}Byzm$sZ?+i*-t{$Ah#;iOwp5$JHKO(AYY69d?25bQav=a zx^3!(8!^r2c;6b{MGf&(P##n#pRj*}PqNhOzN`-`-?zIrIzX)~KVCzWsE2PRslp!D z+Ne}2>|i`mLmwav#Htg|23(X5-)|z-rX>SG?Y%kSrYcB*4LYRj0iIK3ANeKbDbJ&; zpDIE@w|4{wr5ra!6}=}YkLBvUQOjXS>`72l+cEzVs1an~Yu$R$CGu5^&C@c@6oSaM z1wyD5no?^6mag_nQ;41Xpi~7N_B4N!9`K{cG`xscR_Bi|-YwVazG1-Xw3b)LK*w2r z82@`bj+RWPS;pCzW@Mz2Pu$;x^b%dF6Q5*&;=@EV z!BM)VuYjYoz(i$)qbGAl>M^YB`&MIYAD>lI{GWkTgd~(G88w1lQKif6=Y<@6;fSZA z4SFxU_+tCpx*T8u4h#dR{B#8h(Slh|IMs&AL^zFh{=mnW=BMu(lJfa#MAave zuQnvxOvA2bIf6kX8v(GZx-s6Qu;CP2Tr3>Z{DG9zjETwhbNd72!>dn!(k<|>oa{9l zIHU7op+UnN&iM9`76u^FVLV!IcozCVRh2u8554gd{(tFofPFtGKLgd-sxooaZJ~QK zq1HLfjgQZDtUV3S&8tbuQXM}7{{#u}m@JWLQlNs*nTOK^L2EDw$q+<4uzAVD&rj%4 zKDoT};5g7zXX;9)aNBW*A%xf8BCRcl){0x*=Zl&3gjQozf)tnNbu> z#hJn2F7atN3R4a3Fek#|z;g_h;y#v>AM7x8w|)<%>}e3jMg5ijUS@jx1sr#!eSof6 zS$st@3UkP#MmO@IKyiVF?D$)CViNZ|UnDzLD*wj`&5YOrD2f7O*;B47IigEEjZ5PK zOA+*fwi=W_^+BT}IhOjth^`_B)B&RWpc#t6{!;0*TZ2G{HKG&)3eYq^{*OW2Jm=?9 z?jKB;$cdz??r*^{Ln2p6=2GF4qJ<@K6URw$I6A`@u)Y*{VM`VWWdMa%R;Y0xwj${n zE7l8{Ews(01B2DIQIL#^#cC3|*^L}ONMQVW9nU07YGcRGRk5 zC}F16>2=e!N%7^iC-w8v12Z14(XLXQ%Euis0-2lIDigu}jz&UvR3_*it4zF96md*Z z+AtUvH()HsEv|Eq=E5(-`Z4p6j$*gTizP$Et`Oh;l=0z%i>Pw=Q6utvibKP$Kn!wLm)~7At{ZlQ$}}CJKj~;dALs#9OjL!P=y2MiBE>G5{vw>zHH2DKjA>djI@5@aa&fk za8AOi~wXQwFHx=tX9vTS%Z}^r$1#Vhnvaw z_x4GL$Ueu|6*+&wR;>QBX(}HQ1&2%S2)Mh+^NqqM2V*1?6(cy?yz|xka9ZIi6BJAS zghFE0sG*UG7LOilVZ;#qt+JcJY>A3N5o?daIjuN0mE?Lg#udhTyYnr>M2g`RDLjEnxa?jQrEs)^JsIIWzOl=nY8IX3}^f4T0a@Z zXoi7`1!;Z5-xgSr%+Y%nry2F1jn;vIlH{PWJBnGpJ->rmb%Jbmu&J>emqS-4AQ3_* zjznRAfR%eT#(wtb+L0rtHI=Vjxq~Ax;)KE8$5OK8+Fl8a-GDR#6ZBjCEwMJ^x{S`= zRp&@=IcnOvs2Y}VPKNGM^m&Y3?X|89Vk1VKny9p5mf*U$PuPm7-E!3T{yHAmp5( zVvy=d#8#11zJO5AqLfDNh8A`sooF(*Z>3qH)+_ceN9#<~aci^f=4ZSra6uS5R}sYH zWh+*}+OPfq``K8R47T_MPVUY@DqW<7$fTZ!#cuZXtyQg6lP^K-=1a2fWzLn$IFw0h zl)UWGAtDR%nVfC{M*^0~tuVqpN+TMVZ-BfTfs#rivk%_(+X^acxl3Q^zkxeV+x*ne zQF9@xnLI?7vHt{MeMTHJkJ_fOatGl3i412>Wb=9`oO|%y9bZXvjBIu>uJ{PPc|%v% z8S${ur9|Q~BoZXxNs76QeVR{%CNCU~@HaL4+OM5eEc0#C{d>>pJh`FATcOtD20NeW z>h@cWRbYXb7YL>px})MlWxF-T&#c^2>Mu1$4aLN~+uPWm`X{E@!>hP;WXk;Ax8^tK z!W99JH-0uQrtxCd|3-v&OO8)D;pE(mPg-|AUn#~eC}^nCA^V=O38aMv&EipfFWH{BrG1E1}R)tI620BZrH>9m_ioF<5(v`v-RLDx-t36>ghL zVeM0`Q{ha{evyvBMLo|B&k&)c|Ov zKJ*>d)^sFEIXUmI_fy|xdIQBuJ@Ie7qe}dC0Maf@2XC)79MLD za;L#|CEonPl+zAxq}r>{XWSgHEFkh)?CV@5@=D0O5j<=4LrwJJIFOMFLYfe3*BiqP zYN=;4gWd?Cnd(!Lu@ygm{`{+;6L8^K{P(8}HSCSR+79e@bYRPol^LMR8d@aKn1|Sw zukcvW6F)JfF+z}1h`bKpH&TRCRQ*dL*?Qc~@ELx!jN-*o^E)9YEZ&QjJKiEI;o zZ+s9U#yTj(=&z}*(Vkt4Phm{w3tW#UNiF2PwKHc^Ttu4?I$@+X;d**_ev&CTKvd_s zOE7)3IqNI(yF_x5KsR8q`2jXcKf;iEucnSLupX zv~)S@L3oWg7b|@r$*7wd zdS7Gt6LZ$QS%BBC7?I7A{FO<$ep`aloe}#KQz>d4{`aKi#gIOOt!P>Jv`j-tiCr%M zgM3Un9#2w*p$B?$eh+jR=@U*S*NT4n4& z5YfXHaOc z)DSfO0=Jq`Nq#6psp~;E49J55v6$bHK?}?qgb)i9w$CqcLHjhaM`bDIs=n}{nQ9Wp zeQ%rVZ*uM?ySJBM5q3vph)CvPniivz7@pp(XH_IsCL#^tW9?BcB?bRd zIwChx>1P|U5-20QFOONdLuUW3)ePNzJUeF+@}c}HnPTjOLZ^hMqOcX;^T>!do5mGh zI$9mlPlBqrYR+l}{8@otCfV%c*-+W|NNmM;7}@T?N5`_|p-Td^1&uae4l9Rp3*N2l zZ`S>N`VCZvaP7LMtO9~ana@mh=Fdo?n4|aUx>}w87-hIfF^;e&%_H(1(t^7AAl`fN zfg_TuB;D6Yog^Ag{H_Ks16Ye)GD3=sn<_b#N&L8HN!T+}mJwQD!9LB?VceX;@Utb_ zUolMZP|KsMGv`}-WCD~+kCZcf_5*Ed+8JIzT*_J`s?K!VU`y9S0j}c4PV(jZZ>c!k*r{8k8KZiYPLg2o;o}xMs22EuiCkuZXnb zVQfW-SK3>;I?Xu6YT!$J4TW{^dWXsmXr#p)L)hK|WyshEMucTUw*CPgZy~+}(%1@S zE&!+QqJ$5y5>_Gb@DJcQsFQY3G4Oe+dc_|%0-fW}(0t2UJX(gi%a-$&R6pd3vdB&c z-EWtR$@R18yteje^zt9!f`|~|DrFeb{2?IOkmO^4>$S;>i9c4rX96M5WExB#^=q5J zp23Yfj83zr?(8y$UkvJ$#8$2s;L-Q5HUS@KoyPj_@Fo(=k}nQ`7eKQoUS=>s8Ae>R z>{_|3FW{bl@jGpGv#_6u8hlq?Na>6)8riIhhSK5Nlt$sxus4AcZI6qHZeGmXX)Nbm zbw|iX&gFo#1*{RwtUj_vlmC!EHH8OVZJ-){DUGzg*}VEZ43Q zsKpyO&+eLhiKh=+@#b$)!D93JgVm&TA#d*1qe%^X4Xp8%O`bPqzaOs`Nwldy-Qy+U z25G>Gqycu?`FVaO5bYl!Jn*BA#iRkMzZ$sm9NSbC)wIsgeeWxHYJ& zb!9HI)g<1t9_jk_W!S`-O5(&14#hyiJ$f6hN%N-d4JIO29}f`yj37F~%ha0vy9Fk{MfVw#^e_mf~Mv-V10mqo7joLbtLq z)Y$Xu8G)tCP)+F{O)IVrA&hbkpFhwwcTr&#`PlcbI^Vn4eqRkW6lJNYG9>t&S%Dj|ni|yyW#F!)vEEK4gEUdU@6Pnb_AZRgdvO>B~#l_cSi7 zyB5h3uL)8J>37d0Y&=s6=k&{NGe|9AFk96WPdYrh$Fg!&m;I6gHG}7y#0-s2i$}xM zNm(}6=0itA;4Z5OZUu#$}9Zh3c@WGkgc zcu0cV5Z-9}D|38+wKnAN?&u(MvOuTSZl=&u<)1$d{ zD^|}b0LES}eMnas)xQf}mgt>zH@z6~Rq3E?j?lJ7wN+gQ30?t|tmb1qn-vEHR?i_FMx>UYm>PsAic8 z&!hsm9iA_i1#k=?HO`>qqB0+;r(U2!AQZsxa)oeCUKZ&qItsH;Ma~?PyjopG6dm^f zHPy0QdwY5%&4gmElzZ0hW09*q#ixu#Z+tritfb0&Vr~YWNMRa`ff_m7X*)f+Diq!P zfuS3a2Bsz9a}FppihZAS%rKx|tmy%(PO_5CFttobUA4;$fot-kjC>+pj&{zx*S((z z?dw9zMn!vyr&2bB#pV}75pAQ2BA+|k@UuHV7v#g(!7QhT45ocEj=`&9s{fYBmY8b$ zM>x+H#E!@RW8JdLIaE&x#ZUfl!R>&u-PI68TcSp5&5wG(kqx)WN>zV9o1Z+e6ysF{ zQI`ZYy8A+bInS~i8+f1$Hv>idDe}qZ>0XW>&GwP+{zn7B!U$;4`ABkVQUgkEBeG;K6~TVU5e_N#Z{LnlxWDA8o{k z3yJ`5IX?FUd!V6nV_gm2em20Buvh~&tgjHdJq%Oq68Ipf9CiPj zOUV|#W&EAhf4Szm*<$Rbszys(=yX%RHI_R^!Wo9+{O%yhKyADd%52qo&DcC=_(x(t`xz)+$1EtmOX{2BT#^XL}#!XFYdceDq z=EULr=k}N6mDrA{yKz6CM5=T6>CSKo)B{&D^` z?pdq@oc}~SbBlH20|$$>(o>T2$JjC9*%nb*WdfOAM-$i7_tJl18}Ow?#_n-UVkt>C zt&aJ%4p^^z0jGXGb!DG4)LLMS`m4(_9(?*3%X7ObT=sHjiORLqqo#QCn1U*Yzt35^;yc>p<$G; zrF@)C^Zt5C%_K|A@BhX6r8+?Uv&PZvZ+mS!r+QG82~&U{FceEiw2`l(OYB^`I`IZI n_IS!Ggy0+@$bj%j=|jqdV7HAE+@o|y;E(ck^=tW8O`rciZoFSa literal 0 HcmV?d00001 From d75eaa30fa863fb8c0d3daca0430625bbfcac969 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Fri, 10 May 2013 00:43:15 +0200 Subject: [PATCH 02/61] removed terms & privacy from jsp --- src/main/webapp/WEB-INF/jsp/privacy.jsp | 18 ------------------ src/main/webapp/WEB-INF/jsp/termsofservice.jsp | 15 --------------- 2 files changed, 33 deletions(-) delete mode 100644 src/main/webapp/WEB-INF/jsp/privacy.jsp delete mode 100644 src/main/webapp/WEB-INF/jsp/termsofservice.jsp diff --git a/src/main/webapp/WEB-INF/jsp/privacy.jsp b/src/main/webapp/WEB-INF/jsp/privacy.jsp deleted file mode 100644 index 83ead421a..000000000 --- a/src/main/webapp/WEB-INF/jsp/privacy.jsp +++ /dev/null @@ -1,18 +0,0 @@ -<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> - - -

Privacy Policy

- -
- Google is a member of the GWT Open Source Project and operates this GWT website as a contribution to GWT. The Google Privacy Policy applies to Google's operation of this website. - -
- - -
- - - - - - diff --git a/src/main/webapp/WEB-INF/jsp/termsofservice.jsp b/src/main/webapp/WEB-INF/jsp/termsofservice.jsp deleted file mode 100644 index f5674d966..000000000 --- a/src/main/webapp/WEB-INF/jsp/termsofservice.jsp +++ /dev/null @@ -1,15 +0,0 @@ -<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> - - -

Terms of Service

- -
- Google is a member of the GWT Open Source Project and operates this GWT website as a contribution to GWT. The Google Terms of Service apply to Google's operation of this website. - -
- - -
- - - \ No newline at end of file From fc115fae3ffd59f76bf9cd5ddde96df581817105 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Fri, 10 May 2013 01:27:58 +0200 Subject: [PATCH 03/61] updated poms to reflect git repo names --- pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 0eb9f7ca0..226ee80f0 100644 --- a/pom.xml +++ b/pom.xml @@ -49,12 +49,12 @@ jersey-grizzly2 1.9 - + - commons-codec - commons-codec - 1.7 - + commons-codec + commons-codec + 1.7 + @@ -143,7 +143,7 @@ maven-war-plugin 2.3 - + @@ -204,7 +204,7 @@ org.datanucleus:datanucleus-api-jdo com.google.appengine.orm:datanucleus-appengine - + From ea89b2a35f7374aa06a0211c10d1a522aaaf9c9f Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Fri, 10 May 2013 08:21:52 +0200 Subject: [PATCH 04/61] cleanup resources --- .../webapp/server/guice/MyServletModule.java | 28 ++++++---------- ...tationServlet.java => ContentServlet.java} | 2 +- .../server/resources/PrivacyResource.java | 16 --------- .../server/resources/StandardResource.java | 33 ------------------- .../resources/TermsOfServiceResource.java | 16 --------- 5 files changed, 11 insertions(+), 84 deletions(-) rename src/main/java/com/google/gwt/site/webapp/server/resources/{DocumentationServlet.java => ContentServlet.java} (98%) delete mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java delete mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java delete mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java diff --git a/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java index c3f324507..c705df760 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java +++ b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java @@ -16,35 +16,27 @@ package com.google.gwt.site.webapp.server.guice; import com.google.apphosting.utils.remoteapi.RemoteApiServlet; -import com.google.gwt.site.webapp.server.resources.DocumentationServlet; -import com.google.gwt.site.webapp.server.resources.PrivacyResource; -import com.google.gwt.site.webapp.server.resources.StandardResource; -import com.google.gwt.site.webapp.server.resources.TermsOfServiceResource; +import com.google.gwt.site.webapp.server.resources.ContentServlet; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; -import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; - -import java.util.HashMap; -import java.util.Map; - public class MyServletModule extends ServletModule { @Override protected void configureServlets() { // web resources - bind(StandardResource.class); - bind(TermsOfServiceResource.class); - bind(PrivacyResource.class); - + // bind(StandardResource.class); + // bind(TermsOfServiceResource.class); + // bind(PrivacyResource.class); + //docs bind(RemoteApiServlet.class).in(Singleton.class); - bind(DocumentationServlet.class).in(Singleton.class); + bind(ContentServlet.class).in(Singleton.class); serve("/remote_api").with( RemoteApiServlet.class); - serve("/docs/*").with( DocumentationServlet.class); + serve("/*").with( ContentServlet.class); - Map params = new HashMap(); - params.put("com.sun.jersey.config.property.JSPTemplatesBasePath", "/WEB-INF/jsp"); - serve("/*").with(GuiceContainer.class, params); +// Map params = new HashMap(); +// params.put("com.sun.jersey.config.property.JSPTemplatesBasePath", "/WEB-INF/jsp"); +// serve("/*").with(GuiceContainer.class, params); } } diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/DocumentationServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java similarity index 98% rename from src/main/java/com/google/gwt/site/webapp/server/resources/DocumentationServlet.java rename to src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index 002483a08..c0fe118f0 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/DocumentationServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -28,7 +28,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -public class DocumentationServlet extends HttpServlet { +public class ContentServlet extends HttpServlet { /** * diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java b/src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java deleted file mode 100644 index 3499d1476..000000000 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/PrivacyResource.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.google.gwt.site.webapp.server.resources; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; - -import com.sun.jersey.api.view.Viewable; -@Path("/privacy") -public class PrivacyResource { - - @GET - @Produces("text/html") - public Viewable getHTML() { - return new Viewable("/privacy", null); - } -} diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java b/src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java deleted file mode 100644 index 5c5729297..000000000 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/StandardResource.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2013 Daniel Kurka - * - * 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. - */ -package com.google.gwt.site.webapp.server.resources; - -import com.sun.jersey.api.view.Viewable; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; - -@Path("/") -public class StandardResource { - - @GET - @Produces("text/html") - public Viewable getHTML() { - return new Viewable("/index", "World"); - } - -} diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java b/src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java deleted file mode 100644 index ea4325429..000000000 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/TermsOfServiceResource.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.google.gwt.site.webapp.server.resources; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; - -import com.sun.jersey.api.view.Viewable; -@Path("/termsofservice") -public class TermsOfServiceResource { - - @GET - @Produces("text/html") - public Viewable getHTML() { - return new Viewable("/termsofservice", null); - } -} From ee31123e4041487d0b75bcc714c54929ea64fce6 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Sun, 12 May 2013 17:18:33 +0200 Subject: [PATCH 05/61] fix normalize path --- .../google/gwt/site/webapp/server/resources/ContentServlet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index c0fe118f0..22dfd8bd5 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -108,7 +108,7 @@ private boolean isBinaryFile(String path) { private String normalizePath(String fullPath) { - fullPath = fullPath.substring("/docs/".length(), fullPath.length()); + fullPath = fullPath.substring("/".length(), fullPath.length()); if ("".equals(fullPath) || fullPath.endsWith("/")) { fullPath += "index.html"; From ed4643775b41376e5b5ed62a297d7e213b1e8dc6 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Sun, 12 May 2013 17:20:18 +0200 Subject: [PATCH 06/61] remoted css --- src/main/webapp/css/main.css | 137 ----------------------------------- 1 file changed, 137 deletions(-) delete mode 100644 src/main/webapp/css/main.css diff --git a/src/main/webapp/css/main.css b/src/main/webapp/css/main.css deleted file mode 100644 index 975ec515c..000000000 --- a/src/main/webapp/css/main.css +++ /dev/null @@ -1,137 +0,0 @@ -body{ - margin:0; - padding:0; - -} -#nav a, #nav a:visited, #container a, #container a:VISITED, #footer a, #footer a:visited { - text-decoration: none; - -} - - -#container a, #container a:VISITED { - color: #464646; -} - - -#nav { - background-color: #464646; - font-size: 15px; - -} - - - -#nav > div{ - line-height: 40px; - margin: 0; - padding: 0; - margin-left: 10px; - -} - -#nav > div ul{ - list-style-type: disc; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} - -#nav > div ul li{ - padding-left: 5px; - padding-right: 5px; - list-style-image: none; - list-style-type: none; - margin-left: 0; - white-space: nowrap; - display: inline; - float: left; - -} - -#nav a, #nav a:visited, #container a { - color: #fff; - -} - -.content { - margin: 10px; - -} - - -/* - -E8DDCB -HEX - -CDB380 -HEX - - -036564 -HEX - -033649 -HEX - -031634 -HEX - -*/ - - - - - -#footer { - background-color: #464646; - font-size: 15px; - -} - - - -#footer > div{ - line-height: 20px; - margin: 0; - padding: 0; - margin-left: 10px; - -} - -#footer > div ul{ - list-style-type: disc; - margin: 0; - padding: 0; - border: 0; - overflow: hidden; -} - -#footer > div ul li{ - padding-left: 5px; - padding-right: 5px; - list-style-image: none; - list-style-type: none; - margin-left: 0; - white-space: nowrap; - display: inline; - float: left; - font-size: 10px; - -} - -#footer a, #footer a:visited { - color: #fff; - -} - - - - - - - - - From 8759af4a71ffa34d9343ecb2032109f638f8af49 Mon Sep 17 00:00:00 2001 From: jdramaix Date: Sun, 12 May 2013 23:33:11 -0700 Subject: [PATCH 07/61] single page app mode + enhance menu --- pom.xml | 11 +++- .../google/gwt/site/webapp/GWTProject.gwt.xml | 4 +- .../webapp/GWTProjectSuperDevMode.gwt.xml | 12 ++++ .../webapp/client/GWTProjectEntryPoint.java | 63 ++++++++++++++++++- 4 files changed, 85 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/google/gwt/site/webapp/GWTProjectSuperDevMode.gwt.xml diff --git a/pom.xml b/pom.xml index 226ee80f0..280b3646f 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ 1.7.6 UTF-8 2.5.1 + 1.3.2 @@ -124,6 +125,13 @@ 1.0 + + + com.googlecode.gwtquery + gwtquery + ${gwtquery.version} + provided + @@ -203,9 +211,6 @@ org.datanucleus:datanucleus-jpa org.datanucleus:datanucleus-api-jdo com.google.appengine.orm:datanucleus-appengine - - - diff --git a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml index 0407f776d..23f07c4b0 100644 --- a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml +++ b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml @@ -3,7 +3,9 @@ + + - \ No newline at end of file + diff --git a/src/main/java/com/google/gwt/site/webapp/GWTProjectSuperDevMode.gwt.xml b/src/main/java/com/google/gwt/site/webapp/GWTProjectSuperDevMode.gwt.xml new file mode 100644 index 000000000..81577f6b5 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/GWTProjectSuperDevMode.gwt.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index b16d71fe6..378832649 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -16,13 +16,74 @@ package com.google.gwt.site.webapp.client; import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.dom.client.Element; +import com.google.gwt.query.client.Function; +import com.google.gwt.query.client.GQuery; +import com.google.gwt.user.client.Window; + +import static com.google.gwt.query.client.GQuery.$; public class GWTProjectEntryPoint implements EntryPoint { + private String currentPage; @Override public void onModuleLoad() { - // TODO Auto-generated method stub + enhanceMenu(); + + maybeLoadPage(); + } + + private void maybeLoadPage() { + String currentHash = Window.Location.getHash(); + + if (currentHash != null && currentHash.length() > 0) { + if (currentHash.startsWith("#")) { + currentHash = currentHash.substring(1); + } + + loadPage(currentHash); + // TODO open the menu to the page + } + } + + private void enhanceMenu() { + $("li.folder > a").click(new Function() { + @Override + public void f(Element e) { + tooggleMenu($(e).parent()); + } + }); + $("#gwt-toc a").click(new Function() { + @Override + public void f(Element e) { + loadPage(e.getAttribute("href")); + + getEvent().preventDefault(); + } + }); + } + + private void tooggleMenu(GQuery menu) { + if (menu.hasClass("open")) { + menu.removeClass("open"); + } else { + menu.addClass("open"); + } + + menu.children("ul").slideToggle(200); } + private void loadPage(String pageUrl){ + if (pageUrl.equals(currentPage)) { + return; + } + + currentPage = pageUrl; + + $("#gwt-content").load(pageUrl + " #gwt-content > div"); + + String newUrl = Window.Location.createUrlBuilder().setHash(currentPage).buildString(); + Window.Location.replace(newUrl); + } } From edf697b2c2ed0c9f9f5a3412825fe26ab989562d Mon Sep 17 00:00:00 2001 From: jdramaix Date: Sun, 12 May 2013 23:37:09 -0700 Subject: [PATCH 08/61] typo --- .../google/gwt/site/webapp/client/GWTProjectEntryPoint.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 378832649..6bbd8eb32 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -47,10 +47,11 @@ private void maybeLoadPage() { } private void enhanceMenu() { + // TODO : arrow should be clickable $("li.folder > a").click(new Function() { @Override public void f(Element e) { - tooggleMenu($(e).parent()); + toggleMenu($(e).parent()); } }); @@ -64,7 +65,7 @@ public void f(Element e) { }); } - private void tooggleMenu(GQuery menu) { + private void toggleMenu(GQuery menu) { if (menu.hasClass("open")) { menu.removeClass("open"); } else { From 91cac2d28f6cf05a4cae7567d2029536b9b46215 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Mon, 13 May 2013 23:19:59 +0200 Subject: [PATCH 09/61] using HTML5 History API --- .../webapp/client/GWTProjectEntryPoint.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 6bbd8eb32..e045400fa 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -79,12 +79,26 @@ private void loadPage(String pageUrl){ if (pageUrl.equals(currentPage)) { return; } + + if(supportsHtml5Histroy()) { + currentPage = pageUrl; - currentPage = pageUrl; + $("#gwt-content").load(pageUrl + " #gwt-content > div"); - $("#gwt-content").load(pageUrl + " #gwt-content > div"); + pushState("/" + pageUrl); + }else{ + Window.Location.replace(pageUrl); + } - String newUrl = Window.Location.createUrlBuilder().setHash(currentPage).buildString(); - Window.Location.replace(newUrl); + } + + private native boolean pushState(String url) /*-{ + $wnd.history.pushState(null, null, url); + }-*/; + + private native boolean supportsHtml5Histroy()/*-{ + return $wnd.history && $wnd.history.pushState; + }-*/; + } From b3d23256a81532020e65764acab35c59f2294f0b Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Tue, 14 May 2013 02:18:15 +0200 Subject: [PATCH 10/61] fold sub menus --- .../webapp/client/GWTProjectEntryPoint.java | 159 +++++++++--------- 1 file changed, 82 insertions(+), 77 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index e045400fa..5e5ef3def 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -24,81 +24,86 @@ import static com.google.gwt.query.client.GQuery.$; public class GWTProjectEntryPoint implements EntryPoint { - private String currentPage; - - @Override - public void onModuleLoad() { - enhanceMenu(); - - maybeLoadPage(); - } - - private void maybeLoadPage() { - String currentHash = Window.Location.getHash(); - - if (currentHash != null && currentHash.length() > 0) { - if (currentHash.startsWith("#")) { - currentHash = currentHash.substring(1); - } - - loadPage(currentHash); - // TODO open the menu to the page - } - } - - private void enhanceMenu() { - // TODO : arrow should be clickable - $("li.folder > a").click(new Function() { - @Override - public void f(Element e) { - toggleMenu($(e).parent()); - } - }); - - $("#gwt-toc a").click(new Function() { - @Override - public void f(Element e) { - loadPage(e.getAttribute("href")); - - getEvent().preventDefault(); - } - }); - } - - private void toggleMenu(GQuery menu) { - if (menu.hasClass("open")) { - menu.removeClass("open"); - } else { - menu.addClass("open"); - } - - menu.children("ul").slideToggle(200); - } - - private void loadPage(String pageUrl){ - if (pageUrl.equals(currentPage)) { - return; - } - - if(supportsHtml5Histroy()) { - currentPage = pageUrl; - - $("#gwt-content").load(pageUrl + " #gwt-content > div"); - - pushState("/" + pageUrl); - }else{ - Window.Location.replace(pageUrl); - } - - - } - - private native boolean pushState(String url) /*-{ - $wnd.history.pushState(null, null, url); - }-*/; - - private native boolean supportsHtml5Histroy()/*-{ - return $wnd.history && $wnd.history.pushState; - }-*/; - + private String currentPage; + + @Override + public void onModuleLoad() { + + enhanceMenu(); + + //maybeLoadPage(); + } + + private void maybeLoadPage() { + String currentHash = Window.Location.getHash(); + + if (currentHash != null && currentHash.length() > 0) { + if (currentHash.startsWith("#")) { + currentHash = currentHash.substring(1); + } + + loadPage(currentHash); + // TODO open the menu to the page + } + } + + private void enhanceMenu() { + // TODO : arrow should be clickable + $("li.folder > a").click(new Function() { + @Override + public void f(Element e) { + toggleMenu($(e).parent()); + } + }); + + $("#gwt-toc li.folder > ul").css("display", "none"); + + $("#gwt-toc a").click(new Function() { + @Override + public void f(Element e) { + loadPage(e.getAttribute("href")); + + getEvent().preventDefault(); + } + }); + + + } + + private void toggleMenu(GQuery menu) { + if (menu.hasClass("open")) { + menu.removeClass("open"); + } else { + menu.addClass("open"); + } + + menu.children("ul").slideToggle(200); + } + + private void loadPage(String pageUrl) { + if (pageUrl.equals(currentPage)) { + return; + } + + if (supportsHtml5Histroy()) { + currentPage = pageUrl; + + + $("#gwt-content").load(pageUrl + " #gwt-content > div"); + + pushState(pageUrl); + } else { + Window.Location.replace(pageUrl); + } + + } + + private native boolean pushState(String url) /*-{ + $wnd.history.pushState(null, null, url); + }-*/; + + private native boolean supportsHtml5Histroy()/*-{ + return $wnd.history && $wnd.history.pushState; + }-*/; + } From daf036d4f8375b89a12331fc23e2db313f800f70 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Tue, 14 May 2013 08:29:57 +0200 Subject: [PATCH 11/61] nits --- .../google/gwt/site/webapp/client/GWTProjectEntryPoint.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 5e5ef3def..e9aa78b36 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -57,11 +57,11 @@ public void f(Element e) { }); $("#gwt-toc li.folder > ul").css("display", "none"); - + $("#gwt-toc a").click(new Function() { @Override public void f(Element e) { - loadPage(e.getAttribute("href")); + loadPage(e.getAttribute("ahref")); getEvent().preventDefault(); } From 97ec4c7d8146d38af5e9e654316abafc98cc1aa8 Mon Sep 17 00:00:00 2001 From: jdramaix Date: Tue, 14 May 2013 00:16:13 -0700 Subject: [PATCH 12/61] open automatically the menu --- .../webapp/client/GWTProjectEntryPoint.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 5e5ef3def..08cb32fd1 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -27,27 +27,23 @@ public class GWTProjectEntryPoint implements EntryPoint { private String currentPage; @Override - public void onModuleLoad() { - + public void onModuleLoad() { enhanceMenu(); - - //maybeLoadPage(); + + openMenu(); } - private void maybeLoadPage() { - String currentHash = Window.Location.getHash(); + private void openMenu() { + String href = Window.Location.getPath(); - if (currentHash != null && currentHash.length() > 0) { - if (currentHash.startsWith("#")) { - currentHash = currentHash.substring(1); - } - - loadPage(currentHash); - // TODO open the menu to the page - } - } + if (href != null && href.length() > 0) { + $("#gwt-toc a[href$='" + href + "']").addClass("selected") + .parentsUntil("#gwt-toc").filter("li.folder").addClass("open") + .children("ul").slideDown(200); + } + } - private void enhanceMenu() { + private void enhanceMenu() { // TODO : arrow should be clickable $("li.folder > a").click(new Function() { @Override @@ -63,11 +59,11 @@ public void f(Element e) { public void f(Element e) { loadPage(e.getAttribute("href")); + selectItem(e); + getEvent().preventDefault(); } }); - - } private void toggleMenu(GQuery menu) { @@ -98,6 +94,11 @@ private void loadPage(String pageUrl) { } + private void selectItem(Element item) { + $("#gwt-toc a.selected").removeClass("selected"); + item.addClassName("selected"); + } + private native boolean pushState(String url) /*-{ $wnd.history.pushState(null, null, url); }-*/; @@ -105,5 +106,4 @@ private native boolean pushState(String url) /*-{ private native boolean supportsHtml5Histroy()/*-{ return $wnd.history && $wnd.history.pushState; }-*/; - } From df625097b2143bdce8afdb15cac166cd075f4d49 Mon Sep 17 00:00:00 2001 From: jdramaix Date: Tue, 14 May 2013 01:04:20 -0700 Subject: [PATCH 13/61] fix popstate --- .../webapp/client/GWTProjectEntryPoint.java | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 08cb32fd1..b5a50cc53 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -31,6 +31,10 @@ public void onModuleLoad() { enhanceMenu(); openMenu(); + + if (supportsHtml5History()) { + initOnPopState(); + } } private void openMenu() { @@ -55,15 +59,15 @@ public void f(Element e) { $("#gwt-toc li.folder > ul").css("display", "none"); $("#gwt-toc a").click(new Function() { - @Override - public void f(Element e) { - loadPage(e.getAttribute("href")); + @Override + public void f(Element e) { + loadPage(e.getAttribute("href"), true); selectItem(e); - getEvent().preventDefault(); - } - }); + getEvent().preventDefault(); + } + }); } private void toggleMenu(GQuery menu) { @@ -76,24 +80,28 @@ private void toggleMenu(GQuery menu) { menu.children("ul").slideToggle(200); } - private void loadPage(String pageUrl) { + private void loadPage(String pageUrl, boolean pushState) { if (pageUrl.equals(currentPage)) { return; } - if (supportsHtml5Histroy()) { + if (supportsHtml5History()) { currentPage = pageUrl; $("#gwt-content").load(pageUrl + " #gwt-content > div"); - pushState(pageUrl); - } else { - Window.Location.replace(pageUrl); - } + if (pushState) { + pushState(pageUrl); + } + } } + private void onPopState() { + loadPage(Window.Location.getPath(), false); + } + private void selectItem(Element item) { $("#gwt-toc a.selected").removeClass("selected"); item.addClassName("selected"); @@ -103,7 +111,14 @@ private native boolean pushState(String url) /*-{ $wnd.history.pushState(null, null, url); }-*/; - private native boolean supportsHtml5Histroy()/*-{ + private native boolean supportsHtml5History()/*-{ return $wnd.history && $wnd.history.pushState; }-*/; + + private native void initOnPopState() /*-{ + var that = this; + $wnd.onpopstate = $entry(function(e) { + that.@com.google.gwt.site.webapp.client.GWTProjectEntryPoint::onPopState()(); + }); + }-*/; } From 3939e36b3405badcc9a08b1f5e04556b1daa8b9f Mon Sep 17 00:00:00 2001 From: jdramaix Date: Tue, 14 May 2013 01:08:17 -0700 Subject: [PATCH 14/61] restore old code --- .../com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index b5a50cc53..0dd1120b1 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -95,6 +95,8 @@ private void loadPage(String pageUrl, boolean pushState) { pushState(pageUrl); } + } else { + Window.Location.replace(pageUrl); } } From 80fce41c3df7ccab27b9d9a893041fca2b31823e Mon Sep 17 00:00:00 2001 From: jdramaix Date: Tue, 14 May 2013 11:10:32 -0700 Subject: [PATCH 15/61] Load all internal link by using ajax --- .../webapp/client/GWTProjectEntryPoint.java | 105 ++++++++++++------ 1 file changed, 71 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 0dd1120b1..dcf04a737 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -19,29 +19,48 @@ import com.google.gwt.dom.client.Element; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQuery; +import com.google.gwt.regexp.shared.RegExp; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; import static com.google.gwt.query.client.GQuery.$; +import static com.google.gwt.query.client.GQuery.body; public class GWTProjectEntryPoint implements EntryPoint { - private String currentPage; + private static final RegExp INTERNAL_URL_REGEX; + private static final RegExp NOT_RELATIVE_URL_REGEX; + + static { + String domainUrl = Window.Location.getHostName(); + String port = Window.Location.getPort(); + + if (port != null && port.length() > 0) { + domainUrl += ":" + port; + } + + INTERNAL_URL_REGEX = RegExp.compile("^(https?)\\:\\/\\/" + domainUrl + "\\/.*$"); + NOT_RELATIVE_URL_REGEX = RegExp.compile("^(https?)|(mailto)|(ftp)|(javascript)\\:.*$"); + } + + + private String currentPage; @Override public void onModuleLoad() { enhanceMenu(); - openMenu(); + openMenu(Window.Location.getPath()); if (supportsHtml5History()) { initOnPopState(); } } - private void openMenu() { - String href = Window.Location.getPath(); + private void openMenu(String path) { + $("#gwt-toc a.selected").removeClass("selected"); - if (href != null && href.length() > 0) { - $("#gwt-toc a[href$='" + href + "']").addClass("selected") + if (path != null && path.length() > 0) { + $("#gwt-toc a[href$='" + path + "']").addClass("selected") .parentsUntil("#gwt-toc").filter("li.folder").addClass("open") .children("ul").slideDown(200); } @@ -58,17 +77,25 @@ public void f(Element e) { $("#gwt-toc li.folder > ul").css("display", "none"); - $("#gwt-toc a").click(new Function() { + $("a", body).live(Event.ONCLICK, new Function() { @Override - public void f(Element e) { - loadPage(e.getAttribute("href"), true); + public boolean f(Event event) { + String href = getElement().getAttribute("href"); - selectItem(e); + if (isInternalNavigation(href)) { + return loadPage(href, true); + } - getEvent().preventDefault(); + return true; } }); - } + } + + private boolean isInternalNavigation(String href) { + // TODO mix the three last conditions in one regex !! + return href != null && href.length() > 0 && (!href.startsWith("#") && !NOT_RELATIVE_URL_REGEX.test(href) + || INTERNAL_URL_REGEX.test(href)); + } private void toggleMenu(GQuery menu) { if (menu.hasClass("open")) { @@ -80,35 +107,45 @@ private void toggleMenu(GQuery menu) { menu.children("ul").slideToggle(200); } - private void loadPage(String pageUrl, boolean pushState) { - if (pageUrl.equals(currentPage)) { - return; - } - - if (supportsHtml5History()) { - currentPage = pageUrl; - - - $("#gwt-content").load(pageUrl + " #gwt-content > div"); + private boolean loadPage(final String pageUrl, final boolean pushState) { + int hashIndex = pageUrl.indexOf('#'); + final String path = hashIndex != -1 ? pageUrl.substring(0, hashIndex) : pageUrl; + final String hash = hashIndex != -1 ? pageUrl.substring(hashIndex) : null; + + if (supportsHtml5History() && !path.equals(currentPage)) { + currentPage = path; + + + $("#gwt-content").load(pageUrl + " #gwt-content > div", null, new Function(){ + @Override + public void f() { + if (pushState) { + pushState(pageUrl); + } + if (hash != null) { + scrollTo(hash); + } + openMenu(path); + } + } + ); + + return false; + } else if (hash != null) { + scrollTo(hash); + } - if (pushState) { - pushState(pageUrl); - } + return !path.equals(currentPage); + } - } else { - Window.Location.replace(pageUrl); - } - } + private void scrollTo(String hash) { + Window.scrollTo(Window.getScrollLeft(), $(hash).offset().top); + } private void onPopState() { loadPage(Window.Location.getPath(), false); } - private void selectItem(Element item) { - $("#gwt-toc a.selected").removeClass("selected"); - item.addClassName("selected"); - } - private native boolean pushState(String url) /*-{ $wnd.history.pushState(null, null, url); }-*/; From cd7c650515046f52148278080f5c2f107616a5fb Mon Sep 17 00:00:00 2001 From: jdramaix Date: Tue, 14 May 2013 11:18:50 -0700 Subject: [PATCH 16/61] remove extra new line --- .../com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index dcf04a737..f94ec72c3 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -42,7 +42,6 @@ public class GWTProjectEntryPoint implements EntryPoint { NOT_RELATIVE_URL_REGEX = RegExp.compile("^(https?)|(mailto)|(ftp)|(javascript)\\:.*$"); } - private String currentPage; @Override @@ -115,7 +114,6 @@ private boolean loadPage(final String pageUrl, final boolean pushState) { if (supportsHtml5History() && !path.equals(currentPage)) { currentPage = path; - $("#gwt-content").load(pageUrl + " #gwt-content > div", null, new Function(){ @Override public void f() { From d59f4634c3f87052869297f911c6ccae034d28dc Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Thu, 16 May 2013 08:04:24 +0200 Subject: [PATCH 17/61] nits menu --- .../webapp/client/GWTProjectEntryPoint.java | 195 +++++++++--------- .../server/resources/ContentServlet.java | 1 + 2 files changed, 104 insertions(+), 92 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index f94ec72c3..73e3079f1 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -27,45 +27,47 @@ import static com.google.gwt.query.client.GQuery.body; public class GWTProjectEntryPoint implements EntryPoint { - private static final RegExp INTERNAL_URL_REGEX; - private static final RegExp NOT_RELATIVE_URL_REGEX; + private static final RegExp INTERNAL_URL_REGEX; + private static final RegExp NOT_RELATIVE_URL_REGEX; - static { - String domainUrl = Window.Location.getHostName(); - String port = Window.Location.getPort(); + static { + String domainUrl = Window.Location.getHostName(); + String port = Window.Location.getPort(); - if (port != null && port.length() > 0) { - domainUrl += ":" + port; - } + if (port != null && port.length() > 0) { + domainUrl += ":" + port; + } - INTERNAL_URL_REGEX = RegExp.compile("^(https?)\\:\\/\\/" + domainUrl + "\\/.*$"); - NOT_RELATIVE_URL_REGEX = RegExp.compile("^(https?)|(mailto)|(ftp)|(javascript)\\:.*$"); - } + INTERNAL_URL_REGEX = RegExp.compile("^(https?)\\:\\/\\/" + domainUrl + + "\\/.*$"); + NOT_RELATIVE_URL_REGEX = RegExp + .compile("^(https?)|(mailto)|(ftp)|(javascript)\\:.*$"); + } - private String currentPage; + private String currentPage; @Override - public void onModuleLoad() { + public void onModuleLoad() { enhanceMenu(); - - openMenu(Window.Location.getPath()); - if (supportsHtml5History()) { - initOnPopState(); - } + openMenu(Window.Location.getPath()); + + if (supportsHtml5History()) { + initOnPopState(); + } } - private void openMenu(String path) { - $("#gwt-toc a.selected").removeClass("selected"); + private void openMenu(String path) { + $("#gwt-toc a.selected").removeClass("selected"); - if (path != null && path.length() > 0) { - $("#gwt-toc a[href$='" + path + "']").addClass("selected") - .parentsUntil("#gwt-toc").filter("li.folder").addClass("open") - .children("ul").slideDown(200); - } - } + if (path != null && path.length() > 0) { + $("#gwt-toc a[href$='" + path + "']").addClass("selected") + .parentsUntil("#gwt-toc").filter("li.folder") + .addClass("open").children("ul").slideDown(200); + } + } - private void enhanceMenu() { + private void enhanceMenu() { // TODO : arrow should be clickable $("li.folder > a").click(new Function() { @Override @@ -73,28 +75,35 @@ public void f(Element e) { toggleMenu($(e).parent()); } }); - - $("#gwt-toc li.folder > ul").css("display", "none"); - - $("a", body).live(Event.ONCLICK, new Function() { - @Override - public boolean f(Event event) { - String href = getElement().getAttribute("href"); - if (isInternalNavigation(href)) { - return loadPage(href, true); - } + $("#gwt-toc li.folder > ul").css("display", "none"); - return true; - } - }); - } + $("a", body).live(Event.ONCLICK, new Function() { + @Override + public boolean f(Event event) { + String href = null; + if (getElement().hasAttribute("ahref")) { + href = getElement().getAttribute("ahref"); + } else { + href = getElement().getAttribute("href"); + } + + if (isInternalNavigation(href)) { + return loadPage(href, true); + } + + return true; + } + }); + } - private boolean isInternalNavigation(String href) { - // TODO mix the three last conditions in one regex !! - return href != null && href.length() > 0 && (!href.startsWith("#") && !NOT_RELATIVE_URL_REGEX.test(href) - || INTERNAL_URL_REGEX.test(href)); - } + private boolean isInternalNavigation(String href) { + // TODO mix the three last conditions in one regex !! + return href != null + && href.length() > 0 + && (!href.startsWith("#") && !NOT_RELATIVE_URL_REGEX.test(href) || INTERNAL_URL_REGEX + .test(href)); + } private void toggleMenu(GQuery menu) { if (menu.hasClass("open")) { @@ -106,56 +115,58 @@ private void toggleMenu(GQuery menu) { menu.children("ul").slideToggle(200); } - private boolean loadPage(final String pageUrl, final boolean pushState) { - int hashIndex = pageUrl.indexOf('#'); - final String path = hashIndex != -1 ? pageUrl.substring(0, hashIndex) : pageUrl; - final String hash = hashIndex != -1 ? pageUrl.substring(hashIndex) : null; - - if (supportsHtml5History() && !path.equals(currentPage)) { - currentPage = path; - - $("#gwt-content").load(pageUrl + " #gwt-content > div", null, new Function(){ - @Override - public void f() { - if (pushState) { - pushState(pageUrl); - } - if (hash != null) { - scrollTo(hash); - } - openMenu(path); - } - } - ); - - return false; - } else if (hash != null) { - scrollTo(hash); - } - - return !path.equals(currentPage); - } - - private void scrollTo(String hash) { - Window.scrollTo(Window.getScrollLeft(), $(hash).offset().top); - } - - private void onPopState() { - loadPage(Window.Location.getPath(), false); - } - - private native boolean pushState(String url) /*-{ + private boolean loadPage(final String pageUrl, final boolean pushState) { + int hashIndex = pageUrl.indexOf('#'); + final String path = hashIndex != -1 ? pageUrl.substring(0, hashIndex) + : pageUrl; + final String hash = hashIndex != -1 ? pageUrl.substring(hashIndex) + : null; + + if (supportsHtml5History() && !path.equals(currentPage)) { + currentPage = path; + + $("#gwt-content").load(pageUrl + " #gwt-content > div", null, + new Function() { + @Override + public void f() { + if (pushState) { + pushState(pageUrl); + } + if (hash != null) { + scrollTo(hash); + } + openMenu(path); + } + }); + + return false; + } else if (hash != null) { + scrollTo(hash); + } + + return !path.equals(currentPage); + } + + private void scrollTo(String hash) { + Window.scrollTo(Window.getScrollLeft(), $(hash).offset().top); + } + + private void onPopState() { + loadPage(Window.Location.getPath(), false); + } + + private native void pushState(String url) /*-{ $wnd.history.pushState(null, null, url); }-*/; private native boolean supportsHtml5History()/*-{ - return $wnd.history && $wnd.history.pushState; + return !!($wnd.history && $wnd.history.pushState); }-*/; - private native void initOnPopState() /*-{ - var that = this; - $wnd.onpopstate = $entry(function(e) { - that.@com.google.gwt.site.webapp.client.GWTProjectEntryPoint::onPopState()(); - }); - }-*/; + private native void initOnPopState() /*-{ + var that = this; + $wnd.onpopstate = $entry(function(e) { + that.@com.google.gwt.site.webapp.client.GWTProjectEntryPoint::onPopState()(); + }); + }-*/; } diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index 22dfd8bd5..9d98ffc6c 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -113,6 +113,7 @@ private String normalizePath(String fullPath) { if ("".equals(fullPath) || fullPath.endsWith("/")) { fullPath += "index.html"; } + return fullPath; } } From ecbb3049b2a7b9640a5a3a9af422addbca3ff885 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Thu, 16 May 2013 08:18:08 +0200 Subject: [PATCH 18/61] nits --- .../com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 73e3079f1..432da5cc3 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -61,7 +61,7 @@ private void openMenu(String path) { $("#gwt-toc a.selected").removeClass("selected"); if (path != null && path.length() > 0) { - $("#gwt-toc a[href$='" + path + "']").addClass("selected") + $("#gwt-toc a[ahref$='" + path + "']").addClass("selected") .parentsUntil("#gwt-toc").filter("li.folder") .addClass("open").children("ul").slideDown(200); } From 1002d50e198173f9ee4dd79ed1d18ef9b415fd3b Mon Sep 17 00:00:00 2001 From: jdramaix Date: Wed, 15 May 2013 23:49:28 -0700 Subject: [PATCH 19/61] fix menu --- .../webapp/client/GWTProjectEntryPoint.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 73e3079f1..f45d75b89 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -25,6 +25,7 @@ import static com.google.gwt.query.client.GQuery.$; import static com.google.gwt.query.client.GQuery.body; +import static com.google.gwt.query.client.GQuery.get; public class GWTProjectEntryPoint implements EntryPoint { private static final RegExp INTERNAL_URL_REGEX; @@ -73,28 +74,31 @@ private void enhanceMenu() { @Override public void f(Element e) { toggleMenu($(e).parent()); + + getEvent().stopPropagation(); + getEvent().preventDefault(); } }); $("#gwt-toc li.folder > ul").css("display", "none"); $("a", body).live(Event.ONCLICK, new Function() { - @Override - public boolean f(Event event) { - String href = null; - if (getElement().hasAttribute("ahref")) { - href = getElement().getAttribute("ahref"); - } else { - href = getElement().getAttribute("href"); - } - - if (isInternalNavigation(href)) { - return loadPage(href, true); - } - - return true; - } - }); + @Override + public boolean f(Event event) { + String href = null; + if (getElement().hasAttribute("ahref")) { + href = getElement().getAttribute("ahref"); + } else { + href = getElement().getAttribute("href"); + } + + if (isInternalNavigation(href)) { + return loadPage(href, true); + } + + return true; + } + }); } private boolean isInternalNavigation(String href) { From a9b7fc3f57666b92f31b37951ce5ea710c15482a Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Thu, 16 May 2013 18:11:07 +0200 Subject: [PATCH 20/61] formatting --- .../webapp/client/GWTProjectEntryPoint.java | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 25c438c3a..098a7be71 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -25,7 +25,6 @@ import static com.google.gwt.query.client.GQuery.$; import static com.google.gwt.query.client.GQuery.body; -import static com.google.gwt.query.client.GQuery.get; public class GWTProjectEntryPoint implements EntryPoint { private static final RegExp INTERNAL_URL_REGEX; @@ -75,30 +74,30 @@ private void enhanceMenu() { public void f(Element e) { toggleMenu($(e).parent()); - getEvent().stopPropagation(); - getEvent().preventDefault(); + getEvent().stopPropagation(); + getEvent().preventDefault(); } }); $("#gwt-toc li.folder > ul").css("display", "none"); $("a", body).live(Event.ONCLICK, new Function() { - @Override - public boolean f(Event event) { - String href = null; - if (getElement().hasAttribute("ahref")) { - href = getElement().getAttribute("ahref"); - } else { - href = getElement().getAttribute("href"); - } - - if (isInternalNavigation(href)) { - return loadPage(href, true); - } - - return true; - } - }); + @Override + public boolean f(Event event) { + String href = null; + if (getElement().hasAttribute("ahref")) { + href = getElement().getAttribute("ahref"); + } else { + href = getElement().getAttribute("href"); + } + + if (isInternalNavigation(href)) { + return loadPage(href, true); + } + + return true; + } + }); } private boolean isInternalNavigation(String href) { From 496f991091094f88e5fd310463ea7b301cd135e0 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Thu, 16 May 2013 23:34:47 +0200 Subject: [PATCH 21/61] remove security contraint --- src/main/webapp/WEB-INF/web.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 44c3d17ba..870470fd6 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -23,14 +23,14 @@ com.google.gwt.site.webapp.server.guice.GuiceServletConfig - - - /* - - - * - - + + + + + + + + From a177bf0bca4cb11493d8de4651fe0093989b45cf Mon Sep 17 00:00:00 2001 From: jdramaix Date: Fri, 17 May 2013 13:40:17 -0700 Subject: [PATCH 22/61] fix issue with images having relative url. Issue : We load the content of pages by using ajax and we push the new content in the dom before to change the url. Some pages like the home page have image defined by a relative url. As the url is not the good one when we put the content in the DOM, the images are displayed as broken. To reproduce the issue just click on an article (article -> overview) then click on the home link of the top menu. The images are not displayed correctly. Refresh the browser, the images appears. Change-Id: I72a2997d9e6400b97b5e11da05dfd282d17882ff --- .../gwt/site/webapp/client/GWTProjectEntryPoint.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 098a7be71..4c5b062dd 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -128,13 +128,14 @@ private boolean loadPage(final String pageUrl, final boolean pushState) { if (supportsHtml5History() && !path.equals(currentPage)) { currentPage = path; + if (pushState) { + pushState(pageUrl); + } + $("#gwt-content").load(pageUrl + " #gwt-content > div", null, new Function() { @Override public void f() { - if (pushState) { - pushState(pageUrl); - } if (hash != null) { scrollTo(hash); } From edae80d15f913e47063a3dbe5a0195a028cded50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Tue, 21 May 2013 16:02:58 +0200 Subject: [PATCH 23/61] Simply code: - Improve sameOrigin regexp. - Protocol should be considered when checking same origin XHR. - Return false instead of calling stopPropagation & preventDefault. - Use gQuery "or" method when getting anchor href. - Use gQuery toggleClass method instead of if/else block. - Formating: replacing tab with space Change-Id: Idd8f779601d301c8fa67dc0d05e7f30de611ba79 --- .../webapp/client/GWTProjectEntryPoint.java | 288 +++++++++--------- 1 file changed, 136 insertions(+), 152 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 4c5b062dd..cbff2ab8d 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -1,12 +1,12 @@ /* * Copyright 2013 Daniel Kurka - * + * * 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 @@ -15,162 +15,146 @@ */ package com.google.gwt.site.webapp.client; +import static com.google.gwt.query.client.GQuery.*; + import com.google.gwt.core.client.EntryPoint; -import com.google.gwt.dom.client.Element; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQuery; +import com.google.gwt.query.client.js.JsUtils; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; -import static com.google.gwt.query.client.GQuery.$; -import static com.google.gwt.query.client.GQuery.body; - public class GWTProjectEntryPoint implements EntryPoint { - private static final RegExp INTERNAL_URL_REGEX; - private static final RegExp NOT_RELATIVE_URL_REGEX; - - static { - String domainUrl = Window.Location.getHostName(); - String port = Window.Location.getPort(); - - if (port != null && port.length() > 0) { - domainUrl += ":" + port; - } - - INTERNAL_URL_REGEX = RegExp.compile("^(https?)\\:\\/\\/" + domainUrl - + "\\/.*$"); - NOT_RELATIVE_URL_REGEX = RegExp - .compile("^(https?)|(mailto)|(ftp)|(javascript)\\:.*$"); - } - - private String currentPage; - - @Override - public void onModuleLoad() { - enhanceMenu(); - - openMenu(Window.Location.getPath()); - - if (supportsHtml5History()) { - initOnPopState(); - } - } - - private void openMenu(String path) { - $("#gwt-toc a.selected").removeClass("selected"); - - if (path != null && path.length() > 0) { - $("#gwt-toc a[ahref$='" + path + "']").addClass("selected") - .parentsUntil("#gwt-toc").filter("li.folder") - .addClass("open").children("ul").slideDown(200); - } - } - - private void enhanceMenu() { - // TODO : arrow should be clickable - $("li.folder > a").click(new Function() { - @Override - public void f(Element e) { - toggleMenu($(e).parent()); - - getEvent().stopPropagation(); - getEvent().preventDefault(); - } - }); - - $("#gwt-toc li.folder > ul").css("display", "none"); - - $("a", body).live(Event.ONCLICK, new Function() { - @Override - public boolean f(Event event) { - String href = null; - if (getElement().hasAttribute("ahref")) { - href = getElement().getAttribute("ahref"); - } else { - href = getElement().getAttribute("href"); - } - - if (isInternalNavigation(href)) { - return loadPage(href, true); - } - - return true; - } - }); - } - - private boolean isInternalNavigation(String href) { - // TODO mix the three last conditions in one regex !! - return href != null - && href.length() > 0 - && (!href.startsWith("#") && !NOT_RELATIVE_URL_REGEX.test(href) || INTERNAL_URL_REGEX - .test(href)); - } - - private void toggleMenu(GQuery menu) { - if (menu.hasClass("open")) { - menu.removeClass("open"); - } else { - menu.addClass("open"); - } - - menu.children("ul").slideToggle(200); - } - - private boolean loadPage(final String pageUrl, final boolean pushState) { - int hashIndex = pageUrl.indexOf('#'); - final String path = hashIndex != -1 ? pageUrl.substring(0, hashIndex) - : pageUrl; - final String hash = hashIndex != -1 ? pageUrl.substring(hashIndex) - : null; - - if (supportsHtml5History() && !path.equals(currentPage)) { - currentPage = path; - - if (pushState) { - pushState(pageUrl); - } - $("#gwt-content").load(pageUrl + " #gwt-content > div", null, - new Function() { - @Override - public void f() { - if (hash != null) { - scrollTo(hash); - } - openMenu(path); - } - }); - - return false; - } else if (hash != null) { - scrollTo(hash); - } - - return !path.equals(currentPage); - } - - private void scrollTo(String hash) { - Window.scrollTo(Window.getScrollLeft(), $(hash).offset().top); - } - - private void onPopState() { - loadPage(Window.Location.getPath(), false); - } - - private native void pushState(String url) /*-{ - $wnd.history.pushState(null, null, url); - }-*/; - - private native boolean supportsHtml5History()/*-{ - return !!($wnd.history && $wnd.history.pushState); - }-*/; - - private native void initOnPopState() /*-{ - var that = this; - $wnd.onpopstate = $entry(function(e) { - that.@com.google.gwt.site.webapp.client.GWTProjectEntryPoint::onPopState()(); - }); - }-*/; + private static final RegExp isSameOriginRexp; + + static { + // XHR must match all: protocol, host and port. + // Note: in chrome this could be simpler since it has window.location.origin + String origin = Window.Location.getProtocol() + "//" + Window.Location.getHostName(); + String port = Window.Location.getPort(); + if (port != null && port.length() > 0) { + origin += ":" + port; + } + // We discard links with a different origin, and hash links. + isSameOriginRexp = RegExp.compile("^" + origin + "|^(?!(https?|mailto|ftp|javascript):|#).+", "i"); + } + + private String currentPage; + + @Override + public void onModuleLoad() { + enhanceMenu(); + + openMenu(Window.Location.getPath()); + + if (supportsHtml5History()) { + initOnPopState(); + } + } + + private void openMenu(String path) { + $("#gwt-toc a.selected").removeClass("selected"); + + if (path != null && path.length() > 0) { + $("#gwt-toc a[ahref$='" + path + "']") + .addClass("selected") + .parentsUntil("#gwt-toc") + .filter("li.folder") + .addClass("open") + .children("ul") + .slideDown(200); + } + } + + private void enhanceMenu() { + $("li.folder > a").click(new Function() { + @Override + public boolean f(Event e) { + toggleMenu($(e).parent()); + return false; + } + }); + + $("#gwt-toc li.folder > ul").hide(); + + $("a", body).live(Event.ONCLICK, new Function() { + @Override + public boolean f(Event e) { + // Sometimes the link src comes in the 'ahref' attribute + String href = JsUtils.or($(e).attr("ahref"), $(e).attr("href")); + + // if loadPage returns true we don't stop propagation nor default + return loadPage(href, true); + } + }); + } + + private void toggleMenu(GQuery menu) { + menu.toggleClass("open") + .children("ul") + .slideToggle(200); + } + + private boolean loadPage(final String pageUrl, final boolean pushState) { + + if (!isSameOriginRexp.test(pageUrl)) { + return true; + } + + int hashIndex = pageUrl.indexOf('#'); + final String path = hashIndex != -1 ? pageUrl.substring(0, hashIndex) + : pageUrl; + final String hash = hashIndex != -1 ? pageUrl.substring(hashIndex) + : null; + + if (supportsHtml5History() && !path.equals(currentPage)) { + currentPage = path; + + if (pushState) { + pushState(pageUrl); + } + + $("#gwt-content").load(pageUrl + " #gwt-content > div", null, + new Function() { + @Override + public void f() { + if (hash != null) { + scrollTo(hash); + } + openMenu(path); + } + }); + + return false; + } else if (hash != null) { + scrollTo(hash); + } + + return !path.equals(currentPage); + } + + private void scrollTo(String hash) { + Window.scrollTo(Window.getScrollLeft(), $(hash).offset().top); + } + + private void onPopState() { + loadPage(Window.Location.getPath(), false); + } + + private native void pushState(String url) /*-{ + $wnd.history.pushState(null, null, url); + }-*/; + + private native boolean supportsHtml5History()/*-{ + return !!($wnd.history && $wnd.history.pushState); + }-*/; + + private native void initOnPopState() /*-{ + var that = this; + $wnd.onpopstate = $entry(function(e) { + that.@com.google.gwt.site.webapp.client.GWTProjectEntryPoint::onPopState()(); + }); + }-*/; } From fc953fa1301173a2888f7183b7b3862fc702c7b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Tue, 21 May 2013 21:07:53 +0200 Subject: [PATCH 24/61] A little more simplifications: - Replace jsni functions with gQuery helper methods. - Use scrollIntoView instead of computing offsets of anchors in code. Change-Id: Ib419844aadd7d6a389a8d91c2a20194d7c110512 --- .../webapp/client/GWTProjectEntryPoint.java | 48 +++++++------------ 1 file changed, 17 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index cbff2ab8d..961f91da0 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -20,6 +20,7 @@ import com.google.gwt.core.client.EntryPoint; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQuery; +import com.google.gwt.query.client.Properties; import com.google.gwt.query.client.js.JsUtils; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.Event; @@ -28,7 +29,6 @@ public class GWTProjectEntryPoint implements EntryPoint { private static final RegExp isSameOriginRexp; - static { // XHR must match all: protocol, host and port. // Note: in chrome this could be simpler since it has window.location.origin @@ -42,6 +42,8 @@ public class GWTProjectEntryPoint implements EntryPoint { } private String currentPage; + private static Properties history = JsUtils.prop(window, "history"); + private static boolean isPushstateCapable = $(history).prop("pushState") != null; @Override public void onModuleLoad() { @@ -49,9 +51,7 @@ public void onModuleLoad() { openMenu(Window.Location.getPath()); - if (supportsHtml5History()) { - initOnPopState(); - } + bindPopState(); } private void openMenu(String path) { @@ -98,7 +98,6 @@ private void toggleMenu(GQuery menu) { } private boolean loadPage(final String pageUrl, final boolean pushState) { - if (!isSameOriginRexp.test(pageUrl)) { return true; } @@ -109,11 +108,11 @@ private boolean loadPage(final String pageUrl, final boolean pushState) { final String hash = hashIndex != -1 ? pageUrl.substring(hashIndex) : null; - if (supportsHtml5History() && !path.equals(currentPage)) { + if (isPushstateCapable && !path.equals(currentPage)) { currentPage = path; if (pushState) { - pushState(pageUrl); + JsUtils.runJavascriptFunction(history, "pushState", null, null, pageUrl); } $("#gwt-content").load(pageUrl + " #gwt-content > div", null, @@ -121,40 +120,27 @@ private boolean loadPage(final String pageUrl, final boolean pushState) { @Override public void f() { if (hash != null) { - scrollTo(hash); + $(hash).scrollIntoView(); } openMenu(path); } }); - return false; } else if (hash != null) { - scrollTo(hash); + $(hash).scrollIntoView(); } return !path.equals(currentPage); } - private void scrollTo(String hash) { - Window.scrollTo(Window.getScrollLeft(), $(hash).offset().top); - } - - private void onPopState() { - loadPage(Window.Location.getPath(), false); + private void bindPopState() { + if (isPushstateCapable) { + // Note: gQuery will support $(window).on("popstate", function) in future releases. + window.cast().setFunction("onpopstate", new Function() { + public void f() { + loadPage(Window.Location.getPath(), false); + }; + }); + } } - - private native void pushState(String url) /*-{ - $wnd.history.pushState(null, null, url); - }-*/; - - private native boolean supportsHtml5History()/*-{ - return !!($wnd.history && $wnd.history.pushState); - }-*/; - - private native void initOnPopState() /*-{ - var that = this; - $wnd.onpopstate = $entry(function(e) { - that.@com.google.gwt.site.webapp.client.GWTProjectEntryPoint::onPopState()(); - }); - }-*/; } From c8cf7ad440cea6aac134d8d574d33b9449ad9bb1 Mon Sep 17 00:00:00 2001 From: jdramaix Date: Wed, 22 May 2013 11:02:04 +0200 Subject: [PATCH 25/61] Several fixes : - handle links with protocol-agnostic url ex: href="//developers.google.com/appengine" - handle correctly link with relative url (../docs/myarticle.html) - fragment identifier can be defined via an id or via the name attribute - fix bug in the isPushStateCapable computation Change-Id: I7f850e9ce8b8e62596d5e9df30d66224b0f1dfd4 --- .../webapp/client/GWTProjectEntryPoint.java | 100 ++++++++++-------- 1 file changed, 55 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 961f91da0..a9cd086b8 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -15,8 +15,6 @@ */ package com.google.gwt.site.webapp.client; -import static com.google.gwt.query.client.GQuery.*; - import com.google.gwt.core.client.EntryPoint; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQuery; @@ -26,46 +24,51 @@ import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; +import static com.google.gwt.query.client.GQuery.$; +import static com.google.gwt.query.client.GQuery.body; +import static com.google.gwt.query.client.GQuery.window; + public class GWTProjectEntryPoint implements EntryPoint { private static final RegExp isSameOriginRexp; + private static Properties history = JsUtils.prop(window, "history"); + private static boolean isPushstateCapable = history.get("pushState") != null; static { // XHR must match all: protocol, host and port. // Note: in chrome this could be simpler since it has window.location.origin - String origin = Window.Location.getProtocol() + "//" + Window.Location.getHostName(); + String origin = Window.Location.getProtocol() + "//" + Window.Location.getHostName(); String port = Window.Location.getPort(); if (port != null && port.length() > 0) { origin += ":" + port; } - // We discard links with a different origin, and hash links. - isSameOriginRexp = RegExp.compile("^" + origin + "|^(?!(https?|mailto|ftp|javascript):|#).+", "i"); + // We discard links with a different origin, hash links and protocol-agnostic urls. + isSameOriginRexp = RegExp.compile("^" + origin + "|^(?!(https?|mailto|ftp|javascript):|#|//).+", "i"); } - private String currentPage; - private static Properties history = JsUtils.prop(window, "history"); - private static boolean isPushstateCapable = $(history).prop("pushState") != null; @Override public void onModuleLoad() { enhanceMenu(); - openMenu(Window.Location.getPath()); + openMenu(); + + maybeBindPopState(); - bindPopState(); + currentPage = Window.Location.getPath(); } - private void openMenu(String path) { + private void openMenu() { $("#gwt-toc a.selected").removeClass("selected"); - if (path != null && path.length() > 0) { - $("#gwt-toc a[ahref$='" + path + "']") + String path = Window.Location.getPath(); + + $("#gwt-toc a[ahref$='" + path + "']") .addClass("selected") .parentsUntil("#gwt-toc") .filter("li.folder") .addClass("open") .children("ul") .slideDown(200); - } } private void enhanceMenu() { @@ -85,8 +88,11 @@ public boolean f(Event e) { // Sometimes the link src comes in the 'ahref' attribute String href = JsUtils.or($(e).attr("ahref"), $(e).attr("href")); - // if loadPage returns true we don't stop propagation nor default - return loadPage(href, true); + if (isPushstateCapable && isSameOriginRexp.test(href)) { + loadPage(href); + return false; + } + return true; } }); } @@ -97,50 +103,54 @@ private void toggleMenu(GQuery menu) { .slideToggle(200); } - private boolean loadPage(final String pageUrl, final boolean pushState) { - if (!isSameOriginRexp.test(pageUrl)) { - return true; + private void loadPage(String pageUrl) { + if (pageUrl != null) { + JsUtils.runJavascriptFunction(history, "pushState", null, null, pageUrl); } - int hashIndex = pageUrl.indexOf('#'); - final String path = hashIndex != -1 ? pageUrl.substring(0, hashIndex) - : pageUrl; - final String hash = hashIndex != -1 ? pageUrl.substring(hashIndex) - : null; + String path = Window.Location.getPath(); + final String hash = Window.Location.getHash(); - if (isPushstateCapable && !path.equals(currentPage)) { + if (!path.equals(currentPage)) { currentPage = path; - if (pushState) { - JsUtils.runJavascriptFunction(history, "pushState", null, null, pageUrl); - } - - $("#gwt-content").load(pageUrl + " #gwt-content > div", null, + $("#gwt-content").load(path + " #gwt-content > div", null, new Function() { @Override public void f() { - if (hash != null) { - $(hash).scrollIntoView(); - } - openMenu(path); + scrollTo(hash); + openMenu(); } }); - } else if (hash != null) { - $(hash).scrollIntoView(); + } else { + scrollTo(hash); } + } + + private void scrollTo(String hash) { + if (hash == null || hash.length() == 0) { + Window.scrollTo(0, 0); + } else { + GQuery anchor = $(hash); + if (anchor.isEmpty()) { + anchor = $("[name='" + hash.substring(1) + "']"); + } - return !path.equals(currentPage); + anchor.scrollIntoView(); + } } - private void bindPopState() { - if (isPushstateCapable) { - // Note: gQuery will support $(window).on("popstate", function) in future releases. - window.cast().setFunction("onpopstate", new Function() { - public void f() { - loadPage(Window.Location.getPath(), false); - }; - }); + private void maybeBindPopState() { + if (!isPushstateCapable) { + return; } + + // Note: gQuery will support $(window).on("popstate", function) in future releases. + window.cast().setFunction("onpopstate", new Function() { + public void f() { + loadPage(null); + }; + }); } } From d9e1a040f704eb115bf5782b741147c10f775ad2 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Thu, 30 May 2013 21:54:04 +0200 Subject: [PATCH 26/61] handle jpeg correctly Change-Id: I3db725b7a8260d8ce3bfbd7ac586d07f31f7e244 --- .../gwt/site/webapp/server/resources/ContentServlet.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index 9d98ffc6c..9abf45724 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -64,7 +64,6 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) resp.getWriter().write(html); } - } private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPath) { @@ -88,7 +87,7 @@ private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPat return; } - if (fullPath.endsWith(".jpg")) { + if (fullPath.endsWith(".jpg") || fullPath.endsWith(".jpeg")) { resp.setContentType("image/jpg"); return; } @@ -99,11 +98,11 @@ private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPat } // TODO: what is a good default value? - } private boolean isBinaryFile(String path) { - return path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".gif"); + return path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".jpeg") + || path.endsWith(".gif"); } private String normalizePath(String fullPath) { @@ -113,7 +112,7 @@ private String normalizePath(String fullPath) { if ("".equals(fullPath) || fullPath.endsWith("/")) { fullPath += "index.html"; } - + return fullPath; } } From 4400c372a2bdbb654e6bbb5487f57eb782f89a4d Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Mon, 1 Jul 2013 21:22:49 +0200 Subject: [PATCH 27/61] Handle url pattern from developers.google.com Devsite does not have a file extension for resources (like .html). Redirects will therefore not hit a valid resource. Sending a HTTP 301 to the real resource. Change-Id: I762a6c92e26d708ee53455d9944e703c11858041 --- .../server/resources/ContentServlet.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index 9abf45724..20d45a2c5 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -36,18 +36,26 @@ public class ContentServlet extends HttpServlet { private static final long serialVersionUID = 458719890608890896L; @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) - throws ServletException, IOException { - - DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, + IOException { String fullPath = normalizePath(req.getRequestURI()); - Key key = KeyFactory.createKey("DocModel", fullPath); - Query query = new Query("DocModel", key); - Entity e = datastore.prepare(query).asSingleEntity(); + Entity e = getResourceByKey(fullPath); if (e == null) { + // temporary try to find the resource with .html appended + // due to redirects from developers.google.com + if (!fullPath.endsWith("/")) { + fullPath = fullPath + ".html"; + e = getResourceByKey(fullPath); + if (e != null) { + // redirect so we use correct urls! + resp.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); + resp.setHeader("Location", "/" + fullPath); + return; + } + } resp.sendError(404); return; } @@ -62,10 +70,16 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) } else { resp.getWriter().write(html); - } } + private Entity getResourceByKey(String key) { + DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + Key keyInstance = KeyFactory.createKey("DocModel", key); + Query query = new Query("DocModel", keyInstance); + return datastore.prepare(query).asSingleEntity(); + } + private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPath) { if (fullPath.endsWith(".html")) { From 71702a1da769e32e11d84986a12187048139eef3 Mon Sep 17 00:00:00 2001 From: Katharina Fahnenbruck Date: Sat, 13 Jul 2013 13:33:39 +0200 Subject: [PATCH 28/61] Removed OS and IDE specific ignores Change-Id: I73b59fa59b38f5e7f124f6fb7f64a85d87f09498 --- .gitignore | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/.gitignore b/.gitignore index 760004a2a..2f7896d1d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,19 +1 @@ -hotspot.log -*.iml -*.ipr -*.iws target/ -classes/ -/var -pom.xml.versionsBackup -test-output/ -/atlassian-ide-plugin.xml -.idea -.DS_Store -.classpath -.settings -.project -temp-testng-customsuite.xml -test-output -.externalToolBuilders -*~ From 5f846bfd81ce52fbef3e42fca66ad6bf17dff6f7 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Mon, 22 Jul 2013 12:10:02 +0200 Subject: [PATCH 29/61] Fix async page loading to not include javadoc fixes issue 8273 8274 Change-Id: I0d63d9737ce269901ade254561ed8af4edef0aa2 --- .../google/gwt/site/webapp/client/GWTProjectEntryPoint.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index a9cd086b8..08295fd9d 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -88,6 +88,11 @@ public boolean f(Event e) { // Sometimes the link src comes in the 'ahref' attribute String href = JsUtils.or($(e).attr("ahref"), $(e).attr("href")); + //do not load javadoc async + if(href.startsWith("/javadoc/")) { + return true; + } + if (isPushstateCapable && isSameOriginRexp.test(href)) { loadPage(href); return false; From 71c745e382a90f1230364f4b50f0b0a4edf0b2c8 Mon Sep 17 00:00:00 2001 From: Katharina Fahnenbruck Date: Sun, 11 Aug 2013 17:31:11 +0200 Subject: [PATCH 30/61] added a servlet to export resource hashes Change-Id: Ib809a155af2551703e25073a04b1388ea3d3b41f --- pom.xml | 5 ++ .../webapp/server/guice/MyServletModule.java | 3 + .../webapp/server/resources/HashServlet.java | 68 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java diff --git a/pom.xml b/pom.xml index 280b3646f..74c230d87 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,11 @@ jersey-grizzly2 1.9 + + org.json + json + 20090211 + commons-codec diff --git a/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java index c705df760..d0b84f726 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java +++ b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java @@ -17,6 +17,7 @@ import com.google.apphosting.utils.remoteapi.RemoteApiServlet; import com.google.gwt.site.webapp.server.resources.ContentServlet; +import com.google.gwt.site.webapp.server.resources.HashServlet; import com.google.inject.Singleton; import com.google.inject.servlet.ServletModule; @@ -31,8 +32,10 @@ protected void configureServlets() { //docs bind(RemoteApiServlet.class).in(Singleton.class); bind(ContentServlet.class).in(Singleton.class); + bind(HashServlet.class).in(Singleton.class); serve("/remote_api").with( RemoteApiServlet.class); + serve("/hash").with( HashServlet.class); serve("/*").with( ContentServlet.class); // Map params = new HashMap(); diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java new file mode 100644 index 000000000..53a2c176f --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java @@ -0,0 +1,68 @@ +package com.google.gwt.site.webapp.server.resources; + +import com.google.appengine.api.datastore.DatastoreService; +import com.google.appengine.api.datastore.DatastoreServiceFactory; +import com.google.appengine.api.datastore.Entity; +import com.google.appengine.api.datastore.FetchOptions; +import com.google.appengine.api.datastore.PreparedQuery; +import com.google.appengine.api.datastore.Query; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class HashServlet extends HttpServlet { + + private static final long serialVersionUID = -8648249883829261848L; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, + IOException { + + int count; + try { + count = Integer.parseInt(req.getParameter("count")); + } catch (NumberFormatException e) { + throw new ServletException(e); + } + + if (count < 0) { + throw new ServletException("invalid value count " + count); + } + + JSONObject root = new JSONObject(); + + DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); + + PreparedQuery pq = ds.prepare(new Query("DocHash")); + + List asList = pq.asList(FetchOptions.Builder.withOffset(count).limit(1000)); + JSONArray array = new JSONArray(); + + try { + root.put("hashes", array); + for (Entity entity : asList) { + count++; + String key = entity.getKey().getName(); + String hash = (String) entity.getProperty("hash"); + + JSONObject docHash = new JSONObject(); + docHash.put("key", key); + docHash.put("hash", hash); + array.put(docHash); + } + + resp.getWriter().write(root.toString()); + } catch (JSONException e) { + throw new ServletException(e); + } + } +} From a6eca9f39212ad7c6765838e06e4cda45c0ff66d Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Tue, 3 Sep 2013 16:19:23 +0200 Subject: [PATCH 31/61] Update to latest app engine version. Change-Id: I334e3e97ba190387987ee08bd4dcdd35e13f4572 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 74c230d87..052314abd 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ 1 - 1.7.6 + 1.8.3 UTF-8 2.5.1 1.3.2 From 7b5ec29e6fa0497a4db7449b6a31db76bba09e95 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Wed, 4 Sep 2013 10:29:03 +0200 Subject: [PATCH 32/61] Allow links to be ignored by enhancement. Change-Id: Ie75db3953ab0de599ae2d4774c6a2594bdc151dd --- .../gwt/site/webapp/client/GWTProjectEntryPoint.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 08295fd9d..50d3de0c0 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -85,10 +85,16 @@ public boolean f(Event e) { $("a", body).live(Event.ONCLICK, new Function() { @Override public boolean f(Event e) { + // do not load links that are marked as full page reload + String async = $(e).attr("data-full-load"); + if("true".equals(async)) { + return true; + } + // Sometimes the link src comes in the 'ahref' attribute String href = JsUtils.or($(e).attr("ahref"), $(e).attr("href")); - //do not load javadoc async + //do not load javadoc async if(href.startsWith("/javadoc/")) { return true; } From c2711c4b72fad7b0154a1414f8a458adb185f9d9 Mon Sep 17 00:00:00 2001 From: Daniel Kurka Date: Tue, 3 Sep 2013 12:16:51 +0200 Subject: [PATCH 33/61] Fix warnings. Change-Id: I98f8ea3f69befe2d3642bbb2f158ab62c5a7a575 --- .../google/gwt/site/webapp/client/GWTProjectEntryPoint.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 50d3de0c0..67f5fb81c 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -159,9 +159,10 @@ private void maybeBindPopState() { // Note: gQuery will support $(window).on("popstate", function) in future releases. window.cast().setFunction("onpopstate", new Function() { + @Override public void f() { loadPage(null); - }; + } }); } } From 2e44942e43a62d01cf1ada3c5c5a2c5bf3015d33 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 15 Oct 2013 09:33:34 -0500 Subject: [PATCH 34/61] Setting the content-type of the javadoc package-list file to text/plain Change-Id: Ib4d186bc024a1c0f4a35cd9446d5a3f92d3ff5c7 --- .../gwt/site/webapp/server/resources/ContentServlet.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index 20d45a2c5..3bccaae5f 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -111,6 +111,11 @@ private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPat return; } + if (fullPath.endsWith("/package-list")) { + resp.setContentType("text/plain"); + return; + } + // TODO: what is a good default value? } From 423256d63e17eb9e117c61d2ba6ad4adbf32b15f Mon Sep 17 00:00:00 2001 From: Brian Slesinsky Date: Sun, 8 Dec 2013 22:29:43 -0800 Subject: [PATCH 35/61] update gwtproject.org so it can be used to demo sourcemap debugging Upgraded to 2.6.0rc3 and switched to draft mode. Tried to switch to pretty mode but it's not being picked up. Change-Id: I93d315a33a3fdaab2d5db2f31cfba451beb3383d --- pom.xml | 25 ++++++++++++++++--- .../google/gwt/site/webapp/GWTProject.gwt.xml | 5 ++++ src/main/webapp/WEB-INF/appengine-web.xml | 2 +- 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 052314abd..b0015b3a7 100644 --- a/pom.xml +++ b/pom.xml @@ -15,9 +15,9 @@ 1 - 1.8.3 + 1.8.8 UTF-8 - 2.5.1 + 2.6.0-rc3 1.3.2 @@ -164,6 +164,19 @@ true WEB-INF + + + ${basedir}/target/extra/gwtproject/src + src + + + + ${basedir}/target/extra/gwtproject/symbolMaps + + *.json + + src + @@ -172,6 +185,9 @@ com.google.appengine appengine-maven-plugin ${appengine.target.version} + +
0.0.0.0
+
@@ -244,13 +260,16 @@ org.codehaus.mojo gwt-maven-plugin - 2.5.1 + 2.6.0-rc3 com.google.gwt.site.webapp.GWTProject index.html true + true + true + compile diff --git a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml index 23f07c4b0..d3a6b5308 100644 --- a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml +++ b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml @@ -8,4 +8,9 @@ + + + + diff --git a/src/main/webapp/WEB-INF/appengine-web.xml b/src/main/webapp/WEB-INF/appengine-web.xml index f44cd5319..2e0718528 100644 --- a/src/main/webapp/WEB-INF/appengine-web.xml +++ b/src/main/webapp/WEB-INF/appengine-web.xml @@ -1,7 +1,7 @@ gwtproject-demo - 1 + draft true From c1e26aa217c6a634f2150d81cb16d2f6fec6f169 Mon Sep 17 00:00:00 2001 From: jdramaix Date: Thu, 3 Apr 2014 14:00:58 +0200 Subject: [PATCH 36/61] Fix issue when user try to open a link in a new tab/window. Do not load the content of page by ajax when user try to open the page in a new tab/window by clicking in the middle/right button of the mouse or by using crtl-click/cmd-click/shift-click Bug: issue 8265 Change-Id: Ic65dbfdb054be9eb9e3cd1fbd21ae01fa7acc6b5 --- .../webapp/client/GWTProjectEntryPoint.java | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 67f5fb81c..800050742 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -16,6 +16,7 @@ package com.google.gwt.site.webapp.client; import com.google.gwt.core.client.EntryPoint; +import com.google.gwt.core.client.GWT; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQuery; import com.google.gwt.query.client.Properties; @@ -23,6 +24,7 @@ import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; +import com.google.gwt.user.client.ui.impl.HyperlinkImpl; import static com.google.gwt.query.client.GQuery.$; import static com.google.gwt.query.client.GQuery.body; @@ -31,8 +33,10 @@ public class GWTProjectEntryPoint implements EntryPoint { private static final RegExp isSameOriginRexp; + private static final HyperlinkImpl clickHelper = GWT.create(HyperlinkImpl.class); private static Properties history = JsUtils.prop(window, "history"); private static boolean isPushstateCapable = history.get("pushState") != null; + static { // XHR must match all: protocol, host and port. // Note: in chrome this could be simpler since it has window.location.origin @@ -44,6 +48,7 @@ public class GWTProjectEntryPoint implements EntryPoint { // We discard links with a different origin, hash links and protocol-agnostic urls. isSameOriginRexp = RegExp.compile("^" + origin + "|^(?!(https?|mailto|ftp|javascript):|#|//).+", "i"); } + private String currentPage; @Override @@ -85,21 +90,8 @@ public boolean f(Event e) { $("a", body).live(Event.ONCLICK, new Function() { @Override public boolean f(Event e) { - // do not load links that are marked as full page reload - String async = $(e).attr("data-full-load"); - if("true".equals(async)) { - return true; - } - - // Sometimes the link src comes in the 'ahref' attribute - String href = JsUtils.or($(e).attr("ahref"), $(e).attr("href")); - - //do not load javadoc async - if(href.startsWith("/javadoc/")) { - return true; - } - - if (isPushstateCapable && isSameOriginRexp.test(href)) { + String href = getHref($(e)); + if (shouldEnhanceClick(e) && isPushstateCapable && isSameOriginRexp.test(href)) { loadPage(href); return false; } @@ -108,6 +100,34 @@ public boolean f(Event e) { }); } + private boolean shouldEnhanceClick(Event e) { + GQuery link = $(e); + + // Is it a normal click (not ctrl/cmd/shift/right/middle click) ? + if (!clickHelper.handleAsClick(e)) { + return false; + } + + // do not load links that are marked as full page reload + if ("true".equals(link.attr("data-full-load"))) { + return false; + } + + // do not load javadoc async + if (getHref(link).startsWith("/javadoc/")) { + return false; + } + + return true; + } + + /** + * Sometimes the link src comes in the 'ahref' attribute + */ + private String getHref(GQuery link) { + return JsUtils.or(link.attr("ahref"), link.attr("href")); + } + private void toggleMenu(GQuery menu) { menu.toggleClass("open") .children("ul") From 1b16b454a110292a57b545f17feb71fc4d902ec6 Mon Sep 17 00:00:00 2001 From: Brian Slesinsky Date: Thu, 17 Apr 2014 19:43:14 -0700 Subject: [PATCH 37/61] make generated JavaScript easier to debug Turn off installcode so that the cache.js file is straight JavaScript. Also, upgrade to 2.6 final. Change-Id: I16c68ead119801df4c2ff118c68cc196ca1cdf0c --- pom.xml | 4 ++-- src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index b0015b3a7..3479d4309 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ 1 1.8.8 UTF-8 - 2.6.0-rc3 + 2.6.0 1.3.2
@@ -260,7 +260,7 @@ org.codehaus.mojo gwt-maven-plugin - 2.6.0-rc3 + ${gwtversion} diff --git a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml index d3a6b5308..e7631d9d7 100644 --- a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml +++ b/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml @@ -13,4 +13,8 @@ + + + + From 64221b9db452921f18175184c886287a292e2697 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Tue, 22 Apr 2014 08:34:56 +0200 Subject: [PATCH 38/61] Changes in menu to support latest menu changes. - Updated gQuery version - Use on/off instead of bind/live/click deprecated api. - Use css3 animations through gquery. - Expand/Collapse when clicking on the arrow like GWT tree does. - Work in any webserver context, and in filesystem. - Almost rewritten code so as we can simply regexp and remove usage of absolute attributes. Bugs: #8235 #8236 #8629 #8707 Change-Id: I19df8de2d6d20d93796132a4fecc2ddec4dcb536 --- pom.xml | 530 +++++++++--------- .../webapp/client/GWTProjectEntryPoint.java | 248 ++++---- .../com/google/gwt/site/webapp/Test.gwt.xml | 4 + .../client/GWTProjectEntryPointTest.java | 21 + .../client/JREProjectEntryPointTest.java | 61 ++ 5 files changed, 505 insertions(+), 359 deletions(-) create mode 100644 src/test/java/com/google/gwt/site/webapp/Test.gwt.xml create mode 100644 src/test/java/com/google/gwt/site/webapp/client/GWTProjectEntryPointTest.java create mode 100644 src/test/java/com/google/gwt/site/webapp/client/JREProjectEntryPointTest.java diff --git a/pom.xml b/pom.xml index 3479d4309..afc321aeb 100644 --- a/pom.xml +++ b/pom.xml @@ -1,135 +1,141 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - 4.0.0 - com.google.gwt.site.webapp - gwt-site-webapp - 1.0-SNAPSHOT - war + 4.0.0 + com.google.gwt.site.webapp + gwt-site-webapp + 1.0-SNAPSHOT + war + + 1 + 1.8.8 + UTF-8 + 2.6.0 + 1.4.2 + + + + + com.google.appengine + appengine-api-1.0-sdk + ${appengine.target.version} + + + javax.servlet + servlet-api + 2.5 + provided + + + jstl + jstl + 1.2 + + + com.sun.jersey + jersey-server + 1.9 + + + com.sun.jersey + jersey-grizzly2 + 1.9 + + + org.json + json + 20090211 + + + commons-codec + commons-codec + 1.7 + + + + com.google.appengine + appengine-testing + ${appengine.target.version} + test + + + com.google.appengine + appengine-api-stubs + ${appengine.target.version} + test + - - 1 - 1.8.8 - UTF-8 - 2.6.0 - 1.3.2 - - - - - - com.google.appengine - appengine-api-1.0-sdk - ${appengine.target.version} - - - javax.servlet - servlet-api - 2.5 - provided - - - jstl - jstl - 1.2 - - - - com.sun.jersey - jersey-server - 1.9 - - - com.sun.jersey - jersey-grizzly2 - 1.9 - - - org.json - json - 20090211 - - - - commons-codec - commons-codec - 1.7 - - - - - com.google.appengine - appengine-testing - ${appengine.target.version} - test - - - com.google.appengine - appengine-api-stubs - ${appengine.target.version} - test - - - - com.sun.jersey.contribs - jersey-guice - 1.7 - - - - javax.jdo - jdo-api - 3.0.1 - - - org.datanucleus - datanucleus-core - 3.1.1 - runtime - - - org.datanucleus - datanucleus-api-jdo - 3.1.2 - - - com.google.appengine.orm - datanucleus-appengine - 2.1.2 - + + com.sun.jersey.contribs + jersey-guice + 1.7 + - - com.google.gwt - gwt-user - ${gwtversion} - provided - - - javax.validation - validation-api - 1.0.0.GA - provided - - - javax.validation - validation-api - 1.0.0.GA - sources - provided - + + javax.jdo + jdo-api + 3.0.1 + + + org.datanucleus + datanucleus-core + 3.1.1 + runtime + + + org.datanucleus + datanucleus-api-jdo + 3.1.2 + + + com.google.appengine.orm + datanucleus-appengine + 2.1.2 + - - javax.persistence - persistence-api - 1.0 - + + com.google.gwt + gwt-user + ${gwtversion} + provided + + + javax.validation + validation-api + 1.0.0.GA + provided + + + javax.validation + validation-api + 1.0.0.GA + sources + provided + + + javax.persistence + persistence-api + 1.0 + + + junit + junit + 3.8.1 + test + + + com.google.gwt + gwt-dev + ${gwtversion} + test + com.googlecode.gwtquery @@ -137,148 +143,168 @@ ${gwtquery.version} provided - + - - - - org.apache.maven.plugins - 2.5.1 - maven-compiler-plugin - - 1.6 - 1.6 - - + + + + ${basedir}/src/test/java + + + ${basedir}/src/test/resources + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.6 + + + ${basedir}/src/main/java + ${basedir}/src/test/java + + false + + + + org.apache.maven.plugins + 2.5.1 + maven-compiler-plugin + + 1.6 + 1.6 + + - - org.apache.maven.plugins - maven-war-plugin - 2.3 - - - - - - ${basedir}/src/main/webapp/WEB-INF - true - WEB-INF - - - - ${basedir}/target/extra/gwtproject/src - src - - - - ${basedir}/target/extra/gwtproject/symbolMaps - - *.json - - src - - - - + + org.apache.maven.plugins + maven-war-plugin + 2.3 + + + + + + ${basedir}/src/main/webapp/WEB-INF + true + WEB-INF + + + + ${basedir}/target/extra/gwtproject/src + src + + + + ${basedir}/target/extra/gwtproject/symbolMaps + + *.json + + src + + + + - - com.google.appengine - appengine-maven-plugin - ${appengine.target.version} - -
0.0.0.0
-
-
+ + com.google.appengine + appengine-maven-plugin + ${appengine.target.version} + +
0.0.0.0
+
+
- - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 - - true - false - ${project.build.directory}/${project.build.finalName}/WEB-INF/classes - - org.eclipse.jdt.core.javanature - com.google.gdt.eclipse.core.webAppNature - com.google.appengine.eclipse.core.gaeNature - com.google.gwt.eclipse.core.gwtNature - - - org.eclipse.jdt.core.javabuilder - com.google.gdt.eclipse.core.webAppProjectValidator + + true + false + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + + org.eclipse.jdt.core.javanature + com.google.gdt.eclipse.core.webAppNature + com.google.appengine.eclipse.core.gaeNature + com.google.gwt.eclipse.core.gwtNature + + + org.eclipse.jdt.core.javabuilder + com.google.gdt.eclipse.core.webAppProjectValidator - com.google.appengine.eclipse.core.projectValidator - com.google.gwt.eclipse.core.gwtProjectValidator - com.google.appengine.eclipse.core.enhancerbuilder + com.google.appengine.eclipse.core.projectValidator + com.google.gwt.eclipse.core.gwtProjectValidator + com.google.appengine.eclipse.core.enhancerbuilder - - - org.eclipse.jdt.launching.JRE_CONTAINER - com.google.appengine.eclipse.core.GAE_CONTAINER - com.google.gwt.eclipse.core.GWT_CONTAINER - - - com.google.gwt:gwt-servlet - com.google.gwt:gwt-user - com.google.gwt:gwt-dev - javax.validation:validation-api - com.google.appengine:appengine-api-1.0-sdk - com.google.appengine:appengine-api-stubs - com.google.appengine:appengine-testing - org.datanucleus:datanucleus-core - org.datanucleus:datanucleus-enhancer - org.datanucleus:datanucleus-jpa - org.datanucleus:datanucleus-api-jdo - com.google.appengine.orm:datanucleus-appengine - + + + org.eclipse.jdt.launching.JRE_CONTAINER + com.google.appengine.eclipse.core.GAE_CONTAINER + com.google.gwt.eclipse.core.GWT_CONTAINER + + + com.google.gwt:gwt-servlet + com.google.gwt:gwt-user + com.google.gwt:gwt-dev + javax.validation:validation-api + com.google.appengine:appengine-api-1.0-sdk + com.google.appengine:appengine-api-stubs + com.google.appengine:appengine-testing + org.datanucleus:datanucleus-core + org.datanucleus:datanucleus-enhancer + org.datanucleus:datanucleus-jpa + org.datanucleus:datanucleus-api-jdo + com.google.appengine.orm:datanucleus-appengine + - - +
+
- - org.datanucleus - maven-datanucleus-plugin - 3.1.2 - - ${basedir}/log4j.properties - false - false - - - - process-classes - - enhance - - - - + + org.datanucleus + maven-datanucleus-plugin + 3.1.2 + + ${basedir}/log4j.properties + false + false + + + + process-classes + + enhance + + + + - - org.codehaus.mojo - gwt-maven-plugin - ${gwtversion} - - - - com.google.gwt.site.webapp.GWTProject - index.html - true - true - true - - - - compile - test - - - - - -
+ + org.codehaus.mojo + gwt-maven-plugin + ${gwtversion} + + + + com.google.gwt.site.webapp.GWTProject + index.html + true + true + true + + + + compile + test + + + + + + diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 800050742..fff78ff8f 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -15,8 +15,13 @@ */ package com.google.gwt.site.webapp.client; +import static com.google.gwt.query.client.GQuery.$; +import static com.google.gwt.query.client.GQuery.body; +import static com.google.gwt.query.client.GQuery.window; + import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQuery; import com.google.gwt.query.client.Properties; @@ -26,58 +31,67 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.impl.HyperlinkImpl; -import static com.google.gwt.query.client.GQuery.$; -import static com.google.gwt.query.client.GQuery.body; -import static com.google.gwt.query.client.GQuery.window; - public class GWTProjectEntryPoint implements EntryPoint { - private static final RegExp isSameOriginRexp; + private static final int ANIMATION_TIME = 200; + private static final HyperlinkImpl clickHelper = GWT.create(HyperlinkImpl.class); + private static Properties history = JsUtils.prop(window, "history"); - private static boolean isPushstateCapable = history.get("pushState") != null; - static { - // XHR must match all: protocol, host and port. - // Note: in chrome this could be simpler since it has window.location.origin - String origin = Window.Location.getProtocol() + "//" + Window.Location.getHostName(); - String port = Window.Location.getPort(); - if (port != null && port.length() > 0) { - origin += ":" + port; - } - // We discard links with a different origin, hash links and protocol-agnostic urls. - isSameOriginRexp = RegExp.compile("^" + origin + "|^(?!(https?|mailto|ftp|javascript):|#|//).+", "i"); - } + // Visible for testing + // The absolute path to the url root (http://gwtproject.com) + static String origin = GWT.getModuleBaseForStaticFiles() + .replaceFirst("^(\\w+://.+?)/.*", "$1").toLowerCase(); - private String currentPage; + // Visible for testing + // We discard links with different origin, hashes, starting with protocol, javadocs, and media links. + static final RegExp isSameOriginRexp = RegExp.compile("^" + origin + + "|^(?!(#|[a-z#]+:))(?!.*(|/)javadoc/)(?!.*\\.(jpe?g|png|mpe?g|mp[34]|avi)$)", "i"); + + private static boolean isPushstateCapable = history.get("pushState") != null; + private static boolean ajaxEnabled = isPushstateCapable && origin.startsWith("http"); + private static String currentPage = Window.Location.getPath(); @Override public void onModuleLoad() { - enhanceMenu(); - + enhancePage(); + $("#gwt-toc li ul").hide(); openMenu(); - - maybeBindPopState(); - - currentPage = Window.Location.getPath(); } + /* + * Open the branch and select the item corresponding to the current url. + */ private void openMenu() { - $("#gwt-toc a.selected").removeClass("selected"); + GQuery item = $("#gwt-toc a[href='" + Window.Location.getPath() + "']").eq(0); - String path = Window.Location.getPath(); + // Only collapse unrelated entries in mobile + if ($("#nav-mobile").isVisible()) { + hideUnrelatedBranches(item); + } - $("#gwt-toc a[ahref$='" + path + "']") - .addClass("selected") - .parentsUntil("#gwt-toc") - .filter("li.folder") - .addClass("open") - .children("ul") - .slideDown(200); + showBranch(item); + + $("#gwt-toc a.selected").removeClass("selected"); + item.addClass("selected"); + + // Change the page title for easy bookmarking + $("title").text("[GWT] " + item.text()); } - private void enhanceMenu() { - $("li.folder > a").click(new Function() { + /* + * Enhance the page adding handlers and replacing relative by absolute urls + */ + private void enhancePage() { + + // We add a span with the +/- icon so as the click area is well defined + // this span is not rendered in server side because it is only needed + // for enhancing the page. + GQuery parentItems = $("#gwt-toc li").has("ul").prepend(""); + + // Toggle the branch when clicking on the arrow or anchor without content + $(parentItems).children("span, a[href='#']").on("click", new Function() { @Override public boolean f(Event e) { toggleMenu($(e).parent()); @@ -85,104 +99,124 @@ public boolean f(Event e) { } }); - $("#gwt-toc li.folder > ul").hide(); - - $("a", body).live(Event.ONCLICK, new Function() { + // Replace relative paths in anchors by absolute ones + // exclude all anchors in the content area. + $("a").not($("#gwt-content a")).each(new Function() { @Override - public boolean f(Event e) { - String href = getHref($(e)); - if (shouldEnhanceClick(e) && isPushstateCapable && isSameOriginRexp.test(href)) { - loadPage(href); - return false; + public void f(Element e) { + GQuery link = $(e); + if (shouldEnhanceLink(link)) { + // No need to make complicated things for computing + // the absolute path: anchor.pathname is the way + link.attr("href", link.prop("pathname")); } - return true; } }); - } - - private boolean shouldEnhanceClick(Event e) { - GQuery link = $(e); - // Is it a normal click (not ctrl/cmd/shift/right/middle click) ? - if (!clickHelper.handleAsClick(e)) { - return false; + // Do not continue enhancing if Ajax is disabled + if (!ajaxEnabled) { + // Select current item from the URL info + loadPage(null); + return; } - // do not load links that are marked as full page reload - if ("true".equals(link.attr("data-full-load"))) { - return false; - } + // Use Ajax instead of default behaviour + $(body).on("click", "a", new Function() { + @Override + public boolean f(Event e) { + if (shouldEnhanceLink($(e)) && + // Is it a normal click (not ctrl/cmd/shift/right/middle click) ? + clickHelper.handleAsClick(e)) { - // do not load javadoc async - if (getHref(link).startsWith("/javadoc/")) { - return false; - } + // Load the page using Ajax + loadPage($(e)); + return false; + } + return true; + } + }); - return true; + // Select the TOC item when URL changes + $(window).on("popstate", new Function() { + @Override + public void f() { + loadPage(null); + } + }); } - /** - * Sometimes the link src comes in the 'ahref' attribute - */ - private String getHref(GQuery link) { - return JsUtils.or(link.attr("ahref"), link.attr("href")); + private boolean shouldEnhanceLink(GQuery link) { + return + // Enhance only local links + isSameOriginRexp.test(link.attr("href")) && + // Do not load links that are marked as full page reload + !Boolean.parseBoolean(link.attr("data-full-load")); } private void toggleMenu(GQuery menu) { menu.toggleClass("open") - .children("ul") - .slideToggle(200); + .children("ul") + .slideToggle(ANIMATION_TIME); } - private void loadPage(String pageUrl) { - if (pageUrl != null) { - JsUtils.runJavascriptFunction(history, "pushState", null, null, pageUrl); - } - - String path = Window.Location.getPath(); - final String hash = Window.Location.getHash(); + private void hideUnrelatedBranches(GQuery item) { + $("#gwt-toc li.open") + .not(item).not(item.parents()) + .removeClass("open") + .children("ul") + .slideUp(ANIMATION_TIME); + } - if (!path.equals(currentPage)) { - currentPage = path; + private void showBranch(GQuery item) { + item.parents() + .filter("li") + .addClass("open") + .children("ul") + .slideDown(ajaxEnabled ? ANIMATION_TIME : 0); + } - $("#gwt-content").load(path + " #gwt-content > div", null, - new Function() { - @Override - public void f() { - scrollTo(hash); - openMenu(); - } - }); + /* + * Change URL via pushState and load the page via Ajax. + */ + private void loadPage(GQuery link) { + String pageUrl = link == null ? null : link.prop("pathname"); + + if (!currentPage.equals(pageUrl)) { + if (pageUrl != null) { + // Preserve QueryString, useful for the gwt.codesvr parameter in dev-mode. + pageUrl = pageUrl.replaceFirst("(#.*|)$", Window.Location.getQueryString() + "$1"); + // Set the page to load in the URL + JsUtils.runJavascriptFunction(history, "pushState", null, null, pageUrl); + } - } else { - scrollTo(hash); + pageUrl = Window.Location.getPath(); + if (!currentPage.equals(pageUrl)) { + $("#spinner").show(); + $("#gwt-content").load(pageUrl + " #gwt-content > div", null, new Function() { + @Override + public void f() { + openMenu(); + scrollToHash(); + $("#spinner").hide(); + } + }); + } else { + scrollToHash(); + } + currentPage = pageUrl; } } - private void scrollTo(String hash) { - if (hash == null || hash.length() == 0) { + /* + * Move the scroll to the hash fragment in the URL + */ + private void scrollToHash() { + String hash = Window.Location.getHash(); + GQuery anchor = hash.length() > 1 ? $(hash + ", [name='" + hash.substring(1) + "']") : $(); + if (anchor.isEmpty()) { Window.scrollTo(0, 0); } else { - GQuery anchor = $(hash); - if (anchor.isEmpty()) { - anchor = $("[name='" + hash.substring(1) + "']"); - } - anchor.scrollIntoView(); } } - - private void maybeBindPopState() { - if (!isPushstateCapable) { - return; - } - - // Note: gQuery will support $(window).on("popstate", function) in future releases. - window.cast().setFunction("onpopstate", new Function() { - @Override - public void f() { - loadPage(null); - } - }); - } } diff --git a/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml b/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml new file mode 100644 index 000000000..8a6351f61 --- /dev/null +++ b/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml @@ -0,0 +1,4 @@ + + + + diff --git a/src/test/java/com/google/gwt/site/webapp/client/GWTProjectEntryPointTest.java b/src/test/java/com/google/gwt/site/webapp/client/GWTProjectEntryPointTest.java new file mode 100644 index 000000000..5f04e468a --- /dev/null +++ b/src/test/java/com/google/gwt/site/webapp/client/GWTProjectEntryPointTest.java @@ -0,0 +1,21 @@ +package com.google.gwt.site.webapp.client; + +import com.google.gwt.regexp.shared.RegExp; + +/** + * Test class for the GWTProject entry-point for running in GWT + */ +public class GWTProjectEntryPointTest extends JREProjectEntryPointTest { + + public String getModuleName() { + return "com.google.gwt.site.webapp.Test"; + } + + protected String getOrigin() { + return GWTProjectEntryPoint.origin; + } + + protected RegExp getSameOriginRegex() { + return GWTProjectEntryPoint.isSameOriginRexp; + } +} diff --git a/src/test/java/com/google/gwt/site/webapp/client/JREProjectEntryPointTest.java b/src/test/java/com/google/gwt/site/webapp/client/JREProjectEntryPointTest.java new file mode 100644 index 000000000..60cdb63f0 --- /dev/null +++ b/src/test/java/com/google/gwt/site/webapp/client/JREProjectEntryPointTest.java @@ -0,0 +1,61 @@ +package com.google.gwt.site.webapp.client; + +import com.google.gwt.junit.client.GWTTestCase; +import com.google.gwt.regexp.shared.RegExp; +/** + * Test class for the GWTProject entry-point running in JVM + */ +public class JREProjectEntryPointTest extends GWTTestCase { + + public String getModuleName() { + return null; + } + + /* + * We need this method because GWTProjectEntryPoint.absoluteUrl cannot + * be instantiated in the JVM + */ + protected String getOrigin() { + String absoluteUrl = "HTTP://AAA.COM/adfaf/adsfa.html?aa=b&c=d#aaa:aaa"; + + // This is the same Regexp that we use in client class + String origin = absoluteUrl.replaceFirst("^(\\w+://.+?)/.*", "$1").toLowerCase(); + assertEquals("http://aaa.com", origin); + + return origin; + } + + /* + * We need this method because GWTProjectEntryPoint.isSameOriginRexp cannot + * be instantiated in the JVM + */ + protected RegExp getSameOriginRegex() { + String origin = getOrigin(); + // This is the same Regexp that we use in client class + return RegExp.compile("^" + origin + "|^(?!(#|[a-z#]+:))(?!.*(|/)javadoc/)(?!.*\\.(jpe?g|png|mpe?g|mp[34]|avi)$)", "i"); + } + + public void testEntryPointRegex() { + RegExp isSameOriginRexp = getSameOriginRegex(); + + assertTrue(isSameOriginRexp.test(getOrigin() + "/adfaf")); + assertFalse(isSameOriginRexp.test(getOrigin().replace("http", "https") + "/adfaf")); + assertFalse(isSameOriginRexp.test("file:///aaa.com/adfaf")); + assertFalse(isSameOriginRexp.test("telnet:///aaa.com/adfaf")); + assertFalse(isSameOriginRexp.test("ftp:///aaa.com/adfaf")); + assertFalse(isSameOriginRexp.test("mailto:foo@bar")); + assertTrue(isSameOriginRexp.test(".aaa")); + assertTrue(isSameOriginRexp.test("./aaa")); + assertTrue(isSameOriginRexp.test("/aaa")); + assertTrue(isSameOriginRexp.test("///aaa")); + assertFalse(isSameOriginRexp.test("#adfaf")); + assertFalse(isSameOriginRexp.test("#")); + assertTrue(isSameOriginRexp.test("")); + assertFalse(isSameOriginRexp.test("/javadoc/foo/bar")); + assertFalse(isSameOriginRexp.test("javadoc/foo/bar")); + assertFalse(isSameOriginRexp.test("whatever/javadoc/foo/bar")); + assertFalse(isSameOriginRexp.test("whatever/foo/bar.jpg")); + assertFalse(isSameOriginRexp.test("whatever/foo/bar.mp4")); + assertTrue(isSameOriginRexp.test("whatever/foo/bar.mp4foo")); + } +} From b599e4f878326595632324c940e96e3797d44a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Wed, 30 Apr 2014 10:10:39 +0200 Subject: [PATCH 39/61] Enhance mobile button to show/hide menu Related with: https://gwt-review.googlesource.com/#/c/7400 Change-Id: Ie622a6b9ef1d36a5fd372b66e1314b950f29eec1 --- .../gwt/site/webapp/client/GWTProjectEntryPoint.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index fff78ff8f..06986cb4a 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -113,6 +113,14 @@ public void f(Element e) { } }); + // In mobile have a link for opening/closing the menu + $("#nav-mobile").on("click", new Function() { + @Override + public void f() { + $("#gwt-toc").toggleClass("show"); + } + }); + // Do not continue enhancing if Ajax is disabled if (!ajaxEnabled) { // Select current item from the URL info @@ -128,6 +136,9 @@ public boolean f(Event e) { // Is it a normal click (not ctrl/cmd/shift/right/middle click) ? clickHelper.handleAsClick(e)) { + // In mobile, if menu is visible, close it + $("#gwt-toc.show").removeClass("show"); + // Load the page using Ajax loadPage($(e)); return false; From 6928ecba93adc62da73dea5243a7848f10555ebf Mon Sep 17 00:00:00 2001 From: jdramaix Date: Thu, 22 May 2014 11:32:32 +0200 Subject: [PATCH 40/61] pom.xml cleaning - use properties for versions of each dependencies and plugins - upgrade to latest version of each dependencies and plugins - Remove dependencies and plugins that are not used - Override the application version with the build date - configure gwt-maven plugin for running GWTTestCase Change-Id: I953e08a4544f141b6e7c8fb4a0c60dd89efd38b7 --- pom.xml | 192 ++++++------------ src/main/webapp/WEB-INF/appengine-web.xml | 1 + ...est.java => ProjectEntryPointGwtTest.java} | 2 +- ...ntTest.java => ProjectEntryPointTest.java} | 2 +- 4 files changed, 67 insertions(+), 130 deletions(-) rename src/test/java/com/google/gwt/site/webapp/client/{GWTProjectEntryPointTest.java => ProjectEntryPointGwtTest.java} (85%) rename src/test/java/com/google/gwt/site/webapp/client/{JREProjectEntryPointTest.java => ProjectEntryPointTest.java} (97%) diff --git a/pom.xml b/pom.xml index afc321aeb..0b4f798db 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.google.gwt.site.webapp @@ -9,11 +9,27 @@ war - 1 - 1.8.8 + yyyy-MM-dd + ${maven.build.timestamp} UTF-8 - 2.6.0 + + 1.9.5 + 20140107 + 1.9 + + 2.5 + + 2.6.1 1.4.2 + + 4.11 + + + 2.17 + 3.1 + 2.4 + 2.9 + 1.9.4 @@ -26,35 +42,23 @@ javax.servlet servlet-api - 2.5 + ${servlet.version} provided - - jstl - jstl - 1.2 - - - - com.sun.jersey - jersey-server - 1.9 - - - com.sun.jersey - jersey-grizzly2 - 1.9 - org.json json - 20090211 + ${json.version} - commons-codec commons-codec - 1.7 + ${commons-codec.version} + + + com.google.inject.extensions + guice-servlet + 3.0 @@ -70,77 +74,30 @@ ${appengine.target.version} test - - - com.sun.jersey.contribs - jersey-guice - 1.7 - - - javax.jdo - jdo-api - 3.0.1 - - - org.datanucleus - datanucleus-core - 3.1.1 - runtime - - - org.datanucleus - datanucleus-api-jdo - 3.1.2 - - - com.google.appengine.orm - datanucleus-appengine - 2.1.2 + junit + junit + ${junit.version} + test + com.google.gwt gwt-user - ${gwtversion} + ${gwt.version} provided - javax.validation - validation-api - 1.0.0.GA - provided - - - javax.validation - validation-api - 1.0.0.GA - sources + com.googlecode.gwtquery + gwtquery + ${gwtquery.version} provided - - - javax.persistence - persistence-api - 1.0 - - - junit - junit - 3.8.1 - test - com.google.gwt gwt-dev - ${gwtversion} - test - - - - com.googlecode.gwtquery - gwtquery - ${gwtquery.version} + ${gwt.version} provided @@ -154,23 +111,23 @@ ${basedir}/src/test/resources + - org.apache.maven.plugins - maven-surefire-plugin - 2.6 - - - ${basedir}/src/main/java - ${basedir}/src/test/java - - false - + org.apache.maven.plugins + maven-surefire-plugin + ${surefire-plugin.version} + + + **/*GwtTest.java + + + org.apache.maven.plugins - 2.5.1 maven-compiler-plugin + ${compiler-plugin.version} 1.6 1.6 @@ -180,7 +137,7 @@ org.apache.maven.plugins maven-war-plugin - 2.3 + ${war-plugin.version} @@ -210,21 +167,22 @@ com.google.appengine appengine-maven-plugin - ${appengine.target.version} + ${appengine.plugin.version} -
0.0.0.0
+ ${appengine.app.version} +
0.0.0.0
org.apache.maven.plugins maven-eclipse-plugin - 2.8 - + ${eclipse-plugin.version} true false - ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + ${project.build.directory}/${project.build.finalName}/WEB-INF/classes + org.eclipse.jdt.core.javanature com.google.gdt.eclipse.core.webAppNature @@ -234,11 +192,9 @@ org.eclipse.jdt.core.javabuilder com.google.gdt.eclipse.core.webAppProjectValidator - com.google.appengine.eclipse.core.projectValidator com.google.gwt.eclipse.core.gwtProjectValidator com.google.appengine.eclipse.core.enhancerbuilder - org.eclipse.jdt.launching.JRE_CONTAINER @@ -259,43 +215,24 @@ org.datanucleus:datanucleus-api-jdo com.google.appengine.orm:datanucleus-appengine - - - - org.datanucleus - maven-datanucleus-plugin - 3.1.2 - - ${basedir}/log4j.properties - false - false - - - - process-classes - - enhance - - - - - org.codehaus.mojo gwt-maven-plugin - ${gwtversion} + ${gwt.version} - com.google.gwt.site.webapp.GWTProject - index.html - true + 180 + **/*GwtTest.java + htmlunit + gen + -Xss1024k -Xmx512M -XX:MaxPermSize=512m true - true - + com.google.gwt.site.webapp.GWTProject + compile @@ -306,5 +243,4 @@
-
diff --git a/src/main/webapp/WEB-INF/appengine-web.xml b/src/main/webapp/WEB-INF/appengine-web.xml index 2e0718528..4a363cfd6 100644 --- a/src/main/webapp/WEB-INF/appengine-web.xml +++ b/src/main/webapp/WEB-INF/appengine-web.xml @@ -1,6 +1,7 @@ gwtproject-demo + draft true diff --git a/src/test/java/com/google/gwt/site/webapp/client/GWTProjectEntryPointTest.java b/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java similarity index 85% rename from src/test/java/com/google/gwt/site/webapp/client/GWTProjectEntryPointTest.java rename to src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java index 5f04e468a..38c83b0ac 100644 --- a/src/test/java/com/google/gwt/site/webapp/client/GWTProjectEntryPointTest.java +++ b/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java @@ -5,7 +5,7 @@ /** * Test class for the GWTProject entry-point for running in GWT */ -public class GWTProjectEntryPointTest extends JREProjectEntryPointTest { +public class ProjectEntryPointGwtTest extends ProjectEntryPointTest { public String getModuleName() { return "com.google.gwt.site.webapp.Test"; diff --git a/src/test/java/com/google/gwt/site/webapp/client/JREProjectEntryPointTest.java b/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java similarity index 97% rename from src/test/java/com/google/gwt/site/webapp/client/JREProjectEntryPointTest.java rename to src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java index 60cdb63f0..7d40f153f 100644 --- a/src/test/java/com/google/gwt/site/webapp/client/JREProjectEntryPointTest.java +++ b/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java @@ -5,7 +5,7 @@ /** * Test class for the GWTProject entry-point running in JVM */ -public class JREProjectEntryPointTest extends GWTTestCase { +public class ProjectEntryPointTest extends GWTTestCase { public String getModuleName() { return null; From db679f9012b8c8c21a7e7a0e5a5851d0089e78ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Carrasco=20Mo=C3=B1ino?= Date: Mon, 9 Jun 2014 09:54:11 +0200 Subject: [PATCH 41/61] Bundle in a folder gwtquery-entrypoint and unpacked gwt-site. - This creates a 'target/www' folder which can be tested locally or deployed in any file-system, webserver cordova, etc. Issue: #8149 Change-Id: I1fe587980e4fadfeb9c116822e8bc23a2d133929 --- README.md | 41 +++++++++++++++++++++++++++-------------- pom.xml | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 3236b1b6d..7fa0824c1 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,37 @@ -App Engine Java Application -Copyright (C) 2010-2012 Google Inc. -## Skeleton application for use with App Engine Java. +- gwt-site-webapp + This project includes the server an client code of the GWT site + It does not include the site content which is in the gwt-site project + nor the utilities for uploading the documentation to GAE Servers which + are in the gwt-site-uploader project. -Requires [Apache Maven](http://maven.apache.org) 3.0 or greater, and JDK 6+ in order to run. +- Requirements + [Apache Maven](http://maven.apache.org) 3.0 or greater, and JDK 6+ in order to run. -To build, run +- Before building the project you may need gwt-site packaged file. + Go to the gwt-site folder and run: + $ mvn install - mvn package +- To build and check the app, run + $ mvn package -Building will run the tests, but to explicitly run tests you can use the test target + Now you can point your browser to the target/www folder or you can deploy + its content in any web-server. - mvn test +- Building will run the tests, but to explicitly run tests you can use the test target + $ mvn test -To start the app, use the [App Engine Maven Plugin](http://code.google.com/p/appengine-maven-plugin/) that is already included in this demo. Just run the command. +- Develop and Deploy in GAE + This app is thought to be run in GAE servers, so it comes with all dependencies for it. - mvn appengine:devserver + To start the app, use the [App Engine Maven Plugin](http://code.google.com/p/appengine-maven-plugin/) + that is already included in this project. Just run the command: + $ mvn appengine:devserver -For further information, consult the [Java App Engine](https://developers.google.com/appengine/docs/java/overview) documentation. + You might upload the gwt stuff to the dev server, just open another terminal, + go to the gwt-site-uploader folder project and run: + $ sh upload.sh localhost -To see all the available goals for the App Engine plugin, run - - mvn help:describe -Dplugin=appengine + For further information about GAE, consult the [Java App Engine](https://developers.google.com/appengine/docs/java/overview) documentation. + To see all the available goals for the App Engine plugin, run + $ mvn help:describe -Dplugin=appengine diff --git a/pom.xml b/pom.xml index 0b4f798db..38d464df5 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,13 @@ ${gwt.version} provided + + com.google.gwt.site + gwt-site + ${project.version} + zip + generated-site + @@ -241,6 +248,44 @@ + + maven-dependency-plugin + + + unpack-dependencies + prepare-package + + unpack-dependencies + + + com.google.gwt.site + gwt-site + true + ${project.build.directory}/www/ + + + + + + maven-resources-plugin + + + copy-resources + prepare-package + + copy-resources + + + ${project.build.directory}/www/gwtproject/ + + + ${project.build.directory}/${project.artifactId}-${project.version}/gwtproject/ + + + + + + From 6e704c4077942007356a0f5027e1d8cc06426644 Mon Sep 17 00:00:00 2001 From: jdramaix Date: Thu, 13 Nov 2014 15:08:34 +0100 Subject: [PATCH 42/61] Add dtd mime type. Change-Id: I8b0d89e83c99d723895fbcde0c7465ab776c699b --- .../gwt/site/webapp/server/resources/ContentServlet.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index 3bccaae5f..93398aeb9 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -21,12 +21,11 @@ import com.google.appengine.api.datastore.Query; import com.google.appengine.api.datastore.Text; -import java.io.IOException; - import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; public class ContentServlet extends HttpServlet { @@ -116,6 +115,11 @@ private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPat return; } + if (fullPath.endsWith(".dtd")) { + resp.setContentType("application/xml-dtd"); + return; + } + // TODO: what is a good default value? } From cbb8153edf590ab3249411066437a7eb303146f4 Mon Sep 17 00:00:00 2001 From: Brian Slesinsky Date: Fri, 12 Dec 2014 15:01:35 -0800 Subject: [PATCH 43/61] Turn on draft and pretty mode again. Also upgrade to GWT 2.7. Change-Id: I71c72ed7ebd46a5ae2b198c4fa11e4233900c76f --- pom.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 38d464df5..ee4efa4ec 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ 2.5 - 2.6.1 + 2.7.0 1.4.2 4.11 @@ -239,7 +239,13 @@ -Xss1024k -Xmx512M -XX:MaxPermSize=512m true com.google.gwt.site.webapp.GWTProject - + + true + compile From 10da9b8b95db0ca1918428dae494a9b6e3e9f2e2 Mon Sep 17 00:00:00 2001 From: jdramaix Date: Sun, 19 Apr 2015 10:57:11 +0200 Subject: [PATCH 44/61] Merge new site into master. Merge the code for the new site into master branch. Change-Id: I040b5dfeaf762f189f286a3f5a8fb634abe35c0b --- pom.xml | 2 +- .../webapp/client/GWTProjectEntryPoint.java | 390 ++++++++++++++---- .../webapp/client/ScrollTopAnimation.java | 50 +++ .../server/guice/GuiceServletConfig.java | 8 +- .../webapp/server/guice/MyServletModule.java | 21 +- .../server/resources/ContentServlet.java | 43 +- .../webapp/server/resources/HashServlet.java | 21 +- src/main/webapp/WEB-INF/web.xml | 67 +-- 8 files changed, 433 insertions(+), 169 deletions(-) create mode 100644 src/main/java/com/google/gwt/site/webapp/client/ScrollTopAnimation.java diff --git a/pom.xml b/pom.xml index ee4efa4ec..9b2bfffb0 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.google.gwt.site.webapp gwt-site-webapp - 1.0-SNAPSHOT + 2.0-SNAPSHOT war diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 06986cb4a..e619317b6 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 Daniel Kurka + * Copyright 2015 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 @@ -21,11 +21,19 @@ import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Element; +import com.google.gwt.dom.client.InputElement; +import com.google.gwt.dom.client.Style; +import com.google.gwt.event.logical.shared.ResizeEvent; +import com.google.gwt.event.logical.shared.ResizeHandler; +import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQuery; +import com.google.gwt.query.client.Predicate; import com.google.gwt.query.client.Properties; import com.google.gwt.query.client.js.JsUtils; +import com.google.gwt.query.client.plugins.ajax.Ajax; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; @@ -45,81 +53,129 @@ public class GWTProjectEntryPoint implements EntryPoint { .replaceFirst("^(\\w+://.+?)/.*", "$1").toLowerCase(); // Visible for testing - // We discard links with different origin, hashes, starting with protocol, javadocs, and media links. + // We discard links with different origin, hashes, starting with protocol, javadocs, + // and media links. static final RegExp isSameOriginRexp = RegExp.compile("^" + origin - + "|^(?!(#|[a-z#]+:))(?!.*(|/)javadoc/)(?!.*\\.(jpe?g|png|mpe?g|mp[34]|avi)$)", "i"); + + "|^(?!(#|[a-z#]+:))(?!.*(|/)javadoc/)(?!.*\\.(jpe?g|png|mpe?g|mp[34]|avi)$)", + "i"); private static boolean isPushstateCapable = history.get("pushState") != null; private static boolean ajaxEnabled = isPushstateCapable && origin.startsWith("http"); private static String currentPage = Window.Location.getPath(); + private HandlerRegistration resizeHandler; @Override public void onModuleLoad() { + bindSearch(); + enhancePage(); - $("#gwt-toc li ul").hide(); - openMenu(); + enhanceMenu(); + + onPageLoaded(false); + $(".holder").show(); + } + + private void bindSearch() { + $("#search form").submit(new Function() { + @Override + public boolean f(Event e) { + InputElement input = $(this).children("input").get(0).cast(); + + doSearch(input.getValue()); + + return false; + } + }); + } + + private void enhanceMenu() { + $("#nav").not(".alwaysOpen") + .hover( + new Function() { + @Override + public void f(Element e) { + $(e).removeClass("closed"); + } + }, + new Function() { + @Override + public void f(Element e) { + $(e).addClass("closed"); + } + } + ); } /* * Open the branch and select the item corresponding to the current url. */ private void openMenu() { - GQuery item = $("#gwt-toc a[href='" + Window.Location.getPath() + "']").eq(0); + // close all submenus + // todo hide first anchor with css + $("#submenu > nav > ul > li").hide().children("a").hide(); - // Only collapse unrelated entries in mobile - if ($("#nav-mobile").isVisible()) { - hideUnrelatedBranches(item); - } + String path = Window.Location.getPath(); + GQuery selectedItem = $("#submenu a[href='" + path + "']") + .filter(new Predicate() { + @Override + public boolean f(Element e, int index) { + return !Style.Display.NONE.getCssName().equals(e.getStyle().getDisplay()); + } + }) + .eq(0); + + showBranch(selectedItem); - showBranch(item); + GQuery liParents = selectedItem + .parentsUntil("#submenu") + .filter("li"); + GQuery subMenuItem = liParents.last(); - $("#gwt-toc a.selected").removeClass("selected"); - item.addClass("selected"); + subMenuItem.show(); + String mainNavigationHref = subMenuItem.children("a").attr("href"); + + $("#nav a.active").removeClass("active"); + $("#nav a[href='" + mainNavigationHref + "']").addClass("active"); + $("#submenu .active").not(liParents).removeClass("active"); + liParents.add(selectedItem).not(selectedItem.parent()).addClass("active"); // Change the page title for easy bookmarking - $("title").text("[GWT] " + item.text()); + $("title").text("[GWT] " + subMenuItem.text()); + + boolean homePage = isHomePage(path); + boolean overviewPage = isOverviewPage(path); + $("#nav").toggleClass("alwaysOpen", homePage); + $("#content").toggleClass("home", homePage); + if (homePage || overviewPage) { + $("#submenu").hide(); + } else { + $("#submenu").show(); + } + + maybeStyleHomepage(); } /* * Enhance the page adding handlers and replacing relative by absolute urls */ private void enhancePage() { + $("#nav") + .mouseenter(new Function() { + @Override + public void f() { + $(this).removeClass("closed"); + } + }) + .mouseleave(new Function() { + @Override + public void f() { + if (!$(this).hasClass("alwaysOpen")) { + $(this).addClass("closed"); + } + } + }); - // We add a span with the +/- icon so as the click area is well defined - // this span is not rendered in server side because it is only needed - // for enhancing the page. - GQuery parentItems = $("#gwt-toc li").has("ul").prepend(""); - - // Toggle the branch when clicking on the arrow or anchor without content - $(parentItems).children("span, a[href='#']").on("click", new Function() { - @Override - public boolean f(Event e) { - toggleMenu($(e).parent()); - return false; - } - }); - - // Replace relative paths in anchors by absolute ones - // exclude all anchors in the content area. - $("a").not($("#gwt-content a")).each(new Function() { - @Override - public void f(Element e) { - GQuery link = $(e); - if (shouldEnhanceLink(link)) { - // No need to make complicated things for computing - // the absolute path: anchor.pathname is the way - link.attr("href", link.prop("pathname")); - } - } - }); - - // In mobile have a link for opening/closing the menu - $("#nav-mobile").on("click", new Function() { - @Override - public void f() { - $("#gwt-toc").toggleClass("show"); - } - }); + enhanceLinks(); // Do not continue enhancing if Ajax is disabled if (!ajaxEnabled) { @@ -137,7 +193,7 @@ public boolean f(Event e) { clickHelper.handleAsClick(e)) { // In mobile, if menu is visible, close it - $("#gwt-toc.show").removeClass("show"); + $("#submenu.show").removeClass("show"); // Load the page using Ajax loadPage($(e)); @@ -148,42 +204,79 @@ public boolean f(Event e) { }); // Select the TOC item when URL changes - $(window).on("popstate", new Function() { - @Override - public void f() { - loadPage(null); - } - }); + $(window) + .on("popstate", new Function() { + @Override + public void f() { + loadPage(null); + } + } + ); } private boolean shouldEnhanceLink(GQuery link) { return - // Enhance only local links - isSameOriginRexp.test(link.attr("href")) && - // Do not load links that are marked as full page reload - !Boolean.parseBoolean(link.attr("data-full-load")); + // Enhance only local links + isSameOriginRexp.test(link.attr("href")) && + // Do not load links that are marked as full page reload + !Boolean.parseBoolean(link.attr("data-full-load")); } - private void toggleMenu(GQuery menu) { - menu.toggleClass("open") - .children("ul") - .slideToggle(ANIMATION_TIME); + private void enhanceLinks() { + // Replace relative paths in anchors by absolute ones + // exclude all anchors in the conHighlight and collapse menutent area. + // TODO could be done on server side + $("a").not($("#content a")).each(new Function() { + @Override + public void f(Element e) { + GQuery link = $(e); + if (shouldEnhanceLink(link)) { + // No need to make complicated things for computing + // the absolute path: anchor.pathname is the way + link.attr("href", link.prop("pathname")); + } + } + }); + + // We add a span with the +/- icon so as the click area is well defined + // this span is not rendered in server side because it is only needed + // for enhancing the page. + GQuery parentItems = $("#submenu ul > li li").has("ul").prepend(""); + + $("#submenu").children("span, a[href=\"#\"]").unbind("click"); + + // Toggle the branch when clicking on the arrow or anchor without content + $(parentItems).children("span, a[href=\"#\"]").on("click", new Function() { + @Override + public boolean f(Event e) { + toggleMenu($(e).parent()); + return false; + } + }); + + parentItems + .addClass("folder") + .not(".open") + .children("ul") + .slideUp(0); } - private void hideUnrelatedBranches(GQuery item) { - $("#gwt-toc li.open") - .not(item).not(item.parents()) - .removeClass("open") - .children("ul") - .slideUp(ANIMATION_TIME); + private void toggleMenu(GQuery menu) { + menu.toggleClass("open") + .children("ul") + .slideToggle(ANIMATION_TIME); } - private void showBranch(GQuery item) { - item.parents() - .filter("li") - .addClass("open") - .children("ul") - .slideDown(ajaxEnabled ? ANIMATION_TIME : 0); + private void showBranch(final GQuery item) { + Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { + @Override + public void execute() { + item.parents("li") + .addClass("open") + .children("ul") + .slideDown(ajaxEnabled ? ANIMATION_TIME : 0); + } + }); } /* @@ -192,6 +285,7 @@ private void showBranch(GQuery item) { private void loadPage(GQuery link) { String pageUrl = link == null ? null : link.prop("pathname"); + boolean shouldReplaceMenu = shouldReplaceMenu(pageUrl); if (!currentPage.equals(pageUrl)) { if (pageUrl != null) { // Preserve QueryString, useful for the gwt.codesvr parameter in dev-mode. @@ -203,14 +297,7 @@ private void loadPage(GQuery link) { pageUrl = Window.Location.getPath(); if (!currentPage.equals(pageUrl)) { $("#spinner").show(); - $("#gwt-content").load(pageUrl + " #gwt-content > div", null, new Function() { - @Override - public void f() { - openMenu(); - scrollToHash(); - $("#spinner").hide(); - } - }); + ajaxLoad(pageUrl, shouldReplaceMenu); } else { scrollToHash(); } @@ -218,6 +305,47 @@ public void f() { } } + private void ajaxLoad(String pageUrl, final boolean shouldReplaceMenu) { + Ajax.Settings settings = Ajax.createSettings(); + settings.setUrl(pageUrl); + settings.setDataType("html"); + settings.setType("get"); + settings.setSuccess(new Function() { + @Override + public void f() { + GQuery content = $("
" + getArgument(0) + "
"); + + if (shouldReplaceMenu) { + $("#submenu").replaceWith(content.find("#submenu")); + } + + $("#content").replaceWith(content.find("#content")); + + onPageLoaded(shouldReplaceMenu); + } + }); + + Ajax.ajax(settings); + } + + private boolean shouldReplaceMenu(String pageUrl) { + String path = Window.Location.getPath(); + + boolean isHomeOrOverview = isHomePage(path) || isOverviewPage(path); + + return isHomeOrOverview && (!isHomePage(pageUrl) || !isOverviewPage(pageUrl)); + } + + private void onPageLoaded(boolean menuReplaced) { + if (menuReplaced) { + enhanceLinks(); + } + openMenu(); + scrollToHash(); + $("#spinner").hide(); + $("#editLink").appendTo("#content h1"); + } + /* * Move the scroll to the hash fragment in the URL */ @@ -230,4 +358,98 @@ private void scrollToHash() { anchor.scrollIntoView(); } } + + private void maybeStyleHomepage() { + if ($("#content").hasClass("home")) { + styleHomepage(); + resizeHandler = Window.addResizeHandler(new ResizeHandler() { + @Override + public void onResize(ResizeEvent event) { + styleHomepage(); + } + }); + + // Pager + $(".next, .pager a").click(new Function() { + @Override + public boolean f(final Event event) { + event.preventDefault(); + $("html, body") + .each(new Function() { + @Override + public void f(Element e) { + new ScrollTopAnimation(e, getElementOffset($($(event).attr("href")))).run(600); + } + }); + return true; + } + }); + + $(".pager a").click(new Function() { + @Override + public boolean f(Event e) { + e.preventDefault(); + $(".pager a").removeClass("active"); + $(this).addClass("active"); + + return true; + } + }); + + $(window).scroll(new Function() { + @Override + public void f() { + $(".pager a").removeClass("active"); + if ($(window).scrollTop() + 100 > getElementOffset($("#letsbegin"))) { + $(".pager a:nth-child(3)").addClass("active"); + } else if ($(window).scrollTop() + 100 > getElementOffset($("#gwt"))) { + $(".pager a:nth-child(2)").addClass("active"); + } else { + $(".pager a:nth-child(1)").addClass("active"); + } + } + }); + } else { + $(window).unbind(Event.ONSCROLL); + if (resizeHandler != null) { + resizeHandler.removeHandler(); + resizeHandler = null; + } + } + } + + private int getElementOffset(GQuery element) { + return element.offset().top + Window.getScrollTop(); + } + + private boolean isOverviewPage(String path) { + return "/overview.html".compareToIgnoreCase(path) == 0; + } + + private boolean isHomePage(String path) { + return "/".equals(path); + } + + private void styleHomepage() { + final int windowHeight = $(window).height(); + int sectionHeight = $("#letsbegin").height(); + + if (windowHeight > sectionHeight) { + $(".home section").each(new Function() { + @Override + public void f() { + $(this) + .css("height", windowHeight + "px") + .css("padding", "0"); + GQuery container = $(this).find(".container"); + container.css("padding-top", (windowHeight - container.height()) / 2 + "px"); + } + }); + } + } + + private native void doSearch(String value) /*-{ + var element = $wnd.google.search.cse.element.getElement('searchresults'); + element.execute(value); + }-*/; } diff --git a/src/main/java/com/google/gwt/site/webapp/client/ScrollTopAnimation.java b/src/main/java/com/google/gwt/site/webapp/client/ScrollTopAnimation.java new file mode 100644 index 000000000..23112266b --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/client/ScrollTopAnimation.java @@ -0,0 +1,50 @@ +/* + * Copyright 2015 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. + */ +package com.google.gwt.site.webapp.client; + +import com.google.gwt.animation.client.Animation; +import com.google.gwt.dom.client.Element; +import com.google.gwt.query.client.plugins.effects.PropertiesAnimation; + +public class ScrollTopAnimation extends Animation { + + private final int end; + private final Element element; + + private int start; + + public ScrollTopAnimation(Element element, int end) { + this.element = element; + this.end = end; + } + + @Override + protected void onStart() { + start = element.getScrollTop(); + super.onStart(); + } + + @Override + protected void onUpdate(double progress) { + double value = start + (end - start) * progress; + element.setScrollTop((int) value); + } + + @Override + protected double interpolate(double progress) { + return PropertiesAnimation.EasingCurve.easeInOut.interpolate(progress); + } +} diff --git a/src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java b/src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java index 549146798..f6c38a2aa 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java +++ b/src/main/java/com/google/gwt/site/webapp/server/guice/GuiceServletConfig.java @@ -1,12 +1,12 @@ /* - * Copyright 2013 Daniel Kurka - * + * Copyright 2015 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 diff --git a/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java index d0b84f726..19636e18e 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java +++ b/src/main/java/com/google/gwt/site/webapp/server/guice/MyServletModule.java @@ -1,12 +1,12 @@ /* - * Copyright 2013 Daniel Kurka - * + * Copyright 2015 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 @@ -24,22 +24,13 @@ public class MyServletModule extends ServletModule { @Override protected void configureServlets() { - // web resources - // bind(StandardResource.class); - // bind(TermsOfServiceResource.class); - // bind(PrivacyResource.class); - //docs bind(RemoteApiServlet.class).in(Singleton.class); bind(ContentServlet.class).in(Singleton.class); bind(HashServlet.class).in(Singleton.class); - + serve("/remote_api").with( RemoteApiServlet.class); serve("/hash").with( HashServlet.class); - serve("/*").with( ContentServlet.class); - -// Map params = new HashMap(); -// params.put("com.sun.jersey.config.property.JSPTemplatesBasePath", "/WEB-INF/jsp"); -// serve("/*").with(GuiceContainer.class, params); + serveRegex("/(?!_ah).*").with( ContentServlet.class); } } diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java index 93398aeb9..babbeffa7 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/ContentServlet.java @@ -1,14 +1,16 @@ /* - * Copyright 2013 Daniel Kurka - * - * 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 - * + * Copyright 2015 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 + * + * 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. */ package com.google.gwt.site.webapp.server.resources; @@ -120,12 +122,33 @@ private void setContentTypeByFileEnding(HttpServletResponse resp, String fullPat return; } + if (fullPath.endsWith(".woff") || fullPath.endsWith(".woff2")) { + resp.setContentType("application/font-woff"); + return; + } + + if (fullPath.endsWith(".eot")) { + resp.setContentType("application/vnd.ms-fontobject"); + return; + } + + if (fullPath.endsWith(".ttf")) { + resp.setContentType("application/x-font-ttf"); + return; + } + + if (fullPath.endsWith(".svg")) { + resp.setContentType("image/svg+xml"); + return; + } + // TODO: what is a good default value? } private boolean isBinaryFile(String path) { return path.endsWith(".png") || path.endsWith(".jpg") || path.endsWith(".jpeg") - || path.endsWith(".gif"); + || path.endsWith(".gif") || path.endsWith(".woff") || path.endsWith(".eot") + || path.endsWith(".ttf") || path.endsWith(".woff2"); } private String normalizePath(String fullPath) { diff --git a/src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java b/src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java index 53a2c176f..94fbb5b75 100644 --- a/src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java +++ b/src/main/java/com/google/gwt/site/webapp/server/resources/HashServlet.java @@ -1,3 +1,18 @@ +/* + * Copyright 2015 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. + */ package com.google.gwt.site.webapp.server.resources; import com.google.appengine.api.datastore.DatastoreService; @@ -6,18 +21,16 @@ import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.PreparedQuery; import com.google.appengine.api.datastore.Query; - import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.IOException; -import java.util.List; - import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; public class HashServlet extends HttpServlet { diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 870470fd6..793a5a63c 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -1,54 +1,19 @@ - - - - - - - - - guiceFilter - com.google.inject.servlet.GuiceFilter - - - - guiceFilter - /* - - - - com.google.gwt.site.webapp.server.guice.GuiceServletConfig - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> + + + guiceFilter + com.google.inject.servlet.GuiceFilter + + + + guiceFilter + /* + + + + com.google.gwt.site.webapp.server.guice.GuiceServletConfig + From e7b9ff4d87458c71166316654b011acafb7b9de0 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Thu, 16 Jul 2015 14:08:08 +0200 Subject: [PATCH 45/61] Removing unused file Change-Id: Icdd8174faf202dfae662345bd068ded60965dd38 --- src/main/webapp/WEB-INF/jsp/index.jsp | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/main/webapp/WEB-INF/jsp/index.jsp diff --git a/src/main/webapp/WEB-INF/jsp/index.jsp b/src/main/webapp/WEB-INF/jsp/index.jsp deleted file mode 100644 index a494b0798..000000000 --- a/src/main/webapp/WEB-INF/jsp/index.jsp +++ /dev/null @@ -1,25 +0,0 @@ -<%@taglib prefix="t" tagdir="/WEB-INF/tags" %> - - -

GWT

- -
- GWT (pronounced 'gwit') is the official open source project for GWT releases 2.5 and onwards. This site houses links to the documentation, source code repository, issues list and information related to GWT roadmap and release. It is intended for developers interested in contributing to GWT, and for keeping people informed on new and upcoming changes to GWT, GWT related events and other news. - - - -
- - -
- - - \ No newline at end of file From cf2f9730781f72ede06ee5eafc0ade8bcef87877 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Thu, 16 Jul 2015 14:09:19 +0200 Subject: [PATCH 46/61] Adding code highlighing Change-Id: I1407b6d9243646a8201a6989081c4dfa997469e6 --- .../webapp/client/GWTProjectEntryPoint.java | 12 + .../webapp/client/highlight/JsHighlight.java | 35 + .../webapp/client/highlight/highlight.pack.js | 1306 +++++++++++++++++ .../gwt/site/webapp/client/highlight/idea.css | 111 ++ 4 files changed, 1464 insertions(+) create mode 100644 src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java create mode 100644 src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js create mode 100644 src/main/java/com/google/gwt/site/webapp/client/highlight/idea.css diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index e619317b6..73fcb4cba 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -35,6 +35,7 @@ import com.google.gwt.query.client.js.JsUtils; import com.google.gwt.query.client.plugins.ajax.Ajax; import com.google.gwt.regexp.shared.RegExp; +import com.google.gwt.site.webapp.client.highlight.JsHighlight; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.impl.HyperlinkImpl; @@ -75,6 +76,15 @@ public void onModuleLoad() { $(".holder").show(); } + private void highLight() { + JsHighlight.INSTANCE.initialize(); + $("pre > code").each(new Function(){ + public void f(Element e) { + JsHighlight.INSTANCE.highlightBlock(e); + } + }); + } + private void bindSearch() { $("#search form").submit(new Function() { @Override @@ -344,6 +354,8 @@ private void onPageLoaded(boolean menuReplaced) { scrollToHash(); $("#spinner").hide(); $("#editLink").appendTo("#content h1"); + // highlight loaded page + highLight(); } /* diff --git a/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java b/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java new file mode 100644 index 000000000..dc7c80631 --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java @@ -0,0 +1,35 @@ +package com.google.gwt.site.webapp.client.highlight; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.query.client.builders.JsniBundle; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; + +public abstract class JsHighlight implements JsniBundle { + + interface CssHighlight extends ClientBundle { + CssHighlight INSTANCE = GWT.create(CssHighlight.class); + + @Source("idea.css") + CssResource idea(); + } + + private static boolean initialized; + public static final JsHighlight INSTANCE = GWT.create(JsHighlight.class); + + @LibrarySource("highlight.pack.js") + abstract void loadHighlight(); + + public void initialize() { + if (!initialized) { + initialized = true; + CssHighlight.INSTANCE.idea().ensureInjected(); + loadHighlight(); + } + } + + public native void highlightBlock(Element e) /*-{ + e && $wnd.hljs && $wnd.hljs.highlightBlock(e); + }-*/; +} diff --git a/src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js b/src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js new file mode 100644 index 000000000..2f3351f0a --- /dev/null +++ b/src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js @@ -0,0 +1,1306 @@ +/** + * This is a reduced version of highlight for gwt site supporting: + * java, javascript, html, xml, css, json, bash. + * + * Produced from https://github.com/isagalaev/highlight.js.git + * node tools/build.js -n java javascript html xml bash css json + */ + +(function(factory) { + + // Setup highlight.js for different environments. First is Node.js or + // CommonJS. + if(typeof exports !== 'undefined') { + factory(exports); + } else { + // Export hljs globally even when using AMD for cases when this script + // is loaded with others that may still expect a global hljs. + window.hljs = factory({}); + + // Finally register the global hljs with AMD. + if(typeof define === 'function' && define.amd) { + define('hljs', [], function() { + return window.hljs; + }); + } + } + +}(function(hljs) { + + /* Utility functions */ + + function escape(value) { + return value.replace(/&/gm, '&').replace(//gm, '>'); + } + + function tag(node) { + return node.nodeName.toLowerCase(); + } + + function testRe(re, lexeme) { + var match = re && re.exec(lexeme); + return match && match.index == 0; + } + + function isNotHighlighted(language) { + return /no-?highlight|plain|text/.test(language); + } + + function blockLanguage(block) { + var i, match, length, + classes = block.className + ' '; + + classes += block.parentNode ? block.parentNode.className : ''; + + // language-* takes precedence over non-prefixed class names and + match = /\blang(?:uage)?-([\w-]+)\b/.exec(classes); + if (match) { + return getLanguage(match[1]) ? match[1] : 'no-highlight'; + } + + classes = classes.split(/\s+/); + for(i = 0, length = classes.length; i < length; i++) { + if(getLanguage(classes[i]) || isNotHighlighted(classes[i])) { + return classes[i]; + } + } + + } + + function inherit(parent, obj) { + var result = {}, key; + for (key in parent) + result[key] = parent[key]; + if (obj) + for (key in obj) + result[key] = obj[key]; + return result; + } + + /* Stream merging */ + + function nodeStream(node) { + var result = []; + (function _nodeStream(node, offset) { + for (var child = node.firstChild; child; child = child.nextSibling) { + if (child.nodeType == 3) + offset += child.nodeValue.length; + else if (child.nodeType == 1) { + result.push({ + event: 'start', + offset: offset, + node: child + }); + offset = _nodeStream(child, offset); + // Prevent void elements from having an end tag that would actually + // double them in the output. There are more void elements in HTML + // but we list only those realistically expected in code display. + if (!tag(child).match(/br|hr|img|input/)) { + result.push({ + event: 'stop', + offset: offset, + node: child + }); + } + } + } + return offset; + })(node, 0); + return result; + } + + function mergeStreams(original, highlighted, value) { + var processed = 0; + var result = ''; + var nodeStack = []; + + function selectStream() { + if (!original.length || !highlighted.length) { + return original.length ? original : highlighted; + } + if (original[0].offset != highlighted[0].offset) { + return (original[0].offset < highlighted[0].offset) ? original : highlighted; + } + + /* + To avoid starting the stream just before it should stop the order is + ensured that original always starts first and closes last: + + if (event1 == 'start' && event2 == 'start') + return original; + if (event1 == 'start' && event2 == 'stop') + return highlighted; + if (event1 == 'stop' && event2 == 'start') + return original; + if (event1 == 'stop' && event2 == 'stop') + return highlighted; + + ... which is collapsed to: + */ + return highlighted[0].event == 'start' ? original : highlighted; + } + + function open(node) { + function attr_str(a) {return ' ' + a.nodeName + '="' + escape(a.value) + '"';} + result += '<' + tag(node) + Array.prototype.map.call(node.attributes, attr_str).join('') + '>'; + } + + function close(node) { + result += ''; + } + + function render(event) { + (event.event == 'start' ? open : close)(event.node); + } + + while (original.length || highlighted.length) { + var stream = selectStream(); + result += escape(value.substr(processed, stream[0].offset - processed)); + processed = stream[0].offset; + if (stream == original) { + /* + On any opening or closing tag of the original markup we first close + the entire highlighted node stack, then render the original tag along + with all the following original tags at the same offset and then + reopen all the tags on the highlighted stack. + */ + nodeStack.reverse().forEach(close); + do { + render(stream.splice(0, 1)[0]); + stream = selectStream(); + } while (stream == original && stream.length && stream[0].offset == processed); + nodeStack.reverse().forEach(open); + } else { + if (stream[0].event == 'start') { + nodeStack.push(stream[0].node); + } else { + nodeStack.pop(); + } + render(stream.splice(0, 1)[0]); + } + } + return result + escape(value.substr(processed)); + } + + /* Initialization */ + + function compileLanguage(language) { + + function reStr(re) { + return (re && re.source) || re; + } + + function langRe(value, global) { + return new RegExp( + reStr(value), + 'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '') + ); + } + + function compileMode(mode, parent) { + if (mode.compiled) + return; + mode.compiled = true; + + mode.keywords = mode.keywords || mode.beginKeywords; + if (mode.keywords) { + var compiled_keywords = {}; + + var flatten = function(className, str) { + if (language.case_insensitive) { + str = str.toLowerCase(); + } + str.split(' ').forEach(function(kw) { + var pair = kw.split('|'); + compiled_keywords[pair[0]] = [className, pair[1] ? Number(pair[1]) : 1]; + }); + }; + + if (typeof mode.keywords == 'string') { // string + flatten('keyword', mode.keywords); + } else { + Object.keys(mode.keywords).forEach(function (className) { + flatten(className, mode.keywords[className]); + }); + } + mode.keywords = compiled_keywords; + } + mode.lexemesRe = langRe(mode.lexemes || /\b\w+\b/, true); + + if (parent) { + if (mode.beginKeywords) { + mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')\\b'; + } + if (!mode.begin) + mode.begin = /\B|\b/; + mode.beginRe = langRe(mode.begin); + if (!mode.end && !mode.endsWithParent) + mode.end = /\B|\b/; + if (mode.end) + mode.endRe = langRe(mode.end); + mode.terminator_end = reStr(mode.end) || ''; + if (mode.endsWithParent && parent.terminator_end) + mode.terminator_end += (mode.end ? '|' : '') + parent.terminator_end; + } + if (mode.illegal) + mode.illegalRe = langRe(mode.illegal); + if (mode.relevance === undefined) + mode.relevance = 1; + if (!mode.contains) { + mode.contains = []; + } + var expanded_contains = []; + mode.contains.forEach(function(c) { + if (c.variants) { + c.variants.forEach(function(v) {expanded_contains.push(inherit(c, v));}); + } else { + expanded_contains.push(c == 'self' ? mode : c); + } + }); + mode.contains = expanded_contains; + mode.contains.forEach(function(c) {compileMode(c, mode);}); + + if (mode.starts) { + compileMode(mode.starts, parent); + } + + var terminators = + mode.contains.map(function(c) { + return c.beginKeywords ? '\\.?(' + c.begin + ')\\.?' : c.begin; + }) + .concat([mode.terminator_end, mode.illegal]) + .map(reStr) + .filter(Boolean); + mode.terminators = terminators.length ? langRe(terminators.join('|'), true) : {exec: function(/*s*/) {return null;}}; + } + + compileMode(language); + } + + /* + Core highlighting function. Accepts a language name, or an alias, and a + string with the code to highlight. Returns an object with the following + properties: + + - relevance (int) + - value (an HTML string with highlighting markup) + + */ + function highlight(name, value, ignore_illegals, continuation) { + + function subMode(lexeme, mode) { + for (var i = 0; i < mode.contains.length; i++) { + if (testRe(mode.contains[i].beginRe, lexeme)) { + return mode.contains[i]; + } + } + } + + function endOfMode(mode, lexeme) { + if (testRe(mode.endRe, lexeme)) { + while (mode.endsParent && mode.parent) { + mode = mode.parent; + } + return mode; + } + if (mode.endsWithParent) { + return endOfMode(mode.parent, lexeme); + } + } + + function isIllegal(lexeme, mode) { + return !ignore_illegals && testRe(mode.illegalRe, lexeme); + } + + function keywordMatch(mode, match) { + var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0]; + return mode.keywords.hasOwnProperty(match_str) && mode.keywords[match_str]; + } + + function buildSpan(classname, insideSpan, leaveOpen, noPrefix) { + var classPrefix = noPrefix ? '' : options.classPrefix, + openSpan = ''; + + return openSpan + insideSpan + closeSpan; + } + + function processKeywords() { + if (!top.keywords) + return escape(mode_buffer); + var result = ''; + var last_index = 0; + top.lexemesRe.lastIndex = 0; + var match = top.lexemesRe.exec(mode_buffer); + while (match) { + result += escape(mode_buffer.substr(last_index, match.index - last_index)); + var keyword_match = keywordMatch(top, match); + if (keyword_match) { + relevance += keyword_match[1]; + result += buildSpan(keyword_match[0], escape(match[0])); + } else { + result += escape(match[0]); + } + last_index = top.lexemesRe.lastIndex; + match = top.lexemesRe.exec(mode_buffer); + } + return result + escape(mode_buffer.substr(last_index)); + } + + function processSubLanguage() { + var explicit = typeof top.subLanguage == 'string'; + if (explicit && !languages[top.subLanguage]) { + return escape(mode_buffer); + } + + var result = explicit ? + highlight(top.subLanguage, mode_buffer, true, continuations[top.subLanguage]) : + highlightAuto(mode_buffer, top.subLanguage.length ? top.subLanguage : undefined); + + // Counting embedded language score towards the host language may be disabled + // with zeroing the containing mode relevance. Usecase in point is Markdown that + // allows XML everywhere and makes every XML snippet to have a much larger Markdown + // score. + if (top.relevance > 0) { + relevance += result.relevance; + } + if (explicit) { + continuations[top.subLanguage] = result.top; + } + return buildSpan(result.language, result.value, false, true); + } + + function processBuffer() { + return top.subLanguage !== undefined ? processSubLanguage() : processKeywords(); + } + + function startNewMode(mode, lexeme) { + var markup = mode.className? buildSpan(mode.className, '', true): ''; + if (mode.returnBegin) { + result += markup; + mode_buffer = ''; + } else if (mode.excludeBegin) { + result += escape(lexeme) + markup; + mode_buffer = ''; + } else { + result += markup; + mode_buffer = lexeme; + } + top = Object.create(mode, {parent: {value: top}}); + } + + function processLexeme(buffer, lexeme) { + + mode_buffer += buffer; + if (lexeme === undefined) { + result += processBuffer(); + return 0; + } + + var new_mode = subMode(lexeme, top); + if (new_mode) { + result += processBuffer(); + startNewMode(new_mode, lexeme); + return new_mode.returnBegin ? 0 : lexeme.length; + } + + var end_mode = endOfMode(top, lexeme); + if (end_mode) { + var origin = top; + if (!(origin.returnEnd || origin.excludeEnd)) { + mode_buffer += lexeme; + } + result += processBuffer(); + do { + if (top.className) { + result += ''; + } + relevance += top.relevance; + top = top.parent; + } while (top != end_mode.parent); + if (origin.excludeEnd) { + result += escape(lexeme); + } + mode_buffer = ''; + if (end_mode.starts) { + startNewMode(end_mode.starts, ''); + } + return origin.returnEnd ? 0 : lexeme.length; + } + + if (isIllegal(lexeme, top)) + throw new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.className || '') + '"'); + + /* + Parser should not reach this point as all types of lexemes should be caught + earlier, but if it does due to some bug make sure it advances at least one + character forward to prevent infinite looping. + */ + mode_buffer += lexeme; + return lexeme.length || 1; + } + + var language = getLanguage(name); + if (!language) { + throw new Error('Unknown language: "' + name + '"'); + } + + compileLanguage(language); + var top = continuation || language; + var continuations = {}; // keep continuations for sub-languages + var result = '', current; + for(current = top; current != language; current = current.parent) { + if (current.className) { + result = buildSpan(current.className, '', true) + result; + } + } + var mode_buffer = ''; + var relevance = 0; + try { + var match, count, index = 0; + while (true) { + top.terminators.lastIndex = index; + match = top.terminators.exec(value); + if (!match) + break; + count = processLexeme(value.substr(index, match.index - index), match[0]); + index = match.index + count; + } + processLexeme(value.substr(index)); + for(current = top; current.parent; current = current.parent) { // close dangling modes + if (current.className) { + result += '
'; + } + } + return { + relevance: relevance, + value: result, + language: name, + top: top + }; + } catch (e) { + if (e.message.indexOf('Illegal') != -1) { + return { + relevance: 0, + value: escape(value) + }; + } else { + throw e; + } + } + } + + /* + Highlighting with language detection. Accepts a string with the code to + highlight. Returns an object with the following properties: + + - language (detected language) + - relevance (int) + - value (an HTML string with highlighting markup) + - second_best (object with the same structure for second-best heuristically + detected language, may be absent) + + */ + function highlightAuto(text, languageSubset) { + languageSubset = languageSubset || options.languages || Object.keys(languages); + var result = { + relevance: 0, + value: escape(text) + }; + var second_best = result; + languageSubset.forEach(function(name) { + if (!getLanguage(name)) { + return; + } + var current = highlight(name, text, false); + current.language = name; + if (current.relevance > second_best.relevance) { + second_best = current; + } + if (current.relevance > result.relevance) { + second_best = result; + result = current; + } + }); + if (second_best.language) { + result.second_best = second_best; + } + return result; + } + + /* + Post-processing of the highlighted markup: + + - replace TABs with something more useful + - replace real line-breaks with '
' for non-pre containers + + */ + function fixMarkup(value) { + if (options.tabReplace) { + value = value.replace(/^((<[^>]+>|\t)+)/gm, function(match, p1 /*..., offset, s*/) { + return p1.replace(/\t/g, options.tabReplace); + }); + } + if (options.useBR) { + value = value.replace(/\n/g, '
'); + } + return value; + } + + function buildClassName(prevClassName, currentLang, resultLang) { + var language = currentLang ? aliases[currentLang] : resultLang, + result = [prevClassName.trim()]; + + if (!prevClassName.match(/\bhljs\b/)) { + result.push('hljs'); + } + + if (prevClassName.indexOf(language) === -1) { + result.push(language); + } + + return result.join(' ').trim(); + } + + /* + Applies highlighting to a DOM node containing code. Accepts a DOM node and + two optional parameters for fixMarkup. + */ + function highlightBlock(block) { + var language = blockLanguage(block); + if (isNotHighlighted(language)) + return; + + var node; + if (options.useBR) { + node = document.createElementNS('http://www.w3.org/1999/xhtml', 'div'); + node.innerHTML = block.innerHTML.replace(/\n/g, '').replace(//g, '\n'); + } else { + node = block; + } + var text = node.textContent; + var result = language ? highlight(language, text, true) : highlightAuto(text); + + var originalStream = nodeStream(node); + if (originalStream.length) { + var resultNode = document.createElementNS('http://www.w3.org/1999/xhtml', 'div'); + resultNode.innerHTML = result.value; + result.value = mergeStreams(originalStream, nodeStream(resultNode), text); + } + result.value = fixMarkup(result.value); + + block.innerHTML = result.value; + block.className = buildClassName(block.className, language, result.language); + block.result = { + language: result.language, + re: result.relevance + }; + if (result.second_best) { + block.second_best = { + language: result.second_best.language, + re: result.second_best.relevance + }; + } + } + + var options = { + classPrefix: 'hljs-', + tabReplace: null, + useBR: false, + languages: undefined + }; + + /* + Updates highlight.js global options with values passed in the form of an object + */ + function configure(user_options) { + options = inherit(options, user_options); + } + + /* + Applies highlighting to all
..
blocks on a page. + */ + function initHighlighting() { + if (initHighlighting.called) + return; + initHighlighting.called = true; + + var blocks = document.querySelectorAll('pre code'); + Array.prototype.forEach.call(blocks, highlightBlock); + } + + /* + Attaches highlighting to the page load event. + */ + function initHighlightingOnLoad() { + addEventListener('DOMContentLoaded', initHighlighting, false); + addEventListener('load', initHighlighting, false); + } + + var languages = {}; + var aliases = {}; + + function registerLanguage(name, language) { + var lang = languages[name] = language(hljs); + if (lang.aliases) { + lang.aliases.forEach(function(alias) {aliases[alias] = name;}); + } + } + + function listLanguages() { + return Object.keys(languages); + } + + function getLanguage(name) { + return languages[name] || languages[aliases[name]]; + } + + /* Interface definition */ + + hljs.highlight = highlight; + hljs.highlightAuto = highlightAuto; + hljs.fixMarkup = fixMarkup; + hljs.highlightBlock = highlightBlock; + hljs.configure = configure; + hljs.initHighlighting = initHighlighting; + hljs.initHighlightingOnLoad = initHighlightingOnLoad; + hljs.registerLanguage = registerLanguage; + hljs.listLanguages = listLanguages; + hljs.getLanguage = getLanguage; + hljs.inherit = inherit; + + // Common regexps + hljs.IDENT_RE = '[a-zA-Z]\\w*'; + hljs.UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*'; + hljs.NUMBER_RE = '\\b\\d+(\\.\\d+)?'; + hljs.C_NUMBER_RE = '(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float + hljs.BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b... + hljs.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~'; + + // Common modes + hljs.BACKSLASH_ESCAPE = { + begin: '\\\\[\\s\\S]', relevance: 0 + }; + hljs.APOS_STRING_MODE = { + className: 'string', + begin: '\'', end: '\'', + illegal: '\\n', + contains: [hljs.BACKSLASH_ESCAPE] + }; + hljs.QUOTE_STRING_MODE = { + className: 'string', + begin: '"', end: '"', + illegal: '\\n', + contains: [hljs.BACKSLASH_ESCAPE] + }; + hljs.PHRASAL_WORDS_MODE = { + begin: /\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/ + }; + hljs.COMMENT = function (begin, end, inherits) { + var mode = hljs.inherit( + { + className: 'comment', + begin: begin, end: end, + contains: [] + }, + inherits || {} + ); + mode.contains.push(hljs.PHRASAL_WORDS_MODE); + mode.contains.push({ + className: 'doctag', + begin: "(?:TODO|FIXME|NOTE|BUG|XXX):", + relevance: 0 + }); + return mode; + }; + hljs.C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$'); + hljs.C_BLOCK_COMMENT_MODE = hljs.COMMENT('/\\*', '\\*/'); + hljs.HASH_COMMENT_MODE = hljs.COMMENT('#', '$'); + hljs.NUMBER_MODE = { + className: 'number', + begin: hljs.NUMBER_RE, + relevance: 0 + }; + hljs.C_NUMBER_MODE = { + className: 'number', + begin: hljs.C_NUMBER_RE, + relevance: 0 + }; + hljs.BINARY_NUMBER_MODE = { + className: 'number', + begin: hljs.BINARY_NUMBER_RE, + relevance: 0 + }; + hljs.CSS_NUMBER_MODE = { + className: 'number', + begin: hljs.NUMBER_RE + '(' + + '%|em|ex|ch|rem' + + '|vw|vh|vmin|vmax' + + '|cm|mm|in|pt|pc|px' + + '|deg|grad|rad|turn' + + '|s|ms' + + '|Hz|kHz' + + '|dpi|dpcm|dppx' + + ')?', + relevance: 0 + }; + hljs.REGEXP_MODE = { + className: 'regexp', + begin: /\//, end: /\/[gimuy]*/, + illegal: /\n/, + contains: [ + hljs.BACKSLASH_ESCAPE, + { + begin: /\[/, end: /\]/, + relevance: 0, + contains: [hljs.BACKSLASH_ESCAPE] + } + ] + }; + hljs.TITLE_MODE = { + className: 'title', + begin: hljs.IDENT_RE, + relevance: 0 + }; + hljs.UNDERSCORE_TITLE_MODE = { + className: 'title', + begin: hljs.UNDERSCORE_IDENT_RE, + relevance: 0 + }; + +hljs.registerLanguage('bash', function(hljs) { + var VAR = { + className: 'variable', + variants: [ + {begin: /\$[\w\d#@][\w\d_]*/}, + {begin: /\$\{(.*?)}/} + ] + }; + var QUOTE_STRING = { + className: 'string', + begin: /"/, end: /"/, + contains: [ + hljs.BACKSLASH_ESCAPE, + VAR, + { + className: 'variable', + begin: /\$\(/, end: /\)/, + contains: [hljs.BACKSLASH_ESCAPE] + } + ] + }; + var APOS_STRING = { + className: 'string', + begin: /'/, end: /'/ + }; + + return { + aliases: ['sh', 'zsh'], + lexemes: /-?[a-z\.]+/, + keywords: { + keyword: + 'if then else elif fi for while in do done case esac function', + literal: + 'true false', + built_in: + // Shell built-ins + // http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html + 'break cd continue eval exec exit export getopts hash pwd readonly return shift test times ' + + 'trap umask unset mvn ant webAppCreator i18nCreator ' + + // Bash built-ins + 'alias bind builtin caller command declare echo enable help let local logout mapfile printf ' + + 'read readarray source type typeset ulimit unalias ' + + // Shell modifiers + 'set shopt ' + + // Zsh built-ins + 'autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles ' + + 'compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate ' + + 'fc fg float functions getcap getln history integer jobs kill limit log noglob popd print ' + + 'pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit ' + + 'unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof ' + + 'zpty zregexparse zsocket zstyle ztcp', + operator: + '-ne -eq -lt -gt -f -d -e -s -l -a' // relevance booster + }, + contains: [ + { + className: 'shebang', + begin: /^#![^\n]+sh\s*$/, + relevance: 10 + }, + { + className: 'function', + begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/, + returnBegin: true, + contains: [hljs.inherit(hljs.TITLE_MODE, {begin: /\w[\w\d_]*/})], + relevance: 0 + }, + hljs.HASH_COMMENT_MODE, + hljs.NUMBER_MODE, + QUOTE_STRING, + APOS_STRING, + VAR + ] + }; +}); + +hljs.registerLanguage('css', function(hljs) { + var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*'; + var FUNCTION = { + className: 'function', + begin: IDENT_RE + '\\(', + returnBegin: true, + excludeEnd: true, + end: '\\(' + }; + var RULE = { + className: 'rule', + begin: /[A-Z\_\.\-]+\s*:/, returnBegin: true, end: ';', endsWithParent: true, + contains: [ + { + className: 'attribute', + begin: /\S/, end: ':', excludeEnd: true, + starts: { + className: 'value', + endsWithParent: true, excludeEnd: true, + contains: [ + FUNCTION, + hljs.CSS_NUMBER_MODE, + hljs.QUOTE_STRING_MODE, + hljs.APOS_STRING_MODE, + hljs.C_BLOCK_COMMENT_MODE, + { + className: 'hexcolor', begin: '#[0-9A-Fa-f]+' + }, + { + className: 'important', begin: '!important' + } + ] + } + } + ] + }; + + return { + case_insensitive: true, + illegal: /[=\/|'\$]/, + contains: [ + hljs.C_BLOCK_COMMENT_MODE, + RULE, + { + className: 'id', begin: /\#[A-Za-z0-9_-]+/ + }, + { + className: 'class', begin: /\.[A-Za-z0-9_-]+/ + }, + { + className: 'attr_selector', + begin: /\[/, end: /\]/, + illegal: '$' + }, + { + className: 'pseudo', + begin: /:(:)?[a-zA-Z0-9\_\-\+\(\)"']+/ + }, + { + className: 'at_rule', + begin: '@(font-face|page)', + lexemes: '[a-z-]+', + keywords: 'font-face page' + }, + { + className: 'at_rule', + begin: '@', end: '[{;]', // at_rule eating first "{" is a good thing + // because it doesn’t let it to be parsed as + // a rule set but instead drops parser into + // the default mode which is how it should be. + contains: [ + { + className: 'keyword', + begin: /\S+/ + }, + { + begin: /\s/, endsWithParent: true, excludeEnd: true, + relevance: 0, + contains: [ + FUNCTION, + hljs.APOS_STRING_MODE, hljs.QUOTE_STRING_MODE, + hljs.CSS_NUMBER_MODE + ] + } + ] + }, + { + className: 'tag', begin: IDENT_RE, + relevance: 0 + }, + { + className: 'rules', + begin: '{', end: '}', + illegal: /\S/, + contains: [ + hljs.C_BLOCK_COMMENT_MODE, + RULE, + ] + } + ] + }; +}); + +hljs.registerLanguage('java', function(hljs) { + var GENERIC_IDENT_RE = hljs.UNDERSCORE_IDENT_RE + '(<' + hljs.UNDERSCORE_IDENT_RE + '>)?'; + var KEYWORDS = + 'false synchronized int abstract float private char boolean static null if const ' + + 'for true while long strictfp finally protected import native final void ' + + 'enum else break transient catch instanceof byte super volatile case assert short ' + + 'package default double public try this switch continue throws protected public private'; + + // https://docs.oracle.com/javase/7/docs/technotes/guides/language/underscores-literals.html + var JAVA_NUMBER_RE = '\\b' + + '(' + + '0[bB]([01]+[01_]+[01]+|[01]+)' + // 0b... + '|' + + '0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)' + // 0x... + '|' + + '(' + + '([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?' + + '|' + + '\\.([\\d]+[\\d_]+[\\d]+|[\\d]+)' + + ')' + + '([eE][-+]?\\d+)?' + // octal, decimal, float + ')' + + '[lLfF]?'; + var JAVA_NUMBER_MODE = { + className: 'number', + begin: JAVA_NUMBER_RE, + relevance: 0 + }; + + return { + aliases: ['jsp'], + keywords: KEYWORDS, + illegal: /<\//, + contains: [ + hljs.COMMENT( + '/\\*\\*', + '\\*/', + { + relevance : 0, + contains : [{ + className : 'doctag', + begin : '@[A-Za-z]+' + }] + } + ), + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + { + className: 'class', + beginKeywords: 'class interface', end: /[{;=]/, excludeEnd: true, + keywords: 'class interface', + illegal: /[:"\[\]]/, + contains: [ + {beginKeywords: 'extends implements'}, + hljs.UNDERSCORE_TITLE_MODE + ] + }, + { + // Expression keywords prevent 'keyword Name(...)' from being + // recognized as a function definition + beginKeywords: 'new throw return else', + relevance: 0 + }, + { + className: 'function', + begin: '(' + GENERIC_IDENT_RE + '\\s+)+' + hljs.UNDERSCORE_IDENT_RE + '\\s*\\(', returnBegin: true, end: /[{;=]/, + excludeEnd: true, + keywords: KEYWORDS, + contains: [ + { + begin: hljs.UNDERSCORE_IDENT_RE + '\\s*\\(', returnBegin: true, + relevance: 0, + contains: [hljs.UNDERSCORE_TITLE_MODE] + }, + { + className: 'params', + begin: /\(/, end: /\)/, + keywords: KEYWORDS, + relevance: 0, + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + hljs.C_NUMBER_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ] + }, + JAVA_NUMBER_MODE, + { + className: 'annotation', begin: '@[A-Za-z]+' + } + ] + }; +}); + +hljs.registerLanguage('javascript', function(hljs) { + return { + aliases: ['js'], + keywords: { + keyword: + 'in of if for while finally var new function do return void else break catch ' + + 'instanceof with throw case default try this switch continue typeof delete ' + + 'let yield const export super debugger as async await', + literal: + 'true false null undefined NaN Infinity', + built_in: + 'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' + + 'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' + + 'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' + + 'TypeError URIError Number Math Date String RegExp Array Float32Array ' + + 'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' + + 'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' + + 'module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect ' + + 'Promise' + }, + contains: [ + { + className: 'pi', + relevance: 10, + begin: /^\s*['"]use (strict|asm)['"]/ + }, + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE, + { // template string + className: 'string', + begin: '`', end: '`', + contains: [ + hljs.BACKSLASH_ESCAPE, + { + className: 'subst', + begin: '\\$\\{', end: '\\}' + } + ] + }, + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + { + className: 'number', + variants: [ + { begin: '\\b(0[bB][01]+)' }, + { begin: '\\b(0[oO][0-7]+)' }, + { begin: hljs.C_NUMBER_RE } + ], + relevance: 0 + }, + { // "value" container + begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*', + keywords: 'return throw case', + contains: [ + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE, + hljs.REGEXP_MODE, + { // E4X / JSX + begin: /\s*[);\]]/, + relevance: 0, + subLanguage: 'xml' + } + ], + relevance: 0 + }, + { + className: 'function', + beginKeywords: 'function', end: /\{/, excludeEnd: true, + contains: [ + hljs.inherit(hljs.TITLE_MODE, {begin: /[A-Za-z$_][0-9A-Za-z$_]*/}), + { + className: 'params', + begin: /\(/, end: /\)/, + excludeBegin: true, + excludeEnd: true, + contains: [ + hljs.C_LINE_COMMENT_MODE, + hljs.C_BLOCK_COMMENT_MODE + ], + illegal: /["'\(]/ + } + ], + illegal: /\[|%/ + }, + { + begin: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something` + }, + { + begin: '\\.' + hljs.IDENT_RE, relevance: 0 // hack: prevents detection of keywords after dots + }, + // ECMAScript 6 modules import + { + beginKeywords: 'import', end: '[;$]', + keywords: 'import from as', + contains: [ + hljs.APOS_STRING_MODE, + hljs.QUOTE_STRING_MODE + ] + }, + { // ES6 class + className: 'class', + beginKeywords: 'class', end: /[{;=]/, excludeEnd: true, + illegal: /[:"\[\]]/, + contains: [ + {beginKeywords: 'extends'}, + hljs.UNDERSCORE_TITLE_MODE + ] + } + ] + }; +}); + +hljs.registerLanguage('json', function(hljs) { + var LITERALS = {literal: 'true false null'}; + var TYPES = [ + hljs.QUOTE_STRING_MODE, + hljs.C_NUMBER_MODE + ]; + var VALUE_CONTAINER = { + className: 'value', + end: ',', endsWithParent: true, excludeEnd: true, + contains: TYPES, + keywords: LITERALS + }; + var OBJECT = { + begin: '{', end: '}', + contains: [ + { + className: 'attribute', + begin: '\\s*"', end: '"\\s*:\\s*', excludeBegin: true, excludeEnd: true, + contains: [hljs.BACKSLASH_ESCAPE], + illegal: '\\n', + starts: VALUE_CONTAINER + } + ], + illegal: '\\S' + }; + var ARRAY = { + begin: '\\[', end: '\\]', + contains: [hljs.inherit(VALUE_CONTAINER, {className: null})], // inherit is also a workaround for a bug that makes shared modes with endsWithParent compile only the ending of one of the parents + illegal: '\\S' + }; + TYPES.splice(TYPES.length, 0, OBJECT, ARRAY); + return { + contains: TYPES, + keywords: LITERALS, + illegal: '\\S' + }; +}); + +hljs.registerLanguage('xml', function(hljs) { + var XML_IDENT_RE = '[A-Za-z0-9\\._:-]+'; + var PHP = { + begin: /<\?(php)?(?!\w)/, end: /\?>/, + subLanguage: 'php' + }; + var TAG_INTERNALS = { + endsWithParent: true, + illegal: /]+/} + ] + } + ] + } + ] + }; + return { + aliases: ['html', 'xhtml', 'rss', 'atom', 'xsl', 'plist'], + case_insensitive: true, + contains: [ + { + className: 'doctype', + begin: '', + relevance: 10, + contains: [{begin: '\\[', end: '\\]'}] + }, + hljs.COMMENT( + '', + { + relevance: 10 + } + ), + { + className: 'cdata', + begin: '<\\!\\[CDATA\\[', end: '\\]\\]>', + relevance: 10 + }, + { + className: 'tag', + /* + The lookahead pattern (?=...) ensures that 'begin' only matches + '|$)', end: '>', + keywords: {title: 'style'}, + contains: [TAG_INTERNALS], + starts: { + end: '', returnEnd: true, + subLanguage: 'css' + } + }, + { + className: 'tag', + // See the comment in the + true + ${project.build.directory}/www + ${project.build.directory}/extra + + **/*Test.java + + false - - - org.codehaus.mojo - gwt-maven-plugin - ${gwt.version} - - - - 180 - **/*GwtTest.java - htmlunit - gen - -Xss1024k -Xmx512M -XX:MaxPermSize=512m - true - com.google.gwt.site.webapp.GWTProject - - true - - - - compile - test - - - - - - maven-dependency-plugin - - - unpack-dependencies - prepare-package - - unpack-dependencies - - - com.google.gwt.site - gwt-site - true - ${project.build.directory}/www/ - - - - maven-resources-plugin - copy-resources + + copy-sourcemap-resources prepare-package copy-resources - ${project.build.directory}/www/gwtproject/ + ${project.build.directory}/${project.artifactId}-${project.version}/ + + + ${project.build.directory}/extra/gwtproject/src + src + + - ${project.build.directory}/${project.artifactId}-${project.version}/gwtproject/ + ${project.build.directory}/extra/gwtproject/symbolMaps + + *.json + + src @@ -182,4 +125,65 @@ + + + + full-site + + + com.google.gwt.site + gwt-site + ${project.version} + zip + generated-site + + + + + + maven-dependency-plugin + + + unpack-dependencies + prepare-package + + unpack-dependencies + + + com.google.gwt.site + gwt-site + true + ${project.build.directory}/www/ + + + + + + maven-resources-plugin + + + + copy-www-resources + prepare-package + + copy-resources + + + ${project.build.directory}/www/ + + + ${project.build.directory}/${project.artifactId}-${project.version}/ + + + + + + + + + + diff --git a/src/main/java/com/google/gwt/site/webapp/GWTProjectSuperDevMode.gwt.xml b/src/main/java/com/google/gwt/site/webapp/GWTProjectSuperDevMode.gwt.xml deleted file mode 100644 index 81577f6b5..000000000 --- a/src/main/java/com/google/gwt/site/webapp/GWTProjectSuperDevMode.gwt.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java index 0cd9ab536..d2d2c08fc 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java +++ b/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java @@ -13,41 +13,28 @@ * License for the specific language governing permissions and limitations under * the License. */ + package com.google.gwt.site.webapp.client; -import static com.google.gwt.query.client.GQuery.$; -import static com.google.gwt.query.client.GQuery.body; -import static com.google.gwt.query.client.GQuery.window; +import static elemental2.dom.DomGlobal.*; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; -import com.google.gwt.dom.client.Element; -import com.google.gwt.dom.client.InputElement; -import com.google.gwt.dom.client.Style; -import com.google.gwt.event.logical.shared.ResizeEvent; -import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.shared.HandlerRegistration; -import com.google.gwt.query.client.Function; -import com.google.gwt.query.client.GQuery; -import com.google.gwt.query.client.Predicate; -import com.google.gwt.query.client.Properties; -import com.google.gwt.query.client.js.JsUtils; -import com.google.gwt.query.client.plugins.ajax.Ajax; import com.google.gwt.regexp.shared.RegExp; import com.google.gwt.site.webapp.client.highlight.JsHighlight; -import com.google.gwt.user.client.Event; import com.google.gwt.user.client.Window; -import com.google.gwt.user.client.ui.impl.HyperlinkImpl; +import elemental2.core.JsArray; +import elemental2.core.JsWeakMap; +import elemental2.dom.*; +import jsinterop.annotations.JsFunction; +import jsinterop.base.JsArrayLike; public class GWTProjectEntryPoint implements EntryPoint { private static final int ANIMATION_TIME = 200; - private static final HyperlinkImpl clickHelper = GWT.create(HyperlinkImpl.class); - - private static Properties history = JsUtils.prop(window, "history"); - // Visible for testing // The absolute path to the url root (http://gwtproject.com) static String origin = GWT.getModuleBaseForStaticFiles() @@ -60,10 +47,55 @@ public class GWTProjectEntryPoint implements EntryPoint { + "|^(?!(#|[a-z#]+:))(?!.*(|/)javadoc/)(?!.*\\.(jpe?g|png|mpe?g|mp[34]|avi)$)", "i"); - private static boolean isPushstateCapable = history.get("pushState") != null; - private static boolean ajaxEnabled = isPushstateCapable && origin.startsWith("http"); + private static boolean ajaxEnabled = origin.startsWith("http"); private static String currentPage = Window.Location.getPath(); private HandlerRegistration resizeHandler; + private EventListener homeScrollHandler; + private final JsWeakMap clickHandlers = new JsWeakMap<>(); + + private void slideToggle(HTMLElement el, int animationTime, boolean open) { + if (open) { + slideDown(el, animationTime); + } else { + slideUp(el, animationTime); + } + } + + private void slideDown(HTMLElement el, int animationTime) { + el.style.display = ""; + animateMaxHeight(el, 0, estimateHeight(el), animationTime); + } + + private void slideUp(HTMLElement el, int animationTime) { + animateMaxHeight(el, estimateHeight(el), 0, animationTime); + } + + private int estimateHeight(HTMLElement el) { + // applied as max-height, so overestimating only makes the animation + // lag slightly towards the start/end + return el.childElementCount * 33; + } + + private void animateMaxHeight(HTMLElement el, int from, int to, int animationTime) { + if (animationTime == 0) { + el.style.setProperty("display", to == 0 ? "none" : ""); + return; + } + el.style.setProperty("max-height", from + "px"); + el.style.setProperty("overflow", "hidden"); + el.style.setProperty("transition", "max-height " + animationTime + "ms ease-in-out"); + if (!el.dataset.has("transitionListener")) { + el.addEventListener("transitionend", evt -> { + String maxHeight = el.style.removeProperty("max-height"); + el.style.removeProperty("overflow"); + if ("0px".equals(maxHeight)) { + el.style.setProperty("display", "none"); + } + }); + el.dataset.set("transitionListener", "true"); + } + Scheduler.get().scheduleDeferred(() -> el.style.setProperty("max-height", to + "px")); + } @Override public void onModuleLoad() { @@ -73,47 +105,39 @@ public void onModuleLoad() { enhanceMenu(); onPageLoaded(false); - $(".holder").show(); + querySelector(".holder").style.display = ""; + } + + private HTMLElement querySelector(String selector) { + return (HTMLElement) document.querySelector(selector); } private void highLight() { JsHighlight.INSTANCE.initialize(); - $("pre > code").each(new Function(){ - public void f(Element e) { - JsHighlight.INSTANCE.highlightBlock(e); - } - }); + forEach("pre > code", JsHighlight.INSTANCE::highlightBlock); } private void bindSearch() { - $("#search form").submit(new Function() { - @Override - public boolean f(Event e) { - InputElement input = $(this).children("input").get(0).cast(); - - doSearch(input.getValue()); - - return false; - } + HTMLElement form = querySelector("#search form"); + form.addEventListener("submit", (evt) -> { + HTMLInputElement input = (HTMLInputElement) form.querySelector("input"); + doSearch(input.value); + evt.preventDefault(); }); } private void enhanceMenu() { - $("#nav").not(".alwaysOpen") - .hover( - new Function() { - @Override - public void f(Element e) { - $(e).removeClass("closed"); - } - }, - new Function() { - @Override - public void f(Element e) { - $(e).addClass("closed"); - } - } - ); + HTMLElement nav = querySelector("#nav"); + nav.addEventListener("mouseenter", evt -> { + if (!nav.classList.contains("alwaysOpen")) { + nav.classList.remove("closed"); + } + }); + nav.addEventListener("mouseleave", evt -> { + if (!nav.classList.contains("alwaysOpen")) { + nav.classList.add("closed"); + } + }); } /* @@ -122,68 +146,94 @@ public void f(Element e) { private void openMenu() { // close all submenus // todo hide first anchor with css - $("#submenu > nav > ul > li").hide().children("a").hide(); + forEach("#submenu > nav > ul > li", el -> { + el.style.display = "none"; + forEachChild(el, "a", child -> child.style.display = "none"); + }); String path = Window.Location.getPath(); - GQuery selectedItem = $("#submenu a[href='" + path + "']") - .filter(new Predicate() { - @Override - public boolean f(Element e, int index) { - return !Style.Display.NONE.getCssName().equals(e.getStyle().getDisplay()); - } - }) - .eq(0); + JsArrayLike matchingLinks = document + .querySelectorAll("#submenu a[href='" + path + "']"); + HTMLElement selectedItem = (HTMLElement) JsArray.from(matchingLinks) + .find((el, index, parent) -> !"none".equals(((HTMLElement) el).style.display)); + String mainNavigationHref; + String mainTitle; + if (selectedItem != null) { + + showBranch(selectedItem); - showBranch(selectedItem); + JsArray liParents = parentMenuItems(selectedItem); - GQuery liParents = selectedItem - .parentsUntil("#submenu") - .filter("li"); - GQuery subMenuItem = liParents.last(); + HTMLElement subMenuItem = liParents.getAt(liParents.length - 1); + + subMenuItem.style.display = ""; + forEach("#submenu .active", el -> { + if (liParents.indexOf(el) < 0) { + el.classList.remove("active"); + } + }); + liParents.push(selectedItem); + liParents.forEach((el, index, array) -> { + if (el != selectedItem.parentElement) { + el.classList.add("active"); + } + return null; + }); + mainNavigationHref = subMenuItem.querySelector("a").getAttribute("href"); + mainTitle = subMenuItem.querySelector("a").textContent + " - " + selectedItem.textContent; + } else { + mainNavigationHref = Window.Location.getPath(); + mainTitle = isOverviewPage(mainNavigationHref) ? "Overview" : "Project"; + } - subMenuItem.show(); - String mainNavigationHref = subMenuItem.children("a").attr("href"); + forEach("#nav a.active", el -> el.classList.remove("active")); + forEach("#nav a[href='" + mainNavigationHref + "']", el -> el.classList.add("active")); - $("#nav a.active").removeClass("active"); - $("#nav a[href='" + mainNavigationHref + "']").addClass("active"); - $("#submenu .active").not(liParents).removeClass("active"); - liParents.add(selectedItem).not(selectedItem.parent()).addClass("active"); // Change the page title for easy bookmarking - $("title").text("[GWT] " + subMenuItem.children("a").text() + " - " + selectedItem.text()); + querySelector("title").textContent = "[GWT] " + mainTitle; boolean homePage = isHomePage(path); boolean overviewPage = isOverviewPage(path); - $("#nav").toggleClass("alwaysOpen", homePage); - $("#content").toggleClass("home", homePage); - if (homePage || overviewPage) { - $("#submenu").hide(); - } else { - $("#submenu").show(); + querySelector("#nav").classList.toggle("alwaysOpen", homePage); + querySelector("#content").classList.toggle("home", homePage); + if (querySelector("#submenu") != null) { + if (homePage || overviewPage) { + querySelector("#submenu").style.display = "none"; + } else { + querySelector("#submenu").style.display = ""; + } } maybeStyleHomepage(); } + private JsArray parentMenuItems(HTMLElement selectedItem) { + JsArray ret = new JsArray<>(); + Element current = selectedItem; + while (current != null) { + if (current.tagName.equalsIgnoreCase("li")) { + ret.push((HTMLElement) current); + } + if ("submenu".equals(current.id)) { + break; + } + current = current.parentElement; + } + return ret; + } + /* * Enhance the page adding handlers and replacing relative by absolute urls */ private void enhancePage() { - $("#nav") - .mouseenter(new Function() { - @Override - public void f() { - $(this).removeClass("closed"); - } - }) - .mouseleave(new Function() { - @Override - public void f() { - if (!$(this).hasClass("alwaysOpen")) { - $(this).addClass("closed"); - } - } - }); + HTMLElement nav = querySelector("#nav"); + nav.addEventListener("mouseenter", evt -> nav.classList.remove("closed")); + nav.addEventListener("mouseleave", evt -> { + if (!nav.classList.contains("alwaysOpen")) { + nav.classList.add("closed"); + } + }); enhanceLinks(); @@ -195,96 +245,104 @@ public void f() { } // Use Ajax instead of default behaviour - $(body).on("click", "a", new Function() { - @Override - public boolean f(Event e) { - if (shouldEnhanceLink($(e)) && - // Is it a normal click (not ctrl/cmd/shift/right/middle click) ? - clickHelper.handleAsClick(e)) { - - // In mobile, if menu is visible, close it - $("#submenu.show").removeClass("show"); - - // Load the page using Ajax - loadPage($(e)); - return false; - } - return true; + document.body.addEventListener("click", evt -> { + Element target = (Element) evt.target; + if (target.closest("a") == null) { + return; + } + if (shouldEnhanceLink(target) + // Is it a normal click (not ctrl/cmd/shift/right/middle click) ? + && handleAsClick((MouseEvent) evt)) { + + // In mobile, if menu is visible, close it + forEach("#submenu.show", el -> el.classList.remove("show")); + + // Load the page using Ajax + loadPage(target); + evt.preventDefault(); } }); // Select the TOC item when URL changes - $(window) - .on("popstate", new Function() { - @Override - public void f() { - loadPage(null); - } - } - ); + window.addEventListener("popstate", evt -> loadPage(null)); + } + + + private boolean handleAsClick(MouseEvent event) { + int mouseButtons = event.button; + boolean modifiers = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey; + boolean middle = mouseButtons == 4; + boolean right = mouseButtons == 2; + return !modifiers && !middle && !right; } - private boolean shouldEnhanceLink(GQuery link) { + private boolean shouldEnhanceLink(Element link) { return // Enhance only local links - isSameOriginRexp.test(link.attr("href")) && + isSameOriginRexp.test(link.getAttribute("href")) // Do not load links that are marked as full page reload - !Boolean.parseBoolean(link.attr("data-full-load")); + && !Boolean.parseBoolean(link.getAttribute("data-full-load")); } private void enhanceLinks() { // Replace relative paths in anchors by absolute ones // exclude all anchors in the conHighlight and collapse menutent area. // TODO could be done on server side - $("a").not($("#content a")).each(new Function() { - @Override - public void f(Element e) { - GQuery link = $(e); - if (shouldEnhanceLink(link)) { - // No need to make complicated things for computing - // the absolute path: anchor.pathname is the way - link.attr("href", link.prop("pathname")); - } + + forEach("a:not(#content a)", el -> { + if (shouldEnhanceLink(el)) { + // No need to make complicated things for computing + // the absolute path: anchor.pathname is the way + HTMLAnchorElement link = (HTMLAnchorElement) el; + link.href = link.pathname; } }); // We add a span with the +/- icon so as the click area is well defined // this span is not rendered in server side because it is only needed // for enhancing the page. - GQuery parentItems = $("#submenu ul > li li").has("ul").prepend(""); - - $("#submenu").children("span, a[href=\"#\"]").unbind("click"); - + JsArray parentItems = new JsArray<>(); + forEach("#submenu ul > li li", el -> { + if (el.querySelector("ul") != null) { + parentItems.push(el); + el.parentElement.insertBefore(document.createElement("span"), el); + } + }); + String spanOrLocalLink = "span,a[href='#']"; + forEachChild(querySelector("#submenu"), spanOrLocalLink, el -> { + el.removeEventListener("click", clickHandlers.get(el)); + }); // Toggle the branch when clicking on the arrow or anchor without content - $(parentItems).children("span, a[href=\"#\"]").on("click", new Function() { - @Override - public boolean f(Event e) { - toggleMenu($(e).parent()); - return false; + parentItems.forEach((item, index, array) -> { + forEachChild(item, spanOrLocalLink, element -> { + EventListener eventListener = (evt) -> + toggleMenu((HTMLElement) ((Element) evt.target).parentElement); + element.addEventListener("click", eventListener); + clickHandlers.set(element, eventListener); + }); + item.classList.add("folder"); + if (!item.classList.contains("open")) { + forEachChild(item, "ul", + child -> slideUp(child, 0)); } + return null; }); - - parentItems - .addClass("folder") - .not(".open") - .children("ul") - .slideUp(0); } - private void toggleMenu(GQuery menu) { - menu.toggleClass("open") - .children("ul") - .slideToggle(ANIMATION_TIME); + private void toggleMenu(HTMLElement menu) { + boolean open = menu.classList.toggle("open"); + forEachChild(menu, "ul", + child -> slideToggle(child, ANIMATION_TIME, open)); } - private void showBranch(final GQuery item) { - Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { - @Override - public void execute() { - item.parents("li") - .addClass("open") - .children("ul") - .slideDown(ajaxEnabled ? ANIMATION_TIME : 0); + private void showBranch(final HTMLElement item) { + Scheduler.get().scheduleDeferred(() -> { + Element parent = item.closest("li"); + while (parent != null) { + parent.classList.add("open"); + forEachChild(parent, "ul", + (htmlElement) -> slideDown(htmlElement, ajaxEnabled ? ANIMATION_TIME : 0)); + parent = parent.parentElement.closest("li"); } }); } @@ -292,8 +350,8 @@ public void execute() { /* * Change URL via pushState and load the page via Ajax. */ - private void loadPage(GQuery link) { - String pageUrl = link == null ? null : link.prop("pathname"); + private void loadPage(Element link) { + String pageUrl = link == null ? null : ((HTMLAnchorElement) link).pathname; boolean shouldReplaceMenu = shouldReplaceMenu(pageUrl); if (!currentPage.equals(pageUrl)) { @@ -301,12 +359,12 @@ private void loadPage(GQuery link) { // Preserve QueryString, useful for the gwt.codesvr parameter in dev-mode. pageUrl = pageUrl.replaceFirst("(#.*|)$", Window.Location.getQueryString() + "$1"); // Set the page to load in the URL - JsUtils.runJavascriptFunction(history, "pushState", null, null, pageUrl); + history.pushState(null, null, pageUrl); } pageUrl = Window.Location.getPath(); if (!currentPage.equals(pageUrl)) { - $("#spinner").show(); + forEach("#spinner", el -> el.style.display = ""); ajaxLoad(pageUrl, shouldReplaceMenu); } else { scrollToHash(); @@ -316,26 +374,20 @@ private void loadPage(GQuery link) { } private void ajaxLoad(String pageUrl, final boolean shouldReplaceMenu) { - Ajax.Settings settings = Ajax.createSettings(); - settings.setUrl(pageUrl); - settings.setDataType("html"); - settings.setType("get"); - settings.setSuccess(new Function() { - @Override - public void f() { - GQuery content = $("
" + getArgument(0) + "
"); - - if (shouldReplaceMenu) { - $("#submenu").replaceWith(content.find("#submenu")); - } - - $("#content").replaceWith(content.find("#content")); + fetch(pageUrl).then(Response::text).then(responseText -> { + HTMLElement content = (HTMLElement) document.createElement("div"); + content.innerHTML = responseText; - onPageLoaded(shouldReplaceMenu); + if (shouldReplaceMenu) { + document.querySelector("#submenu") + .replaceWith(content.querySelector("#submenu")); } - }); - Ajax.ajax(settings); + document.querySelector("#content").replaceWith(content.querySelector("#content")); + + onPageLoaded(shouldReplaceMenu); + return null; + }); } private boolean shouldReplaceMenu(String pageUrl) { @@ -350,10 +402,15 @@ private void onPageLoaded(boolean menuReplaced) { if (menuReplaced) { enhanceLinks(); } + document.documentElement.style.removeProperty("scroll-behavior"); openMenu(); scrollToHash(); - $("#spinner").hide(); - $("#editLink").appendTo("#content h1"); + forEach("#spinner", spinner -> spinner.style.display = "none"); + HTMLElement editLink = querySelector("#editLink"); + HTMLElement heading = querySelector("#content h1"); + if (editLink != null && heading != null) { + heading.appendChild(editLink); + } // highlight loaded page highLight(); } @@ -363,8 +420,9 @@ private void onPageLoaded(boolean menuReplaced) { */ private void scrollToHash() { String hash = Window.Location.getHash(); - GQuery anchor = hash.length() > 1 ? $(hash + ", [name='" + hash.substring(1) + "']") : $(); - if (anchor.isEmpty()) { + Element anchor = hash.length() > 1 ? document.querySelector( + hash + ", [name='" + hash.substring(1) + "']") : null; + if (anchor == null) { Window.scrollTo(0, 0); } else { anchor.scrollIntoView(); @@ -372,57 +430,37 @@ private void scrollToHash() { } private void maybeStyleHomepage() { - if ($("#content").hasClass("home")) { + if (querySelector("#content").classList.contains("home")) { + document.documentElement.style.setProperty("scroll-behavior", "smooth"); styleHomepage(); - resizeHandler = Window.addResizeHandler(new ResizeHandler() { - @Override - public void onResize(ResizeEvent event) { - styleHomepage(); - } - }); + resizeHandler = Window.addResizeHandler(event -> styleHomepage()); // Pager - $(".next, .pager a").click(new Function() { - @Override - public boolean f(final Event event) { - event.preventDefault(); - $("html, body") - .each(new Function() { - @Override - public void f(Element e) { - new ScrollTopAnimation(e, getElementOffset($($(event).attr("href")))).run(600); - } - }); - return true; - } - }); - - $(".pager a").click(new Function() { - @Override - public boolean f(Event e) { - e.preventDefault(); - $(".pager a").removeClass("active"); - $(this).addClass("active"); - - return true; - } - }); - - $(window).scroll(new Function() { - @Override - public void f() { - $(".pager a").removeClass("active"); - if ($(window).scrollTop() + 100 > getElementOffset($("#letsbegin"))) { - $(".pager a:nth-child(3)").addClass("active"); - } else if ($(window).scrollTop() + 100 > getElementOffset($("#gwt"))) { - $(".pager a:nth-child(2)").addClass("active"); + forEach(".next, .pager a", (element) -> element.addEventListener("click", event -> { + event.preventDefault(); + document.documentElement.scrollTop = + getElementOffset(document.querySelector(element.getAttribute("href"))); + })); + + forEach(".pager a", (element) -> element.addEventListener("click", event -> { + forEach(".pager a", e -> e.classList.remove("active")); + element.classList.add("active"); + })); + if (homeScrollHandler == null) { + homeScrollHandler = evt -> { + forEach(".pager a", el -> el.classList.remove("active")); + if (window.scrollY + 100 > getElementOffset(document.querySelector("#letsbegin"))) { + querySelector(".pager a:nth-child(3)").classList.add("active"); + } else if (window.scrollY + 100 > getElementOffset(document.querySelector("#gwt"))) { + querySelector(".pager a:nth-child(2)").classList.add("active"); } else { - $(".pager a:nth-child(1)").addClass("active"); + querySelector(".pager a:nth-child(1)").classList.add("active"); } - } - }); + }; + } + window.addEventListener("scroll", homeScrollHandler); } else { - $(window).unbind(Event.ONSCROLL); + window.removeEventListener("scroll", homeScrollHandler); if (resizeHandler != null) { resizeHandler.removeHandler(); resizeHandler = null; @@ -430,8 +468,8 @@ public void f() { } } - private int getElementOffset(GQuery element) { - return element.offset().top + Window.getScrollTop(); + private int getElementOffset(Element element) { + return ((HTMLElement) element).offsetTop; } private boolean isOverviewPage(String path) { @@ -443,25 +481,45 @@ private boolean isHomePage(String path) { } private void styleHomepage() { - final int windowHeight = $(window).height(); - int sectionHeight = $("#letsbegin").height(); + final int windowHeight = window.innerHeight; + int sectionHeight = ((HTMLElement) document.querySelector("#letsbegin")).offsetHeight; if (windowHeight > sectionHeight) { - $(".home section").each(new Function() { - @Override - public void f() { - $(this) - .css("height", windowHeight + "px") - .css("padding", "0"); - GQuery container = $(this).find(".container"); - container.css("padding-top", (windowHeight - container.height()) / 2 + "px"); - } + forEach(".home section", element -> { + element.style.setProperty("height", windowHeight + "px"); + element.style.setProperty("padding", "0"); + HTMLElement container = (HTMLElement) element.querySelector(".container"); + container.style.setProperty("padding-top", + (windowHeight - container.offsetHeight) / 2 + "px"); }); } } + private void forEach(String selector, ElementConsumer consumer) { + document.querySelectorAll(selector).forEach((element, index, parent) -> { + consumer.accept((HTMLElement) element); + return null; + }); + } + + private void forEachChild(Element parent, String selector, ElementConsumer consumer) { + parent.childNodes.forEach((element, index, p) -> { + if (element instanceof HTMLElement) { + if (((HTMLElement) element).matches(selector)) { + consumer.accept((HTMLElement) element); + } + } + return null; + }); + } + private native void doSearch(String value) /*-{ var element = $wnd.google.search.cse.element.getElement('searchresults'); element.execute(value); }-*/; + + @JsFunction + private interface ElementConsumer { + void accept(HTMLElement element); + } } diff --git a/src/main/java/com/google/gwt/site/webapp/client/ScrollTopAnimation.java b/src/main/java/com/google/gwt/site/webapp/client/ScrollTopAnimation.java deleted file mode 100644 index 23112266b..000000000 --- a/src/main/java/com/google/gwt/site/webapp/client/ScrollTopAnimation.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2015 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. - */ -package com.google.gwt.site.webapp.client; - -import com.google.gwt.animation.client.Animation; -import com.google.gwt.dom.client.Element; -import com.google.gwt.query.client.plugins.effects.PropertiesAnimation; - -public class ScrollTopAnimation extends Animation { - - private final int end; - private final Element element; - - private int start; - - public ScrollTopAnimation(Element element, int end) { - this.element = element; - this.end = end; - } - - @Override - protected void onStart() { - start = element.getScrollTop(); - super.onStart(); - } - - @Override - protected void onUpdate(double progress) { - double value = start + (end - start) * progress; - element.setScrollTop((int) value); - } - - @Override - protected double interpolate(double progress) { - return PropertiesAnimation.EasingCurve.easeInOut.interpolate(progress); - } -} diff --git a/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java b/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java index dc7c80631..395a554cf 100644 --- a/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java +++ b/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java @@ -1,35 +1,41 @@ package com.google.gwt.site.webapp.client.highlight; import com.google.gwt.core.client.GWT; -import com.google.gwt.dom.client.Element; -import com.google.gwt.query.client.builders.JsniBundle; +import com.google.gwt.core.client.ScriptInjector; import com.google.gwt.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; +import com.google.gwt.resources.client.TextResource; +import elemental2.dom.DomGlobal; +import elemental2.dom.HTMLElement; +import jsinterop.base.Js; -public abstract class JsHighlight implements JsniBundle { +public class JsHighlight { interface CssHighlight extends ClientBundle { CssHighlight INSTANCE = GWT.create(CssHighlight.class); @Source("idea.css") CssResource idea(); + + @Source("highlight.pack.js") + TextResource highlight(); + } private static boolean initialized; public static final JsHighlight INSTANCE = GWT.create(JsHighlight.class); - @LibrarySource("highlight.pack.js") - abstract void loadHighlight(); public void initialize() { if (!initialized) { initialized = true; + ScriptInjector.fromString(CssHighlight.INSTANCE.highlight().getText()) + .setWindow(Js.uncheckedCast(DomGlobal.window)).inject(); CssHighlight.INSTANCE.idea().ensureInjected(); - loadHighlight(); } } - public native void highlightBlock(Element e) /*-{ + public native void highlightBlock(HTMLElement e) /*-{ e && $wnd.hljs && $wnd.hljs.highlightBlock(e); }-*/; } diff --git a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml b/src/main/module.gwt.xml similarity index 82% rename from src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml rename to src/main/module.gwt.xml index e624c6acb..c14dc41d0 100644 --- a/src/main/java/com/google/gwt/site/webapp/GWTProject.gwt.xml +++ b/src/main/module.gwt.xml @@ -3,16 +3,15 @@ - - + - + diff --git a/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml b/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml index 8a6351f61..150e1eab1 100644 --- a/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml +++ b/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml @@ -1,4 +1,4 @@ - + From 35f5dbb878484752d799f830094674b6c762760e Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Wed, 18 Dec 2024 11:29:13 -0600 Subject: [PATCH 55/61] Build the site when something is pushed to main, or on PRs (#9) There is room for improvement here, this is meant to be a first draft before we start merging other cleanup, to validate those merges. Fixes #7 --- .github/workflows/build.yml | 28 ++++++++++++++++++++++++++++ README.md | 33 ++++++++++++++++++++------------- pom.xml | 11 ++++++++--- src/main/module.gwt.xml | 7 +++---- 4 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..319bc380b --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,28 @@ +name: Build gwt-site-webapp +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up Java + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + cache: 'maven' + + - name: Compile the webapp to JS + run: mvn --batch-mode --no-transfer-progress -e verify + + - name: Rename generated directory + # Fixes issue where artifact zip contains top level directory due to wildcard expansion + run: mv target/gwt-site-webapp-*/ target/gwt-site-webapp + - name: Upload the generated JS + uses: actions/upload-artifact@v3 + with: + name: 'gwt-site-webapp' + path: target/gwt-site-webapp/ diff --git a/README.md b/README.md index 3aa637ed1..71b8c2352 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,35 @@ # gwt-site-webapp - This project includes the server an client code of the GWT site - It does not include the site content which is in the gwt-site project - nor the utilities for uploading the documentation to GAE Servers which - are in the gwt-site-uploader project. +This project includes the client code of the GWT site. It does not include the +site content which is in the gwt-site project nor the utilities to create and +deploy with samples and plugin releases. ## Requirements - [Apache Maven](http://maven.apache.org) 3.0 or greater, and JDK 7+ in order to run. +[Apache Maven](http://maven.apache.org) 3.8 or greater, and JDK 11+ in order to run. -- Before building the project you may need **gwt-site** packaged file. - Go to the `gwt-site` folder and run: +To build the project, invoke the following command: + + $ mvn verify + +This only tests and builds the JS to enhance the site content. To build the contents +first, you need to build the gwt-site project. + +1. Check out the [gwt-site](https://github.com/gwtproject/gwt-site) project. +2. Build the gwt-site project: $ cd [...]/gwt-site $ mvn install -- To **build** and check the app, run +3. Build the gwt-site-webapp project, with the -Pfull-site profile: $ cd [...]/gwt-site-webapp - $ mvn verify -P full-site + $ mvn verify -Pfull-site - Now you can point your browser to the `target/www` folder, or you can serve - its content with any web-server (i.e [serve](https://www.npmjs.com/package/serve)). - Notice that the second way is needed if you want to test site navigation via Ajax. +Now you can point your browser to the `target/www` folder, or you can serve +its content with any web-server (i.e [serve](https://www.npmjs.com/package/serve) or +[http.server](https://docs.python.org/3/library/http.server.html)). +Notice that an http server is needed if you want to test site navigation via Ajax. -- Building will run the **tests**, but to explicitly run them you can use the test target +Building will run the **tests**, but to explicitly run them you can use the test target $ mvn test diff --git a/pom.xml b/pom.xml index 747c5b237..0e3be2660 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ yyyy-MM-dd UTF-8 - 2.11.0 + 2.12.1 4.13.2 @@ -81,6 +81,11 @@ -saveSource + true true @@ -103,7 +108,7 @@ copy-resources
- ${project.build.directory}/${project.artifactId}-${project.version}/ + ${project.build.directory}/${project.build.finalName}/ @@ -175,7 +180,7 @@ ${project.build.directory}/www/ - ${project.build.directory}/${project.artifactId}-${project.version}/ + ${project.build.directory}/${project.build.finalName}/ diff --git a/src/main/module.gwt.xml b/src/main/module.gwt.xml index c14dc41d0..f45827897 100644 --- a/src/main/module.gwt.xml +++ b/src/main/module.gwt.xml @@ -2,11 +2,10 @@ - + - - + + From 00986fa778750a75de70912a4318f01b2dbedb22 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 16 May 2025 10:46:42 -0500 Subject: [PATCH 56/61] Bump versions of actions Specifically, this gets us to a non-deprecated upload-artifact tag. --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 319bc380b..1866ef2ef 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,9 +7,9 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '11' distribution: 'temurin' @@ -22,7 +22,7 @@ jobs: # Fixes issue where artifact zip contains top level directory due to wildcard expansion run: mv target/gwt-site-webapp-*/ target/gwt-site-webapp - name: Upload the generated JS - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: 'gwt-site-webapp' path: target/gwt-site-webapp/ From d4fb0708a4db015f064f87d589e1059ce792c372 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Mon, 8 Dec 2025 20:27:21 -0600 Subject: [PATCH 57/61] Bump GWT to 2.12.2 (#15) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0e3be2660..72fbfdfab 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ yyyy-MM-dd UTF-8 - 2.12.1 + 2.12.2 4.13.2 From fb52118baddfcd4b4aeb5b09b2c7a57593cd2af7 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 19 Jun 2026 14:32:19 -0500 Subject: [PATCH 58/61] Bump GWT to 2.13.1 (#16) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 72fbfdfab..448c23a1f 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ yyyy-MM-dd UTF-8 - 2.12.2 + 2.13.1 4.13.2 From a6c8ec2762c7632dddb7e3cc425fdb23a412a294 Mon Sep 17 00:00:00 2001 From: Zbynek Konecny Date: Sun, 12 Jul 2026 15:36:08 +0200 Subject: [PATCH 59/61] Move site content into Maven submodule --- .../{build.yml => build-content.yml} | 0 .gitignore | 11 - content/.gitignore | 11 + Gruntfile.js => content/Gruntfile.js | 0 README.md => content/README.md | 0 content/package-lock.json | 5173 +++++++++++++++++ package.json => content/package.json | 0 pom.xml => content/pom.xml | 14 +- .../src}/main/assembly/generated-site.xml | 0 .../google/gwt/site/markdown/MDHelper.java | 0 .../gwt/site/markdown/MDHelperException.java | 0 .../gwt/site/markdown/MDTranslator.java | 0 .../google/gwt/site/markdown/MarkDown.java | 0 .../gwt/site/markdown/MarkupWriter.java | 0 .../site/markdown/TranslatorException.java | 0 .../com/google/gwt/site/markdown/Util.java | 0 .../site/markdown/fs/FileSystemTraverser.java | 0 .../google/gwt/site/markdown/fs/MDNode.java | 0 .../google/gwt/site/markdown/fs/MDParent.java | 0 .../gwt/site/markdown/toc/TocCreator.java | 0 .../site/markdown/toc/TocFromMdCreator.java | 0 .../markdown/toc/TocFromTemplateCreator.java | 0 .../src}/main/markdown/GWTPolicy.md | 0 .../src}/main/markdown/articles/articles.md | 0 .../src}/main/markdown/articles/config.xml | 0 .../dom_events_memory_leaks_and_you.md | 0 .../markdown/articles/dynamic_host_page.md | 0 .../src}/main/markdown/articles/elemental.md | 0 .../markdown/articles/fragment_merging.md | 0 .../main/markdown/articles/gss_migration.md | 0 .../src}/main/markdown/articles/gwt-iphone.md | 0 .../markdown/articles/mvp-architecture-2.md | 0 .../markdown/articles/mvp-architecture.md | 0 .../articles/security_for_gwt_applications.md | 0 .../main/markdown/articles/superdevmode.md | 0 .../testing_methodologies_using_gwt.md | 0 .../articles/using_gwt_for_json_mashups.md | 0 .../articles/using_gwt_with_hibernate.md | 0 .../src}/main/markdown/benchmarks.md | 0 {src => content/src}/main/markdown/books.md | 0 .../src}/main/markdown/casestudies.md | 0 .../main/markdown/community-group-charter.md | 0 .../src}/main/markdown/community.md | 0 {src => content/src}/main/markdown/config.xml | 0 .../src}/main/markdown/developer_spotlight.md | 0 .../src}/main/markdown/doc/config.xml | 0 .../src}/main/markdown/doc/latest/DevGuide.md | 0 .../main/markdown/doc/latest/DevGuideA11y.md | 0 .../markdown/doc/latest/DevGuideAutoBeans.md | 0 .../doc/latest/DevGuideClientBundle.md | 0 .../doc/latest/DevGuideCodeSplitting.md | 0 .../doc/latest/DevGuideCodingBasics.md | 0 .../doc/latest/DevGuideCodingBasicsClient.md | 0 .../DevGuideCodingBasicsCompatibility.md | 0 .../latest/DevGuideCodingBasicsDeferred.md | 0 .../doc/latest/DevGuideCodingBasicsDelayed.md | 0 .../latest/DevGuideCodingBasicsFormatting.md | 0 .../doc/latest/DevGuideCodingBasicsHistory.md | 0 .../doc/latest/DevGuideCodingBasicsJSNI.md | 0 .../doc/latest/DevGuideCodingBasicsJSON.md | 0 .../latest/DevGuideCodingBasicsJsInterop.md | 0 .../doc/latest/DevGuideCodingBasicsOverlay.md | 0 .../doc/latest/DevGuideCodingBasicsXML.md | 0 .../doc/latest/DevGuideCompileReport.md | 0 .../latest/DevGuideCompilingAndDebugging.md | 0 .../markdown/doc/latest/DevGuideDeploying.md | 0 .../markdown/doc/latest/DevGuideGlossary.md | 0 .../markdown/doc/latest/DevGuideGssVsCss.md | 0 .../main/markdown/doc/latest/DevGuideHtml5.md | 0 .../doc/latest/DevGuideHtml5Storage.md | 0 .../main/markdown/doc/latest/DevGuideI18n.md | 0 .../doc/latest/DevGuideI18nConstants.md | 0 .../markdown/doc/latest/DevGuideI18nLocale.md | 0 .../doc/latest/DevGuideI18nMessages.md | 0 .../doc/latest/DevGuideI18nPluralForms.md | 0 .../main/markdown/doc/latest/DevGuideIE9.md | 0 .../doc/latest/DevGuideLightweightMetrics.md | 0 .../markdown/doc/latest/DevGuideLinkers.md | 0 .../markdown/doc/latest/DevGuideLogging.md | 0 .../latest/DevGuideMvpActivitiesAndPlaces.md | 0 .../markdown/doc/latest/DevGuideOptimizing.md | 0 .../doc/latest/DevGuideOrganizingProjects.md | 0 .../doc/latest/DevGuideRequestFactory.md | 0 .../markdown/doc/latest/DevGuideSecurity.md | 0 .../doc/latest/DevGuideSecurityRpcXsrf.md | 0 .../doc/latest/DevGuideSecuritySafeHtml.md | 0 .../doc/latest/DevGuideServerCommunication.md | 0 .../markdown/doc/latest/DevGuideTesting.md | 0 .../doc/latest/DevGuideTestingCoverage.md | 0 .../doc/latest/DevGuideTestingHtmlUnit.md | 0 .../latest/DevGuideTestingRemoteTesting.md | 0 .../main/markdown/doc/latest/DevGuideUi.md | 0 .../markdown/doc/latest/DevGuideUiBinder.md | 0 .../doc/latest/DevGuideUiBinderI18n.md | 0 .../markdown/doc/latest/DevGuideUiBrowser.md | 0 .../doc/latest/DevGuideUiCellTable.md | 0 .../doc/latest/DevGuideUiCellWidgets.md | 0 .../main/markdown/doc/latest/DevGuideUiCss.md | 0 .../doc/latest/DevGuideUiCustomCells.md | 0 .../doc/latest/DevGuideUiCustomWidgets.md | 0 .../main/markdown/doc/latest/DevGuideUiDom.md | 0 .../markdown/doc/latest/DevGuideUiEditors.md | 0 .../markdown/doc/latest/DevGuideUiHandlers.md | 0 .../doc/latest/DevGuideUiImageBundles.md | 0 .../markdown/doc/latest/DevGuideUiPanels.md | 0 .../markdown/doc/latest/DevGuideUiWidgets.md | 0 .../markdown/doc/latest/DevGuideValidation.md | 0 .../src}/main/markdown/doc/latest/FAQ.md | 0 .../main/markdown/doc/latest/FAQ_Client.md | 0 .../doc/latest/FAQ_DebuggingAndCompiling.md | 0 .../markdown/doc/latest/FAQ_GettingStarted.md | 0 .../main/markdown/doc/latest/FAQ_Server.md | 0 .../doc/latest/FAQ_Troubleshooting.md | 0 .../src}/main/markdown/doc/latest/FAQ_UI.md | 0 .../doc/latest/RefCommandLineTools.md | 0 .../markdown/doc/latest/RefGWTClassAPI.md | 0 .../src}/main/markdown/doc/latest/RefGuide.md | 0 .../markdown/doc/latest/RefJreEmulation.md | 0 .../doc/latest/RefJreMissingEmulation.md | 0 .../markdown/doc/latest/RefWidgetGallery.md | 0 .../main/markdown/doc/latest/ReleaseNotes.md | 0 .../src}/main/markdown/doc/latest/config.xml | 0 .../latest/gwt-dev-help/WebAppClassPath.md | 0 .../gwt-dev-help/longJsniRestriction.md | 0 .../latest/gwt-dev-help/servletMappings.md | 0 .../doc/latest/polymer-tutorial/create.md | 0 .../polymer-tutorial/elements-applogic.md | 0 .../polymer-tutorial/elements-buildui.md | 0 .../latest/polymer-tutorial/introduction.md | 0 .../polymer-tutorial/widgets-applogic.md | 0 .../polymer-tutorial/widgets-buildui.md | 0 .../main/markdown/doc/latest/tutorial/JSON.md | 0 .../markdown/doc/latest/tutorial/JSONphp.md | 0 .../markdown/doc/latest/tutorial/JUnit.md | 0 .../main/markdown/doc/latest/tutorial/RPC.md | 0 .../markdown/doc/latest/tutorial/Xsite.md | 0 .../markdown/doc/latest/tutorial/appengine.md | 0 .../markdown/doc/latest/tutorial/buildui.md | 0 .../doc/latest/tutorial/clientserver.md | 0 .../doc/latest/tutorial/codeclient.md | 0 .../markdown/doc/latest/tutorial/compile.md | 0 .../markdown/doc/latest/tutorial/config.xml | 0 .../markdown/doc/latest/tutorial/create.md | 0 .../markdown/doc/latest/tutorial/debug.md | 0 .../markdown/doc/latest/tutorial/design.md | 0 .../doc/latest/tutorial/gettingstarted.md | 0 .../main/markdown/doc/latest/tutorial/i18n.md | 0 .../markdown/doc/latest/tutorial/index.md | 0 .../doc/latest/tutorial/manageevents.md | 0 .../markdown/doc/latest/tutorial/style.md | 0 .../src}/main/markdown/download.md | 0 .../src}/main/markdown/examples.md | 0 .../src}/main/markdown/gettingstarted-v2.md | 0 .../src}/main/markdown/gettingstarted.md | 0 {src => content/src}/main/markdown/index.md | 0 .../src}/main/markdown/learnmore-sdk.md | 0 .../src}/main/markdown/lifeofanissue.md | 0 .../src}/main/markdown/makinggwtbetter.md | 0 .../src}/main/markdown/meetingnotes.md | 0 .../main/markdown/meetingnotes/2015-02-11.md | 0 .../main/markdown/meetingnotes/2015-06-17.md | 0 .../main/markdown/meetingnotes/2015-08-19.md | 0 .../main/markdown/meetingnotes/2015-10-28.md | 0 .../main/markdown/meetingnotes/2016-01-10.md | 0 .../main/markdown/meetingnotes/2016-02-10.md | 0 .../main/markdown/meetingnotes/2016-04-13.md | 0 .../main/markdown/meetingnotes/2016-07-20.md | 0 .../main/markdown/meetingnotes/2017-01-11.md | 0 .../main/markdown/meetingnotes/2017-02-08.md | 0 .../main/markdown/meetingnotes/2017-03-08.md | 0 .../main/markdown/meetingnotes/2017-04-12.md | 0 .../main/markdown/meetingnotes/2017-05-10.md | 0 .../src}/main/markdown/overview.md | 0 .../src}/main/markdown/presentations.md | 0 {src => content/src}/main/markdown/privacy.md | 0 .../src}/main/markdown/release-notes.md | 0 .../src}/main/markdown/resources.md | 0 {src => content/src}/main/markdown/roadmap.md | 0 .../src}/main/markdown/steering.md | 0 {src => content/src}/main/markdown/terms.md | 0 .../src}/main/markdown/usingeclipse.md | 0 .../src}/main/markdown/usingintellij.md | 0 .../src}/main/markdown/versions.md | 0 .../src}/main/markdown/whos_using_gwt.md | 0 {src => content/src}/main/resources/main.tpl | 0 {src => content/src}/main/resources/toc.md | 0 .../src}/main/site/articles/index.html | 0 .../site/assets/build/fonts/icons/icons.css | 0 .../site/assets/build/fonts/icons/icons.eot | Bin .../site/assets/build/fonts/icons/icons.svg | 0 .../site/assets/build/fonts/icons/icons.ttf | Bin .../site/assets/build/fonts/icons/icons.woff | Bin .../site/assets/build/fonts/icons/icons.woff2 | Bin .../build/js/vendor/jquery-1.11.0.min.js | 0 .../assets/build/js/vendor/jquery.flexnav.js | 0 .../build/js/vendor/jquery.flexnav.min.js | 0 .../build/js/vendor/modernizr-2.6.2.min.js | 0 .../img/apple-touch-icon-precomposed.png | Bin .../src}/main/site/assets/img/logoBig.png | Bin .../src}/main/site/assets/img/navLogoBig.png | Bin .../main/site/assets/img/navLogoSmall.png | Bin .../src}/main/site/assets/js/global.js | 0 .../src}/main/site/assets/less/colors.less | 0 .../src}/main/site/assets/less/flexnav.less | 0 .../src}/main/site/assets/less/functions.less | 0 .../src}/main/site/assets/less/grid.less | 0 .../src}/main/site/assets/less/layout.less | 0 .../src}/main/site/assets/less/normalize.less | 0 .../src}/main/site/assets/less/print.less | 0 .../src}/main/site/assets/less/style.less | 0 .../src}/main/site/css/jenkins-theme.css | 0 {src => content/src}/main/site/css/main.css | 0 {src => content/src}/main/site/doc/index.html | 0 .../doc/latest/images/AnatomyOfServices.png | Bin .../main/site/doc/latest/images/Button.png | Bin .../site/doc/latest/images/CellBrowser.png | Bin .../main/site/doc/latest/images/CellList.png | Bin .../main/site/doc/latest/images/CheckBox.png | Bin .../latest/images/CodeSplittingFragments.odg | Bin .../latest/images/CodeSplittingFragments.png | Bin .../latest/images/CustomCells-BasicRender.png | Bin .../images/CustomCells-HandlingEvents.png | Bin .../site/doc/latest/images/DatePicker.png | Bin .../DevGuideDirectoriesPackageConventions.png | Bin .../site/doc/latest/images/DevModeCollage.png | Bin .../site/doc/latest/images/DevModeTypical.jpg | Bin .../doc/latest/images/DevelopmentShell1.png | Bin .../doc/latest/images/DevelopmentShell2.png | Bin .../doc/latest/images/DevelopmentShell3.png | Bin .../doc/latest/images/DevelopmentShell4.png | Bin .../main/site/doc/latest/images/DialogBox.png | Bin .../doc/latest/images/DisclosurePanel.png | Bin .../doc/latest/images/DockLayoutPanel.png | Bin .../main/site/doc/latest/images/DockPanel.png | Bin .../doc/latest/images/DockPanel_Showcase.png | Bin .../site/doc/latest/images/FAQ_UILayout1.png | Bin .../site/doc/latest/images/FAQ_UILayout2.png | Bin .../site/doc/latest/images/FAQ_UILayout3.png | Bin .../site/doc/latest/images/FAQ_UILayout4.png | Bin .../main/site/doc/latest/images/FlowPanel.png | Bin .../images/GettingUsedToAsyncCalls1.png | Bin .../images/GettingUsedToAsyncCalls2.png | Bin .../site/doc/latest/images/HTML5_Badge_64.png | Bin .../site/doc/latest/images/HelloWorld.png | Bin .../doc/latest/images/HorizontalPanel.png | Bin .../images/HorizontalPanel_Showcase.png | Bin .../latest/images/HorizontalSplitPanel.png | Bin .../images/HorizontalSplitPanel_Showcase.png | Bin .../site/doc/latest/images/HostedMode1.png | Bin .../main/site/doc/latest/images/Hyperlink.png | Bin .../site/doc/latest/images/LayoutPanel.png | Bin .../main/site/doc/latest/images/ListBox.png | Bin .../site/doc/latest/images/LoggingExample.png | Bin .../main/site/doc/latest/images/MenuBar.png | Bin .../doc/latest/images/PasswordTextBox.png | Bin .../site/doc/latest/images/PopupPanel.png | Bin .../site/doc/latest/images/PushButton.png | Bin .../site/doc/latest/images/RadioButton.png | Bin .../latest/images/RichTextArea-clipped.png | Bin .../site/doc/latest/images/RichTextArea.png | Bin .../images/SplitLayoutPanel-gallery.png | Bin .../doc/latest/images/SplitLayoutPanel.png | Bin .../doc/latest/images/StackLayoutPanel.png | Bin .../site/doc/latest/images/StackPanel.png | Bin .../site/doc/latest/images/SuggestBox.png | Bin .../main/site/doc/latest/images/TabBar.png | Bin .../site/doc/latest/images/TabLayoutPanel.png | Bin .../main/site/doc/latest/images/TabPanel.png | Bin .../doc/latest/images/TabPanel_Showcase.png | Bin .../main/site/doc/latest/images/Table.png | Bin .../doc/latest/images/TestCoverageFinal.jpg | Bin .../doc/latest/images/TestCoverageInitial.jpg | Bin .../main/site/doc/latest/images/TextArea.png | Bin .../main/site/doc/latest/images/TextBox.png | Bin .../site/doc/latest/images/ToggleButton.png | Bin .../src}/main/site/doc/latest/images/Tree.png | Bin .../images/UnresponsiveScriptDialog.png | Bin .../latest/images/ValidationScreenshot.png | Bin .../site/doc/latest/images/VerticalPanel.png | Bin .../doc/latest/images/VerticalSplitPanel.png | Bin .../images/VerticalSplitPanel_Showcase.png | Bin .../main/site/doc/latest/images/WebMode1.png | Bin .../doc/latest/images/appengine_lowres.png | Bin .../main/site/doc/latest/images/apps_mp.png | Bin .../images/compileReport-Dependencies.gif | Bin .../compileReport-InitialDownloadExample.gif | Bin .../latest/images/compileReport-Overview.gif | Bin .../images/compileReport-PackageBreakdown.gif | Bin .../compileReport-PermutationOverview.gif | Bin .../images/compileReport-splitPointStatus.gif | Bin .../site/doc/latest/images/google-plugin.png | Bin .../main/site/doc/latest/images/gph_logo.png | Bin .../site/doc/latest/images/icon_android.jpg | Bin .../site/doc/latest/images/localStorage.png | Bin .../src}/main/site/doc/latest/index.html | 0 .../polymer-tutorial/images/todo-list-01.png | Bin .../polymer-tutorial/images/todo-list-02.png | Bin .../polymer-tutorial/images/todo-list-03.png | Bin .../polymer-tutorial/images/todo-list-04.png | Bin .../polymer-tutorial/images/todo-list-05.png | Bin .../polymer-tutorial/images/todo-list-06.png | Bin .../polymer-tutorial/images/todo-list-07.png | Bin .../polymer-tutorial/images/todo-list-08.png | Bin .../tutorial/gettingstarted/StockWatcher.css | 0 .../tutorial/gettingstarted/StockWatcher.html | 0 .../tutorial/gettingstarted/images/gwt.png | Bin .../2293D04F6B35190160A90C78400C3926.cache.js | 0 .../gwt/standard/images/hborder.png | Bin .../stockwatcher/gwt/standard/standard.css | 0 .../stockwatcher/stockwatcher.nocache.js | 0 .../tutorial/images/AnatomyOfServices.png | Bin .../doc/latest/tutorial/images/BuildUI.png | Bin .../tutorial/images/CodeClientAddStock.png | Bin .../latest/tutorial/images/CodeClientBug.png | Bin .../images/CodeClientNewJavaClass.jpg | Bin .../tutorial/images/CreateEclipseImport.jpg | Bin .../tutorial/images/CreateGWTComponents.jpg | Bin .../images/CreateStarterApplication.png | Bin .../tutorial/images/DebugVariablesBug.png | Bin .../images/DeployAppEngineProject.png | Bin .../images/DesignStockWatcherFinal.png | Bin .../tutorial/images/DevModeNoEclipse.png | Bin .../doc/latest/tutorial/images/DevModeTab.png | Bin .../tutorial/images/GWTCompileProject.png | Bin .../doc/latest/tutorial/images/JSONdata.png | Bin .../tutorial/images/JSONerrormessage.png | Bin .../tutorial/images/JSONstockPricesphp.png | Bin .../latest/tutorial/images/JUnitFailed.png | Bin .../tutorial/images/JUnitSimpleTestDev.png | Bin .../tutorial/images/JUnitcreatetest.png | Bin .../latest/tutorial/images/ManageEvents.png | Bin .../latest/tutorial/images/MissingPlugin.png | Bin .../images/NewWebApplicationProject.png | Bin .../tutorial/images/RPCerrormessage.png | Bin .../tutorial/images/StockWatcherUIpanel1.jpg | Bin .../tutorial/images/StockWatcherUIpanel2.jpg | Bin .../tutorial/images/StockWatcherUIpanel3.jpg | Bin .../tutorial/images/StockWatcherUIpanel4.jpg | Bin .../doc/latest/tutorial/images/StyleAfter.png | Bin .../latest/tutorial/images/StyleBefore.png | Bin .../latest/tutorial/images/StyleSecondary.png | Bin .../latest/tutorial/images/i18nEnglish.png | Bin .../doc/latest/tutorial/images/i18nGerman.png | Bin .../tutorial/images/spring-dashboard.png | Bin .../tutorial/images/spring-databrowser.png | Bin .../tutorial/images/spring-devserver.png | Bin .../tutorial/images/spring-extensions.png | Bin .../latest/tutorial/images/spring-package.png | Bin .../tutorial/images/spring-projects.png | Bin .../latest/tutorial/images/spring-prompt.png | Bin .../tutorial/images/spring-roo-shell.png | Bin .../latest/tutorial/images/spring-runas.png | Bin .../main/site/doctype/2.10.0/gwt-module.dtd | 0 .../main/site/doctype/2.11.0/gwt-module.dtd | 0 .../main/site/doctype/2.12.0/gwt-module.dtd | 0 .../main/site/doctype/2.12.1/gwt-module.dtd | 0 .../main/site/doctype/2.12.2/gwt-module.dtd | 0 .../main/site/doctype/2.13.0/gwt-module.dtd | 0 .../main/site/doctype/2.13.1/gwt-module.dtd | 0 .../main/site/doctype/2.4.0/gwt-module.dtd | 0 .../main/site/doctype/2.5.0/gwt-module.dtd | 0 .../main/site/doctype/2.5.1/gwt-module.dtd | 0 .../main/site/doctype/2.6.0/gwt-module.dtd | 0 .../main/site/doctype/2.6.1/gwt-module.dtd | 0 .../main/site/doctype/2.7.0/gwt-module.dtd | 0 .../main/site/doctype/2.8.0/gwt-module.dtd | 0 .../main/site/doctype/2.8.1/gwt-module.dtd | 0 .../main/site/doctype/2.8.2/gwt-module.dtd | 0 .../main/site/doctype/2.9.0/gwt-module.dtd | 0 .../src}/main/site/images/I18N.jpg | Bin .../main/site/images/app_gal_blueprint.png | Bin .../site/images/app_gal_contactoffice.png | Bin .../main/site/images/app_gal_dotemplate.jpg | Bin .../src}/main/site/images/app_gal_gogrid.png | Bin .../main/site/images/app_gal_iphonereader.png | Bin .../src}/main/site/images/app_gal_kaching.png | Bin .../src}/main/site/images/app_gal_queweb.png | Bin .../main/site/images/app_gal_riflethru.png | Bin .../site/images/app_gal_scenechronize.png | Bin .../main/site/images/app_gal_studyblue.png | Bin .../main/site/images/app_gal_typeracer.png | Bin .../src}/main/site/images/app_gal_venda.png | Bin .../src}/main/site/images/app_gal_whirled.png | Bin .../src}/main/site/images/arrow-48.png | Bin .../src}/main/site/images/arrow-closed.png | Bin .../src}/main/site/images/arrow-md.png | Bin .../src}/main/site/images/arrow-open.png | Bin .../src}/main/site/images/bookedin.png | Bin ...ith_Ext_GWT_Enterprise_RIA_Development.png | Bin ..._for_the_Web_with_Google_Web_Toolkit_2.jpg | Bin ...GWT_Rich_Internet_Application_Cookbook.jpg | Bin .../books/Ext_GWT_20_Beginners_Guide.jpg | Bin .../site/images/books/GWT_in_Practice.jpg | Bin ...e_Java_and_GWT_Application_Development.jpg | Bin ...kit_2_Application_Development_Cookbook.jpg | Bin .../Google_Web_Toolkit_Applications.jpeg | Bin ..._Web_Toolkit_GWT_Java_AJAX_Programming.jpg | Bin ...s_Digital_Short_Cut_Cool_Useful_Stuff.jpeg | Bin ...lkit_Solutions_More_Cool_Useful_Stuff.jpeg | Bin ...eb_Toolkit_Taking_the_Pain_Out_of_Ajax.jpg | Bin .../site/images/books/Vaadin_7_Cookbook.jpg | Bin .../main/site/images/books/Vaadin_Recipes.jpg | Bin .../main/site/images/books/gwt_in_action.jpg | Bin .../books/gwt_in_action_second_edition.jpg | Bin .../site/images/books/learning_vaddin.jpg | Bin .../src}/main/site/images/cloudorado.png | Bin .../src}/main/site/images/community.gif | Bin .../main/site/images/contact-list-view.png | Bin .../contacts-project-hierarchy-testing.png | Bin .../images/contacts-project-hierarchy.png | Bin .../site/images/data_presentation_widgets.png | Bin .../main/site/images/dev_gal_blueprint.jpg | Bin .../src}/main/site/images/dev_gal_gogrid.jpg | Bin .../site/images/dev_gal_scenechronize.jpg | Bin .../src}/main/site/images/dev_gal_whirled.jpg | Bin .../src}/main/site/images/docs.gif | Bin .../src}/main/site/images/down.png | Bin .../src}/main/site/images/dynamictable.jpg | Bin .../eclipse/eclipse-install-options.png | Bin .../main/site/images/eclipse/web-app-src.png | Bin .../site/images/eclipse/web-app-wizard.png | Bin .../src}/main/site/images/favicon.png | Bin .../src}/main/site/images/flow1-sm.png | Bin .../src}/main/site/images/flow2-sm.png | Bin .../src}/main/site/images/flow3-sm.png | Bin .../src}/main/site/images/flow4-sm.png | Bin .../site/images/fragment_merging_after.jpg | Bin .../site/images/fragment_merging_before.jpg | Bin .../src}/main/site/images/gaestudio.png | Bin .../src}/main/site/images/gilead_diagram.png | Bin .../site/images/gitter-logo-mark-white.png | Bin .../src}/main/site/images/go_grid.jpg | Bin .../main/site/images/gwt-architecture.png | Bin .../src}/main/site/images/gwt-logo.png | Bin .../src}/main/site/images/gwt-sm.png | Bin .../src}/main/site/images/gwtdesigner.png | Bin .../images/gwtproject.org-2015-banner@2x.png | Bin .../src}/main/site/images/helloworld.jpg | Bin .../site/images/hosted_hibernate_error.png | Bin .../main/site/images/import-into-intellij.png | Bin .../main/site/images/intellij-project.png | Bin .../site/images/intellij-run-code-server.png | Bin .../main/site/images/intellij-run-server.png | Bin .../src}/main/site/images/jsonrpc.jpg | Bin .../src}/main/site/images/kicthensink.jpg | Bin .../src}/main/site/images/kitchensink.jpg | Bin .../src}/main/site/images/learnmore.gif | Bin .../src}/main/site/images/logo-wire.png | Bin .../main/site/images/lombardi_blueprint.jpg | Bin .../src}/main/site/images/mail.jpg | Bin .../src}/main/site/images/mvp_diagram.png | Bin .../site/images/myapplication-browser.png | Bin .../site/images/myapplication-devmode.png | Bin .../images/myapplication-missing-plugin.png | Bin .../src}/main/site/images/mywebapp.png | Bin .../src}/main/site/images/newwindow.gif | Bin .../src}/main/site/images/noscreenshot.jpg | Bin .../src}/main/site/images/ruxit.png | Bin .../src}/main/site/images/scenechronize.jpg | Bin .../src}/main/site/images/sdk-sm.png | Bin .../site/images/sdm-debugger-breakpoint.png | Bin .../src}/main/site/images/sdm-debugger.png | Bin .../src}/main/site/images/showcase.jpg | Bin .../main/site/images/speedtracer-large.png | Bin .../src}/main/site/images/spring_logo.png | Bin .../src}/main/site/images/st_server_trace.png | Bin .../src}/main/site/images/sticky.png | Bin .../src}/main/site/images/sts_dashboard.png | Bin .../main/site/images/superdevmode_dialog.png | Bin .../images/superdevmode_enablesourcemaps.png | Bin .../site/images/testing_methodologies_mvc.png | Bin .../site/images/testing_methodologies_mvp.png | Bin .../testing_methodologies_object_diagram.png | Bin .../testing_methodologies_screenshot.png | Bin .../src}/main/site/images/war_output_dir.png | Bin .../src}/main/site/images/wave.jpg | Bin .../src}/main/site/images/whirled.jpg | Bin {src => content/src}/main/site/index.html | 0 .../main/site/missing-plugin/download.gif | Bin .../src}/main/site/missing-plugin/index.html | 0 .../main/site/missing-plugin/unsupported.gif | Bin .../gwt/site/markdown/MDTranslatorTest.java | 0 482 files changed, 5194 insertions(+), 15 deletions(-) rename .github/workflows/{build.yml => build-content.yml} (100%) delete mode 100644 .gitignore create mode 100644 content/.gitignore rename Gruntfile.js => content/Gruntfile.js (100%) rename README.md => content/README.md (100%) create mode 100644 content/package-lock.json rename package.json => content/package.json (100%) rename pom.xml => content/pom.xml (97%) rename {src => content/src}/main/assembly/generated-site.xml (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/MDHelper.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/MDHelperException.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/MDTranslator.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/MarkDown.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/MarkupWriter.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/TranslatorException.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/Util.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/fs/FileSystemTraverser.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/fs/MDNode.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/fs/MDParent.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/toc/TocCreator.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/toc/TocFromMdCreator.java (100%) rename {src => content/src}/main/java/com/google/gwt/site/markdown/toc/TocFromTemplateCreator.java (100%) rename {src => content/src}/main/markdown/GWTPolicy.md (100%) rename {src => content/src}/main/markdown/articles/articles.md (100%) rename {src => content/src}/main/markdown/articles/config.xml (100%) rename {src => content/src}/main/markdown/articles/dom_events_memory_leaks_and_you.md (100%) rename {src => content/src}/main/markdown/articles/dynamic_host_page.md (100%) rename {src => content/src}/main/markdown/articles/elemental.md (100%) rename {src => content/src}/main/markdown/articles/fragment_merging.md (100%) rename {src => content/src}/main/markdown/articles/gss_migration.md (100%) rename {src => content/src}/main/markdown/articles/gwt-iphone.md (100%) rename {src => content/src}/main/markdown/articles/mvp-architecture-2.md (100%) rename {src => content/src}/main/markdown/articles/mvp-architecture.md (100%) rename {src => content/src}/main/markdown/articles/security_for_gwt_applications.md (100%) rename {src => content/src}/main/markdown/articles/superdevmode.md (100%) rename {src => content/src}/main/markdown/articles/testing_methodologies_using_gwt.md (100%) rename {src => content/src}/main/markdown/articles/using_gwt_for_json_mashups.md (100%) rename {src => content/src}/main/markdown/articles/using_gwt_with_hibernate.md (100%) rename {src => content/src}/main/markdown/benchmarks.md (100%) rename {src => content/src}/main/markdown/books.md (100%) rename {src => content/src}/main/markdown/casestudies.md (100%) rename {src => content/src}/main/markdown/community-group-charter.md (100%) rename {src => content/src}/main/markdown/community.md (100%) rename {src => content/src}/main/markdown/config.xml (100%) rename {src => content/src}/main/markdown/developer_spotlight.md (100%) rename {src => content/src}/main/markdown/doc/config.xml (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuide.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideA11y.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideAutoBeans.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideClientBundle.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodeSplitting.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasics.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsClient.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsCompatibility.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsDeferred.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsDelayed.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsFormatting.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsHistory.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsJSNI.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsJSON.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsJsInterop.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsOverlay.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCodingBasicsXML.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCompileReport.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideCompilingAndDebugging.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideDeploying.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideGlossary.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideGssVsCss.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideHtml5.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideHtml5Storage.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideI18n.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideI18nConstants.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideI18nLocale.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideI18nMessages.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideI18nPluralForms.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideIE9.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideLightweightMetrics.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideLinkers.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideLogging.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideMvpActivitiesAndPlaces.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideOptimizing.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideOrganizingProjects.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideRequestFactory.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideSecurity.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideSecurityRpcXsrf.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideSecuritySafeHtml.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideServerCommunication.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideTesting.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideTestingCoverage.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideTestingHtmlUnit.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideTestingRemoteTesting.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUi.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiBinder.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiBinderI18n.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiBrowser.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiCellTable.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiCellWidgets.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiCss.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiCustomCells.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiCustomWidgets.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiDom.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiEditors.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiHandlers.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiImageBundles.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiPanels.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideUiWidgets.md (100%) rename {src => content/src}/main/markdown/doc/latest/DevGuideValidation.md (100%) rename {src => content/src}/main/markdown/doc/latest/FAQ.md (100%) rename {src => content/src}/main/markdown/doc/latest/FAQ_Client.md (100%) rename {src => content/src}/main/markdown/doc/latest/FAQ_DebuggingAndCompiling.md (100%) rename {src => content/src}/main/markdown/doc/latest/FAQ_GettingStarted.md (100%) rename {src => content/src}/main/markdown/doc/latest/FAQ_Server.md (100%) rename {src => content/src}/main/markdown/doc/latest/FAQ_Troubleshooting.md (100%) rename {src => content/src}/main/markdown/doc/latest/FAQ_UI.md (100%) rename {src => content/src}/main/markdown/doc/latest/RefCommandLineTools.md (100%) rename {src => content/src}/main/markdown/doc/latest/RefGWTClassAPI.md (100%) rename {src => content/src}/main/markdown/doc/latest/RefGuide.md (100%) rename {src => content/src}/main/markdown/doc/latest/RefJreEmulation.md (100%) rename {src => content/src}/main/markdown/doc/latest/RefJreMissingEmulation.md (100%) rename {src => content/src}/main/markdown/doc/latest/RefWidgetGallery.md (100%) rename {src => content/src}/main/markdown/doc/latest/ReleaseNotes.md (100%) rename {src => content/src}/main/markdown/doc/latest/config.xml (100%) rename {src => content/src}/main/markdown/doc/latest/gwt-dev-help/WebAppClassPath.md (100%) rename {src => content/src}/main/markdown/doc/latest/gwt-dev-help/longJsniRestriction.md (100%) rename {src => content/src}/main/markdown/doc/latest/gwt-dev-help/servletMappings.md (100%) rename {src => content/src}/main/markdown/doc/latest/polymer-tutorial/create.md (100%) rename {src => content/src}/main/markdown/doc/latest/polymer-tutorial/elements-applogic.md (100%) rename {src => content/src}/main/markdown/doc/latest/polymer-tutorial/elements-buildui.md (100%) rename {src => content/src}/main/markdown/doc/latest/polymer-tutorial/introduction.md (100%) rename {src => content/src}/main/markdown/doc/latest/polymer-tutorial/widgets-applogic.md (100%) rename {src => content/src}/main/markdown/doc/latest/polymer-tutorial/widgets-buildui.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/JSON.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/JSONphp.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/JUnit.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/RPC.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/Xsite.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/appengine.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/buildui.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/clientserver.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/codeclient.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/compile.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/config.xml (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/create.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/debug.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/design.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/gettingstarted.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/i18n.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/index.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/manageevents.md (100%) rename {src => content/src}/main/markdown/doc/latest/tutorial/style.md (100%) rename {src => content/src}/main/markdown/download.md (100%) rename {src => content/src}/main/markdown/examples.md (100%) rename {src => content/src}/main/markdown/gettingstarted-v2.md (100%) rename {src => content/src}/main/markdown/gettingstarted.md (100%) rename {src => content/src}/main/markdown/index.md (100%) rename {src => content/src}/main/markdown/learnmore-sdk.md (100%) rename {src => content/src}/main/markdown/lifeofanissue.md (100%) rename {src => content/src}/main/markdown/makinggwtbetter.md (100%) rename {src => content/src}/main/markdown/meetingnotes.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2015-02-11.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2015-06-17.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2015-08-19.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2015-10-28.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2016-01-10.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2016-02-10.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2016-04-13.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2016-07-20.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2017-01-11.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2017-02-08.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2017-03-08.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2017-04-12.md (100%) rename {src => content/src}/main/markdown/meetingnotes/2017-05-10.md (100%) rename {src => content/src}/main/markdown/overview.md (100%) rename {src => content/src}/main/markdown/presentations.md (100%) rename {src => content/src}/main/markdown/privacy.md (100%) rename {src => content/src}/main/markdown/release-notes.md (100%) rename {src => content/src}/main/markdown/resources.md (100%) rename {src => content/src}/main/markdown/roadmap.md (100%) rename {src => content/src}/main/markdown/steering.md (100%) rename {src => content/src}/main/markdown/terms.md (100%) rename {src => content/src}/main/markdown/usingeclipse.md (100%) rename {src => content/src}/main/markdown/usingintellij.md (100%) rename {src => content/src}/main/markdown/versions.md (100%) rename {src => content/src}/main/markdown/whos_using_gwt.md (100%) rename {src => content/src}/main/resources/main.tpl (100%) rename {src => content/src}/main/resources/toc.md (100%) rename {src => content/src}/main/site/articles/index.html (100%) rename {src => content/src}/main/site/assets/build/fonts/icons/icons.css (100%) rename {src => content/src}/main/site/assets/build/fonts/icons/icons.eot (100%) rename {src => content/src}/main/site/assets/build/fonts/icons/icons.svg (100%) rename {src => content/src}/main/site/assets/build/fonts/icons/icons.ttf (100%) rename {src => content/src}/main/site/assets/build/fonts/icons/icons.woff (100%) rename {src => content/src}/main/site/assets/build/fonts/icons/icons.woff2 (100%) rename {src => content/src}/main/site/assets/build/js/vendor/jquery-1.11.0.min.js (100%) rename {src => content/src}/main/site/assets/build/js/vendor/jquery.flexnav.js (100%) rename {src => content/src}/main/site/assets/build/js/vendor/jquery.flexnav.min.js (100%) rename {src => content/src}/main/site/assets/build/js/vendor/modernizr-2.6.2.min.js (100%) rename {src => content/src}/main/site/assets/img/apple-touch-icon-precomposed.png (100%) rename {src => content/src}/main/site/assets/img/logoBig.png (100%) rename {src => content/src}/main/site/assets/img/navLogoBig.png (100%) rename {src => content/src}/main/site/assets/img/navLogoSmall.png (100%) rename {src => content/src}/main/site/assets/js/global.js (100%) rename {src => content/src}/main/site/assets/less/colors.less (100%) rename {src => content/src}/main/site/assets/less/flexnav.less (100%) rename {src => content/src}/main/site/assets/less/functions.less (100%) rename {src => content/src}/main/site/assets/less/grid.less (100%) rename {src => content/src}/main/site/assets/less/layout.less (100%) rename {src => content/src}/main/site/assets/less/normalize.less (100%) rename {src => content/src}/main/site/assets/less/print.less (100%) rename {src => content/src}/main/site/assets/less/style.less (100%) rename {src => content/src}/main/site/css/jenkins-theme.css (100%) rename {src => content/src}/main/site/css/main.css (100%) rename {src => content/src}/main/site/doc/index.html (100%) rename {src => content/src}/main/site/doc/latest/images/AnatomyOfServices.png (100%) rename {src => content/src}/main/site/doc/latest/images/Button.png (100%) rename {src => content/src}/main/site/doc/latest/images/CellBrowser.png (100%) rename {src => content/src}/main/site/doc/latest/images/CellList.png (100%) rename {src => content/src}/main/site/doc/latest/images/CheckBox.png (100%) rename {src => content/src}/main/site/doc/latest/images/CodeSplittingFragments.odg (100%) rename {src => content/src}/main/site/doc/latest/images/CodeSplittingFragments.png (100%) rename {src => content/src}/main/site/doc/latest/images/CustomCells-BasicRender.png (100%) rename {src => content/src}/main/site/doc/latest/images/CustomCells-HandlingEvents.png (100%) rename {src => content/src}/main/site/doc/latest/images/DatePicker.png (100%) rename {src => content/src}/main/site/doc/latest/images/DevGuideDirectoriesPackageConventions.png (100%) rename {src => content/src}/main/site/doc/latest/images/DevModeCollage.png (100%) rename {src => content/src}/main/site/doc/latest/images/DevModeTypical.jpg (100%) rename {src => content/src}/main/site/doc/latest/images/DevelopmentShell1.png (100%) rename {src => content/src}/main/site/doc/latest/images/DevelopmentShell2.png (100%) rename {src => content/src}/main/site/doc/latest/images/DevelopmentShell3.png (100%) rename {src => content/src}/main/site/doc/latest/images/DevelopmentShell4.png (100%) rename {src => content/src}/main/site/doc/latest/images/DialogBox.png (100%) rename {src => content/src}/main/site/doc/latest/images/DisclosurePanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/DockLayoutPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/DockPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/DockPanel_Showcase.png (100%) rename {src => content/src}/main/site/doc/latest/images/FAQ_UILayout1.png (100%) rename {src => content/src}/main/site/doc/latest/images/FAQ_UILayout2.png (100%) rename {src => content/src}/main/site/doc/latest/images/FAQ_UILayout3.png (100%) rename {src => content/src}/main/site/doc/latest/images/FAQ_UILayout4.png (100%) rename {src => content/src}/main/site/doc/latest/images/FlowPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/GettingUsedToAsyncCalls1.png (100%) rename {src => content/src}/main/site/doc/latest/images/GettingUsedToAsyncCalls2.png (100%) rename {src => content/src}/main/site/doc/latest/images/HTML5_Badge_64.png (100%) rename {src => content/src}/main/site/doc/latest/images/HelloWorld.png (100%) rename {src => content/src}/main/site/doc/latest/images/HorizontalPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/HorizontalPanel_Showcase.png (100%) rename {src => content/src}/main/site/doc/latest/images/HorizontalSplitPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/HorizontalSplitPanel_Showcase.png (100%) rename {src => content/src}/main/site/doc/latest/images/HostedMode1.png (100%) rename {src => content/src}/main/site/doc/latest/images/Hyperlink.png (100%) rename {src => content/src}/main/site/doc/latest/images/LayoutPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/ListBox.png (100%) rename {src => content/src}/main/site/doc/latest/images/LoggingExample.png (100%) rename {src => content/src}/main/site/doc/latest/images/MenuBar.png (100%) rename {src => content/src}/main/site/doc/latest/images/PasswordTextBox.png (100%) rename {src => content/src}/main/site/doc/latest/images/PopupPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/PushButton.png (100%) rename {src => content/src}/main/site/doc/latest/images/RadioButton.png (100%) rename {src => content/src}/main/site/doc/latest/images/RichTextArea-clipped.png (100%) rename {src => content/src}/main/site/doc/latest/images/RichTextArea.png (100%) rename {src => content/src}/main/site/doc/latest/images/SplitLayoutPanel-gallery.png (100%) rename {src => content/src}/main/site/doc/latest/images/SplitLayoutPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/StackLayoutPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/StackPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/SuggestBox.png (100%) rename {src => content/src}/main/site/doc/latest/images/TabBar.png (100%) rename {src => content/src}/main/site/doc/latest/images/TabLayoutPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/TabPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/TabPanel_Showcase.png (100%) rename {src => content/src}/main/site/doc/latest/images/Table.png (100%) rename {src => content/src}/main/site/doc/latest/images/TestCoverageFinal.jpg (100%) rename {src => content/src}/main/site/doc/latest/images/TestCoverageInitial.jpg (100%) rename {src => content/src}/main/site/doc/latest/images/TextArea.png (100%) rename {src => content/src}/main/site/doc/latest/images/TextBox.png (100%) rename {src => content/src}/main/site/doc/latest/images/ToggleButton.png (100%) rename {src => content/src}/main/site/doc/latest/images/Tree.png (100%) rename {src => content/src}/main/site/doc/latest/images/UnresponsiveScriptDialog.png (100%) rename {src => content/src}/main/site/doc/latest/images/ValidationScreenshot.png (100%) rename {src => content/src}/main/site/doc/latest/images/VerticalPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/VerticalSplitPanel.png (100%) rename {src => content/src}/main/site/doc/latest/images/VerticalSplitPanel_Showcase.png (100%) rename {src => content/src}/main/site/doc/latest/images/WebMode1.png (100%) rename {src => content/src}/main/site/doc/latest/images/appengine_lowres.png (100%) rename {src => content/src}/main/site/doc/latest/images/apps_mp.png (100%) rename {src => content/src}/main/site/doc/latest/images/compileReport-Dependencies.gif (100%) rename {src => content/src}/main/site/doc/latest/images/compileReport-InitialDownloadExample.gif (100%) rename {src => content/src}/main/site/doc/latest/images/compileReport-Overview.gif (100%) rename {src => content/src}/main/site/doc/latest/images/compileReport-PackageBreakdown.gif (100%) rename {src => content/src}/main/site/doc/latest/images/compileReport-PermutationOverview.gif (100%) rename {src => content/src}/main/site/doc/latest/images/compileReport-splitPointStatus.gif (100%) rename {src => content/src}/main/site/doc/latest/images/google-plugin.png (100%) rename {src => content/src}/main/site/doc/latest/images/gph_logo.png (100%) rename {src => content/src}/main/site/doc/latest/images/icon_android.jpg (100%) rename {src => content/src}/main/site/doc/latest/images/localStorage.png (100%) rename {src => content/src}/main/site/doc/latest/index.html (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-01.png (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-02.png (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-03.png (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-04.png (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-05.png (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-06.png (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-07.png (100%) rename {src => content/src}/main/site/doc/latest/polymer-tutorial/images/todo-list-08.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.css (100%) rename {src => content/src}/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.html (100%) rename {src => content/src}/main/site/doc/latest/tutorial/gettingstarted/images/gwt.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/2293D04F6B35190160A90C78400C3926.cache.js (100%) rename {src => content/src}/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/images/hborder.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/standard.css (100%) rename {src => content/src}/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/stockwatcher.nocache.js (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/AnatomyOfServices.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/BuildUI.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/CodeClientAddStock.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/CodeClientBug.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/CodeClientNewJavaClass.jpg (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/CreateEclipseImport.jpg (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/CreateGWTComponents.jpg (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/CreateStarterApplication.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/DebugVariablesBug.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/DeployAppEngineProject.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/DesignStockWatcherFinal.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/DevModeNoEclipse.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/DevModeTab.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/GWTCompileProject.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/JSONdata.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/JSONerrormessage.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/JSONstockPricesphp.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/JUnitFailed.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/JUnitSimpleTestDev.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/JUnitcreatetest.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/ManageEvents.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/MissingPlugin.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/NewWebApplicationProject.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/RPCerrormessage.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/StockWatcherUIpanel1.jpg (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/StockWatcherUIpanel2.jpg (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/StockWatcherUIpanel3.jpg (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/StockWatcherUIpanel4.jpg (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/StyleAfter.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/StyleBefore.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/StyleSecondary.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/i18nEnglish.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/i18nGerman.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-dashboard.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-databrowser.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-devserver.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-extensions.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-package.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-projects.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-prompt.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-roo-shell.png (100%) rename {src => content/src}/main/site/doc/latest/tutorial/images/spring-runas.png (100%) rename {src => content/src}/main/site/doctype/2.10.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.11.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.12.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.12.1/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.12.2/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.13.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.13.1/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.4.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.5.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.5.1/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.6.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.6.1/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.7.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.8.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.8.1/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.8.2/gwt-module.dtd (100%) rename {src => content/src}/main/site/doctype/2.9.0/gwt-module.dtd (100%) rename {src => content/src}/main/site/images/I18N.jpg (100%) rename {src => content/src}/main/site/images/app_gal_blueprint.png (100%) rename {src => content/src}/main/site/images/app_gal_contactoffice.png (100%) rename {src => content/src}/main/site/images/app_gal_dotemplate.jpg (100%) rename {src => content/src}/main/site/images/app_gal_gogrid.png (100%) rename {src => content/src}/main/site/images/app_gal_iphonereader.png (100%) rename {src => content/src}/main/site/images/app_gal_kaching.png (100%) rename {src => content/src}/main/site/images/app_gal_queweb.png (100%) rename {src => content/src}/main/site/images/app_gal_riflethru.png (100%) rename {src => content/src}/main/site/images/app_gal_scenechronize.png (100%) rename {src => content/src}/main/site/images/app_gal_studyblue.png (100%) rename {src => content/src}/main/site/images/app_gal_typeracer.png (100%) rename {src => content/src}/main/site/images/app_gal_venda.png (100%) rename {src => content/src}/main/site/images/app_gal_whirled.png (100%) rename {src => content/src}/main/site/images/arrow-48.png (100%) rename {src => content/src}/main/site/images/arrow-closed.png (100%) rename {src => content/src}/main/site/images/arrow-md.png (100%) rename {src => content/src}/main/site/images/arrow-open.png (100%) rename {src => content/src}/main/site/images/bookedin.png (100%) rename {src => content/src}/main/site/images/books/Developing_with_Ext_GWT_Enterprise_RIA_Development.png (100%) rename {src => content/src}/main/site/images/books/Essential_GWT_Building_for_the_Web_with_Google_Web_Toolkit_2.jpg (100%) rename {src => content/src}/main/site/images/books/ExtGWT_Rich_Internet_Application_Cookbook.jpg (100%) rename {src => content/src}/main/site/images/books/Ext_GWT_20_Beginners_Guide.jpg (100%) rename {src => content/src}/main/site/images/books/GWT_in_Practice.jpg (100%) rename {src => content/src}/main/site/images/books/Google_App_Engine_Java_and_GWT_Application_Development.jpg (100%) rename {src => content/src}/main/site/images/books/Google_Web_Toolkit_2_Application_Development_Cookbook.jpg (100%) rename {src => content/src}/main/site/images/books/Google_Web_Toolkit_Applications.jpeg (100%) rename {src => content/src}/main/site/images/books/Google_Web_Toolkit_GWT_Java_AJAX_Programming.jpg (100%) rename {src => content/src}/main/site/images/books/Google_Web_Toolkit_Solutions_Digital_Short_Cut_Cool_Useful_Stuff.jpeg (100%) rename {src => content/src}/main/site/images/books/Google_Web_Toolkit_Solutions_More_Cool_Useful_Stuff.jpeg (100%) rename {src => content/src}/main/site/images/books/Google_Web_Toolkit_Taking_the_Pain_Out_of_Ajax.jpg (100%) rename {src => content/src}/main/site/images/books/Vaadin_7_Cookbook.jpg (100%) rename {src => content/src}/main/site/images/books/Vaadin_Recipes.jpg (100%) rename {src => content/src}/main/site/images/books/gwt_in_action.jpg (100%) rename {src => content/src}/main/site/images/books/gwt_in_action_second_edition.jpg (100%) rename {src => content/src}/main/site/images/books/learning_vaddin.jpg (100%) rename {src => content/src}/main/site/images/cloudorado.png (100%) rename {src => content/src}/main/site/images/community.gif (100%) rename {src => content/src}/main/site/images/contact-list-view.png (100%) rename {src => content/src}/main/site/images/contacts-project-hierarchy-testing.png (100%) rename {src => content/src}/main/site/images/contacts-project-hierarchy.png (100%) rename {src => content/src}/main/site/images/data_presentation_widgets.png (100%) rename {src => content/src}/main/site/images/dev_gal_blueprint.jpg (100%) rename {src => content/src}/main/site/images/dev_gal_gogrid.jpg (100%) rename {src => content/src}/main/site/images/dev_gal_scenechronize.jpg (100%) rename {src => content/src}/main/site/images/dev_gal_whirled.jpg (100%) rename {src => content/src}/main/site/images/docs.gif (100%) rename {src => content/src}/main/site/images/down.png (100%) rename {src => content/src}/main/site/images/dynamictable.jpg (100%) rename {src => content/src}/main/site/images/eclipse/eclipse-install-options.png (100%) rename {src => content/src}/main/site/images/eclipse/web-app-src.png (100%) rename {src => content/src}/main/site/images/eclipse/web-app-wizard.png (100%) rename {src => content/src}/main/site/images/favicon.png (100%) rename {src => content/src}/main/site/images/flow1-sm.png (100%) rename {src => content/src}/main/site/images/flow2-sm.png (100%) rename {src => content/src}/main/site/images/flow3-sm.png (100%) rename {src => content/src}/main/site/images/flow4-sm.png (100%) rename {src => content/src}/main/site/images/fragment_merging_after.jpg (100%) rename {src => content/src}/main/site/images/fragment_merging_before.jpg (100%) rename {src => content/src}/main/site/images/gaestudio.png (100%) rename {src => content/src}/main/site/images/gilead_diagram.png (100%) rename {src => content/src}/main/site/images/gitter-logo-mark-white.png (100%) rename {src => content/src}/main/site/images/go_grid.jpg (100%) rename {src => content/src}/main/site/images/gwt-architecture.png (100%) rename {src => content/src}/main/site/images/gwt-logo.png (100%) rename {src => content/src}/main/site/images/gwt-sm.png (100%) rename {src => content/src}/main/site/images/gwtdesigner.png (100%) rename {src => content/src}/main/site/images/gwtproject.org-2015-banner@2x.png (100%) rename {src => content/src}/main/site/images/helloworld.jpg (100%) rename {src => content/src}/main/site/images/hosted_hibernate_error.png (100%) rename {src => content/src}/main/site/images/import-into-intellij.png (100%) rename {src => content/src}/main/site/images/intellij-project.png (100%) rename {src => content/src}/main/site/images/intellij-run-code-server.png (100%) rename {src => content/src}/main/site/images/intellij-run-server.png (100%) rename {src => content/src}/main/site/images/jsonrpc.jpg (100%) rename {src => content/src}/main/site/images/kicthensink.jpg (100%) rename {src => content/src}/main/site/images/kitchensink.jpg (100%) rename {src => content/src}/main/site/images/learnmore.gif (100%) rename {src => content/src}/main/site/images/logo-wire.png (100%) rename {src => content/src}/main/site/images/lombardi_blueprint.jpg (100%) rename {src => content/src}/main/site/images/mail.jpg (100%) rename {src => content/src}/main/site/images/mvp_diagram.png (100%) rename {src => content/src}/main/site/images/myapplication-browser.png (100%) rename {src => content/src}/main/site/images/myapplication-devmode.png (100%) rename {src => content/src}/main/site/images/myapplication-missing-plugin.png (100%) rename {src => content/src}/main/site/images/mywebapp.png (100%) rename {src => content/src}/main/site/images/newwindow.gif (100%) rename {src => content/src}/main/site/images/noscreenshot.jpg (100%) rename {src => content/src}/main/site/images/ruxit.png (100%) rename {src => content/src}/main/site/images/scenechronize.jpg (100%) rename {src => content/src}/main/site/images/sdk-sm.png (100%) rename {src => content/src}/main/site/images/sdm-debugger-breakpoint.png (100%) rename {src => content/src}/main/site/images/sdm-debugger.png (100%) rename {src => content/src}/main/site/images/showcase.jpg (100%) rename {src => content/src}/main/site/images/speedtracer-large.png (100%) rename {src => content/src}/main/site/images/spring_logo.png (100%) rename {src => content/src}/main/site/images/st_server_trace.png (100%) rename {src => content/src}/main/site/images/sticky.png (100%) rename {src => content/src}/main/site/images/sts_dashboard.png (100%) rename {src => content/src}/main/site/images/superdevmode_dialog.png (100%) rename {src => content/src}/main/site/images/superdevmode_enablesourcemaps.png (100%) rename {src => content/src}/main/site/images/testing_methodologies_mvc.png (100%) rename {src => content/src}/main/site/images/testing_methodologies_mvp.png (100%) rename {src => content/src}/main/site/images/testing_methodologies_object_diagram.png (100%) rename {src => content/src}/main/site/images/testing_methodologies_screenshot.png (100%) rename {src => content/src}/main/site/images/war_output_dir.png (100%) rename {src => content/src}/main/site/images/wave.jpg (100%) rename {src => content/src}/main/site/images/whirled.jpg (100%) rename {src => content/src}/main/site/index.html (100%) rename {src => content/src}/main/site/missing-plugin/download.gif (100%) rename {src => content/src}/main/site/missing-plugin/index.html (100%) rename {src => content/src}/main/site/missing-plugin/unsupported.gif (100%) rename {src => content/src}/test/java/com/google/gwt/site/markdown/MDTranslatorTest.java (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build-content.yml similarity index 100% rename from .github/workflows/build.yml rename to .github/workflows/build-content.yml diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b39850e0b..000000000 --- a/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -target/ -.idea/ -gwt-site.iml -.DS_Store -npm-debug.log -node/ -node_modules/ -src/main/site/assets/build/css/ -src/main/site/assets/build/img/ -src/main/site/assets/build/js/global.js -src/main/site/assets/build/js/global.min.js diff --git a/content/.gitignore b/content/.gitignore new file mode 100644 index 000000000..2f5e47e39 --- /dev/null +++ b/content/.gitignore @@ -0,0 +1,11 @@ +target/ +../.idea/ +*.iml +.DS_Store +npm-debug.log +node/ +node_modules/ +content/src/main/site/assets/build/css/ +content/src/main/site/assets/build/img/ +content/src/main/site/assets/build/js/global.js +content/src/main/site/assets/build/js/global.min.js diff --git a/Gruntfile.js b/content/Gruntfile.js similarity index 100% rename from Gruntfile.js rename to content/Gruntfile.js diff --git a/README.md b/content/README.md similarity index 100% rename from README.md rename to content/README.md diff --git a/content/package-lock.json b/content/package-lock.json new file mode 100644 index 000000000..8da068b58 --- /dev/null +++ b/content/package-lock.json @@ -0,0 +1,5173 @@ +{ + "name": "GWTSite", + "version": "2.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + }, + "dependencies": { + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "optional": true + } + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", + "dev": true, + "optional": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", + "dev": true, + "optional": true + }, + "archive-type": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-3.2.0.tgz", + "integrity": "sha512-6cAWDM0lUYTbb7F436FAjbBYnsn5E3L2AgTOLzrFfLt7FVM6uJwKUvllE8VjLKTmKCU8PqtWlUAezEYjg5iGqA==", + "dev": true, + "optional": true, + "requires": { + "file-type": "^3.1.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", + "dev": true, + "optional": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "optional": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha512-u1L0ZLywRziOVjUhRxI0Qg9G+4RnFB9H/Rq40YWn0dieDgO7vAYeJz6jKAO6t/aruzlDFLAPkQTT87e+f8Imaw==", + "dev": true, + "optional": true + }, + "async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "async-each-series": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-1.1.0.tgz", + "integrity": "sha512-/VIpPVIJJlJObJiXkHBJ1RhjDtydBRG/3/dWpsXoVGOShNw5tameXnC7Yys+wpb0p/myItxGmSGgNi/dNlsIiA==", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha512-JnJpAS0p9RmixkOvW2XwDxxzs1bd4/VAGIl6Q0EC5YOo+p+hqIhtDhn/nmFnB/xUNXbLkpE2mOjgVIBRKD4xYw==", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha512-3vqtKL1N45I5dV0RdssXZG7X6pCqQrWPNOlBPZPrd+QkE2HEhR57Z04m0KtpbsZH73j+a3F8UD1TQnn+ExTvIA==", + "dev": true, + "optional": true + }, + "bin-build": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-2.2.0.tgz", + "integrity": "sha512-m8gaq/BdoePIT5RlHW3KNJZwNkg9YtPn2C89x85/0KYIExoHMm3D/RL/Wxrvum9CI6pbF2KUQa8a/WWFudVmng==", + "dev": true, + "optional": true, + "requires": { + "archive-type": "^3.0.1", + "decompress": "^3.0.0", + "download": "^4.1.2", + "exec-series": "^1.0.0", + "rimraf": "^2.2.6", + "tempfile": "^1.0.0", + "url-regex": "^3.0.0" + } + }, + "bin-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-2.0.0.tgz", + "integrity": "sha512-jf6fesAGnXBynRU3JLpo0qe8vw8JBPBJCKK0v8NV3iH1P2UkQ6UEcIy7uPw1OdWkPUtpmX1uqeyTGrpeKd2CwQ==", + "dev": true, + "optional": true, + "requires": { + "executable": "^1.0.0" + } + }, + "bin-version": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-1.0.4.tgz", + "integrity": "sha512-o9u3aS7w6RqoH9BErxuilhQG2fn3srr3ZekEEGailMnj5F+0p+R3TXENvO+vGaLnKlmq8xhhh/Fvl1RRxx/FdQ==", + "dev": true, + "optional": true, + "requires": { + "find-versions": "^1.0.0" + } + }, + "bin-version-check": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-2.1.0.tgz", + "integrity": "sha512-3lUeqGAbnWQG7OCfIiHXw1EmzzvAGlMYqqgRahkr7oDeY1Qra8r2DZH2bbfXZI4NA3aaD1Ap+xt8CeVO/fftrw==", + "dev": true, + "optional": true, + "requires": { + "bin-version": "^1.0.0", + "minimist": "^1.1.0", + "semver": "^4.0.3", + "semver-truncate": "^1.0.0" + }, + "dependencies": { + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true, + "optional": true + } + } + }, + "bin-wrapper": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-3.0.2.tgz", + "integrity": "sha512-5QEiUnaE7hgRlQxaV2jpeTg0+IA3o4zZ2sduuSqyJCdOuJ1wDuEmM1ntGelDf4ueCOaOam4bOMtOU4W6lG+hUg==", + "dev": true, + "optional": true, + "requires": { + "bin-check": "^2.0.0", + "bin-version-check": "^2.1.0", + "download": "^4.0.0", + "each-async": "^1.1.1", + "lazy-req": "^1.0.0", + "os-filter-obj": "^1.0.0" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dev": true, + "requires": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha512-KbiZEa9/vofNcVJXGwdWWn25reQ3V3dHBWbS07FTF3/TOehLnm9GEhJV4T6ZvGPkShRpmUqYwnaCrkj0mRnP6Q==", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "requires": { + "pako": "~0.2.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "optional": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true, + "optional": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "optional": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true, + "optional": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-to-vinyl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-to-vinyl/-/buffer-to-vinyl-1.1.0.tgz", + "integrity": "sha512-t6B4HXJ3YdJ/lXKhK3nlGW1aAvpQH2FMyHh25SmfdYkQAU3/R2MYo4VrY1DlQuZd8zLNOqWPxZFJILRuTkqaEQ==", + "dev": true, + "requires": { + "file-type": "^3.1.0", + "readable-stream": "^2.0.2", + "uuid": "^2.0.1", + "vinyl": "^1.0.0" + } + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", + "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "get-intrinsic": "^1.2.6" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "dev": true, + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "optional": true + }, + "caw": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/caw/-/caw-1.2.0.tgz", + "integrity": "sha512-GIAlMoessjWW8p0mkStU4kMvV35toVCAyOWhUajk7O0d7wJI8F9TDjfrkSoO26b0d1QsnDLmw5I3X+yd6OKorQ==", + "dev": true, + "optional": true, + "requires": { + "get-proxy": "^1.0.1", + "is-obj": "^1.0.0", + "object-assign": "^3.0.0", + "tunnel-agent": "^0.4.0" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "optional": true + } + } + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "clap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==", + "dev": true + }, + "co": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", + "integrity": "sha512-CQsjCRiNObI8AtTsNIBDRMQ4oMR83CzEswHYahClvul7gKk+lDQiOKv+5qh7LQWf5sh6jkZNispz/QlsZxyNgA==", + "dev": true, + "optional": true + }, + "coa": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", + "integrity": "sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==", + "dev": true, + "optional": true, + "requires": { + "q": "^1.1.2" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "optional": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha512-QC/8l9e6ofi6nqZ5PawlDgzmMw3OxIXtvolBzap/F4UDBJlDaZRSNbL/lb41C29FcbSJncBFlJFj2WJoNyZRfQ==", + "dev": true, + "optional": true + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "dev": true, + "optional": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha512-FFN5KwpvvQTTS5hWPxrU8/QE4kQUc6uwZcrnlMBN82t1MgAtq8mnoDwINBly9Tdr02seeIIhtdF+UH1feBYGog==", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "csso": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", + "integrity": "sha512-tckZA0LhyEnToPoQDmncCA+TUS3aoIVl/MsSaoipR52Sfa+H83fJvIHRVOHMFn9zW6kIV1L0D7tUDFFjvN28lg==", + "dev": true, + "optional": true, + "requires": { + "clap": "^1.0.9", + "source-map": "^0.5.3" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decompress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-3.0.0.tgz", + "integrity": "sha512-QCl8WTT4FSft5F+0M0InHKO6UYFfYhw5++vktTKpmUsQ6YUMPcBwMu7Sp3P0lMGk00hTNHohdhfdi9+OswLJuQ==", + "dev": true, + "optional": true, + "requires": { + "buffer-to-vinyl": "^1.0.0", + "concat-stream": "^1.4.6", + "decompress-tar": "^3.0.0", + "decompress-tarbz2": "^3.0.0", + "decompress-targz": "^3.0.0", + "decompress-unzip": "^3.0.0", + "stream-combiner2": "^1.1.1", + "vinyl-assign": "^1.0.1", + "vinyl-fs": "^2.2.0" + } + }, + "decompress-tar": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-3.1.0.tgz", + "integrity": "sha512-YuF7b9jA2bnBhf0/HQ/5UDgX5Ogzw1xJz6mWOFRctyOcmZPjJx3jjde9tCBjysvYscutRTPi35Q20mPDA74SKQ==", + "dev": true, + "optional": true, + "requires": { + "is-tar": "^1.0.0", + "object-assign": "^2.0.0", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "optional": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "decompress-tarbz2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-3.1.0.tgz", + "integrity": "sha512-UVCUT54LTEf8uqoytmEMVSwTVl/rZJ0o6bUJsJ7psRmICUzCsz9BJ31drbX0NtgwD9cFzIwKProa2yThmVBKvQ==", + "dev": true, + "optional": true, + "requires": { + "is-bzip2": "^1.0.0", + "object-assign": "^2.0.0", + "seek-bzip": "^1.0.3", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "optional": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "decompress-targz": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-3.1.0.tgz", + "integrity": "sha512-umeSWvrmd9/qcmGaf0oAc+Gx7La0B4Uxo+HXoo0HqrjEbCzn7SMiWvmE5sS56B+GqaoJ8z64ORZCRaOzKCYi/w==", + "dev": true, + "optional": true, + "requires": { + "is-gzip": "^1.0.0", + "object-assign": "^2.0.0", + "strip-dirs": "^1.0.0", + "tar-stream": "^1.1.1", + "through2": "^0.6.1", + "vinyl": "^0.4.3" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true, + "optional": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha512-pmza4M5VA15HOImIQYWhoXGlGNafCm0QK5BpBUXkzzEwrRxKqBsbAhTfkT2zMcJhUX1G1Gkid0xaV8WjOl7DsA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^0.2.0", + "clone-stats": "^0.0.1" + } + } + } + }, + "decompress-unzip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-3.4.0.tgz", + "integrity": "sha512-rclee6Q/+aChW77vbHmtGNZi3ko1Qhsp9Brs5mVyhBSeg+K4n+6MHo47y/+7GsmYZuEqVJ46LjwT3/N8N50jZQ==", + "dev": true, + "optional": true, + "requires": { + "is-zip": "^1.0.0", + "read-all-stream": "^3.0.0", + "stat-mode": "^0.2.0", + "strip-dirs": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0", + "yauzl": "^2.2.1" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "optional": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "download": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/download/-/download-4.4.3.tgz", + "integrity": "sha512-yOTsksXxUQ9b/p/HA3g9L97JZThcAKq8v3+Afwhf/kIoV0spu6pOvj+OKQbyGKYAwBGqSPbO+x1pCFSg5ce9OA==", + "dev": true, + "optional": true, + "requires": { + "caw": "^1.0.1", + "concat-stream": "^1.4.7", + "each-async": "^1.0.0", + "filenamify": "^1.0.1", + "got": "^5.0.0", + "gulp-decompress": "^1.2.0", + "gulp-rename": "^1.2.0", + "is-url": "^1.2.0", + "object-assign": "^4.0.1", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.2", + "stream-combiner2": "^1.1.1", + "vinyl": "^1.0.0", + "vinyl-fs": "^2.2.0", + "ware": "^1.2.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "optional": true + } + } + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha512-0hJGub96skwr+sUojv7zQ0kc9i4jn3SwLiLk8Jr7KDz7aaaMzkN5UX3a/9ZhzC0OfZVyXHhlHcjC0KVOiKZ+HQ==", + "dev": true, + "optional": true, + "requires": { + "onetime": "^1.0.0", + "set-immediate-shim": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "requires": { + "string-template": "~0.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "exec-buffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-2.0.1.tgz", + "integrity": "sha512-or7SADjL54VpD0Z3mzsJ6LpSLiqy1VLeAuamwa4k1gXVJCKY+5Y2H+DTgAru5UuEzmN2RqiHHGTEjzT5YLnE/A==", + "dev": true, + "optional": true, + "requires": { + "rimraf": "^2.2.6", + "tempfile": "^1.0.0" + } + }, + "exec-series": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/exec-series/-/exec-series-1.0.3.tgz", + "integrity": "sha512-VkmGmKa4oWkVBcPPfSzOEmry9ELWKk4oodvXpmtYmvGD82k/TnT0CGNw9VoxQLYGwNJR6fIaXpHUhBm4tNTSMQ==", + "dev": true, + "optional": true, + "requires": { + "async-each-series": "^1.1.0", + "object-assign": "^4.1.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "optional": true + } + } + }, + "executable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/executable/-/executable-1.1.0.tgz", + "integrity": "sha512-qZLuUgqTqYRLdF8Gl56y/JhT+X15uPX6y0Vpmj0cF4SCwbswBPc6yxzr1nClQa+SwRQ5Sk9+Mxa3ZBX9t6aWzg==", + "dev": true, + "optional": true, + "requires": { + "meow": "^3.1.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "optional": true + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "optional": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "optional": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + } + } + }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "dev": true + }, + "filename-reserved-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha512-UZArj7+U+2reBBVCvVmRlyq9D7EYQdUtuNN+1iz7pF1jGcJ2L0TjiRCxsTZfj2xFbM4c25uGCUDpKTHA7L2TKg==", + "dev": true, + "optional": true + }, + "filenamify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha512-DKVP0WQcB7WaIMSwDETqImRej2fepPqvXQjaVib7LRZn9Rxn5UbvK2tYTqGf1A1DkIprQQkG4XSQXSOZp7Q3GQ==", + "dev": true, + "optional": true, + "requires": { + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "find-versions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-1.2.1.tgz", + "integrity": "sha512-t0ciYD8XnoFVirFJN2niUJAQ/kyZU5UDSJobyekmiMPCBsYsWd4nd75e7HU2Xf4m+1Y7iLEo3fovNRNIV5MaDQ==", + "dev": true, + "optional": true, + "requires": { + "array-uniq": "^1.0.0", + "get-stdin": "^4.0.1", + "meow": "^3.5.0", + "semver-regex": "^1.0.0" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha512-8HWGSLAPr+AG0hBpsqi5Ob8HrLStN/LWeqhpFl14d7FJgHK48TmgLoALPz69XSUR65YJzDfLUX/BM8+MLJLghQ==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "optional": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "get-intrinsic": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", + "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "function-bind": "^1.1.2", + "get-proto": "^1.0.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "get-proxy": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-1.1.0.tgz", + "integrity": "sha512-3cJ+77wC52qD2PqWNXtB2HkU6tQXc/X3hSMtSN0Y8c8nbYMMxF7vpsjH4H0iSt+28l/NK13DKl8iKAVGkqDFnA==", + "dev": true, + "optional": true, + "requires": { + "rc": "^1.1.2" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true + }, + "getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "gifsicle": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-3.0.4.tgz", + "integrity": "sha512-bfwYZooxxqCHpu3qUMn3En9xij/rrQd1fD9TNr+f7r5y/Inqj0WGkL7AeqQffBe/Sd6M/MIHzRKeD9hgI6Xavg==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==", + "dev": true, + "requires": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "dependencies": { + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "optional": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true + }, + "got": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha512-1qd54GLxvVgzuidFmw9ze9umxS3rzhdBH6Wt6BTYrTQUXTN01vGGYXwzLzYLowNx8HBH3/c7kRyvx90fh13i7Q==", + "dev": true, + "optional": true, + "requires": { + "create-error-class": "^3.0.1", + "duplexer2": "^0.1.4", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "node-status-codes": "^1.0.0", + "object-assign": "^4.0.1", + "parse-json": "^2.1.0", + "pinkie-promise": "^2.0.0", + "read-all-stream": "^3.0.0", + "readable-stream": "^2.0.5", + "timed-out": "^3.0.0", + "unzip-response": "^1.0.2", + "url-parse-lax": "^1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "optional": true + } + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "dev": true, + "requires": { + "dateformat": "~4.6.2", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~5.0.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.6.3", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "nopt": "~3.0.6" + }, + "dependencies": { + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + } + } + }, + "grunt-cli": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.5.0.tgz", + "integrity": "sha512-rILKAFoU0dzlf22SUfDtq2R1fosChXXlJM5j7wI6uoW8gwmXDXzbUvirlKZSYCdXl3LXFbR+8xyS+WFo+b6vlA==", + "dev": true, + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~5.0.0", + "v8flags": "^4.0.1" + }, + "dependencies": { + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "v8flags": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", + "dev": true + } + } + }, + "grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha512-QdTmcxe8aim2Z0dFeuSJ+f7fHIeY7PZaTMZxgvosjXwyMhpy2GUR5WHkr12lksHfZVE80v2wUwqF56wyfPUwoQ==", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "source-map": "^0.5.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-imagemin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-imagemin/-/grunt-contrib-imagemin-1.0.1.tgz", + "integrity": "sha512-5QM+e2zgC3eYn6f7XMZnEPQvunp0cSktW7ryyX9wMqv+LB5Q5rgKGwpjUwy5XQovK82JnMAelhodS3ylpKGAxw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "chalk": "^1.0.0", + "gulp-rename": "^1.2.0", + "imagemin": "^4.0.0", + "pretty-bytes": "^3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-less": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz", + "integrity": "sha512-NI8pp1KL3c43iR6OLWRyla6I5FLSpvbT5R6UzGHvdRDT0cM0WVfDiIAqqnjDL9z7pPr3ZyOrum5Jn1CIATmHxQ==", + "dev": true, + "requires": { + "async": "^2.0.0", + "chalk": "^1.0.0", + "less": "~2.7.1", + "lodash": "^4.8.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-uglify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-2.3.0.tgz", + "integrity": "sha512-hdV6W7OwRCcYb6MJoSK8OE/D3dFJ02ykp+UMoGNBGusKxiX0TBreQ0JD/PHMsBUfCmp8vOYEbL9np90qO4bJJQ==", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "maxmin": "^1.1.0", + "object.assign": "^4.0.4", + "uglify-js": "~2.8.21", + "uri-path": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", + "dev": true, + "requires": { + "async": "^2.6.0", + "gaze": "^1.1.0", + "lodash": "^4.17.10", + "tiny-lr": "^1.1.1" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + } + } + }, + "grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true + }, + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "requires": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "requires": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "requires": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "gulp-decompress": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gulp-decompress/-/gulp-decompress-1.2.0.tgz", + "integrity": "sha512-ChTv+4/4BwAdQLUgQoAvLFjYFvxYF6p9Mmf/b19/Lp7yNCvb8+KRkdXV8Gd7XErxtrEh8XDCCVon3DgqW4TgfA==", + "dev": true, + "optional": true, + "requires": { + "archive-type": "^3.0.0", + "decompress": "^3.0.0", + "gulp-util": "^3.0.1", + "readable-stream": "^2.0.2" + } + }, + "gulp-rename": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-1.4.0.tgz", + "integrity": "sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==", + "dev": true + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha512-NjRy6+Qb5K1xbwOvPviD3uA4KSq2zsalPL+4vxPQPuL+kKzHjXJL10/kLaESic3LmBto8VIBHr3gIN3F9AjnhA==", + "dev": true, + "requires": { + "convert-source-map": "^1.1.1", + "graceful-fs": "^4.1.2", + "strip-bom": "^2.0.0", + "through2": "^2.0.0", + "vinyl": "^1.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha512-q5oWPc12lwSFS9h/4VIjG+1NuNDlJ48ywV2JKItY4Ycc/n1fXJeYPVQsfu5ZrhQi7FGSDBalwUCLar/GyHXKGw==", + "dev": true, + "optional": true, + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha512-P5zdf3WB9uzr7IFoVQ2wZTmUwHL8cMZWJGzLBNCHNZ3NB6HTMsYABtt7z8tAGIINLXyAob9B9a1yzVGMFOYKEA==", + "dev": true, + "optional": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", + "dev": true, + "optional": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha512-mu66twX6zg8WB6IPfUtrquS7fjwGnDJ7kdVcggd5rpjwBItQKjHtvhu6VcQMkqPYAR7DjWpEaN3xiBSNmxvzPg==", + "dev": true, + "requires": { + "browserify-zlib": "^0.1.4", + "concat-stream": "^1.4.1" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha512-f8xf2GOR6Rgwc9FPTLNzgwB+JQ2/zMauYXSWmX5YV5acex6VomT0ocSuwR7BfXo5MpHi+jL+saaux2fwsGJDKQ==", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha512-5Gbp6RAftMYYV3UEI4c4Vv3+a4dQ7taVyvHt+/L6kRt+f4HX1GweAk5UDWN0SvdVnRBzGQ6OG89pGaD9uSFnVw==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha512-+F4GzLjwHNNDEAJW2DC1xXfEoPkRDmUdJ7CBYw4MpqtDwOnqdImJl7GWlpqx+Wko6//J8uKTnIe4wZSv7yCqmw==", + "dev": true, + "optional": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha512-X8xbmTc1cbPXcQV4WkLcRMALuyoxhfpFATmyuCxJPOAvrDS4DNnsTAOmKUxMTOWU6TzrTOkxPKwIx5ZOpJVSrg==", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha512-V6Yw1rIcYV/4JsnggjBU0l4Kr+EXhpwqXRusENU1Xx6ro00IHPHYNynCuBTOZAPlr3AAmLvchH9I7N/VUdvOwQ==", + "dev": true, + "optional": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "http-parser-js": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha512-iUn0NcRULlDGtqNLN1Jxmzayk8ogm7NToldASyZBpM2qggbphjXzNOiw3piN8tgz+e/DRs6X5gAzFwTI6BCRcg==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "imagemin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-4.0.0.tgz", + "integrity": "sha512-iJyJW7JAHHGsbmb729CEpEILUXx8xXvczQ8SAS8nT97UPKkawgoMGIuW+It9lyRerPSiB7eliZ/tE2K3Bww5uA==", + "dev": true, + "requires": { + "buffer-to-vinyl": "^1.0.0", + "concat-stream": "^1.4.6", + "imagemin-gifsicle": "^4.0.0", + "imagemin-jpegtran": "^4.0.0", + "imagemin-optipng": "^4.0.0", + "imagemin-svgo": "^4.0.0", + "optional": "^0.1.0", + "readable-stream": "^2.0.0", + "stream-combiner2": "^1.1.1", + "vinyl-fs": "^2.1.1" + } + }, + "imagemin-gifsicle": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-4.2.0.tgz", + "integrity": "sha512-YrmI8O4hbNLoS7LDG65QwA92k5pRQ0UkJJSeAq44Pc2fWTMUKTLEYjCBBvSC22qKRZUB7nTEezI/hWC5xE6HTg==", + "dev": true, + "optional": true, + "requires": { + "gifsicle": "^3.0.0", + "is-gif": "^1.0.0", + "through2": "^0.6.1" + } + }, + "imagemin-jpegtran": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/imagemin-jpegtran/-/imagemin-jpegtran-4.3.2.tgz", + "integrity": "sha512-rTcs0JPWSPUKJKTc2IoFF4Tes34FLKZLSXkxl4z1fS86/zdSjIutA5VZgte/iZZPzyGzKo+EiFbd/T3p2odt9w==", + "dev": true, + "optional": true, + "requires": { + "is-jpg": "^1.0.0", + "jpegtran-bin": "^3.0.0", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "imagemin-optipng": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-4.3.0.tgz", + "integrity": "sha512-URpRIva07RB3k+v3cUFpMT8sj0MGU349pRfWIZRDrxLrhh0iDxnnzmsD79QCZ4swv51RWgQat3pZnaR8RuQtlg==", + "dev": true, + "optional": true, + "requires": { + "exec-buffer": "^2.0.0", + "is-png": "^1.0.0", + "optipng-bin": "^3.0.0", + "through2": "^0.6.1" + } + }, + "imagemin-svgo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-4.2.1.tgz", + "integrity": "sha512-kAHl0IIfJcrCdje1z4PcVzz7nE2wMgIX9Nolkyl0nNAjEz2P7c2o0ZrJr1FfhKx372cJPWpttALKQ2rE0UpoZg==", + "dev": true, + "optional": true, + "requires": { + "is-svg": "^1.0.0", + "svgo": "^0.6.0", + "through2": "^2.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true + }, + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha512-HjpCHTuxbR/6jWJroc/VN+npo5j0T4Vv2TAI5qdEHQx7hsL767MeccGFSsLtF694EiZKTSEqgoeU6DtGFCcuqQ==", + "dev": true, + "optional": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-bzip2": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bzip2/-/is-bzip2-1.0.0.tgz", + "integrity": "sha512-v5DA9z/rmk4UdJtb3N1jYqjvCA5roRVf5Q6vprHOcF6U/98TmAJ/AvbPeRMEOYWDW4eMr/pJj5Fnfe0T2wL1Bg==", + "dev": true, + "optional": true + }, + "is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "requires": { + "hasown": "^2.0.2" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-gif": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-1.0.0.tgz", + "integrity": "sha512-WDzHvXD3xfQ5einLRHRH7iReMuPwuXImHikxQeTWP09kGIv2mf2ZM63e9YHVSq9kEgjJuxRSp5AzH8Hga0+lNw==", + "dev": true, + "optional": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "optional": true + }, + "is-jpg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-1.0.1.tgz", + "integrity": "sha512-X5PVpLMBH/OaeTN8quzbcLTlwXCb/6n3tcfYTtEDzp0ZwAlgAOtIAIBHN4mS5OcscMgO8etZ5Ol1mNrXSqwBVQ==", + "dev": true, + "optional": true + }, + "is-natural-number": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-2.1.1.tgz", + "integrity": "sha512-88gG/Fur5/8RkhB6UonqOuwQfNJvuaDStW/+r6oIB/hOQPUQe7DiiDQq0fitGOnARt+mQl/S6rg6Vku+i0sA4w==", + "dev": true, + "optional": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "optional": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-png": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-1.1.0.tgz", + "integrity": "sha512-23Rmps8UEx3Bzqr0JqAtQo0tYP6sDfIfMt1rL9rzlla/zbteftI9LSJoqsIoGgL06sJboDGdVns4RTakAW/WTw==", + "dev": true, + "optional": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "dev": true, + "optional": true + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true, + "optional": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "is-svg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-1.1.1.tgz", + "integrity": "sha512-o6rxtFf0DlA6nJLX/5IrDRjuRJ4FeSmoFhJW/wKNF8WrcS7jg/zXM5od1HFMVnymFhFWcvLEXXcqUq0Np3e4MA==", + "dev": true, + "optional": true + }, + "is-tar": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-tar/-/is-tar-1.0.0.tgz", + "integrity": "sha512-8sR603bS6APKxcdkQ1e5rAC9JDCxM3OlbGJDWv5ajhHqIh6cTaqcpeOTch1iIeHYY4nHEFTgmCiGSLfvmODH4w==", + "dev": true, + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "optional": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", + "dev": true, + "optional": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-zip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-zip/-/is-zip-1.0.0.tgz", + "integrity": "sha512-aym/dLqHZVMW/+bbNrA/eTeWTyW4fE6koLSoFSsM2GF3/pho7aPCcmHFWFLvzHu7MDuf67domYn36GDwU/cJkQ==", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "optional": true + }, + "jpegtran-bin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jpegtran-bin/-/jpegtran-bin-3.2.0.tgz", + "integrity": "sha512-XdDj5m/ssa1Anieqd8/JVQLrIsBZ6A9rYzASfpNI0/o/rfsmQx1TP3zZ1GvkMMW5sVlqM2RcMjy8bg428UE9fQ==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz", + "integrity": "sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "optional": true + } + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "dev": true + }, + "lazy-req": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "integrity": "sha512-Vn/JuGaYykbelAVNAhfVJxuwHQCOSNE6mqMtD+gnd+QORlAHwWVmVFqQga3yWt84G5vAwEwpT6sAsZ+tgJ88/Q==", + "dev": true, + "optional": true + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, + "less": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" + } + }, + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "requires": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + } + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true, + "optional": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha512-mTzAr1aNAv/i7W43vOR/uD/aJ4ngbtsRaCubp2BfZhlGU/eORUjg/7F6X0orNMdv33JOrdgGybtvMN/po3EWrA==", + "dev": true, + "optional": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha512-H94wl5P13uEqlCg7OcNNhMQ8KvWSIyqXzOPusRgHC9DK3o54P6P3xtbXlVbRABG4q5gSmp7EDdJ0MSuW9HX6Mg==", + "dev": true, + "optional": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true, + "optional": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true, + "optional": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha512-Sjlavm5y+FUVIF3vF3B75GyXrzsfYV8Dlv3L4mEpuB9leg8N6yf/7rU06iLPx9fY0Mv3khVp9p7Dx0mGV6V5OQ==", + "dev": true, + "optional": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha512-OrPwdDc65iJiBeUe5n/LIjd7Viy99bKwDdk7Z5ljfZg0uFRFlfQaCy9tZ4YMAag9WAZmlVpe1iZrkIMMSMHD3w==", + "dev": true, + "optional": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true, + "optional": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==", + "dev": true, + "optional": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha512-n1PZMXgaaDWZDSvuNZ/8XOcYO2hOKDqZel5adtR30VKQAtoWs/5AOeFA0vPV8moiPzlqe7F4cP2tzpFewQyelQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true, + "optional": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true, + "optional": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true, + "optional": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha512-0B4Y53I0OgHUJkt+7RmlDFWKjVAI/YUpWNiL9GQz5ORDr4ttgfQGo+phBWKFLJbBdtOwgMuUkdOHOnPg45jKmQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha512-TcrlEr31tDYnWkHFWDCV3dHYroKEXpJZ2YJYvJdhN+y4AkWMDZ5I4I8XDtUKqSAyG81N7w+I1mFEJtcED+tGqQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } + }, + "logalot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==", + "dev": true, + "optional": true, + "requires": { + "figures": "^1.3.5", + "squeak": "^1.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "optional": true + }, + "lpad-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha512-MMIcFmmR9zlGZtBcFOows6c2COMekHCIFJz3ew/rRpKZ1wR4mXDPzvcVqLarux8M33X4TPSq2Jdw8WJj0q0KbQ==", + "dev": true, + "optional": true, + "requires": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha512-jypoV6wTPuz/ngkc2sDZnFvpvx14QICNKS/jK9RbkmiQQJZ4JWstIszA8iT/z9tPSF/vXQ5qtG0h65N9tiLIKA==", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "figures": "^1.0.1", + "gzip-size": "^1.0.0", + "pretty-bytes": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha512-LNisJvAjy+hruxp3GV4IkZZscTI34+ISfeM1hesB9V6ezIDfXYrBi9TIXVjjMcEB4QFN7tL+dFDEk4s8jMBMyA==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + } + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "optional": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "optional": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha512-7ZxrUybYv9NonoXgwoOqtStIu18D1c3eFZj27hqgf5kBrBF8Q+tE8V0MW8dKM5QLkQPh1JhhbKgHLY9kifov4Q==", + "dev": true, + "optional": true, + "requires": { + "duplexer2": "0.0.2" + }, + "dependencies": { + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha512-+AWBwjGadtksxjOQSFDhPNQbed7icNXApT4+2BNpsXzcCBiInq2H9XW0O8sfHFaPmnQRs7cg/P0fAr2IWQSW0g==", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "~1.1.9" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "optional": true + } + } + }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha512-1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==", + "dev": true, + "optional": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha512-VlF07iu3VV3+BTXj43Nmp6Irt/G7j/NgEctUS6IweH1RGhURjjCc2NWtzXFPXXWWfc7hgbXQdtiQu2LGp6MxUg==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", + "dev": true, + "optional": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", + "dev": true, + "optional": true + }, + "optional": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", + "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==", + "dev": true + }, + "optipng-bin": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-3.1.4.tgz", + "integrity": "sha512-gsHt71VXDuI7ymHq5pBdzKS5Q1dcHLW6V6j13gnutO1mS8ezulK5Q+Xj/9/e6AwtjOResu2/UOBO/AiGrBo6+A==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^2.0.0", + "bin-wrapper": "^3.0.0", + "logalot": "^2.0.0" + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==", + "dev": true, + "requires": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + } + }, + "os-filter-obj": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-1.0.3.tgz", + "integrity": "sha512-rohpWX8f46ASEOR77j8ZlJ2j5Rzg0j7gxC73ceZaDeMyE6H3nXnwgEjgg5ySlcT0bDuPUw7qcdWtd8Pzp/FJxg==", + "dev": true, + "optional": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "optional": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true, + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==", + "dev": true, + "optional": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "dev": true, + "optional": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "optional": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.1.tgz", + "integrity": "sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "dev": true, + "requires": { + "bytes": "1", + "string_decoder": "0.10" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", + "dev": true, + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0", + "readable-stream": "^2.0.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==", + "dev": true + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha512-IZnsR7voF0miGSu29EXPRgPTuEsI/+aibNSBbN1pplrfartF5wDYGADz3iD9vmBVf2r00rckWZf8BtS5kk7Niw==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "optional": true + } + } + }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "optional": true, + "requires": { + "commander": "^2.8.1" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "semver-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-1.0.0.tgz", + "integrity": "sha512-1vZcoRC+LPtHFkLUPyrabsATDSHerxW+hJBN8h04HZOZBuewbXaNROtUVdEPrTdZsWNq6sfsXDhd48GB2xTG4g==", + "dev": true, + "optional": true + }, + "semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==", + "dev": true, + "optional": true, + "requires": { + "semver": "^5.3.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha512-7bgVOAnPj3XjrKY577S+puCKGCRlUrcrEdsMeRXlg9Ghf5df/xNi6sONUa43WrHUd3TjJBF7O04jYoiY0FVa0A==", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "optional": true + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true + }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "squeak": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha512-YQL1ulInM+ev8nXX7vfXsCsDh6IqXlrremc1hzi77776BtpWgYJUMto3UM05GSAaGzJgWekszjoKDrVNB5XG+A==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + } + } + }, + "sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha512-o+7DC0OM5Jt3+gratXXqfXf62V/CBoqQbT7Kp7jCxTYW2PLOB2/ZSGIfm9T5/QZe1Vw1MCbu6DoB6JnhVtxcJw==", + "dev": true, + "optional": true + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==", + "dev": true, + "requires": { + "first-chunk-stream": "^1.0.0", + "strip-bom": "^2.0.0" + } + }, + "strip-dirs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-1.1.1.tgz", + "integrity": "sha512-+0QvOUTIs3xMridKraQAUSIp/kq7FRt/QjevB40+U6qJfeuPpTDQENFVfAbfZp59GpJkxY+yMdjR5cgKZyR2vg==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.0.0", + "get-stdin": "^4.0.1", + "is-absolute": "^0.1.5", + "is-natural-number": "^2.0.0", + "minimist": "^1.1.0", + "sum-up": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "is-absolute": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "integrity": "sha512-Xi9/ZSn4NFapG8RP98iNPMOeaV3mXPisxKxzKtHVqr3g56j/fBn+yZmnxSVAA8lmZbl2J9b/a4kJvfU3hqQYgA==", + "dev": true, + "optional": true, + "requires": { + "is-relative": "^0.1.0" + } + }, + "is-relative": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "integrity": "sha512-wBOr+rNM4gkAZqoLRJI4myw5WzzIdQosFAAbnvfXP5z1LyzgAI3ivOKehC5KfqlQJZoihVhirgtCBj378Eg8GA==", + "dev": true, + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + } + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "sum-up": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sum-up/-/sum-up-1.0.3.tgz", + "integrity": "sha512-zw5P8gnhiqokJUWRdR6F4kIIIke0+ubQSGyYUY506GCbJWtV7F6Xuy0j6S125eSX2oF+a8KdivsZ8PlVEH0Mcw==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "optional": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svgo": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", + "integrity": "sha512-C5A1r5SjFesNoKsmc+kWBxmB04iBGH2D/nFy8HJaME9+SyZKcmqcN8QG+GwxIc7D2+JWhaaW7uaM9+XwfplTEQ==", + "dev": true, + "optional": true, + "requires": { + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.0.0", + "js-yaml": "~3.6.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "optional": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha512-BLv3oxhfET+w5fjPwq3PsAsxzi9i3qzU//HMpWVz0A6KplF86HdR9x2TGnv9DXhSUrO7LO8czUiTd3yb3mLSvg==", + "dev": true, + "optional": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^2.6.0" + } + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "optional": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "tempfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "integrity": "sha512-NjT12fW6pSEKz1eVcADgaKfeM+XZ4+zSaqVz46XH7+CiEwcelnwtGWRRjF1p+xyW2PVgKKKS2UUw1LzRelntxg==", + "dev": true, + "optional": true, + "requires": { + "os-tmpdir": "^1.0.0", + "uuid": "^2.0.1" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", + "dev": true, + "optional": true + }, + "timed-out": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha512-3RB4qgvPkxF/FGPnrzaWLhW1rxNK2sdH0mFjbhxkfTR6QXvcM3EtYm9L44UrhODZrZ+yhDXeMncLqi8QXn2MJg==", + "dev": true, + "optional": true + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "requires": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + } + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==", + "dev": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "optional": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "dev": true, + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true + }, + "underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "requires": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + } + }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + } + } + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha512-pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==", + "dev": true, + "optional": true + }, + "uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dev": true, + "optional": true, + "requires": { + "prepend-http": "^1.0.1" + } + }, + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha512-dQ9cJzMou5OKr6ZzfvwJkCq3rC72PNXhqz0v3EIhF4a3Np+ujr100AhUx2cKx5ei3iymoJpJrPB3sVSEMdqAeg==", + "dev": true, + "optional": true, + "requires": { + "ip-regex": "^1.0.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + } + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==", + "dev": true, + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-assign": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/vinyl-assign/-/vinyl-assign-1.2.1.tgz", + "integrity": "sha512-jUVK1MkXgsZDdyUAy0rnrcmPeuR/ZLwsaS377zaaciz9SoDRVPIjHlUcYVcUAzLD+AolsLxMMwSe/VP77lAvow==", + "dev": true, + "optional": true, + "requires": { + "object-assign": "^4.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "optional": true + } + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha512-lxMlQW/Wxk/pwhooY3Ut0Q11OH5ZvZfV0Gg1c306fBNWznQ6ZeQaCdE7XX0O/PpGSqgAsHMBxwFgcGxiYW3hZg==", + "dev": true, + "requires": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "ware": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", + "integrity": "sha512-Y2HUDMktriUm+SR2gZWxlrszcgtXExlhQYZ8QJNYbl22jum00KIUcHJ/h/sdAXhWTJcbSkiMYN9Z2tWbWYSrrw==", + "dev": true, + "optional": true, + "requires": { + "wrap-fn": "^0.1.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whet.extend": { + "version": "0.9.9", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", + "integrity": "sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==", + "dev": true, + "optional": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "dev": true + }, + "wrap-fn": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", + "integrity": "sha512-xDLdGx0M8JQw9QDAC9s5NUxtg9MI09F6Vbxa2LYoSoCvzJnx2n81YMIfykmXEGsUvuLaxnblJTzhSOjUOX37ag==", + "dev": true, + "optional": true, + "requires": { + "co": "3.1.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "optional": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/content/package.json similarity index 100% rename from package.json rename to content/package.json diff --git a/pom.xml b/content/pom.xml similarity index 97% rename from pom.xml rename to content/pom.xml index 9fa787279..6084b82a4 100644 --- a/pom.xml +++ b/content/pom.xml @@ -2,11 +2,16 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.google.gwt.site - gwt-site - 2.0-SNAPSHOT + + org.gwtproject.site + 2.0-SNAPSHOT + gwt-site-parent + + gwt-site-content + jar + markdown http://www.gwtproject.org @@ -168,7 +173,7 @@ commons-io commons-io - 2.14.0 + 2.7 @@ -214,6 +219,7 @@ concat uglify imagemin less + diff --git a/src/main/assembly/generated-site.xml b/content/src/main/assembly/generated-site.xml similarity index 100% rename from src/main/assembly/generated-site.xml rename to content/src/main/assembly/generated-site.xml diff --git a/src/main/java/com/google/gwt/site/markdown/MDHelper.java b/content/src/main/java/com/google/gwt/site/markdown/MDHelper.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/MDHelper.java rename to content/src/main/java/com/google/gwt/site/markdown/MDHelper.java diff --git a/src/main/java/com/google/gwt/site/markdown/MDHelperException.java b/content/src/main/java/com/google/gwt/site/markdown/MDHelperException.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/MDHelperException.java rename to content/src/main/java/com/google/gwt/site/markdown/MDHelperException.java diff --git a/src/main/java/com/google/gwt/site/markdown/MDTranslator.java b/content/src/main/java/com/google/gwt/site/markdown/MDTranslator.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/MDTranslator.java rename to content/src/main/java/com/google/gwt/site/markdown/MDTranslator.java diff --git a/src/main/java/com/google/gwt/site/markdown/MarkDown.java b/content/src/main/java/com/google/gwt/site/markdown/MarkDown.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/MarkDown.java rename to content/src/main/java/com/google/gwt/site/markdown/MarkDown.java diff --git a/src/main/java/com/google/gwt/site/markdown/MarkupWriter.java b/content/src/main/java/com/google/gwt/site/markdown/MarkupWriter.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/MarkupWriter.java rename to content/src/main/java/com/google/gwt/site/markdown/MarkupWriter.java diff --git a/src/main/java/com/google/gwt/site/markdown/TranslatorException.java b/content/src/main/java/com/google/gwt/site/markdown/TranslatorException.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/TranslatorException.java rename to content/src/main/java/com/google/gwt/site/markdown/TranslatorException.java diff --git a/src/main/java/com/google/gwt/site/markdown/Util.java b/content/src/main/java/com/google/gwt/site/markdown/Util.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/Util.java rename to content/src/main/java/com/google/gwt/site/markdown/Util.java diff --git a/src/main/java/com/google/gwt/site/markdown/fs/FileSystemTraverser.java b/content/src/main/java/com/google/gwt/site/markdown/fs/FileSystemTraverser.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/fs/FileSystemTraverser.java rename to content/src/main/java/com/google/gwt/site/markdown/fs/FileSystemTraverser.java diff --git a/src/main/java/com/google/gwt/site/markdown/fs/MDNode.java b/content/src/main/java/com/google/gwt/site/markdown/fs/MDNode.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/fs/MDNode.java rename to content/src/main/java/com/google/gwt/site/markdown/fs/MDNode.java diff --git a/src/main/java/com/google/gwt/site/markdown/fs/MDParent.java b/content/src/main/java/com/google/gwt/site/markdown/fs/MDParent.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/fs/MDParent.java rename to content/src/main/java/com/google/gwt/site/markdown/fs/MDParent.java diff --git a/src/main/java/com/google/gwt/site/markdown/toc/TocCreator.java b/content/src/main/java/com/google/gwt/site/markdown/toc/TocCreator.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/toc/TocCreator.java rename to content/src/main/java/com/google/gwt/site/markdown/toc/TocCreator.java diff --git a/src/main/java/com/google/gwt/site/markdown/toc/TocFromMdCreator.java b/content/src/main/java/com/google/gwt/site/markdown/toc/TocFromMdCreator.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/toc/TocFromMdCreator.java rename to content/src/main/java/com/google/gwt/site/markdown/toc/TocFromMdCreator.java diff --git a/src/main/java/com/google/gwt/site/markdown/toc/TocFromTemplateCreator.java b/content/src/main/java/com/google/gwt/site/markdown/toc/TocFromTemplateCreator.java similarity index 100% rename from src/main/java/com/google/gwt/site/markdown/toc/TocFromTemplateCreator.java rename to content/src/main/java/com/google/gwt/site/markdown/toc/TocFromTemplateCreator.java diff --git a/src/main/markdown/GWTPolicy.md b/content/src/main/markdown/GWTPolicy.md similarity index 100% rename from src/main/markdown/GWTPolicy.md rename to content/src/main/markdown/GWTPolicy.md diff --git a/src/main/markdown/articles/articles.md b/content/src/main/markdown/articles/articles.md similarity index 100% rename from src/main/markdown/articles/articles.md rename to content/src/main/markdown/articles/articles.md diff --git a/src/main/markdown/articles/config.xml b/content/src/main/markdown/articles/config.xml similarity index 100% rename from src/main/markdown/articles/config.xml rename to content/src/main/markdown/articles/config.xml diff --git a/src/main/markdown/articles/dom_events_memory_leaks_and_you.md b/content/src/main/markdown/articles/dom_events_memory_leaks_and_you.md similarity index 100% rename from src/main/markdown/articles/dom_events_memory_leaks_and_you.md rename to content/src/main/markdown/articles/dom_events_memory_leaks_and_you.md diff --git a/src/main/markdown/articles/dynamic_host_page.md b/content/src/main/markdown/articles/dynamic_host_page.md similarity index 100% rename from src/main/markdown/articles/dynamic_host_page.md rename to content/src/main/markdown/articles/dynamic_host_page.md diff --git a/src/main/markdown/articles/elemental.md b/content/src/main/markdown/articles/elemental.md similarity index 100% rename from src/main/markdown/articles/elemental.md rename to content/src/main/markdown/articles/elemental.md diff --git a/src/main/markdown/articles/fragment_merging.md b/content/src/main/markdown/articles/fragment_merging.md similarity index 100% rename from src/main/markdown/articles/fragment_merging.md rename to content/src/main/markdown/articles/fragment_merging.md diff --git a/src/main/markdown/articles/gss_migration.md b/content/src/main/markdown/articles/gss_migration.md similarity index 100% rename from src/main/markdown/articles/gss_migration.md rename to content/src/main/markdown/articles/gss_migration.md diff --git a/src/main/markdown/articles/gwt-iphone.md b/content/src/main/markdown/articles/gwt-iphone.md similarity index 100% rename from src/main/markdown/articles/gwt-iphone.md rename to content/src/main/markdown/articles/gwt-iphone.md diff --git a/src/main/markdown/articles/mvp-architecture-2.md b/content/src/main/markdown/articles/mvp-architecture-2.md similarity index 100% rename from src/main/markdown/articles/mvp-architecture-2.md rename to content/src/main/markdown/articles/mvp-architecture-2.md diff --git a/src/main/markdown/articles/mvp-architecture.md b/content/src/main/markdown/articles/mvp-architecture.md similarity index 100% rename from src/main/markdown/articles/mvp-architecture.md rename to content/src/main/markdown/articles/mvp-architecture.md diff --git a/src/main/markdown/articles/security_for_gwt_applications.md b/content/src/main/markdown/articles/security_for_gwt_applications.md similarity index 100% rename from src/main/markdown/articles/security_for_gwt_applications.md rename to content/src/main/markdown/articles/security_for_gwt_applications.md diff --git a/src/main/markdown/articles/superdevmode.md b/content/src/main/markdown/articles/superdevmode.md similarity index 100% rename from src/main/markdown/articles/superdevmode.md rename to content/src/main/markdown/articles/superdevmode.md diff --git a/src/main/markdown/articles/testing_methodologies_using_gwt.md b/content/src/main/markdown/articles/testing_methodologies_using_gwt.md similarity index 100% rename from src/main/markdown/articles/testing_methodologies_using_gwt.md rename to content/src/main/markdown/articles/testing_methodologies_using_gwt.md diff --git a/src/main/markdown/articles/using_gwt_for_json_mashups.md b/content/src/main/markdown/articles/using_gwt_for_json_mashups.md similarity index 100% rename from src/main/markdown/articles/using_gwt_for_json_mashups.md rename to content/src/main/markdown/articles/using_gwt_for_json_mashups.md diff --git a/src/main/markdown/articles/using_gwt_with_hibernate.md b/content/src/main/markdown/articles/using_gwt_with_hibernate.md similarity index 100% rename from src/main/markdown/articles/using_gwt_with_hibernate.md rename to content/src/main/markdown/articles/using_gwt_with_hibernate.md diff --git a/src/main/markdown/benchmarks.md b/content/src/main/markdown/benchmarks.md similarity index 100% rename from src/main/markdown/benchmarks.md rename to content/src/main/markdown/benchmarks.md diff --git a/src/main/markdown/books.md b/content/src/main/markdown/books.md similarity index 100% rename from src/main/markdown/books.md rename to content/src/main/markdown/books.md diff --git a/src/main/markdown/casestudies.md b/content/src/main/markdown/casestudies.md similarity index 100% rename from src/main/markdown/casestudies.md rename to content/src/main/markdown/casestudies.md diff --git a/src/main/markdown/community-group-charter.md b/content/src/main/markdown/community-group-charter.md similarity index 100% rename from src/main/markdown/community-group-charter.md rename to content/src/main/markdown/community-group-charter.md diff --git a/src/main/markdown/community.md b/content/src/main/markdown/community.md similarity index 100% rename from src/main/markdown/community.md rename to content/src/main/markdown/community.md diff --git a/src/main/markdown/config.xml b/content/src/main/markdown/config.xml similarity index 100% rename from src/main/markdown/config.xml rename to content/src/main/markdown/config.xml diff --git a/src/main/markdown/developer_spotlight.md b/content/src/main/markdown/developer_spotlight.md similarity index 100% rename from src/main/markdown/developer_spotlight.md rename to content/src/main/markdown/developer_spotlight.md diff --git a/src/main/markdown/doc/config.xml b/content/src/main/markdown/doc/config.xml similarity index 100% rename from src/main/markdown/doc/config.xml rename to content/src/main/markdown/doc/config.xml diff --git a/src/main/markdown/doc/latest/DevGuide.md b/content/src/main/markdown/doc/latest/DevGuide.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuide.md rename to content/src/main/markdown/doc/latest/DevGuide.md diff --git a/src/main/markdown/doc/latest/DevGuideA11y.md b/content/src/main/markdown/doc/latest/DevGuideA11y.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideA11y.md rename to content/src/main/markdown/doc/latest/DevGuideA11y.md diff --git a/src/main/markdown/doc/latest/DevGuideAutoBeans.md b/content/src/main/markdown/doc/latest/DevGuideAutoBeans.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideAutoBeans.md rename to content/src/main/markdown/doc/latest/DevGuideAutoBeans.md diff --git a/src/main/markdown/doc/latest/DevGuideClientBundle.md b/content/src/main/markdown/doc/latest/DevGuideClientBundle.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideClientBundle.md rename to content/src/main/markdown/doc/latest/DevGuideClientBundle.md diff --git a/src/main/markdown/doc/latest/DevGuideCodeSplitting.md b/content/src/main/markdown/doc/latest/DevGuideCodeSplitting.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodeSplitting.md rename to content/src/main/markdown/doc/latest/DevGuideCodeSplitting.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasics.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasics.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasics.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasics.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsClient.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsClient.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsClient.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsClient.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsCompatibility.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsCompatibility.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsCompatibility.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsCompatibility.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsDeferred.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsDeferred.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsDeferred.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsDeferred.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsDelayed.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsDelayed.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsDelayed.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsDelayed.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsFormatting.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsFormatting.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsFormatting.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsFormatting.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsHistory.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsHistory.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsHistory.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsHistory.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsJSNI.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsJSNI.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsJSNI.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsJSNI.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsJSON.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsJSON.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsJSON.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsJSON.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsJsInterop.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsJsInterop.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsJsInterop.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsJsInterop.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsOverlay.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsOverlay.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsOverlay.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsOverlay.md diff --git a/src/main/markdown/doc/latest/DevGuideCodingBasicsXML.md b/content/src/main/markdown/doc/latest/DevGuideCodingBasicsXML.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCodingBasicsXML.md rename to content/src/main/markdown/doc/latest/DevGuideCodingBasicsXML.md diff --git a/src/main/markdown/doc/latest/DevGuideCompileReport.md b/content/src/main/markdown/doc/latest/DevGuideCompileReport.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCompileReport.md rename to content/src/main/markdown/doc/latest/DevGuideCompileReport.md diff --git a/src/main/markdown/doc/latest/DevGuideCompilingAndDebugging.md b/content/src/main/markdown/doc/latest/DevGuideCompilingAndDebugging.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideCompilingAndDebugging.md rename to content/src/main/markdown/doc/latest/DevGuideCompilingAndDebugging.md diff --git a/src/main/markdown/doc/latest/DevGuideDeploying.md b/content/src/main/markdown/doc/latest/DevGuideDeploying.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideDeploying.md rename to content/src/main/markdown/doc/latest/DevGuideDeploying.md diff --git a/src/main/markdown/doc/latest/DevGuideGlossary.md b/content/src/main/markdown/doc/latest/DevGuideGlossary.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideGlossary.md rename to content/src/main/markdown/doc/latest/DevGuideGlossary.md diff --git a/src/main/markdown/doc/latest/DevGuideGssVsCss.md b/content/src/main/markdown/doc/latest/DevGuideGssVsCss.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideGssVsCss.md rename to content/src/main/markdown/doc/latest/DevGuideGssVsCss.md diff --git a/src/main/markdown/doc/latest/DevGuideHtml5.md b/content/src/main/markdown/doc/latest/DevGuideHtml5.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideHtml5.md rename to content/src/main/markdown/doc/latest/DevGuideHtml5.md diff --git a/src/main/markdown/doc/latest/DevGuideHtml5Storage.md b/content/src/main/markdown/doc/latest/DevGuideHtml5Storage.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideHtml5Storage.md rename to content/src/main/markdown/doc/latest/DevGuideHtml5Storage.md diff --git a/src/main/markdown/doc/latest/DevGuideI18n.md b/content/src/main/markdown/doc/latest/DevGuideI18n.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideI18n.md rename to content/src/main/markdown/doc/latest/DevGuideI18n.md diff --git a/src/main/markdown/doc/latest/DevGuideI18nConstants.md b/content/src/main/markdown/doc/latest/DevGuideI18nConstants.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideI18nConstants.md rename to content/src/main/markdown/doc/latest/DevGuideI18nConstants.md diff --git a/src/main/markdown/doc/latest/DevGuideI18nLocale.md b/content/src/main/markdown/doc/latest/DevGuideI18nLocale.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideI18nLocale.md rename to content/src/main/markdown/doc/latest/DevGuideI18nLocale.md diff --git a/src/main/markdown/doc/latest/DevGuideI18nMessages.md b/content/src/main/markdown/doc/latest/DevGuideI18nMessages.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideI18nMessages.md rename to content/src/main/markdown/doc/latest/DevGuideI18nMessages.md diff --git a/src/main/markdown/doc/latest/DevGuideI18nPluralForms.md b/content/src/main/markdown/doc/latest/DevGuideI18nPluralForms.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideI18nPluralForms.md rename to content/src/main/markdown/doc/latest/DevGuideI18nPluralForms.md diff --git a/src/main/markdown/doc/latest/DevGuideIE9.md b/content/src/main/markdown/doc/latest/DevGuideIE9.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideIE9.md rename to content/src/main/markdown/doc/latest/DevGuideIE9.md diff --git a/src/main/markdown/doc/latest/DevGuideLightweightMetrics.md b/content/src/main/markdown/doc/latest/DevGuideLightweightMetrics.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideLightweightMetrics.md rename to content/src/main/markdown/doc/latest/DevGuideLightweightMetrics.md diff --git a/src/main/markdown/doc/latest/DevGuideLinkers.md b/content/src/main/markdown/doc/latest/DevGuideLinkers.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideLinkers.md rename to content/src/main/markdown/doc/latest/DevGuideLinkers.md diff --git a/src/main/markdown/doc/latest/DevGuideLogging.md b/content/src/main/markdown/doc/latest/DevGuideLogging.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideLogging.md rename to content/src/main/markdown/doc/latest/DevGuideLogging.md diff --git a/src/main/markdown/doc/latest/DevGuideMvpActivitiesAndPlaces.md b/content/src/main/markdown/doc/latest/DevGuideMvpActivitiesAndPlaces.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideMvpActivitiesAndPlaces.md rename to content/src/main/markdown/doc/latest/DevGuideMvpActivitiesAndPlaces.md diff --git a/src/main/markdown/doc/latest/DevGuideOptimizing.md b/content/src/main/markdown/doc/latest/DevGuideOptimizing.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideOptimizing.md rename to content/src/main/markdown/doc/latest/DevGuideOptimizing.md diff --git a/src/main/markdown/doc/latest/DevGuideOrganizingProjects.md b/content/src/main/markdown/doc/latest/DevGuideOrganizingProjects.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideOrganizingProjects.md rename to content/src/main/markdown/doc/latest/DevGuideOrganizingProjects.md diff --git a/src/main/markdown/doc/latest/DevGuideRequestFactory.md b/content/src/main/markdown/doc/latest/DevGuideRequestFactory.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideRequestFactory.md rename to content/src/main/markdown/doc/latest/DevGuideRequestFactory.md diff --git a/src/main/markdown/doc/latest/DevGuideSecurity.md b/content/src/main/markdown/doc/latest/DevGuideSecurity.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideSecurity.md rename to content/src/main/markdown/doc/latest/DevGuideSecurity.md diff --git a/src/main/markdown/doc/latest/DevGuideSecurityRpcXsrf.md b/content/src/main/markdown/doc/latest/DevGuideSecurityRpcXsrf.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideSecurityRpcXsrf.md rename to content/src/main/markdown/doc/latest/DevGuideSecurityRpcXsrf.md diff --git a/src/main/markdown/doc/latest/DevGuideSecuritySafeHtml.md b/content/src/main/markdown/doc/latest/DevGuideSecuritySafeHtml.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideSecuritySafeHtml.md rename to content/src/main/markdown/doc/latest/DevGuideSecuritySafeHtml.md diff --git a/src/main/markdown/doc/latest/DevGuideServerCommunication.md b/content/src/main/markdown/doc/latest/DevGuideServerCommunication.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideServerCommunication.md rename to content/src/main/markdown/doc/latest/DevGuideServerCommunication.md diff --git a/src/main/markdown/doc/latest/DevGuideTesting.md b/content/src/main/markdown/doc/latest/DevGuideTesting.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideTesting.md rename to content/src/main/markdown/doc/latest/DevGuideTesting.md diff --git a/src/main/markdown/doc/latest/DevGuideTestingCoverage.md b/content/src/main/markdown/doc/latest/DevGuideTestingCoverage.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideTestingCoverage.md rename to content/src/main/markdown/doc/latest/DevGuideTestingCoverage.md diff --git a/src/main/markdown/doc/latest/DevGuideTestingHtmlUnit.md b/content/src/main/markdown/doc/latest/DevGuideTestingHtmlUnit.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideTestingHtmlUnit.md rename to content/src/main/markdown/doc/latest/DevGuideTestingHtmlUnit.md diff --git a/src/main/markdown/doc/latest/DevGuideTestingRemoteTesting.md b/content/src/main/markdown/doc/latest/DevGuideTestingRemoteTesting.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideTestingRemoteTesting.md rename to content/src/main/markdown/doc/latest/DevGuideTestingRemoteTesting.md diff --git a/src/main/markdown/doc/latest/DevGuideUi.md b/content/src/main/markdown/doc/latest/DevGuideUi.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUi.md rename to content/src/main/markdown/doc/latest/DevGuideUi.md diff --git a/src/main/markdown/doc/latest/DevGuideUiBinder.md b/content/src/main/markdown/doc/latest/DevGuideUiBinder.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiBinder.md rename to content/src/main/markdown/doc/latest/DevGuideUiBinder.md diff --git a/src/main/markdown/doc/latest/DevGuideUiBinderI18n.md b/content/src/main/markdown/doc/latest/DevGuideUiBinderI18n.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiBinderI18n.md rename to content/src/main/markdown/doc/latest/DevGuideUiBinderI18n.md diff --git a/src/main/markdown/doc/latest/DevGuideUiBrowser.md b/content/src/main/markdown/doc/latest/DevGuideUiBrowser.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiBrowser.md rename to content/src/main/markdown/doc/latest/DevGuideUiBrowser.md diff --git a/src/main/markdown/doc/latest/DevGuideUiCellTable.md b/content/src/main/markdown/doc/latest/DevGuideUiCellTable.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiCellTable.md rename to content/src/main/markdown/doc/latest/DevGuideUiCellTable.md diff --git a/src/main/markdown/doc/latest/DevGuideUiCellWidgets.md b/content/src/main/markdown/doc/latest/DevGuideUiCellWidgets.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiCellWidgets.md rename to content/src/main/markdown/doc/latest/DevGuideUiCellWidgets.md diff --git a/src/main/markdown/doc/latest/DevGuideUiCss.md b/content/src/main/markdown/doc/latest/DevGuideUiCss.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiCss.md rename to content/src/main/markdown/doc/latest/DevGuideUiCss.md diff --git a/src/main/markdown/doc/latest/DevGuideUiCustomCells.md b/content/src/main/markdown/doc/latest/DevGuideUiCustomCells.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiCustomCells.md rename to content/src/main/markdown/doc/latest/DevGuideUiCustomCells.md diff --git a/src/main/markdown/doc/latest/DevGuideUiCustomWidgets.md b/content/src/main/markdown/doc/latest/DevGuideUiCustomWidgets.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiCustomWidgets.md rename to content/src/main/markdown/doc/latest/DevGuideUiCustomWidgets.md diff --git a/src/main/markdown/doc/latest/DevGuideUiDom.md b/content/src/main/markdown/doc/latest/DevGuideUiDom.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiDom.md rename to content/src/main/markdown/doc/latest/DevGuideUiDom.md diff --git a/src/main/markdown/doc/latest/DevGuideUiEditors.md b/content/src/main/markdown/doc/latest/DevGuideUiEditors.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiEditors.md rename to content/src/main/markdown/doc/latest/DevGuideUiEditors.md diff --git a/src/main/markdown/doc/latest/DevGuideUiHandlers.md b/content/src/main/markdown/doc/latest/DevGuideUiHandlers.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiHandlers.md rename to content/src/main/markdown/doc/latest/DevGuideUiHandlers.md diff --git a/src/main/markdown/doc/latest/DevGuideUiImageBundles.md b/content/src/main/markdown/doc/latest/DevGuideUiImageBundles.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiImageBundles.md rename to content/src/main/markdown/doc/latest/DevGuideUiImageBundles.md diff --git a/src/main/markdown/doc/latest/DevGuideUiPanels.md b/content/src/main/markdown/doc/latest/DevGuideUiPanels.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiPanels.md rename to content/src/main/markdown/doc/latest/DevGuideUiPanels.md diff --git a/src/main/markdown/doc/latest/DevGuideUiWidgets.md b/content/src/main/markdown/doc/latest/DevGuideUiWidgets.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideUiWidgets.md rename to content/src/main/markdown/doc/latest/DevGuideUiWidgets.md diff --git a/src/main/markdown/doc/latest/DevGuideValidation.md b/content/src/main/markdown/doc/latest/DevGuideValidation.md similarity index 100% rename from src/main/markdown/doc/latest/DevGuideValidation.md rename to content/src/main/markdown/doc/latest/DevGuideValidation.md diff --git a/src/main/markdown/doc/latest/FAQ.md b/content/src/main/markdown/doc/latest/FAQ.md similarity index 100% rename from src/main/markdown/doc/latest/FAQ.md rename to content/src/main/markdown/doc/latest/FAQ.md diff --git a/src/main/markdown/doc/latest/FAQ_Client.md b/content/src/main/markdown/doc/latest/FAQ_Client.md similarity index 100% rename from src/main/markdown/doc/latest/FAQ_Client.md rename to content/src/main/markdown/doc/latest/FAQ_Client.md diff --git a/src/main/markdown/doc/latest/FAQ_DebuggingAndCompiling.md b/content/src/main/markdown/doc/latest/FAQ_DebuggingAndCompiling.md similarity index 100% rename from src/main/markdown/doc/latest/FAQ_DebuggingAndCompiling.md rename to content/src/main/markdown/doc/latest/FAQ_DebuggingAndCompiling.md diff --git a/src/main/markdown/doc/latest/FAQ_GettingStarted.md b/content/src/main/markdown/doc/latest/FAQ_GettingStarted.md similarity index 100% rename from src/main/markdown/doc/latest/FAQ_GettingStarted.md rename to content/src/main/markdown/doc/latest/FAQ_GettingStarted.md diff --git a/src/main/markdown/doc/latest/FAQ_Server.md b/content/src/main/markdown/doc/latest/FAQ_Server.md similarity index 100% rename from src/main/markdown/doc/latest/FAQ_Server.md rename to content/src/main/markdown/doc/latest/FAQ_Server.md diff --git a/src/main/markdown/doc/latest/FAQ_Troubleshooting.md b/content/src/main/markdown/doc/latest/FAQ_Troubleshooting.md similarity index 100% rename from src/main/markdown/doc/latest/FAQ_Troubleshooting.md rename to content/src/main/markdown/doc/latest/FAQ_Troubleshooting.md diff --git a/src/main/markdown/doc/latest/FAQ_UI.md b/content/src/main/markdown/doc/latest/FAQ_UI.md similarity index 100% rename from src/main/markdown/doc/latest/FAQ_UI.md rename to content/src/main/markdown/doc/latest/FAQ_UI.md diff --git a/src/main/markdown/doc/latest/RefCommandLineTools.md b/content/src/main/markdown/doc/latest/RefCommandLineTools.md similarity index 100% rename from src/main/markdown/doc/latest/RefCommandLineTools.md rename to content/src/main/markdown/doc/latest/RefCommandLineTools.md diff --git a/src/main/markdown/doc/latest/RefGWTClassAPI.md b/content/src/main/markdown/doc/latest/RefGWTClassAPI.md similarity index 100% rename from src/main/markdown/doc/latest/RefGWTClassAPI.md rename to content/src/main/markdown/doc/latest/RefGWTClassAPI.md diff --git a/src/main/markdown/doc/latest/RefGuide.md b/content/src/main/markdown/doc/latest/RefGuide.md similarity index 100% rename from src/main/markdown/doc/latest/RefGuide.md rename to content/src/main/markdown/doc/latest/RefGuide.md diff --git a/src/main/markdown/doc/latest/RefJreEmulation.md b/content/src/main/markdown/doc/latest/RefJreEmulation.md similarity index 100% rename from src/main/markdown/doc/latest/RefJreEmulation.md rename to content/src/main/markdown/doc/latest/RefJreEmulation.md diff --git a/src/main/markdown/doc/latest/RefJreMissingEmulation.md b/content/src/main/markdown/doc/latest/RefJreMissingEmulation.md similarity index 100% rename from src/main/markdown/doc/latest/RefJreMissingEmulation.md rename to content/src/main/markdown/doc/latest/RefJreMissingEmulation.md diff --git a/src/main/markdown/doc/latest/RefWidgetGallery.md b/content/src/main/markdown/doc/latest/RefWidgetGallery.md similarity index 100% rename from src/main/markdown/doc/latest/RefWidgetGallery.md rename to content/src/main/markdown/doc/latest/RefWidgetGallery.md diff --git a/src/main/markdown/doc/latest/ReleaseNotes.md b/content/src/main/markdown/doc/latest/ReleaseNotes.md similarity index 100% rename from src/main/markdown/doc/latest/ReleaseNotes.md rename to content/src/main/markdown/doc/latest/ReleaseNotes.md diff --git a/src/main/markdown/doc/latest/config.xml b/content/src/main/markdown/doc/latest/config.xml similarity index 100% rename from src/main/markdown/doc/latest/config.xml rename to content/src/main/markdown/doc/latest/config.xml diff --git a/src/main/markdown/doc/latest/gwt-dev-help/WebAppClassPath.md b/content/src/main/markdown/doc/latest/gwt-dev-help/WebAppClassPath.md similarity index 100% rename from src/main/markdown/doc/latest/gwt-dev-help/WebAppClassPath.md rename to content/src/main/markdown/doc/latest/gwt-dev-help/WebAppClassPath.md diff --git a/src/main/markdown/doc/latest/gwt-dev-help/longJsniRestriction.md b/content/src/main/markdown/doc/latest/gwt-dev-help/longJsniRestriction.md similarity index 100% rename from src/main/markdown/doc/latest/gwt-dev-help/longJsniRestriction.md rename to content/src/main/markdown/doc/latest/gwt-dev-help/longJsniRestriction.md diff --git a/src/main/markdown/doc/latest/gwt-dev-help/servletMappings.md b/content/src/main/markdown/doc/latest/gwt-dev-help/servletMappings.md similarity index 100% rename from src/main/markdown/doc/latest/gwt-dev-help/servletMappings.md rename to content/src/main/markdown/doc/latest/gwt-dev-help/servletMappings.md diff --git a/src/main/markdown/doc/latest/polymer-tutorial/create.md b/content/src/main/markdown/doc/latest/polymer-tutorial/create.md similarity index 100% rename from src/main/markdown/doc/latest/polymer-tutorial/create.md rename to content/src/main/markdown/doc/latest/polymer-tutorial/create.md diff --git a/src/main/markdown/doc/latest/polymer-tutorial/elements-applogic.md b/content/src/main/markdown/doc/latest/polymer-tutorial/elements-applogic.md similarity index 100% rename from src/main/markdown/doc/latest/polymer-tutorial/elements-applogic.md rename to content/src/main/markdown/doc/latest/polymer-tutorial/elements-applogic.md diff --git a/src/main/markdown/doc/latest/polymer-tutorial/elements-buildui.md b/content/src/main/markdown/doc/latest/polymer-tutorial/elements-buildui.md similarity index 100% rename from src/main/markdown/doc/latest/polymer-tutorial/elements-buildui.md rename to content/src/main/markdown/doc/latest/polymer-tutorial/elements-buildui.md diff --git a/src/main/markdown/doc/latest/polymer-tutorial/introduction.md b/content/src/main/markdown/doc/latest/polymer-tutorial/introduction.md similarity index 100% rename from src/main/markdown/doc/latest/polymer-tutorial/introduction.md rename to content/src/main/markdown/doc/latest/polymer-tutorial/introduction.md diff --git a/src/main/markdown/doc/latest/polymer-tutorial/widgets-applogic.md b/content/src/main/markdown/doc/latest/polymer-tutorial/widgets-applogic.md similarity index 100% rename from src/main/markdown/doc/latest/polymer-tutorial/widgets-applogic.md rename to content/src/main/markdown/doc/latest/polymer-tutorial/widgets-applogic.md diff --git a/src/main/markdown/doc/latest/polymer-tutorial/widgets-buildui.md b/content/src/main/markdown/doc/latest/polymer-tutorial/widgets-buildui.md similarity index 100% rename from src/main/markdown/doc/latest/polymer-tutorial/widgets-buildui.md rename to content/src/main/markdown/doc/latest/polymer-tutorial/widgets-buildui.md diff --git a/src/main/markdown/doc/latest/tutorial/JSON.md b/content/src/main/markdown/doc/latest/tutorial/JSON.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/JSON.md rename to content/src/main/markdown/doc/latest/tutorial/JSON.md diff --git a/src/main/markdown/doc/latest/tutorial/JSONphp.md b/content/src/main/markdown/doc/latest/tutorial/JSONphp.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/JSONphp.md rename to content/src/main/markdown/doc/latest/tutorial/JSONphp.md diff --git a/src/main/markdown/doc/latest/tutorial/JUnit.md b/content/src/main/markdown/doc/latest/tutorial/JUnit.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/JUnit.md rename to content/src/main/markdown/doc/latest/tutorial/JUnit.md diff --git a/src/main/markdown/doc/latest/tutorial/RPC.md b/content/src/main/markdown/doc/latest/tutorial/RPC.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/RPC.md rename to content/src/main/markdown/doc/latest/tutorial/RPC.md diff --git a/src/main/markdown/doc/latest/tutorial/Xsite.md b/content/src/main/markdown/doc/latest/tutorial/Xsite.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/Xsite.md rename to content/src/main/markdown/doc/latest/tutorial/Xsite.md diff --git a/src/main/markdown/doc/latest/tutorial/appengine.md b/content/src/main/markdown/doc/latest/tutorial/appengine.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/appengine.md rename to content/src/main/markdown/doc/latest/tutorial/appengine.md diff --git a/src/main/markdown/doc/latest/tutorial/buildui.md b/content/src/main/markdown/doc/latest/tutorial/buildui.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/buildui.md rename to content/src/main/markdown/doc/latest/tutorial/buildui.md diff --git a/src/main/markdown/doc/latest/tutorial/clientserver.md b/content/src/main/markdown/doc/latest/tutorial/clientserver.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/clientserver.md rename to content/src/main/markdown/doc/latest/tutorial/clientserver.md diff --git a/src/main/markdown/doc/latest/tutorial/codeclient.md b/content/src/main/markdown/doc/latest/tutorial/codeclient.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/codeclient.md rename to content/src/main/markdown/doc/latest/tutorial/codeclient.md diff --git a/src/main/markdown/doc/latest/tutorial/compile.md b/content/src/main/markdown/doc/latest/tutorial/compile.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/compile.md rename to content/src/main/markdown/doc/latest/tutorial/compile.md diff --git a/src/main/markdown/doc/latest/tutorial/config.xml b/content/src/main/markdown/doc/latest/tutorial/config.xml similarity index 100% rename from src/main/markdown/doc/latest/tutorial/config.xml rename to content/src/main/markdown/doc/latest/tutorial/config.xml diff --git a/src/main/markdown/doc/latest/tutorial/create.md b/content/src/main/markdown/doc/latest/tutorial/create.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/create.md rename to content/src/main/markdown/doc/latest/tutorial/create.md diff --git a/src/main/markdown/doc/latest/tutorial/debug.md b/content/src/main/markdown/doc/latest/tutorial/debug.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/debug.md rename to content/src/main/markdown/doc/latest/tutorial/debug.md diff --git a/src/main/markdown/doc/latest/tutorial/design.md b/content/src/main/markdown/doc/latest/tutorial/design.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/design.md rename to content/src/main/markdown/doc/latest/tutorial/design.md diff --git a/src/main/markdown/doc/latest/tutorial/gettingstarted.md b/content/src/main/markdown/doc/latest/tutorial/gettingstarted.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/gettingstarted.md rename to content/src/main/markdown/doc/latest/tutorial/gettingstarted.md diff --git a/src/main/markdown/doc/latest/tutorial/i18n.md b/content/src/main/markdown/doc/latest/tutorial/i18n.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/i18n.md rename to content/src/main/markdown/doc/latest/tutorial/i18n.md diff --git a/src/main/markdown/doc/latest/tutorial/index.md b/content/src/main/markdown/doc/latest/tutorial/index.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/index.md rename to content/src/main/markdown/doc/latest/tutorial/index.md diff --git a/src/main/markdown/doc/latest/tutorial/manageevents.md b/content/src/main/markdown/doc/latest/tutorial/manageevents.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/manageevents.md rename to content/src/main/markdown/doc/latest/tutorial/manageevents.md diff --git a/src/main/markdown/doc/latest/tutorial/style.md b/content/src/main/markdown/doc/latest/tutorial/style.md similarity index 100% rename from src/main/markdown/doc/latest/tutorial/style.md rename to content/src/main/markdown/doc/latest/tutorial/style.md diff --git a/src/main/markdown/download.md b/content/src/main/markdown/download.md similarity index 100% rename from src/main/markdown/download.md rename to content/src/main/markdown/download.md diff --git a/src/main/markdown/examples.md b/content/src/main/markdown/examples.md similarity index 100% rename from src/main/markdown/examples.md rename to content/src/main/markdown/examples.md diff --git a/src/main/markdown/gettingstarted-v2.md b/content/src/main/markdown/gettingstarted-v2.md similarity index 100% rename from src/main/markdown/gettingstarted-v2.md rename to content/src/main/markdown/gettingstarted-v2.md diff --git a/src/main/markdown/gettingstarted.md b/content/src/main/markdown/gettingstarted.md similarity index 100% rename from src/main/markdown/gettingstarted.md rename to content/src/main/markdown/gettingstarted.md diff --git a/src/main/markdown/index.md b/content/src/main/markdown/index.md similarity index 100% rename from src/main/markdown/index.md rename to content/src/main/markdown/index.md diff --git a/src/main/markdown/learnmore-sdk.md b/content/src/main/markdown/learnmore-sdk.md similarity index 100% rename from src/main/markdown/learnmore-sdk.md rename to content/src/main/markdown/learnmore-sdk.md diff --git a/src/main/markdown/lifeofanissue.md b/content/src/main/markdown/lifeofanissue.md similarity index 100% rename from src/main/markdown/lifeofanissue.md rename to content/src/main/markdown/lifeofanissue.md diff --git a/src/main/markdown/makinggwtbetter.md b/content/src/main/markdown/makinggwtbetter.md similarity index 100% rename from src/main/markdown/makinggwtbetter.md rename to content/src/main/markdown/makinggwtbetter.md diff --git a/src/main/markdown/meetingnotes.md b/content/src/main/markdown/meetingnotes.md similarity index 100% rename from src/main/markdown/meetingnotes.md rename to content/src/main/markdown/meetingnotes.md diff --git a/src/main/markdown/meetingnotes/2015-02-11.md b/content/src/main/markdown/meetingnotes/2015-02-11.md similarity index 100% rename from src/main/markdown/meetingnotes/2015-02-11.md rename to content/src/main/markdown/meetingnotes/2015-02-11.md diff --git a/src/main/markdown/meetingnotes/2015-06-17.md b/content/src/main/markdown/meetingnotes/2015-06-17.md similarity index 100% rename from src/main/markdown/meetingnotes/2015-06-17.md rename to content/src/main/markdown/meetingnotes/2015-06-17.md diff --git a/src/main/markdown/meetingnotes/2015-08-19.md b/content/src/main/markdown/meetingnotes/2015-08-19.md similarity index 100% rename from src/main/markdown/meetingnotes/2015-08-19.md rename to content/src/main/markdown/meetingnotes/2015-08-19.md diff --git a/src/main/markdown/meetingnotes/2015-10-28.md b/content/src/main/markdown/meetingnotes/2015-10-28.md similarity index 100% rename from src/main/markdown/meetingnotes/2015-10-28.md rename to content/src/main/markdown/meetingnotes/2015-10-28.md diff --git a/src/main/markdown/meetingnotes/2016-01-10.md b/content/src/main/markdown/meetingnotes/2016-01-10.md similarity index 100% rename from src/main/markdown/meetingnotes/2016-01-10.md rename to content/src/main/markdown/meetingnotes/2016-01-10.md diff --git a/src/main/markdown/meetingnotes/2016-02-10.md b/content/src/main/markdown/meetingnotes/2016-02-10.md similarity index 100% rename from src/main/markdown/meetingnotes/2016-02-10.md rename to content/src/main/markdown/meetingnotes/2016-02-10.md diff --git a/src/main/markdown/meetingnotes/2016-04-13.md b/content/src/main/markdown/meetingnotes/2016-04-13.md similarity index 100% rename from src/main/markdown/meetingnotes/2016-04-13.md rename to content/src/main/markdown/meetingnotes/2016-04-13.md diff --git a/src/main/markdown/meetingnotes/2016-07-20.md b/content/src/main/markdown/meetingnotes/2016-07-20.md similarity index 100% rename from src/main/markdown/meetingnotes/2016-07-20.md rename to content/src/main/markdown/meetingnotes/2016-07-20.md diff --git a/src/main/markdown/meetingnotes/2017-01-11.md b/content/src/main/markdown/meetingnotes/2017-01-11.md similarity index 100% rename from src/main/markdown/meetingnotes/2017-01-11.md rename to content/src/main/markdown/meetingnotes/2017-01-11.md diff --git a/src/main/markdown/meetingnotes/2017-02-08.md b/content/src/main/markdown/meetingnotes/2017-02-08.md similarity index 100% rename from src/main/markdown/meetingnotes/2017-02-08.md rename to content/src/main/markdown/meetingnotes/2017-02-08.md diff --git a/src/main/markdown/meetingnotes/2017-03-08.md b/content/src/main/markdown/meetingnotes/2017-03-08.md similarity index 100% rename from src/main/markdown/meetingnotes/2017-03-08.md rename to content/src/main/markdown/meetingnotes/2017-03-08.md diff --git a/src/main/markdown/meetingnotes/2017-04-12.md b/content/src/main/markdown/meetingnotes/2017-04-12.md similarity index 100% rename from src/main/markdown/meetingnotes/2017-04-12.md rename to content/src/main/markdown/meetingnotes/2017-04-12.md diff --git a/src/main/markdown/meetingnotes/2017-05-10.md b/content/src/main/markdown/meetingnotes/2017-05-10.md similarity index 100% rename from src/main/markdown/meetingnotes/2017-05-10.md rename to content/src/main/markdown/meetingnotes/2017-05-10.md diff --git a/src/main/markdown/overview.md b/content/src/main/markdown/overview.md similarity index 100% rename from src/main/markdown/overview.md rename to content/src/main/markdown/overview.md diff --git a/src/main/markdown/presentations.md b/content/src/main/markdown/presentations.md similarity index 100% rename from src/main/markdown/presentations.md rename to content/src/main/markdown/presentations.md diff --git a/src/main/markdown/privacy.md b/content/src/main/markdown/privacy.md similarity index 100% rename from src/main/markdown/privacy.md rename to content/src/main/markdown/privacy.md diff --git a/src/main/markdown/release-notes.md b/content/src/main/markdown/release-notes.md similarity index 100% rename from src/main/markdown/release-notes.md rename to content/src/main/markdown/release-notes.md diff --git a/src/main/markdown/resources.md b/content/src/main/markdown/resources.md similarity index 100% rename from src/main/markdown/resources.md rename to content/src/main/markdown/resources.md diff --git a/src/main/markdown/roadmap.md b/content/src/main/markdown/roadmap.md similarity index 100% rename from src/main/markdown/roadmap.md rename to content/src/main/markdown/roadmap.md diff --git a/src/main/markdown/steering.md b/content/src/main/markdown/steering.md similarity index 100% rename from src/main/markdown/steering.md rename to content/src/main/markdown/steering.md diff --git a/src/main/markdown/terms.md b/content/src/main/markdown/terms.md similarity index 100% rename from src/main/markdown/terms.md rename to content/src/main/markdown/terms.md diff --git a/src/main/markdown/usingeclipse.md b/content/src/main/markdown/usingeclipse.md similarity index 100% rename from src/main/markdown/usingeclipse.md rename to content/src/main/markdown/usingeclipse.md diff --git a/src/main/markdown/usingintellij.md b/content/src/main/markdown/usingintellij.md similarity index 100% rename from src/main/markdown/usingintellij.md rename to content/src/main/markdown/usingintellij.md diff --git a/src/main/markdown/versions.md b/content/src/main/markdown/versions.md similarity index 100% rename from src/main/markdown/versions.md rename to content/src/main/markdown/versions.md diff --git a/src/main/markdown/whos_using_gwt.md b/content/src/main/markdown/whos_using_gwt.md similarity index 100% rename from src/main/markdown/whos_using_gwt.md rename to content/src/main/markdown/whos_using_gwt.md diff --git a/src/main/resources/main.tpl b/content/src/main/resources/main.tpl similarity index 100% rename from src/main/resources/main.tpl rename to content/src/main/resources/main.tpl diff --git a/src/main/resources/toc.md b/content/src/main/resources/toc.md similarity index 100% rename from src/main/resources/toc.md rename to content/src/main/resources/toc.md diff --git a/src/main/site/articles/index.html b/content/src/main/site/articles/index.html similarity index 100% rename from src/main/site/articles/index.html rename to content/src/main/site/articles/index.html diff --git a/src/main/site/assets/build/fonts/icons/icons.css b/content/src/main/site/assets/build/fonts/icons/icons.css similarity index 100% rename from src/main/site/assets/build/fonts/icons/icons.css rename to content/src/main/site/assets/build/fonts/icons/icons.css diff --git a/src/main/site/assets/build/fonts/icons/icons.eot b/content/src/main/site/assets/build/fonts/icons/icons.eot similarity index 100% rename from src/main/site/assets/build/fonts/icons/icons.eot rename to content/src/main/site/assets/build/fonts/icons/icons.eot diff --git a/src/main/site/assets/build/fonts/icons/icons.svg b/content/src/main/site/assets/build/fonts/icons/icons.svg similarity index 100% rename from src/main/site/assets/build/fonts/icons/icons.svg rename to content/src/main/site/assets/build/fonts/icons/icons.svg diff --git a/src/main/site/assets/build/fonts/icons/icons.ttf b/content/src/main/site/assets/build/fonts/icons/icons.ttf similarity index 100% rename from src/main/site/assets/build/fonts/icons/icons.ttf rename to content/src/main/site/assets/build/fonts/icons/icons.ttf diff --git a/src/main/site/assets/build/fonts/icons/icons.woff b/content/src/main/site/assets/build/fonts/icons/icons.woff similarity index 100% rename from src/main/site/assets/build/fonts/icons/icons.woff rename to content/src/main/site/assets/build/fonts/icons/icons.woff diff --git a/src/main/site/assets/build/fonts/icons/icons.woff2 b/content/src/main/site/assets/build/fonts/icons/icons.woff2 similarity index 100% rename from src/main/site/assets/build/fonts/icons/icons.woff2 rename to content/src/main/site/assets/build/fonts/icons/icons.woff2 diff --git a/src/main/site/assets/build/js/vendor/jquery-1.11.0.min.js b/content/src/main/site/assets/build/js/vendor/jquery-1.11.0.min.js similarity index 100% rename from src/main/site/assets/build/js/vendor/jquery-1.11.0.min.js rename to content/src/main/site/assets/build/js/vendor/jquery-1.11.0.min.js diff --git a/src/main/site/assets/build/js/vendor/jquery.flexnav.js b/content/src/main/site/assets/build/js/vendor/jquery.flexnav.js similarity index 100% rename from src/main/site/assets/build/js/vendor/jquery.flexnav.js rename to content/src/main/site/assets/build/js/vendor/jquery.flexnav.js diff --git a/src/main/site/assets/build/js/vendor/jquery.flexnav.min.js b/content/src/main/site/assets/build/js/vendor/jquery.flexnav.min.js similarity index 100% rename from src/main/site/assets/build/js/vendor/jquery.flexnav.min.js rename to content/src/main/site/assets/build/js/vendor/jquery.flexnav.min.js diff --git a/src/main/site/assets/build/js/vendor/modernizr-2.6.2.min.js b/content/src/main/site/assets/build/js/vendor/modernizr-2.6.2.min.js similarity index 100% rename from src/main/site/assets/build/js/vendor/modernizr-2.6.2.min.js rename to content/src/main/site/assets/build/js/vendor/modernizr-2.6.2.min.js diff --git a/src/main/site/assets/img/apple-touch-icon-precomposed.png b/content/src/main/site/assets/img/apple-touch-icon-precomposed.png similarity index 100% rename from src/main/site/assets/img/apple-touch-icon-precomposed.png rename to content/src/main/site/assets/img/apple-touch-icon-precomposed.png diff --git a/src/main/site/assets/img/logoBig.png b/content/src/main/site/assets/img/logoBig.png similarity index 100% rename from src/main/site/assets/img/logoBig.png rename to content/src/main/site/assets/img/logoBig.png diff --git a/src/main/site/assets/img/navLogoBig.png b/content/src/main/site/assets/img/navLogoBig.png similarity index 100% rename from src/main/site/assets/img/navLogoBig.png rename to content/src/main/site/assets/img/navLogoBig.png diff --git a/src/main/site/assets/img/navLogoSmall.png b/content/src/main/site/assets/img/navLogoSmall.png similarity index 100% rename from src/main/site/assets/img/navLogoSmall.png rename to content/src/main/site/assets/img/navLogoSmall.png diff --git a/src/main/site/assets/js/global.js b/content/src/main/site/assets/js/global.js similarity index 100% rename from src/main/site/assets/js/global.js rename to content/src/main/site/assets/js/global.js diff --git a/src/main/site/assets/less/colors.less b/content/src/main/site/assets/less/colors.less similarity index 100% rename from src/main/site/assets/less/colors.less rename to content/src/main/site/assets/less/colors.less diff --git a/src/main/site/assets/less/flexnav.less b/content/src/main/site/assets/less/flexnav.less similarity index 100% rename from src/main/site/assets/less/flexnav.less rename to content/src/main/site/assets/less/flexnav.less diff --git a/src/main/site/assets/less/functions.less b/content/src/main/site/assets/less/functions.less similarity index 100% rename from src/main/site/assets/less/functions.less rename to content/src/main/site/assets/less/functions.less diff --git a/src/main/site/assets/less/grid.less b/content/src/main/site/assets/less/grid.less similarity index 100% rename from src/main/site/assets/less/grid.less rename to content/src/main/site/assets/less/grid.less diff --git a/src/main/site/assets/less/layout.less b/content/src/main/site/assets/less/layout.less similarity index 100% rename from src/main/site/assets/less/layout.less rename to content/src/main/site/assets/less/layout.less diff --git a/src/main/site/assets/less/normalize.less b/content/src/main/site/assets/less/normalize.less similarity index 100% rename from src/main/site/assets/less/normalize.less rename to content/src/main/site/assets/less/normalize.less diff --git a/src/main/site/assets/less/print.less b/content/src/main/site/assets/less/print.less similarity index 100% rename from src/main/site/assets/less/print.less rename to content/src/main/site/assets/less/print.less diff --git a/src/main/site/assets/less/style.less b/content/src/main/site/assets/less/style.less similarity index 100% rename from src/main/site/assets/less/style.less rename to content/src/main/site/assets/less/style.less diff --git a/src/main/site/css/jenkins-theme.css b/content/src/main/site/css/jenkins-theme.css similarity index 100% rename from src/main/site/css/jenkins-theme.css rename to content/src/main/site/css/jenkins-theme.css diff --git a/src/main/site/css/main.css b/content/src/main/site/css/main.css similarity index 100% rename from src/main/site/css/main.css rename to content/src/main/site/css/main.css diff --git a/src/main/site/doc/index.html b/content/src/main/site/doc/index.html similarity index 100% rename from src/main/site/doc/index.html rename to content/src/main/site/doc/index.html diff --git a/src/main/site/doc/latest/images/AnatomyOfServices.png b/content/src/main/site/doc/latest/images/AnatomyOfServices.png similarity index 100% rename from src/main/site/doc/latest/images/AnatomyOfServices.png rename to content/src/main/site/doc/latest/images/AnatomyOfServices.png diff --git a/src/main/site/doc/latest/images/Button.png b/content/src/main/site/doc/latest/images/Button.png similarity index 100% rename from src/main/site/doc/latest/images/Button.png rename to content/src/main/site/doc/latest/images/Button.png diff --git a/src/main/site/doc/latest/images/CellBrowser.png b/content/src/main/site/doc/latest/images/CellBrowser.png similarity index 100% rename from src/main/site/doc/latest/images/CellBrowser.png rename to content/src/main/site/doc/latest/images/CellBrowser.png diff --git a/src/main/site/doc/latest/images/CellList.png b/content/src/main/site/doc/latest/images/CellList.png similarity index 100% rename from src/main/site/doc/latest/images/CellList.png rename to content/src/main/site/doc/latest/images/CellList.png diff --git a/src/main/site/doc/latest/images/CheckBox.png b/content/src/main/site/doc/latest/images/CheckBox.png similarity index 100% rename from src/main/site/doc/latest/images/CheckBox.png rename to content/src/main/site/doc/latest/images/CheckBox.png diff --git a/src/main/site/doc/latest/images/CodeSplittingFragments.odg b/content/src/main/site/doc/latest/images/CodeSplittingFragments.odg similarity index 100% rename from src/main/site/doc/latest/images/CodeSplittingFragments.odg rename to content/src/main/site/doc/latest/images/CodeSplittingFragments.odg diff --git a/src/main/site/doc/latest/images/CodeSplittingFragments.png b/content/src/main/site/doc/latest/images/CodeSplittingFragments.png similarity index 100% rename from src/main/site/doc/latest/images/CodeSplittingFragments.png rename to content/src/main/site/doc/latest/images/CodeSplittingFragments.png diff --git a/src/main/site/doc/latest/images/CustomCells-BasicRender.png b/content/src/main/site/doc/latest/images/CustomCells-BasicRender.png similarity index 100% rename from src/main/site/doc/latest/images/CustomCells-BasicRender.png rename to content/src/main/site/doc/latest/images/CustomCells-BasicRender.png diff --git a/src/main/site/doc/latest/images/CustomCells-HandlingEvents.png b/content/src/main/site/doc/latest/images/CustomCells-HandlingEvents.png similarity index 100% rename from src/main/site/doc/latest/images/CustomCells-HandlingEvents.png rename to content/src/main/site/doc/latest/images/CustomCells-HandlingEvents.png diff --git a/src/main/site/doc/latest/images/DatePicker.png b/content/src/main/site/doc/latest/images/DatePicker.png similarity index 100% rename from src/main/site/doc/latest/images/DatePicker.png rename to content/src/main/site/doc/latest/images/DatePicker.png diff --git a/src/main/site/doc/latest/images/DevGuideDirectoriesPackageConventions.png b/content/src/main/site/doc/latest/images/DevGuideDirectoriesPackageConventions.png similarity index 100% rename from src/main/site/doc/latest/images/DevGuideDirectoriesPackageConventions.png rename to content/src/main/site/doc/latest/images/DevGuideDirectoriesPackageConventions.png diff --git a/src/main/site/doc/latest/images/DevModeCollage.png b/content/src/main/site/doc/latest/images/DevModeCollage.png similarity index 100% rename from src/main/site/doc/latest/images/DevModeCollage.png rename to content/src/main/site/doc/latest/images/DevModeCollage.png diff --git a/src/main/site/doc/latest/images/DevModeTypical.jpg b/content/src/main/site/doc/latest/images/DevModeTypical.jpg similarity index 100% rename from src/main/site/doc/latest/images/DevModeTypical.jpg rename to content/src/main/site/doc/latest/images/DevModeTypical.jpg diff --git a/src/main/site/doc/latest/images/DevelopmentShell1.png b/content/src/main/site/doc/latest/images/DevelopmentShell1.png similarity index 100% rename from src/main/site/doc/latest/images/DevelopmentShell1.png rename to content/src/main/site/doc/latest/images/DevelopmentShell1.png diff --git a/src/main/site/doc/latest/images/DevelopmentShell2.png b/content/src/main/site/doc/latest/images/DevelopmentShell2.png similarity index 100% rename from src/main/site/doc/latest/images/DevelopmentShell2.png rename to content/src/main/site/doc/latest/images/DevelopmentShell2.png diff --git a/src/main/site/doc/latest/images/DevelopmentShell3.png b/content/src/main/site/doc/latest/images/DevelopmentShell3.png similarity index 100% rename from src/main/site/doc/latest/images/DevelopmentShell3.png rename to content/src/main/site/doc/latest/images/DevelopmentShell3.png diff --git a/src/main/site/doc/latest/images/DevelopmentShell4.png b/content/src/main/site/doc/latest/images/DevelopmentShell4.png similarity index 100% rename from src/main/site/doc/latest/images/DevelopmentShell4.png rename to content/src/main/site/doc/latest/images/DevelopmentShell4.png diff --git a/src/main/site/doc/latest/images/DialogBox.png b/content/src/main/site/doc/latest/images/DialogBox.png similarity index 100% rename from src/main/site/doc/latest/images/DialogBox.png rename to content/src/main/site/doc/latest/images/DialogBox.png diff --git a/src/main/site/doc/latest/images/DisclosurePanel.png b/content/src/main/site/doc/latest/images/DisclosurePanel.png similarity index 100% rename from src/main/site/doc/latest/images/DisclosurePanel.png rename to content/src/main/site/doc/latest/images/DisclosurePanel.png diff --git a/src/main/site/doc/latest/images/DockLayoutPanel.png b/content/src/main/site/doc/latest/images/DockLayoutPanel.png similarity index 100% rename from src/main/site/doc/latest/images/DockLayoutPanel.png rename to content/src/main/site/doc/latest/images/DockLayoutPanel.png diff --git a/src/main/site/doc/latest/images/DockPanel.png b/content/src/main/site/doc/latest/images/DockPanel.png similarity index 100% rename from src/main/site/doc/latest/images/DockPanel.png rename to content/src/main/site/doc/latest/images/DockPanel.png diff --git a/src/main/site/doc/latest/images/DockPanel_Showcase.png b/content/src/main/site/doc/latest/images/DockPanel_Showcase.png similarity index 100% rename from src/main/site/doc/latest/images/DockPanel_Showcase.png rename to content/src/main/site/doc/latest/images/DockPanel_Showcase.png diff --git a/src/main/site/doc/latest/images/FAQ_UILayout1.png b/content/src/main/site/doc/latest/images/FAQ_UILayout1.png similarity index 100% rename from src/main/site/doc/latest/images/FAQ_UILayout1.png rename to content/src/main/site/doc/latest/images/FAQ_UILayout1.png diff --git a/src/main/site/doc/latest/images/FAQ_UILayout2.png b/content/src/main/site/doc/latest/images/FAQ_UILayout2.png similarity index 100% rename from src/main/site/doc/latest/images/FAQ_UILayout2.png rename to content/src/main/site/doc/latest/images/FAQ_UILayout2.png diff --git a/src/main/site/doc/latest/images/FAQ_UILayout3.png b/content/src/main/site/doc/latest/images/FAQ_UILayout3.png similarity index 100% rename from src/main/site/doc/latest/images/FAQ_UILayout3.png rename to content/src/main/site/doc/latest/images/FAQ_UILayout3.png diff --git a/src/main/site/doc/latest/images/FAQ_UILayout4.png b/content/src/main/site/doc/latest/images/FAQ_UILayout4.png similarity index 100% rename from src/main/site/doc/latest/images/FAQ_UILayout4.png rename to content/src/main/site/doc/latest/images/FAQ_UILayout4.png diff --git a/src/main/site/doc/latest/images/FlowPanel.png b/content/src/main/site/doc/latest/images/FlowPanel.png similarity index 100% rename from src/main/site/doc/latest/images/FlowPanel.png rename to content/src/main/site/doc/latest/images/FlowPanel.png diff --git a/src/main/site/doc/latest/images/GettingUsedToAsyncCalls1.png b/content/src/main/site/doc/latest/images/GettingUsedToAsyncCalls1.png similarity index 100% rename from src/main/site/doc/latest/images/GettingUsedToAsyncCalls1.png rename to content/src/main/site/doc/latest/images/GettingUsedToAsyncCalls1.png diff --git a/src/main/site/doc/latest/images/GettingUsedToAsyncCalls2.png b/content/src/main/site/doc/latest/images/GettingUsedToAsyncCalls2.png similarity index 100% rename from src/main/site/doc/latest/images/GettingUsedToAsyncCalls2.png rename to content/src/main/site/doc/latest/images/GettingUsedToAsyncCalls2.png diff --git a/src/main/site/doc/latest/images/HTML5_Badge_64.png b/content/src/main/site/doc/latest/images/HTML5_Badge_64.png similarity index 100% rename from src/main/site/doc/latest/images/HTML5_Badge_64.png rename to content/src/main/site/doc/latest/images/HTML5_Badge_64.png diff --git a/src/main/site/doc/latest/images/HelloWorld.png b/content/src/main/site/doc/latest/images/HelloWorld.png similarity index 100% rename from src/main/site/doc/latest/images/HelloWorld.png rename to content/src/main/site/doc/latest/images/HelloWorld.png diff --git a/src/main/site/doc/latest/images/HorizontalPanel.png b/content/src/main/site/doc/latest/images/HorizontalPanel.png similarity index 100% rename from src/main/site/doc/latest/images/HorizontalPanel.png rename to content/src/main/site/doc/latest/images/HorizontalPanel.png diff --git a/src/main/site/doc/latest/images/HorizontalPanel_Showcase.png b/content/src/main/site/doc/latest/images/HorizontalPanel_Showcase.png similarity index 100% rename from src/main/site/doc/latest/images/HorizontalPanel_Showcase.png rename to content/src/main/site/doc/latest/images/HorizontalPanel_Showcase.png diff --git a/src/main/site/doc/latest/images/HorizontalSplitPanel.png b/content/src/main/site/doc/latest/images/HorizontalSplitPanel.png similarity index 100% rename from src/main/site/doc/latest/images/HorizontalSplitPanel.png rename to content/src/main/site/doc/latest/images/HorizontalSplitPanel.png diff --git a/src/main/site/doc/latest/images/HorizontalSplitPanel_Showcase.png b/content/src/main/site/doc/latest/images/HorizontalSplitPanel_Showcase.png similarity index 100% rename from src/main/site/doc/latest/images/HorizontalSplitPanel_Showcase.png rename to content/src/main/site/doc/latest/images/HorizontalSplitPanel_Showcase.png diff --git a/src/main/site/doc/latest/images/HostedMode1.png b/content/src/main/site/doc/latest/images/HostedMode1.png similarity index 100% rename from src/main/site/doc/latest/images/HostedMode1.png rename to content/src/main/site/doc/latest/images/HostedMode1.png diff --git a/src/main/site/doc/latest/images/Hyperlink.png b/content/src/main/site/doc/latest/images/Hyperlink.png similarity index 100% rename from src/main/site/doc/latest/images/Hyperlink.png rename to content/src/main/site/doc/latest/images/Hyperlink.png diff --git a/src/main/site/doc/latest/images/LayoutPanel.png b/content/src/main/site/doc/latest/images/LayoutPanel.png similarity index 100% rename from src/main/site/doc/latest/images/LayoutPanel.png rename to content/src/main/site/doc/latest/images/LayoutPanel.png diff --git a/src/main/site/doc/latest/images/ListBox.png b/content/src/main/site/doc/latest/images/ListBox.png similarity index 100% rename from src/main/site/doc/latest/images/ListBox.png rename to content/src/main/site/doc/latest/images/ListBox.png diff --git a/src/main/site/doc/latest/images/LoggingExample.png b/content/src/main/site/doc/latest/images/LoggingExample.png similarity index 100% rename from src/main/site/doc/latest/images/LoggingExample.png rename to content/src/main/site/doc/latest/images/LoggingExample.png diff --git a/src/main/site/doc/latest/images/MenuBar.png b/content/src/main/site/doc/latest/images/MenuBar.png similarity index 100% rename from src/main/site/doc/latest/images/MenuBar.png rename to content/src/main/site/doc/latest/images/MenuBar.png diff --git a/src/main/site/doc/latest/images/PasswordTextBox.png b/content/src/main/site/doc/latest/images/PasswordTextBox.png similarity index 100% rename from src/main/site/doc/latest/images/PasswordTextBox.png rename to content/src/main/site/doc/latest/images/PasswordTextBox.png diff --git a/src/main/site/doc/latest/images/PopupPanel.png b/content/src/main/site/doc/latest/images/PopupPanel.png similarity index 100% rename from src/main/site/doc/latest/images/PopupPanel.png rename to content/src/main/site/doc/latest/images/PopupPanel.png diff --git a/src/main/site/doc/latest/images/PushButton.png b/content/src/main/site/doc/latest/images/PushButton.png similarity index 100% rename from src/main/site/doc/latest/images/PushButton.png rename to content/src/main/site/doc/latest/images/PushButton.png diff --git a/src/main/site/doc/latest/images/RadioButton.png b/content/src/main/site/doc/latest/images/RadioButton.png similarity index 100% rename from src/main/site/doc/latest/images/RadioButton.png rename to content/src/main/site/doc/latest/images/RadioButton.png diff --git a/src/main/site/doc/latest/images/RichTextArea-clipped.png b/content/src/main/site/doc/latest/images/RichTextArea-clipped.png similarity index 100% rename from src/main/site/doc/latest/images/RichTextArea-clipped.png rename to content/src/main/site/doc/latest/images/RichTextArea-clipped.png diff --git a/src/main/site/doc/latest/images/RichTextArea.png b/content/src/main/site/doc/latest/images/RichTextArea.png similarity index 100% rename from src/main/site/doc/latest/images/RichTextArea.png rename to content/src/main/site/doc/latest/images/RichTextArea.png diff --git a/src/main/site/doc/latest/images/SplitLayoutPanel-gallery.png b/content/src/main/site/doc/latest/images/SplitLayoutPanel-gallery.png similarity index 100% rename from src/main/site/doc/latest/images/SplitLayoutPanel-gallery.png rename to content/src/main/site/doc/latest/images/SplitLayoutPanel-gallery.png diff --git a/src/main/site/doc/latest/images/SplitLayoutPanel.png b/content/src/main/site/doc/latest/images/SplitLayoutPanel.png similarity index 100% rename from src/main/site/doc/latest/images/SplitLayoutPanel.png rename to content/src/main/site/doc/latest/images/SplitLayoutPanel.png diff --git a/src/main/site/doc/latest/images/StackLayoutPanel.png b/content/src/main/site/doc/latest/images/StackLayoutPanel.png similarity index 100% rename from src/main/site/doc/latest/images/StackLayoutPanel.png rename to content/src/main/site/doc/latest/images/StackLayoutPanel.png diff --git a/src/main/site/doc/latest/images/StackPanel.png b/content/src/main/site/doc/latest/images/StackPanel.png similarity index 100% rename from src/main/site/doc/latest/images/StackPanel.png rename to content/src/main/site/doc/latest/images/StackPanel.png diff --git a/src/main/site/doc/latest/images/SuggestBox.png b/content/src/main/site/doc/latest/images/SuggestBox.png similarity index 100% rename from src/main/site/doc/latest/images/SuggestBox.png rename to content/src/main/site/doc/latest/images/SuggestBox.png diff --git a/src/main/site/doc/latest/images/TabBar.png b/content/src/main/site/doc/latest/images/TabBar.png similarity index 100% rename from src/main/site/doc/latest/images/TabBar.png rename to content/src/main/site/doc/latest/images/TabBar.png diff --git a/src/main/site/doc/latest/images/TabLayoutPanel.png b/content/src/main/site/doc/latest/images/TabLayoutPanel.png similarity index 100% rename from src/main/site/doc/latest/images/TabLayoutPanel.png rename to content/src/main/site/doc/latest/images/TabLayoutPanel.png diff --git a/src/main/site/doc/latest/images/TabPanel.png b/content/src/main/site/doc/latest/images/TabPanel.png similarity index 100% rename from src/main/site/doc/latest/images/TabPanel.png rename to content/src/main/site/doc/latest/images/TabPanel.png diff --git a/src/main/site/doc/latest/images/TabPanel_Showcase.png b/content/src/main/site/doc/latest/images/TabPanel_Showcase.png similarity index 100% rename from src/main/site/doc/latest/images/TabPanel_Showcase.png rename to content/src/main/site/doc/latest/images/TabPanel_Showcase.png diff --git a/src/main/site/doc/latest/images/Table.png b/content/src/main/site/doc/latest/images/Table.png similarity index 100% rename from src/main/site/doc/latest/images/Table.png rename to content/src/main/site/doc/latest/images/Table.png diff --git a/src/main/site/doc/latest/images/TestCoverageFinal.jpg b/content/src/main/site/doc/latest/images/TestCoverageFinal.jpg similarity index 100% rename from src/main/site/doc/latest/images/TestCoverageFinal.jpg rename to content/src/main/site/doc/latest/images/TestCoverageFinal.jpg diff --git a/src/main/site/doc/latest/images/TestCoverageInitial.jpg b/content/src/main/site/doc/latest/images/TestCoverageInitial.jpg similarity index 100% rename from src/main/site/doc/latest/images/TestCoverageInitial.jpg rename to content/src/main/site/doc/latest/images/TestCoverageInitial.jpg diff --git a/src/main/site/doc/latest/images/TextArea.png b/content/src/main/site/doc/latest/images/TextArea.png similarity index 100% rename from src/main/site/doc/latest/images/TextArea.png rename to content/src/main/site/doc/latest/images/TextArea.png diff --git a/src/main/site/doc/latest/images/TextBox.png b/content/src/main/site/doc/latest/images/TextBox.png similarity index 100% rename from src/main/site/doc/latest/images/TextBox.png rename to content/src/main/site/doc/latest/images/TextBox.png diff --git a/src/main/site/doc/latest/images/ToggleButton.png b/content/src/main/site/doc/latest/images/ToggleButton.png similarity index 100% rename from src/main/site/doc/latest/images/ToggleButton.png rename to content/src/main/site/doc/latest/images/ToggleButton.png diff --git a/src/main/site/doc/latest/images/Tree.png b/content/src/main/site/doc/latest/images/Tree.png similarity index 100% rename from src/main/site/doc/latest/images/Tree.png rename to content/src/main/site/doc/latest/images/Tree.png diff --git a/src/main/site/doc/latest/images/UnresponsiveScriptDialog.png b/content/src/main/site/doc/latest/images/UnresponsiveScriptDialog.png similarity index 100% rename from src/main/site/doc/latest/images/UnresponsiveScriptDialog.png rename to content/src/main/site/doc/latest/images/UnresponsiveScriptDialog.png diff --git a/src/main/site/doc/latest/images/ValidationScreenshot.png b/content/src/main/site/doc/latest/images/ValidationScreenshot.png similarity index 100% rename from src/main/site/doc/latest/images/ValidationScreenshot.png rename to content/src/main/site/doc/latest/images/ValidationScreenshot.png diff --git a/src/main/site/doc/latest/images/VerticalPanel.png b/content/src/main/site/doc/latest/images/VerticalPanel.png similarity index 100% rename from src/main/site/doc/latest/images/VerticalPanel.png rename to content/src/main/site/doc/latest/images/VerticalPanel.png diff --git a/src/main/site/doc/latest/images/VerticalSplitPanel.png b/content/src/main/site/doc/latest/images/VerticalSplitPanel.png similarity index 100% rename from src/main/site/doc/latest/images/VerticalSplitPanel.png rename to content/src/main/site/doc/latest/images/VerticalSplitPanel.png diff --git a/src/main/site/doc/latest/images/VerticalSplitPanel_Showcase.png b/content/src/main/site/doc/latest/images/VerticalSplitPanel_Showcase.png similarity index 100% rename from src/main/site/doc/latest/images/VerticalSplitPanel_Showcase.png rename to content/src/main/site/doc/latest/images/VerticalSplitPanel_Showcase.png diff --git a/src/main/site/doc/latest/images/WebMode1.png b/content/src/main/site/doc/latest/images/WebMode1.png similarity index 100% rename from src/main/site/doc/latest/images/WebMode1.png rename to content/src/main/site/doc/latest/images/WebMode1.png diff --git a/src/main/site/doc/latest/images/appengine_lowres.png b/content/src/main/site/doc/latest/images/appengine_lowres.png similarity index 100% rename from src/main/site/doc/latest/images/appengine_lowres.png rename to content/src/main/site/doc/latest/images/appengine_lowres.png diff --git a/src/main/site/doc/latest/images/apps_mp.png b/content/src/main/site/doc/latest/images/apps_mp.png similarity index 100% rename from src/main/site/doc/latest/images/apps_mp.png rename to content/src/main/site/doc/latest/images/apps_mp.png diff --git a/src/main/site/doc/latest/images/compileReport-Dependencies.gif b/content/src/main/site/doc/latest/images/compileReport-Dependencies.gif similarity index 100% rename from src/main/site/doc/latest/images/compileReport-Dependencies.gif rename to content/src/main/site/doc/latest/images/compileReport-Dependencies.gif diff --git a/src/main/site/doc/latest/images/compileReport-InitialDownloadExample.gif b/content/src/main/site/doc/latest/images/compileReport-InitialDownloadExample.gif similarity index 100% rename from src/main/site/doc/latest/images/compileReport-InitialDownloadExample.gif rename to content/src/main/site/doc/latest/images/compileReport-InitialDownloadExample.gif diff --git a/src/main/site/doc/latest/images/compileReport-Overview.gif b/content/src/main/site/doc/latest/images/compileReport-Overview.gif similarity index 100% rename from src/main/site/doc/latest/images/compileReport-Overview.gif rename to content/src/main/site/doc/latest/images/compileReport-Overview.gif diff --git a/src/main/site/doc/latest/images/compileReport-PackageBreakdown.gif b/content/src/main/site/doc/latest/images/compileReport-PackageBreakdown.gif similarity index 100% rename from src/main/site/doc/latest/images/compileReport-PackageBreakdown.gif rename to content/src/main/site/doc/latest/images/compileReport-PackageBreakdown.gif diff --git a/src/main/site/doc/latest/images/compileReport-PermutationOverview.gif b/content/src/main/site/doc/latest/images/compileReport-PermutationOverview.gif similarity index 100% rename from src/main/site/doc/latest/images/compileReport-PermutationOverview.gif rename to content/src/main/site/doc/latest/images/compileReport-PermutationOverview.gif diff --git a/src/main/site/doc/latest/images/compileReport-splitPointStatus.gif b/content/src/main/site/doc/latest/images/compileReport-splitPointStatus.gif similarity index 100% rename from src/main/site/doc/latest/images/compileReport-splitPointStatus.gif rename to content/src/main/site/doc/latest/images/compileReport-splitPointStatus.gif diff --git a/src/main/site/doc/latest/images/google-plugin.png b/content/src/main/site/doc/latest/images/google-plugin.png similarity index 100% rename from src/main/site/doc/latest/images/google-plugin.png rename to content/src/main/site/doc/latest/images/google-plugin.png diff --git a/src/main/site/doc/latest/images/gph_logo.png b/content/src/main/site/doc/latest/images/gph_logo.png similarity index 100% rename from src/main/site/doc/latest/images/gph_logo.png rename to content/src/main/site/doc/latest/images/gph_logo.png diff --git a/src/main/site/doc/latest/images/icon_android.jpg b/content/src/main/site/doc/latest/images/icon_android.jpg similarity index 100% rename from src/main/site/doc/latest/images/icon_android.jpg rename to content/src/main/site/doc/latest/images/icon_android.jpg diff --git a/src/main/site/doc/latest/images/localStorage.png b/content/src/main/site/doc/latest/images/localStorage.png similarity index 100% rename from src/main/site/doc/latest/images/localStorage.png rename to content/src/main/site/doc/latest/images/localStorage.png diff --git a/src/main/site/doc/latest/index.html b/content/src/main/site/doc/latest/index.html similarity index 100% rename from src/main/site/doc/latest/index.html rename to content/src/main/site/doc/latest/index.html diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-01.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-01.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-01.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-01.png diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-02.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-02.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-02.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-02.png diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-03.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-03.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-03.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-03.png diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-04.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-04.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-04.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-04.png diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-05.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-05.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-05.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-05.png diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-06.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-06.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-06.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-06.png diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-07.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-07.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-07.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-07.png diff --git a/src/main/site/doc/latest/polymer-tutorial/images/todo-list-08.png b/content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-08.png similarity index 100% rename from src/main/site/doc/latest/polymer-tutorial/images/todo-list-08.png rename to content/src/main/site/doc/latest/polymer-tutorial/images/todo-list-08.png diff --git a/src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.css b/content/src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.css similarity index 100% rename from src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.css rename to content/src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.css diff --git a/src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.html b/content/src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.html similarity index 100% rename from src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.html rename to content/src/main/site/doc/latest/tutorial/gettingstarted/StockWatcher.html diff --git a/src/main/site/doc/latest/tutorial/gettingstarted/images/gwt.png b/content/src/main/site/doc/latest/tutorial/gettingstarted/images/gwt.png similarity index 100% rename from src/main/site/doc/latest/tutorial/gettingstarted/images/gwt.png rename to content/src/main/site/doc/latest/tutorial/gettingstarted/images/gwt.png diff --git a/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/2293D04F6B35190160A90C78400C3926.cache.js b/content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/2293D04F6B35190160A90C78400C3926.cache.js similarity index 100% rename from src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/2293D04F6B35190160A90C78400C3926.cache.js rename to content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/2293D04F6B35190160A90C78400C3926.cache.js diff --git a/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/images/hborder.png b/content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/images/hborder.png similarity index 100% rename from src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/images/hborder.png rename to content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/images/hborder.png diff --git a/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/standard.css b/content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/standard.css similarity index 100% rename from src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/standard.css rename to content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/gwt/standard/standard.css diff --git a/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/stockwatcher.nocache.js b/content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/stockwatcher.nocache.js similarity index 100% rename from src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/stockwatcher.nocache.js rename to content/src/main/site/doc/latest/tutorial/gettingstarted/stockwatcher/stockwatcher.nocache.js diff --git a/src/main/site/doc/latest/tutorial/images/AnatomyOfServices.png b/content/src/main/site/doc/latest/tutorial/images/AnatomyOfServices.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/AnatomyOfServices.png rename to content/src/main/site/doc/latest/tutorial/images/AnatomyOfServices.png diff --git a/src/main/site/doc/latest/tutorial/images/BuildUI.png b/content/src/main/site/doc/latest/tutorial/images/BuildUI.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/BuildUI.png rename to content/src/main/site/doc/latest/tutorial/images/BuildUI.png diff --git a/src/main/site/doc/latest/tutorial/images/CodeClientAddStock.png b/content/src/main/site/doc/latest/tutorial/images/CodeClientAddStock.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/CodeClientAddStock.png rename to content/src/main/site/doc/latest/tutorial/images/CodeClientAddStock.png diff --git a/src/main/site/doc/latest/tutorial/images/CodeClientBug.png b/content/src/main/site/doc/latest/tutorial/images/CodeClientBug.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/CodeClientBug.png rename to content/src/main/site/doc/latest/tutorial/images/CodeClientBug.png diff --git a/src/main/site/doc/latest/tutorial/images/CodeClientNewJavaClass.jpg b/content/src/main/site/doc/latest/tutorial/images/CodeClientNewJavaClass.jpg similarity index 100% rename from src/main/site/doc/latest/tutorial/images/CodeClientNewJavaClass.jpg rename to content/src/main/site/doc/latest/tutorial/images/CodeClientNewJavaClass.jpg diff --git a/src/main/site/doc/latest/tutorial/images/CreateEclipseImport.jpg b/content/src/main/site/doc/latest/tutorial/images/CreateEclipseImport.jpg similarity index 100% rename from src/main/site/doc/latest/tutorial/images/CreateEclipseImport.jpg rename to content/src/main/site/doc/latest/tutorial/images/CreateEclipseImport.jpg diff --git a/src/main/site/doc/latest/tutorial/images/CreateGWTComponents.jpg b/content/src/main/site/doc/latest/tutorial/images/CreateGWTComponents.jpg similarity index 100% rename from src/main/site/doc/latest/tutorial/images/CreateGWTComponents.jpg rename to content/src/main/site/doc/latest/tutorial/images/CreateGWTComponents.jpg diff --git a/src/main/site/doc/latest/tutorial/images/CreateStarterApplication.png b/content/src/main/site/doc/latest/tutorial/images/CreateStarterApplication.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/CreateStarterApplication.png rename to content/src/main/site/doc/latest/tutorial/images/CreateStarterApplication.png diff --git a/src/main/site/doc/latest/tutorial/images/DebugVariablesBug.png b/content/src/main/site/doc/latest/tutorial/images/DebugVariablesBug.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/DebugVariablesBug.png rename to content/src/main/site/doc/latest/tutorial/images/DebugVariablesBug.png diff --git a/src/main/site/doc/latest/tutorial/images/DeployAppEngineProject.png b/content/src/main/site/doc/latest/tutorial/images/DeployAppEngineProject.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/DeployAppEngineProject.png rename to content/src/main/site/doc/latest/tutorial/images/DeployAppEngineProject.png diff --git a/src/main/site/doc/latest/tutorial/images/DesignStockWatcherFinal.png b/content/src/main/site/doc/latest/tutorial/images/DesignStockWatcherFinal.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/DesignStockWatcherFinal.png rename to content/src/main/site/doc/latest/tutorial/images/DesignStockWatcherFinal.png diff --git a/src/main/site/doc/latest/tutorial/images/DevModeNoEclipse.png b/content/src/main/site/doc/latest/tutorial/images/DevModeNoEclipse.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/DevModeNoEclipse.png rename to content/src/main/site/doc/latest/tutorial/images/DevModeNoEclipse.png diff --git a/src/main/site/doc/latest/tutorial/images/DevModeTab.png b/content/src/main/site/doc/latest/tutorial/images/DevModeTab.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/DevModeTab.png rename to content/src/main/site/doc/latest/tutorial/images/DevModeTab.png diff --git a/src/main/site/doc/latest/tutorial/images/GWTCompileProject.png b/content/src/main/site/doc/latest/tutorial/images/GWTCompileProject.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/GWTCompileProject.png rename to content/src/main/site/doc/latest/tutorial/images/GWTCompileProject.png diff --git a/src/main/site/doc/latest/tutorial/images/JSONdata.png b/content/src/main/site/doc/latest/tutorial/images/JSONdata.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/JSONdata.png rename to content/src/main/site/doc/latest/tutorial/images/JSONdata.png diff --git a/src/main/site/doc/latest/tutorial/images/JSONerrormessage.png b/content/src/main/site/doc/latest/tutorial/images/JSONerrormessage.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/JSONerrormessage.png rename to content/src/main/site/doc/latest/tutorial/images/JSONerrormessage.png diff --git a/src/main/site/doc/latest/tutorial/images/JSONstockPricesphp.png b/content/src/main/site/doc/latest/tutorial/images/JSONstockPricesphp.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/JSONstockPricesphp.png rename to content/src/main/site/doc/latest/tutorial/images/JSONstockPricesphp.png diff --git a/src/main/site/doc/latest/tutorial/images/JUnitFailed.png b/content/src/main/site/doc/latest/tutorial/images/JUnitFailed.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/JUnitFailed.png rename to content/src/main/site/doc/latest/tutorial/images/JUnitFailed.png diff --git a/src/main/site/doc/latest/tutorial/images/JUnitSimpleTestDev.png b/content/src/main/site/doc/latest/tutorial/images/JUnitSimpleTestDev.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/JUnitSimpleTestDev.png rename to content/src/main/site/doc/latest/tutorial/images/JUnitSimpleTestDev.png diff --git a/src/main/site/doc/latest/tutorial/images/JUnitcreatetest.png b/content/src/main/site/doc/latest/tutorial/images/JUnitcreatetest.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/JUnitcreatetest.png rename to content/src/main/site/doc/latest/tutorial/images/JUnitcreatetest.png diff --git a/src/main/site/doc/latest/tutorial/images/ManageEvents.png b/content/src/main/site/doc/latest/tutorial/images/ManageEvents.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/ManageEvents.png rename to content/src/main/site/doc/latest/tutorial/images/ManageEvents.png diff --git a/src/main/site/doc/latest/tutorial/images/MissingPlugin.png b/content/src/main/site/doc/latest/tutorial/images/MissingPlugin.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/MissingPlugin.png rename to content/src/main/site/doc/latest/tutorial/images/MissingPlugin.png diff --git a/src/main/site/doc/latest/tutorial/images/NewWebApplicationProject.png b/content/src/main/site/doc/latest/tutorial/images/NewWebApplicationProject.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/NewWebApplicationProject.png rename to content/src/main/site/doc/latest/tutorial/images/NewWebApplicationProject.png diff --git a/src/main/site/doc/latest/tutorial/images/RPCerrormessage.png b/content/src/main/site/doc/latest/tutorial/images/RPCerrormessage.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/RPCerrormessage.png rename to content/src/main/site/doc/latest/tutorial/images/RPCerrormessage.png diff --git a/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel1.jpg b/content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel1.jpg similarity index 100% rename from src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel1.jpg rename to content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel1.jpg diff --git a/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel2.jpg b/content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel2.jpg similarity index 100% rename from src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel2.jpg rename to content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel2.jpg diff --git a/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel3.jpg b/content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel3.jpg similarity index 100% rename from src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel3.jpg rename to content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel3.jpg diff --git a/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel4.jpg b/content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel4.jpg similarity index 100% rename from src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel4.jpg rename to content/src/main/site/doc/latest/tutorial/images/StockWatcherUIpanel4.jpg diff --git a/src/main/site/doc/latest/tutorial/images/StyleAfter.png b/content/src/main/site/doc/latest/tutorial/images/StyleAfter.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/StyleAfter.png rename to content/src/main/site/doc/latest/tutorial/images/StyleAfter.png diff --git a/src/main/site/doc/latest/tutorial/images/StyleBefore.png b/content/src/main/site/doc/latest/tutorial/images/StyleBefore.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/StyleBefore.png rename to content/src/main/site/doc/latest/tutorial/images/StyleBefore.png diff --git a/src/main/site/doc/latest/tutorial/images/StyleSecondary.png b/content/src/main/site/doc/latest/tutorial/images/StyleSecondary.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/StyleSecondary.png rename to content/src/main/site/doc/latest/tutorial/images/StyleSecondary.png diff --git a/src/main/site/doc/latest/tutorial/images/i18nEnglish.png b/content/src/main/site/doc/latest/tutorial/images/i18nEnglish.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/i18nEnglish.png rename to content/src/main/site/doc/latest/tutorial/images/i18nEnglish.png diff --git a/src/main/site/doc/latest/tutorial/images/i18nGerman.png b/content/src/main/site/doc/latest/tutorial/images/i18nGerman.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/i18nGerman.png rename to content/src/main/site/doc/latest/tutorial/images/i18nGerman.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-dashboard.png b/content/src/main/site/doc/latest/tutorial/images/spring-dashboard.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-dashboard.png rename to content/src/main/site/doc/latest/tutorial/images/spring-dashboard.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-databrowser.png b/content/src/main/site/doc/latest/tutorial/images/spring-databrowser.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-databrowser.png rename to content/src/main/site/doc/latest/tutorial/images/spring-databrowser.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-devserver.png b/content/src/main/site/doc/latest/tutorial/images/spring-devserver.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-devserver.png rename to content/src/main/site/doc/latest/tutorial/images/spring-devserver.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-extensions.png b/content/src/main/site/doc/latest/tutorial/images/spring-extensions.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-extensions.png rename to content/src/main/site/doc/latest/tutorial/images/spring-extensions.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-package.png b/content/src/main/site/doc/latest/tutorial/images/spring-package.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-package.png rename to content/src/main/site/doc/latest/tutorial/images/spring-package.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-projects.png b/content/src/main/site/doc/latest/tutorial/images/spring-projects.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-projects.png rename to content/src/main/site/doc/latest/tutorial/images/spring-projects.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-prompt.png b/content/src/main/site/doc/latest/tutorial/images/spring-prompt.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-prompt.png rename to content/src/main/site/doc/latest/tutorial/images/spring-prompt.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-roo-shell.png b/content/src/main/site/doc/latest/tutorial/images/spring-roo-shell.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-roo-shell.png rename to content/src/main/site/doc/latest/tutorial/images/spring-roo-shell.png diff --git a/src/main/site/doc/latest/tutorial/images/spring-runas.png b/content/src/main/site/doc/latest/tutorial/images/spring-runas.png similarity index 100% rename from src/main/site/doc/latest/tutorial/images/spring-runas.png rename to content/src/main/site/doc/latest/tutorial/images/spring-runas.png diff --git a/src/main/site/doctype/2.10.0/gwt-module.dtd b/content/src/main/site/doctype/2.10.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.10.0/gwt-module.dtd rename to content/src/main/site/doctype/2.10.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.11.0/gwt-module.dtd b/content/src/main/site/doctype/2.11.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.11.0/gwt-module.dtd rename to content/src/main/site/doctype/2.11.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.12.0/gwt-module.dtd b/content/src/main/site/doctype/2.12.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.12.0/gwt-module.dtd rename to content/src/main/site/doctype/2.12.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.12.1/gwt-module.dtd b/content/src/main/site/doctype/2.12.1/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.12.1/gwt-module.dtd rename to content/src/main/site/doctype/2.12.1/gwt-module.dtd diff --git a/src/main/site/doctype/2.12.2/gwt-module.dtd b/content/src/main/site/doctype/2.12.2/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.12.2/gwt-module.dtd rename to content/src/main/site/doctype/2.12.2/gwt-module.dtd diff --git a/src/main/site/doctype/2.13.0/gwt-module.dtd b/content/src/main/site/doctype/2.13.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.13.0/gwt-module.dtd rename to content/src/main/site/doctype/2.13.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.13.1/gwt-module.dtd b/content/src/main/site/doctype/2.13.1/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.13.1/gwt-module.dtd rename to content/src/main/site/doctype/2.13.1/gwt-module.dtd diff --git a/src/main/site/doctype/2.4.0/gwt-module.dtd b/content/src/main/site/doctype/2.4.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.4.0/gwt-module.dtd rename to content/src/main/site/doctype/2.4.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.5.0/gwt-module.dtd b/content/src/main/site/doctype/2.5.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.5.0/gwt-module.dtd rename to content/src/main/site/doctype/2.5.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.5.1/gwt-module.dtd b/content/src/main/site/doctype/2.5.1/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.5.1/gwt-module.dtd rename to content/src/main/site/doctype/2.5.1/gwt-module.dtd diff --git a/src/main/site/doctype/2.6.0/gwt-module.dtd b/content/src/main/site/doctype/2.6.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.6.0/gwt-module.dtd rename to content/src/main/site/doctype/2.6.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.6.1/gwt-module.dtd b/content/src/main/site/doctype/2.6.1/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.6.1/gwt-module.dtd rename to content/src/main/site/doctype/2.6.1/gwt-module.dtd diff --git a/src/main/site/doctype/2.7.0/gwt-module.dtd b/content/src/main/site/doctype/2.7.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.7.0/gwt-module.dtd rename to content/src/main/site/doctype/2.7.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.8.0/gwt-module.dtd b/content/src/main/site/doctype/2.8.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.8.0/gwt-module.dtd rename to content/src/main/site/doctype/2.8.0/gwt-module.dtd diff --git a/src/main/site/doctype/2.8.1/gwt-module.dtd b/content/src/main/site/doctype/2.8.1/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.8.1/gwt-module.dtd rename to content/src/main/site/doctype/2.8.1/gwt-module.dtd diff --git a/src/main/site/doctype/2.8.2/gwt-module.dtd b/content/src/main/site/doctype/2.8.2/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.8.2/gwt-module.dtd rename to content/src/main/site/doctype/2.8.2/gwt-module.dtd diff --git a/src/main/site/doctype/2.9.0/gwt-module.dtd b/content/src/main/site/doctype/2.9.0/gwt-module.dtd similarity index 100% rename from src/main/site/doctype/2.9.0/gwt-module.dtd rename to content/src/main/site/doctype/2.9.0/gwt-module.dtd diff --git a/src/main/site/images/I18N.jpg b/content/src/main/site/images/I18N.jpg similarity index 100% rename from src/main/site/images/I18N.jpg rename to content/src/main/site/images/I18N.jpg diff --git a/src/main/site/images/app_gal_blueprint.png b/content/src/main/site/images/app_gal_blueprint.png similarity index 100% rename from src/main/site/images/app_gal_blueprint.png rename to content/src/main/site/images/app_gal_blueprint.png diff --git a/src/main/site/images/app_gal_contactoffice.png b/content/src/main/site/images/app_gal_contactoffice.png similarity index 100% rename from src/main/site/images/app_gal_contactoffice.png rename to content/src/main/site/images/app_gal_contactoffice.png diff --git a/src/main/site/images/app_gal_dotemplate.jpg b/content/src/main/site/images/app_gal_dotemplate.jpg similarity index 100% rename from src/main/site/images/app_gal_dotemplate.jpg rename to content/src/main/site/images/app_gal_dotemplate.jpg diff --git a/src/main/site/images/app_gal_gogrid.png b/content/src/main/site/images/app_gal_gogrid.png similarity index 100% rename from src/main/site/images/app_gal_gogrid.png rename to content/src/main/site/images/app_gal_gogrid.png diff --git a/src/main/site/images/app_gal_iphonereader.png b/content/src/main/site/images/app_gal_iphonereader.png similarity index 100% rename from src/main/site/images/app_gal_iphonereader.png rename to content/src/main/site/images/app_gal_iphonereader.png diff --git a/src/main/site/images/app_gal_kaching.png b/content/src/main/site/images/app_gal_kaching.png similarity index 100% rename from src/main/site/images/app_gal_kaching.png rename to content/src/main/site/images/app_gal_kaching.png diff --git a/src/main/site/images/app_gal_queweb.png b/content/src/main/site/images/app_gal_queweb.png similarity index 100% rename from src/main/site/images/app_gal_queweb.png rename to content/src/main/site/images/app_gal_queweb.png diff --git a/src/main/site/images/app_gal_riflethru.png b/content/src/main/site/images/app_gal_riflethru.png similarity index 100% rename from src/main/site/images/app_gal_riflethru.png rename to content/src/main/site/images/app_gal_riflethru.png diff --git a/src/main/site/images/app_gal_scenechronize.png b/content/src/main/site/images/app_gal_scenechronize.png similarity index 100% rename from src/main/site/images/app_gal_scenechronize.png rename to content/src/main/site/images/app_gal_scenechronize.png diff --git a/src/main/site/images/app_gal_studyblue.png b/content/src/main/site/images/app_gal_studyblue.png similarity index 100% rename from src/main/site/images/app_gal_studyblue.png rename to content/src/main/site/images/app_gal_studyblue.png diff --git a/src/main/site/images/app_gal_typeracer.png b/content/src/main/site/images/app_gal_typeracer.png similarity index 100% rename from src/main/site/images/app_gal_typeracer.png rename to content/src/main/site/images/app_gal_typeracer.png diff --git a/src/main/site/images/app_gal_venda.png b/content/src/main/site/images/app_gal_venda.png similarity index 100% rename from src/main/site/images/app_gal_venda.png rename to content/src/main/site/images/app_gal_venda.png diff --git a/src/main/site/images/app_gal_whirled.png b/content/src/main/site/images/app_gal_whirled.png similarity index 100% rename from src/main/site/images/app_gal_whirled.png rename to content/src/main/site/images/app_gal_whirled.png diff --git a/src/main/site/images/arrow-48.png b/content/src/main/site/images/arrow-48.png similarity index 100% rename from src/main/site/images/arrow-48.png rename to content/src/main/site/images/arrow-48.png diff --git a/src/main/site/images/arrow-closed.png b/content/src/main/site/images/arrow-closed.png similarity index 100% rename from src/main/site/images/arrow-closed.png rename to content/src/main/site/images/arrow-closed.png diff --git a/src/main/site/images/arrow-md.png b/content/src/main/site/images/arrow-md.png similarity index 100% rename from src/main/site/images/arrow-md.png rename to content/src/main/site/images/arrow-md.png diff --git a/src/main/site/images/arrow-open.png b/content/src/main/site/images/arrow-open.png similarity index 100% rename from src/main/site/images/arrow-open.png rename to content/src/main/site/images/arrow-open.png diff --git a/src/main/site/images/bookedin.png b/content/src/main/site/images/bookedin.png similarity index 100% rename from src/main/site/images/bookedin.png rename to content/src/main/site/images/bookedin.png diff --git a/src/main/site/images/books/Developing_with_Ext_GWT_Enterprise_RIA_Development.png b/content/src/main/site/images/books/Developing_with_Ext_GWT_Enterprise_RIA_Development.png similarity index 100% rename from src/main/site/images/books/Developing_with_Ext_GWT_Enterprise_RIA_Development.png rename to content/src/main/site/images/books/Developing_with_Ext_GWT_Enterprise_RIA_Development.png diff --git a/src/main/site/images/books/Essential_GWT_Building_for_the_Web_with_Google_Web_Toolkit_2.jpg b/content/src/main/site/images/books/Essential_GWT_Building_for_the_Web_with_Google_Web_Toolkit_2.jpg similarity index 100% rename from src/main/site/images/books/Essential_GWT_Building_for_the_Web_with_Google_Web_Toolkit_2.jpg rename to content/src/main/site/images/books/Essential_GWT_Building_for_the_Web_with_Google_Web_Toolkit_2.jpg diff --git a/src/main/site/images/books/ExtGWT_Rich_Internet_Application_Cookbook.jpg b/content/src/main/site/images/books/ExtGWT_Rich_Internet_Application_Cookbook.jpg similarity index 100% rename from src/main/site/images/books/ExtGWT_Rich_Internet_Application_Cookbook.jpg rename to content/src/main/site/images/books/ExtGWT_Rich_Internet_Application_Cookbook.jpg diff --git a/src/main/site/images/books/Ext_GWT_20_Beginners_Guide.jpg b/content/src/main/site/images/books/Ext_GWT_20_Beginners_Guide.jpg similarity index 100% rename from src/main/site/images/books/Ext_GWT_20_Beginners_Guide.jpg rename to content/src/main/site/images/books/Ext_GWT_20_Beginners_Guide.jpg diff --git a/src/main/site/images/books/GWT_in_Practice.jpg b/content/src/main/site/images/books/GWT_in_Practice.jpg similarity index 100% rename from src/main/site/images/books/GWT_in_Practice.jpg rename to content/src/main/site/images/books/GWT_in_Practice.jpg diff --git a/src/main/site/images/books/Google_App_Engine_Java_and_GWT_Application_Development.jpg b/content/src/main/site/images/books/Google_App_Engine_Java_and_GWT_Application_Development.jpg similarity index 100% rename from src/main/site/images/books/Google_App_Engine_Java_and_GWT_Application_Development.jpg rename to content/src/main/site/images/books/Google_App_Engine_Java_and_GWT_Application_Development.jpg diff --git a/src/main/site/images/books/Google_Web_Toolkit_2_Application_Development_Cookbook.jpg b/content/src/main/site/images/books/Google_Web_Toolkit_2_Application_Development_Cookbook.jpg similarity index 100% rename from src/main/site/images/books/Google_Web_Toolkit_2_Application_Development_Cookbook.jpg rename to content/src/main/site/images/books/Google_Web_Toolkit_2_Application_Development_Cookbook.jpg diff --git a/src/main/site/images/books/Google_Web_Toolkit_Applications.jpeg b/content/src/main/site/images/books/Google_Web_Toolkit_Applications.jpeg similarity index 100% rename from src/main/site/images/books/Google_Web_Toolkit_Applications.jpeg rename to content/src/main/site/images/books/Google_Web_Toolkit_Applications.jpeg diff --git a/src/main/site/images/books/Google_Web_Toolkit_GWT_Java_AJAX_Programming.jpg b/content/src/main/site/images/books/Google_Web_Toolkit_GWT_Java_AJAX_Programming.jpg similarity index 100% rename from src/main/site/images/books/Google_Web_Toolkit_GWT_Java_AJAX_Programming.jpg rename to content/src/main/site/images/books/Google_Web_Toolkit_GWT_Java_AJAX_Programming.jpg diff --git a/src/main/site/images/books/Google_Web_Toolkit_Solutions_Digital_Short_Cut_Cool_Useful_Stuff.jpeg b/content/src/main/site/images/books/Google_Web_Toolkit_Solutions_Digital_Short_Cut_Cool_Useful_Stuff.jpeg similarity index 100% rename from src/main/site/images/books/Google_Web_Toolkit_Solutions_Digital_Short_Cut_Cool_Useful_Stuff.jpeg rename to content/src/main/site/images/books/Google_Web_Toolkit_Solutions_Digital_Short_Cut_Cool_Useful_Stuff.jpeg diff --git a/src/main/site/images/books/Google_Web_Toolkit_Solutions_More_Cool_Useful_Stuff.jpeg b/content/src/main/site/images/books/Google_Web_Toolkit_Solutions_More_Cool_Useful_Stuff.jpeg similarity index 100% rename from src/main/site/images/books/Google_Web_Toolkit_Solutions_More_Cool_Useful_Stuff.jpeg rename to content/src/main/site/images/books/Google_Web_Toolkit_Solutions_More_Cool_Useful_Stuff.jpeg diff --git a/src/main/site/images/books/Google_Web_Toolkit_Taking_the_Pain_Out_of_Ajax.jpg b/content/src/main/site/images/books/Google_Web_Toolkit_Taking_the_Pain_Out_of_Ajax.jpg similarity index 100% rename from src/main/site/images/books/Google_Web_Toolkit_Taking_the_Pain_Out_of_Ajax.jpg rename to content/src/main/site/images/books/Google_Web_Toolkit_Taking_the_Pain_Out_of_Ajax.jpg diff --git a/src/main/site/images/books/Vaadin_7_Cookbook.jpg b/content/src/main/site/images/books/Vaadin_7_Cookbook.jpg similarity index 100% rename from src/main/site/images/books/Vaadin_7_Cookbook.jpg rename to content/src/main/site/images/books/Vaadin_7_Cookbook.jpg diff --git a/src/main/site/images/books/Vaadin_Recipes.jpg b/content/src/main/site/images/books/Vaadin_Recipes.jpg similarity index 100% rename from src/main/site/images/books/Vaadin_Recipes.jpg rename to content/src/main/site/images/books/Vaadin_Recipes.jpg diff --git a/src/main/site/images/books/gwt_in_action.jpg b/content/src/main/site/images/books/gwt_in_action.jpg similarity index 100% rename from src/main/site/images/books/gwt_in_action.jpg rename to content/src/main/site/images/books/gwt_in_action.jpg diff --git a/src/main/site/images/books/gwt_in_action_second_edition.jpg b/content/src/main/site/images/books/gwt_in_action_second_edition.jpg similarity index 100% rename from src/main/site/images/books/gwt_in_action_second_edition.jpg rename to content/src/main/site/images/books/gwt_in_action_second_edition.jpg diff --git a/src/main/site/images/books/learning_vaddin.jpg b/content/src/main/site/images/books/learning_vaddin.jpg similarity index 100% rename from src/main/site/images/books/learning_vaddin.jpg rename to content/src/main/site/images/books/learning_vaddin.jpg diff --git a/src/main/site/images/cloudorado.png b/content/src/main/site/images/cloudorado.png similarity index 100% rename from src/main/site/images/cloudorado.png rename to content/src/main/site/images/cloudorado.png diff --git a/src/main/site/images/community.gif b/content/src/main/site/images/community.gif similarity index 100% rename from src/main/site/images/community.gif rename to content/src/main/site/images/community.gif diff --git a/src/main/site/images/contact-list-view.png b/content/src/main/site/images/contact-list-view.png similarity index 100% rename from src/main/site/images/contact-list-view.png rename to content/src/main/site/images/contact-list-view.png diff --git a/src/main/site/images/contacts-project-hierarchy-testing.png b/content/src/main/site/images/contacts-project-hierarchy-testing.png similarity index 100% rename from src/main/site/images/contacts-project-hierarchy-testing.png rename to content/src/main/site/images/contacts-project-hierarchy-testing.png diff --git a/src/main/site/images/contacts-project-hierarchy.png b/content/src/main/site/images/contacts-project-hierarchy.png similarity index 100% rename from src/main/site/images/contacts-project-hierarchy.png rename to content/src/main/site/images/contacts-project-hierarchy.png diff --git a/src/main/site/images/data_presentation_widgets.png b/content/src/main/site/images/data_presentation_widgets.png similarity index 100% rename from src/main/site/images/data_presentation_widgets.png rename to content/src/main/site/images/data_presentation_widgets.png diff --git a/src/main/site/images/dev_gal_blueprint.jpg b/content/src/main/site/images/dev_gal_blueprint.jpg similarity index 100% rename from src/main/site/images/dev_gal_blueprint.jpg rename to content/src/main/site/images/dev_gal_blueprint.jpg diff --git a/src/main/site/images/dev_gal_gogrid.jpg b/content/src/main/site/images/dev_gal_gogrid.jpg similarity index 100% rename from src/main/site/images/dev_gal_gogrid.jpg rename to content/src/main/site/images/dev_gal_gogrid.jpg diff --git a/src/main/site/images/dev_gal_scenechronize.jpg b/content/src/main/site/images/dev_gal_scenechronize.jpg similarity index 100% rename from src/main/site/images/dev_gal_scenechronize.jpg rename to content/src/main/site/images/dev_gal_scenechronize.jpg diff --git a/src/main/site/images/dev_gal_whirled.jpg b/content/src/main/site/images/dev_gal_whirled.jpg similarity index 100% rename from src/main/site/images/dev_gal_whirled.jpg rename to content/src/main/site/images/dev_gal_whirled.jpg diff --git a/src/main/site/images/docs.gif b/content/src/main/site/images/docs.gif similarity index 100% rename from src/main/site/images/docs.gif rename to content/src/main/site/images/docs.gif diff --git a/src/main/site/images/down.png b/content/src/main/site/images/down.png similarity index 100% rename from src/main/site/images/down.png rename to content/src/main/site/images/down.png diff --git a/src/main/site/images/dynamictable.jpg b/content/src/main/site/images/dynamictable.jpg similarity index 100% rename from src/main/site/images/dynamictable.jpg rename to content/src/main/site/images/dynamictable.jpg diff --git a/src/main/site/images/eclipse/eclipse-install-options.png b/content/src/main/site/images/eclipse/eclipse-install-options.png similarity index 100% rename from src/main/site/images/eclipse/eclipse-install-options.png rename to content/src/main/site/images/eclipse/eclipse-install-options.png diff --git a/src/main/site/images/eclipse/web-app-src.png b/content/src/main/site/images/eclipse/web-app-src.png similarity index 100% rename from src/main/site/images/eclipse/web-app-src.png rename to content/src/main/site/images/eclipse/web-app-src.png diff --git a/src/main/site/images/eclipse/web-app-wizard.png b/content/src/main/site/images/eclipse/web-app-wizard.png similarity index 100% rename from src/main/site/images/eclipse/web-app-wizard.png rename to content/src/main/site/images/eclipse/web-app-wizard.png diff --git a/src/main/site/images/favicon.png b/content/src/main/site/images/favicon.png similarity index 100% rename from src/main/site/images/favicon.png rename to content/src/main/site/images/favicon.png diff --git a/src/main/site/images/flow1-sm.png b/content/src/main/site/images/flow1-sm.png similarity index 100% rename from src/main/site/images/flow1-sm.png rename to content/src/main/site/images/flow1-sm.png diff --git a/src/main/site/images/flow2-sm.png b/content/src/main/site/images/flow2-sm.png similarity index 100% rename from src/main/site/images/flow2-sm.png rename to content/src/main/site/images/flow2-sm.png diff --git a/src/main/site/images/flow3-sm.png b/content/src/main/site/images/flow3-sm.png similarity index 100% rename from src/main/site/images/flow3-sm.png rename to content/src/main/site/images/flow3-sm.png diff --git a/src/main/site/images/flow4-sm.png b/content/src/main/site/images/flow4-sm.png similarity index 100% rename from src/main/site/images/flow4-sm.png rename to content/src/main/site/images/flow4-sm.png diff --git a/src/main/site/images/fragment_merging_after.jpg b/content/src/main/site/images/fragment_merging_after.jpg similarity index 100% rename from src/main/site/images/fragment_merging_after.jpg rename to content/src/main/site/images/fragment_merging_after.jpg diff --git a/src/main/site/images/fragment_merging_before.jpg b/content/src/main/site/images/fragment_merging_before.jpg similarity index 100% rename from src/main/site/images/fragment_merging_before.jpg rename to content/src/main/site/images/fragment_merging_before.jpg diff --git a/src/main/site/images/gaestudio.png b/content/src/main/site/images/gaestudio.png similarity index 100% rename from src/main/site/images/gaestudio.png rename to content/src/main/site/images/gaestudio.png diff --git a/src/main/site/images/gilead_diagram.png b/content/src/main/site/images/gilead_diagram.png similarity index 100% rename from src/main/site/images/gilead_diagram.png rename to content/src/main/site/images/gilead_diagram.png diff --git a/src/main/site/images/gitter-logo-mark-white.png b/content/src/main/site/images/gitter-logo-mark-white.png similarity index 100% rename from src/main/site/images/gitter-logo-mark-white.png rename to content/src/main/site/images/gitter-logo-mark-white.png diff --git a/src/main/site/images/go_grid.jpg b/content/src/main/site/images/go_grid.jpg similarity index 100% rename from src/main/site/images/go_grid.jpg rename to content/src/main/site/images/go_grid.jpg diff --git a/src/main/site/images/gwt-architecture.png b/content/src/main/site/images/gwt-architecture.png similarity index 100% rename from src/main/site/images/gwt-architecture.png rename to content/src/main/site/images/gwt-architecture.png diff --git a/src/main/site/images/gwt-logo.png b/content/src/main/site/images/gwt-logo.png similarity index 100% rename from src/main/site/images/gwt-logo.png rename to content/src/main/site/images/gwt-logo.png diff --git a/src/main/site/images/gwt-sm.png b/content/src/main/site/images/gwt-sm.png similarity index 100% rename from src/main/site/images/gwt-sm.png rename to content/src/main/site/images/gwt-sm.png diff --git a/src/main/site/images/gwtdesigner.png b/content/src/main/site/images/gwtdesigner.png similarity index 100% rename from src/main/site/images/gwtdesigner.png rename to content/src/main/site/images/gwtdesigner.png diff --git a/src/main/site/images/gwtproject.org-2015-banner@2x.png b/content/src/main/site/images/gwtproject.org-2015-banner@2x.png similarity index 100% rename from src/main/site/images/gwtproject.org-2015-banner@2x.png rename to content/src/main/site/images/gwtproject.org-2015-banner@2x.png diff --git a/src/main/site/images/helloworld.jpg b/content/src/main/site/images/helloworld.jpg similarity index 100% rename from src/main/site/images/helloworld.jpg rename to content/src/main/site/images/helloworld.jpg diff --git a/src/main/site/images/hosted_hibernate_error.png b/content/src/main/site/images/hosted_hibernate_error.png similarity index 100% rename from src/main/site/images/hosted_hibernate_error.png rename to content/src/main/site/images/hosted_hibernate_error.png diff --git a/src/main/site/images/import-into-intellij.png b/content/src/main/site/images/import-into-intellij.png similarity index 100% rename from src/main/site/images/import-into-intellij.png rename to content/src/main/site/images/import-into-intellij.png diff --git a/src/main/site/images/intellij-project.png b/content/src/main/site/images/intellij-project.png similarity index 100% rename from src/main/site/images/intellij-project.png rename to content/src/main/site/images/intellij-project.png diff --git a/src/main/site/images/intellij-run-code-server.png b/content/src/main/site/images/intellij-run-code-server.png similarity index 100% rename from src/main/site/images/intellij-run-code-server.png rename to content/src/main/site/images/intellij-run-code-server.png diff --git a/src/main/site/images/intellij-run-server.png b/content/src/main/site/images/intellij-run-server.png similarity index 100% rename from src/main/site/images/intellij-run-server.png rename to content/src/main/site/images/intellij-run-server.png diff --git a/src/main/site/images/jsonrpc.jpg b/content/src/main/site/images/jsonrpc.jpg similarity index 100% rename from src/main/site/images/jsonrpc.jpg rename to content/src/main/site/images/jsonrpc.jpg diff --git a/src/main/site/images/kicthensink.jpg b/content/src/main/site/images/kicthensink.jpg similarity index 100% rename from src/main/site/images/kicthensink.jpg rename to content/src/main/site/images/kicthensink.jpg diff --git a/src/main/site/images/kitchensink.jpg b/content/src/main/site/images/kitchensink.jpg similarity index 100% rename from src/main/site/images/kitchensink.jpg rename to content/src/main/site/images/kitchensink.jpg diff --git a/src/main/site/images/learnmore.gif b/content/src/main/site/images/learnmore.gif similarity index 100% rename from src/main/site/images/learnmore.gif rename to content/src/main/site/images/learnmore.gif diff --git a/src/main/site/images/logo-wire.png b/content/src/main/site/images/logo-wire.png similarity index 100% rename from src/main/site/images/logo-wire.png rename to content/src/main/site/images/logo-wire.png diff --git a/src/main/site/images/lombardi_blueprint.jpg b/content/src/main/site/images/lombardi_blueprint.jpg similarity index 100% rename from src/main/site/images/lombardi_blueprint.jpg rename to content/src/main/site/images/lombardi_blueprint.jpg diff --git a/src/main/site/images/mail.jpg b/content/src/main/site/images/mail.jpg similarity index 100% rename from src/main/site/images/mail.jpg rename to content/src/main/site/images/mail.jpg diff --git a/src/main/site/images/mvp_diagram.png b/content/src/main/site/images/mvp_diagram.png similarity index 100% rename from src/main/site/images/mvp_diagram.png rename to content/src/main/site/images/mvp_diagram.png diff --git a/src/main/site/images/myapplication-browser.png b/content/src/main/site/images/myapplication-browser.png similarity index 100% rename from src/main/site/images/myapplication-browser.png rename to content/src/main/site/images/myapplication-browser.png diff --git a/src/main/site/images/myapplication-devmode.png b/content/src/main/site/images/myapplication-devmode.png similarity index 100% rename from src/main/site/images/myapplication-devmode.png rename to content/src/main/site/images/myapplication-devmode.png diff --git a/src/main/site/images/myapplication-missing-plugin.png b/content/src/main/site/images/myapplication-missing-plugin.png similarity index 100% rename from src/main/site/images/myapplication-missing-plugin.png rename to content/src/main/site/images/myapplication-missing-plugin.png diff --git a/src/main/site/images/mywebapp.png b/content/src/main/site/images/mywebapp.png similarity index 100% rename from src/main/site/images/mywebapp.png rename to content/src/main/site/images/mywebapp.png diff --git a/src/main/site/images/newwindow.gif b/content/src/main/site/images/newwindow.gif similarity index 100% rename from src/main/site/images/newwindow.gif rename to content/src/main/site/images/newwindow.gif diff --git a/src/main/site/images/noscreenshot.jpg b/content/src/main/site/images/noscreenshot.jpg similarity index 100% rename from src/main/site/images/noscreenshot.jpg rename to content/src/main/site/images/noscreenshot.jpg diff --git a/src/main/site/images/ruxit.png b/content/src/main/site/images/ruxit.png similarity index 100% rename from src/main/site/images/ruxit.png rename to content/src/main/site/images/ruxit.png diff --git a/src/main/site/images/scenechronize.jpg b/content/src/main/site/images/scenechronize.jpg similarity index 100% rename from src/main/site/images/scenechronize.jpg rename to content/src/main/site/images/scenechronize.jpg diff --git a/src/main/site/images/sdk-sm.png b/content/src/main/site/images/sdk-sm.png similarity index 100% rename from src/main/site/images/sdk-sm.png rename to content/src/main/site/images/sdk-sm.png diff --git a/src/main/site/images/sdm-debugger-breakpoint.png b/content/src/main/site/images/sdm-debugger-breakpoint.png similarity index 100% rename from src/main/site/images/sdm-debugger-breakpoint.png rename to content/src/main/site/images/sdm-debugger-breakpoint.png diff --git a/src/main/site/images/sdm-debugger.png b/content/src/main/site/images/sdm-debugger.png similarity index 100% rename from src/main/site/images/sdm-debugger.png rename to content/src/main/site/images/sdm-debugger.png diff --git a/src/main/site/images/showcase.jpg b/content/src/main/site/images/showcase.jpg similarity index 100% rename from src/main/site/images/showcase.jpg rename to content/src/main/site/images/showcase.jpg diff --git a/src/main/site/images/speedtracer-large.png b/content/src/main/site/images/speedtracer-large.png similarity index 100% rename from src/main/site/images/speedtracer-large.png rename to content/src/main/site/images/speedtracer-large.png diff --git a/src/main/site/images/spring_logo.png b/content/src/main/site/images/spring_logo.png similarity index 100% rename from src/main/site/images/spring_logo.png rename to content/src/main/site/images/spring_logo.png diff --git a/src/main/site/images/st_server_trace.png b/content/src/main/site/images/st_server_trace.png similarity index 100% rename from src/main/site/images/st_server_trace.png rename to content/src/main/site/images/st_server_trace.png diff --git a/src/main/site/images/sticky.png b/content/src/main/site/images/sticky.png similarity index 100% rename from src/main/site/images/sticky.png rename to content/src/main/site/images/sticky.png diff --git a/src/main/site/images/sts_dashboard.png b/content/src/main/site/images/sts_dashboard.png similarity index 100% rename from src/main/site/images/sts_dashboard.png rename to content/src/main/site/images/sts_dashboard.png diff --git a/src/main/site/images/superdevmode_dialog.png b/content/src/main/site/images/superdevmode_dialog.png similarity index 100% rename from src/main/site/images/superdevmode_dialog.png rename to content/src/main/site/images/superdevmode_dialog.png diff --git a/src/main/site/images/superdevmode_enablesourcemaps.png b/content/src/main/site/images/superdevmode_enablesourcemaps.png similarity index 100% rename from src/main/site/images/superdevmode_enablesourcemaps.png rename to content/src/main/site/images/superdevmode_enablesourcemaps.png diff --git a/src/main/site/images/testing_methodologies_mvc.png b/content/src/main/site/images/testing_methodologies_mvc.png similarity index 100% rename from src/main/site/images/testing_methodologies_mvc.png rename to content/src/main/site/images/testing_methodologies_mvc.png diff --git a/src/main/site/images/testing_methodologies_mvp.png b/content/src/main/site/images/testing_methodologies_mvp.png similarity index 100% rename from src/main/site/images/testing_methodologies_mvp.png rename to content/src/main/site/images/testing_methodologies_mvp.png diff --git a/src/main/site/images/testing_methodologies_object_diagram.png b/content/src/main/site/images/testing_methodologies_object_diagram.png similarity index 100% rename from src/main/site/images/testing_methodologies_object_diagram.png rename to content/src/main/site/images/testing_methodologies_object_diagram.png diff --git a/src/main/site/images/testing_methodologies_screenshot.png b/content/src/main/site/images/testing_methodologies_screenshot.png similarity index 100% rename from src/main/site/images/testing_methodologies_screenshot.png rename to content/src/main/site/images/testing_methodologies_screenshot.png diff --git a/src/main/site/images/war_output_dir.png b/content/src/main/site/images/war_output_dir.png similarity index 100% rename from src/main/site/images/war_output_dir.png rename to content/src/main/site/images/war_output_dir.png diff --git a/src/main/site/images/wave.jpg b/content/src/main/site/images/wave.jpg similarity index 100% rename from src/main/site/images/wave.jpg rename to content/src/main/site/images/wave.jpg diff --git a/src/main/site/images/whirled.jpg b/content/src/main/site/images/whirled.jpg similarity index 100% rename from src/main/site/images/whirled.jpg rename to content/src/main/site/images/whirled.jpg diff --git a/src/main/site/index.html b/content/src/main/site/index.html similarity index 100% rename from src/main/site/index.html rename to content/src/main/site/index.html diff --git a/src/main/site/missing-plugin/download.gif b/content/src/main/site/missing-plugin/download.gif similarity index 100% rename from src/main/site/missing-plugin/download.gif rename to content/src/main/site/missing-plugin/download.gif diff --git a/src/main/site/missing-plugin/index.html b/content/src/main/site/missing-plugin/index.html similarity index 100% rename from src/main/site/missing-plugin/index.html rename to content/src/main/site/missing-plugin/index.html diff --git a/src/main/site/missing-plugin/unsupported.gif b/content/src/main/site/missing-plugin/unsupported.gif similarity index 100% rename from src/main/site/missing-plugin/unsupported.gif rename to content/src/main/site/missing-plugin/unsupported.gif diff --git a/src/test/java/com/google/gwt/site/markdown/MDTranslatorTest.java b/content/src/test/java/com/google/gwt/site/markdown/MDTranslatorTest.java similarity index 100% rename from src/test/java/com/google/gwt/site/markdown/MDTranslatorTest.java rename to content/src/test/java/com/google/gwt/site/markdown/MDTranslatorTest.java From bac5e3d4714acf30d83799d585b5297d3e169ec0 Mon Sep 17 00:00:00 2001 From: Zbynek Konecny Date: Mon, 13 Jul 2026 23:46:26 +0200 Subject: [PATCH 60/61] Move web-app into Maven submodule --- eclipse-launch-profiles/DevAppServer.launch | 14 -------------- eclipse-launch-profiles/UpdateApplication.launch | 14 -------------- pom.xml => web-app/pom.xml | 0 .../site/webapp/client/GWTProjectEntryPoint.java | 0 .../site/webapp/client/highlight/JsHighlight.java | 0 .../webapp/client/highlight/highlight.pack.js | 0 .../gwt/site/webapp/client/highlight/idea.css | 0 {src => web-app/src}/main/module.gwt.xml | 0 {src => web-app/src}/main/webapp/gwt.html | 0 .../src}/main/webapp/images/gwt-logo.png | Bin .../java/com/google/gwt/site/webapp/Test.gwt.xml | 0 .../webapp/client/ProjectEntryPointGwtTest.java | 0 .../site/webapp/client/ProjectEntryPointTest.java | 0 13 files changed, 28 deletions(-) delete mode 100644 eclipse-launch-profiles/DevAppServer.launch delete mode 100644 eclipse-launch-profiles/UpdateApplication.launch rename pom.xml => web-app/pom.xml (100%) rename {src => web-app/src}/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java (100%) rename {src => web-app/src}/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java (100%) rename {src => web-app/src}/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js (100%) rename {src => web-app/src}/main/java/com/google/gwt/site/webapp/client/highlight/idea.css (100%) rename {src => web-app/src}/main/module.gwt.xml (100%) rename {src => web-app/src}/main/webapp/gwt.html (100%) rename {src => web-app/src}/main/webapp/images/gwt-logo.png (100%) rename {src => web-app/src}/test/java/com/google/gwt/site/webapp/Test.gwt.xml (100%) rename {src => web-app/src}/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java (100%) rename {src => web-app/src}/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java (100%) diff --git a/eclipse-launch-profiles/DevAppServer.launch b/eclipse-launch-profiles/DevAppServer.launch deleted file mode 100644 index 2290cd0ce..000000000 --- a/eclipse-launch-profiles/DevAppServer.launch +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/eclipse-launch-profiles/UpdateApplication.launch b/eclipse-launch-profiles/UpdateApplication.launch deleted file mode 100644 index caa7ec79d..000000000 --- a/eclipse-launch-profiles/UpdateApplication.launch +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/pom.xml b/web-app/pom.xml similarity index 100% rename from pom.xml rename to web-app/pom.xml diff --git a/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java b/web-app/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java similarity index 100% rename from src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java rename to web-app/src/main/java/com/google/gwt/site/webapp/client/GWTProjectEntryPoint.java diff --git a/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java b/web-app/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java similarity index 100% rename from src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java rename to web-app/src/main/java/com/google/gwt/site/webapp/client/highlight/JsHighlight.java diff --git a/src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js b/web-app/src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js similarity index 100% rename from src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js rename to web-app/src/main/java/com/google/gwt/site/webapp/client/highlight/highlight.pack.js diff --git a/src/main/java/com/google/gwt/site/webapp/client/highlight/idea.css b/web-app/src/main/java/com/google/gwt/site/webapp/client/highlight/idea.css similarity index 100% rename from src/main/java/com/google/gwt/site/webapp/client/highlight/idea.css rename to web-app/src/main/java/com/google/gwt/site/webapp/client/highlight/idea.css diff --git a/src/main/module.gwt.xml b/web-app/src/main/module.gwt.xml similarity index 100% rename from src/main/module.gwt.xml rename to web-app/src/main/module.gwt.xml diff --git a/src/main/webapp/gwt.html b/web-app/src/main/webapp/gwt.html similarity index 100% rename from src/main/webapp/gwt.html rename to web-app/src/main/webapp/gwt.html diff --git a/src/main/webapp/images/gwt-logo.png b/web-app/src/main/webapp/images/gwt-logo.png similarity index 100% rename from src/main/webapp/images/gwt-logo.png rename to web-app/src/main/webapp/images/gwt-logo.png diff --git a/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml b/web-app/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml similarity index 100% rename from src/test/java/com/google/gwt/site/webapp/Test.gwt.xml rename to web-app/src/test/java/com/google/gwt/site/webapp/Test.gwt.xml diff --git a/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java b/web-app/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java similarity index 100% rename from src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java rename to web-app/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointGwtTest.java diff --git a/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java b/web-app/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java similarity index 100% rename from src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java rename to web-app/src/test/java/com/google/gwt/site/webapp/client/ProjectEntryPointTest.java From 6aa5069b6f8ce32ccd429bcb392d6ae3388e097b Mon Sep 17 00:00:00 2001 From: Zbynek Konecny Date: Tue, 14 Jul 2026 00:26:11 +0200 Subject: [PATCH 61/61] Merge projects --- .github/workflows/build-content.yml | 26 ---------- .github/workflows/build.yml | 20 ++++---- .gitignore | 12 ++++- README.md | 57 ++++++++++------------ content/.gitignore | 11 ----- content/README.md | 33 ------------- content/pom.xml | 47 ++++++++++++------ pom.xml | 13 +++++ web-app/pom.xml | 76 ++++------------------------- 9 files changed, 100 insertions(+), 195 deletions(-) delete mode 100644 .github/workflows/build-content.yml delete mode 100644 content/.gitignore delete mode 100644 content/README.md create mode 100644 pom.xml diff --git a/.github/workflows/build-content.yml b/.github/workflows/build-content.yml deleted file mode 100644 index e0cb80002..000000000 --- a/.github/workflows/build-content.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Build GWT Site - -on: - push: - pull_request: - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up Java 11 - uses: actions/setup-java@v4 - with: - java-version: 11 - distribution: 'temurin' - cache: 'maven' - - name: Build with Maven - run: mvn -e --batch-mode --no-transfer-progress verify -Pgrunt - - - name: Upload artifact for testing/deployment - uses: actions/upload-artifact@v4 - with: - name: gwt-site - path: 'target/generated-site/' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1866ef2ef..da5a24e71 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,5 @@ -name: Build gwt-site-webapp +name: Build GWT Site + on: push: pull_request: @@ -6,23 +7,20 @@ on: jobs: build: runs-on: ubuntu-latest + steps: - uses: actions/checkout@v4 - - name: Set up Java + - name: Set up Java 11 uses: actions/setup-java@v4 with: java-version: '11' distribution: 'temurin' cache: 'maven' + - name: Build with Maven + run: mvn -e --batch-mode --no-transfer-progress verify -Pgrunt - - name: Compile the webapp to JS - run: mvn --batch-mode --no-transfer-progress -e verify - - - name: Rename generated directory - # Fixes issue where artifact zip contains top level directory due to wildcard expansion - run: mv target/gwt-site-webapp-*/ target/gwt-site-webapp - - name: Upload the generated JS + - name: Upload artifact for testing/deployment uses: actions/upload-artifact@v4 with: - name: 'gwt-site-webapp' - path: target/gwt-site-webapp/ + name: gwt-site + path: 'content/target/generated-site/' \ No newline at end of file diff --git a/.gitignore b/.gitignore index 2f7896d1d..b02e57338 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,11 @@ -target/ +*/target/ +.idea/ +*.iml +.DS_Store +npm-debug.log +node/ +node_modules/ +content/src/main/site/assets/build/css/ +content/src/main/site/assets/build/img/ +content/src/main/site/assets/build/js/global.js +content/src/main/site/assets/build/js/global.min.js diff --git a/README.md b/README.md index 71b8c2352..db8cb6eb6 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,39 @@ -# gwt-site-webapp -This project includes the client code of the GWT site. It does not include the -site content which is in the gwt-site project nor the utilities to create and -deploy with samples and plugin releases. +# GWT Documentation -## Requirements -[Apache Maven](http://maven.apache.org) 3.8 or greater, and JDK 11+ in order to run. +* GWT documentation is published under https://www.gwtproject.org/doc/latest/DevGuide.html -To build the project, invoke the following command: +## Reference - $ mvn verify +* Markdown processor: https://github.com/sirthias/pegdown -This only tests and builds the JS to enhance the site content. To build the contents -first, you need to build the gwt-site project. +## Adding content -1. Check out the [gwt-site](https://github.com/gwtproject/gwt-site) project. -2. Build the gwt-site project: +* See: https://www.gwtproject.org/makinggwtbetter.html#webpage - $ cd [...]/gwt-site - $ mvn install +## Requirements +[Apache Maven](http://maven.apache.org) 3.8 or greater, and JDK 11+ in order to run. -3. Build the gwt-site-webapp project, with the -Pfull-site profile: +## Building - $ cd [...]/gwt-site-webapp - $ mvn verify -Pfull-site +If you have Grunt installed : +* build the assets using Grunt: `grunt` +* then run: `mvn clean install` +* after that you will find the generated documentation in `content/target/generated-site/`. -Now you can point your browser to the `target/www` folder, or you can serve -its content with any web-server (i.e [serve](https://www.npmjs.com/package/serve) or -[http.server](https://docs.python.org/3/library/http.server.html)). -Notice that an http server is needed if you want to test site navigation via Ajax. +If you don't have Grunt installer : +* build the assets using Maven and Grunt plugin: `mvn clean install -Pgrunt` +* after that you will find the generated documentation in `content/target/generated-site/`. -Building will run the **tests**, but to explicitly run them you can use the test target +### Running locally +Run the site locally for easy visual testing - $ mvn test +Run without server: +* Change to the `content/target/generated-site` folder. +* Open the `index.html` file in your browser. -# Develop and Deploy +Run with Maven: +* Run: `mvn -pl content jetty:run` +* Open URL `http://localhost:9999` in your browser. -Note that as configured, sourcemaps will not work locally - they must be deployed to gwtproject.org -because the generated JS will attempt to load them from an absolute URL. +# gwt-site-webapp - * The `target/gwt-site-webapp-.war` file (and the `target/gwt-site-webapp-` - directory) contains the generated JavaScript and sourcemaps, and can be deployed along with the - generated site content. - * The `target/www` directory contains the generated JavaScript, sourcemaps (and Java sources), - and the generated HTML from gwt-site itself, and is suitable for deployment directly to a - server. diff --git a/content/.gitignore b/content/.gitignore deleted file mode 100644 index 2f5e47e39..000000000 --- a/content/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -target/ -../.idea/ -*.iml -.DS_Store -npm-debug.log -node/ -node_modules/ -content/src/main/site/assets/build/css/ -content/src/main/site/assets/build/img/ -content/src/main/site/assets/build/js/global.js -content/src/main/site/assets/build/js/global.min.js diff --git a/content/README.md b/content/README.md deleted file mode 100644 index a1ad53f95..000000000 --- a/content/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# GWT Documentation - -* GWT documentation is published under https://www.gwtproject.org/doc/latest/DevGuide.html - -## Reference - -* Markdown processor: https://github.com/sirthias/pegdown - -## Adding content - -* See: https://www.gwtproject.org/makinggwtbetter.html#webpage - -## Building - -If you have Grunt installed : -* build the assets using Grunt: `grunt` -* then run: `mvn clean install` -* after that you will find the generated documentation in `target/generated-site/`. - -If you don't have Grunt installer : -* build the assets using Maven and Grunt plugin: `mvn clean install -Pgrunt` -* after that you will find the generated documentation in `target/generated-site/`. - -### Running locally -Run the site locally for easy visual testing - -Run without server: -* Change to the `target/generated-site` folder. -* Open the `index.html` file in your browser. - -Run with Maven: -* Run: `mvn jetty:run` -* Open URL `http://localhost:9999` in your browser. diff --git a/content/pom.xml b/content/pom.xml index 6084b82a4..cabf81f4a 100644 --- a/content/pom.xml +++ b/content/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 @@ -106,13 +106,26 @@ org.gwtproject gwt-dev - 2.13.1 + 2.12.2 javadoc ${project.build.directory}/generated-site/javadoc/latest + + unpack-dependencies + prepare-package + + unpack-dependencies + + + org.gwtproject.site + gwt-site-webapp + true + ${project.build.directory}/generated-site/ + + @@ -134,17 +147,17 @@ org.eclipse.jetty - jetty-maven-plugin - 9.4.28.v20200408 - - - 9999 - - - jar - - ${project.build.directory}/generated-site - + jetty-maven-plugin + 9.4.28.v20200408 + + + 9999 + + + jar + + ${project.build.directory}/generated-site + @@ -175,8 +188,14 @@ commons-io 2.7 + + org.gwtproject.site + gwt-site-webapp + ${project.version} + war + + - grunt diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..cfe00db21 --- /dev/null +++ b/pom.xml @@ -0,0 +1,13 @@ + + 4.0.0 + + org.gwtproject.site + gwt-site-parent + 2.0-SNAPSHOT + pom + + content + web-app + + \ No newline at end of file diff --git a/web-app/pom.xml b/web-app/pom.xml index 448c23a1f..6ef87e915 100644 --- a/web-app/pom.xml +++ b/web-app/pom.xml @@ -1,18 +1,21 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.google.gwt.site.webapp + + org.gwtproject.site + 2.0-SNAPSHOT + gwt-site-parent + gwt-site-webapp - 2.0-SNAPSHOT gwt-app yyyy-MM-dd UTF-8 - 2.13.1 + 2.12.1 4.13.2 @@ -59,7 +62,7 @@ ${basedir}/src/test/java - + compiled-js org.apache.maven.plugins @@ -130,65 +133,4 @@ - - - - full-site - - - com.google.gwt.site - gwt-site - ${project.version} - zip - generated-site - - - - - - maven-dependency-plugin - - - unpack-dependencies - prepare-package - - unpack-dependencies - - - com.google.gwt.site - gwt-site - true - ${project.build.directory}/www/ - - - - - - maven-resources-plugin - - - - copy-www-resources - prepare-package - - copy-resources - - - ${project.build.directory}/www/ - - - ${project.build.directory}/${project.build.finalName}/ - - - - - - - - - - - + \ No newline at end of file