CINXE.COM

Consumer Packaged Goods - Fletcher - Global Competitive Insights

<!DOCTYPE html><html lang="en-US"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"><link rel="profile" href="http://gmpg.org/xfn/11"> <script defer type="text/javascript" id="splide-script-js" src="https://fletchercsi.com/wp-content/themes/catch-responsive-child/js/splide.min.js"></script> <link rel="stylesheet" id="splide-style-css" href="https://fletchercsi.com/wp-content/themes/catch-responsive-child/css/splide.min.css" type="text/css" media="all"> <script defer src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> <script defer src="https://www.googletagmanager.com/gtag/js?id=AW-1070951481"></script> <script defer src="data:text/javascript;base64,CgkJCXdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwoJCQlmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9CgkJCWd0YWcoJ2pzJywgbmV3IERhdGUoKSk7CgoJCQlndGFnKCdjb25maWcnLCAnQVctMTA3MDk1MTQ4MScpOwoJCQ=="></script> <script defer type="text/javascript" id="splide-script-js" src="https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_d29b672c88ddab4ae609ffe7cf1cfdb4.php"></script> <style>@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap');</style><meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /><style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style><title>Consumer Packaged Goods - Fletcher - Global Competitive Insights</title><link rel="canonical" href="https://fletchercsi.com/industries/consumer-packaged-goods/" /><meta property="og:locale" content="en_US" /><meta property="og:type" content="article" /><meta property="og:title" content="Consumer Packaged Goods - Fletcher - Global Competitive Insights" /><meta property="og:url" content="https://fletchercsi.com/industries/consumer-packaged-goods/" /><meta property="og:site_name" content="Fletcher - Global Competitive Insights" /><meta property="article:modified_time" content="2024-04-19T14:25:26+00:00" /><meta name="twitter:card" content="summary_large_image" /> <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"WebPage","@id":"https://fletchercsi.com/industries/consumer-packaged-goods/","url":"https://fletchercsi.com/industries/consumer-packaged-goods/","name":"Consumer Packaged Goods - Fletcher - Global Competitive Insights","isPartOf":{"@id":"https://fletchercsi.com/#website"},"datePublished":"2023-02-14T16:20:08+00:00","dateModified":"2024-04-19T14:25:26+00:00","breadcrumb":{"@id":"https://fletchercsi.com/industries/consumer-packaged-goods/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://fletchercsi.com/industries/consumer-packaged-goods/"]}]},{"@type":"BreadcrumbList","@id":"https://fletchercsi.com/industries/consumer-packaged-goods/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://fletchercsi.com/"},{"@type":"ListItem","position":2,"name":"Industries","item":"https://fletchercsi.com/industries/"},{"@type":"ListItem","position":3,"name":"Consumer Packaged Goods"}]},{"@type":"WebSite","@id":"https://fletchercsi.com/#website","url":"https://fletchercsi.com/","name":"Fletcher - Global Competitive Insights","description":"Global Competitive Insights","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://fletchercsi.com/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}</script> <link rel='dns-prefetch' href='//www.googletagmanager.com' /><link rel='dns-prefetch' href='//fonts.googleapis.com' /><link rel='dns-prefetch' href='//use.fontawesome.com' /><link rel="alternate" type="application/rss+xml" title="Fletcher - Global Competitive Insights &raquo; Feed" href="https://fletchercsi.com/feed/" /><link rel="alternate" type="text/calendar" title="Fletcher - Global Competitive Insights &raquo; iCal Feed" href="https://fletchercsi.com/events/?ical=1" /><link rel='stylesheet' id='wp-block-library-css' href='https://fletchercsi.com/wp-includes/css/dist/block-library/style.min.css?ver=6.7.1' type='text/css' media='all' /><style id='wp-block-library-theme-inline-css' type='text/css'>.wp-block-audio :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-audio :where(figcaption){color:#ffffffa6}.wp-block-audio{margin:0 0 1em}.wp-block-code{border:1px solid #ccc;border-radius:4px;font-family:Menlo,Consolas,monaco,monospace;padding:.8em 1em}.wp-block-embed :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-embed :where(figcaption){color:#ffffffa6}.wp-block-embed{margin:0 0 1em}.blocks-gallery-caption{color:#555;font-size:13px;text-align:center}.is-dark-theme .blocks-gallery-caption{color:#ffffffa6}:root :where(.wp-block-image figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme :root :where(.wp-block-image figcaption){color:#ffffffa6}.wp-block-image{margin:0 0 1em}.wp-block-pullquote{border-bottom:4px solid;border-top:4px solid;color:currentColor;margin-bottom:1.75em}.wp-block-pullquote cite,.wp-block-pullquote footer,.wp-block-pullquote__citation{color:currentColor;font-size:.8125em;font-style:normal;text-transform:uppercase}.wp-block-quote{border-left:.25em solid;margin:0 0 1.75em;padding-left:1em}.wp-block-quote cite,.wp-block-quote footer{color:currentColor;font-size:.8125em;font-style:normal;position:relative}.wp-block-quote:where(.has-text-align-right){border-left:none;border-right:.25em solid;padding-left:0;padding-right:1em}.wp-block-quote:where(.has-text-align-center){border:none;padding-left:0}.wp-block-quote.is-large,.wp-block-quote.is-style-large,.wp-block-quote:where(.is-style-plain){border:none}.wp-block-search .wp-block-search__label{font-weight:700}.wp-block-search__button{border:1px solid #ccc;padding:.375em .625em}:where(.wp-block-group.has-background){padding:1.25em 2.375em}.wp-block-separator.has-css-opacity{opacity:.4}.wp-block-separator{border:none;border-bottom:2px solid;margin-left:auto;margin-right:auto}.wp-block-separator.has-alpha-channel-opacity{opacity:1}.wp-block-separator:not(.is-style-wide):not(.is-style-dots){width:100px}.wp-block-separator.has-background:not(.is-style-dots){border-bottom:none;height:1px}.wp-block-separator.has-background:not(.is-style-wide):not(.is-style-dots){height:2px}.wp-block-table{margin:0 0 1em}.wp-block-table td,.wp-block-table th{word-break:normal}.wp-block-table :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-table :where(figcaption){color:#ffffffa6}.wp-block-video :where(figcaption){color:#555;font-size:13px;text-align:center}.is-dark-theme .wp-block-video :where(figcaption){color:#ffffffa6}.wp-block-video{margin:0 0 1em}:root :where(.wp-block-template-part.has-background){margin-bottom:0;margin-top:0;padding:1.25em 2.375em}</style><style id='classic-theme-styles-inline-css' type='text/css'>/*! This file is auto-generated */ .wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}</style><style id='global-styles-inline-css' type='text/css'>:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--dark-gray: #404040;--wp--preset--color--gray: #eeeeee;--wp--preset--color--light-gray: #f9f9f9;--wp--preset--color--yellow: #e5ae4a;--wp--preset--color--blue: #1b8be0;--wp--preset--color--tahiti-gold: #e4741f;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 14px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 26px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-size--extra-small: 13px;--wp--preset--font-size--normal: 16px;--wp--preset--font-size--huge: 32px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} :where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;} :where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;} :root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}</style><link rel='stylesheet' id='contact-form-7-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_3fd2afa98866679439097f4ab102fe0a.php?ver=6.0' type='text/css' media='all' /><link rel='stylesheet' id='more-google-fonts-css' href='https://fonts.googleapis.com/css?family=Oswald%3Awght%40400%3B500%3B600&#038;display=swap&#038;ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='animate-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_e8f760ef9145795c4352cac3a8936207.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='bootstrap-style-css' href='https://fletchercsi.com/wp-content/themes/catch-responsive-child/css/bootstrap.min.css?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='fontawesome-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_3a84551df4f26e66de3e3711c1b743ca.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_5fc1ccc818bf7988e64028f8aa853ecf.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-laptop-average-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_570302ffd8756266629f18e91c0a4f1e.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='custom-mobile-large-styles-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_7b1590f97369e800967ff8bcf9bccf6f.php?ver=1.0' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_9b4dbfbf6cc716f6b5ec687519ab48f1.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='child-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_9105caf58d7f8757337dad89cfdda326.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-fonts-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_1ef829497e33b0231d889b95978a972f.php' type='text/css' media='all' /><link rel='stylesheet' id='catchresponsive-block-style-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_8ae0ffb70e81dcc97200fed987c0c347.php?ver=6.7.1' type='text/css' media='all' /><link rel='stylesheet' id='genericons-css' href='https://fletchercsi.com/wp-content/cache/autoptimize/autoptimize_single_13a6500ddf36c6dd581877aefc78d34d.php?ver=3.4.1' type='text/css' media='all' /><link rel='stylesheet' id='jquery-sidr-css' href='https://fletchercsi.com/wp-content/themes/catch-responsive/css/jquery.sidr.light.min.css?ver=2.1.0' type='text/css' media='all' /><link rel='stylesheet' id='font-awesome-official-css' href='https://use.fontawesome.com/releases/v6.2.0/css/all.css' type='text/css' media='all' integrity="sha384-SOnAn/m2fVJCwnbEYgD4xzrPtvsXdElhOVvR8ND1YjB5nhGNwwf7nBQlhfAwHAZC" crossorigin="anonymous" /><link rel='stylesheet' id='font-awesome-official-v4shim-css' href='https://use.fontawesome.com/releases/v6.2.0/css/v4-shims.css' type='text/css' media='all' integrity="sha384-MAgG0MNwzSXBbmOw4KK9yjMrRaUNSCk3WoZPkzVC1rmhXzerY4gqk/BLNYtdOFCO" crossorigin="anonymous" /> <!--[if lt IE 9]> <script type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/html5.min.js?ver=3.7.3" id="catchresponsive-html5-js"></script> <![endif]--> <script type="text/javascript" src="https://fletchercsi.com/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/jquery.sidr.min.js?ver=2.2.1.1" id="jquery-sidr-js"></script> <script defer type="text/javascript" src="https://fletchercsi.com/wp-content/themes/catch-responsive/js/catchresponsive-custom-scripts.min.js" id="catchresponsive-custom-scripts-js"></script> <script defer type="text/javascript" src="https://www.googletagmanager.com/gtag/js?id=G-MMHB4QCLRY" id="google_gtagjs-js"></script> <script defer id="google_gtagjs-js-after" src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwp3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTtmdW5jdGlvbiBndGFnKCl7ZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTt9Cmd0YWcoInNldCIsImxpbmtlciIseyJkb21haW5zIjpbImZsZXRjaGVyY3NpLmNvbSJdfSk7Cmd0YWcoImpzIiwgbmV3IERhdGUoKSk7Cmd0YWcoInNldCIsICJkZXZlbG9wZXJfaWQuZFpUTmlNVCIsIHRydWUpOwpndGFnKCJjb25maWciLCAiRy1NTUhCNFFDTFJZIik7Ci8qIF1dPiAqLwo="></script> <link rel="https://api.w.org/" href="https://fletchercsi.com/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://fletchercsi.com/wp-json/wp/v2/pages/4197" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://fletchercsi.com/xmlrpc.php?rsd" /><meta name="generator" content="WordPress 6.7.1" /><link rel='shortlink' href='https://fletchercsi.com/?p=4197' /><link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://fletchercsi.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ffletchercsi.com%2Findustries%2Fconsumer-packaged-goods%2F" /><link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://fletchercsi.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ffletchercsi.com%2Findustries%2Fconsumer-packaged-goods%2F&#038;format=xml" /><meta name="generator" content="Site Kit by Google 1.140.0" /><meta name="tec-api-version" content="v1"><meta name="tec-api-origin" content="https://fletchercsi.com"><link rel="alternate" href="https://fletchercsi.com/wp-json/tribe/events/v1/" /><style type="text/css"></style> <script defer src="data:text/javascript;base64,Ci8qIDwhW0NEQVRBWyAqLwoKCQkJKCBmdW5jdGlvbiggdywgZCwgcywgbCwgaSApIHsKCQkJCXdbbF0gPSB3W2xdIHx8IFtdOwoJCQkJd1tsXS5wdXNoKCB7J2d0bS5zdGFydCc6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLCBldmVudDogJ2d0bS5qcyd9ICk7CgkJCQl2YXIgZiA9IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHMgKVswXSwKCQkJCQlqID0gZC5jcmVhdGVFbGVtZW50KCBzICksIGRsID0gbCAhPSAnZGF0YUxheWVyJyA/ICcmbD0nICsgbCA6ICcnOwoJCQkJai5hc3luYyA9IHRydWU7CgkJCQlqLnNyYyA9ICdodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndG0uanM/aWQ9JyArIGkgKyBkbDsKCQkJCWYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGosIGYgKTsKCQkJfSApKCB3aW5kb3csIGRvY3VtZW50LCAnc2NyaXB0JywgJ2RhdGFMYXllcicsICdHVE0tVzlHRFJUNicgKTsKCQkJCi8qIF1dPiAqLwo="></script> <link rel="icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon-40x40.png" sizes="32x32" /><link rel="icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" sizes="192x192" /><link rel="apple-touch-icon" href="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" /><meta name="msapplication-TileImage" content="https://fletchercsi.com/wp-content/uploads/2022/10/favicon.png" /> <style type="text/css" media="screen">.site-title a, .site-description { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px, 1px, 1px, 1px); }</style></head><body class="page-template page-template-php page-template-dynamic-industry-page page-template-phpdynamic-industry-page-php page page-id-4197 page-child parent-pageid-12 wp-embed-responsive tribe-no-js slug-consumer-packaged-goods new-header no-sidebar content-width excerpt-image-left mobile-menu-two"> <noscript> <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-W9GDRT6" height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <script type="text/javascript">/*! * modernizr v3.6.0 * Build https://modernizr.com/download?-mq-dontmin * * Copyright (c) * Faruk Ates * Paul Irish * Alex Sexton * Ryan Seddon * Patrick Kettner * Stu Cox * Richard Herrera * MIT License */ /* * Modernizr tests which native CSS3 and HTML5 features are available in the * current UA and makes the results available to you in two ways: as properties on * a global `Modernizr` object, and as classes on the `<html>` element. This * information allows you to progressively enhance your pages with a granular level * of control over the experience. */ ; (function(window, document, undefined) { var tests = []; /** * * ModernizrProto is the constructor for Modernizr * * @class * @access public */ var ModernizrProto = { // The current version, dummy _version: '3.6.0', // Any settings that don't work as separate modules // can go in here as configuration. _config: { 'classPrefix': '', 'enableClasses': true, 'enableJSClass': true, 'usePrefixes': true }, // Queue of tests _q: [], // Stub these for people who are listening on: function(test, cb) { // I don't really think people should do this, but we can // safe guard it a bit. // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests. // This is in case people listen to synchronous tests. I would leave it out, // but the code to *disallow* sync tests in the real version of this // function is actually larger than this. var self = this; setTimeout(function() { cb(self[test]); }, 0); }, addTest: function(name, fn, options) { tests.push({ name: name, fn: fn, options: options }); }, addAsyncTest: function(fn) { tests.push({ name: null, fn: fn }); } }; // Fake some of Object.create so we can force non test results to be non "own" properties. var Modernizr = function() {}; Modernizr.prototype = ModernizrProto; // Leak modernizr globally when you `require` it rather than force it here. // Overwrite name so constructor name is nicer :D Modernizr = new Modernizr(); var classes = []; /** * is returns a boolean if the typeof an obj is exactly type. * * @access private * @function is * @param {*} obj - A thing we want to check the type of * @param {string} type - A string to compare the typeof against * @returns {boolean} */ function is(obj, type) { return typeof obj === type; }; /** * Run through all tests and detect their support in the current UA. * * @access private */ function testRunner() { var featureNames; var feature; var aliasIdx; var result; var nameIdx; var featureName; var featureNameSplit; for (var featureIdx in tests) { if (tests.hasOwnProperty(featureIdx)) { featureNames = []; feature = tests[featureIdx]; // run the test, throw the return value into the Modernizr, // then based on that boolean, define an appropriate className // and push it into an array of classes we'll join later. // // If there is no name, it's an 'async' test that is run, // but not directly added to the object. That should // be done with a post-run addTest call. if (feature.name) { featureNames.push(feature.name.toLowerCase()); if (feature.options && feature.options.aliases && feature.options.aliases.length) { // Add all the aliases into the names list for (aliasIdx = 0; aliasIdx < feature.options.aliases.length; aliasIdx++) { featureNames.push(feature.options.aliases[aliasIdx].toLowerCase()); } } } // Run the test, or use the raw value if it's not a function result = is(feature.fn, 'function') ? feature.fn() : feature.fn; // Set each of the names on the Modernizr object for (nameIdx = 0; nameIdx < featureNames.length; nameIdx++) { featureName = featureNames[nameIdx]; // Support dot properties as sub tests. We don't do checking to make sure // that the implied parent tests have been added. You must call them in // order (either in the test, or make the parent test a dependency). // // Cap it to TWO to make the logic simple and because who needs that kind of sub testing // hashtag famous last words featureNameSplit = featureName.split('.'); if (featureNameSplit.length === 1) { Modernizr[featureNameSplit[0]] = result; } else { // cast to a Boolean, if not one already if (Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) { Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]); } Modernizr[featureNameSplit[0]][featureNameSplit[1]] = result; } classes.push((result ? '' : 'no-') + featureNameSplit.join('-')); } } } }; /** * docElement is a convenience wrapper to grab the root element of the document * * @access private * @returns {HTMLElement|SVGElement} The root element of the document */ var docElement = document.documentElement; /** * A convenience helper to check if the document we are running in is an SVG document * * @access private * @returns {boolean} */ var isSVG = docElement.nodeName.toLowerCase() === 'svg'; /** * createElement is a convenience wrapper around document.createElement. Since we * use createElement all over the place, this allows for (slightly) smaller code * as well as abstracting away issues with creating elements in contexts other than * HTML documents (e.g. SVG documents). * * @access private * @function createElement * @returns {HTMLElement|SVGElement} An HTML or SVG element */ function createElement() { if (typeof document.createElement !== 'function') { // This is the case in IE7, where the type of createElement is "object". // For this reason, we cannot call apply() as Object is not a Function. return document.createElement(arguments[0]); } else if (isSVG) { return document.createElementNS.call(document, 'http://www.w3.org/2000/svg', arguments[0]); } else { return document.createElement.apply(document, arguments); } } ; /** * getBody returns the body of a document, or an element that can stand in for * the body if a real body does not exist * * @access private * @function getBody * @returns {HTMLElement|SVGElement} Returns the real body of a document, or an * artificially created element that stands in for the body */ function getBody() { // After page load injecting a fake body doesn't work so check if body exists var body = document.body; if (!body) { // Can't use the real body create a fake one. body = createElement(isSVG ? 'svg' : 'body'); body.fake = true; } return body; } ; /** * injectElementWithStyles injects an element with style element and some CSS rules * * @access private * @function injectElementWithStyles * @param {string} rule - String representing a css rule * @param {function} callback - A function that is used to test the injected element * @param {number} [nodes] - An integer representing the number of additional nodes you want injected * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes * @returns {boolean} */ function injectElementWithStyles(rule, callback, nodes, testnames) { var mod = 'modernizr'; var style; var ret; var node; var docOverflow; var div = createElement('div'); var body = getBody(); if (parseInt(nodes, 10)) { // In order not to give false positives we create a node for each test // This also allows the method to scale for unspecified uses while (nodes--) { node = createElement('div'); node.id = testnames ? testnames[nodes] : mod + (nodes + 1); div.appendChild(node); } } style = createElement('style'); style.type = 'text/css'; style.id = 's' + mod; // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody. // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270 (!body.fake ? div : body).appendChild(style); body.appendChild(div); if (style.styleSheet) { style.styleSheet.cssText = rule; } else { style.appendChild(document.createTextNode(rule)); } div.id = mod; if (body.fake) { //avoid crashing IE8, if background image is used body.style.background = ''; //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible body.style.overflow = 'hidden'; docOverflow = docElement.style.overflow; docElement.style.overflow = 'hidden'; docElement.appendChild(body); } ret = callback(div, rule); // If this is done after page load we don't want to remove the body so check if body exists if (body.fake) { body.parentNode.removeChild(body); docElement.style.overflow = docOverflow; // Trigger layout so kinetic scrolling isn't disabled in iOS6+ // eslint-disable-next-line docElement.offsetHeight; } else { div.parentNode.removeChild(div); } return !!ret; } ; /** * Modernizr.mq tests a given media query, live against the current state of the window * adapted from matchMedia polyfill by Scott Jehl and Paul Irish * gist.github.com/786768 * * @memberof Modernizr * @name Modernizr.mq * @optionName Modernizr.mq() * @optionProp mq * @access public * @function mq * @param {string} mq - String of the media query we want to test * @returns {boolean} * @example * Modernizr.mq allows for you to programmatically check if the current browser * window state matches a media query. * * ```js * var query = Modernizr.mq('(min-width: 900px)'); * * if (query) { * // the browser window is larger than 900px * } * ``` * * Only valid media queries are supported, therefore you must always include values * with your media query * * ```js * // good * Modernizr.mq('(min-width: 900px)'); * * // bad * Modernizr.mq('min-width'); * ``` * * If you would just like to test that media queries are supported in general, use * * ```js * Modernizr.mq('only all'); // true if MQ are supported, false if not * ``` * * * Note that if the browser does not support media queries (e.g. old IE) mq will * always return false. */ var mq = (function() { var matchMedia = window.matchMedia || window.msMatchMedia; if (matchMedia) { return function(mq) { var mql = matchMedia(mq); return mql && mql.matches || false; }; } return function(mq) { var bool = false; injectElementWithStyles('@media ' + mq + ' { #modernizr { position: absolute; } }', function(node) { bool = (window.getComputedStyle ? window.getComputedStyle(node, null) : node.currentStyle).position == 'absolute'; }); return bool; }; })(); ModernizrProto.mq = mq; // Run each test testRunner(); delete ModernizrProto.addTest; delete ModernizrProto.addAsyncTest; // Run the things that are supposed to run after the tests for (var i = 0; i < Modernizr._q.length; i++) { Modernizr._q[i](); } // Leak Modernizr namespace window.Modernizr = Modernizr; ; })(window, document);</script> <div id="page" class="hfeed site"><header id="masthead" role="banner"><div class="wrapper"><div id="mobile-header-left-menu" class="mobile-menu-anchor primary-menu"> <a href="#mobile-header-left-nav" id="header-left-menu" class="genericon genericon-menu"> <span class="mobile-menu-text">Menu</span> </a></div><div id="site-branding"><div id="site-header"><p class="site-title"><a href="https://fletchercsi.com/" rel="home">Fletcher - Global Competitive Insights</a></p><p class="site-description">Global Competitive Insights</p></div></div><div id="mobile-header-right-menu" class="mobile-menu-anchor secondary-menu"> <a href="#mobile-header-right-menu" id="secondary-menu" class="genericon genericon-menu"> <span class="mobile-menu-text">Menu</span> </a></div><aside class="sidebar sidebar-header-right widget-area"></aside></div></header><nav class="site-navigation nav-secondary" role="navigation"><div class="wrapper"><h2 class="screen-reader-text">Secondary Menu</h2><div class="screen-reader-text skip-link"><a href="#content" title="Skip to content">Skip to content</a></div><div class="menu-main-menu-container"><ul id="menu-main-menu" class="menu catchresponsive-nav-menu"><li id="menu-item-25" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-25"><a href="https://fletchercsi.com/">Home</a></li><li id="menu-item-24" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-24"><a href="https://fletchercsi.com/about/">About</a><ul class="sub-menu"><li id="menu-item-1958" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1958"><a href="https://fletchercsi.com/about/#company">Company</a></li><li id="menu-item-1933" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1933"><a href="https://fletchercsi.com/about/#careers">Careers</a></li><li id="menu-item-1934" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1934"><a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></li></ul></li><li id="menu-item-23" class="menu-item menu-item-type-post_type menu-item-object-page current-page-ancestor current-menu-ancestor current-menu-parent current-page-parent current_page_parent current_page_ancestor menu-item-has-children menu-item-23"><a href="https://fletchercsi.com/industries/">Industries</a><ul class="sub-menu"><li id="menu-item-4191" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4191"><a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></li><li id="menu-item-4210" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4210"><a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></li><li id="menu-item-3999" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-3999"><a href="https://fletchercsi.com/industries/technology/">Technology</a></li><li id="menu-item-4200" class="menu-item menu-item-type-post_type menu-item-object-page current-menu-item page_item page-item-4197 current_page_item menu-item-4200"><a href="https://fletchercsi.com/industries/consumer-packaged-goods/" aria-current="page">Consumer Packaged Goods</a></li><li id="menu-item-4179" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4179"><a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></li></ul></li><li id="menu-item-6362" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-6362"><a href="https://fletchercsi.com/services/">Services</a><ul class="sub-menu"><li id="menu-item-6363" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6363"><a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></li><li id="menu-item-6368" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6368"><a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></li><li id="menu-item-6367" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6367"><a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></li><li id="menu-item-6366" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6366"><a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></li><li id="menu-item-6365" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6365"><a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></li></ul></li><li id="menu-item-6742" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-6742"><a href="https://fletchercsi.com/resources/">Resources</a><ul class="sub-menu"><li id="menu-item-6783" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6783"><a href="https://fletchercsi.com/resources/blogs/">Blogs</a></li><li id="menu-item-6747" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6747"><a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></li><li id="menu-item-6746" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6746"><a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></li><li id="menu-item-6745" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6745"><a href="https://fletchercsi.com/resources/presentations/">Presentations</a></li><li id="menu-item-6744" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-6744"><a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></li></ul></li><li id="menu-item-4865" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-4865"><a href="https://fletchercsi.com/contact/">Contact Us</a></li></ul></div></div></nav><div id="content" class="site-content"><div class="wrapper"><main id="main full-width" class="site-main topheavy" role="main"><article id="post-4197" class="post-4197 page type-page status-publish hentry"><div class="entry-container"><div class="entry-content"> <script defer src="data:text/javascript;base64,DQoJalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoJCkgew0KCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVESVQgQ09QWSBIRVJFIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8NCgkJd2luZG93LmR5bmFtaWNfcGFnZV90aXRsZSA9ICdDb25zdW1lciBQYWNrYWdlZCBHb29kcyc7DQoNCgkJd2luZG93LmR5bmFtaWNfaGVyb19pbWFnZV91cmwgPQ0KCQkJJ2h0dHBzOi8vZmxldGNoZXJjc2kuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIyLzA5L2luZHVzdHJ5LWNvbnN1bWVyLTE5MjAuanBnJzsNCg0KCQl3aW5kb3cuZHluYW1pY19oZXJvX2ltYWdlX2NvcHkgPQ0KCQkJIkdsb2JhbGx5IHN1Y2Nlc3NmdWwgY29tcGFuaWVzIGluIHRoZSBoaWdobHkgY29tcGV0aXRpdmUsIGZhc3QtbW92aW5nIGVudmlyb25tZW50IG9mIENvbnN1bWVyIFByb2R1Y3RzIChDUEcpIHJlYWN0IHF1aWNreSBhbmQgaW50ZWxsaWdlbnRseSB0byBtYWtlIGRlY2lzaW9ucyB3aXRoIGFsbCBhdmFpbGFibGUgaW5mb3JtYXRpb24uIENvbnN0YW50IGlubm92YXRpb24sIHRoaW4gbWFyZ2lucywgc21hbGwgZGlmZmVyZW5jZXMgcGVyIHVuaXQsIHRyYWRlIHN1cHBvcnQgZHluYW1pY3MsIGdvLXRvLW1hcmtldCBwb3NpdGlvbmluZywgTSZBIGFjdGl2aXR5LCBhbmQgYW4gaW5jcmVhc2luZ2x5IHRpZ2h0IGdsb2JhbCBzdXBwbHkgY2hhaW4gYXJlIGp1c3Qgc29tZSBvZiB0aGUgZGFpbHkgQ1BHIG1hcmtldCBmb3JjZXMuIFdvcmxkIGNsYXNzIGNvbXBldGl0aXZlIGludGVsbGlnZW5jZSByZXF1aXJlcyBpbmR1c3RyeSBleHBlcmllbmNlLiBGbGV0Y2hlcidzIENvbnN1bWVyIFByb2R1Y3RzIHRlYW0gaXMgc3RhZmZlZCBhbmQgbGVkIGJ5IHBlb3BsZSB3aG8gaGF2ZSB3b3JrZWQgaW4gY29uc3VtZXIgcHJvZHVjdHMgYW5kIGNvbXBldGl0aXZlIGludGVsbGlnZW5jZSBmb3IgbWFueSB5ZWFycy4gV2UgdXRpbGl6ZSBiZXN0LWluLWNsYXNzIHJlc2VhcmNoIHRlY2huaXF1ZXMgYW5kIGluZHVzdHJ5IGV4cGVydGlzZSB0byBwcm92aWRlIGhhcmQtdG8tb2J0YWluIGluc2lnaHRzIGFuZCBkZWNpc2lvbiBzdXBwb3J0IGZvciBvdXIgY2xpZW50cycgbW9zdCBjaGFsbGVuZ2luZyBpc3N1ZXMuIE9wZXJhdGlvbnMsIE1hcmtldGluZyBhbmQgU2FsZXMgbW9yZSBlZmZlY3RpdmVseSBjb21wZXRlIHdpdGggdGhlIGludGVsbGlnZW5jZSB3ZSBwcm92aWRlLiI7DQoNCgkJd2luZG93LmR5bmFtaWNfY29yZV9zZXJ2aWNlc19kaWN0aW9uYXJ5ID0gew0KCQkJJ1Byb2R1Y3QgTWFuYWdlbWVudCAmIFByaXZhdGUgTGFiZWwnOiB7DQoJCQkJaWNvbl9pbWdfaHRtbDogJycsDQoJCQkJaW5mb3JtYXRpb246ICcnLA0KCQkJCXN1Yl9zZXJ2aWNlc19hcnJheTogWw0KCQkJCQl7DQoJCQkJCQl0aXRsZTogJ0dvLVRvLU1hcmtldCBJbnRlbCAmIEFuYWx5c2lzJywNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSdIb3cgZG8gY29tcGV0aXRvcnMgdGFsayB0byBjdXN0b21lcnMgaW4gbmV3IG1hcmtldHMgb3IgY2hhbm5lbHMsIGFuZCB3aGF0IHN0cmF0ZWdpZXMgZG8gdGhleSB1c2Ugd2hlbiBuZWdvdGlhdGluZz8gV2hhdCBjb25zdW1lciBjb21tdW5pY2F0aW9uIHBvaW50cyBhcmUgdGhlIGxhdW5jaCBzdHJhdGVneSBmb3IgbmV3IGlubm92YXRpb24/IFRoZXNlIHF1ZXN0aW9ucyBhbmQgbW9yZSBhcmUgd2hhdCB3ZSBzZWVrIHRvIGFuc3dlci4nLA0KCQkJCQkJaWNvbl9pbWdfaHRtbDoNCgkJCQkJCQknPGltZyBkZWNvZGluZz0iYXN5bmMiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQURhVWxFUVZSNG5PMWF1MjRUUVJROWFTSUZVZEFBVW13ajRTandEd2hhT2tJSDVoY0lBVUg0Qjh3dkJHb1RTSUFDRE5UZXVJS0toeHcrd0hSQm1GQVF4V2JSU0dmRWFKamRtZlUrNU4zTWtXNnhjKytzNXg3ZjExZ0dQRHc4UER3OFBEeitZUjdBUXdEZkFJUVZrU0dBTm4yem9qMERCODVMaEc5V0RHbDhBZFhCUlNVU3JBZ3BWWU96WDZIQnNBOGdLUGxhS2dMQ0NxeDVBcEFpQWdJQXZaS3ZwU0tnQ3ZBRUlHRUVoQ1VRdGNydkdQVDlOQkVRbGtEVUhPOVpDUElwQUY4RWtYa1hhQUM0QmVBZGdGMEF2eWk3WEZ1alRWWXc1YmtVb1Nzc0Ftb0FIZ01ZTytUcG1MWmlUMW9FbHMrYVMrbVhrK0VLZ0orME9RRFFBWEFOd0JLQUJjb1MxenEwQ2JubktyTERTUUFmaXlaZ0RjQ0UraTBBWnpYOWp0WjZRSnN0N2hGNzd5QmI1ejhEK0ZNRUFTdDBRSVQwZXNUZXVJUGM0OTVKeWtqUW5UOVZCQUUxSmV4MTUwV1IyMWIwTXR4ZkFqaXYyZDVWOUxXTW5FY1JCRHppbW5CVWQzNHZwaWg5TjNRQm1RNmlNR2JoZk80RTFCbTZvcGcxSTV4NVF6dDFUMWVwRlhwTitNMTNOcVowL3JTaE8rVFdCbGY1dkdtd0hWSFhNQlRCdWhMdU9qclVpUm5DeGZsUE1jNjdZbW9DdW54dU9SQ2doMkxQOEZPVndIVWxjb3B3UGhVQkF6NHZHMnhmVVBlV0pMamtJamduQ0x1dkZydjN0UHVpT04rUHFUbEJBcitjRFgvdytiakI5bHhFRVl6cUFoSUx0TnUzbkVWRTBBZnRtN2RObnE1K09SdkdFU0J6L1ptU0RyWXVrSVNBSkk3a1JzQWdKZ1dpRU5jRjRsSkE1UHdyemd1dTU3T3R1K3F0UmZBRy9vYysrcnAyZ1phaENLb0Y3M1dDODluV1hmV1JoamY1L0JUSnVvQWtRTmpvZUVLZGFMRUNKeFRuMVlJM0V3VFVBUnh5RUJLaDY5SUZ6dkRiRFZrZlZEVDVyckV5UEYxT1dPMExKVUJnZzJ2UDRkWUZwT3daaXVBMmRlS2RFbk1rUVVUQ3ROVStWd0lXbFhDLzc5QUZSbHhUeDJQd0lpWDFpMU9jWTVwMVY3M1Y4QXF2c2hNRENSSnhnOUM2Y2gwV1YydVVqUUJ3ZHA4bzZhQmZqa3lqYjFNSmU3SDNOdHd3a3dUSVNKRGhmc0JMVW90endqRU9PY3RjMjFSK0VodHhMOHBPQUppL0crd090bUoxU051b25NK3EyaGRLZ0VTZGMwS1hFK00rWmNBMnVHb29oRHJDTWhPUUJiSnkxQk1BSHdId0tZRGtxWmJZMEZhMVowR0NQQWtJWnNCQm0vVHlKS0NzY1BaclNFUHg5OUtxNEZLU3Y4cTJaeUNFODVJSExnVE1rd1FaQ1VmdTcvSWVIaDRlSGg0ZU9CTDRDelpBSURNSytBNkVBQUFBQUVsRlRrU3VRbUNDIj4nLA0KCQkJCQl9LA0KCQkJCQl7DQoJCQkJCQl0aXRsZTogJ0NvbmZlcmVuY2UgSW50ZWxsaWdlbmNlJywNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJBcyBhbiBleHRlbnNpb24gb2Ygb3VyIGNsaWVudHMsIGNvbmZlcmVuY2UgY292ZXJhZ2Ugb2ZmZXJzIGEgcHJvdmVuIG1ldGhvZCBvZiBvYnRhaW5pbmcgaW5zaWdodCBvbiBjb21wZXRpdG9ycycgaW5pdGlhdGl2ZXMgYW5kIGlubm92YXRpb24sIChuZXcpIGluZHVzdHJ5IHBsYXllcnMgYW5kIGZvY3VzIGFyZWFzLCBhbmQgaW5mb3JtYXRpb24gdGhhdCBtYXkgbm90IGJlIGdsZWFuZWQgZnJvbSB5b3VyIGF0dGVuZGFuY2UgYWxvbmUuIiwNCgkJCQkJCWljb25faW1nX2h0bWw6DQoJCQkJCQkJJzxpbWcgZGVjb2Rpbmc9ImFzeW5jIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFCN1VsRVFWUjRuTzJhUFVzRFFSQ0dIeEFFRGRoWXFwV29ZRXIvaVYyME1EL0Z5dDQvb0wwR0cwRTdDNU16cllWaVpXZnBaeEJCRUZjT1JnZ2hYMXoyTnJOMzg4QTJrekRabWJ6djNOMXlZQmpHaEt3QURhQWo2d3pZb0VURnZ3Q3VaNld4WlVwQVF3bytCNWFrNkF1Sm5WQUNPbExzSWJEVHBZbzA5a0dCV1FEMmdkOHUyYi8xTk9DZGdsSUZIbnM4L3dYc1N2R1hFa3Z0VVRnV2dTY3A4QWJZQnA0SERNRTFDc2lCRkpnQXN4SmJCVTZCVi9GOW82akZwenhJQTdZb0tkL1NnQmxLeW84MUFGT0FNd3RRamhtUTlMbSt4N3BhV1JyZ0NyWXlOeUIyckFGNFZFQUNOQ09MZVcyQUswaHNMSnlpRGF0cFFCTzRqaXhtUXhDN0RES1JCZHlRdTZva3crZlIzQWkxQmlScWp2ak9xTStuc2E3SXlIclgwWGVkZUtqTG5qL2xFSGNpYWo2VEJhQXFlMDMzdk9jcjZiRWt2QWNxNktVaWUwejNldVF6OFJ4d0s0blRabWpsLzQrNkErWjlKMTlYUGcrNmZiK1oxNC9VbE02RFhId2Z5enpJemZleHpJTmNmYTk5SGdUeHZkWjVFTlQzMnVaQmNOOXJtd2RUOGIyV2VUQlYzMDk3SHFqdy9TaFpEbm8wOW5sMm9PSHkyM2N3dFljY1JQZzZPMmdydVFFYlNlYVRtSnp5Qk1kWkF6QUZPRVZLQ280ekJXQUtjSXFVRkJ4bkNzQVU0QlFwS1RqT0ZJQXB3Q2xTVW5CYzBSU1FlSHllVi9kVzZEakU4aTVBNzJ0eWhtRXdrRDloUDFoOWJFWENwZ0FBQUFCSlJVNUVya0pnZ2c9PSI+JywNCgkJCQkJfSwNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICdDb21wZXRpdGl2ZSBMYW5kc2NhcGUgQXNzZXNzbWVudCcsDQoJCQkJCQlpbmZvcm1hdGlvbjoNCgkJCQkJCQknTmVlZCB0byB1bmRlcnN0YW5kIHRoZSBkeW5hbWljcyBvZiBhIChuZXcpIGNhdGVnb3J5IGFuZCBzZXQgb2YgY29tcGV0aXRvcnMgZm9yIGEgcG90ZW50aWFsIG5ldyBwcm9kdWN0PyBPdXIgcHJpbWFyeSByZXNlYXJjaCB0ZWNobmlxdWVzIGdvIGZ1cnRoZXIgdGhhbiBzZWNvbmRhcnkgZGF0YSB0byBwcm92aWRlIGluc2lnaHRzIGludG8gY2F0ZWdvcmllcy9pbmR1c3RyaWVzIHRoYXQgZW5hYmxlIG1vcmUgaW5mb3JtZWQgZGVjaXNpb25zLicsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBRjgwbEVRVlI0bk8xYldXeFZSUmorYm51TEJaSWFVWXF5cEJpQnVMNjR4UzJweUlOTGtXaUlHa1Y5b1lrcEVvdkdoZGdtYU1CcU5MeTRCeFdqVVNNUHdJc2lMNmh0d1kyQ1dpeVN1TVFkRFM2a3R5SmE2REYvOGgzelp6ekwzSFBuM0h0NjJ5K1ozTlA1Wi82WitjL012ODBwTUk1eGpIYnNBTkNMTVlJVkFKWWJkUjZMaHJScFJ4WGlkeTYyT1VJQXpmejdWMVFoT3JpNFBsVW4yNzlIL2QzSE50SzI2bEFQWUFEQUp4RnQrZ0Y4eHJhakh1M2N5cDBBSnJLdURrQnRSSjg4Qzlpbmt6enVLTU44a1FQd0xrdU5JNlhubi9HOXhzSVhBdGdHWUFoQWdjOHRpcDVuSDc5L1daVGlKV3JBS3h6eHZKVG51bDhKWUkwYXh5eXJsUUQyc0svd0tBdWVWaFBabk5JWUM4bi9NSUM3QVp6RWNnL3JQR01ubEExMUFBNXdBa2NBREFPWWtjSTRiM01NV2J5SmUwbVQ0MUIydEhCdzJhb2IrTHlxUkEvUDMwM2EweHRrbmJ4MUU5TkpHN1RnNHh5dmNwQ1ZBT2J6K1h1bGtZdEZyNXA0VHdrQ0NPUGpGSk9walVjQU5ORWE3T09naXh5UHRZMTg1Y3lidUs5U1IrQ21nQzEyRit1MnBIVFVEdlBNVDJlUnhmOWRLU1g0QmdkdVUzWEhBL2dMd0ZFQXMwdmczVXhUdGx1WndkV1dadkJqOXRXeGczT2NBT0FmRm5uV2VKbVQ2bkxnQ0EwWWpsQUx0M29od2hFYVVQMkZWeXBvNHdDeUMweGNSTnArQUJNUzhKWkovOGJBeHZmdGN6R0tOYzgyWUo4Tzhrak5GZTdsSWtVUEJLR2Y5T3NjakZYUFFPZlRyQVJEVGRUOFE3UUVRYmpkb1diMncrR2RFUm1oMU1MaEhBZmFvUmE3a29PSkR4Q0dZNVdKbkJkQXJ5VmZtd0Nxb2dtUjg5UmdMeHJiTzg3c1BNZDJhd05vMXlxK0xSWTZvZDBpSmRhZVJ2VFhaWmlieC9oN2dIRkFGTTVSYjhVOG16MktaeEtmd2N3SXBZYlBPY2tYREVGSUJHaURuV3gvczZvN2wzVi9BRGhFbjJFT01valQxUnZNOHdqNEFyallra2RyZ0xmNEd1c2VVWUlOT2lZVlI0ZDYrNkFTM002dDU5dmNPRWlmZytSekpvQlp5b0dhQ2VCczBrVFJUVUxHc011UmovMGsrVHdCNEZFK3Y2TG83N0ZPZGt0bTBFUVROdWpBdVRpTEN6ekljKzlSRC9oWXdqcngrek9ERlp6VTY0NzRiVmY2bzl1Z2lidjhNMm5pUm1jQzNaelFEWTc0M2FJRWNFMEFmWTJGYzFVMlRHVitUMkx2QmtjODYybE56TzN2WXhiemlSTGJUMHZBdjVFNmF4ZWZTMEpyUktSWEN0YVM3N29RK2tiUzVWS2oyQmZtZTZjZWZaZWcxSmsxM2lTanBYQ0xPVlNzaFpDZGRSbkgvZEhDeXd4YmZNbENhT0RXUDBMbVNDbTN0eXlBbGxPM09vc3RlRFh5RXNSVHYvcDVUNUxqY0NNN3Y0TjBjRDM1aDhYMnkwbVhld0RiTnk5diswUWxBSk5XMUU3WWtQS2QyZ1JtaXNKTVhnTjlEemtxWjFqRUdQb3Q2d2hSNzQ2UGl0SFVneXJOblJiOENQT2xFUHBUcE10dkdONW5FcVF4SWtSdVpCdHBXOVQ5V3gvU3hXeEdnQklKVGdrSndud3YxTllNTnlvQkpEYUQ2OG5nZnFTUExSenJ6cGk3UVBQYm9OVE1ZRjVkY2w0TzRFRUFIOUovRjR2d0E0QVBBRHpMSy9BazJWNk5SUnhyWDBoa3VaajB2VEdScHo3cnVoUnRBZWF6NDRpNmFZa3Ezd0s0cllRN3dGcmVJWG9jMjBSZTBSZVV3d3crcmhpTU1BaTZpbTVwSGEraHptZENkTGRxSzkvdFhKQlFDS3ZJUXl4UEVEcEozMlN4ZUZNSEZDV0VHZ0Rmc2NOK2kyeFBqbHY0Qy9ZNXlnUm9zWlpqUm96L1A0MjBZY1lLVVl1UE1vT3hRbWhUaWM1VGlsakFSRVp4L2hjYXczeGJ5NWpwbWFrK2NnckRadmFWblJWMS9TN2pSUGtBWVdZdzFoZVl6Q3NrYVhRMWtrR0U5cndTUkpJaXduK1kzeHZWQkZ5ei9RTGdtQWdmSUVnQVZyNUFLenU1U0RGUFpkeS9ub09Lb3Z3emdUQkVyMXlwK1BvNlJ6SkhVUWdTUUN3MlZqZ2ZWOGUzZENIdi9iVTlYMGZ2ZENuL2x0eWhjd0Y4dzA1emtRM2t1T0FDNTlWTkFmbkhWSFNMVXdFY1lxZXNwYVRuOFFoNXpDYytZNlRvblFuQVM5S3BURGhaQ2VGci9vYkZEMVVwQUQrTDlKT2hKSU8rRmF4YUFRaE9CZkNWbXFzOG54YmdZMVN0QUh3VHU5WFNqQTdSbEhZeFUxUVZBdkN4Z0ltVUx5MTlqS0U0LzhFYlpRS3d3U1I2bEZ0VmNMZGtMQWxBNHdHdXJ4QjJITHdxRjBCT1hmTTlGQ1dBNDBvc0x2NVRKQzNjcW1LTS84RWJRMFYvVGY0ZjN1TFhHYVVVLzFQMnJKZXlmRlExam5FZysvZ1h0Tjd3UzNwZFFqc0FBQUFBU1VWT1JLNUNZSUk9Ij4nLA0KCQkJCQl9LA0KCQkJCV0sDQoJCQl9LA0KCQkJJ0NvbXBldGl0aXZlIFByb2ZpbGVzLCBNYW51ZmFjdHVyaW5nICYgU3VwcGx5IENoYWluJzogew0KCQkJCWljb25faW1nX2h0bWw6ICcnLA0KCQkJCWluZm9ybWF0aW9uOiAnJywNCgkJCQlzdWJfc2VydmljZXNfYXJyYXk6IFsNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICdDb21wZXRpdGl2ZSBTdXBwbHkgQ2hhaW4gTWFwcGluZycsDQoJCQkJCQlpbmZvcm1hdGlvbjoNCgkJCQkJCQknV2hlcmUgYXJlIGNvbXBldGl0b3JzIGludmVzdGluZywgYW5kIHdoYXQgYXJlIHRoZWlyIHN1cHBseSBzdHJhdGVnaWVzPyBXaG8gbWFrZXMgd2hhdCBmb3Igd2hvbSBhbmQgd2hlcmUsIGFuZCB3aGF0IGFyZSB0aGUgY2FwYWNpdGllcz8gVGhyb3VnaCBtdWx0aXBsZSBvbmUtb24tb25lIGludGVydmlld3MsIEZsZXRjaGVyIGNhbiBhbnN3ZXIgdGhlc2UgcXVlc3Rpb25zIGFuZCBtb3JlIGFzIHdlIG1hcCB0aGVpciBzdXBwbHkgY2hhaW4uJywNCgkJCQkJCWljb25faW1nX2h0bWw6DQoJCQkJCQkJJzxpbWcgZGVjb2Rpbmc9ImFzeW5jIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFIcDBsRVFWUjRuTzFiYTJ4VlJSRCtTbWtLU0ZFcFhDeElBTUVDSXNZQVA5QlNGREVtS21BUUZRMUk4SVdQS0tnUkNNWVFmQ1g2UjhWb0lnOGpTZ0FsNEFPc1A2Z1ZFeDVxcFFnRlJDUUlvaEJBa05KS0tDMXd6Smh2azJIZGMrNDV0L2YyM3BMN0pUYzlaMmQzenN6czJkbVoyVk1naXl5eWFDWmNCdUFCQUI4Q3FBSndCRUFqZjNLOUNjQWk5dW1DQ3dpREFheWlvbDdJbi9UOUFzQWd0R0QwQXZBeGdITlU2cXhTOEM4QUQ2bjdSd0VjVmZlbXI0eGRDcUFuV2hodUIxQkRKZVR2SEFBTGVYOE1RRC8yTXdxRGJjZDRQdy9BaXdCTzhQNDRnRnZSUWpCTHplQW5YUHNEQUp4aCszRFZWeHNBcEozbEV1Z0xvQWpBY3ZWV3pFU0c0eG0xaHA5UzdTdllMZzRRQVFZQSszaGNQZ1pUbFErUjY0ekVXTTZTelBTOXFqMEdvQUZBUFlEdUlRelFuWDFQQStpczJ1OGpiL21OUVliaGNnRC9VSmxEQU80Q2tHTzlGWjg2eHJrTUlGako5bW04RjE1M2s3ZTAxd0xvaWd6Q1VncDJVaW0xQThEVEFLcDVQeTZDQWNheXZab0czS0g2bW1jc1JvYWdsTnRWRFdkbENvQS9IWHY3QndBZUEzQURQWDZob2hXeWJUajd2TzhZL3dlQVJ3QjA0KzRnejd3ZUdZQXZLZUFMcXEwMWdEc0FiSXdRL1BqOU5uTE5DMCtEMmFSOWpqU2ppSTd2bE9Xd0RGNmhvTXU0bmlVV1dBZGdweFg0SEdYYk92YVp4akZDZTluQk4wWkgyY2pydE9GaENybmFoLzRaNmRJUEVYeUE1aTBPTWVqTms5d2hiVmhFSVo3d29WZVJmbE1DQmhoSjJvOCs5Q2RKRjMrUk5teW1FSDdPeURoRHlRdWlHdUFLMHZiNzBFdElseXd5YlRoQ0lUb0ZiSTliQU9RbVlJQUN0ZWU3RUNQOU1Kb1poWHo5S3BVQ2ZnckdRNUFCV3F1dzJvVjhOYjZTTW9sc0tVRWV0NktWREZIdHJhcE5DZ3hnRkJSdjcwSWJoeHluS2VNWXl0eGs5QU13VjczcUhtUHhNZ0RqbWRkTFd4K2Y4ZEp2YTRKTElONHJmaVhwUnloTEdXWHpWUHRjWnBVSklhYnljNDhKeld6dS9RWm1HWWpIRG5LQ1BSSXdnRkh3VngvNnphVC9vTnFLS0dPRDRuMHMwVmhoc1ZXZE1ZV0pOd0VVczg4Q3RqL3J3Nk15emk0UlpJQ2hjYmJCNTBpZnovdGl5blpjOFRXeWY0U0lHS2tTRDFrR0V3QnNVSXdsRGw5RHhoNGp1S0JBU0ZMWnFBWjRrRFRaU1Z4WXI1UmJvMHB2SG1XZFFObFBrdVlYaXppZHl5NHlzaXN3MTlMaUp2WFZsdTc5ZjFiL2hiRkNmeDNSRGZBR2FjODdhTDJ0TjlPalRQTXBvOFpNMG5mUnNjYkZIQTdZRnVCSkwyWmxacWZsZ1pjeE96UzRVd1VyMHpsYjN3UFlDNkJPalpYcjN3Qjh4NHJRZEJWRmpsYjhTdmtNdlJQdHBDd2lrd3Q1MU1XamJvSG95MjNuSENPdGVNamhjbGxobGIyck9YUGxTY2dHeThuTDFCVk1iTENDenphRmx5Q1VVS2Q2NWIrY3lueGpPWllvNkVZTEgvUlI1Q3ZtOHlVTWN6c29XZ2UybGJCUG1RK1BnM3lHUENzcTVwTkhoWi9SSnFsOXR5TVNSeDdMVjJzdDRXVUc3N0dXbGUwRHpOaXQxdGkxYkk4YTNOd0lZQlN2TzFJMzRYZS8zYkdqQ25ZbUlubTRDc0E3cXI2dlo3R3JhdXZLdGdPcTdRVEhDbzlFc1kvT2NpRHZKL3BOOGdJU3ZnNjVwcUpDRXB2SEhldllkVjNOc2xqN2lNOW83WGhEM2lMUEpielBvWTduTGZOaFlSeEVFbEhLdlYxNzh0TnMwenRJVkd6Z2pJdXhkYlg2SkxkQWcyTGIwVytoRUt1U2xVQ0VoQ2w1ZWJ4dUtpcklTN1pRamY1V0tKNUhYYVh2VDJDb2FRVFp4N1N5TFZLTFFWWWdjemJpU2JEcyt5OVpiYmZFeVIzYVVyZDk2cm1WeGlLeUEveXNDSWQ1eHVjWFhDUnJ0dlJQMnNKaU44ZUkwbmJrcVkva1FCMW1xUjNBbzY2aTgzbHZmQ3NlU09oQ2g5VDZYMDF5NWZVMjh0YVpwcmtXbW8yZTZqVFpZSVp5Mm42SVVmWWFhOGJIVXRkQWpMUm1TUnpKMndGcGJWamtxckRVSEpucDYyMk8yc0Z1UGw4Y21vRTR1dCtaRU5ub1FWbjFLVlZGUU1vZWlGb3lNSmxXQXl2QjRsZ1NnU2wxNzdGS1d2bHNjNVhRbDdCZHRqU05QT3V3cEQ5bGE3Qms5cXNwaG9JeHdGQW1NbzNLYVVucGFVZ0VYaGVwUUVjcU9IWWtPSjdYQjlqWFlDQ2ZKOG1TQzBNb2kzR3FqWlIxYURJTlVNQjdLVysveTVNZ0k3ems0aU5DOEpxdEtqZzVEZ1Bra09heHI4WW9uaWxxak9DekRZOVRsSzFYeUtweUtOZ0dNT2pNMEZWWFh6YlRzK2I2T0NURHF6UWdGN2lPcjI2ZFZYcURNdEpvNjh5eGpyVS8rN2c4cFFZd0tPQTVuczRBdDlNUWVuM084L2xHd0RhQXJpSzlwOXBhVVhGVEkvQllrSlZKdURSQXRwUWJ3Q0NmU3B2OTJXUFJZeG9ESFBNOVlQOFFCaWltSXp2RHNaTlVoY3FqOXhlKzdSQ01aaldBOXN5VHJVcVJjVTZ5UGhIQ0FHQmZQZFlqejhrUnd2VzBHRUMvc3VOWUNqT3BiU3lDQVdJcWhkNUVYbkdEbDB3eWdGMlVNUGw0V0FNSXJ1YllSSkV4QmdoQ2tBR2FpcXdCa0gwRGtMUWxNRFZGeXlCVlM2Q0FNamZaQU44cUlVOXdlNUx2ZmpQVkFBTW9veTdDaWc0Skk1Y1JXTGwxOXJiSlZWQklrd0ZTTGVONUVkcHJBUDVXRHpuRXRoNXBNRUFSei8zMkt6NjFETHV2UVFyUm5sK0RtbUtxaWRqS09STTVLVGJBTUg1Q3I3OEIrSVhHdUFScCtIZVllVlo2dkp2Q0ZDYlJBQjFvOU8xV0tYMDVQNVJJeFZsR0pIU2gwbnV0L0h4NW5POTU0eGxnRUEyc2orTVBjdG5wRWxuR29CVm5aTFhESVUxeFpIQXVBK1R6SE5BK1dWN1BkcDFtWnpUNmNLYjBOOEhIV2J5UWsyRGJBT1owV1grUVZjTTNJSmxiYjdPakhmOURyTXB5bXZvSXZNeEtmYXM0Smw3TzMrSXdtRE9xUzlibVY2K2MyZ1dQVGp6YzJNUGZqSURQYmJQSUFxbkR2MkRRZmoreVdvbjdBQUFBQUVsRlRrU3VRbUNDIj4nLA0KCQkJCQl9LA0KCQkJCQl7DQoJCQkJCQl0aXRsZTogJ0NvbXBldGl0b3IgUHJvZmlsZXMgJiBEZWVwIERpdmVzJywNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJDb21wYW55IHByb2ZpbGVzIGJ1aWxkIGZyb20gdHJhZGl0aW9uYWwgU1dPVCBpbmZvcm1hdGlvbiBhbmQgZ28gZnVydGhlciB0byBkZWx2ZSBpbnRvIGRldGFpbHMgYmVoaW5kIGFzcGVjdHMgc3VjaCBhcyBtYXJrZXQgcG9zaXRpb24gYW5kIHN0cmF0ZWdpYyBpbml0aWF0aXZlcy4gV2UgY2FuIGhlbHAgY2xpZW50cyB1bmRlcnN0YW5kIGNvbXBldGl0b3JzJyBrZXkgcmVzb3VyY2VzLCBpbmRpdmlkdWFscyBhbmQgc2FsZXMgcHJvY2Vzc2VzLiIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQzRVbEVRVlI0bk8yYlBZalVRQlRIZjNwNEJ6WUtXdmlGbmFDdG5ZY1dGdUlIcUpWWTJXZ2hhT21wclloNGE2VTJkb0lJTnVJWG9xVmY1MjZyblowV2NpdnFpWUtINGhlT0JQNEw2N0xKSkp2SlpITEpIeDVMM3J5WE4vUFB5N3laSkF2bG9RTThwOFl3a3RyQ05BUVFaZ2FNQXhlQWQzMVhxYXJTQlZvYVUycTBBdWk0YTVuT1FrQlhUcE5VZnc3WTJwY0p3VTFPSnRRNHBzU09EVnNiNU5IRnhjbmNzU0l3TEk1clhaSStVOGVLUU8wSmFBTXpCZXZpaU01OFphcU1oZ0FDellDT3A5MWdzQVNZVU9PWVVEdm1LNDd4MUxHNFdiczJCUGhDUXdBZU1tQVBNQWZzZGxnRlptSzJ0bCtCZThER2tBaTRMNSs3RHVQOHNlenh2d0RySGNUSjdiQVUrQzZmZVdEQ01RR0RXQXM4VU50dEIzRnlPK3dmdURJN0hWV0JPQUlpck9ranZIUUNyc3IrbzM0djR3WkpCUFMzajVWSndHTGd2ZXdQNi9jTk5TSmdVcmF2UmNZSEhXOXlVQVhTM0FLZlVzUXBsSUNXYkMvcStKcU9weHpFaVNOZ0hmQlFiVGNkeE1ubDhFcTIyM1Y4UU1kUFBKVEJTSTQ1aURPeXd3YlpmUWFXU0xjTStDVlo3cWdLMk9Sc1dRU2NrTjJOQWYxajZRK1NEMGx6d0dyZ0pQQkROdEZLMURzQnoySUdPaVg5ZFlxdEFvaUV5T2FSYndKV0FMOHRxVGxuS1ZGNXFrQVBxL3FXeFhuR2s5bmhrR1h3UFhLMkZGQUY0dXpHZkJKd1N6YkhZOW92cWYzY1FpUmdRbHZTdndtN3NSMDZ4OHVDOWdLRHQ4QzNCQnZuQk94Uys0dVVKRVVMbDFHUWhvQlRzbm5xazRBcmFqOWpPYzhkMlIxbE5OaVd3cWVCbjdMWjU1T0F0MnJmYkRuUEVjdERrclJWd0NibmM0NG5zME5iZFhjUnlWZ0p6R3BDSENWT2I1MHhUT2ExNE5wcjZVT2FPUGtkUmtTd2NZeW5qalh2QlR3aDJBeWc3Z1IwbXJmRDFIc1NOS0hHTVUwVm9Ka0VEUXNIem02Qmp1T3ZPQ3RYQmN3UXZXdGRFV2dJd0ZFR3RCMS94Vm01REhDTllPTjA1UkQ5MmFEcUJHeFRqT2k1UkdwTXAzd1NVeVd4UFRYNkQrTWlvWmNKVlpaWkRUN1RuNlo4d2RjY0VDeE1Rd0Qxem9DMnAyK0ZHelFnSHY4QUV5UG4yWUU4N1ZNQUFBQUFTVVZPUks1Q1lJST0iPicsDQoJCQkJCX0sDQoJCQkJXSwNCgkJCX0sDQoJCQknU3RyYXRlZ3kgYW5kIE0mQSc6IHsNCgkJCQlpY29uX2ltZ19odG1sOiAnJywNCgkJCQlpbmZvcm1hdGlvbjogJycsDQoJCQkJc3ViX3NlcnZpY2VzX2FycmF5OiBbDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAnRHVlIERpbGlnZW5jZSBTdXBwb3J0JywNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSdXZSBoZWxwIGF0IGFueSBzdGFnZSBvZiBNJkEgYWN0aXZpdHkuIERvIHlvdSBrbm93IHdoYXQgQ2FwRXggaXMgcmVhbGx5IG5lZWRlZCwgb3IgaWYgeW91ciBwb3RlbnRpYWwgYnV5ZXIvdGFyZ2V0IGlzIHRhbGtpbmcgdG8gc29tZW9uZSBlbHNlIGFuZCBhdCB3aGF0IHN0YWdlPyBUaGVzZSBhcmUganVzdCBleGFtcGxlcyBvZiBob3cgd2UgaW1wcm92ZSBjYWxjdWxhdGlvbnMgb3IgbmVnb3RpYXRpb25zLicsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBRTNFbEVRVlI0bk8yYjIyOFZWUlRHZjRmRVdtcUpndllZcjlYRVNNRlhUUXg0d1Q3WkJ4TWZqRHdLOWZZZktJUkEraUN4YjE1SjFEOUJwUEJvZ2p4QVV4VlFtaWdKRjAyUm15UytnQlJvcmFaamR2Sk5zdHlaMHpNeloyYk83dkY4eVU3UFdUTjc3YjIrMlh0ZDlweENGMTEwMFVXeDZBTjJBcWVCQlNCcVE3c01qQU05Vkl3NmNLSk5SaWUxOGFxTlA2bUJ6NWhKdEFQUG1KVlFtZkUvYTlCVHdIMXRKb0FxeDY4bkdGL3BCQnFna3ZIckRZeXZiQUpMb1BUeDYwc1lYOGtFbXFEVThldE5qQzk5QWlsUTJ2ajFGTWFYT29HVUtHWDhla3JqUzV0QUJoUStmcDlKY2s2S2pFb25rQkdGajcvVEpEbk5qSCsyNmtTa0NnSk81MGhGMzZlRENGaFlEc1ZJbVFSRWJkN1RXZEVsZ080S29Mc0ZhTU9lbW1yZ0dDZjVuMnlCeVFZRUhLRmFMRHNmMEFkc0J2WUFSNEhmZ1RuZ2xzS3FrMzBDdktwN080YUFRZUJ6WURaRG5uRmRmUjVlVGo0Zzh2eUJTNUxlQS80eThoK0JYY0FtWUFpNFEyMUlzbDI2Sjc1L0h0amRJT0VLemdkRXB2MEdUT3Z6SXJBWFdKdGhMdTdlcjlRM1VwRTJtSE8rcVZHVXdpZUFTOUkxQXp6ZGdxNE53RG5wdWlUZFJjKzNVSVVQR2VNUEEvZDQxOWNBbzhBQkZWODMxTnpuL2NCV1lMWFhaMEM2NGhya3dRTG4reCswcXZBMmM1NXcyTnUzSzRFZHdKOHB0czgxWUx2NnhPZ3hKSnpROStBSUdEUEwzajc1QjRBZmpQNURXZ1dQSzl6RlR2Qk40S0M1NzdqNjJwVXdvMnRqb1VhQlJXL1BPd011NnRvdk9raHBodWVCcytwejBTTmhnOGF3a1NXb0tMRFgzTGZTZS9MTm1qTjJ4UGlLSTVJZkEzcU4zbjFldjhvSjhOR3J4R1hSQzNVN01oZ2Z0d3VtL3hxdEdpZC8xOGpYaFViQVN5YkpzWk8vMWlJQkRpOUlmdFdMRHRNaCtZQ2IrdXV5dUJpak9ZMS9NV0c4YjNSOWk1R05oZWdETnBsN0RrajJSZ0h6ZWt1NkpveHNPS1F0Y0ZuOVhGaUxjU1pCbGhkRDB1V1NwUmhyUXlKZ1R2MzZqU3l1L0Z5TWJ4WDkwaldiSUF1Q2dIbjFXMlZrMTNQNGdLUndpUFJHMHVuTGdpRGdqeVcyUU41MklTSHNCYnNGdmxjL0Y3Smk3QytRZ0xjbGN3bFFrRTd3aTRRd3VMVkY0MjA0UENUNWE2R0VRUitiRXhLaDFVcUVYSGI0SFBreGJCS2h1MEpKaEh5c2tvZjJVK0h0MG5mV20zeGEzQTM4S2gzdmhKd0tvd1BNU01kWXRrWTRMcmxMbnU0a20vRnh3blhVSzRZbVFpVGdVYjFkWGxUSjJrbzVQR3lldlBNSDk1dHJHeE44Um1HSVdsUzRXLzNQNmZEQ2tuRE02RCtvdlA0eGxjd3VxVmt2Yng4N3ZQakpXK01IZE5qcUUxQWpFQUo2elpHMmZ5VG1ybTJUTTJzV0JhNXF6OTl1K3ZlWTh3RlhqTDFzTXRDUGlpSWg4Z2lZU25qZjEwejJpTjc0eENUWWxSQkhoeTNheDZma1BHZjFlVUtoem5lWUE4YjQ4OEM5a284VVRVTGtFWkMwSXRMSTFodlpqT2NUc21LaldmYm52V1B4d2ttSUNpTEF5aUk1eG4wS1gybXh6dlAyVStiSlV4WUprV2ZJWk1JYjN5eXlyNVd4M1RLNnB5VWJWcG5icnpZazJaaVg1TVRON2ZtbFlFbjRvQ2dDaW9KN3BmVnB4aU15Vi9sOURIeW03M05laFppRUVWT1p1aE9wekNpTGdCanVIY0Fyd0lmQXQ0cnhOMlhjRlMzelBYcmE4ZXZ4bXBaMVdoSmUxNzB1OTFnUkdnRjVrWVdFbXNpTXRLMXlIVzI1ZjBkWnppVDhwUHVleWpySWVJWTkydTdXaUlSQnBlUi81eW5BZWtSQ3ZCSkNiL1BhOHpWai9IZTY5aVVkakpwQ1hVekVGZjNFZjhFNHdLVis1dDh4R0RXVnBtdi82TW5iQXFyanNVTGUvc21jaHk1MFBQNEZsdkdTd25LdFV0TUFBQUFBU1VWT1JLNUNZSUk9Ij4nLA0KCQkJCQl9LA0KCQkJCQl7DQoJCQkJCQl0aXRsZTogJ01hcmtldCBNb25pdG9yaW5nJywNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSdHbG9iYWwgbW9uaXRvcmluZyBvZiBzZWNvbmRhcnkgc291cmNlcyBpbiAzNyBsYW5ndWFnZXMsIHV0aWxpemluZyBhbiBBSS1lbmhhbmNlZCBwbGF0Zm9ybSBkZWxpdmVyaW5nIHJlYWwtdGltZSBjYXRlZ29yeSwgbWFya2V0IGFuZCBjb21wZXRpdG9yIGluc2lnaHRzLiBVbmxpa2Ugb3RoZXIgcGxhdGZvcm1zLCB0aGUgaW5kdXN0cnkgaXMgbW9uaXRvcmVkLCBub3QganVzdCB0aGUgc3VtIG9mIHNwZWNpZmljIGNvbXBldGl0b3JzLicsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQmxVbEVRVlI0bk8yYVVVN0NRQkNHdndmc0VYZ1ZyMkgwZW9MZ3FjUSt5WnRYb0Q3Z0NmUmxUWk5KYkZEYXhlNldkdmYva2tuSThrTjMvc3hNTjFBUVFnZ2hoUGloQUI2QmQ4QWxFaFd3c3R3NldZMWd3N0ZpNldOQVplSmIwdUd1VVFtZE9JdlU4TTdMeVFCVUFZNzBVQXVRNEF4NEFYYkFQRmNEZHJiWE53OFRnaGxRTkU2S0g4QUdtTFhvcjRBbjA0Yld6eTE1SHhPQ0diQ3k5ejh0NnRmckZ2MG1zdDdYaEdBR1ZMYXhhMkRSMkdSYnhOWTM0M1VvQXhiQXpSa0p4ZFFQYXNEUzN2K3ljRFlUVHJHT3JCKzhCUW96b2E2RWcyMjRiYWpOcks4UEVmUVhHWUxrZmhzY0UxdnIrV3dQUXVjZ0ExQUZvQllnUUsrVUxZZVFiUUI5cU91ZW01ZTNzT3NrMWxjZjZycW5QdDliNkFJbGVtcTlEUFE5a3pYQVRkMkFTeG5XaFF4Z3BCVndUSFlWY0l3TVFCV0FXb0RmYUFhZ0lZanVBdmkzeG45MXVNUkRCblRoZkoyYUdNRk9nbGthVVA3eHE4dlUxbm9aNEJKWWt3SDBxSUF0OER6eE5RMUJQQ3VnTW1IOWVHa3EzRnRPZXgveGNnU250Vmp4NEdOQTBmai8zeVVTZTB2ZTYzRjVJWVFRUXBBRjMrY2pySXZlVUhxbUFBQUFBRWxGVGtTdVFtQ0MiPicsDQoJCQkJCX0sDQoJCQkJXSwNCgkJCX0sDQoJCQknU2FsZXMgJiBNYXJnaW4gSW5zaWdodHMnOiB7DQoJCQkJaWNvbl9pbWdfaHRtbDogJycsDQoJCQkJaW5mb3JtYXRpb246ICcnLA0KCQkJCXN1Yl9zZXJ2aWNlc19hcnJheTogWw0KCQkJCQl7DQoJCQkJCQl0aXRsZTogJ0NvbXBldGl0b3IgQmF0dGxlIENhcmRzICYgU1dPVCcsDQoJCQkJCQlpbmZvcm1hdGlvbjoNCgkJCQkJCQkiTGV2ZXJhZ2UgcHJpbWFyeSBpbnRlcnZpZXdzIHdpdGggY29tcGV0aXRpdmUgc2FsZXMsIG1hcmtldGluZywgYW5kIGV4ZWN1dGl2ZXMgdG8gcHJvdmlkZSBpbnNpZ2h0cyByZWdhcmRpbmcgY29tcGV0aXRvcnMnIHN0cmVuZ3Rocywgd2Vha25lc3NlcywgYW5kIG9wcG9ydHVuaXRpZXMgZm9yIHlvdXIgc2FsZXMsIHByb2R1Y3QgbWFya2V0aW5nIGFuZCBkZWNpc2lvbi1tYWtlcnMgYWJvdXQgY3VycmVudCBjb21wZXRpdG9yIHRhY3RpY3MuIiwNCgkJCQkJCWljb25faW1nX2h0bWw6DQoJCQkJCQkJJzxpbWcgZGVjb2Rpbmc9ImFzeW5jIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFJNzBsRVFWUjRuTzFiQzVDT1ZSaCsvbDI3U0s3WkpMa2IxYUNscGtLSmNpa2pNN3FRTXBGTG84YWxSbFF5S1NTTmFwcFNKaW1oUXBPU1M0MlVDa090UkxtRWtLTGNiNjA3N2Y3Tk8vT2NtWGRPNTN6LzkvMy92OHZFTS9QTjdKNzNYTi96bnZkMnpnK2NSeVJVQWpBRXdHTUF5dUljeEdJQWNYNnJBZVRnSEVNQkYvL3p1Y3FFT0wvS0VabVFBYUF4Z0Y0QXhsR1MxZ1BZQ2VBNGdKTUFEZ0RZRE9BYkFHOENHQURnS2dBeG5JVU1RQWdtWkFKb0RXQThnQjJxYmRSdkQ0QjNBTngwcHBpeEdFQWVGNndaNEdOQ1NRQjl1WnQ2SVg4Q21BYmdjUUJ0QVZ3T29BcUFVZ0N5QUZRRVVJKzBmZ0FtQS9qRDZtTVRnQWNCWkJjbkEvS3NjNjhaWUROaG83WGJzbnN2QVdpV3d1NWRBV0FrZ0sycTMrMEF1cUdZVU5sYWZEeEVIZG01Z1FBdVNPTThSSTkwQWJCS2pmTTFnTHBwSEFQbEFYd0o0SjhFNTdLV2h3bHJTSDhlUlFlUnBCNEFkbk9zdndGMFRsZm5UNFJVVEZzOVRHaEN1cHgvR3lXb3lKNEc4QkdBZFZ6RUNRQ25hQVUyQUpnTllCU0FOZ0JLQjh4VmRNYUhhazVqMHFFa24xUUs3V0lIUFljMEh4TmlwSW0vWUhBZGdFbGNvTTNJMHl3L3dMOXRlajZWWWZPQU9UOU1NeHJuT01Mb2xJN0FhbmEybGxvNktoUE01SVVaMzZyL1phZm5VemUwQUZEQjBmY2xBRzRHTUl6K2dIRzg1RnNVd0loYkFSeFdURWhKRW5MVUFuOEJVRFVpRTh5RU04aEVzUXlQa0xsUmNSbUE0UUQyc2M5Q0FPOENLT2VvMjFReFFZNURTc2hSQzVRRlZJdkFCSitsU0FVWEFoaXRSSDBMZ0tzOWttRHEzSjNxb0RscWdlS0FWQS9KaEtKZ2dFRURTbFdjdTMyYlJ5Y0kvUkNBT3FrT21LTVdLRnl2bWFDT2RsYUtDdUpiek9JWVlqM2FPK29ZNi9CVk9nYk00VEV3QzJ6QjgrMWpRaEFEcE4wdEFGNm1Vak5tOEFpREkzRnNucVU1RFlMRUdWTTV6bEVBMXpwTXBQRVQ3a1dLS0pWa01HTUhSM2Z4S09rNkJUU0J4eDN0UlFIZkVUQXZNWGZ6MU1iSW9qVWVJRzFicXJGRFgrVWJSSW5zZnFKM2FIYnNDTXRYQUJqRVVGZmJiUEU3YmdUd0lvRGZWRDlMQU5Ud3pLMjhDcnJldDJneDVaNzNTWGJ4bVdxQXNNRkhMYVVMeEcrL2lPVnlkRnBHR0xjM2dML1lqNGp6RFo2NlRaVy9JTWRMb3d2TGYwM1dOMml0Z2hzSldUVWtRdnZDMDdGbXdrcm1FcE9CMlB2UGxDUGxZOElFMXBISTFkWTV2NU1tR3hBWmI3RHhDS3U4R2pWd2ZnQm5OUk5XT000b0lrakRlQ1VKTGt0VWpReUtNNGJRZUk3bEU2TU9uS0hPZXhQSDdrdjU2NDUyV1R6anpTd20vT0J4ZjhNeXdVaUNKR2hjbUVqNkRLdjhTcGJ2aW5vTUdyT2hpSkFyYU5yTkRJNk5hNVRiS3FhcWtXSkNudVVTejZRWk8wS2xPZG9UZjREdGRyS2ZUZzU2YzlLT09WTDIyMGhyR0dIOTZNVkdzb2dvRUM2L29xSzducFlrZksrWXNNNWhQY1RENitycCt5SFdXZWNaZHp2cEhTemFGSlpMcWkwMHhyR1JYSUpvbEVnUXB4dkl6dmRYV1NITmhHVlVjTm4wODhzd1YvQ3hraDRYRTBvb3k1RHJvSnVGanJYS0I3QmNkRWxvTFBJb0ZVbFlIT1NrbzBJellhbm5kbW1Ra2dUWGNUQUs4UmtIclI5cG9pODAyckY4WVpUSnJtZWorbGE1RWJOa0ZacG13aEpLZ0kxUFNCY05icU5Ed0dMYXFPQk5vNTZLWjBKakp4dlp1M0NTT1VNN0hraUVtWXdwc2kwbUxIWklVMHZsVGJxeXhIR216MncwSkUzY2F3MlQwdDhiWmNMSDJVaGlBUTA1bi9zOWJaWXJaU2JLVHVNb3k0MEMxRXlRNkU2akxNdkZ6MEFFV2czU1JBRnJsRlRPVkdRR1pGdmx4d0lZWU80UTVQdk9vcGxzalJiNVdqeHFjbUVTZHBHbGxibXpVZHRETXd5UU5ZWEdMall5dnJ6QkhucUJVV0VDRTlIMmlkQkt4UkkycXF1YkpodTV5dWx4SFFFNTFxR3hnWTNzck1wS2xydHloVUVZelhaaTZoTGhVOWFWOUhnVUpYaTdjcjFkU2xDa0xiSVpiR3VWejJDNVpHK2pvSW82Qm1McWZCaWl4TitWbWg4YmtQZ2NUTm8wUjY0d3ppeDFaRWVvdjJjUVNWMEhRYTZzSHJVaXdhNVVvbkdhdWxhMEFHWDR0OWw1cVhPUEp5WXdadmo2QVBOcE0zZ2d5MTlEQlBSbUkwbER1M3g5eWR2RDQ1S09VTkdaZUdHd21HQWt3ZlhsZXhZdjZCNGd5bG5xOGtYaUdKZUhLTzU5YU9TcVhJQkdCb09MQXVidGJlak04QnpQNDRrcWRISldraG1IK2Zjb2o5aURqcGU1THIvUFFlK29namM3NmpOU0kxbW8wSWlwS0VxY0Q0MHhMQi91YWRmVDRVS25nZ3plSnhvWDJ1V0V6Zlo0anczVVJrYk9DbzN6YU9PYU5JWDdQSzZzQzJLS2hnYnNzQThaeXY4L1NGdnZDcndLNmFWVzkxaWZWNUVFV3JIeFZnZlhKNUVtQTRUQkhOWi9Lc0w0NG9QTVpidWpBV210K1o2c1Q2WTZObUg4ai84Z3B2TDluUjFwcUh4eVhjUXNURzd4dU9OQnczS0gyd3dxUW5NbnVEdGc4VjNWVFZCVkQ4MFZVNFJHRCtXVnhUem1aVzJDMXlBOUEzU0dVWmdhT28wKzEzTXRCenBwQnozSkRyMTU5eU1GWkt2TWFnL0hJSE5VUUNNVGR5SG1TWi81R0dEZUZjZ1I5S0dTdWllYzVkaWMzdXI0cHZ5bzZrNGxpbloydDZKNkdqTTFpUWNLZVk3QUtSRXFzVTJjdTF6ZVFkOUxldER0VWlRWVJTTVhqM0RvZ3kya3owdnlMVUJZMUZFN0wyTmU2c2s5Q1AzemRBOThpQjNMRmJTTnFpcmkyOHdibTNTanE1ckRLcjRvZ1NmL2Q4QmpNbE5DSjlyYlV3d3c0SWpqUCtBRUNuaGo0OXFocUdpa0pGQys5enorUjN2T3JaQ2VZWkhnQlpXMDlPMXlONVZQa0pqZ0xlYnRvM2hpV1Z6RWJCVkE3UWk0N202dUxFZFkzeVFweUNMZVZreHdTWUx4M1VjcU0yV1NHRk5vc3Rvd2gxZWJ4eXVYOGZ4Z2FuWDlxdXdBQXl5ZmJtbXZGaitoT040VVo2Z0hDaWM5T3NHZ0hOLzNMZ3J4QUZOL3B4bS85L0U4aXRKbi9wU0tYS01tYTVOR0pvOURvYklPaVM1QXkxT3NoMUVTRnZDU1pCbHZtaWZUVmU2WVlOSEcxQmx0WDhnQXJkZ1diN3VzSnVPN24wL2lpbklpTWVZRmRpdjNXdjQvWTZqR2hXdnhYY05KK1R6RFpKQkJ5ZmpSR3V0UXdBdVNJa2VNWW16aTlDRXFnREhKaVZHOG9rNFdEYWpWOVc4SDluS3NwZngvd1puNk1VVi85V0xiT0IzbGVHK250WCtjeVpVcFZGcnRlT1ZXaVg1Nk52K3VUNnN5a0hWTkprZGJnK0hxVHJFMngzYmxMb3NjZFZWdXp4VnRsYVRJVGxVNklwbnZCQ1BDN3A2STArUUpqL0pYS01XR2hSeDRlb2k2NVdqM2h6Snp1NUZpckI5REY3QnNJK3NNWlI0aHpPOFRwN01Qc1NiRmh1VzhoVTMybHRpZ1FwcjYyTVFZcEZqOWdDeWNQY2hLczlVNWovTTREL3ovOFMraGtuNVN0NmhkQmdBQUFBQkpSVTVFcmtKZ2dnPT0iPicsDQoJCQkJCX0sDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAnRGVhbCBXaW4vTG9zcycsDQoJCQkJCQlpbmZvcm1hdGlvbjoNCgkJCQkJCQkiT25lLW9uLW9uZSBpbnRlcnZpZXdzIHRvIHVuY292ZXIgdGhlIG91dGNvbWVzIG9mIGNsb3NlZCBvcHBvcnR1bml0aWVzIGFuZCB0cmVuZHMgdGhhdCBkcml2ZSB3aW5zIGFuZCBsb3NzZXMuIFVuY292ZXJpbmcgdGhlIOKAmFdoeScgdG8gaW1wcm92ZSBzYWxlcyBlbmdhZ2VtZW50cyBhbmQgY29tcGV0aXRvciBpbnNpZ2h0cyB0byBpbmNyZWFzZSB5b3VyIHJldmVudWUgYW5kIGNsb3NlIHJhdGVzLiIsDQoJCQkJCQlpY29uX2ltZ19odG1sOg0KCQkJCQkJCSc8aW1nIGRlY29kaW5nPSJhc3luYyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBRU0wbEVRVlI0bk8xYVcwZ1VZUlQrMWkwTHNudEcyWVdpQy9Xc1JJU1IySVhLcUNpcWw2U3R0K2loaTBKRTJRVXJqWHJRb3Q2S3dvSUtIOEplS2d1cDlDR2xDTHNaVkNhNVFZUmlrVkdSYnZ6d0xSeTIzWjJSK1dmbUYrYURnZVg4NXovbk80ZXpNK2Y4TTBDQUFBRUNEQXpyQWJ3QzBBY2dadGpWUjI2S295dklOVFR3WklsWTRFWUNxdW5nTklBUXpFTUdnRFBrV09XR2c4czBIb0c1aUpDajRxb2RwM3dxNmNlQ1E1UEYrZ0hLRkZmdDJPTlRBaDRKRG8wVzYyY3BVMXkxWXpPTjE4SmMxSkxqSmlkR3NnRWNCdEFNb0FkQUYzOWZwM0ZWaHFZaVhpRTN5TG1MTVR3QlVBWmdncFdCdGR5VXJpUS93Rnk4dCtEZXhSaVRvZ2pBWHlyZUJiQVJ3R1JtYlNtQU9xNzk0aVBITklUSkxVYXVoZVN1S25vbGdIdGNVekd1VHR3OERrQTNGY3JUT09ta3pqUU5oTE5abXZJdTdnVFR5ZTFUaW5YVnV4d1hsVEJXTGg3aHdoMkxKdWNCOVpab0NMNVZsS1lPRk5KV2ZScWRFS3RiNlIyU0MwOHBYR2JoNUR6MWRtc01YbGNDOXRIV09RdTk1ZFJybHNKdkZJNjAyTHlEZWpVT2lEYlR4a3ZOQ2JoR1c5c3M5RVpUcjBjS2YxQTR3bUx6Zk9xOWMwQlUvZWRiQUV6VW5JQjIycHByb1pkRnZlOVMrSUxDZkl2TjZqLzBsYnF6bkhQV2xvQTV0UFBGeHFDMm1MclBwYkJTTkJCV3FLSHVUcGlUZ0YyMGM4V0c3azNxbnBEQ0hBQzlvbzlPbDhVdDFGTlBCRk1TMEdDakJRNkplVWI5NVNjbEtoUUxRdlZwL2c2akFQeGtRL0dmRVI4U2tNTkRrTjRVTi9FUVk2a1gvcmFtTWxZc25nanFhZ053Rk1CQ2RscUpkOXhTQXhLd256YXVDbG1ZbkJYM3Q4SlBUN3JnNDFEdDR6RUFINVAwMGFyRlBNaHVNY2JlTzhQSEJJUUZ6M0p5cTBzeXo3UXpwdkVETVo0Qm9BREFoWVFzSmw0cGh3c1BFckFoRGE4MmNpL1FOYnRNWmZsVWMreU16dzR0RHM0SW5TUkErWHpHL2Qza1ZFV09pcXZyR0E2Z2d3VFcrSkNBZGR6YlFTNitZRHRKdkFZdzFNTUVLRjl2YkxhK3JpSXNldnE5SGlhZ2xQdFVFb2JBWjZ3QTBNL2Vlc1lBenUxaUZnZWNxVENUdnZvNTJSbUJTd3lnd2NZZDkxYWFCRHkwMkpzaHVyNkxNQWhqQUVSSnJNUkZQeVgwRWFWUG8xREVzdndOSU04RiszbTAzVTlmUnFKYW5CZW9tVUVYc3RqWXVQYmVUeGVHaWViRXptaHRGL0VSdk5YUFo3NWR6T1pkV3Rjek9pSkcySGtZSklob0lxMDdtWjZpeG1IWnV2VjM4Z3haWW9xc011aUc2aWx5eGFOTERTOTJzWXA3L3ZCZ1kxQ2pWSXlzNnZXVkZhYUlrMmMzbXlyUG9PYjIyNkxWbFVkcnlWcmQrelpmMHcwcVpBUDR6TURVZS9wVUtCUG4rMDRQWEQxRkpyL0xpUWZwNWhYbGV3emwweGhVZWhCNDRsVUJneEFscVVVZStNb1hsV0FNWWc1UGQwMzNOMkJDVFVtKy9OQXBNejRCc1NRRWRjcUNCTUR3Q21oTWNzQ3BVMlo4QXR4R2tBRDRYQUdaSG5aK1JuYUdsUVlFN210bkdQV3c4ek95TTR6YS9Lck1DOFMvK2xLZjhYcUdDZ05LUHZFNjZXVUNNcG1FZUNYNGVYVXllS1BHNHdBQkFzQjQvQU1Hc3ZjcVFiY3FUd0FBQUFCSlJVNUVya0pnZ2c9PSI+JywNCgkJCQkJfSwNCgkJCQkJew0KCQkJCQkJdGl0bGU6ICdDb21wZXRpdG9yIFByaWNpbmcgJiBNZXJjaGFuZGlzaW5nJywNCgkJCQkJCWluZm9ybWF0aW9uOg0KCQkJCQkJCSJFbmdhZ2Ugd2l0aCBzYWxlcyB0ZWFtcyB0byBzdWJzZXF1ZW50bHkgY29uZHVjdCBwcmltYXJ5IGludGVydmlld3MgaW4gdGhlIG1hcmtldCB0aGF0IGlkZW50aWZ5IGNvbXBldGl0b3JzJyBwcmljZSBkeW5hbWljcyBiZXlvbmQgdGhlIGxpc3QgcHJpY2UsIHN1Y2ggYXMgZGlzY291bnQgYW5kIHRyYWRlIHN1cHBvcnQgbWV0aG9kb2xvZ2llcyBhbmQgcHJpb3JpdGllcy4iLA0KCQkJCQkJaWNvbl9pbWdfaHRtbDoNCgkJCQkJCQknPGltZyBkZWNvZGluZz0iYXN5bmMiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUZ0MGxFUVZSNG5PMmJlNHhkVXhUR2YycmFJbHBWR2FPMDJwcHA0eEhDZUJYOWgzaVVObFd2Q2xMdjZaQjZsSHBMUEJvaEpkbzBUQ05JTkVLRkdzUWpSVEZCdlpMUkVxWGlrUm1LeGhSVldnelRHVm5KZDVMVm5YUHZQZmZPM0h0blR1ZExUbkx2MnZ1c2M3NjE5MTVyN2IzdWhYNzBveDlseGlDMlFld0tQQUw4QVhRQnZ3R2ZBYThBRHdPM0FSY0NKd0Q3QXp1VElsUUJxMFhjcnIvYzUyelg3N3B2R2ZBb2NEdHdNWEFTY0FBd2xENUMvbk1Sc2hIZlYvTGRnSU9BS1VBOU1CZFlETHdCckFFMkp6VFNSaG5vUlBvQStjbzg3eDhPSEFoTURveTBIUGdpTUZJbmNBa3BJcDhVcHZkR1BXZHpiMWtXVlNVaTcvR21ubmNxS1NWL0NIQTFjQU13TWFaOXZwNTVIU2tqdngzd1FJenplejdJSjY2UmZDRXBHL21aMHZrUDBBRGNwL0Jvc3J0ZHY3TWtheVJsYTc1SmVtYzQyVVRKV3Azc0tNaytJbVVPNzN2cEhoVXNpM1pnQ3pCUXNwSHE5eU1wOC9hdlMvK1ZUalpac3ErZGJIdmdQNkRER1NVVm9XNjZubUdqL1J6d2hFYS9TeEhCWTYza3R3RFRnTU9BaWpURStWdUJmNE9zYnhFd0lPajNRVXkwMk5EVEdXSlZHWkljNUFQT0JzNEh4bWZvODR6ZXl4em5DOEFuem1DMmdlbzJTa1YrWklIck9FcUc1ampaVFpLWlFicUZuaUEvR0ppdFVOVW1mZmRMdDQvN1d4VHo4OFcxZXI4RlRqWk9zaGJLVEg0NDhINkdMZTA2T2F3NlRWZTdMdXFHdzF6cVpEdElYM3VNenlncCtaWFNZWjc2SEtBYU9BNTRWL0kvSFhuTCtRdkIwZEpsenRDalRmSTl5a0hlNHZNNzB2RWxzR2ZRWHVHY1Y1ZldjWGNjcGVuNElaQkh4cmRaVm5LSGQ2NTAvQXpzRmROdWEzUVhaNFFOT2hNc0JCVktoRHFDK1AraWRKOVdEbS8vdFBURVRlczZPYndsZXVGbjFYZFZvZXRWb3grbXpvdGlzc21TaGJxM3BldjRRTzRkM3FXU0RYRUU0dmI4U2ZDaDdyZk5VWVNiSlp0WGpqaS9KT2FnWW1ZV2gvZVkrczhxOEhsTGRiOXRqeVBNa096SmNpUTVaN282d05pQXZPVUVtWmFNelpCQ3NFRDNlOTNIU21henNXamtyWkJ4ZUl6Y3RxNnZTWGRiRHZKakZRNnQ3MzRVaG9hWUdWY2oyYmZGSW05cDY0b3NhM2Rva0FUZGxVSFBZclhicnE4UTdPTk9pL3g3N0NpajI2bVNEVWlQVC9zNjZmaEpKYkFRSTRCaHpnZ3Rrb1U0UlVhd3hDbGYyT3o1VHZwZmltbGZyN2JkczVHUGk5TkpFRTF4SzF1RnFGZW9tNitaRUcxWnJTYllVL0RrVnlpYWhGaWw5dG9vUDE3cHlKc3hIdEozeTZmelJWVDNzNk5yRCsvd3JQQ0pqTHhSL1MwSjZnbnlyVG5JbzFsaGZhYWlrYkl2MzJqa0Y3ckt5cUhkS0VxYzUyVFp2SDMwTXJhL0x3VjVud3pOUW1YcUxyMms0U3VSdDgxSkliaktlZGxoUVpJVGx3RXVpNG5WeFNTUGpzbXM3ejMyNVVGOXNmMHpXZ0o3QnplWXBTNUwrREsycEQ1MVJzaEd2a2JHN294NVpySElHNjVRL3dhZm5LeDM1V3FQZVM1NXllY1VaNTBMZFpaK2hxaVV6N0gycHlnZCtaMkFqLzBTR0FDODdFS1hOOEpVeWR2ekxEVFdhMVFqQXpRRFkxejdlRWQrZFlad1dTenlUYzduRGZISndmSVlJMVFyckUySlVaUUozdUhkcWZONjA3c0plRlhQK2R1UnJ5b0QrYlhpdGhVeUdTSEU5WXJsRjJSSWdUdUNOVitwYk00ZmUzVnFZMlJPc2xlUVQycUUyV296QTV4TVBPYm80Q1BFYU9CMEZTbk1SOURieUNjeFFuT1cwUzgyU2tJK2x4RkdSZW1qdzdRQ1QyMTdMZmw4ZkVMazhEcDB6bDhNakNrSCtTUkdPTko1ZTh2K1VrYytseEZHNjh6dGNsSk1QdDhRT1YzeFB0cFhwSUo4VWlPY29SOGxkTG1UM2RTUVQyS0V0eVMvZzVTU3oyVUVPNE9ieE5hWW9OcGZVdkl0dloxOFBqNWhrc3Y1cTlKRVBva1JxaDM1aFhtUWY2K3ZrTTlsaEJINm1mdTk0ZEZ6bXNqbkd5S1BFVms3alVrTithUkdtT0QrSGpNM2JlU1RHS0ZSOHNmMTRxMXBJNS9MQ09OVUM2aHg1S095MThDMGtNOWtoQ01rUDloVmJPeVhZYi9xYzJNV0kvUTU4bkZHc09zWDl6bUs4N1U1ak5CbnlVY1lyQnJnSnZmM3VJYmdRRFdURWZvOGVZOUJLbnBrT2pEeFJtalNZV3B6V3NnblJhMzdMMEIwcmRsV3lDTll1ZHlTSlB0WmkyMm5yY1JXZFB3UHQ5Sy91OG1yZWo4QUFBQUFTVVZPUks1Q1lJST0iPicsDQoJCQkJCX0sDQoJCQkJCXsNCgkJCQkJCXRpdGxlOiAnVm9pY2Ugb2YgQ3VzdG9tZXInLA0KCQkJCQkJaW5mb3JtYXRpb246DQoJCQkJCQkJJ09uZS1vbi1vbmUgaW50ZXJ2aWV3cywgcGFpcmVkIHdpdGggc3VydmV5cywgdG8gcHJvdmlkZSBjbGllbnRzIHdpdGggaW5zaWdodHMgb24gY3VzdG9tZXJzIHB1cmNoYXNpbmcgZGVjaXNpb24gZmFjdG9ycyBhbmQgYXNzZXNzbWVudCBvZiB0aGUgcGVyY2VwdGlvbiBvZiBjb21wZXRpdG9yIHN1cHBsaWVycyBpbiB0aGUgbWFya2V0cGxhY2UuJywNCgkJCQkJCWljb25faW1nX2h0bWw6DQoJCQkJCQkJJzxpbWcgZGVjb2Rpbmc9ImFzeW5jIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFFcTBsRVFWUjRuTzJiVzhnVlZSVEhmd2ROamJKUHd5Z3JNakNpVXJHa2x3Z2owVWp0SXZWUWxtbmExMFBhZzlJVjFJUjZLTG9ZVnFnUmhWMlVpQ2pFZktrczgxSjQ3WUpHYUVWU0p2UjFNeFUxUHorTkJmK1J6VFJuenB4elpzOXM5ZnhnSHM3c05YdXR2ZmFldGZkZXN3KzB5SldlUUY5ZEZVNXdCZ0QzQTR1QnJjQmU0S2h6ZFFJN2dWWEFQT0Eyb0kwVG9JY25BdXRpalkydWY0Ry9kQ1dWSHdLV0FUY2NieU9rQXR3SjdIQWE4eWV3QkpnQ1hBR2NIbnVtaDBiSkdHQTJzQVk0N0R6L0pYQWR4d0huQVNzY3d6ZkpHZGJBZXVrdlovem0xTGNJT0lOQXVWWTliWWIrQ3R5UjA5QzEwZks0WGhtcisxdGdJSUZ4TzNCUUJpNEYrbVY4N2xIZ2tZeXlRNEh2cFdNWGNER0JjS09pdUJuMmJKVmVyeWdHekkzZDc5Szc3dks4Wm9za3pnUytrSzZmZ2JNcG1jdUIvVExvaVJTNWJob2hYYkhwTFhxM0k5b2tjMURQSkdFeW0vWGNxaFE1Ny9RR3RzdVFWeE9DNGFqWXZXZzZIT25jNjlRVk1WSXlKdXN5U25WR1hBQjBTSFk2SmJGQUJud0Y5SXFWTFZXWlRXc1JUK3ZlQk9kZXU2NklpWkl4MllneHV2ZCtRdHl4KzN2cWlEbTVEdjNEV3F3TVNpaC9RTWF0ZE82ZEJ0d0VkRStwOXhUSm1HekVTdFZsZGNiNVJHVlBVVERMcE5nQ1ZoSTJWKytXekRsTjZEbFhkZXl1TXY5Zm8vSS90UElzaEVzVXFDejRuWlVpWjBOM1ZwTnJnWXJxR0owaXMxVk91SldDZUU0S0Z4SUdNNnNFWWk5VWdKK2s4Q3JDNEVyWjgyTVJ5Z1pKMmM2QWRtamR0VzQ0a3JESnlwMTJPZUJ0d21LTDdCcm1XOUY4S1pwQldId2t1NjR2YXZxN21iQllMTHRzSWVXVmpWSmtnU2NrWmhVMU0zMGpSVU1JaTBzVkJQZG9qK0tOcndOMUFFcWptVzMzK2xUeW1aU01JRHdteWJiMVBwVzhWVlN3YVlCVG5aU2NKVjY5TUVjS25pRk01dmtPaHFPZFRFeUlYQ2I3L3ZHMUt1eXJESTR0UGZzUUpxdDlCOE9QcFdBeVlYS1g3TnVRSXZNNXNMWlJCWk9kVkZnb0d5S1hYaG1DWVR3Wld4Yzl0UnVNNS94Q0RJYVd1OGpkQWNhREFRYkRiZ3JTUzV4VS9Zc05PcURtSzlMYkdXYVdseXNiUzZmLzRqU3NTenRFeXlrMjRvQk1JMlNPaEQ2bGZMYkpsbTM2b0dwZm1xbWpnZkVleitTQU51ZmIva1dVeXo3WjRhYlQwNGczc05idnFyd213WWNKMndHMWVyaGhCN1JMOEdYQ2RrQzlEYzdzZ0FrU2ZKMndITkJzajllS0VjZVlJY0VYQ01zQnpUWTQ4NGlZcTRLSE9Fa2Q4SzRLN0ZqYlNlbUE5WUY4SlNyTkFidFVjRDVoT1dDTnRzVjVOVGhlMzdGTjBSR2RFU2p0bUVxWjArQkFDZG5IMHJKemdaMWEvOXNCaXlTYUhSR0pqUEN3STdTUjlBYXdISGhKcDBKdTBZbVVhbWVIcDhrT1M5bG5KUmNIM0MwaHl4VG5SWnV6bFUyNk90U2JiK29jMFh2cWVTc2JYNGVlV3U5NEpnYzhKcUVueVJjN0FUWk8rNHVqaWpNL0tOWWtPYVZUQnk3cm9WWURNem5nRlFsTnhROFY1d0JtRDcwZUEzUWtkNG9hUFRYRDFyZVJCaVpHL1RnZnFwS3grS01qaDROV0RmZHdMYjVUSllQenNTbFZoK1g3ZzNQQVBsWGk4NThkYTZWamVNNzFaaHJpYWZTVFlYOVR6SUVNQzRwQk1VeUcyWGtCbnl5U25uc0lqSEV5N0lPQ3ppU1duWEw3SC9jVmxBcWI2V210a2R2M3R4VmFpL3ZBMXZYdlNJOTlpQW1LUHNEdktVdldQQzliR2w5SWdBelJrWmtEbmhwK1NIK2N1THJzaHJabzBhS0Y4UjgwOXhsYzQ2U2Q4d0FBQUFCSlJVNUVya0pnZ2c9PSI+JywNCgkJCQkJfSwNCgkJCQldLA0KCQkJfSwNCgkJfTsNCg0KCQl3aW5kb3cuZHluYW1pY19jYXNlX3N0dWRpZXNfaW1hZ2VfdXJsID0NCgkJCSdodHRwczovL2ZsZXRjaGVyY3NpLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMy8wMi9wZXhlbHMta2FtcHVzLXByb2R1Y3Rpb24tODQ3NjU5Ny1zY2FsZWQuanBnJzsNCg0KCQl3aW5kb3cuZHluYW1pY19jYXNlX3N0dWRpZXNfZGljdGlvbmFyeSA9IHsNCgkJCSdDb21wZXRpdG9yIFByb2ZpbGluZyAmIFN1cHBseSBDaGFpbiBNYXBwaW5nJzogew0KCQkJCWNvcHk6ICdBIG11bHRpbmF0aW9uYWwgPGI+PGk+aGVhbHRoICYgbnV0cml0aW9uIGNvbXBhbnk8L2k+PC9iPiB3YW50ZWQgdG8gPGI+dW5kZXJzdGFuZCB0aGUgZ2xvYmFsIG1hbnVmYWN0dXJpbmcgYW5kIGRpc3RyaWJ1dGlvbiBjYXBhYmlsaXRpZXMgb2YgdGhlaXIgY29tcGV0aXRvcnM8L2I+LiBXZSBmb2N1c2VkIG9uIHRoZSB0b3Agc2l4IGNhdGVnb3J5IGxlYWRlcnMgaW4gdGhlIFUuUy4gYW5kIEV1cm9wZSwgaW5jbHVkaW5nIHRoZSBsYXJnZXN0IFBMIHN1cHBsaWVycy4gVGhlIHByb2plY3QgaW5jbHVkZWQgaW50ZXJ2aWV3cyB3aXRoIGZvcm1lciBwbGFudCBtYW5hZ2VtZW50LCBpbmdyZWRpZW50IHN1cHBsaWVycywgY29udHJhY3RvcnMgYW5kIHB1cmNoYXNpbmcgbWFuYWdlcnMuIFRoZSBpbnRlbGxpZ2VuY2UgZ2F0aGVyZWQgYnkgcGxhbnQgYW5kIERDIGluY2x1ZGVkIHBsYW5uZWQgPGI+Q2FwRXggaW1wcm92ZW1lbnRzLCBjYXBhY2l0eSBsaW1pdGF0aW9ucywgc291cmNpbmcgaXNzdWVzIGxpa2Ugc2VhZm9vZCBpbmdyZWRpZW50cyBmcm9tIEFzaWEsIGxhYm9yIGlzc3VlcywgZnJlcXVlbnQgbWFpbnRlbmFuY2UtcmVsYXRlZCBwcm9kdWN0aW9uIGlzc3VlcywgYW5kIHBvdGVudGlhbCBkaXZlc3RpdHVyZTwvYj4uIFRoZSBpbmZvcm1hdGlvbiB3YXMga2V5IGluIGRlY2lzaW9uLW1ha2luZyBmb3IgbXVsdGlwbGUgc3ViamVjdHMgYW5kIGZ1bmN0aW9ucywgYW5kIGV2ZW4gdXNlZCB0byBjYWxjdWxhdGUgZXN0aW1hdGVkIHBlciB1bml0IGNvc3QgKGRpcylhZHZhbnRhZ2VzLicsDQoJCQl9LA0KCQkJJ0JyYW5kIFBvc2l0aW9uaW5nICYgR28tVG8tTWFya2V0IEludGVsbGlnZW5jZSc6IHsNCgkJCQljb3B5OiAiV29ya2luZyBkaXJlY3RseSBmb3IgYW4gPGI+PGk+YWR2ZXJ0aXNpbmcgYWdlbmN5PC9pPjwvYj4gaW4gSXNyYWVsIHdpdGggYSBFdXJvcGVhbiBjbGllbnQgaW4gdGhlIHZpdGFtaW5zIGFuZCBudXRyaXRpb24gc3BhY2UsIEZsZXRjaGVyIHN1cnZleWVkIHRoZSBtYXJrZXQgYW5kIGNvbmR1Y3RlZCBwcmltYXJ5IG1hcmtldCByZXNlYXJjaCB0aGF0IHdlbnQgZmFyIGJleW9uZCB0aGUgdXN1YWwuIFdlIHN0YXJ0ZWQgYnkgc3VydmV5aW5nIHdoYXQgd2FzIG9uLXNoZWxmLCBnYXRoZXJlZCBzZWNvbmRhcnkgZGF0YSwgYW5kIG91dGxpbmVkIHRoZSA8Yj5wcmltYXJ5IGNvbXBldGl0b3JzJyBicmFuZGluZyBhbmQgcHJvcG9zaXRpb24gKGNsYWltcywgcG9zaXRpb25pbmcsIGNvbG9yIHBhbGV0dGUpPC9iPi4gV2UgdGhlbiB3ZW50IGJleW9uZCB0aGF0IHRvIGhlbHAgb3VyIGNsaWVudCBtb3JlIGRlZXBseSB1bmRlcnN0YW5kIHRoZSBpc3N1ZXMgYW5kIGh1cmRsZXMgZm9yIGdldHRpbmcgb24tc2hlbGYgaW4gdGhlIGNyb3dkZWQgYW5kIGV4cGVuc2l2ZSB2aXRhbWlucyBhbmQgbnV0cml0aW9uIEImTSBzcGFjZS4gV2UgaW50ZXJ2aWV3ZWQgY29tcGV0aXRvcnMnIGFuZCBjdXN0b21lcnMnIChwcmV2aW91cykgZGVjaXNpb24gbWFrZXJzIGluY2x1ZGluZyBwcm9jdXJlbWVudCBtYW5hZ2VycyBhbmQgY28tbWFudWZhY3R1cmVycyB0byB1bmRlcnN0YW5kIHRoZSA8Yj5yZWFsaXRpZXMgb2Ygc2VsbC1pbiwgZGlzdHJpYnV0aW9uLCBhbmQgdHJhZGUgc3VwcG9ydCBjb3N0czwvYj4uIFRoaXMgaW5mb3JtYXRpb24gd2FzIGNyaXRpY2FsIHRvIHRoZSBjbGllbnQncyBnby10by1tYXJrZXQgc3RyYXRlZ2llcyBhbmQgYnVkZ2V0aW5nLiBUaGUgcHJvamVjdCB3YXMgZXZlbiBleHRlbmRlZCB0byBpbmNsdWRlIGludmVzdGlnYXRpbmcgdGhlIGluZ3JlZGllbnQgcGFuZWxzIGZvciB0aGUgdHdvIHByaW1hcnkgcGxheWVycyBvbi1zaGVsZiBhdCB0aGUgdGltZeKAlGFuZCB0aGVpciBzb3VyY2luZ+KAlHNvIHRoYXQgYSBjb21wYXJhdGl2ZSBzZWxsLWluIHN0b3J5IGNvdWxkIGJlIHN1cHBvcnRlZCBmb3Igc2FsZXMgcHJlc2VudGF0aW9ucy4iLA0KCQkJfSwNCgkJCSdBIHByb21pbmVudCB2ZW50dXJlIGNhcGl0YWwgZmlybSc6IHsNCgkJCQljb3B5OiAiQSBwcm9taW5lbnQgPGI+PGk+dmVudHVyZSBjYXBpdGFsIGZpcm08L2k+PC9iPiBpbiBOb3J0aCBBbWVyaWNhIGFza2VkIHVzIHRvIGludmVzdGlnYXRlIGFuZCBjb25maXJtIGZpbmFuY2lhbCBpbmZvcm1hdGlvbiBhbHJlYWR5IHByb3ZpZGVkIGFzIHBhcnQgb2YgYSBwb3RlbnRpYWwgYWNxdWlzaXRpb24gaW4gTm9ydGggQW1lcmljYS4gSW4gYWRkaXRpb24gdG8gY29uZmlybWluZyB3aGF0IHdhcyByZXByZXNlbnRlZCBieSB0aGUgdGFyZ2V0LCB3ZSB3ZXJlIGFibGUgdG8gPGI+dW5jb3ZlciBhZGRpdGlvbmFsIGV4cGVjdGVkIGNvc3RzIHJlbGF0ZWQgdG8gbWFpbnRlbmFuY2UgYW5kIG5lZWRlZCBDYXBFeCwgYXMgd2VsbCBhcyBzdXBwbHkvY3VzdG9tZXItcmVsYXRlZCBmYWN0b3JzPC9iPiB0aGF0IHdlcmUgcmVuZGVyaW5nIHRoZSB0YXJnZXQncyBmaW5hbmNpYWwgcGVyZm9ybWFuY2UgYW5kIGdyb3d0aCB0byBiZSBzb21ld2hhdCB0ZW1wb3JhcnkgaW4gbmF0dXJlLiBUaGUgaW5mb3JtYXRpb24gd2Ugb2J0YWluZWQgZW5hYmxlZCBmdXJ0aGVyIG5lZ290aWF0aW9uIGFuZCA8Yj5tdWx0aXBsZSBtaWxsaW9uLWRvbGxhciBkZWFsIGltcHJvdmVtZW50czwvYj4gZm9yIG91ciBjbGllbnQuIiwNCgkJCX0sDQoJCX07DQoNCgkJd2luZG93LmR5bmFtaWNfb3ZlcnZpZXdfZG9jdW1lbnRzX2ltYWdlX3VybCA9DQoJCQknaHR0cHM6Ly9mbGV0Y2hlcmNzaS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMjMvMDQvcGV4ZWxzLWVkdWFyZG8tc29hcmVzLTU0OTgwMjYtc2NhbGVkLmpwZyc7DQoNCgkJd2luZG93LmR5bmFtaWNfb3ZlcnZpZXdfZG9jdW1lbnRzX2RpY3Rpb25hcnkgPSB7DQoJCQknQ29yZSBDUEcgU2VydmljZXMnOiB7DQoJCQkJbGluazogJ2h0dHBzOi8vZmxldGNoZXJjc2kuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDIyLzExL0NQRy1vbmUtcGFnZXIucGRmJywNCgkJCX0sDQoJCX07DQoNCgkJd2luZG93LmR5bmFtaWNfY29udGFjdF9wZXJzb25fZGljdGlvbmFyeSA9IHsNCgkJCW5hbWU6ICdQYXRyaWNrIFN0dXJnZW9uJywNCgkJCXRpdGxlOiAnVmljZSBQcmVzaWRlbnQsIENQRycsDQoJCQllbWFpbDogJ3BhdHJpY2tfc3R1cmdlb25AZmxldGNoZXJjc2kuY29tJywNCgkJCXBob25lOiAnKzEgKDMxNCkgMzk5LTcxMDcnLA0KCQl9Ow0KDQoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gRURJVCBDT1BZIEhFUkUgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLw0KCX0pOw0K"></script> <div id="" class="page-container container-fluid"><div id="hero-container" class="row"><div class="col position-relative background-image-zoom-on-hover-parent"><div id="industry-image" role="img" aria-label="" class="row background-image-zoom-on-hover-child"></div><div id="industry-image-filter" class="row position-absolute-stretch-to-fill background-fcsi-gradient-1-blue pass-through-pointer-events"></div><div class="row pass-through-pointer-events" id="hero-copy-container"><div class="col max-width-outer-horizontal-bounds"><div class="row mb-40 color-white" id="industry-header"><div class="col"><h1><span id="dynamic-page-title"></span></h1></div></div><div class="row all-width-two-thirds mb-40" id="industry-description"><div class="col color-white"> <span id="dynamic-hero-image-copy" class="no-hyphens"></span></div></div><div class="row" id="industry-contact-cta"><div class="col"> <a class="button m-unset catch-pointer-events" href="../contact/">Get in Touch</a></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHsKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWZ1bmN0aW9uIGh5ZHJhdGVEeW5hbWljQ29weSgpIHsKCQkJJChkb2N1bWVudCkuZmluZCgnI2luZHVzdHJ5LWltYWdlJykKCQkJCS5hdHRyKHsKCQkJCQknYXJpYS1sYWJlbCc6IHdpbmRvdy5keW5hbWljX3BhZ2VfdGl0bGUsCgkJCQkJJ3N0eWxlJzogImJhY2tncm91bmQtaW1hZ2U6IHVybCgnIiArIHdpbmRvdy5keW5hbWljX2hlcm9faW1hZ2VfdXJsICsgIicpOyIKCQkJCX0pOwoKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLXBhZ2UtdGl0bGUnKQoJCQkJLnRleHQod2luZG93LmR5bmFtaWNfcGFnZV90aXRsZSk7CgoJCQkkKGRvY3VtZW50KS5maW5kKCdzcGFuI2R5bmFtaWMtaGVyby1pbWFnZS1jb3B5JykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2hlcm9faW1hZ2VfY29weSk7CgkJfQoKCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBIRUxQRVIgRlVOQ1RJT05TIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBJTklUSUFMSVpFIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkvLyBWYXJpYWJsZXM6CgkJLy8gQ29udHJvbGxlcjoKCgoJCS8vIERPTToKCgoJCS8vIEN1c3RvbToKCgoJCS8vIFN0YXRlczoKCQkvLyBIeWRyYXRlIGR5bmFtaWMgY29weToKCQloeWRyYXRlRHluYW1pY0NvcHkoKTsKCgkJLy8gUGx1Z2luczoKCQkvLyAKCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBFVkVOVFMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkJLy8gCgoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gRVZFTlRTIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJfSk7Cg=="></script> <div class="row block-seperator border-top-green extra-copy-container"></div><div id="extra-copy-container" class="row min-height-page-block"><div class="col copy"><div class="row py-80 h-100 align-items-center justify-content-end"><div class="col center-aligned-right-padding max-width-half-outer-horizontal-bounds"><div class="row copy-header mb-20"><div class="col"><h3><span class="" id="extra-copy-header"></span></h3></div></div><div class="row copy-body"><div class="col"> <span id="extra-copy" class="d-none"></span><ul id="extra-copy-bullets" class="d-none ml-20 mb-0"></ul><li class="splide__slide h-100 horizontal-borders-transparent template"><div class="container h-100 px-30 pb-30 extra-copy"><div class="row h-100 align-items-center content"><div class="col"><div class="row copy"><div class="col h-100"> <span class="copy no-hyphens"></span></div></div><div class="row pt-15 pl-20 d-none bullets"><div class="col h-100"><ul class="bulleted-item-list"></ul></div></div></div></div></div></li><div id="extra-copy-slides-carousel" class="h-100 splide d-none" role="group" aria-label=""><div class="splide__track h-100"><ul class="splide__list h-100"></ul></div></div></div></div></div></div></div><div class="col background-image-zoom-on-hover-parent image"><div id="extra-copy-image" role="img" aria-label="Extra Copy Image" class="row background-image-zoom-on-hover-child"></div><div id="extra-copy-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHsKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWZ1bmN0aW9uIGh5ZHJhdGVEeW5hbWljQ29weSgpIHsKCQkJdmFyIGV4dHJhX2NvcHlfaGVhZGVyX2ZvdW5kID0gZmFsc2U7CgkJCWlmICgKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X2hlYWRlciAhPT0gdW5kZWZpbmVkKSAmJgoJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfaGVhZGVyICE9ICIiKSAmJgoJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfaGVhZGVyLmxlbmd0aCAhPSAwKQoJCQkpIHsKCQkJCWV4dHJhX2NvcHlfaGVhZGVyX2ZvdW5kID0gdHJ1ZTsKCQkJfQoKCQkJdmFyIGV4dHJhX2NvcHlfZm91bmQgPSBmYWxzZTsKCQkJdmFyIGV4dHJhX2NvcHlfYnVsbGV0c19mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weSAhPT0gdW5kZWZpbmVkKSAmJgoJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHkgIT0gIiIpICYmCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weS5sZW5ndGggIT0gMCkKCQkJKSB7CgkJCQlleHRyYV9jb3B5X2ZvdW5kID0gdHJ1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICgKCQkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9idWxsZXRzICE9PSB1bmRlZmluZWQpICYmCgkJCQkJKHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfYnVsbGV0cy5sZW5ndGggIT0gMCkKCQkJCSkgewoJCQkJCWV4dHJhX2NvcHlfYnVsbGV0c19mb3VuZCA9IHRydWU7CgkJCQl9CgkJCX0KCgkJCXZhciBleHRyYV9jb3B5X3NsaWRlc19mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9zbGlkZXMgIT09IHVuZGVmaW5lZCkgJiYKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X3NsaWRlcy5sZW5ndGggIT0gMCkKCQkJKSB7CgkJCQlleHRyYV9jb3B5X3NsaWRlc19mb3VuZCA9IHRydWU7CgkJCX0KCgkJCXZhciBleHRyYV9jb3B5X2ltYWdlX3VybF9mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkod2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9pbWFnZV91cmwgIT09IHVuZGVmaW5lZCkgJiYKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X2ltYWdlX3VybCAhPSAiIikgJiYKCQkJCSh3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X2ltYWdlX3VybC5sZW5ndGggIT0gMCkKCQkJKSB7CgkJCQlleHRyYV9jb3B5X2ltYWdlX3VybF9mb3VuZCA9IHRydWU7CgkJCX0KCgkJCWlmICgKCQkJCSgKCQkJCQlleHRyYV9jb3B5X2ZvdW5kIHx8CgkJCQkJZXh0cmFfY29weV9idWxsZXRzX2ZvdW5kIHx8CgkJCQkJZXh0cmFfY29weV9zbGlkZXNfZm91bmQKCQkJCSkgJiYKCQkJCWV4dHJhX2NvcHlfaW1hZ2VfdXJsX2ZvdW5kCgkJCSkgewoJCQkJaWYgKGV4dHJhX2NvcHlfaGVhZGVyX2ZvdW5kKSB7CgkJCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNleHRyYS1jb3B5LWhlYWRlcicpCgkJCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfaGVhZGVyKTsKCQkJCX0KCgkJCQlpZiAoZXh0cmFfY29weV9mb3VuZCkgewoJCQkJCSQoZG9jdW1lbnQpLmZpbmQoJ3NwYW4jZXh0cmEtY29weScpCgkJCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJykKCQkJCQkJLnRleHQod2luZG93LmR5bmFtaWNfZXh0cmFfY29weSk7CgkJCQl9IGVsc2UgaWYgKGV4dHJhX2NvcHlfYnVsbGV0c19mb3VuZCkgewoJCQkJCSQoZG9jdW1lbnQpLmZpbmQoJ3VsI2V4dHJhLWNvcHktYnVsbGV0cycpCgkJCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJyk7CgoJCQkJCSQuZWFjaCgKCQkJCQkJd2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9idWxsZXRzLAoJCQkJCQlmdW5jdGlvbihleHRyYV9jb3B5X2J1bGxldF9pbmRleCwgZXh0cmFfY29weV9idWxsZXRfY29weSkgewoJCQkJCQkJJG5ld19saV9lbGVtZW50ID0gJCgnPGxpIGNsYXNzPSJtYi0xMCBuby1oeXBoZW5zIj48L2xpPicpLnRleHQoZXh0cmFfY29weV9idWxsZXRfY29weSk7CgoJCQkJCQkJJChkb2N1bWVudCkuZmluZCgndWwjZXh0cmEtY29weS1idWxsZXRzJykKCQkJCQkJCQkuYXBwZW5kKCRuZXdfbGlfZWxlbWVudCk7CgkJCQkJCX0KCQkJCQkpOwoJCQkJfSBlbHNlIGlmIChleHRyYV9jb3B5X3NsaWRlc19mb3VuZCkgewoJCQkJCS8vIENyZWF0ZSBET00gY2Fyb3VzZWwgaXRlbSBlbGVtZW50cyBmb3IgU3BsaWRlCgkJCQkJJC5lYWNoKAoJCQkJCQl3aW5kb3cuZHluYW1pY19leHRyYV9jb3B5X3NsaWRlcywKCQkJCQkJZnVuY3Rpb24oZXh0cmFfY29weV9zbGlkZV9pbmRleCwgZXh0cmFfY29weV9zbGlkZV9pbmZvX29iamVjdCkgewoJCQkJCQkJJG5ld19jYXJvdXNlbF9pdGVtID0gY3JlYXRlRXh0cmFDb3B5Q2Fyb3VzZWxJdGVtKGV4dHJhX2NvcHlfc2xpZGVfaW5mb19vYmplY3QpOwoKCQkJCQkJCSRleHRyYV9jb3B5X3NsaWRlc19jYXJvdXNlbAoJCQkJCQkJCS5maW5kKCJ1bC5zcGxpZGVfX2xpc3QiKQoJCQkJCQkJCS5hcHBlbmQoJG5ld19jYXJvdXNlbF9pdGVtKTsKCQkJCQkJfQoJCQkJCSk7CgoJCQkJCS8vIEluaXRpYWxpemUgYW5kIGh5ZHJhdGUgU3BsaWRlIHZhcnMgdy8gZGVmYXVsdCB2YWx1ZXM6CgkJCQkJdmFyIHNwbGlkZV9wZXJfcGFnZSA9IDE7CgkJCQkJdmFyIHNwbGlkZV9wZXJfbW92ZSA9IDE7CgkJCQkJdmFyIHNwbGlkZV9hdXRvcGxheSA9IHRydWU7CgkJCQkJdmFyIHNwbGlkZV9hcnJvd3MgPSB0cnVlOwoJCQkJCXZhciBzcGxpZGVfZHJhZyA9IHRydWU7CgoJCQkJCWxldCBleHRyYV9jb3B5X3NsaWRlc19jb3VudCA9IHdpbmRvdy5keW5hbWljX2V4dHJhX2NvcHlfc2xpZGVzLmxlbmd0aDsKCQkJCQlpZiAoZXh0cmFfY29weV9zbGlkZXNfY291bnQgPT0gMSkgewoJCQkJCQlzcGxpZGVfYXV0b3BsYXkgPSBmYWxzZTsKCQkJCQkJc3BsaWRlX2RyYWcgPSBmYWxzZTsKCQkJCQl9CgoJCQkJCS8vIEluaXRpYWxpemUgbmV3IFNwbGlkZSBpbnN0YW5jZToKCQkJCQl3aW5kb3cuZXh0cmFfY29weV9zbGlkZXNfY2Fyb3VzZWxfc3BsaWRlID0gbmV3IFNwbGlkZSgKCQkJCQkJIiNleHRyYS1jb3B5LXNsaWRlcy1jYXJvdXNlbC5zcGxpZGUiLCB7CgkJCQkJCQl0eXBlOiAibG9vcCIsCgkJCQkJCQlwZXJQYWdlOiBzcGxpZGVfcGVyX3BhZ2UsCgkJCQkJCQlwZXJNb3ZlOiBzcGxpZGVfcGVyX21vdmUsCgkJCQkJCQlzcGVlZDogMTMwMCwKCQkJCQkJCXBhZ2luYXRpb246IHRydWUsCgkJCQkJCQlhdXRvcGxheTogc3BsaWRlX2F1dG9wbGF5LAoJCQkJCQkJaW50ZXJ2YWw6IDYwMDAsCgkJCQkJCQlwYXVzZU9uSG92ZXI6IHRydWUsCgkJCQkJCQlwYXVzZU9uRm9jdXM6IHRydWUsCgkJCQkJCQlhcnJvd3M6IHNwbGlkZV9hcnJvd3MsCgkJCQkJCQlkcmFnOiBzcGxpZGVfZHJhZwoJCQkJCQl9CgkJCQkJKS5tb3VudCgpOwoKCQkJCQkkKGRvY3VtZW50KS5maW5kKCcjZXh0cmEtY29weS1zbGlkZXMtY2Fyb3VzZWwnKQoJCQkJCQkucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpOwoJCQkJCSQoZG9jdW1lbnQpLmZpbmQoJy5yb3cuYnVsbGV0cycpCgkJCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJyk7CgkJCQl9CgoJCQkJJChkb2N1bWVudCkuZmluZCgnI2V4dHJhLWNvcHktY29udGFpbmVyICNleHRyYS1jb3B5LWltYWdlJykKCQkJCQkuYXR0cignc3R5bGUnLCAiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciICsgd2luZG93LmR5bmFtaWNfZXh0cmFfY29weV9pbWFnZV91cmwgKyAiJyk7IikKCgkJCQkkKGRvY3VtZW50KS5maW5kKCcjZXh0cmEtY29weS1jb250YWluZXInKS5jc3MoJ2Rpc3BsYXknLCAnZmxleCcpOwoJCQkJJChkb2N1bWVudCkuZmluZCgnLmJsb2NrLXNlcGVyYXRvci5leHRyYS1jb3B5LWNvbnRhaW5lcicpLmNzcygnZGlzcGxheScsICdmbGV4Jyk7CgkJCX0KCQl9CgoJCS8vIENyZWF0ZSBuZXcgY2Fyb3VzZWwgaXRlbSBjb2w6CgkJZnVuY3Rpb24gY3JlYXRlRXh0cmFDb3B5Q2Fyb3VzZWxJdGVtKHBhc3NlZF9leHRyYV9jb3B5X3NsaWRlX2luZm9fb2JqZWN0KSB7CgkJCXZhciAkbmV3X2V4dHJhX2NvcHlfc3BsaWRlX3NsaWRlX2xpID0gJGV4dHJhX2NvcHlfc3BsaWRlX3NsaWRlX2xpX3RlbXBsYXRlLmNsb25lKCkKCQkJCS5yZW1vdmVDbGFzcygidGVtcGxhdGUiKTsKCgkJCSRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGkuZmluZCgnLnJvdy5jb3B5IHNwYW4uY29weScpCgkJCQkuaHRtbChwYXNzZWRfZXh0cmFfY29weV9zbGlkZV9pbmZvX29iamVjdFsnY29weSddKTsKCgkJCXZhciBidWxsZXRlZF9pdGVtc19mb3VuZCA9IGZhbHNlOwoJCQlpZiAoCgkJCQkocGFzc2VkX2V4dHJhX2NvcHlfc2xpZGVfaW5mb19vYmplY3RbJ2J1bGxldHMnXSAhPT0gdW5kZWZpbmVkKSAmJgoJCQkJKHBhc3NlZF9leHRyYV9jb3B5X3NsaWRlX2luZm9fb2JqZWN0WydidWxsZXRzJ10ubGVuZ3RoICE9IDApCgkJCSkgewoJCQkJYnVsbGV0ZWRfaXRlbXNfZm91bmQgPSB0cnVlOwoJCQl9CgoJCQlpZiAoYnVsbGV0ZWRfaXRlbXNfZm91bmQpIHsKCQkJCSRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGkuZmluZCgiLnJvdy5idWxsZXRzIikKCQkJCQkucmVtb3ZlQ2xhc3MoJ2Qtbm9uZScpOwoKCQkJCSQuZWFjaCgKCQkJCQlwYXNzZWRfZXh0cmFfY29weV9zbGlkZV9pbmZvX29iamVjdFsiYnVsbGV0cyJdLAoJCQkJCWZ1bmN0aW9uKGJ1bGxldGVkX2l0ZW1faW5kZXgsIGJ1bGxldGVkX2l0ZW1fY29weSkgewoJCQkJCQkkbmV3X2J1bGxldGVkX2xpID0gJCgnPGxpIGNsYXNzPSJidWxsZXRlZC1pdGVtIG5vLWh5cGhlbnMiPjwvbGk+Jyk7CgoJCQkJCQkkbmV3X2J1bGxldGVkX2xpLmh0bWwoYnVsbGV0ZWRfaXRlbV9jb3B5KTsKCgkJCQkJCSRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGkuZmluZCgidWwuYnVsbGV0ZWQtaXRlbS1saXN0IikKCQkJCQkJCS5hcHBlbmQoJG5ld19idWxsZXRlZF9saSk7CgkJCQkJfQoJCQkJKTsKCQkJfQoKCQkJcmV0dXJuICRuZXdfZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGk7CgkJfQoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEhFTFBFUiBGVU5DVElPTlMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIFZhcmlhYmxlczoKCQkvLyBDb250cm9sbGVyOgoKCgkJLy8gRE9NOgoJCSRleHRyYV9jb3B5X3NsaWRlc19jYXJvdXNlbCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNleHRyYS1jb3B5LXNsaWRlcy1jYXJvdXNlbC5zcGxpZGUnKTsKCQkkZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGlfdGVtcGxhdGUgPSAkKGRvY3VtZW50KS5maW5kKCcjZXh0cmEtY29weS1jb250YWluZXIgbGkudGVtcGxhdGUnKTsKCQljb25zb2xlLmxvZygiJGV4dHJhX2NvcHlfc3BsaWRlX3NsaWRlX2xpX3RlbXBsYXRlID0iLCAkZXh0cmFfY29weV9zcGxpZGVfc2xpZGVfbGlfdGVtcGxhdGUpOwoKCQkvLyBDdXN0b206CgoKCQkvLyBTdGF0ZXM6CgkJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CgkJaHlkcmF0ZUR5bmFtaWNDb3B5KCk7CgoJCS8vIFBsdWdpbnM6CgkJLy8gCgoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIElOSVRJQUxJWkUgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgRVZFTlRTIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIAoKCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVWRU5UUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCX0pOwo="></script> <div class="row border-top-green block-seperator"></div><div id="core-services-container" class="row justify-content-center min-height-page-block background-color-off-white"><div class="col mx-40 min-height-100pct all-width-outer-horizontal-bounds"><div class="row content h-100"><div class="col h-100"><div class="row py-80 h-100 w-100 flex-nowrap block-row"><div class="col-auto max-width-100pct px-0 pr-10 core-services information"><div class="row h-100 w-100 align-items-center"><div class="col-auto w-100 px-0"><div class="row mb-20 header"><div class="col"><h3 class="header">Competitive Services</h3></div></div><div class="row mb-20 w-100 core-services"><div id="core-services-col" class="col-auto w-100 px-0"><div class="row mb-20 core-service-row template"><div class="col"> <button type="button" class="core-service-button trigger-link" data-title=""><div class="container"><div class="row w-100 flex-nowrap"><div class="col pr-10 all-width-fit-content d-flex indicator"> <i class="fa line-height-fcsi-1 fa-angle-double-right" aria-hidden="true"></i></div><div class="col text-left underline-on-hover link"></div></div></div> </button></div></div><div class="row my-10 core-service-child-row template"><div class="col"> <button type="button" class="nested-core-service-button trigger-link"><div class="container"><div class="row w-100 flex-nowrap"><div class="col pr-10 all-width-fit-content d-flex indicator"> <i class="fa line-height-fcsi-1 fa-angle-double-right" aria-hidden="true"></i></div><div class="col d-flex flex-column justify-content-center underline-on-hover link"> <span class="child-name"></span></div></div></div> </button></div></div><div class="row mb-20 core-service-parent-row template"><div class="col"><div class="row parent-name"><div class="col"><h5> <span class="font-italic font-weight-normal parent-name"></span></h5></div></div><div class="row child-services"><div class="col child-services-col"></div></div></div></div></div></div></div></div></div><div class="col sub-services"><div class="container p-0 h-100 all-width-100pct w-100"><div class="row h-100"><div class="col h-100"><div class="row ml-40 border-left-1px-solid-black pl-40 min-height-100pct height-fit-content align-items-center core-service-detail-row template"><div class="col detail-container height-fit-content"><div class="row pt-40 pb-20 min-height-one-third align-items-end icon"><div class="col"></div></div><div class="row min-height-two-thirds information no-hyphens"><div class="col h-100"></div></div></div></div><li class="splide__slide h-100 horizontal-borders-transparent template"><div class="container h-100 px-30 sub-service"><div class="row icon"><div class="col h-100"></div></div><div class="row font-weight-bold title"><div class="col h-100"></div></div><div class="row information splide-information-row no-hyphens all-height-fit"><div class="col h-100"><div class="row information no-hyphens"><div class="col"></div></div><div class="row information-bullets"><div class="col"><ul class="ml-5 mr-0"><li class="template pt-3"></li></ul></div></div></div></div></div></li><div id="sub-services-carousel" class="splide h-100" role="group" aria-label=""><div class="splide__track h-100"><ul class="splide__list h-100"></ul></div></div></div></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7CgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CglmdW5jdGlvbiBoeWRyYXRlRHluYW1pY0NvcHkoKSB7CgkJdmFyICRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93ID0gdW5kZWZpbmVkOwoKCQlpZiAoCgkJCXdpbmRvdy5keW5hbWljX25lc3RlZF9jb3JlX3NlcnZpY2VzX2FycmF5ICE9PSB1bmRlZmluZWQgJiYKCQkJd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXkubGVuZ3RoICE9IDAKCQkpIHsKCQkJY29uc29sZS5sb2coCgkJCQknd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXknLAoJCQkJd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXkKCQkJKTsKCgkJCSQuZWFjaCgKCQkJCXdpbmRvdy5keW5hbWljX25lc3RlZF9jb3JlX3NlcnZpY2VzX2FycmF5LAoJCQkJZnVuY3Rpb24gKHBhcmVudF9jb3JlX3NlcnZpY2VfaW5kZXgsIHBhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QpIHsKCQkJCQkkdGhpc19uZXN0ZWRfY29yZV9zZXJ2aWNlX3BhcmVudF9yb3cgPQoJCQkJCQljcmVhdGVOZXN0ZWRDb3JlU2VydmljZVBhcmVudFJvdyhwYXJlbnRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0KTsKCgkJCQkJaWYgKCRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93ID09PSB1bmRlZmluZWQpIHsKCQkJCQkJJGZpcnN0X2NvcmVfc2VydmljZV9yb3cgPSAkdGhpc19uZXN0ZWRfY29yZV9zZXJ2aWNlX3BhcmVudF9yb3c7CgkJCQkJfQoJCQkJfQoJCQkpOwoJCX0gZWxzZSB7CgkJCWxldCBzb3J0ZWRfY29yZV9zZXJ2aWNlcyA9IHNvcnRDb3JlU2VydmljZXNEaWN0aW9uYXJ5KCk7CgoJCQl2YXIgc3ViX3NlcnZpY2VzX2FycmF5X2ZvdW5kID0gZmFsc2U7CgkJCWlmICgKCQkJCXNvcnRlZF9jb3JlX3NlcnZpY2VzWzBdLmluZm9fb2JqZWN0LnN1Yl9zZXJ2aWNlc19hcnJheSAhPT0gdW5kZWZpbmVkICYmCgkJCQlzb3J0ZWRfY29yZV9zZXJ2aWNlc1swXS5pbmZvX29iamVjdC5zdWJfc2VydmljZXNfYXJyYXkubGVuZ3RoICE9PSAwCgkJCSkgewoJCQkJc3ViX3NlcnZpY2VzX2FycmF5X2ZvdW5kID0gdHJ1ZTsKCQkJfQoKCQkJJC5lYWNoKAoJCQkJc29ydGVkX2NvcmVfc2VydmljZXMsCgkJCQlmdW5jdGlvbiAoc29ydGVkX2NvcmVfc2VydmljZV9pbmRleCwgc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCkgewoJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX3JvdyA9IGNyZWF0ZUNvcmVTZXJ2aWNlUm93KAoJCQkJCQlzb3J0ZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0Lm5hbWUKCQkJCQkpOwoJCQkJCWlmIChzb3J0ZWRfY29yZV9zZXJ2aWNlX2luZGV4ID09PSAwKSB7CgkJCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93ID0gJG5ld19jb3JlX3NlcnZpY2Vfcm93OwoJCQkJCX0KCgkJCQkJaWYgKCFzdWJfc2VydmljZXNfYXJyYXlfZm91bmQpIHsKCQkJCQkJJG5ld19jb3JlX3NlcnZpY2VfZGV0YWlsX3JvdyA9IGNyZWF0ZUNvcmVTZXJ2aWNlRGV0YWlsUm93KAoJCQkJCQkJc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5uYW1lLAoJCQkJCQkJc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5pbmZvX29iamVjdAoJCQkJCQkpOwoKCQkJCQkJaWYgKHNvcnRlZF9jb3JlX3NlcnZpY2VfaW5kZXggIT09IDApIHsKCQkJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cuYWRkQ2xhc3MoJ2Qtbm9uZScpOwoJCQkJCQl9CgoJCQkJCQkkY29yZV9zZXJ2aWNlX2RldGFpbF9yb3dfdGVtcGxhdGUuYWZ0ZXIoCgkJCQkJCQkkbmV3X2NvcmVfc2VydmljZV9kZXRhaWxfcm93CgkJCQkJCSk7CgoJCQkJCQlpZiAoc29ydGVkX2NvcmVfc2VydmljZV9pbmRleCA9PT0gMCkgewoJCQkJCQkJbGV0IGNvcmVfc2VydmljZXNfY29udGFpbmVyX21pbl9oZWlnaHRfcHggPSBwYXJzZUludCgKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93LmNzcygnbWluLWhlaWdodCcpCgkJCQkJCQkpOwoKCQkJCQkJCWxldCBjb21wZXRpdGl2ZV9zZXJ2aWNlc19pbmZvcm1hdGlvbl9yb3dfaGVpZ2h0X3B4ID0KCQkJCQkJCQkkbmV3X2NvcmVfc2VydmljZV9kZXRhaWxfcm93CgkJCQkJCQkJCS5maW5kKCcuZGV0YWlsLWNvbnRhaW5lciAucm93LmluZm9ybWF0aW9uJykKCQkJCQkJCQkJLm91dGVySGVpZ2h0KCk7CgoJCQkJCQkJbGV0IGRldGFpbF9pY29uX3Jvd19wYWRkaW5nX3RvcF9weCA9IHBhcnNlSW50KAoJCQkJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJCQkJCQkJLmZpbmQoJy5yb3cuaWNvbicpCgkJCQkJCQkJCS5jc3MoJ3BhZGRpbmctdG9wJykKCQkJCQkJCSk7CgoJCQkJCQkJbGV0IGRldGFpbF9pY29uX3Jvd19wYWRkaW5nX2JvdHRvbV9weCA9IHBhcnNlSW50KAoJCQkJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJCQkJCQkJLmZpbmQoJy5yb3cuaWNvbicpCgkJCQkJCQkJCS5jc3MoJ3BhZGRpbmctYm90dG9tJykKCQkJCQkJCSk7CgoJCQkJCQkJbGV0IGRldGFpbF9pY29uX3Jvd19oZWlnaHRfcHggPQoJCQkJCQkJCWRldGFpbF9pY29uX3Jvd19wYWRkaW5nX3RvcF9weCArCgkJCQkJCQkJZGV0YWlsX2ljb25fcm93X3BhZGRpbmdfYm90dG9tX3B4ICsKCQkJCQkJCQk2NDsKCgkJCQkJCQlsZXQgY29yZV9zZXJ2aWNlc19jb250YWluZXJfcGFkZGluZ190b3BfcHggPSBwYXJzZUludCgKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93CgkJCQkJCQkJCS5maW5kKCcuYmxvY2stcm93JykKCQkJCQkJCQkJLmNzcygncGFkZGluZy10b3AnKQoJCQkJCQkJKTsKCgkJCQkJCQlsZXQgY29yZV9zZXJ2aWNlc19jb250YWluZXJfcGFkZGluZ19ib3R0b21fcHggPSBwYXJzZUludCgKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93CgkJCQkJCQkJCS5maW5kKCcuYmxvY2stcm93JykKCQkJCQkJCQkJLmNzcygncGFkZGluZy1ib3R0b20nKQoJCQkJCQkJKTsKCgkJCQkJCQlsZXQgbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9weCA9CgkJCQkJCQkJY29tcGV0aXRpdmVfc2VydmljZXNfaW5mb3JtYXRpb25fcm93X2hlaWdodF9weCArCgkJCQkJCQkJZGV0YWlsX2ljb25fcm93X2hlaWdodF9weCArCgkJCQkJCQkJY29yZV9zZXJ2aWNlc19jb250YWluZXJfcGFkZGluZ190b3BfcHggKwoJCQkJCQkJCWNvcmVfc2VydmljZXNfY29udGFpbmVyX3BhZGRpbmdfYm90dG9tX3B4OwoKCQkJCQkJCWlmICgKCQkJCQkJCQluZXdfY29yZV9zZXJ2aWNlc19jb250YWluZXJfaGVpZ2h0X3B4ID4KCQkJCQkJCQljb3JlX3NlcnZpY2VzX2NvbnRhaW5lcl9taW5faGVpZ2h0X3B4CgkJCQkJCQkpIHsKCQkJCQkJCQlsZXQgbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX21pbl9oZWlnaHRfc3RyaW5nID0KCQkJCQkJCQkJbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9weCArICdweCAhaW1wb3J0YW50JzsKCQkJCQkJCQlsZXQgbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9zdHJpbmcgPQoJCQkJCQkJCQluZXdfY29yZV9zZXJ2aWNlc19jb250YWluZXJfaGVpZ2h0X3B4ICsgJ3B4JzsKCQkJCQkJCQkkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93LmF0dHIoCgkJCQkJCQkJCSdzdHlsZScsCgkJCQkJCQkJCSdtaW4taGVpZ2h0OiAnICsKCQkJCQkJCQkJCW5ld19jb3JlX3NlcnZpY2VzX2NvbnRhaW5lcl9taW5faGVpZ2h0X3N0cmluZyArCgkJCQkJCQkJCQknOyBoZWlnaHQ6ICcgKwoJCQkJCQkJCQkJbmV3X2NvcmVfc2VydmljZXNfY29udGFpbmVyX2hlaWdodF9zdHJpbmcKCQkJCQkJCQkpOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkpOwoJCX0KCgkJLy8gU3RhdGVzIGZvciBpbml0aWFsIHNlbGVjdGlvbiBvZiBidXR0b25zOgoJCXNldFRpbWVvdXQoKCkgPT4gewoJCQlpZiAoCgkJCQkkZmlyc3RfY29yZV9zZXJ2aWNlX3Jvdy5maW5kKCdidXR0b24uY29yZS1zZXJ2aWNlLWJ1dHRvbicpLmxlbmd0aCAhPT0gMAoJCQkpIHsKCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93LmZpbmQoJ2J1dHRvbi5jb3JlLXNlcnZpY2UtYnV0dG9uJykuY2xpY2soKTsKCQkJfSBlbHNlIGlmICgKCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93LmZpbmQoCgkJCQkJJy5yb3cuY29yZS1zZXJ2aWNlLWNoaWxkLXJvdzpmaXJzdC1jaGlsZCgpIGJ1dHRvbi5uZXN0ZWQtY29yZS1zZXJ2aWNlLWJ1dHRvbicKCQkJCSkgIT09IHVuZGVmaW5lZAoJCQkpIHsKCQkJCSR0ZXN0ID0gJGZpcnN0X2NvcmVfc2VydmljZV9yb3cuZmluZCgKCQkJCQknLnJvdy5jb3JlLXNlcnZpY2UtY2hpbGQtcm93OmZpcnN0LWNoaWxkKCkgYnV0dG9uLm5lc3RlZC1jb3JlLXNlcnZpY2UtYnV0dG9uJwoJCQkJKTsKCQkJCSRmaXJzdF9jb3JlX3NlcnZpY2Vfcm93CgkJCQkJLmZpbmQoCgkJCQkJCScucm93LmNvcmUtc2VydmljZS1jaGlsZC1yb3c6Zmlyc3QtY2hpbGQoKSBidXR0b24ubmVzdGVkLWNvcmUtc2VydmljZS1idXR0b24nCgkJCQkJKQoJCQkJCS5jbGljaygpOwoJCQl9CgkJfSwgMSk7Cgl9CgoJLy8gQ3JlYXRlIG5ldyBjb3JlIHNlcnZpY2Ugcm93OgoJZnVuY3Rpb24gY3JlYXRlQ29yZVNlcnZpY2VSb3cocGFzc2VkX2NvcmVfc2VydmljZV9uYW1lKSB7CgkJdmFyICRuZXdfY29yZV9zZXJ2aWNlX3JvdyA9ICRjb3JlX3NlcnZpY2Vfcm93X3RlbXBsYXRlCgkJCS5jbG9uZSgpCgkJCS5yZW1vdmVDbGFzcygndGVtcGxhdGUnKTsKCgkJJG5ld19jb3JlX3NlcnZpY2Vfcm93CgkJCS5maW5kKCdidXR0b24uY29yZS1zZXJ2aWNlLWJ1dHRvbicpCgkJCS5hdHRyKCdkYXRhLXRpdGxlJywgcGFzc2VkX2NvcmVfc2VydmljZV9uYW1lKTsKCQkkbmV3X2NvcmVfc2VydmljZV9yb3cuZmluZCgnLmNvbC5saW5rJykudGV4dChwYXNzZWRfY29yZV9zZXJ2aWNlX25hbWUpOwoKCQkkY29yZV9zZXJ2aWNlc19jb2wuYXBwZW5kKCRuZXdfY29yZV9zZXJ2aWNlX3Jvdyk7CgoJCXJldHVybiAkbmV3X2NvcmVfc2VydmljZV9yb3c7Cgl9CgoJLy8gQ3JlYXRlIG5ldyBjYXJvdXNlbCBpdGVtIGNvbDoKCWZ1bmN0aW9uIGNyZWF0ZVN1YlNlcnZpY2VDYXJvdXNlbEl0ZW0ocGFzc2VkX3N1Yl9zZXJ2aWNlX2luZm9fb2JqZWN0KSB7CgkJdmFyICRuZXdfc3ViX3NlcnZpY2VfbGkgPSAkc3ViX3NlcnZpY2VfbGlfdGVtcGxhdGUKCQkJLmNsb25lKCkKCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCS5maW5kKCcucm93Lmljb24gPiAuY29sJykKCQkJLmh0bWwocGFzc2VkX3N1Yl9zZXJ2aWNlX2luZm9fb2JqZWN0WydpY29uX2ltZ19odG1sJ10pOwoJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJLmZpbmQoJy5yb3cudGl0bGUgPiAuY29sJykKCQkJLmh0bWwocGFzc2VkX3N1Yl9zZXJ2aWNlX2luZm9fb2JqZWN0Wyd0aXRsZSddKTsKCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uID4gLmNvbCcpCgkJCS5odG1sKHBhc3NlZF9zdWJfc2VydmljZV9pbmZvX29iamVjdFsnaW5mb3JtYXRpb24nXSk7CgoJCXJldHVybiAkbmV3X3N1Yl9zZXJ2aWNlX2xpOwoJfQoKCS8vIENyZWF0ZSBDb3JlIFNlcnZpY2UgaXRlbSBjb2w6CglmdW5jdGlvbiBjcmVhdGVDb3JlU2VydmljZURldGFpbFJvdygKCQlwYXNzZWRfY29yZV9zZXJ2aWNlX25hbWUsCgkJcGFzc2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdAoJKSB7CgkJJG5ld19jb3JlX3NlcnZpY2VfZGV0YWlsX3JvdyA9ICRjb3JlX3NlcnZpY2VfZGV0YWlsX3Jvd190ZW1wbGF0ZQoJCQkuY2xvbmUoKQoJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cuYXR0cignbmFtZScsIHBhc3NlZF9jb3JlX3NlcnZpY2VfbmFtZSk7CgoJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJLmZpbmQoJy5yb3cuaWNvbiA+IC5jb2wnKQoJCQkuaHRtbChwYXNzZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0WydpY29uX2ltZ19odG1sJ10pOwoJCSRuZXdfY29yZV9zZXJ2aWNlX2RldGFpbF9yb3cKCQkJLmZpbmQoJy5yb3cuaW5mb3JtYXRpb24gPiAuY29sJykKCQkJLmh0bWwocGFzc2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdFsnaW5mb3JtYXRpb24nXSk7CgoJCXJldHVybiAkbmV3X2NvcmVfc2VydmljZV9kZXRhaWxfcm93OwoJfQoKCWZ1bmN0aW9uIHNvcnRDb3JlU2VydmljZXNEaWN0aW9uYXJ5KCkgewoJCWxldCBwcmVfc29ydGVkX2NvcmVfc2VydmljZXMgPSBbXTsKCQlmb3IgKHZhciB0ZW1wX2NvcmVfc2VydmljZV9uYW1lIGluIHdpbmRvdy5keW5hbWljX2NvcmVfc2VydmljZXNfZGljdGlvbmFyeSkgewoJCQlwcmVfc29ydGVkX2NvcmVfc2VydmljZXMucHVzaCh7CgkJCQluYW1lOiB0ZW1wX2NvcmVfc2VydmljZV9uYW1lLAoJCQkJaW5mb19vYmplY3Q6CgkJCQkJd2luZG93LmR5bmFtaWNfY29yZV9zZXJ2aWNlc19kaWN0aW9uYXJ5W3RlbXBfY29yZV9zZXJ2aWNlX25hbWVdLAoJCQl9KTsKCQl9CgoJCXZhciBsb25nZXN0X2luZm9ybWF0aW9uX3N0cmluZ19sZW5ndGggPSAwOwoJCXZhciBsb25nZXN0X2luZm9ybWF0aW9uX2luZGV4ID0gMDsKCQkkLmVhY2goCgkJCXByZV9zb3J0ZWRfY29yZV9zZXJ2aWNlcywKCQkJZnVuY3Rpb24gKGNvcmVfc2VydmljZV9pbmRleCwgcHJlc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCkgewoJCQkJaWYgKAoJCQkJCXByZXNvcnRlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuaW5mb19vYmplY3QuaW5mb3JtYXRpb24gIT0KCQkJCQkJdW5kZWZpbmVkICYmCgkJCQkJcHJlc29ydGVkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5pbmZvX29iamVjdC5pbmZvcm1hdGlvbi5sZW5ndGggPgoJCQkJCQlsb25nZXN0X2luZm9ybWF0aW9uX3N0cmluZ19sZW5ndGgKCQkJCSkgewoJCQkJCWxvbmdlc3RfaW5mb3JtYXRpb25fc3RyaW5nX2xlbmd0aCA9CgkJCQkJCXByZXNvcnRlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuaW5mb19vYmplY3QuaW5mb3JtYXRpb24ubGVuZ3RoOwoJCQkJCWxvbmdlc3RfaW5mb3JtYXRpb25faW5kZXggPSBjb3JlX3NlcnZpY2VfaW5kZXg7CgkJCQl9CgkJCX0KCQkpOwoKCQlsZXQgbG9uZ2VzdF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QgPSBwcmVfc29ydGVkX2NvcmVfc2VydmljZXMuc3BsaWNlKAoJCQlsb25nZXN0X2luZm9ybWF0aW9uX2luZGV4LAoJCQkxCgkJKVswXTsKCgkJcHJlX3NvcnRlZF9jb3JlX3NlcnZpY2VzLnVuc2hpZnQobG9uZ2VzdF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QpOwoKCQl2YXIgc29ydGVkX2NvcmVfc2VydmljZXMgPSBwcmVfc29ydGVkX2NvcmVfc2VydmljZXM7CgoJCXJldHVybiBzb3J0ZWRfY29yZV9zZXJ2aWNlczsKCX0KCgkvLyBDcmVhdGUgbmV3IGNvcmUgc2VydmljZSByb3c6CglmdW5jdGlvbiBjcmVhdGVOZXN0ZWRDb3JlU2VydmljZVBhcmVudFJvdygKCQlwYXNzZWRfcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdAoJKSB7CgkJdmFyICRuZXdfY29yZV9zZXJ2aWNlX25lc3RlZF9wYXJlbnRfcm93ID0KCQkJJGNvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3Jvd190ZW1wbGF0ZS5jbG9uZSgpLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3JvdwoJCQkuZmluZCgnc3Bhbi5wYXJlbnQtbmFtZScpCgkJCS50ZXh0KHBhc3NlZF9wYXJlbnRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0LnBhcmVudF9jb3JlX3NlcnZpY2VfbmFtZSk7CgoJCWlmICgKCQkJcGFzc2VkX3BhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuY2hpbGRyZW5fY29yZV9zZXJ2aWNlcyAhPT0KCQkJCXVuZGVmaW5lZCAmJgoJCQlwYXNzZWRfcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5jaGlsZHJlbl9jb3JlX3NlcnZpY2VzLmxlbmd0aCA+IDAKCQkpIHsKCQkJJC5lYWNoKAoJCQkJcGFzc2VkX3BhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuY2hpbGRyZW5fY29yZV9zZXJ2aWNlcywKCQkJCWZ1bmN0aW9uIChjaGlsZF9jb3JlX3NlcnZpY2VfaW5kZXgsIGNoaWxkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCkgewoJCQkJCXZhciAkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfY2hpbGRfcm93ID0KCQkJCQkJJGNvcmVfc2VydmljZV9uZXN0ZWRfY2hpbGRfcm93X3RlbXBsYXRlCgkJCQkJCQkuY2xvbmUoKQoJCQkJCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkJCQkkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfY2hpbGRfcm93CgkJCQkJCS5maW5kKCdzcGFuLmNoaWxkLW5hbWUnKQoJCQkJCQkudGV4dChjaGlsZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QubmFtZSk7CgoJCQkJCSRuZXdfY29yZV9zZXJ2aWNlX25lc3RlZF9jaGlsZF9yb3cKCQkJCQkJLmZpbmQoJ2J1dHRvbi5uZXN0ZWQtY29yZS1zZXJ2aWNlLWJ1dHRvbicpCgkJCQkJCS5hdHRyKHsKCQkJCQkJCSdkYXRhLXBhcmVudC1jb3JlLXNlcnZpY2UtbmFtZSc6CgkJCQkJCQkJcGFzc2VkX3BhcmVudF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QucGFyZW50X2NvcmVfc2VydmljZV9uYW1lLAoJCQkJCQkJJ2RhdGEtY2hpbGQtY29yZS1zZXJ2aWNlLW5hbWUnOgoJCQkJCQkJCWNoaWxkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5uYW1lLAoJCQkJCQl9KTsKCgkJCQkJJG5ld19jb3JlX3NlcnZpY2VfbmVzdGVkX3BhcmVudF9yb3cKCQkJCQkJLmZpbmQoJy5jaGlsZC1zZXJ2aWNlcy1jb2wnKQoJCQkJCQkuYXBwZW5kKCRuZXdfY29yZV9zZXJ2aWNlX25lc3RlZF9jaGlsZF9yb3cpOwoJCQkJfQoJCQkpOwoJCX0KCgkJJGNvcmVfc2VydmljZXNfY29sLmFwcGVuZCgkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3Jvdyk7CgoJCXJldHVybiAkbmV3X2NvcmVfc2VydmljZV9uZXN0ZWRfcGFyZW50X3JvdzsKCX0KCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEhFTFBFUiBGVU5DVElPTlMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSU5JVElBTElaRSB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyBWYXJpYWJsZXM6CgkvLyBWYXJpYWJsZXMgPj4+IENvbnRyb2xsZXI6CgoJLy8gVmFyaWFibGVzID4+PiBET006Cgl2YXIgJGNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sID0gJChkb2N1bWVudCkuZmluZCgKCQknLmNvcmUtc2VydmljZXMuaW5mb3JtYXRpb24nCgkpOwoJdmFyICRjb3JlX3NlcnZpY2VzX3N1Yl9zZXJ2aWNlc19jb2wgPSAkKGRvY3VtZW50KS5maW5kKCcuY29sLnN1Yi1zZXJ2aWNlcycpOwoKCXZhciAkY29yZV9zZXJ2aWNlc19jb250YWluZXJfcm93ID0gJChkb2N1bWVudCkuZmluZCgKCQknI2NvcmUtc2VydmljZXMtY29udGFpbmVyJwoJKTsKCXZhciAkY29yZV9zZXJ2aWNlc19jb2wgPSAkKGRvY3VtZW50KS5maW5kKCcjY29yZS1zZXJ2aWNlcy1jb2wnKTsKCXZhciAkY29yZV9zZXJ2aWNlX3Jvd190ZW1wbGF0ZSA9ICQoZG9jdW1lbnQpLmZpbmQoCgkJJy5jb3JlLXNlcnZpY2Utcm93LnRlbXBsYXRlJwoJKTsKCXZhciAkY29yZV9zZXJ2aWNlX25lc3RlZF9wYXJlbnRfcm93X3RlbXBsYXRlID0gJChkb2N1bWVudCkuZmluZCgKCQknLmNvcmUtc2VydmljZS1wYXJlbnQtcm93LnRlbXBsYXRlJwoJKTsKCXZhciAkY29yZV9zZXJ2aWNlX25lc3RlZF9jaGlsZF9yb3dfdGVtcGxhdGUgPSAkKGRvY3VtZW50KS5maW5kKAoJCScuY29yZS1zZXJ2aWNlLWNoaWxkLXJvdy50ZW1wbGF0ZScKCSk7CgoJdmFyICRjb3JlX3NlcnZpY2VfZGV0YWlsX3Jvd190ZW1wbGF0ZSA9ICQoZG9jdW1lbnQpLmZpbmQoCgkJJy5jb3JlLXNlcnZpY2UtZGV0YWlsLXJvdy50ZW1wbGF0ZScKCSk7CgoJdmFyICRzdWJfc2VydmljZXNfY2Fyb3VzZWwgPSAkKGRvY3VtZW50KS5maW5kKCcjc3ViLXNlcnZpY2VzLWNhcm91c2VsJyk7Cgl2YXIgJHN1Yl9zZXJ2aWNlX2xpX3RlbXBsYXRlID0gJHN1Yl9zZXJ2aWNlc19jYXJvdXNlbC5zaWJsaW5ncygnbGkudGVtcGxhdGUnKTsKCgkvLyBWYXJpYWJsZXMgPj4+IEN1c3RvbToKCXdpbmRvdy5hY3RpdmVfY29yZV9zZXJ2aWNlX3RpdGxlID0gJyc7CgoJLy8gU3RhdGVzOgoJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CgloeWRyYXRlRHluYW1pY0NvcHkoKTsKCgkvLyBTZXQgbWF4IHdpZHRoIGR5bmFtaWNhbGx5IG9uICRjb3JlX3NlcnZpY2VzX3N1Yl9zZXJ2aWNlc19jb2w6CglsZXQgY29yZV9zZXJ2aWNlc19pbmZvcm1hdGlvbl9jb2xfd2lkdGggPQoJCSRjb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbC5vdXRlcldpZHRoKHRydWUpOwoKCWxldCAkY29yZV9zZXJ2aWNlc19pbmZvcm1hdGlvbl9jb2xfcGFyZW50X3JvdyA9CgkJJGNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sLnBhcmVudCgnLnJvdycpOwoJbGV0IGNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sX3BhcmVudF9yb3dfd2lkdGggPQoJCSRjb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF9wYXJlbnRfcm93Lm91dGVyV2lkdGgodHJ1ZSk7CgoJbGV0IGNvcmVfc2VydmljZXNfc3ViX3NlcnZpY2VzX2NvbF93aWR0aCA9CgkJTnVtYmVyKAoJCQljb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF9wYXJlbnRfcm93X3dpZHRoIC0KCQkJCWNvcmVfc2VydmljZXNfaW5mb3JtYXRpb25fY29sX3dpZHRoCgkJKSArICdweCc7CgkkY29yZV9zZXJ2aWNlc19zdWJfc2VydmljZXNfY29sLmNzcygKCQknd2lkdGgnLAoJCWNvcmVfc2VydmljZXNfc3ViX3NlcnZpY2VzX2NvbF93aWR0aAoJKTsKCgkvLyBQbHVnaW5zOgoJLy8KCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIElOSVRJQUxJWkUgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBFVkVOVFMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyBIYW5kbGUgYSBDTElDSyBvbiBvbmUgb2YgdGhlICRjb3JlX3NlcnZpY2VfYnV0dG9uczoKCSQoZG9jdW1lbnQpLmRlbGVnYXRlKCcuY29yZS1zZXJ2aWNlLWJ1dHRvbicsICdjbGljaycsIGZ1bmN0aW9uIChldmVudCkgewoJCS8vIERlc3Ryb3kgZXhpc3Rpbmcgd2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgU3BsaWRlIGluc3RhbmNlIGlmIGV4aXN0czoKCQlpZiAod2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgIT09IHVuZGVmaW5lZCkgewoJCQl3aW5kb3cuc3ViX3NlcnZpY2VzX2Nhcm91c2VsX3NwbGlkZS5kZXN0cm95KHRydWUpOwoJCQkkc3ViX3NlcnZpY2VzX2Nhcm91c2VsLmZpbmQoJ2xpLnNwbGlkZV9fc2xpZGUnKS5yZW1vdmUoKTsKCQl9CgoJCS8vIFJlbW92ZSBhY3RpdmUgY2xhc3MgZnJvbSBzaWJsaW5nIENvcmUgU2VydmljZSBidXR0b25zOgoJCSQoZG9jdW1lbnQpLmZpbmQoJy5jb3JlLXNlcnZpY2UtYnV0dG9uJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwoKCQkvLyBBZGQgYWN0aXZlIGNsYXNzIHRvIHRoaXMgY2xpY2tlZCBDb3JlIFNlcnZpY2UgYnV0dG9uOgoJCSQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoKCQl2YXIgY2xpY2tlZF9jb3JlX3NlcnZpY2VfdGl0bGUgPSAkKHRoaXMpLmRhdGEoJ3RpdGxlJyk7CgkJd2luZG93LmFjdGl2ZV9jb3JlX3NlcnZpY2VfdGl0bGUgPSBjbGlja2VkX2NvcmVfc2VydmljZV90aXRsZTsKCgkJbGV0IGNsaWNrZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0ID0KCQkJd2luZG93LmR5bmFtaWNfY29yZV9zZXJ2aWNlc19kaWN0aW9uYXJ5W2NsaWNrZWRfY29yZV9zZXJ2aWNlX3RpdGxlXTsKCgkJbGV0IHN1Yl9zZXJ2aWNlX2NvdW50ID0KCQkJY2xpY2tlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3RbJ3N1Yl9zZXJ2aWNlc19hcnJheSddLmxlbmd0aDsKCgkJLy8gQ2hlY2sgZm9yIENvcmUgU2VydmljZXMgT05MWSAtT1ItIENvcmUgU2VydmljZXMgdy8gU3ViIFNlcnZpY2VzOgoJCXZhciBjb3JlX3NlcnZpY2VfaW5mb3JtYXRpb25fZm91bmQgPSBmYWxzZTsKCQlpZiAoCgkJCWNsaWNrZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0LmluZm9ybWF0aW9uICE9PSB1bmRlZmluZWQgJiYKCQkJY2xpY2tlZF9jb3JlX3NlcnZpY2VfaW5mb19vYmplY3QuaW5mb3JtYXRpb24gIT09ICcnCgkJKSB7CgkJCWNvcmVfc2VydmljZV9pbmZvcm1hdGlvbl9mb3VuZCA9IHRydWU7CgkJfQoKCQl2YXIgc3ViX3NlcnZpY2VzX2FycmF5X2ZvdW5kID0gZmFsc2U7CgkJaWYgKAoJCQljbGlja2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5zdWJfc2VydmljZXNfYXJyYXkgIT09IHVuZGVmaW5lZCAmJgoJCQljbGlja2VkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5zdWJfc2VydmljZXNfYXJyYXkubGVuZ3RoICE9PSAwCgkJKSB7CgkJCXN1Yl9zZXJ2aWNlc19hcnJheV9mb3VuZCA9IHRydWU7CgkJfQoKCQlpZiAoIXN1Yl9zZXJ2aWNlc19hcnJheV9mb3VuZCAmJiBjb3JlX3NlcnZpY2VfaW5mb3JtYXRpb25fZm91bmQpIHsKCQkJJChkb2N1bWVudCkKCQkJCS5maW5kKCcucm93LmNvcmUtc2VydmljZS1kZXRhaWwtcm93Om5vdCgudGVtcGxhdGUpJykKCQkJCS5ub3QoYFtuYW1lPSIke2NsaWNrZWRfY29yZV9zZXJ2aWNlX3RpdGxlfSJdYCkKCQkJCS5hZGRDbGFzcygnZC1ub25lJyk7CgoJCQkkKGRvY3VtZW50KQoJCQkJLmZpbmQoCgkJCQkJYC5yb3cuY29yZS1zZXJ2aWNlLWRldGFpbC1yb3dbbmFtZT0iJHtjbGlja2VkX2NvcmVfc2VydmljZV90aXRsZX0iXWAKCQkJCSkKCQkJCS5yZW1vdmVDbGFzcygnZC1ub25lJyk7CgkJfSBlbHNlIHsKCQkJLy8gQ29yZSBTZXJ2aWNlcyB3LyBTdWIgU2VydmljZXM6CgkJCS8vIENyZWF0ZSBET00gY2Fyb3VzZWwgaXRlbSBlbGVtZW50cyBmb3IgU3BsaWRlCgkJCSQuZWFjaCgKCQkJCWNsaWNrZWRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0WydzdWJfc2VydmljZXNfYXJyYXknXSwKCQkJCWZ1bmN0aW9uIChzdWJfc2VydmljZV9pbmRleCwgc3ViX3NlcnZpY2VfaW5mb19vYmplY3QpIHsKCQkJCQkkbmV3X2Nhcm91c2VsX2l0ZW0gPSBjcmVhdGVTdWJTZXJ2aWNlQ2Fyb3VzZWxJdGVtKAoJCQkJCQlzdWJfc2VydmljZV9pbmZvX29iamVjdAoJCQkJCSk7CgoJCQkJCSRzdWJfc2VydmljZXNfY2Fyb3VzZWwKCQkJCQkJLmZpbmQoJ3VsLnNwbGlkZV9fbGlzdCcpCgkJCQkJCS5hcHBlbmQoJG5ld19jYXJvdXNlbF9pdGVtKTsKCQkJCX0KCQkJKTsKCgkJCS8vIEluaXRpYWxpemUgYW5kIGh5ZHJhdGUgU3BsaWRlIHZhcnMgdy8gZGVmYXVsdCB2YWx1ZXM6CgkJCXZhciBtaW5fc2xpZGVfcGl4ZWxfd2lkdGggPSAyNTY7CgkJCXZhciBzcGxpZGVfcGVyX3BhZ2UgPSAzOwoJCQl2YXIgc3BsaWRlX3Blcl9tb3ZlID0gMTsKCQkJdmFyIHNwbGlkZV9hdXRvcGxheSA9IHRydWU7CgkJCXZhciBzcGxpZGVfYXJyb3dzID0gdHJ1ZTsKCQkJdmFyIHNwbGlkZV9kcmFnID0gdHJ1ZTsKCgkJCXZhciBzdWJfc2VydmljZXNfaG9yaXpvbnRhbF9tYXJnaW4gPSAzMiArIDMyOwoJCQkvLyBSdW4gTWVkaWEgUXVlcnkgdG8gY29uZmlndXJlIFNwbGlkZSB2YXJzOgoJCQlpZiAoTW9kZXJuaXpyLm1xKCdzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDEzNjlweCknKSkgewoJCQkJc3ViX3NlcnZpY2VzX2hvcml6b250YWxfbWFyZ2luID0gMjQgKyAyNDsKCQkJfQoKCQkJc3BsaWRlX3Blcl9wYWdlID0gTWF0aC5mbG9vcigKCQkJCShjb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF9wYXJlbnRfcm93X3dpZHRoIC0KCQkJCQljb3JlX3NlcnZpY2VzX2luZm9ybWF0aW9uX2NvbF93aWR0aCAtCgkJCQkJc3ViX3NlcnZpY2VzX2hvcml6b250YWxfbWFyZ2luKSAvCgkJCQkJbWluX3NsaWRlX3BpeGVsX3dpZHRoCgkJCSk7CgoJCQlpZiAoc3BsaWRlX3Blcl9wYWdlIDw9IDApIHsKCQkJCXNwbGlkZV9wZXJfcGFnZSA9IDE7CgkJCX0KCgkJCWlmIChzcGxpZGVfcGVyX3BhZ2UgPiBzdWJfc2VydmljZV9jb3VudCkgewoJCQkJc3BsaWRlX3Blcl9wYWdlID0gc3ViX3NlcnZpY2VfY291bnQ7CgkJCX0KCgkJCWlmIChzdWJfc2VydmljZV9jb3VudCA9PSAxKSB7CgkJCQlzcGxpZGVfYXV0b3BsYXkgPSBmYWxzZTsKCQkJCXNwbGlkZV9kcmFnID0gZmFsc2U7CgkJCX0KCgkJCS8vIEluaXRpYWxpemUgbmV3IFNwbGlkZSBpbnN0YW5jZToKCQkJd2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgPSBuZXcgU3BsaWRlKAoJCQkJJyNzdWItc2VydmljZXMtY2Fyb3VzZWwuc3BsaWRlJywKCQkJCXsKCQkJCQl0eXBlOiAnbG9vcCcsCgkJCQkJcGVyUGFnZTogc3BsaWRlX3Blcl9wYWdlLAoJCQkJCXBlck1vdmU6IHNwbGlkZV9wZXJfbW92ZSwKCQkJCQlzcGVlZDogMTMwMCwKCQkJCQlwYWdpbmF0aW9uOiBmYWxzZSwKCQkJCQlhdXRvcGxheTogc3BsaWRlX2F1dG9wbGF5LAoJCQkJCWludGVydmFsOiA0MDAwLAoJCQkJCXBhdXNlT25Ib3ZlcjogdHJ1ZSwKCQkJCQlwYXVzZU9uRm9jdXM6IHRydWUsCgkJCQkJYXJyb3dzOiBzcGxpZGVfYXJyb3dzLAoJCQkJCWRyYWc6IHNwbGlkZV9kcmFnLAoJCQkJfQoJCQkpLm1vdW50KCk7CgkJfQoJfSk7CgoJLy8gSGFuZGxlIGEgQ0xJQ0sgb24gb25lIG9mIHRoZSAubmVzdGVkLWNvcmUtc2VydmljZS1idXR0b24gYnV0dG9uczoKCSQoZG9jdW1lbnQpLmRlbGVnYXRlKAoJCScubmVzdGVkLWNvcmUtc2VydmljZS1idXR0b24nLAoJCSdjbGljaycsCgkJZnVuY3Rpb24gKGV2ZW50KSB7CgkJCS8vIERlc3Ryb3kgZXhpc3Rpbmcgd2luZG93LnN1Yl9zZXJ2aWNlc19jYXJvdXNlbF9zcGxpZGUgU3BsaWRlIGluc3RhbmNlIGlmIGV4aXN0czoKCQkJaWYgKHdpbmRvdy5zdWJfc2VydmljZXNfY2Fyb3VzZWxfc3BsaWRlICE9PSB1bmRlZmluZWQpIHsKCQkJCXdpbmRvdy5zdWJfc2VydmljZXNfY2Fyb3VzZWxfc3BsaWRlLmRlc3Ryb3kodHJ1ZSk7CgkJCQkkc3ViX3NlcnZpY2VzX2Nhcm91c2VsLmZpbmQoJ2xpLnNwbGlkZV9fc2xpZGUnKS5yZW1vdmUoKTsKCQkJfQoKCQkJLy8gUmVtb3ZlIGFjdGl2ZSBjbGFzcyBmcm9tIHNpYmxpbmcgQ29yZSBTZXJ2aWNlIGJ1dHRvbnM6CgkJCSQoZG9jdW1lbnQpLmZpbmQoJy5uZXN0ZWQtY29yZS1zZXJ2aWNlLWJ1dHRvbicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCgkJCS8vIEFkZCBhY3RpdmUgY2xhc3MgdG8gdGhpcyBjbGlja2VkIENvcmUgU2VydmljZSBidXR0b246CgkJCSQodGhpcykuYWRkQ2xhc3MoJ2FjdGl2ZScpOwoKCQkJY29uc3QgY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3QgPQoJCQkJd2luZG93LmR5bmFtaWNfbmVzdGVkX2NvcmVfc2VydmljZXNfYXJyYXkKCQkJCQkuZmluZCgKCQkJCQkJcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdCA9PgoJCQkJCQkJcGFyZW50X2NvcmVfc2VydmljZV9pbmZvX29iamVjdC5wYXJlbnRfY29yZV9zZXJ2aWNlX25hbWUgPT09CgkJCQkJCQkkKHRoaXMpLmRhdGEoJ3BhcmVudC1jb3JlLXNlcnZpY2UtbmFtZScpCgkJCQkJKQoJCQkJCS5jaGlsZHJlbl9jb3JlX3NlcnZpY2VzLmZpbmQoCgkJCQkJCWNoaWxkX2NvcmVfc2VydmljZV9pbmZvX29iamVjdCA9PgoJCQkJCQkJY2hpbGRfY29yZV9zZXJ2aWNlX2luZm9fb2JqZWN0Lm5hbWUgPT09CgkJCQkJCQkkKHRoaXMpLmRhdGEoJ2NoaWxkLWNvcmUtc2VydmljZS1uYW1lJykKCQkJCQkpOwoKCQkJY29uc3QgaW5mb3JtYXRpb25Gb3VuZCA9CgkJCQkhIWNoaWxkQ29yZVNlcnZpY2VJbmZvT2JqZWN0Py5pbmZvcm1hdGlvbiA/PyBmYWxzZTsKCgkJCWNvbnN0IGluZm9ybWF0aW9uQnVsbGV0c0ZvdW5kID0KCQkJCSEhY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3Q/LmluZm9ybWF0aW9uX2J1bGxldHM/Lmxlbmd0aCA/PyBmYWxzZTsKCgkJCWNvbnN0IGljb25JbWdIdG1sRm91bmQgPQoJCQkJISFjaGlsZENvcmVTZXJ2aWNlSW5mb09iamVjdD8uaWNvbl9pbWdfaHRtbCA/PyBmYWxzZTsKCgkJCWlmIChpbmZvcm1hdGlvbkZvdW5kIHx8IGluZm9ybWF0aW9uQnVsbGV0c0ZvdW5kKSB7CgkJCQl2YXIgJG5ld19zdWJfc2VydmljZV9saSA9ICRzdWJfc2VydmljZV9saV90ZW1wbGF0ZQoJCQkJCS5jbG9uZSgpCgkJCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJCQkuZmluZCgnLmNvbnRhaW5lci5zdWItc2VydmljZScpCgkJCQkJLmFkZENsYXNzKCdkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlcicpOwoKCQkJCWlmIChNb2Rlcm5penIubXEoJ3NjcmVlbiBhbmQgKG1heC13aWR0aDogNDQ0cHgpJykpIHsKCQkJCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCQkJCS5maW5kKCcuY29udGFpbmVyLnN1Yi1zZXJ2aWNlID4gLnJvdy50aXRsZScpCgkJCQkJCS5odG1sKAoJCQkJCQkJIjxkaXYgY2xhc3M9J2NvbCBwYi0zJz48ZGl2IGNsYXNzPSdyb3cnPjxkaXYgY2xhc3M9J2NvbCBmb250LWl0YWxpYyBmb250LXdlaWdodC1ub3JtYWwnPiIgKwoJCQkJCQkJCSQodGhpcykuZGF0YSgncGFyZW50LWNvcmUtc2VydmljZS1uYW1lJykgKwoJCQkJCQkJCSI6PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0ncm93Jz48ZGl2IGNsYXNzPSdjb2wnPiIgKwoJCQkJCQkJCSQodGhpcykuZGF0YSgnY2hpbGQtY29yZS1zZXJ2aWNlLW5hbWUnKSArCgkJCQkJCQkJJzwvZGl2PjwvZGl2PjwvZGl2PicKCQkJCQkJKTsKCQkJCX0gZWxzZSB7CgkJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCQkuZmluZCgnLmNvbnRhaW5lci5zdWItc2VydmljZSA+IC5yb3cudGl0bGUnKQoJCQkJCQkucmVtb3ZlKCk7CgkJCQl9CgoJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCS5maW5kKCcuY29udGFpbmVyLnN1Yi1zZXJ2aWNlID4gLnJvdy5pbmZvcm1hdGlvbicpCgkJCQkJLnJlbW92ZUNsYXNzKCdzcGxpZGUtaW5mb3JtYXRpb24tcm93Jyk7CgoJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCS5maW5kKCcuY29udGFpbmVyLnN1Yi1zZXJ2aWNlID4gLnJvdy5pbmZvcm1hdGlvbiA+IC5jb2wnKQoJCQkJCS5yZW1vdmVDbGFzcygnaC0xMDAnKQoJCQkJCS5hZGRDbGFzcygnbWF4LWhlaWdodC1maXQgbm8taHlwaGVucyBoZWlnaHQtZml0LWNvbnRlbnQnKTsKCgkJCQlpZiAoaWNvbkltZ0h0bWxGb3VuZCkgewoJCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJCQkJLmZpbmQoJy5yb3cuaWNvbiA+IC5jb2wnKQoJCQkJCQkuYWRkQ2xhc3MoJ3BiLTIwJykKCQkJCQkJLmh0bWwoY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3QuaWNvbl9pbWdfaHRtbCk7CgkJCQl9IGVsc2UgewoJCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkuZmluZCgnLnJvdy5pY29uJykucmVtb3ZlKCk7CgkJCQl9CgoJCQkJaWYgKGluZm9ybWF0aW9uRm91bmQgJiYgaW5mb3JtYXRpb25CdWxsZXRzRm91bmQpIHsKCQkJCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uIC5yb3cuaW5mb3JtYXRpb24gPiAuY29sJykKCQkJCQkJLmh0bWwoY2hpbGRDb3JlU2VydmljZUluZm9PYmplY3QuaW5mb3JtYXRpb24pOwoKCQkJCQljaGlsZENvcmVTZXJ2aWNlSW5mb09iamVjdC5pbmZvcm1hdGlvbl9idWxsZXRzLmZvckVhY2goCgkJCQkJCWluZm9ybWF0aW9uQnVsbGV0U3RyaW5nID0+IHsKCQkJCQkJCSRuZXdJbmZvcm1hdGlvbkJ1bGxldExpID0gJG5ld19zdWJfc2VydmljZV9saQoJCQkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uLWJ1bGxldHMgbGkudGVtcGxhdGUnKQoJCQkJCQkJCS5jbG9uZSgpCgkJCQkJCQkJLnJlbW92ZUNsYXNzKCd0ZW1wbGF0ZScpOwoKCQkJCQkJCSRuZXdJbmZvcm1hdGlvbkJ1bGxldExpLmh0bWwoaW5mb3JtYXRpb25CdWxsZXRTdHJpbmcpOwoKCQkJCQkJCSRuZXdfc3ViX3NlcnZpY2VfbGkKCQkJCQkJCQkuZmluZCgnLnJvdy5pbmZvcm1hdGlvbi1idWxsZXRzIHVsJykKCQkJCQkJCQkuYXBwZW5kKCRuZXdJbmZvcm1hdGlvbkJ1bGxldExpKTsKCQkJCQkJfQoJCQkJCSk7CgkJCQl9IGVsc2UgaWYgKGluZm9ybWF0aW9uRm91bmQpIHsKCQkJCQkkbmV3X3N1Yl9zZXJ2aWNlX2xpCgkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uID4gLmNvbCcpCgkJCQkJCS5odG1sKGNoaWxkQ29yZVNlcnZpY2VJbmZvT2JqZWN0LmluZm9ybWF0aW9uKTsKCQkJCX0gZWxzZSBpZiAoaW5mb3JtYXRpb25CdWxsZXRzRm91bmQpIHsKCQkJCQljaGlsZENvcmVTZXJ2aWNlSW5mb09iamVjdC5pbmZvcm1hdGlvbl9idWxsZXRzLmZvckVhY2goCgkJCQkJCWluZm9ybWF0aW9uQnVsbGV0U3RyaW5nID0+IHsKCQkJCQkJCSRuZXdJbmZvcm1hdGlvbkJ1bGxldExpID0gJHN1Yl9zZXJ2aWNlX2xpX3RlbXBsYXRlCgkJCQkJCQkJLmZpbmQoJy5yb3cuaW5mb3JtYXRpb24tYnVsbGV0cyBsaS50ZW1wbGF0ZScpCgkJCQkJCQkJLmNsb25lKCkKCQkJCQkJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCQkJCQkJJG5ld0luZm9ybWF0aW9uQnVsbGV0TGkuaHRtbChpbmZvcm1hdGlvbkJ1bGxldFN0cmluZyk7CgoJCQkJCQkJJG5ld19zdWJfc2VydmljZV9saQoJCQkJCQkJCS5maW5kKCcucm93LmluZm9ybWF0aW9uLWJ1bGxldHMgdWwnKQoJCQkJCQkJCS5hcHBlbmQoJG5ld0luZm9ybWF0aW9uQnVsbGV0TGkpOwoJCQkJCQl9CgkJCQkJKTsKCQkJCX0KCgkJCQkkc3ViX3NlcnZpY2VzX2Nhcm91c2VsCgkJCQkJLmZpbmQoJ3VsLnNwbGlkZV9fbGlzdCcpCgkJCQkJLmFwcGVuZCgkbmV3X3N1Yl9zZXJ2aWNlX2xpKTsKCgkJCQkvLyBJbml0aWFsaXplIGFuZCBoeWRyYXRlIFNwbGlkZSB2YXJzIHcvIGRlZmF1bHQgdmFsdWVzOgoJCQkJdmFyIHNwbGlkZV9wZXJfcGFnZSA9IDE7CgkJCQl2YXIgc3BsaWRlX3Blcl9tb3ZlID0gMTsKCQkJCXZhciBzcGxpZGVfYXV0b3BsYXkgPSBmYWxzZTsKCQkJCXZhciBzcGxpZGVfYXJyb3dzID0gZmFsc2U7CgkJCQl2YXIgc3BsaWRlX2RyYWcgPSBmYWxzZTsKCgkJCQkvLyBJbml0aWFsaXplIG5ldyBTcGxpZGUgaW5zdGFuY2U6CgkJCQl3aW5kb3cuc3ViX3NlcnZpY2VzX2Nhcm91c2VsX3NwbGlkZSA9IG5ldyBTcGxpZGUoCgkJCQkJJyNzdWItc2VydmljZXMtY2Fyb3VzZWwuc3BsaWRlJywKCQkJCQl7CgkJCQkJCXR5cGU6ICdsb29wJywKCQkJCQkJcGVyUGFnZTogc3BsaWRlX3Blcl9wYWdlLAoJCQkJCQlwZXJNb3ZlOiBzcGxpZGVfcGVyX21vdmUsCgkJCQkJCXNwZWVkOiAxMzAwLAoJCQkJCQlwYWdpbmF0aW9uOiBmYWxzZSwKCQkJCQkJYXV0b3BsYXk6IHNwbGlkZV9hdXRvcGxheSwKCQkJCQkJaW50ZXJ2YWw6IDQwMDAsCgkJCQkJCXBhdXNlT25Ib3ZlcjogdHJ1ZSwKCQkJCQkJcGF1c2VPbkZvY3VzOiB0cnVlLAoJCQkJCQlhcnJvd3M6IHNwbGlkZV9hcnJvd3MsCgkJCQkJCWRyYWc6IHNwbGlkZV9kcmFnLAoJCQkJCX0KCQkJCSkubW91bnQoKTsKCQkJfQoJCX0KCSk7CgoJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVWRU5UUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KfSk7Cg=="></script> <div class="row block-seperator border-top-green"></div><div id="case-studies-container" class="row justify-content-center min-height-page-block"><div class="col case-studies-link-container"><div class="row h-100 justify-content-end"><div class="col max-width-half-outer-horizontal-bounds"><div class="row h-100 w-100 align-items-center"><div class="col max-width-fit-content center-aligned-right-padding"><div class="row mb-20 pt-30 header"><div class="col"><h3>Case Studies</h3></div></div><div class="row mb-40 links"><div id="case-studies-col" class="col"><div class="row mb-20 case-study-row template"><div class="col"> <button type="button" class="case-study-link trigger-link" data-copy=""><div class="container"><div class="row w-100 flex-nowrap"><div class="col pr-10 all-width-fit-content d-flex indicator"> <i class="fa line-height-fcsi-1 fa-angle-double-right" aria-hidden="true"></i></div><div class="col text-left underline-on-hover link"></div></div></div> </button></div></div></div></div></div></div></div></div></div><div class="col position-relative case-studies-image-container background-image-zoom-on-hover-parent"><div id="case-studies-image" role="img" aria-label="Case Studies Image" class="row background-image-zoom-on-hover-child"></div><div id="case-studies-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div><div id="case-studies-copy-parent" class="row h-100 pass-through-pointer-events"><div class="col max-width-half-outer-horizontal-bounds"><div class="row min-height-100pct align-items-center case-studies-image-copy"><div class="col pr-0 pt-40 pb-40 center-aligned-left-padding h-100 d-flex align-items-center justify-content-center"><div class="container p-10 position-relative"><div class="row position-absolute-stretch-to-fill background-white"></div><div class="row w-100 top-quote-icon"><div class="col"> <i class="fa fa-quote-left font-size-20" aria-hidden="true"></i></div></div><div class="row w-100"><div id="case-studies-image-copy" class="col py-10 px-30 no-hyphens"><div class="row copy"><div class="col"></div></div><div class="row bullets"><div class="col"><ul class="mr-0 mb-0 ml-20"><li class="template mt-10"></li></ul></div></div></div></div><div class="row w-100 bottom-quote-icon"><div class="col d-flex justify-content-end"> <i class="fa fa-quote-right font-size-20" aria-hidden="true"></i></div></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7CgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CglmdW5jdGlvbiBoeWRyYXRlRHluYW1pY0NvcHkoKSB7CgkJJChkb2N1bWVudCkKCQkJLmZpbmQoJyNjYXNlLXN0dWRpZXMtaW1hZ2UnKQoJCQkuYXR0cigKCQkJCSdzdHlsZScsCgkJCQkiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciICsKCQkJCQl3aW5kb3cuZHluYW1pY19jYXNlX3N0dWRpZXNfaW1hZ2VfdXJsICsKCQkJCQkiJyk7IgoJCQkpOwoKCQlsZXQgY2FzZV9zdHVkeV9pbmRleCA9IDA7CgkJbGV0ICRmaXJzdF9jYXNlX3N0dWR5X3JvdyA9IHVuZGVmaW5lZDsKCQkkLmVhY2goCgkJCXdpbmRvdy5keW5hbWljX2Nhc2Vfc3R1ZGllc19kaWN0aW9uYXJ5LAoJCQlmdW5jdGlvbiAoY2FzZV9zdHVkeV9uYW1lLCBjYXNlX3N0dWR5X2luZm9fb2JqZWN0KSB7CgkJCQkkbmV3X2Nhc2Vfc3R1ZHlfcm93ID0gY3JlYXRlQ2FzZVN0dWR5Um93KAoJCQkJCWNhc2Vfc3R1ZHlfbmFtZSwKCQkJCQljYXNlX3N0dWR5X2luZm9fb2JqZWN0CgkJCQkpOwoKCQkJCWlmIChjYXNlX3N0dWR5X2luZGV4ID09PSAwKSB7CgkJCQkJJGZpcnN0X2Nhc2Vfc3R1ZHlfcm93ID0gJG5ld19jYXNlX3N0dWR5X3JvdzsKCQkJCX0KCgkJCQljYXNlX3N0dWR5X2luZGV4ICs9IDE7CgkJCX0KCQkpOwoKCQkvLyBTdGF0ZXMgZm9yIGluaXRpYWwgc2VsZWN0aW9uIG9mIGJ1dHRvbnM6CgkJc2V0VGltZW91dCgoKSA9PiB7CgkJCSRmaXJzdF9jYXNlX3N0dWR5X3Jvdy5maW5kKCcuY2FzZS1zdHVkeS1saW5rJykuY2xpY2soKTsKCQl9LCAxKTsKCX0KCgkvLyBDcmVhdGUgbmV3IGNhc2Ugc3R1ZHkgcm93OgoJZnVuY3Rpb24gY3JlYXRlQ2FzZVN0dWR5Um93KAoJCXBhc3NlZF9jYXNlX3N0dWR5X25hbWUsCgkJcGFzc2VkX2Nhc2Vfc3R1ZHlfaW5mb19vYmplY3QKCSkgewoJCWxldCBjYXNlX3N0dWR5X2NvcHkgPSBwYXNzZWRfY2FzZV9zdHVkeV9pbmZvX29iamVjdC5jb3B5OwoKCQl2YXIgJG5ld19jYXNlX3N0dWR5X3JvdyA9ICRjYXNlX3N0dWR5X3Jvd190ZW1wbGF0ZQoJCQkuY2xvbmUoKQoJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCSRuZXdfY2FzZV9zdHVkeV9yb3cKCQkJLmZpbmQoJ2J1dHRvbi5jYXNlLXN0dWR5LWxpbmsnKQoJCQkuYXR0cignZGF0YS1jb3B5JywgY2FzZV9zdHVkeV9jb3B5KTsKCgkJJG5ld19jYXNlX3N0dWR5X3Jvdy5maW5kKCcuY29sLmxpbmsnKS50ZXh0KHBhc3NlZF9jYXNlX3N0dWR5X25hbWUpOwoKCQkkY2FzZV9zdHVkaWVzX2NvbC5hcHBlbmQoJG5ld19jYXNlX3N0dWR5X3Jvdyk7CgoJCXJldHVybiAkbmV3X2Nhc2Vfc3R1ZHlfcm93OwoJfQoKCS8vIFNlYXJjaCBmb3IgYW4gb2JqZWN0IGluIGFuIGFycmF5IGJhc2VkIG9uIGEga2V5LXZhbHVlIHBhaXI6CglmdW5jdGlvbiBnZXRPYmplY3RCeUtleVZhbHVlKGFycmF5LCBrZXksIHZhbHVlKSB7CgkJcmV0dXJuIGFycmF5LmZpbmQoaXRlbSA9PiBpdGVtW2tleV0gPT09IHZhbHVlKTsKCX0KCgkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEhFTFBFUiBGVU5DVElPTlMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSU5JVElBTElaRSB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkvLyBWYXJpYWJsZXM6CgkvLyBDb250cm9sbGVyOgoKCS8vIERPTToKCSRjYXNlX3N0dWRpZXNfY29sID0gJChkb2N1bWVudCkuZmluZCgnI2Nhc2Utc3R1ZGllcy1jb2wnKTsKCSRjYXNlX3N0dWR5X3Jvd190ZW1wbGF0ZSA9ICQoZG9jdW1lbnQpLmZpbmQoJy5jYXNlLXN0dWR5LXJvdy50ZW1wbGF0ZScpOwoKCS8vIEN1c3RvbToKCgkvLyBTdGF0ZXM6CgkvLyBIeWRyYXRlIGR5bmFtaWMgY29weToKCWh5ZHJhdGVEeW5hbWljQ29weSgpOwoKCS8vIFBsdWdpbnM6CgkvLwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVWRU5UUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCS8vIEhhbmRsZSBhIENMSUNLIG9uIG9uZSBvZiB0aGUgJGNhc2Vfc3R1ZHlfbGlua19lbGVtZW50czoKCSQoZG9jdW1lbnQpLmRlbGVnYXRlKCcuY2FzZS1zdHVkeS1saW5rJywgJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7CgkJLy8gUmVzZXQgc3RhdGU6CgkJJChkb2N1bWVudCkuZmluZCgnI2Nhc2Utc3R1ZGllcy1pbWFnZS1jb3B5IC5yb3cuY29weSA+IC5jb2wnKS5odG1sKCcnKTsKCQkkKGRvY3VtZW50KQoJCQkuZmluZCgnI2Nhc2Utc3R1ZGllcy1pbWFnZS1jb3B5IC5yb3cuYnVsbGV0cyB1bCBsaTpub3QoLnRlbXBsYXRlKScpCgkJCS5yZW1vdmUoKTsKCgkJJChkb2N1bWVudCkuZmluZCgnLmNhc2Utc3R1ZHktbGluaycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKCgkJJCh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7CgoJCXZhciBjYXNlU3R1ZGllc0luZm9PYmplY3QgPQoJCQl3aW5kb3cuZHluYW1pY19jYXNlX3N0dWRpZXNfZGljdGlvbmFyeVskKHRoaXMpLmZpbmQoJy5jb2wubGluaycpLnRleHQoKV07CgkJY29uc29sZS5sb2coJ2Nhc2VTdHVkaWVzSW5mb09iamVjdCcsIGNhc2VTdHVkaWVzSW5mb09iamVjdCk7CgoJCSQoZG9jdW1lbnQpCgkJCS5maW5kKCcjY2FzZS1zdHVkaWVzLWltYWdlLWNvcHkgLnJvdy5jb3B5ID4gLmNvbCcpCgkJCS5odG1sKCQodGhpcykuZGF0YSgnY29weScpKTsKCgkJY29uc3QgYnVsbGV0c0ZvdW5kID0gISFjYXNlU3R1ZGllc0luZm9PYmplY3Q/LmJ1bGxldHM/Lmxlbmd0aDsKCQlpZiAoYnVsbGV0c0ZvdW5kKSB7CgkJCWNvbnNvbGUubG9nKCdidWxsZXRzRm91bmQnLCBidWxsZXRzRm91bmQpOwoKCQkJY2FzZVN0dWRpZXNJbmZvT2JqZWN0Py5idWxsZXRzLmZvckVhY2goYnVsbGV0U3RyaW5nID0+IHsKCQkJCXZhciAkbmV3X2J1bGxldF9saSA9ICQoZG9jdW1lbnQpCgkJCQkJLmZpbmQoJyNjYXNlLXN0dWRpZXMtaW1hZ2UtY29weSBsaS50ZW1wbGF0ZScpCgkJCQkJLmNsb25lKCkKCQkJCQkucmVtb3ZlQ2xhc3MoJ3RlbXBsYXRlJyk7CgoJCQkJJG5ld19idWxsZXRfbGkuaHRtbChidWxsZXRTdHJpbmcpOwoKCQkJCSQoZG9jdW1lbnQpLmZpbmQoJyNjYXNlLXN0dWRpZXMtaW1hZ2UtY29weSB1bCcpLmFwcGVuZCgkbmV3X2J1bGxldF9saSk7CgkJCX0pOwoJCX0KCX0pOwoKCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBFVkVOVFMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCn0pOwo="></script> <div class="row block-seperator border-top-green"></div><div id="other-documents-container" class="row height-page-block justify-content-center"><div class="col image background-image-zoom-on-hover-parent"><div id="other-documents-image" role="img" aria-label="Other Documents Image" class="row background-image-zoom-on-hover-child"></div><div id="other-documents-image-gradient-mask" class="row position-absolute-stretch-to-fill pass-through-pointer-events"></div></div><div class="col copy"><div class="row h-100"><div class="col max-width-half-outer-horizontal-bounds"><div class="container center-aligned-left-padding h-100"><div class="row h-100 d-flex align-items-center"><div class="col"><div class="row mb-25 header"><div class="col"><h3 class="header">Overview Documents</h3></div></div><div class="row body"><div class="col d-flex align-items-center"><div class="container p-0"><div class="row mb-40 links"><div id="document-links-col" class="col"><div class="row pb-20 document-link-row template"><div class="col link"> <a href="" target="_blank" rel="noopener" download="" class="color-fcsi-primary-blue underline-on-hover"><div class="container p-0"><div class="row"><div class="col icon"> <i class="fa fa-download" aria-hidden="true"></i></div><div class="col text truncate-single-line-with-ellipses"> <span class="document-name"></span></div></div></div> </a></div></div></div></div><div class="row contact-info"><div class="col"><div class="row mb-10 header"><div class="col contact-header"><h5><span id="dynamic-contact-header-name"></span></h5></div></div><div class="row mb-10 person-name-and-title"><div class="col"> <span id="dynamic-contact-person-name"></span>&nbsp;-&nbsp;<i><span id="dynamic-contact-person-title"></span></i></div></div><div class="row mb-10 person-email-link"><div class="col"> <a class="color-fcsi-primary-blue" href="mailto:mark_gigliotti@fletchercsi.com"><span id="dynamic-contact-person-email"></span></a></div></div><div class="row person-phone-number"><div class="col"><span id="dynamic-contact-person-phone"></span></div></div></div></div></div></div></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CglqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCQpIHsKCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEhFTFBFUiBGVU5DVElPTlMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWZ1bmN0aW9uIGh5ZHJhdGVEeW5hbWljQ29weSgpIHsKCQkJLy8gT3ZlcnZpZXcgRG9jdW1lbnRzOgoJCQkkKGRvY3VtZW50KS5maW5kKCcjb3RoZXItZG9jdW1lbnRzLWltYWdlJykuYXR0cignc3R5bGUnLCAiYmFja2dyb3VuZC1pbWFnZTogdXJsKCciICsgd2luZG93LmR5bmFtaWNfb3ZlcnZpZXdfZG9jdW1lbnRzX2ltYWdlX3VybCArICInKTsiKQoKCQkJJC5lYWNoKAoJCQkJd2luZG93LmR5bmFtaWNfb3ZlcnZpZXdfZG9jdW1lbnRzX2RpY3Rpb25hcnksCgkJCQlmdW5jdGlvbihvdmVydmlld19kb2N1bWVudF9uYW1lLCBvdmVydmlld19kb2N1bWVudF9pbmZvX29iamVjdCkgewoJCQkJCSRuZXdfb3ZlcnZpZXdfZG9jdW1lbnRfcm93ID0gY3JlYXRlT3ZlcnZpZXdEb2N1bWVudFJvdyhvdmVydmlld19kb2N1bWVudF9uYW1lLCBvdmVydmlld19kb2N1bWVudF9pbmZvX29iamVjdFsnbGluayddKTsKCQkJCX0KCQkJKTsKCgkJCS8vIENvbnRhY3QgSW5mb3JtYXRpb246CgkJCSQoZG9jdW1lbnQpLmZpbmQoJ3NwYW4jZHluYW1pYy1jb250YWN0LWhlYWRlci1uYW1lJykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX3BhZ2VfdGl0bGUgKyAiIENvbnRhY3QiKTsKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLWNvbnRhY3QtcGVyc29uLW5hbWUnKQoJCQkJLnRleHQod2luZG93LmR5bmFtaWNfY29udGFjdF9wZXJzb25fZGljdGlvbmFyeVsnbmFtZSddKTsKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLWNvbnRhY3QtcGVyc29uLXRpdGxlJykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2NvbnRhY3RfcGVyc29uX2RpY3Rpb25hcnlbJ3RpdGxlJ10pOwoJCQkkKGRvY3VtZW50KS5maW5kKCcucGVyc29uLWVtYWlsLWxpbmsnKQoJCQkJLmF0dHIoJ2hyZWYnLCAibWFpbHRvOiIgKyB3aW5kb3cuZHluYW1pY19jb250YWN0X3BlcnNvbl9kaWN0aW9uYXJ5WydlbWFpbCddKTsKCQkJJChkb2N1bWVudCkuZmluZCgnc3BhbiNkeW5hbWljLWNvbnRhY3QtcGVyc29uLWVtYWlsJykKCQkJCS50ZXh0KHdpbmRvdy5keW5hbWljX2NvbnRhY3RfcGVyc29uX2RpY3Rpb25hcnlbJ2VtYWlsJ10pOwoJCQkkKGRvY3VtZW50KS5maW5kKCdzcGFuI2R5bmFtaWMtY29udGFjdC1wZXJzb24tcGhvbmUnKQoJCQkJLnRleHQod2luZG93LmR5bmFtaWNfY29udGFjdF9wZXJzb25fZGljdGlvbmFyeVsncGhvbmUnXSk7CgkJfQoKCQkvLyBDcmVhdGUgbmV3IG92ZXJ2aWV3IGRvY3VtZW50IHJvdzoKCQlmdW5jdGlvbiBjcmVhdGVPdmVydmlld0RvY3VtZW50Um93KHBhc3NlZF9vdmVydmlld19kb2N1bWVudF9uYW1lLCBwYXNzZWRfb3ZlcnZpZXdfZG9jdW1lbnRfbGluaykgewoJCQl2YXIgJG5ld19vdmVydmlld19kb2N1bWVudF9yb3cgPSAkZG9jdW1lbnRfbGlua19yb3dfdGVtcGxhdGUuY2xvbmUoKQoJCQkJLnJlbW92ZUNsYXNzKCJ0ZW1wbGF0ZSIpOwoKCQkJJG5ld19vdmVydmlld19kb2N1bWVudF9yb3cuZmluZCgnYScpCgkJCQkuYXR0cignaHJlZicsIHBhc3NlZF9vdmVydmlld19kb2N1bWVudF9saW5rKTsKCQkJJG5ld19vdmVydmlld19kb2N1bWVudF9yb3cuZmluZCgnLmNvbC50ZXh0JykKCQkJCS50ZXh0KHBhc3NlZF9vdmVydmlld19kb2N1bWVudF9uYW1lKTsKCgkJCSRkb2N1bWVudF9saW5rc19jb2wuYXBwZW5kKCRuZXdfb3ZlcnZpZXdfZG9jdW1lbnRfcm93KTsKCgkJCXJldHVybiAkbmV3X292ZXJ2aWV3X2RvY3VtZW50X3JvdzsKCQl9CgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSEVMUEVSIEZVTkNUSU9OUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHYgSU5JVElBTElaRSB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkJLy8gVmFyaWFibGVzOgoJCS8vIENvbnRyb2xsZXI6CgoKCQkvLyBET006CgkJJGRvY3VtZW50X2xpbmtzX2NvbCA9ICQoZG9jdW1lbnQpLmZpbmQoJyNkb2N1bWVudC1saW5rcy1jb2wnKTsKCQkkZG9jdW1lbnRfbGlua19yb3dfdGVtcGxhdGUgPSAkKGRvY3VtZW50KS5maW5kKCcuZG9jdW1lbnQtbGluay1yb3cudGVtcGxhdGUnKTsKCgkJLy8gQ3VzdG9tOgoKCgkJLy8gU3RhdGVzOgoJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCWh5ZHJhdGVEeW5hbWljQ29weSgpOwoKCQkvLyBQbHVnaW5zOgoJCS8vIAoKCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBJTklUSUFMSVpFIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVWRU5UUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkvLyAKCgoJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBFVkVOVFMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgl9KTsK"></script> <div class="row block-seperator border-top-green"></div></div> <script defer src="data:text/javascript;base64,CgkJCQkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewoJCQkJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBIRUxQRVIgRlVOQ1RJT05TIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCQkJCS8vIEh5ZHJhdGUgZHluYW1pYyBjb3B5OgoJCQkJCQkJZnVuY3Rpb24gaHlkcmF0ZUR5bmFtaWNDb3B5KCkgewoJCQkJCQkJCS8vIEVudHJ5IENvbnRlbnQ6CgkJCQkJCQkJJChkb2N1bWVudCkuZmluZCgnLnBhZ2UtY29udGFpbmVyJykKCQkJCQkJCQkJLmF0dHIoJ2lkJywgY29udmVydFRvS2ViYWJDYXNlKHdpbmRvdy5keW5hbWljX3BhZ2VfdGl0bGUpICsgIi1jb250YWluZXIiKTsKCQkJCQkJCX0KCgkJCQkJCQkvLyBDb252ZXJ0IGEgc3RyaW5nIHRvICdrZWJhYi1jYXNlJzoKCQkJCQkJCWZ1bmN0aW9uIGNvbnZlcnRUb0tlYmFiQ2FzZShwYXNzZWRfc3RyaW5nKSB7CgkJCQkJCQkJbGV0IGNvbnZlcnRlZF9zdHJpbmcgPSBwYXNzZWRfc3RyaW5nLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICIkMS0kMiIpCgkJCQkJCQkJCS5yZXBsYWNlKC9bXHNfXSsvZywgJy0nKQoJCQkJCQkJCQkudG9Mb3dlckNhc2UoKTsKCgkJCQkJCQkJcmV0dXJuIGNvbnZlcnRlZF9zdHJpbmc7CgkJCQkJCQl9CgoJCQkJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBIRUxQRVIgRlVOQ1RJT05TIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJCQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCQkJCQkJLy8gVmFyaWFibGVzOgoJCQkJCQkJLy8gRE9NOgoKCgkJCQkJCQkvLyBDdXN0b206CgoJCQkJCQkJLy8gU3RhdGVzOgoJCQkJCQkJLy8gSHlkcmF0ZSBkeW5hbWljIGNvcHk6CgkJCQkJCQloeWRyYXRlRHluYW1pY0NvcHkoKTsKCgkJCQkJCQkvLyBQbHVnaW5zOgoJCQkJCQkJLy8KCgkJCQkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIElOSVRJQUxJWkUgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoKCQkJCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBFVkVOVFMgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoKCQkJCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBFVkVOVFMgXiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgkJCQkJCX0pOwoJCQkJCQ=="></script> </div><footer class="entry-footer"><p class="entry-meta"></p></footer></div></article></main> <script defer src="data:text/javascript;base64,CgkJCQkJCS8qIQ0KICAqIEJvb3RzdHJhcCB2NC4xLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pDQogICogQ29weXJpZ2h0IDIwMTEtMjAxOCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKQ0KICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpDQogICovDQohZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP2UoZXhwb3J0cyxyZXF1aXJlKCJqcXVlcnkiKSxyZXF1aXJlKCJwb3BwZXIuanMiKSk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIiwianF1ZXJ5IiwicG9wcGVyLmpzIl0sZSk6ZSh0LmJvb3RzdHJhcD17fSx0LmpRdWVyeSx0LlBvcHBlcil9KHRoaXMsZnVuY3Rpb24odCxlLGgpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLmtleSxpKX19ZnVuY3Rpb24gcyh0LGUsbil7cmV0dXJuIGUmJmkodC5wcm90b3R5cGUsZSksbiYmaSh0LG4pLHR9ZnVuY3Rpb24gbChyKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbz1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9LGU9T2JqZWN0LmtleXMobyk7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihlPWUuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobykuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sdCkuZW51bWVyYWJsZX0pKSksZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLG4saTtlPXIsaT1vW249dF0sbiBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4se3ZhbHVlOmksZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW25dPWl9KX1yZXR1cm4gcn1lPWUmJmUuaGFzT3duUHJvcGVydHkoImRlZmF1bHQiKT9lLmRlZmF1bHQ6ZSxoPWgmJmguaGFzT3duUHJvcGVydHkoImRlZmF1bHQiKT9oLmRlZmF1bHQ6aDt2YXIgcixuLG8sYSxjLHUsZixkLGcsXyxtLHAsdix5LEUsQyxULGIsUyxJLEEsRCx3LE4sTyxrLFAsaixILEwsUix4LFcsVSxxLEYsSyxNLFEsQixWLFkseixKLFosRywkLFgsdHQsZXQsbnQsaXQscnQsb3Qsc3QsYXQsbHQsY3QsaHQsdXQsZnQsZHQsZ3QsX3QsbXQscHQsdnQseXQsRXQsQ3QsVHQsYnQsU3QsSXQsQXQsRHQsd3QsTnQsT3Qsa3QsUHQsanQsSHQsTHQsUnQseHQsV3QsVXQscXQsRnQsS3QsTXQsUXQsQnQsVnQsWXQsenQsSnQsWnQsR3QsJHQsWHQsdGUsZWUsbmUsaWUscmUsb2Usc2UsYWUsbGUsY2UsaGUsdWUsZmUsZGUsZ2UsX2UsbWUscGUsdmUseWUsRWUsQ2UsVGUsYmUsU2UsSWUsQWUsRGUsd2UsTmUsT2Usa2UsUGUsamUsSGUsTGUsUmUseGUsV2UsVWUscWUsRmUsS2UsTWUsUWUsQmUsVmUsWWUsemUsSmUsWmUsR2UsJGUsWGUsdG4sZW4sbm4scm4sb24sc24sYW4sbG4sY24saG4sdW4sZm4sZG4sZ24sX24sbW4scG4sdm4seW4sRW4sQ24sVG4sYm4sU24sSW4sQW4sRG4sd24sTm4sT24sa24sUG4sam4sSG4sTG4sUm4seG4sV24sVW4scW4sRm49ZnVuY3Rpb24oaSl7dmFyIGU9InRyYW5zaXRpb25lbmQiO2Z1bmN0aW9uIHQodCl7dmFyIGU9dGhpcyxuPSExO3JldHVybiBpKHRoaXMpLm9uZShsLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKCl7bj0hMH0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtufHxsLnRyaWdnZXJUcmFuc2l0aW9uRW5kKGUpfSx0KSx0aGlzfXZhciBsPXtUUkFOU0lUSU9OX0VORDoiYnNUcmFuc2l0aW9uRW5kIixnZXRVSUQ6ZnVuY3Rpb24odCl7Zm9yKDt0Kz1+figxZTYqTWF0aC5yYW5kb20oKSksZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCk7KTtyZXR1cm4gdH0sZ2V0U2VsZWN0b3JGcm9tRWxlbWVudDpmdW5jdGlvbih0KXt2YXIgZT10LmdldEF0dHJpYnV0ZSgiZGF0YS10YXJnZXQiKTtlJiYiIyIhPT1lfHwoZT10LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIik7dHJ5e3JldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpP2U6bnVsbH1jYXRjaCh0KXtyZXR1cm4gbnVsbH19LGdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50OmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiAwO3ZhciBlPWkodCkuY3NzKCJ0cmFuc2l0aW9uLWR1cmF0aW9uIik7cmV0dXJuIHBhcnNlRmxvYXQoZSk/KGU9ZS5zcGxpdCgiLCIpWzBdLDFlMypwYXJzZUZsb2F0KGUpKTowfSxyZWZsb3c6ZnVuY3Rpb24odCl7cmV0dXJuIHQub2Zmc2V0SGVpZ2h0fSx0cmlnZ2VyVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXtpKHQpLnRyaWdnZXIoZSl9LHN1cHBvcnRzVHJhbnNpdGlvbkVuZDpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKGUpfSxpc0VsZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJuKHRbMF18fHQpLm5vZGVUeXBlfSx0eXBlQ2hlY2tDb25maWc6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSBpbiBuKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGkpKXt2YXIgcj1uW2ldLG89ZVtpXSxzPW8mJmwuaXNFbGVtZW50KG8pPyJlbGVtZW50IjooYT1vLHt9LnRvU3RyaW5nLmNhbGwoYSkubWF0Y2goL1xzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKSk7aWYoIW5ldyBSZWdFeHAocikudGVzdChzKSl0aHJvdyBuZXcgRXJyb3IodC50b1VwcGVyQ2FzZSgpKyc6IE9wdGlvbiAiJytpKyciIHByb3ZpZGVkIHR5cGUgIicrcysnIiBidXQgZXhwZWN0ZWQgdHlwZSAiJytyKyciLicpfXZhciBhfX07cmV0dXJuIGkuZm4uZW11bGF0ZVRyYW5zaXRpb25FbmQ9dCxpLmV2ZW50LnNwZWNpYWxbbC5UUkFOU0lUSU9OX0VORF09e2JpbmRUeXBlOmUsZGVsZWdhdGVUeXBlOmUsaGFuZGxlOmZ1bmN0aW9uKHQpe2lmKGkodC50YXJnZXQpLmlzKHRoaXMpKXJldHVybiB0LmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LGx9KGUpLEtuPShuPSJhbGVydCIsYT0iLiIrKG89ImJzLmFsZXJ0IiksYz0ocj1lKS5mbltuXSx1PXtDTE9TRToiY2xvc2UiK2EsQ0xPU0VEOiJjbG9zZWQiK2EsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIithKyIuZGF0YS1hcGkifSxmPSJhbGVydCIsZD0iZmFkZSIsZz0ic2hvdyIsXz1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCl7dGhpcy5fZWxlbWVudD10fXZhciB0PWkucHJvdG90eXBlO3JldHVybiB0LmNsb3NlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2VsZW1lbnQ7dCYmKGU9dGhpcy5fZ2V0Um9vdEVsZW1lbnQodCkpLHRoaXMuX3RyaWdnZXJDbG9zZUV2ZW50KGUpLmlzRGVmYXVsdFByZXZlbnRlZCgpfHx0aGlzLl9yZW1vdmVFbGVtZW50KGUpfSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtyLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxvKSx0aGlzLl9lbGVtZW50PW51bGx9LHQuX2dldFJvb3RFbGVtZW50PWZ1bmN0aW9uKHQpe3ZhciBlPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodCksbj0hMTtyZXR1cm4gZSYmKG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKSksbnx8KG49cih0KS5jbG9zZXN0KCIuIitmKVswXSksbn0sdC5fdHJpZ2dlckNsb3NlRXZlbnQ9ZnVuY3Rpb24odCl7dmFyIGU9ci5FdmVudCh1LkNMT1NFKTtyZXR1cm4gcih0KS50cmlnZ2VyKGUpLGV9LHQuX3JlbW92ZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztpZihyKGUpLnJlbW92ZUNsYXNzKGcpLHIoZSkuaGFzQ2xhc3MoZCkpe3ZhciB0PUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KGUpO3IoZSkub25lKEZuLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKHQpe3JldHVybiBuLl9kZXN0cm95RWxlbWVudChlLHQpfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQodCl9ZWxzZSB0aGlzLl9kZXN0cm95RWxlbWVudChlKX0sdC5fZGVzdHJveUVsZW1lbnQ9ZnVuY3Rpb24odCl7cih0KS5kZXRhY2goKS50cmlnZ2VyKHUuQ0xPU0VEKS5yZW1vdmUoKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1yKHRoaXMpLGU9dC5kYXRhKG8pO2V8fChlPW5ldyBpKHRoaXMpLHQuZGF0YShvLGUpKSwiY2xvc2UiPT09biYmZVtuXSh0aGlzKX0pfSxpLl9oYW5kbGVEaXNtaXNzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt0JiZ0LnByZXZlbnREZWZhdWx0KCksZS5jbG9zZSh0aGlzKX19LHMoaSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX1dKSxpfSgpLHIoZG9jdW1lbnQpLm9uKHUuQ0xJQ0tfREFUQV9BUEksJ1tkYXRhLWRpc21pc3M9ImFsZXJ0Il0nLF8uX2hhbmRsZURpc21pc3MobmV3IF8pKSxyLmZuW25dPV8uX2pRdWVyeUludGVyZmFjZSxyLmZuW25dLkNvbnN0cnVjdG9yPV8sci5mbltuXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHIuZm5bbl09YyxfLl9qUXVlcnlJbnRlcmZhY2V9LF8pLE1uPShwPSJidXR0b24iLHk9Ii4iKyh2PSJicy5idXR0b24iKSxFPSIuZGF0YS1hcGkiLEM9KG09ZSkuZm5bcF0sVD0iYWN0aXZlIixiPSJidG4iLEk9J1tkYXRhLXRvZ2dsZV49ImJ1dHRvbiJdJyxBPSdbZGF0YS10b2dnbGU9ImJ1dHRvbnMiXScsRD0iaW5wdXQiLHc9Ii5hY3RpdmUiLE49Ii5idG4iLE89e0NMSUNLX0RBVEFfQVBJOiJjbGljayIreStFLEZPQ1VTX0JMVVJfREFUQV9BUEk6KFM9ImZvY3VzIikreStFKyIgYmx1ciIreStFfSxrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0aGlzLl9lbGVtZW50PXR9dmFyIHQ9bi5wcm90b3R5cGU7cmV0dXJuIHQudG9nZ2xlPWZ1bmN0aW9uKCl7dmFyIHQ9ITAsZT0hMCxuPW0odGhpcy5fZWxlbWVudCkuY2xvc2VzdChBKVswXTtpZihuKXt2YXIgaT10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoRCk7aWYoaSl7aWYoInJhZGlvIj09PWkudHlwZSlpZihpLmNoZWNrZWQmJnRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFQpKXQ9ITE7ZWxzZXt2YXIgcj1uLnF1ZXJ5U2VsZWN0b3Iodyk7ciYmbShyKS5yZW1vdmVDbGFzcyhUKX1pZih0KXtpZihpLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8bi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fGkuY2xhc3NMaXN0LmNvbnRhaW5zKCJkaXNhYmxlZCIpfHxuLmNsYXNzTGlzdC5jb250YWlucygiZGlzYWJsZWQiKSlyZXR1cm47aS5jaGVja2VkPSF0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhUKSxtKGkpLnRyaWdnZXIoImNoYW5nZSIpfWkuZm9jdXMoKSxlPSExfX1lJiZ0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwhdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoVCkpLHQmJm0odGhpcy5fZWxlbWVudCkudG9nZ2xlQ2xhc3MoVCl9LHQuZGlzcG9zZT1mdW5jdGlvbigpe20ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LHYpLHRoaXMuX2VsZW1lbnQ9bnVsbH0sbi5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1tKHRoaXMpLmRhdGEodik7dHx8KHQ9bmV3IG4odGhpcyksbSh0aGlzKS5kYXRhKHYsdCkpLCJ0b2dnbGUiPT09ZSYmdFtlXSgpfSl9LHMobixudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX1dKSxufSgpLG0oZG9jdW1lbnQpLm9uKE8uQ0xJQ0tfREFUQV9BUEksSSxmdW5jdGlvbih0KXt0LnByZXZlbnREZWZhdWx0KCk7dmFyIGU9dC50YXJnZXQ7bShlKS5oYXNDbGFzcyhiKXx8KGU9bShlKS5jbG9zZXN0KE4pKSxrLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChtKGUpLCJ0b2dnbGUiKX0pLm9uKE8uRk9DVVNfQkxVUl9EQVRBX0FQSSxJLGZ1bmN0aW9uKHQpe3ZhciBlPW0odC50YXJnZXQpLmNsb3Nlc3QoTilbMF07bShlKS50b2dnbGVDbGFzcyhTLC9eZm9jdXMoaW4pPyQvLnRlc3QodC50eXBlKSl9KSxtLmZuW3BdPWsuX2pRdWVyeUludGVyZmFjZSxtLmZuW3BdLkNvbnN0cnVjdG9yPWssbS5mbltwXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIG0uZm5bcF09QyxrLl9qUXVlcnlJbnRlcmZhY2V9LGspLFFuPShqPSJjYXJvdXNlbCIsTD0iLiIrKEg9ImJzLmNhcm91c2VsIiksUj0iLmRhdGEtYXBpIix4PShQPWUpLmZuW2pdLFc9e2ludGVydmFsOjVlMyxrZXlib2FyZDohMCxzbGlkZTohMSxwYXVzZToiaG92ZXIiLHdyYXA6ITB9LFU9e2ludGVydmFsOiIobnVtYmVyfGJvb2xlYW4pIixrZXlib2FyZDoiYm9vbGVhbiIsc2xpZGU6Iihib29sZWFufHN0cmluZykiLHBhdXNlOiIoc3RyaW5nfGJvb2xlYW4pIix3cmFwOiJib29sZWFuIn0scT0ibmV4dCIsRj0icHJldiIsSz0ibGVmdCIsTT0icmlnaHQiLFE9e1NMSURFOiJzbGlkZSIrTCxTTElEOiJzbGlkIitMLEtFWURPV046ImtleWRvd24iK0wsTU9VU0VFTlRFUjoibW91c2VlbnRlciIrTCxNT1VTRUxFQVZFOiJtb3VzZWxlYXZlIitMLFRPVUNIRU5EOiJ0b3VjaGVuZCIrTCxMT0FEX0RBVEFfQVBJOiJsb2FkIitMK1IsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitMK1J9LEI9ImNhcm91c2VsIixWPSJhY3RpdmUiLFk9InNsaWRlIix6PSJjYXJvdXNlbC1pdGVtLXJpZ2h0IixKPSJjYXJvdXNlbC1pdGVtLWxlZnQiLFo9ImNhcm91c2VsLWl0ZW0tbmV4dCIsRz0iY2Fyb3VzZWwtaXRlbS1wcmV2IiwkPSIuYWN0aXZlIixYPSIuYWN0aXZlLmNhcm91c2VsLWl0ZW0iLHR0PSIuY2Fyb3VzZWwtaXRlbSIsZXQ9Ii5jYXJvdXNlbC1pdGVtLW5leHQsIC5jYXJvdXNlbC1pdGVtLXByZXYiLG50PSIuY2Fyb3VzZWwtaW5kaWNhdG9ycyIsaXQ9IltkYXRhLXNsaWRlXSwgW2RhdGEtc2xpZGUtdG9dIixydD0nW2RhdGEtcmlkZT0iY2Fyb3VzZWwiXScsb3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy5faXRlbXM9bnVsbCx0aGlzLl9pbnRlcnZhbD1udWxsLHRoaXMuX2FjdGl2ZUVsZW1lbnQ9bnVsbCx0aGlzLl9pc1BhdXNlZD0hMSx0aGlzLl9pc1NsaWRpbmc9ITEsdGhpcy50b3VjaFRpbWVvdXQ9bnVsbCx0aGlzLl9jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMuX2VsZW1lbnQ9UCh0KVswXSx0aGlzLl9pbmRpY2F0b3JzRWxlbWVudD10aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IobnQpLHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCl9dmFyIHQ9by5wcm90b3R5cGU7cmV0dXJuIHQubmV4dD1mdW5jdGlvbigpe3RoaXMuX2lzU2xpZGluZ3x8dGhpcy5fc2xpZGUocSl9LHQubmV4dFdoZW5WaXNpYmxlPWZ1bmN0aW9uKCl7IWRvY3VtZW50LmhpZGRlbiYmUCh0aGlzLl9lbGVtZW50KS5pcygiOnZpc2libGUiKSYmImhpZGRlbiIhPT1QKHRoaXMuX2VsZW1lbnQpLmNzcygidmlzaWJpbGl0eSIpJiZ0aGlzLm5leHQoKX0sdC5wcmV2PWZ1bmN0aW9uKCl7dGhpcy5faXNTbGlkaW5nfHx0aGlzLl9zbGlkZShGKX0sdC5wYXVzZT1mdW5jdGlvbih0KXt0fHwodGhpcy5faXNQYXVzZWQ9ITApLHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihldCkmJihGbi50cmlnZ2VyVHJhbnNpdGlvbkVuZCh0aGlzLl9lbGVtZW50KSx0aGlzLmN5Y2xlKCEwKSksY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCksdGhpcy5faW50ZXJ2YWw9bnVsbH0sdC5jeWNsZT1mdW5jdGlvbih0KXt0fHwodGhpcy5faXNQYXVzZWQ9ITEpLHRoaXMuX2ludGVydmFsJiYoY2xlYXJJbnRlcnZhbCh0aGlzLl9pbnRlcnZhbCksdGhpcy5faW50ZXJ2YWw9bnVsbCksdGhpcy5fY29uZmlnLmludGVydmFsJiYhdGhpcy5faXNQYXVzZWQmJih0aGlzLl9pbnRlcnZhbD1zZXRJbnRlcnZhbCgoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlP3RoaXMubmV4dFdoZW5WaXNpYmxlOnRoaXMubmV4dCkuYmluZCh0aGlzKSx0aGlzLl9jb25maWcuaW50ZXJ2YWwpKX0sdC50bz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX2FjdGl2ZUVsZW1lbnQ9dGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yKFgpO3ZhciBuPXRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9hY3RpdmVFbGVtZW50KTtpZighKHQ+dGhpcy5faXRlbXMubGVuZ3RoLTF8fHQ8MCkpaWYodGhpcy5faXNTbGlkaW5nKVAodGhpcy5fZWxlbWVudCkub25lKFEuU0xJRCxmdW5jdGlvbigpe3JldHVybiBlLnRvKHQpfSk7ZWxzZXtpZihuPT09dClyZXR1cm4gdGhpcy5wYXVzZSgpLHZvaWQgdGhpcy5jeWNsZSgpO3ZhciBpPW48dD9xOkY7dGhpcy5fc2xpZGUoaSx0aGlzLl9pdGVtc1t0XSl9fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtQKHRoaXMuX2VsZW1lbnQpLm9mZihMKSxQLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxIKSx0aGlzLl9pdGVtcz1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9pbnRlcnZhbD1udWxsLHRoaXMuX2lzUGF1c2VkPW51bGwsdGhpcy5faXNTbGlkaW5nPW51bGwsdGhpcy5fYWN0aXZlRWxlbWVudD1udWxsLHRoaXMuX2luZGljYXRvcnNFbGVtZW50PW51bGx9LHQuX2dldENvbmZpZz1mdW5jdGlvbih0KXtyZXR1cm4gdD1sKHt9LFcsdCksRm4udHlwZUNoZWNrQ29uZmlnKGosdCxVKSx0fSx0Ll9hZGRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5fY29uZmlnLmtleWJvYXJkJiZQKHRoaXMuX2VsZW1lbnQpLm9uKFEuS0VZRE9XTixmdW5jdGlvbih0KXtyZXR1cm4gZS5fa2V5ZG93bih0KX0pLCJob3ZlciI9PT10aGlzLl9jb25maWcucGF1c2UmJihQKHRoaXMuX2VsZW1lbnQpLm9uKFEuTU9VU0VFTlRFUixmdW5jdGlvbih0KXtyZXR1cm4gZS5wYXVzZSh0KX0pLm9uKFEuTU9VU0VMRUFWRSxmdW5jdGlvbih0KXtyZXR1cm4gZS5jeWNsZSh0KX0pLCJvbnRvdWNoc3RhcnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50JiZQKHRoaXMuX2VsZW1lbnQpLm9uKFEuVE9VQ0hFTkQsZnVuY3Rpb24oKXtlLnBhdXNlKCksZS50b3VjaFRpbWVvdXQmJmNsZWFyVGltZW91dChlLnRvdWNoVGltZW91dCksZS50b3VjaFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbih0KXtyZXR1cm4gZS5jeWNsZSh0KX0sNTAwK2UuX2NvbmZpZy5pbnRlcnZhbCl9KSl9LHQuX2tleWRvd249ZnVuY3Rpb24odCl7aWYoIS9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QodC50YXJnZXQudGFnTmFtZSkpc3dpdGNoKHQud2hpY2gpe2Nhc2UgMzc6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMucHJldigpO2JyZWFrO2Nhc2UgMzk6dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmV4dCgpfX0sdC5fZ2V0SXRlbUluZGV4PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtcz10JiZ0LnBhcmVudE5vZGU/W10uc2xpY2UuY2FsbCh0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbCh0dCkpOltdLHRoaXMuX2l0ZW1zLmluZGV4T2YodCl9LHQuX2dldEl0ZW1CeURpcmVjdGlvbj1mdW5jdGlvbih0LGUpe3ZhciBuPXQ9PT1xLGk9dD09PUYscj10aGlzLl9nZXRJdGVtSW5kZXgoZSksbz10aGlzLl9pdGVtcy5sZW5ndGgtMTtpZigoaSYmMD09PXJ8fG4mJnI9PT1vKSYmIXRoaXMuX2NvbmZpZy53cmFwKXJldHVybiBlO3ZhciBzPShyKyh0PT09Rj8tMToxKSkldGhpcy5faXRlbXMubGVuZ3RoO3JldHVybi0xPT09cz90aGlzLl9pdGVtc1t0aGlzLl9pdGVtcy5sZW5ndGgtMV06dGhpcy5faXRlbXNbc119LHQuX3RyaWdnZXJTbGlkZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fZ2V0SXRlbUluZGV4KHQpLGk9dGhpcy5fZ2V0SXRlbUluZGV4KHRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihYKSkscj1QLkV2ZW50KFEuU0xJREUse3JlbGF0ZWRUYXJnZXQ6dCxkaXJlY3Rpb246ZSxmcm9tOmksdG86bn0pO3JldHVybiBQKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIocikscn0sdC5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudD1mdW5jdGlvbih0KXtpZih0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCl7dmFyIGU9W10uc2xpY2UuY2FsbCh0aGlzLl9pbmRpY2F0b3JzRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCQpKTtQKGUpLnJlbW92ZUNsYXNzKFYpO3ZhciBuPXRoaXMuX2luZGljYXRvcnNFbGVtZW50LmNoaWxkcmVuW3RoaXMuX2dldEl0ZW1JbmRleCh0KV07biYmUChuKS5hZGRDbGFzcyhWKX19LHQuX3NsaWRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLG89dGhpcyxzPXRoaXMuX2VsZW1lbnQucXVlcnlTZWxlY3RvcihYKSxhPXRoaXMuX2dldEl0ZW1JbmRleChzKSxsPWV8fHMmJnRoaXMuX2dldEl0ZW1CeURpcmVjdGlvbih0LHMpLGM9dGhpcy5fZ2V0SXRlbUluZGV4KGwpLGg9Qm9vbGVhbih0aGlzLl9pbnRlcnZhbCk7aWYodD09PXE/KG49SixpPVoscj1LKToobj16LGk9RyxyPU0pLGwmJlAobCkuaGFzQ2xhc3MoVikpdGhpcy5faXNTbGlkaW5nPSExO2Vsc2UgaWYoIXRoaXMuX3RyaWdnZXJTbGlkZUV2ZW50KGwscikuaXNEZWZhdWx0UHJldmVudGVkKCkmJnMmJmwpe3RoaXMuX2lzU2xpZGluZz0hMCxoJiZ0aGlzLnBhdXNlKCksdGhpcy5fc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChsKTt2YXIgdT1QLkV2ZW50KFEuU0xJRCx7cmVsYXRlZFRhcmdldDpsLGRpcmVjdGlvbjpyLGZyb206YSx0bzpjfSk7aWYoUCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhZKSl7UChsKS5hZGRDbGFzcyhpKSxGbi5yZWZsb3cobCksUChzKS5hZGRDbGFzcyhuKSxQKGwpLmFkZENsYXNzKG4pO3ZhciBmPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHMpO1Aocykub25lKEZuLlRSQU5TSVRJT05fRU5ELGZ1bmN0aW9uKCl7UChsKS5yZW1vdmVDbGFzcyhuKyIgIitpKS5hZGRDbGFzcyhWKSxQKHMpLnJlbW92ZUNsYXNzKFYrIiAiK2krIiAiK24pLG8uX2lzU2xpZGluZz0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIFAoby5fZWxlbWVudCkudHJpZ2dlcih1KX0sMCl9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChmKX1lbHNlIFAocykucmVtb3ZlQ2xhc3MoViksUChsKS5hZGRDbGFzcyhWKSx0aGlzLl9pc1NsaWRpbmc9ITEsUCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHUpO2gmJnRoaXMuY3ljbGUoKX19LG8uX2pRdWVyeUludGVyZmFjZT1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UCh0aGlzKS5kYXRhKEgpLGU9bCh7fSxXLFAodGhpcykuZGF0YSgpKTsib2JqZWN0Ij09dHlwZW9mIGkmJihlPWwoe30sZSxpKSk7dmFyIG49InN0cmluZyI9PXR5cGVvZiBpP2k6ZS5zbGlkZTtpZih0fHwodD1uZXcgbyh0aGlzLGUpLFAodGhpcykuZGF0YShILHQpKSwibnVtYmVyIj09dHlwZW9mIGkpdC50byhpKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2Ygbil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0W25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7dFtuXSgpfWVsc2UgZS5pbnRlcnZhbCYmKHQucGF1c2UoKSx0LmN5Y2xlKCkpfSl9LG8uX2RhdGFBcGlDbGlja0hhbmRsZXI9ZnVuY3Rpb24odCl7dmFyIGU9Rm4uZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtpZihlKXt2YXIgbj1QKGUpWzBdO2lmKG4mJlAobikuaGFzQ2xhc3MoQikpe3ZhciBpPWwoe30sUChuKS5kYXRhKCksUCh0aGlzKS5kYXRhKCkpLHI9dGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtc2xpZGUtdG8iKTtyJiYoaS5pbnRlcnZhbD0hMSksby5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoUChuKSxpKSxyJiZQKG4pLmRhdGEoSCkudG8ociksdC5wcmV2ZW50RGVmYXVsdCgpfX19LHMobyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFd9fV0pLG99KCksUChkb2N1bWVudCkub24oUS5DTElDS19EQVRBX0FQSSxpdCxvdC5fZGF0YUFwaUNsaWNrSGFuZGxlciksUCh3aW5kb3cpLm9uKFEuTE9BRF9EQVRBX0FQSSxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocnQpKSxlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXt2YXIgaT1QKHRbZV0pO290Ll9qUXVlcnlJbnRlcmZhY2UuY2FsbChpLGkuZGF0YSgpKX19KSxQLmZuW2pdPW90Ll9qUXVlcnlJbnRlcmZhY2UsUC5mbltqXS5Db25zdHJ1Y3Rvcj1vdCxQLmZuW2pdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gUC5mbltqXT14LG90Ll9qUXVlcnlJbnRlcmZhY2V9LG90KSxCbj0oYXQ9ImNvbGxhcHNlIixjdD0iLiIrKGx0PSJicy5jb2xsYXBzZSIpLGh0PShzdD1lKS5mblthdF0sdXQ9e3RvZ2dsZTohMCxwYXJlbnQ6IiJ9LGZ0PXt0b2dnbGU6ImJvb2xlYW4iLHBhcmVudDoiKHN0cmluZ3xlbGVtZW50KSJ9LGR0PXtTSE9XOiJzaG93IitjdCxTSE9XTjoic2hvd24iK2N0LEhJREU6ImhpZGUiK2N0LEhJRERFTjoiaGlkZGVuIitjdCxDTElDS19EQVRBX0FQSToiY2xpY2siK2N0KyIuZGF0YS1hcGkifSxndD0ic2hvdyIsX3Q9ImNvbGxhcHNlIixtdD0iY29sbGFwc2luZyIscHQ9ImNvbGxhcHNlZCIsdnQ9IndpZHRoIix5dD0iaGVpZ2h0IixFdD0iLnNob3csIC5jb2xsYXBzaW5nIixDdD0nW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdJyxUdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoZSx0KXt0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITEsdGhpcy5fZWxlbWVudD1lLHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcodCksdGhpcy5fdHJpZ2dlckFycmF5PXN0Lm1ha2VBcnJheShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS10b2dnbGU9ImNvbGxhcHNlIl1baHJlZj0iIycrZS5pZCsnIl0sW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtdGFyZ2V0PSIjJytlLmlkKyciXScpKTtmb3IodmFyIG49W10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKEN0KSksaT0wLHI9bi5sZW5ndGg7aTxyO2krKyl7dmFyIG89bltpXSxzPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQobyksYT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocykpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9KTtudWxsIT09cyYmMDxhLmxlbmd0aCYmKHRoaXMuX3NlbGVjdG9yPXMsdGhpcy5fdHJpZ2dlckFycmF5LnB1c2gobykpfXRoaXMuX3BhcmVudD10aGlzLl9jb25maWcucGFyZW50P3RoaXMuX2dldFBhcmVudCgpOm51bGwsdGhpcy5fY29uZmlnLnBhcmVudHx8dGhpcy5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzKHRoaXMuX2VsZW1lbnQsdGhpcy5fdHJpZ2dlckFycmF5KSx0aGlzLl9jb25maWcudG9nZ2xlJiZ0aGlzLnRvZ2dsZSgpfXZhciB0PWEucHJvdG90eXBlO3JldHVybiB0LnRvZ2dsZT1mdW5jdGlvbigpe3N0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KT90aGlzLmhpZGUoKTp0aGlzLnNob3coKX0sdC5zaG93PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPXRoaXM7aWYoIXRoaXMuX2lzVHJhbnNpdGlvbmluZyYmIXN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KSYmKHRoaXMuX3BhcmVudCYmMD09PSh0PVtdLnNsaWNlLmNhbGwodGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoRXQpKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJkYXRhLXBhcmVudCIpPT09bi5fY29uZmlnLnBhcmVudH0pKS5sZW5ndGgmJih0PW51bGwpLCEodCYmKGU9c3QodCkubm90KHRoaXMuX3NlbGVjdG9yKS5kYXRhKGx0KSkmJmUuX2lzVHJhbnNpdGlvbmluZykpKXt2YXIgaT1zdC5FdmVudChkdC5TSE9XKTtpZihzdCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKGkpLCFpLmlzRGVmYXVsdFByZXZlbnRlZCgpKXt0JiYoYS5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoc3QodCkubm90KHRoaXMuX3NlbGVjdG9yKSwiaGlkZSIpLGV8fHN0KHQpLmRhdGEobHQsbnVsbCkpO3ZhciByPXRoaXMuX2dldERpbWVuc2lvbigpO3N0KHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKF90KS5hZGRDbGFzcyhtdCksdGhpcy5fZWxlbWVudC5zdHlsZVtyXT0wLHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGgmJnN0KHRoaXMuX3RyaWdnZXJBcnJheSkucmVtb3ZlQ2xhc3MocHQpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKSx0aGlzLnNldFRyYW5zaXRpb25pbmcoITApO3ZhciBvPSJzY3JvbGwiKyhyWzBdLnRvVXBwZXJDYXNlKCkrci5zbGljZSgxKSkscz1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtzdCh0aGlzLl9lbGVtZW50KS5vbmUoRm4uVFJBTlNJVElPTl9FTkQsZnVuY3Rpb24oKXtzdChuLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhtdCkuYWRkQ2xhc3MoX3QpLmFkZENsYXNzKGd0KSxuLl9lbGVtZW50LnN0eWxlW3JdPSIiLG4uc2V0VHJhbnNpdGlvbmluZyghMSksc3Qobi5fZWxlbWVudCkudHJpZ2dlcihkdC5TSE9XTil9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChzKSx0aGlzLl9lbGVtZW50LnN0eWxlW3JdPXRoaXMuX2VsZW1lbnRbb10rInB4In19fSx0LmhpZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKCF0aGlzLl9pc1RyYW5zaXRpb25pbmcmJnN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGd0KSl7dmFyIGU9c3QuRXZlbnQoZHQuSElERSk7aWYoc3QodGhpcy5fZWxlbWVudCkudHJpZ2dlcihlKSwhZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIG49dGhpcy5fZ2V0RGltZW5zaW9uKCk7dGhpcy5fZWxlbWVudC5zdHlsZVtuXT10aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW25dKyJweCIsRm4ucmVmbG93KHRoaXMuX2VsZW1lbnQpLHN0KHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKG10KS5yZW1vdmVDbGFzcyhfdCkucmVtb3ZlQ2xhc3MoZ3QpO3ZhciBpPXRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7aWYoMDxpKWZvcih2YXIgcj0wO3I8aTtyKyspe3ZhciBvPXRoaXMuX3RyaWdnZXJBcnJheVtyXSxzPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQobyk7aWYobnVsbCE9PXMpc3QoW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHMpKSkuaGFzQ2xhc3MoZ3QpfHxzdChvKS5hZGRDbGFzcyhwdCkuYXR0cigiYXJpYS1leHBhbmRlZCIsITEpfXRoaXMuc2V0VHJhbnNpdGlvbmluZyghMCk7dGhpcy5fZWxlbWVudC5zdHlsZVtuXT0iIjt2YXIgYT1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtzdCh0aGlzLl9lbGVtZW50KS5vbmUoRm4uVFJBTlNJVElPTl9FTkQsZnVuY3Rpb24oKXt0LnNldFRyYW5zaXRpb25pbmcoITEpLHN0KHQuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKG10KS5hZGRDbGFzcyhfdCkudHJpZ2dlcihkdC5ISURERU4pfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQoYSl9fX0sdC5zZXRUcmFuc2l0aW9uaW5nPWZ1bmN0aW9uKHQpe3RoaXMuX2lzVHJhbnNpdGlvbmluZz10fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXtzdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsbHQpLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl90cmlnZ2VyQXJyYXk9bnVsbCx0aGlzLl9pc1RyYW5zaXRpb25pbmc9bnVsbH0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybih0PWwoe30sdXQsdCkpLnRvZ2dsZT1Cb29sZWFuKHQudG9nZ2xlKSxGbi50eXBlQ2hlY2tDb25maWcoYXQsdCxmdCksdH0sdC5fZ2V0RGltZW5zaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHN0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKHZ0KT92dDp5dH0sdC5fZ2V0UGFyZW50PWZ1bmN0aW9uKCl7dmFyIG49dGhpcyx0PW51bGw7Rm4uaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5wYXJlbnQpPyh0PXRoaXMuX2NvbmZpZy5wYXJlbnQsInVuZGVmaW5lZCIhPXR5cGVvZiB0aGlzLl9jb25maWcucGFyZW50LmpxdWVyeSYmKHQ9dGhpcy5fY29uZmlnLnBhcmVudFswXSkpOnQ9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0aGlzLl9jb25maWcucGFyZW50KTt2YXIgZT0nW2RhdGEtdG9nZ2xlPSJjb2xsYXBzZSJdW2RhdGEtcGFyZW50PSInK3RoaXMuX2NvbmZpZy5wYXJlbnQrJyJdJyxpPVtdLnNsaWNlLmNhbGwodC5xdWVyeVNlbGVjdG9yQWxsKGUpKTtyZXR1cm4gc3QoaSkuZWFjaChmdW5jdGlvbih0LGUpe24uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhhLl9nZXRUYXJnZXRGcm9tRWxlbWVudChlKSxbZV0pfSksdH0sdC5fYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzPWZ1bmN0aW9uKHQsZSl7aWYodCl7dmFyIG49c3QodCkuaGFzQ2xhc3MoZ3QpO2UubGVuZ3RoJiZzdChlKS50b2dnbGVDbGFzcyhwdCwhbikuYXR0cigiYXJpYS1leHBhbmRlZCIsbil9fSxhLl9nZXRUYXJnZXRGcm9tRWxlbWVudD1mdW5jdGlvbih0KXt2YXIgZT1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHQpO3JldHVybiBlP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSk6bnVsbH0sYS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1zdCh0aGlzKSxlPXQuZGF0YShsdCksbj1sKHt9LHV0LHQuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgaSYmaT9pOnt9KTtpZighZSYmbi50b2dnbGUmJi9zaG93fGhpZGUvLnRlc3QoaSkmJihuLnRvZ2dsZT0hMSksZXx8KGU9bmV3IGEodGhpcyxuKSx0LmRhdGEobHQsZSkpLCJzdHJpbmciPT10eXBlb2YgaSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlW2ldKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytpKyciJyk7ZVtpXSgpfX0pfSxzKGEsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiB1dH19XSksYX0oKSxzdChkb2N1bWVudCkub24oZHQuQ0xJQ0tfREFUQV9BUEksQ3QsZnVuY3Rpb24odCl7IkEiPT09dC5jdXJyZW50VGFyZ2V0LnRhZ05hbWUmJnQucHJldmVudERlZmF1bHQoKTt2YXIgbj1zdCh0aGlzKSxlPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodGhpcyksaT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZSkpO3N0KGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1zdCh0aGlzKSxlPXQuZGF0YShsdCk/InRvZ2dsZSI6bi5kYXRhKCk7VHQuX2pRdWVyeUludGVyZmFjZS5jYWxsKHQsZSl9KX0pLHN0LmZuW2F0XT1UdC5falF1ZXJ5SW50ZXJmYWNlLHN0LmZuW2F0XS5Db25zdHJ1Y3Rvcj1UdCxzdC5mblthdF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBzdC5mblthdF09aHQsVHQuX2pRdWVyeUludGVyZmFjZX0sVHQpLFZuPShTdD0iZHJvcGRvd24iLEF0PSIuIisoSXQ9ImJzLmRyb3Bkb3duIiksRHQ9Ii5kYXRhLWFwaSIsd3Q9KGJ0PWUpLmZuW1N0XSxOdD1uZXcgUmVnRXhwKCIzOHw0MHwyNyIpLE90PXtISURFOiJoaWRlIitBdCxISURERU46ImhpZGRlbiIrQXQsU0hPVzoic2hvdyIrQXQsU0hPV046InNob3duIitBdCxDTElDSzoiY2xpY2siK0F0LENMSUNLX0RBVEFfQVBJOiJjbGljayIrQXQrRHQsS0VZRE9XTl9EQVRBX0FQSToia2V5ZG93biIrQXQrRHQsS0VZVVBfREFUQV9BUEk6ImtleXVwIitBdCtEdH0sa3Q9ImRpc2FibGVkIixQdD0ic2hvdyIsanQ9ImRyb3B1cCIsSHQ9ImRyb3ByaWdodCIsTHQ9ImRyb3BsZWZ0IixSdD0iZHJvcGRvd24tbWVudS1yaWdodCIseHQ9InBvc2l0aW9uLXN0YXRpYyIsV3Q9J1tkYXRhLXRvZ2dsZT0iZHJvcGRvd24iXScsVXQ9Ii5kcm9wZG93biBmb3JtIixxdD0iLmRyb3Bkb3duLW1lbnUiLEZ0PSIubmF2YmFyLW5hdiIsS3Q9Ii5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpIixNdD0idG9wLXN0YXJ0IixRdD0idG9wLWVuZCIsQnQ9ImJvdHRvbS1zdGFydCIsVnQ9ImJvdHRvbS1lbmQiLFl0PSJyaWdodC1zdGFydCIsenQ9ImxlZnQtc3RhcnQiLEp0PXtvZmZzZXQ6MCxmbGlwOiEwLGJvdW5kYXJ5OiJzY3JvbGxQYXJlbnQiLHJlZmVyZW5jZToidG9nZ2xlIixkaXNwbGF5OiJkeW5hbWljIn0sWnQ9e29mZnNldDoiKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pIixmbGlwOiJib29sZWFuIixib3VuZGFyeToiKHN0cmluZ3xlbGVtZW50KSIscmVmZXJlbmNlOiIoc3RyaW5nfGVsZW1lbnQpIixkaXNwbGF5OiJzdHJpbmcifSxHdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGModCxlKXt0aGlzLl9lbGVtZW50PXQsdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9tZW51PXRoaXMuX2dldE1lbnVFbGVtZW50KCksdGhpcy5faW5OYXZiYXI9dGhpcy5fZGV0ZWN0TmF2YmFyKCksdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKX12YXIgdD1jLnByb3RvdHlwZTtyZXR1cm4gdC50b2dnbGU9ZnVuY3Rpb24oKXtpZighdGhpcy5fZWxlbWVudC5kaXNhYmxlZCYmIWJ0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGt0KSl7dmFyIHQ9Yy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCksZT1idCh0aGlzLl9tZW51KS5oYXNDbGFzcyhQdCk7aWYoYy5fY2xlYXJNZW51cygpLCFlKXt2YXIgbj17cmVsYXRlZFRhcmdldDp0aGlzLl9lbGVtZW50fSxpPWJ0LkV2ZW50KE90LlNIT1csbik7aWYoYnQodCkudHJpZ2dlcihpKSwhaS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7aWYoIXRoaXMuX2luTmF2YmFyKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwIGRyb3Bkb3duIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dmFyIHI9dGhpcy5fZWxlbWVudDsicGFyZW50Ij09PXRoaXMuX2NvbmZpZy5yZWZlcmVuY2U/cj10OkZuLmlzRWxlbWVudCh0aGlzLl9jb25maWcucmVmZXJlbmNlKSYmKHI9dGhpcy5fY29uZmlnLnJlZmVyZW5jZSwidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UuanF1ZXJ5JiYocj10aGlzLl9jb25maWcucmVmZXJlbmNlWzBdKSksInNjcm9sbFBhcmVudCIhPT10aGlzLl9jb25maWcuYm91bmRhcnkmJmJ0KHQpLmFkZENsYXNzKHh0KSx0aGlzLl9wb3BwZXI9bmV3IGgocix0aGlzLl9tZW51LHRoaXMuX2dldFBvcHBlckNvbmZpZygpKX0ib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmMD09PWJ0KHQpLmNsb3Nlc3QoRnQpLmxlbmd0aCYmYnQoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vbigibW91c2VvdmVyIixudWxsLGJ0Lm5vb3ApLHRoaXMuX2VsZW1lbnQuZm9jdXMoKSx0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsITApLGJ0KHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKFB0KSxidCh0KS50b2dnbGVDbGFzcyhQdCkudHJpZ2dlcihidC5FdmVudChPdC5TSE9XTixuKSl9fX19LHQuZGlzcG9zZT1mdW5jdGlvbigpe2J0LnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxJdCksYnQodGhpcy5fZWxlbWVudCkub2ZmKEF0KSx0aGlzLl9lbGVtZW50PW51bGwsKHRoaXMuX21lbnU9bnVsbCkhPT10aGlzLl9wb3BwZXImJih0aGlzLl9wb3BwZXIuZGVzdHJveSgpLHRoaXMuX3BvcHBlcj1udWxsKX0sdC51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9pbk5hdmJhcj10aGlzLl9kZXRlY3ROYXZiYXIoKSxudWxsIT09dGhpcy5fcG9wcGVyJiZ0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKX0sdC5fYWRkRXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2J0KHRoaXMuX2VsZW1lbnQpLm9uKE90LkNMSUNLLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLGUudG9nZ2xlKCl9KX0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe3JldHVybiB0PWwoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LGJ0KHRoaXMuX2VsZW1lbnQpLmRhdGEoKSx0KSxGbi50eXBlQ2hlY2tDb25maWcoU3QsdCx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSx0fSx0Ll9nZXRNZW51RWxlbWVudD1mdW5jdGlvbigpe2lmKCF0aGlzLl9tZW51KXt2YXIgdD1jLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTt0JiYodGhpcy5fbWVudT10LnF1ZXJ5U2VsZWN0b3IocXQpKX1yZXR1cm4gdGhpcy5fbWVudX0sdC5fZ2V0UGxhY2VtZW50PWZ1bmN0aW9uKCl7dmFyIHQ9YnQodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlKSxlPUJ0O3JldHVybiB0Lmhhc0NsYXNzKGp0KT8oZT1NdCxidCh0aGlzLl9tZW51KS5oYXNDbGFzcyhSdCkmJihlPVF0KSk6dC5oYXNDbGFzcyhIdCk/ZT1ZdDp0Lmhhc0NsYXNzKEx0KT9lPXp0OmJ0KHRoaXMuX21lbnUpLmhhc0NsYXNzKFJ0KSYmKGU9VnQpLGV9LHQuX2RldGVjdE5hdmJhcj1mdW5jdGlvbigpe3JldHVybiAwPGJ0KHRoaXMuX2VsZW1lbnQpLmNsb3Nlc3QoIi5uYXZiYXIiKS5sZW5ndGh9LHQuX2dldFBvcHBlckNvbmZpZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD17fTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fY29uZmlnLm9mZnNldD90LmZuPWZ1bmN0aW9uKHQpe3JldHVybiB0Lm9mZnNldHM9bCh7fSx0Lm9mZnNldHMsZS5fY29uZmlnLm9mZnNldCh0Lm9mZnNldHMpfHx7fSksdH06dC5vZmZzZXQ9dGhpcy5fY29uZmlnLm9mZnNldDt2YXIgbj17cGxhY2VtZW50OnRoaXMuX2dldFBsYWNlbWVudCgpLG1vZGlmaWVyczp7b2Zmc2V0OnQsZmxpcDp7ZW5hYmxlZDp0aGlzLl9jb25maWcuZmxpcH0scHJldmVudE92ZXJmbG93Ontib3VuZGFyaWVzRWxlbWVudDp0aGlzLl9jb25maWcuYm91bmRhcnl9fX07cmV0dXJuInN0YXRpYyI9PT10aGlzLl9jb25maWcuZGlzcGxheSYmKG4ubW9kaWZpZXJzLmFwcGx5U3R5bGU9e2VuYWJsZWQ6ITF9KSxufSxjLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWJ0KHRoaXMpLmRhdGEoSXQpO2lmKHR8fCh0PW5ldyBjKHRoaXMsIm9iamVjdCI9PXR5cGVvZiBlP2U6bnVsbCksYnQodGhpcykuZGF0YShJdCx0KSksInN0cmluZyI9PXR5cGVvZiBlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTt0W2VdKCl9fSl9LGMuX2NsZWFyTWVudXM9ZnVuY3Rpb24odCl7aWYoIXR8fDMhPT10LndoaWNoJiYoImtleXVwIiE9PXQudHlwZXx8OT09PXQud2hpY2gpKWZvcih2YXIgZT1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoV3QpKSxuPTAsaT1lLmxlbmd0aDtuPGk7bisrKXt2YXIgcj1jLl9nZXRQYXJlbnRGcm9tRWxlbWVudChlW25dKSxvPWJ0KGVbbl0pLmRhdGEoSXQpLHM9e3JlbGF0ZWRUYXJnZXQ6ZVtuXX07aWYodCYmImNsaWNrIj09PXQudHlwZSYmKHMuY2xpY2tFdmVudD10KSxvKXt2YXIgYT1vLl9tZW51O2lmKGJ0KHIpLmhhc0NsYXNzKFB0KSYmISh0JiYoImNsaWNrIj09PXQudHlwZSYmL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKXx8ImtleXVwIj09PXQudHlwZSYmOT09PXQud2hpY2gpJiZidC5jb250YWlucyhyLHQudGFyZ2V0KSkpe3ZhciBsPWJ0LkV2ZW50KE90LkhJREUscyk7YnQocikudHJpZ2dlcihsKSxsLmlzRGVmYXVsdFByZXZlbnRlZCgpfHwoIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmJ0KGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub2ZmKCJtb3VzZW92ZXIiLG51bGwsYnQubm9vcCksZVtuXS5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLGJ0KGEpLnJlbW92ZUNsYXNzKFB0KSxidChyKS5yZW1vdmVDbGFzcyhQdCkudHJpZ2dlcihidC5FdmVudChPdC5ISURERU4scykpKX19fX0sYy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGUsbj1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHQpO3JldHVybiBuJiYoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKG4pKSxlfHx0LnBhcmVudE5vZGV9LGMuX2RhdGFBcGlLZXlkb3duSGFuZGxlcj1mdW5jdGlvbih0KXtpZigoL2lucHV0fHRleHRhcmVhL2kudGVzdCh0LnRhcmdldC50YWdOYW1lKT8hKDMyPT09dC53aGljaHx8MjchPT10LndoaWNoJiYoNDAhPT10LndoaWNoJiYzOCE9PXQud2hpY2h8fGJ0KHQudGFyZ2V0KS5jbG9zZXN0KHF0KS5sZW5ndGgpKTpOdC50ZXN0KHQud2hpY2gpKSYmKHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLCF0aGlzLmRpc2FibGVkJiYhYnQodGhpcykuaGFzQ2xhc3Moa3QpKSl7dmFyIGU9Yy5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyksbj1idChlKS5oYXNDbGFzcyhQdCk7aWYoKG58fDI3PT09dC53aGljaCYmMzI9PT10LndoaWNoKSYmKCFufHwyNyE9PXQud2hpY2gmJjMyIT09dC53aGljaCkpe3ZhciBpPVtdLnNsaWNlLmNhbGwoZS5xdWVyeVNlbGVjdG9yQWxsKEt0KSk7aWYoMCE9PWkubGVuZ3RoKXt2YXIgcj1pLmluZGV4T2YodC50YXJnZXQpOzM4PT09dC53aGljaCYmMDxyJiZyLS0sNDA9PT10LndoaWNoJiZyPGkubGVuZ3RoLTEmJnIrKyxyPDAmJihyPTApLGlbcl0uZm9jdXMoKX19ZWxzZXtpZigyNz09PXQud2hpY2gpe3ZhciBvPWUucXVlcnlTZWxlY3RvcihXdCk7YnQobykudHJpZ2dlcigiZm9jdXMiKX1idCh0aGlzKS50cmlnZ2VyKCJjbGljayIpfX19LHMoYyxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEp0fX0se2tleToiRGVmYXVsdFR5cGUiLGdldDpmdW5jdGlvbigpe3JldHVybiBadH19XSksY30oKSxidChkb2N1bWVudCkub24oT3QuS0VZRE9XTl9EQVRBX0FQSSxXdCxHdC5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihPdC5LRVlET1dOX0RBVEFfQVBJLHF0LEd0Ll9kYXRhQXBpS2V5ZG93bkhhbmRsZXIpLm9uKE90LkNMSUNLX0RBVEFfQVBJKyIgIitPdC5LRVlVUF9EQVRBX0FQSSxHdC5fY2xlYXJNZW51cykub24oT3QuQ0xJQ0tfREFUQV9BUEksV3QsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksR3QuX2pRdWVyeUludGVyZmFjZS5jYWxsKGJ0KHRoaXMpLCJ0b2dnbGUiKX0pLm9uKE90LkNMSUNLX0RBVEFfQVBJLFV0LGZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9KSxidC5mbltTdF09R3QuX2pRdWVyeUludGVyZmFjZSxidC5mbltTdF0uQ29uc3RydWN0b3I9R3QsYnQuZm5bU3RdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gYnQuZm5bU3RdPXd0LEd0Ll9qUXVlcnlJbnRlcmZhY2V9LEd0KSxZbj0oWHQ9Im1vZGFsIixlZT0iLiIrKHRlPSJicy5tb2RhbCIpLG5lPSgkdD1lKS5mbltYdF0saWU9e2JhY2tkcm9wOiEwLGtleWJvYXJkOiEwLGZvY3VzOiEwLHNob3c6ITB9LHJlPXtiYWNrZHJvcDoiKGJvb2xlYW58c3RyaW5nKSIsa2V5Ym9hcmQ6ImJvb2xlYW4iLGZvY3VzOiJib29sZWFuIixzaG93OiJib29sZWFuIn0sb2U9e0hJREU6ImhpZGUiK2VlLEhJRERFTjoiaGlkZGVuIitlZSxTSE9XOiJzaG93IitlZSxTSE9XTjoic2hvd24iK2VlLEZPQ1VTSU46ImZvY3VzaW4iK2VlLFJFU0laRToicmVzaXplIitlZSxDTElDS19ESVNNSVNTOiJjbGljay5kaXNtaXNzIitlZSxLRVlET1dOX0RJU01JU1M6ImtleWRvd24uZGlzbWlzcyIrZWUsTU9VU0VVUF9ESVNNSVNTOiJtb3VzZXVwLmRpc21pc3MiK2VlLE1PVVNFRE9XTl9ESVNNSVNTOiJtb3VzZWRvd24uZGlzbWlzcyIrZWUsQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitlZSsiLmRhdGEtYXBpIn0sc2U9Im1vZGFsLXNjcm9sbGJhci1tZWFzdXJlIixhZT0ibW9kYWwtYmFja2Ryb3AiLGxlPSJtb2RhbC1vcGVuIixjZT0iZmFkZSIsaGU9InNob3ciLHVlPSIubW9kYWwtZGlhbG9nIixmZT0nW2RhdGEtdG9nZ2xlPSJtb2RhbCJdJyxkZT0nW2RhdGEtZGlzbWlzcz0ibW9kYWwiXScsZ2U9Ii5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AiLF9lPSIuc3RpY2t5LXRvcCIsbWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiByKHQsZSl7dGhpcy5fY29uZmlnPXRoaXMuX2dldENvbmZpZyhlKSx0aGlzLl9lbGVtZW50PXQsdGhpcy5fZGlhbG9nPXQucXVlcnlTZWxlY3Rvcih1ZSksdGhpcy5fYmFja2Ryb3A9bnVsbCx0aGlzLl9pc1Nob3duPSExLHRoaXMuX2lzQm9keU92ZXJmbG93aW5nPSExLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9ITEsdGhpcy5fc2Nyb2xsYmFyV2lkdGg9MH12YXIgdD1yLnByb3RvdHlwZTtyZXR1cm4gdC50b2dnbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2lzU2hvd24/dGhpcy5oaWRlKCk6dGhpcy5zaG93KHQpfSx0LnNob3c9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZighdGhpcy5faXNUcmFuc2l0aW9uaW5nJiYhdGhpcy5faXNTaG93bil7JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpJiYodGhpcy5faXNUcmFuc2l0aW9uaW5nPSEwKTt2YXIgbj0kdC5FdmVudChvZS5TSE9XLHtyZWxhdGVkVGFyZ2V0OnR9KTskdCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKG4pLHRoaXMuX2lzU2hvd258fG4uaXNEZWZhdWx0UHJldmVudGVkKCl8fCh0aGlzLl9pc1Nob3duPSEwLHRoaXMuX2NoZWNrU2Nyb2xsYmFyKCksdGhpcy5fc2V0U2Nyb2xsYmFyKCksdGhpcy5fYWRqdXN0RGlhbG9nKCksJHQoZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MobGUpLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSwkdCh0aGlzLl9lbGVtZW50KS5vbihvZS5DTElDS19ESVNNSVNTLGRlLGZ1bmN0aW9uKHQpe3JldHVybiBlLmhpZGUodCl9KSwkdCh0aGlzLl9kaWFsb2cpLm9uKG9lLk1PVVNFRE9XTl9ESVNNSVNTLGZ1bmN0aW9uKCl7JHQoZS5fZWxlbWVudCkub25lKG9lLk1PVVNFVVBfRElTTUlTUyxmdW5jdGlvbih0KXskdCh0LnRhcmdldCkuaXMoZS5fZWxlbWVudCkmJihlLl9pZ25vcmVCYWNrZHJvcENsaWNrPSEwKX0pfSksdGhpcy5fc2hvd0JhY2tkcm9wKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX3Nob3dFbGVtZW50KHQpfSkpfX0sdC5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodCYmdC5wcmV2ZW50RGVmYXVsdCgpLCF0aGlzLl9pc1RyYW5zaXRpb25pbmcmJnRoaXMuX2lzU2hvd24pe3ZhciBuPSR0LkV2ZW50KG9lLkhJREUpO2lmKCR0KHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIobiksdGhpcy5faXNTaG93biYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkpe3RoaXMuX2lzU2hvd249ITE7dmFyIGk9JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpO2lmKGkmJih0aGlzLl9pc1RyYW5zaXRpb25pbmc9ITApLHRoaXMuX3NldEVzY2FwZUV2ZW50KCksdGhpcy5fc2V0UmVzaXplRXZlbnQoKSwkdChkb2N1bWVudCkub2ZmKG9lLkZPQ1VTSU4pLCR0KHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKGhlKSwkdCh0aGlzLl9lbGVtZW50KS5vZmYob2UuQ0xJQ0tfRElTTUlTUyksJHQodGhpcy5fZGlhbG9nKS5vZmYob2UuTU9VU0VET1dOX0RJU01JU1MpLGkpe3ZhciByPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpOyR0KHRoaXMuX2VsZW1lbnQpLm9uZShGbi5UUkFOU0lUSU9OX0VORCxmdW5jdGlvbih0KXtyZXR1cm4gZS5faGlkZU1vZGFsKHQpfSkuZW11bGF0ZVRyYW5zaXRpb25FbmQocil9ZWxzZSB0aGlzLl9oaWRlTW9kYWwoKX19fSx0LmRpc3Bvc2U9ZnVuY3Rpb24oKXskdC5yZW1vdmVEYXRhKHRoaXMuX2VsZW1lbnQsdGUpLCR0KHdpbmRvdyxkb2N1bWVudCx0aGlzLl9lbGVtZW50LHRoaXMuX2JhY2tkcm9wKS5vZmYoZWUpLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX2VsZW1lbnQ9bnVsbCx0aGlzLl9kaWFsb2c9bnVsbCx0aGlzLl9iYWNrZHJvcD1udWxsLHRoaXMuX2lzU2hvd249bnVsbCx0aGlzLl9pc0JvZHlPdmVyZmxvd2luZz1udWxsLHRoaXMuX2lnbm9yZUJhY2tkcm9wQ2xpY2s9bnVsbCx0aGlzLl9zY3JvbGxiYXJXaWR0aD1udWxsfSx0LmhhbmRsZVVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX2FkanVzdERpYWxvZygpfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bCh7fSxpZSx0KSxGbi50eXBlQ2hlY2tDb25maWcoWHQsdCxyZSksdH0sdC5fc2hvd0VsZW1lbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPSR0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGNlKTt0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUmJnRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfHxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnQpLHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpLHRoaXMuX2VsZW1lbnQuc2Nyb2xsVG9wPTAsbiYmRm4ucmVmbG93KHRoaXMuX2VsZW1lbnQpLCR0KHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKGhlKSx0aGlzLl9jb25maWcuZm9jdXMmJnRoaXMuX2VuZm9yY2VGb2N1cygpO3ZhciBpPSR0LkV2ZW50KG9lLlNIT1dOLHtyZWxhdGVkVGFyZ2V0OnR9KSxyPWZ1bmN0aW9uKCl7ZS5fY29uZmlnLmZvY3VzJiZlLl9lbGVtZW50LmZvY3VzKCksZS5faXNUcmFuc2l0aW9uaW5nPSExLCR0KGUuX2VsZW1lbnQpLnRyaWdnZXIoaSl9O2lmKG4pe3ZhciBvPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpOyR0KHRoaXMuX2RpYWxvZykub25lKEZuLlRSQU5TSVRJT05fRU5ELHIpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKG8pfWVsc2UgcigpfSx0Ll9lbmZvcmNlRm9jdXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzOyR0KGRvY3VtZW50KS5vZmYob2UuRk9DVVNJTikub24ob2UuRk9DVVNJTixmdW5jdGlvbih0KXtkb2N1bWVudCE9PXQudGFyZ2V0JiZlLl9lbGVtZW50IT09dC50YXJnZXQmJjA9PT0kdChlLl9lbGVtZW50KS5oYXModC50YXJnZXQpLmxlbmd0aCYmZS5fZWxlbWVudC5mb2N1cygpfSl9LHQuX3NldEVzY2FwZUV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9pc1Nob3duJiZ0aGlzLl9jb25maWcua2V5Ym9hcmQ/JHQodGhpcy5fZWxlbWVudCkub24ob2UuS0VZRE9XTl9ESVNNSVNTLGZ1bmN0aW9uKHQpezI3PT09dC53aGljaCYmKHQucHJldmVudERlZmF1bHQoKSxlLmhpZGUoKSl9KTp0aGlzLl9pc1Nob3dufHwkdCh0aGlzLl9lbGVtZW50KS5vZmYob2UuS0VZRE9XTl9ESVNNSVNTKX0sdC5fc2V0UmVzaXplRXZlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2lzU2hvd24/JHQod2luZG93KS5vbihvZS5SRVNJWkUsZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFuZGxlVXBkYXRlKHQpfSk6JHQod2luZG93KS5vZmYob2UuUkVTSVpFKX0sdC5faGlkZU1vZGFsPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsITApLHRoaXMuX2lzVHJhbnNpdGlvbmluZz0hMSx0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24oKXskdChkb2N1bWVudC5ib2R5KS5yZW1vdmVDbGFzcyhsZSksdC5fcmVzZXRBZGp1c3RtZW50cygpLHQuX3Jlc2V0U2Nyb2xsYmFyKCksJHQodC5fZWxlbWVudCkudHJpZ2dlcihvZS5ISURERU4pfSl9LHQuX3JlbW92ZUJhY2tkcm9wPWZ1bmN0aW9uKCl7dGhpcy5fYmFja2Ryb3AmJigkdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlKCksdGhpcy5fYmFja2Ryb3A9bnVsbCl9LHQuX3Nob3dCYWNrZHJvcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49JHQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoY2UpP2NlOiIiO2lmKHRoaXMuX2lzU2hvd24mJnRoaXMuX2NvbmZpZy5iYWNrZHJvcCl7aWYodGhpcy5fYmFja2Ryb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lPWFlLG4mJnRoaXMuX2JhY2tkcm9wLmNsYXNzTGlzdC5hZGQobiksJHQodGhpcy5fYmFja2Ryb3ApLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLCR0KHRoaXMuX2VsZW1lbnQpLm9uKG9lLkNMSUNLX0RJU01JU1MsZnVuY3Rpb24odCl7ZS5faWdub3JlQmFja2Ryb3BDbGljaz9lLl9pZ25vcmVCYWNrZHJvcENsaWNrPSExOnQudGFyZ2V0PT09dC5jdXJyZW50VGFyZ2V0JiYoInN0YXRpYyI9PT1lLl9jb25maWcuYmFja2Ryb3A/ZS5fZWxlbWVudC5mb2N1cygpOmUuaGlkZSgpKX0pLG4mJkZuLnJlZmxvdyh0aGlzLl9iYWNrZHJvcCksJHQodGhpcy5fYmFja2Ryb3ApLmFkZENsYXNzKGhlKSwhdClyZXR1cm47aWYoIW4pcmV0dXJuIHZvaWQgdCgpO3ZhciBpPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMuX2JhY2tkcm9wKTskdCh0aGlzLl9iYWNrZHJvcCkub25lKEZuLlRSQU5TSVRJT05fRU5ELHQpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGkpfWVsc2UgaWYoIXRoaXMuX2lzU2hvd24mJnRoaXMuX2JhY2tkcm9wKXskdCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlQ2xhc3MoaGUpO3ZhciByPWZ1bmN0aW9uKCl7ZS5fcmVtb3ZlQmFja2Ryb3AoKSx0JiZ0KCl9O2lmKCR0KHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKGNlKSl7dmFyIG89Rm4uZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodGhpcy5fYmFja2Ryb3ApOyR0KHRoaXMuX2JhY2tkcm9wKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscikuZW11bGF0ZVRyYW5zaXRpb25FbmQobyl9ZWxzZSByKCl9ZWxzZSB0JiZ0KCl9LHQuX2FkanVzdERpYWxvZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0PmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7IXRoaXMuX2lzQm9keU92ZXJmbG93aW5nJiZ0JiYodGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nTGVmdD10aGlzLl9zY3JvbGxiYXJXaWR0aCsicHgiKSx0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyYmIXQmJih0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodD10aGlzLl9zY3JvbGxiYXJXaWR0aCsicHgiKX0sdC5fcmVzZXRBZGp1c3RtZW50cz1mdW5jdGlvbigpe3RoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQ9IiIsdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQ9IiJ9LHQuX2NoZWNrU2Nyb2xsYmFyPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9pc0JvZHlPdmVyZmxvd2luZz10LmxlZnQrdC5yaWdodDx3aW5kb3cuaW5uZXJXaWR0aCx0aGlzLl9zY3JvbGxiYXJXaWR0aD10aGlzLl9nZXRTY3JvbGxiYXJXaWR0aCgpfSx0Ll9zZXRTY3JvbGxiYXI9ZnVuY3Rpb24oKXt2YXIgcj10aGlzO2lmKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nKXt2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoZ2UpKSxlPVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChfZSkpOyR0KHQpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN0eWxlLnBhZGRpbmdSaWdodCxpPSR0KGUpLmNzcygicGFkZGluZy1yaWdodCIpOyR0KGUpLmRhdGEoInBhZGRpbmctcmlnaHQiLG4pLmNzcygicGFkZGluZy1yaWdodCIscGFyc2VGbG9hdChpKStyLl9zY3JvbGxiYXJXaWR0aCsicHgiKX0pLCR0KGUpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj1lLnN0eWxlLm1hcmdpblJpZ2h0LGk9JHQoZSkuY3NzKCJtYXJnaW4tcmlnaHQiKTskdChlKS5kYXRhKCJtYXJnaW4tcmlnaHQiLG4pLmNzcygibWFyZ2luLXJpZ2h0IixwYXJzZUZsb2F0KGkpLXIuX3Njcm9sbGJhcldpZHRoKyJweCIpfSk7dmFyIG49ZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQsaT0kdChkb2N1bWVudC5ib2R5KS5jc3MoInBhZGRpbmctcmlnaHQiKTskdChkb2N1bWVudC5ib2R5KS5kYXRhKCJwYWRkaW5nLXJpZ2h0IixuKS5jc3MoInBhZGRpbmctcmlnaHQiLHBhcnNlRmxvYXQoaSkrdGhpcy5fc2Nyb2xsYmFyV2lkdGgrInB4Iil9fSx0Ll9yZXNldFNjcm9sbGJhcj1mdW5jdGlvbigpe3ZhciB0PVtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChnZSkpOyR0KHQpLmVhY2goZnVuY3Rpb24odCxlKXt2YXIgbj0kdChlKS5kYXRhKCJwYWRkaW5nLXJpZ2h0Iik7JHQoZSkucmVtb3ZlRGF0YSgicGFkZGluZy1yaWdodCIpLGUuc3R5bGUucGFkZGluZ1JpZ2h0PW58fCIifSk7dmFyIGU9W10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIiK19lKSk7JHQoZSkuZWFjaChmdW5jdGlvbih0LGUpe3ZhciBuPSR0KGUpLmRhdGEoIm1hcmdpbi1yaWdodCIpOyJ1bmRlZmluZWQiIT10eXBlb2YgbiYmJHQoZSkuY3NzKCJtYXJnaW4tcmlnaHQiLG4pLnJlbW92ZURhdGEoIm1hcmdpbi1yaWdodCIpfSk7dmFyIG49JHQoZG9jdW1lbnQuYm9keSkuZGF0YSgicGFkZGluZy1yaWdodCIpOyR0KGRvY3VtZW50LmJvZHkpLnJlbW92ZURhdGEoInBhZGRpbmctcmlnaHQiKSxkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmdSaWdodD1ufHwiIn0sdC5fZ2V0U2Nyb2xsYmFyV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LmNsYXNzTmFtZT1zZSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpO3ZhciBlPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgtdC5jbGllbnRXaWR0aDtyZXR1cm4gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSxlfSxyLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24obixpKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9JHQodGhpcykuZGF0YSh0ZSksZT1sKHt9LGllLCR0KHRoaXMpLmRhdGEoKSwib2JqZWN0Ij09dHlwZW9mIG4mJm4/bjp7fSk7aWYodHx8KHQ9bmV3IHIodGhpcyxlKSwkdCh0aGlzKS5kYXRhKHRlLHQpKSwic3RyaW5nIj09dHlwZW9mIG4pe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdFtuXSl0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBtZXRob2QgbmFtZWQgIicrbisnIicpO3Rbbl0oaSl9ZWxzZSBlLnNob3cmJnQuc2hvdyhpKX0pfSxzKHIsbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBpZX19XSkscn0oKSwkdChkb2N1bWVudCkub24ob2UuQ0xJQ0tfREFUQV9BUEksZmUsZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzLGk9Rm4uZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0aGlzKTtpJiYoZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGkpKTt2YXIgcj0kdChlKS5kYXRhKHRlKT8idG9nZ2xlIjpsKHt9LCR0KGUpLmRhdGEoKSwkdCh0aGlzKS5kYXRhKCkpOyJBIiE9PXRoaXMudGFnTmFtZSYmIkFSRUEiIT09dGhpcy50YWdOYW1lfHx0LnByZXZlbnREZWZhdWx0KCk7dmFyIG89JHQoZSkub25lKG9lLlNIT1csZnVuY3Rpb24odCl7dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8by5vbmUob2UuSElEREVOLGZ1bmN0aW9uKCl7JHQobikuaXMoIjp2aXNpYmxlIikmJm4uZm9jdXMoKX0pfSk7bWUuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0KGUpLHIsdGhpcyl9KSwkdC5mbltYdF09bWUuX2pRdWVyeUludGVyZmFjZSwkdC5mbltYdF0uQ29uc3RydWN0b3I9bWUsJHQuZm5bWHRdLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gJHQuZm5bWHRdPW5lLG1lLl9qUXVlcnlJbnRlcmZhY2V9LG1lKSx6bj0odmU9InRvb2x0aXAiLEVlPSIuIisoeWU9ImJzLnRvb2x0aXAiKSxDZT0ocGU9ZSkuZm5bdmVdLFRlPSJicy10b29sdGlwIixiZT1uZXcgUmVnRXhwKCIoXnxcXHMpIitUZSsiXFxTKyIsImciKSxBZT17YW5pbWF0aW9uOiEwLHRlbXBsYXRlOic8ZGl2IGNsYXNzPSJ0b29sdGlwIiByb2xlPSJ0b29sdGlwIj48ZGl2IGNsYXNzPSJhcnJvdyI+PC9kaXY+PGRpdiBjbGFzcz0idG9vbHRpcC1pbm5lciI+PC9kaXY+PC9kaXY+Jyx0cmlnZ2VyOiJob3ZlciBmb2N1cyIsdGl0bGU6IiIsZGVsYXk6MCxodG1sOiEoSWU9e0FVVE86ImF1dG8iLFRPUDoidG9wIixSSUdIVDoicmlnaHQiLEJPVFRPTToiYm90dG9tIixMRUZUOiJsZWZ0In0pLHNlbGVjdG9yOiEoU2U9e2FuaW1hdGlvbjoiYm9vbGVhbiIsdGVtcGxhdGU6InN0cmluZyIsdGl0bGU6IihzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbikiLHRyaWdnZXI6InN0cmluZyIsZGVsYXk6IihudW1iZXJ8b2JqZWN0KSIsaHRtbDoiYm9vbGVhbiIsc2VsZWN0b3I6IihzdHJpbmd8Ym9vbGVhbikiLHBsYWNlbWVudDoiKHN0cmluZ3xmdW5jdGlvbikiLG9mZnNldDoiKG51bWJlcnxzdHJpbmcpIixjb250YWluZXI6IihzdHJpbmd8ZWxlbWVudHxib29sZWFuKSIsZmFsbGJhY2tQbGFjZW1lbnQ6IihzdHJpbmd8YXJyYXkpIixib3VuZGFyeToiKHN0cmluZ3xlbGVtZW50KSJ9KSxwbGFjZW1lbnQ6InRvcCIsb2Zmc2V0OjAsY29udGFpbmVyOiExLGZhbGxiYWNrUGxhY2VtZW50OiJmbGlwIixib3VuZGFyeToic2Nyb2xsUGFyZW50In0sd2U9Im91dCIsTmU9e0hJREU6ImhpZGUiK0VlLEhJRERFTjoiaGlkZGVuIitFZSxTSE9XOihEZT0ic2hvdyIpK0VlLFNIT1dOOiJzaG93biIrRWUsSU5TRVJURUQ6Imluc2VydGVkIitFZSxDTElDSzoiY2xpY2siK0VlLEZPQ1VTSU46ImZvY3VzaW4iK0VlLEZPQ1VTT1VUOiJmb2N1c291dCIrRWUsTU9VU0VFTlRFUjoibW91c2VlbnRlciIrRWUsTU9VU0VMRUFWRToibW91c2VsZWF2ZSIrRWV9LE9lPSJmYWRlIixrZT0ic2hvdyIsUGU9Ii50b29sdGlwLWlubmVyIixqZT0iLmFycm93IixIZT0iaG92ZXIiLExlPSJmb2N1cyIsUmU9ImNsaWNrIix4ZT0ibWFudWFsIixXZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCxlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiQm9vdHN0cmFwIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpIik7dGhpcy5faXNFbmFibGVkPSEwLHRoaXMuX3RpbWVvdXQ9MCx0aGlzLl9ob3ZlclN0YXRlPSIiLHRoaXMuX2FjdGl2ZVRyaWdnZXI9e30sdGhpcy5fcG9wcGVyPW51bGwsdGhpcy5lbGVtZW50PXQsdGhpcy5jb25maWc9dGhpcy5fZ2V0Q29uZmlnKGUpLHRoaXMudGlwPW51bGwsdGhpcy5fc2V0TGlzdGVuZXJzKCl9dmFyIHQ9aS5wcm90b3R5cGU7cmV0dXJuIHQuZW5hYmxlPWZ1bmN0aW9uKCl7dGhpcy5faXNFbmFibGVkPSEwfSx0LmRpc2FibGU9ZnVuY3Rpb24oKXt0aGlzLl9pc0VuYWJsZWQ9ITF9LHQudG9nZ2xlRW5hYmxlZD1mdW5jdGlvbigpe3RoaXMuX2lzRW5hYmxlZD0hdGhpcy5faXNFbmFibGVkfSx0LnRvZ2dsZT1mdW5jdGlvbih0KXtpZih0aGlzLl9pc0VuYWJsZWQpaWYodCl7dmFyIGU9dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSxuPXBlKHQuY3VycmVudFRhcmdldCkuZGF0YShlKTtufHwobj1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKGUsbikpLG4uX2FjdGl2ZVRyaWdnZXIuY2xpY2s9IW4uX2FjdGl2ZVRyaWdnZXIuY2xpY2ssbi5faXNXaXRoQWN0aXZlVHJpZ2dlcigpP24uX2VudGVyKG51bGwsbik6bi5fbGVhdmUobnVsbCxuKX1lbHNle2lmKHBlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhrZSkpcmV0dXJuIHZvaWQgdGhpcy5fbGVhdmUobnVsbCx0aGlzKTt0aGlzLl9lbnRlcihudWxsLHRoaXMpfX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpLHBlLnJlbW92ZURhdGEodGhpcy5lbGVtZW50LHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVkpLHBlKHRoaXMuZWxlbWVudCkub2ZmKHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKSxwZSh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoIi5tb2RhbCIpLm9mZigiaGlkZS5icy5tb2RhbCIpLHRoaXMudGlwJiZwZSh0aGlzLnRpcCkucmVtb3ZlKCksdGhpcy5faXNFbmFibGVkPW51bGwsdGhpcy5fdGltZW91dD1udWxsLHRoaXMuX2hvdmVyU3RhdGU9bnVsbCwodGhpcy5fYWN0aXZlVHJpZ2dlcj1udWxsKSE9PXRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLmRlc3Ryb3koKSx0aGlzLl9wb3BwZXI9bnVsbCx0aGlzLmVsZW1lbnQ9bnVsbCx0aGlzLmNvbmZpZz1udWxsLHRoaXMudGlwPW51bGx9LHQuc2hvdz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIm5vbmUiPT09cGUodGhpcy5lbGVtZW50KS5jc3MoImRpc3BsYXkiKSl0aHJvdyBuZXcgRXJyb3IoIlBsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzIik7dmFyIHQ9cGUuRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XKTtpZih0aGlzLmlzV2l0aENvbnRlbnQoKSYmdGhpcy5faXNFbmFibGVkKXtwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodCk7dmFyIG49cGUuY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHRoaXMuZWxlbWVudCk7aWYodC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8IW4pcmV0dXJuO3ZhciBpPXRoaXMuZ2V0VGlwRWxlbWVudCgpLHI9Rm4uZ2V0VUlEKHRoaXMuY29uc3RydWN0b3IuTkFNRSk7aS5zZXRBdHRyaWJ1dGUoImlkIixyKSx0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5IixyKSx0aGlzLnNldENvbnRlbnQoKSx0aGlzLmNvbmZpZy5hbmltYXRpb24mJnBlKGkpLmFkZENsYXNzKE9lKTt2YXIgbz0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcucGxhY2VtZW50P3RoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsaSx0aGlzLmVsZW1lbnQpOnRoaXMuY29uZmlnLnBsYWNlbWVudCxzPXRoaXMuX2dldEF0dGFjaG1lbnQobyk7dGhpcy5hZGRBdHRhY2htZW50Q2xhc3Mocyk7dmFyIGE9ITE9PT10aGlzLmNvbmZpZy5jb250YWluZXI/ZG9jdW1lbnQuYm9keTpwZShkb2N1bWVudCkuZmluZCh0aGlzLmNvbmZpZy5jb250YWluZXIpO3BlKGkpLmRhdGEodGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSx0aGlzKSxwZS5jb250YWlucyh0aGlzLmVsZW1lbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsdGhpcy50aXApfHxwZShpKS5hcHBlbmRUbyhhKSxwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5JTlNFUlRFRCksdGhpcy5fcG9wcGVyPW5ldyBoKHRoaXMuZWxlbWVudCxpLHtwbGFjZW1lbnQ6cyxtb2RpZmllcnM6e29mZnNldDp7b2Zmc2V0OnRoaXMuY29uZmlnLm9mZnNldH0sZmxpcDp7YmVoYXZpb3I6dGhpcy5jb25maWcuZmFsbGJhY2tQbGFjZW1lbnR9LGFycm93OntlbGVtZW50OmplfSxwcmV2ZW50T3ZlcmZsb3c6e2JvdW5kYXJpZXNFbGVtZW50OnRoaXMuY29uZmlnLmJvdW5kYXJ5fX0sb25DcmVhdGU6ZnVuY3Rpb24odCl7dC5vcmlnaW5hbFBsYWNlbWVudCE9PXQucGxhY2VtZW50JiZlLl9oYW5kbGVQb3BwZXJQbGFjZW1lbnRDaGFuZ2UodCl9LG9uVXBkYXRlOmZ1bmN0aW9uKHQpe2UuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZSh0KX19KSxwZShpKS5hZGRDbGFzcyhrZSksIm9udG91Y2hzdGFydCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJnBlKGRvY3VtZW50LmJvZHkpLmNoaWxkcmVuKCkub24oIm1vdXNlb3ZlciIsbnVsbCxwZS5ub29wKTt2YXIgbD1mdW5jdGlvbigpe2UuY29uZmlnLmFuaW1hdGlvbiYmZS5fZml4VHJhbnNpdGlvbigpO3ZhciB0PWUuX2hvdmVyU3RhdGU7ZS5faG92ZXJTdGF0ZT1udWxsLHBlKGUuZWxlbWVudCkudHJpZ2dlcihlLmNvbnN0cnVjdG9yLkV2ZW50LlNIT1dOKSx0PT09d2UmJmUuX2xlYXZlKG51bGwsZSl9O2lmKHBlKHRoaXMudGlwKS5oYXNDbGFzcyhPZSkpe3ZhciBjPUZuLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50KHRoaXMudGlwKTtwZSh0aGlzLnRpcCkub25lKEZuLlRSQU5TSVRJT05fRU5ELGwpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKGMpfWVsc2UgbCgpfX0sdC5oaWRlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLmdldFRpcEVsZW1lbnQoKSxpPXBlLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSElERSkscj1mdW5jdGlvbigpe2UuX2hvdmVyU3RhdGUhPT1EZSYmbi5wYXJlbnROb2RlJiZuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobiksZS5fY2xlYW5UaXBDbGFzcygpLGUuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtZGVzY3JpYmVkYnkiKSxwZShlLmVsZW1lbnQpLnRyaWdnZXIoZS5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pLG51bGwhPT1lLl9wb3BwZXImJmUuX3BvcHBlci5kZXN0cm95KCksdCYmdCgpfTtpZihwZSh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoaSksIWkuaXNEZWZhdWx0UHJldmVudGVkKCkpe2lmKHBlKG4pLnJlbW92ZUNsYXNzKGtlKSwib250b3VjaHN0YXJ0ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmcGUoZG9jdW1lbnQuYm9keSkuY2hpbGRyZW4oKS5vZmYoIm1vdXNlb3ZlciIsbnVsbCxwZS5ub29wKSx0aGlzLl9hY3RpdmVUcmlnZ2VyW1JlXT0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyW0xlXT0hMSx0aGlzLl9hY3RpdmVUcmlnZ2VyW0hlXT0hMSxwZSh0aGlzLnRpcCkuaGFzQ2xhc3MoT2UpKXt2YXIgbz1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChuKTtwZShuKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscikuZW11bGF0ZVRyYW5zaXRpb25FbmQobyl9ZWxzZSByKCk7dGhpcy5faG92ZXJTdGF0ZT0iIn19LHQudXBkYXRlPWZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3BvcHBlciYmdGhpcy5fcG9wcGVyLnNjaGVkdWxlVXBkYXRlKCl9LHQuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMuZ2V0VGl0bGUoKSl9LHQuYWRkQXR0YWNobWVudENsYXNzPWZ1bmN0aW9uKHQpe3BlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhUZSsiLSIrdCl9LHQuZ2V0VGlwRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpcD10aGlzLnRpcHx8cGUodGhpcy5jb25maWcudGVtcGxhdGUpWzBdLHRoaXMudGlwfSx0LnNldENvbnRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KHBlKHQucXVlcnlTZWxlY3RvckFsbChQZSkpLHRoaXMuZ2V0VGl0bGUoKSkscGUodCkucmVtb3ZlQ2xhc3MoT2UrIiAiK2tlKX0sdC5zZXRFbGVtZW50Q29udGVudD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY29uZmlnLmh0bWw7Im9iamVjdCI9PXR5cGVvZiBlJiYoZS5ub2RlVHlwZXx8ZS5qcXVlcnkpP24/cGUoZSkucGFyZW50KCkuaXModCl8fHQuZW1wdHkoKS5hcHBlbmQoZSk6dC50ZXh0KHBlKGUpLnRleHQoKSk6dFtuPyJodG1sIjoidGV4dCJdKGUpfSx0LmdldFRpdGxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgiZGF0YS1vcmlnaW5hbC10aXRsZSIpO3JldHVybiB0fHwodD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25maWcudGl0bGU/dGhpcy5jb25maWcudGl0bGUuY2FsbCh0aGlzLmVsZW1lbnQpOnRoaXMuY29uZmlnLnRpdGxlKSx0fSx0Ll9nZXRBdHRhY2htZW50PWZ1bmN0aW9uKHQpe3JldHVybiBJZVt0LnRvVXBwZXJDYXNlKCldfSx0Ll9zZXRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO3RoaXMuY29uZmlnLnRyaWdnZXIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCJjbGljayI9PT10KXBlKGkuZWxlbWVudCkub24oaS5jb25zdHJ1Y3Rvci5FdmVudC5DTElDSyxpLmNvbmZpZy5zZWxlY3RvcixmdW5jdGlvbih0KXtyZXR1cm4gaS50b2dnbGUodCl9KTtlbHNlIGlmKHQhPT14ZSl7dmFyIGU9dD09PUhlP2kuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUjppLmNvbnN0cnVjdG9yLkV2ZW50LkZPQ1VTSU4sbj10PT09SGU/aS5jb25zdHJ1Y3Rvci5FdmVudC5NT1VTRUxFQVZFOmkuY29uc3RydWN0b3IuRXZlbnQuRk9DVVNPVVQ7cGUoaS5lbGVtZW50KS5vbihlLGkuY29uZmlnLnNlbGVjdG9yLGZ1bmN0aW9uKHQpe3JldHVybiBpLl9lbnRlcih0KX0pLm9uKG4saS5jb25maWcuc2VsZWN0b3IsZnVuY3Rpb24odCl7cmV0dXJuIGkuX2xlYXZlKHQpfSl9cGUoaS5lbGVtZW50KS5jbG9zZXN0KCIubW9kYWwiKS5vbigiaGlkZS5icy5tb2RhbCIsZnVuY3Rpb24oKXtyZXR1cm4gaS5oaWRlKCl9KX0pLHRoaXMuY29uZmlnLnNlbGVjdG9yP3RoaXMuY29uZmlnPWwoe30sdGhpcy5jb25maWcse3RyaWdnZXI6Im1hbnVhbCIsc2VsZWN0b3I6IiJ9KTp0aGlzLl9maXhUaXRsZSgpfSx0Ll9maXhUaXRsZT1mdW5jdGlvbigpe3ZhciB0PXR5cGVvZiB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIik7KHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoInRpdGxlIil8fCJzdHJpbmciIT09dCkmJih0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLW9yaWdpbmFsLXRpdGxlIix0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfHwiIiksdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgidGl0bGUiLCIiKSl9LHQuX2VudGVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxwZSh0LmN1cnJlbnRUYXJnZXQpLmRhdGEobikpfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKG4sZSkpLHQmJihlLl9hY3RpdmVUcmlnZ2VyWyJmb2N1c2luIj09PXQudHlwZT9MZTpIZV09ITApLHBlKGUuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhrZSl8fGUuX2hvdmVyU3RhdGU9PT1EZT9lLl9ob3ZlclN0YXRlPURlOihjbGVhclRpbWVvdXQoZS5fdGltZW91dCksZS5faG92ZXJTdGF0ZT1EZSxlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuc2hvdz9lLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9ob3ZlclN0YXRlPT09RGUmJmUuc2hvdygpfSxlLmNvbmZpZy5kZWxheS5zaG93KTplLnNob3coKSl9LHQuX2xlYXZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTsoZT1lfHxwZSh0LmN1cnJlbnRUYXJnZXQpLmRhdGEobikpfHwoZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LmN1cnJlbnRUYXJnZXQsdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSkscGUodC5jdXJyZW50VGFyZ2V0KS5kYXRhKG4sZSkpLHQmJihlLl9hY3RpdmVUcmlnZ2VyWyJmb2N1c291dCI9PT10LnR5cGU/TGU6SGVdPSExKSxlLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCl8fChjbGVhclRpbWVvdXQoZS5fdGltZW91dCksZS5faG92ZXJTdGF0ZT13ZSxlLmNvbmZpZy5kZWxheSYmZS5jb25maWcuZGVsYXkuaGlkZT9lLl90aW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9ob3ZlclN0YXRlPT09d2UmJmUuaGlkZSgpfSxlLmNvbmZpZy5kZWxheS5oaWRlKTplLmhpZGUoKSl9LHQuX2lzV2l0aEFjdGl2ZVRyaWdnZXI9ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fYWN0aXZlVHJpZ2dlcilpZih0aGlzLl9hY3RpdmVUcmlnZ2VyW3RdKXJldHVybiEwO3JldHVybiExfSx0Ll9nZXRDb25maWc9ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZih0PWwoe30sdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LHBlKHRoaXMuZWxlbWVudCkuZGF0YSgpLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkuZGVsYXkmJih0LmRlbGF5PXtzaG93OnQuZGVsYXksaGlkZTp0LmRlbGF5fSksIm51bWJlciI9PXR5cGVvZiB0LnRpdGxlJiYodC50aXRsZT10LnRpdGxlLnRvU3RyaW5nKCkpLCJudW1iZXIiPT10eXBlb2YgdC5jb250ZW50JiYodC5jb250ZW50PXQuY29udGVudC50b1N0cmluZygpKSxGbi50eXBlQ2hlY2tDb25maWcodmUsdCx0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSx0fSx0Ll9nZXREZWxlZ2F0ZUNvbmZpZz1mdW5jdGlvbigpe3ZhciB0PXt9O2lmKHRoaXMuY29uZmlnKWZvcih2YXIgZSBpbiB0aGlzLmNvbmZpZyl0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRbZV0hPT10aGlzLmNvbmZpZ1tlXSYmKHRbZV09dGhpcy5jb25maWdbZV0pO3JldHVybiB0fSx0Ll9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9cGUodGhpcy5nZXRUaXBFbGVtZW50KCkpLGU9dC5hdHRyKCJjbGFzcyIpLm1hdGNoKGJlKTtudWxsIT09ZSYmZS5sZW5ndGgmJnQucmVtb3ZlQ2xhc3MoZS5qb2luKCIiKSl9LHQuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10Lmluc3RhbmNlO3RoaXMudGlwPWUucG9wcGVyLHRoaXMuX2NsZWFuVGlwQ2xhc3MoKSx0aGlzLmFkZEF0dGFjaG1lbnRDbGFzcyh0aGlzLl9nZXRBdHRhY2htZW50KHQucGxhY2VtZW50KSl9LHQuX2ZpeFRyYW5zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldFRpcEVsZW1lbnQoKSxlPXRoaXMuY29uZmlnLmFuaW1hdGlvbjtudWxsPT09dC5nZXRBdHRyaWJ1dGUoIngtcGxhY2VtZW50IikmJihwZSh0KS5yZW1vdmVDbGFzcyhPZSksdGhpcy5jb25maWcuYW5pbWF0aW9uPSExLHRoaXMuaGlkZSgpLHRoaXMuc2hvdygpLHRoaXMuY29uZmlnLmFuaW1hdGlvbj1lKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1wZSh0aGlzKS5kYXRhKHllKSxlPSJvYmplY3QiPT10eXBlb2YgbiYmbjtpZigodHx8IS9kaXNwb3NlfGhpZGUvLnRlc3QobikpJiYodHx8KHQ9bmV3IGkodGhpcyxlKSxwZSh0aGlzKS5kYXRhKHllLHQpKSwic3RyaW5nIj09dHlwZW9mIG4pKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbbl0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK24rJyInKTt0W25dKCl9fSl9LHMoaSxudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEFlfX0se2tleToiTkFNRSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHZlfX0se2tleToiREFUQV9LRVkiLGdldDpmdW5jdGlvbigpe3JldHVybiB5ZX19LHtrZXk6IkV2ZW50IixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTmV9fSx7a2V5OiJFVkVOVF9LRVkiLGdldDpmdW5jdGlvbigpe3JldHVybiBFZX19LHtrZXk6IkRlZmF1bHRUeXBlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gU2V9fV0pLGl9KCkscGUuZm5bdmVdPVdlLl9qUXVlcnlJbnRlcmZhY2UscGUuZm5bdmVdLkNvbnN0cnVjdG9yPVdlLHBlLmZuW3ZlXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHBlLmZuW3ZlXT1DZSxXZS5falF1ZXJ5SW50ZXJmYWNlfSxXZSksSm49KHFlPSJwb3BvdmVyIixLZT0iLiIrKEZlPSJicy5wb3BvdmVyIiksTWU9KFVlPWUpLmZuW3FlXSxRZT0iYnMtcG9wb3ZlciIsQmU9bmV3IFJlZ0V4cCgiKF58XFxzKSIrUWUrIlxcUysiLCJnIiksVmU9bCh7fSx6bi5EZWZhdWx0LHtwbGFjZW1lbnQ6InJpZ2h0Iix0cmlnZ2VyOiJjbGljayIsY29udGVudDoiIix0ZW1wbGF0ZTonPGRpdiBjbGFzcz0icG9wb3ZlciIgcm9sZT0idG9vbHRpcCI+PGRpdiBjbGFzcz0iYXJyb3ciPjwvZGl2PjxoMyBjbGFzcz0icG9wb3Zlci1oZWFkZXIiPjwvaDM+PGRpdiBjbGFzcz0icG9wb3Zlci1ib2R5Ij48L2Rpdj48L2Rpdj4nfSksWWU9bCh7fSx6bi5EZWZhdWx0VHlwZSx7Y29udGVudDoiKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSJ9KSx6ZT0iZmFkZSIsWmU9Ii5wb3BvdmVyLWhlYWRlciIsR2U9Ii5wb3BvdmVyLWJvZHkiLCRlPXtISURFOiJoaWRlIitLZSxISURERU46ImhpZGRlbiIrS2UsU0hPVzooSmU9InNob3ciKStLZSxTSE9XTjoic2hvd24iK0tlLElOU0VSVEVEOiJpbnNlcnRlZCIrS2UsQ0xJQ0s6ImNsaWNrIitLZSxGT0NVU0lOOiJmb2N1c2luIitLZSxGT0NVU09VVDoiZm9jdXNvdXQiK0tlLE1PVVNFRU5URVI6Im1vdXNlZW50ZXIiK0tlLE1PVVNFTEVBVkU6Im1vdXNlbGVhdmUiK0tlfSxYZT1mdW5jdGlvbih0KXt2YXIgZSxuO2Z1bmN0aW9uIGkoKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9bj10LChlPWkpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSwoZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSkuX19wcm90b19fPW47dmFyIHI9aS5wcm90b3R5cGU7cmV0dXJuIHIuaXNXaXRoQ29udGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFRpdGxlKCl8fHRoaXMuX2dldENvbnRlbnQoKX0sci5hZGRBdHRhY2htZW50Q2xhc3M9ZnVuY3Rpb24odCl7VWUodGhpcy5nZXRUaXBFbGVtZW50KCkpLmFkZENsYXNzKFFlKyItIit0KX0sci5nZXRUaXBFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGlwPXRoaXMudGlwfHxVZSh0aGlzLmNvbmZpZy50ZW1wbGF0ZSlbMF0sdGhpcy50aXB9LHIuc2V0Q29udGVudD1mdW5jdGlvbigpe3ZhciB0PVVlKHRoaXMuZ2V0VGlwRWxlbWVudCgpKTt0aGlzLnNldEVsZW1lbnRDb250ZW50KHQuZmluZChaZSksdGhpcy5nZXRUaXRsZSgpKTt2YXIgZT10aGlzLl9nZXRDb250ZW50KCk7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihlPWUuY2FsbCh0aGlzLmVsZW1lbnQpKSx0aGlzLnNldEVsZW1lbnRDb250ZW50KHQuZmluZChHZSksZSksdC5yZW1vdmVDbGFzcyh6ZSsiICIrSmUpfSxyLl9nZXRDb250ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5nZXRBdHRyaWJ1dGUoImRhdGEtY29udGVudCIpfHx0aGlzLmNvbmZpZy5jb250ZW50fSxyLl9jbGVhblRpcENsYXNzPWZ1bmN0aW9uKCl7dmFyIHQ9VWUodGhpcy5nZXRUaXBFbGVtZW50KCkpLGU9dC5hdHRyKCJjbGFzcyIpLm1hdGNoKEJlKTtudWxsIT09ZSYmMDxlLmxlbmd0aCYmdC5yZW1vdmVDbGFzcyhlLmpvaW4oIiIpKX0saS5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1VZSh0aGlzKS5kYXRhKEZlKSxlPSJvYmplY3QiPT10eXBlb2Ygbj9uOm51bGw7aWYoKHR8fCEvZGVzdHJveXxoaWRlLy50ZXN0KG4pKSYmKHR8fCh0PW5ldyBpKHRoaXMsZSksVWUodGhpcykuZGF0YShGZSx0KSksInN0cmluZyI9PXR5cGVvZiBuKSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB0W25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7dFtuXSgpfX0pfSxzKGksbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19LHtrZXk6IkRlZmF1bHQiLGdldDpmdW5jdGlvbigpe3JldHVybiBWZX19LHtrZXk6Ik5BTUUiLGdldDpmdW5jdGlvbigpe3JldHVybiBxZX19LHtrZXk6IkRBVEFfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRmV9fSx7a2V5OiJFdmVudCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuICRlfX0se2tleToiRVZFTlRfS0VZIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gS2V9fSx7a2V5OiJEZWZhdWx0VHlwZSIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFllfX1dKSxpfSh6biksVWUuZm5bcWVdPVhlLl9qUXVlcnlJbnRlcmZhY2UsVWUuZm5bcWVdLkNvbnN0cnVjdG9yPVhlLFVlLmZuW3FlXS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIFVlLmZuW3FlXT1NZSxYZS5falF1ZXJ5SW50ZXJmYWNlfSxYZSksWm49KGVuPSJzY3JvbGxzcHkiLHJuPSIuIisobm49ImJzLnNjcm9sbHNweSIpLG9uPSh0bj1lKS5mbltlbl0sc249e29mZnNldDoxMCxtZXRob2Q6ImF1dG8iLHRhcmdldDoiIn0sYW49e29mZnNldDoibnVtYmVyIixtZXRob2Q6InN0cmluZyIsdGFyZ2V0OiIoc3RyaW5nfGVsZW1lbnQpIn0sbG49e0FDVElWQVRFOiJhY3RpdmF0ZSIrcm4sU0NST0xMOiJzY3JvbGwiK3JuLExPQURfREFUQV9BUEk6ImxvYWQiK3JuKyIuZGF0YS1hcGkifSxjbj0iZHJvcGRvd24taXRlbSIsaG49ImFjdGl2ZSIsdW49J1tkYXRhLXNweT0ic2Nyb2xsIl0nLGZuPSIuYWN0aXZlIixkbj0iLm5hdiwgLmxpc3QtZ3JvdXAiLGduPSIubmF2LWxpbmsiLF9uPSIubmF2LWl0ZW0iLG1uPSIubGlzdC1ncm91cC1pdGVtIixwbj0iLmRyb3Bkb3duIix2bj0iLmRyb3Bkb3duLWl0ZW0iLHluPSIuZHJvcGRvd24tdG9nZ2xlIixFbj0ib2Zmc2V0IixDbj0icG9zaXRpb24iLFRuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5fZWxlbWVudD10LHRoaXMuX3Njcm9sbEVsZW1lbnQ9IkJPRFkiPT09dC50YWdOYW1lP3dpbmRvdzp0LHRoaXMuX2NvbmZpZz10aGlzLl9nZXRDb25maWcoZSksdGhpcy5fc2VsZWN0b3I9dGhpcy5fY29uZmlnLnRhcmdldCsiICIrZ24rIiwiK3RoaXMuX2NvbmZpZy50YXJnZXQrIiAiK21uKyIsIit0aGlzLl9jb25maWcudGFyZ2V0KyIgIit2bix0aGlzLl9vZmZzZXRzPVtdLHRoaXMuX3RhcmdldHM9W10sdGhpcy5fYWN0aXZlVGFyZ2V0PW51bGwsdGhpcy5fc2Nyb2xsSGVpZ2h0PTAsdG4odGhpcy5fc2Nyb2xsRWxlbWVudCkub24obG4uU0NST0xMLGZ1bmN0aW9uKHQpe3JldHVybiBuLl9wcm9jZXNzKHQpfSksdGhpcy5yZWZyZXNoKCksdGhpcy5fcHJvY2VzcygpfXZhciB0PW4ucHJvdG90eXBlO3JldHVybiB0LnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fc2Nyb2xsRWxlbWVudD09PXRoaXMuX3Njcm9sbEVsZW1lbnQud2luZG93P0VuOkNuLHI9ImF1dG8iPT09dGhpcy5fY29uZmlnLm1ldGhvZD90OnRoaXMuX2NvbmZpZy5tZXRob2Qsbz1yPT09Q24/dGhpcy5fZ2V0U2Nyb2xsVG9wKCk6MDt0aGlzLl9vZmZzZXRzPVtdLHRoaXMuX3RhcmdldHM9W10sdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLFtdLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLl9zZWxlY3RvcikpLm1hcChmdW5jdGlvbih0KXt2YXIgZSxuPUZuLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQodCk7aWYobiYmKGU9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuKSksZSl7dmFyIGk9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihpLndpZHRofHxpLmhlaWdodClyZXR1cm5bdG4oZSlbcl0oKS50b3ArbyxuXX1yZXR1cm4gbnVsbH0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdH0pLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXS1lWzBdfSkuZm9yRWFjaChmdW5jdGlvbih0KXtlLl9vZmZzZXRzLnB1c2godFswXSksZS5fdGFyZ2V0cy5wdXNoKHRbMV0pfSl9LHQuZGlzcG9zZT1mdW5jdGlvbigpe3RuLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCxubiksdG4odGhpcy5fc2Nyb2xsRWxlbWVudCkub2ZmKHJuKSx0aGlzLl9lbGVtZW50PW51bGwsdGhpcy5fc2Nyb2xsRWxlbWVudD1udWxsLHRoaXMuX2NvbmZpZz1udWxsLHRoaXMuX3NlbGVjdG9yPW51bGwsdGhpcy5fb2Zmc2V0cz1udWxsLHRoaXMuX3RhcmdldHM9bnVsbCx0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx0aGlzLl9zY3JvbGxIZWlnaHQ9bnVsbH0sdC5fZ2V0Q29uZmlnPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciIT10eXBlb2YodD1sKHt9LHNuLCJvYmplY3QiPT10eXBlb2YgdCYmdD90Ont9KSkudGFyZ2V0KXt2YXIgZT10bih0LnRhcmdldCkuYXR0cigiaWQiKTtlfHwoZT1Gbi5nZXRVSUQoZW4pLHRuKHQudGFyZ2V0KS5hdHRyKCJpZCIsZSkpLHQudGFyZ2V0PSIjIitlfXJldHVybiBGbi50eXBlQ2hlY2tDb25maWcoZW4sdCxhbiksdH0sdC5fZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/dGhpcy5fc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldDp0aGlzLl9zY3JvbGxFbGVtZW50LnNjcm9sbFRvcH0sdC5fZ2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQuc2Nyb2xsSGVpZ2h0fHxNYXRoLm1heChkb2N1bWVudC5ib2R5LnNjcm9sbEhlaWdodCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KX0sdC5fZ2V0T2Zmc2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Njcm9sbEVsZW1lbnQ9PT13aW5kb3c/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuX3Njcm9sbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0fSx0Ll9wcm9jZXNzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0U2Nyb2xsVG9wKCkrdGhpcy5fY29uZmlnLm9mZnNldCxlPXRoaXMuX2dldFNjcm9sbEhlaWdodCgpLG49dGhpcy5fY29uZmlnLm9mZnNldCtlLXRoaXMuX2dldE9mZnNldEhlaWdodCgpO2lmKHRoaXMuX3Njcm9sbEhlaWdodCE9PWUmJnRoaXMucmVmcmVzaCgpLG48PXQpe3ZhciBpPXRoaXMuX3RhcmdldHNbdGhpcy5fdGFyZ2V0cy5sZW5ndGgtMV07dGhpcy5fYWN0aXZlVGFyZ2V0IT09aSYmdGhpcy5fYWN0aXZhdGUoaSl9ZWxzZXtpZih0aGlzLl9hY3RpdmVUYXJnZXQmJnQ8dGhpcy5fb2Zmc2V0c1swXSYmMDx0aGlzLl9vZmZzZXRzWzBdKXJldHVybiB0aGlzLl9hY3RpdmVUYXJnZXQ9bnVsbCx2b2lkIHRoaXMuX2NsZWFyKCk7Zm9yKHZhciByPXRoaXMuX29mZnNldHMubGVuZ3RoO3ItLTspe3RoaXMuX2FjdGl2ZVRhcmdldCE9PXRoaXMuX3RhcmdldHNbcl0mJnQ+PXRoaXMuX29mZnNldHNbcl0mJigidW5kZWZpbmVkIj09dHlwZW9mIHRoaXMuX29mZnNldHNbcisxXXx8dDx0aGlzLl9vZmZzZXRzW3IrMV0pJiZ0aGlzLl9hY3RpdmF0ZSh0aGlzLl90YXJnZXRzW3JdKX19fSx0Ll9hY3RpdmF0ZT1mdW5jdGlvbihlKXt0aGlzLl9hY3RpdmVUYXJnZXQ9ZSx0aGlzLl9jbGVhcigpO3ZhciB0PXRoaXMuX3NlbGVjdG9yLnNwbGl0KCIsIik7dD10Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdCsnW2RhdGEtdGFyZ2V0PSInK2UrJyJdLCcrdCsnW2hyZWY9IicrZSsnIl0nfSk7dmFyIG49dG4oW10uc2xpY2UuY2FsbChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQuam9pbigiLCIpKSkpO24uaGFzQ2xhc3MoY24pPyhuLmNsb3Nlc3QocG4pLmZpbmQoeW4pLmFkZENsYXNzKGhuKSxuLmFkZENsYXNzKGhuKSk6KG4uYWRkQ2xhc3MoaG4pLG4ucGFyZW50cyhkbikucHJldihnbisiLCAiK21uKS5hZGRDbGFzcyhobiksbi5wYXJlbnRzKGRuKS5wcmV2KF9uKS5jaGlsZHJlbihnbikuYWRkQ2xhc3MoaG4pKSx0bih0aGlzLl9zY3JvbGxFbGVtZW50KS50cmlnZ2VyKGxuLkFDVElWQVRFLHtyZWxhdGVkVGFyZ2V0OmV9KX0sdC5fY2xlYXI9ZnVuY3Rpb24oKXt2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5fc2VsZWN0b3IpKTt0bih0KS5maWx0ZXIoZm4pLnJlbW92ZUNsYXNzKGhuKX0sbi5falF1ZXJ5SW50ZXJmYWNlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD10bih0aGlzKS5kYXRhKG5uKTtpZih0fHwodD1uZXcgbih0aGlzLCJvYmplY3QiPT10eXBlb2YgZSYmZSksdG4odGhpcykuZGF0YShubix0KSksInN0cmluZyI9PXR5cGVvZiBlKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIHRbZV0pdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gbWV0aG9kIG5hbWVkICInK2UrJyInKTt0W2VdKCl9fSl9LHMobixudWxsLFt7a2V5OiJWRVJTSU9OIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iNC4xLjMifX0se2tleToiRGVmYXVsdCIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHNufX1dKSxufSgpLHRuKHdpbmRvdykub24obG4uTE9BRF9EQVRBX0FQSSxmdW5jdGlvbigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodW4pKSxlPXQubGVuZ3RoO2UtLTspe3ZhciBuPXRuKHRbZV0pO1RuLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChuLG4uZGF0YSgpKX19KSx0bi5mbltlbl09VG4uX2pRdWVyeUludGVyZmFjZSx0bi5mbltlbl0uQ29uc3RydWN0b3I9VG4sdG4uZm5bZW5dLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdG4uZm5bZW5dPW9uLFRuLl9qUXVlcnlJbnRlcmZhY2V9LFRuKSxHbj0oSW49Ii4iKyhTbj0iYnMudGFiIiksQW49KGJuPWUpLmZuLnRhYixEbj17SElERToiaGlkZSIrSW4sSElEREVOOiJoaWRkZW4iK0luLFNIT1c6InNob3ciK0luLFNIT1dOOiJzaG93biIrSW4sQ0xJQ0tfREFUQV9BUEk6ImNsaWNrIitJbisiLmRhdGEtYXBpIn0sd249ImRyb3Bkb3duLW1lbnUiLE5uPSJhY3RpdmUiLE9uPSJkaXNhYmxlZCIsa249ImZhZGUiLFBuPSJzaG93Iixqbj0iLmRyb3Bkb3duIixIbj0iLm5hdiwgLmxpc3QtZ3JvdXAiLExuPSIuYWN0aXZlIixSbj0iPiBsaSA+IC5hY3RpdmUiLHhuPSdbZGF0YS10b2dnbGU9InRhYiJdLCBbZGF0YS10b2dnbGU9InBpbGwiXSwgW2RhdGEtdG9nZ2xlPSJsaXN0Il0nLFduPSIuZHJvcGRvd24tdG9nZ2xlIixVbj0iPiAuZHJvcGRvd24tbWVudSAuYWN0aXZlIixxbj1mdW5jdGlvbigpe2Z1bmN0aW9uIGkodCl7dGhpcy5fZWxlbWVudD10fXZhciB0PWkucHJvdG90eXBlO3JldHVybiB0LnNob3c9ZnVuY3Rpb24oKXt2YXIgbj10aGlzO2lmKCEodGhpcy5fZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYm4odGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoTm4pfHxibih0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhPbikpKXt2YXIgdCxpLGU9Ym4odGhpcy5fZWxlbWVudCkuY2xvc2VzdChIbilbMF0scj1Gbi5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMuX2VsZW1lbnQpO2lmKGUpe3ZhciBvPSJVTCI9PT1lLm5vZGVOYW1lP1JuOkxuO2k9KGk9Ym4ubWFrZUFycmF5KGJuKGUpLmZpbmQobykpKVtpLmxlbmd0aC0xXX12YXIgcz1ibi5FdmVudChEbi5ISURFLHtyZWxhdGVkVGFyZ2V0OnRoaXMuX2VsZW1lbnR9KSxhPWJuLkV2ZW50KERuLlNIT1cse3JlbGF0ZWRUYXJnZXQ6aX0pO2lmKGkmJmJuKGkpLnRyaWdnZXIocyksYm4odGhpcy5fZWxlbWVudCkudHJpZ2dlcihhKSwhYS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmIXMuaXNEZWZhdWx0UHJldmVudGVkKCkpe3ImJih0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IocikpLHRoaXMuX2FjdGl2YXRlKHRoaXMuX2VsZW1lbnQsZSk7dmFyIGw9ZnVuY3Rpb24oKXt2YXIgdD1ibi5FdmVudChEbi5ISURERU4se3JlbGF0ZWRUYXJnZXQ6bi5fZWxlbWVudH0pLGU9Ym4uRXZlbnQoRG4uU0hPV04se3JlbGF0ZWRUYXJnZXQ6aX0pO2JuKGkpLnRyaWdnZXIodCksYm4obi5fZWxlbWVudCkudHJpZ2dlcihlKX07dD90aGlzLl9hY3RpdmF0ZSh0LHQucGFyZW50Tm9kZSxsKTpsKCl9fX0sdC5kaXNwb3NlPWZ1bmN0aW9uKCl7Ym4ucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LFNuKSx0aGlzLl9lbGVtZW50PW51bGx9LHQuX2FjdGl2YXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9KCJVTCI9PT1lLm5vZGVOYW1lP2JuKGUpLmZpbmQoUm4pOmJuKGUpLmNoaWxkcmVuKExuKSlbMF0sbz1uJiZyJiZibihyKS5oYXNDbGFzcyhrbikscz1mdW5jdGlvbigpe3JldHVybiBpLl90cmFuc2l0aW9uQ29tcGxldGUodCxyLG4pfTtpZihyJiZvKXt2YXIgYT1Gbi5nZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudChyKTtibihyKS5vbmUoRm4uVFJBTlNJVElPTl9FTkQscykuZW11bGF0ZVRyYW5zaXRpb25FbmQoYSl9ZWxzZSBzKCl9LHQuX3RyYW5zaXRpb25Db21wbGV0ZT1mdW5jdGlvbih0LGUsbil7aWYoZSl7Ym4oZSkucmVtb3ZlQ2xhc3MoUG4rIiAiK05uKTt2YXIgaT1ibihlLnBhcmVudE5vZGUpLmZpbmQoVW4pWzBdO2kmJmJuKGkpLnJlbW92ZUNsYXNzKE5uKSwidGFiIj09PWUuZ2V0QXR0cmlidXRlKCJyb2xlIikmJmUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwhMSl9aWYoYm4odCkuYWRkQ2xhc3MoTm4pLCJ0YWIiPT09dC5nZXRBdHRyaWJ1dGUoInJvbGUiKSYmdC5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLCEwKSxGbi5yZWZsb3codCksYm4odCkuYWRkQ2xhc3MoUG4pLHQucGFyZW50Tm9kZSYmYm4odC5wYXJlbnROb2RlKS5oYXNDbGFzcyh3bikpe3ZhciByPWJuKHQpLmNsb3Nlc3Qoam4pWzBdO2lmKHIpe3ZhciBvPVtdLnNsaWNlLmNhbGwoci5xdWVyeVNlbGVjdG9yQWxsKFduKSk7Ym4obykuYWRkQ2xhc3MoTm4pfXQuc2V0QXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwhMCl9biYmbigpfSxpLl9qUXVlcnlJbnRlcmZhY2U9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PWJuKHRoaXMpLGU9dC5kYXRhKFNuKTtpZihlfHwoZT1uZXcgaSh0aGlzKSx0LmRhdGEoU24sZSkpLCJzdHJpbmciPT10eXBlb2Ygbil7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBlW25dKXRocm93IG5ldyBUeXBlRXJyb3IoJ05vIG1ldGhvZCBuYW1lZCAiJytuKyciJyk7ZVtuXSgpfX0pfSxzKGksbnVsbCxbe2tleToiVkVSU0lPTiIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIjQuMS4zIn19XSksaX0oKSxibihkb2N1bWVudCkub24oRG4uQ0xJQ0tfREFUQV9BUEkseG4sZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHFuLl9qUXVlcnlJbnRlcmZhY2UuY2FsbChibih0aGlzKSwic2hvdyIpfSksYm4uZm4udGFiPXFuLl9qUXVlcnlJbnRlcmZhY2UsYm4uZm4udGFiLkNvbnN0cnVjdG9yPXFuLGJuLmZuLnRhYi5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGJuLmZuLnRhYj1Bbixxbi5falF1ZXJ5SW50ZXJmYWNlfSxxbik7IWZ1bmN0aW9uKHQpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJCb290c3RyYXAncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeS4galF1ZXJ5IG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIEJvb3RzdHJhcCdzIEphdmFTY3JpcHQuIik7dmFyIGU9dC5mbi5qcXVlcnkuc3BsaXQoIiAiKVswXS5zcGxpdCgiLiIpO2lmKGVbMF08MiYmZVsxXTw5fHwxPT09ZVswXSYmOT09PWVbMV0mJmVbMl08MXx8NDw9ZVswXSl0aHJvdyBuZXcgRXJyb3IoIkJvb3RzdHJhcCdzIEphdmFTY3JpcHQgcmVxdWlyZXMgYXQgbGVhc3QgalF1ZXJ5IHYxLjkuMSBidXQgbGVzcyB0aGFuIHY0LjAuMCIpfShlKSx0LlV0aWw9Rm4sdC5BbGVydD1Lbix0LkJ1dHRvbj1Nbix0LkNhcm91c2VsPVFuLHQuQ29sbGFwc2U9Qm4sdC5Ecm9wZG93bj1Wbix0Lk1vZGFsPVluLHQuUG9wb3Zlcj1Kbix0LlNjcm9sbHNweT1abix0LlRhYj1Hbix0LlRvb2x0aXA9em4sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7DQovLyMgc291cmNlTWFwcGluZ1VSTD1ib290c3RyYXAubWluLmpzLm1hcAkJ"></script> <div id="nav-menu" class="container all-height-fcsi-header-height position-fixed right-0 left-0 z-index-1"><div class="row h-100 all-width-outer-horizontal-bounds m-auto"><div class="col pt-0 h-100 all-width-fcsi-header-logo d-flex align-items-center"> <a href="https://fletchercsi.com" class="nav-menu-link"><div class="row fletcher-logo h-100"><div class="col fletcher-icon all-width-fit-content"> <img src="https://fletchercsi.com/wp-content/uploads/2023/03/FletcherCSI_Logo-Mark_White.png" alt="Fletcher/CSI - Global Strategy Consulting Firm" class="logo-file" /></div><div class="col fletcher-branding"><div class="row h-66"><div class="col h-100"> <span class="fletcher-name"> FLETCHER </span></div></div><div class="row h-33"><div class="col d-flex flex-column justify-content-end h-100"> <span class="fletcher-tagline"> COMPETITIVE. STRATEGIC. INSIGHT. </span></div></div></div></div> </a></div><div class="col"><div class="row h-33 justify-content-end portal-login-parent"><div class="col all-width-fit-content dropdown"><div class="row h-100"><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fcsiwinloss.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> LiveInsights<sup>tm</sup> Win/Loss Portal - <b>Login</b></div></div></div> </a></div></div></div></div><div class="row h-66 justify-content-end links-parent"><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Home</div></div></div> </a></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/about/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> About</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#company">Company</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#careers">Careers</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent active"> <a href="https://fletchercsi.com/industries/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Industries</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/technology/">Technology</a></div></div><div class="row"><div class="col sub-nav-menu-item child active"> <a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/services/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Services</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/resources/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Resources</div></div></div> </a><div class="container all-width-fit-content sub-nav-menu"><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/blogs/">Blogs</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/presentations/">Presentations</a></div></div><div class="row"><div class="col sub-nav-menu-item child"> <a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></div></div></div></div><div class="col all-width-fit-content nav-menu-item parent"> <a href="https://fletchercsi.com/contact/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Contact Us</div></div></div> </a></div><div class="col all-width-fit-content align-items-center mobile-toggle-parent"> <button id="mobile-nav-menu-toggle" type="button" expanded="false"> <i class="fa fa-bars burger" aria-hidden="true"></i> <i class="fa fa-times x-icon" aria-hidden="true"></i> </button></div></div></div></div><div id="mobile-nav-menu" class="row"><div class="col"><div class="container"><div class="row mobile-nav-menu-item parent winloss-portal d-none"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fcsiwinloss.com/"><div class="container h-100"><div class="row h-100 align-items-center justify-content-end"><div class="col all-width-fit-content color-fcsi-primary-green"> LiveInsights<sup>tm</sup> Win/Loss Portal Login</div></div></div> </a></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Home</div></div></div> </a></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/about/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> About</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#company">Company</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#careers">Careers</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/about/#privacypolicy">Privacy Policy</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent active"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/industries/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Industries</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/financial-services/">Financial Services</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/life-sciences/">Life Sciences</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/technology/">Technology</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child active"> <a href="https://fletchercsi.com/industries/consumer-packaged-goods/">Consumer Packaged Goods</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/industries/industrial/">Industrial Services</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/services/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Services</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/primary-research/">Primary Research</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/winloss-analysis/">Win/Loss Analysis</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/strategy-workshops/">Strategy Workshops</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/trade-show-intelligence/">Trade Show Intelligence</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/services/market-intelligence-platform/">Market Intelligence Platform</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/resources/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Resources</div></div></div> </a></div></div><div class="row sub-mobile-nav-menu"><div class="col"><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/blogs/">Blogs</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/webinars-and-videos/">Webinars and Videos</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/white-papers-and-publications/">White Papers and Publications</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/presentations/">Presentations</a></div></div><div class="row child-item"><div class="col sub-mobile-nav-menu-item child"> <a href="https://fletchercsi.com/resources/ci-tips/">CI Tips</a></div></div></div></div></div></div><div class="row mobile-nav-menu-item parent"><div class="col"><div class="row parent-item"><div class="col"> <a href="https://fletchercsi.com/contact/"><div class="container h-100"><div class="row h-100 align-items-center"><div class="col"> Contact Us</div></div></div> </a></div></div></div></div></div></div></div></div> <script defer src="data:text/javascript;base64,CgkJCWpRdWVyeShkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgewoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogdiBIRUxQRVIgRlVOQ1RJT05TIHYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCWZ1bmN0aW9uIGdldFNjcm9sbFRvcCgpIHsKCQkJCQlyZXR1cm4gJCh3aW5kb3cpLnNjcm9sbFRvcCgpOwoJCQkJfQoKCQkJCWZ1bmN0aW9uIGdldFNjcm9sbFN0YXRlKHBhc3NlZF9zY3JvbGxfdG9wKSB7CgkJCQkJdmFyIG5ld19zY3JvbGxfc3RhdGUgPSAiIjsKCgkJCQkJaWYgKHBhc3NlZF9zY3JvbGxfdG9wID09IDApIHsKCQkJCQkJLy8gU2Nyb2xsZWQgdG8gdG9wIG9mIHBhZ2U6CgkJCQkJCW5ld19zY3JvbGxfc3RhdGUgPSAicGFnZXRvcCI7CgkJCQkJfSBlbHNlIGlmIChwYXNzZWRfc2Nyb2xsX3RvcCA8IDEyNSkgewoJCQkJCQkvLyBTY3JvbGxlZCBkb3duIGJ1dCBsZXNzIHRoYW4gMTI1IHB4OgoJCQkJCQluZXdfc2Nyb2xsX3N0YXRlID0gInNjcm9sbHVwIjsKCQkJCQl9IGVsc2UgaWYgKHdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPiBwYXNzZWRfc2Nyb2xsX3RvcCkgewoJCQkJCQkvLyBTY3JvbGxlZCB1cDoKCQkJCQkJbmV3X3Njcm9sbF9zdGF0ZSA9ICJzY3JvbGx1cCI7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gU2Nyb2xsZWQgZG93bjoKCQkJCQkJbmV3X3Njcm9sbF9zdGF0ZSA9ICJzY3JvbGxkb3duIjsKCQkJCQl9CgoJCQkJCXJldHVybiBuZXdfc2Nyb2xsX3N0YXRlOwoJCQkJfQoKCQkJCWZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKHBhc3NlZF9uZXdfc2Nyb2xsX3N0YXRlKSB7CgkJCQkJd2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlID0gcGFzc2VkX25ld19zY3JvbGxfc3RhdGU7CgoJCQkJCSRtYWluX25hdl9tZW51X2Rpdi5jc3MoJ29wYWNpdHknLCAnMS4wJyk7CgoJCQkJCSRtYWluX25hdl9tZW51X2Rpdi5hdHRyKCdzY3JvbGwtc3RhdGUnLCBwYXNzZWRfbmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQl9CgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogXiBIRUxQRVIgRlVOQ1RJT05TIF4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCgkJCQkvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IElOSVRJQUxJWkUgdiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAvLwoJCQkJLy8gVmFyaWFibGVzOgoJCQkJLy8gRE9NOgoJCQkJbGV0ICRtYWluX25hdl9tZW51X2RpdiA9ICQoZG9jdW1lbnQpLmZpbmQoJyNuYXYtbWVudScpOwoJCQkJbGV0ICRtb2JpbGVfbmF2X21lbnUgPSAkKGRvY3VtZW50KS5maW5kKCcjbW9iaWxlLW5hdi1tZW51Jyk7CgkJCQlsZXQgJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbiA9ICQoZG9jdW1lbnQpLmZpbmQoJ2J1dHRvbiNtb2JpbGUtbmF2LW1lbnUtdG9nZ2xlJyk7CgoJCQkJLy8gQ3VzdG9tOgoJCQkJd2luZG93LmRvbV9oYXNfbG9hZGVkID0gZmFsc2U7CgoJCQkJLy8gU3RhdGVzOgoJCQkJLy8gQ2hlY2sgZm9yIERPTSBsb2FkZWQgc3RhdGU6CgkJCQl2YXIgdGltZW91dElEOwoKCQkJCWxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHsKCQkJCQltdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHsKCQkJCQkJbGV0IG9sZFZhbHVlID0gbXV0YXRpb24ub2xkVmFsdWU7CgkJCQkJCWxldCBuZXdWYWx1ZSA9IG11dGF0aW9uLnRhcmdldC50ZXh0Q29udGVudDsKCQkJCQkJaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkgewoJCQkJCQkJaWYgKCF3aW5kb3cuZG9tX2hhc19sb2FkZWQpIHsKCgkJCQkJCQkJY2xlYXJUaW1lb3V0KHRpbWVvdXRJRCk7CgkJCQkJCQl9CgoJCQkJCQkJdGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJCQkJCQl3aW5kb3cuZG9tX2hhc19sb2FkZWQgPSB0cnVlOwoKCQkJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfdG9wID0gZ2V0U2Nyb2xsVG9wKCk7CgkJCQkJCQkJaWYgKHdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPT0gMCkgewoJCQkJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgPSAicGFnZXRvcCI7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJd2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlID0gInNjcm9sbHVwIjsKCQkJCQkJCQl9CgoJCQkJCQkJCW9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKCgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUod2luZG93LmN1cnJlbnRfc2Nyb2xsX3N0YXRlKTsKCQkJCQkJCX0sIDI1MCk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0pOwoKCQkJCW9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgewoJCQkJCWNoYXJhY3RlckRhdGFPbGRWYWx1ZTogdHJ1ZSwKCQkJCQlzdWJ0cmVlOiB0cnVlLAoJCQkJCWNoaWxkTGlzdDogdHJ1ZSwKCQkJCQljaGFyYWN0ZXJEYXRhOiB0cnVlCgkJCQl9KTsKCgkJCQkvLyBTZXQgdGltZW91dCBmb3Igb3V0ZXIgYm91bmQgdGltZSBoYW5kbGluZzoKCQkJCXNldFRpbWVvdXQoKCkgPT4gewoJCQkJCXdpbmRvdy5kb21faGFzX2xvYWRlZCA9IHRydWU7CgoJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPSBnZXRTY3JvbGxUb3AoKTsKCQkJCQlpZiAod2luZG93LmN1cnJlbnRfc2Nyb2xsX3RvcCA9PSAwKSB7CgkJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF9zdGF0ZSA9ICJwYWdldG9wIjsKCQkJCQl9IGVsc2UgewoJCQkJCQl3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgPSAic2Nyb2xsdXAiOwoJCQkJCX0KCQkJCQl1cGRhdGVTY3JvbGxTdGF0ZSh3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUpOwoKCQkJCQlvYnNlcnZlci5kaXNjb25uZWN0KCk7CgkJCQl9LCA1MDApOwoKCQkJCS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIF4gSU5JVElBTElaRSBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC8vCgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiB2IEVWRU5UUyB2ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJCS8vIEhhbmRsZSBwYWdlIHNjcm9sbGluZyBmb3IgbmF2IHN0eWxpbmc6CgkJCQkkKHdpbmRvdykuc2Nyb2xsKGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYgKHdpbmRvdy5kb21faGFzX2xvYWRlZCAmJiAhd2luZG93LmhvbWVfcGFnZV9zcGxpZGVfbW92aW5nKSB7CgkJCQkJCWxldCBuZXdfc2Nyb2xsX3RvcCA9IGdldFNjcm9sbFRvcCgpOwoJCQkJCQlsZXQgbmV3X3Njcm9sbF9zdGF0ZSA9IGdldFNjcm9sbFN0YXRlKG5ld19zY3JvbGxfdG9wKTsKCgkJCQkJCWlmICh3aW5kb3cuY3VycmVudF9zY3JvbGxfc3RhdGUgIT09IG5ld19zY3JvbGxfc3RhdGUpIHsKCQkJCQkJCWlmICgoJChkb2N1bWVudCkuZmluZCgnLm5hdi1tZW51LWl0ZW0ucGFyZW50OmhvdmVyJykubGVuZ3RoICE9IDApIHx8ICgkbW9iaWxlX25hdl90b2dnbGVfYnV0dG9uLmF0dHIoJ2V4cGFuZGVkJykgPT0gInRydWUiKSkgewoJCQkJCQkJCS8vIFVzZXIgSVMgaG92ZXJpbmcgb3ZlciBuYXYgaXRlbToKCQkJCQkJCQlpZiAobmV3X3Njcm9sbF90b3AgPT0gMCkgewoJCQkJCQkJCQluZXdfc2Nyb2xsX3N0YXRlID0gInBhZ2V0b3AiOwoJCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJCW5ld19zY3JvbGxfc3RhdGUgPSAic2Nyb2xsdXAiOwoJCQkJCQkJCX0KCgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUobmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCS8vIFVzZXIgaXMgTk9UIGhvdmVyaW5nIG92ZXIgbmF2IGl0ZW06CgkJCQkJCQkJdXBkYXRlU2Nyb2xsU3RhdGUobmV3X3Njcm9sbF9zdGF0ZSk7CgkJCQkJCQl9CgkJCQkJCX0KCgkJCQkJCXdpbmRvdy5jdXJyZW50X3Njcm9sbF90b3AgPSBuZXdfc2Nyb2xsX3RvcDsKCQkJCQl9CgkJCQl9KTsKCgkJCQkvLyBIYW5kbGUgYSBjbGljayBvbiAkbW9iaWxlX25hdl90b2dnbGVfYnV0dG9uOgoJCQkJJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoJG1vYmlsZV9uYXZfdG9nZ2xlX2J1dHRvbi5hdHRyKCdleHBhbmRlZCcpID09ICJmYWxzZSIpIHsKCQkJCQkJJG1vYmlsZV9uYXZfbWVudS5hZGRDbGFzcygnbW9iaWxlLW1lbnUtZXhwYW5kZWQnKTsKCgkJCQkJCSRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cih7CgkJCQkJCQknZXhwYW5kZWQnOiAidHJ1ZSIKCQkJCQkJfSk7CgoJCQkJCQkkKGRvY3VtZW50KS5maW5kKCdib2R5JykKCQkJCQkJCS5hZGRDbGFzcygnbm9zY3JvbGwnKTsKCQkJCQl9IGVsc2UgaWYgKCRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cignZXhwYW5kZWQnKSA9PSAidHJ1ZSIpIHsKCQkJCQkJJG1vYmlsZV9uYXZfbWVudS5yZW1vdmVDbGFzcygnbW9iaWxlLW1lbnUtZXhwYW5kZWQnKTsKCgkJCQkJCSRtb2JpbGVfbmF2X3RvZ2dsZV9idXR0b24uYXR0cih7CgkJCQkJCQknZXhwYW5kZWQnOiAiZmFsc2UiCgkJCQkJCX0pOwoKCQkJCQkJJChkb2N1bWVudCkuZmluZCgnYm9keScpCgkJCQkJCQkucmVtb3ZlQ2xhc3MoJ25vc2Nyb2xsJyk7CgkJCQkJfQoJCQkJfSk7CgoJCQkJLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBeIEVWRU5UUyBeICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KCQkJfSk7CgkJ"></script> <footer><div id="site-generator"><div class="wrapper background-transparent"><div class="container m-auto height-180px all-width-outer-horizontal-bounds"><div class="row h-100 w-100 flex-nowrap footer-parent-row"><div id="footer-content" class="col"><div class="row h-100"><div class="col-auto px-0 d-flex align-items-center"> <a href="#" class="logo opaque-on-hover"> <img src="https://fletchercsi.com/intelligence/wp-content/uploads/2022/08/fletcher-footer-logo-500.png" alt="Fletcher Global Strategy Consulting Firm" alt="Fletcher Logo" /> </a></div></div></div><div id="footer-nav" class="col-auto width-unset"><div id="bottom-nav" class="row h-100 align-items-center justify-content-center flex-nowrap"><div class="col-auto height-fit-content px-26 white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/">Home</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about/#company">About</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about#careers">Careers</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/contact/">Contact</a></div><div class="col-auto height-fit-content px-26 border-left-1px-solid-fcsi-secondary-light-green white-space-nowrap"> <a class="underline-on-hover" href="https://fletchercsi.com/about#privacypolicy">Privacy Policy</a></div></div></div><div id="socials" class="col width-unset background-transparent"><div class="row h-100"><div class="col m-0 p-0 h-100 links-col"><div class="row h-100 w-100 align-items-center justify-content-end flex-nowrap"><div class="col-auto px-0"> <a href="https://www.linkedin.com/company/fletchercsi" target="_blank" class="opaque-on-hover color-black"> <i class="fa fa-linkedin" aria-hidden="true" alt="Find Fletcher CSI on LinkedIn"></i> </a></div><div class="col-auto px-0"> <a href="https://twitter.com/fletchercsi" target="_blank" class="opaque-on-hover color-black"> <i class="fa fa-twitter" aria-hidden="true" alt="Find Fletcher CSI on Twitter"></i> </a></div><div class="col-auto px-0 last"> <a href="https://vimeo.com/user114140327" target="_blank" class="pr-0 opaque-on-hover color-black"> <i class="fa fa-vimeo" aria-hidden="true" alt="Find Fletcher CSI on Vimeo"></i> </a></div></div></div></div></div></div></div></div></div></footer>

Pages: 1 2 3 4 5 6 7 8 9 10