From ffa0cfa3bb58e14db4fe7d0e48c4bd0796c633ab Mon Sep 17 00:00:00 2001 From: pablodip Date: Tue, 16 Jan 2018 06:55:45 +0100 Subject: [PATCH 01/63] some filter and sort markup --- src/cljs/commiteth/bounties.cljs | 58 +++++++++++++++++---------- src/cljs/commiteth/db.cljs | 3 +- src/cljs/commiteth/subscriptions.cljs | 5 +++ src/less/style.less | 47 ++++++++++++++++++++++ 4 files changed, 90 insertions(+), 23 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index f7ba984..69bef6a 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -5,19 +5,19 @@ (defn bounty-item [bounty] - (let [{avatar-url :repo_owner_avatar_url - owner :repo-owner - repo-name :repo-name - issue-title :issue-title + (let [{avatar-url :repo_owner_avatar_url + owner :repo-owner + repo-name :repo-name + issue-title :issue-title issue-number :issue-number - updated :updated - tokens :tokens - balance-eth :balance-eth - value-usd :value-usd - claim-count :claim-count} bounty - full-repo (str owner "/" repo-name) - repo-url (str "https://github.com/" full-repo) - repo-link [:a {:href repo-url} full-repo] + updated :updated + tokens :tokens + balance-eth :balance-eth + value-usd :value-usd + claim-count :claim-count} bounty + full-repo (str owner "/" repo-name) + repo-url (str "https://github.com/" full-repo) + repo-link [:a {:href repo-url} full-repo] issue-link [:a {:href (issue-url owner repo-name issue-number)} issue-title]] @@ -37,24 +37,38 @@ [:span.usd-value-label "Value "] [:span.usd-balance-label (str "$" value-usd)] (when (> claim-count 0) [:span.open-claims-label (str claim-count " open claim" - (when (> claim-count 1) "s"))]) ]] + (when (> claim-count 1) "s"))])]] [:div.open-bounty-item-icon [:div.ui.tiny.circular.image [:img {:src avatar-url}]]]])) (defn bounties-list [open-bounties] - [:div.ui.container.open-bounties-container - [:div.open-bounties-header "Bounties"] - (if (empty? open-bounties) - [:div.view-no-data-container - [:p "No recent activity yet"]] - (into [:div.ui.items] - (for [bounty open-bounties] - [bounty-item bounty])))]) + (let [order (rf/subscribe [:bounties-order])] + [:div.ui.container.open-bounties-container + [:div.open-bounties-header "Bounties"] + [:div.open-bounties-filter-and-sort + [:div.open-bounties-filter + [:a.open-bounties-filter-element {:href "javascript:;"} "Value"] + [:div.open-bounties-filter-tooltip "Lalala"] + [:a.open-bounties-filter-element {:href "javascript:;"} "Type"] + [:a.open-bounties-filter-element {:href "javascript:;"} "Language"] + [:a.open-bounties-filter-element {:href "javascript:;"} "Date"] + [:a.open-bounties-filter-element {:href "javascript:;"} "More"]] + [:div.open-bounties-sort + "Most Recent" + [:div.icon-forward-white-box + [:img + {:src "icon-forward-white.svg"}]]]] + (if (empty? open-bounties) + [:div.view-no-data-container + [:p "No recent activity yet"]] + (into [:div.ui.items] + (for [bounty open-bounties] + [bounty-item bounty])))])) (defn bounties-page [] - (let [open-bounties (rf/subscribe [:open-bounties]) + (let [open-bounties (rf/subscribe [:open-bounties]) open-bounties-loading? (rf/subscribe [:get-in [:open-bounties-loading?]])] (fn [] (if @open-bounties-loading? diff --git a/src/cljs/commiteth/db.cljs b/src/cljs/commiteth/db.cljs index 2ee532f..4a51dbf 100644 --- a/src/cljs/commiteth/db.cljs +++ b/src/cljs/commiteth/db.cljs @@ -10,4 +10,5 @@ :open-bounties [] :owner-bounties {} :top-hunters [] - :activity-feed []}) + :activity-feed [] + :bounties-order ::bounties-order|most-recent}) diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index 6e18eb1..9228ddc 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -80,3 +80,8 @@ :user-dropdown-open? (fn [db _] (:user-dropdown-open? db))) + +(reg-sub + :bounties-order + (fn [db _] + (:bounties-order db))) diff --git a/src/less/style.less b/src/less/style.less index 2c0c2e4..f9e4a0c 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -413,6 +413,53 @@ font-weight: 500; color: #42505c; } + + .open-bounties-filter-and-sort { + margin-top: 24px; + display: flex; + justify-content: space-between; + } + + .open-bounties-filter { + display: flex; + } + + .open-bounties-filter-element { + position: relative; + font-size: 15px; + font-weight: 500; + line-height: 1.0; + color: #8d99a4; + padding: 8px 12px; + border-radius: 8px; + border: solid 1px rgba(151, 151, 151, 0.2); + margin-right: 10px; + } + + .open-bounties-filter-element:focus { + background-color: #57a7ed; + } + + .open-bounties-filter-tooltip { + position: absolute; + } + + .open-bounties-sort { + font-size: 15px; + font-weight: 500; + line-height: 1.0; + color: #8d99a4; + display: flex; + align-items: center; + } + + .icon-forward-white-box { + width: 24px; + height: 24px; + display: flex; + justify-content: center; + align-content: center; + } } .open-bounty-item { From 26c740517bd657d823fc5638e3fbbb17aa0d0506 Mon Sep 17 00:00:00 2001 From: pablodip Date: Tue, 16 Jan 2018 13:05:41 +0100 Subject: [PATCH 02/63] some more sort and filter markup and interface behaviour --- src/cljs/commiteth/bounties.cljs | 55 ++++++++++++++++++++++++-------- src/less/style.less | 49 ++++++++++++++++++++++++++-- 2 files changed, 88 insertions(+), 16 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 69bef6a..6c6c91e 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -1,5 +1,6 @@ (ns commiteth.bounties - (:require [re-frame.core :as rf] + (:require [reagent.core :as r] + [re-frame.core :as rf] [commiteth.common :refer [moment-timestamp issue-url]])) @@ -42,23 +43,51 @@ [:div.ui.tiny.circular.image [:img {:src avatar-url}]]]])) +(defn bounties-filter [name] + (let [open? (r/atom false)] + (fn [name] + [:div.open-bounties-filter-element-container + {:tab-index 0 + :on-blur #(reset! open? false)} + [:div.open-bounties-filter-element + {:on-click #(swap! open? not) + :class (when @open? "open-bounties-filter-element-active")} + name] + (when @open? + [:div.open-bounties-filter-element-tooltip + "TOOLTIP"])]))) + +(defn bounties-filters [] + [:div.open-bounties-filter + [bounties-filter "Value"] + [bounties-filter "Type"] + [bounties-filter "Language"] + [bounties-filter "Date"] + [bounties-filter "More"]]) + +(defn bounties-sort [] + (let [open? (r/atom false)] + (fn [] + [:div.open-bounties-sort + {:tab-index 0 + :on-blur #(reset! open? false)} + [:div.open-bounties-sort-element + {:on-click #(swap! open? not)} + "Most Recent" + [:div.icon-forward-white-box + [:img + {:src "icon-forward-white.svg"}]]] + (when @open? + [:div.open-bounties-sort-element-tooltip + "TOOLTIP"])]))) + (defn bounties-list [open-bounties] (let [order (rf/subscribe [:bounties-order])] [:div.ui.container.open-bounties-container [:div.open-bounties-header "Bounties"] [:div.open-bounties-filter-and-sort - [:div.open-bounties-filter - [:a.open-bounties-filter-element {:href "javascript:;"} "Value"] - [:div.open-bounties-filter-tooltip "Lalala"] - [:a.open-bounties-filter-element {:href "javascript:;"} "Type"] - [:a.open-bounties-filter-element {:href "javascript:;"} "Language"] - [:a.open-bounties-filter-element {:href "javascript:;"} "Date"] - [:a.open-bounties-filter-element {:href "javascript:;"} "More"]] - [:div.open-bounties-sort - "Most Recent" - [:div.icon-forward-white-box - [:img - {:src "icon-forward-white.svg"}]]]] + [bounties-filters] + [bounties-sort]] (if (empty? open-bounties) [:div.view-no-data-container [:p "No recent activity yet"]] diff --git a/src/less/style.less b/src/less/style.less index f9e4a0c..1c9eeef 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -425,7 +425,6 @@ } .open-bounties-filter-element { - position: relative; font-size: 15px; font-weight: 500; line-height: 1.0; @@ -434,25 +433,69 @@ border-radius: 8px; border: solid 1px rgba(151, 151, 151, 0.2); margin-right: 10px; + position: relative; } - .open-bounties-filter-element:focus { + .open-bounties-filter-element:hover { + cursor: pointer; + } + + .open-bounties-filter-element-active { background-color: #57a7ed; + color: #ffffff; } - .open-bounties-filter-tooltip { + .open-bounties-filter-element-container:focus { + outline: none; + } + + .open-bounties-filter-element-tooltip { position: absolute; + margin-top: 12px; + padding: 16px 24px; + border-radius: 10px; + background-color: #ffffff; + box-shadow: 0 15px 12px 0 rgba(161, 174, 182, 0.53), 0 0 38px 0 rgba(0, 0, 0, 0.05); } .open-bounties-sort { + position: relative; + } + + .open-bounties-sort:focus { + outline: none; + } + + .open-bounties-sort-element { + display: flex; font-size: 15px; font-weight: 500; line-height: 1.0; color: #8d99a4; + padding: 8px 12px; display: flex; align-items: center; } + .open-bounties-sort-element:hover { + cursor: pointer; + } + + .open-bounties-sort-element-tooltip { + position: absolute; + right: 0; + //margin-top: 12px; + padding: 16px 24px; + min-width: 200px; + border-radius: 8px; + background-color: #1e3751; + font-family: "PostGrotesk-Medium"; + font-size: 15px; + line-height: 1.0; + text-align: left; + color: #ffffff; + } + .icon-forward-white-box { width: 24px; height: 24px; From bdbdc2e2d23dee4f4fc54ba37591992fd8ec333b Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 18 Jan 2018 05:45:42 +0100 Subject: [PATCH 03/63] add some bounty sorting --- src/cljs/commiteth/bounties.cljs | 62 +++++++++++++++------------ src/cljs/commiteth/db.cljs | 23 ++++++---- src/cljs/commiteth/handlers.cljs | 5 +++ src/cljs/commiteth/subscriptions.cljs | 7 +-- src/less/style.less | 12 +++++- 5 files changed, 67 insertions(+), 42 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 6c6c91e..7da81fa 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -2,7 +2,9 @@ (:require [reagent.core :as r] [re-frame.core :as rf] [commiteth.common :refer [moment-timestamp - issue-url]])) + issue-url]] + [commiteth.handlers :as handlers] + [commiteth.db :as db])) (defn bounty-item [bounty] @@ -60,40 +62,44 @@ (defn bounties-filters [] [:div.open-bounties-filter [bounties-filter "Value"] - [bounties-filter "Type"] - [bounties-filter "Language"] + [bounties-filter "Currency"] [bounties-filter "Date"] - [bounties-filter "More"]]) + [bounties-filter "Owner"]]) (defn bounties-sort [] (let [open? (r/atom false)] (fn [] - [:div.open-bounties-sort - {:tab-index 0 - :on-blur #(reset! open? false)} - [:div.open-bounties-sort-element - {:on-click #(swap! open? not)} - "Most Recent" - [:div.icon-forward-white-box - [:img - {:src "icon-forward-white.svg"}]]] - (when @open? - [:div.open-bounties-sort-element-tooltip - "TOOLTIP"])]))) + (let [current-sorting (rf/subscribe [::db/bounty-sorting-type])] + [:div.open-bounties-sort + {:tab-index 0 + :on-blur #(reset! open? false)} + [:div.open-bounties-sort-element + {:on-click #(swap! open? not)} + (db/bounty-sorting-types @current-sorting) + [:div.icon-forward-white-box + [:img + {:src "icon-forward-white.svg"}]]] + (when @open? + [:div.open-bounties-sort-element-tooltip + (for [[sorting-type sorting-name] db/bounty-sorting-types] + [:div.open-bounties-sort-type + {:on-click #(do + (reset! open? false) + (rf/dispatch [::handlers/set-bounty-sorting-type sorting-type]))} + sorting-name])])])))) (defn bounties-list [open-bounties] - (let [order (rf/subscribe [:bounties-order])] - [:div.ui.container.open-bounties-container - [:div.open-bounties-header "Bounties"] - [:div.open-bounties-filter-and-sort - [bounties-filters] - [bounties-sort]] - (if (empty? open-bounties) - [:div.view-no-data-container - [:p "No recent activity yet"]] - (into [:div.ui.items] - (for [bounty open-bounties] - [bounty-item bounty])))])) + [:div.ui.container.open-bounties-container + [:div.open-bounties-header "Bounties"] + [:div.open-bounties-filter-and-sort + [bounties-filters] + [bounties-sort]] + (if (empty? open-bounties) + [:div.view-no-data-container + [:p "No recent activity yet"]] + (into [:div.ui.items] + (for [bounty open-bounties] + [bounty-item bounty])))]) (defn bounties-page [] diff --git a/src/cljs/commiteth/db.cljs b/src/cljs/commiteth/db.cljs index 4a51dbf..e54bcd1 100644 --- a/src/cljs/commiteth/db.cljs +++ b/src/cljs/commiteth/db.cljs @@ -1,14 +1,19 @@ (ns commiteth.db) +(def bounty-sorting-types {::bounty-sorting-type|most-recent "Most recent" + ::bounty-sorting-type|lowest-value "Lowest value" + ::bounty-sorting-type|highest-value "Highest value" + ::bounty-sorting-type|owner "Owner"}) + (def default-db - {:page :bounties - :user nil - :repos-loading? false - :repos {} + {:page :bounties + :user nil + :repos-loading? false + :repos {} :activity-feed-loading? false :open-bounties-loading? false - :open-bounties [] - :owner-bounties {} - :top-hunters [] - :activity-feed [] - :bounties-order ::bounties-order|most-recent}) + :open-bounties [] + :owner-bounties {} + :top-hunters [] + :activity-feed [] + ::bounty-sorting-type ::bounty-sorting-type|most-recent}) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index 528c116..b69f1ca 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -453,3 +453,8 @@ (fn [db [_]] (.removeEventListener js/window "click" close-dropdown) (assoc db :user-dropdown-open? false))) + +(reg-event-db + ::set-bounty-sorting-type + (fn [db [_ sorting-type]] + (assoc db ::db/bounty-sorting-type sorting-type))) diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index 9228ddc..c6d4340 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -1,5 +1,6 @@ (ns commiteth.subscriptions - (:require [re-frame.core :refer [reg-sub]])) + (:require [re-frame.core :refer [reg-sub]] + [commiteth.db :as db])) (reg-sub :db @@ -82,6 +83,6 @@ (:user-dropdown-open? db))) (reg-sub - :bounties-order + ::db/bounty-sorting-type (fn [db _] - (:bounties-order db))) + (::db/bounty-sorting-type db))) diff --git a/src/less/style.less b/src/less/style.less index 1c9eeef..e52f7fa 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -484,8 +484,7 @@ .open-bounties-sort-element-tooltip { position: absolute; right: 0; - //margin-top: 12px; - padding: 16px 24px; + //padding: 16px 0; min-width: 200px; border-radius: 8px; background-color: #1e3751; @@ -496,6 +495,15 @@ color: #ffffff; } + .open-bounties-sort-type { + padding: 19px 24px; + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + } + + .open-bounties-sort-type:hover { + cursor: pointer; + } + .icon-forward-white-box { width: 24px; height: 24px; From 11e4a00ac6c9ed9d7fe66e2f9cf06f0c55a7fb63 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 18 Jan 2018 09:08:37 +0100 Subject: [PATCH 04/63] some filter markup and behaviour --- src/cljs/commiteth/bounties.cljs | 94 ++++++++++++----- src/less/style.less | 169 ++++++++++++++++++++++++++++++- 2 files changed, 235 insertions(+), 28 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 7da81fa..e64e11f 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -45,48 +45,90 @@ [:div.ui.tiny.circular.image [:img {:src avatar-url}]]]])) -(defn bounties-filter [name] +(defn bounties-filter-tooltip [& content] + [:div.open-bounties-filter-element-tooltip + content]) + +(defn bounties-filter-tooltip-value-input [label tooltip-open?] + [:div.open-bounties-filter-element-tooltip-value-input-container + [:div.:input.open-bounties-filter-element-tooltip-value-input-label + label] + [:input.open-bounties-filter-element-tooltip-value-input + {:type "range" + :min 0 + :max 1000 + :step 10 + :on-focus #(reset! tooltip-open? true)}]]) + +(defn bounties-filter-tooltip-value [tooltip-open?] + [bounties-filter-tooltip + "$0 - $1000+" + [bounties-filter-tooltip-value-input "Min" tooltip-open?] + [bounties-filter-tooltip-value-input "Max" tooltip-open?]]) + +(defn bounties-filter-tooltip-currency [] + [bounties-filter-tooltip "CURRENCY"]) + +(defn bounties-filter-tooltip-date [] + [bounties-filter-tooltip + [:div.open-bounties-filter-list + (for [t ["Last week" "Last month" "Last 3 months"]] + [:div.open-bounties-filter-list-option + t])]]) + +(defn bounties-filter-tooltip-owner [tooltip-open?] + [bounties-filter-tooltip + [:div.open-bounties-filter-list + (for [t ["status-im" "aragon"]] + [:div.open-bounties-filter-list-option-checkbox + [:label + [:input + {:type "checkbox" + :on-focus #(reset! tooltip-open? true)}] + [:div.text t]]])]]) + +(defn bounties-filter [name tooltip] (let [open? (r/atom false)] - (fn [name] + (fn [name tooltip] [:div.open-bounties-filter-element-container {:tab-index 0 + :on-focus #(reset! open? true) :on-blur #(reset! open? false)} [:div.open-bounties-filter-element - {:on-click #(swap! open? not) - :class (when @open? "open-bounties-filter-element-active")} + {:on-mouse-down #(swap! open? not) + :class (when @open? "open-bounties-filter-element-active")} name] (when @open? - [:div.open-bounties-filter-element-tooltip - "TOOLTIP"])]))) + [tooltip open?])]))) (defn bounties-filters [] [:div.open-bounties-filter - [bounties-filter "Value"] - [bounties-filter "Currency"] - [bounties-filter "Date"] - [bounties-filter "Owner"]]) + [bounties-filter "Value" bounties-filter-tooltip-value] + [bounties-filter "Currency" bounties-filter-tooltip-currency] + [bounties-filter "Date" bounties-filter-tooltip-date] + [bounties-filter "Owner" bounties-filter-tooltip-owner]]) (defn bounties-sort [] (let [open? (r/atom false)] (fn [] (let [current-sorting (rf/subscribe [::db/bounty-sorting-type])] [:div.open-bounties-sort - {:tab-index 0 - :on-blur #(reset! open? false)} - [:div.open-bounties-sort-element - {:on-click #(swap! open? not)} - (db/bounty-sorting-types @current-sorting) - [:div.icon-forward-white-box - [:img - {:src "icon-forward-white.svg"}]]] - (when @open? - [:div.open-bounties-sort-element-tooltip - (for [[sorting-type sorting-name] db/bounty-sorting-types] - [:div.open-bounties-sort-type - {:on-click #(do - (reset! open? false) - (rf/dispatch [::handlers/set-bounty-sorting-type sorting-type]))} - sorting-name])])])))) + {:tab-index 0 + :on-blur #(reset! open? false)} + [:div.open-bounties-sort-element + {:on-click #(swap! open? not)} + (db/bounty-sorting-types @current-sorting) + [:div.icon-forward-white-box + [:img + {:src "icon-forward-white.svg"}]]] + (when @open? + [:div.open-bounties-sort-element-tooltip + (for [[sorting-type sorting-name] db/bounty-sorting-types] + [:div.open-bounties-sort-type + {:on-click #(do + (reset! open? false) + (rf/dispatch [::handlers/set-bounty-sorting-type sorting-type]))} + sorting-name])])])))) (defn bounties-list [open-bounties] [:div.ui.container.open-bounties-container diff --git a/src/less/style.less b/src/less/style.less index e52f7fa..4e4b05e 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -425,6 +425,7 @@ } .open-bounties-filter-element { + font-family: "PostGrotesk-Book"; font-size: 15px; font-weight: 500; line-height: 1.0; @@ -451,11 +452,175 @@ .open-bounties-filter-element-tooltip { position: absolute; + min-width: 227px; margin-top: 12px; - padding: 16px 24px; + padding: 24px 16px; border-radius: 10px; background-color: #ffffff; box-shadow: 0 15px 12px 0 rgba(161, 174, 182, 0.53), 0 0 38px 0 rgba(0, 0, 0, 0.05); + font-family: "PostGrotesk-Book"; + font-size: 16px; + line-height: 1.5; + + .open-bounties-filter-element-tooltip-value-input-container { + display: flex; + margin-top: 10px; + } + + .open-bounties-filter-element-tooltip-value-input-label { + width: 60px; + } + + .open-bounties-filter-element-tooltip-value-input { + margin-top: 24px; + width: 288.5px; + height: 4px; + background-color: #55a5ea; + } + + // generated with http://danielstern.ca/range.css/#/ + input[type=range] { + -webkit-appearance: none; + //width: 100%; + margin: 14.5px 0; + } + input[type=range]:focus { + outline: none; + } + input[type=range]::-webkit-slider-runnable-track { + width: 100%; + height: 4px; + cursor: pointer; + box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d; + background: #55a5ea; + border-radius: 0px; + border: 0px solid #010101; + } + input[type=range]::-webkit-slider-thumb { + box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d; + border: 0px solid #000000; + height: 33px; + width: 33px; + border-radius: 50px; + background: #55a5ea; + cursor: pointer; + -webkit-appearance: none; + margin-top: -14.5px; + } + input[type=range]:focus::-webkit-slider-runnable-track { + background: #5aa7eb; + } + input[type=range]::-moz-range-track { + width: 100%; + height: 4px; + cursor: pointer; + box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d; + background: #55a5ea; + border-radius: 0px; + border: 0px solid #010101; + } + input[type=range]::-moz-range-thumb { + box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d; + border: 0px solid #000000; + height: 33px; + width: 33px; + border-radius: 50px; + background: #55a5ea; + cursor: pointer; + } + input[type=range]::-ms-track { + width: 100%; + height: 4px; + cursor: pointer; + background: transparent; + border-color: transparent; + color: transparent; + } + input[type=range]::-ms-fill-lower { + background: #50a3e9; + border: 0px solid #010101; + border-radius: 0px; + box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d; + } + input[type=range]::-ms-fill-upper { + background: #55a5ea; + border: 0px solid #010101; + border-radius: 0px; + box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d; + } + input[type=range]::-ms-thumb { + box-shadow: 0px 0px 0px #000000, 0px 0px 0px #0d0d0d; + border: 0px solid #000000; + height: 33px; + width: 33px; + border-radius: 50px; + background: #55a5ea; + cursor: pointer; + height: 4px; + } + input[type=range]:focus::-ms-fill-lower { + background: #55a5ea; + } + input[type=range]:focus::-ms-fill-upper { + background: #5aa7eb; + } + + .open-bounties-filter-list { + display: flex; + flex-direction: column; + align-items: flex-start; + } + + .open-bounties-filter-list-option { + font-family: "PostGrotesk-Book"; + font-size: 15px; + font-weight: 500; + line-height: 1.0; + color: #42505c; + padding: 8px 12px; + border-radius: 8px; + border: solid 1px rgba(151, 151, 151, 0.2); + } + + .open-bounties-filter-list-option:not(:first-child) { + margin-top: 8px; + } + + .open-bounties-filter-list-option:hover { + cursor: pointer; + background-color: #57a7ed; + color: #ffffff; + } + + .open-bounties-filter-list-option-checkbox { + label { + display: flex; + } + + label:hover { + cursor: pointer; + } + + input { + background: green; + transform: scale(1.3); + } + + input:hover { + cursor: pointer; + } + + .text { + font-size: 15px; + font-weight: 500; + line-height: 1.0; + margin-left: 12px; + } + } + + .open-bounties-filter-list-option-checkbox:not(:first-child) { + margin-top: 12px; + } } .open-bounties-sort { @@ -488,7 +653,7 @@ min-width: 200px; border-radius: 8px; background-color: #1e3751; - font-family: "PostGrotesk-Medium"; + font-family: "PostGrotesk-Book"; font-size: 15px; line-height: 1.0; text-align: left; From 646ad8a03843e06611064197c24b43cd77c4873c Mon Sep 17 00:00:00 2001 From: pablodip Date: Fri, 19 Jan 2018 07:51:50 +0100 Subject: [PATCH 05/63] some more filter markup --- src/cljs/commiteth/bounties.cljs | 46 ++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index e64e11f..173d7e5 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -61,35 +61,40 @@ :on-focus #(reset! tooltip-open? true)}]]) (defn bounties-filter-tooltip-value [tooltip-open?] - [bounties-filter-tooltip + [:div "$0 - $1000+" [bounties-filter-tooltip-value-input "Min" tooltip-open?] [bounties-filter-tooltip-value-input "Max" tooltip-open?]]) -(defn bounties-filter-tooltip-currency [] - [bounties-filter-tooltip "CURRENCY"]) +(defn bounties-filter-tooltip-currency [tooltip-open?] + [:div.open-bounties-filter-list + (for [t ["ETH" "SNT"]] + [:div.open-bounties-filter-list-option-checkbox + [:label + [:input + {:type "checkbox" + :on-focus #(reset! tooltip-open? true)}] + [:div.text t]]])]) (defn bounties-filter-tooltip-date [] - [bounties-filter-tooltip - [:div.open-bounties-filter-list - (for [t ["Last week" "Last month" "Last 3 months"]] - [:div.open-bounties-filter-list-option - t])]]) + [:div.open-bounties-filter-list + (for [t ["Last week" "Last month" "Last 3 months"]] + [:div.open-bounties-filter-list-option + t])]) (defn bounties-filter-tooltip-owner [tooltip-open?] - [bounties-filter-tooltip - [:div.open-bounties-filter-list - (for [t ["status-im" "aragon"]] - [:div.open-bounties-filter-list-option-checkbox - [:label - [:input - {:type "checkbox" - :on-focus #(reset! tooltip-open? true)}] - [:div.text t]]])]]) + [:div.open-bounties-filter-list + (for [t ["status-im" "aragon"]] + [:div.open-bounties-filter-list-option-checkbox + [:label + [:input + {:type "checkbox" + :on-focus #(reset! tooltip-open? true)}] + [:div.text t]]])]) -(defn bounties-filter [name tooltip] +(defn bounties-filter [name tooltip-content] (let [open? (r/atom false)] - (fn [name tooltip] + (fn [name tooltip-content] [:div.open-bounties-filter-element-container {:tab-index 0 :on-focus #(reset! open? true) @@ -99,7 +104,8 @@ :class (when @open? "open-bounties-filter-element-active")} name] (when @open? - [tooltip open?])]))) + [bounties-filter-tooltip + [tooltip-content open?]])]))) (defn bounties-filters [] [:div.open-bounties-filter From 366148f250c9fda2dad726e35431057331d8c580 Mon Sep 17 00:00:00 2001 From: pablodip Date: Sat, 20 Jan 2018 08:21:59 +0100 Subject: [PATCH 06/63] some behaviour in bounty filters --- src/cljs/commiteth/bounties.cljs | 164 ++++++++++++++++++-------- src/cljs/commiteth/db.cljs | 34 +++--- src/cljs/commiteth/handlers.cljs | 9 +- src/cljs/commiteth/subscriptions.cljs | 9 +- src/cljs/commiteth/ui_model.cljs | 44 +++++++ src/less/style.less | 20 +++- 6 files changed, 211 insertions(+), 69 deletions(-) create mode 100644 src/cljs/commiteth/ui_model.cljs diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 173d7e5..83aa4f3 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -4,7 +4,9 @@ [commiteth.common :refer [moment-timestamp issue-url]] [commiteth.handlers :as handlers] - [commiteth.db :as db])) + [commiteth.db :as db] + [commiteth.ui-model :as ui-model] + [commiteth.subscriptions :as subs])) (defn bounty-item [bounty] @@ -45,102 +47,172 @@ [:div.ui.tiny.circular.image [:img {:src avatar-url}]]]])) -(defn bounties-filter-tooltip [& content] +(defn bounties-filter-tooltip [content] [:div.open-bounties-filter-element-tooltip content]) -(defn bounties-filter-tooltip-value-input [label tooltip-open?] +(defn bounties-filter-tooltip-value-input [label tooltip-open? opts] [:div.open-bounties-filter-element-tooltip-value-input-container [:div.:input.open-bounties-filter-element-tooltip-value-input-label label] [:input.open-bounties-filter-element-tooltip-value-input - {:type "range" - :min 0 - :max 1000 - :step 10 - :on-focus #(reset! tooltip-open? true)}]]) + {:type "range" + :min (:min opts) + :max (:max opts) + :step (:step opts) + :value (:current-val opts) + :on-change (when-let [f (:on-change-val opts)] + #(-> % .-target .-value int f)) + :on-focus #(reset! tooltip-open? true)}]]) -(defn bounties-filter-tooltip-value [tooltip-open?] - [:div - "$0 - $1000+" - [bounties-filter-tooltip-value-input "Min" tooltip-open?] - [bounties-filter-tooltip-value-input "Max" tooltip-open?]]) +(defn bounties-filter-tooltip-value [current-filter-value tooltip-open?] + (let [default-min 0 + default-max 1000 + common-range-opts {:min default-min :max default-max} + current-min (or (first current-filter-value) default-min) + current-max (or (second current-filter-value) default-max) + on-change-fn (fn [min-val max-val] + (rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|value + [(min min-val (dec default-max)) + (max max-val (inc default-min))]])) + on-min-change-fn (fn [new-min] + (let [new-max (max current-max (inc new-min))] + (on-change-fn new-min new-max))) + on-max-change-fn (fn [new-max] + (let [new-min (min current-min (dec new-max))] + (on-change-fn new-min new-max)))] + [:div + "$0 - $1000+" + [bounties-filter-tooltip-value-input "Min" tooltip-open? (merge common-range-opts + {:current-val current-min + :on-change-val on-min-change-fn})] + [bounties-filter-tooltip-value-input "Max" tooltip-open? (merge common-range-opts + {:current-val current-max + :on-change-val on-max-change-fn})]])) -(defn bounties-filter-tooltip-currency [tooltip-open?] +(defn bounties-filter-tooltip-currency [current-filter-value tooltip-open?] [:div.open-bounties-filter-list (for [t ["ETH" "SNT"]] - [:div.open-bounties-filter-list-option-checkbox - [:label - [:input - {:type "checkbox" - :on-focus #(reset! tooltip-open? true)}] - [:div.text t]]])]) + (let [active? (and current-filter-value (current-filter-value t))] + [:div.open-bounties-filter-list-option-checkbox + [:label + {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|currency + (cond + (and active? (= #{t} current-filter-value)) nil + active? (disj current-filter-value t) + :else (into #{t} current-filter-value))])} + [:input + {:type "checkbox" + :on-focus #(reset! tooltip-open? true)}] + [:div.text t]]]))]) -(defn bounties-filter-tooltip-date [] +(defn bounties-filter-tooltip-date [current-filter-value tooltip-open?] [:div.open-bounties-filter-list - (for [t ["Last week" "Last month" "Last 3 months"]] + (for [[option-type option-text] ui-model/bounty-filter-type-date-options-def] + ^{:key (str option-type)} [:div.open-bounties-filter-list-option - t])]) + (merge {:on-click #(do (rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|date + option-type]) + (reset! tooltip-open? false))} + (when (= option-type current-filter-value) + {:class "active"})) + option-text])]) -(defn bounties-filter-tooltip-owner [tooltip-open?] +(defn bounties-filter-tooltip-owner [current-filter-value tooltip-open?] [:div.open-bounties-filter-list (for [t ["status-im" "aragon"]] - [:div.open-bounties-filter-list-option-checkbox - [:label - [:input - {:type "checkbox" - :on-focus #(reset! tooltip-open? true)}] - [:div.text t]]])]) + (let [active? (and current-filter-value (current-filter-value t))] + [:div.open-bounties-filter-list-option-checkbox + [:label + {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|owner + (cond + (and active? (= #{t} current-filter-value)) nil + active? (disj current-filter-value t) + :else (into #{t} current-filter-value))])} + [:input + {:type "checkbox" + :on-focus #(reset! tooltip-open? true) + :checked (when active? "checked")}] + [:div.text t]]]))]) -(defn bounties-filter [name tooltip-content] +(defn- tooltip-view-for-filter-type [filter-type] + (condp = filter-type + ::ui-model/bounty-filter-type|value bounties-filter-tooltip-value + ::ui-model/bounty-filter-type|currency bounties-filter-tooltip-currency + ::ui-model/bounty-filter-type|date bounties-filter-tooltip-date + ::ui-model/bounty-filter-type|owner bounties-filter-tooltip-owner)) + +(defn bounty-filter-view [filter-type current-filter-value] (let [open? (r/atom false)] - (fn [name tooltip-content] + (fn [filter-type current-filter-value] [:div.open-bounties-filter-element-container {:tab-index 0 :on-focus #(reset! open? true) :on-blur #(reset! open? false)} [:div.open-bounties-filter-element {:on-mouse-down #(swap! open? not) - :class (when @open? "open-bounties-filter-element-active")} - name] + :class (when (or current-filter-value @open?) + "open-bounties-filter-element-active")} + [:div.text + (if current-filter-value + (ui-model/bounty-filter-value->short-text filter-type current-filter-value) + (ui-model/bounty-filter-type->name filter-type))] + (when current-filter-value + [:img.remove + {:src "bounty-filter-remove.svg" + :tab-index 0 + :on-focus #(.stopPropagation %) + :on-mouse-down (fn [e] + (.stopPropagation e) + (rf/dispatch [::handlers/set-open-bounty-filter-type filter-type nil]) + (reset! open? false))}])] (when @open? [bounties-filter-tooltip - [tooltip-content open?]])]))) + [(tooltip-view-for-filter-type filter-type) current-filter-value open?]])]))) -(defn bounties-filters [] - [:div.open-bounties-filter - [bounties-filter "Value" bounties-filter-tooltip-value] - [bounties-filter "Currency" bounties-filter-tooltip-currency] - [bounties-filter "Date" bounties-filter-tooltip-date] - [bounties-filter "Owner" bounties-filter-tooltip-owner]]) +(defn bounty-filters-view [] + (let [current-filters (rf/subscribe [::subs/open-bounties-filters])] + [:div.open-bounties-filter + ; doall because derefs are not supported in lazy seqs: https://github.com/reagent-project/reagent/issues/18 + (doall + (for [filter-type ui-model/bounty-filter-types] + ^{:key (str filter-type)} + [bounty-filter-view + filter-type + (get @current-filters filter-type)]))])) (defn bounties-sort [] (let [open? (r/atom false)] (fn [] - (let [current-sorting (rf/subscribe [::db/bounty-sorting-type])] + (let [current-sorting (rf/subscribe [::subs/open-bounties-sorting-type])] [:div.open-bounties-sort {:tab-index 0 :on-blur #(reset! open? false)} [:div.open-bounties-sort-element {:on-click #(swap! open? not)} - (db/bounty-sorting-types @current-sorting) + (ui-model/bounty-sorting-types-def @current-sorting) [:div.icon-forward-white-box [:img {:src "icon-forward-white.svg"}]]] (when @open? [:div.open-bounties-sort-element-tooltip - (for [[sorting-type sorting-name] db/bounty-sorting-types] + (for [[sorting-type sorting-name] ui-model/bounty-sorting-types-def] + ^{:key (str sorting-type)} [:div.open-bounties-sort-type {:on-click #(do (reset! open? false) - (rf/dispatch [::handlers/set-bounty-sorting-type sorting-type]))} + (rf/dispatch [::handlers/set-open-bounties-sorting-type sorting-type]))} sorting-name])])])))) (defn bounties-list [open-bounties] [:div.ui.container.open-bounties-container [:div.open-bounties-header "Bounties"] [:div.open-bounties-filter-and-sort - [bounties-filters] + [bounty-filters-view] [bounties-sort]] (if (empty? open-bounties) [:div.view-no-data-container diff --git a/src/cljs/commiteth/db.cljs b/src/cljs/commiteth/db.cljs index e54bcd1..39e8f11 100644 --- a/src/cljs/commiteth/db.cljs +++ b/src/cljs/commiteth/db.cljs @@ -1,19 +1,19 @@ -(ns commiteth.db) - -(def bounty-sorting-types {::bounty-sorting-type|most-recent "Most recent" - ::bounty-sorting-type|lowest-value "Lowest value" - ::bounty-sorting-type|highest-value "Highest value" - ::bounty-sorting-type|owner "Owner"}) +(ns commiteth.db + (:require [commiteth.ui-model :as ui-model])) (def default-db - {:page :bounties - :user nil - :repos-loading? false - :repos {} - :activity-feed-loading? false - :open-bounties-loading? false - :open-bounties [] - :owner-bounties {} - :top-hunters [] - :activity-feed [] - ::bounty-sorting-type ::bounty-sorting-type|most-recent}) + {:page :bounties + :user nil + :repos-loading? false + :repos {} + :activity-feed-loading? false + :open-bounties-loading? false + :open-bounties [] + ::open-bounties-sorting-type ::ui-model/bounty-sorting-type|most-recent + ::open-bounties-filters {::ui-model/bounty-filter-type|value nil + ::ui-model/bounty-filter-type|currency nil + ::ui-model/bounty-filter-type|date nil + ::ui-model/bounty-filter-type|owner nil} + :owner-bounties {} + :top-hunters [] + :activity-feed []}) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index b69f1ca..ef183be 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -455,6 +455,11 @@ (assoc db :user-dropdown-open? false))) (reg-event-db - ::set-bounty-sorting-type + ::set-open-bounties-sorting-type (fn [db [_ sorting-type]] - (assoc db ::db/bounty-sorting-type sorting-type))) + (assoc db ::db/open-bounties-sorting-type sorting-type))) + +(reg-event-db + ::set-open-bounty-filter-type + (fn [db [_ filter-type filter-value]] + (assoc-in db [::db/open-bounties-filters filter-type] filter-value))) diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index c6d4340..f9ef6b5 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -83,6 +83,11 @@ (:user-dropdown-open? db))) (reg-sub - ::db/bounty-sorting-type + ::open-bounties-sorting-type (fn [db _] - (::db/bounty-sorting-type db))) + (::db/open-bounties-sorting-type db))) + +(reg-sub + ::open-bounties-filters + (fn [db _] + (::db/open-bounties-filters db))) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs new file mode 100644 index 0000000..e274297 --- /dev/null +++ b/src/cljs/commiteth/ui_model.cljs @@ -0,0 +1,44 @@ +(ns commiteth.ui-model) + +;;;; bounty sorting types + +(def bounty-sorting-types-def {::bounty-sorting-type|most-recent "Most recent" + ::bounty-sorting-type|lowest-value "Lowest value" + ::bounty-sorting-type|highest-value "Highest value" + ::bounty-sorting-type|owner "Owner"}) + +;;;; bounty filter types + +(def bounty-filter-types-def {::bounty-filter-type|value "Value" + ::bounty-filter-type|currency "Currency" + ::bounty-filter-type|date "Date" + ::bounty-filter-type|owner "Owner"}) + +(def bounty-filter-types (keys bounty-filter-types-def)) + +(defn bounty-filter-type->name [filter-type] + (bounty-filter-types-def filter-type)) + +(def bounty-filter-type-date-options-def {::bounty-filter-type-date-option|last-week "Last week" + ::bounty-filter-type-date-option|last-month "Last month" + ::bounty-filter-type-date-option|last-3-months "Last 3 months"}) + +(def bounty-filter-type-date-options (keys bounty-filter-type-date-options-def)) + +(defn bounty-filter-type-date-option->name [option] + (bounty-filter-type-date-options-def option)) + +(defn bounty-filter-value->short-text [filter-type filter-value] + (cond + (= filter-type ::bounty-filter-type|date) + (bounty-filter-type-date-option->name filter-value) + + (#{::bounty-filter-type|owner + ::bounty-filter-type|currency} filter-type) + (str (bounty-filter-type->name filter-type) " (" (count filter-value) ")") + + (= filter-type ::bounty-filter-type|value) + (str "$" (first filter-value) "-$" (second filter-value)) + + :else + (str filter-type " with val " filter-value))) diff --git a/src/less/style.less b/src/less/style.less index 4e4b05e..669db74 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -430,18 +430,29 @@ font-weight: 500; line-height: 1.0; color: #8d99a4; - padding: 8px 12px; + //padding: 8px 12px; border-radius: 8px; border: solid 1px rgba(151, 151, 151, 0.2); margin-right: 10px; position: relative; + display: flex; + + .text { + margin: 8px 12px; + } + + .remove { + margin-left: -6px; + margin-right: 5px; + } } .open-bounties-filter-element:hover { cursor: pointer; } - .open-bounties-filter-element-active { + .open-bounties-filter-element-active + { background-color: #57a7ed; color: #ffffff; } @@ -582,6 +593,11 @@ border: solid 1px rgba(151, 151, 151, 0.2); } + .open-bounties-filter-list-option.active { + background-color: #57a7ed; + color: #ffffff; + } + .open-bounties-filter-list-option:not(:first-child) { margin-top: 8px; } From 4563781192856026ba284f94334d06ee704c727d Mon Sep 17 00:00:00 2001 From: pablodip Date: Sat, 20 Jan 2018 10:49:07 +0100 Subject: [PATCH 07/63] take some filter options from open bounties --- src/cljs/commiteth/bounties.cljs | 64 ++++++++++++++------------- src/cljs/commiteth/subscriptions.cljs | 19 ++++++++ src/less/style.less | 1 + 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 83aa4f3..ffd3162 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -92,21 +92,22 @@ :on-change-val on-max-change-fn})]])) (defn bounties-filter-tooltip-currency [current-filter-value tooltip-open?] - [:div.open-bounties-filter-list - (for [t ["ETH" "SNT"]] - (let [active? (and current-filter-value (current-filter-value t))] - [:div.open-bounties-filter-list-option-checkbox - [:label - {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|currency - (cond - (and active? (= #{t} current-filter-value)) nil - active? (disj current-filter-value t) - :else (into #{t} current-filter-value))])} - [:input - {:type "checkbox" - :on-focus #(reset! tooltip-open? true)}] - [:div.text t]]]))]) + (let [currencies (rf/subscribe [::subs/open-bounties-currencies])] + [:div.open-bounties-filter-list + (for [currency @currencies] + (let [active? (and current-filter-value (current-filter-value currency))] + [:div.open-bounties-filter-list-option-checkbox + [:label + {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|currency + (cond + (and active? (= #{currency} current-filter-value)) nil + active? (disj current-filter-value currency) + :else (into #{currency} current-filter-value))])} + [:input + {:type "checkbox" + :on-focus #(reset! tooltip-open? true)}] + [:div.text currency]]]))])) (defn bounties-filter-tooltip-date [current-filter-value tooltip-open?] [:div.open-bounties-filter-list @@ -122,22 +123,23 @@ option-text])]) (defn bounties-filter-tooltip-owner [current-filter-value tooltip-open?] - [:div.open-bounties-filter-list - (for [t ["status-im" "aragon"]] - (let [active? (and current-filter-value (current-filter-value t))] - [:div.open-bounties-filter-list-option-checkbox - [:label - {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|owner - (cond - (and active? (= #{t} current-filter-value)) nil - active? (disj current-filter-value t) - :else (into #{t} current-filter-value))])} - [:input - {:type "checkbox" - :on-focus #(reset! tooltip-open? true) - :checked (when active? "checked")}] - [:div.text t]]]))]) + (let [owners (rf/subscribe [::subs/open-bounties-owners])] + [:div.open-bounties-filter-list + (for [owner @owners] + (let [active? (and current-filter-value (current-filter-value owner))] + [:div.open-bounties-filter-list-option-checkbox + [:label + {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|owner + (cond + (and active? (= #{owner} current-filter-value)) nil + active? (disj current-filter-value owner) + :else (into #{owner} current-filter-value))])} + [:input + {:type "checkbox" + :on-focus #(reset! tooltip-open? true) + :checked (when active? "checked")}] + [:div.text owner]]]))])) (defn- tooltip-view-for-filter-type [filter-type] (condp = filter-type diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index f9ef6b5..7ad64f9 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -91,3 +91,22 @@ ::open-bounties-filters (fn [db _] (::db/open-bounties-filters db))) + +(reg-sub + ::open-bounties-owners + :<- [:open-bounties] + (fn [open-bounties _] + (->> open-bounties + (map :repo-owner) + set))) + +(reg-sub + ::open-bounties-currencies + :<- [:open-bounties] + (fn [open-bounties _] + (let [token-ids (->> open-bounties + (map :tokens) + (map keys) + (filter identity) + set)] + (into #{"ETH"} token-ids)))) diff --git a/src/less/style.less b/src/less/style.less index 669db74..20de0c3 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -472,6 +472,7 @@ font-family: "PostGrotesk-Book"; font-size: 16px; line-height: 1.5; + z-index: 999; .open-bounties-filter-element-tooltip-value-input-container { display: flex; From d470b3aea34cf3e53d8c90512fccbf1b67a8a339 Mon Sep 17 00:00:00 2001 From: pablodip Date: Sun, 21 Jan 2018 08:06:09 +0100 Subject: [PATCH 08/63] zindex --- src/less/style.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/less/style.less b/src/less/style.less index 20de0c3..7ef8658 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -675,6 +675,7 @@ line-height: 1.0; text-align: left; color: #ffffff; + z-index: 999; } .open-bounties-sort-type { From 09cd84a89b527809a78f1938bbd6796c06be5109 Mon Sep 17 00:00:00 2001 From: pablodip Date: Sun, 21 Jan 2018 10:27:32 +0100 Subject: [PATCH 09/63] sorting behaviour --- src/clj/commiteth/routes/services.clj | 3 ++- src/cljs/commiteth/bounties.cljs | 8 +++---- src/cljs/commiteth/subscriptions.cljs | 31 +++++++++++++++++-------- src/cljs/commiteth/ui_model.cljs | 33 +++++++++++++++++++++++---- 4 files changed, 56 insertions(+), 19 deletions(-) diff --git a/src/clj/commiteth/routes/services.clj b/src/clj/commiteth/routes/services.clj index 82c5633..6a60fec 100644 --- a/src/clj/commiteth/routes/services.clj +++ b/src/clj/commiteth/routes/services.clj @@ -155,7 +155,8 @@ :value_usd :value-usd :claim_count :claim-count :balance_eth :balance-eth - :user_has_address :user-has-address}] + :user_has_address :user-has-address + :created_at :created-at}] (map #(-> % (rename-keys renames) (update :value-usd usd-decimal->str) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index ffd3162..5169598 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -196,19 +196,19 @@ :on-blur #(reset! open? false)} [:div.open-bounties-sort-element {:on-click #(swap! open? not)} - (ui-model/bounty-sorting-types-def @current-sorting) + (ui-model/bounty-sorting-type->name @current-sorting) [:div.icon-forward-white-box [:img {:src "icon-forward-white.svg"}]]] (when @open? [:div.open-bounties-sort-element-tooltip - (for [[sorting-type sorting-name] ui-model/bounty-sorting-types-def] + (for [sorting-type (keys ui-model/bounty-sorting-types-def)] ^{:key (str sorting-type)} [:div.open-bounties-sort-type {:on-click #(do (reset! open? false) (rf/dispatch [::handlers/set-open-bounties-sorting-type sorting-type]))} - sorting-name])])])))) + (ui-model/bounty-sorting-type->name sorting-type)])])])))) (defn bounties-list [open-bounties] [:div.ui.container.open-bounties-container @@ -225,7 +225,7 @@ (defn bounties-page [] - (let [open-bounties (rf/subscribe [:open-bounties]) + (let [open-bounties (rf/subscribe [::subs/filtered-and-sorted-open-bounties]) open-bounties-loading? (rf/subscribe [:get-in [:open-bounties-loading?]])] (fn [] (if @open-bounties-loading? diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index 7ad64f9..d91f770 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -1,10 +1,11 @@ (ns commiteth.subscriptions (:require [re-frame.core :refer [reg-sub]] - [commiteth.db :as db])) + [commiteth.db :as db] + [commiteth.ui-model :as ui-model])) (reg-sub - :db - (fn [db _] db)) + :db + (fn [db _] db)) (reg-sub :page @@ -68,17 +69,17 @@ (get-in db path))) (reg-sub - :usage-metrics - (fn [db _] - (:usage-metrics db))) + :usage-metrics + (fn [db _] + (:usage-metrics db))) (reg-sub - :metrics-loading? - (fn [db _] - (:metrics-loading? db))) + :metrics-loading? + (fn [db _] + (:metrics-loading? db))) (reg-sub - :user-dropdown-open? + :user-dropdown-open? (fn [db _] (:user-dropdown-open? db))) @@ -110,3 +111,13 @@ (filter identity) set)] (into #{"ETH"} token-ids)))) + +(reg-sub + ::filtered-and-sorted-open-bounties + :<- [:open-bounties] + :<- [::open-bounties-sorting-type] + (fn [[open-bounties sorting-type] _] + (println "RAW" open-bounties) + (cond->> open-bounties + sorting-type (ui-model/sort-bounties-by-sorting-type sorting-type) + ))) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index e274297..39dc764 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -2,10 +2,35 @@ ;;;; bounty sorting types -(def bounty-sorting-types-def {::bounty-sorting-type|most-recent "Most recent" - ::bounty-sorting-type|lowest-value "Lowest value" - ::bounty-sorting-type|highest-value "Highest value" - ::bounty-sorting-type|owner "Owner"}) +(def bounty-sorting-types-def + {::bounty-sorting-type|most-recent {::bounty-sorting-type.name "Most recent" + ::bounty-sorting-type.sort-key-fn (fn [bounty] + (:created-at bounty)) + ::bounty-sorting-type.sort-comparator-fn compare} + ::bounty-sorting-type|lowest-value {::bounty-sorting-type.name "Lowest value" + ::bounty-sorting-type.sort-key-fn (fn [bounty] + (:value-usd bounty)) + ::bounty-sorting-type.sort-comparator-fn compare} + ::bounty-sorting-type|highest-value {::bounty-sorting-type.name "Highest value" + ::bounty-sorting-type.sort-key-fn (fn [bounty] + (:value-usd bounty)) + ::bounty-sorting-type.sort-comparator-fn (comp - compare)} + ::bounty-sorting-type|owner {::bounty-sorting-type.name "Owner" + ::bounty-sorting-type.sort-key-fn (fn [bounty] + (:repo-owner bounty)) + ::bounty-sorting-type.sort-comparator-fn compare}}) + +(defn bounty-sorting-type->name [sorting-type] + (-> bounty-sorting-types-def (get sorting-type) ::bounty-sorting-type.name)) + +(defn sort-bounties-by-sorting-type [sorting-type bounties] + (let [keyfn (-> bounty-sorting-types-def + sorting-type + ::bounty-sorting-type.sort-key-fn) + comparator (-> bounty-sorting-types-def + sorting-type + ::bounty-sorting-type.sort-comparator-fn)] + (sort-by keyfn comparator bounties))) ;;;; bounty filter types From d937bf361daff7bc534ab6c69c9cab2643f5eb43 Mon Sep 17 00:00:00 2001 From: pablodip Date: Mon, 22 Jan 2018 12:21:04 +0100 Subject: [PATCH 10/63] fix ui checkbox checked and start filtering --- src/cljs/commiteth/bounties.cljs | 11 ++++--- src/cljs/commiteth/subscriptions.cljs | 10 +++---- src/cljs/commiteth/ui_model.cljs | 42 +++++++++++++++++++++------ 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 5169598..cfb5f57 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -95,7 +95,8 @@ (let [currencies (rf/subscribe [::subs/open-bounties-currencies])] [:div.open-bounties-filter-list (for [currency @currencies] - (let [active? (and current-filter-value (current-filter-value currency))] + (let [active? (boolean (and current-filter-value (current-filter-value currency)))] + ^{:key (str currency)} [:div.open-bounties-filter-list-option-checkbox [:label {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type @@ -106,6 +107,7 @@ :else (into #{currency} current-filter-value))])} [:input {:type "checkbox" + :checked active? :on-focus #(reset! tooltip-open? true)}] [:div.text currency]]]))])) @@ -126,7 +128,8 @@ (let [owners (rf/subscribe [::subs/open-bounties-owners])] [:div.open-bounties-filter-list (for [owner @owners] - (let [active? (and current-filter-value (current-filter-value owner))] + (let [active? (boolean (and current-filter-value (current-filter-value owner)))] + ^{:key (str owner)} [:div.open-bounties-filter-list-option-checkbox [:label {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type @@ -137,8 +140,8 @@ :else (into #{owner} current-filter-value))])} [:input {:type "checkbox" - :on-focus #(reset! tooltip-open? true) - :checked (when active? "checked")}] + :checked active? + :on-focus #(reset! tooltip-open? true)}] [:div.text owner]]]))])) (defn- tooltip-view-for-filter-type [filter-type] diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index d91f770..eadb318 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -107,7 +107,7 @@ (fn [open-bounties _] (let [token-ids (->> open-bounties (map :tokens) - (map keys) + (mapcat keys) (filter identity) set)] (into #{"ETH"} token-ids)))) @@ -115,9 +115,9 @@ (reg-sub ::filtered-and-sorted-open-bounties :<- [:open-bounties] + :<- [::open-bounties-filters] :<- [::open-bounties-sorting-type] - (fn [[open-bounties sorting-type] _] - (println "RAW" open-bounties) + (fn [[open-bounties filters sorting-type] _] (cond->> open-bounties - sorting-type (ui-model/sort-bounties-by-sorting-type sorting-type) - ))) + filters (ui-model/filter-bounties filters) + sorting-type (ui-model/sort-bounties-by-sorting-type sorting-type)))) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 39dc764..75f1c6f 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -1,4 +1,5 @@ -(ns commiteth.ui-model) +(ns commiteth.ui-model + (:require [clojure.set :as set])) ;;;; bounty sorting types @@ -24,9 +25,9 @@ (-> bounty-sorting-types-def (get sorting-type) ::bounty-sorting-type.name)) (defn sort-bounties-by-sorting-type [sorting-type bounties] - (let [keyfn (-> bounty-sorting-types-def - sorting-type - ::bounty-sorting-type.sort-key-fn) + (let [keyfn (-> bounty-sorting-types-def + sorting-type + ::bounty-sorting-type.sort-key-fn) comparator (-> bounty-sorting-types-def sorting-type ::bounty-sorting-type.sort-comparator-fn)] @@ -34,15 +35,27 @@ ;;;; bounty filter types -(def bounty-filter-types-def {::bounty-filter-type|value "Value" - ::bounty-filter-type|currency "Currency" - ::bounty-filter-type|date "Date" - ::bounty-filter-type|owner "Owner"}) +(def bounty-filter-types-def + {::bounty-filter-type|value {::bounty-filter-type.name "Value" + ::bounty-filter-type.predicate (fn [filter-value bounty] + true)} + ::bounty-filter-type|currency {::bounty-filter-type.name "Currency" + ::bounty-filter-type.predicate (fn [filter-value bounty] + (and (or (not-any? #{"ETH"} filter-value) + (< 0 (:balance-eth bounty))) + (set/subset? (->> filter-value (remove #{"ETH"}) set) + (-> bounty :tokens keys set))))} + ::bounty-filter-type|date {::bounty-filter-type.name "Date" + ::bounty-filter-type.predicate (fn [filter-value bounty] + true)} + ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" + ::bounty-filter-type.predicate (fn [filter-value bounty] + true)}}) (def bounty-filter-types (keys bounty-filter-types-def)) (defn bounty-filter-type->name [filter-type] - (bounty-filter-types-def filter-type)) + (-> bounty-filter-types-def (get filter-type) ::bounty-filter-type.name)) (def bounty-filter-type-date-options-def {::bounty-filter-type-date-option|last-week "Last week" ::bounty-filter-type-date-option|last-month "Last month" @@ -67,3 +80,14 @@ :else (str filter-type " with val " filter-value))) + +(defn filter-bounties [filters-by-type bounties] + (let [filter-preds (->> filters-by-type + (remove #(nil? (val %))) + (map (fn [[filter-type filter-value]] + (let [pred (-> bounty-filter-types-def (get filter-type) ::bounty-filter-type.predicate)] + (partial pred filter-value))))) + filters-pred (fn [bounty] + (every? #(% bounty) filter-preds))] + (->> bounties + (filter filters-pred)))) From 12edb1abc60226b05beb8030d0a7ac2436c2ebd0 Mon Sep 17 00:00:00 2001 From: pablodip Date: Tue, 23 Jan 2018 17:48:45 +0100 Subject: [PATCH 11/63] some fixes and behaviours of sort and filter --- src/cljs/commiteth/bounties.cljs | 8 ++++---- src/cljs/commiteth/ui_model.cljs | 26 ++++++++++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index cfb5f57..b4bb03c 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -74,13 +74,13 @@ on-change-fn (fn [min-val max-val] (rf/dispatch [::handlers/set-open-bounty-filter-type ::ui-model/bounty-filter-type|value - [(min min-val (dec default-max)) - (max max-val (inc default-min))]])) + [(min min-val default-max) + (max max-val default-min)]])) on-min-change-fn (fn [new-min] - (let [new-max (max current-max (inc new-min))] + (let [new-max (max current-max (min default-max new-min))] (on-change-fn new-min new-max))) on-max-change-fn (fn [new-max] - (let [new-min (min current-min (dec new-max))] + (let [new-min (min current-min (max default-min new-max))] (on-change-fn new-min new-max)))] [:div "$0 - $1000+" diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 75f1c6f..75e9c3c 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -1,5 +1,8 @@ (ns commiteth.ui-model - (:require [clojure.set :as set])) + (:require [clojure.set :as set] + [cljs-time.core :as t] + [cljs-time.coerce :as t-coerce] + [cljs-time.format :as t-format])) ;;;; bounty sorting types @@ -10,11 +13,11 @@ ::bounty-sorting-type.sort-comparator-fn compare} ::bounty-sorting-type|lowest-value {::bounty-sorting-type.name "Lowest value" ::bounty-sorting-type.sort-key-fn (fn [bounty] - (:value-usd bounty)) + (js/parseFloat (:value-usd bounty))) ::bounty-sorting-type.sort-comparator-fn compare} ::bounty-sorting-type|highest-value {::bounty-sorting-type.name "Highest value" ::bounty-sorting-type.sort-key-fn (fn [bounty] - (:value-usd bounty)) + (js/parseFloat (:value-usd bounty))) ::bounty-sorting-type.sort-comparator-fn (comp - compare)} ::bounty-sorting-type|owner {::bounty-sorting-type.name "Owner" ::bounty-sorting-type.sort-key-fn (fn [bounty] @@ -38,7 +41,9 @@ (def bounty-filter-types-def {::bounty-filter-type|value {::bounty-filter-type.name "Value" ::bounty-filter-type.predicate (fn [filter-value bounty] - true)} + (let [min-val (first filter-value) + max-val (second filter-value)] + (<= min-val (:value-usd bounty) max-val)))} ::bounty-filter-type|currency {::bounty-filter-type.name "Currency" ::bounty-filter-type.predicate (fn [filter-value bounty] (and (or (not-any? #{"ETH"} filter-value) @@ -47,10 +52,19 @@ (-> bounty :tokens keys set))))} ::bounty-filter-type|date {::bounty-filter-type.name "Date" ::bounty-filter-type.predicate (fn [filter-value bounty] - true)} + (when-let [created-at-inst (:created-at bounty)] + (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long) + filter-from (condp = filter-value + ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) + ::bounty-filter-type-date-option|last-month (t/minus (t/now) (t/months 1)) + ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3))) + interval (t/interval filter-from (t/now))] + (t/within? interval created-at-date))))} ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" ::bounty-filter-type.predicate (fn [filter-value bounty] - true)}}) + (->> filter-value + (some #{(:repo-owner bounty)}) + boolean))}}) (def bounty-filter-types (keys bounty-filter-types-def)) From 27442937cf94f4a50825264978ff5e89b013da6a Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 24 Jan 2018 09:46:51 +0100 Subject: [PATCH 12/63] fix firefox behaviour when removing filters and with checkbox filters --- src/cljs/commiteth/bounties.cljs | 38 ++++++++++++++++++-------------- src/less/style.less | 8 +++++++ 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index b4bb03c..c07576d 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -99,12 +99,15 @@ ^{:key (str currency)} [:div.open-bounties-filter-list-option-checkbox [:label - {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|currency - (cond - (and active? (= #{currency} current-filter-value)) nil - active? (disj current-filter-value currency) - :else (into #{currency} current-filter-value))])} + {:on-click #(do (println "label on-click") + (rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|currency + (cond + (and active? (= #{currency} current-filter-value)) nil + active? (disj current-filter-value currency) + :else (into #{currency} current-filter-value))])) + :tab-index 0 + :on-focus #(do (.stopPropagation %) (reset! tooltip-open? true))} [:input {:type "checkbox" :checked active? @@ -137,7 +140,9 @@ (cond (and active? (= #{owner} current-filter-value)) nil active? (disj current-filter-value owner) - :else (into #{owner} current-filter-value))])} + :else (into #{owner} current-filter-value))]) + :tab-index 0 + :on-focus #(do (.stopPropagation %) (reset! tooltip-open? true))} [:input {:type "checkbox" :checked active? @@ -159,7 +164,7 @@ :on-focus #(reset! open? true) :on-blur #(reset! open? false)} [:div.open-bounties-filter-element - {:on-mouse-down #(swap! open? not) + {:on-mouse-down #(do (println "element on-mouse-down") (swap! open? not)) :class (when (or current-filter-value @open?) "open-bounties-filter-element-active")} [:div.text @@ -167,14 +172,15 @@ (ui-model/bounty-filter-value->short-text filter-type current-filter-value) (ui-model/bounty-filter-type->name filter-type))] (when current-filter-value - [:img.remove - {:src "bounty-filter-remove.svg" - :tab-index 0 - :on-focus #(.stopPropagation %) - :on-mouse-down (fn [e] - (.stopPropagation e) - (rf/dispatch [::handlers/set-open-bounty-filter-type filter-type nil]) - (reset! open? false))}])] + [:div.remove-container + {:tab-index 0 + :on-focus #(.stopPropagation %)} + [:img.remove + {:src "bounty-filter-remove.svg" + :on-mouse-down (fn [e] + (.stopPropagation e) + (rf/dispatch [::handlers/set-open-bounty-filter-type filter-type nil]) + (reset! open? false))}]])] (when @open? [bounties-filter-tooltip [(tooltip-view-for-filter-type filter-type) current-filter-value open?]])]))) diff --git a/src/less/style.less b/src/less/style.less index 7ef8658..68ed6f5 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -441,6 +441,10 @@ margin: 8px 12px; } + .remove-container { + display: flex; + } + .remove { margin-left: -6px; margin-right: 5px; @@ -618,6 +622,10 @@ cursor: pointer; } + label:focus { + outline: none; + } + input { background: green; transform: scale(1.3); From 561232d6e2b90431f1088a8fd4d4ce882e1aa2ba Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 24 Jan 2018 09:49:21 +0100 Subject: [PATCH 13/63] remove printlns and fix chrome remove filter style --- src/cljs/commiteth/bounties.cljs | 15 +++++++-------- src/less/style.less | 1 + 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index c07576d..a701762 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -99,13 +99,12 @@ ^{:key (str currency)} [:div.open-bounties-filter-list-option-checkbox [:label - {:on-click #(do (println "label on-click") - (rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|currency - (cond - (and active? (= #{currency} current-filter-value)) nil - active? (disj current-filter-value currency) - :else (into #{currency} current-filter-value))])) + {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type + ::ui-model/bounty-filter-type|currency + (cond + (and active? (= #{currency} current-filter-value)) nil + active? (disj current-filter-value currency) + :else (into #{currency} current-filter-value))]) :tab-index 0 :on-focus #(do (.stopPropagation %) (reset! tooltip-open? true))} [:input @@ -164,7 +163,7 @@ :on-focus #(reset! open? true) :on-blur #(reset! open? false)} [:div.open-bounties-filter-element - {:on-mouse-down #(do (println "element on-mouse-down") (swap! open? not)) + {:on-mouse-down #(swap! open? not) :class (when (or current-filter-value @open?) "open-bounties-filter-element-active")} [:div.text diff --git a/src/less/style.less b/src/less/style.less index 68ed6f5..5977c85 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -616,6 +616,7 @@ .open-bounties-filter-list-option-checkbox { label { display: flex; + align-items: baseline; } label:hover { From fdec3ad56bc4430d7dbc62f8a28314f9ecff930e Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 08:28:48 +0100 Subject: [PATCH 14/63] abstracting filter type category --- src/cljs/commiteth/bounties.cljs | 103 +++++++++++++------------------ src/cljs/commiteth/ui_model.cljs | 43 ++++++++----- 2 files changed, 70 insertions(+), 76 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index a701762..b034495 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -47,10 +47,6 @@ [:div.ui.tiny.circular.image [:img {:src avatar-url}]]]])) -(defn bounties-filter-tooltip [content] - [:div.open-bounties-filter-element-tooltip - content]) - (defn bounties-filter-tooltip-value-input [label tooltip-open? opts] [:div.open-bounties-filter-element-tooltip-value-input-container [:div.:input.open-bounties-filter-element-tooltip-value-input-label @@ -65,15 +61,15 @@ #(-> % .-target .-value int f)) :on-focus #(reset! tooltip-open? true)}]]) -(defn bounties-filter-tooltip-value [current-filter-value tooltip-open?] - (let [default-min 0 - default-max 1000 +(defn bounties-filter-tooltip-category-range [filter-type filter-type-def current-filter-value tooltip-open?] + (let [default-min (::ui-model/bounty-filter-type.min-val filter-type-def) + default-max (::ui-model/bounty-filter-type.max-val filter-type-def) common-range-opts {:min default-min :max default-max} current-min (or (first current-filter-value) default-min) current-max (or (second current-filter-value) default-max) on-change-fn (fn [min-val max-val] (rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|value + filter-type [(min min-val default-max) (max max-val default-min)]])) on-min-change-fn (fn [new-min] @@ -91,80 +87,66 @@ {:current-val current-max :on-change-val on-max-change-fn})]])) -(defn bounties-filter-tooltip-currency [current-filter-value tooltip-open?] - (let [currencies (rf/subscribe [::subs/open-bounties-currencies])] - [:div.open-bounties-filter-list - (for [currency @currencies] - (let [active? (boolean (and current-filter-value (current-filter-value currency)))] - ^{:key (str currency)} - [:div.open-bounties-filter-list-option-checkbox - [:label - {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|currency - (cond - (and active? (= #{currency} current-filter-value)) nil - active? (disj current-filter-value currency) - :else (into #{currency} current-filter-value))]) - :tab-index 0 - :on-focus #(do (.stopPropagation %) (reset! tooltip-open? true))} - [:input - {:type "checkbox" - :checked active? - :on-focus #(reset! tooltip-open? true)}] - [:div.text currency]]]))])) - -(defn bounties-filter-tooltip-date [current-filter-value tooltip-open?] +(defn bounties-filter-tooltip-category-single-static-option + [filter-type filter-type-def current-filter-value tooltip-open?] [:div.open-bounties-filter-list - (for [[option-type option-text] ui-model/bounty-filter-type-date-options-def] + (for [[option-type option-text] (::ui-model/bounty-filter-type.options filter-type-def)] ^{:key (str option-type)} [:div.open-bounties-filter-list-option (merge {:on-click #(do (rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|date + filter-type option-type]) (reset! tooltip-open? false))} (when (= option-type current-filter-value) {:class "active"})) option-text])]) -(defn bounties-filter-tooltip-owner [current-filter-value tooltip-open?] - (let [owners (rf/subscribe [::subs/open-bounties-owners])] +(defn bounties-filter-tooltip-category-multiple-dynamic-options + [filter-type filter-type-def current-filter-value tooltip-open?] + (let [options (rf/subscribe [(::ui-model/bounty-filter-type.re-frame-subscription-key-for-options filter-type-def)])] [:div.open-bounties-filter-list - (for [owner @owners] - (let [active? (boolean (and current-filter-value (current-filter-value owner)))] - ^{:key (str owner)} + (for [option @options] + (let [active? (boolean (and current-filter-value (current-filter-value option)))] + ^{:key (str option)} [:div.open-bounties-filter-list-option-checkbox [:label - {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type - ::ui-model/bounty-filter-type|owner - (cond - (and active? (= #{owner} current-filter-value)) nil - active? (disj current-filter-value owner) - :else (into #{owner} current-filter-value))]) + {:on-click #(rf/dispatch [::handlers/set-open-bounty-filter-type + filter-type + (cond + (and active? (= #{option} current-filter-value)) nil + active? (disj current-filter-value option) + :else (into #{option} current-filter-value))]) :tab-index 0 :on-focus #(do (.stopPropagation %) (reset! tooltip-open? true))} [:input {:type "checkbox" :checked active? :on-focus #(reset! tooltip-open? true)}] - [:div.text owner]]]))])) + [:div.text option]]]))])) -(defn- tooltip-view-for-filter-type [filter-type] - (condp = filter-type - ::ui-model/bounty-filter-type|value bounties-filter-tooltip-value - ::ui-model/bounty-filter-type|currency bounties-filter-tooltip-currency - ::ui-model/bounty-filter-type|date bounties-filter-tooltip-date - ::ui-model/bounty-filter-type|owner bounties-filter-tooltip-owner)) +(defn bounties-filter-tooltip [filter-type filter-type-def current-filter-val tooltip-open?] + [:div.open-bounties-filter-element-tooltip + (let [compo (condp = (::ui-model/bounty-filter-type.category filter-type-def) + ::ui-model/bounty-filter-type-category|single-static-option + bounties-filter-tooltip-category-single-static-option + + ::ui-model/bounty-filter-type-category|multiple-dynamic-options + bounties-filter-tooltip-category-multiple-dynamic-options + + ::ui-model/bounty-filter-type-category|range + bounties-filter-tooltip-category-range)] + (compo filter-type filter-type-def current-filter-val tooltip-open?))]) (defn bounty-filter-view [filter-type current-filter-value] - (let [open? (r/atom false)] + (let [tooltip-open? (r/atom false)] (fn [filter-type current-filter-value] [:div.open-bounties-filter-element-container {:tab-index 0 - :on-focus #(reset! open? true) - :on-blur #(reset! open? false)} + :on-focus #(reset! tooltip-open? true) + :on-blur #(reset! tooltip-open? false)} [:div.open-bounties-filter-element - {:on-mouse-down #(swap! open? not) - :class (when (or current-filter-value @open?) + {:on-mouse-down #(swap! tooltip-open? not) + :class (when (or current-filter-value @tooltip-open?) "open-bounties-filter-element-active")} [:div.text (if current-filter-value @@ -179,10 +161,13 @@ :on-mouse-down (fn [e] (.stopPropagation e) (rf/dispatch [::handlers/set-open-bounty-filter-type filter-type nil]) - (reset! open? false))}]])] - (when @open? + (reset! tooltip-open? false))}]])] + (when @tooltip-open? [bounties-filter-tooltip - [(tooltip-view-for-filter-type filter-type) current-filter-value open?]])]))) + filter-type + (ui-model/bounty-filter-types-def filter-type) + current-filter-value + tooltip-open?])]))) (defn bounty-filters-view [] (let [current-filters (rf/subscribe [::subs/open-bounties-filters])] diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 75e9c3c..e85e925 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -38,19 +38,32 @@ ;;;; bounty filter types +(def bounty-filter-type-date-options-def {::bounty-filter-type-date-option|last-week "Last week" + ::bounty-filter-type-date-option|last-month "Last month" + ::bounty-filter-type-date-option|last-3-months "Last 3 months"}) + +(def bounty-filter-type-date-options (keys bounty-filter-type-date-options-def)) + (def bounty-filter-types-def {::bounty-filter-type|value {::bounty-filter-type.name "Value" + ::bounty-filter-type.category ::bounty-filter-type-category|range + ::bounty-filter-type.min-val 0 + ::bounty-filter-type.max-val 1000 ::bounty-filter-type.predicate (fn [filter-value bounty] (let [min-val (first filter-value) max-val (second filter-value)] (<= min-val (:value-usd bounty) max-val)))} - ::bounty-filter-type|currency {::bounty-filter-type.name "Currency" - ::bounty-filter-type.predicate (fn [filter-value bounty] - (and (or (not-any? #{"ETH"} filter-value) - (< 0 (:balance-eth bounty))) - (set/subset? (->> filter-value (remove #{"ETH"}) set) - (-> bounty :tokens keys set))))} + ::bounty-filter-type|currency {::bounty-filter-type.name "Currency" + ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options + ::bounty-filter-type.re-frame-subscription-key-for-options :commiteth.subscriptions/open-bounties-currencies + ::bounty-filter-type.predicate (fn [filter-value bounty] + (and (or (not-any? #{"ETH"} filter-value) + (< 0 (:balance-eth bounty))) + (set/subset? (->> filter-value (remove #{"ETH"}) set) + (-> bounty :tokens keys set))))} ::bounty-filter-type|date {::bounty-filter-type.name "Date" + ::bounty-filter-type.category ::bounty-filter-type-category|single-static-option + ::bounty-filter-type.options bounty-filter-type-date-options-def ::bounty-filter-type.predicate (fn [filter-value bounty] (when-let [created-at-inst (:created-at bounty)] (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long) @@ -60,23 +73,19 @@ ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3))) interval (t/interval filter-from (t/now))] (t/within? interval created-at-date))))} - ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" - ::bounty-filter-type.predicate (fn [filter-value bounty] - (->> filter-value - (some #{(:repo-owner bounty)}) - boolean))}}) + ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" + ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options + ::bounty-filter-type.re-frame-subscription-key-for-options :commiteth.subscriptions/open-bounties-owners + ::bounty-filter-type.predicate (fn [filter-value bounty] + (->> filter-value + (some #{(:repo-owner bounty)}) + boolean))}}) (def bounty-filter-types (keys bounty-filter-types-def)) (defn bounty-filter-type->name [filter-type] (-> bounty-filter-types-def (get filter-type) ::bounty-filter-type.name)) -(def bounty-filter-type-date-options-def {::bounty-filter-type-date-option|last-week "Last week" - ::bounty-filter-type-date-option|last-month "Last month" - ::bounty-filter-type-date-option|last-3-months "Last 3 months"}) - -(def bounty-filter-type-date-options (keys bounty-filter-type-date-options-def)) - (defn bounty-filter-type-date-option->name [option] (bounty-filter-type-date-options-def option)) From 834f82609221420296bb98e206b057250c6fae4c Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 08:33:18 +0100 Subject: [PATCH 15/63] disable filter and sort in mobile for now --- src/less/style.less | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/less/style.less b/src/less/style.less index 5977c85..18d9c5b 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -420,6 +420,12 @@ justify-content: space-between; } + @media (max-width: 767px) { + .open-bounties-filter-and-sort { + display: none; + } + } + .open-bounties-filter { display: flex; } From 4bb81f976bf07d70bf0b8b9229be6407ea631d77 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 09:33:05 +0100 Subject: [PATCH 16/63] pre-predicate-value-processor --- src/cljs/commiteth/ui_model.cljs | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index e85e925..fa25f0c 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -61,18 +61,19 @@ (< 0 (:balance-eth bounty))) (set/subset? (->> filter-value (remove #{"ETH"}) set) (-> bounty :tokens keys set))))} - ::bounty-filter-type|date {::bounty-filter-type.name "Date" - ::bounty-filter-type.category ::bounty-filter-type-category|single-static-option - ::bounty-filter-type.options bounty-filter-type-date-options-def - ::bounty-filter-type.predicate (fn [filter-value bounty] - (when-let [created-at-inst (:created-at bounty)] - (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long) - filter-from (condp = filter-value - ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) - ::bounty-filter-type-date-option|last-month (t/minus (t/now) (t/months 1)) - ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3))) - interval (t/interval filter-from (t/now))] - (t/within? interval created-at-date))))} + ::bounty-filter-type|date {::bounty-filter-type.name "Date" + ::bounty-filter-type.category ::bounty-filter-type-category|single-static-option + ::bounty-filter-type.options bounty-filter-type-date-options-def + ::bounty-filter-type.pre-predicate-value-processor (fn [filter-value] + (let [filter-from (condp = filter-value + ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) + ::bounty-filter-type-date-option|last-month (t/minus (t/now) (t/months 1)) + ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3)))] + (t/interval filter-from (t/now)))) + ::bounty-filter-type.predicate (fn [filter-value-interval bounty] + (when-let [created-at-inst (:created-at bounty)] + (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] + (t/within? filter-value-interval created-at-date))))} ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options ::bounty-filter-type.re-frame-subscription-key-for-options :commiteth.subscriptions/open-bounties-owners @@ -108,7 +109,11 @@ (let [filter-preds (->> filters-by-type (remove #(nil? (val %))) (map (fn [[filter-type filter-value]] - (let [pred (-> bounty-filter-types-def (get filter-type) ::bounty-filter-type.predicate)] + (let [filter-type-def (bounty-filter-types-def filter-type) + pred (::bounty-filter-type.predicate filter-type-def) + pre-pred-processor (::bounty-filter-type.pre-predicate-value-processor filter-type-def) + filter-value (cond-> filter-value + pre-pred-processor (pre-pred-processor filter-value))] (partial pred filter-value))))) filters-pred (fn [bounty] (every? #(% bounty) filter-preds))] From b3b3e47acda14f8cea14a5cb45eb630d3b14ace0 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 09:48:12 +0100 Subject: [PATCH 17/63] change no open bounties message --- src/cljs/commiteth/bounties.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index b034495..b79960b 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -211,7 +211,7 @@ [bounties-sort]] (if (empty? open-bounties) [:div.view-no-data-container - [:p "No recent activity yet"]] + [:p "No matching bounties found."]] (into [:div.ui.items] (for [bounty open-bounties] [bounty-item bounty])))]) From cc1cedbbbd85c88c596b6515e5101e7ed3a97ca8 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 10:06:53 +0100 Subject: [PATCH 18/63] set bounty page 1 when filters or sorting change --- src/cljs/commiteth/handlers.cljs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index 1345ade..4367c9a 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -467,9 +467,12 @@ (reg-event-db ::set-open-bounties-sorting-type (fn [db [_ sorting-type]] - (assoc db ::db/open-bounties-sorting-type sorting-type))) + (merge db {::db/open-bounties-sorting-type sorting-type + :bounty-page-number 1}))) (reg-event-db ::set-open-bounty-filter-type (fn [db [_ filter-type filter-value]] - (assoc-in db [::db/open-bounties-filters filter-type] filter-value))) + (-> db + (assoc-in [::db/open-bounties-filters filter-type] filter-value) + (assoc :bounty-page-number 1)))) From fc994102e85203dff573ddea17864e1df37cf8c5 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 10:08:36 +0100 Subject: [PATCH 19/63] add -view suffix and remove old code --- src/cljs/commiteth/bounties.cljs | 67 +++++++------------------------- 1 file changed, 13 insertions(+), 54 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 7d50292..27e9e9e 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -63,7 +63,7 @@ #(-> % .-target .-value int f)) :on-focus #(reset! tooltip-open? true)}]]) -(defn bounties-filter-tooltip-category-range [filter-type filter-type-def current-filter-value tooltip-open?] +(defn bounties-filter-tooltip-category-range-view [filter-type filter-type-def current-filter-value tooltip-open?] (let [default-min (::ui-model/bounty-filter-type.min-val filter-type-def) default-max (::ui-model/bounty-filter-type.max-val filter-type-def) common-range-opts {:min default-min :max default-max} @@ -89,7 +89,7 @@ {:current-val current-max :on-change-val on-max-change-fn})]])) -(defn bounties-filter-tooltip-category-single-static-option +(defn bounties-filter-tooltip-category-single-static-option-view [filter-type filter-type-def current-filter-value tooltip-open?] [:div.open-bounties-filter-list (for [[option-type option-text] (::ui-model/bounty-filter-type.options filter-type-def)] @@ -103,7 +103,7 @@ {:class "active"})) option-text])]) -(defn bounties-filter-tooltip-category-multiple-dynamic-options +(defn bounties-filter-tooltip-category-multiple-dynamic-options-view [filter-type filter-type-def current-filter-value tooltip-open?] (let [options (rf/subscribe [(::ui-model/bounty-filter-type.re-frame-subscription-key-for-options filter-type-def)])] [:div.open-bounties-filter-list @@ -126,17 +126,17 @@ :on-focus #(reset! tooltip-open? true)}] [:div.text option]]]))])) -(defn bounties-filter-tooltip [filter-type filter-type-def current-filter-val tooltip-open?] +(defn bounties-filter-tooltip-view [filter-type filter-type-def current-filter-val tooltip-open?] [:div.open-bounties-filter-element-tooltip (let [compo (condp = (::ui-model/bounty-filter-type.category filter-type-def) ::ui-model/bounty-filter-type-category|single-static-option - bounties-filter-tooltip-category-single-static-option + bounties-filter-tooltip-category-single-static-option-view ::ui-model/bounty-filter-type-category|multiple-dynamic-options - bounties-filter-tooltip-category-multiple-dynamic-options + bounties-filter-tooltip-category-multiple-dynamic-options-view ::ui-model/bounty-filter-type-category|range - bounties-filter-tooltip-category-range)] + bounties-filter-tooltip-category-range-view)] (compo filter-type filter-type-def current-filter-val tooltip-open?))]) (defn bounty-filter-view [filter-type current-filter-value] @@ -165,7 +165,7 @@ (rf/dispatch [::handlers/set-open-bounty-filter-type filter-type nil]) (reset! tooltip-open? false))}]])] (when @tooltip-open? - [bounties-filter-tooltip + [bounties-filter-tooltip-view filter-type (ui-model/bounty-filter-types-def filter-type) current-filter-value @@ -182,7 +182,7 @@ filter-type (get @current-filters filter-type)]))])) -(defn bounties-sort [] +(defn bounties-sort-view [] (let [open? (r/atom false)] (fn [] (let [current-sorting (rf/subscribe [::subs/open-bounties-sorting-type])] @@ -205,38 +205,25 @@ (rf/dispatch [::handlers/set-open-bounties-sorting-type sorting-type]))} (ui-model/bounty-sorting-type->name sorting-type)])])])))) -;(defn bounties-list [open-bounties] -; [:div.ui.container.open-bounties-container -; [:div.open-bounties-header "Bounties"] -; [:div.open-bounties-filter-and-sort -; [bounty-filters-view] -; [bounties-sort]] -; (if (empty? open-bounties) -; [:div.view-no-data-container -; [:p "No matching bounties found."]] -; (into [:div.ui.items] -; (for [bounty open-bounties] -; [bounty-item bounty])))]) - (defn bounties-list [{:keys [items item-count page-number total-count] - :as bounty-page-data}] + :as bounty-page-data}] [:div.ui.container.open-bounties-container [:div.open-bounties-header "Bounties"] [:div.open-bounties-filter-and-sort [bounty-filters-view] - [bounties-sort]] + [bounties-sort-view]] (if (empty? items) [:div.view-no-data-container [:p "No matching bounties found."]] [:div - (let [left (inc (* (dec page-number) items-per-page)) + (let [left (inc (* (dec page-number) items-per-page)) right (dec (+ left item-count))] [:div.item-counts-label [:span (str "Showing " left "-" right " of " total-count)]]) (display-data-page bounty-page-data bounty-item :set-bounty-page-number)])]) (defn bounties-page [] - (let [bounty-page-data (rf/subscribe [:open-bounties-page]) + (let [bounty-page-data (rf/subscribe [:open-bounties-page]) open-bounties-loading? (rf/subscribe [:get-in [:open-bounties-loading?]])] (fn [] (if @open-bounties-loading? @@ -244,31 +231,3 @@ [:div.ui.active.inverted.dimmer [:div.ui.text.loader.view-loading-label "Loading"]]] [bounties-list @bounty-page-data])))) -; -;(defn bounties-page [] -; (let [open-bounties (rf/subscribe [::subs/filtered-and-sorted-open-bounties]) -;======= -;(defn bounties-list [{:keys [items item-count page-number total-count] -; :as bounty-page-data}] -; [:div.ui.container.open-bounties-container -; [:div.open-bounties-header "Bounties"] -; (if (empty? items) -; [:div.view-no-data-container -; [:p "No recent activity yet"]] -; [:div -; (let [left (inc (* (dec page-number) items-per-page)) -; right (dec (+ left item-count))] -; [:div.item-counts-label -; [:span (str "Showing " left "-" right " of " total-count)]]) -; (display-data-page bounty-page-data bounty-item :set-bounty-page-number)])]) -; -;(defn bounties-page [] -; (let [bounty-page-data (rf/subscribe [:open-bounties-page]) -;>>>>>>> status/develop -; open-bounties-loading? (rf/subscribe [:get-in [:open-bounties-loading?]])] -; (fn [] -; (if @open-bounties-loading? -; [:div.view-loading-container -; [:div.ui.active.inverted.dimmer -; [:div.ui.text.loader.view-loading-label "Loading"]]] -; [bounties-list @bounty-page-data])))) From aabdff10fda655c13574fc97aea18eae7ac5cbb4 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 10:34:32 +0100 Subject: [PATCH 20/63] use multimethod in bounties-filter-tooltip-view --- src/cljs/commiteth/bounties.cljs | 47 +++++++++++++------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 27e9e9e..3964f04 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -49,7 +49,7 @@ [:div.ui.tiny.circular.image [:img {:src avatar-url}]]]])) -(defn bounties-filter-tooltip-value-input [label tooltip-open? opts] +(defn bounties-filter-tooltip-value-input-view [label tooltip-open? opts] [:div.open-bounties-filter-element-tooltip-value-input-container [:div.:input.open-bounties-filter-element-tooltip-value-input-label label] @@ -63,7 +63,10 @@ #(-> % .-target .-value int f)) :on-focus #(reset! tooltip-open? true)}]]) -(defn bounties-filter-tooltip-category-range-view [filter-type filter-type-def current-filter-value tooltip-open?] +(defmulti bounties-filter-tooltip-view #(-> %2 ::ui-model/bounty-filter-type.category)) + +(defmethod bounties-filter-tooltip-view ::ui-model/bounty-filter-type-category|range + [filter-type filter-type-def current-filter-value tooltip-open?] (let [default-min (::ui-model/bounty-filter-type.min-val filter-type-def) default-max (::ui-model/bounty-filter-type.max-val filter-type-def) common-range-opts {:min default-min :max default-max} @@ -82,14 +85,14 @@ (on-change-fn new-min new-max)))] [:div "$0 - $1000+" - [bounties-filter-tooltip-value-input "Min" tooltip-open? (merge common-range-opts - {:current-val current-min - :on-change-val on-min-change-fn})] - [bounties-filter-tooltip-value-input "Max" tooltip-open? (merge common-range-opts - {:current-val current-max - :on-change-val on-max-change-fn})]])) + [bounties-filter-tooltip-value-input-view "Min" tooltip-open? (merge common-range-opts + {:current-val current-min + :on-change-val on-min-change-fn})] + [bounties-filter-tooltip-value-input-view "Max" tooltip-open? (merge common-range-opts + {:current-val current-max + :on-change-val on-max-change-fn})]])) -(defn bounties-filter-tooltip-category-single-static-option-view +(defmethod bounties-filter-tooltip-view ::ui-model/bounty-filter-type-category|single-static-option [filter-type filter-type-def current-filter-value tooltip-open?] [:div.open-bounties-filter-list (for [[option-type option-text] (::ui-model/bounty-filter-type.options filter-type-def)] @@ -103,7 +106,7 @@ {:class "active"})) option-text])]) -(defn bounties-filter-tooltip-category-multiple-dynamic-options-view +(defmethod bounties-filter-tooltip-view ::ui-model/bounty-filter-type-category|multiple-dynamic-options [filter-type filter-type-def current-filter-value tooltip-open?] (let [options (rf/subscribe [(::ui-model/bounty-filter-type.re-frame-subscription-key-for-options filter-type-def)])] [:div.open-bounties-filter-list @@ -126,19 +129,6 @@ :on-focus #(reset! tooltip-open? true)}] [:div.text option]]]))])) -(defn bounties-filter-tooltip-view [filter-type filter-type-def current-filter-val tooltip-open?] - [:div.open-bounties-filter-element-tooltip - (let [compo (condp = (::ui-model/bounty-filter-type.category filter-type-def) - ::ui-model/bounty-filter-type-category|single-static-option - bounties-filter-tooltip-category-single-static-option-view - - ::ui-model/bounty-filter-type-category|multiple-dynamic-options - bounties-filter-tooltip-category-multiple-dynamic-options-view - - ::ui-model/bounty-filter-type-category|range - bounties-filter-tooltip-category-range-view)] - (compo filter-type filter-type-def current-filter-val tooltip-open?))]) - (defn bounty-filter-view [filter-type current-filter-value] (let [tooltip-open? (r/atom false)] (fn [filter-type current-filter-value] @@ -165,11 +155,12 @@ (rf/dispatch [::handlers/set-open-bounty-filter-type filter-type nil]) (reset! tooltip-open? false))}]])] (when @tooltip-open? - [bounties-filter-tooltip-view - filter-type - (ui-model/bounty-filter-types-def filter-type) - current-filter-value - tooltip-open?])]))) + [:div.open-bounties-filter-element-tooltip + [bounties-filter-tooltip-view + filter-type + (ui-model/bounty-filter-types-def filter-type) + current-filter-value + tooltip-open?]])]))) (defn bounty-filters-view [] (let [current-filters (rf/subscribe [::subs/open-bounties-filters])] From 6786411299e94e2c23f0067402ac19c4a3e99ac0 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 25 Jan 2018 11:08:50 +0100 Subject: [PATCH 21/63] add created_at to queries --- resources/sql/queries.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/sql/queries.sql b/resources/sql/queries.sql index e8a3115..1fa529c 100644 --- a/resources/sql/queries.sql +++ b/resources/sql/queries.sql @@ -422,6 +422,7 @@ SELECT i.payout_hash AS payout_hash, i.payout_receipt AS payout_receipt, i.updated AS updated, + i.created_at AS created_at, r.owner AS repo_owner, r.owner_avatar_url AS repo_owner_avatar_url, r.repo AS repo_name, From b10fee6ff1649d43d7a56e82ec680c368c155d11 Mon Sep 17 00:00:00 2001 From: Churikova Tetiana Date: Fri, 26 Jan 2018 13:36:08 +0200 Subject: [PATCH 22/63] Add end-to-end setup doc --- doc/testing.md | 8 ++++++++ test/Jenkinsfile | 13 +++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 test/Jenkinsfile diff --git a/doc/testing.md b/doc/testing.md index c0ad83f..3ac6a9f 100644 --- a/doc/testing.md +++ b/doc/testing.md @@ -63,3 +63,11 @@ To remove issue from the Bounties list you can close it in GitHub. All bugs should be reported as issues in the [OpenBounty Github repository](https://github.com/status-im/open-bounty/issues). Please first check that there is not already a duplicate issue. Issues should contain exact and minimal step-by-step instructions for reproducing the problem. + +### Status Open Bounty end-to-end tests + +Framework for testing located in: `open-bounty/test/end-to-end` + +Full installation and configuring manual: [Status Open Bounty end-to-end tests](https://wiki.status.im/Status_Open_Bounty_end-to-end_tests) + +Currently supports local and Jenkins environment running (you can find example of JenkinsFile in `open-bounty/test` ) diff --git a/test/Jenkinsfile b/test/Jenkinsfile new file mode 100644 index 0000000..8845432 --- /dev/null +++ b/test/Jenkinsfile @@ -0,0 +1,13 @@ +# `Jenkinsfile` is a groovy script DSL for defining CI/CD workflows for Jenkins (end-to-end autotests) + +node ('linux1') {sauce('1be1b688-e0e7-4314-92a0-db11f52d3c00') { + checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/status-im/open-bounty.git']]]) + configFileProvider([configFile(fileId: 'sob_automation_test_config', targetLocation: 'test/end-to-end/tests')]) { + try {sh 'cd test/end-to-end/tests && python3 -m pytest -m sanity --build=$BUILD_NAME -v -n 1' + } + finally { + saucePublisher() + junit testDataPublishers: [[$class: 'SauceOnDemandReportPublisher', jobVisibility: 'public']], testResults: 'test/end-to-end/tests/*.xml' } + } + } +} \ No newline at end of file From 417317f9b5b37e9ee618ae9559dc9aedb4b7a7fd Mon Sep 17 00:00:00 2001 From: Churikova Tetiana Date: Fri, 26 Jan 2018 20:12:58 +0200 Subject: [PATCH 23/63] test for forking repo and cloning it to local repo --- test/end-to-end/pages/base_page.py | 4 ++ test/end-to-end/pages/thirdparty/github.py | 81 +++++++++++++++++++++- test/end-to-end/requirements.txt | 3 + test/end-to-end/tests/__init__.py | 10 +-- test/end-to-end/tests/config_example.ini | 16 ++++- test/end-to-end/tests/test_contracts.py | 21 ++++++ 6 files changed, 127 insertions(+), 8 deletions(-) diff --git a/test/end-to-end/pages/base_page.py b/test/end-to-end/pages/base_page.py index de61cd4..9bc6a21 100644 --- a/test/end-to-end/pages/base_page.py +++ b/test/end-to-end/pages/base_page.py @@ -15,3 +15,7 @@ class BasePageObject(object): @property def time_now(self): return datetime.now().strftime('%-m%-d%-H%-M%-S') + + @property + def current_url(self): + return self.driver.current_url diff --git a/test/end-to-end/pages/thirdparty/github.py b/test/end-to-end/pages/thirdparty/github.py index 0d00335..3607bc9 100644 --- a/test/end-to-end/pages/thirdparty/github.py +++ b/test/end-to-end/pages/thirdparty/github.py @@ -2,6 +2,10 @@ import time, pytest from pages.base_element import * from pages.base_page import BasePageObject from tests import test_data +from git import Repo +import os +import shutil +import logging class EmailEditbox(BaseEditBox): @@ -106,6 +110,32 @@ class ContractBody(BaseText): super(ContractBody, self).__init__(driver) self.locator = self.Locator.xpath_selector("//tbody//p[contains(text(), " "'Current balance: 0.000000 ETH')]") +class IssueId(BaseText): + def __init__(self, driver): + super(IssueId, self).__init__(driver) + self.locator = self.Locator.css_selector(".gh-header-number") + +class ForkButton(BaseButton): + def __init__(self, driver): + super(ForkButton, self).__init__(driver) + self.locator = self.Locator.css_selector("[href='#fork-destination-box']") + +class HeaderInForkPopup(BaseText): + def __init__(self, driver): + super(HeaderInForkPopup, self).__init__(driver) + self.locator = self.Locator.css_selector("#facebox-header") + +class UserAccountInForkPopup(BaseButton): + def __init__(self, driver): + super(UserAccountInForkPopup, self).__init__(driver) + self.locator = self.Locator.css_selector("[value=%s]"%test_data.config['DEV']['gh_username']) + + +class ForkedRepoText(BaseText): + def __init__(self, driver): + super(ForkedRepoText, self).__init__(driver) + self.locator = self.Locator.css_selector(".commit-tease") + class GithubPage(BasePageObject): @@ -133,18 +163,28 @@ class GithubPage(BasePageObject): self.cross_button = LabelsButton.CrossButton(self.driver) self.submit_new_issue_button = SubmitNewIssueButton(self.driver) self.contract_body = ContractBody(self.driver) + self.issue_id = IssueId(self.driver) + self.fork_button = ForkButton(self.driver) + self.header_in_fork_popup = HeaderInForkPopup(self.driver) + self.user_account_in_fork_popup = UserAccountInForkPopup(self.driver) + self.forked_repo_text = ForkedRepoText(self.driver) + def get_issues_page(self): - self.driver.get('https://github.com/Org4/nov13/issues') + self.driver.get(test_data.config['ORG']['gh_repo'] + 'issues') + + def get_issue_page(self, issue_id): + self.driver.get(test_data.config['ORG']['gh_repo'] + 'issues/' + issue_id) def get_sob_plugin_page(self): - self.driver.get('http://github.com/apps/status-open-bounty-app-test') + self.driver.get(test_data.config['Common']['sob_test_app']) def sign_in(self, email, password): self.email_input.send_keys(email) self.password_input.send_keys(password) self.sign_in_button.click() + def install_sob_plugin(self): initial_url = self.driver.current_url self.get_sob_plugin_page() @@ -164,7 +204,19 @@ class GithubPage(BasePageObject): self.bounty_label.click() self.cross_button.click() self.submit_new_issue_button.click() - return test_data.issue['title'] + test_data.issue['id'] = self.issue_id.text[1:] + logging.info("Issue id is %s" % test_data.issue['id']) + logging.info("Issue title is %s" % test_data.issue['title']) + + def fork_repo(self, initial_repo, wait=60): + self.driver.get(initial_repo) + self.fork_button.click() + if self.header_in_fork_popup.text == 'Where should we fork this repository?': + self.user_account_in_fork_popup.click() + self.forked_repo_text.wait_for_element(wait) + + def get_login_page(self): + self.driver.get(test_data.config['Common']['gh_login']) def get_deployed_contract(self, wait=120): for i in range(wait): @@ -175,3 +227,26 @@ class GithubPage(BasePageObject): time.sleep(10) pass pytest.fail('Contract is not deployed in %s minutes!' % str(wait/60)) + + #cloning via HTTPS + def clone_repo(self, initial_repo=None, username=None, repo_name=None, repo_path='git_repo'): + os.mkdir(repo_path) + os.chdir(repo_path) + test_data.local_repo_path = os.getcwd() + fork = 'https://github.com/%s/%s.git' % (username, repo_name) + logging.info(('Cloning from %s to %s' % (fork, repo_path))) + r = Repo.clone_from(fork, repo_path) + logging.info(('Successefully cloned to: %s' % test_data.local_repo_path)) + logging.info('Set upstream to %s'% initial_repo) + upstream = r.create_remote('upstream', initial_repo) + upstream.fetch() + assert upstream.exists() + r.heads.master.checkout() + + def clean_repo_local_folder(self): + logging.info('Removing %s' % test_data.local_repo_path) + if test_data.local_repo_path: + shutil.rmtree(test_data.local_repo_path) + + + diff --git a/test/end-to-end/requirements.txt b/test/end-to-end/requirements.txt index 397c508..32b99e7 100644 --- a/test/end-to-end/requirements.txt +++ b/test/end-to-end/requirements.txt @@ -16,3 +16,6 @@ selenium==2.53.6 six==1.10.0 urllib3==1.22 yarl==0.12.0 +gitpython==2.1.8 +gitdb2==2.0.3 +smmap2==2.0.3 \ No newline at end of file diff --git a/test/end-to-end/tests/__init__.py b/test/end-to-end/tests/__init__.py index 41ae6be..9d59efe 100644 --- a/test/end-to-end/tests/__init__.py +++ b/test/end-to-end/tests/__init__.py @@ -3,15 +3,17 @@ import configparser class TestData(object): def __init__(self): - self.test_name = None self.config = configparser.ConfigParser() # define here path to your config.ini file - #example - config_example.ini + # example - config_example.ini self.config.read('config.ini') - self.base_case_issue = dict() - self.base_case_issue['title'] = 'Very first auto_test_bounty' + + # self.issue['title'] is set in GithubPage::create_new_bounty + # self.issue['id'] is set in GithubPage::create_new_bounty + # self.local_repo_path is set in GithubPage::clone_repo + test_data = TestData() diff --git a/test/end-to-end/tests/config_example.ini b/test/end-to-end/tests/config_example.ini index 4b52a24..e807118 100644 --- a/test/end-to-end/tests/config_example.ini +++ b/test/end-to-end/tests/config_example.ini @@ -1,13 +1,27 @@ [Common] ;app URL url = https://openbounty.status.im:444/ +;URL to GH openbounty app +sob_test_app = http://github.com/apps/status-open-bounty-app-test +gh_login = https://github.com/login [Paths] ;AbsolutePath to 'tests' folder tests_absolute = /usr/dir/open-bounty/test/end-to-end/tests/ [ORG] -;GitHub credentials for organization + +;GitHub credentials for organization owner gh_login = login gh_password = password +;GitHub repo path +gh_repo = https://github.com/org_name/repo_name/ +;GitHub repo name +gh_repo_name = repo_name + ;MetaMask password for organization mm_password = password +[DEV] +;GitHub credentials for developer +gh_login = login +gh_password = password +gh_username = username \ No newline at end of file diff --git a/test/end-to-end/tests/test_contracts.py b/test/end-to-end/tests/test_contracts.py index 5564b7b..05cc539 100644 --- a/test/end-to-end/tests/test_contracts.py +++ b/test/end-to-end/tests/test_contracts.py @@ -2,6 +2,7 @@ import pytest from os import environ from pages.openbounty.landing import LandingPage from pages.openbounty.bounties import BountiesPage +from pages.thirdparty.github import GithubPage from tests.basetestcase import BaseTestCase from tests import test_data @@ -37,6 +38,26 @@ class TestLogin(BaseTestCase): assert titles[0].text == test_data.issue['title'] + def test_forking_repo(self): + github = GithubPage(self.driver) + self.cleanup = True + + # Sign In to GH as Developer + github.get_login_page() + github.sign_in(test_data.config['DEV']['gh_login'], + test_data.config['DEV']['gh_password']) + + # Fork repo as Developer from Organization + github.fork_repo(test_data.config['ORG']['gh_repo']) + + # Cloning repo to local git as Developer and set upstream to Organization (via HTTPS) + github.clone_repo(test_data.config['ORG']['gh_repo'], + test_data.config['DEV']['gh_username'], + test_data.config['ORG']['gh_repo_name'], + 'git_repo') + + github.clean_repo_local_folder() + From 3c4413b160af025056e8554e0f012ed18212b5ff Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Mon, 29 Jan 2018 19:07:54 +0200 Subject: [PATCH 24/63] [FIX #187] Add dummy value to Metamask dropdown; do not automatically preselect first item in the list; convert addresses to lower-case --- src/cljs/commiteth/common.cljs | 17 +++++++++-------- src/cljs/commiteth/update_address.cljs | 14 ++++++++------ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/cljs/commiteth/common.cljs b/src/cljs/commiteth/common.cljs index 1213395..bc44638 100644 --- a/src/cljs/commiteth/common.cljs +++ b/src/cljs/commiteth/common.cljs @@ -10,18 +10,19 @@ (merge props {:type "text" :value @val-ratom :on-change #(reset! val-ratom (-> % .-target .-value))})])) - (defn dropdown [props title val-ratom items] (fn [] - (if (= 1 (count items)) - (reset! val-ratom (first items))) [:select.ui.basic.selection.dropdown (merge props {:on-change - #(reset! val-ratom (-> % .-target .-value))}) - (doall (for [item items] - ^{:key item} [:option - {:value item} - item]))])) + #(let [selected-value (-> % .-target .-value)] + (when (not= selected-value title) + (reset! val-ratom selected-value))) + :default-value (if (contains? (set items) @val-ratom) + @val-ratom + title)}) + (conj (doall (for [item items] + ^{:key item} [:option {:value item} item])) + ^{:key title} [:option {:value title :disabled true} title])])) (defn moment-timestamp [time] (let [now (.now js/Date.) diff --git a/src/cljs/commiteth/update_address.cljs b/src/cljs/commiteth/update_address.cljs index 6134bde..41364c6 100644 --- a/src/cljs/commiteth/update_address.cljs +++ b/src/cljs/commiteth/update_address.cljs @@ -3,6 +3,7 @@ [commiteth.common :refer [input dropdown]] [reagent.core :as r] [reagent.crypt :as crypt] + [clojure.string :as str] [cljs-web3.eth :as web3-eth])) @@ -10,7 +11,9 @@ (let [db (rf/subscribe [:db]) user (rf/subscribe [:user]) updating-address (rf/subscribe [:get-in [:updating-address]]) - address (r/atom @(rf/subscribe [:get-in [:user :address]]))] + address (-> @(rf/subscribe [:get-in [:user :address]]) + str/lower-case + r/atom)] (fn [] (let [web3 (:web3 @db) web3-accounts (when web3 @@ -22,13 +25,12 @@ [:p "Insert your Ethereum address in hex format."] [:div.field (if-not (empty? web3-accounts) - [dropdown {:class "address-input"} "Select address" + [dropdown {:class "address-input"} + "Select address" address - (vec - (for [acc web3-accounts] - acc))] + (map str/lower-case web3-accounts)] [:div.ui.input.address-input - [input address {:placeholder "0x0000000000000000000000000000000000000000" + [input address {:placeholder "0x0000000000000000000000000000000000000000" :auto-complete "off" :auto-correct "off" :spell-check "false" From c5fdad5b8e86f980d271e5f57595f5361ac12733 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Mon, 29 Jan 2018 19:36:49 +0200 Subject: [PATCH 25/63] Fix assoc-in in save-user-address handler --- src/cljs/commiteth/handlers.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index 077d280..382d7fb 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -324,7 +324,7 @@ :http {:method POST :url "/api/user/address" :on-success #(do - (dispatch [:assoc-in [:user [:address] address]]) + (dispatch [:assoc-in [:user :address] address]) (dispatch [:set-flash-message :success "Address saved"])) From a52f5f2b20e446670c414f033979457528df65ca Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Mon, 29 Jan 2018 20:18:16 +0200 Subject: [PATCH 26/63] Move selection behaviour and option list population to dropdown component --- src/cljs/commiteth/common.cljs | 31 ++++++++++++++++---------- src/cljs/commiteth/update_address.cljs | 5 ++--- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/cljs/commiteth/common.cljs b/src/cljs/commiteth/common.cljs index bc44638..a613925 100644 --- a/src/cljs/commiteth/common.cljs +++ b/src/cljs/commiteth/common.cljs @@ -10,19 +10,26 @@ (merge props {:type "text" :value @val-ratom :on-change #(reset! val-ratom (-> % .-target .-value))})])) + (defn dropdown [props title val-ratom items] - (fn [] - [:select.ui.basic.selection.dropdown - (merge props {:on-change - #(let [selected-value (-> % .-target .-value)] - (when (not= selected-value title) - (reset! val-ratom selected-value))) - :default-value (if (contains? (set items) @val-ratom) - @val-ratom - title)}) - (conj (doall (for [item items] - ^{:key item} [:option {:value item} item])) - ^{:key title} [:option {:value title :disabled true} title])])) + "If val-ratom is set, preselect it in the dropdown. + Add value of val-ratom if it's missing from items list. + Otherwise, prepend title as a disabled option" + (let [items (cond-> items + (and @val-ratom + (not (contains? (set items) @val-ratom))) + (conj @val-ratom) + (not @val-ratom) + (conj title))] + (fn [] + [:select.ui.basic.selection.dropdown + (merge props {:on-change + #(reset! val-ratom (-> % .-target .-value)) + :default-value (or @val-ratom title)}) + (doall (for [item items] + ^{:key item} [:option {:value item + :disabled (= item title)} + item]))]))) (defn moment-timestamp [time] (let [now (.now js/Date.) diff --git a/src/cljs/commiteth/update_address.cljs b/src/cljs/commiteth/update_address.cljs index 41364c6..9261671 100644 --- a/src/cljs/commiteth/update_address.cljs +++ b/src/cljs/commiteth/update_address.cljs @@ -11,9 +11,8 @@ (let [db (rf/subscribe [:db]) user (rf/subscribe [:user]) updating-address (rf/subscribe [:get-in [:updating-address]]) - address (-> @(rf/subscribe [:get-in [:user :address]]) - str/lower-case - r/atom)] + address (r/atom (some-> @(rf/subscribe [:get-in [:user :address]]) + str/lower-case))] (fn [] (let [web3 (:web3 @db) web3-accounts (when web3 From 7bf00ce6c1e8fd321a6ee1b5366db1379460971c Mon Sep 17 00:00:00 2001 From: Churikova Tetiana Date: Tue, 30 Jan 2018 18:25:46 +0200 Subject: [PATCH 27/63] fixed Jenkinsfile for Jenkins --- test/Jenkinsfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/Jenkinsfile b/test/Jenkinsfile index 8845432..8169c6f 100644 --- a/test/Jenkinsfile +++ b/test/Jenkinsfile @@ -1,5 +1,3 @@ -# `Jenkinsfile` is a groovy script DSL for defining CI/CD workflows for Jenkins (end-to-end autotests) - node ('linux1') {sauce('1be1b688-e0e7-4314-92a0-db11f52d3c00') { checkout([$class: 'GitSCM', branches: [[name: '*/develop']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/status-im/open-bounty.git']]]) configFileProvider([configFile(fileId: 'sob_automation_test_config', targetLocation: 'test/end-to-end/tests')]) { From 9b40abc1a1b88728b257f62a053920fb7b19944f Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 11:43:39 +0100 Subject: [PATCH 28/63] added missing svgs --- resources/public/bounty-filter-remove.svg | 6 ++++++ resources/public/icon-forward-white.svg | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 resources/public/bounty-filter-remove.svg create mode 100644 resources/public/icon-forward-white.svg diff --git a/resources/public/bounty-filter-remove.svg b/resources/public/bounty-filter-remove.svg new file mode 100644 index 0000000..b4e091f --- /dev/null +++ b/resources/public/bounty-filter-remove.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/resources/public/icon-forward-white.svg b/resources/public/icon-forward-white.svg new file mode 100644 index 0000000..9842677 --- /dev/null +++ b/resources/public/icon-forward-white.svg @@ -0,0 +1,3 @@ + + + From fa5bdef66ae23813875ea3dab291b1958bf0c1d4 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 11:51:55 +0100 Subject: [PATCH 29/63] a few improvements and comments in filter-bounties --- src/cljs/commiteth/subscriptions.cljs | 4 ++-- src/cljs/commiteth/ui_model.cljs | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index 03be998..d7a1818 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -162,6 +162,6 @@ :<- [::open-bounties-sorting-type] (fn [[open-bounties filters sorting-type] _] (cond->> open-bounties - filters (ui-model/filter-bounties filters) + true (ui-model/filter-bounties filters) sorting-type (ui-model/sort-bounties-by-sorting-type sorting-type) - filter vec))) + true vec))) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index fa25f0c..cfa0210 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -107,15 +107,16 @@ (defn filter-bounties [filters-by-type bounties] (let [filter-preds (->> filters-by-type + ; used `nil?` because a valid filter value can be `false` (remove #(nil? (val %))) (map (fn [[filter-type filter-value]] (let [filter-type-def (bounty-filter-types-def filter-type) pred (::bounty-filter-type.predicate filter-type-def) pre-pred-processor (::bounty-filter-type.pre-predicate-value-processor filter-type-def) filter-value (cond-> filter-value - pre-pred-processor (pre-pred-processor filter-value))] + pre-pred-processor pre-pred-processor)] (partial pred filter-value))))) filters-pred (fn [bounty] (every? #(% bounty) filter-preds))] - (->> bounties - (filter filters-pred)))) + (cond->> bounties + (not-empty filter-preds) (filter filters-pred)))) From 65cea5d521eb86bf2f95e442dd62e322a3d0d692 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 12:01:24 +0100 Subject: [PATCH 30/63] reformat bounty-filter-types-def --- src/cljs/commiteth/bounties.cljs | 2 +- src/cljs/commiteth/ui_model.cljs | 79 +++++++++++++++++--------------- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 3964f04..645958a 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -108,7 +108,7 @@ (defmethod bounties-filter-tooltip-view ::ui-model/bounty-filter-type-category|multiple-dynamic-options [filter-type filter-type-def current-filter-value tooltip-open?] - (let [options (rf/subscribe [(::ui-model/bounty-filter-type.re-frame-subscription-key-for-options filter-type-def)])] + (let [options (rf/subscribe [(::ui-model/bounty-filter-type.re-frame-subs-key-for-options filter-type-def)])] [:div.open-bounties-filter-list (for [option @options] (let [active? (boolean (and current-filter-value (current-filter-value option)))] diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index cfa0210..039920d 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -45,42 +45,49 @@ (def bounty-filter-type-date-options (keys bounty-filter-type-date-options-def)) (def bounty-filter-types-def - {::bounty-filter-type|value {::bounty-filter-type.name "Value" - ::bounty-filter-type.category ::bounty-filter-type-category|range - ::bounty-filter-type.min-val 0 - ::bounty-filter-type.max-val 1000 - ::bounty-filter-type.predicate (fn [filter-value bounty] - (let [min-val (first filter-value) - max-val (second filter-value)] - (<= min-val (:value-usd bounty) max-val)))} - ::bounty-filter-type|currency {::bounty-filter-type.name "Currency" - ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options - ::bounty-filter-type.re-frame-subscription-key-for-options :commiteth.subscriptions/open-bounties-currencies - ::bounty-filter-type.predicate (fn [filter-value bounty] - (and (or (not-any? #{"ETH"} filter-value) - (< 0 (:balance-eth bounty))) - (set/subset? (->> filter-value (remove #{"ETH"}) set) - (-> bounty :tokens keys set))))} - ::bounty-filter-type|date {::bounty-filter-type.name "Date" - ::bounty-filter-type.category ::bounty-filter-type-category|single-static-option - ::bounty-filter-type.options bounty-filter-type-date-options-def - ::bounty-filter-type.pre-predicate-value-processor (fn [filter-value] - (let [filter-from (condp = filter-value - ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) - ::bounty-filter-type-date-option|last-month (t/minus (t/now) (t/months 1)) - ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3)))] - (t/interval filter-from (t/now)))) - ::bounty-filter-type.predicate (fn [filter-value-interval bounty] - (when-let [created-at-inst (:created-at bounty)] - (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] - (t/within? filter-value-interval created-at-date))))} - ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" - ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options - ::bounty-filter-type.re-frame-subscription-key-for-options :commiteth.subscriptions/open-bounties-owners - ::bounty-filter-type.predicate (fn [filter-value bounty] - (->> filter-value - (some #{(:repo-owner bounty)}) - boolean))}}) + {::bounty-filter-type|value + {::bounty-filter-type.name "Value" + ::bounty-filter-type.category ::bounty-filter-type-category|range + ::bounty-filter-type.min-val 0 + ::bounty-filter-type.max-val 1000 + ::bounty-filter-type.predicate (fn [filter-value bounty] + (let [min-val (first filter-value) + max-val (second filter-value)] + (<= min-val (:value-usd bounty) max-val)))} + + ::bounty-filter-type|currency + {::bounty-filter-type.name "Currency" + ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options + ::bounty-filter-type.re-frame-subs-key-for-options :commiteth.subscriptions/open-bounties-currencies + ::bounty-filter-type.predicate (fn [filter-value bounty] + (and (or (not-any? #{"ETH"} filter-value) + (< 0 (:balance-eth bounty))) + (set/subset? (->> filter-value (remove #{"ETH"}) set) + (-> bounty :tokens keys set))))} + + ::bounty-filter-type|date + {::bounty-filter-type.name "Date" + ::bounty-filter-type.category ::bounty-filter-type-category|single-static-option + ::bounty-filter-type.options bounty-filter-type-date-options-def + ::bounty-filter-type.pre-predicate-value-processor (fn [filter-value] + (let [filter-from (condp = filter-value + ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) + ::bounty-filter-type-date-option|last-month (t/minus (t/now) (t/months 1)) + ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3)))] + (t/interval filter-from (t/now)))) + ::bounty-filter-type.predicate (fn [filter-value-interval bounty] + (when-let [created-at-inst (:created-at bounty)] + (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] + (t/within? filter-value-interval created-at-date))))} + + ::bounty-filter-type|owner + {::bounty-filter-type.name "Owner" + ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options + ::bounty-filter-type.re-frame-subs-key-for-options :commiteth.subscriptions/open-bounties-owners + ::bounty-filter-type.predicate (fn [filter-value bounty] + (->> filter-value + (some #{(:repo-owner bounty)}) + boolean))}}) (def bounty-filter-types (keys bounty-filter-types-def)) From 15768318cf7f5ef53bbcc57d5db1b34004adbf9f Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 12:04:33 +0100 Subject: [PATCH 31/63] reset sorting and filters when navigating page --- src/cljs/commiteth/handlers.cljs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index 4367c9a..554e6d6 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -11,7 +11,8 @@ [cljs-web3.eth :as web3-eth] [akiroz.re-frame.storage :as rf-storage - :refer [reg-co-fx!]])) + :refer [reg-co-fx!]] + [commiteth.ui-model :as ui-model])) (rf-storage/reg-co-fx! :commiteth-sob {:fx :store @@ -66,7 +67,9 @@ (reg-event-db :set-active-page (fn [db [_ page]] - (assoc db :page page))) + (assoc db :page page + ::db/open-bounties-filters {} + ::db/open-bounties-sorting-type ::ui-model/bounty-sorting-type|most-recent))) (reg-event-db :set-bounty-page-number From faff5327978b32cbbe4e7e1fe63a37943e16ceba Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 12:45:40 +0100 Subject: [PATCH 32/63] making some lines shorter --- src/cljs/commiteth/ui_model.cljs | 48 +++++++++++++++++++------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 039920d..9fab8c8 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -44,6 +44,19 @@ (def bounty-filter-type-date-options (keys bounty-filter-type-date-options-def)) +(def bounty-filter-type-date-pre-predicate-value-processor + (fn [filter-value] + (let [filter-from (condp = filter-value + ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) + ::bounty-filter-type-date-option|last-month (t/minus (t/now) (t/months 1)) + ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3)))] + (t/interval filter-from (t/now))))) +(def bounty-filter-type-date-predicate + (fn [filter-value-interval bounty] + (when-let [created-at-inst (:created-at bounty)] + (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] + (t/within? filter-value-interval created-at-date))))) + (def bounty-filter-types-def {::bounty-filter-type|value {::bounty-filter-type.name "Value" @@ -69,16 +82,8 @@ {::bounty-filter-type.name "Date" ::bounty-filter-type.category ::bounty-filter-type-category|single-static-option ::bounty-filter-type.options bounty-filter-type-date-options-def - ::bounty-filter-type.pre-predicate-value-processor (fn [filter-value] - (let [filter-from (condp = filter-value - ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) - ::bounty-filter-type-date-option|last-month (t/minus (t/now) (t/months 1)) - ::bounty-filter-type-date-option|last-3-months (t/minus (t/now) (t/months 3)))] - (t/interval filter-from (t/now)))) - ::bounty-filter-type.predicate (fn [filter-value-interval bounty] - (when-let [created-at-inst (:created-at bounty)] - (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] - (t/within? filter-value-interval created-at-date))))} + ::bounty-filter-type.pre-predicate-value-processor bounty-filter-type-date-pre-predicate-value-processor + ::bounty-filter-type.predicate bounty-filter-type-date-predicate} ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" @@ -112,17 +117,20 @@ :else (str filter-type " with val " filter-value))) +(defn- bounty-filter-values-by-type->predicates [filters-by-type] + (->> filters-by-type + ; used `nil?` because a valid filter value can be `false` + (remove #(nil? (val %))) + (map (fn [[filter-type filter-value]] + (let [filter-type-def (bounty-filter-types-def filter-type) + pred (::bounty-filter-type.predicate filter-type-def) + pre-pred-processor (::bounty-filter-type.pre-predicate-value-processor filter-type-def) + filter-value (cond-> filter-value + pre-pred-processor pre-pred-processor)] + (partial pred filter-value)))))) + (defn filter-bounties [filters-by-type bounties] - (let [filter-preds (->> filters-by-type - ; used `nil?` because a valid filter value can be `false` - (remove #(nil? (val %))) - (map (fn [[filter-type filter-value]] - (let [filter-type-def (bounty-filter-types-def filter-type) - pred (::bounty-filter-type.predicate filter-type-def) - pre-pred-processor (::bounty-filter-type.pre-predicate-value-processor filter-type-def) - filter-value (cond-> filter-value - pre-pred-processor pre-pred-processor)] - (partial pred filter-value))))) + (let [filter-preds (bounty-filter-values-by-type->predicates filters-by-type) filters-pred (fn [bounty] (every? #(% bounty) filter-preds))] (cond->> bounties From 35ad4e48d07e9fc7b7eaadedd45df9e5a5848c6b Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 15:21:34 +0100 Subject: [PATCH 33/63] add filter for claims --- src/cljs/commiteth/ui_model.cljs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 9fab8c8..0a99444 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -44,6 +44,9 @@ (def bounty-filter-type-date-options (keys bounty-filter-type-date-options-def)) +(defn bounty-filter-type-date-option->name [option] + (bounty-filter-type-date-options-def option)) + (def bounty-filter-type-date-pre-predicate-value-processor (fn [filter-value] (let [filter-from (condp = filter-value @@ -57,6 +60,13 @@ (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] (t/within? filter-value-interval created-at-date))))) +(def bounty-filter-type-claims-options-def {::bounty-filter-type-claims-option|no-claims "With no claims"}) + +(def bounty-filter-type-claims-options (keys bounty-filter-type-claims-options-def)) + +(defn bounty-filter-type-claims-option->name [option] + (bounty-filter-type-claims-options-def option)) + (def bounty-filter-types-def {::bounty-filter-type|value {::bounty-filter-type.name "Value" @@ -92,16 +102,22 @@ ::bounty-filter-type.predicate (fn [filter-value bounty] (->> filter-value (some #{(:repo-owner bounty)}) - boolean))}}) + boolean))} + + ::bounty-filter-type|claims + {::bounty-filter-type.name "Claims" + ::bounty-filter-type.category ::bounty-filter-type-category|single-static-option + ::bounty-filter-type.options bounty-filter-type-claims-options-def + ::bounty-filter-type.predicate (fn [filter-value bounty] + (condp = filter-value + ::bounty-filter-type-claims-option|no-claims + (<= 0 (:claim-count bounty))))}}) (def bounty-filter-types (keys bounty-filter-types-def)) (defn bounty-filter-type->name [filter-type] (-> bounty-filter-types-def (get filter-type) ::bounty-filter-type.name)) -(defn bounty-filter-type-date-option->name [option] - (bounty-filter-type-date-options-def option)) - (defn bounty-filter-value->short-text [filter-type filter-value] (cond (= filter-type ::bounty-filter-type|date) @@ -114,6 +130,9 @@ (= filter-type ::bounty-filter-type|value) (str "$" (first filter-value) "-$" (second filter-value)) + (= filter-type ::bounty-filter-type|claims) + (bounty-filter-type-claims-option->name filter-value) + :else (str filter-type " with val " filter-value))) From eef57a3046547a457cfcd3adbc0abab7859eab43 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 16:06:01 +0100 Subject: [PATCH 34/63] add some docstrings --- src/cljs/commiteth/ui_model.cljs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 0a99444..2efba9c 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -48,6 +48,9 @@ (bounty-filter-type-date-options-def option)) (def bounty-filter-type-date-pre-predicate-value-processor + "It converts an option of the filter type date to a cljs-time interval in which + that option is valid, so that you can check `cljs-time.core.within?` against that + interval and know if a `cljs-time` date is valid for that filter type date option." (fn [filter-value] (let [filter-from (condp = filter-value ::bounty-filter-type-date-option|last-week (t/minus (t/now) (t/weeks 1)) @@ -137,6 +140,11 @@ (str filter-type " with val " filter-value))) (defn- bounty-filter-values-by-type->predicates [filters-by-type] + "It receives a map with filter types as keys and filter values as values and + returns a lazy seq of predicates, one for each pair of filter type and value. + Those predicate can receive a bounty and tell whether that bounty passes + the filter type with that filter value. It removes filter types with a `nil` + filter value." (->> filters-by-type ; used `nil?` because a valid filter value can be `false` (remove #(nil? (val %))) From 489260aaf4e67c6ceb4d5a41da648aeeba375938 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 31 Jan 2018 18:51:44 +0100 Subject: [PATCH 35/63] change <= for < --- src/cljs/commiteth/ui_model.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 2efba9c..db3234d 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -114,7 +114,7 @@ ::bounty-filter-type.predicate (fn [filter-value bounty] (condp = filter-value ::bounty-filter-type-claims-option|no-claims - (<= 0 (:claim-count bounty))))}}) + (= 0 (:claim-count bounty))))}}) (def bounty-filter-types (keys bounty-filter-types-def)) From 9e9d0f6d4d9a4e5e0fc09451b7dac651b46ea223 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Wed, 31 Jan 2018 17:48:26 +0200 Subject: [PATCH 36/63] Change dropdown component: remove doall, use into instead of conj --- src/cljs/commiteth/common.cljs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cljs/commiteth/common.cljs b/src/cljs/commiteth/common.cljs index a613925..0b0898f 100644 --- a/src/cljs/commiteth/common.cljs +++ b/src/cljs/commiteth/common.cljs @@ -15,21 +15,21 @@ "If val-ratom is set, preselect it in the dropdown. Add value of val-ratom if it's missing from items list. Otherwise, prepend title as a disabled option" - (let [items (cond-> items + (let [items (cond->> items (and @val-ratom (not (contains? (set items) @val-ratom))) - (conj @val-ratom) + (into [@val-ratom]) (not @val-ratom) - (conj title))] + (into [title]))] (fn [] [:select.ui.basic.selection.dropdown (merge props {:on-change #(reset! val-ratom (-> % .-target .-value)) :default-value (or @val-ratom title)}) - (doall (for [item items] + (for [item items] ^{:key item} [:option {:value item :disabled (= item title)} - item]))]))) + item])]))) (defn moment-timestamp [time] (let [now (.now js/Date.) From 50036b10dd6f296aa17da7dd93d5f25cc2f40c86 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Thu, 1 Feb 2018 15:40:54 +0200 Subject: [PATCH 37/63] Address dropdown: move items list construction to invocation point --- src/cljs/commiteth/common.cljs | 27 ++++++++++---------------- src/cljs/commiteth/update_address.cljs | 19 ++++++++++++++---- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/cljs/commiteth/common.cljs b/src/cljs/commiteth/common.cljs index 0b0898f..4399156 100644 --- a/src/cljs/commiteth/common.cljs +++ b/src/cljs/commiteth/common.cljs @@ -13,23 +13,16 @@ (defn dropdown [props title val-ratom items] "If val-ratom is set, preselect it in the dropdown. - Add value of val-ratom if it's missing from items list. - Otherwise, prepend title as a disabled option" - (let [items (cond->> items - (and @val-ratom - (not (contains? (set items) @val-ratom))) - (into [@val-ratom]) - (not @val-ratom) - (into [title]))] - (fn [] - [:select.ui.basic.selection.dropdown - (merge props {:on-change - #(reset! val-ratom (-> % .-target .-value)) - :default-value (or @val-ratom title)}) - (for [item items] - ^{:key item} [:option {:value item - :disabled (= item title)} - item])]))) + Otherwise, prepend title as a disabled option." + (fn [] + [:select.ui.basic.selection.dropdown + (merge props {:on-change + #(reset! val-ratom (-> % .-target .-value)) + :default-value (or @val-ratom title)}) + (for [item items] + ^{:key item} [:option {:value item + :disabled (= item title)} + item])])) (defn moment-timestamp [time] (let [now (.now js/Date.) diff --git a/src/cljs/commiteth/update_address.cljs b/src/cljs/commiteth/update_address.cljs index 9261671..60e298f 100644 --- a/src/cljs/commiteth/update_address.cljs +++ b/src/cljs/commiteth/update_address.cljs @@ -24,10 +24,21 @@ [:p "Insert your Ethereum address in hex format."] [:div.field (if-not (empty? web3-accounts) - [dropdown {:class "address-input"} - "Select address" - address - (map str/lower-case web3-accounts)] + ; Add value of address if it's missing from items list. + ; If address is empty, add title + (let [accounts (map str/lower-case web3-accounts) + addr @address + title "Select address" + items (cond->> accounts + (and addr + (not (contains? (set accounts) addr))) + (into [addr]) + (not addr) + (into [title]))] + [dropdown {:class "address-input"} + title + address + items]) [:div.ui.input.address-input [input address {:placeholder "0x0000000000000000000000000000000000000000" :auto-complete "off" From 8a75d5d68c6bf778a10702af60e7badc28eca4f5 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Thu, 1 Feb 2018 16:32:10 +0200 Subject: [PATCH 38/63] Address dropdown: Apply case-insensitive comparison only during component setup --- src/cljs/commiteth/update_address.cljs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/cljs/commiteth/update_address.cljs b/src/cljs/commiteth/update_address.cljs index 60e298f..14ceaa1 100644 --- a/src/cljs/commiteth/update_address.cljs +++ b/src/cljs/commiteth/update_address.cljs @@ -11,8 +11,7 @@ (let [db (rf/subscribe [:db]) user (rf/subscribe [:user]) updating-address (rf/subscribe [:get-in [:updating-address]]) - address (r/atom (some-> @(rf/subscribe [:get-in [:user :address]]) - str/lower-case))] + address (r/atom @(rf/subscribe [:get-in [:user :address]]))] (fn [] (let [web3 (:web3 @db) web3-accounts (when web3 @@ -29,12 +28,14 @@ (let [accounts (map str/lower-case web3-accounts) addr @address title "Select address" - items (cond->> accounts - (and addr - (not (contains? (set accounts) addr))) - (into [addr]) - (not addr) - (into [title]))] + addr-not-in-web3? (and addr (as-> web3-accounts acc + (map str/lower-case acc) + (set acc) + (contains? acc addr) + (not acc))) + items (cond->> web3-accounts + addr-not-in-web3? (into [addr]) + (not addr) (into [title]))] [dropdown {:class "address-input"} title address From a3e42fe61f81f1722de092a80f109af57e6426bf Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 1 Feb 2018 15:56:15 +0100 Subject: [PATCH 39/63] some filtering and sorting fixes --- src/cljs/commiteth/bounties.cljs | 2 +- src/cljs/commiteth/handlers.cljs | 4 ++-- src/cljs/commiteth/subscriptions.cljs | 9 ++++++++- src/cljs/commiteth/ui_model.cljs | 7 ++++--- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 55e2c29..5d7600c 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -84,7 +84,7 @@ (let [new-min (min current-min (max default-min new-max))] (on-change-fn new-min new-max)))] [:div - "$0 - $1000+" + (::ui-model/bounty-filter.type.header filter-type-def) [bounties-filter-tooltip-value-input-view "Min" tooltip-open? (merge common-range-opts {:current-val current-min :on-change-val on-min-change-fn})] diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index da58177..eb61374 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -465,11 +465,11 @@ ::set-open-bounties-sorting-type (fn [db [_ sorting-type]] (merge db {::db/open-bounties-sorting-type sorting-type - :bounty-page-number 1}))) + :page-number 1}))) (reg-event-db ::set-open-bounty-filter-type (fn [db [_ filter-type filter-value]] (-> db (assoc-in [::db/open-bounties-filters filter-type] filter-value) - (assoc :bounty-page-number 1)))) + (assoc :page-number 1)))) diff --git a/src/cljs/commiteth/subscriptions.cljs b/src/cljs/commiteth/subscriptions.cljs index 5598142..bb2a82a 100644 --- a/src/cljs/commiteth/subscriptions.cljs +++ b/src/cljs/commiteth/subscriptions.cljs @@ -2,7 +2,8 @@ (:require [re-frame.core :refer [reg-sub]] [commiteth.db :as db] [commiteth.ui-model :as ui-model] - [commiteth.common :refer [items-per-page]])) + [commiteth.common :refer [items-per-page]] + [clojure.string :as string])) (reg-sub :db @@ -139,6 +140,12 @@ (map :repo-owner) set))) +(reg-sub + ::open-bounties-owners-sorted + :<- [::open-bounties-owners] + (fn [owners _] + (sort-by string/lower-case owners))) + (reg-sub ::open-bounties-currencies :<- [:open-bounties] diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index db3234d..2b4a3f3 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -63,7 +63,7 @@ (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] (t/within? filter-value-interval created-at-date))))) -(def bounty-filter-type-claims-options-def {::bounty-filter-type-claims-option|no-claims "With no claims"}) +(def bounty-filter-type-claims-options-def {::bounty-filter-type-claims-option|no-claims "Not claimed yet"}) (def bounty-filter-type-claims-options (keys bounty-filter-type-claims-options-def)) @@ -75,7 +75,8 @@ {::bounty-filter-type.name "Value" ::bounty-filter-type.category ::bounty-filter-type-category|range ::bounty-filter-type.min-val 0 - ::bounty-filter-type.max-val 1000 + ::bounty-filter-type.max-val 10000 + ::bounty-filter.type.header "$0 - $10000+" ::bounty-filter-type.predicate (fn [filter-value bounty] (let [min-val (first filter-value) max-val (second filter-value)] @@ -101,7 +102,7 @@ ::bounty-filter-type|owner {::bounty-filter-type.name "Owner" ::bounty-filter-type.category ::bounty-filter-type-category|multiple-dynamic-options - ::bounty-filter-type.re-frame-subs-key-for-options :commiteth.subscriptions/open-bounties-owners + ::bounty-filter-type.re-frame-subs-key-for-options :commiteth.subscriptions/open-bounties-owners-sorted ::bounty-filter-type.predicate (fn [filter-value bounty] (->> filter-value (some #{(:repo-owner bounty)}) From 3686004dc2182d890d01d0108ad93f1d090e9f86 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Fri, 2 Feb 2018 13:23:26 +0200 Subject: [PATCH 40/63] Include wkhtmltopdf reference --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 597831f..0124750 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The `develop` branch is automatically deployed here. ## Prerequisites -You will need [Leiningen](https://github.com/technomancy/leiningen) 2.0 or above installed. +You will need [Leiningen](https://github.com/technomancy/leiningen) 2.0 or above installed. Also, make sure that you have [wkhtmltoimage](https://wkhtmltopdf.org/downloads.html) available in your PATH. On macOS, it can be installed via `brew cask install wkhtmltopdf`. ### PostgreSQL From e3a9d07add7ce132a0cc05781a12e17f28f3d60f Mon Sep 17 00:00:00 2001 From: pablodip Date: Fri, 2 Feb 2018 23:39:49 +0100 Subject: [PATCH 41/63] fix filter single-static-option when clicking with touchpad in mac --- src/cljs/commiteth/bounties.cljs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 5d7600c..af1b2c7 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -98,10 +98,12 @@ (for [[option-type option-text] (::ui-model/bounty-filter-type.options filter-type-def)] ^{:key (str option-type)} [:div.open-bounties-filter-list-option - (merge {:on-click #(do (rf/dispatch [::handlers/set-open-bounty-filter-type - filter-type - option-type]) - (reset! tooltip-open? false))} + (merge {:on-click #(do (rf/dispatch [::handlers/set-open-bounty-filter-type + filter-type + option-type]) + (reset! tooltip-open? false)) + :tab-index 0 + :on-focus #(reset! tooltip-open? true)} (when (= option-type current-filter-value) {:class "active"})) option-text])]) From 1b9151e1e1a38b08dc70d40a3483a7847fa84497 Mon Sep 17 00:00:00 2001 From: pablodip Date: Fri, 2 Feb 2018 23:46:09 +0100 Subject: [PATCH 42/63] use updated-at in filtering and sorting --- resources/sql/queries.sql | 1 - src/clj/commiteth/routes/services.clj | 3 +-- src/cljs/commiteth/ui_model.cljs | 8 ++++---- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/resources/sql/queries.sql b/resources/sql/queries.sql index 1fa529c..e8a3115 100644 --- a/resources/sql/queries.sql +++ b/resources/sql/queries.sql @@ -422,7 +422,6 @@ SELECT i.payout_hash AS payout_hash, i.payout_receipt AS payout_receipt, i.updated AS updated, - i.created_at AS created_at, r.owner AS repo_owner, r.owner_avatar_url AS repo_owner_avatar_url, r.repo AS repo_name, diff --git a/src/clj/commiteth/routes/services.clj b/src/clj/commiteth/routes/services.clj index 6a60fec..82c5633 100644 --- a/src/clj/commiteth/routes/services.clj +++ b/src/clj/commiteth/routes/services.clj @@ -155,8 +155,7 @@ :value_usd :value-usd :claim_count :claim-count :balance_eth :balance-eth - :user_has_address :user-has-address - :created_at :created-at}] + :user_has_address :user-has-address}] (map #(-> % (rename-keys renames) (update :value-usd usd-decimal->str) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 2b4a3f3..46824a1 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -9,7 +9,7 @@ (def bounty-sorting-types-def {::bounty-sorting-type|most-recent {::bounty-sorting-type.name "Most recent" ::bounty-sorting-type.sort-key-fn (fn [bounty] - (:created-at bounty)) + (:updated-at bounty)) ::bounty-sorting-type.sort-comparator-fn compare} ::bounty-sorting-type|lowest-value {::bounty-sorting-type.name "Lowest value" ::bounty-sorting-type.sort-key-fn (fn [bounty] @@ -59,9 +59,9 @@ (t/interval filter-from (t/now))))) (def bounty-filter-type-date-predicate (fn [filter-value-interval bounty] - (when-let [created-at-inst (:created-at bounty)] - (let [created-at-date (-> created-at-inst inst-ms t-coerce/from-long)] - (t/within? filter-value-interval created-at-date))))) + (when-let [date-inst (:updated-at bounty)] + (let [date (-> date-inst inst-ms t-coerce/from-long)] + (t/within? filter-value-interval date))))) (def bounty-filter-type-claims-options-def {::bounty-filter-type-claims-option|no-claims "Not claimed yet"}) From bc72fd165d0b98dcb8a7a0c9eca4ab58a1d058fb Mon Sep 17 00:00:00 2001 From: pablodip Date: Sat, 3 Feb 2018 00:07:23 +0100 Subject: [PATCH 43/63] limit height of filter tooltips and add scroll to them if exceeded --- src/cljs/commiteth/bounties.cljs | 2 +- src/less/style.less | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index af1b2c7..34137bb 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -83,7 +83,7 @@ on-max-change-fn (fn [new-max] (let [new-min (min current-min (max default-min new-max))] (on-change-fn new-min new-max)))] - [:div + [:div.open-bounties-filter-list (::ui-model/bounty-filter.type.header filter-type-def) [bounties-filter-tooltip-value-input-view "Min" tooltip-open? (merge common-range-opts {:current-val current-min diff --git a/src/less/style.less b/src/less/style.less index 0827245..6fb2407 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -475,7 +475,6 @@ position: absolute; min-width: 227px; margin-top: 12px; - padding: 24px 16px; border-radius: 10px; background-color: #ffffff; box-shadow: 0 15px 12px 0 rgba(161, 174, 182, 0.53), 0 0 38px 0 rgba(0, 0, 0, 0.05); @@ -483,6 +482,8 @@ font-size: 16px; line-height: 1.5; z-index: 999; + max-height: 300px; + overflow: scroll; .open-bounties-filter-element-tooltip-value-input-container { display: flex; @@ -591,6 +592,7 @@ display: flex; flex-direction: column; align-items: flex-start; + margin: 24px 16px; } .open-bounties-filter-list-option { From 7fad2dc03cf83aa1a0d633c1fff70e4feeb231ad Mon Sep 17 00:00:00 2001 From: pablodip Date: Sat, 3 Feb 2018 09:47:06 +0100 Subject: [PATCH 44/63] support for unversioned config files and some missing config keys in the dev base config file --- .gitignore | 4 ++++ env/dev/resources/config.edn | 4 +++- project.clj | 9 ++++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 4f4f73c..39c20db 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,7 @@ profiles.clj .idea resources/contracts node_modules +/config-prod.edn +/config-dev.edn +/config-test.edn +/src/java diff --git a/env/dev/resources/config.edn b/env/dev/resources/config.edn index 1ee9264..012811d 100644 --- a/env/dev/resources/config.edn +++ b/env/dev/resources/config.edn @@ -11,7 +11,7 @@ :eth-password "XXX" ;; RPC URL to ethereum node to be used - :eth-rpc-url "http://localhost:8547" + :eth-rpc-url "http://localhost:8545" :eth-wallet-file "/some/location" ;; address of token registry to be used @@ -43,5 +43,7 @@ ;; needeed when :hubspot-contact-create-enabled :hubspot-api-key "xxxxxxx-xxxx-x-xxxx-xxxx" + :user-whitelist #{} + ;; used for blacklisting tokens from token registry data :token-blacklist #{}} diff --git a/project.clj b/project.clj index e6af24a..0678470 100644 --- a/project.clj +++ b/project.clj @@ -94,7 +94,8 @@ :profiles - {:uberjar {:omit-source true + {:uberjar {:jvm-opts ["-server" "-Dconf=config-prod.edn"] + :omit-source true :prep-tasks ["build-contracts" "javac" "compile" ["cljsbuild" "once" "min"] ["less" "once"]] :cljsbuild {:builds @@ -116,7 +117,8 @@ :uberjar-name "commiteth.jar" :source-paths ["env/prod/clj"] :resource-paths ["env/prod/resources"]} - :dev {:dependencies [[prone "1.1.4"] + :dev {:jvm-opts ["-server" "-Dconf=config-dev.edn"] + :dependencies [[prone "1.1.4"] [ring/ring-mock "0.3.1"] [ring/ring-devel "1.6.2"] [pjstadig/humane-test-output "0.8.3"] @@ -150,7 +152,8 @@ :nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]} :injections [(require 'pjstadig.humane-test-output) (pjstadig.humane-test-output/activate!)]} - :test {:resource-paths ["env/dev/resources" "env/test/resources"] + :test {:jvm-opts ["-server" "-Dconf=config-test.edn"] + :resource-paths ["env/dev/resources" "env/test/resources"] :dependencies [[devcards "0.2.4"]] :cljsbuild {:builds From fe9125202f3c2110bde8df3f3fd5e47ec6900b4a Mon Sep 17 00:00:00 2001 From: pablodip Date: Sat, 3 Feb 2018 09:51:06 +0100 Subject: [PATCH 45/63] adapt docs to unversioned config files --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 597831f..aee9657 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Web3j [2.3.0](https://github.com/web3j/web3j/releases/tag/v2.3.0) is required an ## Application config -Make sure that `env/dev/resources/config.edn` is correctly populated. Description of config fields is given below: +Make sure to create `/config-dev.edn` and populate it correctly, which is based on `env/dev/resources/config.edn`. Description of config fields is given below: Key | Description --- | --- @@ -81,7 +81,7 @@ testnet-token-data | Token data map, useful if there are Geth connectivity probl Open Bounty uses both OAuth App and GitHub App integration. ### OAuth App -Follow the steps [here](https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/). Specify the value of `:server-address` as "Homepage URL", and `:server-address` + `/callback` as "Authorization callback URL". Be sure to copy Client ID and Client Secret values to `config.edn`. +Follow the steps [here](https://developer.github.com/apps/building-oauth-apps/creating-an-oauth-app/). Specify the value of `:server-address` as "Homepage URL", and `:server-address` + `/callback` as "Authorization callback URL". Be sure to copy Client ID and Client Secret values in the config file. ### GitHub App Follow the steps [here](https://developer.github.com/apps/building-github-apps/creating-a-github-app/). Be sure to specify `:server-address` + `/webhook-app` as "Webhook URL", and `:webhook-secret` as "Webhook Secret". From 52f95b82543bc1f72ec0c83033a3dc2be918521d Mon Sep 17 00:00:00 2001 From: pablodip Date: Mon, 5 Feb 2018 08:48:22 +0100 Subject: [PATCH 46/63] fix some default values in dev env --- env/dev/resources/config.edn | 8 +++++--- src/clj/commiteth/eth/multisig_wallet.clj | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/env/dev/resources/config.edn b/env/dev/resources/config.edn index 012811d..571a6ae 100644 --- a/env/dev/resources/config.edn +++ b/env/dev/resources/config.edn @@ -15,12 +15,14 @@ :eth-wallet-file "/some/location" ;; address of token registry to be used - :tokenreg-addr "0x..." + ;; this is the default value for ropsten + :tokenreg-addr "0x7d127a3e3b5e72cd8f15e7dee650abe4fcced2b9" ;; format of tokenreg records' base field, possible values :status, :parity - :tokenreg-base-format :parity + :tokenreg-base-format :status ;; address of factory contract used for deploying bounty contracts - :contract-factory-addr "0x..." + ;; this is the default value for ropsten + :contract-factory-addr "0x3B9A3c062Bdb640b5039C0cCda4157737d732F95" ;; commiteth-test-tpatja :github-client-id "CLIENT ID" diff --git a/src/clj/commiteth/eth/multisig_wallet.clj b/src/clj/commiteth/eth/multisig_wallet.clj index 67bbb06..f5393ab 100644 --- a/src/clj/commiteth/eth/multisig_wallet.clj +++ b/src/clj/commiteth/eth/multisig_wallet.clj @@ -29,7 +29,7 @@ :confirmation (eth/event-sig->topic-id "Confirmation(address,uint256)")}) (defn factory-contract-addr [] - (env :contract-factory-addr "0x47F56FD26EEeCda4FdF5DB5843De1fe75D2A64A6")) + (env :contract-factory-addr)) (defn tokenreg-base-format ;; status tokenreg uses eg :base 18, while parity uses :base 1000000000000 From 417018572ed84bb047cd1542b93f07c542555977 Mon Sep 17 00:00:00 2001 From: Churikova Tetiana Date: Mon, 5 Feb 2018 16:14:28 +0200 Subject: [PATCH 47/63] add ability to delete fork; rework BaseTestCase to use 2 drivers and setup\teardown classmethods; move all preconditions for tests to setup\teardown classmethods. --- test/end-to-end/pages/thirdparty/github.py | 26 ++- test/end-to-end/tests/__init__.py | 1 + test/end-to-end/tests/basetestcase.py | 175 ++++++++++++++------- test/end-to-end/tests/config_example.ini | 9 +- test/end-to-end/tests/postconditions.py | 3 +- test/end-to-end/tests/test_contracts.py | 42 +---- 6 files changed, 159 insertions(+), 97 deletions(-) diff --git a/test/end-to-end/pages/thirdparty/github.py b/test/end-to-end/pages/thirdparty/github.py index 3607bc9..60333be 100644 --- a/test/end-to-end/pages/thirdparty/github.py +++ b/test/end-to-end/pages/thirdparty/github.py @@ -136,7 +136,20 @@ class ForkedRepoText(BaseText): super(ForkedRepoText, self).__init__(driver) self.locator = self.Locator.css_selector(".commit-tease") +class DeleteRepo(BaseButton): + def __init__(self, driver): + super(DeleteRepo, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//button[text()[contains(.,' Delete this repository')]]") +class RepoNameBoxInPopup(BaseEditBox): + def __init__(self, driver): + super(RepoNameBoxInPopup, self).__init__(driver) + self.locator = self.Locator.css_selector("input[aria-label='Type in the name of the repository to confirm that you want to delete this repository.']") + +class ConfirmDeleteButton(BaseButton): + def __init__(self, driver): + super(ConfirmDeleteButton, self).__init__(driver) + self.locator = self.Locator.xpath_selector("//button[text()[contains(.,'I understand the consequences, delete')]]") class GithubPage(BasePageObject): def __init__(self, driver): @@ -169,6 +182,10 @@ class GithubPage(BasePageObject): self.user_account_in_fork_popup = UserAccountInForkPopup(self.driver) self.forked_repo_text = ForkedRepoText(self.driver) + self.delete_repo = DeleteRepo(self.driver) + self.repo_name_confirm_delete = RepoNameBoxInPopup(self.driver) + self.confirm_delete = ConfirmDeleteButton(self.driver) + def get_issues_page(self): self.driver.get(test_data.config['ORG']['gh_repo'] + 'issues') @@ -205,7 +222,6 @@ class GithubPage(BasePageObject): self.cross_button.click() self.submit_new_issue_button.click() test_data.issue['id'] = self.issue_id.text[1:] - logging.info("Issue id is %s" % test_data.issue['id']) logging.info("Issue title is %s" % test_data.issue['title']) def fork_repo(self, initial_repo, wait=60): @@ -248,5 +264,13 @@ class GithubPage(BasePageObject): if test_data.local_repo_path: shutil.rmtree(test_data.local_repo_path) + def delete_fork(self): + self.get_url(test_data.config['DEV']['gh_forked_repo'] + 'settings') + self.delete_repo.click() + self.repo_name_confirm_delete.send_keys(test_data.config['ORG']['gh_repo_name']) + self.confirm_delete.click() + + + diff --git a/test/end-to-end/tests/__init__.py b/test/end-to-end/tests/__init__.py index 9d59efe..49b8c0e 100644 --- a/test/end-to-end/tests/__init__.py +++ b/test/end-to-end/tests/__init__.py @@ -3,6 +3,7 @@ import configparser class TestData(object): def __init__(self): + self.test_name = None self.config = configparser.ConfigParser() # define here path to your config.ini file diff --git a/test/end-to-end/tests/basetestcase.py b/test/end-to-end/tests/basetestcase.py index 9ba9409..3f618b6 100644 --- a/test/end-to-end/tests/basetestcase.py +++ b/test/end-to-end/tests/basetestcase.py @@ -4,63 +4,25 @@ from selenium.common.exceptions import WebDriverException from tests.postconditions import remove_application, remove_installation from os import environ, path from tests import test_data - +from pages.thirdparty.github import GithubPage +from pages.openbounty.landing import LandingPage class BaseTestCase: - @property - def sauce_username(self): - return environ.get('SAUCE_USERNAME') - - - @property - def sauce_access_key(self): - return environ.get('SAUCE_ACCESS_KEY') - - - @property - def executor_sauce_lab(self): - return 'http://%s:%s@ondemand.saucelabs.com:80/wd/hub' % (self.sauce_username, self.sauce_access_key) def print_sauce_lab_info(self, driver): sys.stdout = sys.stderr print("SauceOnDemandSessionID=%s job-name=%s" % (driver.session_id, pytest.config.getoption('build'))) - - @property - def capabilities_sauce_lab(self): - - desired_caps = dict() - desired_caps['name'] = test_data.test_name - desired_caps['build'] = pytest.config.getoption('build') - desired_caps['platform'] = "MAC" - desired_caps['browserName'] = 'Chrome' - desired_caps['screenResolution'] = '2048x1536' - desired_caps['captureHtml'] = False - return desired_caps - - @property - def environment(self): - return pytest.config.getoption('env') - - def setup_method(self): - - self.errors = [] - self.cleanup = None - - if self.environment == 'local': - options = webdriver.ChromeOptions() - options.add_argument('--start-fullscreen') - options.add_extension( - path.abspath(test_data.config['Paths']['tests_absolute'] + 'resources/metamask3_12_0.crx')) - # for chromedriver 2.35 - self.driver = webdriver.Chrome(chrome_options=options) - if self.environment == 'sauce': - self.driver = webdriver.Remote(self.executor_sauce_lab, - desired_capabilities=self.capabilities_sauce_lab) - self.driver.implicitly_wait(5) - - + def return_caps(self): + sauce_lab_cap = dict() + sauce_lab_cap['name'] = test_data.test_name + sauce_lab_cap['build'] = pytest.config.getoption('build') + sauce_lab_cap['platform'] = "MAC" + sauce_lab_cap['browserName'] = 'Chrome' + sauce_lab_cap['screenResolution'] = '2048x1536' + sauce_lab_cap['captureHtml'] = False + return sauce_lab_cap def verify_no_errors(self): if self.errors: @@ -69,13 +31,116 @@ class BaseTestCase: msg += (error + '\n') pytest.fail(msg, pytrace=False) - def teardown_method(self): - if self.cleanup: - remove_application(self.driver) - remove_installation(self.driver) + @classmethod + def setup_class(cls): + cls.errors = [] + cls.environment = pytest.config.getoption('env') +########################################################################################################################################################## +######### Drivers setup +########################################################################################################################################################## + + # + # Dev Chrome options + # + cls.capabilities_dev = webdriver.ChromeOptions() + cls.capabilities_dev.add_argument('--start-fullscreen') + + # + # Org Chrome options + # + cls.capabilities_org = webdriver.ChromeOptions() + # doesn't work on sauce env + # cls.capabilities_org.add_extension(path.abspath(test_data.config['Paths']['tests_absolute'] + 'resources/metamask3_12_0.crx')) + + # + # SauceLab capabilities + # + cls.executor_sauce_lab = 'http://%s:%s@ondemand.saucelabs.com:80/wd/hub' % ( + environ.get('SAUCE_USERNAME'), environ.get('SAUCE_ACCESS_KEY')) + + cls.return_caps(cls) + sauce_lab_cap_dev = cls.capabilities_dev.to_capabilities() + cls.capabilities_sauce_lab_dev = sauce_lab_cap_dev + + cls.return_caps(cls) + sauce_lab_cap_org = cls.capabilities_org.to_capabilities() + cls.capabilities_sauce_lab_org = sauce_lab_cap_org + + + if cls.environment == 'local': + cls.driver_dev = webdriver.Chrome(chrome_options=cls.capabilities_dev) + cls.driver_org = webdriver.Chrome(chrome_options=cls.capabilities_org) + + if cls.environment == 'sauce': + cls.driver_dev = webdriver.Remote(cls.executor_sauce_lab, + desired_capabilities=cls.capabilities_sauce_lab_dev) + cls.print_sauce_lab_info(cls, cls.driver_dev) + cls.driver_org = webdriver.Remote(cls.executor_sauce_lab, + desired_capabilities=cls.capabilities_sauce_lab_org) + cls.print_sauce_lab_info(cls, cls.driver_org) + + for driver in cls.driver_dev, cls.driver_org: + driver.implicitly_wait(10) + +########################################################################################################################################################## +######### Actions for each driver before class +########################################################################################################################################################## + + ######ORG + landing = LandingPage(cls.driver_org) + landing.get_landing_page() + + # Sign Up to SOB + cls.github_org = landing.login_button.click() + cls.github_org.sign_in(test_data.config['ORG']['gh_login'], + test_data.config['ORG']['gh_password']) + assert cls.github_org.permission_type.text == 'Personal user data' + bounties_page = cls.github_org.authorize_sob.click() + + # SOB Plugin installation and navigate to "Open bounties" + cls.github_org.install_sob_plugin() + assert bounties_page.bounties_header.text == 'Bounties' + assert bounties_page.top_hunters_header.text == 'Top 5 hunters' + + ######DEV + cls.github_dev = GithubPage(cls.driver_dev) + # Sign In to GH as Developer + cls.github_dev.get_login_page() + cls.github_dev.sign_in(test_data.config['DEV']['gh_login'], + test_data.config['DEV']['gh_password']) + + # Fork repo as Developer from Organization + cls.github_dev.fork_repo(test_data.config['ORG']['gh_repo']) + + # Cloning repo to local git as Developer and set upstream to Organization (via HTTPS) + cls.github_dev.clone_repo(test_data.config['ORG']['gh_repo'], + test_data.config['DEV']['gh_username'], + test_data.config['ORG']['gh_repo_name'], + 'git_repo') + cls.verify_no_errors(cls) + + + + + @classmethod + def teardown_class(cls): + + ######ORG + + # SOB Plugin remove installation + remove_application(cls.driver_org) + remove_installation(cls.driver_org) + + ######DEV + + cls.github_dev.delete_fork() + cls.github_dev.clean_repo_local_folder() try: - self.print_sauce_lab_info(self.driver) - self.driver.quit() + cls.driver_dev.quit() + cls.driver_org.quit() except WebDriverException: pass + + + diff --git a/test/end-to-end/tests/config_example.ini b/test/end-to-end/tests/config_example.ini index e807118..6d2f8c3 100644 --- a/test/end-to-end/tests/config_example.ini +++ b/test/end-to-end/tests/config_example.ini @@ -5,13 +5,15 @@ url = https://openbounty.status.im:444/ sob_test_app = http://github.com/apps/status-open-bounty-app-test gh_login = https://github.com/login [Paths] -;AbsolutePath to 'tests' folder -tests_absolute = /usr/dir/open-bounty/test/end-to-end/tests/ +;AbsolutePath to 'end-to-end' folder +tests_absolute = /usr/dir/open-bounty/test/end-to-end/ [ORG] ;GitHub credentials for organization owner gh_login = login gh_password = password +;GitHub organization path +gh_org_profile = https://github.com/organizations/organization/ ;GitHub repo path gh_repo = https://github.com/org_name/repo_name/ ;GitHub repo name @@ -24,4 +26,5 @@ mm_password = password ;GitHub credentials for developer gh_login = login gh_password = password -gh_username = username \ No newline at end of file +gh_username = username +gh_forked_repo = https://github.com/username/reponame/ \ No newline at end of file diff --git a/test/end-to-end/tests/postconditions.py b/test/end-to-end/tests/postconditions.py index b9f4c7d..1b09d42 100644 --- a/test/end-to-end/tests/postconditions.py +++ b/test/end-to-end/tests/postconditions.py @@ -1,5 +1,6 @@ from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException +from tests import test_data def remove_application(driver): @@ -13,7 +14,7 @@ def remove_application(driver): def remove_installation(driver): try: - driver.get('https://github.com/organizations/Org4/settings/installations') + driver.get(test_data.config['ORG']['gh_org_profile'] + 'settings/installations') driver.find_element(By.CSS_SELECTOR, '.iconbutton').click() driver.find_element(By.XPATH, "//a[@class='btn btn-danger']").click() driver.find_element(By.CSS_SELECTOR, '.facebox-popup .btn-danger').click() diff --git a/test/end-to-end/tests/test_contracts.py b/test/end-to-end/tests/test_contracts.py index 05cc539..17c66e2 100644 --- a/test/end-to-end/tests/test_contracts.py +++ b/test/end-to-end/tests/test_contracts.py @@ -11,52 +11,20 @@ from tests import test_data class TestLogin(BaseTestCase): def test_deploy_new_contract(self): - self.cleanup = True - landing = LandingPage(self.driver) - landing.get_landing_page() - - # Sign Up to SOB - github = landing.login_button.click() - github.sign_in(test_data.config['ORG']['gh_login'], - test_data.config['ORG']['gh_password']) - assert github.permission_type.text == 'Personal user data' - bounties_page = github.authorize_sob.click() - - # SOB Plugin installation and navigate to "Open bounties" - github.install_sob_plugin() - assert bounties_page.bounties_header.text == 'Bounties' - assert bounties_page.top_hunters_header.text == 'Top 5 hunters' # Waiting for deployed contract; test_data.issue created here - github.create_new_bounty() - github.get_deployed_contract() + self.github_org.create_new_bounty() + self.github_org.get_deployed_contract() # Navigate and check top bounty in "Open bounties" - bounties_page = BountiesPage(self.driver) + bounties_page = BountiesPage(self.driver_org) bounties_page.get_bounties_page() titles = bounties_page.bounty_titles.find_elements() assert titles[0].text == test_data.issue['title'] - def test_forking_repo(self): - github = GithubPage(self.driver) - self.cleanup = True - - # Sign In to GH as Developer - github.get_login_page() - github.sign_in(test_data.config['DEV']['gh_login'], - test_data.config['DEV']['gh_password']) - - # Fork repo as Developer from Organization - github.fork_repo(test_data.config['ORG']['gh_repo']) - - # Cloning repo to local git as Developer and set upstream to Organization (via HTTPS) - github.clone_repo(test_data.config['ORG']['gh_repo'], - test_data.config['DEV']['gh_username'], - test_data.config['ORG']['gh_repo_name'], - 'git_repo') - - github.clean_repo_local_folder() + + From 7cb4389e3b55eb455cee61f39c76fe17a2e368f4 Mon Sep 17 00:00:00 2001 From: pablodip Date: Mon, 5 Feb 2018 16:12:41 +0100 Subject: [PATCH 48/63] adding missing font files --- resources/public/fonts/PostGrotesk-Book.eot | Bin 0 -> 174344 bytes resources/public/fonts/PostGrotesk-Book.svg | 3 +++ resources/public/fonts/PostGrotesk-Book.woff | Bin 0 -> 64051 bytes resources/public/fonts/PostGrotesk-Medium.eot | Bin 0 -> 178630 bytes resources/public/fonts/PostGrotesk-Medium.svg | 3 +++ resources/public/fonts/PostGrotesk-Medium.woff | Bin 0 -> 66471 bytes .../fonts/RobotoRegular/RobotoRegular.eot | Bin 0 -> 50854 bytes .../fonts/RobotoRegular/RobotoRegular.ttf | Bin 0 -> 50656 bytes .../fonts/RobotoRegular/RobotoRegular.woff | Bin 0 -> 26104 bytes 9 files changed, 6 insertions(+) create mode 100644 resources/public/fonts/PostGrotesk-Book.eot create mode 100644 resources/public/fonts/PostGrotesk-Book.svg create mode 100644 resources/public/fonts/PostGrotesk-Book.woff create mode 100644 resources/public/fonts/PostGrotesk-Medium.eot create mode 100644 resources/public/fonts/PostGrotesk-Medium.svg create mode 100644 resources/public/fonts/PostGrotesk-Medium.woff create mode 100755 resources/public/fonts/RobotoRegular/RobotoRegular.eot create mode 100755 resources/public/fonts/RobotoRegular/RobotoRegular.ttf create mode 100755 resources/public/fonts/RobotoRegular/RobotoRegular.woff diff --git a/resources/public/fonts/PostGrotesk-Book.eot b/resources/public/fonts/PostGrotesk-Book.eot new file mode 100644 index 0000000000000000000000000000000000000000..06846d371bd63a9ef30f5212b6c2bc98ef5a2f54 GIT binary patch literal 174344 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 NZ@r=KCqmy({soe@7q + + diff --git a/resources/public/fonts/PostGrotesk-Book.woff b/resources/public/fonts/PostGrotesk-Book.woff new file mode 100644 index 0000000000000000000000000000000000000000..47b48d0c948fadc5637d529b594175ef2aaac89b GIT binary patch literal 64051 zcmYIv1CS<76XrX%ZSKtM*w&71+vbjK+qP}nwr$(qx%vLPi0h6gDziGD%KIE{lvBUv0?omQ1kfAekyACN*4fM=UoJG%Zn zC_exIx&{EitV;4{l3Ljs{@9^L{=~ih53v3@cGmi?KXHLZe|Uud0h9#hw~fBFF#yo@ zb05Gz?Evbz7_XpWXY1ey0QCI$gZ<&+n070RlH2_?{^6ob{_vuH5c?oRdJO>jkpRcW zxzE#Zx(M7)04$LI+6XXp7~=6?IURJf{O$b>3i=I_^P@rmfd8un09@A%^^ElNvcGeJ z{QQ)ke73$hlfPm4k&JpD;Q-MD;3NMT{rCoc2KWIW{!@OKqyPqh&5x7-?et&8e?CkU z^gjE0$9sDlL&_rj{PG|Kn6{1S4PL=ejeY&VU|}ynFj2e*UcHCW|G>h-LiebrZhx5? z{sf-674`Gee;%Xa-(pLBrl$Z9Q2~^JP<|Tm$L~#?z zqQ!B1yLqwmM`pu`ddo+?$Bxt9z)j}P+ry{#&V$FaLja4!*jIJ5UW`Q?PZho<%)&12 z7s8U^aNqBwRlL=Xb0}7NRsaU34{75^-AsAk^t_RW0M4ZYC4!D>n-`k1S*DkOQ?qVD zI1zh3BY`AuiI@Rjc!N1Jn-CyAB6DMDZy z!l9X*ubO(PY~aFgf)dTZg&N4r?l#vflI;TynTJq6Ij-r6O_eBX<#jD(n&xHjauzB~ zD&_fUWeu#V<)}+2hlQ4fKE|S~o$1?$1)Hd~>Gv9zjY`8U>ZXhvmOgk3e~y~4W8`O& zrPdQv;?fahQC{9^`ey&uR)@5VuOQb6?Mr$nGRg$JU@ALwn?B zALw&*zz@G2$nSMjnk@L=5gnjbQv6sIz*@#$fL zpJ`qyUvgq*Bv@ulxFj-V>iVR5_(X$)K{^M$3*{>E%Ctb%=rX{DV2iS6kv!kxmbeLh zhdN((PLe67rz}}NkPP z8gwinbCo5}aeT9EpT((DAxm;#Gh zI?*s#wiLIMc*-W@Ii)Y*xOib%$UcgEsdq-}zGytjM{}Y7NL=SVuhB&4qdoO!Rf9BF zLwQ#1Wy~n&ZgbfRuzzZjG)yv5)g&`)Z4Yj$Aay5Wg;_T<||H{2Zj6$~Wu^(j5p zniU;xn*1 z-3r(mTou!r^3KlKIqBg@_y>Mfi>dm*zU?a6%~NR!ZN%pUR@i?i5WoPHmcj8(1rZ3PMU9UrPcs7)~4^PgyY@jebVFFYt##?++-H7%WA#Z_Q|%#_5Jnc&dU_n381!D6+Z^h=OHX6OYNLbtojU(_{n69;rE4p zz^BW{XPy^;+uy_yzf*wF3XZk_Qr(|3w{uE)RRD9TN4~O0Q9bd*o_^r~Vk7o(2Dmw? zc?IAdlfS|5h=6^9qupUr5&@F#*u5htU4i`|1(ZPxu*(a;1#U?Nkb>_d{62sW%lFt*|GP{dV9`Vu=McK?@M0dHf`moa4Bg`3nLY~8e%&BsYX51i0=E&AZmCvBP`UCEKy?0gJi0JZ2?qw=xb4id{*^#1x z%}8y_ey`{8a1x?3&B1uhA$&0)g1o}O{vpmDVej<)oeIXrcniNhL{N);qtC-Th;B8+ zYBf@_8Zc9fA^ZwHaz`VxOWJ)v7YBtvOAL`>2gA1yPpL$S2={ep%uCiY4_S5FXhsmm zyw{FuSxPlk+`=BIc}q0i466C8(OsXpJpY8aRn7H;+10cyb5kihZ+hYISoH3kVbidI zy$-%Avbt|QVSTf@rZb0chR__c!Q#=_Rl(E8yWBlpw_P_?H&HiIw_@LGzi7Xy&(0mq zZCdM~DdpP{;}Od>owbX9g@1y7lYN?9lMAfeT2EC{UXibCxFq4EpsmEVB>1HAwM36r zBT`mpktw0@+ag^;u|cU_qcXWPiBhmi#S#`1EoxkZg=7$t#R5Anc&gNznO+22d|1dZ zJTOz6X||iNPS2H^n#m3T+UesZ?P39rg9`UZ?THL#zZNJ6iOtNNIk<=s;LT-wMk-*xh_+m6zfUa z1ou*)xr6@t+`_`b3e#x9rTQ~WG0XjvX9#^1Whh$li>DL{w06*2kW0j_v4o3nyjTA+ zW09RqDbl7uS7 z!72>l&6IbYLG3n}DzwTeLE9B6XiJoCE^10D!!gNC8;zY3SydY1FOb<=ly2kGl0m;guj-s8OV4#WJkV~EI{i?68>>`yE(SeYn zBa*N8A{A>N%a^6}9t?StlqueN(bpazmg+$VMPzaN9N5Eo*@L%VLtJ-1Uh!n~5xYn9GSPSJ zMYtc-VMjP%2M{p*s0T@K3U=cuT=9QCh?!A``v)UNha_A5NwtPtwT3~p286Ukp=}H( zZ6sOg@q&;!Zp4r6R6D=G)};s*Sl4B^%-O8-V(6jV#D?LdM0k%r?!z<-J+X$x-?vkY zGxHa^xd#i6IzurWIBQO#I{kJ|q_!tMUfFZ@Xq3Wc?%bw}=`Hx-%cY;n&{zsh7X8x| zCEe3C6mcvhv&vw21ZN~*Z$#{w1B2)3v1P=WyaT+a6wPMNM7=d`@VHEvtYu{# z{(fF_YfpLHOlOeWN0vTPAg+{x{F-@J(D0%tnl5N9w$wqVI(s=tw<61qN0+A(Pn>iH zhxqF^u@)WA;?KgE{bcA=SZ|eExE`bEikhPwwj8#sNGBaXh%zFJOe4d`D;3WVEux>J z;N^=tF3*=-4{t0HqEnR|ngOoBjQv&`(AkMW$;*-L1QUg=SIC&8-{D!MHRHVBcmsF+ zt4`+D>cKk_0>6PE2)fY7i1R)s%O9mkpU{}vsWge56IV?CMr_jyG*N*h_IE+5a$du? z>DZd$<{#FDz(mIh6BZsL_U>t_BKLC6G<-Q>&Bgs!Q~Eec)tB0G12nNE3Jzl?B{4ICIwMvI<>Y;CIYGh(6A!lOlC3Hu z;bVlS1ped6XPHhfpVLQ+TROGx&atev(?6LrQ^KQ!iRC$=DB^ke$4sAP`=Xo1kcyQr z2b)0}?Ai1I%aB|PrRJT^{#|0-QYa1-5d23tP)Wzsf_yhaYe)?K7^3bpCo z!km%f7iiNw!=2X-7aB{Xb@IGs4w)KFBb7dVus)~_a{9RN4Hmj%RvQTjS+7Dur9Y4i z7AOactB6>yI0lQCLZv$lls2A4w+Jsi%ZbIZL{!w7k0lDwN6X{d>6{)<-5m8~yZ$Kg zn3*T>gnlRcRYM;3tC_o~PqPhbYcvdbedZ(5@mXLxO&y=%h=!xEjx?oWCVHE`xrF#= z;#pIW%$PyZGYCb$alMiSklUQt$ja_u47%c8zG!>2Xx zJh89Wi)Pk#F-N*vfvp#aIoMG!DnB4Fk*-qW8qi6}=2My4!&lgkJ%5!@&{>#GPKsk(zj_zTv2 zYiP|}=ro@e69?==8Z!SXv_BznJ!MYpXvKLby0X+Jp_h&Vv)a3Q3uaF zcO&*V+({DbMX0R$ngLVxqC6=QEE3hp`JmY1prJofRAxwPIDVzBoyqEHx*I=xzOWe& zFT&(T2PY^-X8P9=#MRQf%(VTM*;1jAHte$V{G{rZ@Mimkq06_h%Z2f?&@>#0<-b8` zTkN(&Q^-k~Kg~4`c4X4(U{A}fT{4Bnrsj`sC~QWp+8ei2DE~ruFTZrFMjkno*0CK9 zf(EL872w(`Mkc(osrg99fMPB&(7vH0b~1OSjlk3G2`IwS?jPfP<`{^yMZh2fLPTi$ zg_Np5w3RV(@=>yyVLjxDd!sp=Gg-c?l=%#@bjrT;!!kx1q#DN_{C8fKI3B~ciAGXL7>OEn;o8~x(@~w{WC)< z<5L$ppAo5!D(kV+FYD0|I=4lSdtZH3;7Ht;_=f5s=+iv_dS&`A7xS>)XGct7Ktf`u zdnf}B4j*h31Q$6@i<6oJ!y4K_N#S~ngf(#$txhl$Pk`_l9lM9%HmEBRu*Uf@( z8y+1Tk_{Qsnf{;cR_}aATv8tx034Z$`hR`2p&mcT9_%#XWMhb*pE<$-9C+|I`sBkm z6=T-xchDL8LBhB0zYE`2!1Fi4^bZ3-`~OZ?KrLV!2pq@}C=;k2=nxnlm=f3>xDogt z2q#D?$T}!Hs2XTA=pYy+m&XD3W491zfUPqDK#hqDbuMysbr{fsgbDzspn}(X^d#9 zX?AJ(X)S0AX=mwl=q~9485kJ>jLl49Oqa~PEOIQxtiY^#tlezfZ0+ov?5XU}99kU9 zoZOt5T(De@T$eoVeAxV@0$Kv)0#XZFzC4wdPCFLX=rO2eJrJ<$&NKAW;vbXm|vAf_hSTN_cvDCVLipu6yBoiFpNj z^?L1l6MBnyn|VijFMHqnVEfSfnE8zQQuw<2uKHQ{dHO~BmHWN=Bl~mv>-fj}5Bu-> ze+Iw@Fb9MOOa=l6q6U%$atHnm^bgDpY!5sPf)Any;tkRXiVqqMMh;d9_7Cn3-VG55 zX$=JpH41GE0}bO0vk4mv#|)PW&ktXYporj(kc+U3h>a+WXpLBnc#TAkq>dDdG>Ht4 ztdAUwT#h`B{1=59#Tca&Wfc_|l^9hW)g84Obsr5MO%cr=Ef%d7Z5Hhs9U7e)T_3$3 z{V#?vMkppV<~$YzLb^2c1WqXOq{Rx0x@JpPav(e_udf5L{4Na9+q>s8ZNl z1YIOiWKmRF^skt(*r2$!c)EnW#J^;<6tq;UbiItM%(?8c9KAfXg1ADW!l)v-qP=3f zlB`mpGP4S@in}VZ>be@eIV%DnGM%H%Pe%f)`#oH~`qtV;hm)sBA-#Q>QFgR#5 zcsW!)tT6mIGCImX8aSFg+B!NvdN~F0Xu;^K|R4cAv57T5j@d6u{eo7DK=>}IXihg`8kC-#X2Q3r8DI@RXsI4wK;V^ zjW|s^9XY)^13N=D!#m?UlRVQnvp9=7Yc@MS$2?a$4?iz5A3Q(4K)PVJP`n7esJ586 zxVRL&%)i{bLbl?+vbvhRI=Du$rm|MP4!SP*-*|P|<>pDM>O`T{l3cz0;I%4Fy}^F9yi~ zB!E9d9phE!2U>BGK=Hw;#tE!oT}!7JtY7;ijx0T&{aq(I*=nqVBE<_wBq)2cuW{qs3EM}5Tc$5v zdK@9uI^IWR=S>rPavVqaoObr!BS8Ue0S$Xg3rh<%fxmyJYlP6%06e1-W1wMxeinWV zwE*n1(7h%C5p_ze;eNkkf`CAovP4T6fpx8q>eSu8AUtgO6ew`pylxO?5Bkoc+B~k) zHd5i|QzS232-Mp=xO@OC ztRZU4gZuhUiSRMy_7o!8qAx781qKHZMuWq;;ulYU)oO^&Is10)7XY~X%#WY{LNX=E z1L zf-22z*J4^OY-CTc61f%fM&blC(1IVjc4nou_xWBW*Wz>@HS286jA$KS!;|}Fr%b0p z2VWnP`aMpclQ+2BpW_Qn6){1k2qw=vohL8bhm%uB!=xH>1uq@Dlr7M+^(73o3F%_HnjO$Q9X&n1^8qi!?bFHMWjZx z>gG83K-=8WY~bF>9rvi5U^DBtytS$35}RPdVBp6o;sF!|*@nMy>g$p{y((3}5Pe^e z?;MNqMQ*BNaM?_srKT_8q9FbzR9K$s;=Ij=1zFMZB1MV4Y75^+K>o=BM;vU}Z9*zx zkdJWgn2KIYhgckERa(vyI@rBCFnjep_?_4al%;9mi7@*K!MyP5d|(mQ(+y(yH&NAY zjD21dpo0Q;SkLGzK&1*>s${tde%h^ZEQ$T#nNA4}260Q0eu5}W!vDz~V7A`cYw7zh zRg3;77r9}jpD|V7bYw`PMdsJ%;L#sxnq0PW?n;Dg5-nQ8{43;st<{g$Q?u%Hbl3}f z8bgvR*s=w`IBHCb2xmof#n$!T5Yw16qPWj({P^3GTZFOqm*>$hpV~ID8>uX>ZJ23- zC&}9_pj)?FcRc}lYED@q@P9tlS--de$)m`ixr`rZ-fAk8Upd-p5_Nn($%!Q|^-75w*MAXO;{N zRd*UFeRA6FZf|e*a7+ttXw=!E9O*%R{S^o{;7}t@-i{R}s$|p04gbr9$LczX+FYM>A&zT#96MiM?>-N}6v zf%j6Ku2AxGBtBoe=gmeiSv)H?9;dD4CrLRouc$7o>C1I$#=7IL2viQ$5#N+zUvJ~d z9+ClC@(4_TzkVn+k%DTmx`mM$Xanjj1g6?CMJxp@HCC~b31}0P?i5#LTHE~LSevWC zNSXQGq(D5c2$us)fh5&)-q75JPG+iR#rEySv0*z%2>f;4lb_>k-cnFRM8S~YlbGW^ ze;;b)35dtB|66H9OEx=ieG6{qajJ*S4Y%JG$RiW*m+Ls4tFQZ1fE+R+C`dfe$Wx>6Ge1OGGOH*rw{P7e*3dJ}i=LpsPH7ABJe9OtrFKByOoL+al$)jF}J_0@Y zvj=KH$pqle+th%+tK9hTLU|O#LU~~1E7EP1G)OSmW?mG@jm8fnI2n?v6z}&}Y#22> zPR!_B?&s_KQ!N2T?bK64n_zs&chP`9fioo!*n|CfGFc1vxCOhEsZCNzJopGwRttT9 z#>E82CU3EM`x294DZEXt-v{elR}WvbU;ITI0fk!rN#mb{@&R-`j3!aC+R^5!$^TuFY5VJcVzF%w%ugJYDm- zIX^b5iaC1NUr-zH56+wEBz}tVMqIM0nX&uBQtauC11X8n2~EC@@cCRN-DLYb(pCSN zvF*f%WBCWS6$sDf9n_dA0*;B1Q=maf@v5f=4xi{2sBsAr(4Q7KY8Of4=NNUt`;}Hv zjT_SEQ*#H!yyPl>@IXIJAIU^}A|h115(4#3yta(>_+lwlnbmRj0vU!BrFK{f?rNBoRKu0YF7}# zj2iZ3*ae$*@n1dx2yeuV4!#B!OeP#rClq;Eo%+qbu%YAZXmYz7o2N2t;JVB1ZUDt> zo3k-Z-lcUwXH3WVWOjdg3OZX6v-{lcdfFLKTjpj{wIb$}RrCen|Fb*wt9b;!6xgda zr7Z^`8+hVM1dmRpXCaZYU|-d)b^DVFB*u0xHt@GHmKBWL!*>8QV z7{|`!74sR8CIDf!08Vc*ZpG2^?`$?&GodXm>?rgCVc0^RG^t^@ZSL|#{^kC%AT+L_ znR4G8I1g_9&l}q#g4v^Nb|vn-*b%(2)}oskPY26(U4Ry&Qr0@64CbS+NH4-MCXa0_ z!vcvFw!$PhZ;F0MDRJr)F{S3rvgD8yXOh&Qp?u4N$y}`xsBmO*r=b+{Zg1eiZ9Wo& zC@f)W*^+4-_O$HVd|d9-`SN*d=eEIk@Td6e)^UH&#jeZac{XUPo|D=XXV-5-Hk>S# zj-~u1oUxgiPV)*UFH;9?4A8u`YP&^}Y?aFL!rC>AW*yxS1L=#^NIykZIQELYccCh| z(mkJ|+zq_J?^zAmOZ4FJqdcjqWP1@}8C8nM$&ZiA7h&_Bm7s9+yUgGNmXo_W@b+fGZMW!Al5b59xnOIs{O5rJJ zMKT?b2|`EzmOSw6jVqZpMNDo{%IH3rf?`X;s`i_nF*KAg;+BD0Zk{eHexD7LeJ+w9 zfk6&VF0S`U&8092#b_#~$BErZNCmKS-`bRw*;lEDfxfx|Fy1Nucd4wA-3G>2!Uid| zt6%Sxa5TXJc><+~0B&wjglKy4g&}!A5>25YeUV57OlB?GiXB}0n4q8O1rLS@GN&q8 z2=A8PoLg*IwHRrxlTg@Y31L!5rIZ zS4N7EB>Do7mG&`s{x@f-us%dl0E&%SWZ< z^kmtNp%Q~t=&w+T2x<{H#+tKXUGkUEwb2nnh$oeqioAQNRe8J=*-ke%FfFc!Eb!J) zZLlw0jGM@vX81mShU%-x*NG7%lyDR*VO3>cPoGVu4l_A6o-K5nEBdv%v#oA~t+t?0 zYJ=ELtRO1L5mls>BZf!|^~q|Z)^NgH zdE&$jyAgWybhRR1WlT#4`u*bed3t;x)X@#IY)a5}wx6ZUKjJi%2;q=Xc_nq0n@ zsip42k_l0x#8ITjsX1@=;y0?FILFrtYoN67)=K{iEM*JcW?E#RBu(LP5Zfa)r zI6-TaouWO8iUtq<$y+l5W~*ksmI@CmqzOZ*nLm!yt7WX}4{%Y0DQDr7?0sJyfz&%~ zDqRIVpVdMNc=9>M?&$h}RYRfpST2q%zSAcmZ)XX!895DYe7KT3jI zq7E)7U^q{G|Fe>PNZ={zpF=Ss<168Q$86&I@bTHC-davU#blgbL z5VMM3rRMqq%(H6p6^BjO-f(LE+GNF~MN8+&e~wnt93ymU*!HADYptxyn;0f7Qo>lv zeCsyIE{fN>0#ktI;eWGXl5c4Dj>Ru30zb3LFY^=vL=tT?RKNs@EWXBJ!(@kQzi7;x z0D<628vD~)WV}GJR?O7cp&CV$ROfbTQBUQibqrw4P)q`BO=mSjY6pB8wMQclc$^im zMn;uId|jEBAIML{eMBD6{Y2RI;Dviwza^3gvqAVHR|xIP>NxiYtwd|+^M4~DGInJX zV_GoRH~-AMhFp_2pvg-}>2U)FtD?jG52OF>QK_SBEU<+y<%4X0JDnH#^CT6TN8#OR zxa%N;5o66uD~1<0a#w*x$O<+Blj}&D1fhZ80ui+g1>8blJS5O zOO#4iZt?)EHTF#&N;Yy4k_DB|o%>=#LA)vhdA~sd>&T(>QR@u|>nBI|X;=Zm>70j; zzK@|23|k!MOa28|OI3tb(P?zV-ZF)f_(mi?d02f*@~bfQb5x6(moJX0n=8y*+IM1g zx?L{0t2H3Zzj&EcGXA7w;Xntk!TkY$Gl!-F$*^|x6y_b5Q8ToM%p56r-6piL6Q<-%9m@EhNqO&^ijsr z2-bhPJ^F*}a=Xj4T?!JVT2rJBVz44L3J_v5D_muvvrv(dlg+{}8Mz|9gM8y_V7nj@f87v7=uO~Wbo$(Zd~m}5SlLZGqxuGaNDkX!@srgoT2U@=Y_4BjTL%X9 zfJ*dM?#|Ig18FXZA!q{Edv;9y$Ki*89xlK=XYYn^Up$RT4 z5s;fD_o~b$^J&N8Xu=ZIe`by0+K;s-7g#&9)2-^9S__vcdJst zOPo?1&489Nb~i*$ZutjP@R2X6SoXu9*m|x>amISv8a^m2 z_e1pS^f|((U|@h$+jWWptY}HLcFfclpfXf3826nQcDvN z*|6YJ!+uv$RC0-(_WNl-&_k}$42tYBwcz=9?GLy{pMh!!VBqAa-c#mMFVJj=T3!ThMA72Oro4Dh2l2Vf&x0jgMx0`bd zKTwb6E4e|vP?M&oJr#Pukblx>V$>Qv39gp_vaLOwO9swX9Uxm0-TzLb%9_qlc7jvn z3S46^{W9YXWOl%_0$#2<1}*|Ske#q?yo25LAU%OubZyF{lW}4y_X~%2vXx<}?Qo$Y zISxnCd69GLOfj;#iDMQ4#$F9rA-9J;tJS>u<+U&p`o7%i#in z9zplV3Rost$?qS>24DePu`O#??dK*EmJrff9Lrj6u47b7o;MKR4Jc~hlFN)O*qU@# z3lhuMX|L4a^o3}qWusF>=EssLmYz_Gyu|4jMJxYl`uIO4)@AVRfbY;sc)*^xPo%dR z=_lmIRHF5_mk50Ud8B;gzJOHL>7K{*?<*agvg!@Jdq@&4&a`3H4Wpr8b0N`1%wZ&Qx_aLy8Q9ZCe0sb*n5(U&HY zgJWWOjXD6J6&(CfB)g<=ILNXJ}fPzL|Zw`D)C~oOWN(>AQ3Q${f)k@L^njTv{(`&qn~05D z&Dtk+H`*sL^Xf3k7?GCjo&>6(-SxAcK!?`$i*d;_W!@sA2D(5xr(33EHNYR>O#ZXzkd~A{>AU$kf)J9vYlVkb5flX$Jj`q6qY4ldZ&a+KL zryMMxspzk@8?K7MQFg_|(>m7Nm3O-em9Ezev`OiwUxVUyS;L1zkl_4JcQrH9f>zGh{OI?C?6(crImIK~dt?^6$vx_ORC@){ zx@L(*#kBDF^mXAWqaiwz6vG$?Iyo#BuO`v)w;lzFxWIM}Xy{IVVN_;`u8osB<=!*@FVB&!a{ zHsetXFe8hja`I`;4D8-F7;JNr%|Y3%P2F8x!h^5EMebo;t2wmFQj^F&%R(i5l1YjQ zXmr(uz5V)jsLBTz8Wx9rrr>mpFEkz9i(L+i}`u7C3^+S?a{rb9RC#g6W zvsDYVp07LeK|Y*mreVtB;)Jv=COtS6BAWA~D}=>Xzo0)3!-;1~+qv;YG!ezbr3#ZB z3&odRj6D=emu03@;E`#T%VK%-hp}BUVgi(LpQh&j9I?iZtLhNlzpjX(MO=26E!X$r z_NExnNI{w&ZTJz*b(SR%b%Yy*2E;1KjXN=lMJ){OV=*sZg%A>2X()XLR=wlG)WslG z9oa9zXbiw3b65({3YZ_+?-QdUYf!49~Qu9 z9|Rr5#{aAGDh7wfOB_3^JvmTkgMlfdu{`p|4kNB$pakvS&HKo2R$f&sDy2GKuKLV< z@ivB4q$2mI&K?Qx1n^Z%k*NSCoQau9BveM1sIMUiv++h3w})vQCn7d(>YS0}{`zA* zTW+3B2G62qv0r!B?rc|xTTJe;#L0jxmG9%HbQHD?h6@;B5Q%RYs5V1_a{cIR%QNCe zeT4rAu8a6{a(ZSU2X=3)Z4<=SG_aAx_Hb0Sg8Ttj&Q8}+vf?Y)h>VmKDn<>BY~L6w z`Kw?_t?7t$_Qe6GG~f8*fRcSH+UUkTXy>9u<|c6&iW!-@o+F*qR{{(gq)N4h6O3ih zds(@JemPoP)w+MfgOIRhg?PFl=8~;uJJ5;LB!w3Zj2nWE0C`_6x>Y|I?X^ zKSFWFvj+pt7_&Bp*zc&iUl1tQ$}zxzL6pS1X23>94Y`aRyol#X7_3wz!*oApJx}p) zwo3(1LWHQ`_6$(pdgdmVpu}0VbJCa*xgJYPDo%OnEtjD3=sk9nYYrjtO#2wCVQ_T> zTh@g;yk_CHsx${VrSRAZjE_6w%%T`;z4{v>5+gR8F+|=^m2Nx`@Ay1C-(vr&DLp~) zps6|4g0UAz`J8RVHbS(5NVt?mz8<8}Agaiyz}Jalqe2ryvz}Vh^unO72qwqD4%!|B zT`Rx9jyVs5H=L>J)Ct7Ucb4(A~s(= zGsOXakPyB#d%>I~vVZ!-%{x8^)&5ECX{xf@Z{<;NA4+nD2PZKjjbcMEJ{eo`OIs$Bdfxa|FL8h~ z665mBn|DLT!CzRMaq9~uipOl1h$E)lLX2OgvU!!*`J~m*i^CI65<{Sr>=qGUu6(|g ziLeo(qJ;qbPRdB4HM)ckXR5v?2b!d0f{@WQppj_eE!T*VW0j%7h@+V>;c(zdj`7@- z_UGGy5Z#o3!k>EL?>kD}IzN1G<8$?X@$zA4TtXi22CEMfjYKfuBoad`lPBuQH#fk9 z#hG2#tPO714cdJ7TY)wBbRoGDlD9S~pe%4ouyRGkSNm|4Q>CKzTjLVAAhe=}Ch7_{ z(u2`kcC%_l)rEkgalkL5s`D~=KMkd0%h8R=ZQqEPeeZ?C04!&y-tn%eMHeIa0qq|_ z%@z@lT4gT60lYkvlFof18F}TkK|-@z<-@ zU-IOS+0xaBpzhDVZAcRY1sO*w)bu{j}5a36muUf zow=&xxQIAJzpAyer_={ZEG#uLs7tTQ;U6ilNXo_x!iK;;8C2pntnC}#)yY5P^{#iHj|;s*G)287{=77h zrV)K}cx8*9W_Hy0)z=bJwxOLN`tSA$*BX_BO{cVYxYGUmt@aJxB- z`Z4M{em+xCBT|e@(!B-JxII9Q2*5{wonbqkcv`0r^rzE z!%kjDG`%hMi&R0w#IM;ql455328R|Lb+P+v6O-B!VpGfqh72i#!jqW}J|9-5ycE$_ zm~0Y7f=>Cd?Rt|_xuWaBgp9~VngQ*l2)S@Lh zoT)$Wo$bMbKmVr{J)uahQ0qFJ_GW88^gkLcW8j42WVywo=b9hG6du79LuTrI;D>+? z))0eC_21p>B~F(jCC1@`Fsf?&oyGt4nvpLsdi(Rp^YH%}S z(YStXyACFVE;|?JqtIG1AUU#Z*BTlbLHu*kB)hSDOD;Z0;Hde<5w=~jbjopJM8TEf za-r5WWmbR63~LB~c<^@CIE9QAWm@tS9Lc4|ykQ#bAh2!7nyS4HVR>-Sw0>xG&}64| zdY>n-zANKuMav}X`AhQl$dYiwQ%OTCmdUBRYN}B5+Hy~#4OwBBW|#mTe3iRiuKriD z%2q_v>!g_8628=$7YWn~rPy1|@Wb?^Qt@4i8Ds1-*5+E7(gAcF8%!bH9=SLz_caqa zlq*|uY;sk@9>(FO&cZq6*N1}1O%8KCY0USRD)geLo>sZ6qCmv39<4l?f~Yz z7!4^h+%i(VWAn2|&++HVb;@V_B@b@T%-M{nS1p^9Z*;mNdm?7or>Ykqp*8 zBKHe@>nIHi=4A!MetBIx`dQ@UR$Y@^$huWE)!xtRJ)h%ky2%6}jM?3vdIyqI3}r7? zOEdORp~O!Pfu?6UzET8v@I2)~4h?P=ZK1hZeOd5-6z*|pmg4u~K_~nvF6*v$&Ao$R zU=?qB9Dy+~Imc-yL26M_ZDiyahxBI*+^l+}5kxEaIO86wG`tux$O#;(HNI{I;l24~ zFJ%xg{w{~E%ui9`S&=+Y?H(4O<0Gvp3yuA35*8BTqax_B@t4J*s^M8TFiD|gB6z;4 z9ySf}OA{22OM^<~amC8X;sZ&wn;G<{7b4Ujv!BURfn7fmQX)N^Y-P;V<%ktrsMgir z+m}06CJc!!YUV_Pm#tbpya}`D2Y3G?@E)BF`l~1y4fD;z@E3Eq4-VYe&TnxST!@2< zv1IsyMLgrIp?L*mEf|9%$YuRei1_LKGjAd7kUc%}J#K`QK@wk+Voj&ZWqnR%QA6HE z*Wm6R=^(d!N&CcQecZ3sFp|>|37)E<1!)DymJ8QecScy^Tr=etGpCPl@7Hgj{`uOd+APtD4>( z7RRg3qI}%D!H4W6)FNy{)WYd+@ubzJZoKojufOx4D{#!;%t=pcLS2mTpq4d z@wWMTby`P*uPnP;-+#}WU5!5MYq$*=H){^B4i|02u1$@P2tl}HNEE3rQ=8P&Nexv+ ze%@+m&f5!A`v9U(K2!Do#6%PEgd|s1#O1MNoon>9Og=RZQ=mzp*LMJ@GglY;OYV<2 z87N280hCw~K1fLPC+6qRr`SGt$ZE1zuyN-yA(8@jq-#2(@(bhJ5HnS^yM7BG5T zR+eThF0U~dTY2OtdSc^HZ0B^zWGYSXj2+q_$FevF{TR$KhP_@sggtVY_M}y%*ku== zhjO#ZF>1_X3&XUy{YCqv#OrJ3Mq4glZWR4~(5H9VObqZoZZPFP^hZa69=+3MWLSqU z;ISO}qm_V1?||QF&gBbwECA-g*uvzn(Ndb8j~+PI$gUlT?ikM-%=0U2dyD9a69;4S zQ$>?)*Ri#IMS$N9Nc;o9Z@{$!dY(nB+|&`y8-|tvH&6z<-Okzb<$9*NDue>lmY)UY{G^5k0WJd77*PEC+f$ z%-N%-q-Cp~l8GWZ-Dn`X@m56r7kZ-H_~ZE+IxYHwiGPOZC0VLQy+p7F128U6JTy{p z=Q(%O8v128U*iYca@+jBL>rRO zx-Cc6bsr8rP#%;xI3}^UE#kIiA^|?bcN%DxA+fsN z)~H&GF4kvc;Cx!`JL>5SKb#tEP?E75q=(A9Rd zi+UzPH)E63)dAiy5{jGJD4yK4Ga5zIf&Dv=>^c%%j4sYjSIebhCe=y=GWV;s-`2MO zSf2!;FATUIZ|Yf4bYXikROb6nHu?TO6}}&9Hba%kD)}ni3%&WjHpolc+Xp>!mbSA7 z_jM&Ry?a2aU+Bnk+I;!5lF1jP^Xip?0nRIi^+F{#=+&TfZjf70HH)-)jb z-qk8syKURNHiNz{#r5`3UlXj&$ll}x%~SaB*I{u>={Snlo$l6t3`FnI69oxJN42Yz zR%_E@x3ee{;6+YHo!`crAQN;f#j3ufC(4$gscb1MU| z8S=H8Iv&wU*A-Dx(2IU1aMj+K^+5Fa{L+aI;?$Nr!NcX+;i|v!USyAzlckFNuJJ_; z@Y(LhEh5!sVwH=v`LW?*Y0uoqOxhZ3k|>i%WNN*g!Q9#N(8*|=Dv`- zMaYj16hrhW7{*5b^n_W1Sm>hYVBd;EG-d;F^6)?R$`SgZIZG&EaqZ-uKtrQl|-EeL%lbJ#FD6KH z10(~`ubM7q8h_V6BY-si`Okr}0tnC2!?54NAoZXBXi!hIOWKuNMC{s5tIy>8j zc@b#w_P2MTf9}|^xy`S%VV)1&+xV_ZP6Q+7L=c%C1*twGOh#Ff6(JSkY@HktkEN2a zOgxixWz)RmmfAW&;*W+N2;I{+M}qjE8Yi~Olz6UTCvKxY$sPEBdes2HV;|8&TLLe` zj?bqANcu%#hg^A-;AxURDBfGJM#-H8ThgXk@R`hJlDSk4Fvwc9EsxIDSV#vJTIr97 zbY#`HUI$jfMfBHHs40w1#Y^)VIZ2kN`#MU)>ojY6)XHXPb?vNGC&sH&wJAU)Njm;+ z;b`fzNR@8a%0_=wJH0B6>_F>xxwU>|-IV7vO$yw}A`Z5G(!t%23lri3PW4AhJh(Ui zb+CPOQQAj>Fa!GthZW_5Ad070j%U}jNb1JxQT7v6Y@~$EsuRuFKCAS*6ccTYMj>Au$&VIB0gY5DuIn-}w?^pUcBArCf6Ns2 zm@AUKMG#YFqi>DY7iC4O(I26vrj^-x!SIXC`9^7n!zvoRQn+Y}~beAJen?}afd=F|~czmGab-GF`}Cbot45n-XxP&*OQn0Q)? zCK0V&uh4pyo0n4Ax*yWDKZH}(qN3E{seNFdc0Z??5A=M5ksoR1+m$FSsC2AWN_f^G zc$hS7A;L?)Vnlj9Xf*}{5#v5iPP&_He~(hUrqlHu0i!YAHG<@tBm+=ezK_%I<|sx> zYZ>}HrKO(LFv3i81fD`Vl6$8dsn7c)5zl+#_?c73Z#Z$o(Urpo_wHWUffMnvR+CFU zpSj;uLf&_zll{);IxkOB1YY;tXXnX#1IzAZ>MH7av{q!o$TH&50Yu|=r8;^CVsvMw zXamQ|GF{@iw#W3UkNKs?v|Bya^#t4TM00nPu@EAGBpr(wPRDHM!T#Y_@GS~NRvA`I z$Y21zFd7N7_%!kcndy3!QoO0x_Zb_gW7TkyiMjQR>$aA=6q`? zYP%x|Lf0U$Q}lSJ$bSpua)t&vqm1pE=<8Qxk-r<&16R=lb@~ z{nF=J)z7;=V&#wi|2^`X*&|n-Ja^s6o3FZg{lw}KoZXH02xxNV_B&dBV>{$CvJQwc z&-vz%b;fu61`@yJz45n{n_8#NQFqWmkv)U!NXHxnz72V31G^7#h8q`Y6VKsfE%{(+ zd&b!Pj9+?2-}9NSk2T7Vn|oz~ICNc853}w@b1({61 z9A-0NKc80KF$+BgpcL;LjeUp02<>PMrSBL@zXH4}jYMrZ5Z*m|L@%|*z!@~$dBuR# zcE=NT^%zP|u|_@H8nVwoWG4mAU;q4DuD|2_9cQmSb=BJOm1S`!#S(6-*vzl)AvH5& z{{y?~aj6v$jaXXhvmSr$w^v77p||`d>MQ6gKgRj$q$WFxdw9sP7M)m#+PWJ;x+2aa zcX-Abo^G+bx_ncFTBiCbu~hp^clAZ{&W>I+807wIQu`63CWSiAeMR#;;&fV?r8pMf zBV%k{YwwZU62Q+fDn=Sf0fc%F5LFE>k|K-Ux9{l!Y;JD#K05RJYEaRcxnsxXT6GTS ziDsRHMWxOGJ%O`JX?!;*^-bdI?6|wbqIUO(W9Wg<3s+Z(A9WfApmA;|^}qVRFWvp| zzdjs#;5>f+LgB6_@%vYP1ORJ@4cm41hiGG2dfokTN;FHZf#F0u;wmv;mbvmR7}Fy8 z4ZH9Dux#h@RQYej|pmBAT(lY)rFa&C-lo`w&c*6O-1(?iQWXo))*> zrS{q7w9MDFLxJmOqEana40kD(s=0dHHPTh$)w*v)S>>gA-$=9cYoW6to}w1)PSu`x zq~46=s7HjLbQ=mHZ9mj&&0GYEuTMx5K2`l2^u%RSYDVLHed-$n--q-KkcsD3S6lZX z5m;tO+?2=leQNiV$b(2XlqAs1bTRX%!1?0kBw`P~eOIE?hlybZ)6q4%$$!fW5n8t9L0)@yOB$rla6K7TrCD7@{ z{V1OqpFst@Cb*c^aakSa8pq2V&3mIK!Lp|}J;&~~!COx?( zco8)*ULGyv(@EvwrSErm@#?65waq^(zenefTh-PpNbaARWNcY&2Yiz ztyc?k!*k+NU>iZ-yY*>5#L#4S8`OSCc3Kywx5sa9lI~YIDjey5zlx3!K(8P`wSpU_ z&dpSIS9j-!qUBh*?b50~mPsFSe7292KhuvkJw^V*+v4qu(w?k|KIP^;E4Ue`SQIAb zmUV7Qn^h~eDeZ^q>qyJee)wFRIyea6GTiTy?py)uQti%_ZtxRvi+MO7uO_NKk2z+E zrQ+Jo)~5Xs`DmMc_LhDawT!nv9gJ_uKBaldhk);3sSB0PJ6O7UdosOYe1 z1G<2w)e^Oz#H4wtJu2T1nU_lqQwNcpc#S>|Yh(u;($pxmSJKkHw(s$ce*_e;ym;a9Mc)b zjV$4+Ctn#(Br!&zQTIr-m`cOX$1Jvo!fA}!Yw#Dd`OgFBNt0n$WN-Y;6h_LR+ZQ<) zyKV;m{Hx@g4}~3o-M?cDV>8~ylNON=nFY{4aK^|2wNKdXM!Y7gp%|RfDQ8*e^t5~x zw`akirE$W)l*c|=$_-6Tlom!8&o?H$~b?0Ef83rkr#4i zJrFoC)gx{FV#hLHtj$-3hb!{hR)cafqM!_XZ%@F|FYOv(pA7ix&-3R z0(K9~Oa9s{T77m62GVS^5Vfnxz_p+TxH}pRh)L~_cXS(|#QRjyS)vE~sTWH99sP)* zoIH(dnq`eRK>o^h{8a+pEnXUdFDu2>*0QHAAo#^5t>jN|+KM%#lw=118d+jwidr($ zjmlG^HsI<+MoJiestX;_)|GlY3{kI=@FBe%!oGg zBcgj{;_VNpE|Z{3R(!Y@1n$+@jhpIiEnN*F9`4eYJ32;eKG>xx(_#+^!i&SWjv||J z*wyZ5>1-x3A~6*+SVIZ43XJwZ|E>}u@4ah~))GzFvCdgi-ocX3xn0s7ETZBm6T5W~ z6o<2Ezt>^Icd*Fn=3tn7LFBXS0Jw;X=M#e<(^>}!7YPSt4yWR-m7cgrR^*_of<$C~ zH~=!zKKjT0*kD|uQeToee6NbsnWRECRk7E-DxS`JRSKybxmRT%R8;R&8K8~H+q*VR z|Gp*-R^|Sbyxe0mq4osNo0NNFO|Z>O*Q>=sE}Kb3LSA=L zYn84_!|I-fmqVxNOjV*Pu}$)*>Yfr+hP2$H$~AIeytHr3UoS?=2}h*9zu?W=EJf$! zoHH|-=5(x%V{PGL#JZytEd)%f=sWr4xpa7JAvu1?!N*I}(c*zxSj+Fy>JH9@s~Hax zkTX6Kn3(kCCSwhs)RPwIwoLrEAzX76!p+J_#~iy2i)78#U31d%EowbG=PXYbGwH7G zIm89LxuDuZ2g4MVdiWHvhAMaQNg`g$h@E^Q&FjgeYsq>5Nsc+(-ACu`-Q7pkO|R1O zXSj3ks`UVROl7aiJ&9t}PGO!01xt&tmgV=+oS;RFUI$t>L$6_*h+D>88ZFIqUso$4 z>mV`Ngu$Dyw?}wpka*vXgcbbzD1kT7#DL&%!!Lgq12``N{rc&%1nRTXA|H^xMUsDc zKXxTIi%DqV*>*5;ip`~Yhk6&IcMUxddU=mY zy?~WreN^`4$~uFN^vQ1ea;2M}#TI3&G?H|=fbtXg8}aC_O7-EFI#URcI_Q$7ik4KM zmz$LIf}fG#7yVPC)X7IcXlj~G*F;YhoG=^Mn=YvlJqAcb1MC(QwCyT@|7_jAipiwOEf8CQduFQw0ayb+ur!B1MrvbypLUPi5K?Qu-FW2jIz`X)z&`;45UZ>MRN z*U%Kr%s0;iMFG&NSO5gj<;XSFTvw)tDwsAiLeFbU`zWQl;2o~rV3l(}BHrw%R~70; zHZ(@|0O|Kf=w8Fnhe*diDfHZ{@gK{wHMT|?{{^%zG2qp|`QI-=P4I2E|DTxswXGh2 z&k0T>7&bsd!zV$V$ZsDh9AV!UQi`?0I>-d}%FETZQBaw2))&Hs!z5ALxPUKY!drqB z1I9ehPw*22yO0%M$RznL2EcGdR6G7`+ek`@a@#_ak#H3Clzr5!Fg1!VU780yivxT$ z=Udgd2ECTSDzG8_<+abwQ5>vUY$^VMPxIpI$V-|%cw!dNN|ZfQ^1h< z5YORD5m=t(`17qetVT*e;dvX68K&SZcsx#`j%;z+Q5OLtU990#2fK6qpLt51w6K^9 zR|@F;k{&h$C&{Exk0DMQ1-=(A#KUdCv1-MOsuk{YCf_;kV;AxD3F&_NcV}u{3@3Aq zM?Jo1#P5kd-K>!~-kxjMcyx7@{sV6~?Da&WZYeuzb8lPb9m#zpJxd9%ZhdExrQe-N z33LK@^a`bDV=Br_xs_>auCDu%+MCQs_a#|6?n`njfsH>G5mzf;aDWy!RfsLFG{ zq5pkJ7S;Qb9BTI^B_5Q?|5D}ba&gH`t@*K!EJyNkveX&Dnzi7JJ>V6Dc}2Ev0v!5UDRS_tdNU@Tn-lJ-VmTj1d~yQWwEbw z1ZDWvtvJL#_kmr*^|A0&V1HyfTFtm))2n0U)#+$_@=zf^YqJ+atGjK9N+MoO+LveI zmAIYWolm(&4KdG1C6zdO`o{6uQ}c1$p=9!;5D&SB_QxuXf5#EK;MjcT*j1s?dAX-M z@TwDb_NXvo(u$Suj~QG`g1lIF+PI)bl#-Zz2WX za;r5h;&8WHjyf)P$}(aDBgq37g5+)WWP=B(j>lS;H`s{-o1p$eMjAZ#0n&hRD7K++Pp4X=^Vv;HfKG?#$o~T!>B_9GTu@KYUmpNEX8*2PdLmkBr3~ zj`&!_SsDrihl+$f%F*48tlV_x2Xdbsb7CSlo0~|O<=l{O5gCvBEa@*L11>Ftm@IJ+ zq5)ue510XsFZTyX?4R?*KwxbJSF3B=)^MTQNIvW!fRW~H+oBiNnL^YUz?BJm4Ge|p zrEJZ%HE2H;&!r;+z$SNS8;opH-rBb$-D!kcpiF{(yf_qenzb~W?Wsx(0yV03sY!bW zz@V#(&HD$$MW!|O`_-uZKx?5snzRsFZ|Q*>1es6tamU>?0A@YCbB*JJpeV1^Cwr__ zFL&A?=)JGYxAwsS5bE@`H7*Wj+G3Ua&!+`*52}Z07)Awmf8wQv-23=|2PK@{?4KnuD{Tl8@=&EKu_! zwYOx$J|w1Vr{3M+RBA#h!#-TQqXXtnCzG;M8v#EwhJK{FPsMZgWpK`7eMtLA!e?Pg zjg^wJ1c6j%`?#zxKa(7(TV`i1^^xRE-iO@waN6n3;Da>db*961v{~3Q7RdT)jW^c( znZVednea&1>PnA=!((ZeH9Q;^VQ}DrD7r%Nu$Q!tShN}nV2C9$2|nQ{^W?JPGVu$b zE5|EetuB9Islez=7T)gskkhU;oAk^d{vlntUK>g0U1JjyW3GHUq6I!$hjD)h<2p%Z z9`JV1?XrvV9&b)FEh(mX7t5ZT_gmH57FQMi;VQTR!{z^Ecm| z8VwtFPhF%d2j)Zhh*QJZqa%^zbl!`8_Rz`I#*!rvcUDP!a^lKUw4a`%VwC11K^C=W zs@{QeBDrv8`sl^rVcX8Bp}B&`T@Z%GcR3D)E*zaXy^uiOg_{oMmUae9GtsHl%IJ~l z*yLz%=b_xe3(`HKNx;)c`G9^-n;z58(YihqksD3PZKmsw&74_GCKu1lJceH29^PHL z{`%7HVK-e#@4aDu;f6hFz|c^!#7I^SZ9*ZR=>g@n26rO`dIBk!TbF8fD;FyB3~B<*vqs&7=r% zha}MOkN4~R>9N?%)j}+}^P1U1&krAT?3p-pW_>kO$#~w0!i{fEn|vGd;yd_Rcxn@ue^MOCtO9&)gU|JNz3ZKK9=|phUopmJMyrCS?uw7k&ZD~; zzmwTrizb3KpI3%UC&9(icn(F$*>@&aR=#u1zkc^Da!x-%SDt?Q$;Lwxz267#aQGbw zF2H7e<-Z#rp(_omv?lbu@Jt$>G2mxn;w8K`(U&5+QgHpTnd8wReIODK`*rmGTXG3Y z*zaIjhc9f2=WgCl>w?jE#HaP{URhf`5Nu4)m0M2_E$^xr43%BWL#J;Aa(yy%=)}g6 z1*eRUALjMIyhahW=B>ceP2@ns6LWQMsgN|#2T#n@J)?z`kv>RQt~r+4zjNG>aW~EeGnU2S&SET!V(f7$dbHUtp z3z+n<&g7n8B2E%@EIL4x)IPNG>5ZGh)xCum>{vK=Zhrnh{)4V8trvFWTn|nRKVBwy ze3IaSwFm7ZLlH|m9vU7rQc*N;v#8o8eCwHd6QNRWx-{<}k7A_Ii-JKJAB(C3+vxS`o6X14J_~f{RRtckNm?_Bj6{AhS&q8?tCYN20VL})dki`T|Z0<@ZqHixu z{Nc5~clOAqBa4&i)g80fKX0y%-ZHmh`Q?v)Ojk^anR2P{@o~%t71$e30@dZX^5+?Uh%vmeth7G3O`!drx_u*a6QhgL)!o^;f$eAPWo0xdD zsR!NvzLf_+NHwhJCt@Dd3c&y0@T^OImW!u5qCrj#O5b#D#TXtmFtZcZa^0s ze;6nadA&pB0J^F1#v3k({R3zU#&W<|HZpI!|C_lX7BK~V9xc+k{XtVCw)(}xkJFW_ zj-?LnTk!c7_8m+eyK3`uFoHPN*WstKENhYEKTnV|GturVRs2kU{k~&9kKSnquH!5Y zr{3c~_O=zj7ypGrtkvPtdxHl8UhxUmLVm}R?rPYIyQW>P>0JksN3W(U*RH3R_RhLo zvwN4)>(`#!$Q<4~?Ql%*J)GG%N6GyXXqzO{c!XheBrb4WxbhSdo_@OVw@-=B z55t$QN@ouzt*LYadJVm|@z-dfv5Iy#{+_N(H})?~qDvsniSEJZ;U@!V3HnP8qn>Tr z&<+(HqF48# z!+SfEQJ%jQP3W%zY#FK!G%04&(E)5yH2@#$mlATK7qnmPnHQ2$=NpNxjIRe>d)b<5 zV86f1wnUj;fPSnqdt+ovzNQ~;xW<)x~LS)6>>Yx zDz>58tnIcSdR?#Sf7r^A$f$#XZ5FWk0w8Mw#Q&EFdem(`5ef$wdP?qoTbqqH5)%RW z!uar;I$$~9-Z}z9v-!Em7#;2a2`OwSNq0mE2G5*8JbnKW82mW;Y@;e_s~CO@eEAYN z>m68^v2w)bssgyErQfG;Q0he=TRDLQ^zz29pLz=E8~V2rYm4an|B6hqPUa_aErord zTA~*zeSJNy40s3j@;$b-lIcICA?B>#k{b0lEBeB@YUws4m#;T-EyGrUcxyVZ*3vlU*>8vl07&EO0K;T|QIA zXb-iWhpy(Z%JWYJ#;+1uYacOn_hV9y{x7l+xuZF-EG{;0Rrrgp%n<()_LDhvNbL+w zC`L_~5z2IQTl$(j!N_>NeR|0IWnM`2gRXg^ z{Qf|&MJ4~?48S%yY}e8Q`4CkL&H6ePXS&MFw)QkO-rwESMD*3NP1$GSl|0BR+>pp6 zGTT1c9Vv0ua?>eEQ$ZMOp7;{*esnpFWNi}S08%%>815*@S7R=EeijciJBtUL{e#9c z=najV@j&Pe!Zq;UYY!g8@I?U19})S^!APLe zOWmoy3&+4&{5%{0Unb9A`4z|zE5Tn6&+FP`KW^uCgVfz`rHL?pk0Jd6y^@^AHilo8 z^ILWC`?D_bei5MQ6zm(4PJHD{Fh_~lhY9Rk1ly3#4$zWswvR110dw}W`rbz-r%7)s zj>vzJj!pTGXP~j%KLNu$JT)&qf93n|e1OOf8$54SllAz`LYr{71%_zt|M$wazybLB zS7eWG(P!^~yob#&h`deLVF*O&uFO!MmHfO8EW^7m;v)&u``SZWv6T*aU2%%$4TcH( z(_csU1p6Xw1|^?3I$i5hr+QDDhh5edKGNlBC;Jd&hv;j^I#<}n5}XzOcGU{DrW1a- zOBl4g@^`B3`+e9?Pxgrp>kBQti6{Pg$gmGL zd%EG_P_)(54N*8y@Gy*H0^ZRv*vIF>LW?wSbJabU;Pp~;Y2}v4uP-frI#es6_)ivU zk{lInPK=+mMHfyb#(@3;TbhrnMj8mY)uRovy!I2BP=|R6gUAG41%jXV%UMu`t+&+Z z0dR{h8Y&F%I@#`I z!k3H~A0m8#`~2uHrGxg)oT%P$qA%fmsE_mw7LoI>@zK5!qb=c4-eB1a9&|tE+rJ+G zAnYWu_6JCYMPmrP_zuevzC|M1D(*Sg0rMTW#nmxNrf_}1; z9xV513uw=EX#h9%r)H;u(73lB3KCt3oWMP}^q1zxM+VP#>W#qDedNYF`(x8nh&1N< zu8fS=!)^TAkss6>`oF|_%gg(N`0!NYJp;q?L#Y>*{u1y<@4TSiP<^vaCpzCBJcY@$ zqdzlCyv*pDeXW3(b5XaE=NQChoAqz~z@%eRA>1zq+5ci)T*Ee)4EO@j@r=~3N`I-4 zi$y#-rj?`8-E^wnY&gY{W>XkY5`<3e20tpAW!o+Mdi5*mnV{1ZPV= z>Tb(TYB>dBRgIE>_38*CMg6a;PaJJ}bQ*s$eSZ9EAfG!wm&?u!xe@Z@W->!_c{lPe z+;m`QII)ws3l@pO&uP#mzE}?@#!O!>>os%M4mgq{?cFaxy>zk?&uXO ze+9_#*QmtHMZx{LuAq5q9u4INnWDcG^w|tbKV;9T3Zi`8t2UeDJ^qN=e4sDNv44Cn zgG1Y*X&bDv-*RxW4oO<$Gut4o#C;#% z25~XGQ7Lz1H^94C&zR}$7K~6&^|P(79!DKHP-``Atlno{$|947V~HbKbc{D4DI%Y zlv0BjiCf++=GI6?g_L0fW561Vxi}#h!*60G--r0J+6szEI*9K!6v&{PZ&K~`F6aDM zu&qgQQ6x860uB@0;{{n)Zo26K82e`AZ+sj1g*PuQzF8o9oa6uzS>$Wk;UspVk_&VR z?1+W7bRaR1@&?tUpx)yXS*Mn3^fr)c`#UDUL6-0Jm_QyM%c!7Yog{yX+7t$H&0fKBhuoqV~wdu}_nUBQ{Nst`$d6TKXtA<04PcQuIqcOO0c zbUS#xlRSK?a7uKOay;7T*0VE*3Y3p^rFV?A!_}435m#SGnQjj^`LXGbRGas`q~~q> zR1Z&W{??Xjg7tXpXSJ*OF4bmvyuBf9`*ez+RX`mlLSxz_>E$7yu@P71%eotBNue?; zZIaY*edm4?RqkiL-(xS}yulfgH<$x?<5rJtfr#&%5Ev4r+B~I6|BYu`Q;(LXYD%|h zV#I+iobLo--_^blzT<%82okwcSHx>UZgB(V3L*mtGZcL`34>CYV4F#Uy?RRxpd9if0KkmamhFc(8Os>!4suR~w-pKMTlP;gW5_&PaKrqRieuNDO^ogu1U$ zLce-8tD+LJ*%p?xm`h4{%81WDuE|pdB;}N%-vXw&Q%Wo)e6aaFIlWYVAFnTok!aiE z5pr6pl(2AG8btPh-O|ibWu%-|k=8iBB;xCLKFWim(Jo@%AVb^bu{zsIjKx0Mr|2lD zO~85UPBE`L)fq&=0Y3EGZ6TD#&sSDD3l-2ao1cR*Nv1t6AkA`;r`%ct_iy z&Dd6JSdyoZBYy5A$Z~T>ErYVL=?qdSY}mPfWWrr_gq?|qFzy{27E2t?tS0v_jN8yd zo3Gim6!z3y&Puv=&9Ri^UjLuX3&M2`W)eqs+7Mm?9LkaE8en9HZ1%6O+%8r&-2Q)d zESx<%KTlV#6Du2Dg3?lLLlk*Yo?Zq1&cS%8n3uzFOZDXG_HuI6DkrZ=)#N{7SZgsk zT#wfGWI~Z>h@R#4j@IT`=1q~&>3v}o<=jS>eAk?L3Gc-F0Fl;r0fFoGTr+M;xBm$O+L- zz~k>%;AIx^YAY+mHG6fj396LzQ2$^^#3!5>F$*)M;)Kl?Hl~LQB3{Vr9-2y~CWqVs z$EC)?uq*oKzJyCBA{O(@^UeWYZqY{bh%IO6SnE@u3sDcOCcT>S0HE((n1;a3Y-}^z$R!LJ8k<13Ht2?6Y)-v=E$LI_R zhd&cAa|W|j%g|bT*b_*54Vi*B#cTa$dsu7A_ya>hvreNkvGh&RSS%Wi$A3sOG#9Y= z-M)a+jA=R!G@S#Uamn>x&0Bq7%|s;NhjGDFNVqd0n~?H^Mg;onf8`7reQDo6{e3(* zI`S^yff9;Rcf;C*RQC+(@KEM7fePp>)L9=qM+HVO0_|8I5Q0Vi2i<^Aq`^(yC_ zbI#S(Rn^t8rn@>#&rEku_k^Av$C&|!VFp%Z6h%Q`Mb|}S*RbZiis%ZW2)OQGU{R69 z&x9hT^<%|=SP&&Lv`b(A&mv5KLaJ+1yrkmmTe9#P-fX zd%Nz@kpObG(A$Ew+RJud^|yP_-M*{PeT~)UU-20}5Azbp({aDAuLf*rjEQCb8st9+ z&vlX(4+V*6XJm_`L)x_8pI2#mg310`!0b-eLS|>GhWBLb9=FpREEEZI^V#y~rF%>vQ-}}i zW?4fd(3TCQM`}?k>1#qzPmkEsEu2{t&iWaIz7~}z^p;7Ke~|opCT3?R#%E{8lZiw! z8IR+|!xIyS$*b|lkxZsm%Vb6fCNu8^OkQka7qvsS#AMl{;S9yB=o(CRQ|xjZKY;!z zZSjeq{90#F#4ZBL&=#n7rmbGRVrQ5c%@LiD8`3+xnsqSKYfU!}e8A|w!x6H!VJ0tA zzk_;>#AYD(TlpQ7_OJj?Xe}D2MOzzG=e!ED92?bYd&Kb$l+Jrxn1eDr&<`FcgWQqz zD(T(1c4z9=wM&JhPfi8>_N3o5F<2hsMkK?YfHzU@HwV-9!l-maTDJSpirK)iYKz~N zDdsYY67;K4Do-SAL7OTa(-h1+7TcNc;m^=>Jz6@B+MOfwj*-p9p33)BUV|fGk{64$ z@o}#~gTkCl=L%W=F?Y~&E_ZuK31yX_9aX%C-g{F>==}uV92f#Tr`QR9pz4q|6HE`+ z!d6eFhWr_ux2O1(`vWjU-V0?|U~CKsWf1C={MZ(wr|h9-$aP%6b&aN{jdKy1XV5FLZ3%)CQ61jM<=-s+DpWmvW^_s?iS| z+l38Qi-a>%W!fDv_&P2N6r8G!G=$5P8Epd%|L zx;Eg47Lsc+(f&Pq`@>ny;OjIVyIya1Yof^{bhpKSV0!nW*OF>Hl2TZMPCr;7N;0DO zy*DD1zr_zy{S#*0ShL`yZ5!N509Pu$OK)}X(GcD$0d!#AXlG}}SqZmvf^@paaZzKy;Ow%I}r zgh|56iFhwgI%1)RGDafIziDyF=J- z6GyPNgmJOuSamX*Q7ONI-_`BM95Gp#>$)k8XL!1l#4)^ry1sLXUqC^MF$(M)s82>Z z&rnZ(V0tbP|FsrEx4YvJ^`A_h3$DUz3f^}-@hpr)xA(TDKYY5g5J3O6%c0ep@roxO7kHQ0)aKL4^ab!E7 z>DXLw>};kk9r;j|f@AaM6Y4{bJZ@2|tM>JcRmaM`Fh>ferF!bCs%h8qdRGRv3^aiy zm_xgQ=$c_xSZ^kly%rRYHR{duSo{HFbSNDkjGJ|#O6*R(8r4~;Qm;Av+&N73epP48{)#KTiA?TJXl^3qX% z_A>M>Pc^Etd&9P1F~9QtgyWYAU!v$4;r&s35u4GQsBbChT`WTU9?TaLw|c0LDqaTe zhcvHiPeadIz3$_lTdBV&n&v%Nk3LC#L78g?!A~KHqONA@dZZUu?vR0BcMyCzLB5yc z1o{r|*Qi!(kF&=RAIYU z5Q+B05T}a_8s~$+2P}aPlf`;``2f$WH)1b(fco0;)?Cfla*%aa2$#U1$w&})2ao$^ z$69=w(;QOfA8-U+M13-fbhH%~riHbEZqwIg)4?La$~Qw9pA&pxxoZv*SPP0FZZ{D? zBrPZ$CV|B_yjFZ@&2rfqe^yY>Ls*M$5&Ss0YIdg0%^dNb&enx$Hrj@HXw8<(8dprz zo<4~!Fn>5NobQ&k)*s2f1NybF$Ix_eEy$=9WR&>TG}d%2Uz*GbDxt!j{iGnFyl+gJ z?~m97cJ>2Z@_%A57o#ykXqv{VADvqLH##RYa&&KEz4IKWx_4M#w$7gR*H#1QMkv+E z9IEMcYM6)6U^!0EZ^Q?t6JX21V3x(lh>u)`MMudoDdOMKL_A>HNm%ML>pWVzCmb|~ zNIdq=P4Z&<=JzjKo8SJ7b?vV9Y+pxAn}1s!La(L1DhKYNUcm{lDriJD0DGXY+F*vXSIn)c;*6@7<23m6G= zWokn{EzD!jZiacR0^QEm+ve>e#If}Oif{jg9$;U_pD(A+H^DLXWgR&76kb6WvuCJH zE^n>n@%(?v=WzJQi!BoPviW=rk6WwgbL?qh-b~i^aeOBj#rCd;Q9nkvu%z-y=saDps>G=<)ky6BSR3kKPXi3Gfmm#K-> zKQZT-vp_RoS6k#A3jdWh+9v`|XMntV9DcvUA;x;2SbZb&ImmBef;FEKlqnj8kupLa zofU&a(a7~y7>*T+UBjpYyFMqkMtwSS2qtUhfZG%D*$s)PR~knln-ux%<}kfyLg_^R zPI(I&P>f$jo!W|#7}ik%hV@z?zR;~gQyL#=YZK<%MC%HWIDJ+cgWQ1d2m!#eZB+{v zKFn6az4kBx!1lUL>$P@Dto-WkX1Az$%^C)*T`WQp_^*uH#!k^hLN z2(3FE}p^~s3+@Cm9Pb+jLNy9KE``XOY{LqAktR?fE7`tG{= z=p|kUF&-S=Phq_BLcu>aUv3}s3G`<=XB^<&=33e~4N7TVoTr#br7S~Zr-;8U-A$&6 zU7c?VnTiu)g_j&v*UU|)j7oEArwnR>P+I@2PlGfY04j6;@4A|-{9Ms$;4!c(bXo5sEtd62A) zphpH%T9-vVJ`nB=o7qKKs5)D!%=bFY-iRR-KOy$wCqtEmsM_fX*~$~{Ox3H+%vJ-T z%0$TDn+oc@qXGA;o9rk41y|GP3CjNhbMzjs2V)x8h4h0LW+;$Cf}1VjN8KVc$HCGG zSTh0GePCKIw>@5}so}qZx{%0#e45BP)#kE;j5yGua}~OfXKP&tt&m}Z2F1o`I@>G{ zR_A(KZAK3WEqS-l=CF06HVbVfek=c#wpD(2kni(nfi8UWPUvEra^$9-q?5H+z^~QF zITDGZO@>Wo1K{-PLYpExXYrbqV@hY(rp6tjgAzHZ z)0sRkwhSFGxLg6N4?Um=rn2S^ir*its~dlE*h`ItmIwj;Eg6af{mOeYX|IvrGjHQ9 zJIoHDqG_0IXDf}9Ob*oai}ioFozQl^3WPTMyzu}K>bLnCgXf?-{SR^uDui){u z`jpi5Td3W9^ zV@VvKGZI8wMuQkGaENc49qOfC|JODzw$5)4bjwHnG9KR^g6E@p@NNNkAxYQd>Fw8nK;#bj7;t@T@BUE^) zjPR?&w7R&tJAQ>&V{GkD4|Ngo&Mk>DtfdlxeVAbYfik?a4#52`4S%kj-6- z+|bi_Lwg0^5UQcEKQicx-TC>t$SekG{36ZiqQwaHKEl_|x91$wz|IZYGtt(bbBJwE z*V&$lR(sB&`)RsuwP#{&d(NRRcIV%?JrmvSQLergU4wrI8p%qGS$<6couE33HL&`W z4Hc0RC8rwSJjY)0m$z>#4+nWrsqxJzl;krZ=DDkfnA=#-X6uYaL+H8F)2!z&{m?E* zkNRnPS!*qCFI~%VuQ;IDybqqhZBAU9t1AYM(^UX-`9WYHc*8 z;GHHSJbe;y=Ifp34}g69by5at|C6YnK5zFA(ZMg0l&_LcFO=7nzR4E+^~UcWXgo=I z@>}4^WAt8xy5*~SeHL8Y&H|XHGe2YQK?k?F);rNO1AWcOA7TapRR++mP36fF8eCmP zyT&dweUPSa@)jQd_{a3I@cfgTmlv=E2FWoWNnZHp2O%e+Zvyo|zrB0? zwXIe+oo>z1p)NEDe7~uSkHF@e#+uKAYn}t2+n#^2<9U;>cPbOCPp?$2KuA>_`VeAkSpI+7i z-8PeF+SuYfF`}+N;xaSQwobq|omtOhudi~mSm!`eGQ#ZVUmd8MOaww1Z z5!aCNL@SV-@~C)OB=`5vW(z0g=T8)}v#qiY|K!zw^OL1kIY(BnKqma(+eAxx04H?h zpD(}spYeYW{^jR`v<&a+70jcwj2It(7Ob8nhU|?Hxn$=h2xNRs~m zQjn+mM)LIBc6sumThLK_p3#!Aq*1F#;5a^hu!b2SYD&!zPeocrONP9Kn#VC}>e@<= zJ>PWIoDPgK83l zk$@Wwd6L>8YN4 zDiKL?2AD2O+q^gk=V^(Mfh2VtY3{gOEaOLLmJQJ}%{DKxS<#P*dB5LNoJ`G}GR&w3 ziq(oa((4b5m4h2Tc$+_w&0FGr3kt;HkA%VWtNftNHke6_q^*;K_GGb=aVLEamD&-j zCO3ZcT2(rdN*QDZt&;ysZjcdw$LZCp@C5C*a4o=)4HSkwO=RIR2@;kn)R;;^oJs*{ zG&EPZRBQamb=>JcXV^#z2|*IrgG+{8_8zW?0fu$WXD zL(E||xW&JnCWD*$Y`YnKZS`L_u{CXAJSotFjlQ7@{8&LhU~cAP-_|Umfyt;*y=7sV zVnx|*(*YCu!4G~wVN#ZhWs4Q}@a6YFweSr)U=g9rHJbT8|+Im&5wX5p%-xz}Dc)OYfgd$M!&L08-{ zGJkU5dH;BMY391yjxPNDnIZqcfwDVl*Rbk9ByJ2;6Lx>!?qp_6<&Y^HajUy0V#%lS zV=DAW<2PEB+vDp$SRT7_K09#c&C7>gwVc(vL*}X}>NVA0__jlr-+uM3;;~mP4qU#! zptU*GW{*+s$k$WFL%SkT_szjd#O%)3LeLSSni<>^CDLeN zXw=Km+Ca5b%%{h_v;e!p$zl_#s!ldqf+KZpNne?GteuZD%s zYXRnyLwl@Mbx*u+V!SV2R9CHg2UC+px4L}%m2%HyD1=3h`Bd;WYj zJOBK#`U~c>U{mcWd-^g~Z+!p6_(I%g&6mC9J<#NKepHwd=1^@hg*XKom6B-79NGJm zF>-}WzRV~XPNLwJT6|Gaz9?IK86F&{_VyI=xooC`H|ni&}i;6;fUCVry^`g+nH zvx1Stw~TFCX||w5*2TpOd*6@MN!-$UO#JlqCGGZPpHKLFp2d`pWy8Tee#mN$#7!pr zpu1;09v|;-NKOb^9q=y$49&-Ei>V6IJ8;jnKuLP_Q(mQ{#5WUln z$W2H~cbusbxi&1`;zH*+v(?O@zIn4=rcuGPTdvYbb*8y8;w)CPq>=uQg`oxXc75N- zfcaY}P|2F30SCu90#S3e()jmp8AobWH45Z^`&+6fvgl3twfJ*Pg4qLf6q5lpZrzz^ zGlgiJH+pTNEZ&;nHm3HfP}=CTYfb*7y*$i~us(;>Xi$Z7nP@GW8Ubya%%BsSHw0g4 zHpp4E*=@FyI~Eb8#e!vetd?_B&tpPaq~tBbMmL~Vf-nOkLlWkPKyy6k72nC zk4g}N*(#W$ODZH)f=McsEr}+gnwYPO1<+C!MZE|EB%KTztOjEwY%r16}7B?bRK--Ba0AffP?OjI0hc2WwW;YRDNJ=*0Nifjl`0g-Ohcr zf&66NzF+A~_`M0I8ZBk^k7lH&E|!kxJ)w-O@n%`x>&}nKF1|#X9$m@;JHOhzpvi@aVc zMnW-zB^IGmBYK}%0A?`&1b@eq;91M)wYAO-#)jF_`XZ}lnto%YRegK%BlXy zN9;x<^_aa;pVyp9X=f~Z#;t*HHk2PSo2(8Ei+0tXADQk8nSxoDCz-Q`bB-6){vlJ8 zW6W|=&Y!RkRp3)0tC1jh27Vpm4EhORa*P?M^^v`E71-=PB$ap(XzNih!wJ=0584V29wZA`{>e<_OZmG5hrF9Q|S67oy42$b$KfKw9;etha|cy z&P6zHs_69e>EI`mHzJAbNAGzZxtn27*A==<^ycBlyOaH49sQaJqmy(`2ZU=szJsxo zsNq_eELvpri2BT(VKTu5g5`+C67~of7W4=^oyT&Vn%>c1z~F^RFel;8tecWgvqXt5>5~?(QS}ho=!kzbhphsLVYdSY`r<>U6S`}v1M@-XOC;R9 zLWVg`H>MG+<#Yh?7IWK7T@MWi$wCAS>8mKCFK7XI zg;@9%U3_zNEPCa&&KF!88H?NuudDvr`QpEhjV|Bpy!o-m9vl9L;jhDg@bMV3{R2OD z8K&`AK1KCwp?{OtIIXQq{ecBa!>5=yiTG|Z(u0UB#?3=Y{9(X({$!-Vok)|zfaG{vg)Uljo^T@v zt%w#|C>Jd0cvv0J>?#NI0V6rtR@u{2+FP&>kn-6bpCNhKF(t;D!dVoW~86v7=z20>vD=Oz)%d z_}%K^YNeRZrc;Sfz-|r80M1*qc0049<_RE03YDw_sC5_iFz4x+E*AEd-2FZ7tl#La zE>;H?dhKYQ)%uF@aBtACI4@IkN{+Kl@0;xPW_$(~+wIkY-&?FlD)T03AXD{5Ci{Zn z-a(t$n2ILUfFVkdh>P!5(1Q;=e)yn~jD%xO%cYos z2|bLkBLEZ<+Efj_I0auh$r*-YxHD~u_{U2%vr5GSZQA6=cGV&BA5=cizEW$tu znG7KoefA3ViMht-P|$;ah3{xoM?dg^8v0VBO16vWU9_jL8t6+hAFgTa2uYGABbd+# z3&;6A)taR=I>&SfxO>ej#+fUQY2T`O~lX%b>ruD!%%N|zU=Z3 z9;)=s7VY;svLTBtIS}^t=R7ID3SBwzn86<(-Ji@Zj6@@)A$}it3i#v!c?~kX%vi1F z^}tZ(0NlxiCDKhuvMeQcmdMdRXcotbSH{92#H5p<-f*wOW-=&bFgpp#0g{Lmwv#Nn ze;{_3O!RQUw-N2i*5W2?JUCw7Uv_)@4^&=$?&a4M#`A930;h8&;`M!&XgTODMXjbt z8DEv2xuic*j*iTyatkAoJKz8D&$`kTw^|qSm{tyshlVpwYZ6SVfs|bsi!`?69U!3< za#y}7p?YWmzdR*aPp%q?c1_gR692=}CoER7cxMWb_5Bbrs{#knzl09$EgkCJb1>L= zBfg`Oy5W7FIdl5c@3|%lc4-axXa_!qsDI~?+MrVj;~Z=>7KQ`MEsMikJx0a?vmoVX zrKMiPj12WomL~Jrc+_NILMS9}%|<&e;E5<;60X(rjAYkf{@~#Ok13e<=7-(oxl(Da z>>h?ML6c|T@Z{9Mz?42v2*5x6E3*9ojWJSKDEs?KcCYz}4{v(8w~?94~3)=1uI&c&Qmo(6yq`j$L_{BR&s zWZXf!1?d-rNIlk+EP8l*U3rR-H6QUB4PBm~+pRnfR`?a`X47pukf%~#OPsQcBax5& z<6WOwD^7zEDo&W`6Z)5rD@>-`Wd6F9{*Bj;R$Z>@(b}$M^0~YVY%#q)+@BOax37P_ z#wzGE`Q2(2^=Z+qcRsYa-XZ>Te?#?- z^sX?8Ww#wn|LbQK(}}EVgfS?;I~lSWNIP}{%!OwWnE99<-=(-Ly-OyX!)U^+e-oGm zFeP(Mu8FhCdxv_nQ3LUN{d6GH@xKU}^t|g+7O2#mnwVBBPi z4JDI9F_S4ih({88uBeMKIqFyJNv!-SJiI@XnIDNnM&>h_{lnp={m1+nms|Fqsb&BD zdC@!))fe{Jae3t-^lje!^R!~#e+B4{LcYjW*oO%AW%>#vXtdIwtrlTK8rTKEzUf?X zI%geBCNHX>eB;j3w1{y+(EFHnkR0r%qQn7Z)`0r#9fz`e?BkA2vg4O?uf zfv^W~FBwpwbK~Cw+}kyu%q#-#mD_ATqHDrT4~a(>ajc7b)F*)md~DP2Bymre$&AEc z7#$cRpzEnFmO*Nr*S$DDk#ouRb6Qs-R-d)T%KqWGY5d~!-c$Xda&&k;ncY7U$t_(! zch|oN$XL>Q%cq{G|Fz+)h zyAQ2C)0k%+IMnX}_IomeuJUYeakk_d%y@DEqo@DS_(XMJLhlEal=the&-4e>#&BOW z+7~ve0rNtA6M%VHz`Xr^;W2`FW8uF2fO%QKyotULVBYXBU|z^<4rLp2u2|OO;4#l( z%Enwgrldh${tV+INaNQCn8$4k^QfmRX-8M}Etao6Cw7!XCv;RLFf=t>WF~Ez#n9&s5 z0nS|uZ@&PX+sM|t_VohRP5f=+b))D_0@yXwqkR5l5*KGjc(?qF;oZK~mx7)7^ziQJ z{}A5w0^a4e!n@CIj(2m=Ud2xF?w!vp-t7T-bv+%t+x6_>-3;(pvk~4M+8po3pk0<{ z+{XLg#k&!Z7wyx)JIAwtcX>33j^YRS^F{pDfRVTwViDP@<*#p&J&W!it;F|3JRT1V z4tP2uwRN3Y%j-jA)*I4`pFfhDycUbss8ATmr%8^P_+;7VD^JG7Pj@kDwML6>;giaf z71f!0@p%}t@mfU2(oMML?i+FJ$|8*UbJI#jX);I*?N;Kwlj?+B<1cCP`NpeJR-s0H z5)<9SPNO;+03HOHdQD}}H}};s10!e z!*edDHKTR;{Z50!phR`$=m-F>J`*yPEO$1ZLRZ@?#)!sI@VEk6i(8}W9XIGF?g@l5 z>9EYoBe>Plc2pX~6!eK0gQ*+ArLw%l=*#$q$AWHu%noarL^d`#C>LqFQ~yB$67W*0E50*ox=>g|?nG_z;W3BvF2XUC;6_b#M65>4=FSR9D zs%cd!vhl|6c*`v*Q-wqarw6errI5_~j|WDSrLnv3MpvPSe)H?{{CxTL+j+g4hH*5? z<8Uo!L`V|WsQLZ2_DwH_JJj4GW9ww!i@&8T96pbV{<}h5=pDNPhx~zfAY=__25jF~ zzFVV;c>H;v-W(|h{e_?bp*w7$q~8MquljQJq{d(kXKb!~$YOK{_2M|61DWwNY38z; zO4#R;H1`AD&FwCr68h&*b8mvm`^Jxnrovo&k6jL2KuzXh7*Lp7CTCrsvzbH9LzvW0 z%Z87wMCh!UG-8T{bR|x-A1E3YVs#lvO?4x_nDB} z>2^DvF4t=xVC zOJ(g$MYqTKA+shW*)QH$*f!CmsM5xykASeL@D{>`&TT{32o}E(&ER)1Dkf43QmXgT zk;O_FmTaa<=HVyF_?qiB1XAKxj$8@4g+h9nyTdX)f)Q) zl1Mp5y4+@BG*9^aPZ|~|xC6t2_a_F8JAkgDwneGd!y6atnGED|FVFKXdtn4^WG}p` zX)chvS^tGbp`I{PtmQjxg^dr&G>wJI(>E5*Y+)+^eRI&i1m}0vhTCifh6PAQEQnpp z9B7`1`5&`c3nx}K=27+?Badd#;ce^T z%33}A1h0lc*D<%EY37MdbZ|vfkx!7g9X-q$G>t;r^}W)qVo`{wSh{}xF!N>frj~B3 zY^q~FwpKNgd(#gyAMGe(Q~kP58D#wD(NX4;!WwAMPUC9Xp0*xUZ%dD^_A&P|ZRdO{ z>uAY4+m$52(>^o+^pe;!0Ta2~{xntK8@5n^R0kGlomJu=nyhtJo^^$GWXJjp_;P@0 z?Pbe|za-m+Q`*tijF#{;58!qOjpydow#8w78fxd*W@<-}yE)(~!6EtG(Ewc^t30FX zJ5{=& zcbOtDU!H{dGV_00xM|xIdu{7uuY~z%M;V)9?|NmdzI^p5bS;g6lHu7jcGN0WF<|c}uWM~{p+mG4b`k4obMS*5(<0)H4cd0U(6$2e1m6rjZ63LIg>?wY z*ije%lSKGQ4nGMkjuXiNbM`bN#aKGa(J7jeZ#W~9p?SFiw>Liz?UG8G=^62Miez5N zpY4~)=*ZMp1sS%Pw_i~I1bE=~)3Oce&7Z|D3A|;m|Y5~&I6ZP8AK((*jlMe+frjGvB zuI=v~TNvE}FuFsFW35CqPVLADA-eD>Hb~_o${c6@jc2*jV#a_Hh?5*&jIk=N2Pstb z5iD15AS2>K_1cF^eD)LoiW+e$33rrHDUm|1QY_PbDeC=`+~q|JGL6_zy&B@2;w+=) zBPrO8jvYOGU}1i4-|ne_Y9{dgN+i{=W zMf>dGEw+e$dLccDUb)$D-pO)_gpT{q2;<(tc#wi0!YVrQbx0;9;iTv{3I9zP zuEbKTl%CeAuv9_3hscgF?Zceo0E5*X7(Cb2bT7cO&&3qgJvcK2C-}X%=3Gt)NYAMf$ zm?>rt+Fi2@6(p=ou0xzG;KmYe7^#$!QIXR!a!XalEo%|0l(4e~9ad_P3Mo}bpiRsI zrb4eEQL^UM`X;A|>zBR_@~YS7RnIeOwPsA;VJwU=T2{$wm8YBKFsybb#k5M$lN;=3 zcUX>^LTqAsnqj8*Oz)Z5JvBKoULPCXRT~+omU{BpOez+!Ta|L!X+~i%?|7_s_3f>+ zZ$G`$b;?V+Mc~TqkHkj4DIvTr{)#Xri)fG+10x-g0VGuv-7cMklM<_l{wV4AQ5c_j zYB94i=sApKdr6!_P9a^EQx&Xkjm-t6s;NbT{J56LBx~|9e6T(;q}1Y&>c}gqZy_&r zWpbn=H?vXZmgZhR^9K2dWcbKH&SfGYzt8I-t5+R^ShIEzZ#ntx9@jT)H5p!Kv~RkF zE9lacpi5_%^E~6NO<;*$slq)TS6IJT|6 z*jzh)XN$fe*z6Us`6TnA+Lc|%JcpE;lQX-AB?=`s+C(!IF=SYcggwe=z-H7am)qcs zQ7F)YR>yOcSR;%3XZP*hGc`fo8+C)2{(?blODW{@BW8v)i={5}(~o}7*$(q99VVzG?Gq2f5z-X`-2-hgGv3AdQZ#Fd@b%Q215 z+1?#4{>;g)RymAXqf#H~D5*1hv()Z_c!enxL{dXO6)RawHVz;#pow3Z3pnQt%3P1QO7mj zy=ngw{r7)_{?9Q3XtI4(Ad?1r&x{n()~Z0;PlEO%5uac<$xkzKjODY8RErc!sbX0J zv%)t0r&PiOqf>{KK@G_zYje_0quHCvs4I7l<`y*BdPQuKyH@GSs6iZ-!?dVb{RTN{ zZx`}<9Z`gpQhuN?5RV4^cB?L@&uwMVZg)ktTPJ>HJ1ey7%sIDp><9Qj^rMURf1H_S z4xoF5)d(wMrExISC77L@zzU#Jt)LpR`9RhFV2MA?GDOygu#{aU>qb~Ur$U&KDX{D) zqtGL@MxkyFNV2y?7_8BNm7#5Rtcn`aLLrb_C&xR=Z+<3-AhJ133Q<8JjEWSak{@OG zQkJ(@3KT%4Z0l0iFJOrp<1@RH35J=U-F;x@z-Vo-zbBuVPELn|PCJ=LY1MLR2fAzt zC){?$@cmQ_uiFZ1@MYT;PxPscacE&X!pc#s`m%skS*D+vKqGvQt0`K=Y*;BHQ)v2C zB7AK_skXICFnpB?nX=PHhw%^KuHjT{H%hgyVhTCeSm|qXcc9cdMQoP4g;GLB05~a# zk68PLIVnmF4)7=iR?o!XM72^Z_`SNUKD#AK?R>AL8?e5(-MyD}jQJg(uj8l<=@x9r z=P;KsFJgWuAXt|%d2j-2RTRNG9w@~Jf}E6^cBYcrnJQvusu-CKc~ z}I}OQ^9Nnr(9Ic@%@@(q;kZ{r0mfSH3eNDOkXrqS*W{| zRF0nqt;xG#Hlo%@4puIclVv2(PHek&+9)IRdZ;#HHj!PNk=?c3Lj#pkIB4oI_ZSUo z6({M~Culo7a3MXrkM`^fI*zFC5ShNvc1&UA#XIaaYOk>W-ke*3y~5~f>e@gdAN6w* z#BlK)%@QK5blk=h2K>X#EV9NQntD2XA#;aZTe7>`<`Gm6OEQ8UK1TI0wDoysjz9On ztX1A@>xHPTowMY^)D~OXlyiSAVZz7WP;*nD6^J^?q73QZ z&aoy|b3tNq-PUu%J9ms%Qi9Er`P{meM<5coGUF*s02>2(C3rF>AmHhc~}J*Yv;1x4U-nEkl=?8*-w~BGDmPP zzL@a=a?IEEdEMkBDdV!hWC~_RFo`DjuSPvAW@;u4MkB;WIEibuOd>!dJS%z&$7nL( zM@%Z=F9wSItsCkr+*YwsoR^YVY9#zKU=59ML87Xa*En^_?HwL3OttzscyH&o zz#xhFIv5Z>@pNXYRQF89VpE=aX)4qCt#Qtg9t;Kt(+=^Izqh&iJN#Ar5aVZ3^!zow zXA$X)@8dxM-l<51B@h_MviKfzW#+j<3)dY;6%JoJbKvFs<13G{-pYKbXQmQSJyD(O zbxY7)5^wL`_a{fQ_R{fJ?LYE2N3$e2i+kkKshB-p_M(U5Qx^>kT{IbENCfjbtH4(= zauP#O!pHrz$rQ*YV-+j+Jy2-;7&!|Mpz9|-UqBAzD109BOhX=%kVit!Yol020k1#_ z-~2!UIU7GNJg{;fy8iQp#!nhQDSUnc@*IOk|2?!F#m+#BIKcQ_#!f*Yyy@5eoLWo zY69KTc=CG%^w!3c=oUiPK}dh8SO;xOpcH@%D29Gb(=<*M@KqCyE0MKvso<0GAhhLD zY-rVCsvtwr02vP!pfw~d`eC7QDP*~Fg3`nQO@>w-kiIH_2i8+GdGezJp3nqLvHShq2bHta=E$7hlj41%b{cK&&g+3 zz#bwG&AO#`X(d8z%66e-P5l?WV)yP>T+}aqqGP*nyr^2e=*Hc`CqsSgJcYyPN1bh` zY|)0^*w}Kh_sCc*Hg=@9xI7j^ceO|7A)mi!e@v3c$9uir-tl;RqUiM&CrJMkL2e@G z@m3qU>n+CWM~c16q{QXk;*omnNwGBHlkevlfEXE#(bkNaYY5EX^DA}o;_unC(zM5t zhIAD%Z4D2uJV5>!#C86TNP8X=qr6w6AoJPDb?)PN{E`gSMHHT3O9oV<9NTWQvznWh~;CmZh~e^k&Jp62#E>(Xp% zqq$Ya$L3S}_owFRyHMT__9y4}C-=j@dEx#?50w2Y{4h`^-1`Cpu?HPP$MC}|z4U&@ zZ{Yd))^i2MziPa%@jhTeFXR);_;(=RA6AOrfB1XQ8WJ0E5(jbr1^E>ye`EZSN5;Q_PQm+kzQfm7Mgbf|r#fRl zm(ed8W^{_&`6G*T?_|81GluQB>*c{P0D@G z7rrq5@WYLt)k*#PnX@pV@zVP}G)`?K))E%<$cJt#eCR`k+dc&EXT?7XAG(c~yE1bS zXv`{ky>!_VOPq?d#b$u#ycjSYCL{vW#JXKPdCGJkb_qkKX=)Vc@=b&*beE1z-YYjuA7F$;JR zzoad8di#L=#rQ9OIsOau8hHQx?}hO?ffvzhy2dN^t~`!jL++X#W?qJi_~82E3FG_D z7w)^SaQ;4cf0_74;lA_YczPMoazGeQ%6si(e+mPRqfLej(ugDEQ9{L|;y3KwV7&Ys z=zpSHzX+mFN}z3df{H%v>x0nOr#I~D!H&K@2z`Be} z28XgPS9U1a@$Ca@w?ATy_x8rE5x@Iz$G10@`}@nb^k_OYmbUSKkEP(N?PJ!M*H9^y zDh6-N+V(e{m;3?!3hX~W^(hz+$m#eXWQxnJ%{iyw>Ch&I8igrTmObH^AG-2|*FCSe zujsTF_mzFcxLd9Z4WyHK?M42KS36P)4d@2p z<}|E%pj7PK7X;)l4YT6B^v$-+Si14#2WMt83+E;#&h5|6&U~=(WO^)PbN3yrRuA^M z(N*Qcdq(~J_0sFlPG57RSUhsg^x4;!>iz!FJ%`KXlQWsj%t_uRH~=(^1I@BFI}xLtc(iP~4P|d+3M_vA`V{V$tIt-T%>#?!WE2>#jq`8t)^v8kl0M zhy+pQ<9(xdpd)lX;v*itnjz$fdwaUzqGRgeDE0QUX7Nef5FoKikJ#eXK%g48iJzn7 zE-rcDo8N8Ql!^w5lVbSHA=EXo zDWSL9Ci`-;{eeLLY|fXDx|Oq6T($2~*FN>YAWWQf?qrX}-y1fW!o7Y=PtrZ-Nd<-v zS1N~x16rF`KiQah@%7bFZ>Z?Z?TY<8Sq*8Onc;AFIOEg?t4Vr40O-W;Wi-HX;xlts zCE`?2ylRV38I7SGQ+_X(3x#srF4g?t;JgY&cGeF3USB%xGZ%)33oHM6VQsnxMpX*t zAAqBIuZg8?D#C0-b^(p~edYPdlNTkBV~4G{=Z47Hvyp~tXDwiwZTKu>1V1{OKZ24Ava z*l9DH?R-68M4lOkc8-)nc4}9&o8dce-J?D`F){4E2X@*hhu7<{`uz>nP8)+5J+$R( zFxT}1-sy;qAq*Z~w~Qc`kAhp|!{GkTHlDO5wQjjxZ4BswpE?xss2vtP*!@~iXrAEw z+5VhTKE^5R;RW=qBYXV2`jSdzvTv7v&k-KuXnj9*ru^=dD@UaKCjK@C9ltlf4pH!LXX(MTCn1wGjP)I*mL*%)6w#8RZ?Rw7HO{Ct|Tgdc4t`W@z`mO9BJ(V8|XYD+~^gCYnh{ zHC~4SEg0RFSYIeqjaj@_um$$a@3UGw26xQ*dPm5j=uf4p3UiRSzhVqPS0BuYh`nT? z>lB^b5k-r}Ie+zwM@>eVPNT#KE7V%K!7_A>EgLns6()^dV^$#_%9OL_SkNVvx`Hut zw%j;BSd?)+N~0b6&Aj>)yB~D49qipY^xJT6Drk{XoG!InX*6^#SQ(*6`}Q7*Ds31> zY+L*h9s=fUu^y*y2+X#Sarm;!7U%FKod~dKn>^-9^w`9KZ|h08(6^U}MW<8M<(h@X zTH`c&%bwsa5`h^X*J249&|xg0XXN3lO#CXGZzWNDCG3I}v8;7WMSOYSc{#aAqZ?BqK8i1YhP5rB zdBcRc?Uh(dh)y2N2BP?Wy9rj9vQ!->-zf&Q#g$ zA2vi(A!|7DRadIw4vfIJuq_h(tG`DcU2+gzt5TRe~d2s|z@KNfgQ zf;oHKDo_NJ$4bOCzY07K@*8dvFx0JMY9*G-nRzLT8AeCiOqU7;Cby+DZ=5o>%`$6A zau}CHBQ-a}$8MCE@YzHhst`^a3_P#(8hbY`t;c0D8*2V|pi&6R~U($fVEU&XU)p!G-V0jYakDQkz3hu1(Yk7tq*inUXKXJzMRSR2?$^YLBl z05G?8b2kFyty;%pBpp8^fRRZ%if>Q8y7011*g7cv+GZfyC3uv=%@DO+2KhcXKy^w# zS?f`+(J4D(JUc8Zn!kK$OLn&_o-H{n>OUDh$I-(y1e6LJv6P9Ju!K4sAzu~ZSK$^+ zNP&oRdw^eh6;p*-Rx+=YVG_$&jhk*S$hF`MNh)7pk%`eg*LrO6(+;$P*OW z$WRKQYd^o%I9goKAR;@qEVaRY4`mw|5Aa@jZ!zpN>m?)}N*9I{+b2idMi%OiJ0N87 zggC`+{2jFqy@UFYXde!>p$FD~QkYY}Z(SRe1wF>#VVK9788_IAeYKJTQ8&4QBUxfS ziGklG5~{h0FJ4O`=JQzG7MI;>Hu_2EciIFn>x8&L0h5KUjE9;5c2elbQ)ezC(R|#+ zxIHkq*wa`&_=@R$H{bHw!e~tI$kw7a;qyo5qm`IlCb7r+qv_ox4}Qrnhew{j@~}0W zbA}3D8upqY0o_l~bx<3VsU@X|VK@&@chp_& ziL3q}C_UVo004N}rIX8U+CUVBe*;O>DC(l^Iyz!eK@}sDn~2g40tG2WQG}vIT~6>| zER2n8L&Bn)K1Ls-570#yUAHgLC+I`;_b|OssTZkO%=ylJ&WsJ<5kAAg>eu3b#SV6; zt+<3ObS;;$ix-wFc!JRK2HJRKc@vNE&hi#s;*;fVQ@;$S@_=&YJhSYe=De|7!b9i1 z9lPs5Bn&dj040JG$RO&TOJn!`4pfxxxyw>Sj@6QRc zmLYjQQu90+hcS1tpz*jaZX_*nQ#ta)?Qvfe_tHER_fD!ouUi%OM%>}w`h=M%$y4R) zsY)l3jMgUG6Xj3CILvaLYQLEKI*cL}Xt`R>w5ZsZuFk?BmVUp}KnDqCSR&<(1{foU zpoSspl>6||Y|hLzr_eG~)I6fM;GR9tm3Ggyi9^G8T&wKcx|PTZPR9T*E;LkL8sWVtwfew$%>PV znVFfHI%Z~OW@g?x-oDe_**ZI)e?R;G?%ulx|9d(~1_J*1Zv|`$|K~$10g!-T6l@He zFq_R_bJzm5gsosAYz>oOGPJ-HmgB+F%>l7Pf=!;W~H{9*17I9uhbTN8=a_ z!HMt>hT%V~f+SXB4Ll7xJb@9c#X5Kj>#+eF;dgApW*m#-;CXlko`vUdJWjw>a8+Cl zSI0GQOup4*A`S3b;kcR;%Un zfp8G^qlsCx(8e4tM+aTZ!#C)`T{wUR_#6ju2)=^v;5;}VhjAa=7x%;c@c=v!55j}- z5IhtQ!^80iJQ9z>qwyF#7LUW@@dP{(Pr{S&6g(AA!_)B$JQL5tv+*1}7th1<@dCUM zFT#uQ61)^I!^`msyb^tVV{m0b)NL@)L=)SZ7&qp`wr$%sCbn%%Y-?gnY&$o(v7MI> z5B2KRtLoad_v)(ir@PKMySmp}wSOzGal0^U2SC@*I)NN}vL1k~pw>NG51y?+_dQ(? zj;-LwJzoz2{s81X;U^~kptwEbua+=Seoy&{l|OiT&-sbBCxCHJ`iZ3{sCLi#iMuDz zeoy;}y(jo`&-;nrFMw!I{E68wC~wdFiOVlge^331%`bR+&;5z-BS2tJ{t56A)VnA3 zhUh;ca3%i+|2gb`rT-SE3oRj1WWgF!@FTP$@=rw=sfx6#iag?igzSQhu_b;?*_SWf z7hz!bvDtcCJgH2ZH#i-2YW+cs#i0g5K5DrBtr)Fuqs;_6-YHUhgq?Oha)WXf5SHsp)n zl{;2e1=Or5S_L?6A*QT|Jpp7E+@cjREd{ogJZprwmN085c7-`RW>#f5tV!JENoKP) znZmlPX-9(JtPEjR;2wgyE3({5pV5n;n&9b+MbXO$%Y%b=NjULiL)>NzpcneER|4EZ zjdv`x5Ju+gn!f#Y_=yjlHgNJIsGbRFc;K4`lv?PbfvX1OQgKNW&$*!YoL*D(17(aC zwV>o2wW#HIyrA!bJf-OvX_iw{Hog`$fK(~(Ii{eh8 zUB~Z>l2@Rg7ucU2=C(A#;@?0+uMonL5ul@2P;PM<(9$a`x8xY;=@qC~oCY-Y3e_uF z2D*9$Zxy!!ZOeaO?xH_|Uj(@BertnR3cTM@;f&cTa6jSm%Hz*RJ|SyM<_}BSmEpu< z2&O$jJ#xw-pLmFi$ayRZcULVC4r%B`nv=`Y%?+N`;f0noydt{SM7iK;R( znr^j73$&jV#D#9vU75(}i7t}mxZ9I5r}}D=)YN3snQUq1YMq*0bV8Wgl6}g@WVPzG=WED%>TMlV+TLd<(LEw}? zvG7xeS%3?BafG;&UD=KHm;y>KI(!rOL!bPH+-?2WW?d&1s)`d}GmIc*>v2jua7wqa zQ)je=>?>jnCv^cSu9-47-oFdFuRhnA?ov``PEt0ZsM;liNIxwZ zc#KQ9M>%aK+F}#ii%dY#qf4qRF0|`|s;M0*(x8oonrYgWXOwTp(ggd|cOFs>wTXna z*@W`#TirWek1D0Sq15)@l$&$s1QLQ0#RbQT6f(pMc;iTh+{)+N$|u=v!U1e7RW>7a zPO%7S93CkQm4D`LjfAalaMtS&NH}KiojQzHU_>l%vh!$=~d;~cQKN$Fn?%SRLF%s0CgQN|@N`kxaEEdYt1L-{B z%!+dM&Doyja4~g~_8(C!@+O_;6*9_2+Rjs2k$vV0v4>0nYVH_G*M7nVMcWGSmHfz7 zYBbyluUUPD%s%8&WJ($OtR{G$m9~xf%`QXjp@?w9L)VddZ#LS^{Lvmio1t``t6L`> z-*)q3S7rIbkw0i-dh>bKQr=-F4F^x7`b#>Qj?pe*@{VN6(=TyJktli8II2{(waW{u zi@Nl&BzXyX^t1Z7q3^W%SLF1eF~*OeRQ$y|uSrICjcE?%liRUynVTh7F%# zheR*-F?^0=z!{2Ldl^>`M&2Ju9LuP@!C99AjZekJzeLZbN4X%F;jGDUJ49862*eX$R7PxZ#Gn_t5Jonu$=7lNxtSnSCF-CS$oW7siEI;;HRR$d5LFyDx#SpK>JI*?#zh`sdI@N+_Pm$Z}}WF70d$pfj^<}6b0|^xXY+_hn4oR zH>a=j6ovIZ6!qU}#G4UmuLg5(`XnReZPZsa^q+&}KY^S72L5M-aU1nD#@?`RN;CK+ z_f#UPQOhK=8JNHPR*gCbaZt^r&f-_7nP}d{sibWZI7JJi@lqU%SnO1WW5(MQaX4u9 z#Y{KK{}aqn&88ZV3iU1Yxyvxppf5L4!Z?nE=hy6snNGDQ1Kv>dr`Zp}-G*kLwCjxM z`4u1NmzFY8WBtIZz>2@znznTU(M2ee%cZQ)IA#u>pcbL7leb7`lQ@*Ru6Sb?H`co^pQ$4mBjw|l&ShnNh01`hDG?uqQ3Tt!J5#4*Pl1Ae}%%Yi$Bf zMhoI!@~_|9JK9=2Wl}aNE2NH*K(bFH%9qhzcdVpc7~eT;ra@c%hctiT$4`yj-@a?J zIQ?%&7=~8HzW}bZ1#u04)jxZ$KDt`If%bB7PtFE5&y|>Y)=K&#Pcn-Nv)c-*d5FSf zpElTko*E07b+1(xI8~ULX_~9jd;w?c(>=b)QZZ5`(aaU5GX4I5x7N5%mZW4&>w1_7 zQZhs>hU1ms66RY&g+G`6baG4sU|?Y2VBnvhV8|Y8=f223DvK$f?HrJBNg?0T5dh>F z876;Cf)I>E^6gS-41N_$P^%63hxgOiuGUO+)L74oimny9HhyTQbriBU51pH7I@;!! z8i}A;suXhm6wD@7#Ge(+(fYjd+x9;Cx80TTW(aoO>MXF$;l9;*`N4DSGu{5!4F*Tb zGOyZ{Pz+Cm`w={$PFKck^4D{YRcU!*)a9tKQAdT%xL*h>M&IG0RfpAbH^^B>r7R8Q zrFEg#`OZG+gD)h^&;NvNVr*dK+NbJpUxi<8e_y7lWNpGnrMZxxPv`b$1QDY`b$FSR z+A(kXd~ze-F(7G-b(nQl#omgE9@X9EIOwj;?J4am0Q@g%QlVlP5fti{3oB7n~hJ0tMHvC((__9)z?(k)YcSVq)u|@ z+@+9H{1n-ns@iO1G*wqa8Y)cZCm4QetF;uKy)>|yx+ia{KYXdRn#w1?7wDwc()X6V z_1|nK3+R2QJl`JjjJu~@GJe**0e+7ex}oz_#j=Q(41m&i(hoQ{9mDp$MsUT8jB|>{ zX3s1fo4B|M{KWfETtad@YE7rkV<({tTRWk%tqb4D+UeTG+U`x~ zL)$|;QX9WZsII=sXk^fL>(ELgouT4LON>U^BUK%p`l`K-$VCiyRbGW_iy<@&ZJHL< zsj6)C_7W%UL+O-S^@~bgjpqvO4)_hV)(O5TzA?UkeCvGE-80>z-7DRb-G961x`#J` zJ=5<2uPBf9oAMp49j%@29giKzZ31pYHRF}InyPAt6`2}r?SE>lycRe9T&mI6XsO*7 z{ZUo5uEedpsProTV|&(C?>xdl=rIadP~O2gsrSUsrI}`(HkziH)|!6L z9pNL$P2=U^>*NEU{+&CpSZd|$>UbY=TCsS)2wz!S-BbDUaVnr2@=$#&U^C$|%mPE+eF#=>pPmacV}XXNB=VCH`cmA{Bb6#e!t468t^c zYSFIh=DrXAXhm?9rt~&9DYikarBdA(U@H}xyOE|n|!s&4D!nj#Hq1IIOD-#91g3>w#SE2v{yK^=?wTE5HNn{!Zp5DWR08ko0ImEX<@>q#QO>lM~|S zr@eIrDKyRnYg&p4c+X6mweWV@dH$)@+b|u`)$8s>y14vNj|o7^L31}A{wRJvoj!>muA1rk&lB?Gu2k4A9PR7Z`e+4ruNp=$j7Y+0DQU ze2xF)*zw!h4s`8f41fvv{Nh+HK_Y`AL&kyie#;Ed2akj3h4zEA0V9O`KzpLU(*Fgx z+U^s(+xHI`36$+i;!Hy&n{VWNgs3BUBAbEhg6;a&g>VMe5uhHR9+=Z-9YC}KRle#6 zxf0{(3h5od5!l_g-shJO;{oG=#R=90^DXc(Fu2dWO+VNL_D6t;q^qEkt`RH~`Y6;5 z7=T<2DjJIS7u(LzGj6QS+K<(yi0c4krpQl!xC;K5a0}Wix`0v1E{LwMQ5&rMC79PA z$VM^5K~H`}oUlG%KCmGH!hPc5$YS8?5ZjP75H--L;M*{MU~fM(klqll$ad@ltpj=? z)xfd>>3`7%c!sFCj&1(psDp7fnyl21Yg~;f`~0jpuWV$0>dn2oh^Vi5w8u#Krxd)d z9^ZD6Vww)0k`<>zOWL%^8%h0yL9R^q*CJ-PoAc#~5a8nTy*WSU-_w>*TEWI*`6q9( zZmg1P1Hw=7EC??6ZOsYyQ)aa=%)M@@bA4WpAUoks?Udr(F~>5CWg#P;D^issckCg-C=MXeJJi4z&mmBl9i)lQj=7|vZ8N3 z7lXZA-DfqqW@}KyHv0L^1L8?v;=;WN7Pb1f2p(~oYW#$jgbSC6Gag@z_nLwo-WC28 z?+lX5FVNOsckHJiwrP@l#7%6&W zpBRdvHH9WhFtBCKG$Xf7n_!(Z$)`u!;RE0UMf*hihWaS_O8QLujCPz1;2fZ4!04d- z!0G?ZyS8AGRSm!%8;3MUW@&C6cIZASk;mugh^%`N?YE#zXCxDfxN;Y|GQT?1eS9r4 zpOh_(UP!S%gdVgTSSIeU243Y*jMhf^P@oq6{~5k8 zFM6bfy&3BYQTpb3ty4v5KC230de`z2q~?W!RPF_(-&&^%(ggnt{8?HqPJdsoWu+)> z8`k5Y7`2?wI7Zfxk0~9d~?8b01n(`lHpX`#;?mSM}bTjeLdanxbXJrWGD%oVvhYgIL$jATQP!oynz=z$? z;%+$1%YbCx_y%O92f=ZEiB%ZtS7KA5;gUu2>msVM<^-^5RC_trAwQ<}QeZSF;rR-NIhVYIiWGVO3#)@EG94d-=AG>4%$`R| zC9Ltr4ZMKk=mYb(Nv>LFr@L*tmQ7&omxbe$ah#3MzljaY1*KTK)=0~ZZkLG)r#-N$ zbK@N}Fc8)7J2jl-H)JL*Iw)6E|VuUxGC-f)yE1WAXUf|DP_s)Qx-BQ+O>JR1#3u4MDp$C1+WQi8#?I0sf7;oPy;Ysdlj+^v=g-EgJ$Ci1M(Aol4>h=p0x zQgAj=C0esL`s%G4dDRL*xc^xfnaMG#yVdzZdJp;e@V%V@@)admuZVro+yDI%?rNN! zkMqONLN)6^Z1m(Yqj~1~WfEsjTf+y5=aX)JW4V!*RbwNBBbY}EXE+ty9ZRysczybM zbl83kFq^~wyL{2~%x5wGA51fU#vi?A*#uYe;(AMQ7sdf8asAxf7b1A8u2b6V{!`a2s8 z7Out1!mG5E9aE8uSUZI9i?ridW+KC?eHwj`Dv)~l(AY59-=blBGL3+DucBW%A|{(rCRCA5}=3!;J0@RziQQWFzbjnEpgE`%4$t`EAZx|NaG*9A1JtIeb4zz zv49+Gd*t!v-RMkk)nKAtuO7qUhJ-kBM#? zv6WhUD~8o|a*ZRLwUpZZ47ApZ?H|eB&BTjFzo3tDQJlGM;j9MG!&fGJD^fJmM~R5s zBqigL)0?v=r@9*})E2Y#VvsZK4Uw3ux)3-b%IklEc%Pdf#iy6(W?KlFj4LoBK=Y&t5t1R{BZ6 z9&bW6B&F_G+pk&)c-K$=@~UwiYFGZ}bHGuPPS!Qq-9USpm#^EyKcc^2jYZ{wFtTWT z21UkW)bR+)b89A=@EhUBylYHxk2o8zsgQ`vKs92r)ioKab?YnaO?ofBA(q(0pLPE$ z$BkxFO2H!BB_1YmCgC=;fTSZp*Y&eLd95hwkfSd5J|8)OAib3Tteea3OG;3HO)kdz z&H$S|=ZM@_dv5T-EcgD`OS?(?9dYQKu55(#Kv!DE`=U55kL>Kf-wqzt@Atl+7DYBWBr|f{0pT|0rL#@wmvdAWOm7 zi(z-m{Z0lDq57M5v$!Wk!?@^WW^&GLBdp$-vn9N?y9lH34(U)epH5*XW9&iaUkmkm zN8>%e3zRrhWx8dF2a&v5>kZ0_b^%j@^b`V!p$oB2ghl{ixcuc9> zcjJ2mdd*fCR7+e05F zAHr6uaTZqsHxU#Q=SG&elQX(f}9KkAHe9rk*COGsj|{e^H5 zeR`wV18pnv%paCDn;^m}aqc2FAvX zUg^-7{G5qtl0?@34F+{loNt3uVxvkHM`$Fm!;GUOe z#w@$9Uf)L2HzVTLi#K6D1UU0e7Wwt86(>%W&`|3s9cDIra~W-fyk>z5VRy@nDzw=2v==g&E{nNZ0wgFT~|jiO#ZdT?)3)w(M~@FO;#b2EFWH zIgc|aD#}zYBMXsY8ec?$0&i?iaF`owhSbe1=_y4v=-B!LNdK#QrPjK%f>wNplBdVSj}@0_hpi5EpL@>IFd(I>phU2!DwUv zEEMEy0z0I?3ohThN~a0E95(ZAMcrNA4?-B zGMoGtmfgkgy7<}T=H0(;?>*FH8aH6K!4UKjBxKB|nofi6*Ho=>-ad#Ccc=^b6NhbH zZ-F1WZlp->IKs75L)WkXG)5%5R?-JCn+-X-s>=cw$2Rcw2N75G<0>;>_jZDN7xB-F zfH>NF4s_hbShFw;(>qI<&i<`*0cO-4S1X0->cL2A{B6~5c%bQwg%@UJoq}3pQu*jk zG@k&`$67PLS5i+kf)_kxH(OC$o_f%00xe*4&~Q*H^4)uSj5*vZ>)yBGOmsG(Y@B}W zrR^QqKya`wa9W+h>OD}MV4f)kY6cf|$>1&OUk3*JN<-tWx#njVY2sU;aseEw0 zoT<0|!~CFaC$0_fMs-8=YHV(xYSvyDZ>-*%AoQi8WKM)H8K+_~m+G8(!41x-V~=hl zSX$56&2jR@%Cd$V@miRBoD%Hqmi&B&)0Vij*nutns{=JwwR}wTVD~HA5T;5O+&AsZ z$Fzw&{mx7>>SHT?+v0uVlSQ|qyg$21AC+1;B!RUox_BhK{k8F8=~Ig>fBAp|Thd$T ztR`2>PGT`XUH?4xQWmdfG-#L^N-XidbtFa&NBmP3;>pARK`h>{b;qK|mMFq^QE~a= z*O{b+frB3lra*|7xQe6MvT<;YN{hTtPnup(#pU9z!iWNx*Vz-T7?0bdc-V-OOU07mU9M+z z=bS(a6W;iN#C9Cfou6t)N?D-$3BS`T-`}{yQFpAkX)0586?3Q*{v*+A4rqBFGIRXJ(Df0B^w^Blf5a zm>x~;6D`J4_joV>IgfW=Yd`?XkZ#2VO?l;vw^b-HjohZAI!RhKg61eau+SccRyRUCeG@{ZcpvNztmh+w7Pk(H!epH?V z_85-i9UV;qa#@hX)jZpXTrIN_Kbv8F$?2i%Q@E~kWP=mFC292gErb$RB+4}5wzDlr zam>%(!P%Ay%wye=Sdzy5{Yys!6+z=zR2P*sRK0gOrJbN-g{8&xdtIp_9p-B*P9$+ z;_pGT=lVAhn|_aM?6|e&@iHM?p&=J;zr}eS?vx(c<^5$uY;#CHdcsn1PXqxp`6%-t zEy97`aJRco#WUeve=?-}<4A)6E~7I9v(-=idjvPek-gN+S8$W|%E#}xOt z2&Zp(bI*Bm1&nx=MXBNj8K=`Yq5?MPT1QEv%`5Rq@{*?abCI5d@MG$INzZ}rBzIdP zCBWw&G-U-6a^s>-hUlL0s{C_fDgmsR`?Tc9Vj9tjWbs|Bs1?~_Br*Hl1xe-K#>CZ% zlPp;iiSgz{EK&*Bq6PnmT9>d!j9;zCzVKSqbYVPY zf_UwIAqt4y%t;l~o`@A+&d5qco#Z88&d?M;&rD^_ZqZAm%~wlE=eJhQ&e=*J&TO+; zoKs1_1Iz9J3yrCE;(YGJ^!a&YIpXf5zG)v&Cq7mpFNE*3bBiumbE+;Jb4ndBCsrL; zClDQRgd%*Pgrj-kg^-W8NJ3HD-qO$EjF=`kKF^>JEIv=v6R8&h7tr^WnR!mT67!i# zb}vj`U2r6^hUz13l!Vh5Gz z1t2K%3q%#AJew!E$GX6-DKn5^A9(^CL%61I;*_5hwmpt?RvhrD|G~#4uM=>K6*-~k z7oib!qaI!Y97r+3dAahvhP>PTz4se?*6A9#?UDOh9yow#M4{EIxDgKEh)@L%{M$2I zaE@w&y5FF&8wyv8g0W<8J15Zs^Yg}TgmEK=b6b&`9|9D{OnsB*jp9uYy6HzhXH|9y zN8*<5BGyy*bWU7}1^A=;4`#^CR(udq)CZe|GhBbafM6v3%=C!qgZ?XjJIGKE|GYc| z8to<7%6A^LtIz78=n&<&@g5{R*haUXqjN}n$xC~P@MVR`eqolc*7V-%M=tnYI7Vk0QmOe!}VfZV?ex)T(Q8(!Rv+a?+7D#QQQh+|u zqA_yYIWb}Mv|XCEXgQ?~nX<76CsJ8x;XEN_lj^FH-o&zTWy?R=TPSC3dGF(Ywqm2ieCMov~xl#voTv6W-ZMd?&AFSTkZ19Lrkwo!|=LUNp zkGHEJ4C_d3C##QR+%4Z+9{yvMt*3f{vk%xOI#BCSar~Ksh;-g}4fPD63r)ExjCdo9 zlV5q5cfg;C7X*;Fxi>mkqt5R z2I<}q&32R0Lwm>Qc#}0b(==Bm>3Cx_+X6CL12WWu-Z4pPv6luBctUX8XaHxVW-CeQ zhQC=_k67}!)8+B{N-KYq{6yl5;aV8OU+cp^HA1Qe3;y_Kj_$1%#J61db}oT9SzvcG zBXu-WKUqL{G-Gu%gL|aF=nTY}EMS`~*zYR<&Hnz~mu_b!Lj^E{1ej3(N~3V*hoUvX zhiwKH%@b()vj|3MYpTAfzbFP9jY*k})lViOP9_qXjaivVGB%pXLP*CNr&gJyzR{YE zL7R;!XHaZTCYG^C9|5E>S){+$nV{T6;y?k6NdU%3>5i;7k%&-@h9r#z2JCbu?D$hQ z8iO_(lQvJwlVMl@yeR{A{AnA`pjD>4)hih@VQ}{BFfVlE???SYNB#I$J5ZzguuEu@ zUZIm-0~z;`>G!AU_mLU*3}#Ds(^cxDRUAS?_M^0=S%Wg}xBy*9z^05@2d^17JU};h zg|cP#dC~0&zR;%3&NWX8<{ z(4_|Cq-0D{ZJ}QIlM+MR>0VP^Q*p<&PY-XHn_k>9KgO6{R2p40{#PP2=$Ss1$b^$g zaa|Bf^AU1S`cdqaL3P^)ANe|-@oF>aOEKv?pYbYZenFdN+JJvnfju*b;PD->Gd3BJ z#ssN1j^M$C?SR_0&w8~(JsFIa0b`v3Q)@u@#(ulwbJX8H8GOuyJY`JyhI#uR^Umr2 zF+Xie*cI;SKz_UP69Z!&>IVE7Om{Tf!dR|}nM!Xsn=_Nkk=1$6s9pL3LV(811pruL z0?0uC{J>(>&RVd~9==v+dGZt4aCy_zV=W~e-a*bBcO>uAc`8i=)iDZoE}%yr(n?YZ=vetp|M79l1rkU(4`#U1fSRa9#$)=?Td^lbOn z&r}K`&&H*%pHu9RZa|24!67lG&@LU9p-y;4CA*04+I3_x(r}Z@Rxy*u#-f68Y8V+D z!>PrPsAEkwn^RhopgJM(HOWUvNMMnp9AnL(XfzF6w4tOSK_y9;liDK}BcX30=pQr(osFsJ-7MvOyQWEv!sdZP5x*`z>yIYq&eP7&X_ zi(E?mgn~Me5+{*bGm-XLiQKtlqY{+FWJyYYfMQ8SP@Hv_`oW?RHi4b-Q`sa8eS%k$ z93wQ;RQgVI-*A6ocz<{~+B_1z(hSr&{1}rKvmC<_qo11mFRREsX8ZZ1oOux2Fq)29 zziGzOG#WsO+llLqqbx-WAC<#u9L7AKZaT?!)L1W6Hp;oIVW(rHW2vLwQrCi+~+asvGRnse;GrCshGVST^4g3bBV)w3kSnS2P5+j`*$)n=JJAYLC1BskJ|Bus!0zr ztvpNib&`l3RpcU}I@EcWLfq2+tP$?;qIHie>+DKtZ2ZuW1}$SP4DTz{ z@~r+lY@VHDI#IFOc?WUHYniZC28 zIzS=k5##kF8!G1u_sx`e~Iz;9Cf#TgO7q$-4EUDDVr zaZ1PP=WQ;+(N9Ai0H(Kcm{E*&D0z&BWR#jY?TA$Bko?r+v&Q z0d){&(xQ_#Qt44CEcTfb_~!hL4J>8~haWcLn9?OG%#>;4ESgiUtwL(!G-5#9?7x;> zfsLHMZ=b-@u1Fa6jeUaT9U=2}Ded-={N1mSeS-b>wBMwCaf|zL3lUjW23U29*aROz z;J&)@AUrRz>C?0qcfK2E+nGrhq{;z*s^FA^AHYd-5XWmqH?? z86rrg9~IaktO#PM4Mqr}{e@2T@4ja%7*DqhE_vJP+p{%Bd;LC_Hlp4^K zk|56~#NpgUYySL25~&c4Iw?kdWWaD_$d8$i0IwJ;THa@*QW$yBfId-&zo-$Iq7k~N z5sdrAn&FMqS}^1zEOO3m*z6!#HvB7m@tW7wBP3wXx-h2o{`Zc#+p8^zv|a{p@nOt#8iL^3EB= z^27vEIYFggBnSp&&&b!ZdTgp-=e9_F?(t9-xO@p*KDQXFm_ai9c2NfDd!2vB2*AwlE37SbiZ z^pse3zCW`@*aaw`i&wVq8f11N@^48pvnYuzjs7lChV_Y2d?yJ8`27bIS9n>PHx!WE{|(@ok_%^v2>(b^0p+j8T$maY7)MLkMio6d>kA*((GKiqVrhMa=&^^lzZ#dlT zqT;vDV0L%Av>?&ph0x5^{f=UVPQahK7R0|DhWpPQ zQ`}Z^+I|A1x$t%bgpq3*6Z~}?U!V_vkJ8cd2_jD2s$O7sap?ITQ54s?(Bk4u#Fk4- z9=;YkMJOYi-}`&U8g(}3EP&8NoID|CCh5S7v@@S$6=TeVoD-e&h@QGvc}m7dpI7)AY{TJnrvX_Q+fh6no8UV0%z*6nB}|XfrSh?4#@$w z4Cx5zZ~Wh52OdmQrVyp^n(0zEELSb#C=bWu4`a4y796T-;R zll)^ivV`owuLdePv61OFU7t?FkK0kwNvf#&0F#Zx#`<_VQ7$f+sL}Rv;$uT*E+Q8x z%>bH2MLC8+r3US>LlV0KWYMR{P#A2xYD`pwAp`&E?{w` zv*M}qt6rzS2oGl;D^HlZSyRO4+hMBm_wSbkdB>0a>Jl%~sw{ak`@0P>a_Zucj%H;p z&?-+Nec5uv8-X&`!1#9;*tqX){tGjWN-jUe@3|kdzUxlRS$eG)>5j~4(l1GUZuM_N zzeX}7R({|IZWBjLzVfi_UsUNX62YM;4Oo*dAMo@fDQ{?61HWV|336^_D~9wP6qokD z*ErXH;OkGYZz!v~S;O0sz?_`J-E?gi9YVba=f>*;X}y&E#@u{u+&KjDE_S_-cFtGT zqZcI>)bCY4V~4ke`PMZ+XEp@>e-pBsofE2>bGL)M4>VV4r?26idhz3f-=w@W{U#X4 zw#Sy8v@b^at~&)0{f)L2b~3yttKR)V8lU+!pS38RT|AtO9`Kh}{L5n0>{88&Ve3E1 zJP_TMKGQI&8LzvK8#Z6|(Fu|FV?lB4luJb`_!^`nSv8WpZd1qa^6A*^r}=$cVuAnOMr@sZ@$c;n|1&oB7FYHMdiICv zPv~ufp)!v((*#+o0j3|J%j4A0)oY@3JfYmw4Z=T*DJmJ(AYm=7;6Wo2k&^b?J4@gr zoj6-rm;ac2{Oh5i5fr`EXGtfh^ON)}msRdSw{2TLyxX`hK*a;Utc;+)Sbxls7cAcRN+q~X4DF<5M7gz^S~Z=KAXS^J*fg$ghVv`c-T z(s$^eLh2z21pEFWe7rLF;jmIUhblsEmVufl%4PL3ZKdAfjf0tGDZ5MhPRF8lLWUx9McOW)E_+54&E{!O^#Kt9WB&s$ENvG6 literal 0 HcmV?d00001 diff --git a/resources/public/fonts/PostGrotesk-Medium.eot b/resources/public/fonts/PostGrotesk-Medium.eot new file mode 100644 index 0000000000000000000000000000000000000000..e0171ff3b3c3169b50e677e37da16c38605f5700 GIT binary patch literal 178630 zcmeFa34B|{wLd;{uU7A}ByX~1$=V!CcD(O#6x(t3#E!GrNl5H$glq&8LI^t~0n!k{ zQc5YM5GbV-s1hgznzoeo(LmWsDWyE%5hnrKQc6=EP)Owe_srFmWm}F-KfL#UpWmlW zMt7S#bLPyKBzyO}cw4s)(7 zUztwVL;t+2ot?|hXIqhJ8tcRPR<;J$8*n`bXRFyc>;kq4FC`7TrgAFB`S$R#@G3!@ zh93=M)7s~CPIyG~29vZ|jD7p%X`Kt3Uv_E@OgivBV;PotofFI7|LyOq@Y1z-t7p}w z-Yq};?2$h(mi!cBmh@HIwmQu7*gqKyyou+vYqy-e=|3MU*~^&oRmKu7IJ@`!EmRxI zPs7o0_Qs3W9%x?tJYy9a#($KsZcXoMcELaJE>FVq>UFqbxLilqt+;lt+q8B2g|}ZH zz%}4We0}4&t9sL)xPLig#TLf2A8zX1zD46m^x*kAj{5kmTh2Xy z>(3o+%NYOD{fybp-qN>b%RgG(9|GRl$iH9U0;ot|S$^e;)W-j2*)r;3?1j&tT0+Mc zcm3_dfy=_5YiG)j;?fxHcDy4$8vYzGY#O+1;4BTLHxmg+8 zjPv~o7l=EuG?9PIw8(W>+JifLl_P(Pl{1t)IKu8?>~HP7=VI{|ezsiHcRmX;#}^vu z!vP&Z!gUVDZ=Qo^{0-?a4i2W3C$TBwjidNQl0vLh`X%d-CL@(0y@l(avJRew^joHt zcH&+t>yS6$_!`n*@qBaSxC_V2Scz26tSD!W^mUdd-^tRXA0XYt5~Pi60`8f{ljJ8@ zs(^*yiA@CCYs@U*BN)$=2=>^7cAzZ=p3Sn6(s=g3M@T1-Uc$8o$3NpZRXiJP>r`rQ zG)-W#Xg9T8O@xCnlBNK82tR5fJPl8TH#HId#*qlWu}R>Wa82n|)JHg1lLD_<^p}pg zrP*vc|CIS~^hwFg#}}b*GMGcE!hMM~aP7c7xTf>z@+>x;?n@Iy{^|4%zXH$RX8C+A z-YaFT{O>GDdXFXXzp`Y0636FI2h}r1k}H{;;253+ToKp^zB49*J2q7f90$CK1UnKP z4O|*{AL$LGUn2bz>A!Hl0ZB$%4^X1^M%t{$eR_8azY52ufdSEe!hxCy7h@!OLj+HR zt1D0z;cHmJ7@kfzR1@KHTnV@)e5*;|obZk$>CrCWUrhq$BBk&6U95l~M!&S+dK`%# zLEd8YaS6uL99AKn4O;L|q>pjEomEO}aGs8IJLp3(jxXRoo=X=X?Z$Hljyv%l(Gw4w z$onzQ7qQtWFHIUi3L+I_yry8RQa$5HvXdnXSO}ij1lUloL%>Hco*@a?34S%99cW7y z+G0gY;pqb>k@}Hdz%|G5Jsew*5@Omqh1wfUe*k@;cE={d!5B%t40#AYY66}JSFwrk zrY3LZ-1NrBlx{e_j%$-mC(_*u+_ql<4~E*54sz8Sc^j@7YW zvvT$d=F$Z?{|{CNx>ZN_`K2O%op{HL>v_!1jd*VttLCd%1|LA`MOuM01$ErOT+(9n zInAkdjK{sqDRr?QBOOAz1?fDbdyw`Zy^FL9>1m`O(#=R8Abo`NEYeSq{*I)+zaQtZ z@1MYR?ECxCmrbDeP3loD#JO=Wf$rNR17J!ODOWvbe`Q7NLsrNiVns-WIQQY`qx<4s zHQHUx3V>TXQUT6~Uf;}&oKgx~jJdd29M5ORwu8; zv5VDdLb#{qIn(nEpwk<`0kpDqBs==Si)2ARl_I6$*_oezjpgz`D@k&LE}X{-F-D7} zW$54I;C)_V<-CuT%fDj9B9*a#jKqHoJRD@X((}wOT?L#j!Pu5qKx$w`k`sK#c4m~W z5Pe^c_VggNAvGa+keZPikftD2A(ct1Sq0z9vZWl186WaAvmB`$WzN9;FIYNg$^@Jj zA@6w0E92*)JPTm*piPrd-bAd~Ehz63lvj`PT9CT%yo+r`nu|nm6(UVVnvB$fREt!> z_oB_o=*O+-&&{C2+c5{uVH0o+@R^`7=ZkZfcy<9R#yl!!$3;s2|LtAVz-7|;%q$l~ z(&emBPQv*j=9cqt+=1(}aegJU$@#eMWfNoydX0^J%_7pRH$JS;9D(&n6?yko9aiCFw(UHPZY@x*E@#C;_L`k7YQY zr6ybx&P77qZ8h-L}M%Vn$D?w>N^@=RhV0qku)oMKA1^>oT-sycFBf-kCV81oN}wCK zP@d3*@~3WGV>cG+v!O@jO_~3PWR+Z!UAlwcD_Qs{ep*VBp5(vaf8kH@wF3ff`4K5Y`furD>@l@WhaHds^do^KvLu$wQdlZ>geI2G z%*?{9EQ4jTESAl3Fpt9gzxaS;lFa@s#ayMkTGu3}fSoopA|&8}hBvg_C$_BFPb zUC;Kh8?b}Bk=?{@X1B1fvs>9Wus?rC;u3b-QXWw7isa>D#P_zs6`^ zcM&z1zsO(WFZ18>WBfz@5x-xuvA6jj*z0)o8QX^E&q(=_L%LHc;Qdl6e^AO|r}^vB z3;Y8qn}1(=9lNzIshi)&4@hbJ&-@V9x-kEvbgi^Yx{g1KKFMQt=3x2E$-K#*tHiap~|b{qR9yPe&^zQw-H?q>I~ z@3RNk57>k33HBuW2|LWbV9$dhzs!Eie#c&se#ZX5POx{`d+dGo4|aK&6D zt&S~@%N&^yF7P$ ze&9LedD3&(^DED9JTG~Uc}{r#=1uqhpwxJ@{pjMOOOEy)U3GNb(G5q>J$h9?>rd^^ z=`ZN__D|^d_m}n8^|$o5_0Q;^)jzMlvwvCtivE@TYx>vqZ|d*s-`2mQ|I+?l{nz&I z>Hm8FZT;Wszw;P7raP8!%zP~4Sk^JyvHWAsWA0&_sZT2zPIar=ld7@ zsp?PP`pbcn*(VE5djG*cY5HXCC%^pU^G{BHGVtk+Pe1zflTQb}&% z!0F=t<-qA`;B-U(dBEvK!0DC!*F)xl^8u&5$2K23@7VTZ zR~|PXcOEZ{;I!j-@A31FUwQn-6K3GF8aSPDV)luS6N^urcjCqoIJKU1ob&*vg`Wh0 z(|-z__I~=#rzb!C>4xVOT-+`bIQrS>KEE*v4XvU}}bH1^whx8&WNcT?VO{JSpiYTW6| zJ0E2I^IS;QazD%c6#qWSlk=*wKDKSlZpe8gyD;k;S>+ksX_u#6l=fUIpn$XuQmupy z30E1vPgmlP^ZCFjWKR4Nq@8q+?}luH$&HlcCM6rrgYrzQy+i(Fz^MMobCG8*{VIPl zNzcTe+@_wXN4Zu#Q;ssEcabx9(`YY$CXM;yMO*xk{B1cFB zWl(pV_h7%2F9*w(e+9GA6Q*V z{})%60#G{_`wnE9cVTCA0K24nuxt7*o51d60rov`yZ1xd`7kSIKV%gw#H!grR>dA- zHS7?pWshJrdK9$tN34N8#v0j=A*uW+)~BC=n*N+kWxrsp>~VG>`-HWzUqU$kE9^t3 zvuD^$c7)Bq{&W_5md$3*K`j0oh{0cE^VkcZz@M{4>{Ygy{hoC(TIXK}W&R^Oi~T2C z#@=Ad*_&(ydyB1P?_d>to2_QY*ece~)_^x(&;G;s73{|qVZU)j0X_w}*A zvkTbA;0Cs{PqA|T6P&|mp!Wa8zsG;bAK*XW5AjF%{rq9Jh5e14$3BAi{v`jq;3rP< zqk_YDg}*AejNkF!3qIr+zggNXT_f$3?vf5jcT4w3uSq|Vo|0aa{vh4Y4bmIZThg06 zn-_Brck=+R<0ZU`*YIjy%bR&UZ{Ur*mACP!d>Yp98GH%v=1ci9eiq-v&*hu>#r!

I-QA8*;?&;Np+dS$oazXb(n%@hc&fe2vDUF?Pp>1C z(B9R9I}Uo5Kxfr-R^4Ok>F(~fg_ys)+ZAH%U2D3#i$hYtfpRpSUVxx&Y3~YYUCkk# ztJ&ssc87RRaYzoh0FPt!LG8+B2R%6i?QM}0r!9^>jy)*uV5!!#r=zQ<-PSw5yUW#$ zXTi=cJg^b;k*bPAnm|b3;y(l%iI$$`;*b`Xu4b1b#9Yn2A!+5>5MPA~Lz<%EkS^dL zsHCZ@9@nsy$O5>6J>8V0r&U0uS8_1F>!3m7>2XZmK&LP@S>M-OWJQF1be zEV#LOPtU<*tv|HMZz}+1QjsymUmQvc9OQH~1rADdOb;BC>1Yld)X>oal+)1~IH;pz zM&O{Hj+udj20CU14jSp09S9lx8_51CB;9xI6(gIl0Ht0#x@<*Yx5Tau+#^L*78h;}3Z-MtvB8(=c%2 z4pLWdt;?}zVb>XRU{n-`3Zt0j86jU$h+9hqVkg8RV(6oyfTK#l=?}1w9A}PT>cs_% z?z0Rsiejv_$yIx>h+EN;0NM>eqw5jLAvQh&_lwOKMeO-}m0f5D!sz~)M zYQOZ*f;Jp$YCl#7T#gb#SsMszV|U3xFSlUU)kJTjD+h1aMsJJU>Z?QY)CEGNe)Y+a zLhA#eGXEY7AQ~xqFc(Kuj6Nv|c~O6Zz!i-?6}2IZEElFk31)}_VaEP%+oV4MD z)5)~JAujGr$BDQzgYrzmqnVV4PG(UaI+;y*=wuG%sl&-!%0nmfC=Z>qQyx0$pgavY znNNA>q?7W{$pXqlCkrW06HXRU9y(b}dFZ5z^3X{)<*CQX63Rm-ODPYXETcSha#kQz z9!2wVx(HR{_6l)UgR>qno^ZPs7rlW{MKt$Hx)8Zni8IQ*TAWeVHGxoNH0xTr5LwR_ zXOwlFIHRoR1VUBOtn2AQWZfXnDCXPD@KMDF3X-*^&8REcm|e zCk#;Xu5y4Hw}xcbmQdzYhXapOI%b7*olCkxm9|h}cMsUgg&>R((y%flxmv*k>WU5} z>F{I0Pxm2Bp>gW`)uk8TOc5Roq^3oMJC*=}cX!qlMU{^?U{Xs3H z#>4-%LLQ7nHnGxS{sy#4welkaInuKO|B#OG_Xhqk;HPW6RucKQ4N~hjxdzhC+j)o| zm(rlw-XT3Ih2?trR{2#;rDlOn*og-nRBwAIwP4SeNm$%$&?USvgr-vR=!s z%)Tq9Bxifh5nHM4j@-1|oq1__$L$&R9{WD~i}@+}UHOk9)9g+#&b79=B(;=W#FdHhG`%HT(7zN`(swZ<+9JQ9;q%qFai7R`jaB)_;}% z)j(U|sp9nFb;b7;e^6pCxuWEOlH(IoCf-|GU;1X*P34;_W>)l9?yt(Iy0_|7^^)o* zYf5WAsNGomVcpES`|DHcudV;EVRpme#-_$cn;IuSJ!N_GXDw|l`&;g7InwfeYkKS4 z)(2XjpUS2dOzoR`VCwO<+P39wm$e;e>z|e~t$Nz6(*x7@&M?eaJ>#jF?wNPYDxbA) zR(STx*)PsnH0RN|_PO`Y)6Ls5@6GmQ9qx`tJ5J4CIsf5K);YiP;ROW?9$Pql;hl?g zi+UD4xwvrgtz8LSw{*SU?e5;){r(dBk|j$XUYfh~ilwhF>sj{TvJcOyJ?pBoURhqd z{Qeb5D;BMIxF?~ft*5Ui)bnm{Qm?zWzISWy-rhTUf7bhY@1IwCSGKR*xAO5-(yG9! zt*iE|3axr=b>Zr^)yr3JU;Xgv<7@0|Hm^CdHf!zNwfon;w)VrbEoUz{`?j;+T<2bQ z$-2wy9{-l1;a43T=9RQ+RX1=HTY7o1Z^dbMD-8Z#nnPE#57=x12n$_Po94z1dgP z*VlJn-`nRGp1tRN+iu_1e_`5%voG9v;WOJE z+jne#{i2x{t-omBMMo|=xg%po(~k8!?%naqj?XV{x_HOM4_y52B{`S0Uh?!M$1l}g zT6^jIOIKcc>!oj8rnxM5*(I0VdD%Oc8!j)peD>vgFTelt7cW14h2x4nSM*;QyzwnD4>TTFe&Egn@7|-i zXZ1Y~-t)n|hI?D@z5U+9_n!K0>vvav_nG@r?wfnx=KCJ_9{XOw_f~%If$tr;KXCun z`=7f1gYP$g|LO04_CVVMk3Z1=gVjHH?FZopvmTuJ;N}N!dhq23Pd(K7Q0SrK50^i@ z|KZ1f=>6eUKfM2kPyO(CNEa#$EemZ6Js1if%ssf^;4KFa9nu|YJGA`J=0m#=-GAu0 zLmxe|=uz*FS|3~erjf?tJBw-?jd3`|sX()%)toR}cJt!D}h6?S1XzKeYehzSpmK z{k}gY{IT|rxBc;hH`?CV1!^y|DOeFsV_lG8A7f?-KTa~}G_V#g^qZX~XAP3sSL3V6 ztjW}8>U~qB!>3!@q|(zbpH+VNaQRPuB7W7IU#K^58)b7=iq+*t=~-C*_=4`7Y@A#4OnnJ=6{JX3iyfEMHJK^6ERjl! z7w(w7@oNR=S>{hIn_Xecshm~bJU?TLYtP2n7cD5}%R6_ks93qQuwlBlZDm74Z=0{R zal)ci70Y3~K=xi8__-NvO@ft`J!nJq0+6H@z`#2JS2AyPdI}u`NJY6F)u%{)&MQms zYpN)3k~%({vtvPuuLK|ku3HIm#-&Bp^sESN^4?a*c0;Dlkk(g zH2gB3EgkNCy7v#g$g7l{g0hXQFz6Xsww7x&$r>uw$c$8~&OBJEse}JC{5X{)~ z^wq8Cs|jp%FflVj0&tvbrRG^7OM6$4Y!q}bVe7_i(Pij7t(JG9KM85JU_qP=ctp9R zP9WMUwRQ)MRxkS5l%~({bEnBwl_FEGRt@j-3_|rJ?t(V7bVH(ZVxw=)*7m}ZMVHK7 zz0bQTb8$<_>}vZttDTcdbAQe^hi{sZmY(^O${;n&r%jZfURE&SVU(&6yi zyx?>zuLY_U+_PV!Jej2jQ_*mAr9guzO)^mlcoXlO2KG7A4*Y}fLS7Rq3i?tx<0){s zkZ2Mlwa5TL#SUjl30e(YButuAe@%IH6`;WIa}{`fHFo~vGVg_^;<-)JI&A%v#gaP3aigT#x2en0SQ|C{AqM zwvDIk35U6DAD=rjdIAkb z!;8@D?_z+8@hRuxJvW;e445$Hd9xO_muNg+Cv!WpED(tLHCcDXGHCX-5 z64~b>5Hm9Ea%PiUQ(Z$H;!4r#`IV-s+R9XUbIB!YtWSb1wFh=`g~nb0Xx? zRa5Epb1R7SueXKkSG2mlt;_4Kn>}yawz+e7LiiKua8_kUU0r8&&YR5@e{WFgEgkrY zz(oe^W6FXhPDj2Slrb$OnFdC4D(92qqQ_t8ABr9wtx38;6wyM}#7Cg1zM`#l?vy!E zOnLHKo9E=`k3`n;8%k$2EXXCi5uOrfHg>wtnXIBr!PiRQD;0LSz!yfZ7R#BIW;u^i z#-tV+Lcp5S>ol1xpefv<)0G-b^+uXKTA@zqag zX*YSBiffk!U7psnYBzk%bfIB-OLI`tXBT9r>k}MhQ%g(RYx4{0=J?Zd$~+l$wOMYP zS#QXjIJLBFcBO4qx2-l<4fsJjU@3hVTt-eX6PSxGf)PSuN~2ZRX(cSVtWw$w+g`xp zbo#p(jriki4%)v8?^~HG=%Dv8IBEUX0NH3WXXz$EK&{-WP4#OFyn=ud`+$iZ*lZ<}3iwmuDOZsDDe8jV9Bh*gW3Hku+(3s) z>ohWmsi+i$582GjY|6~kg8V6@K_OJ!CGRVAr#kI936jy4?@VoYbPj5)M;$WiX+_3RaPsnTa}0 zMy#K5gbt<1dY#@SE5x!w0U`z<`GzO2%FRx+T1+}wXR>A{=Hy-V#P^t8`7}=p_8%fBx2=}D>7>;_-$Oi{-=j` zarT#e-@R`a-xA)>Q^F@<8`bgAN1`ua#}8Zb!w{4PbefE-jm=euE=g^ZEeV|D0U@q-~6i^|L0&b z>wPt&!*u0yo}b2rX;b6XQJD4%JlR=Ou)&^}Ys=BfIuJ4p&-MB<<10HWiZR0|7^}d7 zp!baq;Dm+eSFc-B9S_Fk=U1*-Q;Gfr6DInTJk~Rr3qAvrgN+F)Xa=q`a=on6FOA=+ zC4oY3fg?933Tk3}P|cOq*yva-SiZcznDfzLFLdYSxhXxbp2TZLlFjY5#iYUUd5LIG z4Ld8iq=4&n72K#V=LVzP?BaSpCE7rUA(_#jGcHATgRD2iZ6~_IP!gEnv*%{jWY#$h9;(<@s!SAh<6%U4~~#7A#&o6YOUHKkb%23>8UDW%wv2-H5P1Xud{+!c717SJ*CDRizSCry!P1xH8p{vhK3@u&1N>| zKxC`ZpZTI)HdYs`HmIYOoQ^P7!JJ@O)9_&gh{#m5?~J4L9jM>vFz@1~@ZaKr>6jIT zYnOn_!-By{o_u?jMi(3oUfdyOFu0sC(`YpC?3_lH5D<9JF!5(=iyV$3ZD-Qr$&(i+ z#e=vrZ^DGUtm-LKszC!JW*VrL9>Q8-gU=GiiIFoo0n3imY-N(nr|7v(qt)oN>%jg= zvQ}DxjWJdvY$l0k77V?Kx8~;N`g8rD@mU@Z?QBw@7^0z|3N)%Jt7}HmeQ9TPRYpcy zPFhJ$y~|pdZ}#MkvIb;SFDGnH;iLv^WQA8s-wX84^|F1?GE-pD_W zofm)cSkEPVH~)M1FfR$e!e^eoDWo}gFd`N~?Lpuk@C&&U)?+90kmMyQdGfej1sWDq zS>-P;fZ|yF#u7q3fi>_9k|=2|t%WL#`vGGis|uDE`n(>umT4leO3lEYW_?^pEhH<` zTE>u-ab+nS3)*~TK|B+{yCMst3iGWh%u&1obXS2^6C54p>~X@MN z-@-G2+*Pq=O~uxjv9KF_sn~0JJ=i%x?$C^fB#WTEu0#SV3%oNA^5t>bMU+Xufa&#SeXDI&C=Krv(>q!n zNk7K(Qm|x5ezh=8M(mOJ(qnm*7_AlYWXKXAVbXn|#c7yzfJn*!&Rl}s%)(Wc&!kQ*&b;n3q_IJN4q}hDRLhc<3%zrF=ha}oWTM0+$psg~< zHRu*0h)C)gh1(j9CRHP7yA@jmQO4T~|gKne~|Bv-4H3b52+Nm(z`cc}84U8hpPfm)8^RZQl73W9j za*R|z{11f&N9vaMN9nDC>-hrLwL$XbB$7qUoEF?iH%&g;t%?;`-(lc-eX_oF5ZQnk zk^;z7oN^4hzfUY%S4_+2&pP$b;qBf90aiA(J6W$2{i{;TGgh6Fl9HX0O>4NtQ$SS@ zVa{TKI68zKn-l}ht|%LJ3aT1a-=X#g(eX?+hzsHz&wz`hq@>Iw$Z$<2vs(ZZL(XHt z`Ljy9zZnCGN~TY}JqU+FBhuwd1spEc7_7qtfH(^L^-^NC4a96~wVDovA2b+@9SPiM zOg6S=Wo5atTna31cR^y-ki{i-3m6L-U#xESqPxEO7#N#kc6zkyJN4EetSZiko~09{ z!>Ad=y|Sho(dF?bP~x&s9P*xUsq__k79sP=-6q~ zAP69v9pIx$2j*mL!4`1QlEOuUs_OJwMW57xfh?$))L}G8kO#)H&=~Yi2C{~~Ophla zGd>dyJ>?*$_Y*Dly+^xkl*45=;@r7|8Z`6k`ybk(gsV`Y}_4zZ*+UCS9(I zKS0`uf4)^F8c@S74W@hClB7%LvR-PAkOM_2=p}*#>Gx8+V$e&5Zfpbu2L)b=mLy21 zNw;PT7M&rZ*fHt#nodj@s|HHKL9LiD6NiwN-D9f|8) zPtaUaEXjHs*BFu@PL)aRH(9}ppZKT^Sk8Z3D?}lxwC-2Aib36Vl(nDeAg>_S61p3pmsdHh9W!Q-_8h;^pY!jA zf6M>Ty#;^W;bhXH^V_?-K@4rb_eT4+6jc!U*Us8XH8;ZUsCf?Xt0 zgIynci3!*z1tUepHq(Q~2}2(gHDr}R zp_Ux;f|R9#*MKt60^$z?qxi%> z*7W6u5k!7xj4@0cYW~Df^B6G(_!oli7)k4??uFHkiW}%O27?nmR7`MwbUwrnqs{=oz zYEBl+p2Sy$`{&MC_gb%*E3_xyCHmY(vSqc;$1)-kb|9!m8&TB98WQn;k}zUVJaZyt zfW$Q^QpO8lxdgG*gjSDsRyI)g9B^H7b0TacrZ9-?H3rgB=rvmX+62sA8B}#CO&u&o zOUcF{3EMKU!gE#wB~@|2Uo@f6>Bz8{Qgs@{^36|7_46}o@bvK-1FsjEhz`7qixDTTQ)CBSde-X4m zAXGyA6A!-@vJ#A{e?~`cWc3}}SnxnZL@<`kApfVbL~A1BL6L#^5ycU5=@=sW33kl6X3jSc_&S>eShfa-BL zpnyt+m1J2?NNZq=JY1qZ3dlZ>(EknD8H@!y_YK)M+&gwN26q*w|E@MeJq~Y>a?z^2ikK?_-(f%;dmX$dY(ZQYIW7!RbGP!?Njxu!-i_GLuud>- zaD{71A$#CkT&K55Z|NOp}Cu0m=?Yzf@Nm2xFrE zsubfZ)u4P5xwZ(4^3p|HTie#;@h4QvitrTs>gH+N7MAYFshCw>I-@i@w_8y$z zAZYiB@`~b4p_`dsTwbw!_kz0K>4m=5v#PE2D_Y!zZ7b2`XaVucE5SFAy)^I>ECB}w zi)q;WWy3lWTY!Jja9T!p$2Fc#!x|mefSTW_2zpeQNGFm3`VLJ}0+*oG8{```(Ddpc z_|Zv1kwbFnq!wZw$vKEjx~(xxqjnV2?mHC5k=Mns@Q&zvzldk&4fwz}l8t!==E+0` z=}k^VkQ%%7H9#t8Al;3!1y&`fQ3;`dGvf@bqj?m#`R)W%#02FrX z7z0&^bqV=q)N;M9wx*f{GlK>Mmu$q;j@H_?%fYTARyDeIAlOrN`f~$>Vp(;Mb3siLZURzK=6W`@Wpl2JKBtV1q<> zX=l#`Z6(F#bc}1*AW5xJ8>IHpZIA|?1tm#Q)5KZ_jbei|#!JBwHb`fF0X9gfb7xO) zYeDDuClq53g3b|a-Jl`TnLK022Q}hEGt4SUim^(n?yPt4GrG*Eo#&m}+ZfkMN$06; z^PRzorZ}ea=GEr&LCYnQ9SZ*%AqPnzj(l)EgXI$Gaa1M05R;MuC)R2y;&yYTGK=04 z-Z!dQQq%_rbzqK=4^IZOlb1t`OalWYDv%`siyYDEM}&z&nmC$J7Dk@J>4&cxG2+9A z1Slg%vg}j98uTklrB*|&0TBv$+3K-i6aPWtK1JT6D6NEL6e^5pt6(ElCA^Jx?%cL> zCwUw_v?Tl>U$EpM!m02%5^|4h;qQe_u7(E{F_Pd=Ng9sz3T}w7Hivt2wl*7ra58X` z<2WGw0n&~cLwt}FQzw0VPo#gjep(9S)z4qYdN+3%09ejWO^*wJTK|4DF_-$A__i#F z+etdXHR}iQumCDv!UJcS8G~+Ey7+Ebs`0{5Z>%3F3sqdFEcx5&as-}I=@UivAS^l+ z$pe`oko6V1Tc^`>8ZZW7O^}^cG{Ievmz!0bT}xz@k>XD9KJUc zeZ$2Ir(TYW%IH`knL-uo47QIYQGnz!wmn9rJx&K_W28R+vCh4=IQtG2*--}!|bdPt`*UKBUwi_D-H@v78y2pili2#Md}36 zA@}xJBA}>EvF(b7_m@e;aqUpt!UpeyxJU#AQ|BScFkCbbV=W$8#zQd1oHIa%iP z6j!RtQveO_Ff*EXL)|z;ba7xPc!Oe!Q@i7Wsr2Hp?SfCb@QHLzQTVM={6Y zu1TtT5=ji}%smnDL;Nm0e^BIrC20<9&&X#qK$@?7*yuT6JT1W~G2+O{(03Sfv_c5( z#H4M_^h~gN%oL#@-hhMi(ntpm*H8$Xf`O(X=4ZKC+Bm>2y`Uho&K_fl<|s+0z83zV zV$G>x6~R&=X_tf0y^i7-3UkjIO--h747HMDC>9^BJU-`8-iZ~7_x%eVqGI7H{jy%7 zUrGBgEXLbDX&%V~{-oE{i9M==YQ?^O60c)l~HjoZo?l8u8@U5!EOR9@+ z!uVZ$J&GC1zvSr~-WAy(eo2qtS0gL392u|5dOT~;9#&6gfm*G;BPr1+>-9-32^_{< zh;|~FG1$V+%9_>M(%3-$%w}4eVM{dH(mdYo=AVpMuBA2q%HSTps-OL(2Z97EBKR$1 z9vcvC#uap^p36yz2}amAfjK44RH7gn!yK52?!`DUzd%Dc#*tZQgh3~i^7o_sRN_rj zQ<9SswMQJ4pBYx5mc|uH0=@C6pY-Or36In%3doD$N7UrND)fQp- zL9dbxQEa2gs0lTKjz&GRW0m-^oL3A8t44I-kfsms7osN}uvI1ha2YGl{9u9^qStg` zD53~k%@kvW~kl=N#j}h}9d~he5A%^j88|x{b^E+=D?e!~vb(NU|%{3q4FiDYY(= zZKkp6AmY1d5N$?=(aezDAXYndGl=+0v{8eRF5KOR?Fb`o?{_PE!nb3+-_@<*pbxxS zH`&BmX|+v(h``KIZ!@q!x*?(ls<(nH3;TFz;ZZH@SxGk(!lZe4MbzGX$<<`wqSVf4}eMSmWO0h0#44O|r+O1-71-|cf{c(6Nk;v++(BZ0ASlT@L2Z0mhZ2%BP;@;LNM zia9YxtR;i5*61>))lFYqvGCkUMa9JdzFFg{ndb9PtH{%7KY|OZrE6nAUtn=gm_E65 zvNz4{ofxpExvJde41du7c}8B!v=o~++vlB_hwr=rAJak0NWNkL)wnouI7%LHBFNGmOy|twvSpKdQ=$=H z$+hT}y`-X8^ZFp0sW3Hhl3a>VDiMv5mCq}gTjzAv%`KTU)4ZwAIPnzF3Ee%TaPg`*8&rH=!=puZHn*pIv2%u4eapHW1KGFf!L{#J>1I3AuVm{}j#WfQqmpYTqPADt1`*V|% zbN%^6{^WB~Jf%&A)r%%M|604O*==!^=K8#TTc9C7zpmI8a1`d06j@zw;9+gi+u#(BwaFvJi&TP$RGY#AYZGMBQfs;@_n8> zTS^j{J>zrH83OqknPeRn6CEv6MY`GvoK?-Rp0_a}*ISlfOx@5h?-yC_fF+O6pC8Dz z2E0JO-_Gp_*Oz9`Oi_E{sHf7AlI3qGaMk;>QXCcJ!Xes;FJQd~DUXZRja(SrlHs#L z0=kK36AtZYU_`}?8D!6MI`Uk0m)lxcpf~$Hie^y>DnxU|DPj#l4yDsqAS(HrxvOSX zFP`LdPFh%5x1h!rewe4^`W=CZDVr*4wQoy}>#8Tao0rwqE}P;mZ0Rm_*vfsGg|J#~ zuB@Ac6$I9Tj9&{mbT+Ln(AjZVs$*qC60lh!;c{qUPo<6!MvNx2$D>g7q0x@=xMHmC zGPT=FC)qtyEfW(9GVPuX8_sLzZ#0#+PDnSWElMzX1CtkocW|=ubzpr-;(uq&_+IG> zew#7^tj&$Eo`tqh&&oL0&-Y7keQ$Py{`8SQ7}NH6R8Qj&*g zF|xE;fp}wQA{@!ESxra~>`JzVoOrWPQC0L6^k(!8a*P<`WrDII_GRIRf!ZQY6=$dy zAA^86N78dZyAI~s0%BA@-V%bf(U*0M8FctYom$8kl~btWU}pQg?#1&~w6B;mYueOc zQ+;ib)j6R6;YWo2Ul%nDpokkW0(>RhU^Q$7DDndRg32S@WD_|XXKG`@beK!HFS6OE zz-wOqsorc%Hfv4k1+_B@^PCBZd1h~&r)Wk^zOQ9TMd|#;0$-jj%jL+)FQ}d7b<|qT zCC+qvV))J~Utv{Mp|9#3SCz?<-d3Mi;jz~7JM>z;HoY=;LQ^2akY-6v(Q9NmCAZXD z)aXr5b(Xo@bxFyAjNFnG%cR1h=0Ij@LYi5peXz8oq_niGEWAh3YK%UsJKvCQGuth| zJm$!B{G0^6%4Xi63!EkqQNia%Y$!5ezAcE8)nj!%~eQI4n zQ?actHOpZ_1d8-N(C@b#C6>a*!tfJ3knPS)NOxDezMy&~)_~t%OGm)_r80_b7a`mk zM7S{-6_o?{JhFz5;qx*<1v0^JP9;zec)jcj!G$$;TEXNC~+jG11Z>9MCykW;XPKw<~|0?8Q2>~ zRv|0VXNE|eV1QCv^jg^d3a2|b*5Fzp-k>NvGx`ip`A~qktX`MUhE!OU;jeHxVkBVN zq=1HFOsHqmH(91umd`RL*nK57N4-D0uQcD{$u;$r{+Rn!iGXb z7Y$VS#Sn>}MDfT^q8-_+pswZw|3 z$MCA0Ktn-6Lm)>z65fb6td%@~k$6M!BCr=CHW{3t%8RJH2k@nGBv>psM;IF7MZ`>u z@E)M+!?Q#g!K4JiiztjBWS~9@_NXEmlgg*^AZj!Dy!vUDzD<@nbrFW}SHl^>Olgb67*|KaR$J0o& z2lo7Lv3%|8|4yGm+jTQ;6&ov}R26ELg%m!;T~ovb#t z#MOFwIoIR`c)B;1`^vBMMriiMV(j%OJ(+@!0%5<5pJoU%g0^4^4hZ|9+>}+$AN&v; zafsPOheyO32u(y+FufuU6BrTqyMN>|S&8;WY~yHNt8<>OPRvWSPH9r_TE~{>Gf*Vz4$ud-B1b{{%1=6MtR^S<{f%lcFBgbjMfXDIzkDtr7*E)L|<{ z@oR|&!z51)`2mf(i14htvpV2ut;j$3tgbDF&6-MoVOdGTgyxAkj_PS%Uu&gPyIC73 z#HMVSBTKI}J1acXJ7%<{6}s(?T$@p6#X9M!b*HC0%j}s29&Dn(Cj!=X>Fcmeg}qrO z%*}8QgC{9bl7b}vkvbwcqoIJ-ft7W^E6q$o2*Jc6a3pDkYe+*J5%%-;^orc(+3oG; zZP<`)NzF>s8xyBC^P~mWRQ_Z^I6pgq(1dzgQTO}!xO#1GxM7&+&Z1RqA7po68^^gHhWWT zaf+#>y|XodHY5X2@1PBdH9iVlsn2xz z^vMt1efi4X?caIuvdtU+@!pL$_J4Nw-2(RmwftR_30fWWf|(ba+1MT+&v+0hlxty@ z%uFgbvu0=vPkH;?C%5M1BxaaXV9$_}o`J}n8wZa3n*S$S&{$cNkWf_FXm6W;IufVZ zjf(F>oukCI6huPE-$>#djcqBD>#o@q;1_-RS@^O~G3(pHPcNFmiKCMh`Hb{C$Vcd# z+BYlo$uuaTsjMh3)5suEk$WVliQM}?D6b*^;ql3A%Apn;r`$%Wr*ND9&*4faA;u-& zqHt&9#+9(0RL9lRVqDd*yOnX3PR?f)2)Ch*FB#U;!)}uQa%5zAFn1M6AZeGd@I}@< zBlgR%C5Vax5mPsAKC%!=hUeShGSD5&AekWSD~3n~6TX~OP}Qr93wgGg=hv)USv6k# zU3^9P`t{|Qn(z)1vQz0!fx|}Z{32LPP_ZZEg(KvrMR4_lCQgL)RPho;U6MdXVia{H zXUd!?@Ta^2fP_pnm+&`j>XgY1byXEZv6%cNu^6*WjNQ47Z~m?wp+*`nhO=^AuG}1t zCns_wT&v^t9)at2_IqW#+8Ve)Kbt2QW^rQ_>)Pfu=S88niAi6|sT#6LR|X6j-Tlww}W7T|(xo7%`P)=Aia zbfQAX@EHQR86Is2AFh{lOOp(cLn^_XGFy@pB)wkQ`hrhrY^bVip3>0P*j8IpSzlG} zwvzVMU67I)*?>dv9!~?Si0R|#mc+)GEQiP{l<>#WNIwhCXCs+0;p zl9EHp+Y(aVDmt_`uvd~HpMxIVkq;>e22Qgu;A24&=#aPp!jj0$f@dt0nZi|`EPl?c z(Bu?ZKm7XGYE9`%@Yvy;v6P!CyidbcBtUT!pnsHMJI`DN_(lVni~v@_R!1bSkWi>b zGJv{BQ67l!N2*ioD5}`^6c%^RI6!||u(#nKi~+m~`wAXDHP z_>VVgY{5M6|A-O*JL-7PyMOHVlA0U>tufT(vC5cnsLT(jdXh8i&Ut7s7z>9?H%I99 zC$ph3j4Pu4Lz74MABwoop$j9V6{6ko#xNf3rIG$aXRZZo7GfCFpcml_GF4%ws{qqh zRUxVZ&DbEuGGhJ+%}PWJ`s+b=AxGzmGmj`uJP)B6rYl#DKDuJvfk1^wr}3nSC6og{ z(!QXD6h!#YgNDLMVH+*O#WkpK3SWU8gI438;LJ}?gLR`plcUWcI|iUf3$5x{whYpf zh+Gu@_Sgmu62&$8czi|;f<{RATp>J_D%b_Vgj{aWC2);V)t7i6q}0Q5ks-X8(Ba`5 z6ZE+Uj2fdcCI}$~wiqQJaf-+s6Mk@FvB!*92lz`P2kZ(pC|-;y2kDus5amtryH>t$ z2%XUvx1Bd>(hz%&5+LNZ+lCu;NEb|-HvjZnLu@+y_FZ8pR7Ti!h%vzbiZzMsI(%e} z9I@=6So3gX`YH`PKu+~z8+kko!P=P&J^reEyN2w62yR$iC~!L<0)@6!tfgbYUEuV% zoxTDe3{$)?Orc?D9>X~0DlD#h$1+e6E9>d6pV3T3nRkGl)>RjDwXMM^%AzDOmtGR) zkQj1^{G$Z5BabD)CkkSvssKFDvAByoMQA}`8p21bBBe98;$3B-<>!pqkjOggJ#$mA z#wh)8CxqXbkpDJNYbvuOJ>2CnDIO6g z7Qu*mJbL^Wn5rt~8Dx?Xhs!G+A=Kg9$873~Ve*`?>&%T-=M3={k^U3?7Ry^mB0zxX z#PRiCgxMHt6qYK?M(vo5QaFv%ubjCl(XqHKGXD`vK(*{bplYz`h;IN(FRj!~vd}?3 zPgRTA^N3CiT6w`dattdkAMJ6+wDfwC_P1xE0{yh7RmNUOz+T2?1luC8m-&m_8eI_m zLrqZaR7Y*X#NtBlmubS#P>^Fc=87Sk%rmu$=f>DH0WBLE+X6)29{v#1skYttINx(D$8ohYd~W%5j2`&77qW$&Y<2o zYM7WwU!qd26LW@aqjR&%=hfzov{YQ_Xsj+xR?HPw4e{JE%f2by)x&HTeGMLGDSt~C zFv9hW><7iVFoP{*YxzeC?*&U?+IZ>Mj246(Nk$ZHUJEOy?s6$Xqa{m1GVmLb$v7+% z8S+Ik>7ykL%@qH+tkwjhIt8FoNYS{YF-VH(H*BuB5|>6SQ3;(%JRt$-PfQfVK3l6A zA=VFl4@_0`HTsekMYcIZ3Dkhv5hVzzE8dEHit7yTlQ|+j8fuUXGQ#~C5b#fJ000?p zF~LdE5@3sHgbC)*lEwf-7$#;dUevRE(b~mp7tEhKn^YlWm{^#WOkWlj+huJDmbw1{ z1I43}<^Q^`)J{=Sc!m4EYHLMxK7bK6NHUd5g?YHK^p>^5E@G}s%c5M6Bj zC`8?X402MkZ0w9z1dVstK1a-NqeYEjhC8yPU~ohsXEw(jQG^)vw)S}&&RM-Oj!ACH z|C~wgu%-H|HPF3t$h!Vjo9jwHkKqN>x$r<_E^Lrel(`T!Aph#D%VSK%ladlULB=WE zXw2{(ZNSkoG&wp~SoGyDIrK@sH7R~E;~)J0&&{9iASTfIb^q%VC`QTt72CJps`7$g z`OG;#%0Q~~rXRc0CHNHCg*>9)&0exV(irVoQle%C*CwuSk&^Wq3LLI3Akhp-BQgYs zJk!O#tS%jOLcEMsgUR>^;!>6fFAII5c4-oJQN~XC+7B2N1XS)!<;lrll~Pg+o$#p0 zHmIx;WSEdok1PN}&glC|Nzv2MilS*SWw5A(SXfY0LMJ>$011@@4(bdr(PBcb1GKMA z)F$GimI5}VKtzs4+rC73!M0I~N?@9#1b7xEMv5E*FlAv`clLSbo_*oE3)ie#aaPx& z`R&9`x!q3i>q>;fnoMD-UQVC(P~@!tQw-MAN^~MCz6qk!WES9~AWmNO)iPV_QoZh6 zZR{6Be()7DUedsE^v+4d`p<@J4Y5QV`S=F278bIwQiRe6XX`=Ip?MhYGGY=Y_vEQd z?tmkGMk4HO9M_R#HN-$%50b&}WpIoP#ec;~kR@Yn({EyC}EJqf!?)kj0Mwl<|n zig!4CH25225sQzf0Ck@Wx#h5LnT&XeY!UI|B#OU*m!&I(6(N;@@3OE@2g^{^hr(`G zm~)#fR57HQ_?m$0Q%Ei^g_8(r{r(9cq=EN=!z{7S6yGsX^?Ir&5a)nJ7`2)*leSrZQxFv*b_k)1t4X zBgW^Dua*pYYDI>y6#0G$B;4MJ4_dsaIx)B9>lhDd09_95Vm_^e6PlMLO#_`rdI zBKA|vVe!R@7%#Gj?}QL|!gmawWB3@v2+y&Iw^+_Zc#GxbpI1swVy4tCLz>Sk$)dke zKDS}c(f3o(e&zcq61W4!Uk#!x;iWySIyk42EAxo@U|&vOcN+WwN^|1VM_RivA&x!=+4HMj|kJZRrPQi8K{qU3~_pk z_|c&+5*fajqWIClN&*ZA2va;CI;-%Z`%78Ghweo2WgbSU7*~Qo=B36>1w}Z4& zXwDI@cL=Tg1hn#!zP`veS6VS{iRsxQbfkI)zr}dpTTu%kH4+hAz6ILK--2W*A6X$2 zeu+&9f6kr}xX&T~u~Fh8DuV!8LwtOKKI;G%59<4oUnoO0&y2wFWqo}kv5U{DsO{J$ z{0O7pB7#wlBEW@VF4jho!KRvy74b7vTouu0p1j-?RwJKdi!M1>oM2lUhyC^q54~nn zBCdT5s&hqgw2*M1WF#z_Y7kAHA}81ZHiufl*NJLNrFPXz+(KYkIOLQz$5e~Szg;;^ zqjyk40VS}u)*{a-**kA)9Iz<`<6{a%%L889` zdy3=%x#cB_a1qu8{(!d>t-nH&Fdl-Z#Gp`)D_=#`xEK&g1Zt7pOd*MkycNarI-HFPWA~9}yousiv8dGFP`(S% zE%&5Qk@ME18$hO-XxP=|?&|E&IJHhH<|ProQ99{0e5O-WTRt&1TttL+K0RMsWv(>eTCd7{ zgK~_GwpwB%;lG(}xU#lIq|O!DL)0$@2s4nd4B2SZU_r)DC26Qw3doCHy*bg(9wsmB zq>VV>^&DDtqcy*AVNP9L^|RS3t8_oe*LZ-sp$~NDQyNXFl730cNf4q$eswu%F$+NH ztzAa_#$W-f;u#w)TTi`hx0yw{tj_k6_iVTLJ*c|z*;-3Kb^7}9rODA+Qi6HQV5}YmXGV>&8+Q*;M~8c6dS`Okba$p3+4iYeq+Km` z=ehQIfL2t2aGK;^@nKd|7Nrs7C=DO*`&WilT#MlqzkmNAvg>_-Pd5SwA=6#SuD>nV zO<)(@D(D6BL%Nd5E_F$>$z-+x@~QlY3V)$~D)z%|${ByPtbWbfMB-NNWN8p460VhB+03eVGic$ejxEaboU=@G@Km5yox(Y=>)`xF{ zkA%*71>3^mfze>&(Pyw|C3_vv0Qf@F_=RE(0Te~z%CV|$%Kkhr%KRaisOJcG4Jlft z{N>6cz<@}RyG7BNr6$AC%KEZ>^@xXlL}1{tIF z8;<6db(1x0G_>ElYWR)nGyAtyGePzO$H?Hk*-P~w*)DX-fKOd!K9SUCuDT%%17=l# zCjgd_SJ+G1Bwz-+3Osl3=1?flLF#6TDDfz&`pl$aakSRvdJ;YTIqjoa!~5J(7xkiQpQp>Mdi)3(U{a- zv&k_ri@cS7w8=p!JM43t92Ms`>^;I{aiA^@n#truBCgr6Uk%o*s%3%uvhrqWYIJUz zBa02bs&{Q}*iClU=QlY64ExQ)$G=rTT}dVlce>n{W~@?IvUTmclG^2#^Y;;x6?A(M zwzcXgOlv|&G)Hx$+7<@rSOlOhR%ed$eUqCS>q^#ti(FUYOXks`0*3$Ux{~!!b5Q9f zqwCZ+r1@C2z$7rYSGNwHj=VlsA8b}-vZZx?Y)yn6pSnKtyT#gq6Zmyuf4hLsSQK8X zoXkl~UI$JCHx2?9P6GfVmMrzZL`uAh=YXmw$V*hFz+cwF1tc%GX2=}m=v(AWX>tXE zGNoE;{XEG7!pG_2Zn~evz_Us(=x9Tp` zw@wWYZ)N-0RK9P(k?8lAk=x60iSFdSW-ry-d0`(y2ZbVM>LmT7Wqov_1bMqi3n6b_ zGlZf$;g*iBLMh@t>NDA9SVf=*@`G@as6R0@<~-ADoJ`Wo$96O#%I9|7sY@oB77*_I z@YU;iPA;r94xdEF?pl3{i)#_BZ;%{YR}G<2L|oS}oGRv1P$-qggXp)29g9jIQ>UmY z!7$S^)+#dKm=f+Zrkx^|N?S!J$bK(^aaQ^hLD7y30X5EeW1tEQR1+wu-2?`8*=1EY zsLPi2aXhGfOBcw9P@;?n1)YGRri-NxEHe}W>WZNemC~#8i3}B|5}XEfsPaePNo$0N z`U^SWT%}QxX@oUfRa%sde9q`qs`niMd0Kjy7j+0$Z-xr@?${$}1%U(avM;*m!IC%)rRamSCj8Q^sy>7~5*!*qO(gjFNN_d41jwJ}**S zB!aj|0dbK&9v4Bm({yyLxQK|jNHg}TkBih?wHht0WOcjp*>p1Ca~0i14xNU$NOS14 z__|?{CR^vfHt>u!PRAG5c7wraljrF>JddJVxUY^MVwgwt97WDKIhDY()DyOWFJzn% zxB=F$oz#L-iIrvy6Ik_S1D~{_;~fF(!8TljJE(Z6QG9-o zT#AjPzI&m<_YZ>BxNxy5-{Zl6OQTifyGnCYCRb@zzigyA4vN>MnX57tSd2#M|Ek>inFkh>W3>`o*4Gj zpy)(C0rx9A2$@5pB6CQ{`BcsWIc!2oKHCce9AF%n*i1YQwJO{!`=qJR{87(dcvypUAAQCpC_+97)eZnAl!)4?|LO(-MF1#h@4M33> z<(@l;;x3+*2FSxTIV{U++trG)A>HOgh#L-P2!4^+wHJGY@q3V+Ia%Yrab8tr9h3IcQ&jTU2WAsA7m z`q$8=m&hDY8keK5(}HVZW}09=-4xAhUt2SAZfflBX;4(YbMDiyT9LW>+$Ka`d&2a@ zp0&w2Uhvu?pMf&HC^nAysKTq#l5Yg=N%@;i0Y2XYj&26>DQ)A}iI5$fj!%OQuYkVO zyvH7}K!_f3S|tR&iuM_-62M+b1afL18)dN3mPW8qgTjwZNixao*OaQ)DG6xc8BW)G z@s1D>Wsrd;&yY$HaLAGGK$s;mS$dVMu5>&a^t+u3ajlKSNwvyIZ9ZvJY8y4%ri3R~ z6^3JtHNxoGF7||iV;@E&2{CLp)53W{z^1Sw;keadQXPoID|o)JCbTkG3)(Rd_IwZ*QI zvSh@@!1D71pC!BuZv^yFwcnJZCLB@o)=njB=PxTSR&sUJSF7*+E1>P!g^NmUlzRm; zA7g9;(19}DFxpxGoo3$yKqpENxs=LWnT=x2f>z*iD<#hr+}tOt33TKW%kUhclyIzM z?L>?UiaQg+aQ%e9QW^yvnhexhB=1_5@&XNrvl_JcDyDbs6)UIXX$pIggGfOYsRDcx zF8(UUW3T8`A@S8zpg$)~1lp`nYi0MQQwyMvvR&=nFiu-`H7b-@l5 z5|H){^v84xelME!xH7?nldn`p=qd}Lpv8-E@+1;YJ{lzr5>Eb0)GkRXSpH9`Q4#^= zOLtPIBm$3DdnDx*w0ur)gpD9)^^@3pJ;JLNA9TP`-R30KgA?sl|Dp8EqObkfgd8as zJp-ssmR2}G8uZuWb~#yu^xYi)1Qbr zJA7%MaeC&{Hhb%U!5*{*{Bb9Fd`JedVfIeUhZ!~)(6-U&kM!pQ+=`|kf4ekmMauxc z*AlnJTXlk&nGxByQne6CWSQ?)_igyMy_b1=XEW)!Uaz-zF71xF37_PuU`QFLjQ>r^ky=d4I6q@%T&^^6EoQvj%zfG9DKYfN&xxpg=`( zJ1cB5PCGam8s3>3T(q1x(dv!&1hU(QLO=0lgC^9tGuloKit(7&iX zozPP&k&O?8J1MS37#hFBSwQ`(x`npW-8rH|+9VxtCvJk4H^Nxh3_Z_Q^YmUgO=K)? zf~KQ5xHd(Tf=4aS6Y2GS*ko;|lL41O5-?ASQ&5JuTYuSpB5O%Y8?T;HT~q!r?f4B> zk@OOoK3N~nBNL>f)Hc+e_SuYjQIlHJ^|u+S*+7GSJ-vw$tX8PYAKK(tRGxf4=gCFP z^=S4Scyj$rw@q-y#T$6^Hp4Z{v9^;>U90c#@fGE@Dvk8#X^>c}O$mS+O{3QLwu#}r zqQMcjnF0N1m1_=iRb8hWE3zYhF6%@UYRhk#dkYsi>8J08u9829Zn4s}PN zYB8J18!=~)f@Y3*&FuNye8C&@_Ltu}=t+9}wvPC^yvF&#!Fe3-977eUS)xxQFl;B@ z+lj7lcyBnGjOwD+f{ynGDezVyqVM|dC%UhB{Dw(U*Vf)*w7kjE+0ucgNUwQ~*nfSC zCz7(}2M6=kRKx?gHL?KMSv=PU`JMpZ!~zaGYD!4H%X)y0des=kE@nkTQ|eR`MaNJ2 z>|#sLEFb7}2Tj&g$nNc(N&WW31wHw6?#Qu;+;IPk#Qr5@9|UYIk|~f6#U{`N)Akfp3m|se5KLLKjIK=|S*@lc& z{V7uiaB%n-c?7(R@dmAC3~cGErOW0MZ++!g*@>O|F1&ExPO(3+^~#x7-@`ont|;Gq zIhk!VXJ5v%44@l6ycD{`IAQw|yQ%y?zy39A7yB=I^`UoMq+I_cTn{+7)z>ev zTgt!v^{@H0&(gE|F(-YPlQ^z5wcy!|>qDHU)J#OVKaj#&h{v+t@-g#{@v)1hB8jb+ zPc7Z*zsx+>yJi2*ZSL-b^KGoB{IzjkKEM0;MCtg>u5DX0x!x--KXRb^Po2bnV*gW5oq6I}P9v@t{sGrZpb;u1U61y^CvnZ0Cuj^> z=vKS%y&2!P(YhAFFcjvj*!k~^`d(~G&J@NLoZGFD-Gu>md-=}n)_#A&x6R>F=2#3X zGyyCa&){w2z&$>xbUhoPp}Vowl448 zK4DSE6T^F*cyGH*o9yHx3{bvtsfF@&#U6Vm88V2MUpGiUh4GWvzi&r)W}@H1UU%k+ zJ=;SwlLOZBO{CuwuPlRCs5hJbRKx{TWsI52qH6E8qS}>9F}(Vd^T)==kIg65&l|9h zlF5+-?I-@pJaZ?ur?742XhWrToS4fk3#6H#qhQc!oXFn@0VLVRc zUFc7xeKoRGPE>)`EsFwqP(?WLC(x);&b}?E1IlLx$0s~PAsQqfoZV3zEulSg!}u0o zk{B+|v>DVfYR8IOygPa-!&Kx(C&t;y$7#2q|1S0>E_r53gThgWOuIQg(e{^Gi{08If1~0_hiBFZJCE4m~ zlHTM{dV+mqVm>uL7z&Rq_YUqI4YO-C!(;i$@yYDMP%t>OBY*Hl<4N7nKt9jjmk74& z9P#0<%xvE6%TGitnc-9>9yaJ4iIGfZvdg}6(cP6t43xoBB+E0D;wk$kjFI90cJ{X) zIQapw|Kf6neT&wJ3ERPQZI}KHXUV^yW73N>;LKG zSH%APyCd7?#$B%Qxowf%`_F)vlxO`MKNavSE|Zz0Y^znhv-k$Dd5`$>x7_Zq=*_5g zLY7>oS#P!9{?->eta`Jl9UZTXCTpwReTCEBYBBLEOlYpaR#M&=e`doQ|}|I2FS|5Ex;(Rh16Bb^&a-2xw3(J3oxm8feLJMy(V-}I)J zedQB(-hSK5Si1b}#~+7eH$VKaJnwC|H;Q}p>b>ZRg}Wqs^k2X6iZ{LS_J4lyPucwU zzh8dzr}Fh_EY=TkJ)JqgA_b3CI>-01hsyuNa^)>JH~z2KzqkC-i}tWPAm#3d^^NzQK$NmP7SjaKXY`-*(yx{1b`cT|AYmiC)A0 z4=mS5*U)Xmufkk?{`*Z{NxHE-E(>f}BQTHKPCGg~bhS1tGFThbs9(x9D|_!6Z99+ap@3@xyR;c4Y^=c!Wgl6CD)E6;zWX!Bo6@JuiTDg( z>mueP=~{2C*Ub)DlM7}yuqd05#=6!tAeA|ly4IM}+OR^cZP;v1Khj_fvi`NE^z*As zz%$J_8=Fp@)5q{rm8X$k!uMXd85wWnz!q;@>&=fXoOx4|IjVWrbA0{cSikVP>sOZx zvF3X1th4HxyqOhij5x~M92B=f#(3dF)1N|fsCJx+hs_m}7!?5)SG2sSrcyuHqv z#DPSwqX}J*|9p>w7Ji12zR02yEF)`_*`<464LyE6d#pSsYp4)&)Z0*m+KqFa>;a2O z%k8NF$N^T><>Q5cD7*cEZ8x)i_AyzjFY8|}5d~bgfAS|-3({L)$3SjM+$IbWNT@8w zTau{9pbTv1rm`4_KFIk@m zMc9>Jy$%@_IvlI$sBI^)=2Tp!M7CDeCqz8PrEYm(9YU1#5Pt)^GKcxd#C%n~cr5~I zg~tYV=9emHFKZi|?0dDbuEJRlw{u5u77yCMo7!rcHN3WJql9L()n~CYO-&m6l{c?3 zSH5cwG)-PNzT;)hrfqJwRGY32E?xpt7bIFoGb*y$PCIR#@_7jvRzzS*E9>~k5U-fc zY(`nYdmHR$dC4AJWku7z3E{6P>_Hp>ouiy1PSm^X@jDdX_dy@LD!(T!@g6r*c2K}XCtC#-~3X8I-#jmRQzv?q& z{2vs5R`zv`z0dBEL&2)mFKZ&ovubIf{b>O$ddwwgQT^vNk5c-|FT=j5M_y;nCaJ}@WY{o|VYUaE8v@*M z5jg=y_EYp>o#L?0^ryNvPfOkMZ9vjU-I}iJ^AbbVl_oxteQv)2eZ8PBpW5_X)v&+@ z)b*%*u`Xfk|5lF;q6@fH00? zB+5Qk8+cBZ5oBX=p5qLqt8pnZqs%@FvTIQha~CTPMiE(Lg17_w#47t-Y_eZVK`^W| zj)C`u!9lq+JdDTizu2Cq*gZS<;D0;IC!T$lElpEdrpWyp8m^zA58^4Ewu<9MXTZsm zV_f*dk-#Oti1SDg&Qz|aoDGuKlzEA1J_B)oD}0?K=YLB6PVwx2aBzavW$Zc+UFqLd*)<+l72)lO5fEh74w7F62oB{bsX6r`Ha(;oqc7i_ffS zu3_GhV!$kr@r0qEKh>hV8*-h-flQI|&v%3L#}>vpvEteP!u4H{6J$y0Pr=(#p|wsB zfHr5{X6KaDNN-wm%4hy6%8TvR`AINuQ@$` z2{MEH=7e>pKjn3=BQt6o>g?JE;c&a^V{ak{F0XOBx@x;(2j=DJx`Bq9GUn&`6crCFUJyy7mfPbG1Z8DKDLinc?h?&bXAB`@~go9 z5$n+b9)drS;uy)I3mAK8CSc!evR>o^}*AcMlU|Fp%iIG z*ZOjW?30*8x@Z9OT9tD~wM`nyW)~|u>C2nWj$)uRqocxam>=3x6qksu!*8tF!raxs zedQ;b5z>qu*C0xgV?W>xiv4uq?C45U{D*u^8^nLCIP*4+0Yz~nZWsq*uO&FhSAckiwkspr7#UNv8Zt^rYsm;!fto&|F(hZ9KyHTW!Jt6DB8YNcuQ%+L> zIS=p$qhn5n2t)46hKp7sa%vTVjVb+9gSxQsOkT0diCmde$OxL#dCX~X({sA6?|9<@ z?A<_sY&@JlUt32}cm+C&x{orO9vAeOjj2aUC7_EpWRn|U(Wz|9yC$3u{|C(<$x;1hA;&OqFS`jqQ?(8pr&VnE0 zvjnn9qL{r8F(LRS!#wY)l0Q^+J%<%@P7U9WBb%6D82Zy&4iAp)wy0i!@|})d#i1ix zQa4zW!-@D%+{*S$$A^+O=9xXQJ)QNBUwk*RP)0+k%=Qzr*@eM?zkf@*^YEpdBH7p1 z$#o1XkHfhgM)}yZoW%?}HvpaeD_cJ?IR`ro&#V7Vm3nKd<%nD;tjPH#8E`cy6=b zHlazBCUE;?5Hx13wZ2N2 zKO9?SLo$CRACJA8B~&qKezj>zRXT~EYUosWY4g)rl)3BdW(if}507n{Qa-1!S18}Z zA#A~%jz!n8S2jDt?7{}ld|8w#wE>=LOAb0+Ub+XhWnrn_LL)CxHV zhT9ZItdXJKrclyhm_xB6{zT4;Q49wqI|k3dI+K5wB;5LTDPoK~!G;YrEMxg!`NNwm z();8WRr7T^G5>lcwDFbmJyx#EhGmtRh~J1^f^{w-_W`EvRE;rTm|L3Zvl zcRRUV+boBNLlM{K@%#!#LDO6w@q0>MhbZR)xXJP>!zg9!be_lJhrmI6r)Dv|6y6OAGA63<9_(8WL&x3OQGLSb8@`E<%BFh?*0D-R0a&@2(e)r`USJMJV z#s+(9-K3$Mt>x-VRwoMXJmPWoW3DN8?&pvz1@5CN4)A!~W^?=q{^DcbU&%{x zk@67bv@9P~AA`B(bSSZ_5av4Qrqo87>l&F}JBO8rH_2x_p;Eg#j8$H#yb>~C33*ma zkV9rjKE&kZT0#mCgm@lJh{5afc*!eP9iFsktfUNvjfj;t?{u}@@3gu zF`?zJ*JaIekGh&UOXrOI9I{7DcuxCj{gIN&23VN&DjMV)>Yk=3k`2#8{EF)Mk)PJi z^V6z1ytO6wb@{xN?vj9eXVcu59fK@4uBt<@q1YU?=lrmOzd@UXI=OT` z6(S^1l5oZHa$(B3)#S555c?19yQq6M=Qzm{ zJ@JoaKx>$}&{u6gqGyyhk&JpM<_>UV?v6?D3Y=zz+=Jr`?cHpSX8@{{jrJ5ngIkhr zx5vYFN{(3GGc>P}-tEcuPq^Ql1E)n>DK;RbO;ob7`n?>5@>1wggg{pL>4 zF$_Ac6aTeRXU6NjpkpSXl?fcw1N==8LQ zlgV(q2US$Apd-ir?zGM4$c)BgqiM%moFS`zFr6v3T0>Mc&V(r5JBji8z#nePqm*OO zP967;$<^3OMOGrZcS~`^w9t{WxXn79$zySP^^4}w;@n>L$in{Kn70=-ZdOawYx3Cq zp&o!Ei2V77YQ|;c@}~ylK&hcC*457y|H|Ks@x%-MaNfAQv!iFE)8R2hlL;DECu1&0 zdNdXv%{aWaN6Irfd+5W?kgc_tNe}Azz~uMtz_=XHnDnPSPQ6IE36wH{MMZ~9LUxbJ zYFZNgfC_m)*jQ$Iw(Q+I6EDUs-xdQ2k6%9(h=_NHF?KYP+`nzxes^{_WDoYZ%uRJa@m$29cz%fFc9??Y@xKxlQV{O4x`yQGqYR} zcLXEdzV;5on6Ay?kBt5|G7BJUL&Ce*Vet^MK(+#SpzZY1_PNQS0LfbN3F?$`eJl`h zV8ug2MjU9fQ(W-wk2- zzz#*0Dhp4oQJpZHk2$?wr^Dy9EQ@#gY)+5IY4a7!-(Wc`0rDvRMR=F+r+9{$^N-U4 zOl7QXwW5t`B7s~}^U!zL!zrshX$tGC9VY8?T6sRx1v4Ilp>4dS&FNuNMfF|ESg*ub zsXm0)yjd$DdS~=Q{^jM97vJ>iBkUud>)7A@`qFDYMf`^O5&i`C)Yak*FJl(UNP*zr z1D>4ZS<6G6yv9<6=$}BR(z;o!PUo)nY$Vjv-q9P)j4t~u&iJyQ{t|cOoI$V07M5o> z)%B<99INZJAM3OY$b^7=0)mSN2pe|Bz`}&GNI!^604Nm1Id93$f4c(|5-`|7nq%d= zl}D^mYgBH3*kq}9b>w4M>X40=dPm+Fs#$79zN}!pa^9XY=6S6pwYhT{g z(HCu$#g0zq@>xE}KGNm%tFrj55Lvad7%~g*Jyi2vQ!DY@=4EBHw`1qBF+Xl}c-ouD zN}n@R-upp|ZMm^2?b7D09(KlJ)JpC4u&bw#%eFghCX2aKt7*4~T!co_l{BSb34jJK zb0L3+dT%24f}dqv-j73a6b6bst5{Cx`9*uw(%n}mEYHkz7~48^ET+}<^u2R*fBd%5 zx7kcBT09QV8^oBli#udlM0*JjQl40l1?V^{ua=_+FEwfP08R#o~?a`1s zoqZ3U;b0;D4D#Jo^)KcuOfafEm7zN6K{{Lq$wUUJU-Jk!V0Ea{mJ=cPb0Ol}4b*hO+Ggn7e&GRTvRTBT{Rfwf?b^21 z7C_$67vhdWS7P2|*&6S{t2E<_)2-jef_7OF5nromTfD1Jo(FpWBHmAOO0NGcqA@3$ zQKBYN=eXwbgQLUyFTLjAREdS|y=ULPH^1j%DuBb-!OuHzAMq8xZ<5tfS&%O3zHtwg zs~cJ+rge67T6X@~{V!wr-i#$4^5~3PVwv9ZUjD2wXb9n1)%v!A9XW>4fnqfAKkvHt z?0s*?Xg)D9@R%YK_E-0jy+fk2e^tID^o}G77&*?2EFGA>BcJf~#BBChuRq+=vGcxm zkHcuRyW2yF7#7wZQne1+N#7{yZ6T*y)jJ^1a8?M2L46VVj6UIJ88Eu74G262D5)Y4 z-{~JZ`5%>DAJjL3VBKv1QqyRJC14i;j|}ica@V{FppXH*q;!{PdJ*7isq3@Z5|5h* zZLMDa;OYnYiOEbd?{;?$hXWI~j3HC9m=ghjyh- zZUB!$OL!5jS~>W%8HWI2kScqOE52shue3-7_R|ygE&ZLo_Uo?e1LA1FavcCgb=uE~ z_m{s}=(5BHqrc!f?l_9l|nDT>I8HcW1L?3A2^g$dR@>}1fgXKNc%Dj+#Z6| z1s=AyT5drPN=#N5V;G zG8VPnH5^D?!@lV53$@xkXfd42oGC|bU(>syT^v+O=E>8dO~LhRc?i&xIBVeVJ58QD zwRboZ{s!0F&$0iMYbd_W?k8UvH3;Xt@;1@LJ|hy=k*#D_aQY_kO}j8_VkWhsis=+b zm5d+?x%OgM1V0kr54<-ZpSFR$yg+>OFj11G4cN+4z`qpPE<)Ur;ihG-Vd6YQqRrgd zq7i~Ds3qhrDxzMiH|a)*+v~I(1&!|)v+QA!_n9l%AdH!?gT@T-L4nQ54cpm1s3UA39;pJE8Q z)L-H3$jXR>0AY}u{Sg!mz z_yD2c2~bLys|4g&^Q2n;6kBTa*R95Kf=vIkXl8F0Wt{SH8FJi$UsrI|Ff%p@13?bE zvf9{<;x0vEi)?=7ltM^tl6P(Jjmm9z$)<{h+{(jzewe6d~de z$0;aNY6cO4$dw=kVw*S}N9I+ygDJmSdDt086+x5WN&%6Sjtz6nDZiWvzXX5Y0PIPp z5G#cNm|db@UIiWm;^Zzm7$krjGHE^*wmS%H626I|6P_bKI=yh08IApy@+#TQ?P80@ z83}~qVeyL2M9in{(zTn~Bo_AAlY>ONa9VtZ{WX^k(oTp2Kxor4WhjyMFMBO9!PlU*CV}rTzTc7mH`ukEGinZ(-ANpTO@W zIHlWbni0@w~{)T-;x(hN=^-ruL3#Gew z9B*)H3X{i#ABxYj>!rK79*r*9IJatK(+`uOP?G*grC>4{3?!&s0m-?u>>JWc75kQa z?xf4s+_!;DlP0{en78H+p8099T5|kqK`Wf6l%jy`A#_+WPWy94C47&4ZU+HhA4W>5{^wmlj@v zX~5h~oPAFCrtlij3|U6M;p!v0xzlM;>m8rSgu@y7QwpV0A^cJAzgze&?)M0hQm~;b zJ(O^qALx;iNI0-1i}3T*^`a+dT0s16o3A%%HMs1?mR3)?)#9}}pvQ%5J-KL0q0Qv% zK+RpC-DB%8`>}YUOf&ldpJ$w?>cPjmX3@5k&@rgV;b5*=-O6axQL%fKVU<5uGd_A3 z#>d}<{I^n<3tbc0w3&%$@hOQ{*SuQk#04PsM8d^|V(rS4hpWlROX}fCd6&<~CMkO`>R_W<_PPRFG<@dH8V0Eq5e?v`d4@e_}s5 z^QvGX5yVU6=MD*vv*$6sPGNNMK^M8gYGxfR4+&qI8$wokDP$hCH&K7Pa*DvRxqz;U zW%$Jk6Y2}^xTWJTdxVCBx1PD55flN92Y){?g^+Uv$)jvcOyl0%b`TCfAjt5Z}g z1!AEIpvI9&fuD_%pXqAm@vCNE+}7^4wT~1+xu99PP9GcHTO8Rthu_bidb{-#rqE4sVV5a)9VE2LeHh?@cx95C(4fvsecj%f*ji zD9{veD${xdFe0R&iU9Xj#(|xPvC(<#CS}xDy#QK=sNrr(_3M=q$^`4i3@17t9d`xM zv1;USh008fBg>f1Rvv9|uu^rN`g<}F(0qG&6JYikg-D#&mo(x;V%V?8FH~FpGkE&G-kwXz&=q4 zHfaq{CE-cbO-Qx7lihDm1+9CuHm}tnUJI7mBeRslTL_1>Mvt}qQFSY^Ypi}h0y*s7 z)<8UCv*ve=hGWC?F;7=4@S4a_$9LNu-f(%j!d1}hF~42xSKup;KqwQG=M)TBS`d=~ z)5ASs1&~~2{Rb&=7M!IzAANC``#(g=Ig3ZcDGDe`LZfu#OwWAZX>ds zee7LTqKKwnv0q`$8)yPG=Z_|~bMr(oA;Uf|d`|old|=5^tQ}?&2@*vsh1CSR7)wr0 z6qv*4lZV5$MkTF?zPy-e^D1Ypw#}1{CUDZWirv=UJRP-WM@I`w2Hkm!KMvg>#Xcu| z2J*{;{v2)9vt70~P0IU3h%fZ-7O>CB=oIKo&n`X}W%wN@y{tdhr) zPpg#=?&_NFFteu<2@fWh2G(4)a5n#S^Et=hHop?K=Ig_NA$_;-ncq_v{7h3tXl-2( z?*!%=>7N4vq+jiv%F_lmfEG%V$JJ0}($>&K*POIw3hLjV1F4v^X38w>>(60dlW!Y) ztb-gZ(>7?A)jd}2Q|ct=Da>6~)jRnfbHrlGc2^D0B+oC<<)uukE#yc<)1Ef1(e5%> zlfB+H?5~91oOcIOVoQh9+*W9b=3(-JKS2xj7tzv7{F$I`l59F>6IFURe+uveQR_IG zSWXh$6hsqEvGN`9rz4gDVamp9AWQ+N<}QMDsr}SuM__97QSc*FO0#6@aw102%3>FlzjwWK>GSu|B^%zO#XT%v{_e#rD&NF}17{Bi zrzJn0>Riiji$KnSBS$3v^CMU%T+c4$*Xx9eA9M#c1ne5_2c1Khf~*;e|45W7r#X7` zqw?+2=kN&m8Ol3#Lbw#bn4tQz73lsFB5u&h(5Oa~)CUomgk7eA9#ek#XUe?RfFXnQ z33QUS4C?-YN0#(^Q>8Y`|jUVDvJ zDp*_JgT`RwpU#~o`=K8uR z6u(ja`De;M0evIF)0n>}F@Fknz1jDXc|+2VeAPG9IfasHml9NVMA&pabPRHoyx zP0;bG^2=)J5SQwnNu-LdGe4qB_%o&4#?KU=J=0$I%;3iNu>UN3YVXn9#P5N30cs!k z4!aSb1TH3kRaJSxkRYnL>35&TokZUhi(vg8#QLGeXSHvzx?EROmW#&3Ca_*_tKrqk z^1O|Y8Q;h2zDK~E<{94-HFW=Db>H**X_f8iP3jCAD*pV8gly7t;{ ziT}I%jCD7sC2;nH@GO4@>?+71ih!(unIs<9laNb=bBNeWC+HyYwdftkGb;<`03LMD zZt#L_k`dn!Aga%#2C z)HuSuLs_3@QOqqI8#ep$F{gH3qShmr-2J>ZWL_@jzH@05T}^7MiCyyw89k}FgmEsuuS5BYdHacxk! zmg{#+N?N5N3qE?_-S0lY3T1DIeU^PTL}Q;ldkc7Y=3IFA;S#B#QCB)ZTZ*hhn8aS9WCt*)Q9yxim(|Wq11d!V@aMpfuW`O)abjkA zV(}%;Ys637l-?S-IDg3{`HLf4(>GxaeXwc2f@d4(*_7QQERo`gJQ`%BaId;%7P1KX zCz)61Frn70`rd#1{rHdl`***4xU7L!t@!!4Ayqtgqz6^s$>87VIZkJjr+ z9hKVkFfxPq9lj({SiQRDij`7_)xs$tBHCPCMHI^-7myRe^8t~U?R!7b!vFfhXAghv zYllC3_^GEbCFuQfb_(v}FAC$3IJr`0ZX%zHbQ;kUPl6zVZcM2_@G8kd6FY3SuLmtW zGjLkQ0i+P%-d8BDmFj2+DN28=&Cga_dqBJfB!r`JvUDR$UC!$kg?!fI2^6>Im#(&4 zVd%;AbX$P<5S}Uol`nG3SDP<4^yYf<{EJc{^p~DcSMqvKFq1Mzg6^O7jJqAkY@Nz ziiI;8@%c08;UVPMQT80((LymIa1$I)w7|mEm}`2t#RMM$>i($>4twt8O}Ae4$Psq* zm%rrc0JwipcuI`3+Yl>8$5O8cG`8W~5S7FncmyQmX5c!tyF9XVBw=-8P8>P6NO;n< z=#qm)$`Po`(_ycU_NC%>N1)B1-)3}JN4uhZ>A1tL{(I~xtHWwBbeKjwHnZRA#Lw;K zAuoQ$dt1-GlzsQ?7uM0SolwGB+1JbYp+#KZ$G#%G2lF8bu996luyI*(N$iPJ}+j{8Lg@Su(`PkUy@4s$*`yC%Svge)?rD$no(3|phYFs;_ zvj@V(#Y}3_7--Qu!xlG^mXp!Ucsu)c`B|+&>+tvoclFI&wU8=a_Lh}BFW;XnBC9v% zw~SwV-{EUMcH4B%MX%mJeqy<&!|v@&M~@!pUzv(Wg0Btaf}Ni1NT_>ws7Nv>clJHf zeX#Fo{`IF;mhv%*>-_(H62$cRn*>S70z*d&IZT*MbHa|&!o+xQ4>Hgpg*Ae<1&x#; zE_7mxjv}f`s1g~UXtYZFXBTGeHYQA$Mu!Iq`E1Z{OWKo$R>8`wZJj7nSKF=1(Mrk* zuH~ybJaxIfSEWG}d)M~6E*T!a=UzJ9D|6SKj9B-I5vG zW!q**M+-wkeUUE1R@<(z40>sH3?98}_pZB+3=ST-YuE0(jtiEtqOXe5)eZ_)15MLY{TZ{%hy+gkK1q``%K8lE~94PJWV%k=QzU%09s?`7r3C@OA zo&F%wrL~$??MiiC&;S|p0-31J%jEdjNPk~%Pj^07H#hAY&&?VrI)fX|%ePXI3lA)f zY<-ivFXh@5iB3#M1DlwT8!|=XefQkMZf`>_t{d-V`ShOIWpNNRS$OE_ zr}_K4klFYa@gEQ~-ir4ZG9l{cpw?{==npj}=3RcMa09vtg`Rk2V2gHbDsPU2tTCU- z8qTvU_*W@m@i9)Nh#+NskRtbV&I>NMozhBPt=+RY}N zJ{!tq;>pgW=?7~M4&y>PF7l`^7e6la3x8WOcN&pP2t)xiOGt{qV#k?9uE{jQ0I(>b zHm(?0OB)o;79DL9uGF=Yn%TMsN0_~JR`FSOHMFHUX$nv`1TPb{`5q>`LXLl5U&%&4`OF^mtgZUadf1wHyrY!T&@k((?vx}ib1^$+#U2Z6d(zXGV9>Q(n9FP^m;y{6ro6!6hZ3U7j z{bG9#US&Kc89gaqVQI+kD=rPpUVWW(l(l+$)5E*^oSy!j1G69P84jhLt<2v));}ix zZR>?w-S9X#wBIs>dZu&f`GJV$$YK47ohCyf8PY!89_yJ%C1(0U(xv665(VRzB)czE z{#aMO^Skw0*?qyd?v1 z8reAb*UG~#r|gD+PXxvV4Lp%V18is{jE`F)SU0EHC}ll`g`VlTz1Bn4@ld?|BG1yy zboWBRdv&Wl>UBpQZR~>Hy;GT%V=vNg?M+N|mOrJ-c$2-ex}!&1(o_2i?*438$4V`s zE<}Tf*E45-DW-vUGA_Jt@j(;FbZ~~xc7frCLP1FnEv?A(lc>O}egW-G*D}O_+{?d1 zF$&!ou5O9yMu1+|qTkcX^m;p4Ts7OKdJSqPIOn6*L#N}q8?J@zHBg90lV*D|&TTI% zajD|bm)o0B7AlD}62et2TVZO_zmf4VaQX1Cv#>PMHQgIBTx!gxJaJe1pZ%G`#`J!R zD;n^b6RD1)&V6%^NGu!7&3j#TSBJ!kdoRfB9E;iGeZF`qXAO6`j_$o7HflgHL#x$> zQ^C1$e75QL82sUg8S^Ndy#o2wUxJ1)S{hP|c7m)$6JXFVreQdsH8?WjSD+`xL=XKz(5o0_$L@$8h+cWK z`|4ZpNk3onQrF3s$M!GX;kx7Vpa1;6KiU0R{BQT4?E5_P{Rv64KAa&51t&CHN`u)2 z1m{Tt$bow7d}J+>Vp*$DqMbV1K;>ZBxx=Gg@95z<^)pro8I7SrO!*Wa8#?-`ZQEXT zbV&U?b5GZ{BLf3RwsonWSQ4!N5fEw;{~FGl#Ya%nM@brs4`#9SZVKRGy^#zrw(|rH z%`$v49b|tw@CEYFA=j>=__+GT$|Gj8%}Q0cXom@@m4x)-VA@AM=$Ox1$M$(HeMfos zh3tD~r?{d^1ke2Cg`9>hpuviH$_VHsyVDvu5qdh*$>bTsU8#B{Ki)#OGvd3dv2Ze`+R zQ*#V`|zQNI7r{nnls-9qkJR`{$CwJ1s52Y%!47Ivh<5j=KWpbkt=FrtSSDc9@O# zxDuWYi!WgX@5ZqvBajPi;EZFZT4DPWV~|V;VxWRXD_o&(f$s*Vxxg;O=GXAycJQJ% z{8OvB3VulKRW%o35%Kj($!5U8XD}L!9qo908~J)#5nDFHfdGjB$P+7~%3)+#WdE!1Nu_Jouv*3D%(kvg|H-3n^DPZe}-K^hsMNHN7X(bD)%n^iTLe&?v^90v|@;`F>Z)5b$H0qD+sE zo%GV609T3zzc~oiRNxuO7?xJc^-?NJlq2Zm9aX=j1>~%XNvgSU!$(2$bi|@iAyUyi z%B`JNbE{5>u!tT)3=WdIIZ#0}NTbv7T6)+?*uQKlJ)A%fkfrINeM7$B*o7l6edViP z-nY;n)E(CtUGezX+}v1k>x_6bIlIyu=}(pRban47B|h}AhyTu-8wr{^f*$j4ca2Rg zZ=acfIweejcirF(qfi8{0QghkT;vmp6hp01!KiHq9cn9J60U`zWQG!q!W5Q@QhX}B z%swC9v)F%q@7ASI`2*quyOOuO`{P$0d*t4m63}l4uoh9QMHJY)lfqkfOeZkJzQfam` z*w+ymnvaKvbHNtNuHo3sKqxdY6C2(I@sJx1$LEJ4qONanu&-xyw0s93M;v|A(|z_# z2vvaKzg~631YW>Z%&p(0zEW6ufTO zR@4Vt9XNBQM-n!XIAt$!%F4(~U-cSrN+F~>q3HmpjL&Tu8{9U#BRP9P--e9B$3lJh zdNCIA3+Ydh$xptqjn3b`El0<_-tnVb)XzkJxU)0dpHMzGfBpi~f(3E@wjqWE8H;zL z>Q^~CS@0#csg%8cpIiLvGrPngvmM7~l;_rfS^>G*bY`|Zly>62jSs}k`8^Ps5J&EC z88l3S1_#Fpc>#x7;g5Ex@%5%cqi*F~1Ll^2V`Qy9d;W3#vj=#`qK=8V2J|QI2 z7z^oCviwAkfSzo^EaOtjPStZ2g`q#9D8yQ16#D5buB^r81)Ayn3bcBgWApOt4`ELr z--U2s&cze}FI8=UP0O|OtmxP3`M-x;`{OC=T&~sX>ubujP3zQ~muu%st0lQstJhZc z(&pvb`Bfw9^vEW1Z9TQHK`%THa_x_);;qv0Dr>QMxptlvHCg8@h^2GY(?$-@#ACCE zM@BE6jm2jUkHiKeKoA*>DW75~z5T=-HNC*+>>NJJ9l^oHY}evYFgUc>m0cWEa>+ zwaB$bbA`TaXC&R1^OM)&xGp}jt8ZXezq^=AUzB71^2`CPD-er?JAC7b%z!hVcUZd? z`U9c<>1c6JB0AwYg!iV9|MfiHJN|-nGZ+>y-UeF&{W}Kwmxuf#J-!_L4Wlb#lNSuS z*;TT?As^^i*rILMcC@rON>h_rPttD^**m$nVPGy%^)?Je?-&JTru&V(G+fa|GoF_XP+!jvqR+%V7xtNZxOY4MhfHI zyiR6@MLxF0=;_Z$XAa9`p|}K#eDcspaZl0D=A7w}WeFB}(iI|${LtUq zf~l$HOwax)*&SVku8(#d?7Vto7IAMhaJXPFV^aaK)82R0+ zZ|_|wkOAD`Bm;QM$k6J5i`Lnec-&=DP) zkNJnX!!73JA=OA7S~jz2ZYzA{`UrUzlSzne7VJu`T zlYM!fWLftA3t3hGPk6Bh>g>$T%QDw_mt|~}9T7hZSr!zEGGdVhM+eecDXhukA2x~w ztp23~5r9*%L@LH{Dr8I)!ayMBUs3h*!I_dZ$3`=m(U@8N{9Ygy4F;pJ0BVc34hDmR zTT|(I`kYS>&CLxJx4?3QjItuD@k@vawh5_HT!$281hn9plp|S?UnpopOn~PrBlci5 zBheP&2G!&Cr3>0KE^}naBz~g&8Ww0ZBGu7};3d_E&$6u;Z%CLe84v|mV^r$U5hf5N zpj8Xp+iRo1C}Din{?Z{}=w=U+dx4=uIiac^NI`0zAWBhesDbG5+U<7PG97`q&lLzr zdkpi_kwVnmoiJz3e_sACb{A3$!UlJb-|5S`jDzzw#HKSdL1VyxNnk>Zjj=h(*U))$WDvN4@Q4r7tKwvwt0 zuPp*|ibISX)YUK+{YwX|s!(@mVj<-AC9R3UNPH0Ln&k4jB&IVu%^`QpuR$PJlneo% z-{$g*;)^U%zj?AJl-6sz!_G{|Y7N9KtVO3|Z8lR|zye6*S>~}h96oYSW756&_hIDj zkUm)~_0#ac1gIoHl;jGYX1t_p!S8rhsT>fHW(@`kNy(YsdL$kfk>Je(Qqkf-ROh|- z_(WU(^24XZ%h?k@dwP0tar*xIX|B`Q2XlB=ROl_`&G3Y`8)zGdlvXGQmJl!!5bIaN zQPM1eMnDpy~Wly`s9?iRby)m1~8wJlo-vDja@s3^C5;|#UiWh%oD)WoUc5qjrx2c z85i4g7)Qut1@h+n^77*7MB8qS)9a6f{qA^3eC1S+4Z+f!%hMgRAH4LE%ZC%KM#tST zj~9Z#6Qi|ef(vV1!2BBtiAN6h(0WsS`+9CQ0}miXXG(BTXQosQr@FdX&!qG2?Z3?W~&M`yt1N%$>fc7-wqT@QX4 zvNFHZg>(p~^H+YS+wXTfVYmWE8gsC{$~%bjYQR6l*vd3iLOq;m1nGbpH?$$RTJo*= zwL`le?;xAHF%ZP7A8O-34{pRe?By!&xVvMHwRk7SUV?RgH)>Dfr3l}xRP>Bu1R(cN zKv1)U$gqZLmg~z;C~qZpeCKieC-xjazT?_!WnRp&r*KB}fP>Wf*=Bf|Ip!_@Q0$?v zFwZ&mZrno{n>t})@xc(bB_+$?#6oGFA~QNwa7g*Lt4gYIrpVRV@VfK=^B3@!+_)6~_Z)Ys=qT%5eC1Rbu<5Uxf z=UDKZ({<0GdMlh=5MdOmJ8cQ#Ir&s7kLLs}?AOt`@!IE%@#l~o^jmg>y^`w=s5hs1 zkOZ-kcuh!NvVtHZCsbqTn^O=zv95lAw|$A-+*Cgx)qo2PajedY>Bi)1Iz`W*&GFW64fC6?eSOu6`PXnN}iUBKW4)hEQ!==Fn9RQ<4=|;=J z8YMsuQ`6l4F%NeZIH$uMXFCRWnBB zvl>{+%3+Ny0OcRaSk>dWntidxA?)OJ9Dkrg7~OKt`3%O`wpZ7=<_xYG6$Xm*rHbZ; zEQ>YP83*WjIa^27WnSZGh3pY}uqGF5`dmdtrCd!}Jy)NRk5!yq!u!}(;hA;L)FOG! z>9~6aI3u|J0?6S$ex7ckQhxQ3$@=KX#GK~NJ|TRay}f#7%IH~gS!Lsy`PYp{CeBMd z<8<9K);%x(y79QAv$C5V5gz4drT&!9VWb{1&I+i>xfssv>z<2ehlDQ)4??agc__su zR`G+ihaSZkhOjn|;>>G#C`k3!&fn)qd-Xa;8l7i7Y!2@l#=Fpz0&!)^HTlC@p8L=B zY{GmT7UY~sieu;qF9|&^);MlTmE#8dmc}~I;od05=kK7o{C$nXLmQkS-E1G`lg<$R zsfgd+30jNi$#lCx6%lKl1hCsMR|Sl>5}&{}R#Wck?Xw4J1wI|?e6AKiyDanDPWNV0 zkxt4P`GX4Ze>z724jT$_Wn z&VC#FIffZlFm)=TH3peTb);{`_g8V*sz24DfmaPYvs#2+#U-dLLp8$Jg|Ad)D9J6V zXQ9&cMj7gCE<-iK>AGjED?^=)GL)Tt8S>QbL4BVj#Fu7%z%Ou^f99J9VVItwa3QnGESEz<>Iccnh9IzNObaqBt1kd|H4r*ZLW? zA|)SFM;6MNmtTy`T;&p=4^XDDxJ0D@)yqoATNWjx*2|aSZb5T(^*Z=nR!Wxo{AsIM zSLef&Ky}5B>E`6uc{9%x<-tgNEWg26Lhy5RGqGe!#YAmO#dx7IH$vJqZjIEoice$-I%)Q7_HMAj>7?ltXKGR#XCbC;qLjhFQ*Kp zQ_TNh(#iCy4M~@c{q85qy1j@k}tyewujmS#N{8bx;%_KgPj=k9b`!KijhX*g!sja7cX7B^wcFMpEz$e&1z(j zEC3%2G(!_SWInM$Wb`|)Bf^HvIptEm_ctMwId~rp=r-bH?<^b=Bj?R#jr>OIm7dw80Qjy%}Q2 z^*@?ahA$1i>Hc7-)xA{Kb}xVNHwIs~yKmF$w$l6l3I0pNn)MR4r#dn(OISmVK~7!q zgK`y$;|>JfheVs;7J271v7dXc%^^ZVr4k!F--%66n$)L~E$=g+)FUXg1FD~YV1%=U z+Sc?LxQ}qC&clj|($kAdif{%(I`*MO$El&%u=u=;fx6Lt6&ni?`=4{|>GG}ZeGk=& z6@jY1);6Cc=?}e*{i+)0g^19QbS_L~Kx!SexuaMpvsprII7zox8CY=!3sr7Z3>1Mw zD}q4;k#)%ka!PeS_}*iZtS3OZ0%m8$e+umdAC3{Zq92NPlYdb&}`%rZO++ zd)%n!UXAH3Qs&l4nxD!Vc$C&-J9Tcl#o;XCHb>1kA#6q!AcZK=$2HW)Rg=D@%wgv? z;jlsa;`T18BlYTaBys7|r436PPCsq&DGTS#nRUX9g8Up+*0lY7z_LCrfrrCs`Y-(+%kfFU zzBxkJhb$I@=)4!pQmsuc!L7Y^96XKo*Udv6i3u)?HI#%Rop3Q;Ur2(+%I>h)7h!lM z)anRbtQMBIObbiG(CA7<#yLMCTsWPvPQ9yJ(-#sJ7Urz&jR`f}A5nD;j$a6)P1bT* z%fPAWjRPz(vb5CUC>>o&o7eKwN7CsCw29Yf_#%5Pg~6FD`f`N8t5)bla?^Sl94#^c z2VAC3D()Xu*S5~sG7=>{x{r`J(gy=JDtMS`#{5E48(3k4#&x}z zlf$ZfEozAXy`|8(fr2BX)(UFL?iIX`kkp;YE-TB)p$VX}in5B)Tg2 z7BaPxR4HlifYoBRVjj%m2*;$NB)3bIG{_x_K?tdDP(ek6d5f6}sP-m!fO~2s-2SrKco^S${(+P72*z;6<9bmrq%RVb{&q=y28Z7&nq>I|IlX*0og#CXXRy*aeYFe}i4c5Dw zG|?Y~?$Bzqt}Fo<&kS0oFs9{isEU3gzi@X(28&w<~IHan?G*SpvG*D<% zf17|Z+E2Uz1EOd%Yilbjunv&bPOhC?UpHY~#iYtf<)uXhNePZzXD;%Jg{Ll`L0f(t zQ_m!4y#u|xYp|=qdIF6J4{?Q9omPOsUcIV{ox&Q~nQT2fRvqUzL^*GgaN2Z*w%j{H z2$c!vc-jQV2oHL0Hm5o{g<8#++6eUYt@9(p(ezqlt<-MP*wCN?$Mp(~@j~z6EI60R zK8Nle4;*u^z$nj*wzgF($Bt=R-?qM^ecjrXXRbPP#j>SKW=tD%%Ggu1k;ACtSqpo- zr9SjEw3S2Ujv*|%?Y?7ZGh-U_1WOq|4s|~bEAwY#&B|%)AJvhD4n8hlIJ|0CnXXn_ z=}70`P!_xd8nDA2>QGl8;+ims02jC0Lm=S8Eg>PXSjem<7ApG*E9JYsHn&%JXnRfp z39qa4wqRzPgA`!o!ao6+)#w#Jcqe_ylDTs-(wCgJsg2aHK7 z(0(CM!l_fHj2j!_nlgRL^l4LZLhR&mldCF9i`^-%!iYkwW(xN?PA2VmOVW4E@~j~i zo6jQW?u(D7pk!Mel%(lorMNY85_45Mt0$J1<>t@=f?zs?VyH@`Nx!7=amzIWYA0@8 zzZ4m|smC=ajl@UQ>@n}~==q*%&}4fS)Trfg8C!=I4S8&BS+RUV__}haU1xFT5J|@G8hl^+FD6A^BdC<|L8of;oQbvai;146oILA<$)krx&jFQN zfAYODAo;EwK+hGA4v|`YtGwxfXal(yG)$vSh17jPo4VSn%27kDPo}jq{$%*kfMmG9 zXE(&oN`bJl!idD%b*cI*Y6hU$pRqDZ1O*1G+ z9m1gV2Fj?3H0yOD-Krbj9F*ua(}LHT31e)t(`K&~4W?@}AQ`-Yol7*>c#a{52Ty~c z&*z(Jkcny}l7k)_h*V!!9KT5Jo}$x~#|?_8$19wD3c$N&K+%1QMt73c%h*by`-7>iVJS}XPh zV7S2+G#?w(f@08bKp$ehJvoC%!n|~O2z^Tn=#8}38FQl?(v z`U-+FNOrrIoxWtzf_c-?Z%}37PIIS4)9xo%3@!lbo6a=$bG&5~^m?CV@b#<5Uw(J> zQ9vJ&YJD8#Dsaxk98o7)WSP#bo|QU+ZlPf*!<<-pYKf0^g<+z^GRci~sMT>ep?@MR zGPGbiY%yKZ%f)Q{lx4xEWTbOeRFGbgQK8P-l!q+if_2=Ei`A$&JKU;nc%f^n1=41FLoRj&Kb z@V%TSnWv`6^MWfZbX-qrp+!6xQ!(ST@$)ZOm{)xAc{3KCKQFucFP0P>f?qPDBE#{1 z)ts`VAbx)k&h@!1cT(Z7^3yMyx9IXEg;mQgosl$g)zqwExS@i-m_2p**zwD!WMOJ) zBCEiHuZxMX?+>AM_dGT=-fF|?^cGw9`wvz3?B<>gKZUVc5D#u8w&B41$WneErL5;~6CXbHmIqZD9~888 zj9tub6`Qm$^4_xyE44mY#4I+|^jx%v-_+CnUJXC5r<>o5T~ury{IAvHkan-=w4R3jP|_ngixJr~y?SuzYmm;{vW&%t7U$*|noSvt@`O+De(w@&tXXx)St7jGz%v?QY z>?(S%LRyWuL+%fk{NN|0EHPu2Uow6ACCkU?Z=f|ri)1MN#u+300A#i)5B~c-{qsu9uHajZB>(wsqGLkRQPeKUS2Lwq~CERp@?C z65-vSQ-C=liNaWX!bIczr7#K^vw`D=>dKm$%IccRNs}rye1EH{fYl`Y$NU-|++T(?9}+Kun%dr^QX4PfOZigq zVmD5AfUNu!?%ND^n-GV3Ztb}hL?}Zz9mhMGAB_EH=iz=d@lN-A@q0pK#N*>98u5tV z!_zjxCh=q=t}o1S1zUo7@E-9}gn02Sq$LmTboU&k6^#(eEW?r~UfRR=z9rLYc30>9 zMrVk`J>8|0*0)qT%yCE@8Nt!wi|*1rFTRD`U~ZR95$R(5p!e75*Cx`w^|I#|zwpB1 z=Xo3czw(NTuZ+iwblzs>iP+RK{%KDHZ=>}kWuSk$I2ZA`SZ;L|mgal+$kRwE-DeSE zoeRAv%&P8c#C~*nk%h6Xj|8k9HQ{~y@yD0^=}$dhV*N0k`MDJLX5`9!D)L^?3~Gio z2IsGCzOCl=+pBNiT(kN1rJ8}vly(c!HXdo4A=8$~@}On|BMMkw7lVV_gM%?)7!*V& zzXt_RNl%N6Qm1dotBB-D)0uSgUcBjhf3}-01a@a{Au4RqzeMnetgI1$j>SLKOjO6q zuq!^Dzl_va*?4t(g7@qfE^lpS@{)2KN+#3R>sIt$Tlf|6iBK;uUM6W&#uAXv7RXE7 z>n-ngPDS-s7gVHzTJqwGGM=)mero$&nA&b)K{2mIxma@PaL4Y}=$m&vsL zLZtB{(3B@a9u>J=^1N%zKGNANIEaQ8bot#?XzkaPUpf*u7aBJij?4AC$uMsKcfLek zb?A(!l2;wlwTI5gD!S^hvo8m#^K3NEby|SYCFmuR9_1OaVLY~kAL_Z3e~-tWws-Aq zx6!5m&MM(I)9jbW2A3D`a*^2+#lHvd>ra1Y&26{CvtZ@;mj+%B!7Od)12*g^#~!C> zi5uz`-A-_*=llEu1U$s&uKd%gYp+>-HSt=&a9TW4yGTQj3lQ`W-j6gsv+CMwS9QN5 zm(PQL=86-=M#=x`-fq)|*s}K)@87@pJ$^m@A3P}YQ^v=N6S1$<)b5~miILrJ^Xo~U zn88}bM4|4y?p>dH9(kntk*zh4Y^{FekydGjp?d2hKrQQ21Jcr})hGKy!=l2S*xmyg zn5u_=b?MeC$PP-x4*g5y1gI{O2j4>akI4FBY7^Dz6*3<(FGnQn%d%dGvTpCQtjm1L zdLhc%^7xlGD=Fx#R+#c#}!&N@%zfsLm)kW2!b@(Af0sE0S zh}B8@{>HLGZGU41Zd3C)9tB+#{g%osV+t`uzY&(sjlr=pv$C^hm8aJfr=%3uq?gai z%AQr0UQ?2iQc|-izA`htxHvtta$|gDR$6g!T2|$c%0`bai!Z7#Dwn_GofF*VM#Klz9Vg)Ztwjl>y?siCsIP_pzx{Jr-zNre<$E%a67B?h=8 zvCy(O@ud2V=l)4A> zA0%7oJo!~yP> zp#B;*?0ZS@kJ-DpEBjF6N|>ryuRn%8S@fKPbe*&S(?DtH(oJj z<|$Rz&7E=HqLPwD=gpXVUDYWw$6V1^vWWEFMN*ES1|XeuU$@kmpnsyP6qz z@-s5>2}It=F}cHr<&GJtztc-f(g8C5EKi;YLSJGeauNDKaaJtdf0*H0NpX95Oo;dX zt_cDc->Wi;#f@(Az90UR*lAS-v#L^4$IdRSoEg)6_5}-94O{IjDaj~FaSlt*k4Y|Y zM@EjwPl_qX7(ORCFLnIM6_uw<99fuF*E8*$3nq@ubmt`GSGnKIEO&>;=Ty4gqqE|} z-DUDTSD8k!MW(SHvZ$t#(g~S9uZB&QF>+@g(O^^1z=> z&dEt0Rz7JGT3OT@m7k|jdvY)fZGWh;Few^im#BNC=w)EUV5sCjG`+oI*|KszY$&B5 zp1QDP&6<*)@FA6kk^X%cAs&NuFZPF~O)N-{36^av?T<#~O~$oPx&+OP9%^>}96Br~ zHNqAf=@cPB@gq~*8L3YWDQBx)ndwQvc~)nH-NI87VzWl~*oKr#y^MYbc~FQkaQj2! zOH*+&i=Q4b_0y0CJh*8!}A%B z^&RhT*Nvm$CoOKOQ*@7Ptj$9G056giWIn1mH!8!OU=5#~o?G1Wa8;=_WV|Cb0kSv}W04!t{>DHSPePeZ9F;aa z!iIWo+@XYfS<^6@Ie}aB=1y<^GPKJ)HLXnEm<_*LBOc`(17S!a%M1-GYcb-tYpl2h$4CNRJp*$6N7$$Yt^x?4~ zlJ~v0y%&O1-n4PbiB!6gQY|CNJT0`|`jqmOiKOfz* z$6XkcJubWF5uQIhJ>DLL<1oLXI!WnTDbtk>{z^{lH(kNFBo7#F479a^X=WhkQI(~Og&+BMkIm$GTA49x3;GJX#>9kZR`pv7l3XSftpAsGU=QHQb z8Cf|kYxI(Y*%8^Pc_ln^#Hew}?lB2P4tH$Q2!0t+d_h*(%;NaG%(}SLF{SC<|A0mv z8RjKBDPm8`*pg*ajj>nOJEH+HfGVMRsYm>V$n^dK^9!EX0gQ8 zI6Eq_xH-k9}dR&cUEp$b1ZcVUHI@j}sgF@JpLB zBI$ngyj~p}6pv5IsE;Xf zjEqmoSi83EDUf$;aUJe_b)967%*-7(p`DWfzBr^lvbJnhHbZHl8MS66A2c0^?6kMUt~HLfmYWzapKIcY>ELsrh4IquLyo+>6%&NKzlZqZ;nZcfCZbRt~?CkYvhzn;D_UQ3sY`zmxO3|lN`_!aVnws`^V&<7k zVQjUsxgl5=z+AOqcI@_3Cl1j?sb;UTF$nCHA~t*N2P=uREbRQ%uXx6F=zS-mx|otG z@1})dGXmkDn!cidc*AaOY;#vlNe(X4maRzyomk>4GzP3qP!k3!Jyad&ECZJtAFbv) zX-st@#*cpzV4ea)LB>2q1?DNP>>ST|&$F1QxZ_QKYLh027TiUkXrd2@BM~*g^xS`eqU1({moTCkCXaT zB4mY}yHRaX?{)~y4!`V=y_G1fnekPes8vCm0^ypBIzn@E*=%xkZ2}KriJXUsNl;7J ze4GiwuoE29P@0j>+!AxGXuhEu*`O}r;4Uo8${Hnspsh6ZvEoaSC|}OL5vtR78>aALWeshX++xvdWr+2r)LJKqEW7ep%K|xLfok( z9=vFw{UTx>#wcUZqsnHL)#ccPL|02_$IFu5sbBi7-K318sqf^AG&y`e^6!eIQ~#Gic|d zH$e}^QRIIzV`dy*%H9HMMrmg3>4wIy>_cEX2~_7nIB*Cf5(_jl#wplF&1}Kw*=3qJ z2y*8M%^ZRg43ErdZSQbTX>09hY+rjqxv6UjT$xfjC0!B$C9JwR-hcs-ra_k zuP5w6Ze{JPgSpuh)&_G2c09JTwfH^(rWLFSyC2v2n2Vw7jgr5y>l1x_5vvN z9L{TV@-Upk9?o4nf*s?LJc>v281^!Ik-fxrVi{~47C#N+!+8Qv2 zW7SA0FXQEWG_T;5>?2;q9_3^BSoQ&KOc~EUWFO|EW2$27c`^nTlfS%kyo>uSr4zl@{UQYmDl1% znln-QD0^PdC-W&dpLiOd&c5U`aJused=~o)_@;xM#m?rl`5aXLd3-)!fD^t?$gkQ=pcINn02|DU&F8EKjzo*pYWgZpYiMY z&-pL-FZr+duW_fr4g5xa6Tg|?!f)lj;kWVI`DXrGeh0sk|Bm0q@8-Yf_wal97XAl* zAHSdfkw3s6@9XR+r!>r@1nggR523k4bnvhX05YCHV(_kMVsz|TufniVLA72L>|T$ zZ^f}h1)@+Cu?KM)>L1wytdspoj1tA{akib^$$lqFM5!nf<&c{b*=e}r?eFYzQ6VZt z6>cLNE5>29P=uHuCbIiPHM?Kbh)JRrYisMpWHCid71P9YL2GE7m`|z3TFleMOmTvk zC1#5`m;sz8=8FYlA)1Mc*i(?XKVUVifkyiHXJjhi7ZJh5{tzWajIAI zu}-vzR&j}K&>aR=6v{!ZM*wu!sh5%GK6YyAZ~D()3q#2>_c;(qZ*@qlWd#dBf@=5AjQFN&Vq9<^u8+o zEM60@;}**|#b3lO@mH~1{0)0wKVd&%pR$M1nq0$v3!OKW{gnMoye0OCx5YbRuXtDN zW4DR-*mdj|Y!kbk-68g~U$I}}eBq15`{Dy}K>S^Nh;;)Wi7xRm*28@wJ{6yd&vA<1 z5v*7{iXFDc#Fyfq;w$mB=w?rd9+ttpwYfDJYvbM&v8m%?0t6Ezc z*M`=#w8FZ*-BG)|scrfCbt{`2H`r@ew01NsU*6c#5mL9jfkM^6Q$vTfUPDqZk=W}E zfA!LzwO*lhOfg}b;`Qa6vb=TOx(0>XG1c%BG<8`+TgbGIrsfrm)@fQK(^MqWyuq#0 zH0;xjkj@z~dnnWw_dQ{m>B!iCJ2PLBDeB+WOwFHm6?nCyZUP;M8>+y*afYie0#U8u#r zP{qE`9J_U)%67;}tJ)gQY799^#dwktqwS;>O^t1h?M>~DQw&=%ZFDRuaBGvo9txZ0#`g9#jx`1f=UNkP=h{_mjg2kM4J|90 zmWMQ}0&G@=(QNV;)C^Q1Ey}$`xwn|yt*u>2;}snu{i+O@(Vy;o3~$LfWO1qurFg zcC&kj3e#b-3+f;mtXGV&UNXjdE%x;)_Vwo2t?M<$I9oBs*(%1fjTmibdl};#!&Wq{ z3E3$9+BbSBYiVp*71~hPzI=6SYjaqG#OVE!p0%&21_P63715wa;|(G6pnW+TC@b1W zxW;^5pE6@!N0lS(Gpe<1#mdHYO)X6=jha;mlDKa986nHmYq@%@P%n5Qx0ULJ80l-Z zdNrxn8uePMUd`&YPQ6;xt5vUFkyZBVas)N7-BIdpm= zK@P}22q|eF;X_L}hMOoU{c3cC*{)F$MyHpC(vL<#>7dgOA7KreY?o148&s5z<)-LO zHD0B2xnxRdb{Qf-eutq!SkctntO~%Pq=E{iM1wLnYMetUYcxgGXyzI?h69W0RQP2^ecPoDL@SOE~AZ+ZlP#sG((4CL3_vQ);1-4?T{|( z&uDCGYHhPa#Op?gdEE$6uN%Pzx)CB@Hv+kC1bW>F@vj?^T-}IfKsTZ((2ZygbR$xw z8__K2Ml=n&5zT{cMA7R;G!wcJHBL98xzLShGIS%F4c&;QLpP%N(2Zz9G-HH89o0^U zDD40;9ZLHA=GL~< zXl!e1UDnXD%4IT>d$ixTL_mF*w)Vy|*JJdrxp8GjwAo_CvSzZ2T(!QbxgDB^{Gwn{ zUYoY2RjWJ5N_uK;Tu18UN@*iKNgJ;x+ltop%bFWeyKPDgAz;|DhUII$UskI5Wb5@Q zzm~PNu5E15-0aKNBPBA9aLM8;sE36%aD^4mmYa1m+Bh40)pkZe;v_UV|s2wi9yp(pCf>In2+PBw3 z7+J_7m#LFqUdI@7WO@v-W=pTvkOo;0;G0!V?XnQOwan4p*mhRaaws8fYlG_7x3yX~ zHnz1E&YTkhTGFfIZ2Ah7w1dIAvUPo%d^epX-P@Zskb66Lw1o_flG)%<>aln$dwKm0G-&TD+B7yp>wK zm0G-&TD+C@p^{EbEi0|W81yDe;cZi_0aK{t4QU`^ksqQy`BCI2lcE=SYN3t}8O~^4 z-!6Tj^P`za5HypWsRH54T!HW@^IBX!S$nIz7niHN7niHN7niHN7niHN7niHN7niHN z7niHN7niHN7niHN7niHN7nj%Lyey12Z0JB2yJNLW=GXh#4xw?D;o9z!Sv5IRHjU2+ zRART99=O9gQn&4QM&ers|F^5=^p=TcvS58a%S1c0^I6 zO3Qhbmh&nt=T%jXvsX8D$X-fwqhlGg>b2BDHaAADlXFWZSIx%cNBM6jQQfHUD08@a zty|yR(R4=hIT12Q`?`kaX5|nev6?Kxm%**IV_EBlvzt0rZ?JZ>H8reSe};OmXi@KG zFdEsnb;vxG*Q?SkuUDm8UavU6yuMWN5#*>%@exc;JuxId?JJtjYFg1qMw{X>kf!{&f<(^(D8jV;R?Ev>89g+k3zLj`&-OMXT9bi$-nv~O2S+C`eXW6~xR z3Xe2|>8hvvit}P#u;s`8@%7Z(Ii%`p*c_P@n9sMW;E@%mgznw+;~`c zb3;c9M#F<>@(n)7J&6U?EUI_2^xAm~+$?|I>=WFqY{9%4Zp^DGKky~}V)jnHE!rDc zSGh>POu|3BSoPP2r#gQWas#;@H>Y2`0jZnHdP zc|FJ;R2Q@;s3Yj=pgV$|3ECU<&tPY8Zt%F^S-~qpR)$ZKds8+jX`(Y>(TH*rV*D?6d66_ABh0?DyFBI}#jo9G5w^IX-u0JC{0t>inJa z3Fn*6uCS0Wci5P)1z{~=KM1=uY+KlyVV{QE!_&hjg`W|=G5n|D_k=$ezAyZUE5tR- zmFpVkn&mp()#kdywbk{a>uuMk5g`#t5hW2*BbG*<9iHj09BwmzwW#X?AwlZ%+PQ@*k5Q zPkt`>&&h8ke~^46MWjTeq@?7JxN*cQBX*D2KjP4cV{YMgy5qnMx$ZLe1ou?;Jogg! zO7{l$J?{Ofxv6KQKA8IT$Vnrojy!SXFGk)t^0tv%(_T+In)Y>iT)I0wH@z%6vRXJ2KDD{6Xe* znVT{ahTvleBo$ZE;jkabbkm08zk z-JJEitUqQwp7mVT?yRn?&$GVH4#|$lPRLHrF3hgXo{(LaJuCa<>}A=_*=J>+n|)dK zmD$&4-<|zn_O|S&vR}-8JNwfdkrR`XnNyiFJ!eTyOU{KkSL9rqbA8UHoLh75$hj|P zTh22%ujK5`*`ISL=UA@5(a3SR?%dqmvfK%|Q*-C#F3DY)+mU-w?zOo$=H8wAVD1yS zJ9A&p-JQ2T?_mBf@^8$)BmchqZTZjSzmmT@e}Dd={9^^8z*!Ji;4a857*#O3U|hlE zf;k0?3RV=f6m%49EV!iL>VjVs+*)vV!Gi@)6g*$>dcp33{RM{#junbRXJJ&~u)>tW z?81`5afOo$=M*j~Y%aX0@XEsL3V%^}YvGGUpN~o!HF?w-qkc8&=24qRy)x>}QEwI7 zi(`rtirvMT#rfD0Sy?=xxUP75@tooliCL5^OYbgyyUbZOrfhZD z^<|x9&zHSY_GZ~zWgnD%T6VO2Sb0i$dU;`aS^4zxIprsoUx-<^t(d!e6gv{OVV?dm z%*j8_+?W}R;n!fcJ_xoh*hbx_`U}I!x74fPy#U}BGd%ntVO77gsMQOD1;i0P$>u%gHSI1wr4Bf@7aoZ!bg$D zZJ6173?Uz9R^W4EhVW6~+XmBP5=RWey5N#BfQw5DlZ$wr2t%n$k@$xLQwnSok&-C5 z3`a`rl#&5322Mq9x)GhNNOcBMP=dH>ke3X^7f-1OK<6O%wZku^D~<9kDM1uZflV%K zD8Ch$bNv;l^lQ&+Y?J2|cBAJ3c9Z8x_8Yu!^W4eq@;t=u_UvH4_uR+s!Mcrm;rBkz z9qfM3c9cjQ(qu%^6cT~0nYclBX)Zp z7JEJ0#k+`ucp-4P7O_mvRqQIyF7`9PuRS{@jc!6d?gre8{5=A`Qe`p@`6rG{L;kCf zf5D#jbRq9g%6z};`3(7bhaE)?_zGzW@;t*+J^PTK2aunqc%kPOtJQgb2Ixmu~sL8^(9CLqto*`RU( zQr4xV>L5~eV1Rm1f%I%)zwrDLX?g%@B2L=^F5ATJ^!yCz+X61T5nT35Q1&+J{3~<{_&ub`&O~~_W$nO@cwul6!e*-SsCgmDQD55M$D6Aj_MIT4~+s;ZrJr~NA z>S_|oH44;=LTD#WGr1C_2}#L+=GiIsd3K2RkjDQTw#O&w`)^OaE7#ugxVO#m<@bM~ z%j7tZZV^sT zr$_)KdhQZQp1ZKIBhj-Nrp?EtvmFo3drOi3G@IkAk-fFg!PrnO>aC&vt8D+L`Tmar zzhgQv0gM2+0jYqIfHXilAOmo|=S6lQdJEqNTm-lTJ(er*{t@6xz}0|j0M~l{ z#;)`1LyzG#=(;bmUjlvw_%+-%q4#qG%r^pV0^AI^1#m0eegn7-a64c#;J1J~0Cxg@ z2e=DxH{kbxdjR(WwgCPBxDRQ$AMi)O1AvEN*H3?${R!?b0A2*V1lS398So0=RluJC zuK`{Mya9L<>HZ7ey8wR$><0V|@D}pA2kiSS?H?LiNZ0XRU&-rgI~&EMd`fDnKc5DKuPmlO@1Jss~1Kqepykd2;U4&J$d zJU~9601#+QfO>?tp=bDnXET2i&Um4H=%)qp0z8o*jWGhiK{1<(pO18^pw4bTqQitvvD z9tVKF=u^BQKwt3|U=QF6@L%7()c=26{{21L|Hb&P7$^9@JreN0-2L~C;`A*`Ne>?S z_|CsGRNwuN-hGPxN0S9cqzcd%dJUV9uE9z8iD-W;IIo6AyQ}bZP>v<*qsuhnOJm7t z(svo$cVkre5sZdz#TetG*w3~Nd-op0{=>(ygKax@s$IjzVf3pOdy{IZ&&6CYWy{bd zGFC3JahSXMiOEQzVNz)|QXR=IM;uQ9o@TX#l|Sb>#$N#J^c>|c16~2V3V0px2H+ix z?Y-}LO~ha%H5Nc~7Dx%k^$07{?b$C)*+{dpOM~4Z&5!a~1WmCEnqn6;#V%-vUC<7@ zpyhQz%j<%c*99%F3tCuM1jU7qq-CXn9@G^17g* zbwNYxf`--w4UNW@yP%wq@^@35=+UW9v>P3HRm@8i20yDdHJBEea^u&|B7 z$u@`>_G1wXh+~O3t$zdf@pACr<=6rDW9)zXu{arU3SbdnF<=ScRKQZeX@JuK4S;2U z<$x7{O~8EvU_W-!y$|>RZ~*Xkz=wc?fR6xOfR6!(0G|Oq2OI{SouFF`D47OIjsqoU zfRd+yk`NlH)JAOH2a)eWpJV2uRUB4Bj`s~cF0ywp}LQ-AH#WGRi5 zBx>-HM1z$=PqSP5l|UqQbcr)~X>+BYw7D{XwAqL}o2AW0LxoN3A zK<3VY%$*}kOVKri{S4A&8#IZ>WF1R^yo!OmiWyRyVPKnt+1Zg&NARP`s zIvfBWMuKA^!7-8Gm`HF;BseA#9Fqu+Nd)C0!7Y)XSQ+>)5l3C9(0dSi54f+>Bm+rT z$R^&@Bm;esoxi4G=p22UqCim^38%FdZY@qJ&-&4G_CU|sW72bWW90h~PF1)7W3ZP3 zegOC(;6cDcs7sxAKLdCc@El+V;CaZsckw<7_!=_m8qCH232PtVj(QshdX<1)BtuF- zuM*I!1oSFFo+pD7CoEJB-Cgf=f1Z5~M|s(B@#Wr9?=CqipH32-vt z6u=_DV!#r>seq+`(*UOf8UV`x%K<9@n}F*Ew9{1bhW2KdlpaT}-`r$TSRgn0))G}& z_xT?fhD-US|9624cYu#}piH}Lm^x@#At+_NatXECpF6y@3l{Z(ms zNti#kU_|l&@0J?vhkl&?&GXwo)u*h+(G$G`hn8y zmDEw#gOTpL_&Vvsj#U@vBWSt}rI!x!*J6iRU<`2=Y^_of_|u>_RScV(G&&hJxAd~v z+{;F%ZhxVAmE!#>!Ix8V1I2OJYdR!-5a*7A4=LNdTses+V@!Jl z)_%BAD>2u=*W$Ywu+FoaZ-Cu7fQ^9f0nUZ{d4Tf)JF$M{Wxy+dR{^gB-T=G@_z?I$ z!n+IbG2js36Tqi{&j6nT4#Uq8z!w0lhvEMK90Pm__$PSPiB(ZiSc?(^hy^6zJJIt1 z+J>FtM9%?n65wRODS$rvXj}Gys+XmIGD*wj%tafX4yPAf9IdJFwP8 z)zUov9$LW<0UrUn03QPm0X_kI3iu50Ip8qh2;d9AQNTX{#{gdf{z=+7(i%mYIo_!M zNb`22c{|d)9ckW>44^LC_pJJP%zY2J=BZ%3N9BhA|dR<{XgD&ld# zGk|9SJ0OSpmn=Sius{g)U_cd22SA+X_XwAj~B_iM3o$syIEL z^fS(+T1UcrSnC&r#SG4|9s1bPmh^8X5-9GWlc ziu_ObUjy}NOqFYhihyAaYPm<^XU2k`Zpm<;`D8d68p?K^#e*NBjumin8gTgpbI6YhpC_8ew`U-0Y~ z<+wwr0(>jPD9=H$OSR9)H-%Kb4>6mFmn(yIidv+l4p5Id+sRmQJH_**mne}|=?U5KA-_ek5xxG8oTTy~-U+hO|xu>VNnMxSk){hV?=2R z4@2Tgs`qyM$Osog@I@AaQrFJr7hjYLvO zbfL#Hz}$&8szoj79NB7`LsL!YJu^do)3k7Q)VR-3wvsWe-v`T@zz(B|PmeU@+OXJ|ZUMk~#b!2kA#;)HzKXGCmH1^SWyeGm2|`##hH zDI3LaX0Fp+d_x5Of?VG>6#s#-d?&Us-$|@PiF9anr-rz8DCoZ{ztDpIZ#+XQpGE&I zKyB*M>CG@X&+P%A~(YJa3XK{C|hKHWCnt(dfVr#$;F; z@^Z-YiRTD;>5n(zivF$256a3K80Ej-wvXJ{p@k1e>Y$5blum!l?G)XO?DHV!>TXf5TccVXOqQ zQq#}%Q05%=3h`ZA^gmu=?pJwJs^`mV@ogId>YP{yGK6@}Ln-{nXs-XNl$iU0L!iyK z?iJ^U81l;>dp1s4i9y?A)yl8R--G!ZwJVOkeaiaZUw`bTF%fg}C}p%-*lI`wpOpIf zh3~EX*RNgy{_PfWWXqJF{uAKo)OoJ25wZTmACD{59-LM~PpAs-p;Lh5qwF@e{>EGd5z;vbH)3Gkp*b$Q+=lks5g0c|RByid`azSZOTQraFRdnyn7 z??nAkB`>|;Yb&)#(CRt?#}MZ(&tBbZs;=3I8_HO%Yn8yigNz}%KZr=;uwA5F{~56T8V z@2ANi%SQHnOqM>zUi1X_NiOb#!+ioD|3_q>K}qY6p>aEbQv{X3yw0B{4A;D zUvHxNjN=SLMw^&u(BQzH(|$?AGM^zOR4P(xN%^J6=2rrqzjpo+9U&ukygXM zsl)_I$;b^tej5)?RA8Q4AU(0((3`UJSsWzTC*XnC^f;u9-mFR6!{~1xgDc677|e)c z3`hExGsJM~XFk}JAK6zY9EhJJ_jN=Iv%4Pm(BC+JjUKA&cp!rlHIp|#u-zqnxwXC? zE~S%xl9bPY|H+5MX>NsJ7bboCmAF0=jl3xt8xZB-Ewwsi8VNBtXE0c(9g)=ba&4fL zskHiyD*$~Uzk`XjKR*UH_wCEyPk*$8?0D1PzX>z6MXVC=)*!f0ZT%NKK5_KMKZIC) zq+f4L{x+tz%-?D7-%5(faSNY%44%NQL8>j_1v3?y=YHs6y6$3d7queL4Yc}&1ju&G zuiZB^UHHYhDu%?NcmT%+pK|gUkU#8H(vUJcf&b^y7i0}=APtQ8$p+uh#~=-9ZHt^6 z)oU?qk$dY}OB-u?&fPhn*rbhDv9ay-hswh@l>aP|#sxm}4&X2Old}TXVA86rXO6lXur*# zhwvSPwVH>J@-5Q;E_`i+RF?E0`uMkxnoP$&TVU>#Qk2$rGQ@F}=MB$0p1niNKrio- zM<9doM5+-uw1FAQn`%82)zEs7RL_NG&?Pkiw3~R!KW=|pU7i>HAG4$~jbE!UrvHRZX@*)kX>LmUpkAt} zjLf=~3C9qPo|_=sHhZp>ng+E!)QbE7aIxp-kU7_(G`2%>ZHE-tpZ)moo)e+Eil~$mj^Vtf?W953h&s0K<%a%rBpc+8! zJSeU|s87dqvw9n;lyyxXWtEOH4Fl*$zSshNndGl59qGqtA^d|#eHvV-%`c$M@;>IA zC`(^Tcs&{hBSypSTQ_-mJOE~*D)ON9CjxlTtW@5JRwjBWH`&7W9nx^|FI&UKY(hU^ zP-}_IVZIx4FG?JLG6MB1HEiH=*#jL6^;B(<(!|hZ2G3*tq{5sv@C@~r`>c6z+iUi3 zHlt5NDRV($1Zr8lUbWuGXP*6D-9wig<{qurzt>=D+cb&ebqZ|o909%LI6+`{aQwg{ zu1@4fPhUVZs`Q9zzCBiWHl;XVP_HFgs3W9_3=q=+O}_g{QZE{6jZCeIVUL`?gI>i| zh~qUHb(i_>i`sGCa4|^NeWBQ);Q(<>(`3Uf}8@1*A?SbE;;-&8W;~q$OMOXBu`mrWq+S{0x{f!|OLP zDXoK0AQgjdae75bA(h@w@4$G7QpELs^%?plRtFgC36PSmUib%LL7|jn@@jj0bvqLp=>xZ+c5GYL}HQ{`bKnKB3UssraNk z*k#lowCoQ9*G?&eclAz_zm1dw=v`8cKux4tq~?-#pcVFx!zmf#IbV*sbs^5jG&}** zs?|1P&qqM%#(1W+F-@O=PhNMR=3(?M3AH358K_dR}?AM{)r5Q`QBH|}XIoa}AC zNc~~mMw(!f9YW0p@maAV2WB4KsUgt)wOpl;MXm7ldbh=kNwe6@40qTJ6 zCD2odm?!o3gSh036JmVP$1O0|(O4R!W*}XFN=?&8{Z2QKqscwrPJ2L_G2)T@ z9xxSBACi>vt{3c&pH!Y@Dfnc+_Xj9NryQ81n!<~5CmP3j0KAJEJdi#wjZJNmL??OG z4ocG)4sNjU(EW}+kCZ5oQ}if#pqaH$+x1qO;8#Pq2xyW z38g9ff8Nsa^F`}`q%QAoufBl+S`Omz;StRZqg2YIeS0M!efzrMTWYmF{(V9lF0vG5 zdi`-2eva3KmUu}Z{*omyS#srvNGmuM56*N`@nBs1fPeoMXXp9ujH-}wdz=c<$Nv)8 z)BL)o>HGM~Mu`>y;?NUt;iiKAF&RN|>YMT5WAbnPqhv{gvkX2r{DU%m;W0eY;{Xq0Y*OYY1aG)u^^(^I&AXa? zD<57PQ|ltRS5iKZJoJWu!N6{|)y=9FXzkBF-B!J+XQOG&T zhk?eXwcC;cn7hP}dgy*B(EWe2H#Dg{nUg3p9>`2N4kY8HmiMr9l`@&ihw>rou&IW@ zMy(xJh*FIHJXsjjQqDvEFW0>e97=1qECFk{8g($V8Cimo-@teN5A_lK?E-%rc{5Cb zeIAFct_uf9p~6Od;j0s9SEdb#vt0X<*o2|oFO zl#trI+Sw^_r%E85%RaWztB)H9a(nML4zcH}msxv;e+((+#qD3i zRXOyNA3y!gi|9Yb&{x|3V-omnBqXITB>q}NU;h53_K-#-(fY1Mq&fRbGpt>J&TMWY z@dbbX36EBPG%0OPQLp-=MjEu5=1&F41HbyCOMWxX@6sGNJ$=0uhq{-1$g9XkOxQP$%ot?jr~>q+(n?$P=O?#aR(ojjC%&h7kC_BFqS z-^w@e+wj}SpTzHb{2Bbt<+$I4pT}S4Z}9K)zuqi75U{5hLRHuS9}K;5UjCk-~2hg`$w( zEJle6ev6nSX7D@3Cb5a%FSd$D`5(pO;&J|<_^WuAKP2{x5BL+}@8To=wD?#Y;?IiD z#OHj6I3m8lEnk8qA^+5hIM7oIW)W-*z9zGotdz}V8}W56^1p&T$!}$M$b4SGpWvPR zM>3z+^5>9~AM+29i+g#GV2DGAApVR96`_cO^6exv2QMILe!#`2M$2>6V|uMoTMqF|23Zxpm5+)&11@hijFQXE3X(`ou_7=D!) zZyL_>SOR`yFdvLNfIy`THUjZv;++MzRNyWEwnBu=z^K<4#6B6n(cq#faGwea=7WN# zz|SK5GT35vD&k$rmLcBdplBIu#4nSrWUUBw25#7`WF71*U^*MW(QE^#KMvGC7Z}dN zuaKROUkiBg0${lizb5v5{7z*T;kO94r(TRWF2QdJZh*U#tpWF5#@6D-zROuNxcCQb z9d3mCA^cy#egr&Mva5jSYWz-R*Wh?ioGU_ZrgId1g(88BRr z-wO6~{2FoV>dnA&3x11m-{EGY=eO(*V7n9dvMyrxu?LWn2T^O*u!r$$!O8gBk)9{< zTZ=mbpGK-W*`I*(8Qe&BDsH6Pfiig>zgYGH+X??Kv%esPyYO4Y{>uJ_6u!mwB8Bhb zw-mRy?ngS`XNQo^PuS;3;bGL#6}ZjrC@}wneTfwQ6TfEM@A?(E;A{MrvToMHrpp@K z%5B`nrlTI)am$N?J6I@pawi+f!+01==ixjYcfh*1i)HZ$9>H>WB#&abJeo)2X3Q8K z!&dQFj$1f+9FK?nFg^^ShI5Qp@&uj$b0SY<#XN~8u~MGQlUX@W;VB3^0%!Cmb2oRh zDxS(yfoCKi$;R?Dp2o)WbY6h;6!JpEUc^h0o-$qzY@_)E*i7V;kdj({0%DxSX93%6 zJ{uV3@C8W8LVhyrPvH&lzl<+~|K+?9X;{hEAPsAIGt#gQx1VM47JfFuZs6ZT8qVeC zBlZjU1+cl0UxYMV%r6F>OZX+gb1CFp5xlSH{F z$8CqB#c0@9hzj_hBqrhhk6Ka7;zgaPV@aZ3)Z@;x$+$lxT1*jBSd^G5rXuV#+zgT+ zriU$jr;1O+r@)Ms2j;`Lfw&nG{R>D`!CsXzop#!VLQ0ba zw@9fSDdlyfl+?jeQin)M-5@3Pcqys#rKGNtlG-LEwOvYTE+uuXl+=+@I!8+BY=J~x zgjh%l2TLg&BBk&+DTN!P6wa4Y*e2z#UCP{%Qsx#y;$8&2BxkFnoDGw5wouC1G%07( zA!UCENlg+q0}}R1_`eFjLMdl6rJT)>ayDGb*=#9ibEKSgNjaM<&DOJ;?R85Ce?L>@!!Y>1|^?8^{o@PLv?g9pqq#06@ zhD%9WC?#pOl%zRQlIBWD>XMSQP)gD~DM>S=B%LTFX`z&)6;hIBN=aJ5Ns>lLNg5?3 zsemMPu_!4$g_NFAQhEkKdd9<^B&LuOGwS~}b|$b{RaqRr=e+l|1xmrTtSwNWv;`4L zTcDIu3bKQMrIb<%w6su`QcBCdR76BnR7Bhm(Q%xKF=R4vmv#>9oj z#A;*WB4c8@F|oHXG1r)wW=zaBCZ-z`(~ODP_@>`5MtT~~QsE1)RmQJlW*IBH7%K~5O7@*iFQDo$bouWDQhojFkNp~$>240+vR;H&)_^DHTadyP!2wvE4z;rIg7fffONggt@WrDFe8OdXcc>{=HUjUj zg6Mtla^0qQdeHQNrj2V`f}^I7n?7m!d(%IeKC=!J zJa2l+^i|W>P0yKLZ1!b7F#U(=r>0+;e(N<1TURx$2s@f~HSKPiZaTm;r*&;zb2!Yj zz_iG;)O3pJtk%}t5n-8WrRfsWdehaW&1hb@$#jS5Zqt3HcbXnT^TWfYkDC70^qA>W zrYF#X@LAIrO;4MiHGRYMJUTLb&-5eHOQx4izw#P!ts9$LBXOpQrpcx~P5YW=Zs0CO zhM4A>jxsGaooG6ZzUwpQzK{RER`5Xl5$&sw%!Pj1o_4jp?W?DZ7;CPq9jr|I8oj!x z`WYIDU9X?>75g>FmDLkYjB{7k6f4ud`d>E+)M!urER-iQAQw1e3~B9o$I@d|F}dp$dg2! zepE_jWX)on59NYp^2d_iWJ^c*YM$SQ^;;Of1~38_G5XGB?5$zMY9=Dsg@1p*@*Yp< zgT#J=IA)Lz(Zeif$Ce*rd2np`ke$hwxY_E@(!FN0b)VTBz0K@kz0>RvJz#dIFHbwH zJl4u%tvuGsW34=Ps9jw$Bl!Tm#cIgb+haAeP6=E0NAm6@;bCOpVdT0(z4wO}-fHD@ zbbsu)yUh+&wsTyLvTkQmUxVHeD}}XMBX}SCSJwr+I= zJSSSM_y2IjJ+YElD*>(af$#S^?ReQ8!=Jj$^+sq%JjZw7xpw00ow=?qJU1UVrtqY@ z(ViY$X)o?d8oo#$TGx;3?$47Qh`*DCzmbE7Gz4$P=kkW(E9KHJM&jG#;fIXE!zsiY zDZ+m$<{abjVaB^se5r}}J(KWJI`MW)<;>IYf@a{c%)-Z-jXyLO-=z$1s~pd$0xzZ# zzpDx#sTzM~2_9Gt-qJFQK9}QRHSlh&!n0dLFIyM9WIeu+Dm47pWI4j`gYkbcgUS`mmHA0<)GXn zhvZ(lPwtloIGV<3$;oYX|*oaCAw5=v{s3=I-GEAM2DS- z3Okcm>q10GE{#|)l?)o$Ga|uWM1W~Tetqb%{Un1ZZ-5MxOc^9uk}WwhScb^eGL$H9 zxa7(R$&-Aa7b7b+S_);16vMj9cP_Q z9GFVR?0PAac~VZ+tU?w@C2?VuERt$j3^SHWjntAutCMy&(iB+RC#q#DbrpnVf>l&3({^T$Jv)fKJfQ>%rq(f+&^dLi=#*Wqi)j8x<$9@Hr=i}bf>oI4Z4f*u?>=F{BFLiJB)}n zmq<3x=kthMM-j13)N6@SClj4cB`TdxG&+;g^vxO+RX+uk4^d?1v*q$e0|HVQSbr%m}l>pb12)u@T7I z85;+Gld$nnxC^6Q0(Y&ezQvXfF!?HMN64Iv?F64wu!&IG|2nKQtnP+Qg4o@$UEp>P zY*+4jPwZ7NycaeZlJ~}@!1FY0DpXI$c7yGGu-zeiUu+LJ&o_n1j31Ekz91Jj6ivx(5smfQ8!cy&}(EQI!s2P!(}v@D}`u*j6p|A5jsM~ zqIpt`=F2$L&!hy*b&S`yv4v8q=dfdB0(tMi@y6a0K1S*y`tG>Y(_IEJg4`TAAmFgBQyo#Vi<7 z$l3z z0zP;q=SsH{S!6!{;zu<8esX4OtH1Yn9Q-+2;>Ud-X|@qN-bY;YpgZgyB7%I_9d(bm zN13ho1Cit(nNPUP-0U|T8Bn&3Yw>f(!j^CFtbGn-&ktqs8mKFJ1owrEIAc0|^sRK( zO0`xdS}T*-C$^QHPNPda_xaQtT_4R3ej!0CmDs?a(YGA$#O`5W_b|d)UWK)1Iah++ z&klA!JKOzCVN`-{c0UK${T#@9HQHrT?|kANe{UypSD$6x?K$qP=R@32@0_*0&Dyrh L+J2k0egD4!v3aBe literal 0 HcmV?d00001 diff --git a/resources/public/fonts/PostGrotesk-Medium.svg b/resources/public/fonts/PostGrotesk-Medium.svg new file mode 100644 index 0000000..2e26fe7 --- /dev/null +++ b/resources/public/fonts/PostGrotesk-Medium.svg @@ -0,0 +1,3 @@ + + + diff --git a/resources/public/fonts/PostGrotesk-Medium.woff b/resources/public/fonts/PostGrotesk-Medium.woff new file mode 100644 index 0000000000000000000000000000000000000000..933c51b2bb9343c9f33eed917448fa35e07a09a8 GIT binary patch literal 66471 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

?O7Kza@o<@@(OvY>=ex^s_F`L zt4g>e8BBsVLz>Lze5dgv&Hoe@rP-NV3Sh6Tx%jx{v=Y2ROKVean`$%EGNHo%Fq0J13dc`IxUMWOt�X*o5 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 literal 0 HcmV?d00001 diff --git a/resources/public/fonts/RobotoRegular/RobotoRegular.ttf b/resources/public/fonts/RobotoRegular/RobotoRegular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..a4ebaf789a06578d1c6fec67d49cffcdea017e39 GIT binary patch literal 50656 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 z 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 bHY{7q?|bu03*@?`|2m8?l-k;KOTqsDg=W`O literal 0 HcmV?d00001 diff --git a/resources/public/fonts/RobotoRegular/RobotoRegular.woff b/resources/public/fonts/RobotoRegular/RobotoRegular.woff new file mode 100755 index 0000000000000000000000000000000000000000..0871062c83803498ddcea2aaa8e2ec89f116018e GIT binary patch literal 26104 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 literal 0 HcmV?d00001 From 0df0ef6ef2de35393b6801d6f5a6681e422dff31 Mon Sep 17 00:00:00 2001 From: pablodip Date: Mon, 5 Feb 2018 16:26:48 +0100 Subject: [PATCH 49/63] change :update-at by :update and sort direction fixing --- src/cljs/commiteth/ui_model.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cljs/commiteth/ui_model.cljs b/src/cljs/commiteth/ui_model.cljs index 46824a1..fd7d41c 100644 --- a/src/cljs/commiteth/ui_model.cljs +++ b/src/cljs/commiteth/ui_model.cljs @@ -9,8 +9,8 @@ (def bounty-sorting-types-def {::bounty-sorting-type|most-recent {::bounty-sorting-type.name "Most recent" ::bounty-sorting-type.sort-key-fn (fn [bounty] - (:updated-at bounty)) - ::bounty-sorting-type.sort-comparator-fn compare} + (:updated bounty)) + ::bounty-sorting-type.sort-comparator-fn (comp - compare)} ::bounty-sorting-type|lowest-value {::bounty-sorting-type.name "Lowest value" ::bounty-sorting-type.sort-key-fn (fn [bounty] (js/parseFloat (:value-usd bounty))) @@ -59,7 +59,7 @@ (t/interval filter-from (t/now))))) (def bounty-filter-type-date-predicate (fn [filter-value-interval bounty] - (when-let [date-inst (:updated-at bounty)] + (when-let [date-inst (:updated bounty)] (let [date (-> date-inst inst-ms t-coerce/from-long)] (t/within? filter-value-interval date))))) From 3d454c9f8d0c4fa08d3680e8dba93e72b854168f Mon Sep 17 00:00:00 2001 From: Ivan Borovkov <555475+v2nek@users.noreply.github.com> Date: Tue, 6 Feb 2018 12:18:31 +0200 Subject: [PATCH 50/63] jenkinsfile v1 (#229) * jenkinsfile v1 * call another job to roll out --- .dockerignore | 3 +++ Dockerfile | 30 ++++++++++++++++++++++++++++++ Jenkinsfile | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Jenkinsfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f10a6b0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +docker-compose.yml +Dockerfile +Jenkinsfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ce2947a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM clojure as builder + +WORKDIR /tmp + +RUN wget -O /usr/local/bin/solc https://github.com/ethereum/solidity/releases/download/v0.4.15/solc-static-linux +RUN chmod +x /usr/local/bin/solc + +RUN wget https://github.com/web3j/web3j/releases/download/v2.3.0/web3j-2.3.0.tar +RUN tar -xf web3j-2.3.0.tar +RUN cp -r web3j-2.3.0/* /usr/local/ + + +COPY . /usr/src/app +WORKDIR /usr/src/app + +ENV LEIN_SNAPSHOTS_IN_RELEASE=1 + + +RUN lein less once +RUN lein uberjar + + +FROM clojure +WORKDIR /root/ + +COPY --from=builder /usr/src/app/target/uberjar/commiteth.jar . + +CMD [""] +ENTRYPOINT ["/usr/bin/java", "-Duser.timezone=UTC", "-Dconf=config-test.edn", "-jar", "/root/commiteth.jar"] + diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..ac6c4bf --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,35 @@ +#!/usr/bin/env groovy + +node('linux') { +checkout scm + +def dockerreponame = "statusim/openbounty-app" + + try { + stage('Build & push') { + + GIT_COMMIT_HASH = sh (script: "git rev-parse --short HEAD | tr -d '\n'", returnStdout: true) + + docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-statusvan') { + def openbountyApp = docker.build("${dockerreponame}:${env.BUILD_NUMBER}") + openbountyApp.push("${env.BRANCH_NAME}") + if (env.BRANCH_NAME == 'develop') { + openbountyApp.push("${dockerreponame}:develop") + } else if (env.BRANCH_NAME == 'master') { + openbountyApp.push("${dockerreponame}:master") + } else { + println "Not named branch have no custom tag" + } + } + + } + + stage('Deploy') { + build job: 'status-openbounty/openbounty-cluster', parameters: [[$class: 'StringParameterValue', name: 'DEPLOY_ENVIRONMENT', value: "dev"], [$class: 'StringParameterValue', name: 'BRANCH', value: env.BRANCH_NAME]] + } + + } catch (e) { + // slackSend color: 'bad', message: REPO + ":" + BRANCH_NAME + ' failed to build. ' + env.BUILD_URL + throw e + } +} \ No newline at end of file From 9f1f04c3d694093b838f899d1ca5ca1a5b1ce8ba Mon Sep 17 00:00:00 2001 From: Ivan Borovkov <555475+v2nek@users.noreply.github.com> Date: Tue, 6 Feb 2018 12:29:17 +0200 Subject: [PATCH 51/63] fix named branches in jenkinsfile (#249) --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index ac6c4bf..ec6b860 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,9 +14,9 @@ def dockerreponame = "statusim/openbounty-app" def openbountyApp = docker.build("${dockerreponame}:${env.BUILD_NUMBER}") openbountyApp.push("${env.BRANCH_NAME}") if (env.BRANCH_NAME == 'develop') { - openbountyApp.push("${dockerreponame}:develop") + openbountyApp.push("develop") } else if (env.BRANCH_NAME == 'master') { - openbountyApp.push("${dockerreponame}:master") + openbountyApp.push("master") } else { println "Not named branch have no custom tag" } From ccf3fcc485812b4dbcc83ebe273b024125eb464d Mon Sep 17 00:00:00 2001 From: Churikova Tetiana Date: Tue, 6 Feb 2018 12:58:13 +0200 Subject: [PATCH 52/63] add ability to delete fork; rework BaseTestCase to use 2 drivers and setup\teardown classmethods; move all preconditions for tests to setup\teardown classmethods. --- test/end-to-end/pages/base_page.py | 3 -- test/end-to-end/tests/basetestcase.py | 45 +++++++++++++-------------- 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/test/end-to-end/pages/base_page.py b/test/end-to-end/pages/base_page.py index 9bc6a21..f602775 100644 --- a/test/end-to-end/pages/base_page.py +++ b/test/end-to-end/pages/base_page.py @@ -16,6 +16,3 @@ class BasePageObject(object): def time_now(self): return datetime.now().strftime('%-m%-d%-H%-M%-S') - @property - def current_url(self): - return self.driver.current_url diff --git a/test/end-to-end/tests/basetestcase.py b/test/end-to-end/tests/basetestcase.py index 3f618b6..aa113c4 100644 --- a/test/end-to-end/tests/basetestcase.py +++ b/test/end-to-end/tests/basetestcase.py @@ -14,7 +14,7 @@ class BaseTestCase: sys.stdout = sys.stderr print("SauceOnDemandSessionID=%s job-name=%s" % (driver.session_id, pytest.config.getoption('build'))) - def return_caps(self): + def get_remote_caps(self): sauce_lab_cap = dict() sauce_lab_cap['name'] = test_data.test_name sauce_lab_cap['build'] = pytest.config.getoption('build') @@ -36,9 +36,9 @@ class BaseTestCase: cls.errors = [] cls.environment = pytest.config.getoption('env') -########################################################################################################################################################## +################################################################################################################### ######### Drivers setup -########################################################################################################################################################## +################################################################################################################### # # Dev Chrome options @@ -58,34 +58,33 @@ class BaseTestCase: # cls.executor_sauce_lab = 'http://%s:%s@ondemand.saucelabs.com:80/wd/hub' % ( environ.get('SAUCE_USERNAME'), environ.get('SAUCE_ACCESS_KEY')) - - cls.return_caps(cls) - sauce_lab_cap_dev = cls.capabilities_dev.to_capabilities() - cls.capabilities_sauce_lab_dev = sauce_lab_cap_dev - - cls.return_caps(cls) - sauce_lab_cap_org = cls.capabilities_org.to_capabilities() - cls.capabilities_sauce_lab_org = sauce_lab_cap_org - + drivers = [] if cls.environment == 'local': - cls.driver_dev = webdriver.Chrome(chrome_options=cls.capabilities_dev) - cls.driver_org = webdriver.Chrome(chrome_options=cls.capabilities_org) + for caps in cls.capabilities_dev, cls.capabilities_org: + driver = webdriver.Chrome(chrome_options=caps) + drivers.append(driver) if cls.environment == 'sauce': - cls.driver_dev = webdriver.Remote(cls.executor_sauce_lab, - desired_capabilities=cls.capabilities_sauce_lab_dev) - cls.print_sauce_lab_info(cls, cls.driver_dev) - cls.driver_org = webdriver.Remote(cls.executor_sauce_lab, - desired_capabilities=cls.capabilities_sauce_lab_org) - cls.print_sauce_lab_info(cls, cls.driver_org) + for caps in cls.capabilities_dev, cls.capabilities_org: + cls.get_remote_caps(cls) + new_caps = caps.to_capabilities() + driver = webdriver.Remote(cls.executor_sauce_lab, + desired_capabilities=new_caps) + drivers.append(driver) - for driver in cls.driver_dev, cls.driver_org: + for driver in drivers: + cls.print_sauce_lab_info(cls, driver) + + cls.driver_dev = drivers[0] + cls.driver_org = drivers[1] + + for driver in drivers: driver.implicitly_wait(10) -########################################################################################################################################################## +################################################################################################################### ######### Actions for each driver before class -########################################################################################################################################################## +################################################################################################################### ######ORG landing = LandingPage(cls.driver_org) From 2ca563ab1a0de79728736e1eba10855ede4ec858 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Tue, 6 Feb 2018 16:31:46 +0200 Subject: [PATCH 53/63] Revert "[FIX #187] Fix address dropdown in My Payment Details" --- src/cljs/commiteth/common.cljs | 15 +++++++-------- src/cljs/commiteth/handlers.cljs | 2 +- src/cljs/commiteth/update_address.cljs | 25 ++++++------------------- 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/cljs/commiteth/common.cljs b/src/cljs/commiteth/common.cljs index 4399156..1213395 100644 --- a/src/cljs/commiteth/common.cljs +++ b/src/cljs/commiteth/common.cljs @@ -12,17 +12,16 @@ :on-change #(reset! val-ratom (-> % .-target .-value))})])) (defn dropdown [props title val-ratom items] - "If val-ratom is set, preselect it in the dropdown. - Otherwise, prepend title as a disabled option." (fn [] + (if (= 1 (count items)) + (reset! val-ratom (first items))) [:select.ui.basic.selection.dropdown (merge props {:on-change - #(reset! val-ratom (-> % .-target .-value)) - :default-value (or @val-ratom title)}) - (for [item items] - ^{:key item} [:option {:value item - :disabled (= item title)} - item])])) + #(reset! val-ratom (-> % .-target .-value))}) + (doall (for [item items] + ^{:key item} [:option + {:value item} + item]))])) (defn moment-timestamp [time] (let [now (.now js/Date.) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index ed677d7..eb61374 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -327,7 +327,7 @@ :http {:method POST :url "/api/user/address" :on-success #(do - (dispatch [:assoc-in [:user :address] address]) + (dispatch [:assoc-in [:user [:address] address]]) (dispatch [:set-flash-message :success "Address saved"])) diff --git a/src/cljs/commiteth/update_address.cljs b/src/cljs/commiteth/update_address.cljs index 14ceaa1..6134bde 100644 --- a/src/cljs/commiteth/update_address.cljs +++ b/src/cljs/commiteth/update_address.cljs @@ -3,7 +3,6 @@ [commiteth.common :refer [input dropdown]] [reagent.core :as r] [reagent.crypt :as crypt] - [clojure.string :as str] [cljs-web3.eth :as web3-eth])) @@ -23,25 +22,13 @@ [:p "Insert your Ethereum address in hex format."] [:div.field (if-not (empty? web3-accounts) - ; Add value of address if it's missing from items list. - ; If address is empty, add title - (let [accounts (map str/lower-case web3-accounts) - addr @address - title "Select address" - addr-not-in-web3? (and addr (as-> web3-accounts acc - (map str/lower-case acc) - (set acc) - (contains? acc addr) - (not acc))) - items (cond->> web3-accounts - addr-not-in-web3? (into [addr]) - (not addr) (into [title]))] - [dropdown {:class "address-input"} - title - address - items]) + [dropdown {:class "address-input"} "Select address" + address + (vec + (for [acc web3-accounts] + acc))] [:div.ui.input.address-input - [input address {:placeholder "0x0000000000000000000000000000000000000000" + [input address {:placeholder "0x0000000000000000000000000000000000000000" :auto-complete "off" :auto-correct "off" :spell-check "false" From 560cd6a9643ab3e8070c62ca7e0a58d9a6a82fc4 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Tue, 6 Feb 2018 16:45:15 +0200 Subject: [PATCH 54/63] [FIX #154] Increase padding for open-claims-label --- src/less/style.less | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/less/style.less b/src/less/style.less index 6fb2407..49c38ce 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -794,7 +794,7 @@ } .open-claims-label { - padding-left: 5px; + padding-left: 15px; font-size: 15px; color: #57a7ed; } From 1a4aec81d75444f48a1b9dba9a3deffc64e72072 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 7 Feb 2018 12:23:44 +0100 Subject: [PATCH 55/63] fix some visual issues in filters --- src/less/style.less | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/less/style.less b/src/less/style.less index 6fb2407..0717841 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -508,7 +508,10 @@ margin: 14.5px 0; } input[type=range]:focus { - outline: none; + outline: 0; + } + input[type=range]::-moz-focus-outer { + border: 0; } input[type=range]::-webkit-slider-runnable-track { width: 100%; @@ -635,11 +638,6 @@ outline: none; } - input { - background: green; - transform: scale(1.3); - } - input:hover { cursor: pointer; } From 92dd80e7be4f57e4f2838a1961ef7e9230feb32d Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 7 Feb 2018 20:40:39 +0100 Subject: [PATCH 56/63] fix z-index for events in safari --- src/less/style.less | 1 + 1 file changed, 1 insertion(+) diff --git a/src/less/style.less b/src/less/style.less index 073ac26..6bf8608 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -442,6 +442,7 @@ margin-right: 10px; position: relative; display: flex; + z-index: 1000; .text { margin: 8px 12px; From 37aefc2d1a22e517943eacb3cc8e18451b3b276f Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 7 Feb 2018 20:46:57 +0100 Subject: [PATCH 57/63] make right column narrower --- src/cljs/commiteth/core.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cljs/commiteth/core.cljs b/src/cljs/commiteth/core.cljs index 45bb1b8..2034449 100644 --- a/src/cljs/commiteth/core.cljs +++ b/src/cljs/commiteth/core.cljs @@ -208,12 +208,12 @@ [:div.ui.vertical.segment [:div.ui.container [:div.ui.grid.stackable - [:div {:class (str (if (show-top-hunters?) "ten" "sixteen") + [:div {:class (str (if (show-top-hunters?) "eleven" "sixteen") " wide computer sixteen wide tablet column")} [:div.ui.container [(pages @current-page)]]] (when (show-top-hunters?) - [:div.six.wide.column.computer.only + [:div.five.wide.column.computer.only [:div.ui.container.top-hunters [:h3.top-hunters-header "Top 5 hunters"] [:div.top-hunters-subheader "All time"] From 22a7939363276c71ffbde5429b0006ee00d4e3e8 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 7 Feb 2018 21:02:40 +0100 Subject: [PATCH 58/63] move sorting to align it with items count --- src/cljs/commiteth/bounties.cljs | 9 +++++---- src/less/style.less | 10 +++++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 34137bb..7dfa55b 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -207,8 +207,10 @@ [:div (let [left (inc (* (dec page-number) items-per-page)) right (dec (+ left item-count))] - [:div.item-counts-label - [:span (str "Showing " left "-" right " of " total-count)]]) + [:div.item-counts-label-and-sorting-container + [:div.item-counts-label + [:span (str "Showing " left "-" right " of " total-count)]] + [bounties-sort-view]]) (display-data-page bounty-page-data bounty-item container-element)])) (defn bounties-page [] @@ -224,7 +226,6 @@ {:ref #(reset! container-element %1)} [:div.open-bounties-header "Bounties"] [:div.open-bounties-filter-and-sort - [bounty-filters-view] - [bounties-sort-view]] + [bounty-filters-view]] [bounties-list @bounty-page-data container-element]])) )) diff --git a/src/less/style.less b/src/less/style.less index 6bf8608..26f4c3a 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -414,6 +414,11 @@ color: #42505c; } + .item-counts-label-and-sorting-container { + display: flex; + justify-content: space-between; + } + .open-bounties-filter-and-sort { margin-top: 24px; display: flex; @@ -1268,12 +1273,11 @@ body { } .item-counts-label { - margin: auto; + //margin: auto; font-family: "PostGrotesk-Book"; font-size: 15px; color: #8d99a4; - padding-top: 8px; - padding-bottom: 8px; + padding: 12px 0; } From 65a357dcd9577e291510f40b0ae08aa6c484376c Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 7 Feb 2018 21:06:58 +0100 Subject: [PATCH 59/63] add top border in the first item in bounties, and adjust above info --- src/less/style.less | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/less/style.less b/src/less/style.less index 26f4c3a..e9f80a2 100644 --- a/src/less/style.less +++ b/src/less/style.less @@ -675,7 +675,7 @@ font-weight: 500; line-height: 1.0; color: #8d99a4; - padding: 8px 12px; + padding: 16px 12px 0; display: flex; align-items: center; } @@ -717,6 +717,10 @@ } } +.open-bounty-item:first-child { + border-top: #eaecee 1px solid !important; +} + .open-bounty-item { background-color: #fff; display: flex; @@ -1277,7 +1281,7 @@ body { font-family: "PostGrotesk-Book"; font-size: 15px; color: #8d99a4; - padding: 12px 0; + padding-top: 20px; } From 439c2373365da4ecb412ff42961b5c3e7d66f8c4 Mon Sep 17 00:00:00 2001 From: pablodip Date: Wed, 7 Feb 2018 21:22:38 +0100 Subject: [PATCH 60/63] disable filters and sorting in windows for now --- src/cljs/commiteth/bounties.cljs | 14 ++++++++------ src/cljs/commiteth/util.cljs | 5 +++++ 2 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 src/cljs/commiteth/util.cljs diff --git a/src/cljs/commiteth/bounties.cljs b/src/cljs/commiteth/bounties.cljs index 7dfa55b..bbdceec 100644 --- a/src/cljs/commiteth/bounties.cljs +++ b/src/cljs/commiteth/bounties.cljs @@ -8,7 +8,8 @@ [commiteth.handlers :as handlers] [commiteth.db :as db] [commiteth.ui-model :as ui-model] - [commiteth.subscriptions :as subs])) + [commiteth.subscriptions :as subs] + [commiteth.util :as util])) (defn bounty-item [bounty] @@ -210,7 +211,8 @@ [:div.item-counts-label-and-sorting-container [:div.item-counts-label [:span (str "Showing " left "-" right " of " total-count)]] - [bounties-sort-view]]) + (when-not (util/os-windows?) + [bounties-sort-view])]) (display-data-page bounty-page-data bounty-item container-element)])) (defn bounties-page [] @@ -225,7 +227,7 @@ [:div.ui.container.open-bounties-container {:ref #(reset! container-element %1)} [:div.open-bounties-header "Bounties"] - [:div.open-bounties-filter-and-sort - [bounty-filters-view]] - [bounties-list @bounty-page-data container-element]])) - )) + (when-not (util/os-windows?) + [:div.open-bounties-filter-and-sort + [bounty-filters-view]]) + [bounties-list @bounty-page-data container-element]])))) diff --git a/src/cljs/commiteth/util.cljs b/src/cljs/commiteth/util.cljs new file mode 100644 index 0000000..8b6f852 --- /dev/null +++ b/src/cljs/commiteth/util.cljs @@ -0,0 +1,5 @@ +(ns commiteth.util + (:require [clojure.string :as string])) + +(defn os-windows? [] + (string/includes? (-> js/navigator .-platform) "Win")) From 27d189f1bc0c24c9fc466b4e5571a1a7396e1a90 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Thu, 8 Feb 2018 11:31:46 +0200 Subject: [PATCH 61/63] Revert "Revert "[FIX #187] Fix address dropdown in My Payment Details"" --- src/cljs/commiteth/common.cljs | 15 ++++++++------- src/cljs/commiteth/handlers.cljs | 2 +- src/cljs/commiteth/update_address.cljs | 25 +++++++++++++++++++------ 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/cljs/commiteth/common.cljs b/src/cljs/commiteth/common.cljs index 1213395..4399156 100644 --- a/src/cljs/commiteth/common.cljs +++ b/src/cljs/commiteth/common.cljs @@ -12,16 +12,17 @@ :on-change #(reset! val-ratom (-> % .-target .-value))})])) (defn dropdown [props title val-ratom items] + "If val-ratom is set, preselect it in the dropdown. + Otherwise, prepend title as a disabled option." (fn [] - (if (= 1 (count items)) - (reset! val-ratom (first items))) [:select.ui.basic.selection.dropdown (merge props {:on-change - #(reset! val-ratom (-> % .-target .-value))}) - (doall (for [item items] - ^{:key item} [:option - {:value item} - item]))])) + #(reset! val-ratom (-> % .-target .-value)) + :default-value (or @val-ratom title)}) + (for [item items] + ^{:key item} [:option {:value item + :disabled (= item title)} + item])])) (defn moment-timestamp [time] (let [now (.now js/Date.) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index eb61374..ed677d7 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -327,7 +327,7 @@ :http {:method POST :url "/api/user/address" :on-success #(do - (dispatch [:assoc-in [:user [:address] address]]) + (dispatch [:assoc-in [:user :address] address]) (dispatch [:set-flash-message :success "Address saved"])) diff --git a/src/cljs/commiteth/update_address.cljs b/src/cljs/commiteth/update_address.cljs index 6134bde..14ceaa1 100644 --- a/src/cljs/commiteth/update_address.cljs +++ b/src/cljs/commiteth/update_address.cljs @@ -3,6 +3,7 @@ [commiteth.common :refer [input dropdown]] [reagent.core :as r] [reagent.crypt :as crypt] + [clojure.string :as str] [cljs-web3.eth :as web3-eth])) @@ -22,13 +23,25 @@ [:p "Insert your Ethereum address in hex format."] [:div.field (if-not (empty? web3-accounts) - [dropdown {:class "address-input"} "Select address" - address - (vec - (for [acc web3-accounts] - acc))] + ; Add value of address if it's missing from items list. + ; If address is empty, add title + (let [accounts (map str/lower-case web3-accounts) + addr @address + title "Select address" + addr-not-in-web3? (and addr (as-> web3-accounts acc + (map str/lower-case acc) + (set acc) + (contains? acc addr) + (not acc))) + items (cond->> web3-accounts + addr-not-in-web3? (into [addr]) + (not addr) (into [title]))] + [dropdown {:class "address-input"} + title + address + items]) [:div.ui.input.address-input - [input address {:placeholder "0x0000000000000000000000000000000000000000" + [input address {:placeholder "0x0000000000000000000000000000000000000000" :auto-complete "off" :auto-correct "off" :spell-check "false" From 177b0b22c7d5f2a20ef6db22bfa6ef4a6e1ac3d4 Mon Sep 17 00:00:00 2001 From: pablodip Date: Thu, 8 Feb 2018 13:50:28 +0100 Subject: [PATCH 62/63] remove cider in dependencies and code --- project.clj | 1 - src/clj/commiteth/core.clj | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/project.clj b/project.clj index 0678470..ccb500f 100644 --- a/project.clj +++ b/project.clj @@ -69,7 +69,6 @@ [lein-auto "0.1.2"] [lein-less "1.7.5"] [lein-shell "0.5.0"] - [cider/cider-nrepl "0.15.0-SNAPSHOT"] [lein-sha-version "0.1.1"]] diff --git a/src/clj/commiteth/core.clj b/src/clj/commiteth/core.clj index e617708..d3c46a7 100644 --- a/src/clj/commiteth/core.clj +++ b/src/clj/commiteth/core.clj @@ -1,7 +1,7 @@ (ns commiteth.core (:require [commiteth.handler :as handler] [clojure.tools.nrepl.server :as nrepl-server] - [cider.nrepl :refer [cider-nrepl-handler]] + [luminus.repl-server :as repl] [luminus.http-server :as http] [luminus-migrations.core :as migrations] [commiteth.config :refer [env]] @@ -31,7 +31,7 @@ repl-server (when-let [nrepl-port (env :nrepl-port)] (log/info "Starting NREPL server on port" nrepl-port) (nrepl-server/start-server :port nrepl-port - :handler cider-nrepl-handler)) + :handler nrepl-server/default-handler)) :stop (when repl-server (nrepl-server/stop-server repl-server))) From caca11a37b6c23838940ea6951eb2e053c688d59 Mon Sep 17 00:00:00 2001 From: Vitaliy Vlasov Date: Fri, 9 Feb 2018 15:57:19 +0200 Subject: [PATCH 63/63] Revert "Revert "Revert "[FIX #187] Fix address dropdown in My Payment Details""" --- src/cljs/commiteth/common.cljs | 15 +++++++-------- src/cljs/commiteth/handlers.cljs | 2 +- src/cljs/commiteth/update_address.cljs | 25 ++++++------------------- 3 files changed, 14 insertions(+), 28 deletions(-) diff --git a/src/cljs/commiteth/common.cljs b/src/cljs/commiteth/common.cljs index 4399156..1213395 100644 --- a/src/cljs/commiteth/common.cljs +++ b/src/cljs/commiteth/common.cljs @@ -12,17 +12,16 @@ :on-change #(reset! val-ratom (-> % .-target .-value))})])) (defn dropdown [props title val-ratom items] - "If val-ratom is set, preselect it in the dropdown. - Otherwise, prepend title as a disabled option." (fn [] + (if (= 1 (count items)) + (reset! val-ratom (first items))) [:select.ui.basic.selection.dropdown (merge props {:on-change - #(reset! val-ratom (-> % .-target .-value)) - :default-value (or @val-ratom title)}) - (for [item items] - ^{:key item} [:option {:value item - :disabled (= item title)} - item])])) + #(reset! val-ratom (-> % .-target .-value))}) + (doall (for [item items] + ^{:key item} [:option + {:value item} + item]))])) (defn moment-timestamp [time] (let [now (.now js/Date.) diff --git a/src/cljs/commiteth/handlers.cljs b/src/cljs/commiteth/handlers.cljs index ed677d7..eb61374 100644 --- a/src/cljs/commiteth/handlers.cljs +++ b/src/cljs/commiteth/handlers.cljs @@ -327,7 +327,7 @@ :http {:method POST :url "/api/user/address" :on-success #(do - (dispatch [:assoc-in [:user :address] address]) + (dispatch [:assoc-in [:user [:address] address]]) (dispatch [:set-flash-message :success "Address saved"])) diff --git a/src/cljs/commiteth/update_address.cljs b/src/cljs/commiteth/update_address.cljs index 14ceaa1..6134bde 100644 --- a/src/cljs/commiteth/update_address.cljs +++ b/src/cljs/commiteth/update_address.cljs @@ -3,7 +3,6 @@ [commiteth.common :refer [input dropdown]] [reagent.core :as r] [reagent.crypt :as crypt] - [clojure.string :as str] [cljs-web3.eth :as web3-eth])) @@ -23,25 +22,13 @@ [:p "Insert your Ethereum address in hex format."] [:div.field (if-not (empty? web3-accounts) - ; Add value of address if it's missing from items list. - ; If address is empty, add title - (let [accounts (map str/lower-case web3-accounts) - addr @address - title "Select address" - addr-not-in-web3? (and addr (as-> web3-accounts acc - (map str/lower-case acc) - (set acc) - (contains? acc addr) - (not acc))) - items (cond->> web3-accounts - addr-not-in-web3? (into [addr]) - (not addr) (into [title]))] - [dropdown {:class "address-input"} - title - address - items]) + [dropdown {:class "address-input"} "Select address" + address + (vec + (for [acc web3-accounts] + acc))] [:div.ui.input.address-input - [input address {:placeholder "0x0000000000000000000000000000000000000000" + [input address {:placeholder "0x0000000000000000000000000000000000000000" :auto-complete "off" :auto-correct "off" :spell-check "false"