From 7287cab39ac6a0d0e61667ff5920f8cedba832c9 Mon Sep 17 00:00:00 2001 From: Joel Hawksley Date: Fri, 6 Sep 2024 19:50:28 -0600 Subject: [PATCH] drop google api dependency --- Gemfile | 1 - Gemfile.lock | 54 ------- app/apis/google_calendar_api.rb | 26 ---- app/controllers/home_controller.rb | 55 -------- app/jobs/schedule_job.rb | 2 - app/models/display_content.rb | 7 - app/models/google_account.rb | 133 ------------------ app/views/home/index.html.slim | 1 - config/initializers/google_api.rb | 1 - config/initializers/sidekiq_cron.rb | 7 - config/routes.rb | 3 - .../20240907014413_drop_google_accounts.rb | 5 + db/schema.rb | 122 +++++++++++++++- docs/index.md | 4 - docs/privacy.md | 10 -- docs/terms.md | 11 -- test/controllers/home_controller_test.rb | 6 - test/models/display_content_test.rb | 4 +- test/vcr_cassettes/dogpark_fetch.yml | 83 ----------- 19 files changed, 122 insertions(+), 413 deletions(-) delete mode 100644 app/apis/google_calendar_api.rb delete mode 100644 app/models/google_account.rb delete mode 100644 config/initializers/google_api.rb create mode 100644 db/migrate/20240907014413_drop_google_accounts.rb delete mode 100644 docs/privacy.md delete mode 100644 docs/terms.md delete mode 100644 test/vcr_cassettes/dogpark_fetch.yml diff --git a/Gemfile b/Gemfile index 59a98e68..eedfa299 100644 --- a/Gemfile +++ b/Gemfile @@ -4,7 +4,6 @@ source "https://rubygems.org" ruby "3.2.2" gem "connection_pool" -gem "google-api-client", require: ["google/apis/calendar_v3", "google/apis/people_v1"] gem "httparty" gem "pg" gem "puma" diff --git a/Gemfile.lock b/Gemfile.lock index 551e13bf..dec128ae 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -94,56 +94,20 @@ GEM rexml crass (1.0.6) date (3.3.4) - declarative (0.0.20) docile (1.4.0) drb (2.2.1) erubi (1.13.0) et-orbi (1.2.11) tzinfo - faraday (2.10.0) - faraday-net_http (>= 2.0, < 3.2) - logger - faraday-net_http (3.1.1) - net-http fugit (1.11.0) et-orbi (~> 1, >= 1.2.11) raabro (~> 1.4) - gems (1.2.0) globalid (1.2.1) activesupport (>= 6.1) - google-api-client (0.53.0) - google-apis-core (~> 0.1) - google-apis-generator (~> 0.1) - google-apis-core (0.15.0) - addressable (~> 2.5, >= 2.5.1) - googleauth (~> 1.9) - httpclient (>= 2.8.1, < 3.a) - mini_mime (~> 1.0) - representable (~> 3.0) - retriable (>= 2.0, < 4.a) - rexml - google-apis-discovery_v1 (0.17.0) - google-apis-core (>= 0.15.0, < 2.a) - google-apis-generator (0.15.0) - activesupport (>= 5.0) - gems (~> 1.2) - google-apis-core (>= 0.15.0, < 2.a) - google-apis-discovery_v1 (~> 0.14) - thor (>= 0.20, < 2.a) - google-cloud-env (2.1.1) - faraday (>= 1.0, < 3.a) - googleauth (1.11.0) - faraday (>= 1.0, < 3.a) - google-cloud-env (~> 2.1) - jwt (>= 1.4, < 3.0) - multi_json (~> 1.11) - os (>= 0.9, < 2.0) - signet (>= 0.16, < 2.a) hashdiff (1.1.0) httparty (0.21.0) mini_mime (>= 1.0.0) multi_xml (>= 0.5.2) - httpclient (2.8.3) i18n (1.14.5) concurrent-ruby (~> 1.0) iniparse (1.5.0) @@ -172,11 +136,8 @@ GEM mini_mime (1.1.5) mini_portile2 (2.8.7) minitest (5.24.1) - multi_json (1.15.0) multi_xml (0.7.1) bigdecimal (~> 3.1) - net-http (0.4.1) - uri net-imap (0.4.14) date net-protocol @@ -190,7 +151,6 @@ GEM nokogiri (1.16.6) mini_portile2 (~> 2.8.2) racc (~> 1.4) - os (1.1.4) overcommit (0.64.0) childprocess (>= 0.6.3, < 6) iniparse (~> 1.4) @@ -260,11 +220,6 @@ GEM regexp_parser (2.9.2) reline (0.5.9) io-console (~> 0.5) - representable (3.2.0) - declarative (< 0.1.0) - trailblazer-option (>= 0.1.1, < 0.2.0) - uber (< 0.2.0) - retriable (3.1.2) rexml (3.3.2) strscan rubocop (1.64.1) @@ -294,11 +249,6 @@ GEM fugit (~> 1.8) globalid (>= 1.0.1) sidekiq (>= 6) - signet (0.19.0) - addressable (~> 2.8) - faraday (>= 0.17.5, < 3.a) - jwt (>= 1.5, < 3.0) - multi_json (~> 1.10) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) @@ -328,12 +278,9 @@ GEM time_difference (0.5.0) activesupport timeout (0.4.1) - trailblazer-option (0.1.2) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - uber (0.1.0) unicode-display_width (2.5.0) - uri (0.13.0) useragent (0.16.10) vcr (6.2.0) webmock (3.23.1) @@ -351,7 +298,6 @@ PLATFORMS DEPENDENCIES connection_pool - google-api-client httparty m minitest diff --git a/app/apis/google_calendar_api.rb b/app/apis/google_calendar_api.rb deleted file mode 100644 index d86a3e5f..00000000 --- a/app/apis/google_calendar_api.rb +++ /dev/null @@ -1,26 +0,0 @@ -# I'd love to test this, but for now I'm not as I don't want to cache my PII in VCR. -# :nocov: -class GoogleCalendarApi < Api - def fetch - result = - GoogleAccount.all.map do |google_account| - google_account.fetch.values.map(&:values).flatten - end.flatten - - save_response(result) - end - - def prepare_response(response) - response - end - - def data - @data ||= - if super.empty? - [] - else - super.map { CalendarEvent.new(**_1.symbolize_keys!) } - end - end -end -# :nocov: diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb index 469ca76f..87c60dc7 100644 --- a/app/controllers/home_controller.rb +++ b/app/controllers/home_controller.rb @@ -4,59 +4,4 @@ class HomeController < ApplicationController def logs render "logs", layout: false end - - def redirect - client = GoogleAccount.client - - redirect_to(client.authorization_uri.to_s, allow_other_host: true) - end - - # :nocov: - def google_callback - client = GoogleAccount.client - client.code = params[:code] - - response = client.fetch_access_token! - - people_service = Google::Apis::PeopleV1::PeopleServiceService.new - people_service.authorization = client - - person = - people_service - .get_person("people/me", person_fields: "emailAddresses") - - email_address = - if person.email_addresses - person.email_addresses.find { |email_address| email_address.metadata.primary }.value - else - person.resource_name - end - - existing_account = GoogleAccount.find_by(email: email_address) - - if existing_account - if response["refresh_token"].present? - existing_account.update( - access_token: response["access_token"], - refresh_token: response["refresh_token"].to_s, - expires_at: Time.now + response["expires_in"].to_i.seconds - ) - else - existing_account.update( - access_token: response["access_token"], - expires_at: Time.now + response["expires_in"].to_i.seconds - ) - end - else - GoogleAccount.create( - email: email_address, - access_token: response["access_token"], - refresh_token: response["refresh_token"].to_s, - expires_at: Time.now + response["expires_in"].to_i.seconds - ) - end - - redirect_to(root_path, flash: {notice: "Google Account connected"}) - end - # :nocov: end diff --git a/app/jobs/schedule_job.rb b/app/jobs/schedule_job.rb index 5edf2884..911b2917 100644 --- a/app/jobs/schedule_job.rb +++ b/app/jobs/schedule_job.rb @@ -11,8 +11,6 @@ def perform(task) HomeAssistantCalendarApi.new(Timeframe::Application.config.local).fetch when :weather_kit WeatherKitApi.new.fetch - when :google_calendar - GoogleCalendarApi.new.fetch when :birdnet BirdnetApi.new.fetch when :airnow diff --git a/app/models/display_content.rb b/app/models/display_content.rb index 3e5a871a..ed4ec0ad 100644 --- a/app/models/display_content.rb +++ b/app/models/display_content.rb @@ -2,7 +2,6 @@ class DisplayContent def call( current_time: Time.now.utc.in_time_zone(Timeframe::Application.config.local["timezone"]), weather_kit_api: WeatherKitApi.new, - google_calendar_api: GoogleCalendarApi.new, calendar_feed: CalendarFeed.new, home_assistant_api: HomeAssistantApi.new, home_assistant_calendar_api: HomeAssistantCalendarApi.new, @@ -90,12 +89,6 @@ def call( raw_events << air_now_api.daily_calendar_events end - if google_calendar_api.healthy? - raw_events << google_calendar_api.data - elsif home_assistant_api.online? - out[:status_icons_with_labels] << ["triangle-exclamation", "Google Calendar"] - end - raw_events << home_assistant_calendar_api.data # :nocov: diff --git a/app/models/google_account.rb b/app/models/google_account.rb deleted file mode 100644 index d57851fd..00000000 --- a/app/models/google_account.rb +++ /dev/null @@ -1,133 +0,0 @@ -# frozen_string_literal: true - -class GoogleAccount < ApplicationRecord - def self.client - Signet::OAuth2::Client.new(client_options) - end - - def self.client_options - { - client_id: Timeframe::Application.config.local["google_client_id"], - client_secret: Timeframe::Application.config.local["google_client_secret"], - authorization_uri: "https://accounts.google.com/o/oauth2/auth", - token_credential_uri: "https://accounts.google.com/o/oauth2/token", - scope: - "#{Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY} " \ - "#{Google::Apis::PeopleV1::AUTH_USERINFO_PROFILE}", - redirect_uri: Timeframe::Application.config.local["google_redirect_uri"], - access_type: "offline" - } - end - - # :nocov: - def fetch - begin - refresh_token! if expires_at < Time.now - rescue => e - Log.create( - globalid: key, - event: "refresh_token_error", - message: e.message + e.backtrace.join("\n") - ) - end - - client = self.class.client - - begin - client.update!( - refresh_token: refresh_token, - access_token: access_token, - expires_in: 3600 - ) - rescue => e - Log.create( - globalid: key, - event: "client_refresh_error", - message: e.message + e.backtrace.join("\n") - ) - end - - service = Google::Apis::CalendarV3::CalendarService.new - service.authorization = client - - events = {} - - Timeframe::Application.config.local["calendars"].each do |calendar_config| - begin - items = service.list_events( - calendar_config["id"], - single_events: true, - order_by: "startTime", - fields: "items/attendees,items/id,items/start,items/end,items/description,items/summary,items/location", - time_min: (DateTime.now - 2.days).iso8601, - time_max: (DateTime.now + 1.week).iso8601 - ).items - rescue - next - end - - events[calendar_config["id"]] = {} - - items.each do |event| - event_json = event.as_json - - next if - event_json["description"].to_s.downcase.include?("timeframe-omit") || # hide timeframe-omit - event_json["summary"] == "." || # hide . marker - event_json["summary"] == "Out of office" || - event_json["attendees"].to_a.any? { _1["self"] && _1["response_status"] == "declined" } || - !event_json["summary"].present? - - events[calendar_config["id"]][event.id] = CalendarEvent.new( - id: event_json["id"], - location: event_json["location"], - summary: event_json["summary"], - description: event_json["description"], - icon: calendar_config["icon"], - letter: calendar_config["letter"], - starts_at: event_json["start"]["date"] || event_json["start"]["date_time"], - ends_at: event_json["end"]["date"] || event_json["end"]["date_time"] - ) - end - rescue => e - Log.create( - globalid: key, - event: "list_events_error", - message: e.class.to_s + e.message + e.backtrace.join("\n") + calendar_config.to_json - ) - end - - events - end - - private - - def key - to_global_id.to_s - end - - def refresh_token! - response = - HTTParty.post("https://accounts.google.com/o/oauth2/token", - body: { - grant_type: "refresh_token", - client_id: Timeframe::Application.config.local["google_client_id"], - client_secret: Timeframe::Application.config.local["google_client_secret"], - refresh_token: refresh_token - }) - - response = JSON.parse(response.body) - update( - access_token: response["access_token"], - expires_at: Time.now + response["expires_in"].to_i.seconds - ) - save - rescue => e - Log.create( - globalid: key, - event: "refresh_error", - message: e.message + response.to_s - ) - end - # :nocov: -end diff --git a/app/views/home/index.html.slim b/app/views/home/index.html.slim index 784d64d1..e69de29b 100644 --- a/app/views/home/index.html.slim +++ b/app/views/home/index.html.slim @@ -1 +0,0 @@ -= link_to "Connect to Google", redirect_path diff --git a/config/initializers/google_api.rb b/config/initializers/google_api.rb deleted file mode 100644 index c31a72a6..00000000 --- a/config/initializers/google_api.rb +++ /dev/null @@ -1 +0,0 @@ -Google::Apis.logger.level = Logger::WARN diff --git a/config/initializers/sidekiq_cron.rb b/config/initializers/sidekiq_cron.rb index 332b5e76..f526ae05 100644 --- a/config/initializers/sidekiq_cron.rb +++ b/config/initializers/sidekiq_cron.rb @@ -23,13 +23,6 @@ class: "ScheduleJob" ) - # Sidekiq::Cron::Job.create( - # name: "Fetch Google Calendar", - # cron: "*/1 * * * *", - # args: ["google_calendar"], - # class: "ScheduleJob" - # ) - Sidekiq::Cron::Job.create( name: "Fetch Birdnet", cron: "*/1 * * * *", diff --git a/config/routes.rb b/config/routes.rb index 2e76f480..00d8a23b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,9 +8,6 @@ get :mira, to: "displays#mira" root to: "home#index" - get :redirect, to: "home#redirect" - get :google_callback, to: "home#google_callback" - get :logs, to: "home#logs" mount Sidekiq::Web => "/sidekiq" diff --git a/db/migrate/20240907014413_drop_google_accounts.rb b/db/migrate/20240907014413_drop_google_accounts.rb new file mode 100644 index 00000000..2336eaf5 --- /dev/null +++ b/db/migrate/20240907014413_drop_google_accounts.rb @@ -0,0 +1,5 @@ +class DropGoogleAccounts < ActiveRecord::Migration[7.2] + def change + drop_table :google_accounts + end +end diff --git a/db/schema.rb b/db/schema.rb index a20b4a03..89e28614 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,18 +10,16 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2023_11_27_034206) do +ActiveRecord::Schema[7.2].define(version: 2024_09_07_014413) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" - create_table "google_accounts", force: :cascade do |t| - t.string "email", null: false + create_table "api_responses", force: :cascade do |t| + t.string "name", null: false + t.json "response", null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.text "access_token", default: "", null: false - t.text "refresh_token", default: "", null: false - t.datetime "expires_at" - t.index ["email"], name: "index_google_accounts_on_email" + t.index ["name"], name: "index_api_responses_on_name" end create_table "logs", force: :cascade do |t| @@ -31,4 +29,114 @@ t.datetime "created_at", null: false t.datetime "updated_at", null: false end + + create_table "solid_queue_blocked_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.string "concurrency_key", null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.index ["concurrency_key", "priority", "job_id"], name: "index_solid_queue_blocked_executions_for_release" + t.index ["expires_at", "concurrency_key"], name: "index_solid_queue_blocked_executions_for_maintenance" + t.index ["job_id"], name: "index_solid_queue_blocked_executions_on_job_id", unique: true + end + + create_table "solid_queue_claimed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.bigint "process_id" + t.datetime "created_at", null: false + t.index ["job_id"], name: "index_solid_queue_claimed_executions_on_job_id", unique: true + t.index ["process_id", "job_id"], name: "index_solid_queue_claimed_executions_on_process_id_and_job_id" + end + + create_table "solid_queue_failed_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.text "error" + t.datetime "created_at", null: false + t.index ["job_id"], name: "index_solid_queue_failed_executions_on_job_id", unique: true + end + + create_table "solid_queue_jobs", force: :cascade do |t| + t.string "queue_name", null: false + t.string "class_name", null: false + t.text "arguments" + t.integer "priority", default: 0, null: false + t.string "active_job_id" + t.datetime "scheduled_at" + t.datetime "finished_at" + t.string "concurrency_key" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["active_job_id"], name: "index_solid_queue_jobs_on_active_job_id" + t.index ["class_name"], name: "index_solid_queue_jobs_on_class_name" + t.index ["finished_at"], name: "index_solid_queue_jobs_on_finished_at" + t.index ["queue_name", "finished_at"], name: "index_solid_queue_jobs_for_filtering" + t.index ["scheduled_at", "finished_at"], name: "index_solid_queue_jobs_for_alerting" + end + + create_table "solid_queue_pauses", force: :cascade do |t| + t.string "queue_name", null: false + t.datetime "created_at", null: false + t.index ["queue_name"], name: "index_solid_queue_pauses_on_queue_name", unique: true + end + + create_table "solid_queue_processes", force: :cascade do |t| + t.string "kind", null: false + t.datetime "last_heartbeat_at", null: false + t.bigint "supervisor_id" + t.integer "pid", null: false + t.string "hostname" + t.text "metadata" + t.datetime "created_at", null: false + t.index ["last_heartbeat_at"], name: "index_solid_queue_processes_on_last_heartbeat_at" + t.index ["supervisor_id"], name: "index_solid_queue_processes_on_supervisor_id" + end + + create_table "solid_queue_ready_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "created_at", null: false + t.index ["job_id"], name: "index_solid_queue_ready_executions_on_job_id", unique: true + t.index ["priority", "job_id"], name: "index_solid_queue_poll_all" + t.index ["queue_name", "priority", "job_id"], name: "index_solid_queue_poll_by_queue" + end + + create_table "solid_queue_recurring_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "task_key", null: false + t.datetime "run_at", null: false + t.datetime "created_at", null: false + t.index ["job_id"], name: "index_solid_queue_recurring_executions_on_job_id", unique: true + t.index ["task_key", "run_at"], name: "index_solid_queue_recurring_executions_on_task_key_and_run_at", unique: true + end + + create_table "solid_queue_scheduled_executions", force: :cascade do |t| + t.bigint "job_id", null: false + t.string "queue_name", null: false + t.integer "priority", default: 0, null: false + t.datetime "scheduled_at", null: false + t.datetime "created_at", null: false + t.index ["job_id"], name: "index_solid_queue_scheduled_executions_on_job_id", unique: true + t.index ["scheduled_at", "priority", "job_id"], name: "index_solid_queue_dispatch_all" + end + + create_table "solid_queue_semaphores", force: :cascade do |t| + t.string "key", null: false + t.integer "value", default: 1, null: false + t.datetime "expires_at", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["expires_at"], name: "index_solid_queue_semaphores_on_expires_at" + t.index ["key", "value"], name: "index_solid_queue_semaphores_on_key_and_value" + t.index ["key"], name: "index_solid_queue_semaphores_on_key", unique: true + end + + add_foreign_key "solid_queue_blocked_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_claimed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_failed_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_ready_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_recurring_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade + add_foreign_key "solid_queue_scheduled_executions", "solid_queue_jobs", column: "job_id", on_delete: :cascade end diff --git a/docs/index.md b/docs/index.md index c7c1dbfe..1ccda6e7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,8 +4,4 @@ A web application for displaying information from various APIs on digital signage. Timeframe is meant to be run on-premises. -## Google API - -Timeframe uses read-only access to the Google Calendar API to retrieve and display calendar events in a timeline format, providing an at-a-glance display for use in the home. - [Privacy Policy](/privacy) | [Terms of service](/terms) \ No newline at end of file diff --git a/docs/privacy.md b/docs/privacy.md deleted file mode 100644 index 15e91c69..00000000 --- a/docs/privacy.md +++ /dev/null @@ -1,10 +0,0 @@ -# Privacy - - -Timeframe accesses private read-only user Google Calendar data via the Google API. - -It uses this data to display calendar events in a feed for use in your home. - -Your data is stored locally on the device Timeframe runs on and is not shared or transferred elsewhere in any way. - -Timeframe's use and transfer to any other app of information received from Google APIs will adhere to [Google API Services User Data Policy](https://developers.google.com/terms/api-services-user-data-policy), including the Limited Use requirements. \ No newline at end of file diff --git a/docs/terms.md b/docs/terms.md deleted file mode 100644 index 2febf204..00000000 --- a/docs/terms.md +++ /dev/null @@ -1,11 +0,0 @@ -# Terms of service - -## Warranty - -YOUR USE OF THE SERVICE IS AT YOUR SOLE RISK. THE SERVICE IS PROVIDED ON AN “AS IS” AND “AS AVAILABLE” BASIS WITHOUT WARRANTIES OF ANY KIND, EXPRESSED OR IMPLIED. YOU EXPRESSLY AGREE THAT USE OF THE SITE IS AT YOUR SOLE RISK. - -TIMEFRAME DOES NOT WARRANT THAT (I) THE SERVICE WILL MEET YOUR SPECIFIC REQUIREMENTS, (II) THE SERVICE WILL BE UNINTERRUPTED, TIMELY, SECURE, OR ERROR-FREE, (III) THE RESULTS THAT MAY BE OBTAINED FROM THE USE OF THE SERVICE WILL BE ACCURATE OR RELIABLE, (IV) THE QUALITY OF ANY PRODUCTS, SERVICES, INFORMATION, OR OTHER MATERIAL PURCHASED OR OBTAINED BY YOU THROUGH THE SERVICE WILL MEET YOUR EXPECTATIONS, AND (V) ANY ERRORS IN THE SERVICE WILL BE CORRECTED. - -## Limited Liability - -IN NO EVENT SHALL WE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES (INCLUDING BUT NOT LIMITED TO LOSS OF USE, LOSS OF PROFITS, OR LOSS OF DATA, OR GOODWILL) WHETHER IN AN ACTION IN CONTRACT, TORT (INCLUDING BUT NOT LIMITED TO NEGLIGENCE), EQUITY OR OTHERWISE, ARISING OUT OF OR IN ANY WAY CONNECTED WITH THE USE OR INABILITY TO USE THE SERVICE OR THE MATERIALS THEREIN OR RESULTING FROM UNAUTHORIZED ACCESS TO OR ALTERATION OF DATA. \ No newline at end of file diff --git a/test/controllers/home_controller_test.rb b/test/controllers/home_controller_test.rb index 90e8b34e..226b6a5b 100644 --- a/test/controllers/home_controller_test.rb +++ b/test/controllers/home_controller_test.rb @@ -26,10 +26,4 @@ class HomeControllerTest < ActionDispatch::IntegrationTest assert_response :success end - - test "should get #redirect with no data" do - get "/redirect" - - assert_response 302 - end end diff --git a/test/models/display_content_test.rb b/test/models/display_content_test.rb index e4667d8b..b7028f8b 100644 --- a/test/models/display_content_test.rb +++ b/test/models/display_content_test.rb @@ -25,12 +25,12 @@ def test_hide_events_after_cutoff def test_hide_events_after_cutoff_if_periodic_extends_to_tomorrow travel_time = DateTime.new(2023, 8, 27, 20, 15, 0, "-0600") travel_to travel_time do - api = GoogleCalendarApi.new + api = HomeAssistantCalendarApi.new api.stub :healthy?, true do api.stub :data, [ CalendarEvent.new(starts_at: travel_time - 1.hour, ends_at: travel_time + 1.day, summary: "test") ] do - result = DisplayContent.new.call(google_calendar_api: api) + result = DisplayContent.new.call(home_assistant_calendar_api: api) assert_equal(result[:day_groups].count, 4) end diff --git a/test/vcr_cassettes/dogpark_fetch.yml b/test/vcr_cassettes/dogpark_fetch.yml deleted file mode 100644 index e010f416..00000000 --- a/test/vcr_cassettes/dogpark_fetch.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- -http_interactions: -- request: - method: get - uri: https://www.louisvilleco.gov/local-government/government/departments/parks-recreation-and-open-space/parks-division/dog-off-leash-areas - body: - encoding: US-ASCII - string: '' - headers: - Sec-Ch-Ua: - - '"Chromium";v="116", "Not)A;Brand";v="24", "Google Chrome";v="116"' - Sec-Ch-Ua-Mobile: - - "?0" - Sec-Ch-Ua-Platform: - - '"Windows"' - Upgrade-Insecure-Requests: - - '1' - User-Agent: - - Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like - Gecko) Chrome/116.0.0.0 Safari/537.36 - Accept: - - text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 - Sec-Fetch-Site: - - none - Sec-Fetch-Mode: - - navigate - Sec-Fetch-User: - - "?1" - Sec-Fetch-Dest: - - document - Accept-Encoding: - - gzip, deflate, br - Accept-Language: - - en-US,en;q=0.9 - response: - status: - code: 200 - message: OK - headers: - Content-Type: - - text/html; charset=utf-8 - Last-Modified: - - Sun, 28 Apr 2024 01:01:23 GMT - X-Frame-Options: - - SAMEORIGIN - X-Content-Type-Options: - - nosniff - Strict-Transport-Security: - - max-age=31536000; - X-Xss-Protection: - - 1; mode=block - Expect-Ct: - - max-age=31536000 - Last-Published: - - Wed, 21 Feb 2024 22:16:34 GMT - Edge-Cache-Tag: - - 116788FF.G,116788FF.P1061,116788FF.CMENU - Granicusserver: - - mse2p-viscmsba4 - X-Akamai-Transformed: - - 9 - 0 pmb=mRUM,1 - Cache-Control: - - public, max-age=600 - Expires: - - Sun, 28 Apr 2024 01:18:55 GMT - Date: - - Sun, 28 Apr 2024 01:08:55 GMT - Content-Length: - - '118739' - Connection: - - keep-alive - Vary: - - Accept-Encoding - Server-Timing: - - ak_p; desc="1714266535711_399139781_1570497793_1476_7893_17_26_-";dur=1 - - cdn-cache; desc=HIT - - edge; dur=15 - body: - encoding: ASCII-8BIT - string: !binary |- - DQo8IURPQ1RZUEUgaHRtbD4NCg0KPGh0bWwgbGFuZz0iZW4iPg0KPGhlYWQgaWQ9IkhlYWQxIj48bWV0YSBjaGFyc2V0PSJVVEYtOCIgLz48bGluayBocmVmPSIvRGVmYXVsdENvbnRlbnQvRGVmYXVsdC9ib290c3RyYXAudjMuNC4xLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIvPg0KPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT05OyBJRT04OyBJRT03OyBJRT1FREdFIiAvPjx0aXRsZT4NCgkNCiAgICBEb2cgT2ZmLUxlYXNoIEFyZWFzIHwgQ2l0eSBvZiBMb3Vpc3ZpbGxlLCBDTw0KDQo8L3RpdGxlPg0KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgiIC8+DQogICAgDQogICAgPGxpbmsgaHJlZj0iL0RlZmF1bHRDb250ZW50L0RlZmF1bHQvU3R5bGVCdW5kbGVEZXNpZ25UaGVtZS5jc3NibmQ/dj1OTzZHYnFFbC1PWno2enRseExDVWZxQkdfemlSOUJpNHVNSHBTSkVBTTk0MSIgcmVsPSJzdHlsZXNoZWV0Ii8+DQo8bGluayBocmVmPSIvUHJvamVjdC9Db250ZW50cy9NYWluL1N0eWxlQnVuZGxlRGVzaWduVGhlbWUuY3NzYm5kP3Y9Smswa3lYVWhsNkp1Vm9kbFJVejdtdEZvY3BYcWpiWUEtZVJQOWdtaTVvZzEiIHJlbD0ic3R5bGVzaGVldCIvPg0KPGxpbmsgaHJlZj0iL0FyZWFzL0FkbWluL0NvbnRlbnQvU3R5bGVCdW5kbGVGcm9udGVuZEV4dHJhLmNzc2JuZD92PW5xbGNlN2h6ZG85TElHOFZqSm1UNTRhbnZmZ2pZYTdVMWUwZkNGa244RVExIiByZWw9InN0eWxlc2hlZXQiLz4NCjxsaW5rIGhyZWY9Ii9EZWZhdWx0Q29udGVudC9EZWZhdWx0L1ByaW50LmNzc2JuZD92PS0zVDFvSl96ODlwUjdRa2RKR2ZNcGdoWFp5UHlicXB0bG9oY1B6M2VLMHcxIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJwcmludCIgLz4NCjxsaW5rIGhyZWY9Ii9Qcm9qZWN0L0NvbnRlbnRzL01haW4vUHJpbnQuY3NzYm5kP3Y9amZoZktzTW14UXJfeEtBZnY5Rmo2cVJsUlg3Z01veEpUSEtWRTZETFd1bzEiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9InByaW50IiAvPg0KPHNjcmlwdCBzcmM9Ii9TY3JpcHRzL1NjcmlwdEJ1bmRsZUZBbGxJbk9uZS5qc2JuZD92PUVEeFVlZlFkOHBTUjFtb3BsUGVlYXo0Y1czaUJRQWV0N0luNGhiTGNNV3cxIj48L3NjcmlwdD4NCg0KPHNjcmlwdD4NCiAgICBmdW5jdGlvbiBoYW5kbGVFeHRlcm5hbFVSTCgpIHsgfTsNCjwvc2NyaXB0Pg0KPHNjcmlwdD53aW5kb3cudmlzaW9uT3B0aW9ucyA9IHt2aXJ0dWFsQXBwbGljYXRpb25QYXRoOicvJyxsb2dPblBhdGg6J0FkbWluL0xvZ09uJyxsb2dPZmZQYXRoOidBZG1pbi9Mb2dPZmYnLGVuYWJsZVNlc3Npb25UaW1lb3V0OmZhbHNlLHNlc3Npb25UaW1lb3V0SW5NaW51dGVzOjYwLHRpbWVUb0FsZXJ0QmVmb3JlU2Vzc2lvblRpbWVvdXRJbk1pbnV0ZXM6NSxleHRlbmRTZXNzaW9uVGltZW91dFBhdGg6J0FkbWluL0FjY291bnQvRXh0ZW5kU2Vzc2lvblRpbWVvdXQnLG1haW5Gb2xkZXJQYXRoOicvUHJvamVjdC9Db250ZW50cy9NYWluLycsY2VudGVyTG9jYXRpb246J0xvdWlzdmlsbGUsIENPJywgc2l0ZUlEOjEsIG5hdmlnYXRpb25JRDo3MjMsIGlzSG9tZVBhZ2U6ZmFsc2UsIGVtZXJnZW5jeU5vdGljZUNoYW5nZWQ6dHJ1ZSwgbG9nZ2VkSW46ZmFsc2UsIHNob3dUb3BUaXBzOnRydWUsIGN1cnJlbnREZXNpZ25Gb2xkZXJQYXRoOicvUHJvamVjdC9Db250ZW50cy9NYWluLycsIHVzZURlc2lnblRoZW1Gb250U2l6ZUNzczpmYWxzZSAsIGNsaWVudFJlc3BvbnNpdmVUYWJsZUVuYWJsZWQ6dHJ1ZSwgaW1hZ2VVcmw6Jy9Ib21lL1Nob3dQdWJsaXNoZWRJbWFnZS8nLCBlbmdhZ2VtZW50QWRtaW5FbmRQb2ludDonL0FkbWluL0VuZ2FnZW1lbnQvJywgdmlzaW9uTGl2ZUFkbWluRW5kUG9pbnQ6Jy9BZG1pbi9Db21wb25lbnRzLycsIGNtc0FkbWluRW5kUG9pbnQ6Jy9BZG1pbi8nLCBlbmFibGVTcGxhc2hVcmw6ZmFsc2UsIGVTaWduYXR1cmVWaWV3OiAnL1NoYXJlZC9TaWduYXR1cmVWaWV3Jywgc29jaWFsTWVkaWFJbmZvIDp7IHR3aXR0ZXIgOiB7IG1heExlbmd0aCA6IDI4MCAgfSB9LCBiYXNlSW1hZ2VVcmw6Jy9Ib21lL1Nob3dQdWJsaXNoZWRJbWFnZScgfTs7d2luZG93LnZpc2lvbkFwcHM9eyJjbXNfY29yZSI6eyJEYXRlRm9ybWF0IjoiTU0vZGQveXl5eSIsIlRpbWVGb3JtYXQiOiJoOm1tIFRUIiwiUGhvbmVGb3JtYXQiOiIoOTk5KSA5OTktOTk5OSIsIk9yZ2FuaXphdGlvbk5hbWUiOiJDaXR5IG9mIExvdWlzdmlsbGUsIENPIiwiVGltZUFNRm9ybWF0IjoiQU0iLCJUaW1lUE1Gb3JtYXQiOiJQTSIsIlByb2plY3RUaW1lWm9uZSI6IkFtZXJpY2EvRGVudmVyIiwiUHJvamVjdFRpbWVab25lRGlmZiI6eyJJZCI6Ik1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCJEaXNwbGF5TmFtZSI6IihVVEMtMDc6MDApIE1vdW50YWluIFRpbWUgKFVTICYgQ2FuYWRhKSIsIlN0YW5kYXJkTmFtZSI6Ik1vdW50YWluIFN0YW5kYXJkIFRpbWUiLCJEYXlsaWdodE5hbWUiOiJNb3VudGFpbiBEYXlsaWdodCBUaW1lIiwiQmFzZVV0Y09mZnNldCI6Ii0wNzowMDowMCIsIkFkanVzdG1lbnRSdWxlcyI6W3siRGF0ZVN0YXJ0IjoiMDAwMS0wMS0wMVQwMDowMDowMCIsIkRhdGVFbmQiOiIyMDA2LTEyLTMxVDAwOjAwOjAwIiwiRGF5bGlnaHREZWx0YSI6IjAxOjAwOjAwIiwiRGF5bGlnaHRUcmFuc2l0aW9uU3RhcnQiOnsiVGltZU9mRGF5IjoiMDAwMS0wMS0wMVQwMjowMDowMCIsIk1vbnRoIjo0LCJXZWVrIjoxLCJEYXkiOjEsIkRheU9mV2VlayI6MCwiSXNGaXhlZERhdGVSdWxlIjpmYWxzZX0sIkRheWxpZ2h0VHJhbnNpdGlvbkVuZCI6eyJUaW1lT2ZEYXkiOiIwMDAxLTAxLTAxVDAyOjAwOjAwIiwiTW9udGgiOjEwLCJXZWVrIjo1LCJEYXkiOjEsIkRheU9mV2VlayI6MCwiSXNGaXhlZERhdGVSdWxlIjpmYWxzZX0sIkJhc2VVdGNPZmZzZXREZWx0YSI6IjAwOjAwOjAwIn0seyJEYXRlU3RhcnQiOiIyMDA3LTAxLTAxVDAwOjAwOjAwIiwiRGF0ZUVuZCI6Ijk5OTktMTItMzFUMDA6MDA6MDAiLCJEYXlsaWdodERlbHRhIjoiMDE6MDA6MDAiLCJEYXlsaWdodFRyYW5zaXRpb25TdGFydCI6eyJUaW1lT2ZEYXkiOiIwMDAxLTAxLTAxVDAyOjAwOjAwIiwiTW9udGgiOjMsIldlZWsiOjIsIkRheSI6MSwiRGF5T2ZXZWVrIjowLCJJc0ZpeGVkRGF0ZVJ1bGUiOmZhbHNlfSwiRGF5bGlnaHRUcmFuc2l0aW9uRW5kIjp7IlRpbWVPZkRheSI6IjAwMDEtMDEtMDFUMDI6MDA6MDAiLCJNb250aCI6MTEsIldlZWsiOjEsIkRheSI6MSwiRGF5T2ZXZWVrIjowLCJJc0ZpeGVkRGF0ZVJ1bGUiOmZhbHNlfSwiQmFzZVV0Y09mZnNldERlbHRhIjoiMDA6MDA6MDAifV0sIlN1cHBvcnRzRGF5bGlnaHRTYXZpbmdUaW1lIjp0cnVlfSwiU2hvd0RlZmF1bHRNYXJnaW5SYWRFZGl0b3IiOnRydWUsIkNvbnRlbnRSZXZpZXdEZWZhdWx0U2NoZWR1bGVUeXBlIjoiMCIsIkVuYWJsZVhTU0NoZWNrIjp0cnVlLCJCYXNpY1hTU0tleXdvcmRzIjoic2NyaXB0fHNjcmlwdHNjcnxpbWFnZXNyYyIsIkFkdmFuY2VkWFNTS2V5d29yZHMiOiJvbmxvYWR8b25jbGlja3xvbmVycm9yfGphdmFzY3JpcHR8b25tb3VzZW92ZXJ8ZXZhbHxyYW5kb218ZnVuY3Rpb258b25sb2FkfGV4ZWNjb21tYW5kfHNjcmlwdHxmc2NvbW1hbmR8b25hYm9ydHxvbmFjdGl2YXRlfG9uYWZ0ZXJwcmludHxvbmFmdGVydXBkYXRlfG9uYmVmb3JlYWN0aXZhdGV8b25iZWZvcmVjb3B5fG9uYmVmb3JlY3V0fG9uYmVmb3JlZGVhY3RpdmF0ZXxvbmJlZm9yZWVkaXRmb2N1c3xvbmJlZm9yZXBhc3RlfG9uYmVmb3JldW5sb2FkfG9uYmVmb3JldXBkYXRlfG9uYmVnaW58b25ibHVyfG9uYm91bmNlfG9uY2VsbGNoYW5nZXxvbmNoYW5nZXxvbmNsaWNrfG9uY29udGV4dG1NZW51fG9uY29udHJvbHNlbGVjdHxvbmNvcHl8b25jdXR8b25kYXRhYXZhaWxhYmxlfG9uZGF0YXNldGNoYW5nZWR8b25kYXRhc2V0Y29tcGxldGV8b25kYmxjbGlja3xvbmRlYWN0aXZhdGV8b25kcmFnfG9uZHJhZ2VuZHxvbmRyYWdsZWF2ZXxvbmRyYWdlbnRlcnxvbmRyYWdvdmVyfG9uZHJhZ2Ryb3B8b25kcmFnc3RhcnR8b25lbmR8b25lcnJvcnxvbmVycm9ydXBkYXRlfG9uZmlsdGVyY2hhbmdlfG9uZmluaXNofG9uZm9jdXN8b25mb2N1c2lufG9uZm9jdXNvdXR8b25oYXNoY2hhbmdlfG9uaGVscHxvbmlucHV0fG9ua2V5ZG93bnxvbmtleXByZXNzfG9ua2V5dXB8b25sYXlvdXRjb21wbGV0ZXxvbmxvYWR8b25sb3NlY2FwdHVyZXxvbm1lZGlhY29tcGxldGV8b25tZWRpYWVycm9yfG9ubW91c2Vkb3dufG9ubW91c2VlbnRlcnxvbm1vdXNlbGVhdmV8b25tb3VzZW1vdmV8b25tb3VzZW91dHxvbm1vdXNlb3Zlcnxvbm1vdXNldXB8b25tb3VzZXdoZWVsfG9ubW92ZXxvbm1vdmVlbmR8b25tb3Zlc3RhcnR8b25vZmZsaW5lfG9ub25saW5lfG9ub3V0b2ZzeW5jfG9ucGFzdGV8b25wYXVzZXxvbnBvcHN0YXRlfG9ucHJvZ3Jlc3N8b25wcm9wZXJ0eWNoYW5nZXxvbnJlYWR5c3RhdGVjaGFuZ2V8b25yZWRvfG9ucmVwZWF0fG9ucmVzZXR8b25yZXNpemV8b25yZXNpemVlbmR8b25yZXNpemVzdGFydHxvbnJlc3VtZXxvbnJldmVyc2V8b25yb3dzZW50ZXJ8b25yb3dleGl0fG9ucm93ZGVsZXRlfG9ucm93aW5zZXJ0ZWR8b25zY3JvbGx8b25zZWVrfG9uc2VsZWN0fG9uc2VsZWN0aW9uY2hhbmdlfG9uc2VsZWN0c3RhcnR8b25zdGFydHxvbnN0b3B8b25zdG9yYWdlfG9uc3luY3Jlc3RvcmVkfG9uc3VibWl0fG9udGltZWVycm9yfG9udHJhY2tjaGFuZ2V8b251bmRvfG9udW5sb2FkfG9udXJsZmxpcHxzZWVrc2VnbWVudHRpbWV8ZG9jdW1lbnQuY29va2llIiwiR29vZ2xlUmVDYXB0Y2hhUHVibGljS2V5IjoiNkxmbGFjWVpBQUFBQUlfZ3VUZFRiSFFDWkU1Ri1NaE9USWJKb2FnMyJ9fTs7d2luZG93LnZpc2lvbkFwcHMudG9rZW49ImV5SmhiR2NpT2lKQk1qVTJTMWNpTENKbGJtTWlPaUpCTWpVMlEwSkRMVWhUTlRFeUlpd2lheUk2SW5aVlkwNVZTblZqYW1Gc09Fb3JTbEpLYkROamFtYzlQU0o5LjVFVDc5bXFoLUFSc0ttMEZTMmZ5ei1aM19kNEczUlZnM0dZdXpCZUo1blAwYTVfUjgwUzNOS1pVT01JRjJ6dERYQjh5ZnNuTWx0cXJza0hYbjBPbl82bFMwQ0hlaGdFNi5rTEVKX2F1Q0k2TDNDUG5RNENBdjhBLnhJYm1Qd1Vfb0F1UGlnaTBtR1A2SWZTSTFmRXpJNEJOdDVYVGJZLWtkMGl0ZGJYQTdsajNrOFUwTm03WmlQSG41dERraUFRdXU5Ty0wM0lwcWl4azhXTEh1ak1JaC1xWno5VVZWMEhOU2xONGdsemZ1dF9WVkFjbzFGRF9WWVhENGdQdU01Z1J2RE9LQ29hbVJ0UlVyb2dlMVVfVi1aZi1iQnJvT3FKdV8yMmthaFJnQmNteHp4bDUtZEQzc3FhVXJWM3IwM2FLeVBzVW1iNTMxRHFzTGo1azBCeE9EQjVpN20zOUFNWThhTmsubURkTmFsd2JvY3hEdXp0U0lhY2JqbEVudGpYMWhmWDlYeTVIdklNYmttZyI7KGZ1bmN0aW9uKHdpbmRvdyl7d2luZG93LmNtc0NvcmVDb25maWc9e307IChmdW5jdGlvbihjb25maWcpeyAoZnVuY3Rpb24od2luZG93KXt3aW5kb3cuY29yZUNvbXBvbmVudEZvcm1Db25maWc9eyJhcGlFbmRQb2ludCI6Imh0dHBzOi8vZm9ybS52aXNpb25pbnRlcm5ldC5jb20vIn07fSkod2luZG93KTs7IH0pKHdpbmRvdy5jbXNDb3JlQ29uZmlnKTsgfSkod2luZG93KTsoZnVuY3Rpb24od2luZG93KXt3aW5kb3cudmlzaW9uTGl2ZUNvbmZpZz17fTsgKGZ1bmN0aW9uKGNvbmZpZyl7IGNvbmZpZy5mbGV4aWJsZUNvbXBvbmVudD17InNlcnZlclVSTCI6Imh0dHBzOi8vZmxleC52aXNpb25pbnRlcm5ldC5jb20vIn07OyB9KSh3aW5kb3cudmlzaW9uTGl2ZUNvbmZpZyk7IH0pKHdpbmRvdyk7PC9zY3JpcHQ+DQoNCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgICAgIC8vIGFkZGVkIHRoZSBodG1sRW5jb2RlIGFuZCBodG1sRGVjb2RlIG1ldGhvZCB0byBmaXhlZCB0aGUganMgbG9hZCBvcmRlciBpc3N1ZS4NCiAgICAgICAgJC5leHRlbmQoJCwgew0KICAgICAgICAgICAgaHRtbEVuY29kZTogZnVuY3Rpb24gKGh0bWwpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgICh0ZW1wLnRleHRDb250ZW50ICE9IHVuZGVmaW5lZCkgPyAodGVtcC50ZXh0Q29udGVudCA9IGh0bWwpIDogKHRlbXAuaW5uZXJUZXh0ID0gaHRtbCk7DQogICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IHRlbXAuaW5uZXJIVE1MOw0KICAgICAgICAgICAgICAgIHRlbXAgPSBudWxsOw0KICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgaHRtbERlY29kZTogZnVuY3Rpb24gKHRleHQpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KICAgICAgICAgICAgICAgIHRlbXAuaW5uZXJIVE1MID0gdGV4dDsNCiAgICAgICAgICAgICAgICB2YXIgb3V0cHV0ID0gdGVtcC5pbm5lclRleHQgfHwgdGVtcC50ZXh0Q29udGVudDsNCiAgICAgICAgICAgICAgICB0ZW1wID0gbnVsbDsNCiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsgICAgDQogICAgICAgICQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgLy9zY3JpcHQgZm9yIHZpZXcgZnVsbCBzaXRlIGJ1dHRvbiwgcGxhY2VkIGhlcmUgdG8ga2VlcCBmaXJlZm94IGZvciBtb2JpbGUgZGV2aWNlcyBoYXBweQ0KICAgICAgICAgICAgdmFyIHZpZXdGdWxsRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWV3LWZ1bGwiKTsgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKHZpZXdGdWxsRWxlbWVudCkgew0KICAgICAgICAgICAgICAgIHZpZXdGdWxsRWxlbWVudC5pbm5lckhUTUwgPSAiVmlldyBGdWxsIFNpdGUiOw0KICAgICAgICAgICAgICAgIHZpZXdGdWxsRWxlbWVudC5jbGFzc05hbWUgPSAibW9iaWxlX29ubHkgZnVsbHNpdGUiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICA8L3NjcmlwdD4NCiAgICANCg0KICAgIDwhLS1baWYgbHQgSUUgOV0+DQogICAgICAgIDxzY3JpcHQgc3JjPSIvU2NyaXB0cy9TY3JpcHRCdW5kbGVPdGhlcnMuanNibmQ/dj0zUTdGaFRRZlJyS3g4aDdLdmRiaDliQmx1emxObFhLc0ZBRVJkNGc4X1RZMSI+PC9zY3JpcHQ+DQoNCgk8IVtlbmRpZl0tLT4NCg0KICAgIA0KICAgIDxsaW5rIGlkPSJhY3RpdmVfZm9udCIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iL1Byb2plY3QvQ29udGVudHMvTWFpbi94LXNtYWxsLmNzcyI+DQogICAgDQogICAgPGxpbmsgcmVsPSJTaG9ydGN1dCBJY29uIiBocmVmPSIvZmF2aWNvbi5pY28iIC8+DQoNCiAgICANCiAgICANCjwhLS0gR2xvYmFsIHNpdGUgdGFnIChndGFnLmpzKSAtIEdBNCAtLT4NCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctSjFUV1FWTENERyI+PC9zY3JpcHQ+DQo8c2NyaXB0Pg0KCXdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOw0KCWZ1bmN0aW9uIGd0YWcoKSB7IGRhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7IH0NCglndGFnKCdqcycsIG5ldyBEYXRlKCkpOw0KDQoJZ3RhZygnY29uZmlnJywgJ0ctSjFUV1FWTENERycpOw0KPC9zY3JpcHQ+DQo8IS0tIEVuZCBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR0E0IC0tPg0KDQogICAgDQogICAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IiIgLz4NCiAgICA8bWV0YSBuYW1lPSJrZXl3b3JkcyIgY29udGVudD0iIiAvPg0KICAgIDwhLS1zdGFydG9nc2VjdGlvbi0tPg0KICAgIDxtZXRhIHByb3BlcnR5PSJvZzp0aXRsZSIgY29udGVudD0iRG9nIE9mZi1MZWFzaCBBcmVhcyB8IENpdHkgb2YgTG91aXN2aWxsZSwgQ08iIC8+DQogICAgPG1ldGEgcHJvcGVydHk9Im9nOmRlc2NyaXB0aW9uIiBjb250ZW50PSIiIC8+DQogICAgPCEtLXN0b3BvZ3NlY3Rpb24tLT4NCiAgICANCiAgICANCg0KICAgIDxzY3JpcHQ+DQogICAgICAgICQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgJC5mcm9udGVuZFNlc3Npb25NYW5hZ2VyKHsNCiAgICAgICAgICAgICAgICB2aXJ0dWFsQXBwbGljYXRpb25QYXRoOiIvIiwNCiAgICAgICAgICAgICAgICBiYWNrZW5kVXNlckxvZ2luOiBmYWxzZSwNCiAgICAgICAgICAgICAgICBmcm9udGVuZFVzZXJMb2dpbjogZmFsc2UsDQogICAgICAgICAgICAgICAgc2Vzc2lvblRpbWVvdXRJbk1pbnV0ZXM6NjAsDQogICAgICAgICAgICAgICAgdGltZVRvQWxlcnRCZWZvcmVTZXNzaW9uVGltZW91dEluTWludXRlczo1LA0KICAgICAgICAgICAgICAgIGV4dGVuZFNlc3Npb25UaW1lb3V0UGF0aDoiSG9tZS9Gcm9udEVuZEV4dGVuZFNlc3Npb25UaW1lb3V0Ig0KICAgICAgICAgICAgfSkuc2V0VGltZXJGb3JTZXNzaW9uRXhwaXJhdGlvbigpOw0KICAgICAgICB9KTsNCiAgICA8L3NjcmlwdD4NCiAgICANCiAgICA8IS0tIEdsb2JhbCBzaXRlIHRhZyAoZ3RhZy5qcykgLSBHb29nbGUgQW5hbHl0aWNzIC0tPg0KDQo8c2NyaXB0IGFzeW5jIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xldGFnbWFuYWdlci5jb20vZ3RhZy9qcz9pZD1VQS02ODk2MDMxOC0xIj48L3NjcmlwdD4NCjxzY3JpcHQ+DQogIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOw0KICBmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9DQogIGd0YWcoJ2pzJywgbmV3IERhdGUoKSk7DQogIGd0YWcoJ2NvbmZpZycsICdVQS02ODk2MDMxOC0xJyk7DQo8L3NjcmlwdD4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KLyo8IVtDREFUQVsqLw0KKGZ1bmN0aW9uKCkgew0KdmFyIHN6ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IHN6LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0Jzsgc3ouYXN5bmMgPSB0cnVlOw0Kc3ouc3JjID0gJy8vc2l0ZWltcHJvdmVhbmFseXRpY3MuY29tL2pzL3NpdGVhbmFseXplXzYwNDg0MjYuanMnOw0KdmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07IHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc3osIHMpOw0KfSkoKTsNCi8qXV0+Ki8NCg0KICAgIGZ1bmN0aW9uIHJlc2V0VG9wU2VhcmNoSW5wdXQoKXsNCiAgICAgICAgdGhpbmcgPSAkKCcjc2l0ZWJvZHkgI3Zpc2lvbi1zZWFyY2gyLXRleHRfdmFsdWUnKS52YWwoKTsNCiAgICAgICAgLy9jb25zb2xlLmxvZyh0aGluZyk7DQogICAgICAgICQoJyNzaXRlaGVhZGVyICN2aXNpb24tc2VhcmNoMi10ZXh0X3ZhbHVlJykudmFsKHRoaW5nKTsgICAgICAgICAgICAgICANCiAgICB9DQogICAgDQogICAgJChmdW5jdGlvbigpew0KICAgICAgICAvL2NvbnNvbGUubG9nKCdoZXJlIHdlIGdvJyk7DQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsNCiAgICAgICAgICAgICQoJyNzaXRlYm9keSAjdmlzaW9uLXNlYXJjaDItdGV4dF92YWx1ZScpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZSl7DQogICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMpeyByZXNldFRvcFNlYXJjaElucHV0KCkgfTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgJCgnI3NpdGVib2R5ICN2aXNpb24tc2VhcmNoMi1idXR0b24nKS5vbignY2xpY2snLCByZXNldFRvcFNlYXJjaElucHV0KTsgICAgIA0KICAgICAgICAgICAgJCgnI3NpdGVib2R5ICN2aXNpb24tc2VhcmNoMi10ZXh0X2Ryb3Bkb3duJykub24oJ2NsaWNrJywgcmVzZXRUb3BTZWFyY2hJbnB1dCk7DQogICAgICAgIH0sIDEwMDApOw0KICAgIH0pOw0KPC9zY3JpcHQ+DQoNCg0KPG1ldGEgbmFtZT0iZ29vZ2xlLXNpdGUtdmVyaWZpY2F0aW9uIiBjb250ZW50PSJqZnloRGRUeGlwZnpZZzdaN2llVlI5QVdEUFlWVTdsTVlYSXdzYll2NUhzIiAvPg0KDQo8bWV0YSBwcm9wZXJ0eT0ib2c6ZGVzY3JpcHRpb24iIGNvbnRlbnQ94oCdRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSBDaXR5J3Mgd2Vic2l0ZSBhdCB3d3cubG91aXN2aWxsZWNvLmdvduKAnSAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NyaXB0PiFmdW5jdGlvbihlKXt2YXIgbj0iaHR0cHM6Ly9zLmdvLW1wdWxzZS5uZXQvYm9vbWVyYW5nLyI7aWYoIkZhbHNlIj09IlRydWUiKWUuQk9PTVJfY29uZmlnPWUuQk9PTVJfY29uZmlnfHx7fSxlLkJPT01SX2NvbmZpZy5QYWdlUGFyYW1zPWUuQk9PTVJfY29uZmlnLlBhZ2VQYXJhbXN8fHt9LGUuQk9PTVJfY29uZmlnLlBhZ2VQYXJhbXMucGNpPSEwLG49Imh0dHBzOi8vczIuZ28tbXB1bHNlLm5ldC9ib29tZXJhbmcvIjtpZih3aW5kb3cuQk9PTVJfQVBJX2tleT0iWEZaWFctTEM2RFAtOFA2UkwtV0NQVVgtQ1gzWEIiLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2lmKCFyKXt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtlLmlkPSJib29tci1zY3ItYXMiLGUuc3JjPXdpbmRvdy5CT09NUi51cmwsZS5hc3luYz0hMCxvLmFwcGVuZENoaWxkKGUpLHI9ITB9fWZ1bmN0aW9uIHQoZSl7cj0hMDt2YXIgbix0LGEsaSxkPWRvY3VtZW50LE89d2luZG93O2lmKHdpbmRvdy5CT09NUi5zbmlwcGV0TWV0aG9kPWU/ImlmIjoiaSIsdD1mdW5jdGlvbihlLG4pe3ZhciB0PWQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dC5pZD1ufHwiYm9vbXItaWYtYXMiLHQuc3JjPXdpbmRvdy5CT09NUi51cmwsQk9PTVJfbHN0YXJ0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLGU9ZXx8ZC5ib2R5LGUuYXBwZW5kQ2hpbGQodCl9LCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmd2luZG93LmF0dGFjaEV2ZW50JiZuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NU0lFIFs2N11cLi8pKXJldHVybiB3aW5kb3cuQk9PTVIuc25pcHBldE1ldGhvZD0icyIsdm9pZCB0KG8sImJvb21yLWFzeW5jIik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJJRlJBTUUiKSxhLnNyYz0iYWJvdXQ6YmxhbmsiLGEudGl0bGU9IiIsYS5yb2xlPSJwcmVzZW50YXRpb24iLGEubG9hZGluZz0iZWFnZXIiLGk9KGEuZnJhbWVFbGVtZW50fHxhKS5zdHlsZSxpLndpZHRoPTAsaS5oZWlnaHQ9MCxpLmJvcmRlcj0wLGkuZGlzcGxheT0ibm9uZSIsby5hcHBlbmRDaGlsZChhKTt0cnl7Tz1hLmNvbnRlbnRXaW5kb3csZD1PLmRvY3VtZW50Lm9wZW4oKX1jYXRjaChfKXtuPWRvY3VtZW50LmRvbWFpbixhLnNyYz0iamF2YXNjcmlwdDp2YXIgZD1kb2N1bWVudC5vcGVuKCk7ZC5kb21haW49JyIrbisiJzt2b2lkIDA7IixPPWEuY29udGVudFdpbmRvdyxkPU8uZG9jdW1lbnQub3BlbigpfWlmKG4pZC5fYm9vbXJsPWZ1bmN0aW9uKCl7dGhpcy5kb21haW49bix0KCl9LGQud3JpdGUoIjxibyIrImR5IG9ubG9hZD0nZG9jdW1lbnQuX2Jvb21ybCgpOyc+Iik7ZWxzZSBpZihPLl9ib29tcmw9ZnVuY3Rpb24oKXt0KCl9LE8uYWRkRXZlbnRMaXN0ZW5lcilPLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLE8uX2Jvb21ybCwhMSk7ZWxzZSBpZihPLmF0dGFjaEV2ZW50KU8uYXR0YWNoRXZlbnQoIm9ubG9hZCIsTy5fYm9vbXJsKTtkLmNsb3NlKCl9ZnVuY3Rpb24gYShlKXt3aW5kb3cuQk9PTVJfb25sb2FkPWUmJmUudGltZVN0YW1wfHwobmV3IERhdGUpLmdldFRpbWUoKX1pZighd2luZG93LkJPT01SfHwhd2luZG93LkJPT01SLnZlcnNpb24mJiF3aW5kb3cuQk9PTVIuc25pcHBldEV4ZWN1dGVkKXt3aW5kb3cuQk9PTVI9d2luZG93LkJPT01SfHx7fSx3aW5kb3cuQk9PTVIuc25pcHBldFN0YXJ0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLHdpbmRvdy5CT09NUi5zbmlwcGV0RXhlY3V0ZWQ9ITAsd2luZG93LkJPT01SLnNuaXBwZXRWZXJzaW9uPTE0LHdpbmRvdy5CT09NUi51cmw9bisiWEZaWFctTEM2RFAtOFA2UkwtV0NQVVgtQ1gzWEIiO3ZhciBpPWRvY3VtZW50LmN1cnJlbnRTY3JpcHR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSxvPWkucGFyZW50Tm9kZSxyPSExLGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO2lmKGQucmVsTGlzdCYmImZ1bmN0aW9uIj09dHlwZW9mIGQucmVsTGlzdC5zdXBwb3J0cyYmZC5yZWxMaXN0LnN1cHBvcnRzKCJwcmVsb2FkIikmJiJhcyJpbiBkKXdpbmRvdy5CT09NUi5zbmlwcGV0TWV0aG9kPSJwIixkLmhyZWY9d2luZG93LkJPT01SLnVybCxkLnJlbD0icHJlbG9hZCIsZC5hcz0ic2NyaXB0IixkLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUpLGQuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7dCghMCl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoIXIpdCghMCl9LDNlMyksQk9PTVJfbHN0YXJ0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLG8uYXBwZW5kQ2hpbGQoZCk7ZWxzZSB0KCExKTtpZih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcil3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYSwhMSk7ZWxzZSBpZih3aW5kb3cuYXR0YWNoRXZlbnQpd2luZG93LmF0dGFjaEV2ZW50KCJvbmxvYWQiLGEpfX0oKSwiIi5sZW5ndGg+MClpZihlJiYicGVyZm9ybWFuY2UiaW4gZSYmZS5wZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUucGVyZm9ybWFuY2Uuc2V0UmVzb3VyY2VUaW1pbmdCdWZmZXJTaXplKWUucGVyZm9ybWFuY2Uuc2V0UmVzb3VyY2VUaW1pbmdCdWZmZXJTaXplKCk7IWZ1bmN0aW9uKCl7aWYoQk9PTVI9ZS5CT09NUnx8e30sQk9PTVIucGx1Z2lucz1CT09NUi5wbHVnaW5zfHx7fSwhQk9PTVIucGx1Z2lucy5BSyl7dmFyIG49IiI9PSJ0cnVlIj8xOjAsdD0iIixhPSJqaHN6Zm1heHlqNzJrenJudWd0cS1mLTM3MGM5YmExNi1jbGllbnRuc3Y0LXMuYWthbWFpaGQubmV0IixpPSJmYWxzZSI9PSJ0cnVlIj8yOjEsbz17ImFrLnYiOiIzNyIsImFrLmNwIjoiNzk4MDQ5IiwiYWsuYWkiOnBhcnNlSW50KCI2NzIyMzUiLDEwKSwiYWsub2wiOiIwIiwiYWsuY3IiOjE3LCJhay5pcHYiOjQsImFrLnByb3RvIjoiaHR0cC8xLjEiLCJhay5yaWQiOiI1ZDliZTUwMSIsImFrLnIiOjQ3MzE5LCJhay5hMiI6biwiYWsubSI6IiIsImFrLm4iOiJlc3NsIiwiYWsuYnBjaXAiOiI3My4yMjkuMTQ2LjAiLCJhay5jcG9ydCI6NjUyNzAsImFrLmdoIjoiMjMuMjAyLjk5LjE5NyIsImFrLnF1aWN2IjoiIiwiYWsudGxzdiI6InRsczEuMyIsImFrLjBydHQiOiIiLCJhay5jc3JjIjoiLSIsImFrLmFjYyI6InJlbm8iLCJhay50IjoiMTcxNDI2NjUzNSIsImFrLmFrIjoiaE9CaVF3WlVZekNnNVZTQWZDTGltUT09NzB2MS9yZUhrKzRtQlNEeVVDS2NTU0VpZ29qcDNQMk5lRkhmYTZrQ29pVGphanUyRFRKa25NMnkvOTVMRUd0Rnk4YVVnUDZ1ZCsrUGUrcFB1ZmJ1cWFzSkEzdEVJY2ptZTRTSCtXTXE1V2RINUR3RE53dThsT3p4NGxncWxPYkxrRnRNTDZMQmZMRjhKTTNiS1BKZHd1VUtKclFuM1NLNGc1MkdodEZwU2x0NTMvUnRMMlhLRFAxUEdUNzRhTml6cFZNdmpGM3VhV214MWlBa0JrWnRCRTA2SkNBMHM0N3g0akRHWlZPdStIcnEvelBTOVc3c0xXaXFpaVdZSVB6R1hVcmlhVWhta0ZMWFVEckZYcVJ0cEw2MWZWV01RbndZb0t1dVRaYUc2ME12ZmUySkt4Rm1XQWhiQ0xsb3l2ZHNkZDRwcmVVQ3V6SElBd2l2ZFo4M2hBRXkralordEhOTWN5RG5qWnRrK0tnd3g3b0p3OGhZeU56QWJTMHhOeWVibzdLcHRBSEY0aUk1UWF4TWE5N0ZQSThTWjRaYmNhVFhSdkR4SjZpU05Vdz0iLCJhay5wdiI6IjY0IiwiYWsuZHBvYWJlbmMiOiIiLCJhay50ZiI6aX07aWYoIiIhPT10KW9bImFrLnJ1ZHMiXT10O3ZhciByPXtpOiExLGF2OmZ1bmN0aW9uKG4pe3ZhciB0PSJodHRwLmluaXRpYXRvciI7aWYobiYmKCFuW3RdfHwic3BhX2hhcmQiPT09blt0XSkpb1siYWsuZmVvIl09dm9pZCAwIT09ZS5hRmVvQXBwbGllZD8xOjAsQk9PTVIuYWRkVmFyKG8pfSxydjpmdW5jdGlvbigpe3ZhciBlPVsiYWsuYnBjaXAiLCJhay5jcG9ydCIsImFrLmNyIiwiYWsuY3NyYyIsImFrLmdoIiwiYWsuaXB2IiwiYWsubSIsImFrLm4iLCJhay5vbCIsImFrLnByb3RvIiwiYWsucXVpY3YiLCJhay50bHN2IiwiYWsuMHJ0dCIsImFrLnIiLCJhay5hY2MiLCJhay50IiwiYWsudGYiXTtCT09NUi5yZW1vdmVWYXIoZSl9fTtCT09NUi5wbHVnaW5zLkFLPXtha1ZhcnM6byxha0ROU1ByZUZldGNoRG9tYWluOmEsaW5pdDpmdW5jdGlvbigpe2lmKCFyLmkpe3ZhciBlPUJPT01SLnN1YnNjcmliZTtlKCJiZWZvcmVfYmVhY29uIixyLmF2LG51bGwsbnVsbCksZSgib25iZWFjb24iLHIucnYsbnVsbCxudWxsKSxyLmk9ITB9cmV0dXJuIHRoaXN9LGlzX2NvbXBsZXRlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fX19KCl9KHdpbmRvdyk7PC9zY3JpcHQ+PC9oZWFkPg0KDQo8Ym9keSBjbGFzcz0iZnJvbnRfZW5kX2JvZHkgc2l0ZV9zdGFuZGFyZHNpdGV0ZW1wbGF0ZSAgIj4gICAgDQogICAgPGlucHV0IG5hbWU9Il9fUmVxdWVzdFZlcmlmaWNhdGlvblRva2VuIiB0eXBlPSJoaWRkZW4iIHZhbHVlPSJKaTdEemJBVXlvWFFYY2dwRTgwSDQ2VkJYTTBFN2Z0SGl6NnVtSzNHdndsUGItQVBRUnlRMDU1SWkxT3V6ckN0YmluY29ac2ZNVjFIYXI0WW9CbVNTRUVVZ0MtQk1IQVZHa0k2WnN1ZDFvTTEiIC8+DQoNCiAgICANCiAgICAgICAgICAgIDxzdHlsZT4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIDwvc3R5bGU+DQogICAgICAgIDxsaW5rIGhyZWY9Ii9EZWZhdWx0Q29udGVudC9EZWZhdWx0L1N0eWxlQnVuZGxlQW5ndWxhckxpYi5jc3NibmQ/dj1zRUQyUWpmMzh5c1FKWVpXX1p2WmotN0lHWEttNE5PSmhkQTUxb090RzVBMSIgcmVsPSJzdHlsZXNoZWV0Ii8+DQoNCg0KDQo8c2NyaXB0Pg0KICAgIHdpbmRvdy5mcm9udGVuZENvbW1vbkNvbmZpZyA9IHsNCiAgICAgICAgbG9naW5QYWdlOiAnaHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9zeXMvc3NvL2xvZ2luJywNCiAgICAgICAgcG9wdXBMb2dpblBhZ2U6ICcvc3lzL3Nzby9wb3B1cGxvZ2luJywNCiAgICAgICAgcGhvdG9CYXNlVXJsRm9yUGVvcGxlOiAnaHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9zeXMvc3NvL1Nob3dQcm9maWxlUGhvdG8/aWQ9JywNCiAgICAgICAgcGhvdG9CYXNlVXJsOiAnaHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9Ib21lL1Nob3dQdWJsaXNoZWRJbWFnZS8nLA0KICAgICAgICB0b2tlbjogd2luZG93LnZpc2lvbkFwcHMgPyB3aW5kb3cudmlzaW9uQXBwcy50b2tlbiA6ICcnLA0KICAgICAgICBjbXNVc2VyTG9nZ2VkOiBmYWxzZSwNCiAgICAgICAgYW5vbnltb3VzQXZhdGFyOiAnaHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9EZWZhdWx0Q29udGVudC9EZWZhdWx0L19nZngvYW5vbnltb3VzLnBuZycsDQogICAgICAgIGxvZ2luVXNlcjogew0KICAgICAgICAgICAgbmFtZTogJycsDQogICAgICAgICAgICBhdmF0YXI6ICcnLA0KICAgICAgICAgICAgdXNlcklEOiBudWxsLA0KICAgICAgICAgICAgZmlyc3ROYW1lOiAnJywNCiAgICAgICAgICAgIGxhc3ROYW1lOiAnJywNCiAgICAgICAgICAgIGltYWdlSUQ6IG51bGwsDQogICAgICAgICAgICBlbWFpbDogJycsDQogICAgICAgIH0NCiAgICB9Ow0KPC9zY3JpcHQ+DQoNCg0KPHNjcmlwdD4NCiAgICAvL0l0J3MgYmVmb3JlIHRoZSBBbmd1bGFySlNMaWIgTG9hZGluZywgd2hpY2ggbWlnaHQgYmUgdXBkYXRlIGluIHRoZSBBbmd1bGFySlNMaWIgYnVuZGxlLg0KICAgIHdpbmRvdy52aVByZWRlZmluZWRNb2R1bGVzID0gW107DQo8L3NjcmlwdD4NCjxzY3JpcHQgc3JjPSIvU2NyaXB0cy9TY3JpcHRCdW5kbGVBbmd1bGFyTGliLmpzYm5kP3Y9cVVmN3VqMGxyT2VxRXJ3Rm1UNWE1enp1QW02ZEZsRHVaV192WGhGNDRaZzEiPjwvc2NyaXB0Pg0KDQoNCjxzY3JpcHQ+DQogICAgKGZ1bmN0aW9uICh3aW5kb3csIGFuZ3VsYXIpIHsNCg0KICAgICAgICAkKCJib2R5IikuYXR0cigibmctYXBwIiwgInZpLmNtcyIpOw0KICAgICAgICANCiAgICAgICAgd2luZG93LnZpQ3VycmVudE1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCJ2aS5jbXMiLCB3aW5kb3cudmlQcmVkZWZpbmVkTW9kdWxlcyB8fCBbXSk7DQogICAgfSkod2luZG93LCBhbmd1bGFyKTsNCjwvc2NyaXB0Pg0KICAgIA0KICAgIDxzY3JpcHQgc3JjPSIvU2NyaXB0cy9mcm9udGVuZENvcmVCdW5kbGUuanNibmQ/dj1XdV80ZUtTeFhyMDFicXdTVldkV183Z3ZvNk9nZG1RN3BjSWpLQXdEVXFrMSI+PC9zY3JpcHQ+DQoNCg0KICAgIA0KICAgIDwhLS1zdG9waW5kZXgtLT4NCiAgICA8bm9zY3JpcHQ+DQogICAgICAgIDxkaXYgY2xhc3M9Im5vc2NyaXB0X2FsZXJ0Ij48c3Bhbj5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQgaW4geW91ciBicm93c2VyIGZvciBhIGJldHRlciB1c2VyIGV4cGVyaWVuY2UuPC9zcGFuPjwvZGl2Pg0KICAgIDwvbm9zY3JpcHQ+DQogICAgPCEtLXN0YXJ0aW5kZXgtLT4NCiAgICA8ZGl2IGNsYXNzPSJ2aS10ZW1wLW1lc3NhZ2UtY29udGFpbmVyIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+DQogICAgICAgIA0KICAgIA0KICAgIA0KICAgICAgICA8IS0tc3RvcGluZGV4LS0+DQogICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0X2NvbnRhaW5lciI+DQogICAgICAgICAgICA8YSBjbGFzcz0iaGlkZSIgaWQ9ImFsZXJ0X2NvbnRyb2xzIiBkYXRhLWFjdGlvbj0iL0hvbWUvU2V0VG9wVGlwQ29va2llIj5TaG93L0hpZGU8L2E+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbXBvcnRhbnRfYWxlcnRfd3JhcHBlciAiPg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImFsZXJ0X3JpZ2h0Ij4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW1wb3J0YW50X2FsZXJ0Ij48cD5Gb3IgdXBkYXRlcyBvbiBNYXJzaGFsbCBGaXJlIFJlY292ZXJ5LCBwbGVhc2UgdmlzaXQgdGhlJm5ic3A7PGEgaHJlZj0iaHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvbG91aXN2aWxsZS1yZWJ1aWxkcy1tYXJzaGFsbC1maXJlLXJlY292ZXJ5Ij5Mb3Vpc3ZpbGxlIFJlYnVpbGRzIHdlYnNpdGU8L2E+LiA8c3Ryb25nPkZvciBlbWVyZ2VuY3kgbm90aWZpY2F0aW9ucywgdmlzaXQmbmJzcDs8YSBocmVmPSJodHRwczovL21lbWJlci5ldmVyYnJpZGdlLm5ldC80NTMwMDMwODU2MTIyMzEvbm90aWYiIHRhcmdldD0iX2JsYW5rIj5CT0NPIEFsZXJ0czwvYT4uPC9zdHJvbmc+PC9wPg0KPC9kaXY+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDwhLS1zdGFydGluZGV4LS0+DQoNCg0KPGRpdiBjbGFzcz0ic2l0ZXdyYXBwZXIgIHNpdGVfdGVtcGxhdGUgbWFpblNwYW5fd3JhcHBlciI+DQogICAgPGRpdiBjbGFzcz0ibWFpblNwYW4iIGlkPSJtYWluU3Bhbl93cmFwcGVyX1NjcmVlbiI+DQogICAgICAgIDwhLS1zdG9waW5kZXgtLT4NCiAgICAgICAgPGRpdiBpZD0ic2tpcG5hdiIgdGFiaW5kZXg9Ii0xIj4NCiAgICAgICAgICAgIDxhIGhyZWY9IiNzaXRlYm9keSIgdGFiaW5kZXg9Ii0xIj4NCiAgICAgICAgICAgICAgICA8aW1nIGFsdD0iU2tpcCB0byBwYWdlIGJvZHkiIHNyYz0iL0RlZmF1bHRDb250ZW50L0RlZmF1bHQvX2dmeC9zcGFjZXIuZ2lmIiAvPjwvYT4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPGEgdGl0bGU9IkhvbWUiIGhyZWY9Ii9ob21lIiB0YWJpbmRleD0iLTEiPg0KICAgICAgICAgICAgICAgIDxpbWcgYWx0PSJIb21lIiBzcmM9Ii9EZWZhdWx0Q29udGVudC9EZWZhdWx0L19nZngvc3BhY2VyLmdpZiIgLz48L2E+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDxhIHRpdGxlPSJMaXZpbmcgaW4gTG91aXN2aWxsZSIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlIiB0YWJpbmRleD0iLTEiPg0KICAgICAgICAgICAgICAgIDxpbWcgYWx0PSJMaXZpbmcgaW4gTG91aXN2aWxsZSIgc3JjPSIvRGVmYXVsdENvbnRlbnQvRGVmYXVsdC9fZ2Z4L3NwYWNlci5naWYiIC8+PC9hPg0KICAgICAgICAgICAgDQogICAgICAgICAgICA8YSB0aXRsZT0iRG9pbmcgQnVzaW5lc3MiIGhyZWY9Ii9kb2luZy1idXNpbmVzcyIgdGFiaW5kZXg9Ii0xIj4NCiAgICAgICAgICAgICAgICA8aW1nIGFsdD0iRG9pbmcgQnVzaW5lc3MiIHNyYz0iL0RlZmF1bHRDb250ZW50L0RlZmF1bHQvX2dmeC9zcGFjZXIuZ2lmIiAvPjwvYT4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPGEgdGl0bGU9IkV4cGxvcmluZyBMb3Vpc3ZpbGxlIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUiIHRhYmluZGV4PSItMSI+DQogICAgICAgICAgICAgICAgPGltZyBhbHQ9IkV4cGxvcmluZyBMb3Vpc3ZpbGxlIiBzcmM9Ii9EZWZhdWx0Q29udGVudC9EZWZhdWx0L19nZngvc3BhY2VyLmdpZiIgLz48L2E+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDxhIHRpdGxlPSJMb2NhbCBHb3Zlcm5tZW50IiBocmVmPSIvbG9jYWwtZ292ZXJubWVudCIgdGFiaW5kZXg9Ii0xIj4NCiAgICAgICAgICAgICAgICA8aW1nIGFsdD0iTG9jYWwgR292ZXJubWVudCIgc3JjPSIvRGVmYXVsdENvbnRlbnQvRGVmYXVsdC9fZ2Z4L3NwYWNlci5naWYiIC8+PC9hPg0KICAgICAgICAgICAgDQogICAgICAgIDwvZGl2Pg0KICAgICAgICA8IS0tc3RhcnRpbmRleC0tPg0KDQogICAgICAgIDxoZWFkZXIgaWQ9InNpdGVoZWFkZXIiIGNsYXNzPSIiPg0KICAgICAgICAgICAgPCEtLXN0b3BpbmRleC0tPg0KCQkJPGgxIGNsYXNzPSJ3Y2FnX29ubHkiPkNpdHkgb2YgTG91aXN2aWxsZSwgQ088L2gxPg0KICAgICAgICAgICAgPGEgaWQ9ImhvbWVfbGluayIgaHJlZj0iL2hvbWUiPkhvbWU8L2E+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDxhIGNsYXNzPSJtZW51X3RyaWdnZXIgbW9iaWxlX29ubHkiIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiPk1lbnU8L2E+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDwhLS1zdGFydGluZGV4LS0+DQogICAgICAgICAgICANCjxkaXYgaWQ9ImhlYWRlcmNvbHVtbiIgY2xhc3M9InNpdGVfdGVtcGxhdGVfY29sdW1uICBoZWFkZXJfY29sdW1uICAgIiA+DQogIA0KDQo8ZGl2IGlkPSJoZWFkZXJfdHJhbnNsYXRlX2J1dHRvbiI+DQoNCgkJPGEgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vdHJhbnNsYXRpb24tb2YtY2l0eS1pbmZvcm1hdGlvbiIgdGFyZ2V0PSJfYmxhbmsiPlRyYW5zbGF0ZTwvYT4JCQ0KPC9kaXY+DQoNCiAgICAgICAgICAgIA0KDQoNCg0KPGEgaHJlZj0iIyIgY2xhc3M9InNlcnZpY2VfZmluZF90cmlnZ2VyIj5TZXJ2aWNlIEZpbmRlcjwvYT4NCjxkaXYgY2xhc3M9ImhvbWVfc2VydmljZXNfb3ZlcmxheSI+DQogICAgPGRpdiBjbGFzcz0iaG9tZV9zZXJ2aWNlcyI+DQogICAgICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJzZXJ2aWNlX2Nsb3NlIj5DTE9TRTwvYT4NCiAgICAgICAgPGgyIGNsYXNzPSJzZXJ2aWNlX21vYmlsZV9oZWFkZXIiPkkgV2FudCB0by4uLjwvaDI+DQo8ZGl2IGNsYXNzPSJmaWVsZHNldCBzZXJ2aWNlLWZpbmRlciI+DQoJDQoJPGRpdiBjbGFzcz0iZmllbGRzZXQtY29udGVudCI+DQoJCQ0KCQk8ZGl2IGNsYXNzPSJjb250YWluZXItc2VsZWN0Ij4NCgkJCTxkaXYgY2xhc3M9InNlbGVjdCBkcm9wZG93bl9jdXN0b21fbGlua3MiPg0KCQkJCTxzZWxlY3QgaWQ9ImNhdGVnb3J5LTEiIG5hbWU9ImNhdGVnb3J5LTEiIGNsYXNzPSJzZWxlY3RfbGlua3MiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQ4Ij5BcHBseSBmb3IgYTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTY1Ij5DaGFuZ2U8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE1OCI+Q29udGFjdDwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTY0Ij5GaW5kPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNjIiPlBheTwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTYzIj5SZWFkPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNjYiPlJlcG9ydDwvb3B0aW9uPg0KCQkJCTwvc2VsZWN0Pg0KCQkJPC9kaXY+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGNsYXNzPSJmaWVsZHNldCBmaWVsZHNldC0yIGZpZWxkLWxvYWRpbmcgc2VydmljZS1saXN0Ij4NCgkNCgk8ZGl2IGNsYXNzPSJmaWVsZHNldC1jb250ZW50Ij4NCgkJDQoJCTxkaXYgY2xhc3M9ImNvbnRhaW5lci1zZWxlY3QiPg0KCQkJPGRpdiBjbGFzcz0ic2VsZWN0IGRyb3Bkb3duX2N1c3RvbV9saW5rcyI+DQoJCQkJPHNlbGVjdCBpZD0iY2F0ZWdvcnktMiIgbmFtZT0iY2F0ZWdvcnktMiIgY2xhc3M9InNlbGVjdF9saW5rcyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE2NiIgdmFsdWU9IjE2NiI+YSBQcm9ibGVtPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE2NCIgdmFsdWU9IjE2NCI+YSBUZWUgVGltZSBhdCBDb2FsIENyZWVrIEdvbGYgQ291cnNlPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE2MiIgdmFsdWU9IjE2MiI+YSBVdGlsaXR5IEJpbGwgT25saW5lPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE1OCIgdmFsdWU9IjE1OCI+Q2l0eSBDb3VuY2lsPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE1OCIgdmFsdWU9IjE1OCI+Q2l0eSBTdGFmZjwvb3B0aW9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkYXRhLWdyb3VwPSIxNjMiIHZhbHVlPSIxNjMiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE0OCIgdmFsdWU9IjE0OCI+Sm9iPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE0OCIgdmFsdWU9IjE0OCI+TGlicmFyeSBDYXJkPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE0OCIgdmFsdWU9IjE0OCI+UGVybWl0IG9yIExpY2Vuc2U8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1ncm91cD0iMTY0IiB2YWx1ZT0iMTY0Ij5Tbm93IFJlbW92YWwgSW5mb3JtYXRpb24gYW5kIFJ1bGVzPC9vcHRpb24+DQogICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGRhdGEtZ3JvdXA9IjE2MyIgdmFsdWU9IjE2MyI+dGhlIENvbW11bml0eSBVcGRhdGU8L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1ncm91cD0iMTY1IiB2YWx1ZT0iMTY1Ij5VdGlsaXR5IEJpbGxpbmcgSW5mb3JtYXRpb248L29wdGlvbj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gZGF0YS1ncm91cD0iMTY0IiB2YWx1ZT0iMTY0Ij5Wb2x1bnRlZXIgT3Bwb3J0dW5pdGllczwvb3B0aW9uPg0KCQkJCTwvc2VsZWN0Pg0KCQkJPC9kaXY+DQoJCTwvZGl2Pg0KCTwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGNsYXNzPSJmaWVsZHNldCBmaWVsZHNldC0zIGZpZWxkLWxvYWRpbmcgc2VydmljZS1kZWZpbml0aW9uIj4NCiAgICANCiAgICA8ZGl2IGNsYXNzPSJmaWVsZHNldC1jb250ZW50Ij4NCiAgICAgICAgDQogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lci1zZWxlY3Qgc2VydmljZS1pdGVtLWRldGFpbHMiPg0KICAgICAgICAgICAgPHAgaWQ9ImZpZWxkc2V0LXRpdGxlLTMtdGV4dCI+PC9wPg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPCEtLTxhIGNsYXNzPSJib3hfYm90dG9tbGluayIgaWQ9ImZpZWxkc2V0LXN1Ym1pdCIgaHJlZj0iIyI+TGVhcm4gTW9yZTwvYT4tLT4NCiAgICAgICAgPGEgY2xhc3M9ImJveF9ib3R0b21saW5rIiBpZD0iZmllbGRzZXQtc3VibWl0IiBocmVmPSIjIiB0YXJnZXQ9IiI+TGVhcm4gTW9yZTwvYT4NCiAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KPHN0eWxlPg0KICAgIC5maWVsZC1sb2FkaW5nIHsgb3BhY2l0eTowOyB0cmFuc2l0aW9uOm9wYWNpdHkgMnMgbGluZWFyO30NCiAgICAuZmllbGQtbG9hZGVkIHsgb3BhY2l0eToxO30NCjwvc3R5bGU+DQoNCjxzY3JpcHQ+DQogICAgdmFyIHNlcnZpY2VEZXNjcmlwdGlvbnMgPSBbeyJuYW1lIjoiYSBQcm9ibGVtIiwic3VtbWFyeSI6IlJlcG9ydCBub24tZW1lcmdlbmN5IHByb2JsZW1zIGluIHRoZSBjb21tdW5pdHkgbGlrZSBncmFmZml0aSwgZGFtYWdlZCBmYWNpbGl0aWVzLCB3YXRlciBsZWFrLCBleGNlc3NpdmUgbm9pc2UsIGV0Yy4iLCJzZXJ2aWNlSXRlbVVybCI6Ii9Ib21lL0NvbXBvbmVudHMvU2VydmljZURpcmVjdG9yeS9TZXJ2aWNlRGlyZWN0b3J5LzMwLzI1IiwiYWx0ZXJuYXRlU2VydmljZUl0ZW1VcmwiOiIvbGl2aW5nLWluLWxvdWlzdmlsbGUvY2l0eS1pbmZvcm1hdGlvbi9jaXR5LXByb2JsZW0tcmVwb3J0ZXIiLCJjYXRWYWx1ZXMiOiIxNjYiLCJ0YXJnZXQiOiJfc2VsZiJ9LHsibmFtZSI6ImEgVGVlIFRpbWUgYXQgQ29hbCBDcmVlayBHb2xmIENvdXJzZSIsInN1bW1hcnkiOiJZb3UgY2FuIGJvb2sgYSB0ZWUgdGltZSB0aHJvdWdoIHRoZSB3ZWJzaXRlIG9yIG1vYmlsZSBhcHAuIiwic2VydmljZUl0ZW1VcmwiOiIvSG9tZS9Db21wb25lbnRzL1NlcnZpY2VEaXJlY3RvcnkvU2VydmljZURpcmVjdG9yeS8xOC8yNSIsImFsdGVybmF0ZVNlcnZpY2VJdGVtVXJsIjoiaHR0cHM6Ly93d3cuY29hbGNyZWVrZ29sZi5jb20vIiwiY2F0VmFsdWVzIjoiMTY0IiwidGFyZ2V0IjoiX2JsYW5rIn0seyJuYW1lIjoiYSBVdGlsaXR5IEJpbGwgT25saW5lIiwic3VtbWFyeSI6IlBheSBvbmxpbmUgd2l0aCBhIGNyZWRpdCBjYXJkLiIsInNlcnZpY2VJdGVtVXJsIjoiL0hvbWUvQ29tcG9uZW50cy9TZXJ2aWNlRGlyZWN0b3J5L1NlcnZpY2VEaXJlY3RvcnkvMTYvMjUiLCJhbHRlcm5hdGVTZXJ2aWNlSXRlbVVybCI6Imh0dHBzOi8vcHJvY2Vzc2luZy5sb3Vpc3ZpbGxlY28udXMvdWJzL2luZGV4Lmh0bWwiLCJjYXRWYWx1ZXMiOiIxNjIiLCJ0YXJnZXQiOiJfYmxhbmsifSx7Im5hbWUiOiJDaXR5IENvdW5jaWwiLCJzdW1tYXJ5IjoiQ29udGFjdCB5b3VyIENvdW5jaWxtZW1iZXIgYnkgcGhvbmUgb3IgZW1haWwuIiwic2VydmljZUl0ZW1VcmwiOiIvSG9tZS9Db21wb25lbnRzL1NlcnZpY2VEaXJlY3RvcnkvU2VydmljZURpcmVjdG9yeS8xMi8yNSIsImFsdGVybmF0ZVNlcnZpY2VJdGVtVXJsIjoiL2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9jaXR5LWNvdW5jaWwvY29udGFjdC10aGUtY2l0eS1jb3VuY2lsIiwiY2F0VmFsdWVzIjoiMTU4IiwidGFyZ2V0IjoiX2JsYW5rIn0seyJuYW1lIjoiQ2l0eSBTdGFmZiIsInN1bW1hcnkiOiJVc2UgdGhlIFN0YWZmIERpcmVjdG9yeSB0byBjb250YWN0IGEgbWVtYmVyIG9mIHN0YWZmLiIsInNlcnZpY2VJdGVtVXJsIjoiL0hvbWUvQ29tcG9uZW50cy9TZXJ2aWNlRGlyZWN0b3J5L1NlcnZpY2VEaXJlY3RvcnkvMTQvMjUiLCJhbHRlcm5hdGVTZXJ2aWNlSXRlbVVybCI6Ii9sb2NhbC1nb3Zlcm5tZW50L3N0YWZmLWRpcmVjdG9yeSIsImNhdFZhbHVlcyI6IjE1OCIsInRhcmdldCI6Il9ibGFuayJ9LHsibmFtZSI6IkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zIiwic3VtbWFyeSI6IkFuc3dlcnMgdG8gdGhlIG1vc3QgZnJlcXVlbnQgcXVlc3Rpb25zIGZyb20gcmVzaWRlbnRzLiIsInNlcnZpY2VJdGVtVXJsIjoiL0hvbWUvQ29tcG9uZW50cy9TZXJ2aWNlRGlyZWN0b3J5L1NlcnZpY2VEaXJlY3RvcnkvMjgvMjUiLCJhbHRlcm5hdGVTZXJ2aWNlSXRlbVVybCI6Ii9leHBsb3JpbmctbG91aXN2aWxsZS9hYm91dC11cy9mcmVxdWVudGx5LWFza2VkLXF1ZXN0aW9ucyIsImNhdFZhbHVlcyI6IjE2MyIsInRhcmdldCI6Il9ibGFuayJ9LHsibmFtZSI6IkpvYiIsInN1bW1hcnkiOiJZb3UgY2FuIGFwcGx5IG9ubGluZSBmb3IgYWxsIGF2YWlsYWJsZSBwb3NpdGlvbnMgd2l0aCB0aGUgQ2l0eS4iLCJzZXJ2aWNlSXRlbVVybCI6Ii9Ib21lL0NvbXBvbmVudHMvU2VydmljZURpcmVjdG9yeS9TZXJ2aWNlRGlyZWN0b3J5LzgvMjUiLCJhbHRlcm5hdGVTZXJ2aWNlSXRlbVVybCI6Ii9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvaHVtYW4tcmVzb3VyY2VzL2N1cnJlbnQtZW1wbG95bWVudC1vcHBvcnR1bml0aWVzIiwiY2F0VmFsdWVzIjoiMTQ4IiwidGFyZ2V0IjoiX2JsYW5rIn0seyJuYW1lIjoiTGlicmFyeSBDYXJkIiwic3VtbWFyeSI6IllvdSBjYW4gYXBwbHkgZm9yIGEgbGlicmFyeSBjYXJkIG9ubGluZSBvciBpbiBwZXJzb24uIiwic2VydmljZUl0ZW1VcmwiOiIvSG9tZS9Db21wb25lbnRzL1NlcnZpY2VEaXJlY3RvcnkvU2VydmljZURpcmVjdG9yeS82LzI1IiwiYWx0ZXJuYXRlU2VydmljZUl0ZW1VcmwiOiIvP25hdmlkPTQyNiIsImNhdFZhbHVlcyI6IjE0OCIsInRhcmdldCI6Il9ibGFuayJ9LHsibmFtZSI6IlBlcm1pdCBvciBMaWNlbnNlIiwic3VtbWFyeSI6IkFsbCBhcHBsaWNhdGlvbnMgYXJlIGF2YWlsYWJsZSBvbmxpbmUuIiwic2VydmljZUl0ZW1VcmwiOiIvSG9tZS9Db21wb25lbnRzL1NlcnZpY2VEaXJlY3RvcnkvU2VydmljZURpcmVjdG9yeS8xMC8yNSIsImFsdGVybmF0ZVNlcnZpY2VJdGVtVXJsIjoiL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL3Jlc2lkZW50cy9wZXJtaXRzLWFuZC1saWNlbnNpbmciLCJjYXRWYWx1ZXMiOiIxNDgiLCJ0YXJnZXQiOiJfYmxhbmsifSx7Im5hbWUiOiJTbm93IFJlbW92YWwgSW5mb3JtYXRpb24gYW5kIFJ1bGVzIiwic3VtbWFyeSI6IlJlYWQgYWxsIG9mIHRoZSBydWxlcyBvciByZXBvcnQgYW4gYXJlYSBvZiBjb25jZXJuLiIsInNlcnZpY2VJdGVtVXJsIjoiL0hvbWUvQ29tcG9uZW50cy9TZXJ2aWNlRGlyZWN0b3J5L1NlcnZpY2VEaXJlY3RvcnkvMjAvMjUiLCJhbHRlcm5hdGVTZXJ2aWNlSXRlbVVybCI6Ii9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcHVibGljLXdvcmtzL29wZXJhdGlvbnMtZGl2aXNpb24vc25vdy1wbG93aW5nLWluZm9ybWF0aW9uLWZvci1yZXNpZGVudHMiLCJjYXRWYWx1ZXMiOiIxNjQiLCJ0YXJnZXQiOiJfYmxhbmsifSx7Im5hbWUiOiJ0aGUgQ29tbXVuaXR5IFVwZGF0ZSIsInN1bW1hcnkiOiJSZWFkIHRoZSBxdWFydGVybHkgQ29tbXVuaXR5IFVwZGF0ZSBhbmQgTW9udGhseSBDb21tdW5pdHkgVXBkYXRlIGVtYWlscyBuZXdzbGV0dGVyIHRvIHN0YXkgdXAgdG8gZGF0ZSB3aXRoIENpdHkgbmV3cy4iLCJzZXJ2aWNlSXRlbVVybCI6Ii9Ib21lL0NvbXBvbmVudHMvU2VydmljZURpcmVjdG9yeS9TZXJ2aWNlRGlyZWN0b3J5LzI2LzI1IiwiYWx0ZXJuYXRlU2VydmljZUl0ZW1VcmwiOiIvbGl2aW5nLWluLWxvdWlzdmlsbGUvaS13YW50LXRvL3JlYWQtdGhlLWNvbW11bml0eS11cGRhdGUtbmV3c2xldHRlciIsImNhdFZhbHVlcyI6IjE2MyIsInRhcmdldCI6Il9ibGFuayJ9LHsibmFtZSI6IlV0aWxpdHkgQmlsbGluZyBJbmZvcm1hdGlvbiIsInN1bW1hcnkiOiJDb250YWN0IHRoZSBDaXR5XHUwMDI3cyBGaW5hbmNlIFRlYW0gdG8gY2hhbmdlIHV0aWxpdHkgYmlsbGluZyBpbmZvcm1hdGlvbi4iLCJzZXJ2aWNlSXRlbVVybCI6Ii9Ib21lL0NvbXBvbmVudHMvU2VydmljZURpcmVjdG9yeS9TZXJ2aWNlRGlyZWN0b3J5LzI0LzI1IiwiYWx0ZXJuYXRlU2VydmljZUl0ZW1VcmwiOiIvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL2ZpbmFuY2UtYW5kLXV0aWxpdHktYmlsbGluZy91dGlsaXR5LWJpbGxpbmciLCJjYXRWYWx1ZXMiOiIxNjUiLCJ0YXJnZXQiOiJfYmxhbmsifSx7Im5hbWUiOiJWb2x1bnRlZXIgT3Bwb3J0dW5pdGllcyIsInN1bW1hcnkiOiJUaGUgQ2l0eSBoYXMgbWFueSB2b2x1bnRlZXIgb3Bwb3J0dW5pdGllcyBmb3IgcmVzaWRlbnRzLiIsInNlcnZpY2VJdGVtVXJsIjoiL0hvbWUvQ29tcG9uZW50cy9TZXJ2aWNlRGlyZWN0b3J5L1NlcnZpY2VEaXJlY3RvcnkvMjIvMjUiLCJhbHRlcm5hdGVTZXJ2aWNlSXRlbVVybCI6Ii9saXZpbmctaW4tbG91aXN2aWxsZS9pLXdhbnQtdG8vdm9sdW50ZWVyIiwiY2F0VmFsdWVzIjoiMTY0IiwidGFyZ2V0IjoiX2JsYW5rIn1dOw0KDQogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBmaXJzdFZpc2libGVPbkxvYWQgPSAiIjsNCiAgICAgICAgDQogICAgICAgICQoJy5jaGVja1N0YXR1c1RhYicpLnRleHQoJ1NlcnZpY2UgRmluZGVyJyk7DQogICAgICAgIA0KICAgICAgICAkKCcjY2F0ZWdvcnktMicpLmVtcHR5KCk7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZURlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvbnNbaV0ubmFtZSA9PT0gY2F0MlRleHQpIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkLmVhY2goc2VydmljZURlc2NyaXB0aW9ucywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7DQogICAgICAgICAgICB2YXIgY2F0ZWdvcnlBcnJheSA9IHZhbHVlLmNhdFZhbHVlcy5zcGxpdCgnICcpOw0KICAgICAgICAgICAgaWYgKGNhdGVnb3J5QXJyYXkuaW5kZXhPZigkKCcjY2F0ZWdvcnktMScpLnZhbCgpKSA+PSAwKSB7DQogICAgICAgICAgICAgICAgJCgnI2NhdGVnb3J5LTInKS5hcHBlbmQoJzxvcHRpb24gZGF0YS1ncm91cD0iJyArIHZhbHVlLmNhdFZhbHVlcyArICciIHZhbHVlPSInICsgdmFsdWUuY2F0VmFsdWVzICsgJyIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+JyArIHZhbHVlLm5hbWUgKyAnPC9vcHRpb24+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgICQoJyNjYXRlZ29yeS0yJykuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7ICAvL2l0ZXJhdGUgb3B0aW9ucw0KICAgICAgICAgICAgZmlyc3RWaXNpYmxlT25Mb2FkID0gJCh0aGlzKS52YWwoKTsNCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAvL3N0b3AgaXRlcmF0aW5nDQogICAgICAgIH0pOw0KICAgICAgICANCiAgICAgICAgJCgiLmZpZWxkLWxvYWRpbmciKS5lYWNoKGZ1bmN0aW9uKGEsIGIpew0KICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygiZmllbGQtbG9hZGluZyIpLmFkZENsYXNzKCJmaWVsZC1sb2FkZWQiKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICAkKCcjY2F0ZWdvcnktMicpLnZhbChmaXJzdFZpc2libGVPbkxvYWQpOw0KICAgICAgICANCiAgICAgICAgdmFyIHNlcnZpY2VTdW1tYXJ5ID0gIiI7DQogICAgICAgIHZhciBpdGVtVXJsID0gIiI7DQogICAgICAgIHZhciB0YXJnZXRWYWx1ZSA9ICIiOw0KCQl2YXIgY2F0MlZhbHVlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhdGVnb3J5LTIiKTsNCiAgICAgICAgdmFyIGNhdDJUZXh0ID0gIiI7DQoJCWlmIChmaXJzdFZpc2libGVPbkxvYWQgIT0gIiIpIHsNCgkJCWNhdDJUZXh0ID0gY2F0MlZhbHVlLm9wdGlvbnNbY2F0MlZhbHVlLnNlbGVjdGVkSW5kZXhdLnRleHQ7DQogICAgICAgIH0NCgkJDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZURlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvbnNbaV0ubmFtZSA9PT0gY2F0MlRleHQpIHsNCiAgICAgICAgICAgICAgICBzZXJ2aWNlU3VtbWFyeSA9IHNlcnZpY2VEZXNjcmlwdGlvbnNbaV0uc3VtbWFyeTsNCiAgICAgICAgICAgICAgICBpdGVtVXJsID0gc2VydmljZURlc2NyaXB0aW9uc1tpXS5zZXJ2aWNlSXRlbVVybDsNCiAgICAgICAgICAgICAgICB0YXJnZXRWYWx1ZSA9IHNlcnZpY2VEZXNjcmlwdGlvbnNbaV0ubGlua1RhcmdldDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImZpZWxkc2V0LXRpdGxlLTMtdGV4dCIpLmlubmVySFRNTCA9IHNlcnZpY2VTdW1tYXJ5Ow0KICAgICAgICAkKCIjZmllbGRzZXQtc3VibWl0IikuYXR0cigiaHJlZiIsIGl0ZW1VcmwpOw0KICAgICAgICAkKCIjZmllbGRzZXQtc3VibWl0IikuYXR0cigidGFyZ2V0IiwgdGFyZ2V0VmFsdWUpOw0KICAgICAgICANCiAgICAgICAgJCgnLnNlcnZpY2VfZmluZF90cmlnZ2VyJykuY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7DQoJICAgIA0KCSAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygnYWN0aXZlJyk7DQoJICAgICAgICANCgkgICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdhY3RpdmUnKSkgew0KCSAgICAgICAgICAgICQoJy5ob21lX3NlcnZpY2VzX292ZXJsYXknKS5mYWRlSW4oKTsNCgkgICAgICAgIH0NCgkgICAgICAgIGVsc2Ugew0KCSAgICAgICAgICAgICQoJy5ob21lX3NlcnZpY2VzX292ZXJsYXknKS5mYWRlT3V0KCk7DQoJICAgICAgICB9DQoJICAgICAgICBjb25zb2xlLmxvZygiQ2xpY2tlZCBzZXJ2aWNlIGZpbmRlciBidXR0b24iKTsNCgkgICAgfSk7DQoJICAgICQoJy5zZXJ2aWNlX2Nsb3NlJykuY2xpY2soZnVuY3Rpb24gKGV2ZW50KSB7DQoJICAgICAgICAkKCcuc2VydmljZV9maW5kX3RyaWdnZXInKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7DQoJICAgICAgICAkKCcuaG9tZV9zZXJ2aWNlc19vdmVybGF5JykuZmFkZU91dCgpOw0KCSAgICB9KTsNCiAgICB9KTsNCg0KICAgICQoJyNjYXRlZ29yeS0xJykuY2hhbmdlKGZ1bmN0aW9uKCkgew0KICAgICAgICANCiAgICAgICAgdmFyIGZpcnN0VmlzaWJsZVZhbHVlID0gIiI7DQogICAgICAgIA0KICAgICAgICAkKCcjY2F0ZWdvcnktMicpLmVtcHR5KCk7DQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZURlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgaWYgKHNlcnZpY2VEZXNjcmlwdGlvbnNbaV0ubmFtZSA9PT0gY2F0MlRleHQpIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICAkLmVhY2goc2VydmljZURlc2NyaXB0aW9ucywgZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7DQogICAgICAgICAgICB2YXIgY2F0ZWdvcnlBcnJheSA9IHZhbHVlLmNhdFZhbHVlcy5zcGxpdCgnICcpOw0KICAgICAgICAgICAgaWYgKGNhdGVnb3J5QXJyYXkuaW5kZXhPZigkKCcjY2F0ZWdvcnktMScpLnZhbCgpKSA+PSAwKSB7DQogICAgICAgICAgICAgICAgJCgnI2NhdGVnb3J5LTInKS5hcHBlbmQoJzxvcHRpb24gZGF0YS1ncm91cD0iJyArIHZhbHVlLmNhdFZhbHVlcyArICciIHZhbHVlPSInICsgdmFsdWUuY2F0VmFsdWVzICsgJyIgc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyI+JyArIHZhbHVlLm5hbWUgKyAnPC9vcHRpb24+Jyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOyAgICAgICAgDQogICAgICAgIA0KDQogICAgICAgICQoJyNjYXRlZ29yeS0yJykuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKCl7ICAvL2l0ZXJhdGUgb3B0aW9ucw0KICAgICAgICAgICAgZmlyc3RWaXNpYmxlVmFsdWUgPSAkKHRoaXMpLnZhbCgpOw0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgIC8vc3RvcCBpdGVyYXRpbmcNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICAkKCcjY2F0ZWdvcnktMicpLnZhbChmaXJzdFZpc2libGVWYWx1ZSk7DQogICAgDQogICAgICAgIHZhciBjYXQxVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2F0ZWdvcnktMSIpOw0KICAgICAgICB2YXIgY2F0MVRleHQgPSBjYXQxVmFsdWUub3B0aW9uc1tjYXQxVmFsdWUuc2VsZWN0ZWRJbmRleF0udGV4dDsNCiAgICAgICAgDQogICAgICAgIHZhciBzZXJ2aWNlU3VtbWFyeSA9ICIiOw0KICAgICAgICB2YXIgaXRlbVVybCA9ICIiOw0KICAgICAgICB2YXIgdGFyZ2V0VmFsdWUgPSAiIjsNCiAgICAgICAgdmFyIGNhdDJWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYXRlZ29yeS0yIik7DQogICAgICAgIHZhciBjYXQyVGV4dCA9ICIiOw0KCQlpZiAoZmlyc3RWaXNpYmxlVmFsdWUgIT0gIiIpIHsNCgkJCWNhdDJUZXh0ID0gY2F0MlZhbHVlLm9wdGlvbnNbY2F0MlZhbHVlLnNlbGVjdGVkSW5kZXhdLnRleHQ7DQogICAgICAgIH0NCg0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlcnZpY2VEZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIGlmIChzZXJ2aWNlRGVzY3JpcHRpb25zW2ldLm5hbWUgPT09IGNhdDJUZXh0KSB7DQogICAgICAgICAgICAgICAgc2VydmljZVN1bW1hcnkgPSBzZXJ2aWNlRGVzY3JpcHRpb25zW2ldLnN1bW1hcnk7DQogICAgICAgICAgICAgICAgaXRlbVVybCA9IHNlcnZpY2VEZXNjcmlwdGlvbnNbaV0uc2VydmljZUl0ZW1Vcmw7DQogICAgICAgICAgICAgICAgdGFyZ2V0VmFsdWUgPSBzZXJ2aWNlRGVzY3JpcHRpb25zW2ldLmxpbmtUYXJnZXQ7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaWVsZHNldC10aXRsZS0zLXRleHQiKS5pbm5lckhUTUwgPSBzZXJ2aWNlU3VtbWFyeTsNCiAgICAgICAgJCgiI2ZpZWxkc2V0LXN1Ym1pdCIpLmF0dHIoImhyZWYiLCBpdGVtVXJsKTsNCiAgICAgICAgJCgiI2ZpZWxkc2V0LXN1Ym1pdCIpLmF0dHIoInRhcmdldCIsIHRhcmdldFZhbHVlKTsNCiAgICAgICAgDQogICAgfSk7DQogICAgDQogICAgJCgnI2NhdGVnb3J5LTInKS5jaGFuZ2UoZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBzZXJ2aWNlU3VtbWFyeSA9ICIiOw0KICAgICAgICB2YXIgaXRlbVVybCA9ICIiOw0KICAgICAgICB2YXIgdGFyZ2V0VmFsdWUgPSAiIjsNCiAgICAgICAgdmFyIGNhdDJWYWx1ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYXRlZ29yeS0yIik7DQogICAgICAgIHZhciBjYXQyVGV4dCA9IGNhdDJWYWx1ZS5vcHRpb25zW2NhdDJWYWx1ZS5zZWxlY3RlZEluZGV4XS50ZXh0Ow0KICAgICAgICANCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZXJ2aWNlRGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBpZiAoc2VydmljZURlc2NyaXB0aW9uc1tpXS5uYW1lID09PSBjYXQyVGV4dCkgew0KICAgICAgICAgICAgICAgIHNlcnZpY2VTdW1tYXJ5ID0gc2VydmljZURlc2NyaXB0aW9uc1tpXS5zdW1tYXJ5Ow0KICAgICAgICAgICAgICAgIGl0ZW1VcmwgPSBzZXJ2aWNlRGVzY3JpcHRpb25zW2ldLnNlcnZpY2VJdGVtVXJsOw0KICAgICAgICAgICAgICAgIHRhcmdldFZhbHVlID0gc2VydmljZURlc2NyaXB0aW9uc1tpXS5saW5rVGFyZ2V0Ow0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZmllbGRzZXQtdGl0bGUtMy10ZXh0IikuaW5uZXJIVE1MID0gc2VydmljZVN1bW1hcnk7DQogICAgICAgICQoIiNmaWVsZHNldC1zdWJtaXQiKS5hdHRyKCJocmVmIiwgaXRlbVVybCk7DQogICAgICAgICQoIiNmaWVsZHNldC1zdWJtaXQiKS5hdHRyKCJ0YXJnZXQiLCB0YXJnZXRWYWx1ZSk7DQogICAgfSk7DQo8L3NjcmlwdD4NCg0KICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICAgICA8IS0tc3RvcGluZGV4LS0+DQogICAgICAgICAgICAgICAgICANCg0KPGRpdiBpZD0idG9wX25hdiI+DQoNCgkJPGEgaHJlZj0iL2hvbWUiIHRhcmdldD0iX3NlbGYiPkNpdHk8L2E+CQkNCgkJPGEgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wb2xpY2UiIHRhcmdldD0iX3NlbGYiPlBvbGljZTwvYT4JCQ0KCQk8YSBocmVmPSJodHRwczovL3d3dy5sb3Vpc3ZpbGxlLWxpYnJhcnkub3JnLyIgdGFyZ2V0PSJfc2VsZiI+TGlicmFyeTwvYT4JCQ0KCQk8YSBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVjcmVhdGlvbi1zZW5pb3ItY2VudGVyIiB0YXJnZXQ9Il9zZWxmIj5SZWNyZWF0aW9uICYgU2VuaW9yIENlbnRlcjwvYT4JCQ0KCQk8YSBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXRvcnMvY29hbC1jcmVlay1nb2xmLWNvdXJzZSIgdGFyZ2V0PSJfc2VsZiI+R29sZiBDb3Vyc2U8L2E+CQkNCgkJPGEgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2hpc3RvcmljYWwtbXVzZXVtIiB0YXJnZXQ9Il9zZWxmIj5IaXN0b3JpY2FsIE11c2V1bTwvYT4JCQ0KDQo8ZGl2IGlkPSJnb29nbGVfdHJhbnNsYXRlX2VsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+PC9kaXY+DQogICAgDQoNCiAgICA8aW5wdXQgdmFsdWU9ImVzIiBpZD0ibGFuZ3VhZ2UiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiAvPg0KICAgIA0KDQogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdHJhbnNsYXRlLmdvb2dsZS5jb20vdHJhbnNsYXRlX2EvZWxlbWVudC5qcz9jYj1nb29nbGVUcmFuc2xhdGVFbGVtZW50SW5pdCI+PC9zY3JpcHQ+DQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQoNCmZ1bmN0aW9uIGdvb2dsZVRyYW5zbGF0ZUVsZW1lbnRJbml0KCkgew0KICBuZXcgZ29vZ2xlLnRyYW5zbGF0ZS5UcmFuc2xhdGVFbGVtZW50KHtwYWdlTGFuZ3VhZ2U6ICJlbiJ9LCAnZ29vZ2xlX3RyYW5zbGF0ZV9lbGVtZW50Jyk7DQp9DQoNCmZ1bmN0aW9uIGNoYW5nZUxhbmd1YWdlQnlCdXR0b25DbGljaygpIHsNCiAgdmFyIGxhbmd1YWdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxhbmd1YWdlIikudmFsdWU7DQogIHZhciBzZWxlY3RGaWVsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNnb29nbGVfdHJhbnNsYXRlX2VsZW1lbnQgc2VsZWN0Iik7DQogIGZvcih2YXIgaT0wOyBpIDwgc2VsZWN0RmllbGQuY2hpbGRyZW4ubGVuZ3RoOyBpKyspew0KICAgIHZhciBvcHRpb24gPSBzZWxlY3RGaWVsZC5jaGlsZHJlbltpXTsNCiAgICAvLyBmaW5kIGRlc2lyZWQgbGFuZ2F1Z2UgYW5kIGNoYW5nZSB0aGUgZm9ybWVyIGxhbmd1YWdlIG9mIHRoZSBoaWRkZW4gc2VsZWN0aW9uLWZpZWxkIA0KICAgIGlmKG9wdGlvbi52YWx1ZT09bGFuZ3VhZ2Upew0KICAgICAgIHNlbGVjdEZpZWxkLnNlbGVjdGVkSW5kZXggPSBpOw0KICAgICAgIC8vIHRyaWdnZXIgY2hhbmdlIGV2ZW50IGFmdGVyd2FyZHMgdG8gbWFrZSBnb29nbGUtbGliIHRyYW5zbGF0ZSB0aGlzIHNpZGUNCiAgICAgICBzZWxlY3RGaWVsZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJykpOw0KICAgICAgIGJyZWFrOw0KICAgIH0NCiAgfQ0KfQ0KDQo8L3NjcmlwdD4NCjwvZGl2Pg0KICAgICAgICAgICAgICAgIDwhLS1zdGFydGluZGV4LS0+DQogICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgIDwhLS1zdG9waW5kZXgtLT4NCiAgICAgICAgICAgICAgICANCjxkaXYgY2xhc3M9InNlYXJjaF9vdmVybGF5Ij48L2Rpdj4NCjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIGNsYXNzPSJzZWFyY2gtdHJpZ2dlciBoaWRkZW4teHMiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iU2VhcmNoIEljb24iPlNlYXJjaDwvYT4NCjxkaXYgY2xhc3M9InRvcF9zZWFyY2giPg0KICAgIDxhIGNsYXNzPSJjbG9zZV9zZWFyY2giIGhyZWY9IiMiPkNMT1NFPC9hPg0KICAgIDxkaXYgY2xhc3M9InNlYXJjaF9ibG9jayI+DQogICAgICAgIDxkaXYgaWQ9InNlYXJjaGJveCIgY2xhc3M9ImNsZWFyZml4Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0aXRsZT0iU2VhcmNoLi4uIiBhcmlhLWxhYmVsID0iU2VhcmNoIiBpZD0ic2VhcmNoX3RleHQiIHBsYWNlaG9sZGVyPSJTZWFyY2guLi4iIHR5cGU9InRleHQiPg0KICAgICAgICAgICAgPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApOyI+R288L2E+DQogICAgICAgIDwvZGl2Pg0KDQogICAgICAgIA0KICAgIDwvZGl2Pg0KPC9kaXY+DQoNCg0KPHNjcmlwdD4NCg0KICAgICQoZnVuY3Rpb24gKCkgew0KICAgICAgIA0KICAgICAgICAkKCIjc2VhcmNoYm94IGlucHV0Iikua2V5ZG93bihmdW5jdGlvbiAoZSkgew0KICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykgew0KICAgICAgICAgICAgICAgICQoIiNzZWFyY2hib3ggYSIpLmNsaWNrKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICAkKCIjc2VhcmNoYm94IGEiKS5jbGljayhmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICB2YXIga2V5V29yZCA9ICQoIiNzZWFyY2hib3ggaW5wdXQjc2VhcmNoX3RleHQiKS52YWwoKTsNCiAgICAgICAgICAgIGlmIChrZXlXb3JkLmxlbmd0aCA8PSAwKSB7IHJldHVybiBmYWxzZTsgfQ0KICAgICAgICAgICAga2V5V29yZCAgPSBrZXlXb3JkLnJlcGxhY2UoL15cc1xzKi8sICcnKS5yZXBsYWNlKC9cc1xzKiQvLCAnJyk7DQogICAgICAgICAgICBrZXlXb3JkID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleVdvcmQucmVwbGFjZSgiPCIsIiAiKS5yZXBsYWNlKCI+IiwiICIpICk7DQogICAgICAgICAgICB2YXIgbGluayA9ICcvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMvc2VhcmNoJzsNCiAgICAgICAgICAgIGlmIChsaW5rLmluZGV4T2YoIj8iKSA+PSAwICkNCiAgICAgICAgICAgICAgICBsaW5rID0gbGluayArICImcT0iICsga2V5V29yZDsNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBsaW5rID0gbGluayArICI/cT0iICsga2V5V29yZDsNCiAgICAgICAgICAgIGlmICgnRmFsc2UnID09ICdUcnVlJykgew0KICAgICAgICAgICAgICAgIHdpbmRvdy50b3AubG9jYXRpb24uaHJlZiA9IGxpbms7DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGxpbms7DQogICAgICAgICAgICB9ICAgICAgICAgICAgDQogICAgICAgIH0pOw0KICAgIH0pOw0KPC9zY3JpcHQ+DQogICAgICAgICAgICAgICAgPCEtLXN0YXJ0aW5kZXgtLT4NCiAgICAgICAgICAgIA0KDQo8L2Rpdj4NCg0KICAgICAgICA8L2hlYWRlcj4NCg0KICAgICAgICANCjxkaXYgY2xhc3M9InN0YW5kYXJkbGF5b3V0IGNsZWFyZml4IiBpZD0ic2l0ZWJvZHkiPg0KICAgIA0KPGRpdiBpZD0iQ29sdW1uVXNlckNvbnRyb2wxIiBjbGFzcz0iY29sdW1uICAgdG9wX2NvbCBjbGVhcmZpeCAgIiAgPg0KICAgIDwhLS0hIVdpZGdldFN0YXJ0LCB2aS1vcmRlcmRhdGE9IjAiICB2aS1oaWRlb25tb2JpbGU9ImZhbHNlIiB2aS13aWRnZXRpbnN0YW5jZWRhdGE9IjM5NjAiV2lkZ2V0U3RhcnQhIS0tPiAgICANCg0KICAgICAgICAgICAgICAgIDwhLS1zdG9waW5kZXgtLT4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSIgbWFpbl9tZW51X3dpZGdldCI+PCEtLXN0b3BpbmRleC0tPjxsaW5rIGhyZWY9Ii9EZWZhdWx0Q29udGVudC9EZWZhdWx0L1N0eWxlQnVuZGxlTWVnYU1lbnVEcm9wRG93bi5jc3NibmQ/dj1DRF9lTi1mWUpVOEtLUGlndDZ4LUV5LXo4X1dUc29aN2JxeDJwTFRadFhVMSIgcmVsPSJzdHlsZXNoZWV0Ii8+DQo8bGluayBocmVmPSIvUHJvamVjdC9Db250ZW50cy9NYWluL1N0eWxlQnVuZGxlTWVnYU1lbnVEcm9wRG93bi5jc3NibmQ/dj1PMGZNbktvZVRYUE1BNC1zR1plS1NqdVhKNGJfVnpkM2QyRHVLLXZHVFhzMSIgcmVsPSJzdHlsZXNoZWV0Ii8+DQo8bmF2IGNsYXNzPSJyZWd1bGFybWVnYW1lbnUgbWFpbm5hdiIgaWQ9Im1lbnVDb250YWluZXJfMzk2MF8wXzEwNjEiPjx1bCBjbGFzcz0iZHJvcGRvd25tZW51IGNsZWFyZml4Ij48bGkgY2xhc3M9Im1lZ2FtZW51X2ZpcnN0IiBpZD0iZHJvcGRvd25yb290aXRlbTEiPjxhIGNsYXNzPSJkcm9wZG93bnJvb3RpdGVtMSIgaHJlZj0iL2hvbWUiIHRpdGxlPSJIb21lIiBkYXRhLW5hdmlkPSIxIiB0YXJnZXQ9Il9zZWxmIj5Ib21lPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9maXJzdCIgaWQ9ImRyb3Bkb3ducm9vdGl0ZW0yIj48YSBjbGFzcz0iZHJvcGRvd25yb290aXRlbTIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZSIgdGl0bGU9IkxpdmluZyBpbiBMb3Vpc3ZpbGxlIiBkYXRhLW5hdmlkPSI0MjY1IiB0YXJnZXQ9Il9zZWxmIj5MaXZpbmcgaW4gTG91aXN2aWxsZTwvYT48ZGl2IGNsYXNzPSJtZWdhbWVudV9jb250YWluZXIgd2lkdGhjb250YWluZXI0Y29sIj48ZGl2IGNsYXNzPSJpbm5lcl9jb250YWluZXIiPjx1bCBjbGFzcz0ibWVnYW1lbnVfY29sdW1uIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10byIgdGl0bGU9IkkgV2FudCB0by4uLiIgZGF0YS1uYXZpZD0iNyIgdGFyZ2V0PSJfc2VsZiI+SSBXYW50IHRvLi4uPC9hPjx1bCBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by9hcHBseS1mb3ItYS1qb2IiIHRpdGxlPSJBcHBseSBmb3IgYSBKb2IiIGRhdGEtbmF2aWQ9Ijg0MiIgdGFyZ2V0PSJfc2VsZiI+QXBwbHkgZm9yIGEgSm9iPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9pLXdhbnQtdG8vYXBwbHktZm9yLWEtcGVybWl0LW9yLWxpY2Vuc2UiIHRpdGxlPSJBcHBseSBmb3IgYSBQZXJtaXQgb3IgTGljZW5zZSIgZGF0YS1uYXZpZD0iODQxIiB0YXJnZXQ9Il9zZWxmIj5BcHBseSBmb3IgYSBQZXJtaXQgb3IgTGljZW5zZTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvaS13YW50LXRvL2NvbnRhY3QtY2l0eS1jb3VuY2lsIiB0aXRsZT0iQ29udGFjdCBDaXR5IENvdW5jaWwiIGRhdGEtbmF2aWQ9Ijg0OSIgdGFyZ2V0PSJfc2VsZiI+Q29udGFjdCBDaXR5IENvdW5jaWw8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by9nZXQtYS1kb2ctbGljZW5zZSIgdGl0bGU9IkdldCBhIERvZyBMaWNlbnNlIiBkYXRhLW5hdmlkPSI4NDUiIHRhcmdldD0iX3NlbGYiPkdldCBhIERvZyBMaWNlbnNlPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9pLXdhbnQtdG8vZ2V0LWEtdGVlLXRpbWUiIHRpdGxlPSJHZXQgYSBUZWUgVGltZSIgZGF0YS1uYXZpZD0iODUzIiB0YXJnZXQ9Il9zZWxmIj5HZXQgYSBUZWUgVGltZTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvaS13YW50LXRvL2hhdmUtYS1ibG9jay1wYXJ0eSIgdGl0bGU9IkhhdmUgQSBCbG9jayBQYXJ0eSIgZGF0YS1uYXZpZD0iODU3IiB0YXJnZXQ9Il9zZWxmIj5IYXZlIEEgQmxvY2sgUGFydHk8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by9tYW5hZ2UtbXktYnVzaW5lc3MtdGF4LWFjY291bnQiIHRpdGxlPSJPbmxpbmUgVGF4ICZhbXA7IExpY2Vuc2UgUG9ydGFsIiBkYXRhLW5hdmlkPSI4NTgiIHRhcmdldD0iX3NlbGYiPk9ubGluZSBUYXggJmFtcDsgTGljZW5zZSBQb3J0YWw8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by9wYXktbXktdGlja2V0IiB0aXRsZT0iUGF5IE15IFRpY2tldCIgZGF0YS1uYXZpZD0iMTUyNTYiIHRhcmdldD0iX3NlbGYiPlBheSBNeSBUaWNrZXQ8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by9wYXktbXktdXRpbGl0eS1iaWxsLW9uLWxpbmUiIHRpdGxlPSJQYXkgTXkgVXRpbGl0eSBCaWxsIE9uLUxpbmUiIGRhdGEtbmF2aWQ9Ijg0NiIgdGFyZ2V0PSJfc2VsZiI+UGF5IE15IFV0aWxpdHkgQmlsbCBPbmxpbmU8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by9yZWFkLXRoZS1jb21tdW5pdHktdXBkYXRlLW5ld3NsZXR0ZXIiIHRpdGxlPSJSZWFkIHRoZSBDb21tdW5pdHkgVXBkYXRlIE5ld3NsZXR0ZXIiIGRhdGEtbmF2aWQ9IjI1MDYiIHRhcmdldD0iX3NlbGYiPlJlYWQgdGhlIENvbW11bml0eSBVcGRhdGUgTmV3c2xldHRlcjwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvaS13YW50LXRvL3JlY2VpdmUtZW5vdGlmaWNhdGlvbnMiIHRpdGxlPSJSZWNlaXZlIGVOb3RpZmljYXRpb25zIiBkYXRhLW5hdmlkPSI4NTQiIHRhcmdldD0iX3NlbGYiPlJlY2VpdmUgZU5vdGlmaWNhdGlvbnM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by9zaWduLXVwLWZvci1lbWVyZ2VuY3ktYWxlcnRzIiB0aXRsZT0iU2lnbiBVcCBmb3IgRW1lcmdlbmN5IEFsZXJ0cyIgZGF0YS1uYXZpZD0iMTU1NTUiIHRhcmdldD0iX3NlbGYiPlNpZ24gVXAgZm9yIEVtZXJnZW5jeSBBbGVydHM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2ktd2FudC10by92b2x1bnRlZXIiIHRpdGxlPSJWb2x1bnRlZXIiIGRhdGEtbmF2aWQ9IjI1MjIiIHRhcmdldD0iX3NlbGYiPlZvbHVudGVlcjwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvaS13YW50LXRvL3dhdGNoLWNpdHktY291bmNpbC1tZWV0aW5nLXZpZGVvcyIgdGl0bGU9IldhdGNoIENpdHkgQ291bmNpbCBNZWV0aW5nIFZpZGVvcyIgZGF0YS1uYXZpZD0iODYwIiB0YXJnZXQ9Il9zZWxmIj5XYXRjaCBDaXR5IENvdW5jaWwgTWVldGluZyBWaWRlb3M8L2E+PC9saT48L3VsPjwvbGk+PC91bD48dWwgY2xhc3M9Im1lZ2FtZW51X2NvbHVtbiI+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMiIHRpdGxlPSJSZXNpZGVudHMiIGRhdGEtbmF2aWQ9IjMiIHRhcmdldD0iX3NlbGYiPlJlc2lkZW50czwvYT48dWwgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvbG91aXN2aWxsZS1yZWJ1aWxkcy1tYXJzaGFsbC1maXJlLXJlY292ZXJ5IiB0aXRsZT0iTG91aXN2aWxsZSBSZWJ1aWxkcyIgZGF0YS1uYXZpZD0iMTU0NDYiIHRhcmdldD0iX3NlbGYiPkxvdWlzdmlsbGUgUmVidWlsZHMgKE1hcnNoYWxsIEZpcmUgUmVjb3ZlcnkpPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvcmVzaWxpZW50LWxvdWlzdmlsbGUiIHRpdGxlPSJSZXNpbGllbnQgTG91aXN2aWxsZSIgZGF0YS1uYXZpZD0iMTU1NTgiIHRhcmdldD0iX3NlbGYiPlJlc2lsaWVudCBMb3Vpc3ZpbGxlPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvYm9hcmRzLWNvbW1pc3Npb25zIiB0aXRsZT0iQm9hcmRzICZhbXA7IENvbW1pc3Npb25zIiBkYXRhLW5hdmlkPSIzOTg1IiB0YXJnZXQ9Il9zZWxmIj5Cb2FyZHMgJmFtcDsgQ29tbWlzc2lvbnM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL3Jlc2lkZW50cy9jaXR5LWNhbGVuZGFyIiB0aXRsZT0iQ2l0eSBFdmVudHMgYW5kIE1lZXRpbmdzIiBkYXRhLW5hdmlkPSI2OCIgdGFyZ2V0PSJfc2VsZiI+Q2l0eSBDYWxlbmRhcjwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVzaWRlbnRzL2NpdHktY291bmNpbCIgdGl0bGU9IkNpdHkgQ291bmNpbCIgZGF0YS1uYXZpZD0iNDAwMyIgdGFyZ2V0PSJfc2VsZiI+Q2l0eSBDb3VuY2lsPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvY29tbXVuaXR5LXJlc291cmNlcyIgdGl0bGU9IkNvbW11bml0eSBSZXNvdXJjZXMiIGRhdGEtbmF2aWQ9IjE1NTMzIiB0YXJnZXQ9Il9zZWxmIj5Db21tdW5pdHkgUmVzb3VyY2VzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvY29uc3RydWN0aW9uLXVwZGF0ZXMiIHRpdGxlPSJDb25zdHJ1Y3Rpb24gVXBkYXRlcyIgZGF0YS1uYXZpZD0iMjE3NCIgdGFyZ2V0PSJfc2VsZiI+Q29uc3RydWN0aW9uIFVwZGF0ZXM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL3Jlc2lkZW50cy9ob3VzaW5nIiB0aXRsZT0iSG91c2luZyIgZGF0YS1uYXZpZD0iMjUzNiIgdGFyZ2V0PSJfc2VsZiI+SG91c2luZzwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVzaWRlbnRzL25ld3MiIHRpdGxlPSJOZXdzICIgZGF0YS1uYXZpZD0iODMxIiB0YXJnZXQ9Il9zZWxmIj5OZXdzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9jaXR5LWluZm9ybWF0aW9uL29pbC1nYXMtaW5mb3JtYXRpb24tcmVzb3VyY2VzIiB0aXRsZT0iT2lsICZhbXA7IEdhcyBJbmZvcm1hdGlvbiAmYW1wOyBSZXNvdXJjZXMiIGRhdGEtbmF2aWQ9IjM5NTgiIHRhcmdldD0iX3NlbGYiPk9pbCAmYW1wOyBHYXMgSW5mb3JtYXRpb24gJmFtcDsgUmVzb3VyY2VzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvcGVybWl0cy1hbmQtbGljZW5zaW5nIiB0aXRsZT0iUGVybWl0cyAgYW5kIExpY2Vuc2luZyIgZGF0YS1uYXZpZD0iNTk2IiB0YXJnZXQ9Il9zZWxmIj5QZXJtaXRzICBhbmQgTGljZW5zaW5nPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvcHVibGljLXJlY29yZHMtcmVxdWVzdHMiIHRpdGxlPSJQdWJsaWMgUmVjb3JkcyBSZXF1ZXN0cyIgZGF0YS1uYXZpZD0iNDAxOSIgdGFyZ2V0PSJfc2VsZiI+UHVibGljIFJlY29yZHMgUmVxdWVzdHM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vcmVwb3J0LWEtc3RyZWV0LWxpZ2h0LW91dGFnZS1vci1wcm9ibGVtIiB0aXRsZT0iUmVwb3J0IGEgU3RyZWV0IExpZ2h0IE91dGFnZSBvciBQcm9ibGVtIiBkYXRhLW5hdmlkPSI4NjEiIHRhcmdldD0iX3NlbGYiPlJlcG9ydCBhIFN0cmVldCBMaWdodCBPdXRhZ2Ugb3IgUHJvYmxlbTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVzaWRlbnRzL3JvY2t5LW1vdW50YWluLW1ldHJvcG9saXRhbi1haXJwb3J0IiB0aXRsZT0iUm9ja3kgTW91bnRhaW4gTWV0cm9wb2xpdGFuIEFpcnBvcnQiIGRhdGEtbmF2aWQ9IjM5NDIiIHRhcmdldD0iX3NlbGYiPlJvY2t5IE1vdW50YWluIE1ldHJvcG9saXRhbiBBaXJwb3J0PC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvc3VzdGFpbmFiaWxpdHkiIHRpdGxlPSJTdXN0YWluYWJpbGl0eSIgZGF0YS1uYXZpZD0iNzc2IiB0YXJnZXQ9Il9zZWxmIj5TdXN0YWluYWJpbGl0eTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVzaWRlbnRzL3RyYW5zcG9ydGF0aW9uIiB0aXRsZT0iVHJhbnNwb3J0YXRpb24iIGRhdGEtbmF2aWQ9IjEyMCIgdGFyZ2V0PSJfc2VsZiI+VHJhbnNwb3J0YXRpb248L2E+PC9saT48L3VsPjwvbGk+PC91bD48dWwgY2xhc3M9Im1lZ2FtZW51X2NvbHVtbiI+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9jaXR5LWluZm9ybWF0aW9uIiB0aXRsZT0iQ2l0eSBJbmZvcm1hdGlvbiIgZGF0YS1uYXZpZD0iMTAxNzciIHRhcmdldD0iX3NlbGYiPkNpdHkgSW5mb3JtYXRpb248L2E+PHVsIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvY2l0eS1pbmZvcm1hdGlvbi9idWRnZXQtcHJvY2VzcyIgdGl0bGU9IkJ1ZGdldCBQcm9jZXNzIiBkYXRhLW5hdmlkPSIzNjk5IiB0YXJnZXQ9Il9zZWxmIj5CdWRnZXQgUHJvY2VzczwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVzaWRlbnRzL2NpdHktZWxlY3Rpb24taW5mb3JtYXRpb24iIHRpdGxlPSJDaXR5IEVsZWN0aW9uIEluZm9ybWF0aW9uIiBkYXRhLW5hdmlkPSIxMDAzNSIgdGFyZ2V0PSJfc2VsZiI+Q2l0eSBFbGVjdGlvbiBJbmZvcm1hdGlvbjwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvY2l0eS1pbmZvcm1hdGlvbi9jaXR5LXByb2JsZW0tcmVwb3J0ZXIiIHRpdGxlPSJDaXR5IFByb2JsZW0gUmVwb3J0ZXIiIGRhdGEtbmF2aWQ9IjkwMzIiIHRhcmdldD0iX3NlbGYiPkNpdHkgUHJvYmxlbSBSZXBvcnRlcjwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVzaWRlbnRzL2RlcGFydG1lbnRzIiB0aXRsZT0iRGVwYXJ0bWVudHMiIGRhdGEtbmF2aWQ9IjI1NjAiIHRhcmdldD0iX3NlbGYiPkRlcGFydG1lbnRzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9jaXR5LWluZm9ybWF0aW9uL2Vub3RpZmljYXRpb25zIiB0aXRsZT0iZU5vdGlmaWNhdGlvbnMiIGRhdGEtbmF2aWQ9IjQyIiB0YXJnZXQ9Il9zZWxmIj5lTm90aWZpY2F0aW9uczwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvY2l0eS1pbmZvcm1hdGlvbi9lbmdhZ2UtbG91aXN2aWxsZSIgdGl0bGU9IkVuZ2FnZSBMb3Vpc3ZpbGxlIiBkYXRhLW5hdmlkPSIxNTUyMCIgdGFyZ2V0PSJfYmxhbmsiPkVuZ2FnZSBMb3Vpc3ZpbGxlPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9jaXR5LWluZm9ybWF0aW9uL2VxdWl0eS1kaXZlcnNpdHktaW5jbHVzaW9uIiB0aXRsZT0iRXF1aXR5LCBEaXZlcnNpdHkgJmFtcDsgSW5jbHVzaW9uIiBkYXRhLW5hdmlkPSIxNDMzNCIgdGFyZ2V0PSJfc2VsZiI+RXF1aXR5LCBEaXZlcnNpdHkgJmFtcDsgSW5jbHVzaW9uPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9jaXR5LWluZm9ybWF0aW9uL2ZlZXMiIHRpdGxlPSJGZWVzLCBSYXRlcywgYW5kIENoYXJnZXMiIGRhdGEtbmF2aWQ9IjY5IiB0YXJnZXQ9Il9zZWxmIj5GZWVzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvZnJlcXVlbnRseS1hc2tlZC1xdWVzdGlvbnMiIHRpdGxlPSJGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyIgZGF0YS1uYXZpZD0iMzc5MCIgdGFyZ2V0PSJfc2VsZiI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL3Jlc2lkZW50cy9ndW4tc2FmZXR5LW9yZGluYW5jZXMiIHRpdGxlPSJHdW4gVmlvbGVuY2UgUHJldmVudGlvbiBPcmRpbmFuY2VzIiBkYXRhLW5hdmlkPSIxNTUyNCIgdGFyZ2V0PSJfc2VsZiI+R3VuIFZpb2xlbmNlIFByZXZlbnRpb24gT3JkaW5hbmNlczwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvY2l0eS1pbmZvcm1hdGlvbi9ob3Vycy1jbG9zdXJlcyIgdGl0bGU9IkhvdXJzICZhbXA7IENsb3N1cmVzIiBkYXRhLW5hdmlkPSIxNTQxOCIgdGFyZ2V0PSJfc2VsZiI+SG91cnMgJmFtcDsgQ2xvc3VyZXM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vb25saW5lLW1hcHMiIHRpdGxlPSJPbmxpbmUgTWFwcyIgZGF0YS1uYXZpZD0iMzY5OCIgdGFyZ2V0PSJfc2VsZiI+T25saW5lIE1hcHM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL3B1YmxpYy1zYWZldHkiIHRpdGxlPSJQdWJsaWMgU2FmZXR5IiBkYXRhLW5hdmlkPSIxNTYzMiIgdGFyZ2V0PSJfc2VsZiI+UHVibGljIFNhZmV0eTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvY2l0eS1pbmZvcm1hdGlvbi9wcml2YWN5LXBvbGljeSIgdGl0bGU9IlByaXZhY3kgUG9saWN5IiBkYXRhLW5hdmlkPSIxNTQyOCIgdGFyZ2V0PSJfc2VsZiI+UHJpdmFjeSBQb2xpY3k8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vc3RyYXRlZ2ljLXBsYW4iIHRpdGxlPSJTdHJhdGVnaWMgUGxhbiIgZGF0YS1uYXZpZD0iMzkxNyIgdGFyZ2V0PSJfc2VsZiI+U3RyYXRlZ2ljIFBsYW48L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vdHJhbnNsYXRpb24tb2YtY2l0eS1pbmZvcm1hdGlvbiIgdGl0bGU9IlRyYW5zbGF0aW9uL0ludGVycHJldGF0aW9uIFNlcnZpY2VzIiBkYXRhLW5hdmlkPSIxNTQ0MSIgdGFyZ2V0PSJfc2VsZiI+VHJhbnNsYXRpb24gJmFtcDsgSW50ZXJwcmV0YXRpb24gU2VydmljZXM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vZXF1aXR5LWRpdmVyc2l0eS1pbmNsdXNpb24vd2Vic2l0ZS1hY2Nlc3NpYmlsaXR5IiB0aXRsZT0iV2Vic2l0ZSBBY2Nlc3NpYmlsaXR5IiBkYXRhLW5hdmlkPSIxNTUyMiIgdGFyZ2V0PSJfc2VsZiI+V2Vic2l0ZSBBY2Nlc3NpYmlsaXR5PC9hPjwvbGk+PC91bD48L2xpPjwvdWw+PHVsIGNsYXNzPSJtZWdhbWVudV9jb2x1bW4iPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVjcmVhdGlvbi1zZW5pb3ItY2VudGVyIiB0aXRsZT0iUmVjcmVhdGlvbiAmYW1wOyBTZW5pb3IgQ2VudGVyIiBkYXRhLW5hdmlkPSI0NDg0IiB0YXJnZXQ9Il9zZWxmIj5SZWNyZWF0aW9uICZhbXA7IFNlbmlvciBDZW50ZXI8L2E+PHVsIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVjcmVhdGlvbi1zZW5pb3ItY2VudGVyL3Zpc2l0LXVzIiB0aXRsZT0iVmlzaXQgVXMiIGRhdGEtbmF2aWQ9IjQ0ODkiIHRhcmdldD0iX3NlbGYiPlZpc2l0IFVzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9yZWNyZWF0aW9uLXNlbmlvci1jZW50ZXIvcHJvZ3JhbXMtYWN0aXZpdGllcyIgdGl0bGU9IlByb2dyYW1zICZhbXA7IEFjdGl2aXRpZXMiIGRhdGEtbmF2aWQ9IjQ0OTAiIHRhcmdldD0iX3NlbGYiPlByb2dyYW1zICZhbXA7IEFjdGl2aXRpZXM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL3JlY3JlYXRpb24tc2VuaW9yLWNlbnRlci9mYWNpbGl0aWVzIiB0aXRsZT0iRmFjaWxpdGllcyIgZGF0YS1uYXZpZD0iNDQ5MSIgdGFyZ2V0PSJfc2VsZiI+RmFjaWxpdGllczwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVjcmVhdGlvbi1zZW5pb3ItY2VudGVyL3JlZ2lzdGVyIiB0aXRsZT0iUmVnaXN0ZXIiIGRhdGEtbmF2aWQ9IjQ0ODgiIHRhcmdldD0iX2JsYW5rIj5SZWdpc3RlcjwvYT48L2xpPjwvdWw+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NvYWwtY3JlZWstZ29sZi1jb3Vyc2UiIHRpdGxlPSJDb2FsIENyZWVrIEdvbGYgQ291cnNlIiBkYXRhLW5hdmlkPSI5ODIiIHRhcmdldD0iX3NlbGYiPkNvYWwgQ3JlZWsgR29sZiBDb3Vyc2U8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2hpc3RvcmljYWwtbXVzZXVtIiB0aXRsZT0iSGlzdG9yaWNhbCBNdXNldW0iIGRhdGEtbmF2aWQ9IjcwNyIgdGFyZ2V0PSJfc2VsZiI+SGlzdG9yaWNhbCBNdXNldW0gPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9saXZpbmctaW4tbG91aXN2aWxsZS9saWJyYXJ5IiB0aXRsZT0iTGlicmFyeSAiIGRhdGEtbmF2aWQ9IjUzMyIgdGFyZ2V0PSJfc2VsZiI+TGlicmFyeSA8L2E+PC9saT48L3VsPjwvZGl2PjwvZGl2PjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9maXJzdCIgaWQ9ImRyb3Bkb3ducm9vdGl0ZW0zIj48YSBjbGFzcz0iZHJvcGRvd25yb290aXRlbTMiIGhyZWY9Ii9kb2luZy1idXNpbmVzcyIgdGl0bGU9IkRvaW5nIEJ1c2luZXNzIiBkYXRhLW5hdmlkPSI0MjY2IiB0YXJnZXQ9Il9zZWxmIj5Eb2luZyBCdXNpbmVzczwvYT48ZGl2IGNsYXNzPSJtZWdhbWVudV9jb250YWluZXIgd2lkdGhjb250YWluZXI0Y29sIj48ZGl2IGNsYXNzPSJpbm5lcl9jb250YWluZXIiPjx1bCBjbGFzcz0ibWVnYW1lbnVfY29sdW1uIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL2Vjb25vbWljLWRldmVsb3BtZW50IiB0aXRsZT0iRWNvbm9taWMgVml0YWxpdHkiIGRhdGEtbmF2aWQ9IjY5MCIgdGFyZ2V0PSJfc2VsZiI+RWNvbm9taWMgVml0YWxpdHk8L2E+PHVsIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZG9pbmctYnVzaW5lc3MvZWNvbm9taWMtZGV2ZWxvcG1lbnQvYWJvdXQtYW5kLWNvbnRhY3QiIHRpdGxlPSJBYm91dCBhbmQgQ29udGFjdCIgZGF0YS1uYXZpZD0iODU0OCIgdGFyZ2V0PSJfc2VsZiI+QWJvdXQgYW5kIENvbnRhY3Q8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL2Vjb25vbWljLWRldmVsb3BtZW50L2J1c2luZXNzLWRpc3RyaWN0cyIgdGl0bGU9IkJ1c2luZXNzIERpc3RyaWN0cyIgZGF0YS1uYXZpZD0iMjYzMyIgdGFyZ2V0PSJfc2VsZiI+QnVzaW5lc3MgRGlzdHJpY3RzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9kb2luZy1idXNpbmVzcy9lY29ub21pYy1kZXZlbG9wbWVudC9jb21tdW5pdHktcHJvZmlsZSIgdGl0bGU9IkNvbW11bml0eSBQcm9maWxlIiBkYXRhLW5hdmlkPSI4NTUxIiB0YXJnZXQ9Il9zZWxmIj5Db21tdW5pdHkgUHJvZmlsZTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZG9pbmctYnVzaW5lc3MvZWNvbm9taWMtZGV2ZWxvcG1lbnQvaW5jZW50aXZlcy1hbmQtZ3JhbnRzIiB0aXRsZT0iSW5jZW50aXZlcyBhbmQgR3JhbnRzIiBkYXRhLW5hdmlkPSI4NTQ5IiB0YXJnZXQ9Il9zZWxmIj5JbmNlbnRpdmVzIGFuZCBHcmFudHM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL2Vjb25vbWljLXZpdGFsaXR5L3VyYmFuLXJlbmV3YWwtYXV0aG9yaXR5IiB0aXRsZT0iVXJiYW4gUmVuZXdhbCBBdXRob3JpdHkiIGRhdGEtbmF2aWQ9IjY5MyIgdGFyZ2V0PSJfc2VsZiI+VXJiYW4gUmVuZXdhbCBBdXRob3JpdHk8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL2Vjb25vbWljLWRldmVsb3BtZW50L2J1c2luZXNzLXJlc291cmNlcyIgdGl0bGU9IkJ1c2luZXNzIFJlc291cmNlcyIgZGF0YS1uYXZpZD0iODk0MiIgdGFyZ2V0PSJfc2VsZiI+QnVzaW5lc3MgUmVzb3VyY2VzPC9hPjwvbGk+PC91bD48L2xpPjwvdWw+PHVsIGNsYXNzPSJtZWdhbWVudV9jb2x1bW4iPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvZG9pbmctYnVzaW5lc3MvY2hhbWJlci1vZi1jb21tZXJjZSIgdGl0bGU9IkNoYW1iZXIgb2YgQ29tbWVyY2UiIGRhdGEtbmF2aWQ9IjEyMSIgdGFyZ2V0PSJfYmxhbmsiPkNoYW1iZXIgb2YgQ29tbWVyY2U8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL2NvbnN0cnVjdGlvbi11cGRhdGVzIiB0aXRsZT0iQ29uc3RydWN0aW9uIFVwZGF0ZXMiIGRhdGEtbmF2aWQ9IjkyOCIgdGFyZ2V0PSJfc2VsZiI+Q29uc3RydWN0aW9uIFVwZGF0ZXM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL2Rvd250b3duLWJ1c2luZXNzLWFzc29jaWF0aW9uIiB0aXRsZT0iRG93bnRvd24gQnVzaW5lc3MgQXNzb2NpYXRpb24iIGRhdGEtbmF2aWQ9IjEyMiIgdGFyZ2V0PSJfYmxhbmsiPkRvd250b3duIEJ1c2luZXNzIEFzc29jaWF0aW9uPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9kb2luZy1idXNpbmVzcy9ncmVlbi1idXNpbmVzcy1wcm9ncmFtIiB0aXRsZT0iQ29sb3JhZG8gR3JlZW4gQnVzaW5lc3MgTmV0d29yayAoQ0dCTikiIGRhdGEtbmF2aWQ9IjIzMTkiIHRhcmdldD0iX3NlbGYiPkdyZWVuIEJ1c2luZXNzIFByb2dyYW08L2E+PC9saT48L3VsPjx1bCBjbGFzcz0ibWVnYW1lbnVfY29sdW1uIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2RvaW5nLWJ1c2luZXNzL3NhbGVzLXRheC1saWNlbnNpbmctZGl2aXNpb24iIHRpdGxlPSJTYWxlcyBUYXggJmFtcDsgTGljZW5zaW5nIERpdmlzaW9uIiBkYXRhLW5hdmlkPSIxMDM1NiIgdGFyZ2V0PSJfc2VsZiI+U2FsZXMgVGF4ICZhbXA7IExpY2Vuc2luZyBEaXZpc2lvbjwvYT48L2xpPjwvdWw+PHVsIGNsYXNzPSJtZWdhbWVudV9jb2x1bW4iPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvZG9pbmctYnVzaW5lc3MvYmlkZGluZy1vcHBvcnR1bml0aWVzLXJlcXVlc3RzLWZvci1wcm9wb3NhbHMiIHRpdGxlPSJCaWRkaW5nIE9wcG9ydHVuaXRpZXMgLyBSZXF1ZXN0cyBmb3IgUHJvcG9zYWxzIChSRlBzKSIgZGF0YS1uYXZpZD0iNzkzIiB0YXJnZXQ9Il9zZWxmIj5CaWRkaW5nIE9wcG9ydHVuaXRpZXMgLyBSZXF1ZXN0cyBmb3IgUHJvcG9zYWxzIChSRlBzKTwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2ZpcnN0IiBpZD0iZHJvcGRvd25yb290aXRlbTQiPjxhIGNsYXNzPSJkcm9wZG93bnJvb3RpdGVtNCIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlIiB0aXRsZT0iRXhwbG9yaW5nIExvdWlzdmlsbGUiIGRhdGEtbmF2aWQ9IjQyNjciIHRhcmdldD0iX3NlbGYiPkV4cGxvcmluZyBMb3Vpc3ZpbGxlPC9hPjxkaXYgY2xhc3M9Im1lZ2FtZW51X2NvbnRhaW5lciB3aWR0aGNvbnRhaW5lcjRjb2wiPjxkaXYgY2xhc3M9ImlubmVyX2NvbnRhaW5lciI+PHVsIGNsYXNzPSJtZWdhbWVudV9jb2x1bW4iPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMiIHRpdGxlPSJBYm91dCBVcyIgZGF0YS1uYXZpZD0iMiIgdGFyZ2V0PSJfc2VsZiI+QWJvdXQgVXM8L2E+PHVsIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMvYXdhcmRzIiB0aXRsZT0iQXdhcmRzIiBkYXRhLW5hdmlkPSIzNzk2IiB0YXJnZXQ9Il9zZWxmIj5Bd2FyZHM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2Fib3V0LXVzL2NpdHktY2FsZW5kYXIiIHRpdGxlPSJDaXR5IEV2ZW50cyBhbmQgTWVldGluZ3MiIGRhdGEtbmF2aWQ9IjgzMCIgdGFyZ2V0PSJfc2VsZiI+Q2l0eSBDYWxlbmRhcjwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMvZGVwYXJ0bWVudHMiIHRpdGxlPSJEZXBhcnRtZW50cyIgZGF0YS1uYXZpZD0iODI5IiB0YXJnZXQ9Il9zZWxmIj5EZXBhcnRtZW50czwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMvZnJlcXVlbnRseS1hc2tlZC1xdWVzdGlvbnMiIHRpdGxlPSJGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucyIgZGF0YS1uYXZpZD0iMzc4OCIgdGFyZ2V0PSJfc2VsZiI+RnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2Fib3V0LXVzL2pvYnMiIHRpdGxlPSJKb2JzIiBkYXRhLW5hdmlkPSI5MTUiIHRhcmdldD0iX3NlbGYiPkpvYnM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2Fib3V0LXVzL2hpc3RvcmljYWwtbXVzZXVtIiB0aXRsZT0iSGlzdG9yaWNhbCBNdXNldW0iIGRhdGEtbmF2aWQ9IjI0MjUiIHRhcmdldD0iX3NlbGYiPkhpc3RvcmljYWwgTXVzZXVtIDwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMvbmV3cyIgdGl0bGU9Ik5ld3MgIiBkYXRhLW5hdmlkPSIxNyIgdGFyZ2V0PSJfc2VsZiI+TmV3czwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMvb25saW5lLW1hcHMiIHRpdGxlPSJPbmxpbmUgTWFwcyIgZGF0YS1uYXZpZD0iMzcwNCIgdGFyZ2V0PSJfc2VsZiI+T25saW5lIE1hcHM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2Fib3V0LXVzL29wZW4tZ292ZXJubWVudC10cmFuc3BhcmVuY3ktMTUyNjMiIHRpdGxlPSJPcGVuIEdvdmVybm1lbnQgJmFtcDsgVHJhbnNwYXJlbmN5IiBkYXRhLW5hdmlkPSIxNTI2MyIgdGFyZ2V0PSJfc2VsZiI+T3BlbiBHb3Zlcm5tZW50ICZhbXA7IFRyYW5zcGFyZW5jeTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYWJvdXQtdXMvc2l0ZS1tYXAiIHRpdGxlPSJTaXRlIE1hcCIgZGF0YS1uYXZpZD0iMTAwMyIgdGFyZ2V0PSJfc2VsZiI+U2l0ZSBNYXA8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2Fib3V0LXVzL3RyYWlscy1hbmQtbWFwcyIgdGl0bGU9IlRyYWlscyBhbmQgTWFwcyIgZGF0YS1uYXZpZD0iODc4IiB0YXJnZXQ9Il9zZWxmIj5UcmFpbHMgYW5kIE1hcHM8L2E+PC9saT48L3VsPjwvbGk+PC91bD48dWwgY2xhc3M9Im1lZ2FtZW51X2NvbHVtbiI+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9leHBsb3JpbmctbG91aXN2aWxsZS92aXNpdG9ycy0xNTI2NyIgdGl0bGU9IlZpc2l0b3JzIiBkYXRhLW5hdmlkPSIxNTI2NyIgdGFyZ2V0PSJfc2VsZiI+VmlzaXRvcnM8L2E+PHVsIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXRvcnMvYWJvdXQtdXMiIHRpdGxlPSJBYm91dCBVcyIgZGF0YS1uYXZpZD0iMjYyOCIgdGFyZ2V0PSJfc2VsZiI+QWJvdXQgVXM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL3Zpc2l0b3JzL2NpdHktY2FsZW5kYXIiIHRpdGxlPSJDaXR5IEV2ZW50cyBhbmQgTWVldGluZ3MiIGRhdGEtbmF2aWQ9IjYzMSIgdGFyZ2V0PSJfc2VsZiI+Q2l0eSBDYWxlbmRhcjwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXRvcnMvY29hbC1jcmVlay1nb2xmLWNvdXJzZSIgdGl0bGU9IkNvYWwgQ3JlZWsgR29sZiBDb3Vyc2UiIGRhdGEtbmF2aWQ9IjcwOSIgdGFyZ2V0PSJfc2VsZiI+Q29hbCBDcmVlayBHb2xmIENvdXJzZTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXRvcnMvZG93bnRvd24tcGFya2luZyIgdGl0bGU9IkRvd250b3duIFBhcmtpbmciIGRhdGEtbmF2aWQ9IjgwMiIgdGFyZ2V0PSJfc2VsZiI+RG93bnRvd24gUGFya2luZzwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXRvcnMvb25saW5lLW1hcHMiIHRpdGxlPSJPbmxpbmUgTWFwcyIgZGF0YS1uYXZpZD0iMzcwNSIgdGFyZ2V0PSJfc2VsZiI+T25saW5lIE1hcHM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL3Zpc2l0b3JzL3N0cmVldC1mYWlyZSIgdGl0bGU9IlN0cmVldCBGYWlyZSIgZGF0YS1uYXZpZD0iMTM3IiB0YXJnZXQ9Il9ibGFuayI+U3RyZWV0IEZhaXJlPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9leHBsb3JpbmctbG91aXN2aWxsZS92aXNpdG9ycy90cmFpbHMtYW5kLW1hcHMiIHRpdGxlPSJUcmFpbHMgYW5kIE1hcHMiIGRhdGEtbmF2aWQ9IjcwNiIgdGFyZ2V0PSJfc2VsZiI+VHJhaWxzIGFuZCBNYXBzPC9hPjwvbGk+PC91bD48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXQtbG91aXN2aWxsZSIgdGl0bGU9IlZpc2l0IExvdWlzdmlsbGUiIGRhdGEtbmF2aWQ9IjQ0ODYiIHRhcmdldD0iX3NlbGYiPlZpc2l0IExvdWlzdmlsbGU8L2E+PHVsIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXQtbG91aXN2aWxsZS9wbGFjZXMtdG8tZ28iIHRpdGxlPSJQbGFjZXMgVG8gR28iIGRhdGEtbmF2aWQ9IjQ0OTYiIHRhcmdldD0iX3NlbGYiPlBsYWNlcyBUbyBHbzwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXQtbG91aXN2aWxsZS90aGluZ3MtdG8tZG8iIHRpdGxlPSJUaGluZ3MgVG8gRG8iIGRhdGEtbmF2aWQ9IjQ0OTciIHRhcmdldD0iX3NlbGYiPlRoaW5ncyBUbyBEbzwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXQtbG91aXN2aWxsZS9ldmVudHMiIHRpdGxlPSJFdmVudHMiIGRhdGEtbmF2aWQ9IjQ0OTgiIHRhcmdldD0iX3NlbGYiPkV2ZW50czwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvdmlzaXQtbG91aXN2aWxsZS9yZXNvdXJjZXMiIHRpdGxlPSJSZXNvdXJjZXMiIGRhdGEtbmF2aWQ9IjQ0OTkiIHRhcmdldD0iX3NlbGYiPlJlc291cmNlczwvYT48L2xpPjwvdWw+PC9saT48L3VsPjx1bCBjbGFzcz0ibWVnYW1lbnVfY29sdW1uIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2NvYWwtY3JlZWstZ29sZi1jb3Vyc2UiIHRpdGxlPSJDb2FsIENyZWVrIEdvbGYgQ291cnNlIiBkYXRhLW5hdmlkPSI4NzMiIHRhcmdldD0iX3NlbGYiPkNvYWwgQ3JlZWsgR29sZiBDb3Vyc2U8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2hpc3RvcmljYWwtbXVzZXVtIiB0aXRsZT0iSGlzdG9yaWNhbCBNdXNldW0iIGRhdGEtbmF2aWQ9IjQ0ODUiIHRhcmdldD0iX3NlbGYiPkhpc3RvcmljYWwgTXVzZXVtPC9hPjx1bCBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2hpc3RvcmljYWwtbXVzZXVtL3Zpc2l0L2Fib3V0LXVzIiB0aXRsZT0iQWJvdXQgVXMiIGRhdGEtbmF2aWQ9IjM4MzAiIHRhcmdldD0iX3NlbGYiPkFib3V0IFVzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9leHBsb3JpbmctbG91aXN2aWxsZS9oaXN0b3JpY2FsLW11c2V1bS92aXNpdCIgdGl0bGU9IlZpc2l0IiBkYXRhLW5hdmlkPSI0NDkyIiB0YXJnZXQ9Il9zZWxmIj5WaXNpdDwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvaGlzdG9yaWNhbC1tdXNldW0vZXhwZXJpZW5jZSIgdGl0bGU9IkV4cGVyaWVuY2UiIGRhdGEtbmF2aWQ9IjQ0OTMiIHRhcmdldD0iX3NlbGYiPkV4cGVyaWVuY2U8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2hpc3RvcmljYWwtbXVzZXVtL21hcnNoYWxsLWZpcmUtcHJlc2VydmluZy15b3VyLW1lbW9yaWVzIiB0aXRsZT0iTWFyc2hhbGwgRmlyZSAtIFByZXNlcnZpbmcgWW91ciBNZW1vcmllcyIgZGF0YS1uYXZpZD0iMTU0NDIiIHRhcmdldD0iX3NlbGYiPk1hcnNoYWxsIEZpcmUgUHJvamVjdDwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvaGlzdG9yaWNhbC1tdXNldW0vZ2V0LWludm9sdmVkIiB0aXRsZT0iR2V0IEludm9sdmVkIiBkYXRhLW5hdmlkPSI0NDk0IiB0YXJnZXQ9Il9zZWxmIj5HZXQgSW52b2x2ZWQ8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2hpc3RvcmljYWwtbXVzZXVtL2Rpc2NvdmVyIiB0aXRsZT0iRGlzY292ZXIiIGRhdGEtbmF2aWQ9IjQ0OTUiIHRhcmdldD0iX3NlbGYiPkRpc2NvdmVyPC9hPjwvbGk+PC91bD48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvbGlicmFyeSIgdGl0bGU9IkxpYnJhcnkgIiBkYXRhLW5hdmlkPSI4NzQiIHRhcmdldD0iX3NlbGYiPkxpYnJhcnkgPC9hPjwvbGk+PC91bD48dWwgY2xhc3M9Im1lZ2FtZW51X2NvbHVtbiI+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9leHBsb3JpbmctbG91aXN2aWxsZS9hcnRzLWV2ZW50cyIgdGl0bGU9IkN1bHR1cmFsIFNlcnZpY2VzOiBBcnRzIGFuZCBFdmVudHMiIGRhdGEtbmF2aWQ9IjQ0ODciIHRhcmdldD0iX3NlbGYiPkFydHMgYW5kIEV2ZW50czwvYT48dWwgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9leHBsb3JpbmctbG91aXN2aWxsZS9hcnRzLWV2ZW50cy9hcnRzIiB0aXRsZT0iQXJ0cyIgZGF0YS1uYXZpZD0iNDUwMiIgdGFyZ2V0PSJfc2VsZiI+Q3VsdHVyYWwgQXJ0czwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYXJ0cy1ldmVudHMvZXZlbnRzIiB0aXRsZT0iRXZlbnRzIiBkYXRhLW5hdmlkPSI0NTAzIiB0YXJnZXQ9Il9zZWxmIj5DaXR5IEV2ZW50czwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvZXhwbG9yaW5nLWxvdWlzdmlsbGUvYXJ0cy1ldmVudHMvZmFjaWxpdGllcyIgdGl0bGU9IkFydHMgYW5kIEV2ZW50cyAtIEZhY2lsaXRpZXMiIGRhdGEtbmF2aWQ9IjQ1MDEiIHRhcmdldD0iX3NlbGYiPkZhY2lsaXRpZXM8L2E+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2V4cGxvcmluZy1sb3Vpc3ZpbGxlL2FydHMtZXZlbnRzL2FydHMtZXZlbnRzLWNhbGVuZGFyIiB0aXRsZT0iQ2FsZW5kYXIiIGRhdGEtbmF2aWQ9IjIxNDIiIHRhcmdldD0iX3NlbGYiPkNhbGVuZGFyPC9hPjwvbGk+PC91bD48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2ZpcnN0IiBpZD0iZHJvcGRvd25yb290aXRlbTUiPjxhIGNsYXNzPSJkcm9wZG93bnJvb3RpdGVtNSIgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQiIHRpdGxlPSJMb2NhbCBHb3Zlcm5tZW50IiBkYXRhLW5hdmlkPSI0MjY4IiB0YXJnZXQ9Il9zZWxmIj5Mb2NhbCBHb3Zlcm5tZW50PC9hPjxkaXYgY2xhc3M9Im1lZ2FtZW51X2NvbnRhaW5lciB3aWR0aGNvbnRhaW5lcjRjb2wiPjxkaXYgY2xhc3M9ImlubmVyX2NvbnRhaW5lciI+PHVsIGNsYXNzPSJtZWdhbWVudV9jb2x1bW4iPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9hZ2VuZGFzLW1pbnV0ZXMiIHRpdGxlPSJNZWV0aW5nIEFnZW5kYXMgJmFtcDsgTWludXRlcyIgZGF0YS1uYXZpZD0iNDAxNyIgdGFyZ2V0PSJfc2VsZiI+QWdlbmRhcyAmYW1wOyBNaW51dGVzPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L2NpdHktZWxlY3Rpb24taW5mb3JtYXRpb24iIHRpdGxlPSJDaXR5IEVsZWN0aW9uIEluZm9ybWF0aW9uIiBkYXRhLW5hdmlkPSI0MDE1IiB0YXJnZXQ9Il9zZWxmIj5DaXR5IEVsZWN0aW9uIEluZm9ybWF0aW9uPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L2VuZ2FnZS1sb3Vpc3ZpbGxlIiB0aXRsZT0iRW5nYWdlIExvdWlzdmlsbGUiIGRhdGEtbmF2aWQ9IjEwMTgwIiB0YXJnZXQ9Il9zZWxmIj5FbmdhZ2UgTG91aXN2aWxsZTwvYT48L2xpPjwvdWw+PHVsIGNsYXNzPSJtZWdhbWVudV9jb2x1bW4iPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50IiB0aXRsZT0iQ2l0eSBHb3Zlcm5tZW50IiBkYXRhLW5hdmlkPSI2IiB0YXJnZXQ9Il9zZWxmIj5Hb3Zlcm5tZW50PC9hPjx1bCBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMiIgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9ib2FyZHMtY29tbWlzc2lvbnMiIHRpdGxlPSJCb2FyZHMgJmFtcDsgQ29tbWlzc2lvbnMiIGRhdGEtbmF2aWQ9IjE0MCIgdGFyZ2V0PSJfc2VsZiI+Qm9hcmRzICZhbXA7IENvbW1pc3Npb25zPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvY2l0eS1jb3VuY2lsIiB0aXRsZT0iQ2l0eSBDb3VuY2lsIiBkYXRhLW5hdmlkPSIxNTQ5MyIgdGFyZ2V0PSJfc2VsZiI+Q2l0eSBDb3VuY2lsPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMiIHRpdGxlPSJEZXBhcnRtZW50cyIgZGF0YS1uYXZpZD0iMTczIiB0YXJnZXQ9Il9zZWxmIj5EZXBhcnRtZW50czwvYT48L2xpPjwvdWw+PC9saT48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQvaG9tZS1ydWxlLWNoYXJ0ZXIiIHRpdGxlPSJIb21lIFJ1bGUgQ2hhcnRlciIgZGF0YS1uYXZpZD0iODY4IiB0YXJnZXQ9Il9zZWxmIj5Ib21lIFJ1bGUgQ2hhcnRlcjwvYT48L2xpPjwvdWw+PHVsIGNsYXNzPSJtZWdhbWVudV9jb2x1bW4iPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9tZWV0aW5nLXZpZGVvcyIgdGl0bGU9Ik1lZXRpbmcgVmlkZW9zIiBkYXRhLW5hdmlkPSI4NjQiIHRhcmdldD0iX3NlbGYiPk1lZXRpbmcgVmlkZW9zPC9hPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L211bmljaXBhbC1jb2RlIiB0aXRsZT0iTXVuaWNpcGFsIENvZGUiIGRhdGEtbmF2aWQ9Ijk3MTMiIHRhcmdldD0iX2JsYW5rIj5NdW5pY2lwYWwgQ29kZTwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9wdWJsaWMtbm90aWNlcyIgdGl0bGU9IlB1YmxpYyBOb3RpY2VzIiBkYXRhLW5hdmlkPSI5NzE1IiB0YXJnZXQ9Il9zZWxmIj5QdWJsaWMgTm90aWNlczwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwxIiBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9wdWJsaWMtcmVjb3Jkcy1yZXF1ZXN0cyIgdGl0bGU9IlB1YmxpYyBSZWNvcmRzIFJlcXVlc3RzIiBkYXRhLW5hdmlkPSIxNTMyMCIgdGFyZ2V0PSJfc2VsZiI+UHVibGljIFJlY29yZHMgUmVxdWVzdHM8L2E+PC9saT48L3VsPjx1bCBjbGFzcz0ibWVnYW1lbnVfY29sdW1uIj48bGkgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGEgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSIgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQvb3Blbi1nb3Zlcm5tZW50LXRyYW5zcGFyZW5jeSIgdGl0bGU9Ik9wZW4gR292ZXJubWVudCAmYW1wOyBUcmFuc3BhcmVuY3kiIGRhdGEtbmF2aWQ9Ijg2NiIgdGFyZ2V0PSJfc2VsZiI+T3BlbiBHb3Zlcm5tZW50ICZhbXA7IFRyYW5zcGFyZW5jeTwvYT48dWwgY2xhc3M9Im1lZ2FtZW51X2xldmVsMSI+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDIiIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L29wZW4tZ292ZXJubWVudC10cmFuc3BhcmVuY3kvY29kZS1vZi1ldGhpY3MiIHRpdGxlPSJDb2RlIG9mIEV0aGljcyIgZGF0YS1uYXZpZD0iODY3IiB0YXJnZXQ9Il9zZWxmIj5Db2RlIG9mIEV0aGljczwvYT48L2xpPjxsaSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIj48YSBjbGFzcz0ibWVnYW1lbnVfbGV2ZWwyIiBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9vcGVuLWdvdmVybm1lbnQtdHJhbnNwYXJlbmN5L3B1YmxpYy1wYXJ0aWNpcGF0aW9uIiB0aXRsZT0iUHVibGljIFBhcnRpY2lwYXRpb24iIGRhdGEtbmF2aWQ9Ijg2OSIgdGFyZ2V0PSJfc2VsZiI+UHVibGljIFBhcnRpY2lwYXRpb248L2E+PC9saT48L3VsPjwvbGk+PGxpIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiPjxhIGNsYXNzPSJtZWdhbWVudV9sZXZlbDEiIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L3N0YWZmLWRpcmVjdG9yeSIgdGl0bGU9IlN0YWZmIERpcmVjdG9yeSIgZGF0YS1uYXZpZD0iMzkyMSIgdGFyZ2V0PSJfc2VsZiI+U3RhZmYgRGlyZWN0b3J5IDwvYT48L2xpPjwvdWw+PC9kaXY+PC9kaXY+PC9saT48L3VsPjxzY3JpcHQ+CiQoZnVuY3Rpb24gKCkgewogdmFyIG1lbnVDb250YWluZXIgPSAkKCcjbWVudUNvbnRhaW5lcl8zOTYwXzBfMTA2MScpOwogbWVudUNvbnRhaW5lci5maW5kKCcuZHJvcGRvd25tZW51PmxpPmFbZGF0YS1uYXZpZD0iNDI2OCJdJykuY2xvc2VzdCgnbGknKS5hZGRDbGFzcygnYWN0aXZlJyk7Cn0pOwo8L3NjcmlwdD48L25hdj48IS0tc3RhcnRpbmRleC0tPjwvZGl2Pg0KDQoNCjxzY3JpcHQ+DQogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBEcm9wZG93biBNZW51IGRlbGF5IGRpc2FwcGVhcmFuY2Ugb24gbW91c2Ugb3V0DQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KICAgIC8qamF2YXNjcmlwdCB0byBkZWxheSB0aGUgZGlzYXBwZWFyYW5jZSBvZiB0aGUgbWVudSB3aGVuIHRoZSB1c2VyIG1vdXNlcyBvdXQuICBVc2VzIGpxdWVyeSBsaWJyYXJ5LiovDQogICAgJChmdW5jdGlvbiAoKSB7DQogICAgICAgIA0KDQogICAgICAgIHZhciB0aW1lciA9IG51bGw7DQogICAgICAgIHZhciBkZWxheSA9IDgwMDsgLy9jaGFuZ2UgdGhpcyBudW1iZXIgZm9yIHNob3J0ZXIgb3IgbG9uZ2VyIGRlbGF5DQoNCiAgICAgICAgDQogICAgICAgIC8vdXNpbmcgbWVnYW1lbnUNCiAgICAgICAgdmFyIGRyb3Bkb3duY29udGFpbmVyID0gJz4ubWVnYW1lbnVfY29udGFpbmVyJzsNCiAgICAgICAgdmFyIGFjdGl2ZVBhZ2UgPSAkKCIubWFpbm5hdiAuZHJvcGRvd25tZW51ID4gbGkuYWN0aXZlIik7DQogICAgICAgICQoIi5tYWlubmF2ID4gLmRyb3Bkb3dubWVudSA+IGxpIikuaG92ZXJJbnRlbnQoDQoNCiAgICAgICAgICAgIC8vd2hhdCBoYXBwZW5zIG9uIGhvdmVyIG92ZXINCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgLy9lbmQgdGltZXIgYW5kIHN0b3AgaGlkaW5nIGlmIHRoZXkgYXJlIG1vdXNpbmcgYmFjayBpbi4NCiAgICAgICAgICAgICAgICAgaWYgKHRpbWVyICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7DQogICAgICAgICAgICAgICAgICAgICB0aW1lciA9IG51bGw7DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgaG92ZXJlZCBtZW51J3Mgc3ViLW1lbnUNCiAgICAgICAgICAgICAgICAgdmFyICRtZW51ID0gJCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgdmFyICRzdWJtZW51ID0gJCh0aGlzKS5maW5kKGRyb3Bkb3duY29udGFpbmVyKTsNCg0KICAgICAgICAgICAgICAgICAvLyBoaWRlIGFueSBvdGhlciBzdWJtZW51cyB0aGF0IGFyZSBvcGVuDQogICAgICAgICAgICAgICAgICQoJy5tYWlubmF2ID4gLmRyb3Bkb3dubWVudT5saScgKyBkcm9wZG93bmNvbnRhaW5lcikubm90KCRzdWJtZW51KS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOw0KICAgICAgICAgICAgICAgICAkKCcubWFpbm5hdiA+IC5kcm9wZG93bm1lbnUgbGkuYWN0aXZlJykubm90KCRtZW51KS5ub3QoYWN0aXZlUGFnZSkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOw0KDQogICAgICAgICAgICAgICAgIC8vIHNob3cgY3VycmVudCBtZW51DQogICAgICAgICAgICAgICAgICRzdWJtZW51LmNzcygnZGlzcGxheScsICdibG9jaycpOw0KICAgICAgICAgICAgICAgICAkbWVudS5hZGRDbGFzcygnYWN0aXZlJyk7DQogICAgICAgICAgICAgfSwNCg0KICAgICAgICAgICAgLy93aGF0IGhhcHBlbnMgb24gbW91c2Ugb3V0DQogICAgICAgICAgICBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgdmFyICRzdWJtZW51ID0gJCh0aGlzKS5maW5kKGRyb3Bkb3duY29udGFpbmVyKTsNCiAgICAgICAgICAgICAgICB2YXIgJG1lbnUgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgIC8vIGRlbGF5IGRpc2FwcGVhcmFuY2UNCiAgICAgICAgICAgICAgICB2YXIgbW91c2VEZWxheSA9ICQodGhpcykuZGF0YSgibW91c2VEZWxheSIpIHx8IGRlbGF5Ow0KICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7DQogICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgJHN1Ym1lbnUuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsgJG1lbnUubm90KGFjdGl2ZVBhZ2UpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTsgdGltZXIgPSBudWxsOw0KICAgICAgICAgICAgICAgIH0sIG1vdXNlRGVsYXkpOw0KICAgICAgICAgICAgfQ0KICAgICAgICApOw0KDQoNCiAgICAgICAgJCgnYm9keScpLmJpbmQoJ2tleXVwJywgZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA5KSB7DQogICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgaG92ZXJlZCBtZW51J3Mgc3ViLW1lbnUNCiAgICAgICAgICAgICAgICB2YXIgJG1lbnUgPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnbGknKTsNCiAgICAgICAgICAgICAgICBsZXQgaXNKUGFuZWxNZW51VmlzaWJsZSA9ICQoIiNqUGFuZWxNZW51LW1lbnUiKS5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlOw0KICAgICAgICAgICAgICAgIGlmICgkbWVudS5oYXNDbGFzcygnbWVnYW1lbnVfZmlyc3QnKSkgew0KICAgICAgICAgICAgICAgICAgICBpZiAoaXNKUGFuZWxNZW51VmlzaWJsZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgSGlkZU1haW5NZW51Q2hpbGQoJG1lbnUucHJldigpLmZpbmQoJ2xpJykpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHZhciAkc3VibWVudSA9ICRtZW51LmZpbmQoZHJvcGRvd25jb250YWluZXIpOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgYW55IG90aGVyIHN1Ym1lbnVzIHRoYXQgYXJlIG9wZW4NCiAgICAgICAgICAgICAgICAgICAgJCgnLm1haW5uYXYgPiAuZHJvcGRvd25tZW51PmxpJyArIGRyb3Bkb3duY29udGFpbmVyKS5ub3QoJHN1Ym1lbnUpLmNzcygnZGlzcGxheScsICdub25lJyk7DQogICAgICAgICAgICAgICAgICAgICQoJy5tYWlubmF2ID4gLmRyb3Bkb3dubWVudSBsaS5hY3RpdmUnKS5ub3QoJG1lbnUpLm5vdChhY3RpdmVQYWdlKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBjdXJyZW50IG1lbnUNCiAgICAgICAgICAgICAgICAgICAgJHN1Ym1lbnUuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7DQogICAgICAgICAgICAgICAgICAgICRtZW51LmFkZENsYXNzKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChpc0pQYW5lbE1lbnVWaXNpYmxlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvL3N1Yi1tZW51IGhhcyBjaGlsZHJlbg0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtZW51LmNoaWxkcmVuKCd1bCcpLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViTWVudUNvbnRhaW5lciA9ICc+bGkgPiB1bCc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyICRzdWJtZW51Q2hpbGQgPSAkbWVudS5maW5kKCc+dWwnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3VibWVudUNoaWxkLmNzcygnZGlzcGxheScsICdibG9jaycpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZW51LmFkZENsYXNzKCdtZWdhbWVudWxldmVsY2hpbGRtZW51Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1NpZGVOYXYgPSAkbWVudS5oYXNDbGFzcygnc2lkZW5hdl9oYXNjaGlsZHJlbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzU2lkZU5hdikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtZW51LnJlbW92ZUNsYXNzKCdtZWdhbWVudWxldmVsY2hpbGRtZW51Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lbnUuYWRkQ2xhc3MoJ3NpZGVuYXZfZXhwYW5kZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGl0ZW0gPSAkbWVudS5jaGlsZHJlbignLnZpLXNpZGVuYXYtdG9nZ2xlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0uaHRtbCgiLSIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbS5vbigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLmNvZGUudG9Mb3dlckNhc2UoKSA9PSAiZW50ZXIiIHx8IGUuY29kZS50b0xvd2VyQ2FzZSgpID09ICJudW1wYWRlbnRlciIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1NpZGVOYXZFeHBhbmRlZCA9ICRtZW51Lmhhc0NsYXNzKCdzaWRlbmF2X2V4cGFuZGVkJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNTaWRlTmF2RXhwYW5kZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbS5odG1sKCItIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0uYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVudS5jaGlsZHJlbigndWwnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzSXRlbUV4cGFuZCA9ICRpdGVtLmh0bWwoKSA9PSAiLSI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0l0ZW1FeHBhbmQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW0uaHRtbCgiKyIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXRlbS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgIWlzSXRlbUV4cGFuZCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lbnUuY2hpbGRyZW4oJ3VsJykuY3NzKCdkaXNwbGF5JywgaXNJdGVtRXhwYW5kID8gJ25vbmUnIDogJ2Jsb2NrJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1lbnUucmVtb3ZlQ2xhc3MoJ3NpZGVuYXZfZXhwYW5kZWQnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtZW51LnByZXYoKS5oYXNDbGFzcygnbWVnYW1lbnVsZXZlbGNoaWxkbWVudScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkZU1haW5NZW51Q2hpbGQoJG1lbnUucHJldigpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCRtZW51LnBhcmVudCgpLnByZXYoKS5jaGlsZHJlbignbGknKS5oYXNDbGFzcygnbWVnYW1lbnVsZXZlbGNoaWxkbWVudScpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlkZU1haW5NZW51Q2hpbGQoJG1lbnUucGFyZW50KCkucHJldigpLmNoaWxkcmVuKCdsaScpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBmdW5jdGlvbiBIaWRlTWFpbk1lbnVDaGlsZChlKSB7DQogICAgICAgICAgICAkKGUpLmVhY2goZnVuY3Rpb24gKGluZGV4LGNoaWxkKSB7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCQoY2hpbGQpLmNoaWxkcmVuKCd1bCcpLmVhY2goZnVuY3Rpb24gKHN1YkluZGV4LHN1YkNoaWxkKSB7DQogICAgICAgICAgICAgICAgICAgIEhpZGVNYWluTWVudUNoaWxkKCQoc3ViQ2hpbGQpLmNoaWxkcmVuKCdsaScpKTsNCiAgICAgICAgICAgICAgICB9KSk7ICANCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgJChlKS5jaGlsZHJlbigndWwnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpOw0KICAgICAgICAgICAgJChlKS5yZW1vdmVDbGFzcygnbWVnYW1lbnVsZXZlbGNoaWxkbWVudScpOw0KICAgICAgICB9DQoNCiAgICAgICAgDQogICAgfSk7DQo8L3NjcmlwdD4NCg0KPHNjcmlwdD4NCiAgICAvLyQoZnVuY3Rpb24gKCkgDQogICAgew0KICAgICAgICB2YXIgbWVudUNvbnRhaW5lcklEID0gIm1lbnVDb250YWluZXJfMzk2MF8wXzEwNjEiOw0KICAgICAgICB2YXIgbWVudUNvbnRhaW5lciA9ICQoIiMiICsgbWVudUNvbnRhaW5lcklEKTsNCiAgICAgICAgDQogICAgICAgIGZ1bmN0aW9uIGlzSUUodXNlckFnZW50KSB7DQogICAgICAgICAgICB1c2VyQWdlbnQgPSB1c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudDsNCiAgICAgICAgICAgIHJldHVybiB1c2VyQWdlbnQuaW5kZXhPZigiTVNJRSAiKSA+IC0xIHx8IHVzZXJBZ2VudC5pbmRleE9mKCJUcmlkZW50LyIpID4gLTE7DQogICAgICAgIH0NCg0KICAgICAgICBmdW5jdGlvbiBpc0lFOSh1c2VyQWdlbnQpIHsNCiAgICAgICAgICAgIHVzZXJBZ2VudCA9IHVzZXJBZ2VudCB8fCBuYXZpZ2F0b3IudXNlckFnZW50Ow0KICAgICAgICAgICAgcmV0dXJuIHVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIDkiKSA+IC0xOw0KICAgICAgICB9DQoNCiAgICAgICAgZnVuY3Rpb24gaXNUb3VjaFNjcmVlbkV2ZW50KGV2ZW50KSB7DQogICAgICAgICAgICB2YXIgX2lzVG91Y2hTY3JlZW4gPSBmYWxzZTsNCiAgICAgICAgICAgIGlmICgib250b3VjaHN0YXJ0IiBpbiB3aW5kb3cpIHsNCiAgICAgICAgICAgICAgICBfaXNUb3VjaFNjcmVlbiA9IHRydWU7DQogICAgICAgICAgICB9IGVsc2UgaWYgKCJvbnBvaW50ZXJkb3duIiBpbiB3aW5kb3cpIHsNCiAgICAgICAgICAgICAgICBfaXNUb3VjaFNjcmVlbiA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQucG9pbnRlclR5cGUgPT0gInRvdWNoIjsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93Lk1TUG9pbnRlckV2ZW50KSB7DQogICAgICAgICAgICAgICAgX2lzVG91Y2hTY3JlZW4gPSBldmVudC5vcmlnaW5hbEV2ZW50LnBvaW50ZXJUeXBlID09IGV2ZW50Lm9yaWdpbmFsRXZlbnQuTVNQT0lOVEVSX1RZUEVfVE9VQ0g7IC8vIDIgOyBodHRwOi8vYmxvZ3MubXNkbi5jb20vYi9pZS9hcmNoaXZlLzIwMTEvMDkvMjAvdG91Y2gtaW5wdXQtZm9yLWllMTAtYW5kLW1ldHJvLXN0eWxlLWFwcHMuYXNweA0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBfaXNUb3VjaFNjcmVlbjsNCiAgICAgICAgfQ0KDQogICAgICAgIHZhciBfaXNJRSA9IGlzSUUoKTsNCiAgICAgICAgdmFyIF9pc0lFOSA9IGlzSUU5KCk7DQogICAgICAgIHZhciBpc01lZ2FNZW51ID0gJCgnLm1lZ2FtZW51X2ZpcnN0JywgbWVudUNvbnRhaW5lcikubGVuZ3RoID4gMDsNCiAgICAgICAgdmFyIGN1cnJlbnRNZW51ID0gJCgnPiB1bC5kcm9wZG93bm1lbnUgPiBsaS5hY3RpdmUnLCBtZW51Q29udGFpbmVyKTsNCg0KICAgICAgICAkKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmIChjdXJyZW50TWVudS5sZW5ndGggPT0gMCkNCiAgICAgICAgICAgICAgICBjdXJyZW50TWVudSA9ICQoJz4gdWwuZHJvcGRvd25tZW51ID4gbGkuYWN0aXZlJywgbWVudUNvbnRhaW5lcik7DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmICgoIm9udG91Y2hzdGFydCIgaW4gd2luZG93ICAgLy8gQ2hyb21lICYgU2FmYXJpIChJT1MpICYmIEZpcmVmb3gNCiAgICAgICAgIHx8ICJvbnBvaW50ZXJkb3duIiBpbiB3aW5kb3cgICAvLyBJRSAxMSANCiAgICAgICAgIHx8IHdpbmRvdy5NU1BvaW50ZXJFdmVudCAgICAgICAvLyBJRSAxMA0KICAgICAgICAgKSAmJiAoJCh3aW5kb3cpLndpZHRoKCkgPiA2NDgpKSB7DQogICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gIm9udG91Y2hzdGFydCIgaW4gd2luZG93ID8gInRvdWNoc3RhcnQiDQogICAgICAgICAgICAgICAgICAgICAgICAgIDogIm9ucG9pbnRlcmRvd24iIGluIHdpbmRvdyA/ICJwb2ludGVyZG93biINCiAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cuTVNQb2ludGVyRXZlbnQgPyAiTVNQb2ludGVyRG93biINCiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIjsNCiAgICAgICAgICAgIGlmIChldmVudE5hbWUubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICQoJz4gdWwuZHJvcGRvd25tZW51ICBsaT5hW2RhdGEtbmF2aWRdJywgbWVudUNvbnRhaW5lcikuYmluZChldmVudE5hbWUsIGZ1bmN0aW9uIChldmVudCkgew0KDQogICAgICAgICAgICAgICAgICAgIGlmIChpc1RvdWNoU2NyZWVuRXZlbnQoZXZlbnQpID09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50TGV2ZWxBbmNob3IgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgY3VycmVudExldmVMaSA9IGN1cnJlbnRMZXZlbEFuY2hvci5jbG9zZXN0KCJsaSIpOw0KICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3RMZXZlbExpID0gY3VycmVudExldmVsQW5jaG9yLmNsb3Nlc3QoImxpW2lkXj0nZHJvcGRvd25yb290aXRlbSddIik7DQogICAgICAgICAgICAgICAgICAgIHZhciBmaXJzdExldmVsQW5jaG9yID0gZmlyc3RMZXZlbExpLmZpbmQoIj5hW2RhdGEtbmF2aWRdIik7DQogICAgICAgICAgICAgICAgICAgIHZhciBpbkZpcnN0TGV2ZWwgPSBjdXJyZW50TGV2ZWxBbmNob3JbMF0gPT0gZmlyc3RMZXZlbEFuY2hvclswXTsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgaGFzU3ViTWVudSA9IGN1cnJlbnRMZXZlbEFuY2hvci5uZXh0KCJ1bCxkaXYiKS5sZW5ndGggPiAwOw0KICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU3ViTWVudSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCJsaSIpLmRhdGEoIm1vdXNlRGVsYXkiLCAxKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVudSBpcyBub3Qgc2VsZWN0ZWQNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RMZXZlbExpLmhhc0NsYXNzKCd0b3VjaC1hY3RpdmUnKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoImhyZWYiKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoImRhdGEtaHJlZiIsICQodGhpcykuYXR0cigiaHJlZiIpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCJocmVmIiwgImphdmFzY3JpcHQ6dm9pZCgwKTsiKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChtZW51Q29udGFpbmVyKS5maW5kKCcudG91Y2gtYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ3RvdWNoLWFjdGl2ZScpLm5vdChjdXJyZW50TWVudSkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMZXZlbExpLmFkZENsYXNzKCd0b3VjaC1hY3RpdmUgYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudExldmVsQW5jaG9yLmFkZENsYXNzKCd0b3VjaC1hY3RpdmUgYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE1lbnUuYWRkQ2xhc3MoImFjdGl2ZSIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnIGxpOm5vdCgudG91Y2gtYWN0aXZlKScsIG1lbnVDb250YWluZXIpLm5vdChmaXJzdExldmVsTGkpLnJlbW92ZUNsYXNzKCdfY3VycmVudCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyBsaTpub3QoLnRvdWNoLWFjdGl2ZSkgbGknLCBtZW51Q29udGFpbmVyKS5ub3QoY3VycmVudExldmVMaSkucmVtb3ZlQ2xhc3MoJ19jdXJyZW50Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc+IHVsLmRyb3Bkb3dubWVudSA+IGxpOm5vdCgudG91Y2gtYWN0aXZlKSA+IGFbZGF0YS1uYXZpZF0nLCBtZW51Q29udGFpbmVyKS5uZXh0KCkuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc+IHVsLmRyb3Bkb3dubWVudSA+IGxpLnRvdWNoLWFjdGl2ZSA+IGFbZGF0YS1uYXZpZF0nLCBtZW51Q29udGFpbmVyKS5uZXh0KCkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbnUgaXMgc2VsZWN0ZWQNCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbkZpcnN0TGV2ZWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uIGNsaWNrYWJsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExldmVsQW5jaG9yLmF0dHIoJ2hyZWYnKSA9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaGFzIGNsYXNzIHRvdWNoLWFjdGl2ZSBhbmQgbm8gbGluaw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NBbmRIaWRlTWVudSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgkKHRoaXMpLmF0dHIoImRhdGEtaHJlZiIpKSB7IC8vY2xpY2thYmxlLCBidXQgaHJlZiBoYXZlIGJlZW4gbW92ZWQgdG8gZGF0YS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiaHJlZiIsICQodGhpcykuYXR0cigiZGF0YS1ocmVmIikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNNZWdhTWVudSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudExldmVMaS5oYXNDbGFzcygndG91Y2gtYWN0aXZlJykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoImhyZWYiKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiZGF0YS1ocmVmIiwgJCh0aGlzKS5hdHRyKCJocmVmIikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiaHJlZiIsICJqYXZhc2NyaXB0OnZvaWQoMCk7Iik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpcnN0TGV2ZWxMaSkuZmluZCgnLnRvdWNoLWFjdGl2ZScpLnJlbW92ZUNsYXNzKCd0b3VjaC1hY3RpdmUnKS5ub3QoY3VycmVudE1lbnUpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMZXZlTGkucGFyZW50KCkuY2hpbGRyZW4oImxpLl9jdXJyZW50IikucmVtb3ZlQ2xhc3MoIl9jdXJyZW50Iik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGV2ZUxpLmFkZENsYXNzKCd0b3VjaC1hY3RpdmUgYWN0aXZlIF9jdXJyZW50Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMZXZlbEFuY2hvci5hZGRDbGFzcygndG91Y2gtYWN0aXZlIGFjdGl2ZScpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyQoJyBsaTpub3QoLnRvdWNoLWFjdGl2ZSknLCBtZW51Q29udGFpbmVyKS5ub3QoZmlyc3RMZXZlbExpKS5yZW1vdmVDbGFzcygnX2N1cnJlbnQnKTsgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyQoJyBsaTpub3QoLnRvdWNoLWFjdGl2ZSkgbGknLCBtZW51Q29udGFpbmVyKS5ub3QoY3VycmVudExldmVMaSkucmVtb3ZlQ2xhc3MoJ19jdXJyZW50Jyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyBsaTpub3QoLnRvdWNoLWFjdGl2ZSkgPiBhW2RhdGEtbmF2aWRdJywgY3VycmVudExldmVMaS5wYXJlbnQoKSkubmV4dCgpLmNzcygnZGlzcGxheScsICdub25lJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc+IGxpLnRvdWNoLWFjdGl2ZSA+IGFbZGF0YS1uYXZpZF0nLCBjdXJyZW50TGV2ZUxpLnBhcmVudCgpKS5uZXh0KCkuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExldmVsQW5jaG9yLmF0dHIoJ2hyZWYnKSA9PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2hhcyBjbGFzcyB0b3VjaC1hY3RpdmUgYW5kIG5vIGxpbmsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDbGFzc0FuZEhpZGVNZW51KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoJCh0aGlzKS5hdHRyKCJkYXRhLWhyZWYiKSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cigiaHJlZiIsICQodGhpcykuYXR0cigiZGF0YS1ocmVmIikpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQoNCg0KICAgICAgICBmdW5jdGlvbiByZW1vdmVDbGFzc0FuZEhpZGVNZW51KCkgew0KICAgICAgICAgICAgJChtZW51Q29udGFpbmVyKS5maW5kKCdhLnRvdWNoLWFjdGl2ZSwgbGkudG91Y2gtYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ3RvdWNoLWFjdGl2ZSBhY3RpdmUnKTsNCiAgICAgICAgICAgICQoJz4gdWwuZHJvcGRvd25tZW51ID4gbGkgPiBhW2RhdGEtbmF2aWRdJywgbWVudUNvbnRhaW5lcikubmV4dCgpLmNzcygnZGlzcGxheScsICdub25lJyk7DQogICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBjaGFuZ2UgdGhlIG1lbnUgaXRlbSwgd2Ugc2hvdWxkIGtlZXAgdGhlIG9sZCBvbmUuDQogICAgICAgICAgICBpZiAoJCgnPiB1bC5kcm9wZG93bm1lbnUgPiBsaS5hY3RpdmUnLCBtZW51Q29udGFpbmVyKS5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgIGN1cnJlbnRNZW51LmFkZENsYXNzKCJhY3RpdmUiKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgICQoJ2JvZHknKS5iaW5kKGV2ZW50TmFtZSwgZnVuY3Rpb24gKGV2ZW50KSB7DQogICAgICAgICAgICBpZiAoaXNUb3VjaFNjcmVlbkV2ZW50KGV2ZW50KSA9PSBmYWxzZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCEkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnbGkudG91Y2gtYWN0aXZlJykubGVuZ3RoKSB7DQogICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3NBbmRIaWRlTWVudSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQogICAgLy8pOw0KPC9zY3JpcHQ+DQoNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8IS0tc3RhcnRpbmRleC0tPg0KICAgICAgICAgICAgICAgIDwhLS0hIVdpZGdldEVuZC0tPg0KDQogICAgDQo8L2Rpdj4NCg0KICAgIA0KPGRpdiBpZD0iQ29sdW1uVXNlckNvbnRyb2wyIiBjbGFzcz0iY29sdW1uICAgbGVmdF9jb2wgICIgID4NCiAgICA8IS0tISFXaWRnZXRTdGFydCwgdmktb3JkZXJkYXRhPSIwIiAgdmktaGlkZW9ubW9iaWxlPSJmYWxzZSIgdmktd2lkZ2V0aW5zdGFuY2VkYXRhPSIyIldpZGdldFN0YXJ0ISEtLT4gICAgDQoNCiAgICAgICAgICAgICAgICA8IS0tc3RvcGluZGV4LS0+DQogICAgICAgICAgICAgICAgDQoNCjxuYXYgaWQ9J2xlZnROYXZfMl8wXzEwNjEnIGNsYXNzPSdub2NvbnRlbnQgc2lkZW5hdiBtb2JpbGVfbGlzdCB2aS1zaWRlbmF2LWRlc2t0b3AgICAnPg0KICAgIDwhLS1zdG9waW5kZXgtLT48aDIgY2xhc3M9Im1vYmlsZV9vbmx5IG1vYmlsZV9oZWFkZXIiPkp1bXAgdG8gc3VicGFnZS4uLjwvaDI+DQogICAgPHVsPjxsaSBjbGFzcz0ic2lkZW5hdl9leHBhbmRlZCBzaWRlbmF2X2hhc2NoaWxkcmVuIj48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlJyB0YXJnZXQ9J19zZWxmJz5QYXJrcywgUmVjcmVhdGlvbiBhbmQgT3BlbiBTcGFjZTwvYT48YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCkiIHRpdGxlPSJFeHBhbmQvQ29sbGFwc2Ugc3VicGFnZXMgdW5kZXIgU2lkZW5hdiBJdGVtIHdpdGggQ2hpbGRyZW4iIGNsYXNzPSJ2aS1zaWRlbmF2LXRvZ2dsZSIgYXJpYS1leHBhbmRlZD10cnVlIGFyaWEtbGFiZWw9InNpZGUtbmF2aWdhdGlvbiI+LTwvYT48dWw+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvY2l0eS1wcm9qZWN0cycgdGFyZ2V0PSdfc2VsZic+UHJvamVjdCBVcGRhdGVzPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvYWRvcHQtYW4tb3Blbi1zcGFjZS1wYXJrLWdvbGYtdHJhaWwtcHJvZ3JhbScgdGFyZ2V0PSdfc2VsZic+QWRvcHQgQW4gT3BlbiBTcGFjZSwgUGFyaywgR29sZiwgVHJhaWwgUHJvZ3JhbTwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL2JvYXQtcGVybWl0cy1mb3ItaGFycGVyLWxha2UnIHRhcmdldD0nX3NlbGYnPkJvYXQgUGVybWl0cyBmb3IgSGFycGVyIExha2U8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9jZW1ldGVyeScgdGFyZ2V0PSdfc2VsZic+Q2VtZXRlcnkgPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvY29hbC1jcmVlay1nb2xmLWNvdXJzZScgdGFyZ2V0PSdfc2VsZic+Q29hbCBDcmVlayBHb2xmIENvdXJzZTwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xpdmluZy1pbi1sb3Vpc3ZpbGxlL3Jlc2lkZW50cy9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL2Ryb25lLXJlZ3VsYXRpb25zJyB0YXJnZXQ9J19zZWxmJz5Ecm9uZSBSZWd1bGF0aW9uczwvYT48L2xpPjxsaSBjbGFzcz0ic2lkZW5hdl9oYXNjaGlsZHJlbiI+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9mb3Jlc3RyeS1wcm9ncmFtJyB0YXJnZXQ9J19zZWxmJz5Gb3Jlc3RyeSBQcm9ncmFtICA8L2E+PGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKDApIiB0aXRsZT0iRXhwYW5kL0NvbGxhcHNlIHN1YnBhZ2VzIHVuZGVyIFNpZGVuYXYgSXRlbSB3aXRoIENoaWxkcmVuIiBjbGFzcz0idmktc2lkZW5hdi10b2dnbGUiIGFyaWEtZXhwYW5kZWQ9ZmFsc2UgYXJpYS1sYWJlbD0ic2lkZS1uYXZpZ2F0aW9uIj4rPC9hPjx1bD48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9mb3Jlc3RyeS1wcm9ncmFtL2JyYW5jaC1yZWN5Y2xlLXNpdGUnIHRhcmdldD0nX3NlbGYnPkJyYW5jaCBSZWN5Y2xlIFNpdGU8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9mb3Jlc3RyeS1wcm9ncmFtL2NlcnRpZmllZC1hcmJvcmlzdHMnIHRhcmdldD0nX3NlbGYnPkNlcnRpZmllZCBBcmJvcmlzdHM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9mb3Jlc3RyeS1wcm9ncmFtL2VtZXJhbGQtYXNoLWJvcmVyLWluZm9ybWF0aW9uJyB0YXJnZXQ9J19zZWxmJz5FbWVyYWxkIEFzaCBCb3JlciBJbmZvcm1hdGlvbjwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL2ZvcmVzdHJ5LXByb2dyYW0vaXBzLWJlZXRsZScgdGFyZ2V0PSdfc2VsZic+SVBTIEJlZXRsZTwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL2ZvcmVzdHJ5LXByb2dyYW0vd2ludGVyLXRyZWUtd2F0ZXJpbmctZ3VpZGVsaW5lcycgdGFyZ2V0PSdfc2VsZic+V2ludGVyIFRyZWUgV2F0ZXJpbmcgR3VpZGVsaW5lczwvYT48L2xpPjwvdWw+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9mdW5kaW5nLW9mLW9wZW4tc3BhY2UtYW5kLXBhcmtzJyB0YXJnZXQ9J19zZWxmJz5GdW5kaW5nIG9mIE9wZW4gU3BhY2UgYW5kIFBhcmtzPC9hPjwvbGk+PGxpIGNsYXNzPSJzaWRlbmF2X2hhc2NoaWxkcmVuIj48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xpdmluZy1pbi1sb3Vpc3ZpbGxlL3Jlc2lkZW50cy9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL2hvcnRpY3VsdHVyZScgdGFyZ2V0PSdfc2VsZic+SG9ydGljdWx0dXJlPC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgdGl0bGU9IkV4cGFuZC9Db2xsYXBzZSBzdWJwYWdlcyB1bmRlciBTaWRlbmF2IEl0ZW0gd2l0aCBDaGlsZHJlbiIgY2xhc3M9InZpLXNpZGVuYXYtdG9nZ2xlIiBhcmlhLWV4cGFuZGVkPWZhbHNlIGFyaWEtbGFiZWw9InNpZGUtbmF2aWdhdGlvbiI+KzwvYT48dWw+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbGl2aW5nLWluLWxvdWlzdmlsbGUvcmVzaWRlbnRzL2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvaG9ydGljdWx0dXJlL2dhcmRlbmluZy1mb3ItcG9sbGluYXRvcnMnIHRhcmdldD0nX3NlbGYnPkdhcmRlbmluZyBmb3IgUG9sbGluYXRvcnM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9ob3J0aWN1bHR1cmUveGVyaXNjYXBlLWdhcmRlbmluZycgdGFyZ2V0PSdfc2VsZic+WGVyaXNjYXBlIEdhcmRlbmluZzwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL2hvcnRpY3VsdHVyZS9pbnRlZ3JhdGVkLXBlc3QtbWFuYWdlbWVudCcgdGFyZ2V0PSdfc2VsZic+SW50ZWdyYXRlZCBQZXN0IE1hbmFnZW1lbnQ8L2E+PC9saT48L3VsPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvaW50ZWdyYXRlZC13ZWVkLW1hbmFnZW1lbnQtcGxhbicgdGFyZ2V0PSdfc2VsZic+SW50ZWdyYXRlZCBXZWVkIE1hbmFnZW1lbnQgUGxhbjwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL29wZW4tc3BhY2UtZGl2aXNpb24vbWVtb3JpYWwtdHJlZS1iZW5jaC1wcm9ncmFtJyB0YXJnZXQ9J19zZWxmJz5NZW1vcmlhbCBCZW5jaCAmYW1wOyBUcmVlIFByb2dyYW08L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9tb3NxdWl0by1jb250cm9sLXNlcnZpY2VzJyB0YXJnZXQ9J19zZWxmJz5Nb3NxdWl0byBDb250cm9sIFNlcnZpY2VzPC9hPjwvbGk+PGxpIGNsYXNzPSJzaWRlbmF2X2hhc2NoaWxkcmVuIj48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL29wZW4tc3BhY2UtZGl2aXNpb24nIHRhcmdldD0nX3NlbGYnPk9wZW4gU3BhY2UgRGl2aXNpb24gPC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgdGl0bGU9IkV4cGFuZC9Db2xsYXBzZSBzdWJwYWdlcyB1bmRlciBTaWRlbmF2IEl0ZW0gd2l0aCBDaGlsZHJlbiIgY2xhc3M9InZpLXNpZGVuYXYtdG9nZ2xlIiBhcmlhLWV4cGFuZGVkPWZhbHNlIGFyaWEtbGFiZWw9InNpZGUtbmF2aWdhdGlvbiI+KzwvYT48dWw+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2Uvb3Blbi1zcGFjZS1wcm9wZXJ0aWVzJyB0YXJnZXQ9J19zZWxmJz5PcGVuIFNwYWNlIFByb3BlcnRpZXM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL3RyYWlscy1hbmQtbWFwcycgdGFyZ2V0PSdfc2VsZic+VHJhaWxzIGFuZCBNYXBzPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2Uvb3Blbi1zcGFjZS1kaXZpc2lvbi9wZXJtaXRzLXJ1bGVzLXJlZ3VsYXRpb25zJyB0YXJnZXQ9J19zZWxmJz5QZXJtaXRzLCBSdWxlcywgJmFtcDsgUmVndWxhdGlvbnM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL2RvZy1vZmYtbGVhc2gtYXJlYXMnIHRhcmdldD0nX3NlbGYnPkRvZyBPZmYtTGVhc2ggQXJlYXMgPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2Uvb3Blbi1zcGFjZS1kaXZpc2lvbi9vcGVuLXNwYWNlLWV2ZW50cycgdGFyZ2V0PSdfYmxhbmsnPk9wZW4gU3BhY2UgRXZlbnRzPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2Uvb3Blbi1zcGFjZS1kaXZpc2lvbi9lbmdhZ2Utd2l0aC1vcGVuLXNwYWNlJyB0YXJnZXQ9J19zZWxmJz5FeHBsb3JlIE9wZW4gU3BhY2U8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL29wZW4tc3BhY2Utdm9sdW50ZWVyLW9wcG9ydHVuaXRpZXMnIHRhcmdldD0nX3NlbGYnPk9wZW4gU3BhY2UgVm9sdW50ZWVyIE9wcG9ydHVuaXRpZXM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS93aWxkbGlmZS1pbi1sb3Vpc3ZpbGxlJyB0YXJnZXQ9J19zZWxmJz5XaWxkbGlmZSBpbiBMb3Vpc3ZpbGxlPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2Uvb3Blbi1zcGFjZS1kaXZpc2lvbi9sYW5kLW1hbmFnZW1lbnQnIHRhcmdldD0nX3NlbGYnPkxhbmQgTWFuYWdlbWVudDwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL29wZW4tc3BhY2UtZGl2aXNpb24vc21vb3RoLWJyb29tLXN0dWR5JyB0YXJnZXQ9J19zZWxmJz5TbW9vdGggQnJvbWUgU3R1ZHk8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL3dlZWQtbWFuYWdlbWVudCcgdGFyZ2V0PSdfc2VsZic+V2VlZCBNYW5hZ2VtZW50PC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2Uvb3Blbi1zcGFjZS1kaXZpc2lvbi9tZW1vcmlhbC10cmVlLWJlbmNoLXByb2dyYW0tNzAyJyB0YXJnZXQ9J19zZWxmJz5NZW1vcmlhbCBCZW5jaCAmYW1wOyBUcmVlIFByb2dyYW08L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL29wZW4tc3BhY2UtYWR2aXNvcnktYm9hcmQnIHRhcmdldD0nX3NlbGYnPk9wZW4gU3BhY2UgQWR2aXNvcnkgQm9hcmQ8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL2NvbnRhY3QtdXMnIHRhcmdldD0nX3NlbGYnPkNvbnRhY3QgVXM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL29wZW4tc3BhY2UtbWlzc2lvbi12aXNpb24nIHRhcmdldD0nX3NlbGYnPk9wZW4gU3BhY2UgTWlzc2lvbi9WaXNpb248L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL3RyYWlsLWNsb3N1cmVzJyB0YXJnZXQ9J19zZWxmJz5UcmFpbCBDbG9zdXJlczwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL29wZW4tc3BhY2UtZGl2aXNpb24vd2lsZGZpcmUtcmlzay1hc3Nlc3NtZW50JyB0YXJnZXQ9J19zZWxmJz5XaWxkZmlyZSBSaXNrIEFzc2Vzc21lbnQ8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9vcGVuLXNwYWNlLWRpdmlzaW9uL2dyYXppbmcnIHRhcmdldD0nX3NlbGYnPkdyYXppbmc8L2E+PC9saT48L3VsPjwvbGk+PGxpIGNsYXNzPSJzaWRlbmF2X2V4cGFuZGVkIHNpZGVuYXZfaGFzY2hpbGRyZW4iPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvcGFya3MtZGl2aXNpb24nIHRhcmdldD0nX3NlbGYnPlBhcmtzIERpdmlzaW9uPC9hPjxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKSIgdGl0bGU9IkV4cGFuZC9Db2xsYXBzZSBzdWJwYWdlcyB1bmRlciBTaWRlbmF2IEl0ZW0gd2l0aCBDaGlsZHJlbiIgY2xhc3M9InZpLXNpZGVuYXYtdG9nZ2xlIiBhcmlhLWV4cGFuZGVkPXRydWUgYXJpYS1sYWJlbD0ic2lkZS1uYXZpZ2F0aW9uIj4tPC9hPjx1bD48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9wYXJrcy1kaXZpc2lvbi9hYm91dC10aGUtcGFya3MtZGl2aXNpb24nIHRhcmdldD0nX3NlbGYnPkFib3V0IExvdWlzdmlsbGUgUGFya3M8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9wYXJrcy1kaXZpc2lvbi9iZWUtY2l0eScgdGFyZ2V0PSdfc2VsZic+QmVlIENpdHk8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9wYXJrcy1kaXZpc2lvbi9jb250YWN0LXBhcmtzLWRlcGFydG1lbnQnIHRhcmdldD0nX3NlbGYnPkNvbnRhY3QgUGFya3MgRGl2aXNpb248L2E+PC9saT48bGkgY2xhc3M9InNpZGVuYXZfY3VycmVudCI+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9wYXJrcy1kaXZpc2lvbi9kb2ctb2ZmLWxlYXNoLWFyZWFzJyB0YXJnZXQ9J19zZWxmJz5Eb2cgT2ZmLUxlYXNoIEFyZWFzIDwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL3BhcmtzLWRpdmlzaW9uL3BhcmstYW1lbml0aWVzLWFuZC1zaGVsdGVyLXJlbnRhbHMnIHRhcmdldD0nX3NlbGYnPlBhcmsgQW1lbml0aWVzIEFuZCBTaGVsdGVyIFJlbnRhbHM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9wYXJrcy1kaXZpc2lvbi90cmFpbHMtYW5kLW1hcHMnIHRhcmdldD0nX3NlbGYnPlRyYWlscyBhbmQgTWFwczwvYT48L2xpPjxsaT48YSBocmVmPSdodHRwczovL3d3dy5sb3Vpc3ZpbGxlY28uZ292L2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL3BhcmtzLWRpdmlzaW9uL21lbW9yaWFsLXRyZWUtYmVuY2gtcHJvZ3JhbScgdGFyZ2V0PSdfc2VsZic+TWVtb3JpYWwgQmVuY2ggJmFtcDsgVHJlZSBQcm9ncmFtPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvcGFya3MtZGl2aXNpb24vd2VlZC1tYW5hZ2VtZW50LWluLXBhcmtzJyB0YXJnZXQ9J19zZWxmJz5XZWVkIE1hbmFnZW1lbnQgaW4gUGFya3M8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9sb2NhbC1nb3Zlcm5tZW50L2dvdmVybm1lbnQvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9wYXJrcy1kaXZpc2lvbi9wYXJrLXBlcm1pdHMtYW5kLWFwcGxpY2F0aW9ucycgdGFyZ2V0PSdfc2VsZic+UGFyayBQZXJtaXRzIGFuZCBBcHBsaWNhdGlvbnM8L2E+PC9saT48L3VsPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvcGFyay1zaGVsdGVyLXJlbnRhbHMnIHRhcmdldD0nX3NlbGYnPlBhcmsgU2hlbHRlciBSZW50YWxzPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvcGFyay1hbmQtcmVjcmVhdGlvbi1tb250aC1hZHZlbnR1cmVzLXdpdGgtbG91JyB0YXJnZXQ9J19zZWxmJz5QYXJrIGFuZCBSZWNyZWF0aW9uIE1vbnRoOiBBZHZlbnR1cmVzIHdpdGggTG91PC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvcmVjcmVhdGlvbi1zZXJ2aWNlcycgdGFyZ2V0PSdfc2VsZic+UmVjcmVhdGlvbiAmYW1wOyBTZW5pb3IgQ2VudGVyPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvdHJhaWxzLWFuZC1tYXBzJyB0YXJnZXQ9J19zZWxmJz5UcmFpbHMgYW5kIE1hcHM8L2E+PC9saT48bGk+PGEgaHJlZj0naHR0cHM6Ly93d3cubG91aXN2aWxsZWNvLmdvdi9saXZpbmctaW4tbG91aXN2aWxsZS9yZXNpZGVudHMvZGVwYXJ0bWVudHMvcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZS9yZXBvcnQtYS1wcm9ibGVtJyB0YXJnZXQ9J19zZWxmJz5SZXBvcnQgYSBQcm9ibGVtPC9hPjwvbGk+PGxpPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UvY29udGFjdCcgdGFyZ2V0PSdfc2VsZic+Q29udGFjdDwvYT48L2xpPjwvdWw+PC9saT48L3VsPjwhLS1zdGFydGluZGV4LS0+DQo8L25hdj4NCjxzY3JpcHQ+DQogICAgJChmdW5jdGlvbiAoKSB7DQogICAgICAgIC8vdGVzdCBpZiBpdCBpcyBtb2JpbGUgdmlldyBvciBub3QgYW5kIGFkZCBjbGFzc2VzIGFjY29yZGluZ2x5LiBOZWVkZWQgYmVjYXVzZSBkaWZmZXJlbnQgc2l0ZXMgdXNlIGRpZmZlcmVudCBicmVha3BvaW50cyBmb3IgbW9iaWxlDQogICAgICAgIGlmICgkKCcuc2lkZW5hdiAubW9iaWxlX29ubHknKS5pcygnOnZpc2libGUnKSkgew0KICAgICAgICAgICAgJCgnLnNpZGVuYXYnKS5hZGRDbGFzcygndmktc2lkZW5hdi1tb2JpbGUnKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICQoJy5zaWRlbmF2JykuYWRkQ2xhc3MoJ3ZpLXNpZGVuYXYtZGVza3RvcCcpOw0KICAgICAgICB9DQogICAgICAgIC8vbmVlZCB0byBhbHNvIGNoZWNrIGZvciBtb2JpbGUgdmlldyBvbiByZXNpemUgYW5kIGNoYW5nZSBjbGFzc2VzIGlmIG5lZWRlZA0KICAgICAgICB2YXIgc2lkZW5hdlJlc2l6ZVRpbWVyOw0KDQogICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKGUpIHsNCg0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNpZGVuYXZSZXNpemVUaW1lcik7DQogICAgICAgICAgICBzaWRlbmF2UmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCg0KICAgICAgICAgICAgICAgIGlmICgkKCcuc2lkZW5hdiAubW9iaWxlX29ubHknKS5pcygnOnZpc2libGUnKSkgew0KICAgICAgICAgICAgICAgICAgICAkKCcudmktc2lkZW5hdi1kZXNrdG9wJykuYWRkQ2xhc3MoJ3ZpLXNpZGVuYXYtbW9iaWxlJykucmVtb3ZlQ2xhc3MoJ3ZpLXNpZGVuYXYtZGVza3RvcCcpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICQoJy52aS1zaWRlbmF2LW1vYmlsZScpLmFkZENsYXNzKCd2aS1zaWRlbmF2LWRlc2t0b3AnKS5yZW1vdmVDbGFzcygndmktc2lkZW5hdi1tb2JpbGUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LCAyNTApOw0KDQogICAgICAgIH0pOw0KDQogICAgICAgIC8vZXhwYW5kL2NvbGxhcHNlIGZ1bmN0aW9uDQogICAgICAgICQoIiNsZWZ0TmF2XzJfMF8xMDYxIC52aS1zaWRlbmF2LXRvZ2dsZSIpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBpdGVtID0gJCh0aGlzKSwNCiAgICAgICAgICAgICAgICBwYXJlbnQgPSBpdGVtLnBhcmVudCgibGkiKTsNCg0KICAgICAgICAgICAgaWYgKHBhcmVudC5sZW5ndGgpIHsNCiAgICAgICAgICAgICAgICB2YXIgaGFzU3ViTWVudSA9IHBhcmVudC5oYXNDbGFzcygic2lkZW5hdl9leHBhbmRlZCIpOw0KICAgICAgICAgICAgICAgIHZhciBpc01vYmlsZVNpZGVOYXYgPSBwYXJlbnQuaGFzQ2xhc3MoIm1lZ2FtZW51bGV2ZWxjaGlsZG1lbnUiKTsNCiAgICAgICAgICAgICAgICBpZiAoaGFzU3ViTWVudSkgew0KICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2xhc3MoInNpZGVuYXZfZXhwYW5kZWQiKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYWRkQ2xhc3MoInNpZGVuYXZfZXhwYW5kZWQiKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaXRlbS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwgaGFzU3ViTWVudSA/IGZhbHNlIDogdHJ1ZSk7DQogICAgICAgICAgICAgICAgaWYgKGlzTW9iaWxlU2lkZU5hdikgew0KICAgICAgICAgICAgICAgICAgICBpdGVtLnNpYmxpbmdzKCJ1bCIpLmNzcygnZGlzcGxheScsIGhhc1N1Yk1lbnUgPyAnbm9uZScgOiAnYmxvY2snKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChpdGVtLmh0bWwoKSA9PT0gIisiKSB7DQogICAgICAgICAgICAgICAgaXRlbS5odG1sKCctJyk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGl0ZW0uaHRtbCgnKycpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9KTsNCjwvc2NyaXB0Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDwhLS1zdGFydGluZGV4LS0+DQogICAgICAgICAgICAgICAgPCEtLSEhV2lkZ2V0RW5kLS0+DQoNCiAgICANCjwvZGl2Pg0KDQogICAgDQo8ZGl2IGlkPSJDb2x1bW5Vc2VyQ29udHJvbDMiIGNsYXNzPSJjb2x1bW4gICByaWdodF9jb2wgICIgIHJvbGU9Im1haW4iIGFyaWEtbGFiZWw9IkNvbHVtblVzZXJDb250cm9sMyIgID4NCiAgICA8IS0tISFXaWRnZXRTdGFydCwgdmktb3JkZXJkYXRhPSIwIiAgdmktaGlkZW9ubW9iaWxlPSJmYWxzZSIgdmktd2lkZ2V0aW5zdGFuY2VkYXRhPSIzIldpZGdldFN0YXJ0ISEtLT4gICAgDQoNCjxoZWFkZXIgaWQ9IndpZGdldF8zXzU1ODNfMTA2MSIgY2xhc3M9InRpdGxlX3dpZGdldCBjbGVhcmZpeCBvbl9wYWdlICIgPg0KICAgIA0KICAgIDwhLS1zdG9waW5kZXgtLT4NCiAgICA8cCBjbGFzcz0iYnJlYWRjcnVtYiI+DQogICAgICAgIDxhIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50Ij5Mb2NhbCBHb3Zlcm5tZW50PC9hPiDCuyA8YSBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50Ij5Hb3Zlcm5tZW50PC9hPiDCuyA8YSBocmVmPSIvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzIj5EZXBhcnRtZW50czwvYT4gwrsgPGEgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlIj5QYXJrcywgUmVjcmVhdGlvbiBhbmQgT3BlbiBTcGFjZTwvYT4gwrsgPGEgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQvZ292ZXJubWVudC9kZXBhcnRtZW50cy9wYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlL3BhcmtzLWRpdmlzaW9uIj5QYXJrcyBEaXZpc2lvbjwvYT4gDQogICAgPC9wPg0KICAgIDwhLS1zdGFydGluZGV4LS0+DQogICAgDQogICAgPGgxIGNsYXNzPSJ0aXRsZXdpZGdldC10aXRsZSI+PHNwYW4+RG9nIE9mZi1MZWFzaCBBcmVhczwvc3Bhbj48L2gxPg0KICAgIA0KICAgIDwhLS1zdG9waW5kZXgtLT4NCiAgICA8ZGl2IGNsYXNzPSJ0aXRsZV9yaWdodCI+DQogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlX3JvdyI+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDxhIGNsYXNzPSJwcmludGVyX2ZyaWVuZGx5IiBocmVmPSJqYXZhc2NyaXB0OndpbmRvdy5wcmludCgpOyIgdGl0bGU9IkNsaWNrIHRvIHByaW50IHRoaXMgcGFnZSI+UHJpbnQ8L2E+DQogICAgICAgICAgICANCiAgICAgICAgICAgIDxhIGNsYXNzPSJ0aGlja2JveCBmZWVkYmFja19saW5rIiB0aXRsZT0iQ2xpY2sgdG8gc3VibWl0IGFuIGVtYWlsIHRvIGZlZWRiYWNrIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7Ij5GZWVkYmFjazwvYT4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KICAgICAgICAgICAgZnVuY3Rpb24gc2hhcmVMaW5rKHNoYXJlVHlwZSkgew0KICAgICAgICAgICAgICAgIHZhciBzaGFyZVVybCA9ICIiOw0KICAgICAgICAgICAgICAgIHZhciBzaGFyZVRpdGxlID0gZG9jdW1lbnQuaXRlbVRpdGxlID8gZW5jb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50Lml0ZW1UaXRsZS50cmltKCkpLnJlcGxhY2UoL1shJygpKl0vZywgZXNjYXBlKSA6ICJEb2crT2ZmLUxlYXNoK0FyZWFzIjsNCiAgICAgICAgICAgICAgICBzd2l0Y2ggKHNoYXJlVHlwZSkgew0KICAgICAgICAgICAgICAgICAgICBjYXNlICJmYWNlYm9vayI6DQogICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVVybCA9ICJodHRwOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIucGhwP3U9aHR0cHMlM2ElMmYlMmZ3d3cubG91aXN2aWxsZWNvLmdvdiUyZmxvY2FsLWdvdmVybm1lbnQlMmZnb3Zlcm5tZW50JTJmZGVwYXJ0bWVudHMlMmZwYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlJTJmcGFya3MtZGl2aXNpb24lMmZkb2ctb2ZmLWxlYXNoLWFyZWFzJnQ9IiArIHNoYXJlVGl0bGU7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAibGlua2VkaW4iOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVVcmwgPSAiaHR0cDovL3d3dy5saW5rZWRpbi5jb20vc2hhcmVBcnRpY2xlP21pbmk9dHJ1ZSZ1cmw9aHR0cHMlM2ElMmYlMmZ3d3cubG91aXN2aWxsZWNvLmdvdiUyZmxvY2FsLWdvdmVybm1lbnQlMmZnb3Zlcm5tZW50JTJmZGVwYXJ0bWVudHMlMmZwYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlJTJmcGFya3MtZGl2aXNpb24lMmZkb2ctb2ZmLWxlYXNoLWFyZWFzJnRpdGxlPSIgKyBzaGFyZVRpdGxlOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInR3aXR0ZXIiOg0KICAgICAgICAgICAgICAgICAgICAgICAgLy9CZWxvdyBsaW5rIHdvcmtzIGluIGlPUyBhbmQgb3RoZXIgT1MNCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlVXJsID0gImh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50L3R3ZWV0P3VybD1odHRwcyUzYSUyZiUyZnd3dy5sb3Vpc3ZpbGxlY28uZ292JTJmbG9jYWwtZ292ZXJubWVudCUyZmdvdmVybm1lbnQlMmZkZXBhcnRtZW50cyUyZnBhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UlMmZwYXJrcy1kaXZpc2lvbiUyZmRvZy1vZmYtbGVhc2gtYXJlYXMmdGV4dD1Eb2crT2ZmLUxlYXNoK0FyZWFzKyU3YysiOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgImRlbGljaW91cyI6DQogICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVVybCA9ICJodHRwczovL3NlY3VyZS5kZWxpY2lvdXMuY29tL2xvZ2luP25vdWk9eWVzJnY9NCZqdW1wPWh0dHBzJTNhJTJmJTJmd3d3LmxvdWlzdmlsbGVjby5nb3YlMmZsb2NhbC1nb3Zlcm5tZW50JTJmZ292ZXJubWVudCUyZmRlcGFydG1lbnRzJTJmcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZSUyZnBhcmtzLWRpdmlzaW9uJTJmZG9nLW9mZi1sZWFzaC1hcmVhcyUyNnRpdGxlJTNEIiArIHNoYXJlVGl0bGUgKyAiJTI2bm90ZXMlM0QlMjZ0YWdzJTNEJTI2diUzRDQlMjZub3VpJTNEJTI2c2hhcmUlM0R5ZXMlMjZqdW1wJTNEY2xvc2UlMjZ0aW1lJTNEMTIzOTk5MzQ0MyI7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAibXlzcGFjZSI6DQogICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVVybCA9ICJodHRwOi8vd3d3Lm15c3BhY2UuY29tL01vZHVsZXMvUG9zdFRvL1BhZ2VzLz91PWh0dHBzJTNhJTJmJTJmd3d3LmxvdWlzdmlsbGVjby5nb3YlMmZsb2NhbC1nb3Zlcm5tZW50JTJmZ292ZXJubWVudCUyZmRlcGFydG1lbnRzJTJmcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZSUyZnBhcmtzLWRpdmlzaW9uJTJmZG9nLW9mZi1sZWFzaC1hcmVhcyZ0PSIgKyBzaGFyZVRpdGxlICsgIiZjPSI7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSAiZ29vZ2xlYm9va21hcmsiOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVVcmwgPSAiaHR0cDovL3d3dy5nb29nbGUuY29tL2Jvb2ttYXJrcy9tYXJrP29wPWFkZCZia21rPWh0dHBzJTNhJTJmJTJmd3d3LmxvdWlzdmlsbGVjby5nb3YlMmZsb2NhbC1nb3Zlcm5tZW50JTJmZ292ZXJubWVudCUyZmRlcGFydG1lbnRzJTJmcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZSUyZnBhcmtzLWRpdmlzaW9uJTJmZG9nLW9mZi1sZWFzaC1hcmVhcyZ0aXRsZT0iICsgc2hhcmVUaXRsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICJzdHVtYmxldXBvbiI6DQogICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVVybCA9ICJodHRwOi8vd3d3LnN0dW1ibGV1cG9uLmNvbS9zdWJtaXQ/dXJsPWh0dHBzJTNhJTJmJTJmd3d3LmxvdWlzdmlsbGVjby5nb3YlMmZsb2NhbC1nb3Zlcm5tZW50JTJmZ292ZXJubWVudCUyZmRlcGFydG1lbnRzJTJmcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZSUyZnBhcmtzLWRpdmlzaW9uJTJmZG9nLW9mZi1sZWFzaC1hcmVhcyZ0aXRsZT0iICsgc2hhcmVUaXRsZTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICBjYXNlICJkaWdnIjoNCiAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlVXJsID0gImh0dHA6Ly9kaWdnLmNvbS9zdWJtaXQvP3VybD1odHRwcyUzYSUyZiUyZnd3dy5sb3Vpc3ZpbGxlY28uZ292JTJmbG9jYWwtZ292ZXJubWVudCUyZmdvdmVybm1lbnQlMmZkZXBhcnRtZW50cyUyZnBhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UlMmZwYXJrcy1kaXZpc2lvbiUyZmRvZy1vZmYtbGVhc2gtYXJlYXMiOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInR1bWJsciI6DQogICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVVybCA9ICJodHRwczovL3d3dy50dW1ibHIuY29tL3NoYXJlL2xpbms/dXJsPWh0dHBzJTNhJTJmJTJmd3d3LmxvdWlzdmlsbGVjby5nb3YlMmZsb2NhbC1nb3Zlcm5tZW50JTJmZ292ZXJubWVudCUyZmRlcGFydG1lbnRzJTJmcGFya3MtcmVjcmVhdGlvbi1hbmQtb3Blbi1zcGFjZSUyZnBhcmtzLWRpdmlzaW9uJTJmZG9nLW9mZi1sZWFzaC1hcmVhcyZuYW1lPSIgKyBzaGFyZVRpdGxlOw0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgIGNhc2UgInJlZGRpdCI6DQogICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVVybCA9ICJodHRwOi8vd3d3LnJlZGRpdC5jb20vc3VibWl0P3VybD1odHRwcyUzYSUyZiUyZnd3dy5sb3Vpc3ZpbGxlY28uZ292JTJmbG9jYWwtZ292ZXJubWVudCUyZmdvdmVybm1lbnQlMmZkZXBhcnRtZW50cyUyZnBhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UlMmZwYXJrcy1kaXZpc2lvbiUyZmRvZy1vZmYtbGVhc2gtYXJlYXMmdGl0bGU9IiArIHNoYXJlVGl0bGU7DQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHNoYXJlVXJsLmxlbmd0aCA+IDApIHdpbmRvdy5vcGVuKHNoYXJlVXJsLCAiX2JsYW5rIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICA8L3NjcmlwdD4NCiAgICAgICAgICAgIDxkaXYgaWQ9InNoYXJlIj4NCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0ic2hhcmVsaW5rIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiB0aXRsZT0iQ2xpY2sgdG8gZXhwYW5kIFNoYXJlICYgQm9va21hcmsgb3B0aW9ucyIgYXJpYS1oYXNwb3B1cD0idHJ1ZSIgYXJpYS1leHBhbmRlZD0iZmFsc2UiIGFyaWEtbGFiZWxsZWRieT0ic2hhcmUtZGVzY2lwdGlvbiI+U2hhcmUgJiBCb29rbWFyazwvYT4NCiAgICAgICAgICAgICAgICA8c3BhbiBpZD0ic2hhcmUtZGVzY2lwdGlvbiIgY2xhc3M9IndjYWdfb25seSI+U2hhcmUgJiBCb29rbWFyaywgUHJlc3MgRW50ZXIgdG8gc2hvdyBhbGwgb3B0aW9ucywgcHJlc3MgVGFiIGdvIHRvIG5leHQgb3B0aW9uPC9zcGFuPg0KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0ibm9fZXh0ZXJuYWxfdXJsX2luZGljYXRpb24iPg0KICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSJDbGljayB0byBzdWJtaXQgYW4gZW1haWwgb25saW5lIiBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0ic2hhcmVlbWFpbCBzZW5kX3NoYXJlX2VtYWlsIj5FbWFpbDwvYT4NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICA8bGk+PGEgdGl0bGU9IkNsaWNrIHRvIHNoYXJlIHdpdGggRmFjZWJvb2siIGhyZWY9ImphdmFzY3JpcHQ6c2hhcmVMaW5rKCdmYWNlYm9vaycpIiBjbGFzcz0ic2hhcmVmYWNlYm9vayI+RmFjZWJvb2s8L2E+PC9saT4NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIDxsaT48YSB0aXRsZT0iQ2xpY2sgdG8gc2hhcmUgd2l0aCBMaW5rZWRJbiIgaHJlZj0iamF2YXNjcmlwdDpzaGFyZUxpbmsoJ2xpbmtlZGluJykiIGNsYXNzPSJzaGFyZWxpbmtlZGluIj5MaW5rZWRJbjwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICA8bGk+PGEgdGl0bGU9IkNsaWNrIHRvIHNoYXJlIHdpdGggVHdpdHRlciIgaHJlZj0iamF2YXNjcmlwdDpzaGFyZUxpbmsoJ3R3aXR0ZXInKSIgY2xhc3M9InNoYXJldHdpdHRlciI+VHdpdHRlcjwvYT48L2xpPg0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8bGk+PGEgdGl0bGU9IkNsaWNrIHRvIHNoYXJlIHdpdGggUmVkZGl0IiBocmVmPSJqYXZhc2NyaXB0OnNoYXJlTGluaygncmVkZGl0JykiIGNsYXNzPSJzaGFyZXJlZGRpdCI+UmVkZGl0PC9hPjwvbGk+DQogICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgDQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJmb250X3NpemUiPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIHRpdGxlPSJkZWZhdWx0IGZvbnQgc2l6ZSIgY2xhc3M9InRleHRfc2l6ZSI+Rm9udCBTaXplOjwvYT4NCiAgICAgICAgICAgICAgICA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoMCk7IiB0aXRsZT0ibGFyZ2VyIGZvbnQgc2l6ZSIgY2xhc3M9ImZvbnRfbGFyZ2VyIj4rPC9hPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9ImphdmFzY3JpcHQ6dm9pZCgwKTsiIHRpdGxlPSJzbWFsbGVyIGZvbnQgc2l6ZSIgY2xhc3M9ImZvbnRfc21hbGxlciI+LTwvYT4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgDQogICAgICAgIDwvZGl2Pg0KICAgIDwvZGl2Pg0KICAgIDwhLS1zdGFydGluZGV4LS0+DQoNCiAgICANCjwvaGVhZGVyPg0KDQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+DQogICAgJChmdW5jdGlvbiAoKSB7DQogICAgICAgIHZhciB3aWRnZXRDb250ZXh0ID0gIndpZGdldF8zXzU1ODNfMTA2MSI7DQoNCiAgICAgICAgLy9zdGFydCBWSVNQUC00NDY2DQogICAgICAgIHZhciB1c2VEZXNpZ25UaGVtRm9udFNpemVDc3MgPSB3aW5kb3cudmlzaW9uT3B0aW9ucy51c2VEZXNpZ25UaGVtRm9udFNpemVDc3M7DQogICAgICAgIHZhciBmb2xkZXJQYXRoID0gdXNlRGVzaWduVGhlbUZvbnRTaXplQ3NzID09IHRydWUgPyB3aW5kb3cudmlzaW9uT3B0aW9ucy5jdXJyZW50RGVzaWduRm9sZGVyUGF0aCA6IHdpbmRvdy52aXNpb25PcHRpb25zLm1haW5Gb2xkZXJQYXRoOw0KICAgICAgICBpZiAoIWZvbGRlclBhdGgpDQogICAgICAgICAgICBmb2xkZXJQYXRoID0gd2luZG93LnZpc2lvbk9wdGlvbnMubWFpbkZvbGRlclBhdGg7DQogICAgICAgIHZhciByZXNpemVUaW1lcjsNCiAgICAgICAgdmFyIHJlc2l6ZUZhcVRhYnMgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAkKCIuZmFxX3dpZGdldCIpLmVhY2goZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIHZhciB0YWJoZWlnaHQgPSAkKHRoaXMpLmZpbmQoIi5mYXFfdGFiX25hdiIpLmhlaWdodCgpOw0KICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgiLmZhcXRhYl9zZWN0aW9uIikuYXR0cigic3R5bGUiLCAibWluLWhlaWdodDogIiArICh0YWJoZWlnaHQgLSA0MikgKyAicHgiKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9Ow0KICAgICAgICB2YXIgU2V0Rm9udFNpemUgPSBmdW5jdGlvbiAoZm9udHNpemUpIHsNCiAgICAgICAgICAgICQoIiNhY3RpdmVfZm9udCIpLmF0dHIoImhyZWYiLCBmb2xkZXJQYXRoICsgZm9udHNpemUpLmF0dHIoImRhdGEtY3NzIiwgZm9udHNpemUpOw0KICAgICAgICAgICAgdmFyIHVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB2aXNpb25PcHRpb25zLnZpcnR1YWxBcHBsaWNhdGlvblBhdGggKyAiU2hhcmVkL0NoYW5nZUZvbnRTaXplQ29va2llIjsNCiAgICAgICAgICAgIHZhciBjb29raWVWYWx1ZSA9IGZvbnRzaXplID8gZm9udHNpemUgOiAic21hbGwuY3NzIjsNCiAgICAgICAgICAgIHZhciBjb29raWVJbnQ7DQogICAgICAgICAgICBzd2l0Y2goY29va2llVmFsdWUpew0KICAgICAgICAgICAgICAgIGNhc2UoInh4LXNtYWxsLmNzcyIpOiBjb29raWVJbnQ9MTsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAoIngtc21hbGwuY3NzIik6IGNvb2tpZUludCA9IDI7IGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgKCJzbWFsbC5jc3MiKTogZGVmYXVsdDogY29va2llSW50ID0gMzsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSgibWVkaXVtLmNzcyIpOiBjb29raWVJbnQ9NDsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAoImxhcmdlLmNzcyIpOiBjb29raWVJbnQgPSA1OyBicmVhazsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAkLmZyb250ZW5kQWpheCh7DQogICAgICAgICAgICAgICAgdXJsOiB1cmwsDQogICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLA0KICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsDQogICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoeyBjb29raWVWYWx1ZTogY29va2llSW50fSksDQogICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEuc3VjY2Vzcykgew0KICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2FjdGl2ZV9mb250IikuYXR0cigiaHJlZiIsIHdpbmRvdy52aXNpb25PcHRpb25zLm1haW5Gb2xkZXJQYXRoICsgY29va2llVmFsdWUpLmF0dHIoImRhdGEtY3NzIiwgY29va2llVmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBpZiAoJCgiLmZhcV90YWJfbmF2IikubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lcik7DQogICAgICAgICAgICAgICAgcmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgcmVzaXplRmFxVGFicygpOw0KICAgICAgICAgICAgICAgIH0sIDIwMCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQoNCiAgICAgICAgJCgiLmZvbnRfbGFyZ2VyIikub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgc3dpdGNoICgkKCIjYWN0aXZlX2ZvbnQiKS5hdHRyKCJkYXRhLWNzcyIpKSB7DQogICAgICAgICAgICAgICAgY2FzZSAibWVkaXVtLmNzcyI6IFNldEZvbnRTaXplKCJsYXJnZS5jc3MiKTsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAic21hbGwuY3NzIjogU2V0Rm9udFNpemUoIm1lZGl1bS5jc3MiKTsgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAieC1zbWFsbC5jc3MiOiBTZXRGb250U2l6ZSgic21hbGwuY3NzIik7IGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgInh4LXNtYWxsLmNzcyI6IFNldEZvbnRTaXplKCJ4LXNtYWxsLmNzcyIpOyBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJCgiLmZvbnRfc21hbGxlciIpLm9uKCJjbGljayIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHN3aXRjaCAoJCgiI2FjdGl2ZV9mb250IikuYXR0cigiZGF0YS1jc3MiKSkgew0KICAgICAgICAgICAgICAgIGNhc2UgImxhcmdlLmNzcyI6IFNldEZvbnRTaXplKCJtZWRpdW0uY3NzIik7IGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgIm1lZGl1bS5jc3MiOiBTZXRGb250U2l6ZSgic21hbGwuY3NzIik7IGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgInNtYWxsLmNzcyI6IFNldEZvbnRTaXplKCJ4LXNtYWxsLmNzcyIpOyBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlICJ4LXNtYWxsLmNzcyI6IFNldEZvbnRTaXplKCJ4eC1zbWFsbC5jc3MiKTsgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0pOw0KICAgICAgICAkKCIudGV4dF9zaXplIikub24oImNsaWNrIiwgZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgU2V0Rm9udFNpemUoIngtc21hbGwuY3NzIik7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0pOw0KICAgICAgICAgICAgLy9lbmQgVklTUFAtNDQ2Ng0KDQogICAgICAgICQoIiMiICsgd2lkZ2V0Q29udGV4dCArICIgI3NoYXJlIikuY2xpY2soZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgaWYgKCEkKCIjIiArIHdpZGdldENvbnRleHQgKyAiIGRpdiNzaGFyZSIpLmhhc0NsYXNzKCJjbGljay1hY3RpdmUiKSkNCiAgICAgICAgICAgICAgICAkKCIjIiArIHdpZGdldENvbnRleHQgKyAiIGRpdiNzaGFyZSIpLmZpbmQoInVsIikuc2hvdygpOw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICQoIiMiICsgd2lkZ2V0Q29udGV4dCArICIgZGl2I3NoYXJlIikuZmluZCgidWwiKS5oaWRlKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgICQoImRpdiIpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIGlmICgkKCIjIiArIHdpZGdldENvbnRleHQgKyAiIGRpdiNzaGFyZSIpLmhhc0NsYXNzKCJjbGljay1hY3RpdmUiKSkgew0KICAgICAgICAgICAgICAgICQoIiMiICsgd2lkZ2V0Q29udGV4dCArICIgZGl2I3NoYXJlIikuZmluZCgidWwiKS5oaWRlKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgICQoZG9jdW1lbnQpLmNsaWNrKGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICBpZiAoISQoZS50YXJnZXQpLmNsb3Nlc3QoIiNzaGFyZSIpLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAkKCIjIiArIHdpZGdldENvbnRleHQgKyAiIGRpdiNzaGFyZSIpLnJlbW92ZUNsYXNzKCJjbGljay1hY3RpdmUiKTsNCiAgICAgICAgICAgICAgICAkKCIjIiArIHdpZGdldENvbnRleHQgKyAiIGRpdiNzaGFyZSIpLmZpbmQoInVsIikuaGlkZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICB2YXIgc2hhcmVDb250YWluZXJUaW1lb3V0ID0gbnVsbDsNCiAgICAgICAgJCgiIyIgKyB3aWRnZXRDb250ZXh0ICsgIiAjc2hhcmUiKS5iaW5kKCdtb3VzZW92ZXInLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAvL0lmIG5vdCByZWxhdGUgdG8gY2xpY2sgZXZlbnQNCiAgICAgICAgICAgIGlmIChzaGFyZUNvbnRhaW5lclRpbWVvdXQpIHsNCiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2hhcmVDb250YWluZXJUaW1lb3V0KTsNCiAgICAgICAgICAgICAgICBzaGFyZUNvbnRhaW5lclRpbWVvdXQgPSBudWxsOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc2hhcmVDb250YWluZXJUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgaWYgKCEkKCIjIiArIHdpZGdldENvbnRleHQgKyAiIGRpdiNzaGFyZSIpLmhhc0NsYXNzKCJjbGljay1hY3RpdmUiKSkNCiAgICAgICAgICAgICAgICAgICAgJCgiIyIgKyB3aWRnZXRDb250ZXh0ICsgIiBkaXYjc2hhcmUiKS5maW5kKCJ1bCIpLnNob3coKTsNCiAgICAgICAgICAgIH0sIDEwMCk7DQogICAgICAgIH0pOw0KDQogICAgICAgICQoIiMiICsgd2lkZ2V0Q29udGV4dCArICIgI3NoYXJlIikuYmluZCgnbW91c2VsZWF2ZScsIGZ1bmN0aW9uICgpIHsgICAgICAgICAgICANCiAgICAgICAgICAgIC8vSWYgbm90IHJlbGF0ZSB0byBjbGljayBldmVudCAgICAgDQogICAgICAgICAgICBpZiAoc2hhcmVDb250YWluZXJUaW1lb3V0KSB7DQogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNoYXJlQ29udGFpbmVyVGltZW91dCk7DQogICAgICAgICAgICAgICAgc2hhcmVDb250YWluZXJUaW1lb3V0ID0gbnVsbDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHNoYXJlQ29udGFpbmVyVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgIGlmICghJCgiIyIgKyB3aWRnZXRDb250ZXh0ICsgIiBkaXYjc2hhcmUiKS5oYXNDbGFzcygiY2xpY2stYWN0aXZlIikpDQogICAgICAgICAgICAgICAgICAgICQoIiMiICsgd2lkZ2V0Q29udGV4dCArICIgZGl2I3NoYXJlIikuZmluZCgidWwiKS5oaWRlKCk7DQogICAgICAgICAgICB9LCAyMDApOw0KICAgICAgICB9KTsNCg0KICAgICAgICAkKCJoZWFkZXIjIiArIHdpZGdldENvbnRleHQgKyAiIGEuZmVlZGJhY2tfbGluayIpLmNsaWNrKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciB3aW5kb3dIZWlnaHQgPSA0ODU7DQogICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gNjQ4KSB7DQogICAgICAgICAgICAgICAgd2luZG93SGVpZ2h0ID0gNTQ1Ow0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIG9wdHMgPSB7DQogICAgICAgICAgICAgICAgdGl0bGU6ICJGZWVkYmFjayIsDQogICAgICAgICAgICAgICAgdXJsOiAiL1RlbXBsYXRlL0dldEZlZWRiYWNrUGFydGlhbD9mZWVkYmFja1VybD1odHRwcyUzYSUyZiUyZnd3dy5sb3Vpc3ZpbGxlY28uZ292JTJmbG9jYWwtZ292ZXJubWVudCUyZmdvdmVybm1lbnQlMmZkZXBhcnRtZW50cyUyZnBhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2UlMmZwYXJrcy1kaXZpc2lvbiUyZmRvZy1vZmYtbGVhc2gtYXJlYXMiLA0KICAgICAgICAgICAgICAgIHVzZUZyYW1lOiB0cnVlLA0KICAgICAgICAgICAgICAgIGhlaWdodDogd2luZG93SGVpZ2h0LA0KICAgICAgICAgICAgICAgIG9uQ2xvc2VkOiBmdW5jdGlvbiAocmVzdWx0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkICYmIHJlc3VsdC5Jc09rID09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQucmVmcmVzaFRlbXBNZXNzYWdlKHJlc3VsdC5NZXNzYWdlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkKCJoZWFkZXIjIiArIHdpZGdldENvbnRleHQgKyAiIGEuZmVlZGJhY2tfbGluayIpLmZvY3VzKCk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBza2luOiAndmlDbGllbnREaWFsb2cgZmVlZGJhY2tfbGlnaHRib3gnLA0KICAgICAgICAgICAgICAgIGZpeGVkOiBmYWxzZQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICQudmlDbGllbnREaWFsb2cob3B0cykub3BlbigpOw0KICAgICAgICB9KTsNCg0KICAgICAgICAvL1NhZmFyaSBpT1M6IE5vIGNsaWNrIGV2ZW50DQogICAgICAgICQoImhlYWRlciMiICsgd2lkZ2V0Q29udGV4dCArICIgYS5zZW5kX3NoYXJlX2VtYWlsIikuYmluZCgiY2xpY2sgdG91Y2hzdGFydCIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBzaGFyZUVtYWlsVGl0bGUgPSBkb2N1bWVudC5pdGVtVGl0bGUgPyBlbmNvZGVVUklDb21wb25lbnQoZG9jdW1lbnQuaXRlbVRpdGxlLnRyaW0oKSkucmVwbGFjZSgvWyEnKCkqXS9nLCBlc2NhcGUpIDogIkRvZytPZmYtTGVhc2grQXJlYXMiOw0KICAgICAgICAgICAgdmFyIG9wdHMgPSB7DQogICAgICAgICAgICAgICAgdGl0bGU6ICJDbGljayB0byBzdWJtaXQgYW4gZW1haWwgb25saW5lIiwNCiAgICAgICAgICAgICAgICB1cmw6ICIvVGVtcGxhdGUvR2V0U2hhcmVFbWFpbFBhcnRpYWw/c2hhcmVVcmw9aHR0cHMlM2ElMmYlMmZ3d3cubG91aXN2aWxsZWNvLmdvdiUyZmxvY2FsLWdvdmVybm1lbnQlMmZnb3Zlcm5tZW50JTJmZGVwYXJ0bWVudHMlMmZwYXJrcy1yZWNyZWF0aW9uLWFuZC1vcGVuLXNwYWNlJTJmcGFya3MtZGl2aXNpb24lMmZkb2ctb2ZmLWxlYXNoLWFyZWFzIiArICImc2hhcmVUaXRsZT0iICsgc2hhcmVFbWFpbFRpdGxlLA0KICAgICAgICAgICAgICAgIHVzZUZyYW1lOiB0cnVlLA0KICAgICAgICAgICAgICAgIGhlaWdodDogNDg1LA0KICAgICAgICAgICAgICAgIG9uQ2xvc2VkOiBmdW5jdGlvbiAocmVzdWx0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkICYmIHJlc3VsdC5Jc09rID09IHRydWUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICQucmVmcmVzaFRlbXBNZXNzYWdlKHJlc3VsdC5NZXNzYWdlKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkKCJoZWFkZXIjIiArIHdpZGdldENvbnRleHQgKyAiIGEuc2VuZF9zaGFyZV9lbWFpbCIpLmZvY3VzKCk7DQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICBza2luOiAndmlDbGllbnREaWFsb2cgc2VuZF9zaGFyZV9lbWFpbF9saWdodGJveCcsDQogICAgICAgICAgICAgICAgZml4ZWQ6IGZhbHNlDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgJC52aUNsaWVudERpYWxvZyhvcHRzKS5vcGVuKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIA0KDQogICAgfSk7DQo8L3NjcmlwdD4NCg0KICAgICAgICAgICAgPCEtLSEhV2lkZ2V0RW5kLS0+DQoNCiAgICA8IS0tISFXaWRnZXRTdGFydCwgdmktb3JkZXJkYXRhPSIwIiAgdmktaGlkZW9ubW9iaWxlPSJmYWxzZSIgdmktd2lkZ2V0aW5zdGFuY2VkYXRhPSI0IldpZGdldFN0YXJ0ISEtLT4gICAgDQo8ZGl2IGlkPSd3aWRnZXRfNF8xMTA2XzEwNjEnIGNsYXNzPSdjb250ZW50X2FyZWEgbm9ybWFsX2NvbnRlbnRfYXJlYSBjbGVhcmZpeCAgJz48cD48c3BhbiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1mYW1pbHk6IGluaGVyaXQ7IGZvbnQtc2l6ZTogMzJweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyI+VEhFIERPRyBPRkYtTEVBU0ggQVJFQSBBVCBEQVZJRFNPTiBNRVNBIElTIE9QRU4uJm5ic3A7PC9zcGFuPjwvcD4KPHA+PHN0cm9uZz4mbmJzcDtUaGUgSE9XTCBMaW5lIGlzIGN1cnJlbnRseSBleHBlcmllbmNpbmcgdGVjaG5pY2FsIGRpZmZpY3VsdGllcy4gUGxlYXNlIGNoZWNrIGJhY2sgaGVyZSBmb3IgdXBkYXRlcy48L3N0cm9uZz48L3A+CjxwPkxvdWlzdmlsbGUgaGFzIHR3byBvZmYtbGVhc2ggZG9nIG9wdGlvbnMgZm9yIHJlY3JlYXRpbmcgb2ZmLWxlYXNoIHdpdGggeW91ciBkb2cuJm5ic3A7PC9wPgo8cD4KPC9wPgo8dWw+CiAgICA8bGk+PHN0cm9uZz5Db21tdW5pdHkgUGFyayBEb2cgUGFyazo8L3N0cm9uZz4gTG9jYXRlZCBpbiB0aGUgc291dGhlYXN0IGNvcm5lciBhdCA5NTUgQmVsbGEgVmlzdGEgRHJpdmUKICAgIDwvbGk+CiAgICA8bGk+PHN0cm9uZz5EYXZpZHNvbiBNZXNhIE9wZW4gU3BhY2UgRG9nIE9mZi1sZWFzaCBhcmVhOjwvc3Ryb25nPiBOb3J0aCBzaWRlIGF0IE1jQ2FzbGluIEJvdWxldmFyZCBhbmQgV2FzaGluZ3RvbiBBdmVudWUuPGJyPgogICAgTk9URTogVGhlIERhdmlkc29uIE1lc2EgRG9nIE9mZi1MZWFzaCBhcmVhIG1heSBleHBlcmllbmNlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmxvdWlzdmlsbGVjby5nb3YvbG9jYWwtZ292ZXJubWVudC9nb3Zlcm5tZW50L2RlcGFydG1lbnRzL3BhcmtzLXJlY3JlYXRpb24tYW5kLW9wZW4tc3BhY2Uvb3Blbi1zcGFjZS1kaXZpc2lvbi90cmFpbC1jbG9zdXJlcyIgZGF0YS11dy1ybS1icmw9ImZhbHNlIj50ZW1wb3JhcnkgY2xvc3VyZXM8L2E+IGZvciByb3V0aW5lIG1haW50ZW5hbmNlIG9yIGR1ZSB0byB1bmZhdm9yYWJsZSB3ZXQgb3IgbXVkZHkgY29uZGl0aW9ucy4gVGhlc2UgY2xvc3VyZXMgYXJlIGZvciB0aGUgcHJvdGVjdGlvbiBvZiBvdXIgbmF0dXJhbCByZXNvdXJjZXMgaW4gYWRkaXRpb24gdG8gdGhlIHNhZmV0eSBvZiBvdXIgY2FuaW5lIGFuZCBodW1hbiB1c2Vycy4gSW5mb3JtYXRpb24gb24gY2xvc3VyZXMgY2FuIGJlIG9idGFpbmVkIGJ5Jm5ic3A7PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyBjb2xvcjogaW5oZXJpdDsgZm9udC1zaXplOiBpbmhlcml0OyI+Y2FsbGluZyB0aGUgPC9zcGFuPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgY29sb3I6IGluaGVyaXQ7IGZvbnQtc2l6ZTogaW5oZXJpdDsgdGV4dC1kZWNvcmF0aW9uLWxpbmU6IHVuZGVybGluZTsiPkhPV0wgbGluZSBhdCAzMDMuMzM1LkhPV0wgKDQ2OTUpPC9zcGFuPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgY29sb3I6IGluaGVyaXQ7IGZvbnQtc2l6ZTogaW5oZXJpdDsiPiZuYnNwO29yIGZyb20gdGhlIHNpZ25zIGxvY2F0ZWQgYXQgdGhlIGVudHJhbmNlIHRvIHRoZSBvZmYtbGVhc2ggYXJlYS4gUGxlYXNlIGNvbnRhY3QgdGhlIFJhbmdlciBOYXR1cmFsaXN0cyB3aXRoIGFueSBxdWVzdGlvbnMgYXQgMzAzLjMzNS40NzcwIG9yIDwvc3Bhbj48YSBocmVmPSJtYWlsdG86IiBzdHlsZT0iZm9udC1zaXplOiBpbmhlcml0OyIgYXJpYS1sYWJlbD0icmFuZ2Vyc2xvdWlzdmlsbGVjb2dvdiIgdXctcm0tdmFndWUtbGluay1pZD0ibWFpbHRvOiRyYW5nZXJzbG91aXN2aWxsZWNvZ292IiBkYXRhLXV3LXJtLWJybD0iZXhjIj5yYW5nZXJzQGxvdWlzdmlsbGVjby5nb3Y8L2E+PC9saT4KPC91bD4KPGk+CjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC85bDFFdTVvMkU0ND9yZWw9MCIgYWxsb3dmdWxsc2NyZWVuPSIiIGFsbG93PSJhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhIiB0aXRsZT0ieW91dHViZSIgd2lkdGg9IjU2MCIgaGVpZ2h0PSIzMTUiIGZyYW1lYm9yZGVyPSIwIj48L2lmcmFtZT4KPC9pPgo8aDM+UnVsZXMgJmFtcDsgUmVndWxhdGlvbnM6PC9oMz4KPHVsPgogICAgPGxpPkhPVVJTIEFUIENPTU1VTklUWSBQQVJLIERPRyBQQVJLOiA2OjAwIEFNIFRPIDEwOjAwIFBNIC8gSE9VUlMgQVQgREFWSURTT04gTUVTQSBPRkYtTEVBU0ggQVJFQTogT05FIEhPVVIgQkVGT1JFIFNVTlJJU0UgVE8gT05FIEhPVVIgQUZURVIgU1VOU0VULjwvbGk+CiAgICA8bGk+QUxMIERPRyBPV05FUlMgQVJFIFJFUVVJUkVEIFRPIENMRUFOIFVQIEFORCBQUk9QRVJMWSBESVNQT1NFIE9GIERPRyBFWENSRU1FTlQuPC9saT4KICAgIDxsaT5Gb29kIHByb2hpYml0ZWQuPC9saT4KICAgIDxsaT5QdXBwaWVzIHVuZGVyIDQgbW9udGhzIHByb2hpYml0ZWQuPC9saT4KICAgIDxsaT5DaGlsZHJlbiAxMiBhbmQgeW91bmdlciBtdXN0IGJlIHN1cGVydmlzZWQgYnkgYW4gYWR1bHQuPC9saT4KICAgIDxsaT5UaGUgb2ZmLWxlYXNoIGFyZWEgbWF5IGJlIGNsb3NlZCBhdCBhbnkgdGltZSB3aXRoIG9yIHdpdGhvdXQgbm90aWZpY2F0aW9uLjwvbGk+CiAgICA8bGk+RG9ncyB0aGF0IGFwcGVhciBzaWNrLCBhZ2dyZXNzaXZlLCBpbiBoZWF0LCBvciB3aXRob3V0IGN1cnJlbnQgdmFjY2luYXRpb24gcHJvaGliaXRlZC48L2xpPgogICAgPGxpPkRvZ3MgbXVzdCBiZSBsZWFzaGVkIHVudGlsIHNhZmVseSBpbnNpZGUgYW5kIHVwb24gZXhpdCBvZiB0aGUgZG9nIG9mZi1sZWFzaCBhcmVhLjwvbGk+CiAgICA8bGk+TGltaXQgMyBkb2dzIHBlciBwZXJzb24uIE93bmVycyBtdXN0IGhhdmUgYSBsZWFzaCBmb3IgZWFjaCBkb2cuJm5ic3A7IERvZ3MgbXVzdCBub3QgYmUgbGVmdCB1bmF0dGVuZGVkLjwvbGk+CiAgICA8bGk+V2lsZGxpZmUgbWF5IGJlIHByZXNlbnQuJm5ic3A7IERvZ3MgYW5kIGRvZyBvd25lcnMgY2Fubm90IGNoYXNlIG9yIGRpc3R1cmIgd2lsZGxpZmUuPC9saT4KPC91bD4KPGgzPkNvdXJ0ZXNpZXM6PC9oMz4KPHVsPgogICAgPGxpPkJlIGNvbnNpZGVyYXRlIG9mIG90aGVycy4gQ2hlY2sgdG8gZW5zdXJlIGludGVyYWN0aW9uIGlzIHdlbGNvbWUuPC9saT4KICAgIDxsaT5NaW5pbWl6ZSBsb3VkIG5vaXNlcywgZG9ncyBiYXJraW5nIG9yIGh1bWFucyBzaG91dGluZywgdG8gcHJldmVudCBkaXNydXB0aW9uIHRvIG90aGVycywgZXNwZWNpYWxseSBuZWlnaGJvcnMuPC9saT4KICAgIDxsaT5FbmNvdXJhZ2UgdXNlcnMgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlaXIgcGV0cy48L2xpPgogICAgPGxpPkxlYXNoIHlvdXIgZG9nIHdoZW5ldmVyIHlvdSBzZW5zZSBwcm9ibGVtcy48L2xpPgogICAgPGxpPk1haW50YWluIHZvaWNlIGNvbnRyb2wuPC9saT4KICAgIDxsaT5BbHdheXMga2VlcCBhbiBleWUgb24geW91ciBkb2cuPC9saT4KICAgIDxsaT5QbGVhc2UgaGVscCB1cyBrZWVwIHRoZSBkb2cgb2ZmLWxlYXNoIGFyZWFzIFNBRkUgYW5kIFNhbml0YXJ5LjwvbGk+CjwvdWw+CjxwPjxzdHJvbmc+PGVtPjxmb250IHNpemU9IjMiIGNvbG9yPSIjODAwMDAwIiBkYXRhLXV3LXJtLXNyPSIiPk5vdGU6IERvZ3MgbXVzdCBiZSBvbiBsZWFzaCBpbiBhbGwgb3RoZXIgYXJlYXMgb2YgdGhlIENpdHkgYW5kIERPR1MgQVJFIE5PVCBBTExPV0VEIEFOWVdIRVJFIElOIFRIRSBMRU9OIFdVUkwgV0lMRExJRkUgU0FOQ1RVQVJZIEFST1VORCBIQVJQRVIgTEFLRS4mbmJzcDsgRmFpbHVyZSB0byBmb2xsb3cgUnVsZXMgJmFtcDsgUmVndWxhdGlvbnMgbWF5IHJlc3VsdCBpbiBhIGZpbmUgdXAgdG8gJDIsNjUwLiBMb3Vpc3ZpbGxlIE11bmljaXBhbCBDb2RlLCBTZWN0aW9uIDEuMjguMDEwPC9mb250PjwvZW0+PC9zdHJvbmc+PC9wPgo8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIGNvbnRhY3QmbmJzcDt0aGUgPGEgaHJlZj0ibWFpbHRvOnBhcmtzYW5kcmVjQGxvdWlzdmlsbGVjby5nb3YiIHN0eWxlPSIiIGFyaWEtbGFiZWw9InNlbmQgYW4gZW1haWwgdG8gcGFya3NhbmRyZWNAbG91aXN2aWxsZWNvLmdvdiIgdXctcm0tdmFndWUtbGluay1pZD0ibWFpbHRvOnBhcmtzYW5kcmVjQGxvdWlzdmlsbGVjby5nb3Ykc2VuZCBhbiBlbWFpbCB0byBwYXJrc2FuZHJlY0Bsb3Vpc3ZpbGxlY28uZ292IiBkYXRhLXV3LXJtLWJybD0iZXhjIj5QYXJrcyAmYW1wOyBSZWNyZWF0aW9uIERlcGFydG1lbnQ8L2E+Jm5ic3A7YXQgMzAzLjMzNS40NzM1LjwvcD4KPHA+TG91aXN2aWxsZSdzIEF3ZXNvbWUgTG9jYWwgRG9ncyBnYXZlIHVzIHNvbWUgdGlwcyBvbiBob3cgdG8gYmUgYW4gYXdlc29tZSBob29tYW4hPC9wPgo8cD4jMTogPGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1KaVhCclJoZDlXSSIgdGFyZ2V0PSJfYmxhbmsiIGFyaWEtbGFiZWw9IktlZXAgeW91ciBkb2cgb24gbGVhc2ggLSBvcGVucyBpbiBuZXcgdGFiIiB1dy1ybS1leHRlcm5hbC1saW5rLWlkPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWppeGJycmhkOXdpJGtlZXB5b3VyZG9nb25sZWFzaCIgZGF0YS11dy1ybS1icmw9ImV4YyIgZGF0YS11dy1ybS1leHQtbGluaz0ibmEiPktlZXAgeW91ciBkb2cgb24gbGVhc2g8L2E+PGJyPgojMjogPGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1feHZTVTRVZnhVZyIgdGFyZ2V0PSJfYmxhbmsiIGFyaWEtbGFiZWw9IlBpY2sgdXAgYWZ0ZXIgeW91ciBwZXQgLSBvcGVucyBpbiBuZXcgdGFiIiB1dy1ybS1leHRlcm5hbC1saW5rLWlkPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PV94dnN1NHVmeHVnJHBpY2t1cGFmdGVyeW91cnBldCIgZGF0YS11dy1ybS1icmw9ImV4YyIgZGF0YS11dy1ybS1leHQtbGluaz0ibmEiPlBpY2sgdXAgYWZ0ZXIgeW91ciBwZXQ8L2E+PGJyPgojMzogPGEgaHJlZj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj12ekpRQkpEWW9jOCIgdGFyZ2V0PSJfYmxhbmsiIGFyaWEtbGFiZWw9IlRha2Ugd2Fsa3MgZHVyaW5nIHRoZSBjb29sZXIgcGFydCBvZiB0aGUgZGF5IC0gb3BlbnMgaW4gbmV3IHRhYiIgdXctcm0tZXh0ZXJuYWwtbGluay1pZD0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj12empxYmpkeW9jOCR0YWtld2Fsa3NkdXJpbmd0aGVjb29sZXJwYXJ0b2Z0aGVkYXkiIGRhdGEtdXctcm0tYnJsPSJleGMiIGRhdGEtdXctcm0tZXh0LWxpbms9Im5hIj5UYWtlIHdhbGtzIGR1cmluZyB0aGUgY29vbGVyIHBhcnQgb2YgdGhlIGRheTwvYT48YnI+CiM0OiA8YSBocmVmPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXl6QV9QeVZlQy1nIiB0YXJnZXQ9Il9ibGFuayIgYXJpYS1sYWJlbD0iTmV2ZXIgbGVhdmUgYSBkb2cgdW5hdHRlbmRlZCBpbiBhIHZlaGljbGUgLSBvcGVucyBpbiBuZXcgdGFiIiB1dy1ybS1leHRlcm5hbC1saW5rLWlkPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXl6YV9weXZlYy1nJG5ldmVybGVhdmVhZG9ndW5hdHRlbmRlZGluYXZlaGljbGUiIGRhdGEtdXctcm0tYnJsPSJleGMiIGRhdGEtdXctcm0tZXh0LWxpbms9Im5hIj5OZXZlciBsZWF2ZSBhIGRvZyB1bmF0dGVuZGVkIGluIGEgdmVoaWNsZTwvYT48L3A+PC9kaXY+DQogICAgICAgICAgICA8IS0tISFXaWRnZXRFbmQtLT4NCg0KICAgIA0KPC9kaXY+DQoNCjwvZGl2PiANCg0KICAgICAgICA8Zm9vdGVyIGlkPSJwYWdlX2Zvb3RlciIgY2xhc3M9IiI+DQogICAgICAgICAgICA8IS0tc3RvcGluZGV4LS0+DQogICAgICAgICAgICANCjxkaXYgaWQ9ImZvb3RlcmNvbHVtbiIgY2xhc3M9InNpdGVfdGVtcGxhdGVfY29sdW1uICBmb290ZXJfY29sdW1uICAgIiA+DQoNCiAgICAgICAgICAgICAgICA8IS0tc3RvcGluZGV4LS0+DQogICAgICAgICAgICAgICAgICANCjxkaXYgY2xhc3M9ImNvbC1zbS00Ij4NCiAgICA8ZGl2IGNsYXNzPSJmb290ZXJfYWRkcmVzcyI+DQoJICAgIDxoMj5Db21lIFZpc2l0PC9oMj4NCjxhIGhyZWY9Ii8vZ29vLmdsL21hcHMvWDhIamJCQXlOMUV0WG83ZDciIHRhcmdldD0iX2JsYW5rIj4NCjxwPkNpdHkgb2YgTG91aXN2aWxsZSwgQ088L3A+DQo8cD43NDkgTWFpbiBTdDwvcD4NCjxwPkxvdWlzdmlsbGUsIENPIDgwMDI3PC9wPg0KPC9hPg0KICAgIDwvZGl2Pg0KPC9kaXY+DQoNCiAgICAgICAgICAgICAgICA8IS0tc3RhcnRpbmRleC0tPg0KICAgICAgICAgICAgDQoNCiAgICAgICAgICAgICAgICA8IS0tc3RvcGluZGV4LS0+DQogICAgICAgICAgICAgICAgICANCjxkaXYgY2xhc3M9ImNvbC1zbS00Ij4NCiAgICA8ZGl2IGNsYXNzPSJmb290ZXJfcGhvbmUiPg0KCTxoMj5Db250YWN0PC9oMj4NCjxwPlBob25lOiA8YSBocmVmPSJ0ZWw6MzAzNjY2NjU2NSI+KDMwMykgNjY2LTY1NjU8L2E+PC9wPg0KPGEgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vaG91cnMtY2xvc3VyZXMiPkhvdXJzICZhbXA7IENsb3N1cmVzPC9hPjxicj4NCjxwPjxhIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L3N0YWZmLWRpcmVjdG9yeSI+U3RhZmYgRGlyZWN0b3J5PC9hPjwvcD4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgPCEtLXN0YXJ0aW5kZXgtLT4NCiAgICAgICAgICAgIA0KDQogICAgICAgICAgICAgICAgPCEtLXN0b3BpbmRleC0tPg0KICAgICAgICAgICAgICAgIA0KPGRpdiBjbGFzcz0iY29sLXNtLTQiPg0KICAgIDxkaXYgY2xhc3M9InNvY2lhbF9pY29ucyI+DQogICAgICAgIDxoMj5LZWVwIGluIFRvdWNoPC9oMj4NCiAgICAJCTxhIGhyZWY9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9Mb3Vpc3ZpbGxlQ08iIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iIj4NCiAgICAJCQk8aW1nIHNyYz0iL2hvbWUvc2hvd3B1Ymxpc2hlZGltYWdlLzI0OC82MzU0NDU3Nzg2NTEwMzAwMDAiIGFsdD0iZmFjZWJvb2siIC8+DQogICAgCQk8L2E+DQogICAgCQk8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL0NpdHlMb3Vpc3ZsbGVDbyIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSIiPg0KICAgIAkJCTxpbWcgc3JjPSIvaG9tZS9zaG93cHVibGlzaGVkaW1hZ2UvMjUwLzYzNTQ0NTc3ODY1Mzg3MDAwMCIgYWx0PSJ0d2l0ZXIiIC8+DQogICAgCQk8L2E+DQogICAgCQk8YSBocmVmPSJodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL3Zpc2l0bG91aXN2aWxsZWNvLyIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSIiPg0KICAgIAkJCTxpbWcgc3JjPSIvaG9tZS9zaG93cHVibGlzaGVkaW1hZ2UvMTIwOTcvNjM3MjY4NTU5ODMxNTcwMDAwIiBhbHQ9ImZvb3Rlci1pbnN0YWdyYW1AMngiIC8+DQogICAgCQk8L2E+DQogICAgCQk8YSBocmVmPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDcm81UGVPREUtTUNuTnp1V3l4Uko2QS92aWRlb3MiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0iIj4NCiAgICAJCQk8aW1nIHNyYz0iL2hvbWUvc2hvd3B1Ymxpc2hlZGltYWdlLzEyMTAzLzYzNzI2ODU1OTg0ODEwMDAwMCIgYWx0PSJmb290ZXIteW91dHViZUAyeCIgLz4NCiAgICAJCTwvYT4NCiAgICAJCTxhIGhyZWY9Ii9sb2NhbC1nb3Zlcm5tZW50L3N0YWZmLWRpcmVjdG9yeSIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSIiPg0KICAgIAkJCTxpbWcgc3JjPSIvaG9tZS9zaG93cHVibGlzaGVkaW1hZ2UvMTIwOTMvNjM3MjY4NTU5ODIwNzcwMDAwIiBhbHQ9ImZvb3Rlci1lbWFpbEAyeCIgLz4NCiAgICAJCTwvYT4NCiAgICA8L2Rpdj4NCjwvZGl2Pg0KICAgICAgICAgICAgICAgIDwhLS1zdGFydGluZGV4LS0+DQogICAgICAgICAgICANCg0KICAgICAgICAgICAgICAgIDwhLS1zdG9waW5kZXgtLT4NCiAgICAgICAgICAgICAgICAgIA0KDQo8ZGl2IGNsYXNzPSJmb290ZXJfbmF2Ij4NCgkJPGEgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlIiB0YXJnZXQ9Il9zZWxmIj5MaXZpbmcgaW4gTG91aXN2aWxsZTwvYT4JCQ0KCQk8YSBocmVmPSIvZG9pbmctYnVzaW5lc3MiIHRhcmdldD0iX3NlbGYiPkRvaW5nIEJ1c2luZXNzPC9hPgkJDQoJCTxhIGhyZWY9Ii9leHBsb3JpbmctbG91aXN2aWxsZSIgdGFyZ2V0PSJfc2VsZiI+RXhwbG9yaW5nIExvdWlzdmlsbGU8L2E+CQkNCgkJPGEgaHJlZj0iL2xvY2FsLWdvdmVybm1lbnQiIHRhcmdldD0iX3NlbGYiPkxvY2FsIEdvdmVybm1lbnQ8L2E+CQkNCgkJPGEgaHJlZj0iL2xpdmluZy1pbi1sb3Vpc3ZpbGxlL2NpdHktaW5mb3JtYXRpb24vcHJpdmFjeS1wb2xpY3kiIHRhcmdldD0iX3NlbGYiPlByaXZhY3kgUG9saWN5PC9hPgkJDQo8L2Rpdj4NCg0KPHAgY2xhc3M9ImZvb3Rlcl9jb3B5cmlnaHQiPkRlc2lnbiBCeSA8YSBocmVmPSIvL3d3dy5ncmFuaWN1cy5jb20vIj5HcmFuaWN1czwvYT4gLSBDb25uZWN0aW5nIFBlb3BsZSBhbmQgR292ZXJubWVudDwvcD4NCiAgICAgICAgICAgICAgICA8IS0tc3RhcnRpbmRleC0tPg0KICAgICAgICAgICAgDQoNCjwvZGl2Pg0KDQogICAgICAgICAgICA8IS0tc3RhcnRpbmRleC0tPg0KICAgICAgICA8L2Zvb3Rlcj4NCiAgICAgICAgDQogICAgPC9kaXY+DQo8L2Rpdj4NCg0KPHNjcmlwdCBzcmM9Ii9Qcm9qZWN0L0NvbnRlbnRzL01haW4vbW9iaWxlX25hdl9zY3JpcHRzLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0Pg0KDQo8c2NyaXB0IHNyYz0iL1Byb2plY3QvQ29udGVudHMvTWFpbi9zaXRlbGF5b3V0X3NjcmlwdHMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+DQogICAgDQogICAgPHNjcmlwdD4NCiAgICAgICAgJChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAkKCIucmVDb21tZW50W2NvbW1lbnRdIikucmVtb3ZlQ2xhc3MoInJlQ29tbWVudCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cigiY29tbWVudCIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cigiYXV0aG9yIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCJ0aXRsZSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cigidGltZXN0YW1wIik7DQogICAgICAgIH0pDQogICAgPC9zY3JpcHQ+DQogICAgDQoNCiAgICANCg0KICAgIDxzY3JpcHQgc3JjPSIvU2NyaXB0cy9TY3JpcHRCdW5kbGVWaXNpb25Gcm9udGVuZC5qc2JuZD92PVlCTTktQS11YTNYckdMMWNlbHZRZ2J3RTF6dzEtRHRYVUhYaE1LSDQyS3cxIj48L3NjcmlwdD4NCg0KDQogICAgDQogICAgDQogICAgPHNjcmlwdD4NCiAgICAgICAgdHJ5IHsgbWFudWFsUmVuZGVyTW9iaWxlKCk7IH0gY2F0Y2ggKGVycikge30NCiAgICA8L3NjcmlwdD4NCiAgICANCjwhLS0gR29vZ2xlIFRhZyBNYW5hZ2VyIC0tPg0KPG5vc2NyaXB0PjxpZnJhbWUgc3JjPSIvL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ucy5odG1sP2lkPUdUTS1UN0pHNTkiDQpoZWlnaHQ9IjAiIHdpZHRoPSIwIiBzdHlsZT0iZGlzcGxheTpub25lO3Zpc2liaWxpdHk6aGlkZGVuIj48L2lmcmFtZT48L25vc2NyaXB0Pg0KPHNjcmlwdD4oZnVuY3Rpb24gKHcsIGQsIHMsIGwsIGkpIHsNCiAgICB3W2xdID0gd1tsXSB8fCBbXTsgd1tsXS5wdXNoKHsNCiAgICAgICAgJ2d0bS5zdGFydCc6DQogICAgICAgIG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBldmVudDogJ2d0bS5qcycNCiAgICB9KTsgdmFyIGYgPSBkLmdldEVsZW1lbnRzQnlUYWdOYW1lKHMpWzBdLA0KICAgIGogPSBkLmNyZWF0ZUVsZW1lbnQocyksIGRsID0gbCAhPSAnZGF0YUxheWVyJyA/ICcmbD0nICsgbCA6ICcnOyBqLmFzeW5jID0gdHJ1ZTsgai5zcmMgPQ0KICAgICdodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndG0uanM/aWQ9JyArIGkgKyBkbDsgZi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShqLCBmKTsNCn0pKHdpbmRvdywgZG9jdW1lbnQsICdzY3JpcHQnLCAndXNlckRhdGFMYXllcicsICdHVE0tVDdKRzU5Jyk7DQooZnVuY3Rpb24gKHdpbmRvdykgew0KICAgIHZhciBkYXRhTGF5ZXIgPSB3aW5kb3cudXNlckRhdGFMYXllciA9IHdpbmRvdy51c2VyRGF0YUxheWVyIHx8IFtdOw0KICAgIGRhdGFMYXllci5wdXNoKA0KICAgICAgICB7IkVudiI6IkxJVkUiLCJTZXNzaW9uSUQiOiJlNWVnZGVua2E1YmF0aHR6aWh3dXpqb3AiLCJJZGVudGl0eSI6IjExNjc4OGZmYWQ2ZjQzNjJhNDA3NDgzYzI1OGJlYzMzIiwiT3JnYW5pemF0aW9uTmFtZSI6IkNpdHkgb2YgTG91aXN2aWxsZSwgQ08iLCJMb2dpblVzZXIiOiIiLCJMb2dpblVzZXJUeXBlIjoiIiwiTG9naW5XZWJzaXRlVXNlciI6IiIsIkxvZ2luTWVtYmVyIjoiIn0NCiAgICAgICAgKTsNCn0pKHdpbmRvdykNCjwvc2NyaXB0Pg0KPCEtLSBFbmQgR29vZ2xlIFRhZyBNYW5hZ2VyIC0tPg0KICAgIA0KICAgIDxzY3JpcHQgc3JjPSIvU2NyaXB0cy9Db21wb25lbnRzL1NjcmlwdHNGRUJ1bmRsZS5qc2JuZD92PTFHcXVXYW1PLTF5RmF3aGctRVBkcVdKajNCU3B1RXN5djFIejVpUnZpME0xIj48L3NjcmlwdD4NCg0KDQogICAgPHNjcmlwdD4NCiAgICAgICAgJChmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHZhciBzaXRld3JhcHBlciA9ICQoIi5zaXRld3JhcHBlciIpOw0KICAgICAgICAgICAgaWYoc2l0ZXdyYXBwZXIubGVuZ3RoICYmICFzaXRld3JhcHBlci5oYXNDbGFzcygiIikpIHsNCiAgICAgICAgICAgICAgICBzaXRld3JhcHBlci5hZGRDbGFzcygiIik7DQogICAgICAgICAgICB9ICAgICANCiAgICAgICAgICAgIC8vVklTUFAtNDQ2NiAtIHdlIGdldCB0aGUgY29va2llIHZhbHVlIGFuZCBzZXQgdGhlIGNvcnJlY3Qgc3R5bGVzaGVldCBwYXRoIGZvciBwYWdlcyB3aXRob3V0IHRoZSBQYWdlIFRpdGxlIHdpZGdldC4NCiAgICAgICAgICAgIHZhciB1c2VEZXNpZ25UaGVtRm9udFNpemVDc3MgPSB3aW5kb3cudmlzaW9uT3B0aW9ucy51c2VEZXNpZ25UaGVtRm9udFNpemVDc3M7DQogICAgICAgICAgICB2YXIgZm9sZGVyUGF0aCA9IHVzZURlc2lnblRoZW1Gb250U2l6ZUNzcyA9PSB0cnVlID8gd2luZG93LnZpc2lvbk9wdGlvbnMuY3VycmVudERlc2lnbkZvbGRlclBhdGggOiB3aW5kb3cudmlzaW9uT3B0aW9ucy5tYWluRm9sZGVyUGF0aDsNCiAgICAgICAgICAgIGlmICghZm9sZGVyUGF0aCkNCiAgICAgICAgICAgICAgICBmb2xkZXJQYXRoID0gd2luZG93LnZpc2lvbk9wdGlvbnMubWFpbkZvbGRlclBhdGg7DQoNCiAgICAgICAgICAgIHZhciBnZXRGb250U2l6ZVVybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyB3aW5kb3cudmlzaW9uT3B0aW9ucy52aXJ0dWFsQXBwbGljYXRpb25QYXRoICsgIlNoYXJlZC9HZXRGb250U2l6ZUNvb2tpZSI7DQogICAgICAgICAgICB2YXIgZm9udFNpemUgPSAieC1zbWFsbC5jc3MiOw0KICAgICAgICAgICAgJC5mcm9udGVuZEFqYXgoew0KICAgICAgICAgICAgICAgIHVybDogZ2V0Rm9udFNpemVVcmwsDQogICAgICAgICAgICAgICAgdHlwZTogJ0dFVCcsDQogICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5mb250U2l6ZUNvb2tpZSAmJiBkYXRhLmZvbnRTaXplQ29va2llICE9ICIiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZSA9IGRhdGEuZm9udFNpemVDb29raWU7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJCgiI2FjdGl2ZV9mb250IikuYXR0cigiaHJlZiIsIGZvbGRlclBhdGggKyBmb250U2l6ZSkuYXR0cigiZGF0YS1jc3MiLCBmb250U2l6ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIDwvc2NyaXB0PiAgIA0KDQoNCiAgICANCjwvYm9keT4NCjwvaHRtbD4= - recorded_at: Sun, 28 Apr 2024 01:08:55 GMT -recorded_with: VCR 6.2.0