From 879897ada6247e1bb19905b12e5d2fd99965089e Mon Sep 17 00:00:00 2001 From: Kitson Kelly Date: Tue, 16 Feb 2021 13:50:27 +1100 Subject: [PATCH] feat(cli): support auth tokens for accessing private modules (#9508) Closes #5239 --- cli/auth_tokens.rs | 144 +++++++++++++++++++ cli/file_fetcher.rs | 24 +++- cli/flags.rs | 12 +- cli/http_util.rs | 135 +++++++++++++---- cli/main.rs | 1 + cli/tests/integration_tests.rs | 36 +++++ docs/images/private-github-new-token.png | Bin 0 -> 67173 bytes docs/images/private-github-token-display.png | Bin 0 -> 32634 bytes docs/images/private-pat.png | Bin 0 -> 11359 bytes docs/linking_to_external_code/private.md | 75 ++++++++++ docs/toc.json | 1 + test_util/src/lib.rs | 36 +++++ 12 files changed, 430 insertions(+), 34 deletions(-) create mode 100644 cli/auth_tokens.rs create mode 100644 docs/images/private-github-new-token.png create mode 100644 docs/images/private-github-token-display.png create mode 100644 docs/images/private-pat.png create mode 100644 docs/linking_to_external_code/private.md diff --git a/cli/auth_tokens.rs b/cli/auth_tokens.rs new file mode 100644 index 0000000000..f52f564e15 --- /dev/null +++ b/cli/auth_tokens.rs @@ -0,0 +1,144 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +use deno_core::ModuleSpecifier; +use std::fmt; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct AuthToken { + host: String, + token: String, +} + +impl fmt::Display for AuthToken { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Bearer {}", self.token) + } +} + +/// A structure which contains bearer tokens that can be used when sending +/// requests to websites, intended to authorize access to private resources +/// such as remote modules. +#[derive(Debug, Clone)] +pub struct AuthTokens(Vec); + +impl AuthTokens { + /// Create a new set of tokens based on the provided string. It is intended + /// that the string be the value of an environment variable and the string is + /// parsed for token values. The string is expected to be a semi-colon + /// separated string, where each value is `{token}@{hostname}`. + pub fn new(maybe_tokens_str: Option) -> Self { + let mut tokens = Vec::new(); + if let Some(tokens_str) = maybe_tokens_str { + for token_str in tokens_str.split(';') { + if token_str.contains('@') { + let pair: Vec<&str> = token_str.rsplitn(2, '@').collect(); + let token = pair[1].to_string(); + let host = pair[0].to_lowercase(); + tokens.push(AuthToken { host, token }); + } else { + error!("Badly formed auth token discarded."); + } + } + debug!("Parsed {} auth token(s).", tokens.len()); + } + + Self(tokens) + } + + /// Attempt to match the provided specifier to the tokens in the set. The + /// matching occurs from the right of the hostname plus port, irrespective of + /// scheme. For example `https://www.deno.land:8080/` would match a token + /// with a host value of `deno.land:8080` but not match `www.deno.land`. The + /// matching is case insensitive. + pub fn get(&self, specifier: &ModuleSpecifier) -> Option { + self.0.iter().find_map(|t| { + let url = specifier.as_url(); + let hostname = if let Some(port) = url.port() { + format!("{}:{}", url.host_str()?, port) + } else { + url.host_str()?.to_string() + }; + if hostname.to_lowercase().ends_with(&t.host) { + Some(t.clone()) + } else { + None + } + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_auth_token() { + let auth_tokens = AuthTokens::new(Some("abc123@deno.land".to_string())); + let fixture = + ModuleSpecifier::resolve_url("https://deno.land/x/mod.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Bearer abc123" + ); + let fixture = + ModuleSpecifier::resolve_url("https://www.deno.land/x/mod.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Bearer abc123".to_string() + ); + let fixture = + ModuleSpecifier::resolve_url("http://127.0.0.1:8080/x/mod.ts").unwrap(); + assert_eq!(auth_tokens.get(&fixture), None); + let fixture = + ModuleSpecifier::resolve_url("https://deno.land.example.com/x/mod.ts") + .unwrap(); + assert_eq!(auth_tokens.get(&fixture), None); + let fixture = + ModuleSpecifier::resolve_url("https://deno.land:8080/x/mod.ts").unwrap(); + assert_eq!(auth_tokens.get(&fixture), None); + } + + #[test] + fn test_auth_tokens_multiple() { + let auth_tokens = + AuthTokens::new(Some("abc123@deno.land;def456@example.com".to_string())); + let fixture = + ModuleSpecifier::resolve_url("https://deno.land/x/mod.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Bearer abc123".to_string() + ); + let fixture = + ModuleSpecifier::resolve_url("http://example.com/a/file.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Bearer def456".to_string() + ); + } + + #[test] + fn test_auth_tokens_port() { + let auth_tokens = + AuthTokens::new(Some("abc123@deno.land:8080".to_string())); + let fixture = + ModuleSpecifier::resolve_url("https://deno.land/x/mod.ts").unwrap(); + assert_eq!(auth_tokens.get(&fixture), None); + let fixture = + ModuleSpecifier::resolve_url("http://deno.land:8080/x/mod.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Bearer abc123".to_string() + ); + } + + #[test] + fn test_auth_tokens_contain_at() { + let auth_tokens = AuthTokens::new(Some("abc@123@deno.land".to_string())); + let fixture = + ModuleSpecifier::resolve_url("https://deno.land/x/mod.ts").unwrap(); + assert_eq!( + auth_tokens.get(&fixture).unwrap().to_string(), + "Bearer abc@123".to_string() + ); + } +} diff --git a/cli/file_fetcher.rs b/cli/file_fetcher.rs index 23ace672c5..722813457d 100644 --- a/cli/file_fetcher.rs +++ b/cli/file_fetcher.rs @@ -1,9 +1,11 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use crate::auth_tokens::AuthTokens; use crate::colors; use crate::http_cache::HttpCache; use crate::http_util::create_http_client; use crate::http_util::fetch_once; +use crate::http_util::FetchOnceArgs; use crate::http_util::FetchOnceResult; use crate::media_type::MediaType; use crate::text_encoding; @@ -19,6 +21,7 @@ use deno_core::futures::future::FutureExt; use deno_core::ModuleSpecifier; use deno_runtime::deno_fetch::reqwest; use std::collections::HashMap; +use std::env; use std::fs; use std::future::Future; use std::io::Read; @@ -27,6 +30,7 @@ use std::pin::Pin; use std::sync::Arc; use std::sync::Mutex; +static DENO_AUTH_TOKENS: &str = "DENO_AUTH_TOKENS"; pub const SUPPORTED_SCHEMES: [&str; 4] = ["data", "file", "http", "https"]; /// A structure representing a source file. @@ -308,6 +312,7 @@ fn strip_shebang(mut value: String) -> String { /// A structure for resolving, fetching and caching source files. #[derive(Clone)] pub struct FileFetcher { + auth_tokens: AuthTokens, allow_remote: bool, cache: FileCache, cache_setting: CacheSetting, @@ -323,8 +328,9 @@ impl FileFetcher { ca_data: Option>, ) -> Result { Ok(Self { + auth_tokens: AuthTokens::new(env::var(DENO_AUTH_TOKENS).ok()), allow_remote, - cache: FileCache::default(), + cache: Default::default(), cache_setting, http_cache, http_client: create_http_client(get_user_agent(), ca_data)?, @@ -488,17 +494,25 @@ impl FileFetcher { info!("{} {}", colors::green("Download"), specifier); - let file_fetcher = self.clone(); - let cached_etag = match self.http_cache.get(specifier.as_url()) { + let maybe_etag = match self.http_cache.get(specifier.as_url()) { Ok((_, headers)) => headers.get("etag").cloned(), _ => None, }; + let maybe_auth_token = self.auth_tokens.get(&specifier); let specifier = specifier.clone(); let permissions = permissions.clone(); - let http_client = self.http_client.clone(); + let client = self.http_client.clone(); + let file_fetcher = self.clone(); // A single pass of fetch either yields code or yields a redirect. async move { - match fetch_once(http_client, specifier.as_url(), cached_etag).await? { + match fetch_once(FetchOnceArgs { + client, + url: specifier.as_url().clone(), + maybe_etag, + maybe_auth_token, + }) + .await? + { FetchOnceResult::NotModified => { let file = file_fetcher.fetch_cached(&specifier, 10)?.unwrap(); Ok(file) diff --git a/cli/flags.rs b/cli/flags.rs index f7c83294cd..80ad6e240f 100644 --- a/cli/flags.rs +++ b/cli/flags.rs @@ -219,18 +219,22 @@ impl From for PermissionsOptions { } } -static ENV_VARIABLES_HELP: &str = "ENVIRONMENT VARIABLES: +static ENV_VARIABLES_HELP: &str = r#"ENVIRONMENT VARIABLES: + DENO_AUTH_TOKENS A semi-colon separated list of bearer tokens and + hostnames to use when fetching remote modules from + private repositories + (e.g. "abcde12345@deno.land;54321edcba@github.com") + DENO_CERT Load certificate authority from PEM encoded file DENO_DIR Set the cache directory DENO_INSTALL_ROOT Set deno install's output directory (defaults to $HOME/.deno/bin) - DENO_CERT Load certificate authority from PEM encoded file - NO_COLOR Set to disable color HTTP_PROXY Proxy address for HTTP requests (module downloads, fetch) HTTPS_PROXY Proxy address for HTTPS requests (module downloads, fetch) + NO_COLOR Set to disable color NO_PROXY Comma-separated list of hosts which do not use a proxy - (module downloads, fetch)"; + (module downloads, fetch)"#; static DENO_HELP: &str = "A secure JavaScript and TypeScript runtime diff --git a/cli/http_util.rs b/cli/http_util.rs index 437b9355c8..69778a101a 100644 --- a/cli/http_util.rs +++ b/cli/http_util.rs @@ -1,11 +1,14 @@ // Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. +use crate::auth_tokens::AuthToken; + use deno_core::error::generic_error; use deno_core::error::AnyError; use deno_core::url::Url; use deno_runtime::deno_fetch::reqwest; use deno_runtime::deno_fetch::reqwest::header::HeaderMap; use deno_runtime::deno_fetch::reqwest::header::HeaderValue; +use deno_runtime::deno_fetch::reqwest::header::AUTHORIZATION; use deno_runtime::deno_fetch::reqwest::header::IF_NONE_MATCH; use deno_runtime::deno_fetch::reqwest::header::LOCATION; use deno_runtime::deno_fetch::reqwest::header::USER_AGENT; @@ -76,24 +79,33 @@ pub enum FetchOnceResult { Redirect(Url, HeadersMap), } +#[derive(Debug)] +pub struct FetchOnceArgs { + pub client: Client, + pub url: Url, + pub maybe_etag: Option, + pub maybe_auth_token: Option, +} + /// Asynchronously fetches the given HTTP URL one pass only. /// If no redirect is present and no error occurs, /// yields Code(ResultPayload). /// If redirect occurs, does not follow and /// yields Redirect(url). pub async fn fetch_once( - client: Client, - url: &Url, - cached_etag: Option, + args: FetchOnceArgs, ) -> Result { - let url = url.clone(); + let mut request = args.client.get(args.url.clone()); - let mut request = client.get(url.clone()); - - if let Some(etag) = cached_etag { + if let Some(etag) = args.maybe_etag { let if_none_match_val = HeaderValue::from_str(&etag).unwrap(); request = request.header(IF_NONE_MATCH, if_none_match_val); } + if let Some(auth_token) = args.maybe_auth_token { + let authorization_val = + HeaderValue::from_str(&auth_token.to_string()).unwrap(); + request = request.header(AUTHORIZATION, authorization_val); + } let response = request.send().await?; if response.status() == StatusCode::NOT_MODIFIED { @@ -126,20 +138,23 @@ pub async fn fetch_once( if let Some(location) = response.headers().get(LOCATION) { let location_string = location.to_str().unwrap(); debug!("Redirecting to {:?}...", &location_string); - let new_url = resolve_url_from_location(&url, location_string); + let new_url = resolve_url_from_location(&args.url, location_string); return Ok(FetchOnceResult::Redirect(new_url, headers_)); } else { return Err(generic_error(format!( "Redirection from '{}' did not provide location header", - url + args.url ))); } } if response.status().is_client_error() || response.status().is_server_error() { - let err = - generic_error(format!("Import '{}' failed: {}", &url, response.status())); + let err = generic_error(format!( + "Import '{}' failed: {}", + args.url, + response.status() + )); return Err(err); } @@ -165,7 +180,13 @@ mod tests { let url = Url::parse("http://127.0.0.1:4545/cli/tests/fixture.json").unwrap(); let client = create_test_client(None); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert!(!body.is_empty()); assert_eq!(headers.get("content-type").unwrap(), "application/json"); @@ -185,7 +206,13 @@ mod tests { ) .unwrap(); let client = create_test_client(None); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert_eq!(String::from_utf8(body).unwrap(), "console.log('gzip')"); assert_eq!( @@ -204,7 +231,13 @@ mod tests { let _http_server_guard = test_util::http_server(); let url = Url::parse("http://127.0.0.1:4545/etag_script.ts").unwrap(); let client = create_test_client(None); - let result = fetch_once(client.clone(), &url, None).await; + let result = fetch_once(FetchOnceArgs { + client: client.clone(), + url: url.clone(), + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert!(!body.is_empty()); assert_eq!(String::from_utf8(body).unwrap(), "console.log('etag')"); @@ -217,8 +250,13 @@ mod tests { panic!(); } - let res = - fetch_once(client, &url, Some("33a64df551425fcc55e".to_string())).await; + let res = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: Some("33a64df551425fcc55e".to_string()), + maybe_auth_token: None, + }) + .await; assert_eq!(res.unwrap(), FetchOnceResult::NotModified); } @@ -231,7 +269,13 @@ mod tests { ) .unwrap(); let client = create_test_client(None); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert!(!body.is_empty()); assert_eq!(String::from_utf8(body).unwrap(), "console.log('brotli');"); @@ -256,7 +300,13 @@ mod tests { let target_url = Url::parse("http://localhost:4545/cli/tests/fixture.json").unwrap(); let client = create_test_client(None); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Redirect(url, _)) = result { assert_eq!(url, target_url); } else { @@ -322,7 +372,13 @@ mod tests { ), ) .unwrap(); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert!(!body.is_empty()); assert_eq!(headers.get("content-type").unwrap(), "application/json"); @@ -354,7 +410,13 @@ mod tests { ), ) .unwrap(); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert_eq!(String::from_utf8(body).unwrap(), "console.log('gzip')"); assert_eq!( @@ -385,7 +447,13 @@ mod tests { ), ) .unwrap(); - let result = fetch_once(client.clone(), &url, None).await; + let result = fetch_once(FetchOnceArgs { + client: client.clone(), + url: url.clone(), + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert!(!body.is_empty()); assert_eq!(String::from_utf8(body).unwrap(), "console.log('etag')"); @@ -399,8 +467,13 @@ mod tests { panic!(); } - let res = - fetch_once(client, &url, Some("33a64df551425fcc55e".to_string())).await; + let res = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: Some("33a64df551425fcc55e".to_string()), + maybe_auth_token: None, + }) + .await; assert_eq!(res.unwrap(), FetchOnceResult::NotModified); } @@ -425,7 +498,13 @@ mod tests { ), ) .unwrap(); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; if let Ok(FetchOnceResult::Code(body, headers)) = result { assert!(!body.is_empty()); assert_eq!(String::from_utf8(body).unwrap(), "console.log('brotli');"); @@ -446,7 +525,13 @@ mod tests { let url_str = "http://127.0.0.1:4545/bad_redirect"; let url = Url::parse(url_str).unwrap(); let client = create_test_client(None); - let result = fetch_once(client, &url, None).await; + let result = fetch_once(FetchOnceArgs { + client, + url, + maybe_etag: None, + maybe_auth_token: None, + }) + .await; assert!(result.is_err()); let err = result.unwrap_err(); // Check that the error message contains the original URL diff --git a/cli/main.rs b/cli/main.rs index d98313f545..2addfa0d51 100644 --- a/cli/main.rs +++ b/cli/main.rs @@ -8,6 +8,7 @@ extern crate lazy_static; extern crate log; mod ast; +mod auth_tokens; mod checksum; mod colors; mod deno_dir; diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index 15da2359df..a25a51b200 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -208,6 +208,42 @@ mod integration { assert_eq!("noColor false", util::strip_ansi_codes(stdout_str)); } + #[test] + fn auth_tokens() { + let _g = util::http_server(); + let output = util::deno_cmd() + .current_dir(util::root_path()) + .arg("run") + .arg("http://127.0.0.1:4551/cli/tests/001_hello.js") + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn() + .unwrap() + .wait_with_output() + .unwrap(); + assert!(!output.status.success()); + let stdout_str = std::str::from_utf8(&output.stdout).unwrap().trim(); + assert!(stdout_str.is_empty()); + let stderr_str = std::str::from_utf8(&output.stderr).unwrap().trim(); + eprintln!("{}", stderr_str); + assert!(stderr_str.contains("Import 'http://127.0.0.1:4551/cli/tests/001_hello.js' failed: 404 Not Found")); + + let output = util::deno_cmd() + .current_dir(util::root_path()) + .arg("run") + .arg("http://127.0.0.1:4551/cli/tests/001_hello.js") + .env("DENO_AUTH_TOKENS", "abcdef123456789@127.0.0.1:4551") + .stdout(std::process::Stdio::piped()) + .stderr(std::process::Stdio::piped()) + .spawn() + .unwrap() + .wait_with_output() + .unwrap(); + assert!(output.status.success()); + let stdout_str = std::str::from_utf8(&output.stdout).unwrap().trim(); + assert_eq!(util::strip_ansi_codes(stdout_str), "Hello World"); + } + #[cfg(unix)] #[test] pub fn test_raw_tty() { diff --git a/docs/images/private-github-new-token.png b/docs/images/private-github-new-token.png new file mode 100644 index 0000000000000000000000000000000000000000..8d112cb5e0659f82621c4240b25a735d2c02dfb1 GIT binary patch literal 67173 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 literal 0 HcmV?d00001 diff --git a/docs/images/private-github-token-display.png b/docs/images/private-github-token-display.png new file mode 100644 index 0000000000000000000000000000000000000000..289f802104f33241eda997f650a9e48398ef6dc6 GIT binary patch literal 32634 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

R%)?0ku zdsD-pSyUVT-Ho(xYfC^KQZD8GFD4g8_~zNpY9{ulI@KZqn>|SU6NO>#_qmVcm)^!d zm6ARKKp<33uS`6yO{7Rtciz)ABmkwMc=~_5?fs#hz(P4dBm#D9;4N1YPX9#tAjJp( zI3={e(ckL(ND9LM0G?=DLnQP6$_ju0kmqNhT=9P;DS7~~Qqcz|T8aE0$^``s4WOs7 zKmq?psY%kn);tRT8*7AMpOFa1#6Xa~fBv7OFGvIcq5l83az6HaPV8)qW8~z2Vb#9@ z@g*!06e8>o%`k~!pRY+BHAsQ~JWv2Veg@qR0m~nb`X^pO6wocDHUEt2Ki%^AqgzHyNDBYcEmVLwiNL^+e=-9ik|RVW z94iuF!=e1x<^3J60EiQ#q7nJ8zC%CsUAO!%P_FW|5hYNfLI_&+SigzA?;rU6aeBPmDK*s_J3Cd90f3rV2tWxXa21* zAvz$gpik)U=kjB`Qp9|Wt^Y4oCuxqo@+7Y%Ev>9BDyqJtpfEl%5|idRlVBz}D(RKY zFXj2NiUM1*(hVmI;E4b}2o3=zCMq^cH8(I|G&5($r=w$MXIJO?rh8kp?!Kg2_PTI4 z@h$}%YEP}yK)~cNu+H5~dgQ&ai}+O6@U`L&W|eF>$jI2_8Y%G`k3x5f=WTH^4=Fbh z3T0WDsc`}9F)=B6Y+js@ina5$X2HDUS4o!?Jj_QrUQV5z#5r+MR`@77Bnkxu6_r^9 zIVBOHoy0r$z}hp<31DarG5p3ej!8Oj>j42omx1ooJ>@SEBLP{0aNF8lx+}iiqli6@aa5 zV0bW-%WdZ+{L%YMO;gkPO6Oq{ZF+tl2gxIMH_fVZefT_1k2>5A_37`k!_^nlBC_2d zMNf|r<8Ygr+_6n39Q;T7%SW=+F?1@$Hm%mwT1CmSp|Gf?JJwD`x{69F?VUMfvau2+ zC+V2g+zhw-fqO@Up{i~Kca>C&Y4((qeeVZr=C7+|{r9O!Rs;MyXJeiH`JTEyGmfq9 z1H-0MO}9In3V-Zc5Fh}wpG2=-kXHr)KNNwNoRZMuPR<@RFf{NAmnm^jEtvD=1_Qu5 z-^j+qk_vGRPN)UdSm{mzI97W z4O0+20X_ky_x_CNz1mFC+$rY`Ee!hT`1tMpeHxpckim?qZc9!+C02 zTAjh&%1o29?YqbIT_&5G(ATe)k!g(wv|5hmkB`5_>3G}H-2AYn&W!b5XhAm|jlbOPj_JO4@%;UHSSE{&fh9oP{Neu0bTXrl zS`DcFV0?CVaritvy7^(iF5hCYl-u}uJax9H_GxLRZe)`8x*JBc6thsRjET|KnVc<5E(|MvDVlW=H?Pv zPIoXQQ5m;?=RIUGU+fY-S+GiD|DkRllY#PJ*!@zVfHCHH`pv>TdTRk2{88ug?b%vkcvF)DkFtnt9KO+i63*D@DyF}Y~@{u@>tPZ$_+W_lkNSkT0cp4cEoTkop@^YHu zP;r~$KP($)4lgdcTnE@4>E%RcbF}K`i~YjJ&dtrWP@!?Z3v=+&bGN&Dj>N#gP*+#? z^72w7m+`43PJ}XXhR0*91C%dO?XrSI=Wr z=V}*=xm!uTh$&c>aI@wYh^vU2?ZFM~d~TS-Y-Z$VEai_r-tk8Z(cMWIRSNgR=2t;=b)&FII(DhI%` z5+1JojN7@x;boybnO=`K0*e*KF*a^z$9Sy14vm4m+v_)WlE_q6r`rz+k4sn84iRV( zF9zZr@>f1jp%t@}sJi`8Uhn(Ul|<^Iq9O}6OTVwvjZTiYgV00O01vS8^0ApdZn&tN zoE$**eGJ&F*0={sY)<+u!yvZ+%W$EUmFakv`}>AAgX7U$?EcwOAmk{{Z zAsFJH%d^FC@$mphD*19}yj+h0)2Yl0x%{Au;piMNM*H*gv$Tp$6+vy! zfexmqsHkadHr9H26xo}TRd5wQsFUeBJ$Jb*A4k#}E!x{VdEF0K?4>gqQBgNaQHO zm1C$NQ2=gX`tWll$}fF^H`)B&Vw>OAi|`c1T-n*!Y8$B?uKL`R>hnAc3&&J3Ufym{tm zs;dJ$R75b49i8=Yus4}z*lk*HQJd*!+`4IyjL}E;wygCgtZucW5kIK&G3Mym@!1;OVqG%B!J;NC>?Xo6vaKIASi zFa7aTujwa&{vqj=rVF1MXf;HJ=qNniFiHZ&mBcYj)oL|hHV*Oy>!qb8ZTE4mz7G2t z+nWfS3C`5tudl%f1oEwt^MFa)O0D~TKRlVJS1^Zw+i7TF5@8a^hMpda^s7>(Mx(Hh z9|!MLsuXNz|={-rk2$ku6~6o9(9*}iAh3}`t00{B%$V)LO5c)CB}@=rVw*}`Kp zDXHjubpk~AxNOf9!mc`>1`$Eo#N&EBYPY!@k8~iHm6==HY;Lr>LyEe#v`(ZjH>dfN zWY|ilHTJMfb*Mm926_X`W3d3=vYsZVVLD6F3iU>i>0X0$KBw!OVlC7u&6*OK&hHXX z^w9FQ!CPmI<*F*Qxx(4*;f2ltpm&HBQy$bzF62ypKT)FzQE2rNpPQ#Ng zJOhkN`1|+gB6u8yxOf|_Zk4V)UMlKxv+wuEpa;I5?!B7Osh0>lps`3^BToX!Rob;U zgFwEkC|P~Lp6>M_r``y-mJ1z&Lw6?ut>^2l>CK_*n{A0TP0p=eR!?z*dR-1L2TRbX zXQ!h{)p9c0+MWxyW;NV`1U!ydN$?Vmr)%KrC|iV)7id{RJ$3KdoeUO!{(dn)zZWKO z($chQ!j*`RPKD_G>_Gi5){bZK@iTt=QePwo@==z{C4sy2$04+czjT=-^~X_;O9%sxM(oHf=DSR~1PDY&v%9qQRc72>}(QxBbPUerCs4QTe2m7U9e z$2!k=Fy*ZO;)-6)&q4W1N+=-v-5+${y<&!iCIRbd9thlIccyX7NjFqvB)z<^<6~pz zn;q8UqRzHIwrV(TYy#iV;c-P=L@XYRJ1uB<&;inh>|6{2w)#zy@Hk`y?TGf zn9T2C+wC@{GUC3!W4vb9+T|7*3I_Y_J|(-oIhowh-S&cx2FFkl6^qe!UXL4yExsrz z3Gg;@3U`^oWrvGHw-g-?72fj-h66702&!kuX|>uL&~x2?+Bb6=h0e^DTeIGeFE9QT zhj2$;W+NsB$)re+9T-O;Ni_To$D3gnGCe)rBE9LX796yGYHl13jrM9U0L)vtL=E}) zhhj0KTR}ZIc5J+a&)oKh*y#v z|3UdnqkVy}`2ZgqP_v_@5XLyFBytT63{eb|1)s;$<9Gll z%{L2Z`(kA5WE$4kfVDMTSOFUe_ z;*f-Rxp>_#Kex6fkHRvQ`rGE#=F zmMu;z9a2ibVROL=^P8|*S)IGOIVw3?eq}+awX3bc^7Hq{%8U*kk(k=5e>hw2-0Tso zv1EAOwHcftz3jcTiS4OUX-B}TZC29NSaKgZ`o4o6Z%9%sS5%MSaKOSdo@7T_lKNtZO-Rfsb66z_V;S@2@Mv3TvWtA z3kl8fY`78j>iU3~(OOw=kI~^08$xrsA*03hSM?au1@pt=;Bzke4N7gz3T1?KcM}{) zESYlJ*uM`F<0E#g`1+0lJgrAZB^ml2cY0!Oosg8R-*`&*641m9)re?ehj`TMp+_Yp zB?=3_K#Y#W`a`EDlks4UqsB^Lp2GHwfrOE@RYU+*c4FGb_a52+X=2v{q-G=b+OO4J zo&cQox!f!vF=2KfGx&=Mj6?$Q6_jo=18iS+4-kLGbY1Mq0QRr7<{oeL4mEUTWg@wV zC|8cp(`p_B0*islFgp#U@!Za*b7fAeqsm)>r4Y>%ae=S}C{M%%WY=Em_AvXT0}x%} z8r>rENUGhvH&=2sk@)3`pnM?Ap@B9?~u$;sBUesCE z1ob<^nS4KxE>&))yY;#cSZ(ULd!CmX2prF9);kj`-WG=7^?Y^>=t~((rmJg#;b22T z#6jAc;@PGNzeI2sRg`kCpA|dRA(}&O0(buUnI^p-GIQ1Cl*Qx~3~U0ItEZARyC0M3 zyX8b$qk6&TrXj#9tAopM`Ry%>*9|OicVFFJv1XHbpl2<>1IEx8Zc_1ZlGy=4%0a{j z;BE(Sk?V)=`I;2X#}^2LiO=s07jI^6LWN=+ofQ$6lm^i(*!c|K%*Cm1U#8K?)fBK} zV0d}2d&30%%A5TqYZ z;E1b`{H&BaIBv9ie+3dCaI4htAhi#1;?5mS>;+q;5tu|#2(%^_SSM&$2iF%IXo4cBPPEguQ9C0uyupML2 z9)r=xZ;qK}sz1;r(zn#4Ke`kBoG|Y+=Q!b~ql?ldiv6Nkqk&)Xt?wwX%$a80n(dWc zzAHmAgz)XCPLvq-kA0n9*vEn4_3#AnR;Bi8wN_X8W!5B<%jKBg7KsdwAltIrLP-fN z%876foG7ecEaLXzCKw0k3UW(CZf}zJ-Ey-N6S=ESvRbZork6xqwNfXXXsJtql*W&d zSBk+9dr0YLhbZ+DjO7$8s_oaWaKx@{jwc%>c80~Yt2x`sS7vxAx=UGDjOHv6(70J~ zNTi3zQKTJbEBTOQ=rmDIPIs;c`N0U=$PPoCcD8f?2mkEh-XwS#P1_pSlShDiGQe#) z`Oq{J-eR%m#{1V=;BN8MmKr=6mDrT5PHu_EH90BiPK;7!+uha!Ho$Y9etTD(ASa9g z7AtD8N()48)%k3Qeio=%cvyxI0z5;tT5D*nd&7+Sn%D#Dir2$gUx-3d0<*}tH$S=)LPO=roiwuz3@_!$mz82f~sgVkmk+s60@vPnXG5O|RJLir++cCAUJMhJ~> zEK&Kh5NF-mhihN3cn%X`}_OoblU>( zhMaIRr;G5oT*Qp9Rtbj`3bX>lcFDe0D3#7swBD#?z_Uf%a}wC|*~4kJky=Rtj>!xU z4Spe&EV(^j=azd$#5OQBCBKq zRsOs;5PjXdsL-N8F47EjtS}p!o#n4nGz-F@IgbPOL#Qdw=^3M%A8jBleo}vx`jYW5 zYMVl@=^?(wep~rqiFIe!AU;Kb=scxG+dOv*U_pt-%Bb2%{2u)QEP1SCFl9Z8}Lx$>p zQZkyr!f0H_EGEN)fgg%>bxd~C>vi91o6c4MTURtEkBe>JOu|r_x-{3vEy48WiymO! z%lwwav7|oKAd9z*WoDBp!F0c<#GbhyTDL#OKh3gnS(&XjX#;%P<)=HjU697$o|7VR zf}`=_rJ&4cv@ymrLAwogh&N#9Uu{8U-g^-=>kLS}!hx#+t1sawl@i71P2cGFty21e zBHj?Lp(AdgS0lM;39_Z2S4Zo5+p=14Eje8j(^L}Sqmy3lc*0RkG$kpgq(r{fE^^0!)Mp!eo;k@i1#fL1D>xyj#*=R#RLzIy3uO)r6sk1O*!- ztXGNZX0KGSHsNBno?E3v2m%hb#UPK=rKQ#-CMl~g*cPUKM3%%vQB#%t-Q4gHmS2sS zH3ozW2OE1TjTLVLgl1GWi}zypjMv~uPY0OO%?)3lnE%ywTu))D9Pw9TLdHNaPCg|O zC%rWVF%y%P3N?fAXAx-Dz1cdwfX=+KJmN-JeG&*9Vw5v#DFoe^S1`ZQs}sqTUD73h zVbL^x-g`Rg$VOjZpNCvZ!V0^THEsk7U)l*iH)u&?aB959iU!)`o}xVTiuUN+ae%nQ zub|PsHDnB6P72In6wq#u?RGHKD1sWn5X9BNU8!Wry-i}@JpG@0k$1?~gtX;y&}?|H znxw1~OY|22e-x<> zKU}Ut<8Mc1l=B}h_sR|iQ!{nYt(;>2=XB*C4A?^u(c_XC`Rs3(TlR0PfZzw$^II}6 zVEz}UNr(fu-f;_3;=hy(hWLZ)4XBW0{)^KDxIVbvaA3*5luQokgXDtgX@Jp6aKy(n1u ze=Cwh_`&rAEm>z$|E+NW34rT4YK2JtTM=;N53XlW9y|GOjS2BSxZdvHM?U`mMv9OR zu7{)<>G&Tcdi;Sz@i6oLgG2>I1fDb#7ig5e%(oQ81?5T<1>l=Tg@hB;;t-4sGt|F!(`S^0X z=PED8Rop2-L`^MKKsc%}f)XmiX_m+Q6$-M?w+j}V;2Um^ozIXj0Sf{J!0=&Sp1K^0 zmT1UZZ9+B-Q;Ej+8$K!0E0FH^ODv_}xrYf~Zz{*DKcS!_1jM!g2NWM{t-s=9MtqT% z(C^R1^tSH`-Z^gqzXd~lYWPbu6I5rWqn&xPl7SOmhnBx#)CH@OkuKr6810^4F6^yw zPQky4JN5}i0Np{}J0T$ifJVl%&`)z*G7tIg80lQ?{{9G)cf|6ao&20d8p|i zi~Q$2ve1?);Fzyrk+}iMyj8qzHoQ;}vw}em%VFw|lT^a*bYuaDHyg+Z0m4zH$wQFX z1OfP-zYymLyhOYuq@sL{iRY6>tBw8RvqsFkNII&ZgqKTc7w&?^a{?v){4ib32`Hm_W5w@a3@PP13U!AI{$4lyK-QnpAIU z#M=9y7Y$%G%y}a`0=?CqeiW!xsX#ed9sf`(j326UkyN15E; zDhFth2%F!~$-FVMT-?3WjK&Q0v?uNS--XdT0VF;+RDev*h2I_UM|gD!85vxIP^hzcP#;U> z_a9dSzJy6Y%ic`$)E5 zyZ=h}nu37ZSri#CMEe~DvMtbE+&8gw`@*HQMzq}%85saN0s9{8CTPAz&t>REi!*-G zT6j{o0QfHuDj)v~;EH9(DdqAjXW<~5tV{>;Hi?)IL+*v&|7HRmf|&jKTn-$wESkK3 zr{bQA$R5Oq`rJ;1$*%>SHyIo#e+K{M2B)X4Wuz2fB<%1BY+~XV7H$!anZ|FfQwU~A z-|Ju_CAT%FNnuh_m6e2xgjo`BC07xGXn#@Xq{q{!Q^N?RGlWSleWSld?+SB58a>>% zoq1E1jRTFi9)LlzhKrxMTS+vVK924kZqjjYf6j!NcF8R%DX7ScidMs#_5UdhZ8&x@ zXOmkL7Z&#FWnf~cTR;4H=qA6b`j@sCCZ!^;O)G|$I_k}gw^A#=T9jW&@3d%O3nTyL z&6qb{b9h3zy!SNE(=#qG?x3%d zbb6IK9DnRTX=tELSB)$7wCqSLjJnEYHO6*^Pe0%=~7r)P=xI15I|5y{$mR9 ztx`X z`-8X=>vv943l>#*McJ_Mu6l=!;>CxSiXGT%<@q^o8V&&dvhxr-Y)A+w!~1`#`Uc?2 zny%f6Z9AFR$;2o2Ol;e>Ik9cqb|$uMPHfxBJ>UO-?|bj9>N=-tS9SO5r`KA&*3-Rv zizS*bh-ynR-bPGcWZm_9Z{@-3|G~(3C|}TTZ7X(hFnHhVuh`n+swgjCwLPoSCz`fV}iNe%Kbev4~=GMtFj+%F523bK4L9et?gWl<3c^tG&*| z%tkFw)qRz$nGS$lgDehs;`vi=V*;4bWydROEEx)O*gI8mG{12_-6Z27` zoIe|XnWyKvR2u3mry22ZcOM{co8TiotGljy+!xz5DSxvti4(k8b?tb#e>Es-;!N=_ zYr#J_cki%DPj8g(gbq@ON|uzAKzO_D)SEk4NH~O*N8v?jwfRaFBnEO`tDbOnSoKf6 ziE+>vX*Mk`&{wM>C0lOL^OD1$QxNfBHY;DBzMNcOXg)x7*rW7fslrFVJcjUz>(l2JbMw0YTXDO|g%d+_va-3=|J{p7&zDlGNR@)cVUjiJ_B${Q?<8ZLGYM}X6N z7Wg{Xprys4&QLtdx)TuBsVI-aZ?}gY77gs+Z20KkWXV;%;wg68Z1%g9mEdB3a<@Ml zN;Z!QW~A3C0+EY?L+Wa_H&~%W+FuMXAWc48_$V4L{#D9du@}L@P1ATjtW3u9ygRlt z+ndv?+ot0=Oo%2ZBKhYJzPn2wjIr_4;6~Tv1Bd#DioE)tn~@~ZF)lqYa*Bbgu{IcB zm7W-5v;LiNsqmyBJDkAkCL03_3)JIdyy(rLqovC!oNDg}gbZ1y9}F5AB(y9m!w+Mx zFl9G&ryjxdl-xL)CTKO)If?kw2$S0(nc?(rTuwM}%I$P~sE;rGCok7yRGdyYQJs_s z+Wo0BzmF(e+<4pIeX0Q)<$?Xpy|to)73@4MPS9PXWt;`t3aAE3Y)zArYo;c}?b_V$ z&&M8143%1iP#0eJmxp1fiy6n*X&@Y4W;r?=-##h`FRz>}-!e-X`I=s37&Y=9^L|y$ z)JQDaDBAX%vqV4!`g(*gBHCa>`?~I>26`R4+iu09E~c~Mv^@5d1`m;sC6+J3I-~f) zsjoCol^Jf|C1j`*w9|3poPHcWUP8d<2yzqg@Lqx+ynL#3I0Ot8s0u^{mNL=vCS+SO zc5t@e9sJSWzGB+q;zQLoi+66KSZt4;d}*BK2h<~SY9>~1Se!0x)Cg?2&&-scu7!`$ zWFs+rTkpyUDi~<}-4gTSpsrg!)1msnV2GZiG$UEVEgcPqB=jeoh9*j^s+MjXflrV~ zM|+Etnw&cOB*uY@2P4VyDM!6t49=(Y{r!;eI5v!8=*UEE06@)mc!6=GdgRLD;i4I_ z{@vB+?HZQor-j4!m2?6i-UgFKeM*V9Dj>+lmhD9Se6WGuY&d^C}Y6q3DN z#$P`W06spBU#p{4#H=~3eizD)wixJ%iAs7)$LW||jTS~44njf2ycI6kn1^qO{jte; z?r*D}+n!jb0i#VOS7rKtt2tb!B%zTknB4N3^V0nD^Xtpo%7ZcILClRY*sKbKd@J9_ z*iUg!j>7V2c-j684oDAHEPUC0b+nH&i@Y>uHL2!zO-I}Ig?>9ABHBbgIWpGB_nK#} zsO|nd-%k#eB|6u9sM+vIl_N@o&NeYrEs#@UdQS-P9`AYv6}07b*1Q>e=p@qh_BPMy z`lB530;R;}B(S`|0lC@gh9lM4n_Xjl*4VFwcl?Q72f4Co_`0%WjpWzGXzQ1=6J!2^ z?|ZA$=40;f;aa<2yz}2dYzcFh2(UQuFsNT%Z+))BRl`+E7d;?3yl5@WK*2@he(b3( zFNM^N%r3GC)GU;DUo~XNVWW3>uU4F9iMek8V49pGCn{VB1L_wR*w&}lZRJ*84_-Dw zY-03L_3J?h`a6vW0aAQ&i!*cdN@Ijh6=M$=qTvP&!Dn1jJ}y;N4wl*lZz3IRbSCRo z=QK|4#F@$HTYA@CE9AKqXAY0#CdM2ohD4XyRck(OWw`WOHH2*~zJJ1tT`Eqvdq}I_ zNCY=6O_qUL7}-FiCK@RpH@hv4LCnwmV}EouYF03(yph04y$kcWlJ=If_AzPER#SRa zCEr3ghjLlFhVu+t(@EVy5yMIzw^p1s&Ap!HlUz7i7KKFFp zGDKH*`_;N=2@Ggt_&CouCt;JJ&Xzn5?j#vwxsEB%8C8p>8YgSkmmdx2CQ)>mvkWRp zr}}GRwo>6yLP)CfeOM`)40F$+GZn%eI_)|xV$YJBAPuQrOa0zzNG$?LTQ%j?XrDI( z9>u}YByLvtn)waA?4oOZ#jyL}-M)jjw+{x!#>GXtuIc^^N)=m?hkMI=cpdGQey!19 z5YFf~&I>av3&?NPsrcJ9#YL1drcW)z)5}zCX71I#n6762HD!f{j)gng?DX=GIn8O# zK@^56uzVLj%Iio0He;t7Aptc4EA9fz>@?^E=UDfjF5oXG|zfxNNK7o)ilRyb_T~{vU|Zcq<1b2PiAIka8BE6 zqRPUG%91Hpqt(0FbldWB=+ycX!%)%buYAtEW-1j=tP5N91{Z)2lfn{U;E9Z*P_&86 zN_AZSylMwE@v@YNJ>Qyc(r2DPV$=RU<%;?Yy`HrXy)GX+m8JXa^I6quk5i<*b=;tz zZ2ozv6(c9-X73^n3}4{G6C+{ohaA8I%8m-gYwu`m~dkqB3q)p2l!O`U^X!Q+9ERJEmonzCj~taVb#(UXAkwU?Jq!ChZJxn+}`D;I1M zkYtvfIFCn0L*$Bu2{@eHVFS68t)k)3s{pA~XEr1s7Q3|+wCiej?{LX6Plu!ko7Hzg z001LrH{LEI#fGT#;>WTeZ=nvY-UMUb8lo`(vpE8Mxr&*PbN4%N(F#>8oj zyPH|()P}r<^m=em&ZEG6&rnvIp=C)?S;^e}> zmEFY*aQDvOX-FUFJfr#_dt{tQ|{tZ*y7xlJ>_cC~yxRLuuGV zgFetaNwJuiCsI&)V1QRGuKHhM&p$2~=rfaTxet=Hl&u)!R9#D~ac{t-i z79sbCev?I4EjNjHdYTf0bPFgksPIu!%G6~CH(#cOg0kwg-g42KNoUqVi$LElqTOm7 zuF}5iAk+!OSLY1CG8rg);bobd@66GPf%aQA3J6iOl=Zm8zBr8P4HZcx#F^yNBV$ks+~0bUyvm441vQ+gwg3Zt0J0zEa~ z>%ayBjyaAk!_`^Ci3!kg@8lf5RV~CxD>BuCAe4p^`!QbWwrcYSYVtEHu=`@!9fr6P1J7w`aSZ1yGqKBobKOXws|lFPg}U0ngXS{`dI|ZI`(INB za&p(+E?@zq@0rW&QuSr4m}ikGCC$c~?CP*PIlMc=Has2}$=k0%l|3=)avNLdV;m=b z!)F;K`WcWg&$dhf7KsZXA^0)p{y6(SA5=9-TjShmycEtFPGt85+{v|9wpk*xnF2S1 ztkYA})o^oySGvp|B$f2Y7z??Iv*Ar~J?TiU5p&A5$NLA4ndhi`dPfsiVccAX<5i-}|`tUT!bB#vwLfldAn2 z-KnS2D>>{C$1QcrzoXL7;F`ga>3!&hC1Ybf+>AEmW1R6g=@i-OoZq0>SjIDECDAr5 z4bm+1q5fH9Wmv(-qQh{^kccFD@CTB(y$0xL{XG{?pj*5Fa8P0xkw4U(Wu;|)moi@I z5!wT4!-=zyamtPLR7$q!v=t@UqzNYM#w^k!Luk37XvN~zZ0QGro0dN!A}I&%5ZHO+ znheIfu&L?>dycQIw~@@%o8I0}5mk18v`X;u#l-_DNp=lMAj+F zj-h?XEMv8yn8lAueDK{|%+?v-83fMC%gn(7eCcb<%ZiD6`0D}UxVSt^oygINPFgB( z-)%39T<|tt`Q!3$gu)nX`$=p4dj&%JlYy@tK?#sK!u@fQJ4*CgLnJF_($y0+vnKZ$ znx=>=K8*K!?XrwE0pGi$D|J?@f}xlZg!2Rn>{pr&Zg5L2~BssV^N`U3*e zD5rk1-1J;=qc8XVZ;i7R#@-M@qgv_Oa~6Iad`N$+?T-&Xwtvv!MJQm@HGl!8D)lQ6 z!_Iq$t7#yKbbjncF)6X*HpLUsD64(#C!5N$%>U>OljR%P<9eJ|XOM}Y3wn>VvMX?y zXdM6?nHnXmN!DTaK&_j+%1}gl*P7|FJGrK|=giu3wA2j?Mb{9F9aQ5F1e#}4ve46? z7kCDlc-MLt7Z+97s-Q;&wFD;@)!t<%$MCJ!<)gwaaMSoT%+LieBbp9v&x zA^2s+(6=kU_&NYsWn<$6IJPVGT#mXVl1)g1od9Rt+xM-`pm3xZ$_SOX%zZuC3u7@w&$nf~R?u@#6!T0%Dk=GXW$PO!JgUY|c{R+*LcCY0WV0)HHW)2Eh$BrzvT zJQKyqSh*?k9-SxbfJX0AK%=m{?+gs^eur~XW{|DLy8{71PD&nDVmKwIvZ!}kr?God z$~YHpVUe@7A&NVds?eliD0;JVNzE+F@EK|kbK?`?sA(r;hL>8~gq8eeSAP3i7{(?t zgL>0wy`Wta075-d-q?beDxWskk6N{Q!C}-t5_xod$ zJvzh8McwosE%b2jFQw-TuWW6@A3?W&G>#e#J#a%(^V4aDMDpw!IaM6!YHD?Wd2=7> z?$;wqAMs39TNNinHjnes%;8yfTwFXoB`KbDpp4;m))Jz89$x9BfZK{LOR`+&}`~ADOtA=8+Y{ z-J(@PlHIv;;MGFl!$`a;p>(-qnJ-W0NB5^TV+wekqvIW0>Q*Uuz3i|N(7qA7Wc*$nqeHLE&Ehx z#uN_C-iq94N=8}%((~*`Vv=$o;AgZI@>GmfC7UR0+A~o*cC(eyxcSpY9DNAUEs78j zpYs}zve5OH5NsdTZN8OuQxJ;KZ_+EU^g=d_3$E?v`OsX=RR@N#_&V9eG5) zx_5do=q`2v20jc<>?>8V@s^zq=GDr^v#XvR-p)2i_`yw3Q+-QwO;HJ4Fy~`^i1y>i zL>%Be{=cb_39Y;ccC+)hANJQmxJxu;H`fgMhVE#CNjXt40hx2xAGI58LqSZQun+R{ zGZNA=Z7rrZ+7Lnck4>7=4#4#hww-dDgTZ9@o|R5XD3ez_B-10v%MIf7O|yh=gF6IV zYaSpLwEI0E=vJLD@RJ!IIoD7D^oWd$gWRdPwgR$*%AYqbYZ2ugC8u-SIfRwYt2ZFa z!RoK0DHS?8GHGO|yPd@;uA?BNj@rB`nfZ2q)q+QOWb=nIyh>ic*>qv+{m*NR#K!6F>!Te6xwDPxsEM6!!8c}Py;3% znAEz8np@a$M4?ta8;3K7pgdokP$VQoIDa%~BP^?aYp7x^17Nc$E2p0^v91bwg(n__ zFHx5XzATQhMV{SvYvGR{Ag4t4F?odb{o4X`3Z)S2@-N#k2U|OK0pSOBO@0&gQEj<1 zzQK!vu{H7KkR22qUeUV0S>_bptYe4am<*PQ=E>ZU_kx=3+8vN(umlP%4RG)dkpNTA z=v7KrH+gI;>P(3$+yjlTJe`LR+ux%(T(z9Ay&-3J*ItYHWUDqDO- zf16CZ0K$`r6>_$NxMJ!DzJjcU^t9ihLX^|KvS=9-s&~)p_TJCeS+igReXi~HpwdmGMO_c@CnaSQ-OA@oC@?gN%ZeCJTaT^{(C=Hi?*5XipBO7KT+!#Uxaz7}D8(m8y51q8hG? zLNU_HY7lJMd1_?nPPi+X&*MZnvj^GbXBb0OwP|4~F=z*>a7(j&-a??7j&Cqt34I9T za#yP!(v4fagQSXWILYqHxs9E!AIKEDjVE+LW{l?OX%s@liU_2e!5IR|fmAe|k4)RP z5Vcn)HV(R%*3Ubq;F3T-)YpKJXB>)dRH$nCLT%uV<4%`T^`Al4WX!Fixj}+}y@AY- ztmir43c}RaIz+}~45W4uU{k1+iZz(u)(}D%F(s#Tc*#UVUb?-XZ~F*2RcV_pW3+&{ z5j%mAfU246ldL;#l3NZJ3whJD;LZ7t)8q3BTz9ztve6{lxZ|E3 zj0lf7?9y`)1ig=e`SQQxbB3Jg`xf#IAaebn=1r(rCdW5dm-ji8TqL1nS(slPhTz<) zsVVa}&{0?!csP5%hOy=H9hT@RL!7y|C9@vG{#g#`j^Vp9%0R$Pqe{&vyYt%ihGP4l zFTJHFZ;z~l!Tkl7AqG8#Kbv|3e+_)I3L=p4Pa|>qCfe}Xx3Pn|S>E~iIw859n;^GR zT0r>zzVf+(6m4dD|HgVK-}D7wj?I$z*k6o^Bg-k)Ap{^qwrq zWJi5`l#kdov!>!b?+;8t=&kqnJ*wTnaT{UL>$|}ur0iPIGbRySFLaw6UZMvDaB!2HtlT$K*@b_acsQBL!Le9NQy_ zb_9f{odU8)fPT!P%^LwMTAxO;ot@dZV@$6p;BrpW1*@vo>&3NZxL)gL@CW)bqRh29 zEfL?t7+Zs9iZk8upoY2BR%<6A4zz5k;f?`mt?nr!E9)BKxT{@25TaXdkMHFYg1?Za{6sX73hz?7QnZaq*(t~xeUQX^YYN$+N58dEi;GIr=C6{UzQrau5dLUGio3dpn1bgZjPzU$F1>A5c+SZ*yL zZU@~@hmvY-rY?Nr`abn{FpaL7Tt5@~Uv<^u&S~Tujr_+5?Jr^Pg}&S_Vd)(D_AB=( zoEk1x>u(cQpwT1fc&)hhNg2-t@2yIGe5RA7YZ?_2lUYtW5!GA@920Ity$$8ZoUZspyuM$djXM3PA*_nUB;MsJ-R=JPKUOo2# zU-ERKk9JAiX}b@_NGXyXUy=+ia53F@CTq?x?yvIL&E8pZ0cph9Pw+Gk8yeSE#A^^l zkh)UlS>65ns;MT)AhH%M6?5VB{QLH3*f%HXn=76MkMo`JaeVY!UTTW>M;g@j$G(nc z@P3r*=djHip??d+(nZbNK{soYv(K~RkzUd_fH<9wr*&4HK|kG7kf&`Q0G=+W9|=|O z4|%he&@CFr=d~i1mgBif@9yLq5 z9_$9@15)y#93X+XsD>7`Sggs;_qd^5f%v+i%FG?T+ic^ZVdEh7SSeKr)8jK6Aj@<0 z9APW?-0u7LdE-ju`{Q4t9GCOK7JT<9Sa1W7ZDIZ|F_T5;VE4c7U}zWdFppw~kc>Z_x}HlDlWY%S^z&SGR(}`K*HnH~!4Dsg1gK^`joRusPlzt(<;G=QZFKL_ z?Pp;VuH4Vq+L>WX2ud?UFEp5?#ior3P$x5nR2bXFN~XC4)+*m_O%D@l(3y*%VB7g@ zkKGxc7*xwmoQDSChW3S5yhtJq*lu8rEid5m^$xi&8}gFs(2oQ??8$BrH^)itjgGzK zocUg-UDXWTItJzfWGlPKFk()Cwq1aqBIF!}D||TAuA=YE@;EODy_B03sykzrV{~vVt+jw}ov%%4Qn;#>h1=+{`y_(Y-d$4ExPX zOayqe;$fWGfALi5ehCSQL&Yi&&~nSIB}WDx@!v)dumDV{zn~^gWaN>oGm|cuDfas? zRmNz+!Vw{#<=1{Ua$DETg2S@)eQ+OHeGh3O;(fvU7X5bkXwxBAS3)Q2!{;tvY|h^X zsO~l%997*2QttT~HYuVFmm;7iRxG-TpE=iPY2YD{D; zFTZD~x}&IfN~(r)%hEZ}BFgBe-fYEbKyopOV98tquD{#cefn-BHPM-#H7#q;2;7KN zZ^d$t+M3&sW<%sm(l#!p$49*9S<(4DiG%z()L^OG@nxd^{fC6N)Q%``Mxp-5*8R0L z5#Tb1*!Lj?X~6Mm1HZtuL5W`#PESsqT0$|M^?yw{pE5B1xQ!VQeVr+_dV~FnuI9i# zxg>p7_l6pBz613E?;?-wnVZ?#efCD#7ni=-9)o=5lz#%es*X@pTd`NK543Vz+AY;~@S)cP|x#HmwcD_sSkXP7!R@bSpNTl&QB&++Umw`rC z6IFi&B0A#-4)Hp-$;z6QK_)&jZl|nIY@0ACc>OQ`JeCfhUIaMax-4!?oaxg5N3-kP zzpgK7oZVzNFvIx3C zyYNX`o_{*41-L27UGi({f=$oZiXI=J)@IQLz6&b0jIPaAV$I<-5q8)P;$TPp3?{9^ zUOBuEt!~gv!8#k! ztcBoMXQ-#EL=v#2DLK8}cXA@F?fI-LXC;in_H+y+{XQQcOA{Vtuo96nJX{I46IBh&&SPbae2jZU^I_4LLJnQ)>8Nw#K)NlQ*m7R&{RiD2Z<_sY~+y+z@C;b zj$V;WU1sd96IO&>d)YDh8-H(mat;#(A4+LA=QCG({( z=Cop~AwY>f8Y%8%8VoCF*lxu-3uulA6pL58tSSS>+`}H|=Q1-l!)ifhm1blWltu=Z zbH%=9X^Ym+m+nVCf_$x_{)Ryw00L|?7{rT#k_dwjxHSlGQp|UKx-w$?7)%vJ^|zy< z5FcEyIoVC8wEf^4nM$^fmkOc;{P6j+XSIIs&qFe=>vKmVFYFn6!`4-?AQzp0>u97* z&gb)}!7k~t>`AMg)k>5@v$5??GI@1G-S-zT;7JI!lpOgU99nk7=kqkbrRXhfr*pM0 zc64pI%gZ+ckCl|JfXRw8o3`_Z2g~w2%?G0~jV;d?oWTd0Z8=^7ShsquW(ezC602Ot z-d#nXSI^RLmPR`bRIw)ezu3VftE%t3_vUR^uP$$cMS^Z}tXr#>qLkq*BtgmK zJVDilU)EkdZxDrNIdjfexm9+tciS$`ET&DD8D{xSbFSOJRL^^*tS5>&`GtS}2LEr# zeFS$hWIr?s9%b!o#q7{4MD1pd$@qiSpm@mJKN|8#Z2cR5#P5UTP52Q^`3gz|q}RVq=Y*nb524Q?To`@@i3PNVhb+*zZC z4*WDT36VZ&BbuXA0?`HwKZTeBk#{1S1dF()KclMUMllr*~Tp zvUlQPxMIO_;2x3Ap;nM;iAp{AbG4q~D2tSU+cxlg0VYdv*nC)52;I?AKYTbYfRf|o zBFsRVfi*RPY^EYCua=6{V~c^33H(oy+XAO)ohk-(G}I$kA;C7}AL3p94!x}SJ`NOZ zG!O{TG{hU!BiK0<`p56z`EAAQCScTK=Jdgm&HDm~OC^y&xpR5dU}gv_Sy%X_wg_oh zOcK)g8=_m)mN%F>+y;WY$j}^!p&pUuAV>W0SBO+f`2$@`JAmyJp!W)(5`+A=lrsB` zMFJ12?tI7a-1rxmY}5WGr()n`=Aq|k!0I&bKIj6?x9^16hGa`=VV{3a zk635^j;z*#tl>=$qU2;u@`XIcnj(z_bsrZ>K3H8x?%avfKb1Amaj}ab?*D^Gqn`oZ zZ`1sa)+w>DAiw`2A^_?vt+#e&HAfw?975x8ndx}cCp}d~ySwpcyZ6X{8X^a79&&|$ zgwGGZe7twZTB4stUb`rIbzfQ$sp3-T%y$3PGzA-bTTXj+>hgfi+^p)Ud zNGiC-PYHjU|8!+{is^hZReB`y5Qu8Djv_O&oJ0zwKwvOM48;RzphG71Gl}sSl{PXitAjF{uvM2>$ z5>RO9t9^zzVX=8;rt4bMk0k)TjG1~jre*05BDxkJ_!~c*KMa;a%aJ$-1vpb(jAOpK ztzICys*LZ*t!&r7W@@Nvs3TWL-Y4M@?>M4NU zTTzG(fd4xO2*SU!rTc-`|C9ftAgPJpcr$*XFoXQll0ZLluIW6Jw5aI64N;H_Oq(c( zNd2#F1Ak|jz>im1r4;4m|IswRUobNbY3L|u|CQ$(3@bc{2Rp*Nl2YP7h6)rX`ttN5=*{Yi5tn-*oZK&~J;^Re# zct>3l~7sbIG2n@ut zyILA4s7j|MMQN{!91LJ>m5u+HGqXrSZ=XjURE1{NVvYhbx)w-x)zD!#9nJwvz9dc9pF>7Yw zQoe;nnsIYPc2ZO@ySxy8kyOWX(5}Y8;vb`55`OFwM)?cIIB{!K)`4=srF@_QqrMK= z&*BtRJ`#a8gR05rN264q%Xb`c;HoP1%|`lrcBt6ipu977d?aQ6P2tv6(Ar1A`uIF> z;~KBznJ#rG6{M?8arx-9-Q}iNQ`IqpIfHCNRhm6T^KDc)vFI%NA;*kaAs-JJ1#o;n z5{XU2pLE8_H7E0tDh;^HR$W?m(G#f1w?QUXq(`6yr?m{iHMB$QM;J3(pT)AS(%$ut ztEkA8?QlV2d5{1IWsmdU`MMQ;fr}Z&g@wibSh|*9xOzs{AkV{Y3y1;-ka54rez>HSW zCYP+)>JdJk+BYYIB$|(+ZLd=!OELxRP`pS1b>zad$n`h{*A@v+34&S*4N_UvOQs|$ zvZ(fx4#oDdg}vNV5tnXLQxHohUCEi|W=zh5{dAu^Fnl@Tl%>(-T=YOSNlqpyUMW>9 zsgX{&k{P^&g+!ZkO$<*t7?CATw4|G%!v#S2{vfV#)XA@@WAvPbpz2HaMrjKSyox2h zNd}+!T1V9@q$b}sTJZJLvZ#SB68Y1^xB-JX0nkNqrmFx-0=S8$)}^Y+->He5LX%y~WdLVpW_!sd^p64QC&3rV(LdduXs%eUjCq-jO|1-8~J zw*$a>VoRJTgt~3-_1Z0ul{hf50zojPrW>?cq14qMt?pf-etycfX&~=8|M5}ym&MI9 zo;5#_BcfZ8`BkVw(>tf-myrJ^e1n;w^Lx=*?xp{P5~qweu$9=~_$iYo5_qm+Ve!O?*-&%CoB-}i*B~araq?gT61Z3DZk4d?+H>sH>I9m=~ z`quD>O^AZd6U)T}6wQ|+HvGp$3n)W(phWYs5q7#Wxy>DR^%|Y#98Ja#;;$3BS)FXC z{_Va_{+lh6i5%}sZ+W}XR0vgP`IqCU$D}U9eDQMg4Z;hG{f(U=W6PxQ>u(3*#+Q8# z1b_OLd@8@LhUjPcb*l6eSLe;scNHWPg%-#ouTV*Rs2nAms3CL4HBw$B&9VlqK(!A@ z?Snk(5zEqizD41xZ24>k*d0z!8GQIs1q@~O=tXJ^vl7K^WYcLZQR8q&TJdjDdsYkT z^=gS6RFWwO;m7$R>*mnHx%FdI1j>qi;>7j9U8$mYfZxwbzDRL389-dmXhu*Ya<;&)l_eS~axyJCql zXa#gh2&QyOqax?!s)r~Se#75u_}&A6uEYi!T=C?KFpaaJeepu->g-9o$#Z$FZsgQ& z`{}5;=C9#nnWlpyBYpL~t%s)zMSKeI#hT8F2h~pAkT2)q3*kK?Xt$eG-E|J!U&T|G zHry5M&dOVEtVyp^9npD4uusZWmO;E3E9-fOG0=>%0FHz|t+q;^bw=dLgAAY`PKTYydZF@TKtTDE!4ttY6r_&r^wQ1Da9Zl)mA3pC` zOH)o*m@`d7j+mmgNgp z=>Ox>o!& zk>=3Mv9PJ<5?&KVlU z>E6e9TiOf<-2v|<7;ho2|^XhPX3E>>t{ODiW8+X3}MJFLg@Nh_35Ew$-c&bTN( z?xrQXRRd@6Ke`i++;h6^t+QE-<}AJS+~mEdO?VXhM;uf#;0kZFaM;g>=w%%79Fhoa z{WpuubVJ?>|GP0%vkDH$R80r(v12iq&2s6X5x@5ALC|~ybqt;(FiTO2?D1s$8vMO_@qcW7=ZwJH#{TuVGV%3+VHJlsw@kr$d&mBcJ< zP%M{9$}u|}x+QGR%y4ABJdbXC!e1*q(xfuK<2IkTv?Fq)NUjh1NB%+`yYWe(bbg*0 zhPApx@FS>krA*qWMb(t57z4~0WQuf^^Wf@F#WU;RHMqtwHVE|h8t+8dxf|L4`6S*tTcd7YDOhXWK@H<5x~YN`o5JivECVu`N+xQZ9-AH{S%}a_w<|*%ii^0Y5MB zk6vjWgLGzW!JJUwDwQq%N6A!(u&$HpMwJh|JYyrA47ZUf?_chl~p1oB|+6nU|u|y@)fz9$qaI z#nEmBNCaAJS+Fxww&DW(cIo&;Rjm>OTe6B-Q@|J*obfXWH)++4W;^x<@kTCGXwooC zo-OWM^vS~&EJGDGb_Xk>32>Kc9>*?EX%!as=F*q0ul3{|SOms};}txi^5@baMU$*I ze$b2cW3V~Xyl)LPP)h+mx}#vJ5Kyav5`vYrxOd%slGRTB5xQ>Qjd-t zI9Niw@^F#~<5`~ee*x3B;$H%Hd>O?HxWkk)_GznO2~!T#QaHI&F^eeW_K z6>#KvH0Z%=#+KZ7XIA?Ie3%|>8@rY*CZFYA^M>Sh!ibP#&35K4mx-GSZC3{jntH1^ zY?6)R$*STwmg;Q2Mf8QyoC+AIW?rBxBy0R_o#Zor&ut$Xca00RWmKV@r46kSDDs4Q ze~4QeVVL}FC<9AW^82s%bTI}^U8VMPDA{SXV=v!HkAwxreE&OIGhkjjo39W4e^~_- zAgf>}Ef(}|vfT*e5X@$o{Qp@#a(AF-8q8ZM3i|##QUOp6VCLIshAsF{PCH}wAKpPL zL0TlN0h zs{N|w%$%9-9-r?1%>>Iziz33|!GVE+A&QF$$${brP#A=P0R2h~wOoQCa9cT10kHCM z{6o+mGXoWILn$dRDo`2*3=$jMY1e$2XZ$4z2vXJ^GhPw(jHNax5*XK79XAQd zM@9es{@G4D6T|Kd~7&nfzbaK1%+{_K$x3vpTL1VH|P> zww7l0AFWcfFtOud;`&D&|7Z4pHInN?7Kf~flYyCvkcqj0g)NAchlz!ai~c{B{6|jJ z|HjF{@ZUNATgksTx#&Me>%WcOKd0s&xuCh>f#ah8_dN5!nXw9*gMm>xhzs#6IDwyP ze%8Po!A>|+kP!M67MSDZ?GNFg!_Aoy?q9a38RrwSCL<*LlS8PtmrkfkSS>25{M`|- z(f-__F?^s!x4uN!aXY%i%xu*D=x{gc_l<2JmIVvKOq?6wZE&Ym* z3?)klJJ=-OH&>_t9|acj+mx_w${`Wu6eY9}1h|A3EnkHF(GExj$ zy3PNMjat%<5mtOI!2IIV7H{^~uZCP6qUnbF??utWiV4y2b0rn@U;B;18ihQ_$lq72 zhA(p61Cb<^OKEm;WJ}BqN7Gmgie+0KN_m;GubJSe z6|pclqi+hBHHKDGE#Gp4#l^`#T^)(A)4s$=rlhFd-W(0MJ$25cDQ3 zt*K)h6+{v`(c-2S!=-bi-UF9LbVl}zl`y>8yuG`Ee(BwvF1_BGQZ?^TBH?l6Hsvbp}*+(w?8HE6l9Q{DU#(DUuXruN$ z=1KFb7v#aeM9;A^XH1tMC_HNa9nnLJl}pP zr83Qu5_NiB-gk@MbVSnyluz1(mJI-20)qoO=MMMlWs9lq>Hf6&CL~;3lL7N`sg&>W zQBh)IVwD@U#8gyp3$MNv8nCcT%*R>zi}Ul!+AJeinre)arCC^5(li~9fWWx8IJc*pA&V`DYPCd*0mJ=L zogUGwoRXEZhsH+r1`8YPt}7|^lWX{^gVB^GtDzV=&F1wM*M<`RyhcAr0>^r0^Q)_? zU-uQku>lBx;=oHchN%4KqLa&%NQt+oeuPxhu+`e~(F z+1r@hluR&mYNf5kOF7W6lRIbWqzIN8I zY%KW?b4`siHZWc>4iPa`a%2$l;gQ?*Dy{{aA`t+p>CBVx{YiWjy@i zLKK;B^A9i{WrDfDIb^b=u!yR}YE}N%FGV?}!^Nf5fr00pfk?zJta!hjL*LLxg z+X@Ex$y^$V-y2+S;N8EDnVsDkc%jqR*SC&Mj|BLhR>3&qosz=w4Q=!M_+%5zz)E)W z4!{YGgy**Xz=$z3GeaSTA8CNhc-a)1I1u*5^;8WQXYySIl_CNF+AY3fPce}jN!B}- z>y1dRTsk6%glZapk|9UXw|9mNUsqT;sVZ`LBg^+ zkfzGa)9Q&V#V2MwvF<+ZoDN{LvD4uPw?=lkmp7`lwC6i@w?sqCGf$;h$&Me|6pIyF6 z_66-Fq6$(?>23pgpFbR4IGI5_nE^&j22@nDf71q&uJ&ND4aD#SYKHwAaCzl&E)n=8 zlT>a|FN|>Ef0mr9g(@FV?)8T<@J1*Q&K(e{U~vwhaE2FktMGZqR%K zT-UcjFdP9PC@m>THf68z=HxJT-hA2R8CrzL^UQw#XK(t-UW1@o$wgRdawUF3aB%R^ z(GiNBoxL89XTOwK@kYxR9d2WW-K3<6}eUw))>zrm5!Jk9$eB)O9bt4C@fUMdCa@p5jM-M@T7#nkUn}%{A z8^Df|heCW;zL0M28><~q^y6&O<%&OaE={<+R8U-z_4HZYzZ${mMkfvDQc?MBml-c9`n(*|Fy8Nu+xs+%WhFdn~U^p&F6$5i0Lr17CKDT^oSBPkBE*}6~CmWGTBJv%#WcT0oi@zK$ECTE~V z_lPVb<2a)1cy?JH;sy%C;K&eweJetWENsLQx8aDh*|5BQM6 zZTQ-%Ws!Uu3NI5jiyj%u$bn+5@dJRo!Zn;P0cmz`zp|=B@UX^9EjNY_;V*kOy97}O z&p4f&&V2lx&a1jDU{8D@UMgcwIqe!uQwu8gSojURkpXcS1wZxOgwXf_EF(wixPy_wzPD1egs&!UZ8#I znjV@lQZCmLJbBE>%gu{uac#`J>kY#DVV<9rl@y(|MWP0J5)G0XfLmuw>pc zdgS$?!l=T2`sp%`|7B-CI+8kgTSOZy{L{|XfpqSG!Gb674jlYh!(K3ICc`f>==TiX zA}1GpP+DA`k?hTyG^3^}y5eB?(52{i6%-FRZ6N9uLY-Z0_2}6)kWBO}z_##;AMxlt z4x&Rz*_jIre1@GiWAFdj!JIGMU&iFVPh)IjV^eRYG4WyuM{IvUr%BUd|LNIM1DRsX zMZ0}5EBnn0d|n-p&i3Z^RBMwA@MCgVtAo3OzdKoF@0p)BDEKnU5OQm(B>1fa(2D8) zeg@EjG7!(p!p`3)VjeGfIsO#2!Vn6TeA>@-%UNPK{a`=pUe_ zq6*+}!LQ?Se*reHB^PO(`lyie{`SKT9kxd_#Z1&EYb9G5@YKXck5!%-5|`PYl9Zsv z!rWt$$k^_flN29=D)0OY=7_qFMNjC;-u5%N9k>*kf+#PujJpqD8IdFK}$x1e?IPbzFbtGO#hv({Duy_!mED=Y;G_n6IK16(5V9h$16-@Z#~@fxnttTA212 z;HiK@JEwdOtwd2n!>fbM$-(BA%gOcdbHIi+1{Q|LV|!JJ8*P`m?z8LZ9~F%>ls4ZI z1Q<$6Z2>_aOw4#PGP1uUq{xI^R$DJk!wRKZslx$ubI0VT=_D6~sD%$@Bc3N-N(C@5 zpCICZ-3;)v(DSHSLPh}HWp4%|zF<0p8b0^m0FYNWPn-|&m~R!pts#>$Vj(lGPC{>B8gRcR|P93K9oL;qh94GlMx z7w4Df<`U7;s!M8=Uey(n3vXf*$!f%8W~L@5$KSEu9;lVfLWkw%=GE5KU0=g9&&=4^ z*h)%Bc$71%g_2y@!UP2e4-E}d6%|TIN`56H!`Q`Er~`o3QXkwg@aSmUP~tI017rea zGqPsERC;peY1J@ggki2ul-euD)r4#M#ZeUWBgM^F(TZEBTs@n(&j##7EzACPlJf(!7AqM+yvmT^yS(pTL8W3>I zR1}I&sR;rL3|I6#SBA~00WzDXkPs1pP>0WuET{P{pc$;tdNDbN5CDM zLd}&&^F6gvsdSpOvM1|pfv2sHKNk+@9~)0>^g>XqG9REIRo#B<&)bf?mO-l_Q;Gr6|sr%%2%X284+WbpO9>%=e=8s0MxIn6c)Fhx7e1X|fs` zFS}EuHFtod5&);YR*TMGkP7nSV`5?g9V!}W>7-|?0bN^qo}SNlQUU@H9#~jdJT4c% z_pb6L^)S={X<^|~WMt$sGt=`Gny)8^^7;H!FvJk0esn=UFQ8$S1q2(RPfmbr+Y`i_ znQ3V>5C)Vc$=6yL;^M)TT(-lcWNb+*Nzr{xZ^it-#KjdA3gJxoB}X85|jFL&Kk)UW8mRVAA>+Nlb`R6mDK# zZH$KBLmcg9-1JpNPu=SiXJF>XAtNSEG3)8i;Ch0(kPo$lpa!2^(tK<>vhTvWF`4=*s5mCn-whc1luxK&ADF zk_fL^Z(%IO+tpFYbG`xjms=$jBLc||TKz1w2@BZ+yf@;AJ|!=wtv(}PQk@`7RB z?Cn@6ixZh{Q zAG&&aWzF`9(Fsjf>ymi6Im!;~GBi!}fH1H=BGf0+&AbD-; zPupA_v1#{vXGXnS3^uZRpzlshS8Ex+Js<9fW~k@_GkdyDW(W$BsFW)L?oQ^^B@YI6 z@;1PZb8~b38XIxz>l{4|W8Mk~%A=2=F$>+HC{<_&+S{y(LWGb*8-%zk!Yw^TM_t49nYIv z+o`p?AnNyicXc=?xkM`xm=Fl!>)WtrG+w?r<(;@JMgk-BW3(_xNsoQK+JkSWuNU_X z+PAf_9cJ7-!`2bx*U>sef%*O?4H;`!N4wKpJA1WFG;*(Gel*46`t0-zEiEnAk0dH1 zdX3T1!89(N)_?#Jhwl!p?+Z*mQSK6vt!5h4zFBg1~}2x{Y3Q zc=$<4O@@^f3EV+25f2*LzEOne0zDg^x&qr2Qe{>=`a|*M=BwL5O9s<5+tSOC76@S% z9b&C@$>oHet%lAHQcel~X%=>@j05Iy-jlG}fFSx5izxsNc{6alO)R`s&J#jbR8TUP zFWdL^6{Qeks)LN;&4aXnw73Zdgh?yRIpZ}eU^4#ECjC&h(K90HqW-;OMFZ(yJa+Th!(tM?U@gVoLicbXFSIrh=`Z%p#W1ot%KrmV zEkXmLb}RL)rpvXs+6@=41t? zIJMCK&Bp|>DOrz->NsD%y(_GPL>9$&RC*}?waxuG;a37Vjd~N+HzE*p;>rM=U1}Ab z&>H0WmB9FSpl$aHj*l+#NO@Qc9LdKHqY}r^h`0iAgV!ogRC7T{5T&I+_ov%|g~_IxX@AYO zX8onBb@!)j*WKVt*v>>tpT@f5A9(e~@zdg zhHggHD^UQ%1{$LUGBx=!1~Ii(GV7gPf|tL9RaKL9NJWX637Qn7@i^Xpt9(vQwwIMx z7UgLM;ong-Xm!ST92N?uIinywG~5fRO?NOPfeoAxN1Ls3r+`4;fV3W_q6!J&MN{tl z`5AXxK|xQCHx>cHa-)^q_GuvT<&yYXtL+(tzzPK034M~BeQ z8W}|*@W$5IrYC7NTa8;{W7l#%!|X)|L}*CK$Yioux2}u>K<94XyzXdY)g-eCu(DH6 z-n(Sc$hJYmfLPQkeyJP#IxjERNhE?raFXbiX50JU9xVO5L#ZHERm&8QpV(u;}2`9bTUMG^pt`RpXz+z$Dy=s#e4f(nZ z#|`&?Vi2ykC`IC}PJaZ+7eT!x0yAi-G>0lwmhm@2AM(GPIoU{@|2=8m_w?S8a-Q93=*zhT6= zYiw}@5qsvNIzw(mU=lg)nL1Wjw?&+s3@RRihZ`SfJhiYco0l*?i4^uP#JgBe<=VnN3T;7i`Hss zYkqifv6hu0oOT;rKd(or`UTROQ&Xe)7U&Im@GvwgHXtKjM(BLt;{)+@_r>eP%FXlE z7o&0Y8|iyOZd}~Np5&^8EY^xV=*yv@M%3KBK1gq|t2&u4YixYzzqLZXN3Sd}0X9aL z1~VNOX{IzV2;dQAnCp8N^MO0UNe|;Ab;E>F?*iv-WtV$r)Yw z<2zjh#V-OW!FyY;_bWBt=w<&h%yir@&Lx8w)TEpC&=J!Ki+J1L%HB;7)u^cv0RrjM zW78~ld5lGrcuL>@3h+FD1ZpC-p;@Qa#O4oJ27n!Bk5~p^10onc&hF4}FL7DsGs6;-iRsJ6m$rg3kXR97Ua#7c|Xh-nn z1-551BFDG%p6VdIlHAPLJ-4wr(2-LDLHR6I`d|IBXS57e#u zLrFy`DLJwk_$XT#m8H?*0BA9wwzFf?=6*+v*f3)|857HUbEzs`i^SnJJZZfAS+<&% z7K%+DRbkIGe1sMSJ<%$ecu`q$d1*bjCrJJb;5O9QZ}^!ZlXo>+#^1AbsnIE{6eQhm zb#tMkZ!k4iwlLSNI}2nq(Vls6Yx~UAinq4r<^3s|DAz4#0SFE^?Ti&n;6Y16z6TGr z&_P8#w{|TEbKIaPOzS#)(g3WzD7Mv zU$auk1BWXkDi=w+y+1Kuvz|TnsK)HT;c!`4OACBMklW+LIIDy32Jy>xfh+DCmq61y zd4KOPm=lqbXu{Q5SX7j>r2FRzJKFX(&pN&gLq9IFk@d>){EY2#J@=0vMq|VA2F?Oj z^#p9d{o7-ZO6b?*?(5H|L2ml;j;N2NZ0950696@nFEjAu{{H5EF`Z?tM|eI0eRtZY zSUOB98aY2Z{WU?$h+77q7YeroemoGFFf1hO=KlU%cb%M<9(i?cVF4KyY5DNTrzAUD zxzgqKc;S7N5*eclHnm7zLL%hTCkV&JCRJp7pvN}o!i9j6l9K+fRwq~ke_#ZF_=1~^ zocyk_iQD~&j50d*(`{pm=*+pvnMfoc&<>2*%#4YdIcuOsOkNURV8i1z>dN5EOu8Bm z^swjPbR}G^_T_JKc4^vbjBuz{+wKjpS})N*ey%*dJU>580fwt*tHcl2Htm)x{6x2L zf)V8#Hl3D_=omt3(XQ{ZD>DAkdd)(6n`=;;%PB|bNrIvK^LM=zDQSzlsO+8x7lE(| zXJY3g)WH^q^S*BIYyl&&K0J5BXrSo({%#1-K#QX#xJAPm_pjQ@%1#MbesOWs1JFgA z&YF+ak8Qefw(jn7kT){D-UUlY-(maweZKzW#FE?PraNzQGwb|o9Z4o{&%&5`Edz=0 zBoa;F%iF7Z?&WluGBT4KWjNq|Al*O}9A!w(O1S)W6@@>k?H3P3#AJY`^p$WdSjSLN61CX@$?pmXo!;ATv-pkER3?)8RM(7trbA>A;neMR$}OYoy1lO>r)jsj1Y?xRD$U_e zOOJ8X;536?Ds<^#j~sEWEL|TgLSPFEe@>g3W<~*QQ_#^7#6o{X9fX5tXJm|+V9Yd} zNJF(gKtel0`ogpNI!j4QYtHUGp1W^&;PGQCjnCKw7gvskYP&KGU&S}r>S58EOrTg^ zl$4az7v-K1eckg?Vaf4Aw&858Yjc-=s4>h7(kM4~$0AuFHf~p6iR#;?lsI3^W_0#e z*p1`w7{55OkBt#?_n0w7Sl2N87r(c@EhRCfYDI>Y#>qiM`Y7%f7$@k=*!Vhw8K^-` z+ENheq(k}zXOp*V-p-Fur6zk}a<+T@Mo|I7QP={Pv81>-r6Y4Dz`HIaK zs}a!qiGC=@qBUJe$;nJE`;=UvkjT)16lh-9^T0?Pa$-u*+YYkt`69IHF<2LppH`gV z3Ao+7a%0QXa54#&GflzIbcY*1&i&HzatrDmrN$=?4m?fa*Oy(V zwPSsl=hS9~qxif!0=`gBle}&hV4R1}*Vy%}%r%bd^EKEMrOjw)2#F4jr)Sf1Xaoe@ z9^FHIm@e%fo0sw48xg7=(n-+AwSQv+`CL3|Z(_8Rv_3niER)x@A7{s5`RpVqDT=}D z0Vb@0Mh3@~Ae(9YLZQf77<9JvV&!cm8F4Nw%^4Jr*=cmA*a0`e85TRUU>o+bKRs7s zV)xCJjNP@M_3cqS`20NRBCr!#F4SFI8mhyZmW)iS!oyvtr(~gA6qOTEIq?+b zqPEJ>P6VRujN8@btf7-{JNxhJJZK1LRGTrr8ymeY*P%QhLCb)(>-llprg7UEcI61y z+a6$ICvM)7`@DI)LYJzwKyiz7xYRk!!S%-=7;SYw4n$tDD<#(L%R4MoCRgK|!AIiKsB(qWR{Wz6v`oI(F=*41EEe zE$lg>{n1hHK>yo20`tPVOy|1vFV)}*<)An@d3iCgo>_h(@6C)QJqDMn>DU3mk7?0g z_V%LN-NhWjiUn>BCFb@HBS7D|ac@~+#5V{92Ja9GBw z%uW41p^4Ga;aqvzq9kD9J=-1p_%PLQP`Jdq`}g;Nq6CtQV-zB5_BUQKF|oJV+G2C%mj*iH zsbcT_xk&NiKSvT0a4~Yz+q&Czy_W|fH(4++5Z>F}Bro?4y?a3_9=fy?bV?yW9~{I} zUy{zR5b4(w$j3EmR=?zBSOeCA{uD}T@o8$RB3(o&> z#{&~*LO2%zGPdhv!0q`^K;-Zc2Fs##AVXa1RGts;KNWSso5jt7!8Z~D{CIsUE-Won JF7Vsue*vQ{mXiPg literal 0 HcmV?d00001 diff --git a/docs/linking_to_external_code/private.md b/docs/linking_to_external_code/private.md new file mode 100644 index 0000000000..b48536f2ba --- /dev/null +++ b/docs/linking_to_external_code/private.md @@ -0,0 +1,75 @@ +## Private modules and repositories + +There maybe instances where you want to load a remote module that is located in +a _private_ repository, like a private repository on GitHub. + +Deno supports sending bearer tokens when requesting a remote module. Bearer +tokens are the predominate type of access token used with OAuth 2.0 and is +broadly supported by hosting services (e.g. GitHub, Gitlab, BitBucket, +Cloudsmith, etc.). + +### DENO_AUTH_TOKENS + +The Deno CLI will look for an environment variable named `DENO_AUTH_TOKENS` to +determine what authentication tokens it should consider using when requesting +remote modules. The value of the environment variable is in the format of a _n_ +number of tokens deliminated by a semi-colon (`;`) where each token is in the +format of `{token}@{hostname[:port]}`. + +For example a single token for would look something like this: + +```sh +DENO_AUTH_TOKENS=a1b2c3d4e5f6@deno.land +``` + +And multiple tokens would look like this: + +```sh +DENO_AUTH_TOKENS=a1b2c3d4e5f6@deno.land;f1e2d3c4b5a6@example.com:8080 +``` + +When Deno goes to fetch a remote module, where the hostname matches the hostname +of the remote module, Deno will set the `Authorization` header of the request to +the value of `Bearer {token}`. This allows the remote server to recognize that +the request is an authorized request tied to a specific authenticated user, and +provide access to the appropriate resources and modules on the server. + +### GitHub + +To be able to access private repositories on GitHub, you would need to issue +yourself a _personal access token_. You do this by logging into GitHub and going +under _Settings -> Developer settings -> Personal access tokens_: + +![Personal access tokens settings on GitHub](../images/private-pat.png) + +You would then choose to _Generate new token_ and give your token a description +and appropriate access: + +![Creating a new personal access token on GitHub](../images/private-github-new-token.png) + +And once created GitHub will display the new token a single time, the value of +which you would want to use in the environment variable: + +![Display of newly created token on GitHub](../images/private-github-token-display.png) + +In order to access modules that are contained in a private repository on GitHub, +you would want to use the generated token in the `DENO_AUTH_TOKENS` environment +variable scoped to the `raw.githubusercontent.com` hostname. For example: + +```sh +DENO_AUTH_TOKENS=a1b2c3d4e5f6@raw.githubusercontent.com +``` + +This should allow Deno to access any modules that the user who the token was +issued for has access to. + +When the token is incorrect, or the user does not have access to the module, +GitHub will issue a `404 Not Found` status, instead of an unauthorized status. +So if you are getting errors that the modules you are trying to access are not +found on the command line, check the environment variable settings and the +personal access token settings. + +In addition, `deno run -L debug` should print out a debug message about the +number of tokens that are parsed out of the environment variable. It will print +an error message if it feels any of the tokens are malformed. It won't print any +details about the tokens for security purposes. diff --git a/docs/toc.json b/docs/toc.json index 0b740c07b7..8020b816c4 100644 --- a/docs/toc.json +++ b/docs/toc.json @@ -31,6 +31,7 @@ "reloading_modules": "Reloading modules", "integrity_checking": "Integrity checking", "proxies": "Proxies", + "private": "Private modules", "import_maps": "Import maps" } }, diff --git a/test_util/src/lib.rs b/test_util/src/lib.rs index 37b1819d8d..a2c0b23966 100644 --- a/test_util/src/lib.rs +++ b/test_util/src/lib.rs @@ -49,11 +49,13 @@ use tokio_rustls::TlsAcceptor; use tokio_tungstenite::accept_async; const PORT: u16 = 4545; +const TEST_AUTH_TOKEN: &str = "abcdef123456789"; const REDIRECT_PORT: u16 = 4546; const ANOTHER_REDIRECT_PORT: u16 = 4547; const DOUBLE_REDIRECTS_PORT: u16 = 4548; const INF_REDIRECTS_PORT: u16 = 4549; const REDIRECT_ABSOLUTE_PORT: u16 = 4550; +const AUTH_REDIRECT_PORT: u16 = 4551; const HTTPS_PORT: u16 = 5545; const WS_PORT: u16 = 4242; const WSS_PORT: u16 = 4243; @@ -201,6 +203,25 @@ async fn another_redirect(req: Request) -> hyper::Result> { Ok(redirect_resp(url)) } +async fn auth_redirect(req: Request) -> hyper::Result> { + if let Some(auth) = req + .headers() + .get("authorization") + .map(|v| v.to_str().unwrap()) + { + if auth.to_lowercase() == format!("bearer {}", TEST_AUTH_TOKEN) { + let p = req.uri().path(); + assert_eq!(&p[0..1], "/"); + let url = format!("http://localhost:{}{}", PORT, p); + return Ok(redirect_resp(url)); + } + } + + let mut resp = Response::new(Body::empty()); + *resp.status_mut() = StatusCode::NOT_FOUND; + Ok(resp) +} + async fn run_ws_server(addr: &SocketAddr) { let listener = TcpListener::bind(addr).await.unwrap(); while let Ok((stream, _addr)) = listener.accept().await { @@ -666,6 +687,19 @@ async fn wrap_another_redirect_server() { } } +async fn wrap_auth_redirect_server() { + let auth_redirect_svc = make_service_fn(|_| async { + Ok::<_, Infallible>(service_fn(auth_redirect)) + }); + let auth_redirect_addr = + SocketAddr::from(([127, 0, 0, 1], AUTH_REDIRECT_PORT)); + let auth_redirect_server = + Server::bind(&auth_redirect_addr).serve(auth_redirect_svc); + if let Err(e) = auth_redirect_server.await { + eprintln!("Auth redirect error: {:?}", e); + } +} + async fn wrap_abs_redirect_server() { let abs_redirect_svc = make_service_fn(|_| async { Ok::<_, Infallible>(service_fn(absolute_redirect)) @@ -740,6 +774,7 @@ pub async fn run_all_servers() { let double_redirects_server_fut = wrap_double_redirect_server(); let inf_redirects_server_fut = wrap_inf_redirect_server(); let another_redirect_server_fut = wrap_another_redirect_server(); + let auth_redirect_server_fut = wrap_auth_redirect_server(); let abs_redirect_server_fut = wrap_abs_redirect_server(); let ws_addr = SocketAddr::from(([127, 0, 0, 1], WS_PORT)); @@ -756,6 +791,7 @@ pub async fn run_all_servers() { ws_server_fut, wss_server_fut, another_redirect_server_fut, + auth_redirect_server_fut, inf_redirects_server_fut, double_redirects_server_fut, abs_redirect_server_fut,