From 8238f2501cac88aed3d201e1e19906c2dc40f84d Mon Sep 17 00:00:00 2001 From: Alex Panov Date: Thu, 20 Aug 2015 19:13:59 +0200 Subject: [PATCH 1/5] Simplify action validation in FilterScriptManagerServlet --- .../FilterScriptManagerServlet.java | 85 +------------------ .../netflix/zuul/scriptManager/UsageDoc.java | 44 ++++++++++ .../zuul/scriptManager/UsageError.java | 35 ++++++++ .../scriptManager/ValidActionEvaluation.java | 61 +++++++++++++ 4 files changed, 144 insertions(+), 81 deletions(-) create mode 100644 zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageDoc.java create mode 100644 zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java create mode 100644 zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java diff --git a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/FilterScriptManagerServlet.java b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/FilterScriptManagerServlet.java index a894d2867f..5f275ebd3d 100644 --- a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/FilterScriptManagerServlet.java +++ b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/FilterScriptManagerServlet.java @@ -27,16 +27,12 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; -import java.io.Writer; import java.util.ArrayList; -import java.util.Arrays; import java.util.Calendar; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; @@ -83,11 +79,6 @@ public class FilterScriptManagerServlet extends HttpServlet { private static final long serialVersionUID = -1L; private static final Logger logger = LoggerFactory.getLogger(FilterScriptManagerServlet.class); - /* actions that we permit as an immutable Set */ - private static final Set VALID_GET_ACTIONS = Collections.unmodifiableSet(new HashSet(Arrays.asList(new String[]{"LIST", "DOWNLOAD"}))); - private static final Set VALID_PUT_ACTIONS = Collections.unmodifiableSet(new HashSet(Arrays.asList(new String[]{"UPLOAD", "ACTIVATE", "DEACTIVATE", "RUN", "CANARY"}))); - - /* DAO for performing CRUD operations with scripts */ private static ZuulFilterDAO scriptDAO; @@ -458,31 +449,7 @@ private Map createEndpointScriptJSON(FilterInfo script) { private static boolean isValidAction(HttpServletRequest request, HttpServletResponse response) { String action = request.getParameter("action"); if (action != null) { - action = action.trim().toUpperCase(); - /* test for GET actions */ - if (VALID_GET_ACTIONS.contains(action)) { - if (!request.getMethod().equals("GET")) { - // valid action, wrong method - setUsageError(405, "ERROR: Invalid HTTP method for action type.", response); - return false; - } - // valid action and method - return true; - } - - if (VALID_PUT_ACTIONS.contains(action)) { - if (!(request.getMethod().equals("PUT") || request.getMethod().equals("POST"))) { - // valid action, wrong method - setUsageError(405, "ERROR: Invalid HTTP method for action type.", response); - return false; - } - // valid action and method - return true; - } - - // wrong action - setUsageError(400, "ERROR: Unknown action type.", response); - return false; + return new ValidActionEvaluation(request, response).isValid(); } else { setUsageError(400, "ERROR: Invalid arguments.", response); return false; @@ -496,17 +463,7 @@ private static boolean isValidAction(HttpServletRequest request, HttpServletResp * @param response */ private static void setUsageError(int statusCode, String message, HttpServletResponse response) { - response.setStatus(statusCode); - try { - Writer w = response.getWriter(); - if (message != null) { - w.write(message + "\n\n"); - } - w.write(getUsageDoc()); - } catch (Exception e) { - logger.error("Failed to output usage error.", e); - // won't throw exception because this is not critical, logging the error is enough - } + new UsageError(statusCode, message).setOn(response); } /** @@ -525,42 +482,7 @@ private static void setUsageError(int statusCode, HttpServletResponse response) * @return */ private static String getUsageDoc() { - StringBuilder s = new StringBuilder(); - s.append("Usage: /scriptManager?action=&").append("\n"); - s.append(" Actions:").append("\n"); - s.append(" LIST: List all endpoints with scripts or all scripts for a given endpoint.").append("\n"); - s.append(" Arguments:").append("\n"); - s.append(" endpoint: [Optional (Default: All endpoints)] The endpoint of script revisions to list.").append("\n"); - s.append(" Examples:").append("\n"); - s.append(" GET /scriptManager?action=LIST").append("\n"); - s.append(" GET /scriptManager?action=LIST&endpoint=/ps3/home").append("\n"); - s.append("\n"); - - s.append(" DOWNLOAD: Download a given script.").append("\n"); - s.append(" Arguments:").append("\n"); - s.append(" endpoint: [Required] The endpoint of script to download.").append("\n"); - s.append(" revision: [Optional (Default: last revision)] The revision to download.").append("\n"); - s.append(" Examples:").append("\n"); - s.append(" GET /scriptManager?action=DOWNLOAD&endpoint=/ps3/home").append("\n"); - s.append(" GET /scriptManager?action=DOWNLOAD&endpoint=/ps3/home&revision=23").append("\n"); - s.append("\n"); - - s.append(" UPLOAD: Upload a script for a given endpoint.").append("\n"); - s.append(" Arguments:").append("\n"); - s.append(" endpoint: [Required] The endpoint to associated the script with. If it doesn't exist it will be created.").append("\n"); - s.append(" userAuthenticationRequired: [Optional (Default: true)] Whether the script requires an authenticated user to execute.").append("\n"); - s.append(" Example:").append("\n"); - s.append(" POST /scriptManager?action=UPLOAD&endpoint=/ps3/home").append("\n"); - s.append(" POST /scriptManager?action=UPLOAD&endpoint=/ps3/home&userAuthenticationRequired=false").append("\n"); - s.append("\n"); - - s.append(" ACTIVATE: Mark a particular script revision as active for production.").append("\n"); - s.append(" Arguments:").append("\n"); - s.append(" endpoint: [Required] The endpoint for which a script revision should be activated.").append("\n"); - s.append(" revision: [Required] The script revision to activate.").append("\n"); - s.append(" Example:").append("\n"); - s.append(" PUT /scriptManager?action=ACTIVATE&endpoint=/ps3/home&revision=22").append("\n"); - return s.toString(); + return new UsageDoc().get(); } public static class UnitTest { @@ -977,4 +899,5 @@ private FilterInfo mockEndpointScript() { return script; } } + } diff --git a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageDoc.java b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageDoc.java new file mode 100644 index 0000000000..eb6e996d43 --- /dev/null +++ b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageDoc.java @@ -0,0 +1,44 @@ +package com.netflix.zuul.scriptManager; + +final class UsageDoc { + + String get() { + StringBuilder s = new StringBuilder(); + s.append("Usage: /scriptManager?action=&").append("\n"); + s.append(" Actions:").append("\n"); + s.append(" LIST: List all endpoints with scripts or all scripts for a given endpoint.").append("\n"); + s.append(" Arguments:").append("\n"); + s.append(" endpoint: [Optional (Default: All endpoints)] The endpoint of script revisions to list.").append("\n"); + s.append(" Examples:").append("\n"); + s.append(" GET /scriptManager?action=LIST").append("\n"); + s.append(" GET /scriptManager?action=LIST&endpoint=/ps3/home").append("\n"); + s.append("\n"); + + s.append(" DOWNLOAD: Download a given script.").append("\n"); + s.append(" Arguments:").append("\n"); + s.append(" endpoint: [Required] The endpoint of script to download.").append("\n"); + s.append(" revision: [Optional (Default: last revision)] The revision to download.") + .append("\n"); + s.append(" Examples:").append("\n"); + s.append(" GET /scriptManager?action=DOWNLOAD&endpoint=/ps3/home").append("\n"); + s.append(" GET /scriptManager?action=DOWNLOAD&endpoint=/ps3/home&revision=23").append("\n"); + s.append("\n"); + + s.append(" UPLOAD: Upload a script for a given endpoint.").append("\n"); + s.append(" Arguments:").append("\n"); + s.append(" endpoint: [Required] The endpoint to associated the script with. If it doesn't exist it will be created.").append("\n"); + s.append(" userAuthenticationRequired: [Optional (Default: true)] Whether the script requires an authenticated user to execute.").append("\n"); + s.append(" Example:").append("\n"); + s.append(" POST /scriptManager?action=UPLOAD&endpoint=/ps3/home").append("\n"); + s.append(" POST /scriptManager?action=UPLOAD&endpoint=/ps3/home&userAuthenticationRequired=false").append("\n"); + s.append("\n"); + + s.append(" ACTIVATE: Mark a particular script revision as active for production.").append("\n"); + s.append(" Arguments:").append("\n"); + s.append(" endpoint: [Required] The endpoint for which a script revision should be activated.").append("\n"); + s.append(" revision: [Required] The script revision to activate.").append("\n"); + s.append(" Example:").append("\n"); + s.append(" PUT /scriptManager?action=ACTIVATE&endpoint=/ps3/home&revision=22").append("\n"); + return s.toString(); + } +} diff --git a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java new file mode 100644 index 0000000000..89415b40c1 --- /dev/null +++ b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java @@ -0,0 +1,35 @@ +package com.netflix.zuul.scriptManager; + +import java.io.Writer; + +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +final class UsageError { + + private static final Logger LOGGER = LoggerFactory.getLogger(UsageError.class); + + private final int statusCode; + private final String message; + + UsageError(int statusCode, String message) { + this.statusCode = statusCode; + this.message = message; + } + + void setOn(HttpServletResponse response) { + response.setStatus(statusCode); + try { + Writer w = response.getWriter(); + if (message != null) { + w.write(message + "\n\n"); + } + w.write(new UsageDoc().get()); + } catch (Exception e) { + LOGGER.error("Failed to output usage error.", e); + // won't throw exception because this is not critical, logging the error is enough + } + } +} diff --git a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java new file mode 100644 index 0000000000..fd5e39ea22 --- /dev/null +++ b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java @@ -0,0 +1,61 @@ +package com.netflix.zuul.scriptManager; + +import java.util.Set; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import static com.google.common.collect.Sets.newHashSet; +import static java.util.Collections.unmodifiableSet; + +final class ValidActionEvaluation { + + private static final Set VALID_GET_ACTIONS = unmodifiableSet(newHashSet("LIST", "DOWNLOAD")); + private static final Set VALID_PUT_ACTIONS = + unmodifiableSet(newHashSet("UPLOAD", "ACTIVATE", "DEACTIVATE", "RUN", "CANARY")); + + private final boolean result; + + ValidActionEvaluation(HttpServletRequest request, HttpServletResponse response) { + this.result = resultOfEvaluation(request, response); + } + + private boolean resultOfEvaluation(HttpServletRequest request, HttpServletResponse response) { + String action = request.getParameter("action").trim().toUpperCase(); + if (VALID_GET_ACTIONS.contains(action)) { + return validateGetAction(request, response); + } + + if (VALID_PUT_ACTIONS.contains(action)) { + return validatePutAction(request, response); + } + + // wrong action + new UsageError(400, "ERROR: Unknown action type.").setOn(response); + return false; + } + + private boolean validatePutAction(HttpServletRequest request, HttpServletResponse response) { + if ((request.getMethod().equals("PUT") || request.getMethod().equals("POST"))) { + return true; + } + addValidActionWrongMethodError(response); + return false; + } + + private void addValidActionWrongMethodError(HttpServletResponse response) { + new UsageError(405, "ERROR: Invalid HTTP method for action type.").setOn(response); + } + + private boolean validateGetAction(HttpServletRequest request, HttpServletResponse response) { + if (request.getMethod().equals("GET")) { + return true; + } + addValidActionWrongMethodError(response); + return false; + } + + public boolean isValid() { + return result; + } +} From db6dda581c81cb77ce2ce7ef2a00159657b5cc57 Mon Sep 17 00:00:00 2001 From: Alex Panov Date: Thu, 27 Aug 2015 14:13:17 +0200 Subject: [PATCH 2/5] Make FilterFileManager related classes non final --- .../main/java/com/netflix/zuul/scriptManager/UsageError.java | 2 +- .../com/netflix/zuul/scriptManager/ValidActionEvaluation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java index 89415b40c1..5cd5c05c6d 100644 --- a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java +++ b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/UsageError.java @@ -7,7 +7,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -final class UsageError { +class UsageError { private static final Logger LOGGER = LoggerFactory.getLogger(UsageError.class); diff --git a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java index fd5e39ea22..5bee8c1dbc 100644 --- a/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java +++ b/zuul-netflix/src/main/java/com/netflix/zuul/scriptManager/ValidActionEvaluation.java @@ -8,7 +8,7 @@ import static com.google.common.collect.Sets.newHashSet; import static java.util.Collections.unmodifiableSet; -final class ValidActionEvaluation { +class ValidActionEvaluation { private static final Set VALID_GET_ACTIONS = unmodifiableSet(newHashSet("LIST", "DOWNLOAD")); private static final Set VALID_PUT_ACTIONS = From 15169e4dffefaa79ca34bc04d7b1888358c6d3ae Mon Sep 17 00:00:00 2001 From: Nitesh Kant Date: Fri, 4 Sep 2015 16:43:41 -0700 Subject: [PATCH 3/5] [1.x] Setting up travis. --- .travis.yml | 16 +++++++++++++--- gradle/buildViaTravis.sh | 16 ++++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- installViaTravis.sh | 16 ++++++++++++++++ 4 files changed, 46 insertions(+), 4 deletions(-) create mode 100755 gradle/buildViaTravis.sh create mode 100644 installViaTravis.sh diff --git a/.travis.yml b/.travis.yml index 03f48b5ce9..7872f7d7b1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,15 @@ language: java jdk: - - oraclejdk7 - - openjdk6 - - openjdk7 \ No newline at end of file +- oraclejdk8 +sudo: false +install: "./installViaTravis.sh" +script: "./buildViaTravis.sh" +env: + global: + - secure: JReOX/9ZzNHP0CWrw2KEQ699fcWH+59kR7WjJTPglYMhIDsrcQlSV+AKPfXVuEh71HanWDaEjVtw1i0nMiZGd8k8jgU5iMbOaO1PmpjTxEHB97vnh9xexYaPsL1wzKlj51fEfwLX26SS3z7kRrvT4tQp/2A11aLqNVLJENEJUrE= + - secure: BSCZkXsCLzPQmFrojsE9m5zdB7LUnUSVjtgDvvZjqjOac6HaKEr0uBxCIpizR/GPGZA4sNypuSD6jtsaHTU3TGKfNCTzz2QwIwvpVrmGNqXR3Tv/p+grNMEVCVA6P3jpMWY1P0zg7m+OTiyF6roAZXc6LftOzygox2lDPK85D3M= + - secure: UYgocA/3TXjgIaoZRmSCzA0Ed3xImJxuQUw6GV/HUeHWoQyCD5myBpQcdIkAaQsJnNWY6h587oL3yDvIVjycVb2/9uhUAQ5NHjz5oT4D4aNECpQvdcHivAtGPfH5jZV6Cj57Q5hLeedCG0oeWamiZcR6AlSkT/FMlP0lhAPJFNM= + - secure: GtgBxV/2hQ9kPXpTAY9Iq7gi8+DaGGgu7KuEtAUw0nLenl2CIY3GLU3cP0oAbvtKDcKlbmYhfTLgj7pDoDy4ZrfmCTBnKNoDqOAZjNfRLnrlEi3x2KL7VMgnWPqyemOHoAnGq3URXEr363GKNhBtrynehiXJNtVTxmOD0JS/Smg= +cache: + directories: + - $HOME/.gradle diff --git a/gradle/buildViaTravis.sh b/gradle/buildViaTravis.sh new file mode 100755 index 0000000000..d98e5eb603 --- /dev/null +++ b/gradle/buildViaTravis.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# This script will build the project. + +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + echo -e "Build Pull Request #$TRAVIS_PULL_REQUEST => Branch [$TRAVIS_BRANCH]" + ./gradlew -Prelease.useLastTag=true build +elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then + echo -e 'Build Branch with Snapshot => Branch ['$TRAVIS_BRANCH']' + ./gradlew -Prelease.travisci=true -PbintrayUser="${bintrayUser}" -PbintrayKey="${bintrayKey}" -PsonatypeUsername="${sonatypeUsername}" -PsonatypePassword="${sonatypePassword}" build snapshot --stacktrace +elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then + echo -e 'Build Branch for Release => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG']' + ./gradlew -Prelease.travisci=true -Prelease.useLastTag=true -PbintrayUser="${bintrayUser}" -PbintrayKey="${bintrayKey}" -PsonatypeUsername="${sonatypeUsername}" -PsonatypePassword="${sonatypePassword}" final --stacktrace +else + echo -e 'WARN: Should not be here => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG'] Pull Request ['$TRAVIS_PULL_REQUEST']' + ./gradlew -Prelease.useLastTag=true build +fi diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f252aeeae4..583dd068cf 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Thu Apr 02 16:32:40 PDT 2015 +#Wed Aug 19 00:23:55 PDT 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/installViaTravis.sh b/installViaTravis.sh new file mode 100644 index 0000000000..b51fe10e94 --- /dev/null +++ b/installViaTravis.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# This script will build the project. + +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + echo -e "Assemble Pull Request #$TRAVIS_PULL_REQUEST => Branch [$TRAVIS_BRANCH]" + ./gradlew assemble +elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then + echo -e 'Assemble Branch with Snapshot => Branch ['$TRAVIS_BRANCH']' + ./gradlew -Prelease.travisci=true assemble +elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then + echo -e 'Assemble Branch for Release => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG']' + ./gradlew -Prelease.travisci=true -Prelease.useLastTag=true assemble +else + echo -e 'WARN: Should not be here => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG'] Pull Request ['$TRAVIS_PULL_REQUEST']' + ./gradlew assemble +fi \ No newline at end of file From 9ae803c28372438e4724dd68e5607a15ab60ad02 Mon Sep 17 00:00:00 2001 From: Rob Spieldenner Date: Thu, 10 Sep 2015 13:03:01 -0700 Subject: [PATCH 4/5] Setup keys for travis builds --- .travis.yml | 14 +++++++------- buildViaTravis.sh | 23 +++++++++++++++++++++++ installViaTravis.sh | 0 3 files changed, 30 insertions(+), 7 deletions(-) create mode 100755 buildViaTravis.sh mode change 100644 => 100755 installViaTravis.sh diff --git a/.travis.yml b/.travis.yml index 7872f7d7b1..ee282a1ffb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,12 @@ jdk: sudo: false install: "./installViaTravis.sh" script: "./buildViaTravis.sh" -env: - global: - - secure: JReOX/9ZzNHP0CWrw2KEQ699fcWH+59kR7WjJTPglYMhIDsrcQlSV+AKPfXVuEh71HanWDaEjVtw1i0nMiZGd8k8jgU5iMbOaO1PmpjTxEHB97vnh9xexYaPsL1wzKlj51fEfwLX26SS3z7kRrvT4tQp/2A11aLqNVLJENEJUrE= - - secure: BSCZkXsCLzPQmFrojsE9m5zdB7LUnUSVjtgDvvZjqjOac6HaKEr0uBxCIpizR/GPGZA4sNypuSD6jtsaHTU3TGKfNCTzz2QwIwvpVrmGNqXR3Tv/p+grNMEVCVA6P3jpMWY1P0zg7m+OTiyF6roAZXc6LftOzygox2lDPK85D3M= - - secure: UYgocA/3TXjgIaoZRmSCzA0Ed3xImJxuQUw6GV/HUeHWoQyCD5myBpQcdIkAaQsJnNWY6h587oL3yDvIVjycVb2/9uhUAQ5NHjz5oT4D4aNECpQvdcHivAtGPfH5jZV6Cj57Q5hLeedCG0oeWamiZcR6AlSkT/FMlP0lhAPJFNM= - - secure: GtgBxV/2hQ9kPXpTAY9Iq7gi8+DaGGgu7KuEtAUw0nLenl2CIY3GLU3cP0oAbvtKDcKlbmYhfTLgj7pDoDy4ZrfmCTBnKNoDqOAZjNfRLnrlEi3x2KL7VMgnWPqyemOHoAnGq3URXEr363GKNhBtrynehiXJNtVTxmOD0JS/Smg= cache: directories: - - $HOME/.gradle + - "$HOME/.gradle" +env: + global: + - secure: eCJZsdb6dhCyD9qnxzabonrqSn02l+vtoYX/v3DED7AZi5SnbC7iloy7borBm3yz9xcd5ajxuke+Y9eLzLx79DfE9B8Z2/xL1Yx2xSIgFBD8FgFAq62Okdi71SYwP11yGIqLNf0FWmT5UCWZ94nN0QzX7pfagWc2LQ/r+EI+XVs= + - secure: WVfJ5Cix+pIY5BKek9YeaSRKRnUFZZ7WUTDcfQ+64N+BoU0QUMoFt+VDaeigXKauDybUQ47SkVV7HdnBIwIO6wM1dVbw8UHWIa/Y346pxnCOqNsyk2eE6pqgIa2RoQgq2Jx34WBYJVtQ8eMvRF0H33jGUZefov64B5ocZVtf/yY= + - secure: Kj/AIbAO0Iao1umA0hct3aoJR5244m8R9/c9mmVPrtO/gwWin2r82kjdwT62RbQHZqGTTXfBNLUFe//QwQgkUhyJUIvLkmA6tjcJnmpWJUhpZoJMgzTxMueTebDCtsri8haFf5AUD5eAge6EIYcB0hQc4g2QTH9Thqiqa17m77U= + - secure: eKgq3A10rhjFS0oP4KtOvtc9ZcyDkAA/0NABsaMpnHW8phO+/nax3wUgMVzWyz4vzaItB56NmyenpE+3NP5PIoLBmxsOq8Cbt8mZAieWWg6oJdW5w/AMaVbvEnAoewNhxj0CCiSloBDSS+J6y79EdT5uh1vjMHkAQARJO6tVdt0= diff --git a/buildViaTravis.sh b/buildViaTravis.sh new file mode 100755 index 0000000000..17a33a5fb9 --- /dev/null +++ b/buildViaTravis.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# This script will build the project. + +if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + echo -e "Build Pull Request #$TRAVIS_PULL_REQUEST => Branch [$TRAVIS_BRANCH]" + ./gradlew build +elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" == "" ]; then + echo -e 'Build Branch with Snapshot => Branch ['$TRAVIS_BRANCH']' + ./gradlew -Prelease.travisci=true -PbintrayUser="${bintrayUser}" -PbintrayKey="${bintrayKey}" -PsonatypeUsername="${sonatypeUsername}" -PsonatypePassword="${sonatypePassword}" build snapshot +elif [ "$TRAVIS_PULL_REQUEST" == "false" ] && [ "$TRAVIS_TAG" != "" ]; then + echo -e 'Build Branch for Release => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG']' + case "$TRAVIS_TAG" in + *-rc\.*) + ./gradlew -Prelease.travisci=true -Prelease.useLastTag=true -PbintrayUser="${bintrayUser}" -PbintrayKey="${bintrayKey}" -PsonatypeUsername="${sonatypeUsername}" -PsonatypePassword="${sonatypePassword}" candidate + ;; + *) + ./gradlew -Prelease.travisci=true -Prelease.useLastTag=true -PbintrayUser="${bintrayUser}" -PbintrayKey="${bintrayKey}" -PsonatypeUsername="${sonatypeUsername}" -PsonatypePassword="${sonatypePassword}" final + ;; + esac +else + echo -e 'WARN: Should not be here => Branch ['$TRAVIS_BRANCH'] Tag ['$TRAVIS_TAG'] Pull Request ['$TRAVIS_PULL_REQUEST']' + ./gradlew build +fi diff --git a/installViaTravis.sh b/installViaTravis.sh old mode 100644 new mode 100755 From 5449df3623ad7d119e84e17f069d874f4882a098 Mon Sep 17 00:00:00 2001 From: Rob Spieldenner Date: Thu, 10 Sep 2015 13:24:04 -0700 Subject: [PATCH 5/5] Move to gradle 2.6 and nebula.netflixoss 3.0.0 --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 51018 -> 53645 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 6 +----- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index 17578ba2e2..27c59c1942 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } plugins { - id 'nebula.netflixoss' version '2.2.9' + id 'nebula.netflixoss' version '3.0.0' } ext.githubProjectName = rootProject.name diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c97a8bdb9088d370da7e88784a7a093b971aa23a..d43a4e55afaa56025b4e138dc0b72222835573fe 100644 GIT binary patch delta 25680 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

R7L{!hjmQFd_Ryn8ezPpw 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 z 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

    IT9uRNk48+|6_+3;~EH{C4OyOj!7V@S{42 za*60a4&~?p!k^aP2}_mXL414uI64Z}uhMkiACCk{t|0o4Z~nfK!4yzGP_ohrL9d}D Xeg;Bn1Vk(;ffX}}aF9940*nAS zIvku%`HM0X*&H5^%cY0RCn_0OVrW|wA=po3mJL}6A>`I=x=$TYc)FJo?3|lrd|F+0`~nL&yf@z9WJyUi(nI?=fWVx>-2y2zaO%gDq@m zNhenLN>7m}$ojE88J1#jav5rdsAsMHZQ%|IqRW`C*Fo(>GhdSJu3py5pasi(@?FDV-XCUFPJ z=tPDfU{;LcYa>JvlysKV3fylQ!KIv4`nD5NGL4EYNi|M6Gc!oC;ud4=OrLRrLA^r zua=pR78|7Duts>pVZdeg+oC%G;-lL59g zep~Gq*Qrqkv(+QX5<+@o?vPQAIqD<%oK?s+8BkasrBN|-+=DnSt8l)dnmm#`f|=f3 zZ{JjHY-qsb(3Q1M{_bKbdaLC(}SMyZIys=nex_h z)~(;mryTQsth)?RJMs>VKka#5%iwgsC+vV^#6&vbK5TkmFF zUOU?~TxEnl_mNB>WA^pjH=Z^v!-RC|2vEl_-}t*%GHWgRaQrV<2Y9O%Em%Kle+f2% zrR64lr{r-H1#2lK;wnYg>gl!fN2(s^N18rZy?NV)UcrIF91)_QX(;+r!AXD4{z(9A ziD#lcTVzje8ElC(v@_nc_a;bDQtK}N(xtN|xQV<$wE$H62^v(RDG=^w71L+)HUBZ5 zZ^`R&jiM`5w^LyROezf^_E=tBbK+5jT}fOV9t~WC!aXPve-qqh|Fcv8hl`;`t)f~; ziA)>N^7X;Sb!37Lox|FNCk*(Kh5P~1;wAmHFn40zeZrB5|w*= zRAA{9y}s~jqL($uL6JS#r%R6;;nm71{5ARxz!S(S*yHrWKMg-ED{ z7h2#OuS7Y7ibeTR?1e(W-hxB?7&JeiP7*#GWD6r~A0bRm_#K}835Qq*%vl#E@kp2u zPFQ1vSex(=)tYb)gocvXBbb;4xsd^)gAOXeE559JEeBLZMrb)*;tT$Nji0g~fz{Dp zyN2`Ec76kC!bK&4{MY8qI$uNrpg}rTb-2aFg~^a9)u1 zQ4#drBIJ`oD(10HSV#Vg^5Kgx|117e5b$0{TvNswq$dBxF!Lq#0IvPpFk$}->`^qM zqw*WgG$|_;sIP~$iz46|!$t?_rIF(A*4T3sK0jyyH6YqW1Vw@#xHwkX z9&Zz(t3`GUddv#mFt@@5*uyPQbILBNjMi*Y%69<=350RWi1POo*4oAQYTz8;7nIlV z_O6_bpdXKOgtte!j$AzA9gY~^Hpz;%;BL&|o}O-Q2#NSy8y$=;=LZ6E??l1LhNvXF zkO_<`@%d_Ue)5>;m~@&>w?+>?5|#pb%t@_mV1L(R%ASGt#?YX!&rzC`Vw&j)TIwtk zET#f6W6lUH80^d?+IXPe7cQKAC7Kl7sFJ*WNlSI*@S+H?XLf=_Z64Pqv}moef4<-` z_xL!gC{l(s2XioB@I)$~_8o)9KisgRh4#c%wB22e^z_=whh=p4n5$Xna9ff;?y32T zv>{n(Vf@ZW(z&cR$GOkReOxb#CSP1H%pL(YHeib(DCl&WU-(HZn0L06r%P@UUZ=B^ zs-~LbnVTpkU9b#YqKu4eC%s+B$={@7utf&;n8_6%`fNrrr*s{ncWyEJJA&xaniQHC zZVQAMuSO1(EXth=k%AI3BaQ}vwi>RqKTU=IC?I8d!qL!3&91B@n^HEF=rtBG63PQ6 zm`aB@SX5>%U-_Cq%cHkm+0v6Y;oncm>0~*i3h;AV;jq?5ZkHPix2RvkR*&&OHDFn2 zV2K#pQ-X)xCieKicU%pv2~DfxBoE0J+v&_s@E%#-{GzWSWaMjA^LCI^Gzx%Dmq9>~ z8H+v(HZP<1>tIezWFpnmS84lg@iYNUW_XW2*VvSz961IVP_YgRp};(EeBiIBpxIg| zf_7s#4>ezi&7^rPp^SU-UyQW*d%@dL6tjF*)_~^tlWOIuWa1lX9Og8%x&EUm&hf}x z3S?9$iAJuqB)2dZ6JpR*4eQb6qBq?@MswtJr+Mu?|HsU`_Ee!yRj0w`(0(9H2h=Eg zqGUA00$KAj8wWv1pt-YFQc{UBf2nM+t~h;2j10?BF~fKi6UUFB300-p1<>Y7(-D;> zD%xS+ieYZ>NeAl4OJ9rE$6&h|vp;*QxRSgmB7Yi5nISEvi*4)YTiW}%M8A_e7-;d* z_bBV%r;xfL!rrg*P5y~c)0+bxV;<>ID%hmCD2lor6?3z4#*ZKD?%tP5uX2SG`m2`>ipwh4Y>+aB;9~?;dN?{7uculCo7!^MAB>) zIWxV`Y%=}vPq{e+r@d#i*RZLp5$FFQEOO3I+m{AS;@+zPhg`uYH%I(-6z~2mr9P%T zS6)T#W&3O%=|r>g_Ba%HcIyR;o_8r;Pf+n1Xzdy?AE>mvEc|0ndsL^gt{3 z4IfK@b?LuqrMFX> zJUyZ6gzmN7WHW}8688XG;H+}wqpj*GawJWt%2m0LRy@AM$e&k&Pq=7jnL?Abm!Y?X zpqQbdsdYq?tMP_`P5hLn^x8c6a;HDuKO#%TcrWgp-Bs!weL!jjN~JKYwSHbzk*m7YWkiY-`fd42kq1-^HE~lkh)8Hz(#}TNyr!T6dvDjL#y65)K zn?$}1qU|$OQc`W+@8?NG!+awN5zN1bhU7+m2xH+e)F1?^3ou=KiBZ?;pQk1Sc50^) z4ZX?kCm=@!#XB1mtpNPhj^b_!-~>zW4?cn?iH_n(mg{mD9U&*CrLqf-?R)Ng+(uVo zMIXAu>7w+|aiO7#cRr8|k*GIiYu8~)MoUW+!)~7rzw>yJA?JBKWtZ!bR=5yM!DZ2{ z3tvw4(nA5a-Gu3y1F(P9l{k29iPza6oyId#sbVtvyGt^0NnxAOx*L3kBp-#S*v*_c$(~R0mw(lQk@>F$gpmV(Iy4p?9r4 zy>p+t2qqS4;6Yv6XPHFEch!`r7&&OKu{luqJ&XP5vmC zAI*CUU79tu(M@yghn;z)raG!QilaoYN%(>@K4ZJX%CWe}-d0ELtGr&cT8ger-^F*1 zA5W*i{0GksA5j#&XNY92>E8OuTToRp5Xhsf?Sz)+?|OR@k;RZ+DzR~9!23yE6zcWk zd@oEKXmQ#xGN7U|AzWpg056MMOgoMvVUskLy!eib|4T&p`gXcQ)L@vJ{7*=bz2sDU z7KR?d(y;_?km1H)0h=S61MBkI3I%pvLDOl-lLfVq|Ko=4vDJvu z!$Yx&lE5a1B3)OvrKa24H*L&&1{LvQ?n8JlU958F+)9J8^Esvj3-omf+A_-VB{`e& zUkMg@vVwGT?wKXrhwD= zy&{%Vlyu1Aihklso})GwIWFs~DVi=Rgq5cu@#?U5Z8qs3@;W!MdSjqa4@`gqA5py# z9to+uRGhqzVW*SFeVDESb|mZaZw!i`5+K*VK|lvH{p4`vL~iTpT)bF2tGfH;nOEqj z8{=S;CU}@v7Lz7rhxle#s4H_i?nPwS`+l{YeS1L=D7m+8itBWAEg1XddDMw?;1DQFbG!pKdclam4^(YSZ}3aRaZJJMQJPq`N`Gi|U&V?JbfKBzb!IG|@y|C=QJgBkme1xl6TVo*MZij zt@OhieKCg7wY5`V0m0U7yv0uEvSwakRu+M6OYH`nBSXAJS=;Du@;AP@+!v{QqYEj8 z@R)BfB=`V`;z-MKpaeb}FCI%O4VK(UE&(*gFd?REya3Fpo)8dJp(DO!+5bBNSajfz8QOkwi1DQ%oEnf3 zyB|XYj=!9^&e*EI4~k&ELmTCV8O1%+k3c@={SartDbKww#j+%9<&V8@7GmPDdNEm! z#X2i-)#-t$2f|-!6zGe+zX*j&o&oxIvKUbLwZ>REa@G{eBpu3H!2W>TXT<{dhK`?vk<@AVp|=BF+W{3pW?H%{MGDbP==7 zXA%aT_`o||IpZWY;okp)NR?qOt_R59DP}5D-i+f{0oJ4(VFy7cJ%i z#%?0Pc??Av=tQWP_IGe{1oP|4^tCMW66wTYdwTpJSl>p!p#B&$lXP%h*}z1s2|7Q2 zF~>7R;8jCNzxhawUJgTl{t^7&Si32h75+cb^?*3>r0Cy>y9E;jg!OKU!n}Xk&KbX51|h$QgV$N^L(zpuDsEqd%RIoox3p#*W0`o_=F%^CPI@!^jnfHDAW_8E^5 zHq=fPh#WN=2XoV-?7APW#m->Jdhcck@e(zH9L!9|hCDuzbN}@78)5W5&=)^?mn4HI zcGncumoHF~^i>QZFM3zC(T^=!vS^k1dtT}rD+|87^Ij-jXbqRLj*y?>J>6xL7Rlam*3TTxpE79&`T`ND z2-LxM45K>>Ezx8PnwODcjtQ(!fqRZ7sj$ zC6=LHF*|M=HpsT{1k;kUbv0>puXpEZWe*=e>>cwZD%XuTAoRelf;c9vrHvmC4c;=r zc*K@^jV6Kai*Vw5G4l7O01N$6t3?3@!TboxObY6VAd;C(Vp2p<9?RgpNVR!i(hxY@ zG4Mm8G6`^bV~O_fX<4d|UZ8sqqywILTi(@9Hi4JwJpxS*O6W8;;I9fADiS*tfF>9D z7WXz@PUaVR;1uCEILL(*hUn64F^{O$hDu8wvED%SufFc`mAo`KovPCQp^^3s@@g2fMy?#k*UE0UMsooqiPXZK2zrm)~oj3 zw72a6F{UY8+_Y58QDn6b6hX8QLGy~7?~_%lu~ll(K$ED*n$^<%HEdPmqVmChMu6ae zVg>yHT_a;ne$^`uq2`_QX8Ha}VQrv^Ruh%_hX}PlP1t#hgn)RuTiTPR^X)|>c-jG{ z^Q|toCCq7haQOzkIV%#vg7&@-7)sML4Riz2z@7)KoYVdb=_~SUQKaC+N?t=$51Hyu zsiyrIU_gi1EpBOKcRXW_!cuKv!i-cwNR)*bV zME!tai_3PPu#(UH{Qbk)FR!XKer3_bJ`@VVd=}rGzE<^*bo{y`^~?K0eSs?x;+y*% zkngj~ymqhQYR)FbsaJIb(xRiMFjZegrCqZoFbdqe;%nA1O0YeH1M!0>C$FID#qjr}WgO zs(0isWjR{@3R!W+WS`i$itMZB-wSw^zz-IC+Jv&rY3ZZ@(25p$(qR~@Sy@Hl`(k_P zIx{85VUCl+?ma8Wm-IFb)A=UV0dD__t)$G9g*uw^j%EX6jgbp~C-r+CCXBNNUy3%U z-o9)EST16rvuYY+U8j#U_@Q*lhATev9DKnw=yhgexXzP61D@t8BVJHFg4fzApfi!h zZP@|XXMgRGGlEfk6-lji{Gs=1o5AQ)O7GK|Ufk>Qj9!`Vg?jje+0;$?X4~vE-AaZR zx{HBS&fI{@#2sHP6myHCS}ocRUzgwTWRiAgPDZ8vXgG$W05y~L(q^rQ1hr;+tNL|%sIZ!xxOCB0rs$N_NZTP zXUuM&i&`3BIr9l_Jax8N$4E=oSfG-;d>Z1%=(+_%C4! zdihqvQ^%tYRpA_-!L?tmrjME{(^u##{S$rKYL74facwlv1OZhY3VLq#3+dY_j*fl9WMuK`%)1Y&s^N$Hd>^Q@ z!O$XZZg9>n{3SFW0?^u#A5Ni;x(GF;tvzhi--KjOmpf{k8LZnYKjztBv~LQTgooNC zky}@^==`VHAmwOF1x7Fc0$ojgjK0#s*EHG@{lvTy9sB@kiB7hqYhgmr3MYom1G!{6 zqa_XK>+5BA$Ty2N8Lq48_Y1LN7v5voMSY;fGhl4z>}~}P2xNa~5jb8)dw`FqjFL{3 zkY$Z%=~}PT!jfrauvizo$gRBeVQ$!r8}XE`04c#go@5+-_!FCoO=ECAOc9#4$8#@X z_51`up#~*r* z-BVj9g>7)R0*Ms9LHkS&ZaHrE-)@fc9#FOx>CXSq{8rqSdLL6L1E=_eF}WiDk;oR& z0E@`8yrXh&zS;%I%qd+pykH+`h*xFUu2DMLw-dn1lEuy9kAbT}d)E|z{9h0nJD7Y+ z`WJeJ{Dq#he=Fk-&K67-&c@$u&609iVgHsZp^|=&paOHWU_H^t0H4rP23|c-WO%m1 z^?+}?;Pg@=Xtp9Iw$Qf0cDD5w@u{^XBO39|vCaEZNu`?JWgd&imYEz@i(TY)W}NmS zbH(yEzk6>UdvBV*E@c|&8OBzS(|=8OzwP|lMu-!9nAy#^=_y-b;m5YyrvHxK#ymS zSeHJMhg#yU0>EPr5$;;!R)Xm|;le?s0oOspu`ZHwv&;mrUAS9AyDXF3<=7Y4=5^-| zxVS?C+zfXe)_F|r@jH9gVU=}z3WZ=HPjUxr1IzaRy#9zpFjt@63!)_)><&bx@zfeA z@e~`e@?DLJ8)qeY+Bbz0U7b^@+Hl?)vS%SCg7Ut349ozT`Jj{PTS_a;G0rx-Ps%^Q|XnSV#6%|nHmd$j9W=N4wr2|Tk z#Fr2Z2x4$H^?8!mI;_NFlJ!uP5=*U~B&2nji>OqgfYl7itoTt-KGU9hiekl$LmY?! zv_t0m*a3$Db|cUdily{q0@)VoAoEGQ5(p#N4TY{D@UmHo#k=?uHY(!vYzak%!1c({ zK==z4Md%CSkS){ElB!1YGhXB1#Z>8vtgTJv-gKGurW>)<@d@oJNz#!?Shf~=j)(n> z$Mo}hCowB}QU?b2h5Kr@5I$=inQ@4QWv(dLAvi+(Ga~+s`bTuH0O^AmX2PQzU;6LT zB{7Y*qtV|dOUtM3sAbYjkpj?9ffy84#nY}VwytGTrl(E;0I#)obXKb=?PFy-7J?XY ziRgONoQC`F9KHp~SS{HbUliw6MXe|b*md+1MM%=M#s~+vuK0`bp(P|>k*HjnzBaEM zy`th#F~V67hA}R#E}6+$WoIggJ0mX`zJ^1{x1s@2Uvakcw`3n$LyEVmKuE#GTbGYO z<9d`0pU0&~0Y8Z$rn}%!!@U*Ueb3m?i-DxR0SCZ`!qCkfbbvae@D@{*K0Rgqx>?f- zUv7AYcktQiCH~4S!X`Dt%h*WiWDfRn&DpiuWO!3M1;tk0;jKkL4C8Q@mVpW;)dE#f z>NWLmtdEodSWwonDVvb?ZoHc^l5NyIa{7+r(S{*aTVV;)1f zCZa?|Z4TACJi@F{!pI^nS1MhD*km5fX;g?9e^Ipp2bbM(SPrTYxDTb(2QHat&WB=N zm9eBMVRZ1mG#V?e%+2PNgWAg0p!Z5XrX#;3?f#jcP}E+Nkr0n((XS03JysTGC?_(`vNkWT-rA>Hf4 zXx}mrR3MpdcZS~SEI2}qi-!uc+*bcll&L2J$FHS}Eyx!2V`dCe0s9{tjExZNq_~ zbJOp-z;}H(v1$_UKZaAZXC>O1KiDo%GiF%_2pP+%UHRpW2%BE+l(W5dy`Lk>XtBB3 zGSsjYG;x|!aU67r7sCzfP8WmFKHc&)0$gGO_ z(b@zJyfTr*@Tg9llsl<6J?c!WT02c5s4dKc=iS-i$R?u5<6zTz2EB2=+w3_7#b%i) zI>XTmXIKR_g8jfApoTzNZIYQq#+*L-(tvq$-+jfXg?Iyeq_)k7@EIk^Iab$W;W;5n z&XDwz=uJ6L4RpHg9Nv*xL~- zhDWEtV`Z`CN+|&x0&&(V3|I6oX|kPW{))O#>^T4zt?i0eK&{5~kYwUI!a0l9-pTBw zLfuZ67t&J}q1X`qM^4J;WUE(oX8PDU><*-h7Hia~7n}TRPZP}a{-9Si#b75wCYCF3 zBLp}0Vpo{8MLVu!HQc+|2vNrgcHIe*qX3Hl=4bKmh7_i%C?|}KSMm-7&RyqCSy9<8 zd?(j2W4;_ib31($?k& z${C-SM{4ahCRY&0r_GDqz1?iSDdvDlJ3pl3lNXnOSCga1qLIpVfR62ikqs0U(9F>Z zD($j|=vRT49?wsKs40b{v7_EA9M|mtsE*T%d%kD_bThjmmv$3OUPX(L4rffwoJOx- z^BfzEiEN3`-^N@1=n;qzgyK+>A*3i@em6g=)|8Ya7=z8N6Q)vF@XJSk+nkqnafOS*Tx+9|{K-Vaf#_^w^iZLYK?UwV zch>W45FXKW!}c?4UL0JO>}A#P>;M!>o>TJ8?Xe^L8KR{2JC7!7!9~WjJi@N|dP@!_ z5=(t6t6CR!F*w3p4}wyKDIRyT>S9)TTQ%*LC#C(dH@art$b8D4wm3ZBhQc#y-mP{| z*wuUq!G>=N4#IXU50w@-&ZLpnx-ZgiEWR7DGW6#v>`Qpmc}ptzDx_Q+RlytJ|3b}c zAJ0x)C=igJ2ubw{G(e3rO>|9+FMbvh=IBUjooecu=1}V4mYP6nFdb_#NXV8}H>q4> z*Yt=a*zhfnuGRIPRlgQ@aXQqe?A+XgHvc=*ugFh$yPFwuA(7&-#39}5o|_kc53idU zBB0@K#C}}8+z_7219L%6{>?`yltEA;Bq*gwQ2{>uA4Jfe&cJlZxYs-Cm$-&Q7*1SH zzfCdlQ;})piKLP9y?KqF7;UiRku%8bw zkcp6YVYh4G74Iv{z=rRvh;r}tw25-jsfm`Nb%r9XM@je_^f`#O)PYaaOM)Y2nh89e~_EDH!s>Q^RWP+T9rYFn# z#i+5SM_TD6jf{K4h9a`l*db*z?`b$$qn?wLGj_8n{XBEWk3U%0SP8ecJme(2%Cxt< zHi4i-@I{=q=NhldUCZ!MZdma>c8yTN;zGGAmx}cso!WMHsDF%0n{e=DumJ z?=|VjOy!=aOck!5%avLo-T=hS;0B!$o^Cl9RZb-*+$=~;`NqrALH2_Ul}^;8)=16U z%E*;l9pBs4yb=sx?COx)e62<{QhT<{MF`<{RVS`>HYG<$E#&3D|i+5+oL(s*=ZDFh;4w ziYzumM&FEkjSy+x;VYp+t1gmT;liZxA7v7Vu51sNrS&&UrgV3kkYkrkQB7wGILASk z0CrQR$zg=|@9W-(`WCe=;jc-!QPww{PF%bF)|ld}98+~gfoXAC=e~#dTU&~iwTK&S z-Xy*I*{zBfA3||{oaz7=jOWoH;A&xBOWy2V59w&#WCCw=?t--%O8Iw~D@yJU(jo;W`@! zB{eUhMo&SPeMSiu6;i>oqz_kl#-76{c@sCHri0DJQNv3aDcoi~`-A)3Yb9}W5lQPp zRda{wCg5fDZi+r+Ht>N(Dri4FrC1_<)I5ilt{Lw(YZ3dr{#B}9@A=NoPh}|L1H4$X z_;G!0qbti$?kV_;=+{MkZZ+q8IU>caN*`CV zGXiO|H3CJ!JF};V`XqMpJiwDF5!edxqO2=pBXs(rT4g>Obq9hwkO$*BmIxq8y(I5e zK|?f@JR6udOD^8)Li!q@OFx;#A~)JloTT;(EGwDzh&B~2+K4PJ74{=`L4KR&l|9(-h+>~HLuV+hWpirF~@8#Mt;}HekseLdgx7Rjo0)y%Ly1Ar8j!27%!U}R&WJ#B zl)o(&RlO)eA(<+O{v)V=X5x;V_;G*AlptE#&q#F1ArU&#kqx7a8YOV+8LX6 zhe%Mjn}sWJxUcKHQ>AiW8R}r;DL>@F=BqjM!uB^jyrA{ZKM3;_9m%5gFWw)6%kP)c zPIaV&1D0OEX$l*@S6)QyN1LVv9~^~Dt))~^O>Q^Vcl$0s+DZz$nm zmolcOP5%tEVu&f_r*dE*D5^K!=yufmoA=I}2I_jq($(a@+z$Nm~>B-NW*829_m)gVgX@#%wt5u~r;|WY!Ly>M9 z8gMAvv8P-8iD1jRN+_>85kOJls{SD+{M&pr`3QE51%A5h5~Gznx6rKl67FO;v0O#M z6KgUmDi8vCHing=N-rD0@~1V?lxgCU^0LuYW-zZvv+I)PwD!oQ^fG0VumH}skOT3{S}YCkI3y)0 zWxcbZyprd<(p!4%S^^+p+otR}IKjB6z0Sz1O;TVU;-JwV{%A@Z;RG(}xYUpC%mo^V zssG%)ASJC4GOatJi1>jZsOk6t3TXNIBI3cZ6CYth=niR9|5)g+yR`xT8~r0@14pF+ zeXO@gwM}fCd-yLM7#$KiQj(@mY?a@C>`d(;(|%g+>VHi1YiE-|-1CR}fvJ70^&2`) z_ZvEij>v=G>^VRg^fPD-hevKe(Q2tXjrH$1t@Pt+AXdw2`4UPns%tY>R?)88;Z2$7 z7p`B2A2k)aw2IrlcR%7gN+P%S03*P!nZNq_j3>#I>JnJtv9ug$w>fV?1&a5;Er~tl zn=3lKZ-Th+Rp+(iba|6?8`pL-9O+@}CZE+Ip|jYUO5L{8Je3UB1&=)vuh+dcmRsC3 zJ*h?twHa^8pV(ZB8Gic`NtmY8-a->wR>?83@X{IzqQXSEnP>CNG=a3<`a( zLQ9Kx3qoJE*K2sP!q>nE`usxCPDX#L#?;t{26HgmqbydEYc^YJ5I_`G;fS$yT^{l~ z7qeK>9szZHB_VswsCDc0fekIBeqo0WKiwlKhxmVzZ+28%L04+~?W1n%y?d2li=cFQ zaeGHU40Sg_+$z@!F4z0xGp})R$4zWcScG?y$2$2Y(k1zL>Igf zQcH)~8Fb4pwvun2tZwOnQZW|wEuGTdc<+ZXKE_VY)~@a*xT8R(WD^k2$J=3iWLP8 zZncplOLwTHIieko1klb>+%+#=}^X`F>RQ)EBwSlpk<;C%zvpfWM;SE$4Cuz7~S*cONWAE#kbb~g?4y?ZA*LY3QtspTg2s@zG zG~IN-HJgXs|r(Jn5K zg|gnPS!vg;13F{%>-*E089&}Bd{fL5?wzA`nYmpXrx)!0weZ2op2>#_-ZswyxG?n- zAo58*aJ3a2`~J;cNI;|^=pHqeAQ728)pBK95?C6d5#UP6l|CE1U*JlKk6gxTttW5M zT;N*D&o>>=65ksXfXCkc`{M^I0-r3*!l}_hSNgL+>383FY2@F#fjWW>=kQ^-G@pk! zHb=dRzb&eR3;jdJ==CtDtM(?y|MIPOvmnC6uzQO9>?jgprWk|-lP93A<+oM>n zl;aIc=6@mouj}0r;Rh)Ftq&+9-5ClHJkQLj-cB*8eq&Mo##Yb5+{VJ8;pmR2{Eg)s z+g_5q5e?er-_a+;8K?fazh?+QK|ruUl48ejf&6hZ_QS*o!8hG9EimXJ?#O!HRccoy z>UAk3lvA`q5aj0voWB>}j~)0}8}*0ya#t)X(v#7deZccbRP3;^$RMdfDu$(>^uI`- zjTy(V*EcMiJz5313wq9#5?YON)WJUT<8b42Kmyy~)+km|za`>WfeQfeE%rO)=$GPx z4P<)`&G}|iRsozJg({*7P_O+XZSnLg4>KQx3-3)#K<_aMtT2Brx#V()vDC!6!%Q!X z`u*Ivh8C5M7tXNXPT;NlECvmU2|lxeUOLy8SpVN6{qw^~KaA-h{vn#`jKjeGrIL8Q zpZ;fy((Lm;TTRrKr~joeY!X5L!>zO>g!vCO?Mev#AL`nJ=f4!a&jKXsKOfGv)tf8( z`<$iVARt^xsDza=f?$CEg+m+R#t0Il zjp8QNTt>n4MO^Ya(5O0pN3@uC$%{u_c+D5KulFb_U}$$j7S)f1no z!c)6wjf(AZfJ)t0Mig$!$ycX3FXEud#82F^o0eX1C1P#}b%O~8+EDFI2fxk+yFZQR z&dgW*)K{HvTj{Pe(B9`)%cacI@O$-zRtlP8X=)5RnIX`n#@T;ei-Gzyy+sBvRKr~w z*i_>%)@`>|o_wDhG?;vqd`~e(ojUVjvNkDb#iiclxnQ8pOglnTWs;kO3V-mp*>aw) z-n8#6`D=N%sZ=)Qx2_@>n2h8xV1=17Tg5Kq`qa`RX)ReDkPFp{Z+Ae;VXjW^p*PSg zmo$j8;tGroY1GCRs3Ue>V9X@dF3hN?p--P>-OmXePVTWxp2Lf!c>XjFlVlc!329A- z6IuQdxLtbr{o9KBtAb(5qZb6t_+_&Ge!X9osIFaLGud^bI^w+DgQEVg+O#Upa1zJ~ z4cukT3pIS?d7>^K??U>JeCx|`4K@1f^{3D483Z6SKp5C--gPWi@)~RhTNo5Y^c|<_ zJy%_^9PZlY+ImJk-kOz5xoJ{dHCdyjvW%fjhT*8N+!m#~ABkY2!QQBsKvtqotfw}0lFjWzx=W7(i=soMrOP(0beg?svwe8N$P99=A8R9@4;P;m`(%Wn zdI?x?`O*29EcddMN|IRKCi8&Jz3JYL_(NZ!fto*;bCTT!uXZi#C;N>b^wUMKAYQ)D zi@}%R?s;s7NnOU1XOLYGML)00FY~L+Cd=H`VLOG^4kA?P3r}o^gn9Wy%9wLBK}?=l z;+5w>QGH25Wa`zXH_p)~^{ z`>UflHgC5KA3~I8b{Cd_s6Wi@0|AfLzxE)AtL^~nm14|gvF9X&8t2Fxs;rhiQvi7U zhp_Z<-pGwwzhTSuXSZDO2&!^AB%p7>2@#LSKL(!1KM4LxthJ$-I2-jyv3ZVQR%7Z* zuYpYGT4K?H{-^&W=r{?hC}D}m_O6t;y$*D+c$`5uSKx; zay2^}1V{OAoJ_w^*lLjvdXjgbssB9Y-ya@b%2Tgxz|8E3z4DM^6k(XI6sQ2BRWI9- zuErT$Y13!70&90^XH`~9cI!?vJ7Vn5F9~DtdjfKGrKquEN(*}pbfi?A<}B%d`-rJD zs2yT@52bIkKg`AO_W5X%a?hT?@Vv>91onJr=ZXAk}#Kb>+J66nd;^B#$ZfbX2nMP1jk80=qFBw1s|&7@ZWMY>+J(`@!CBY)3}J! z)S9iZ2zS~aUN#XQ`RH51OiE-jykuyz@FXj%F2J`uMdS(odz$p7;&b`SUQMd@HHQz38`_)!>6!nTC|4qfQ z)$bO0PS+JOW}}QK!MNPm)9jM^)UT=u^(5radO+e7!7RRL-NCQ!3{FL##${)-VA%QfDJjkHu zUrXfMpBdbClG|1P-_*lDj<;zga{j-rx+=O7>|bw74XdxNh6Vys@wah;@~<-{`)>jw zM;q2x?N`TF@3gapJtGP!D3ms7)OU&>XvDUm;gN|TPy;aGX@`_J>C?d(uqYw4GBrAB zl>o>KgOb)-YFOsT7Pq?P*7Ym52EV$w7X!N;pDUY-3(7yhlkJRYIY!Fou{fXE?1!8i z--|Eblf#*~JYEGcm)9BMD`5Ut+Fahz1J>JzdQl(b+0A2vf&fp!A`)dzW;*-qqIBAF zQBr{LbE9JEA6y$;=zH$*PK6?F!!j@qHo^i`)VS#rWxe>hq7Eg2GD|**GQ9TxSH^XK zv)R3GV%FX&Hl>JFyK1XdREr9=YSf-Js-=PywMVR~O>6Ji)K;O0O>5MM)tc2BMgM8| z`u%+WTvx6)dEWcE@AI7Zym@n-=bVS9&B`maZApx!eAJo@&nM_a?tvV2ux0#R@a{5} zPF$SjQ5rX=9*zvD?%qDu5CnPXna-E;c=a_fc}>5Y>5Hy?|FWJSh;Lbsm&E4EJm1kr zx|`#TH;-hJhhlXCdu%u0FIVkNN=HR9%69=#^c(OrN6#XZiW1y#iAy@2)4;H3^qENY z%Vc}Mq`UNloe$+W+xoltyhJ>_1HAhLLCYS|gR6VbMvM!0kB;COLJ-0ozNoKnKeHK^ zk?jEEe4PV?66T|T<)iB&7JiiU>aH#IIVR6hKv%+@?i?`eZmD0`z68Dx%+R)aFnNzI zUC2tb%~*x%FxP06t`;!E2XhA2iBiHUMSwMnUX-G76;xVQ;HTW3m3CGlEYY>&-O|zn z^{*ql#mPjq3q`3XAboZn;oKdFox7mqSA}h6=?yN7qlXbWpK~is@B2Q9V$d<%?a6x$ z7n_S_7Lr1kytIe+yAkN!e<2muHu2NRxmjCVG5OO(9&Mc(HBjw!PeGhV$L{T_N=MN0 zhH$RHqly`asP0nq?~|21&e)d7lEK9Lbgd&J9CZ@T(T7_3B@nY}7t}_G0BOw+P;E(} zX`M@VFsWAdgU=t+Z61I{m?~Zr|O#ny6^%>K(*Ab=4&z z6;UQ7W)dgcGX*wnQ_sA1p0$_lq+G;VSRex zWrMh7`{G&mf}K=D0zyx>F#};t?^t=;=+!uKymCCeoLb4LhHt`2b>hu##fdk53*x76 zSIY5~#_5c>P0f)fH#rdgcnwgk_jipt#9FPF9)XfpT;4(s>#Us!$&Lna|u6N&6^}#6-z?zL_^^{`-;;zg8raSL6Lz?U=Fw?I#b%;^h(IS zeEPOWg~ZCY%^ShWWkCfeluy$e!W-(xwV#;^c<%X4Ad754vJ$t7 z8gJ>vp;jQI$$9Y!M&eGNES`DvDc}PF)70;bsS@nDKS!{sx?q=sREy*0N;^qyBqhv5 zSwe5MP=dm3JUs-R{GJ@&M8=cRVMi(QQ%$c;*l|^UiToDV-PtMBq9?qX^Ku&hdWeXu z-skBs!n$grFxRdsisxGVbC%tD8rCu4h5>a3sPHj}x?+f7amSUovFh0ke5Y?>oTgJ_ zwkk09qm~Yrh^n|}jliS_m1TLjS;a4V71ETMH>7%P-0wPE72~Xa8RGVyuq1F|)MCpf zHOWzNawk0_7pc)p*HF0N{jt6*Lvnw2xpA;bfKK(LfFQ!qoIc`qi4DrVF4h|x#2S6Y z{RwwGq;#&4R15cD%$j2}d`9+5_{&5=>l5RqhsNF4mk6BUCIh|RrMhy~ncFxd^vPkC z{WIe62n)U+g`(2w;f>QXPFz%@s{i zM}sjp?<53w+DaAF6Y}G?n5wTuRhIdPI!LweLMow#AF1&1XEmNOcm`|ay^Iqzqn!LpE%;Cd3(DKC>Ky&9E@#gt2 zLy*0ifclvVkwXtZW~HpEkuP75@Za^ZOAheYKQ13y!YwG7@mY@_K;h5#PBQpW&pYi1 zoZvxSQJ(`IbM;fbCF_nidW=6mXik%Ji$t#NDWH73S*xF)nFfNoWtI5GHj$lEG*;|^ zUD>M-R_@Sks_YM>ccY{x-kF7*a6z{zm1p|v82ni0U3YN&^4rNrX7S~_ z%qI>lpsbWG4P;CScKEC-<$0FujE!8L?-Nm9yxjYPps!a*s=XQOHNw1D6NkX0XF&O+ zkX|5+1(1 z5QEeN^DA+G#kH7RIRwuT7Tnne*UJS=Fu3kX8eP?I(BiWa+4XVJEoUl{?Z~(>!r1Lh ztu)DqqdUTKrJV63-db5Zogu0xzS{<(sp-ydRT@?^Jf>c)4O36uwcagrt7`GFL47pB zpVg|fJ0XR(B7_`I!mYdf-$ivU8!|9zvuqP?_ z^_dk-i+D_2$1mCRi!v8K6sNSdM7(?KE8%5!pAmb$g>kf{PvA}e9a8`F`GEV7&`7Qs z;z3}%U2ifpSQ))bp0mSkarQJU(0(hwRf&`!TxU<_hO3X8^jeK&{ZZO4n|A$O`z?*m z_Fvx)qW553LER+Sfe|^BXs+UtH}TL{4^RZ#Q|2xdcPsDh$wgm!aB_ z{69p>z6L|pu-i6ma@s$o>&HkGkha|aVWp)}XdGyYwD5LKWPC33y72~GVtqncaxY_7 zw4i8wFS~jJF)oO}Xfv}eETpr(!8DCg%hOp~D%)7UYNTd{g?%_ZyMs#*!gnGn=`>lF z5;tgLY5jv+)b}d*EG?f@fXTViyMK0`IMEnd&F=3Om zYAqD34WI$v;!?RvH^uNM+d-0?%mr7^SY~3pft~*sosAMy#!-D{fJyp$ zI^lp~(pYxE%E?rT1l1Alp>rjnc7Q4Wmec4(wMjD8UtHE-Ahc|vxFG>QK2FAm zxxAL8aC$$X4hHB(xmR=F{bYa5IaW1F|=YTNppw4`Ybo;OOeK&T=SepkkzoNFec>q|XZa(b(}CLX z%4S!U8BtLB+?eK(8Uk82tUss88BImLBY-PD{KStw$e20(jx7XqX64L623eogAh!&C zu}|@W!J`)WES%5Kz&}#;C$b=a#Od@-^Eg9EkiCK8^Awi$6N`P7ujOBUEAR6>ds(=O zb;QH!)O@Os9Mj2t)0e@e!%8diV}!Rw?A`m!@YFuO`s5yogo9xz6Zd9zSJo(7>0Vb2 zp{{+e)O$StLgaGBu&^ z#t)UxSW?M?WZ6=(32lP?@HC&V?K`w;8{vk(Rw@pLQ}{m<(sR_TSTo`0dk}F~4{nyJ zOjOIBDX%SwB1~k?;kcI!J*Ge%=;1LvIO0eODCiM#2t9cL5d)E9iyHVGr86gb?q_s1 zsp=)9DmRo@WfryBc`u}~q=LFUeAh_q^T%{~V-EtL)ngjPqb05BgV#)Ko*jlhdfT!r-+XL>lx?fqVw25 zy64U9x1dA(Pn|JHGk=oSm=QUX_3{O`dC=pUV-IHZO;5#)E**OeW5)2F=865>}cw&NOW z{2})3=piI|Ol_!r<&^i;ef=TZ$Hh@@LRpYBGfxFu7S(G@H6lW_yo^`?#=5N_3Ib6# zP0ghV?5A|kpoTLzbO((UQ=!%ngiX7ddf63RBA5M-iynn{Em`uoU{&g*hKjIR)d6%yD8 zK*fOd)MJTH4n7tFCl%QK?{WQ`z}QbHz6VExJ#X(xR`lWU2xYql^=RhWSN`}UdRj=$L_y`Q~|eXm?c>YO5c44|yYg!!%f$AB|i zY&k~=c5(lkfFQ3HPjBVNK=WUAcv{0ct8JdE6F#6safbklXxX{=3@eJ(ffX5xYAPoh zDvqTgof{2US_bUZ;%_vCX*}yok~46I8w1p94*XMrMD-S0tmDvWi&PO|S@)g&Fg2yX zju0z2uu0*ic*oBNec)#DID>jRoVk0#c?ZLgV3zF6sDM~#&V5h1^%E+RJB^4DkG#=v zzaX9Q4|b+CXA_^o(gdN1X2e%FIDJMvrA0kz-ILHPx{WIK3P+%_`hu>yB>k0Ud=UjEj zsHwUhqUsmhxckewR<<_(5aDC2g+1e!NOKA?)=}e<(a!;0t{&Jeowg%S5BZM;Cx;K} zqvlYi`z-TH@?XGfYA4dCDf572nr3E&?wzCnT2s77NwK7s+iL61I};VZHus&M6D%BI zYZFY#hE30Nz*~zAN&-vND7O5I*co#mep8?CeaYXoPNY-Aj&ct8wLR>6)tETiK`Tf) zk#6lprhh;z`Ck9N@-byRTi4J?40~Yc%HC}3PlG+BYWlV7d;{0)2X8y}AC1D(F5Xj z4({8Wga^s#&lwWg^WAef1)VZ_5@&A*$VK;=TQC>S5mc16bw4>K-|5A9y5OP4y#_iq z&#lQmQx5n>c^rjPwOJ8q_oBJ^{UYR0SEr_~_tv`Nrw8|!(~Xz(dN({A;_k`UNYK{a zyz<3SMs>4=Mm3mI&9R z{dLN;@~glIRH-_9+b>$251QgpZ3i)8A!oSizhBWIGcDeD>e~$zc*2Aq9^Deq@6TN3mF|n`pb}R zeqgq1WjISr>je?A>79MP$y|&Kx9#ef`|xDr+eW0vu-b1Az#nzEq`zR*HW6@nQdM0p#HTg|<|%_x?R5!!21YvmsG^gA^%Mge}h=yoen? z{H4QkuiySzp7$}Kk-*iP;f-#l)a`@HO^o1L7kF~6Y4lGbxG!=GFJ>sKMfb>^VDtNi zr}!sFVL66Pe|V;fufR$K(w}V8%dY%jWth}Xp8S|`cn-Jm2UFhD({>2fJ<`9cWiV4# zxH&r)d8Wg>`HN4V^J{R=vr7pjfQ#%>YWeoX*{CX$i%G7{YK05jjrySr8*ZcC1n*BEmd@i?>6kXRa)u4X~Aj{aq!=?ARkZP&>d|--dYqN-v9{lQM(2OK$qUc z2GHQ3_a9vp>V!RQ6TMui6IRzIeqMibrwu5YcCkh2zkX;l7P@>Q=0$vQL|0S9I#q0g z$+iQ}35?r;*k3V=g(BNY&P{3UKmZFij2*xNn`ozI`+wy<|59OL!2cp&}^GlSQokqVB(ekwkm`l!G#O(Aoed`{4%LpRs;9o&7Hg9{9rmo!sU&{R8@A z{%0VP|Hb?nh{xdn-CZYS=z<&*(+o zl9$L;9siO?_c5Ilm-PVwb}kq@iw`S|xc@?su^$L{=Z+E7>%V%Abw%6!o?dWV!-!o< zbzc&D_6)Y$FNOg{D2hAzq0{BW=ybXCCD3XBOy#5cIeXkkAfPD-!#?y;1mk#VYX6d> zeJ~n$&TdXFHt5C?|fI<7hi13GTo zKdrk&5MF==Gr=6|$zicW7d@Ue1O#jpVo2tOc+Oi(gaiTv%V6^LxBkVsqixs~7+g7$ z/dev/null`