[d869a2]: / Notebooks / 02_read_mesa_csv files.ipynb

Download this file

2294 lines (2293 with data), 1.4 MB

{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<script>\n",
       "    let is_dark_theme = function () {\n",
       "        // Jupyter Lab\n",
       "        if ('jpThemeLight' in document.body.dataset)\n",
       "            return (document.body.dataset.jpThemeLight === \"false\");\n",
       "\n",
       "        // VS Code\n",
       "        if ('vscodeThemeKind' in document.body.dataset)\n",
       "            return document.body.dataset.vscodeThemeKind.includes('dark');\n",
       "\n",
       "        // Jupyter Book\n",
       "        if ('theme' in document.documentElement.dataset)\n",
       "            return document.documentElement.dataset.theme.includes('dark');\n",
       "\n",
       "        // Default\n",
       "        return window.matchMedia('(prefers-color-scheme: dark)').matches;\n",
       "    }\n",
       "\n",
       "    if (is_dark_theme()) {\n",
       "        document.documentElement.classList.add('dark');\n",
       "    }\n",
       "    else {\n",
       "        document.documentElement.classList.remove('dark');\n",
       "    }\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<style>:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;box-sizing:border-box;content:\"\";border-top:5px solid transparent;border-left:10px solid rgba(0,0,0,.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0,0,0,.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:#ffffff80}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:#ffffff80;border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0!important;padding-top:0!important;padding-bottom:0!important;border-top-width:0px!important;border-bottom-width:0px!important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0!important;overflow:hidden!important}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before{position:absolute;display:block;bottom:50%;content:\"\\25b2\";content:\"\\25b2\"/\"\"}table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{position:absolute;display:block;top:50%;content:\"\\25bc\";content:\"\\25bc\"/\"\"}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>th.dt-ordering-asc,table.dataTable thead>tr>th.dt-ordering-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc,table.dataTable thead>tr>td.dt-ordering-asc,table.dataTable thead>tr>td.dt-ordering-desc{position:relative;padding-right:30px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order{position:absolute;right:12px;top:0;bottom:0;width:12px}table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0,0,0,.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc span.dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc span.dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc span.dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled span.dt-column-order:before,table.dataTable thead>tr>td.sorting_desc_disabled span.dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled span.dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255,255,255,.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:#0d6efd;background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0,1,1,0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}to{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0)}to{transform:translate(24px)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th,table.dataTable td{box-sizing:border-box}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable th.dt-empty,table.dataTable td.dt-empty{text-align:center;vertical-align:top}table.dataTable th.dt-type-numeric,table.dataTable th.dt-type-date,table.dataTable td.dt-type-numeric,table.dataTable td.dt-type-date{text-align:right}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td,table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:700}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0,0,0,.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{border-top:1px solid rgba(0,0,0,.3);padding:10px 10px 6px}table.dataTable>tbody>tr{background-color:transparent}table.dataTable>tbody>tr:first-child>*{border-top:none}table.dataTable>tbody>tr:last-child>*{border-bottom:none}table.dataTable>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.9);color:#fff;color:rgb(var(--dt-row-selected-text))}table.dataTable>tbody>tr.selected a{color:#090a0b;color:rgb(var(--dt-row-selected-link))}table.dataTable>tbody>tr>th,table.dataTable>tbody>tr>td{padding:8px 10px}table.dataTable.row-border>tbody>tr>*,table.dataTable.display>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15)}table.dataTable.row-border>tbody>tr:first-child>*,table.dataTable.display>tbody>tr:first-child>*{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}table.dataTable.cell-border>tbody>tr>*{border-top:1px solid rgba(0,0,0,.15);border-right:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr>*:first-child{border-left:1px solid rgba(0,0,0,.15)}table.dataTable.cell-border>tbody>tr:first-child>*{border-top:1px solid rgba(0,0,0,.3)}table.dataTable.stripe>tbody>tr:nth-child(odd)>*,table.dataTable.display>tbody>tr:nth-child(odd)>*{box-shadow:inset 0 0 0 9999px #00000006;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe),.023)}table.dataTable.stripe>tbody>tr:nth-child(odd).selected>*,table.dataTable.display>tbody>tr:nth-child(odd).selected>*{box-shadow:inset 0 0 0 9999px #0d6efdeb;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px #00000009;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd!important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),1)!important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_1{box-shadow:inset 0 0 0 9999px #0000000e;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.054)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_2{box-shadow:inset 0 0 0 9999px #0000000c;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.047)}table.dataTable.display>tbody>tr:nth-child(odd)>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd)>.sorting_3{box-shadow:inset 0 0 0 9999px #0000000a;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.039)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdf3;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.954)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf1;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.947)}table.dataTable.display>tbody>tr:nth-child(odd).selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr:nth-child(odd).selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdef;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px #00000005;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px #00000003;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px #00000001;box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering),.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdea;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efde8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efde6;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px #00000015;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px #00000013;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px #00000010;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover),.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px #0d6efdfa;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px #0d6efdf8;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px #0d6efdf5;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected),.962)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}div.dt-container div.dt-layout-row{display:flex;justify-content:space-between;align-items:center;width:100%;margin:.75em 0}div.dt-container div.dt-layout-row div.dt-layout-cell{display:flex;justify-content:space-between;align-items:center}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-start{justify-content:flex-start;margin-right:auto}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-end{justify-content:flex-end;margin-left:auto}div.dt-container div.dt-layout-row div.dt-layout-cell:empty{display:none}@media screen and (max-width: 767px){div.dt-container div.dt-layout-row:not(.dt-layout-table){display:block}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell{display:block;text-align:center}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell>*{margin:.5em 0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-start{margin-right:0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-end{margin-left:0}}div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:1em}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:1em}div.dt-container div.dt-layout-full{width:100%}div.dt-container div.dt-layout-full>*:only-child{margin-left:auto;margin-right:auto}div.dt-container div.dt-layout-table>div{display:block!important}@media screen and (max-width: 767px){div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:0}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:0}}div.dt-container{position:relative;clear:both}div.dt-container .dt-search input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}div.dt-container .dt-input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit}div.dt-container select.dt-input{padding:4px}div.dt-container .dt-paging .dt-paging-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none!important;cursor:pointer;color:inherit!important;border:1px solid transparent;border-radius:2px;background:transparent}div.dt-container .dt-paging .dt-paging-button.current,div.dt-container .dt-paging .dt-paging-button.current:hover{color:inherit!important;border:1px solid rgba(0,0,0,.3);background-color:#0000000d;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,rgba(230,230,230,.05)),color-stop(100%,rgba(0,0,0,.05)));background:-webkit-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-moz-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-ms-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:-o-linear-gradient(top,rgba(230,230,230,.05) 0%,rgba(0,0,0,.05) 100%);background:linear-gradient(to bottom,#e6e6e60d,#0000000d)}div.dt-container .dt-paging .dt-paging-button.disabled,div.dt-container .dt-paging .dt-paging-button.disabled:hover,div.dt-container .dt-paging .dt-paging-button.disabled:active{cursor:default;color:#00000080!important;border:1px solid transparent;background:transparent;box-shadow:none}div.dt-container .dt-paging .dt-paging-button:hover{color:#fff!important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0%,#111 100%);background:-moz-linear-gradient(top,#585858 0%,#111 100%);background:-ms-linear-gradient(top,#585858 0%,#111 100%);background:-o-linear-gradient(top,#585858 0%,#111 100%);background:linear-gradient(to bottom,#585858,#111)}div.dt-container .dt-paging .dt-paging-button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0%,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b,#0c0c0c);box-shadow:inset 0 0 3px #111}div.dt-container .dt-paging .ellipsis{padding:0 1em}div.dt-container .dt-length,div.dt-container .dt-search,div.dt-container .dt-info,div.dt-container .dt-processing,div.dt-container .dt-paging{color:inherit}div.dt-container .dataTables_scroll{clear:both}div.dt-container .dataTables_scroll div.dt-scroll-body{-webkit-overflow-scrolling:touch}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td{vertical-align:middle}div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>thead>tr>td>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>th>div.dataTables_sizing,div.dt-container .dataTables_scroll div.dt-scroll-body>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0!important;padding:0!important}div.dt-container.dt-empty-footer tbody>tr:last-child>*{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body{border-bottom:1px solid rgba(0,0,0,.3)}div.dt-container.dt-empty-footer .dt-scroll-body tbody>tr:last-child>*{border-bottom:none}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89,91,94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89,91,94)}html.dark table.dataTable.row-border>tbody>tr>*,html.dark table.dataTable.display>tbody>tr>*{border-top:1px solid rgb(64,67,70)}html.dark table.dataTable.row-border>tbody>tr:first-child>*,html.dark table.dataTable.display>tbody>tr:first-child>*{border-top:none}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0d6efda6;border-top-color:rgba(var(--dt-row-selected),.65)}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64,67,70);border-right:1px solid rgb(64,67,70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64,67,70)}html.dark .dt-container.dt-empty-footer table.dataTable{border-bottom:1px solid rgb(89,91,94)}html.dark .dt-container .dt-search input,html.dark .dt-container .dt-length select{border:1px solid rgba(255,255,255,.2);background-color:var(--dt-html-background)}html.dark .dt-container .dt-paging .dt-paging-button.current,html.dark .dt-container .dt-paging .dt-paging-button.current:hover{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark .dt-container .dt-paging .dt-paging-button.disabled,html.dark .dt-container .dt-paging .dt-paging-button.disabled:hover,html.dark .dt-container .dt-paging .dt-paging-button.disabled:active{color:#666!important}html.dark .dt-container .dt-paging .dt-paging-button:hover{border:1px solid rgb(53,53,53);background:#353535}html.dark .dt-container .dt-paging .dt-paging-button:active{background:#3a3a3a}*[dir=rtl] table.dataTable thead th,*[dir=rtl] table.dataTable thead td,*[dir=rtl] table.dataTable tfoot th,*[dir=rtl] table.dataTable tfoot td{text-align:right}*[dir=rtl] table.dataTable th.dt-type-numeric,*[dir=rtl] table.dataTable th.dt-type-date,*[dir=rtl] table.dataTable td.dt-type-numeric,*[dir=rtl] table.dataTable td.dt-type-date{text-align:left}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-start{text-align:right}*[dir=rtl] div.dt-container div.dt-layout-cell.dt-end{text-align:left}*[dir=rtl] div.dt-container div.dt-search input{margin:0 3px 0 0}@keyframes dtb-spinner{to{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{to{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{to{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dataTables_wrapper{position:relative}div.dt-buttons{position:initial}div.dt-buttons .dt-button{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:#fff;border-radius:.75em;box-shadow:3px 4px 10px 1px #000c;text-align:center;z-index:2003;overflow:hidden}div.dt-button-info h2{padding:2rem 2rem 1rem;margin:0;font-weight:400}div.dt-button-info>div{padding:1em 2em 2em}div.dtb-popover-close{position:absolute;top:6px;right:6px;width:22px;height:22px;text-align:center;border-radius:3px;cursor:pointer;z-index:2003}button.dtb-hide-drop{display:none!important}div.dt-button-collection-title{text-align:center;padding:.3em .5em .5em;margin-left:.5em;margin-right:.5em;font-size:.9em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}div.dt-button-collection-title:empty{display:none}span.dt-button-spacer{display:inline-block;margin:.5em;white-space:nowrap}span.dt-button-spacer.bar{border-left:1px solid rgba(0,0,0,.3);vertical-align:middle;padding-left:.5em}span.dt-button-spacer.bar:empty{height:1em;width:1px;padding-left:0}div.dt-button-collection .dt-button-active{padding-right:3em}div.dt-button-collection .dt-button-active:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:\"\\2713\";color:inherit}div.dt-button-collection .dt-button-active.dt-button-split{padding-right:0}div.dt-button-collection .dt-button-active.dt-button-split:after{display:none}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child{padding-right:3em}div.dt-button-collection .dt-button-active.dt-button-split>*:first-child:after{position:absolute;top:50%;margin-top:-10px;right:1em;display:inline-block;content:\"\\2713\";color:inherit}div.dt-button-collection .dt-button-active-a a{padding-right:3em}div.dt-button-collection .dt-button-active-a a:after{position:absolute;right:1em;display:inline-block;content:\"\\2713\";color:inherit}div.dt-button-collection span.dt-button-spacer{width:100%;font-size:.9em;text-align:center;margin:.5em 0}div.dt-button-collection span.dt-button-spacer:empty{height:0;width:100%}div.dt-button-collection span.dt-button-spacer.bar{border-left:none;border-bottom:1px solid rgba(0,0,0,.1);padding-left:0}@media print{table.dataTable tr>*{box-shadow:none!important}}html.dark div.dt-button-info{background-color:var(--dt-html-background);border:1px solid rgba(255,255,255,.15)}div.dt-buttons>.dt-button,div.dt-buttons>div.dt-button-split .dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-left:.167em;margin-right:.167em;margin-bottom:.333em;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(230, 230, 230, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\");-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dt-buttons>.dt-button:first-child,div.dt-buttons>div.dt-button-split .dt-button:first-child{margin-left:0}div.dt-buttons>.dt-button.disabled,div.dt-buttons>div.dt-button-split .dt-button.disabled{cursor:default;opacity:.4}div.dt-buttons>.dt-button.dt-button-active:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background-color:#0000001a;background:linear-gradient(to bottom,#b3b3b31a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(179, 179, 179, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\");box-shadow:inset 1px 1px 3px #999}div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){box-shadow:inset 1px 1px 3px #999;background-color:#0000001a;background:linear-gradient(to bottom,#8080801a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(128, 128, 128, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\")}div.dt-buttons>.dt-button:hover,div.dt-buttons>div.dt-button-split .dt-button:hover{text-decoration:none}div.dt-buttons>.dt-button:hover:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){border:1px solid #666;background-color:#0000001a;background:linear-gradient(to bottom,#9999991a,#0000001a);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr=\"rgba(153, 153, 153, 0.1)\",EndColorStr=\"rgba(0, 0, 0, 0.1)\")}div.dt-buttons>.dt-button:focus:not(.disabled),div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(53,132,228)}div.dt-buttons>.dt-button embed,div.dt-buttons>div.dt-button-split .dt-button embed{outline:none}div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(0,0,0,.15);border-top-right-radius:0;border-bottom-right-radius:0}div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid #666}div.dt-buttons>div.dt-button-split .dt-button:last-child{border-left:1px solid transparent;border-top-left-radius:0;border-bottom-left-radius:0}div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid #666}div.dt-buttons span.dt-button-down-arrow{position:relative;top:-2px;font-size:10px;padding-left:10px;line-height:1em;opacity:.6}div.dt-buttons div.dt-button-split{display:inline-block}div.dt-buttons div.dt-button-split .dt-button:first-child{margin-right:0}div.dt-buttons div.dt-button-split .dt-button:last-child{margin-left:-1px;padding-left:.75em;padding-right:.75em;z-index:2}div.dt-buttons div.dt-button-split .dt-button:last-child span{padding-left:0}div.dt-button-collection{position:absolute;top:0;left:0;width:200px;margin-top:3px;margin-bottom:3px;padding:.75em 0;border:1px solid rgba(0,0,0,.4);background-color:#fff;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 4px 10px 1px #0000004d;box-sizing:border-box}div.dt-button-collection .dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;background:none;margin:0;padding:.5em 1em;border:none;text-align:left;cursor:pointer;color:inherit}div.dt-button-collection .dt-button.dt-button-active{background:none;box-shadow:none}div.dt-button-collection .dt-button.disabled{cursor:default;opacity:.4}div.dt-button-collection .dt-button:hover:not(.disabled){border:none;background:#9999991a;box-shadow:none}div.dt-button-collection div.dt-button-split{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}div.dt-button-collection div.dt-button-split button.dt-button{margin:0;display:inline-block;width:0;flex-grow:1;flex-shrink:0;flex-basis:50px}div.dt-button-collection div.dt-button-split button.dt-button-split-drop{min-width:33px;flex:0}div.dt-button-collection.fixed .dt-button{border-radius:.25em;background:#ffffff1a}div.dt-button-collection.fixed{position:fixed;display:block;top:50%;left:50%;margin-left:-75px;border-radius:5px;background-color:#fff;padding:.5em}div.dt-button-collection.fixed.two-column{margin-left:-200px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection.fixed.columns{margin-left:-409px}@media screen and (max-width: 1024px){div.dt-button-collection.fixed.columns{margin-left:-308px}}@media screen and (max-width: 640px){div.dt-button-collection.fixed.columns{margin-left:-203px}}@media screen and (max-width: 460px){div.dt-button-collection.fixed.columns{margin-left:-100px}}div.dt-button-collection.fixed>:last-child{max-height:100vh;overflow:auto}div.dt-button-collection.two-column>:last-child,div.dt-button-collection.three-column>:last-child,div.dt-button-collection.four-column>:last-child{display:block!important;-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection.two-column>:last-child>*,div.dt-button-collection.three-column>:last-child>*,div.dt-button-collection.four-column>:last-child>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:400px}div.dt-button-collection.two-column>:last-child{padding-bottom:1px;column-count:2}div.dt-button-collection.three-column{width:450px}div.dt-button-collection.three-column>:last-child{padding-bottom:1px;column-count:3}div.dt-button-collection.four-column{width:600px}div.dt-button-collection.four-column>:last-child{padding-bottom:1px;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-collection.columns{width:auto}div.dt-button-collection.columns>:last-child{display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:6px;width:818px;padding-bottom:1px}div.dt-button-collection.columns>:last-child .dt-button{min-width:200px;flex:0 1;margin:0}div.dt-button-collection.columns.dtb-b3>:last-child,div.dt-button-collection.columns.dtb-b2>:last-child,div.dt-button-collection.columns.dtb-b1>:last-child{justify-content:space-between}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:1 1 32%}div.dt-button-collection.columns.dtb-b2 .dt-button{flex:1 1 48%}div.dt-button-collection.columns.dtb-b1 .dt-button{flex:1 1 100%}@media screen and (max-width: 1024px){div.dt-button-collection.columns>:last-child{width:612px}}@media screen and (max-width: 640px){div.dt-button-collection.columns>:last-child{width:406px}div.dt-button-collection.columns.dtb-b3 .dt-button{flex:0 1 32%}}@media screen and (max-width: 460px){div.dt-button-collection.columns>:last-child{width:200px}}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:#000000b3;background:radial-gradient(ellipse farthest-corner at center,#0000004d,#000000b3);z-index:2001}.dt-button.processing{color:#0003}.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:\" \";border:2px solid rgb(40,40,40);border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1.5s infinite linear;-o-animation:dtb-spinner 1.5s infinite linear;-ms-animation:dtb-spinner 1.5s infinite linear;-webkit-animation:dtb-spinner 1.5s infinite linear;-moz-animation:dtb-spinner 1.5s infinite linear}@media screen and (max-width: 640px){div.dt-buttons{float:none!important;text-align:center}}html.dark div.dt-buttons>.dt-button,html.dark div.dt-buttons>div.dt-button-split .dt-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled){background:#b3b3b326;box-shadow:inset 1px 1px 2px #000}html.dark div.dt-buttons>.dt-button.dt-button-active:not(.disabled):hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button.dt-button-active:not(.disabled):hover:not(.disabled){background:#80808026;box-shadow:inset 1px 1px 3px #000}html.dark div.dt-buttons>.dt-button:hover:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:hover:not(.disabled){background:#b3b3b326}html.dark div.dt-buttons>.dt-button:focus:not(.disabled),html.dark div.dt-buttons>div.dt-button-split .dt-button:focus:not(.disabled){outline:2px solid rgb(110,168,254)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child{border-right:1px solid rgba(255,255,255,.1)}html.dark div.dt-buttons>div.dt-button-split .dt-button:first-child:hover{border-right:1px solid rgb(89,91,94)}html.dark div.dt-buttons>div.dt-button-split .dt-button:last-child:hover{border-left:1px solid rgb(89,91,94)}html.dark div.dt-button-collection{border:1px solid rgba(255,255,255,.15);background-color:#212529;box-shadow:3px 4px 10px 1px #000c}table.dataTable thead tr>.dtfc-fixed-start,table.dataTable thead tr>.dtfc-fixed-end,table.dataTable tfoot tr>.dtfc-fixed-start,table.dataTable tfoot tr>.dtfc-fixed-end{top:0;bottom:0;z-index:3;background-color:#fff}table.dataTable tbody tr>.dtfc-fixed-start,table.dataTable tbody tr>.dtfc-fixed-end{z-index:1;background-color:#fff}table.dataTable tr>.dtfc-fixed-left:after,table.dataTable tr>.dtfc-fixed-right:after{position:absolute;top:0;bottom:0;width:10px;transition:box-shadow .3s;content:\"\";pointer-events:none}table.dataTable tr>.dtfc-fixed-left:after{right:0;transform:translate(100%)}table.dataTable tr>.dtfc-fixed-right:after{left:0;transform:translate(-80%)}table.dataTable.dtfc-scrolling-left tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0003}table.dataTable.dtfc-scrolling-right tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}div.dt-scroll,div.dtfh-floatingparent{position:relative}div.dt-scroll div.dtfc-top-blocker,div.dt-scroll div.dtfc-bottom-blocker,div.dtfh-floatingparent div.dtfc-top-blocker,div.dtfh-floatingparent div.dtfc-bottom-blocker{position:absolute;background-color:#fff}html.dark table.dataTable thead tr>.dtfc-fixed-start,html.dark table.dataTable thead tr>.dtfc-fixed-end,html.dark table.dataTable tfoot tr>.dtfc-fixed-start,html.dark table.dataTable tfoot tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable tbody tr>.dtfc-fixed-start,html.dark table.dataTable tbody tr>.dtfc-fixed-end{background-color:var(--dt-html-background)}html.dark table.dataTable.dtfc-scrolling-left tbody>tr>.dtfc-fixed-left:after{box-shadow:inset 10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right:after{box-shadow:inset -10px 0 8px -8px #0000004d}html.dark table.dataTable.dtfc-scrolling-right tbody>tr>.dtfc-fixed-right+.dtfc-fixed-right:after{box-shadow:none}html.dark div.dtfc-top-blocker,html.dark div.dtfc-bottom-blocker{background-color:var(--dt-html-background)}table.dataTable tbody th.focus,table.dataTable tbody td.focus{outline:2px solid #36f;outline-offset:-2px}table.dataTable tbody tr.selected th.focus,table.dataTable tbody tr.selected td.focus{outline-color:#03c}div.dtk-focus-alt table.dataTable tbody th.focus,div.dtk-focus-alt table.dataTable tbody td.focus{outline:2px solid #ff8b33;outline-offset:-2px}html.dark table.dataTable tbody th.focus,html.dark table.dataTable tbody td.focus{outline-color:#0d6efd}html.dark table.dataTable tbody tr.selected th.focus,html.dark table.dataTable tbody tr.selected td.focus{outline-color:#0143a3}html.dark div.dtk-focus-alt table.dataTable tbody th.focus,html.dark div.dtk-focus-alt table.dataTable tbody td.focus{outline-color:#ff8b33}table.dataTable tr.dtrg-group th{background-color:#0000001a;text-align:left}table.dataTable tr.dtrg-group.dtrg-level-0 th{font-weight:700}table.dataTable tr.dtrg-group.dtrg-level-1 th,table.dataTable tr.dtrg-group.dtrg-level-2 th,table.dataTable tr.dtrg-group.dtrg-level-3 th,table.dataTable tr.dtrg-group.dtrg-level-4 th,table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#0000000d;padding-top:.25em;padding-bottom:.25em;padding-left:2em;font-size:.9em}table.dataTable tr.dtrg-group.dtrg-level-2 th{background-color:#00000003;padding-left:2.5em}table.dataTable tr.dtrg-group.dtrg-level-3 th{background-color:#00000003;padding-left:3em}table.dataTable tr.dtrg-group.dtrg-level-4 th{background-color:#00000003;padding-left:3.5em}table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#00000003;padding-left:4em}html.dark table.dataTable tr.dtrg-group th{background-color:#ffffff1a}html.dark table.dataTable tr.dtrg-group.dtrg-level-1 th{background-color:#ffffff0d}html.dark table.dataTable tr.dtrg-group.dtrg-level-2 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-3 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-4 th,html.dark table.dataTable tr.dtrg-group.dtrg-level-5 th{background-color:#ffffff03}div.dt-datetime{position:absolute;background-color:#fff;z-index:2050;border:1px solid #ccc;box-shadow:0 5px 15px -5px #00000080;padding:6px 20px;width:275px;border-radius:5px}div.dt-datetime.inline{position:relative;box-shadow:none}div.dt-datetime div.dt-datetime-title{text-align:center;padding:5px 0 3px}div.dt-datetime div.dt-datetime-buttons{text-align:center}div.dt-datetime div.dt-datetime-buttons a{display:inline-block;padding:0 .5em .5em;margin:0;font-size:.9em}div.dt-datetime div.dt-datetime-buttons a:hover{text-decoration:underline}div.dt-datetime table{border-spacing:0;margin:12px 0;width:100%}div.dt-datetime table.dt-datetime-table-nospace{margin-top:-12px}div.dt-datetime table th{font-size:.8em;color:#777;font-weight:400;width:14.285714286%;padding:0 0 4px;text-align:center}div.dt-datetime table td{font-size:.9em;color:#444;padding:0}div.dt-datetime table td.selectable{text-align:center;background:#f5f5f5}div.dt-datetime table td.selectable.disabled,div.dt-datetime table td.selectable.disabled button:hover{color:#aaa;background:#fff}div.dt-datetime table td.selectable.now{background-color:#ddd}div.dt-datetime table td.selectable.now button{font-weight:700}div.dt-datetime table td.selectable.selected button{background:#4e6ca3;color:#fff;border-radius:2px}div.dt-datetime table td.selectable button:hover{background:#ff8000;color:#fff;border-radius:2px}div.dt-datetime table td.dt-datetime-week{font-size:.7em}div.dt-datetime table button{width:100%;box-sizing:border-box;border:none;background:transparent;font-size:inherit;color:inherit;text-align:center;padding:4px 0;cursor:pointer;margin:0}div.dt-datetime table button span{display:inline-block;min-width:14px;text-align:right}div.dt-datetime table.weekNumber th{width:12.5%}div.dt-datetime div.dt-datetime-calendar table{margin-top:0}div.dt-datetime div.dt-datetime-label{position:relative;display:inline-block;height:30px;padding:5px 6px;border:1px solid transparent;box-sizing:border-box;cursor:pointer}div.dt-datetime div.dt-datetime-label:hover{border:1px solid #ddd;border-radius:2px;background-color:#f5f5f5}div.dt-datetime div.dt-datetime-label select{position:absolute;top:6px;left:0;cursor:pointer;opacity:0}div.dt-datetime.horizontal{width:550px}div.dt-datetime.horizontal div.dt-datetime-date,div.dt-datetime.horizontal div.dt-datetime-time{width:48%}div.dt-datetime.horizontal div.dt-datetime-time{margin-left:4%}div.dt-datetime div.dt-datetime-date{position:relative;float:left;width:100%}div.dt-datetime div.dt-datetime-time{position:relative;float:left;width:100%;text-align:center}div.dt-datetime div.dt-datetime-time>span{vertical-align:middle}div.dt-datetime div.dt-datetime-time th{text-align:left}div.dt-datetime div.dt-datetime-time div.dt-datetime-timeblock{display:inline-block;vertical-align:middle}div.dt-datetime div.dt-datetime-iconLeft,div.dt-datetime div.dt-datetime-iconRight{width:30px;height:30px;background-position:center;background-repeat:no-repeat;opacity:.3;overflow:hidden;box-sizing:border-box;border:1px solid transparent}div.dt-datetime div.dt-datetime-iconLeft:hover,div.dt-datetime div.dt-datetime-iconRight:hover{border:1px solid #ccc;border-radius:2px;background-color:#f0f0f0;opacity:.6}div.dt-datetime div.dt-datetime-iconLeft button,div.dt-datetime div.dt-datetime-iconRight button{border:none;background:transparent;text-indent:30px;height:100%;width:100%;cursor:pointer}div.dt-datetime div.dt-datetime-iconLeft{position:absolute;top:5px;left:5px}div.dt-datetime div.dt-datetime-iconLeft button{position:relative;z-index:1}div.dt-datetime div.dt-datetime-iconLeft:after{position:absolute;top:7px;left:10px;display:block;content:\"\";border-top:7px solid transparent;border-right:7px solid black;border-bottom:7px solid transparent}div.dt-datetime div.dt-datetime-iconRight{position:absolute;top:5px;right:5px}div.dt-datetime div.dt-datetime-iconRight button{position:relative;z-index:1}div.dt-datetime div.dt-datetime-iconRight:after{position:absolute;top:7px;left:12px;display:block;content:\"\";border-top:7px solid transparent;border-left:7px solid black;border-bottom:7px solid transparent}div.dt-datetime-error{clear:both;padding:0 1em;max-width:240px;font-size:11px;line-height:1.25em;text-align:center;color:#b11f1f}html.dark input.dt-datetime{color-scheme:dark}html.dark div.dt-datetime{border:1px solid #595b5e;background-color:#212529;box-shadow:3px 4px 10px 1px #000c}html.dark div.dt-datetime table th{color:#ccc}html.dark div.dt-datetime table td{color:#eee}html.dark div.dt-datetime table td.selectable{background:#373c41}html.dark div.dt-datetime table td.selectable.disabled,html.dark div.dt-datetime table td.selectable.disabled button:hover{color:#aaa;background:#171b1f}html.dark div.dt-datetime table td.selectable.now{background:#4b5055}html.dark div.dt-datetime table td.selectable.selected button{background:#6ea8fe;color:#000}html.dark div.dt-datetime table td.selectable button:hover{background:#ff8000;color:#000}html.dark div.dt-datetime div.dt-datetime-label:hover,html.dark div.dt-datetime div.dt-datetime-iconLeft:hover,html.dark div.dt-datetime div.dt-datetime-iconRight:hover,html.dark div.dt-datetime div.dt-datetime-iconUp:hover,html.dark div.dt-datetime div.dt-datetime-iconDown:hover{border:1px solid transparent;background-color:#ffffff1a}html.dark div.dt-datetime div.dt-datetime-iconLeft:after{border-right-color:#fff}html.dark div.dt-datetime div.dt-datetime-iconRight:after{border-left-color:#fff}html.dark div.dt-datetime select{color-scheme:dark}html.dark div.dt-datetime-error{color:#b11f1f}div.dt-button-collection{overflow:visible!important;z-index:2002!important}div.dt-button-collection div.dtsb-searchBuilder{padding-left:1em!important;padding-right:1em!important}div.dt-button-collection.dtb-collection-closeable div.dtsb-titleRow{padding-right:40px}.dtsb-greyscale{border:1px solid #cecece!important}div.dtsb-logicContainer .dtsb-greyscale{border:none!important}div.dtsb-searchBuilder{justify-content:space-evenly;cursor:default;margin-bottom:1em;text-align:left;width:100%}div.dtsb-searchBuilder button.dtsb-button,div.dtsb-searchBuilder select{font-size:1em}div.dtsb-searchBuilder div.dtsb-titleRow{justify-content:space-evenly;margin-bottom:.5em}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title{display:inline-block;padding-top:14px}div.dtsb-searchBuilder div.dtsb-titleRow div.dtsb-title:empty{display:inline}div.dtsb-searchBuilder div.dtsb-titleRow button.dtsb-clearAll{float:right;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-vertical .dtsb-value,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-data,div.dtsb-searchBuilder div.dtsb-vertical .dtsb-condition{display:block}div.dtsb-searchBuilder div.dtsb-group{position:relative;clear:both;margin-bottom:.8em}div.dtsb-searchBuilder div.dtsb-group button.dtsb-search{float:right}div.dtsb-searchBuilder div.dtsb-group button.dtsb-clearGroup{margin:2px;text-align:center;padding:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);position:absolute;margin-top:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{margin-bottom:.8em;display:flex;justify-content:start;flex-flow:row wrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{padding:.4em;margin-right:.8em;min-width:5em;max-width:20em;color:inherit;font-size:1em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown option.dtsb-notItalic,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input option.dtsb-notItalic{font-style:normal}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-italic{font-style:italic}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{flex:1;white-space:nowrap}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont span.dtsb-joiner{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input.dtsb-value{width:33%}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont select,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont input{height:100%;box-sizing:border-box}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{margin-left:auto;display:inline-block}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-delete:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-right:last-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button.dtsb-left:last-child{margin-right:0}@media screen and (max-width: 550px){div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria{display:flex;flex-flow:none;flex-direction:column;justify-content:start;padding-right:calc(35px + .8em);margin-bottom:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:first-child),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:nth-child(2)),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:not(:last-child){padding-top:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:first-child,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:nth-child(2),div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria:last-child{padding-top:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{max-width:none;width:100%;margin-bottom:.8em;margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-inputCont{margin-right:.8em}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer{position:absolute;width:35px;display:flex;flex-wrap:wrap-reverse;right:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria div.dtsb-buttonContainer button{margin-right:0!important}}div.dtsb-searchBuilder button,div.dtsb-searchBuilder select.dtsb-dropDown,div.dtsb-searchBuilder input{background-color:#f9f9f9}div.dtsb-searchBuilder button.dtsb-button{position:relative;display:inline-block;box-sizing:border-box;padding:.5em 1em;border:1px solid rgba(0,0,0,.3);border-radius:2px;cursor:pointer;font-size:.88em;line-height:1.6em;color:inherit;white-space:nowrap;overflow:hidden;background-color:#0000001a;background:linear-gradient(to bottom,#e6e6e61a,#0000001a);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none;text-overflow:ellipsis}div.dtsb-searchBuilder button.dtsb-button:hover{background-color:#cecece;cursor:pointer}div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgba(0,0,0,.3);background-color:#0000001a;background:linear-gradient(to right,#e6e6e61a,#0000001a)}div.dtsb-searchBuilder div.dtsb-logicContainer button{border:1px solid transparent;background:transparent}div.dtsb-searchBuilder button.dtsb-clearGroup{min-width:2em;padding:0}div.dtsb-searchBuilder button.dtsb-iptbtn{min-width:100px;text-align:left}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer{border:1px solid;border-color:#cecece;border-radius:3px;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-logic{border:none;border-radius:0;flex-grow:1;flex-shrink:0;flex-basis:3em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-logicContainer button.dtsb-clearGroup{border:none;border-radius:0;width:2em;margin:0}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-dropDown,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-input{border:1px solid;border-radius:3px}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-condition{border-color:#48b13c}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-data{border-color:#e70f00}div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria select.dtsb-value,div.dtsb-searchBuilder div.dtsb-group div.dtsb-criteria input.dtsb-value{border-color:#0069ba}html.dark div.dtsb-searchBuilder button.dtsb-button,html.dark div.dtsb-searchBuilder select.dtsb-dropDown,html.dark div.dtsb-searchBuilder input.dtsb-input{background-color:#424549!important;color-scheme:dark}html.dark div.dtsb-searchBuilder button.dtsb-button{border:1px solid rgb(89,91,94);background:#ffffff26}html.dark div.dtsb-searchBuilder button.dtsb-button:hover{background:#b3b3b326}html.dark div.dtsb-searchBuilder div.dtsb-logicContainer{border:1px solid rgb(89,91,94)}html.dark div.dtsb-searchBuilder .dtsb-greyscale{border-color:#fff3!important}div.dtsp-topRow{display:flex;flex-direction:row;flex-wrap:nowrap;border:2px solid rgba(0,0,0,0);border-radius:3px;justify-content:space-around;align-content:flex-start;align-items:flex-start}div.dtsp-topRow input.dtsp-search{text-overflow:ellipsis;min-width:50px;flex-basis:90px;max-width:none}div.dtsp-topRow input.dtsp-search::placeholder{color:inherit}div.dtsp-topRow div.dtsp-subRow1{display:flex;flex-direction:row;flex-wrap:nowrap;flex:1 1 auto}div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont{position:relative;width:100%}div.dtsp-topRow div.dtsp-subRow1 input{padding-right:2em;width:100%!important;box-sizing:border-box;font-size:1em}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{background-color:transparent;border:none;cursor:initial;box-shadow:none;padding-bottom:0;padding-top:0;min-height:1em;height:fit-content;box-sizing:content-box}div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]::placeholder{color:initial;opacity:1}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon{position:absolute;top:0;right:0;bottom:0}div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAABbmlDQ1BpY2MAACiRdZE7SwNBFIU/EyWikRRaiFhsoWKhEBREO42FTZAQFYza7G5eQhKX3QQJtoKNhWAh2vgq/AfaCrYKgqAIIhb+Al+NhPVOEkiQZJbZ+3FmzmXmDHjCGTPrtAYhm8vb0bmQthxb0Xzv+PHRxRSabjrWTCQSpun4eaRF1YdR1av5voajM55wTGhpF54wLTsvPC0c3sxbineFe8y0Hhc+ER6x5YDCt0o3KvymOFXhL8X2YnQWPKqnlqpjo47NtJ0VHhYeyGYKZvU86ib+RG5pQWqfzH4coswRQsOgwDoZ8oxKzUlmjX3Bsm+eDfGY8rcoYosjRVq8I6IWpGtCalL0hHwZiir3/3k6yfGxSnd/CNpeXfdzEHz7UNpz3d9T1y2dgfcFrnM1/4bkNPkt+l5NGziGwDZc3tQ04wCudqD32dJtvSx5ZXqSSfi4gK4YdN9Dx2olq+o650+wuCVPdAeHRzAk+wNrfw8JaBFXEnV+AAAACXBIWXMAAA9hAAAPYQGoP6dpAAABMUlEQVQoU6XRr0vDQRjH8akoM4iIjqGoOIZ5oIjB5XWxajaYDGLSIhhNYjcPRDSJwbQNw+L+BNGgYYo/5pT5/shz8vDlBgMPXux7z3N3z+25VOofYyCyd4ZYCavI4gXPsRp9LqiDdrEMH+8wv8Vh8gBfWclFPOEUN3hAHjlMoRa7wTzBS5xgKLFglPkZLjDic6HyDsEMNvGR2Nxifoci3tEI+X770JU0XmPXIlax+LTPh83fFox1X6kxyzdjm9UcdXi9S+Vti6svfyNULhNR9TVsYNhW6Ff9KKCNR7/Zv6eeaQ+6+qcdpu9BqGlp1HFgud+FYdzzUcUExu0Q/cdzHGEFetIlXKPjK/sbqYoOftMiS+j9jzEJPd1Wt+5+kdR/9EM9ucIC5jCbyPc01Q32kfsBppYz3hYFcCwAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:12px}div.dtsp-topRow div.dtsp-subRow2{white-space:nowrap;flex:0 0 auto}div.dtsp-topRow button>span{display:inline-block;height:100%;width:100%}div.dtsp-topRow button.dtsp-nameButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAjCAYAAAAe2bNZAAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAK2SURBVFgJ7ZY9j41BFICvryCExrJBQ6HyEYVEIREaUZDQIRoR2ViJKCioxV+gkVXYTVZEQiEUhG2EQnxUCh0FKolY4ut5XnM2cyfva3Pt5m7EPcmzZ2bemTNnzjkzd1utnvQi0IvAfxiBy5z5FoxO89kPY+8mbMjtzs47RXs5/WVpbAG6bWExt5PuIibvhVkwmC+ck3eK9ln6/fAddFojYzBVuYSBpcnIEvRaqOw2RcaN18FPuJH0JvRUxbT3wWf4ltiKPgfVidWlbGZgPozDFfgAC+EA/K2EI4cwcAJ+gPaeQ+VQU2SOMMGcPgPl/m/V2p50rrbRsRgt9Iv5h6xtpP22Bz7Ce1C+gFFxfKzOmShcU+Qmyh2w3w8rIJfddHTck66EukL/xPhj+JM8rHNmFys0Pg4v0up3aFNlwR9NYyodd3OL/C64zpsymcTFcf6ElM4YzjAWKYrJkaq8kE/yUYNP4BoYvS1QRo+hNtF5xfkTUjoTheukSFFMjlTFm6PjceOca/SMpKfeCR1L6Uzk/y2WIkVhNFJlJAZhP+hYns7b9D3IPuhY5mYrIv8OrQJvR5NYyNaW4jsU8pSGNySiVx4o5tXq3JkoXE/mg5R/M8dGJCJpKhaDcjBRdbI/Rm8g69c122om33BHmj2CHoV5qa9jUXBraJ+G1fAVjIBO1klc87ro1K4JZ/K35SWW3TwcyDd6TecqnAEd8cGq2+w84xvBm1n3vS0izKkkwh5XNC/GmFPqqAtPF89AOScKuemaNzoTV1SD5dtSbmLf1/RV+tC0WTgcj6R7HEtrVGWaqu/lYDZ/2pvxQ/kIyw/gFByHC9AHw910hv1aUUumyd8yy0QfhmEkfiNod0Xusct68J1qc8Tdux0Z97Q+hsDb+AYGYEbF/4Guw2Q/qDPqZG/zXgT+3Qj8AtKnfWhFwmuAAAAAAElFTkSuQmCC)!important;background-repeat:no-repeat;background-position:center;background-size:23px;vertical-align:bottom}div.dtsp-topRow button.dtsp-countButton span{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABcGlDQ1BpY2MAACiRdZHNSwJBGMYftTDS8FCHkA57sOigIAXRMQzyYh3UIKvL7rirwe66zK6IdA26dBA6RF36OvQf1DXoWhAERRAR9B/0dQnZ3nEFJXSG2ffHs/O8zDwD+DM6M+yBJGCYDs+mU9JaYV0KviNMM4QoEjKzreXcUh59x88jfKI+JESv/vt6jlBRtRngGyKeYxZ3iBeIMzXHErxHPMbKcpH4hDjO6YDEt0JXPH4TXPL4SzDPZxcBv+gplbpY6WJW5gbxNHHM0KusfR5xk7BqruaoRmlNwEYWaaQgQUEVW9DhIEHVpMx6+5It3woq5GH0tVAHJ0cJZfLGSa1SV5WqRrpKU0dd5P4/T1ubnfG6h1PA4Kvrfk4CwX2g2XDd31PXbZ4BgRfg2uz4K5TT/DfpjY4WOwYiO8DlTUdTDoCrXWD82ZK53JICtPyaBnxcACMFYPQeGN7wsmr/x/kTkN+mJ7oDDo+AKdof2fwDCBRoDkL8UccAAAAJcEhZcwAAD2EAAA9hAag/p2kAAAG5SURBVEgN3VU9LwVBFF0fiYhofUSlEQkKhU7z/oBCQkIiGr9BgUbhVzy9BAnhFyjV/AYFiU5ICM7ZN+c5Zud5dm3lJmfmzrkz9+7cu3c3y/6jjOBSF8CxXS7FmTkbwqIJjDpJvTcmsJ4K3KPZUpyZsx0sxoB9J6mnAkyC7wGuuCFIipNtEcpcWExgXpOBc78vgj6N+QO4NVsjwdFM59tUIDxDrHMBOeIQ34C5ZDregXuAQm4YcI68nN9B3wr2PcwPAIPkN2EqtJH6b+QZm1ajjTx7BqwAr26Lb+C2Kvpbt0Mb2HAJ7NrGFGfmXO3DeA4UshDfQAVmH0gaUFg852TTTDvlxwBlCtxy9zXyBhQFaq0wMmIdRebrfgosA3zb2hKnqG0oqchp4QbuR8X0TjzABhbdOT8jnQ/atcgqpnfwOA7yqZyTU587ZkIGdesLTt2EkynOnbreMUUKMI/dA4B/QVOcO13CQh+5wWCgDwo/75u59odB/wjmfhbgvACcAOyZPHihMWAoIwxyCLgf1oxfgjzVbgBXSTzIN+f0pg6s5DkcesLMRpsBrgE2XO3CN64JFP7JtUeKHX4CKtRRXFZ+7dEAAAAASUVORK5CYII=)!important;background-repeat:no-repeat;background-position:center;background-size:18px;vertical-align:bottom}div.dtsp-topRow button.dtsp-collapseButton span.dtsp-caret{position:relative;top:9px;display:inline-block}div.dtsp-topRow button.dtsp-collapseButton.dtsp-rotated{transform:rotate(180deg)}div.dtsp-searchPane table thead th,div.dtsp-searchPane table thead td{width:100%!important}div.dt-button-collection{z-index:2002}div.dt-button-collection.dtb-collection-closeable div.dtsp-titleRow{padding-right:25px}div.dtsp-columns-1{max-width:100%;min-width:100%;margin:0!important}div.dtsp-columns-2{max-width:49%;min-width:49%;margin:0!important}div.dtsp-columns-3{max-width:32%;min-width:32%;margin:0!important}div.dtsp-columns-4{max-width:24%;min-width:24%;margin:0!important}div.dtsp-columns-5{max-width:19%;min-width:19%;margin:0!important}div.dtsp-columns-6{max-width:16%;min-width:16%;margin:0!important}div.dtsp-columns-7{max-width:14%;min-width:14%;margin:0!important}div.dtsp-columns-8{max-width:12%;min-width:12%;margin:0!important}div.dtsp-columns-9{max-width:10.5%;min-width:10.5%;margin:0!important}div.dtsp-narrow{flex-direction:column!important}div.dtsp-narrow div.dtsp-subRow1,div.dtsp-narrow div.dtsp-subRow2{width:100%}div.dtsp-narrow div.dtsp-subRow2 button{margin:0!important;width:25%!important}div.dt-button-collection div.dtsp-panesContainer{padding-left:1em;padding-right:1em;margin-bottom:0}div.dtsp-panesContainer{margin-bottom:1em}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{width:100%}div.dtsp-searchPane div.dt-container div.dataTables_layout_cell,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_layout_cell{padding:0}div.dtsp-searchPane div.dt-container div.dt-scroll-head,div.dtsp-searchPane div.dt-container div.dataTables_scrollHead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-head,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollHead{display:none!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#fff!important;border:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body thead,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody thead,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body thead,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody thead{display:none}div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dt-container div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body table tr>td,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>th,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody table tr>td{padding:5px 10px}div.dtsp-searchPane div.dt-container div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body td.dtsp-nameColumn,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody td.dtsp-nameColumn{width:100%!important}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont{width:100%;display:flex;flex-direction:row;justify-content:flex-start;align-content:flex-start;align-items:flex-start}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{cursor:default}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-name,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-name{text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:middle;white-space:nowrap;flex-grow:1;text-align:left}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{display:inline-block;background-color:#cfcfcf;text-align:center;border-radius:10px;width:auto;min-width:30px;color:#000;font-size:.9em;padding:0 4px}div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill:empty,div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill:empty{display:none}div.dtsp-panesContainer{clear:both;padding-left:0;padding-right:0;text-align:center}div.dtsp-panesContainer div.dtsp-searchPanes{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-content:flex-start;align-items:stretch;clear:both;text-align:left}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane{flex-grow:1;flex-shrink:0;font-size:.9em;margin-top:15px!important}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper{flex:1;box-sizing:border-box}div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dt-container div.dataTables_filter,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dt-search,div.dtsp-panesContainer div.dtsp-searchPanes div.dtsp-searchPane div.dataTables_wrapper div.dataTables_filter{display:none}div.dtsp-panesContainer div.dtsp-title{float:left;padding:10px 0}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{float:right}div.dtsp-hidden{display:none!important}html.dark div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder,html[data-bs-theme=dark] div.dtsp-topRow div.dtsp-subRow1 div.dtsp-searchCont input[disabled=disabled]::placeholder{color:#fff}div.dtsp-searchPane div.dt-container,div.dtsp-searchPane div.dataTables_wrapper{border:1px solid #f0f0f0;border-radius:4px;overflow:hidden}div.dtsp-searchPane div.dt-container:hover,div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid #cfcfcf}div.dtsp-searchPane div.dt-container div.dt-scroll,div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll{margin:-5px 0}div.dtsp-searchPane div.dt-container table.dataTable,div.dtsp-searchPane div.dataTables_wrapper table.dataTable{border-bottom:none!important}div.dtsp-searchPane div.dtsp-topRow{border:1px solid transparent}div.dtsp-searchPane div.dtsp-topRow div.dtsp-subRow1 input[disabled=disabled]{padding-bottom:5px}div.dtsp-searchPane div.dtsp-topRow div.dtsp-searchCont input.dtsp-search{border:none;padding-left:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered{border:1px solid #f0f0f0;border-radius:3px}div.dtsp-searchPane div.dtsp-topRow.dtsp-bordered:hover{background-color:#f0f0f0}div.dtsp-searchPane input.dtsp-paneInputButton,div.dtsp-searchPane button.dtsp-paneButton{height:35px;width:35px;min-width:0;display:inline-block;margin:2px 2px 0;border:0px solid transparent;background-color:transparent}div.dtsp-searchPane input.dtsp-paneInputButton:hover,div.dtsp-searchPane button.dtsp-paneButton:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-searchPane button.dtsp-paneButton{vertical-align:middle;opacity:.6}div.dtsp-panesContainer button.dtsp-clearAll,div.dtsp-panesContainer button.dtsp-collapseAll,div.dtsp-panesContainer button.dtsp-showAll{border:1px solid transparent;background-color:transparent}div.dtsp-panesContainer button.dtsp-clearAll:hover,div.dtsp-panesContainer button.dtsp-collapseAll:hover,div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#f0f0f0;border-radius:2px;cursor:pointer}div.dtsp-panesContainer button.dtsp-disabledButton{cursor:default!important;color:#7c7c7c}div.dtsp-panesContainer button.dtsp-disabledButton:hover{background-color:transparent}div.dtsp-panesContainer button.dtsp-disabledButton:focus{outline:none}@media screen and (max-width: 767px){div.dtsp-columns-4,div.dtsp-columns-5,div.dtsp-columns-6{max-width:31%!important;min-width:31%!important}}@media screen and (max-width: 640px){div.dtsp-searchPanes{flex-direction:column!important}div.dtsp-searchPane{max-width:98%!important;min-width:98%!important}}html.dark div.dtsp-topRow div.dtsp-subRow1 button.dtsp-searchIcon span,html.dark div.dtsp-topRow button.dtsp-nameButton span,html.dark div.dtsp-topRow button.dtsp-countButton span{filter:invert(1)}html.dark div.dtsp-topRow input.dtsp-paneInputButton,html.dark div.dtsp-topRow button.dtsp-paneButton{color:inherit}html.dark div.dtsp-topRow input.dtsp-paneInputButton:hover,html.dark div.dtsp-topRow button.dtsp-paneButton:hover{background-color:#404549}html.dark div.dtsp-topRow.dtsp-bordered{border:1px solid rgba(255,255,255,.2);background:#2f3438!important}html.dark div.dtsp-topRow.dtsp-bordered:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-panesContainer button.dtsp-clearAll,html.dark div.dtsp-panesContainer button.dtsp-collapseAll,html.dark div.dtsp-panesContainer button.dtsp-showAll{color:inherit}html.dark div.dtsp-panesContainer button.dtsp-clearAll:hover,html.dark div.dtsp-panesContainer button.dtsp-collapseAll:hover,html.dark div.dtsp-panesContainer button.dtsp-showAll:hover{background-color:#404549}html.dark div.dtsp-panesContainer button.dtsp-disabledButton{color:#7c7c7c}html.dark div.dtsp-searchPane div.dt-container,html.dark div.dtsp-searchPane div.dataTables_wrapper{border:1px solid rgba(255,255,255,.2)}html.dark div.dtsp-searchPane div.dt-container:hover,html.dark div.dtsp-searchPane div.dataTables_wrapper:hover{border:1px solid rgba(255,255,255,.3)}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody{background:#2f3438!important}html.dark div.dtsp-searchPane div.dt-container div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dt-container div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dt-scroll-body div.dtsp-nameCont span.dtsp-pill,html.dark div.dtsp-searchPane div.dataTables_wrapper div.dataTables_scrollBody div.dtsp-nameCont span.dtsp-pill{background-color:#212529;color:inherit}table.dataTable>tbody>tr>.selected{background-color:#0d6efde6;color:#fff}table.dataTable>tbody>tr>.dt-select{text-align:center;vertical-align:middle}table.dataTable>thead>tr>.dt-select{text-align:center}table.dataTable input.dt-select-checkbox{appearance:none;position:relative;display:inline-block;width:12px;height:12px;border:1px solid;border-radius:3px;vertical-align:middle;margin-top:1px;color:inherit;font-size:20px;line-height:1em}table.dataTable input.dt-select-checkbox:checked:after{display:block;content:\"\\2713\";margin-top:-8px}table.dataTable input.dt-select-checkbox:indeterminate:after{display:block;position:absolute;content:\" \";top:3px;left:3px;height:4px;width:4px;background-color:#000;border-radius:2px}table.dataTable>tbody>tr.selected input.dt-select-checkbox:checked{border:1px solid}table.dataTable>tbody>tr>td.select-checkbox,table.dataTable>tbody>tr>th.select-checkbox{position:relative}table.dataTable>tbody>tr>td.select-checkbox:before,table.dataTable>tbody>tr>th.select-checkbox:before{display:block;position:absolute;top:50%;left:50%;width:12px;height:12px;box-sizing:border-box;content:\" \";margin-top:-6px;margin-left:-6px;border:1px solid;border-radius:3px}table.dataTable>tbody>tr.selected>td.select-checkbox:before,table.dataTable>tbody>tr.selected>th.select-checkbox:before{border:1px solid;content:\"\\2713\";font-size:20px;line-height:6px;text-align:center}table.dataTable.compact>tbody>tr>td.select-checkbox:before,table.dataTable.compact>tbody>tr>th.select-checkbox:before{margin-top:-12px}table.dataTable.compact>tbody>tr.selected>td.select-checkbox:after,table.dataTable.compact>tbody>tr.selected>th.select-checkbox:after{margin-top:-16px}div.dt-container span.select-info,div.dt-container span.select-item{margin-left:.5em}html.dark table.dataTable input.dt-select-checkbox:indeterminate:after,html[data-bs-theme=dark] table.dataTable input.dt-select-checkbox:indeterminate:after{background-color:#fff}@media screen and (max-width: 640px){div.dt-container span.select-info,div.dt-container span.select-item{margin-left:0;display:block}}div.dt-container{max-width:100%}div.dt-layout-table>div{overflow:auto;max-width:100%}\n",
       "</style>\n",
       "<div style=\"vertical-align:middle; text-align:left\">\n",
       "<script>\n",
       "window._datatables_src_for_itables_2_2_2 = \"data:text/javascript;base64,dmFyIHFvPU9iamVjdC5jcmVhdGU7dmFyIE5hPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgWW89T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyICRvPU9iamVjdC5nZXRQcm90b3R5cGVPZixabz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBabj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbbl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KTt2YXIgT2E9KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKTt2YXIgS289KHQsZSxuLHIpPT57aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QifHx0eXBlb2YgZT09ImZ1bmN0aW9uIilmb3IobGV0IHMgb2YgWW8oZSkpIVpvLmNhbGwodCxzKSYmcyE9PW4mJk5hKHQscyx7Z2V0OigpPT5lW3NdLGVudW1lcmFibGU6IShyPVhvKGUscykpfHxyLmVudW1lcmFibGV9KTtyZXR1cm4gdH07dmFyIGllPSh0LGUsbik9PihuPXQhPW51bGw/cW8oJG8odCkpOnt9LEtvKGV8fCF0fHwhdC5fX2VzTW9kdWxlP05hKG4sImRlZmF1bHQiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITB9KTpuLHQpKTt2YXIgUmE9T2EoKEVhLHBpKT0+eyhmdW5jdGlvbih0KXt0eXBlb2YgRWE9PSJvYmplY3QiJiZ0eXBlb2YgcGk8InUiP3BpLmV4cG9ydHM9dCgpOnR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQ/ZGVmaW5lKFtdLHQpOih0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6dHlwZW9mIGdsb2JhbDwidSI/Z2xvYmFsOnR5cGVvZiBzZWxmPCJ1Ij9zZWxmOnRoaXMpLkpTWmlwPXQoKX0pKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQoZSxuLHIpe2Z1bmN0aW9uIHModSxwKXtpZighblt1XSl7aWYoIWVbdV0pe3ZhciBiPXR5cGVvZiBabj09ImZ1bmN0aW9uIiYmWm47aWYoIXAmJmIpcmV0dXJuIGIodSwhMCk7aWYoaSlyZXR1cm4gaSh1LCEwKTt2YXIgZz1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIit1KyInIik7dGhyb3cgZy5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixnfXZhciBtPW5bdV09e2V4cG9ydHM6e319O2VbdV1bMF0uY2FsbChtLmV4cG9ydHMsZnVuY3Rpb24oQyl7dmFyIHk9ZVt1XVsxXVtDXTtyZXR1cm4gcyh5fHxDKX0sbSxtLmV4cG9ydHMsdCxlLG4scil9cmV0dXJuIG5bdV0uZXhwb3J0c31mb3IodmFyIGk9dHlwZW9mIFpuPT0iZnVuY3Rpb24iJiZabixvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi91dGlscyIpLHM9dCgiLi9zdXBwb3J0IiksaT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iO24uZW5jb2RlPWZ1bmN0aW9uKG8pe2Zvcih2YXIgdSxwLGIsZyxtLEMseSxUPVtdLFA9MCxjPW8ubGVuZ3RoLGw9YyxoPXIuZ2V0VHlwZU9mKG8pIT09InN0cmluZyI7UDxvLmxlbmd0aDspbD1jLVAsYj1oPyh1PW9bUCsrXSxwPVA8Yz9vW1ArK106MCxQPGM/b1tQKytdOjApOih1PW8uY2hhckNvZGVBdChQKyspLHA9UDxjP28uY2hhckNvZGVBdChQKyspOjAsUDxjP28uY2hhckNvZGVBdChQKyspOjApLGc9dT4+MixtPSgzJnUpPDw0fHA+PjQsQz0xPGw/KDE1JnApPDwyfGI+PjY6NjQseT0yPGw/NjMmYjo2NCxULnB1c2goaS5jaGFyQXQoZykraS5jaGFyQXQobSkraS5jaGFyQXQoQykraS5jaGFyQXQoeSkpO3JldHVybiBULmpvaW4oIiIpfSxuLmRlY29kZT1mdW5jdGlvbihvKXt2YXIgdSxwLGIsZyxtLEMseT0wLFQ9MCxQPSJkYXRhOiI7aWYoby5zdWJzdHIoMCxQLmxlbmd0aCk9PT1QKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBiYXNlNjQgaW5wdXQsIGl0IGxvb2tzIGxpa2UgYSBkYXRhIHVybC4iKTt2YXIgYyxsPTMqKG89by5yZXBsYWNlKC9bXkEtWmEtejAtOSsvPV0vZywiIikpLmxlbmd0aC80O2lmKG8uY2hhckF0KG8ubGVuZ3RoLTEpPT09aS5jaGFyQXQoNjQpJiZsLS0sby5jaGFyQXQoby5sZW5ndGgtMik9PT1pLmNoYXJBdCg2NCkmJmwtLSxsJTEhPTApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGJhc2U2NCBpbnB1dCwgYmFkIGNvbnRlbnQgbGVuZ3RoLiIpO2ZvcihjPXMudWludDhhcnJheT9uZXcgVWludDhBcnJheSgwfGwpOm5ldyBBcnJheSgwfGwpO3k8by5sZW5ndGg7KXU9aS5pbmRleE9mKG8uY2hhckF0KHkrKykpPDwyfChnPWkuaW5kZXhPZihvLmNoYXJBdCh5KyspKSk+PjQscD0oMTUmZyk8PDR8KG09aS5pbmRleE9mKG8uY2hhckF0KHkrKykpKT4+MixiPSgzJm0pPDw2fChDPWkuaW5kZXhPZihvLmNoYXJBdCh5KyspKSksY1tUKytdPXUsbSE9PTY0JiYoY1tUKytdPXApLEMhPT02NCYmKGNbVCsrXT1iKTtyZXR1cm4gY319LHsiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzJ9XSwyOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vZXh0ZXJuYWwiKSxzPXQoIi4vc3RyZWFtL0RhdGFXb3JrZXIiKSxpPXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxvPXQoIi4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZSIpO2Z1bmN0aW9uIHUocCxiLGcsbSxDKXt0aGlzLmNvbXByZXNzZWRTaXplPXAsdGhpcy51bmNvbXByZXNzZWRTaXplPWIsdGhpcy5jcmMzMj1nLHRoaXMuY29tcHJlc3Npb249bSx0aGlzLmNvbXByZXNzZWRDb250ZW50PUN9dS5wcm90b3R5cGU9e2dldENvbnRlbnRXb3JrZXI6ZnVuY3Rpb24oKXt2YXIgcD1uZXcgcyhyLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkucGlwZSh0aGlzLmNvbXByZXNzaW9uLnVuY29tcHJlc3NXb3JrZXIoKSkucGlwZShuZXcgbygiZGF0YV9sZW5ndGgiKSksYj10aGlzO3JldHVybiBwLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aWYodGhpcy5zdHJlYW1JbmZvLmRhdGFfbGVuZ3RoIT09Yi51bmNvbXByZXNzZWRTaXplKXRocm93IG5ldyBFcnJvcigiQnVnIDogdW5jb21wcmVzc2VkIGRhdGEgc2l6ZSBtaXNtYXRjaCIpfSkscH0sZ2V0Q29tcHJlc3NlZFdvcmtlcjpmdW5jdGlvbigpe3JldHVybiBuZXcgcyhyLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSkud2l0aFN0cmVhbUluZm8oImNvbXByZXNzZWRTaXplIix0aGlzLmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygidW5jb21wcmVzc2VkU2l6ZSIsdGhpcy51bmNvbXByZXNzZWRTaXplKS53aXRoU3RyZWFtSW5mbygiY3JjMzIiLHRoaXMuY3JjMzIpLndpdGhTdHJlYW1JbmZvKCJjb21wcmVzc2lvbiIsdGhpcy5jb21wcmVzc2lvbil9fSx1LmNyZWF0ZVdvcmtlckZyb209ZnVuY3Rpb24ocCxiLGcpe3JldHVybiBwLnBpcGUobmV3IGkpLnBpcGUobmV3IG8oInVuY29tcHJlc3NlZFNpemUiKSkucGlwZShiLmNvbXByZXNzV29ya2VyKGcpKS5waXBlKG5ldyBvKCJjb21wcmVzc2VkU2l6ZSIpKS53aXRoU3RyZWFtSW5mbygiY29tcHJlc3Npb24iLGIpfSxlLmV4cG9ydHM9dX0seyIuL2V4dGVybmFsIjo2LCIuL3N0cmVhbS9DcmMzMlByb2JlIjoyNSwiLi9zdHJlYW0vRGF0YUxlbmd0aFByb2JlIjoyNiwiLi9zdHJlYW0vRGF0YVdvcmtlciI6Mjd9XSwzOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtuLlNUT1JFPXttYWdpYzoiXDBcMCIsY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoIlNUT1JFIGNvbXByZXNzaW9uIil9LHVuY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIoIlNUT1JFIGRlY29tcHJlc3Npb24iKX19LG4uREVGTEFURT10KCIuL2ZsYXRlIil9LHsiLi9mbGF0ZSI6NywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6Mjh9XSw0OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXQoIi4vdXRpbHMiKSxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBpLG89W10sdT0wO3U8MjU2O3UrKyl7aT11O2Zvcih2YXIgcD0wO3A8ODtwKyspaT0xJmk/Mzk4ODI5MjM4NF5pPj4+MTppPj4+MTtvW3VdPWl9cmV0dXJuIG99KCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGksbyl7cmV0dXJuIGkhPT12b2lkIDAmJmkubGVuZ3RoP3IuZ2V0VHlwZU9mKGkpIT09InN0cmluZyI/ZnVuY3Rpb24odSxwLGIsZyl7dmFyIG09cyxDPWcrYjt1Xj0tMTtmb3IodmFyIHk9Zzt5PEM7eSsrKXU9dT4+PjhebVsyNTUmKHVecFt5XSldO3JldHVybi0xXnV9KDB8byxpLGkubGVuZ3RoLDApOmZ1bmN0aW9uKHUscCxiLGcpe3ZhciBtPXMsQz1nK2I7dV49LTE7Zm9yKHZhciB5PWc7eTxDO3krKyl1PXU+Pj44Xm1bMjU1Jih1XnAuY2hhckNvZGVBdCh5KSldO3JldHVybi0xXnV9KDB8byxpLGkubGVuZ3RoLDApOjB9fSx7Ii4vdXRpbHMiOjMyfV0sNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmJhc2U2ND0hMSxuLmJpbmFyeT0hMSxuLmRpcj0hMSxuLmNyZWF0ZUZvbGRlcnM9ITAsbi5kYXRlPW51bGwsbi5jb21wcmVzc2lvbj1udWxsLG4uY29tcHJlc3Npb25PcHRpb25zPW51bGwsbi5jb21tZW50PW51bGwsbi51bml4UGVybWlzc2lvbnM9bnVsbCxuLmRvc1Blcm1pc3Npb25zPW51bGx9LHt9XSw2OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW51bGw7cj10eXBlb2YgUHJvbWlzZTwidSI/UHJvbWlzZTp0KCJsaWUiKSxlLmV4cG9ydHM9e1Byb21pc2U6cn19LHtsaWU6Mzd9XSw3OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXR5cGVvZiBVaW50OEFycmF5PCJ1IiYmdHlwZW9mIFVpbnQxNkFycmF5PCJ1IiYmdHlwZW9mIFVpbnQzMkFycmF5PCJ1IixzPXQoInBha28iKSxpPXQoIi4vdXRpbHMiKSxvPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKSx1PXI/InVpbnQ4YXJyYXkiOiJhcnJheSI7ZnVuY3Rpb24gcChiLGcpe28uY2FsbCh0aGlzLCJGbGF0ZVdvcmtlci8iK2IpLHRoaXMuX3Bha289bnVsbCx0aGlzLl9wYWtvQWN0aW9uPWIsdGhpcy5fcGFrb09wdGlvbnM9Zyx0aGlzLm1ldGE9e319bi5tYWdpYz0iXGJcMCIsaS5pbmhlcml0cyhwLG8pLHAucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihiKXt0aGlzLm1ldGE9Yi5tZXRhLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKGkudHJhbnNmb3JtVG8odSxiLmRhdGEpLCExKX0scC5wcm90b3R5cGUuZmx1c2g9ZnVuY3Rpb24oKXtvLnByb3RvdHlwZS5mbHVzaC5jYWxsKHRoaXMpLHRoaXMuX3Bha289PT1udWxsJiZ0aGlzLl9jcmVhdGVQYWtvKCksdGhpcy5fcGFrby5wdXNoKFtdLCEwKX0scC5wcm90b3R5cGUuY2xlYW5VcD1mdW5jdGlvbigpe28ucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKSx0aGlzLl9wYWtvPW51bGx9LHAucHJvdG90eXBlLl9jcmVhdGVQYWtvPWZ1bmN0aW9uKCl7dGhpcy5fcGFrbz1uZXcgc1t0aGlzLl9wYWtvQWN0aW9uXSh7cmF3OiEwLGxldmVsOnRoaXMuX3Bha29PcHRpb25zLmxldmVsfHwtMX0pO3ZhciBiPXRoaXM7dGhpcy5fcGFrby5vbkRhdGE9ZnVuY3Rpb24oZyl7Yi5wdXNoKHtkYXRhOmcsbWV0YTpiLm1ldGF9KX19LG4uY29tcHJlc3NXb3JrZXI9ZnVuY3Rpb24oYil7cmV0dXJuIG5ldyBwKCJEZWZsYXRlIixiKX0sbi51bmNvbXByZXNzV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwKCJJbmZsYXRlIix7fSl9fSx7Ii4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiOjI4LCIuL3V0aWxzIjozMixwYWtvOjM4fV0sODpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKG0sQyl7dmFyIHksVD0iIjtmb3IoeT0wO3k8Qzt5KyspVCs9U3RyaW5nLmZyb21DaGFyQ29kZSgyNTUmbSksbT4+Pj04O3JldHVybiBUfWZ1bmN0aW9uIHMobSxDLHksVCxQLGMpe3ZhciBsLGgsXz1tLmZpbGUsRj1tLmNvbXByZXNzaW9uLE89YyE9PXUudXRmOGVuY29kZSxmPWkudHJhbnNmb3JtVG8oInN0cmluZyIsYyhfLm5hbWUpKSxVPWkudHJhbnNmb3JtVG8oInN0cmluZyIsdS51dGY4ZW5jb2RlKF8ubmFtZSkpLFg9Xy5jb21tZW50LFE9aS50cmFuc2Zvcm1Ubygic3RyaW5nIixjKFgpKSxFPWkudHJhbnNmb3JtVG8oInN0cmluZyIsdS51dGY4ZW5jb2RlKFgpKSwkPVUubGVuZ3RoIT09Xy5uYW1lLmxlbmd0aCx3PUUubGVuZ3RoIT09WC5sZW5ndGgsaz0iIixTPSIiLEI9IiIsTD1fLmRpcixSPV8uZGF0ZSxxPXtjcmMzMjowLGNvbXByZXNzZWRTaXplOjAsdW5jb21wcmVzc2VkU2l6ZTowfTtDJiYheXx8KHEuY3JjMzI9bS5jcmMzMixxLmNvbXByZXNzZWRTaXplPW0uY29tcHJlc3NlZFNpemUscS51bmNvbXByZXNzZWRTaXplPW0udW5jb21wcmVzc2VkU2l6ZSk7dmFyIHo9MDtDJiYoenw9OCksT3x8ISQmJiF3fHwoenw9MjA0OCk7dmFyIEc9MCxudD0wO0wmJihHfD0xNiksUD09PSJVTklYIj8obnQ9Nzk4LEd8PWZ1bmN0aW9uKGV0LHd0KXt2YXIgU3Q9ZXQ7cmV0dXJuIGV0fHwoU3Q9d3Q/MTY4OTM6MzMyMDQpLCg2NTUzNSZTdCk8PDE2fShfLnVuaXhQZXJtaXNzaW9ucyxMKSk6KG50PTIwLEd8PWZ1bmN0aW9uKGV0KXtyZXR1cm4gNjMmKGV0fHwwKX0oXy5kb3NQZXJtaXNzaW9ucykpLGw9Ui5nZXRVVENIb3VycygpLGw8PD02LGx8PVIuZ2V0VVRDTWludXRlcygpLGw8PD01LGx8PVIuZ2V0VVRDU2Vjb25kcygpLzIsaD1SLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCxoPDw9NCxofD1SLmdldFVUQ01vbnRoKCkrMSxoPDw9NSxofD1SLmdldFVUQ0RhdGUoKSwkJiYoUz1yKDEsMSkrcihwKGYpLDQpK1Usays9InVwIityKFMubGVuZ3RoLDIpK1MpLHcmJihCPXIoMSwxKStyKHAoUSksNCkrRSxrKz0idWMiK3IoQi5sZW5ndGgsMikrQik7dmFyIHR0PSIiO3JldHVybiB0dCs9YApcMGAsdHQrPXIoeiwyKSx0dCs9Ri5tYWdpYyx0dCs9cihsLDIpLHR0Kz1yKGgsMiksdHQrPXIocS5jcmMzMiw0KSx0dCs9cihxLmNvbXByZXNzZWRTaXplLDQpLHR0Kz1yKHEudW5jb21wcmVzc2VkU2l6ZSw0KSx0dCs9cihmLmxlbmd0aCwyKSx0dCs9cihrLmxlbmd0aCwyKSx7ZmlsZVJlY29yZDpiLkxPQ0FMX0ZJTEVfSEVBREVSK3R0K2YrayxkaXJSZWNvcmQ6Yi5DRU5UUkFMX0ZJTEVfSEVBREVSK3IobnQsMikrdHQrcihRLmxlbmd0aCwyKSsiXDBcMFwwXDAiK3IoRyw0KStyKFQsNCkrZitrK1F9fXZhciBpPXQoIi4uL3V0aWxzIiksbz10KCIuLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9dCgiLi4vdXRmOCIpLHA9dCgiLi4vY3JjMzIiKSxiPXQoIi4uL3NpZ25hdHVyZSIpO2Z1bmN0aW9uIGcobSxDLHksVCl7by5jYWxsKHRoaXMsIlppcEZpbGVXb3JrZXIiKSx0aGlzLmJ5dGVzV3JpdHRlbj0wLHRoaXMuemlwQ29tbWVudD1DLHRoaXMuemlwUGxhdGZvcm09eSx0aGlzLmVuY29kZUZpbGVOYW1lPVQsdGhpcy5zdHJlYW1GaWxlcz1tLHRoaXMuYWNjdW11bGF0ZT0hMSx0aGlzLmNvbnRlbnRCdWZmZXI9W10sdGhpcy5kaXJSZWNvcmRzPVtdLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldD0wLHRoaXMuZW50cmllc0NvdW50PTAsdGhpcy5jdXJyZW50RmlsZT1udWxsLHRoaXMuX3NvdXJjZXM9W119aS5pbmhlcml0cyhnLG8pLGcucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24obSl7dmFyIEM9bS5tZXRhLnBlcmNlbnR8fDAseT10aGlzLmVudHJpZXNDb3VudCxUPXRoaXMuX3NvdXJjZXMubGVuZ3RoO3RoaXMuYWNjdW11bGF0ZT90aGlzLmNvbnRlbnRCdWZmZXIucHVzaChtKToodGhpcy5ieXRlc1dyaXR0ZW4rPW0uZGF0YS5sZW5ndGgsby5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMse2RhdGE6bS5kYXRhLG1ldGE6e2N1cnJlbnRGaWxlOnRoaXMuY3VycmVudEZpbGUscGVyY2VudDp5PyhDKzEwMCooeS1ULTEpKS95OjEwMH19KSl9LGcucHJvdG90eXBlLm9wZW5lZFNvdXJjZT1mdW5jdGlvbihtKXt0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQ9dGhpcy5ieXRlc1dyaXR0ZW4sdGhpcy5jdXJyZW50RmlsZT1tLmZpbGUubmFtZTt2YXIgQz10aGlzLnN0cmVhbUZpbGVzJiYhbS5maWxlLmRpcjtpZihDKXt2YXIgeT1zKG0sQywhMSx0aGlzLmN1cnJlbnRTb3VyY2VPZmZzZXQsdGhpcy56aXBQbGF0Zm9ybSx0aGlzLmVuY29kZUZpbGVOYW1lKTt0aGlzLnB1c2goe2RhdGE6eS5maWxlUmVjb3JkLG1ldGE6e3BlcmNlbnQ6MH19KX1lbHNlIHRoaXMuYWNjdW11bGF0ZT0hMH0sZy5wcm90b3R5cGUuY2xvc2VkU291cmNlPWZ1bmN0aW9uKG0pe3RoaXMuYWNjdW11bGF0ZT0hMTt2YXIgQz10aGlzLnN0cmVhbUZpbGVzJiYhbS5maWxlLmRpcix5PXMobSxDLCEwLHRoaXMuY3VycmVudFNvdXJjZU9mZnNldCx0aGlzLnppcFBsYXRmb3JtLHRoaXMuZW5jb2RlRmlsZU5hbWUpO2lmKHRoaXMuZGlyUmVjb3Jkcy5wdXNoKHkuZGlyUmVjb3JkKSxDKXRoaXMucHVzaCh7ZGF0YTpmdW5jdGlvbihUKXtyZXR1cm4gYi5EQVRBX0RFU0NSSVBUT1IrcihULmNyYzMyLDQpK3IoVC5jb21wcmVzc2VkU2l6ZSw0KStyKFQudW5jb21wcmVzc2VkU2l6ZSw0KX0obSksbWV0YTp7cGVyY2VudDoxMDB9fSk7ZWxzZSBmb3IodGhpcy5wdXNoKHtkYXRhOnkuZmlsZVJlY29yZCxtZXRhOntwZXJjZW50OjB9fSk7dGhpcy5jb250ZW50QnVmZmVyLmxlbmd0aDspdGhpcy5wdXNoKHRoaXMuY29udGVudEJ1ZmZlci5zaGlmdCgpKTt0aGlzLmN1cnJlbnRGaWxlPW51bGx9LGcucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBtPXRoaXMuYnl0ZXNXcml0dGVuLEM9MDtDPHRoaXMuZGlyUmVjb3Jkcy5sZW5ndGg7QysrKXRoaXMucHVzaCh7ZGF0YTp0aGlzLmRpclJlY29yZHNbQ10sbWV0YTp7cGVyY2VudDoxMDB9fSk7dmFyIHk9dGhpcy5ieXRlc1dyaXR0ZW4tbSxUPWZ1bmN0aW9uKFAsYyxsLGgsXyl7dmFyIEY9aS50cmFuc2Zvcm1Ubygic3RyaW5nIixfKGgpKTtyZXR1cm4gYi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQrIlwwXDBcMFwwIityKFAsMikrcihQLDIpK3IoYyw0KStyKGwsNCkrcihGLmxlbmd0aCwyKStGfSh0aGlzLmRpclJlY29yZHMubGVuZ3RoLHksbSx0aGlzLnppcENvbW1lbnQsdGhpcy5lbmNvZGVGaWxlTmFtZSk7dGhpcy5wdXNoKHtkYXRhOlQsbWV0YTp7cGVyY2VudDoxMDB9fSl9LGcucHJvdG90eXBlLnByZXBhcmVOZXh0U291cmNlPWZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz10aGlzLl9zb3VyY2VzLnNoaWZ0KCksdGhpcy5vcGVuZWRTb3VyY2UodGhpcy5wcmV2aW91cy5zdHJlYW1JbmZvKSx0aGlzLmlzUGF1c2VkP3RoaXMucHJldmlvdXMucGF1c2UoKTp0aGlzLnByZXZpb3VzLnJlc3VtZSgpfSxnLnByb3RvdHlwZS5yZWdpc3RlclByZXZpb3VzPWZ1bmN0aW9uKG0pe3RoaXMuX3NvdXJjZXMucHVzaChtKTt2YXIgQz10aGlzO3JldHVybiBtLm9uKCJkYXRhIixmdW5jdGlvbih5KXtDLnByb2Nlc3NDaHVuayh5KX0pLG0ub24oImVuZCIsZnVuY3Rpb24oKXtDLmNsb3NlZFNvdXJjZShDLnByZXZpb3VzLnN0cmVhbUluZm8pLEMuX3NvdXJjZXMubGVuZ3RoP0MucHJlcGFyZU5leHRTb3VyY2UoKTpDLmVuZCgpfSksbS5vbigiZXJyb3IiLGZ1bmN0aW9uKHkpe0MuZXJyb3IoeSl9KSx0aGlzfSxnLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIW8ucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMucHJldmlvdXMmJnRoaXMuX3NvdXJjZXMubGVuZ3RoPyh0aGlzLnByZXBhcmVOZXh0U291cmNlKCksITApOnRoaXMucHJldmlvdXN8fHRoaXMuX3NvdXJjZXMubGVuZ3RofHx0aGlzLmdlbmVyYXRlZEVycm9yP3ZvaWQgMDoodGhpcy5lbmQoKSwhMCkpfSxnLnByb3RvdHlwZS5lcnJvcj1mdW5jdGlvbihtKXt2YXIgQz10aGlzLl9zb3VyY2VzO2lmKCFvLnByb3RvdHlwZS5lcnJvci5jYWxsKHRoaXMsbSkpcmV0dXJuITE7Zm9yKHZhciB5PTA7eTxDLmxlbmd0aDt5KyspdHJ5e0NbeV0uZXJyb3IobSl9Y2F0Y2h7fXJldHVybiEwfSxnLnByb3RvdHlwZS5sb2NrPWZ1bmN0aW9uKCl7by5wcm90b3R5cGUubG9jay5jYWxsKHRoaXMpO2Zvcih2YXIgbT10aGlzLl9zb3VyY2VzLEM9MDtDPG0ubGVuZ3RoO0MrKyltW0NdLmxvY2soKX0sZS5leHBvcnRzPWd9LHsiLi4vY3JjMzIiOjQsIi4uL3NpZ25hdHVyZSI6MjMsIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRmOCI6MzEsIi4uL3V0aWxzIjozMn1dLDk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vY29tcHJlc3Npb25zIikscz10KCIuL1ppcEZpbGVXb3JrZXIiKTtuLmdlbmVyYXRlV29ya2VyPWZ1bmN0aW9uKGksbyx1KXt2YXIgcD1uZXcgcyhvLnN0cmVhbUZpbGVzLHUsby5wbGF0Zm9ybSxvLmVuY29kZUZpbGVOYW1lKSxiPTA7dHJ5e2kuZm9yRWFjaChmdW5jdGlvbihnLG0pe2IrKzt2YXIgQz1mdW5jdGlvbihjLGwpe3ZhciBoPWN8fGwsXz1yW2hdO2lmKCFfKXRocm93IG5ldyBFcnJvcihoKyIgaXMgbm90IGEgdmFsaWQgY29tcHJlc3Npb24gbWV0aG9kICEiKTtyZXR1cm4gX30obS5vcHRpb25zLmNvbXByZXNzaW9uLG8uY29tcHJlc3Npb24pLHk9bS5vcHRpb25zLmNvbXByZXNzaW9uT3B0aW9uc3x8by5jb21wcmVzc2lvbk9wdGlvbnN8fHt9LFQ9bS5kaXIsUD1tLmRhdGU7bS5fY29tcHJlc3NXb3JrZXIoQyx5KS53aXRoU3RyZWFtSW5mbygiZmlsZSIse25hbWU6ZyxkaXI6VCxkYXRlOlAsY29tbWVudDptLmNvbW1lbnR8fCIiLHVuaXhQZXJtaXNzaW9uczptLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczptLmRvc1Blcm1pc3Npb25zfSkucGlwZShwKX0pLHAuZW50cmllc0NvdW50PWJ9Y2F0Y2goZyl7cC5lcnJvcihnKX1yZXR1cm4gcH19LHsiLi4vY29tcHJlc3Npb25zIjozLCIuL1ppcEZpbGVXb3JrZXIiOjh9XSwxMDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYoISh0aGlzIGluc3RhbmNlb2YgcikpcmV0dXJuIG5ldyByO2lmKGFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJUaGUgY29uc3RydWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGhhcyBiZWVuIHJlbW92ZWQgaW4gSlNaaXAgMy4wLCBwbGVhc2UgY2hlY2sgdGhlIHVwZ3JhZGUgZ3VpZGUuIik7dGhpcy5maWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuY29tbWVudD1udWxsLHRoaXMucm9vdD0iIix0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHM9bmV3IHI7Zm9yKHZhciBpIGluIHRoaXMpdHlwZW9mIHRoaXNbaV0hPSJmdW5jdGlvbiImJihzW2ldPXRoaXNbaV0pO3JldHVybiBzfX0oci5wcm90b3R5cGU9dCgiLi9vYmplY3QiKSkubG9hZEFzeW5jPXQoIi4vbG9hZCIpLHIuc3VwcG9ydD10KCIuL3N1cHBvcnQiKSxyLmRlZmF1bHRzPXQoIi4vZGVmYXVsdHMiKSxyLnZlcnNpb249IjMuMTAuMSIsci5sb2FkQXN5bmM9ZnVuY3Rpb24ocyxpKXtyZXR1cm4gbmV3IHIoKS5sb2FkQXN5bmMocyxpKX0sci5leHRlcm5hbD10KCIuL2V4dGVybmFsIiksZS5leHBvcnRzPXJ9LHsiLi9kZWZhdWx0cyI6NSwiLi9leHRlcm5hbCI6NiwiLi9sb2FkIjoxMSwiLi9vYmplY3QiOjE1LCIuL3N1cHBvcnQiOjMwfV0sMTE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi91dGlscyIpLHM9dCgiLi9leHRlcm5hbCIpLGk9dCgiLi91dGY4Iiksbz10KCIuL3ppcEVudHJpZXMiKSx1PXQoIi4vc3RyZWFtL0NyYzMyUHJvYmUiKSxwPXQoIi4vbm9kZWpzVXRpbHMiKTtmdW5jdGlvbiBiKGcpe3JldHVybiBuZXcgcy5Qcm9taXNlKGZ1bmN0aW9uKG0sQyl7dmFyIHk9Zy5kZWNvbXByZXNzZWQuZ2V0Q29udGVudFdvcmtlcigpLnBpcGUobmV3IHUpO3kub24oImVycm9yIixmdW5jdGlvbihUKXtDKFQpfSkub24oImVuZCIsZnVuY3Rpb24oKXt5LnN0cmVhbUluZm8uY3JjMzIhPT1nLmRlY29tcHJlc3NlZC5jcmMzMj9DKG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCA6IENSQzMyIG1pc21hdGNoIikpOm0oKX0pLnJlc3VtZSgpfSl9ZS5leHBvcnRzPWZ1bmN0aW9uKGcsbSl7dmFyIEM9dGhpcztyZXR1cm4gbT1yLmV4dGVuZChtfHx7fSx7YmFzZTY0OiExLGNoZWNrQ1JDMzI6ITEsb3B0aW1pemVkQmluYXJ5U3RyaW5nOiExLGNyZWF0ZUZvbGRlcnM6ITEsZGVjb2RlRmlsZU5hbWU6aS51dGY4ZGVjb2RlfSkscC5pc05vZGUmJnAuaXNTdHJlYW0oZyk/cy5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIkpTWmlwIGNhbid0IGFjY2VwdCBhIHN0cmVhbSB3aGVuIGxvYWRpbmcgYSB6aXAgZmlsZS4iKSk6ci5wcmVwYXJlQ29udGVudCgidGhlIGxvYWRlZCB6aXAgZmlsZSIsZywhMCxtLm9wdGltaXplZEJpbmFyeVN0cmluZyxtLmJhc2U2NCkudGhlbihmdW5jdGlvbih5KXt2YXIgVD1uZXcgbyhtKTtyZXR1cm4gVC5sb2FkKHkpLFR9KS50aGVuKGZ1bmN0aW9uKHkpe3ZhciBUPVtzLlByb21pc2UucmVzb2x2ZSh5KV0sUD15LmZpbGVzO2lmKG0uY2hlY2tDUkMzMilmb3IodmFyIGM9MDtjPFAubGVuZ3RoO2MrKylULnB1c2goYihQW2NdKSk7cmV0dXJuIHMuUHJvbWlzZS5hbGwoVCl9KS50aGVuKGZ1bmN0aW9uKHkpe2Zvcih2YXIgVD15LnNoaWZ0KCksUD1ULmZpbGVzLGM9MDtjPFAubGVuZ3RoO2MrKyl7dmFyIGw9UFtjXSxoPWwuZmlsZU5hbWVTdHIsXz1yLnJlc29sdmUobC5maWxlTmFtZVN0cik7Qy5maWxlKF8sbC5kZWNvbXByZXNzZWQse2JpbmFyeTohMCxvcHRpbWl6ZWRCaW5hcnlTdHJpbmc6ITAsZGF0ZTpsLmRhdGUsZGlyOmwuZGlyLGNvbW1lbnQ6bC5maWxlQ29tbWVudFN0ci5sZW5ndGg/bC5maWxlQ29tbWVudFN0cjpudWxsLHVuaXhQZXJtaXNzaW9uczpsLnVuaXhQZXJtaXNzaW9ucyxkb3NQZXJtaXNzaW9uczpsLmRvc1Blcm1pc3Npb25zLGNyZWF0ZUZvbGRlcnM6bS5jcmVhdGVGb2xkZXJzfSksbC5kaXJ8fChDLmZpbGUoXykudW5zYWZlT3JpZ2luYWxOYW1lPWgpfXJldHVybiBULnppcENvbW1lbnQubGVuZ3RoJiYoQy5jb21tZW50PVQuemlwQ29tbWVudCksQ30pfX0seyIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vQ3JjMzJQcm9iZSI6MjUsIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcEVudHJpZXMiOjMzfV0sMTI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4uL3N0cmVhbS9HZW5lcmljV29ya2VyIik7ZnVuY3Rpb24gaShvLHUpe3MuY2FsbCh0aGlzLCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yICIrbyksdGhpcy5fdXBzdHJlYW1FbmRlZD0hMSx0aGlzLl9iaW5kU3RyZWFtKHUpfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5fYmluZFN0cmVhbT1mdW5jdGlvbihvKXt2YXIgdT10aGlzOyh0aGlzLl9zdHJlYW09bykucGF1c2UoKSxvLm9uKCJkYXRhIixmdW5jdGlvbihwKXt1LnB1c2goe2RhdGE6cCxtZXRhOntwZXJjZW50OjB9fSl9KS5vbigiZXJyb3IiLGZ1bmN0aW9uKHApe3UuaXNQYXVzZWQ/dGhpcy5nZW5lcmF0ZWRFcnJvcj1wOnUuZXJyb3IocCl9KS5vbigiZW5kIixmdW5jdGlvbigpe3UuaXNQYXVzZWQ/dS5fdXBzdHJlYW1FbmRlZD0hMDp1LmVuZCgpfSl9LGkucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuISFzLnByb3RvdHlwZS5wYXVzZS5jYWxsKHRoaXMpJiYodGhpcy5fc3RyZWFtLnBhdXNlKCksITApfSxpLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYodGhpcy5fdXBzdHJlYW1FbmRlZD90aGlzLmVuZCgpOnRoaXMuX3N0cmVhbS5yZXN1bWUoKSwhMCl9LGUuZXhwb3J0cz1pfSx7Ii4uL3N0cmVhbS9HZW5lcmljV29ya2VyIjoyOCwiLi4vdXRpbHMiOjMyfV0sMTM6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGU7ZnVuY3Rpb24gcyhpLG8sdSl7ci5jYWxsKHRoaXMsbyksdGhpcy5faGVscGVyPWk7dmFyIHA9dGhpcztpLm9uKCJkYXRhIixmdW5jdGlvbihiLGcpe3AucHVzaChiKXx8cC5faGVscGVyLnBhdXNlKCksdSYmdShnKX0pLm9uKCJlcnJvciIsZnVuY3Rpb24oYil7cC5lbWl0KCJlcnJvciIsYil9KS5vbigiZW5kIixmdW5jdGlvbigpe3AucHVzaChudWxsKX0pfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMocyxyKSxzLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbigpe3RoaXMuX2hlbHBlci5yZXN1bWUoKX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMTQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtpc05vZGU6dHlwZW9mIEJ1ZmZlcjwidSIsbmV3QnVmZmVyRnJvbTpmdW5jdGlvbihyLHMpe2lmKEJ1ZmZlci5mcm9tJiZCdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbSlyZXR1cm4gQnVmZmVyLmZyb20ocixzKTtpZih0eXBlb2Ygcj09Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKCdUaGUgImRhdGEiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuIG5ldyBCdWZmZXIocixzKX0sYWxsb2NCdWZmZXI6ZnVuY3Rpb24ocil7aWYoQnVmZmVyLmFsbG9jKXJldHVybiBCdWZmZXIuYWxsb2Mocik7dmFyIHM9bmV3IEJ1ZmZlcihyKTtyZXR1cm4gcy5maWxsKDApLHN9LGlzQnVmZmVyOmZ1bmN0aW9uKHIpe3JldHVybiBCdWZmZXIuaXNCdWZmZXIocil9LGlzU3RyZWFtOmZ1bmN0aW9uKHIpe3JldHVybiByJiZ0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIiYmdHlwZW9mIHIucGF1c2U9PSJmdW5jdGlvbiImJnR5cGVvZiByLnJlc3VtZT09ImZ1bmN0aW9uIn19fSx7fV0sMTU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihfLEYsTyl7dmFyIGYsVT1pLmdldFR5cGVPZihGKSxYPWkuZXh0ZW5kKE98fHt9LHApO1guZGF0ZT1YLmRhdGV8fG5ldyBEYXRlLFguY29tcHJlc3Npb24hPT1udWxsJiYoWC5jb21wcmVzc2lvbj1YLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCkpLHR5cGVvZiBYLnVuaXhQZXJtaXNzaW9ucz09InN0cmluZyImJihYLnVuaXhQZXJtaXNzaW9ucz1wYXJzZUludChYLnVuaXhQZXJtaXNzaW9ucyw4KSksWC51bml4UGVybWlzc2lvbnMmJjE2Mzg0JlgudW5peFBlcm1pc3Npb25zJiYoWC5kaXI9ITApLFguZG9zUGVybWlzc2lvbnMmJjE2JlguZG9zUGVybWlzc2lvbnMmJihYLmRpcj0hMCksWC5kaXImJihfPVAoXykpLFguY3JlYXRlRm9sZGVycyYmKGY9VChfKSkmJmMuY2FsbCh0aGlzLGYsITApO3ZhciBRPVU9PT0ic3RyaW5nIiYmWC5iaW5hcnk9PT0hMSYmWC5iYXNlNjQ9PT0hMTtPJiZPLmJpbmFyeSE9PXZvaWQgMHx8KFguYmluYXJ5PSFRKSwoRiBpbnN0YW5jZW9mIGImJkYudW5jb21wcmVzc2VkU2l6ZT09PTB8fFguZGlyfHwhRnx8Ri5sZW5ndGg9PT0wKSYmKFguYmFzZTY0PSExLFguYmluYXJ5PSEwLEY9IiIsWC5jb21wcmVzc2lvbj0iU1RPUkUiLFU9InN0cmluZyIpO3ZhciBFPW51bGw7RT1GIGluc3RhbmNlb2YgYnx8RiBpbnN0YW5jZW9mIG8/RjpDLmlzTm9kZSYmQy5pc1N0cmVhbShGKT9uZXcgeShfLEYpOmkucHJlcGFyZUNvbnRlbnQoXyxGLFguYmluYXJ5LFgub3B0aW1pemVkQmluYXJ5U3RyaW5nLFguYmFzZTY0KTt2YXIgJD1uZXcgZyhfLEUsWCk7dGhpcy5maWxlc1tfXT0kfXZhciBzPXQoIi4vdXRmOCIpLGk9dCgiLi91dGlscyIpLG89dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9dCgiLi9zdHJlYW0vU3RyZWFtSGVscGVyIikscD10KCIuL2RlZmF1bHRzIiksYj10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxnPXQoIi4vemlwT2JqZWN0IiksbT10KCIuL2dlbmVyYXRlIiksQz10KCIuL25vZGVqc1V0aWxzIikseT10KCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIiKSxUPWZ1bmN0aW9uKF8pe18uc2xpY2UoLTEpPT09Ii8iJiYoXz1fLnN1YnN0cmluZygwLF8ubGVuZ3RoLTEpKTt2YXIgRj1fLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIDA8Rj9fLnN1YnN0cmluZygwLEYpOiIifSxQPWZ1bmN0aW9uKF8pe3JldHVybiBfLnNsaWNlKC0xKSE9PSIvIiYmKF8rPSIvIiksX30sYz1mdW5jdGlvbihfLEYpe3JldHVybiBGPUYhPT12b2lkIDA/RjpwLmNyZWF0ZUZvbGRlcnMsXz1QKF8pLHRoaXMuZmlsZXNbX118fHIuY2FsbCh0aGlzLF8sbnVsbCx7ZGlyOiEwLGNyZWF0ZUZvbGRlcnM6Rn0pLHRoaXMuZmlsZXNbX119O2Z1bmN0aW9uIGwoXyl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfKT09PSJbb2JqZWN0IFJlZ0V4cF0ifXZhciBoPXtsb2FkOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLiIpfSxmb3JFYWNoOmZ1bmN0aW9uKF8pe3ZhciBGLE8sZjtmb3IoRiBpbiB0aGlzLmZpbGVzKWY9dGhpcy5maWxlc1tGXSwoTz1GLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsRi5sZW5ndGgpKSYmRi5zbGljZSgwLHRoaXMucm9vdC5sZW5ndGgpPT09dGhpcy5yb290JiZfKE8sZil9LGZpbHRlcjpmdW5jdGlvbihfKXt2YXIgRj1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKE8sZil7XyhPLGYpJiZGLnB1c2goZil9KSxGfSxmaWxlOmZ1bmN0aW9uKF8sRixPKXtpZihhcmd1bWVudHMubGVuZ3RoIT09MSlyZXR1cm4gXz10aGlzLnJvb3QrXyxyLmNhbGwodGhpcyxfLEYsTyksdGhpcztpZihsKF8pKXt2YXIgZj1fO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihYLFEpe3JldHVybiFRLmRpciYmZi50ZXN0KFgpfSl9dmFyIFU9dGhpcy5maWxlc1t0aGlzLnJvb3QrX107cmV0dXJuIFUmJiFVLmRpcj9VOm51bGx9LGZvbGRlcjpmdW5jdGlvbihfKXtpZighXylyZXR1cm4gdGhpcztpZihsKF8pKXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihVLFgpe3JldHVybiBYLmRpciYmXy50ZXN0KFUpfSk7dmFyIEY9dGhpcy5yb290K18sTz1jLmNhbGwodGhpcyxGKSxmPXRoaXMuY2xvbmUoKTtyZXR1cm4gZi5yb290PU8ubmFtZSxmfSxyZW1vdmU6ZnVuY3Rpb24oXyl7Xz10aGlzLnJvb3QrXzt2YXIgRj10aGlzLmZpbGVzW19dO2lmKEZ8fChfLnNsaWNlKC0xKSE9PSIvIiYmKF8rPSIvIiksRj10aGlzLmZpbGVzW19dKSxGJiYhRi5kaXIpZGVsZXRlIHRoaXMuZmlsZXNbX107ZWxzZSBmb3IodmFyIE89dGhpcy5maWx0ZXIoZnVuY3Rpb24oVSxYKXtyZXR1cm4gWC5uYW1lLnNsaWNlKDAsXy5sZW5ndGgpPT09X30pLGY9MDtmPE8ubGVuZ3RoO2YrKylkZWxldGUgdGhpcy5maWxlc1tPW2ZdLm5hbWVdO3JldHVybiB0aGlzfSxnZW5lcmF0ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS4iKX0sZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbTpmdW5jdGlvbihfKXt2YXIgRixPPXt9O3RyeXtpZigoTz1pLmV4dGVuZChffHx7fSx7c3RyZWFtRmlsZXM6ITEsY29tcHJlc3Npb246IlNUT1JFIixjb21wcmVzc2lvbk9wdGlvbnM6bnVsbCx0eXBlOiIiLHBsYXRmb3JtOiJET1MiLGNvbW1lbnQ6bnVsbCxtaW1lVHlwZToiYXBwbGljYXRpb24vemlwIixlbmNvZGVGaWxlTmFtZTpzLnV0ZjhlbmNvZGV9KSkudHlwZT1PLnR5cGUudG9Mb3dlckNhc2UoKSxPLmNvbXByZXNzaW9uPU8uY29tcHJlc3Npb24udG9VcHBlckNhc2UoKSxPLnR5cGU9PT0iYmluYXJ5c3RyaW5nIiYmKE8udHlwZT0ic3RyaW5nIiksIU8udHlwZSl0aHJvdyBuZXcgRXJyb3IoIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC4iKTtpLmNoZWNrU3VwcG9ydChPLnR5cGUpLE8ucGxhdGZvcm0hPT0iZGFyd2luIiYmTy5wbGF0Zm9ybSE9PSJmcmVlYnNkIiYmTy5wbGF0Zm9ybSE9PSJsaW51eCImJk8ucGxhdGZvcm0hPT0ic3Vub3MifHwoTy5wbGF0Zm9ybT0iVU5JWCIpLE8ucGxhdGZvcm09PT0id2luMzIiJiYoTy5wbGF0Zm9ybT0iRE9TIik7dmFyIGY9Ty5jb21tZW50fHx0aGlzLmNvbW1lbnR8fCIiO0Y9bS5nZW5lcmF0ZVdvcmtlcih0aGlzLE8sZil9Y2F0Y2goVSl7KEY9bmV3IG8oImVycm9yIikpLmVycm9yKFUpfXJldHVybiBuZXcgdShGLE8udHlwZXx8InN0cmluZyIsTy5taW1lVHlwZSl9LGdlbmVyYXRlQXN5bmM6ZnVuY3Rpb24oXyxGKXtyZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKF8pLmFjY3VtdWxhdGUoRil9LGdlbmVyYXRlTm9kZVN0cmVhbTpmdW5jdGlvbihfLEYpe3JldHVybihfPV98fHt9KS50eXBlfHwoXy50eXBlPSJub2RlYnVmZmVyIiksdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKF8pLnRvTm9kZWpzU3RyZWFtKEYpfX07ZS5leHBvcnRzPWh9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2RlZmF1bHRzIjo1LCIuL2dlbmVyYXRlIjo5LCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIiOjEyLCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3RyZWFtL1N0cmVhbUhlbHBlciI6MjksIi4vdXRmOCI6MzEsIi4vdXRpbHMiOjMyLCIuL3ppcE9iamVjdCI6MzV9XSwxNjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgic3RyZWFtIil9LHtzdHJlYW06dm9pZCAwfV0sMTc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9EYXRhUmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKTtmb3IodmFyIG89MDtvPHRoaXMuZGF0YS5sZW5ndGg7bysrKWlbb109MjU1Jmlbb119dCgiLi4vdXRpbHMiKS5pbmhlcml0cyhzLHIpLHMucHJvdG90eXBlLmJ5dGVBdD1mdW5jdGlvbihpKXtyZXR1cm4gdGhpcy5kYXRhW3RoaXMuemVybytpXX0scy5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmU9ZnVuY3Rpb24oaSl7Zm9yKHZhciBvPWkuY2hhckNvZGVBdCgwKSx1PWkuY2hhckNvZGVBdCgxKSxwPWkuY2hhckNvZGVBdCgyKSxiPWkuY2hhckNvZGVBdCgzKSxnPXRoaXMubGVuZ3RoLTQ7MDw9ZzstLWcpaWYodGhpcy5kYXRhW2ddPT09byYmdGhpcy5kYXRhW2crMV09PT11JiZ0aGlzLmRhdGFbZysyXT09PXAmJnRoaXMuZGF0YVtnKzNdPT09YilyZXR1cm4gZy10aGlzLnplcm87cmV0dXJuLTF9LHMucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZT1mdW5jdGlvbihpKXt2YXIgbz1pLmNoYXJDb2RlQXQoMCksdT1pLmNoYXJDb2RlQXQoMSkscD1pLmNoYXJDb2RlQXQoMiksYj1pLmNoYXJDb2RlQXQoMyksZz10aGlzLnJlYWREYXRhKDQpO3JldHVybiBvPT09Z1swXSYmdT09PWdbMV0mJnA9PT1nWzJdJiZiPT09Z1szXX0scy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7aWYodGhpcy5jaGVja09mZnNldChpKSxpPT09MClyZXR1cm5bXTt2YXIgbz10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgraSk7cmV0dXJuIHRoaXMuaW5kZXgrPWksb30sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL0RhdGFSZWFkZXIiOjE4fV0sMTg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKTtmdW5jdGlvbiBzKGkpe3RoaXMuZGF0YT1pLHRoaXMubGVuZ3RoPWkubGVuZ3RoLHRoaXMuaW5kZXg9MCx0aGlzLnplcm89MH1zLnByb3RvdHlwZT17Y2hlY2tPZmZzZXQ6ZnVuY3Rpb24oaSl7dGhpcy5jaGVja0luZGV4KHRoaXMuaW5kZXgraSl9LGNoZWNrSW5kZXg6ZnVuY3Rpb24oaSl7aWYodGhpcy5sZW5ndGg8dGhpcy56ZXJvK2l8fGk8MCl0aHJvdyBuZXcgRXJyb3IoIkVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gIit0aGlzLmxlbmd0aCsiLCBhc2tlZCBpbmRleCA9ICIraSsiKS4gQ29ycnVwdGVkIHppcCA/Iil9LHNldEluZGV4OmZ1bmN0aW9uKGkpe3RoaXMuY2hlY2tJbmRleChpKSx0aGlzLmluZGV4PWl9LHNraXA6ZnVuY3Rpb24oaSl7dGhpcy5zZXRJbmRleCh0aGlzLmluZGV4K2kpfSxieXRlQXQ6ZnVuY3Rpb24oKXt9LHJlYWRJbnQ6ZnVuY3Rpb24oaSl7dmFyIG8sdT0wO2Zvcih0aGlzLmNoZWNrT2Zmc2V0KGkpLG89dGhpcy5pbmRleCtpLTE7bz49dGhpcy5pbmRleDtvLS0pdT0odTw8OCkrdGhpcy5ieXRlQXQobyk7cmV0dXJuIHRoaXMuaW5kZXgrPWksdX0scmVhZFN0cmluZzpmdW5jdGlvbihpKXtyZXR1cm4gci50cmFuc2Zvcm1Ubygic3RyaW5nIix0aGlzLnJlYWREYXRhKGkpKX0scmVhZERhdGE6ZnVuY3Rpb24oKXt9LGxhc3RJbmRleE9mU2lnbmF0dXJlOmZ1bmN0aW9uKCl7fSxyZWFkQW5kQ2hlY2tTaWduYXR1cmU6ZnVuY3Rpb24oKXt9LHJlYWREYXRlOmZ1bmN0aW9uKCl7dmFyIGk9dGhpcy5yZWFkSW50KDQpO3JldHVybiBuZXcgRGF0ZShEYXRlLlVUQygxOTgwKyhpPj4yNSYxMjcpLChpPj4yMSYxNSktMSxpPj4xNiYzMSxpPj4xMSYzMSxpPj41JjYzLCgzMSZpKTw8MSkpfX0sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyfV0sMTk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9VaW50OEFycmF5UmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7dGhpcy5jaGVja09mZnNldChpKTt2YXIgbz10aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvK3RoaXMuaW5kZXgsdGhpcy56ZXJvK3RoaXMuaW5kZXgraSk7cmV0dXJuIHRoaXMuaW5kZXgrPWksb30sZS5leHBvcnRzPXN9LHsiLi4vdXRpbHMiOjMyLCIuL1VpbnQ4QXJyYXlSZWFkZXIiOjIxfV0sMjA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9EYXRhUmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUuYnl0ZUF0PWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnplcm8raSl9LHMucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlPWZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmRhdGEubGFzdEluZGV4T2YoaSktdGhpcy56ZXJvfSxzLnByb3RvdHlwZS5yZWFkQW5kQ2hlY2tTaWduYXR1cmU9ZnVuY3Rpb24oaSl7cmV0dXJuIGk9PT10aGlzLnJlYWREYXRhKDQpfSxzLnByb3RvdHlwZS5yZWFkRGF0YT1mdW5jdGlvbihpKXt0aGlzLmNoZWNrT2Zmc2V0KGkpO3ZhciBvPXRoaXMuZGF0YS5zbGljZSh0aGlzLnplcm8rdGhpcy5pbmRleCx0aGlzLnplcm8rdGhpcy5pbmRleCtpKTtyZXR1cm4gdGhpcy5pbmRleCs9aSxvfSxlLmV4cG9ydHM9c30seyIuLi91dGlscyI6MzIsIi4vRGF0YVJlYWRlciI6MTh9XSwyMTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0FycmF5UmVhZGVyIik7ZnVuY3Rpb24gcyhpKXtyLmNhbGwodGhpcyxpKX10KCIuLi91dGlscyIpLmluaGVyaXRzKHMscikscy5wcm90b3R5cGUucmVhZERhdGE9ZnVuY3Rpb24oaSl7aWYodGhpcy5jaGVja09mZnNldChpKSxpPT09MClyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7dmFyIG89dGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuemVybyt0aGlzLmluZGV4LHRoaXMuemVybyt0aGlzLmluZGV4K2kpO3JldHVybiB0aGlzLmluZGV4Kz1pLG99LGUuZXhwb3J0cz1zfSx7Ii4uL3V0aWxzIjozMiwiLi9BcnJheVJlYWRlciI6MTd9XSwyMjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuLi91dGlscyIpLHM9dCgiLi4vc3VwcG9ydCIpLGk9dCgiLi9BcnJheVJlYWRlciIpLG89dCgiLi9TdHJpbmdSZWFkZXIiKSx1PXQoIi4vTm9kZUJ1ZmZlclJlYWRlciIpLHA9dCgiLi9VaW50OEFycmF5UmVhZGVyIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGIpe3ZhciBnPXIuZ2V0VHlwZU9mKGIpO3JldHVybiByLmNoZWNrU3VwcG9ydChnKSxnIT09InN0cmluZyJ8fHMudWludDhhcnJheT9nPT09Im5vZGVidWZmZXIiP25ldyB1KGIpOnMudWludDhhcnJheT9uZXcgcChyLnRyYW5zZm9ybVRvKCJ1aW50OGFycmF5IixiKSk6bmV3IGkoci50cmFuc2Zvcm1UbygiYXJyYXkiLGIpKTpuZXcgbyhiKX19LHsiLi4vc3VwcG9ydCI6MzAsIi4uL3V0aWxzIjozMiwiLi9BcnJheVJlYWRlciI6MTcsIi4vTm9kZUJ1ZmZlclJlYWRlciI6MTksIi4vU3RyaW5nUmVhZGVyIjoyMCwiLi9VaW50OEFycmF5UmVhZGVyIjoyMX1dLDIzOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24uTE9DQUxfRklMRV9IRUFERVI9IlBLAwQiLG4uQ0VOVFJBTF9GSUxFX0hFQURFUj0iUEsBAiIsbi5DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9IlBLBQYiLG4uWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUj0iUEsGXHgwNyIsbi5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9IlBLBgYiLG4uREFUQV9ERVNDUklQVE9SPSJQS1x4MDdcYiJ9LHt9XSwyNDpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0dlbmVyaWNXb3JrZXIiKSxzPXQoIi4uL3V0aWxzIik7ZnVuY3Rpb24gaShvKXtyLmNhbGwodGhpcywiQ29udmVydFdvcmtlciB0byAiK28pLHRoaXMuZGVzdFR5cGU9b31zLmluaGVyaXRzKGksciksaS5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKG8pe3RoaXMucHVzaCh7ZGF0YTpzLnRyYW5zZm9ybVRvKHRoaXMuZGVzdFR5cGUsby5kYXRhKSxtZXRhOm8ubWV0YX0pfSxlLmV4cG9ydHM9aX0seyIuLi91dGlscyI6MzIsIi4vR2VuZXJpY1dvcmtlciI6Mjh9XSwyNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL0dlbmVyaWNXb3JrZXIiKSxzPXQoIi4uL2NyYzMyIik7ZnVuY3Rpb24gaSgpe3IuY2FsbCh0aGlzLCJDcmMzMlByb2JlIiksdGhpcy53aXRoU3RyZWFtSW5mbygiY3JjMzIiLDApfXQoIi4uL3V0aWxzIikuaW5oZXJpdHMoaSxyKSxpLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24obyl7dGhpcy5zdHJlYW1JbmZvLmNyYzMyPXMoby5kYXRhLHRoaXMuc3RyZWFtSW5mby5jcmMzMnx8MCksdGhpcy5wdXNoKG8pfSxlLmV4cG9ydHM9aX0seyIuLi9jcmMzMiI6NCwiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vR2VuZXJpY1dvcmtlciIpO2Z1bmN0aW9uIGkobyl7cy5jYWxsKHRoaXMsIkRhdGFMZW5ndGhQcm9iZSBmb3IgIitvKSx0aGlzLnByb3BOYW1lPW8sdGhpcy53aXRoU3RyZWFtSW5mbyhvLDApfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5wcm9jZXNzQ2h1bms9ZnVuY3Rpb24obyl7aWYobyl7dmFyIHU9dGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdfHwwO3RoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXT11K28uZGF0YS5sZW5ndGh9cy5wcm90b3R5cGUucHJvY2Vzc0NodW5rLmNhbGwodGhpcyxvKX0sZS5leHBvcnRzPWl9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vR2VuZXJpY1dvcmtlciIpO2Z1bmN0aW9uIGkobyl7cy5jYWxsKHRoaXMsIkRhdGFXb3JrZXIiKTt2YXIgdT10aGlzO3RoaXMuZGF0YUlzUmVhZHk9ITEsdGhpcy5pbmRleD0wLHRoaXMubWF4PTAsdGhpcy5kYXRhPW51bGwsdGhpcy50eXBlPSIiLHRoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsby50aGVuKGZ1bmN0aW9uKHApe3UuZGF0YUlzUmVhZHk9ITAsdS5kYXRhPXAsdS5tYXg9cCYmcC5sZW5ndGh8fDAsdS50eXBlPXIuZ2V0VHlwZU9mKHApLHUuaXNQYXVzZWR8fHUuX3RpY2tBbmRSZXBlYXQoKX0sZnVuY3Rpb24ocCl7dS5lcnJvcihwKX0pfXIuaW5oZXJpdHMoaSxzKSxpLnByb3RvdHlwZS5jbGVhblVwPWZ1bmN0aW9uKCl7cy5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpLHRoaXMuZGF0YT1udWxsfSxpLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4hIXMucHJvdG90eXBlLnJlc3VtZS5jYWxsKHRoaXMpJiYoIXRoaXMuX3RpY2tTY2hlZHVsZWQmJnRoaXMuZGF0YUlzUmVhZHkmJih0aGlzLl90aWNrU2NoZWR1bGVkPSEwLHIuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSksITApfSxpLnByb3RvdHlwZS5fdGlja0FuZFJlcGVhdD1mdW5jdGlvbigpe3RoaXMuX3RpY2tTY2hlZHVsZWQ9ITEsdGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkfHwodGhpcy5fdGljaygpLHRoaXMuaXNGaW5pc2hlZHx8KHIuZGVsYXkodGhpcy5fdGlja0FuZFJlcGVhdCxbXSx0aGlzKSx0aGlzLl90aWNrU2NoZWR1bGVkPSEwKSl9LGkucHJvdG90eXBlLl90aWNrPWZ1bmN0aW9uKCl7aWYodGhpcy5pc1BhdXNlZHx8dGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3ZhciBvPW51bGwsdT1NYXRoLm1pbih0aGlzLm1heCx0aGlzLmluZGV4KzE2Mzg0KTtpZih0aGlzLmluZGV4Pj10aGlzLm1heClyZXR1cm4gdGhpcy5lbmQoKTtzd2l0Y2godGhpcy50eXBlKXtjYXNlInN0cmluZyI6bz10aGlzLmRhdGEuc3Vic3RyaW5nKHRoaXMuaW5kZXgsdSk7YnJlYWs7Y2FzZSJ1aW50OGFycmF5IjpvPXRoaXMuZGF0YS5zdWJhcnJheSh0aGlzLmluZGV4LHUpO2JyZWFrO2Nhc2UiYXJyYXkiOmNhc2Uibm9kZWJ1ZmZlciI6bz10aGlzLmRhdGEuc2xpY2UodGhpcy5pbmRleCx1KX1yZXR1cm4gdGhpcy5pbmRleD11LHRoaXMucHVzaCh7ZGF0YTpvLG1ldGE6e3BlcmNlbnQ6dGhpcy5tYXg/dGhpcy5pbmRleC90aGlzLm1heCoxMDA6MH19KX0sZS5leHBvcnRzPWl9LHsiLi4vdXRpbHMiOjMyLCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMjg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihzKXt0aGlzLm5hbWU9c3x8ImRlZmF1bHQiLHRoaXMuc3RyZWFtSW5mbz17fSx0aGlzLmdlbmVyYXRlZEVycm9yPW51bGwsdGhpcy5leHRyYVN0cmVhbUluZm89e30sdGhpcy5pc1BhdXNlZD0hMCx0aGlzLmlzRmluaXNoZWQ9ITEsdGhpcy5pc0xvY2tlZD0hMSx0aGlzLl9saXN0ZW5lcnM9e2RhdGE6W10sZW5kOltdLGVycm9yOltdfSx0aGlzLnByZXZpb3VzPW51bGx9ci5wcm90b3R5cGU9e3B1c2g6ZnVuY3Rpb24ocyl7dGhpcy5lbWl0KCJkYXRhIixzKX0sZW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0ZpbmlzaGVkKXJldHVybiExO3RoaXMuZmx1c2goKTt0cnl7dGhpcy5lbWl0KCJlbmQiKSx0aGlzLmNsZWFuVXAoKSx0aGlzLmlzRmluaXNoZWQ9ITB9Y2F0Y2gocyl7dGhpcy5lbWl0KCJlcnJvciIscyl9cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKHMpe3JldHVybiF0aGlzLmlzRmluaXNoZWQmJih0aGlzLmlzUGF1c2VkP3RoaXMuZ2VuZXJhdGVkRXJyb3I9czoodGhpcy5pc0ZpbmlzaGVkPSEwLHRoaXMuZW1pdCgiZXJyb3IiLHMpLHRoaXMucHJldmlvdXMmJnRoaXMucHJldmlvdXMuZXJyb3IocyksdGhpcy5jbGVhblVwKCkpLCEwKX0sb246ZnVuY3Rpb24ocyxpKXtyZXR1cm4gdGhpcy5fbGlzdGVuZXJzW3NdLnB1c2goaSksdGhpc30sY2xlYW5VcDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtSW5mbz10aGlzLmdlbmVyYXRlZEVycm9yPXRoaXMuZXh0cmFTdHJlYW1JbmZvPW51bGwsdGhpcy5fbGlzdGVuZXJzPVtdfSxlbWl0OmZ1bmN0aW9uKHMsaSl7aWYodGhpcy5fbGlzdGVuZXJzW3NdKWZvcih2YXIgbz0wO288dGhpcy5fbGlzdGVuZXJzW3NdLmxlbmd0aDtvKyspdGhpcy5fbGlzdGVuZXJzW3NdW29dLmNhbGwodGhpcyxpKX0scGlwZTpmdW5jdGlvbihzKXtyZXR1cm4gcy5yZWdpc3RlclByZXZpb3VzKHRoaXMpfSxyZWdpc3RlclByZXZpb3VzOmZ1bmN0aW9uKHMpe2lmKHRoaXMuaXNMb2NrZWQpdGhyb3cgbmV3IEVycm9yKCJUaGUgc3RyZWFtICciK3RoaXMrIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIpO3RoaXMuc3RyZWFtSW5mbz1zLnN0cmVhbUluZm8sdGhpcy5tZXJnZVN0cmVhbUluZm8oKSx0aGlzLnByZXZpb3VzPXM7dmFyIGk9dGhpcztyZXR1cm4gcy5vbigiZGF0YSIsZnVuY3Rpb24obyl7aS5wcm9jZXNzQ2h1bmsobyl9KSxzLm9uKCJlbmQiLGZ1bmN0aW9uKCl7aS5lbmQoKX0pLHMub24oImVycm9yIixmdW5jdGlvbihvKXtpLmVycm9yKG8pfSksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5pc1BhdXNlZCYmIXRoaXMuaXNGaW5pc2hlZCYmKHRoaXMuaXNQYXVzZWQ9ITAsdGhpcy5wcmV2aW91cyYmdGhpcy5wcmV2aW91cy5wYXVzZSgpLCEwKX0scmVzdW1lOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaXNQYXVzZWR8fHRoaXMuaXNGaW5pc2hlZClyZXR1cm4hMTt2YXIgcz10aGlzLmlzUGF1c2VkPSExO3JldHVybiB0aGlzLmdlbmVyYXRlZEVycm9yJiYodGhpcy5lcnJvcih0aGlzLmdlbmVyYXRlZEVycm9yKSxzPSEwKSx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLnJlc3VtZSgpLCFzfSxmbHVzaDpmdW5jdGlvbigpe30scHJvY2Vzc0NodW5rOmZ1bmN0aW9uKHMpe3RoaXMucHVzaChzKX0sd2l0aFN0cmVhbUluZm86ZnVuY3Rpb24ocyxpKXtyZXR1cm4gdGhpcy5leHRyYVN0cmVhbUluZm9bc109aSx0aGlzLm1lcmdlU3RyZWFtSW5mbygpLHRoaXN9LG1lcmdlU3RyZWFtSW5mbzpmdW5jdGlvbigpe2Zvcih2YXIgcyBpbiB0aGlzLmV4dHJhU3RyZWFtSW5mbylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5leHRyYVN0cmVhbUluZm8scykmJih0aGlzLnN0cmVhbUluZm9bc109dGhpcy5leHRyYVN0cmVhbUluZm9bc10pfSxsb2NrOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0xvY2tlZCl0aHJvdyBuZXcgRXJyb3IoIlRoZSBzdHJlYW0gJyIrdGhpcysiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuIik7dGhpcy5pc0xvY2tlZD0hMCx0aGlzLnByZXZpb3VzJiZ0aGlzLnByZXZpb3VzLmxvY2soKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgcz0iV29ya2VyICIrdGhpcy5uYW1lO3JldHVybiB0aGlzLnByZXZpb3VzP3RoaXMucHJldmlvdXMrIiAtPiAiK3M6c319LGUuZXhwb3J0cz1yfSx7fV0sMjk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMiKSxzPXQoIi4vQ29udmVydFdvcmtlciIpLGk9dCgiLi9HZW5lcmljV29ya2VyIiksbz10KCIuLi9iYXNlNjQiKSx1PXQoIi4uL3N1cHBvcnQiKSxwPXQoIi4uL2V4dGVybmFsIiksYj1udWxsO2lmKHUubm9kZXN0cmVhbSl0cnl7Yj10KCIuLi9ub2RlanMvTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciIpfWNhdGNoe31mdW5jdGlvbiBnKEMseSl7cmV0dXJuIG5ldyBwLlByb21pc2UoZnVuY3Rpb24oVCxQKXt2YXIgYz1bXSxsPUMuX2ludGVybmFsVHlwZSxoPUMuX291dHB1dFR5cGUsXz1DLl9taW1lVHlwZTtDLm9uKCJkYXRhIixmdW5jdGlvbihGLE8pe2MucHVzaChGKSx5JiZ5KE8pfSkub24oImVycm9yIixmdW5jdGlvbihGKXtjPVtdLFAoRil9KS5vbigiZW5kIixmdW5jdGlvbigpe3RyeXt2YXIgRj1mdW5jdGlvbihPLGYsVSl7c3dpdGNoKE8pe2Nhc2UiYmxvYiI6cmV0dXJuIHIubmV3QmxvYihyLnRyYW5zZm9ybVRvKCJhcnJheWJ1ZmZlciIsZiksVSk7Y2FzZSJiYXNlNjQiOnJldHVybiBvLmVuY29kZShmKTtkZWZhdWx0OnJldHVybiByLnRyYW5zZm9ybVRvKE8sZil9fShoLGZ1bmN0aW9uKE8sZil7dmFyIFUsWD0wLFE9bnVsbCxFPTA7Zm9yKFU9MDtVPGYubGVuZ3RoO1UrKylFKz1mW1VdLmxlbmd0aDtzd2l0Y2goTyl7Y2FzZSJzdHJpbmciOnJldHVybiBmLmpvaW4oIiIpO2Nhc2UiYXJyYXkiOnJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGYpO2Nhc2UidWludDhhcnJheSI6Zm9yKFE9bmV3IFVpbnQ4QXJyYXkoRSksVT0wO1U8Zi5sZW5ndGg7VSsrKVEuc2V0KGZbVV0sWCksWCs9ZltVXS5sZW5ndGg7cmV0dXJuIFE7Y2FzZSJub2RlYnVmZmVyIjpyZXR1cm4gQnVmZmVyLmNvbmNhdChmKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiY29uY2F0IDogdW5zdXBwb3J0ZWQgdHlwZSAnIitPKyInIil9fShsLGMpLF8pO1QoRil9Y2F0Y2goTyl7UChPKX1jPVtdfSkucmVzdW1lKCl9KX1mdW5jdGlvbiBtKEMseSxUKXt2YXIgUD15O3N3aXRjaCh5KXtjYXNlImJsb2IiOmNhc2UiYXJyYXlidWZmZXIiOlA9InVpbnQ4YXJyYXkiO2JyZWFrO2Nhc2UiYmFzZTY0IjpQPSJzdHJpbmcifXRyeXt0aGlzLl9pbnRlcm5hbFR5cGU9UCx0aGlzLl9vdXRwdXRUeXBlPXksdGhpcy5fbWltZVR5cGU9VCxyLmNoZWNrU3VwcG9ydChQKSx0aGlzLl93b3JrZXI9Qy5waXBlKG5ldyBzKFApKSxDLmxvY2soKX1jYXRjaChjKXt0aGlzLl93b3JrZXI9bmV3IGkoImVycm9yIiksdGhpcy5fd29ya2VyLmVycm9yKGMpfX1tLnByb3RvdHlwZT17YWNjdW11bGF0ZTpmdW5jdGlvbihDKXtyZXR1cm4gZyh0aGlzLEMpfSxvbjpmdW5jdGlvbihDLHkpe3ZhciBUPXRoaXM7cmV0dXJuIEM9PT0iZGF0YSI/dGhpcy5fd29ya2VyLm9uKEMsZnVuY3Rpb24oUCl7eS5jYWxsKFQsUC5kYXRhLFAubWV0YSl9KTp0aGlzLl93b3JrZXIub24oQyxmdW5jdGlvbigpe3IuZGVsYXkoeSxhcmd1bWVudHMsVCl9KSx0aGlzfSxyZXN1bWU6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWxheSh0aGlzLl93b3JrZXIucmVzdW1lLFtdLHRoaXMuX3dvcmtlciksdGhpc30scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd29ya2VyLnBhdXNlKCksdGhpc30sdG9Ob2RlanNTdHJlYW06ZnVuY3Rpb24oQyl7aWYoci5jaGVja1N1cHBvcnQoIm5vZGVzdHJlYW0iKSx0aGlzLl9vdXRwdXRUeXBlIT09Im5vZGVidWZmZXIiKXRocm93IG5ldyBFcnJvcih0aGlzLl9vdXRwdXRUeXBlKyIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZCIpO3JldHVybiBuZXcgYih0aGlzLHtvYmplY3RNb2RlOnRoaXMuX291dHB1dFR5cGUhPT0ibm9kZWJ1ZmZlciJ9LEMpfX0sZS5leHBvcnRzPW19LHsiLi4vYmFzZTY0IjoxLCIuLi9leHRlcm5hbCI6NiwiLi4vbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIiOjEzLCIuLi9zdXBwb3J0IjozMCwiLi4vdXRpbHMiOjMyLCIuL0NvbnZlcnRXb3JrZXIiOjI0LCIuL0dlbmVyaWNXb3JrZXIiOjI4fV0sMzA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7aWYobi5iYXNlNjQ9ITAsbi5hcnJheT0hMCxuLnN0cmluZz0hMCxuLmFycmF5YnVmZmVyPXR5cGVvZiBBcnJheUJ1ZmZlcjwidSImJnR5cGVvZiBVaW50OEFycmF5PCJ1IixuLm5vZGVidWZmZXI9dHlwZW9mIEJ1ZmZlcjwidSIsbi51aW50OGFycmF5PXR5cGVvZiBVaW50OEFycmF5PCJ1Iix0eXBlb2YgQXJyYXlCdWZmZXI+InUiKW4uYmxvYj0hMTtlbHNle3ZhciByPW5ldyBBcnJheUJ1ZmZlcigwKTt0cnl7bi5ibG9iPW5ldyBCbG9iKFtyXSx7dHlwZToiYXBwbGljYXRpb24vemlwIn0pLnNpemU9PT0wfWNhdGNoe3RyeXt2YXIgcz1uZXcoc2VsZi5CbG9iQnVpbGRlcnx8c2VsZi5XZWJLaXRCbG9iQnVpbGRlcnx8c2VsZi5Nb3pCbG9iQnVpbGRlcnx8c2VsZi5NU0Jsb2JCdWlsZGVyKTtzLmFwcGVuZChyKSxuLmJsb2I9cy5nZXRCbG9iKCJhcHBsaWNhdGlvbi96aXAiKS5zaXplPT09MH1jYXRjaHtuLmJsb2I9ITF9fX10cnl7bi5ub2Rlc3RyZWFtPSEhdCgicmVhZGFibGUtc3RyZWFtIikuUmVhZGFibGV9Y2F0Y2h7bi5ub2Rlc3RyZWFtPSExfX0seyJyZWFkYWJsZS1zdHJlYW0iOjE2fV0sMzE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7Zm9yKHZhciByPXQoIi4vdXRpbHMiKSxzPXQoIi4vc3VwcG9ydCIpLGk9dCgiLi9ub2RlanNVdGlscyIpLG89dCgiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciIpLHU9bmV3IEFycmF5KDI1NikscD0wO3A8MjU2O3ArKyl1W3BdPTI1Mjw9cD82OjI0ODw9cD81OjI0MDw9cD80OjIyNDw9cD8zOjE5Mjw9cD8yOjE7dVsyNTRdPXVbMjU0XT0xO2Z1bmN0aW9uIGIoKXtvLmNhbGwodGhpcywidXRmLTggZGVjb2RlIiksdGhpcy5sZWZ0T3Zlcj1udWxsfWZ1bmN0aW9uIGcoKXtvLmNhbGwodGhpcywidXRmLTggZW5jb2RlIil9bi51dGY4ZW5jb2RlPWZ1bmN0aW9uKG0pe3JldHVybiBzLm5vZGVidWZmZXI/aS5uZXdCdWZmZXJGcm9tKG0sInV0Zi04Iik6ZnVuY3Rpb24oQyl7dmFyIHksVCxQLGMsbCxoPUMubGVuZ3RoLF89MDtmb3IoYz0wO2M8aDtjKyspKDY0NTEyJihUPUMuY2hhckNvZGVBdChjKSkpPT01NTI5NiYmYysxPGgmJig2NDUxMiYoUD1DLmNoYXJDb2RlQXQoYysxKSkpPT01NjMyMCYmKFQ9NjU1MzYrKFQtNTUyOTY8PDEwKSsoUC01NjMyMCksYysrKSxfKz1UPDEyOD8xOlQ8MjA0OD8yOlQ8NjU1MzY/Mzo0O2Zvcih5PXMudWludDhhcnJheT9uZXcgVWludDhBcnJheShfKTpuZXcgQXJyYXkoXyksYz1sPTA7bDxfO2MrKykoNjQ1MTImKFQ9Qy5jaGFyQ29kZUF0KGMpKSk9PTU1Mjk2JiZjKzE8aCYmKDY0NTEyJihQPUMuY2hhckNvZGVBdChjKzEpKSk9PTU2MzIwJiYoVD02NTUzNisoVC01NTI5Njw8MTApKyhQLTU2MzIwKSxjKyspLFQ8MTI4P3lbbCsrXT1UOihUPDIwNDg/eVtsKytdPTE5MnxUPj4+NjooVDw2NTUzNj95W2wrK109MjI0fFQ+Pj4xMjooeVtsKytdPTI0MHxUPj4+MTgseVtsKytdPTEyOHxUPj4+MTImNjMpLHlbbCsrXT0xMjh8VD4+PjYmNjMpLHlbbCsrXT0xMjh8NjMmVCk7cmV0dXJuIHl9KG0pfSxuLnV0ZjhkZWNvZGU9ZnVuY3Rpb24obSl7cmV0dXJuIHMubm9kZWJ1ZmZlcj9yLnRyYW5zZm9ybVRvKCJub2RlYnVmZmVyIixtKS50b1N0cmluZygidXRmLTgiKTpmdW5jdGlvbihDKXt2YXIgeSxULFAsYyxsPUMubGVuZ3RoLGg9bmV3IEFycmF5KDIqbCk7Zm9yKHk9VD0wO3k8bDspaWYoKFA9Q1t5KytdKTwxMjgpaFtUKytdPVA7ZWxzZSBpZig0PChjPXVbUF0pKWhbVCsrXT02NTUzMyx5Kz1jLTE7ZWxzZXtmb3IoUCY9Yz09PTI/MzE6Yz09PTM/MTU6NzsxPGMmJnk8bDspUD1QPDw2fDYzJkNbeSsrXSxjLS07MTxjP2hbVCsrXT02NTUzMzpQPDY1NTM2P2hbVCsrXT1QOihQLT02NTUzNixoW1QrK109NTUyOTZ8UD4+MTAmMTAyMyxoW1QrK109NTYzMjB8MTAyMyZQKX1yZXR1cm4gaC5sZW5ndGghPT1UJiYoaC5zdWJhcnJheT9oPWguc3ViYXJyYXkoMCxUKTpoLmxlbmd0aD1UKSxyLmFwcGx5RnJvbUNoYXJDb2RlKGgpfShtPXIudHJhbnNmb3JtVG8ocy51aW50OGFycmF5PyJ1aW50OGFycmF5IjoiYXJyYXkiLG0pKX0sci5pbmhlcml0cyhiLG8pLGIucHJvdG90eXBlLnByb2Nlc3NDaHVuaz1mdW5jdGlvbihtKXt2YXIgQz1yLnRyYW5zZm9ybVRvKHMudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixtLmRhdGEpO2lmKHRoaXMubGVmdE92ZXImJnRoaXMubGVmdE92ZXIubGVuZ3RoKXtpZihzLnVpbnQ4YXJyYXkpe3ZhciB5PUM7KEM9bmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgrdGhpcy5sZWZ0T3Zlci5sZW5ndGgpKS5zZXQodGhpcy5sZWZ0T3ZlciwwKSxDLnNldCh5LHRoaXMubGVmdE92ZXIubGVuZ3RoKX1lbHNlIEM9dGhpcy5sZWZ0T3Zlci5jb25jYXQoQyk7dGhpcy5sZWZ0T3Zlcj1udWxsfXZhciBUPWZ1bmN0aW9uKGMsbCl7dmFyIGg7Zm9yKChsPWx8fGMubGVuZ3RoKT5jLmxlbmd0aCYmKGw9Yy5sZW5ndGgpLGg9bC0xOzA8PWgmJigxOTImY1toXSk9PTEyODspaC0tO3JldHVybiBoPDB8fGg9PT0wP2w6aCt1W2NbaF1dPmw/aDpsfShDKSxQPUM7VCE9PUMubGVuZ3RoJiYocy51aW50OGFycmF5PyhQPUMuc3ViYXJyYXkoMCxUKSx0aGlzLmxlZnRPdmVyPUMuc3ViYXJyYXkoVCxDLmxlbmd0aCkpOihQPUMuc2xpY2UoMCxUKSx0aGlzLmxlZnRPdmVyPUMuc2xpY2UoVCxDLmxlbmd0aCkpKSx0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKFApLG1ldGE6bS5tZXRhfSl9LGIucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7dGhpcy5sZWZ0T3ZlciYmdGhpcy5sZWZ0T3Zlci5sZW5ndGgmJih0aGlzLnB1c2goe2RhdGE6bi51dGY4ZGVjb2RlKHRoaXMubGVmdE92ZXIpLG1ldGE6e319KSx0aGlzLmxlZnRPdmVyPW51bGwpfSxuLlV0ZjhEZWNvZGVXb3JrZXI9YixyLmluaGVyaXRzKGcsbyksZy5wcm90b3R5cGUucHJvY2Vzc0NodW5rPWZ1bmN0aW9uKG0pe3RoaXMucHVzaCh7ZGF0YTpuLnV0ZjhlbmNvZGUobS5kYXRhKSxtZXRhOm0ubWV0YX0pfSxuLlV0ZjhFbmNvZGVXb3JrZXI9Z30seyIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3VwcG9ydCI6MzAsIi4vdXRpbHMiOjMyfV0sMzI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9zdXBwb3J0Iikscz10KCIuL2Jhc2U2NCIpLGk9dCgiLi9ub2RlanNVdGlscyIpLG89dCgiLi9leHRlcm5hbCIpO2Z1bmN0aW9uIHUoeSl7cmV0dXJuIHl9ZnVuY3Rpb24gcCh5LFQpe2Zvcih2YXIgUD0wO1A8eS5sZW5ndGg7KytQKVRbUF09MjU1JnkuY2hhckNvZGVBdChQKTtyZXR1cm4gVH10KCJzZXRpbW1lZGlhdGUiKSxuLm5ld0Jsb2I9ZnVuY3Rpb24oeSxUKXtuLmNoZWNrU3VwcG9ydCgiYmxvYiIpO3RyeXtyZXR1cm4gbmV3IEJsb2IoW3ldLHt0eXBlOlR9KX1jYXRjaHt0cnl7dmFyIFA9bmV3KHNlbGYuQmxvYkJ1aWxkZXJ8fHNlbGYuV2ViS2l0QmxvYkJ1aWxkZXJ8fHNlbGYuTW96QmxvYkJ1aWxkZXJ8fHNlbGYuTVNCbG9iQnVpbGRlcik7cmV0dXJuIFAuYXBwZW5kKHkpLFAuZ2V0QmxvYihUKX1jYXRjaHt0aHJvdyBuZXcgRXJyb3IoIkJ1ZyA6IGNhbid0IGNvbnN0cnVjdCB0aGUgQmxvYi4iKX19fTt2YXIgYj17c3RyaW5naWZ5QnlDaHVuazpmdW5jdGlvbih5LFQsUCl7dmFyIGM9W10sbD0wLGg9eS5sZW5ndGg7aWYoaDw9UClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHkpO2Zvcig7bDxoOylUPT09ImFycmF5Inx8VD09PSJub2RlYnVmZmVyIj9jLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHkuc2xpY2UobCxNYXRoLm1pbihsK1AsaCkpKSk6Yy5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCx5LnN1YmFycmF5KGwsTWF0aC5taW4obCtQLGgpKSkpLGwrPVA7cmV0dXJuIGMuam9pbigiIil9LHN0cmluZ2lmeUJ5Q2hhcjpmdW5jdGlvbih5KXtmb3IodmFyIFQ9IiIsUD0wO1A8eS5sZW5ndGg7UCsrKVQrPVN0cmluZy5mcm9tQ2hhckNvZGUoeVtQXSk7cmV0dXJuIFR9LGFwcGx5Q2FuQmVVc2VkOnt1aW50OGFycmF5OmZ1bmN0aW9uKCl7dHJ5e3JldHVybiByLnVpbnQ4YXJyYXkmJlN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxuZXcgVWludDhBcnJheSgxKSkubGVuZ3RoPT09MX1jYXRjaHtyZXR1cm4hMX19KCksbm9kZWJ1ZmZlcjpmdW5jdGlvbigpe3RyeXtyZXR1cm4gci5ub2RlYnVmZmVyJiZTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsaS5hbGxvY0J1ZmZlcigxKSkubGVuZ3RoPT09MX1jYXRjaHtyZXR1cm4hMX19KCl9fTtmdW5jdGlvbiBnKHkpe3ZhciBUPTY1NTM2LFA9bi5nZXRUeXBlT2YoeSksYz0hMDtpZihQPT09InVpbnQ4YXJyYXkiP2M9Yi5hcHBseUNhbkJlVXNlZC51aW50OGFycmF5OlA9PT0ibm9kZWJ1ZmZlciImJihjPWIuYXBwbHlDYW5CZVVzZWQubm9kZWJ1ZmZlciksYylmb3IoOzE8VDspdHJ5e3JldHVybiBiLnN0cmluZ2lmeUJ5Q2h1bmsoeSxQLFQpfWNhdGNoe1Q9TWF0aC5mbG9vcihULzIpfXJldHVybiBiLnN0cmluZ2lmeUJ5Q2hhcih5KX1mdW5jdGlvbiBtKHksVCl7Zm9yKHZhciBQPTA7UDx5Lmxlbmd0aDtQKyspVFtQXT15W1BdO3JldHVybiBUfW4uYXBwbHlGcm9tQ2hhckNvZGU9Zzt2YXIgQz17fTtDLnN0cmluZz17c3RyaW5nOnUsYXJyYXk6ZnVuY3Rpb24oeSl7cmV0dXJuIHAoeSxuZXcgQXJyYXkoeS5sZW5ndGgpKX0sYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIEMuc3RyaW5nLnVpbnQ4YXJyYXkoeSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBwKHksbmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gcCh5LGkuYWxsb2NCdWZmZXIoeS5sZW5ndGgpKX19LEMuYXJyYXk9e3N0cmluZzpnLGFycmF5OnUsYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHkpLmJ1ZmZlcn0sdWludDhhcnJheTpmdW5jdGlvbih5KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeSl9LG5vZGVidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIGkubmV3QnVmZmVyRnJvbSh5KX19LEMuYXJyYXlidWZmZXI9e3N0cmluZzpmdW5jdGlvbih5KXtyZXR1cm4gZyhuZXcgVWludDhBcnJheSh5KSl9LGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBtKG5ldyBVaW50OEFycmF5KHkpLG5ldyBBcnJheSh5LmJ5dGVMZW5ndGgpKX0sYXJyYXlidWZmZXI6dSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBuZXcgVWludDhBcnJheSh5KX0sbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gaS5uZXdCdWZmZXJGcm9tKG5ldyBVaW50OEFycmF5KHkpKX19LEMudWludDhhcnJheT17c3RyaW5nOmcsYXJyYXk6ZnVuY3Rpb24oeSl7cmV0dXJuIG0oeSxuZXcgQXJyYXkoeS5sZW5ndGgpKX0sYXJyYXlidWZmZXI6ZnVuY3Rpb24oeSl7cmV0dXJuIHkuYnVmZmVyfSx1aW50OGFycmF5OnUsbm9kZWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gaS5uZXdCdWZmZXJGcm9tKHkpfX0sQy5ub2RlYnVmZmVyPXtzdHJpbmc6ZyxhcnJheTpmdW5jdGlvbih5KXtyZXR1cm4gbSh5LG5ldyBBcnJheSh5Lmxlbmd0aCkpfSxhcnJheWJ1ZmZlcjpmdW5jdGlvbih5KXtyZXR1cm4gQy5ub2RlYnVmZmVyLnVpbnQ4YXJyYXkoeSkuYnVmZmVyfSx1aW50OGFycmF5OmZ1bmN0aW9uKHkpe3JldHVybiBtKHksbmV3IFVpbnQ4QXJyYXkoeS5sZW5ndGgpKX0sbm9kZWJ1ZmZlcjp1fSxuLnRyYW5zZm9ybVRvPWZ1bmN0aW9uKHksVCl7aWYoVD1UfHwiIiwheSlyZXR1cm4gVDtuLmNoZWNrU3VwcG9ydCh5KTt2YXIgUD1uLmdldFR5cGVPZihUKTtyZXR1cm4gQ1tQXVt5XShUKX0sbi5yZXNvbHZlPWZ1bmN0aW9uKHkpe2Zvcih2YXIgVD15LnNwbGl0KCIvIiksUD1bXSxjPTA7YzxULmxlbmd0aDtjKyspe3ZhciBsPVRbY107bD09PSIuInx8bD09PSIiJiZjIT09MCYmYyE9PVQubGVuZ3RoLTF8fChsPT09Ii4uIj9QLnBvcCgpOlAucHVzaChsKSl9cmV0dXJuIFAuam9pbigiLyIpfSxuLmdldFR5cGVPZj1mdW5jdGlvbih5KXtyZXR1cm4gdHlwZW9mIHk9PSJzdHJpbmciPyJzdHJpbmciOk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5XSI/ImFycmF5IjpyLm5vZGVidWZmZXImJmkuaXNCdWZmZXIoeSk/Im5vZGVidWZmZXIiOnIudWludDhhcnJheSYmeSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXk/InVpbnQ4YXJyYXkiOnIuYXJyYXlidWZmZXImJnkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj8iYXJyYXlidWZmZXIiOnZvaWQgMH0sbi5jaGVja1N1cHBvcnQ9ZnVuY3Rpb24oeSl7aWYoIXJbeS50b0xvd2VyQ2FzZSgpXSl0aHJvdyBuZXcgRXJyb3IoeSsiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybSIpfSxuLk1BWF9WQUxVRV8xNkJJVFM9NjU1MzUsbi5NQVhfVkFMVUVfMzJCSVRTPS0xLG4ucHJldHR5PWZ1bmN0aW9uKHkpe3ZhciBULFAsYz0iIjtmb3IoUD0wO1A8KHl8fCIiKS5sZW5ndGg7UCsrKWMrPSJcXHgiKygoVD15LmNoYXJDb2RlQXQoUCkpPDE2PyIwIjoiIikrVC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtyZXR1cm4gY30sbi5kZWxheT1mdW5jdGlvbih5LFQsUCl7c2V0SW1tZWRpYXRlKGZ1bmN0aW9uKCl7eS5hcHBseShQfHxudWxsLFR8fFtdKX0pfSxuLmluaGVyaXRzPWZ1bmN0aW9uKHksVCl7ZnVuY3Rpb24gUCgpe31QLnByb3RvdHlwZT1ULnByb3RvdHlwZSx5LnByb3RvdHlwZT1uZXcgUH0sbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgeSxULFA9e307Zm9yKHk9MDt5PGFyZ3VtZW50cy5sZW5ndGg7eSsrKWZvcihUIGluIGFyZ3VtZW50c1t5XSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXJndW1lbnRzW3ldLFQpJiZQW1RdPT09dm9pZCAwJiYoUFtUXT1hcmd1bWVudHNbeV1bVF0pO3JldHVybiBQfSxuLnByZXBhcmVDb250ZW50PWZ1bmN0aW9uKHksVCxQLGMsbCl7cmV0dXJuIG8uUHJvbWlzZS5yZXNvbHZlKFQpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIHIuYmxvYiYmKGggaW5zdGFuY2VvZiBCbG9ifHxbIltvYmplY3QgRmlsZV0iLCJbb2JqZWN0IEJsb2JdIl0uaW5kZXhPZihPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaCkpIT09LTEpJiZ0eXBlb2YgRmlsZVJlYWRlcjwidSI/bmV3IG8uUHJvbWlzZShmdW5jdGlvbihfLEYpe3ZhciBPPW5ldyBGaWxlUmVhZGVyO08ub25sb2FkPWZ1bmN0aW9uKGYpe18oZi50YXJnZXQucmVzdWx0KX0sTy5vbmVycm9yPWZ1bmN0aW9uKGYpe0YoZi50YXJnZXQuZXJyb3IpfSxPLnJlYWRBc0FycmF5QnVmZmVyKGgpfSk6aH0pLnRoZW4oZnVuY3Rpb24oaCl7dmFyIF89bi5nZXRUeXBlT2YoaCk7cmV0dXJuIF8/KF89PT0iYXJyYXlidWZmZXIiP2g9bi50cmFuc2Zvcm1UbygidWludDhhcnJheSIsaCk6Xz09PSJzdHJpbmciJiYobD9oPXMuZGVjb2RlKGgpOlAmJmMhPT0hMCYmKGg9ZnVuY3Rpb24oRil7cmV0dXJuIHAoRixyLnVpbnQ4YXJyYXk/bmV3IFVpbnQ4QXJyYXkoRi5sZW5ndGgpOm5ldyBBcnJheShGLmxlbmd0aCkpfShoKSkpLGgpOm8uUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJDYW4ndCByZWFkIHRoZSBkYXRhIG9mICciK3krIicuIElzIGl0IGluIGEgc3VwcG9ydGVkIEphdmFTY3JpcHQgdHlwZSAoU3RyaW5nLCBCbG9iLCBBcnJheUJ1ZmZlciwgZXRjKSA/IikpfSl9fSx7Ii4vYmFzZTY0IjoxLCIuL2V4dGVybmFsIjo2LCIuL25vZGVqc1V0aWxzIjoxNCwiLi9zdXBwb3J0IjozMCxzZXRpbW1lZGlhdGU6NTR9XSwzMzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL3JlYWRlci9yZWFkZXJGb3IiKSxzPXQoIi4vdXRpbHMiKSxpPXQoIi4vc2lnbmF0dXJlIiksbz10KCIuL3ppcEVudHJ5IiksdT10KCIuL3N1cHBvcnQiKTtmdW5jdGlvbiBwKGIpe3RoaXMuZmlsZXM9W10sdGhpcy5sb2FkT3B0aW9ucz1ifXAucHJvdG90eXBlPXtjaGVja1NpZ25hdHVyZTpmdW5jdGlvbihiKXtpZighdGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKGIpKXt0aGlzLnJlYWRlci5pbmRleC09NDt2YXIgZz10aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO3Rocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcCBvciBidWc6IHVuZXhwZWN0ZWQgc2lnbmF0dXJlICgiK3MucHJldHR5KGcpKyIsIGV4cGVjdGVkICIrcy5wcmV0dHkoYikrIikiKX19LGlzU2lnbmF0dXJlOmZ1bmN0aW9uKGIsZyl7dmFyIG09dGhpcy5yZWFkZXIuaW5kZXg7dGhpcy5yZWFkZXIuc2V0SW5kZXgoYik7dmFyIEM9dGhpcy5yZWFkZXIucmVhZFN0cmluZyg0KT09PWc7cmV0dXJuIHRoaXMucmVhZGVyLnNldEluZGV4KG0pLEN9LHJlYWRCbG9ja0VuZE9mQ2VudHJhbDpmdW5jdGlvbigpe3RoaXMuZGlza051bWJlcj10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzaz10aGlzLnJlYWRlci5yZWFkSW50KDIpLHRoaXMuY2VudHJhbERpclJlY29yZHM9dGhpcy5yZWFkZXIucmVhZEludCgyKSx0aGlzLmNlbnRyYWxEaXJTaXplPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5jZW50cmFsRGlyT2Zmc2V0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy56aXBDb21tZW50TGVuZ3RoPXRoaXMucmVhZGVyLnJlYWRJbnQoMik7dmFyIGI9dGhpcy5yZWFkZXIucmVhZERhdGEodGhpcy56aXBDb21tZW50TGVuZ3RoKSxnPXUudWludDhhcnJheT8idWludDhhcnJheSI6ImFycmF5IixtPXMudHJhbnNmb3JtVG8oZyxiKTt0aGlzLnppcENvbW1lbnQ9dGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShtKX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6ZnVuY3Rpb24oKXt0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZT10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMucmVhZGVyLnNraXAoNCksdGhpcy5kaXNrTnVtYmVyPXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD10aGlzLnJlYWRlci5yZWFkSW50KDQpLHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5jZW50cmFsRGlyUmVjb3Jkcz10aGlzLnJlYWRlci5yZWFkSW50KDgpLHRoaXMuY2VudHJhbERpclNpemU9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLmNlbnRyYWxEaXJPZmZzZXQ9dGhpcy5yZWFkZXIucmVhZEludCg4KSx0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGE9e307Zm9yKHZhciBiLGcsbSxDPXRoaXMuemlwNjRFbmRPZkNlbnRyYWxTaXplLTQ0OzA8QzspYj10aGlzLnJlYWRlci5yZWFkSW50KDIpLGc9dGhpcy5yZWFkZXIucmVhZEludCg0KSxtPXRoaXMucmVhZGVyLnJlYWREYXRhKGcpLHRoaXMuemlwNjRFeHRlbnNpYmxlRGF0YVtiXT17aWQ6YixsZW5ndGg6Zyx2YWx1ZTptfX0scmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWxMb2NhdG9yOmZ1bmN0aW9uKCl7aWYodGhpcy5kaXNrV2l0aFppcDY0Q2VudHJhbERpclN0YXJ0PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksdGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLnJlYWRJbnQoOCksdGhpcy5kaXNrc0NvdW50PXRoaXMucmVhZGVyLnJlYWRJbnQoNCksMTx0aGlzLmRpc2tzQ291bnQpdGhyb3cgbmV3IEVycm9yKCJNdWx0aS12b2x1bWVzIHppcCBhcmUgbm90IHN1cHBvcnRlZCIpfSxyZWFkTG9jYWxGaWxlczpmdW5jdGlvbigpe3ZhciBiLGc7Zm9yKGI9MDtiPHRoaXMuZmlsZXMubGVuZ3RoO2IrKylnPXRoaXMuZmlsZXNbYl0sdGhpcy5yZWFkZXIuc2V0SW5kZXgoZy5sb2NhbEhlYWRlck9mZnNldCksdGhpcy5jaGVja1NpZ25hdHVyZShpLkxPQ0FMX0ZJTEVfSEVBREVSKSxnLnJlYWRMb2NhbFBhcnQodGhpcy5yZWFkZXIpLGcuaGFuZGxlVVRGOCgpLGcucHJvY2Vzc0F0dHJpYnV0ZXMoKX0scmVhZENlbnRyYWxEaXI6ZnVuY3Rpb24oKXt2YXIgYjtmb3IodGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5jZW50cmFsRGlyT2Zmc2V0KTt0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoaS5DRU5UUkFMX0ZJTEVfSEVBREVSKTspKGI9bmV3IG8oe3ppcDY0OnRoaXMuemlwNjR9LHRoaXMubG9hZE9wdGlvbnMpKS5yZWFkQ2VudHJhbFBhcnQodGhpcy5yZWFkZXIpLHRoaXMuZmlsZXMucHVzaChiKTtpZih0aGlzLmNlbnRyYWxEaXJSZWNvcmRzIT09dGhpcy5maWxlcy5sZW5ndGgmJnRoaXMuY2VudHJhbERpclJlY29yZHMhPT0wJiZ0aGlzLmZpbGVzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgIit0aGlzLmNlbnRyYWxEaXJSZWNvcmRzKyIgcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICIrdGhpcy5maWxlcy5sZW5ndGgpfSxyZWFkRW5kT2ZDZW50cmFsOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoaS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO2lmKGI8MCl0aHJvdyB0aGlzLmlzU2lnbmF0dXJlKDAsaS5MT0NBTF9GSUxFX0hFQURFUik/bmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIpOm5ldyBFcnJvcigiQ2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgOiBpcyB0aGlzIGEgemlwIGZpbGUgPyBJZiBpdCBpcywgc2VlIGh0dHBzOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sIik7dGhpcy5yZWFkZXIuc2V0SW5kZXgoYik7dmFyIGc9YjtpZih0aGlzLmNoZWNrU2lnbmF0dXJlKGkuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSx0aGlzLnJlYWRCbG9ja0VuZE9mQ2VudHJhbCgpLHRoaXMuZGlza051bWJlcj09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD09PXMuTUFYX1ZBTFVFXzE2QklUU3x8dGhpcy5jZW50cmFsRGlyUmVjb3Jkc09uVGhpc0Rpc2s9PT1zLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuY2VudHJhbERpclJlY29yZHM9PT1zLk1BWF9WQUxVRV8xNkJJVFN8fHRoaXMuY2VudHJhbERpclNpemU9PT1zLk1BWF9WQUxVRV8zMkJJVFN8fHRoaXMuY2VudHJhbERpck9mZnNldD09PXMuTUFYX1ZBTFVFXzMyQklUUyl7aWYodGhpcy56aXA2ND0hMCwoYj10aGlzLnJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZShpLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpKTwwKXRocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IiKTtpZih0aGlzLnJlYWRlci5zZXRJbmRleChiKSx0aGlzLmNoZWNrU2lnbmF0dXJlKGkuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiksdGhpcy5yZWFkQmxvY2taaXA2NEVuZE9mQ2VudHJhbExvY2F0b3IoKSwhdGhpcy5pc1NpZ25hdHVyZSh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIsaS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpJiYodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyPXRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKGkuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSx0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXI8MCkpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiKTt0aGlzLnJlYWRlci5zZXRJbmRleCh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIpLHRoaXMuY2hlY2tTaWduYXR1cmUoaS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpLHRoaXMucmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWwoKX12YXIgbT10aGlzLmNlbnRyYWxEaXJPZmZzZXQrdGhpcy5jZW50cmFsRGlyU2l6ZTt0aGlzLnppcDY0JiYobSs9MjAsbSs9MTIrdGhpcy56aXA2NEVuZE9mQ2VudHJhbFNpemUpO3ZhciBDPWctbTtpZigwPEMpdGhpcy5pc1NpZ25hdHVyZShnLGkuQ0VOVFJBTF9GSUxFX0hFQURFUil8fCh0aGlzLnJlYWRlci56ZXJvPUMpO2Vsc2UgaWYoQzwwKXRocm93IG5ldyBFcnJvcigiQ29ycnVwdGVkIHppcDogbWlzc2luZyAiK01hdGguYWJzKEMpKyIgYnl0ZXMuIil9LHByZXBhcmVSZWFkZXI6ZnVuY3Rpb24oYil7dGhpcy5yZWFkZXI9cihiKX0sbG9hZDpmdW5jdGlvbihiKXt0aGlzLnByZXBhcmVSZWFkZXIoYiksdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCksdGhpcy5yZWFkQ2VudHJhbERpcigpLHRoaXMucmVhZExvY2FsRmlsZXMoKX19LGUuZXhwb3J0cz1wfSx7Ii4vcmVhZGVyL3JlYWRlckZvciI6MjIsIi4vc2lnbmF0dXJlIjoyMywiLi9zdXBwb3J0IjozMCwiLi91dGlscyI6MzIsIi4vemlwRW50cnkiOjM0fV0sMzQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi9yZWFkZXIvcmVhZGVyRm9yIikscz10KCIuL3V0aWxzIiksaT10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxvPXQoIi4vY3JjMzIiKSx1PXQoIi4vdXRmOCIpLHA9dCgiLi9jb21wcmVzc2lvbnMiKSxiPXQoIi4vc3VwcG9ydCIpO2Z1bmN0aW9uIGcobSxDKXt0aGlzLm9wdGlvbnM9bSx0aGlzLmxvYWRPcHRpb25zPUN9Zy5wcm90b3R5cGU9e2lzRW5jcnlwdGVkOmZ1bmN0aW9uKCl7cmV0dXJuKDEmdGhpcy5iaXRGbGFnKT09MX0sdXNlVVRGODpmdW5jdGlvbigpe3JldHVybigyMDQ4JnRoaXMuYml0RmxhZyk9PTIwNDh9LHJlYWRMb2NhbFBhcnQ6ZnVuY3Rpb24obSl7dmFyIEMseTtpZihtLnNraXAoMjIpLHRoaXMuZmlsZU5hbWVMZW5ndGg9bS5yZWFkSW50KDIpLHk9bS5yZWFkSW50KDIpLHRoaXMuZmlsZU5hbWU9bS5yZWFkRGF0YSh0aGlzLmZpbGVOYW1lTGVuZ3RoKSxtLnNraXAoeSksdGhpcy5jb21wcmVzc2VkU2l6ZT09PS0xfHx0aGlzLnVuY29tcHJlc3NlZFNpemU9PT0tMSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZyBvciBjb3JydXB0ZWQgemlwIDogZGlkbid0IGdldCBlbm91Z2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgKGNvbXByZXNzZWRTaXplID09PSAtMSB8fCB1bmNvbXByZXNzZWRTaXplID09PSAtMSkiKTtpZigoQz1mdW5jdGlvbihUKXtmb3IodmFyIFAgaW4gcClpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocCxQKSYmcFtQXS5tYWdpYz09PVQpcmV0dXJuIHBbUF07cmV0dXJuIG51bGx9KHRoaXMuY29tcHJlc3Npb25NZXRob2QpKT09PW51bGwpdGhyb3cgbmV3IEVycm9yKCJDb3JydXB0ZWQgemlwIDogY29tcHJlc3Npb24gIitzLnByZXR0eSh0aGlzLmNvbXByZXNzaW9uTWV0aG9kKSsiIHVua25vd24gKGlubmVyIGZpbGUgOiAiK3MudHJhbnNmb3JtVG8oInN0cmluZyIsdGhpcy5maWxlTmFtZSkrIikiKTt0aGlzLmRlY29tcHJlc3NlZD1uZXcgaSh0aGlzLmNvbXByZXNzZWRTaXplLHRoaXMudW5jb21wcmVzc2VkU2l6ZSx0aGlzLmNyYzMyLEMsbS5yZWFkRGF0YSh0aGlzLmNvbXByZXNzZWRTaXplKSl9LHJlYWRDZW50cmFsUGFydDpmdW5jdGlvbihtKXt0aGlzLnZlcnNpb25NYWRlQnk9bS5yZWFkSW50KDIpLG0uc2tpcCgyKSx0aGlzLmJpdEZsYWc9bS5yZWFkSW50KDIpLHRoaXMuY29tcHJlc3Npb25NZXRob2Q9bS5yZWFkU3RyaW5nKDIpLHRoaXMuZGF0ZT1tLnJlYWREYXRlKCksdGhpcy5jcmMzMj1tLnJlYWRJbnQoNCksdGhpcy5jb21wcmVzc2VkU2l6ZT1tLnJlYWRJbnQoNCksdGhpcy51bmNvbXByZXNzZWRTaXplPW0ucmVhZEludCg0KTt2YXIgQz1tLnJlYWRJbnQoMik7aWYodGhpcy5leHRyYUZpZWxkc0xlbmd0aD1tLnJlYWRJbnQoMiksdGhpcy5maWxlQ29tbWVudExlbmd0aD1tLnJlYWRJbnQoMiksdGhpcy5kaXNrTnVtYmVyU3RhcnQ9bS5yZWFkSW50KDIpLHRoaXMuaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1tLnJlYWRJbnQoMiksdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzPW0ucmVhZEludCg0KSx0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0PW0ucmVhZEludCg0KSx0aGlzLmlzRW5jcnlwdGVkKCkpdGhyb3cgbmV3IEVycm9yKCJFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkIik7bS5za2lwKEMpLHRoaXMucmVhZEV4dHJhRmllbGRzKG0pLHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQobSksdGhpcy5maWxlQ29tbWVudD1tLnJlYWREYXRhKHRoaXMuZmlsZUNvbW1lbnRMZW5ndGgpfSxwcm9jZXNzQXR0cmlidXRlczpmdW5jdGlvbigpe3RoaXMudW5peFBlcm1pc3Npb25zPW51bGwsdGhpcy5kb3NQZXJtaXNzaW9ucz1udWxsO3ZhciBtPXRoaXMudmVyc2lvbk1hZGVCeT4+ODt0aGlzLmRpcj0hISgxNiZ0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpLG09PTAmJih0aGlzLmRvc1Blcm1pc3Npb25zPTYzJnRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyksbT09MyYmKHRoaXMudW5peFBlcm1pc3Npb25zPXRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz4+MTYmNjU1MzUpLHRoaXMuZGlyfHx0aGlzLmZpbGVOYW1lU3RyLnNsaWNlKC0xKSE9PSIvInx8KHRoaXMuZGlyPSEwKX0scGFyc2VaSVA2NEV4dHJhRmllbGQ6ZnVuY3Rpb24oKXtpZih0aGlzLmV4dHJhRmllbGRzWzFdKXt2YXIgbT1yKHRoaXMuZXh0cmFGaWVsZHNbMV0udmFsdWUpO3RoaXMudW5jb21wcmVzc2VkU2l6ZT09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMudW5jb21wcmVzc2VkU2l6ZT1tLnJlYWRJbnQoOCkpLHRoaXMuY29tcHJlc3NlZFNpemU9PT1zLk1BWF9WQUxVRV8zMkJJVFMmJih0aGlzLmNvbXByZXNzZWRTaXplPW0ucmVhZEludCg4KSksdGhpcy5sb2NhbEhlYWRlck9mZnNldD09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMubG9jYWxIZWFkZXJPZmZzZXQ9bS5yZWFkSW50KDgpKSx0aGlzLmRpc2tOdW1iZXJTdGFydD09PXMuTUFYX1ZBTFVFXzMyQklUUyYmKHRoaXMuZGlza051bWJlclN0YXJ0PW0ucmVhZEludCg0KSl9fSxyZWFkRXh0cmFGaWVsZHM6ZnVuY3Rpb24obSl7dmFyIEMseSxULFA9bS5pbmRleCt0aGlzLmV4dHJhRmllbGRzTGVuZ3RoO2Zvcih0aGlzLmV4dHJhRmllbGRzfHwodGhpcy5leHRyYUZpZWxkcz17fSk7bS5pbmRleCs0PFA7KUM9bS5yZWFkSW50KDIpLHk9bS5yZWFkSW50KDIpLFQ9bS5yZWFkRGF0YSh5KSx0aGlzLmV4dHJhRmllbGRzW0NdPXtpZDpDLGxlbmd0aDp5LHZhbHVlOlR9O20uc2V0SW5kZXgoUCl9LGhhbmRsZVVURjg6ZnVuY3Rpb24oKXt2YXIgbT1iLnVpbnQ4YXJyYXk/InVpbnQ4YXJyYXkiOiJhcnJheSI7aWYodGhpcy51c2VVVEY4KCkpdGhpcy5maWxlTmFtZVN0cj11LnV0ZjhkZWNvZGUodGhpcy5maWxlTmFtZSksdGhpcy5maWxlQ29tbWVudFN0cj11LnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7ZWxzZXt2YXIgQz10aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtpZihDIT09bnVsbCl0aGlzLmZpbGVOYW1lU3RyPUM7ZWxzZXt2YXIgeT1zLnRyYW5zZm9ybVRvKG0sdGhpcy5maWxlTmFtZSk7dGhpcy5maWxlTmFtZVN0cj10aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKHkpfXZhciBUPXRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO2lmKFQhPT1udWxsKXRoaXMuZmlsZUNvbW1lbnRTdHI9VDtlbHNle3ZhciBQPXMudHJhbnNmb3JtVG8obSx0aGlzLmZpbGVDb21tZW50KTt0aGlzLmZpbGVDb21tZW50U3RyPXRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoUCl9fX0sZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDpmdW5jdGlvbigpe3ZhciBtPXRoaXMuZXh0cmFGaWVsZHNbMjg3ODldO2lmKG0pe3ZhciBDPXIobS52YWx1ZSk7cmV0dXJuIEMucmVhZEludCgxKSE9PTF8fG8odGhpcy5maWxlTmFtZSkhPT1DLnJlYWRJbnQoNCk/bnVsbDp1LnV0ZjhkZWNvZGUoQy5yZWFkRGF0YShtLmxlbmd0aC01KSl9cmV0dXJuIG51bGx9LGZpbmRFeHRyYUZpZWxkVW5pY29kZUNvbW1lbnQ6ZnVuY3Rpb24oKXt2YXIgbT10aGlzLmV4dHJhRmllbGRzWzI1NDYxXTtpZihtKXt2YXIgQz1yKG0udmFsdWUpO3JldHVybiBDLnJlYWRJbnQoMSkhPT0xfHxvKHRoaXMuZmlsZUNvbW1lbnQpIT09Qy5yZWFkSW50KDQpP251bGw6dS51dGY4ZGVjb2RlKEMucmVhZERhdGEobS5sZW5ndGgtNSkpfXJldHVybiBudWxsfX0sZS5leHBvcnRzPWd9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL2NvbXByZXNzaW9ucyI6MywiLi9jcmMzMiI6NCwiLi9yZWFkZXIvcmVhZGVyRm9yIjoyMiwiLi9zdXBwb3J0IjozMCwiLi91dGY4IjozMSwiLi91dGlscyI6MzJ9XSwzNTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKEMseSxUKXt0aGlzLm5hbWU9Qyx0aGlzLmRpcj1ULmRpcix0aGlzLmRhdGU9VC5kYXRlLHRoaXMuY29tbWVudD1ULmNvbW1lbnQsdGhpcy51bml4UGVybWlzc2lvbnM9VC51bml4UGVybWlzc2lvbnMsdGhpcy5kb3NQZXJtaXNzaW9ucz1ULmRvc1Blcm1pc3Npb25zLHRoaXMuX2RhdGE9eSx0aGlzLl9kYXRhQmluYXJ5PVQuYmluYXJ5LHRoaXMub3B0aW9ucz17Y29tcHJlc3Npb246VC5jb21wcmVzc2lvbixjb21wcmVzc2lvbk9wdGlvbnM6VC5jb21wcmVzc2lvbk9wdGlvbnN9fXZhciBzPXQoIi4vc3RyZWFtL1N0cmVhbUhlbHBlciIpLGk9dCgiLi9zdHJlYW0vRGF0YVdvcmtlciIpLG89dCgiLi91dGY4IiksdT10KCIuL2NvbXByZXNzZWRPYmplY3QiKSxwPXQoIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXIiKTtyLnByb3RvdHlwZT17aW50ZXJuYWxTdHJlYW06ZnVuY3Rpb24oQyl7dmFyIHk9bnVsbCxUPSJzdHJpbmciO3RyeXtpZighQyl0aHJvdyBuZXcgRXJyb3IoIk5vIG91dHB1dCB0eXBlIHNwZWNpZmllZC4iKTt2YXIgUD0oVD1DLnRvTG93ZXJDYXNlKCkpPT09InN0cmluZyJ8fFQ9PT0idGV4dCI7VCE9PSJiaW5hcnlzdHJpbmciJiZUIT09InRleHQifHwoVD0ic3RyaW5nIikseT10aGlzLl9kZWNvbXByZXNzV29ya2VyKCk7dmFyIGM9IXRoaXMuX2RhdGFCaW5hcnk7YyYmIVAmJih5PXkucGlwZShuZXcgby5VdGY4RW5jb2RlV29ya2VyKSksIWMmJlAmJih5PXkucGlwZShuZXcgby5VdGY4RGVjb2RlV29ya2VyKSl9Y2F0Y2gobCl7KHk9bmV3IHAoImVycm9yIikpLmVycm9yKGwpfXJldHVybiBuZXcgcyh5LFQsIiIpfSxhc3luYzpmdW5jdGlvbihDLHkpe3JldHVybiB0aGlzLmludGVybmFsU3RyZWFtKEMpLmFjY3VtdWxhdGUoeSl9LG5vZGVTdHJlYW06ZnVuY3Rpb24oQyx5KXtyZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbShDfHwibm9kZWJ1ZmZlciIpLnRvTm9kZWpzU3RyZWFtKHkpfSxfY29tcHJlc3NXb3JrZXI6ZnVuY3Rpb24oQyx5KXtpZih0aGlzLl9kYXRhIGluc3RhbmNlb2YgdSYmdGhpcy5fZGF0YS5jb21wcmVzc2lvbi5tYWdpYz09PUMubWFnaWMpcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29tcHJlc3NlZFdvcmtlcigpO3ZhciBUPXRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtyZXR1cm4gdGhpcy5fZGF0YUJpbmFyeXx8KFQ9VC5waXBlKG5ldyBvLlV0ZjhFbmNvZGVXb3JrZXIpKSx1LmNyZWF0ZVdvcmtlckZyb20oVCxDLHkpfSxfZGVjb21wcmVzc1dvcmtlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhIGluc3RhbmNlb2YgdT90aGlzLl9kYXRhLmdldENvbnRlbnRXb3JrZXIoKTp0aGlzLl9kYXRhIGluc3RhbmNlb2YgcD90aGlzLl9kYXRhOm5ldyBpKHRoaXMuX2RhdGEpfX07Zm9yKHZhciBiPVsiYXNUZXh0IiwiYXNCaW5hcnkiLCJhc05vZGVCdWZmZXIiLCJhc1VpbnQ4QXJyYXkiLCJhc0FycmF5QnVmZmVyIl0sZz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS4iKX0sbT0wO208Yi5sZW5ndGg7bSsrKXIucHJvdG90eXBlW2JbbV1dPWc7ZS5leHBvcnRzPXJ9LHsiLi9jb21wcmVzc2VkT2JqZWN0IjoyLCIuL3N0cmVhbS9EYXRhV29ya2VyIjoyNywiLi9zdHJlYW0vR2VuZXJpY1dvcmtlciI6MjgsIi4vc3RyZWFtL1N0cmVhbUhlbHBlciI6MjksIi4vdXRmOCI6MzF9XSwzNjpbZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihyKXsidXNlIHN0cmljdCI7dmFyIHMsaSxvPXIuTXV0YXRpb25PYnNlcnZlcnx8ci5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO2lmKG8pe3ZhciB1PTAscD1uZXcgbyhDKSxiPXIuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO3Aub2JzZXJ2ZShiLHtjaGFyYWN0ZXJEYXRhOiEwfSkscz1mdW5jdGlvbigpe2IuZGF0YT11PSsrdSUyfX1lbHNlIGlmKHIuc2V0SW1tZWRpYXRlfHxyLk1lc3NhZ2VDaGFubmVsPT09dm9pZCAwKXM9ImRvY3VtZW50ImluIHImJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gci5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT9mdW5jdGlvbigpe3ZhciB5PXIuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7eS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtDKCkseS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCx5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeSkseT1udWxsfSxyLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh5KX06ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KEMsMCl9O2Vsc2V7dmFyIGc9bmV3IHIuTWVzc2FnZUNoYW5uZWw7Zy5wb3J0MS5vbm1lc3NhZ2U9QyxzPWZ1bmN0aW9uKCl7Zy5wb3J0Mi5wb3N0TWVzc2FnZSgwKX19dmFyIG09W107ZnVuY3Rpb24gQygpe3ZhciB5LFQ7aT0hMDtmb3IodmFyIFA9bS5sZW5ndGg7UDspe2ZvcihUPW0sbT1bXSx5PS0xOysreTxQOylUW3ldKCk7UD1tLmxlbmd0aH1pPSExfWUuZXhwb3J0cz1mdW5jdGlvbih5KXttLnB1c2goeSkhPT0xfHxpfHxzKCl9fSkuY2FsbCh0aGlzLHR5cGVvZiBnbG9iYWw8InUiP2dsb2JhbDp0eXBlb2Ygc2VsZjwidSI/c2VsZjp0eXBlb2Ygd2luZG93PCJ1Ij93aW5kb3c6e30pfSx7fV0sMzc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiaW1tZWRpYXRlIik7ZnVuY3Rpb24gcygpe312YXIgaT17fSxvPVsiUkVKRUNURUQiXSx1PVsiRlVMRklMTEVEIl0scD1bIlBFTkRJTkciXTtmdW5jdGlvbiBiKFApe2lmKHR5cGVvZiBQIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoInJlc29sdmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3RoaXMuc3RhdGU9cCx0aGlzLnF1ZXVlPVtdLHRoaXMub3V0Y29tZT12b2lkIDAsUCE9PXMmJnkodGhpcyxQKX1mdW5jdGlvbiBnKFAsYyxsKXt0aGlzLnByb21pc2U9UCx0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKHRoaXMub25GdWxmaWxsZWQ9Yyx0aGlzLmNhbGxGdWxmaWxsZWQ9dGhpcy5vdGhlckNhbGxGdWxmaWxsZWQpLHR5cGVvZiBsPT0iZnVuY3Rpb24iJiYodGhpcy5vblJlamVjdGVkPWwsdGhpcy5jYWxsUmVqZWN0ZWQ9dGhpcy5vdGhlckNhbGxSZWplY3RlZCl9ZnVuY3Rpb24gbShQLGMsbCl7cihmdW5jdGlvbigpe3ZhciBoO3RyeXtoPWMobCl9Y2F0Y2goXyl7cmV0dXJuIGkucmVqZWN0KFAsXyl9aD09PVA/aS5yZWplY3QoUCxuZXcgVHlwZUVycm9yKCJDYW5ub3QgcmVzb2x2ZSBwcm9taXNlIHdpdGggaXRzZWxmIikpOmkucmVzb2x2ZShQLGgpfSl9ZnVuY3Rpb24gQyhQKXt2YXIgYz1QJiZQLnRoZW47aWYoUCYmKHR5cGVvZiBQPT0ib2JqZWN0Inx8dHlwZW9mIFA9PSJmdW5jdGlvbiIpJiZ0eXBlb2YgYz09ImZ1bmN0aW9uIilyZXR1cm4gZnVuY3Rpb24oKXtjLmFwcGx5KFAsYXJndW1lbnRzKX19ZnVuY3Rpb24geShQLGMpe3ZhciBsPSExO2Z1bmN0aW9uIGgoTyl7bHx8KGw9ITAsaS5yZWplY3QoUCxPKSl9ZnVuY3Rpb24gXyhPKXtsfHwobD0hMCxpLnJlc29sdmUoUCxPKSl9dmFyIEY9VChmdW5jdGlvbigpe2MoXyxoKX0pO0Yuc3RhdHVzPT09ImVycm9yIiYmaChGLnZhbHVlKX1mdW5jdGlvbiBUKFAsYyl7dmFyIGw9e307dHJ5e2wudmFsdWU9UChjKSxsLnN0YXR1cz0ic3VjY2VzcyJ9Y2F0Y2goaCl7bC5zdGF0dXM9ImVycm9yIixsLnZhbHVlPWh9cmV0dXJuIGx9KGUuZXhwb3J0cz1iKS5wcm90b3R5cGUuZmluYWxseT1mdW5jdGlvbihQKXtpZih0eXBlb2YgUCE9ImZ1bmN0aW9uIilyZXR1cm4gdGhpczt2YXIgYz10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24obCl7cmV0dXJuIGMucmVzb2x2ZShQKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gbH0pfSxmdW5jdGlvbihsKXtyZXR1cm4gYy5yZXNvbHZlKFAoKSkudGhlbihmdW5jdGlvbigpe3Rocm93IGx9KX0pfSxiLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihQKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsUCl9LGIucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oUCxjKXtpZih0eXBlb2YgUCE9ImZ1bmN0aW9uIiYmdGhpcy5zdGF0ZT09PXV8fHR5cGVvZiBjIT0iZnVuY3Rpb24iJiZ0aGlzLnN0YXRlPT09bylyZXR1cm4gdGhpczt2YXIgbD1uZXcgdGhpcy5jb25zdHJ1Y3RvcihzKTtyZXR1cm4gdGhpcy5zdGF0ZSE9PXA/bShsLHRoaXMuc3RhdGU9PT11P1A6Yyx0aGlzLm91dGNvbWUpOnRoaXMucXVldWUucHVzaChuZXcgZyhsLFAsYykpLGx9LGcucHJvdG90eXBlLmNhbGxGdWxmaWxsZWQ9ZnVuY3Rpb24oUCl7aS5yZXNvbHZlKHRoaXMucHJvbWlzZSxQKX0sZy5wcm90b3R5cGUub3RoZXJDYWxsRnVsZmlsbGVkPWZ1bmN0aW9uKFApe20odGhpcy5wcm9taXNlLHRoaXMub25GdWxmaWxsZWQsUCl9LGcucHJvdG90eXBlLmNhbGxSZWplY3RlZD1mdW5jdGlvbihQKXtpLnJlamVjdCh0aGlzLnByb21pc2UsUCl9LGcucHJvdG90eXBlLm90aGVyQ2FsbFJlamVjdGVkPWZ1bmN0aW9uKFApe20odGhpcy5wcm9taXNlLHRoaXMub25SZWplY3RlZCxQKX0saS5yZXNvbHZlPWZ1bmN0aW9uKFAsYyl7dmFyIGw9VChDLGMpO2lmKGwuc3RhdHVzPT09ImVycm9yIilyZXR1cm4gaS5yZWplY3QoUCxsLnZhbHVlKTt2YXIgaD1sLnZhbHVlO2lmKGgpeShQLGgpO2Vsc2V7UC5zdGF0ZT11LFAub3V0Y29tZT1jO2Zvcih2YXIgXz0tMSxGPVAucXVldWUubGVuZ3RoOysrXzxGOylQLnF1ZXVlW19dLmNhbGxGdWxmaWxsZWQoYyl9cmV0dXJuIFB9LGkucmVqZWN0PWZ1bmN0aW9uKFAsYyl7UC5zdGF0ZT1vLFAub3V0Y29tZT1jO2Zvcih2YXIgbD0tMSxoPVAucXVldWUubGVuZ3RoOysrbDxoOylQLnF1ZXVlW2xdLmNhbGxSZWplY3RlZChjKTtyZXR1cm4gUH0sYi5yZXNvbHZlPWZ1bmN0aW9uKFApe3JldHVybiBQIGluc3RhbmNlb2YgdGhpcz9QOmkucmVzb2x2ZShuZXcgdGhpcyhzKSxQKX0sYi5yZWplY3Q9ZnVuY3Rpb24oUCl7dmFyIGM9bmV3IHRoaXMocyk7cmV0dXJuIGkucmVqZWN0KGMsUCl9LGIuYWxsPWZ1bmN0aW9uKFApe3ZhciBjPXRoaXM7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFApIT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgbD1QLmxlbmd0aCxoPSExO2lmKCFsKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgXz1uZXcgQXJyYXkobCksRj0wLE89LTEsZj1uZXcgdGhpcyhzKTsrK088bDspVShQW09dLE8pO3JldHVybiBmO2Z1bmN0aW9uIFUoWCxRKXtjLnJlc29sdmUoWCkudGhlbihmdW5jdGlvbihFKXtfW1FdPUUsKytGIT09bHx8aHx8KGg9ITAsaS5yZXNvbHZlKGYsXykpfSxmdW5jdGlvbihFKXtofHwoaD0hMCxpLnJlamVjdChmLEUpKX0pfX0sYi5yYWNlPWZ1bmN0aW9uKFApe3ZhciBjPXRoaXM7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKFApIT09IltvYmplY3QgQXJyYXldIilyZXR1cm4gdGhpcy5yZWplY3QobmV3IFR5cGVFcnJvcigibXVzdCBiZSBhbiBhcnJheSIpKTt2YXIgbD1QLmxlbmd0aCxoPSExO2lmKCFsKXJldHVybiB0aGlzLnJlc29sdmUoW10pO2Zvcih2YXIgXz0tMSxGPW5ldyB0aGlzKHMpOysrXzxsOylPPVBbX10sYy5yZXNvbHZlKE8pLnRoZW4oZnVuY3Rpb24oZil7aHx8KGg9ITAsaS5yZXNvbHZlKEYsZikpfSxmdW5jdGlvbihmKXtofHwoaD0hMCxpLnJlamVjdChGLGYpKX0pO3ZhciBPO3JldHVybiBGfX0se2ltbWVkaWF0ZTozNn1dLDM4OltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9OygwLHQoIi4vbGliL3V0aWxzL2NvbW1vbiIpLmFzc2lnbikocix0KCIuL2xpYi9kZWZsYXRlIiksdCgiLi9saWIvaW5mbGF0ZSIpLHQoIi4vbGliL3psaWIvY29uc3RhbnRzIikpLGUuZXhwb3J0cz1yfSx7Ii4vbGliL2RlZmxhdGUiOjM5LCIuL2xpYi9pbmZsYXRlIjo0MCwiLi9saWIvdXRpbHMvY29tbW9uIjo0MSwiLi9saWIvemxpYi9jb25zdGFudHMiOjQ0fV0sMzk6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi96bGliL2RlZmxhdGUiKSxzPXQoIi4vdXRpbHMvY29tbW9uIiksaT10KCIuL3V0aWxzL3N0cmluZ3MiKSxvPXQoIi4vemxpYi9tZXNzYWdlcyIpLHU9dCgiLi96bGliL3pzdHJlYW0iKSxwPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsYj0wLGc9LTEsbT0wLEM9ODtmdW5jdGlvbiB5KFApe2lmKCEodGhpcyBpbnN0YW5jZW9mIHkpKXJldHVybiBuZXcgeShQKTt0aGlzLm9wdGlvbnM9cy5hc3NpZ24oe2xldmVsOmcsbWV0aG9kOkMsY2h1bmtTaXplOjE2Mzg0LHdpbmRvd0JpdHM6MTUsbWVtTGV2ZWw6OCxzdHJhdGVneTptLHRvOiIifSxQfHx7fSk7dmFyIGM9dGhpcy5vcHRpb25zO2MucmF3JiYwPGMud2luZG93Qml0cz9jLndpbmRvd0JpdHM9LWMud2luZG93Qml0czpjLmd6aXAmJjA8Yy53aW5kb3dCaXRzJiZjLndpbmRvd0JpdHM8MTYmJihjLndpbmRvd0JpdHMrPTE2KSx0aGlzLmVycj0wLHRoaXMubXNnPSIiLHRoaXMuZW5kZWQ9ITEsdGhpcy5jaHVua3M9W10sdGhpcy5zdHJtPW5ldyB1LHRoaXMuc3RybS5hdmFpbF9vdXQ9MDt2YXIgbD1yLmRlZmxhdGVJbml0Mih0aGlzLnN0cm0sYy5sZXZlbCxjLm1ldGhvZCxjLndpbmRvd0JpdHMsYy5tZW1MZXZlbCxjLnN0cmF0ZWd5KTtpZihsIT09Yil0aHJvdyBuZXcgRXJyb3Iob1tsXSk7aWYoYy5oZWFkZXImJnIuZGVmbGF0ZVNldEhlYWRlcih0aGlzLnN0cm0sYy5oZWFkZXIpLGMuZGljdGlvbmFyeSl7dmFyIGg7aWYoaD10eXBlb2YgYy5kaWN0aW9uYXJ5PT0ic3RyaW5nIj9pLnN0cmluZzJidWYoYy5kaWN0aW9uYXJ5KTpwLmNhbGwoYy5kaWN0aW9uYXJ5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/bmV3IFVpbnQ4QXJyYXkoYy5kaWN0aW9uYXJ5KTpjLmRpY3Rpb25hcnksKGw9ci5kZWZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0saCkpIT09Yil0aHJvdyBuZXcgRXJyb3Iob1tsXSk7dGhpcy5fZGljdF9zZXQ9ITB9fWZ1bmN0aW9uIFQoUCxjKXt2YXIgbD1uZXcgeShjKTtpZihsLnB1c2goUCwhMCksbC5lcnIpdGhyb3cgbC5tc2d8fG9bbC5lcnJdO3JldHVybiBsLnJlc3VsdH15LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKFAsYyl7dmFyIGwsaCxfPXRoaXMuc3RybSxGPXRoaXMub3B0aW9ucy5jaHVua1NpemU7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtoPWM9PT1+fmM/YzpjPT09ITA/NDowLHR5cGVvZiBQPT0ic3RyaW5nIj9fLmlucHV0PWkuc3RyaW5nMmJ1ZihQKTpwLmNhbGwoUCk9PT0iW29iamVjdCBBcnJheUJ1ZmZlcl0iP18uaW5wdXQ9bmV3IFVpbnQ4QXJyYXkoUCk6Xy5pbnB1dD1QLF8ubmV4dF9pbj0wLF8uYXZhaWxfaW49Xy5pbnB1dC5sZW5ndGg7ZG97aWYoXy5hdmFpbF9vdXQ9PT0wJiYoXy5vdXRwdXQ9bmV3IHMuQnVmOChGKSxfLm5leHRfb3V0PTAsXy5hdmFpbF9vdXQ9RiksKGw9ci5kZWZsYXRlKF8saCkpIT09MSYmbCE9PWIpcmV0dXJuIHRoaXMub25FbmQobCksISh0aGlzLmVuZGVkPSEwKTtfLmF2YWlsX291dCE9PTAmJihfLmF2YWlsX2luIT09MHx8aCE9PTQmJmghPT0yKXx8KHRoaXMub3B0aW9ucy50bz09PSJzdHJpbmciP3RoaXMub25EYXRhKGkuYnVmMmJpbnN0cmluZyhzLnNocmlua0J1ZihfLm91dHB1dCxfLm5leHRfb3V0KSkpOnRoaXMub25EYXRhKHMuc2hyaW5rQnVmKF8ub3V0cHV0LF8ubmV4dF9vdXQpKSl9d2hpbGUoKDA8Xy5hdmFpbF9pbnx8Xy5hdmFpbF9vdXQ9PT0wKSYmbCE9PTEpO3JldHVybiBoPT09ND8obD1yLmRlZmxhdGVFbmQodGhpcy5zdHJtKSx0aGlzLm9uRW5kKGwpLHRoaXMuZW5kZWQ9ITAsbD09PWIpOmghPT0yfHwodGhpcy5vbkVuZChiKSwhKF8uYXZhaWxfb3V0PTApKX0seS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKFApe3RoaXMuY2h1bmtzLnB1c2goUCl9LHkucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKFApe1A9PT1iJiYodGhpcy5vcHRpb25zLnRvPT09InN0cmluZyI/dGhpcy5yZXN1bHQ9dGhpcy5jaHVua3Muam9pbigiIik6dGhpcy5yZXN1bHQ9cy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKSksdGhpcy5jaHVua3M9W10sdGhpcy5lcnI9UCx0aGlzLm1zZz10aGlzLnN0cm0ubXNnfSxuLkRlZmxhdGU9eSxuLmRlZmxhdGU9VCxuLmRlZmxhdGVSYXc9ZnVuY3Rpb24oUCxjKXtyZXR1cm4oYz1jfHx7fSkucmF3PSEwLFQoUCxjKX0sbi5nemlwPWZ1bmN0aW9uKFAsYyl7cmV0dXJuKGM9Y3x8e30pLmd6aXA9ITAsVChQLGMpfX0seyIuL3V0aWxzL2NvbW1vbiI6NDEsIi4vdXRpbHMvc3RyaW5ncyI6NDIsIi4vemxpYi9kZWZsYXRlIjo0NiwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi96bGliL2luZmxhdGUiKSxzPXQoIi4vdXRpbHMvY29tbW9uIiksaT10KCIuL3V0aWxzL3N0cmluZ3MiKSxvPXQoIi4vemxpYi9jb25zdGFudHMiKSx1PXQoIi4vemxpYi9tZXNzYWdlcyIpLHA9dCgiLi96bGliL3pzdHJlYW0iKSxiPXQoIi4vemxpYi9nemhlYWRlciIpLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBtKHkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG0pKXJldHVybiBuZXcgbSh5KTt0aGlzLm9wdGlvbnM9cy5hc3NpZ24oe2NodW5rU2l6ZToxNjM4NCx3aW5kb3dCaXRzOjAsdG86IiJ9LHl8fHt9KTt2YXIgVD10aGlzLm9wdGlvbnM7VC5yYXcmJjA8PVQud2luZG93Qml0cyYmVC53aW5kb3dCaXRzPDE2JiYoVC53aW5kb3dCaXRzPS1ULndpbmRvd0JpdHMsVC53aW5kb3dCaXRzPT09MCYmKFQud2luZG93Qml0cz0tMTUpKSwhKDA8PVQud2luZG93Qml0cyYmVC53aW5kb3dCaXRzPDE2KXx8eSYmeS53aW5kb3dCaXRzfHwoVC53aW5kb3dCaXRzKz0zMiksMTU8VC53aW5kb3dCaXRzJiZULndpbmRvd0JpdHM8NDgmJiEoMTUmVC53aW5kb3dCaXRzKSYmKFQud2luZG93Qml0c3w9MTUpLHRoaXMuZXJyPTAsdGhpcy5tc2c9IiIsdGhpcy5lbmRlZD0hMSx0aGlzLmNodW5rcz1bXSx0aGlzLnN0cm09bmV3IHAsdGhpcy5zdHJtLmF2YWlsX291dD0wO3ZhciBQPXIuaW5mbGF0ZUluaXQyKHRoaXMuc3RybSxULndpbmRvd0JpdHMpO2lmKFAhPT1vLlpfT0spdGhyb3cgbmV3IEVycm9yKHVbUF0pO3RoaXMuaGVhZGVyPW5ldyBiLHIuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sdGhpcy5oZWFkZXIpfWZ1bmN0aW9uIEMoeSxUKXt2YXIgUD1uZXcgbShUKTtpZihQLnB1c2goeSwhMCksUC5lcnIpdGhyb3cgUC5tc2d8fHVbUC5lcnJdO3JldHVybiBQLnJlc3VsdH1tLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHksVCl7dmFyIFAsYyxsLGgsXyxGLE89dGhpcy5zdHJtLGY9dGhpcy5vcHRpb25zLmNodW5rU2l6ZSxVPXRoaXMub3B0aW9ucy5kaWN0aW9uYXJ5LFg9ITE7aWYodGhpcy5lbmRlZClyZXR1cm4hMTtjPVQ9PT1+flQ/VDpUPT09ITA/by5aX0ZJTklTSDpvLlpfTk9fRkxVU0gsdHlwZW9mIHk9PSJzdHJpbmciP08uaW5wdXQ9aS5iaW5zdHJpbmcyYnVmKHkpOmcuY2FsbCh5KT09PSJbb2JqZWN0IEFycmF5QnVmZmVyXSI/Ty5pbnB1dD1uZXcgVWludDhBcnJheSh5KTpPLmlucHV0PXksTy5uZXh0X2luPTAsTy5hdmFpbF9pbj1PLmlucHV0Lmxlbmd0aDtkb3tpZihPLmF2YWlsX291dD09PTAmJihPLm91dHB1dD1uZXcgcy5CdWY4KGYpLE8ubmV4dF9vdXQ9MCxPLmF2YWlsX291dD1mKSwoUD1yLmluZmxhdGUoTyxvLlpfTk9fRkxVU0gpKT09PW8uWl9ORUVEX0RJQ1QmJlUmJihGPXR5cGVvZiBVPT0ic3RyaW5nIj9pLnN0cmluZzJidWYoVSk6Zy5jYWxsKFUpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIj9uZXcgVWludDhBcnJheShVKTpVLFA9ci5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sRikpLFA9PT1vLlpfQlVGX0VSUk9SJiZYPT09ITAmJihQPW8uWl9PSyxYPSExKSxQIT09by5aX1NUUkVBTV9FTkQmJlAhPT1vLlpfT0spcmV0dXJuIHRoaXMub25FbmQoUCksISh0aGlzLmVuZGVkPSEwKTtPLm5leHRfb3V0JiYoTy5hdmFpbF9vdXQhPT0wJiZQIT09by5aX1NUUkVBTV9FTkQmJihPLmF2YWlsX2luIT09MHx8YyE9PW8uWl9GSU5JU0gmJmMhPT1vLlpfU1lOQ19GTFVTSCl8fCh0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj8obD1pLnV0Zjhib3JkZXIoTy5vdXRwdXQsTy5uZXh0X291dCksaD1PLm5leHRfb3V0LWwsXz1pLmJ1ZjJzdHJpbmcoTy5vdXRwdXQsbCksTy5uZXh0X291dD1oLE8uYXZhaWxfb3V0PWYtaCxoJiZzLmFycmF5U2V0KE8ub3V0cHV0LE8ub3V0cHV0LGwsaCwwKSx0aGlzLm9uRGF0YShfKSk6dGhpcy5vbkRhdGEocy5zaHJpbmtCdWYoTy5vdXRwdXQsTy5uZXh0X291dCkpKSksTy5hdmFpbF9pbj09PTAmJk8uYXZhaWxfb3V0PT09MCYmKFg9ITApfXdoaWxlKCgwPE8uYXZhaWxfaW58fE8uYXZhaWxfb3V0PT09MCkmJlAhPT1vLlpfU1RSRUFNX0VORCk7cmV0dXJuIFA9PT1vLlpfU1RSRUFNX0VORCYmKGM9by5aX0ZJTklTSCksYz09PW8uWl9GSU5JU0g/KFA9ci5pbmZsYXRlRW5kKHRoaXMuc3RybSksdGhpcy5vbkVuZChQKSx0aGlzLmVuZGVkPSEwLFA9PT1vLlpfT0spOmMhPT1vLlpfU1lOQ19GTFVTSHx8KHRoaXMub25FbmQoby5aX09LKSwhKE8uYXZhaWxfb3V0PTApKX0sbS5wcm90b3R5cGUub25EYXRhPWZ1bmN0aW9uKHkpe3RoaXMuY2h1bmtzLnB1c2goeSl9LG0ucHJvdG90eXBlLm9uRW5kPWZ1bmN0aW9uKHkpe3k9PT1vLlpfT0smJih0aGlzLm9wdGlvbnMudG89PT0ic3RyaW5nIj90aGlzLnJlc3VsdD10aGlzLmNodW5rcy5qb2luKCIiKTp0aGlzLnJlc3VsdD1zLmZsYXR0ZW5DaHVua3ModGhpcy5jaHVua3MpKSx0aGlzLmNodW5rcz1bXSx0aGlzLmVycj15LHRoaXMubXNnPXRoaXMuc3RybS5tc2d9LG4uSW5mbGF0ZT1tLG4uaW5mbGF0ZT1DLG4uaW5mbGF0ZVJhdz1mdW5jdGlvbih5LFQpe3JldHVybihUPVR8fHt9KS5yYXc9ITAsQyh5LFQpfSxuLnVuZ3ppcD1DfSx7Ii4vdXRpbHMvY29tbW9uIjo0MSwiLi91dGlscy9zdHJpbmdzIjo0MiwiLi96bGliL2NvbnN0YW50cyI6NDQsIi4vemxpYi9nemhlYWRlciI6NDcsIi4vemxpYi9pbmZsYXRlIjo0OSwiLi96bGliL21lc3NhZ2VzIjo1MSwiLi96bGliL3pzdHJlYW0iOjUzfV0sNDE6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dHlwZW9mIFVpbnQ4QXJyYXk8InUiJiZ0eXBlb2YgVWludDE2QXJyYXk8InUiJiZ0eXBlb2YgSW50MzJBcnJheTwidSI7bi5hc3NpZ249ZnVuY3Rpb24obyl7Zm9yKHZhciB1PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTt1Lmxlbmd0aDspe3ZhciBwPXUuc2hpZnQoKTtpZihwKXtpZih0eXBlb2YgcCE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcihwKyJtdXN0IGJlIG5vbi1vYmplY3QiKTtmb3IodmFyIGIgaW4gcClwLmhhc093blByb3BlcnR5KGIpJiYob1tiXT1wW2JdKX19cmV0dXJuIG99LG4uc2hyaW5rQnVmPWZ1bmN0aW9uKG8sdSl7cmV0dXJuIG8ubGVuZ3RoPT09dT9vOm8uc3ViYXJyYXk/by5zdWJhcnJheSgwLHUpOihvLmxlbmd0aD11LG8pfTt2YXIgcz17YXJyYXlTZXQ6ZnVuY3Rpb24obyx1LHAsYixnKXtpZih1LnN1YmFycmF5JiZvLnN1YmFycmF5KW8uc2V0KHUuc3ViYXJyYXkocCxwK2IpLGcpO2Vsc2UgZm9yKHZhciBtPTA7bTxiO20rKylvW2crbV09dVtwK21dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKG8pe3ZhciB1LHAsYixnLG0sQztmb3IodT1iPTAscD1vLmxlbmd0aDt1PHA7dSsrKWIrPW9bdV0ubGVuZ3RoO2ZvcihDPW5ldyBVaW50OEFycmF5KGIpLHU9Zz0wLHA9by5sZW5ndGg7dTxwO3UrKyltPW9bdV0sQy5zZXQobSxnKSxnKz1tLmxlbmd0aDtyZXR1cm4gQ319LGk9e2FycmF5U2V0OmZ1bmN0aW9uKG8sdSxwLGIsZyl7Zm9yKHZhciBtPTA7bTxiO20rKylvW2crbV09dVtwK21dfSxmbGF0dGVuQ2h1bmtzOmZ1bmN0aW9uKG8pe3JldHVybltdLmNvbmNhdC5hcHBseShbXSxvKX19O24uc2V0VHlwZWQ9ZnVuY3Rpb24obyl7bz8obi5CdWY4PVVpbnQ4QXJyYXksbi5CdWYxNj1VaW50MTZBcnJheSxuLkJ1ZjMyPUludDMyQXJyYXksbi5hc3NpZ24obixzKSk6KG4uQnVmOD1BcnJheSxuLkJ1ZjE2PUFycmF5LG4uQnVmMzI9QXJyYXksbi5hc3NpZ24obixpKSl9LG4uc2V0VHlwZWQocil9LHt9XSw0MjpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuL2NvbW1vbiIpLHM9ITAsaT0hMDt0cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLFswXSl9Y2F0Y2h7cz0hMX10cnl7U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLG5ldyBVaW50OEFycmF5KDEpKX1jYXRjaHtpPSExfWZvcih2YXIgbz1uZXcgci5CdWY4KDI1NiksdT0wO3U8MjU2O3UrKylvW3VdPTI1Mjw9dT82OjI0ODw9dT81OjI0MDw9dT80OjIyNDw9dT8zOjE5Mjw9dT8yOjE7ZnVuY3Rpb24gcChiLGcpe2lmKGc8NjU1MzcmJihiLnN1YmFycmF5JiZpfHwhYi5zdWJhcnJheSYmcykpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxyLnNocmlua0J1ZihiLGcpKTtmb3IodmFyIG09IiIsQz0wO0M8ZztDKyspbSs9U3RyaW5nLmZyb21DaGFyQ29kZShiW0NdKTtyZXR1cm4gbX1vWzI1NF09b1syNTRdPTEsbi5zdHJpbmcyYnVmPWZ1bmN0aW9uKGIpe3ZhciBnLG0sQyx5LFQsUD1iLmxlbmd0aCxjPTA7Zm9yKHk9MDt5PFA7eSsrKSg2NDUxMiYobT1iLmNoYXJDb2RlQXQoeSkpKT09NTUyOTYmJnkrMTxQJiYoNjQ1MTImKEM9Yi5jaGFyQ29kZUF0KHkrMSkpKT09NTYzMjAmJihtPTY1NTM2KyhtLTU1Mjk2PDwxMCkrKEMtNTYzMjApLHkrKyksYys9bTwxMjg/MTptPDIwNDg/MjptPDY1NTM2PzM6NDtmb3IoZz1uZXcgci5CdWY4KGMpLHk9VD0wO1Q8Yzt5KyspKDY0NTEyJihtPWIuY2hhckNvZGVBdCh5KSkpPT01NTI5NiYmeSsxPFAmJig2NDUxMiYoQz1iLmNoYXJDb2RlQXQoeSsxKSkpPT01NjMyMCYmKG09NjU1MzYrKG0tNTUyOTY8PDEwKSsoQy01NjMyMCkseSsrKSxtPDEyOD9nW1QrK109bToobTwyMDQ4P2dbVCsrXT0xOTJ8bT4+PjY6KG08NjU1MzY/Z1tUKytdPTIyNHxtPj4+MTI6KGdbVCsrXT0yNDB8bT4+PjE4LGdbVCsrXT0xMjh8bT4+PjEyJjYzKSxnW1QrK109MTI4fG0+Pj42JjYzKSxnW1QrK109MTI4fDYzJm0pO3JldHVybiBnfSxuLmJ1ZjJiaW5zdHJpbmc9ZnVuY3Rpb24oYil7cmV0dXJuIHAoYixiLmxlbmd0aCl9LG4uYmluc3RyaW5nMmJ1Zj1mdW5jdGlvbihiKXtmb3IodmFyIGc9bmV3IHIuQnVmOChiLmxlbmd0aCksbT0wLEM9Zy5sZW5ndGg7bTxDO20rKylnW21dPWIuY2hhckNvZGVBdChtKTtyZXR1cm4gZ30sbi5idWYyc3RyaW5nPWZ1bmN0aW9uKGIsZyl7dmFyIG0sQyx5LFQsUD1nfHxiLmxlbmd0aCxjPW5ldyBBcnJheSgyKlApO2ZvcihtPUM9MDttPFA7KWlmKCh5PWJbbSsrXSk8MTI4KWNbQysrXT15O2Vsc2UgaWYoNDwoVD1vW3ldKSljW0MrK109NjU1MzMsbSs9VC0xO2Vsc2V7Zm9yKHkmPVQ9PT0yPzMxOlQ9PT0zPzE1Ojc7MTxUJiZtPFA7KXk9eTw8Nnw2MyZiW20rK10sVC0tOzE8VD9jW0MrK109NjU1MzM6eTw2NTUzNj9jW0MrK109eTooeS09NjU1MzYsY1tDKytdPTU1Mjk2fHk+PjEwJjEwMjMsY1tDKytdPTU2MzIwfDEwMjMmeSl9cmV0dXJuIHAoYyxDKX0sbi51dGY4Ym9yZGVyPWZ1bmN0aW9uKGIsZyl7dmFyIG07Zm9yKChnPWd8fGIubGVuZ3RoKT5iLmxlbmd0aCYmKGc9Yi5sZW5ndGgpLG09Zy0xOzA8PW0mJigxOTImYlttXSk9PTEyODspbS0tO3JldHVybiBtPDB8fG09PT0wP2c6bStvW2JbbV1dPmc/bTpnfX0seyIuL2NvbW1vbiI6NDF9XSw0MzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24ocixzLGksbyl7Zm9yKHZhciB1PTY1NTM1JnJ8MCxwPXI+Pj4xNiY2NTUzNXwwLGI9MDtpIT09MDspe2ZvcihpLT1iPTJlMzxpPzJlMzppO3A9cCsodT11K3NbbysrXXwwKXwwLC0tYjspO3UlPTY1NTIxLHAlPTY1NTIxfXJldHVybiB1fHA8PDE2fDB9fSx7fV0sNDQ6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtaX05PX0ZMVVNIOjAsWl9QQVJUSUFMX0ZMVVNIOjEsWl9TWU5DX0ZMVVNIOjIsWl9GVUxMX0ZMVVNIOjMsWl9GSU5JU0g6NCxaX0JMT0NLOjUsWl9UUkVFUzo2LFpfT0s6MCxaX1NUUkVBTV9FTkQ6MSxaX05FRURfRElDVDoyLFpfRVJSTk86LTEsWl9TVFJFQU1fRVJST1I6LTIsWl9EQVRBX0VSUk9SOi0zLFpfQlVGX0VSUk9SOi01LFpfTk9fQ09NUFJFU1NJT046MCxaX0JFU1RfU1BFRUQ6MSxaX0JFU1RfQ09NUFJFU1NJT046OSxaX0RFRkFVTFRfQ09NUFJFU1NJT046LTEsWl9GSUxURVJFRDoxLFpfSFVGRk1BTl9PTkxZOjIsWl9STEU6MyxaX0ZJWEVEOjQsWl9ERUZBVUxUX1NUUkFURUdZOjAsWl9CSU5BUlk6MCxaX1RFWFQ6MSxaX1VOS05PV046MixaX0RFRkxBVEVEOjh9fSx7fV0sNDU6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oKXtmb3IodmFyIHMsaT1bXSxvPTA7bzwyNTY7bysrKXtzPW87Zm9yKHZhciB1PTA7dTw4O3UrKylzPTEmcz8zOTg4MjkyMzg0XnM+Pj4xOnM+Pj4xO2lbb109c31yZXR1cm4gaX0oKTtlLmV4cG9ydHM9ZnVuY3Rpb24ocyxpLG8sdSl7dmFyIHA9cixiPXUrbztzXj0tMTtmb3IodmFyIGc9dTtnPGI7ZysrKXM9cz4+PjhecFsyNTUmKHNeaVtnXSldO3JldHVybi0xXnN9fSx7fV0sNDY6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIscz10KCIuLi91dGlscy9jb21tb24iKSxpPXQoIi4vdHJlZXMiKSxvPXQoIi4vYWRsZXIzMiIpLHU9dCgiLi9jcmMzMiIpLHA9dCgiLi9tZXNzYWdlcyIpLGI9MCxnPTQsbT0wLEM9LTIseT0tMSxUPTQsUD0yLGM9OCxsPTksaD0yODYsXz0zMCxGPTE5LE89MipoKzEsZj0xNSxVPTMsWD0yNTgsUT1YK1UrMSxFPTQyLCQ9MTEzLHc9MSxrPTIsUz0zLEI9NDtmdW5jdGlvbiBMKEQsdXQpe3JldHVybiBELm1zZz1wW3V0XSx1dH1mdW5jdGlvbiBSKEQpe3JldHVybihEPDwxKS0oNDxEPzk6MCl9ZnVuY3Rpb24gcShEKXtmb3IodmFyIHV0PUQubGVuZ3RoOzA8PS0tdXQ7KURbdXRdPTB9ZnVuY3Rpb24geihEKXt2YXIgdXQ9RC5zdGF0ZSxvdD11dC5wZW5kaW5nO290PkQuYXZhaWxfb3V0JiYob3Q9RC5hdmFpbF9vdXQpLG90IT09MCYmKHMuYXJyYXlTZXQoRC5vdXRwdXQsdXQucGVuZGluZ19idWYsdXQucGVuZGluZ19vdXQsb3QsRC5uZXh0X291dCksRC5uZXh0X291dCs9b3QsdXQucGVuZGluZ19vdXQrPW90LEQudG90YWxfb3V0Kz1vdCxELmF2YWlsX291dC09b3QsdXQucGVuZGluZy09b3QsdXQucGVuZGluZz09PTAmJih1dC5wZW5kaW5nX291dD0wKSl9ZnVuY3Rpb24gRyhELHV0KXtpLl90cl9mbHVzaF9ibG9jayhELDA8PUQuYmxvY2tfc3RhcnQ/RC5ibG9ja19zdGFydDotMSxELnN0cnN0YXJ0LUQuYmxvY2tfc3RhcnQsdXQpLEQuYmxvY2tfc3RhcnQ9RC5zdHJzdGFydCx6KEQuc3RybSl9ZnVuY3Rpb24gbnQoRCx1dCl7RC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109dXR9ZnVuY3Rpb24gdHQoRCx1dCl7RC5wZW5kaW5nX2J1ZltELnBlbmRpbmcrK109dXQ+Pj44JjI1NSxELnBlbmRpbmdfYnVmW0QucGVuZGluZysrXT0yNTUmdXR9ZnVuY3Rpb24gZXQoRCx1dCl7dmFyIG90LFYsaj1ELm1heF9jaGFpbl9sZW5ndGgsSz1ELnN0cnN0YXJ0LHB0PUQucHJldl9sZW5ndGgsdnQ9RC5uaWNlX21hdGNoLHJ0PUQuc3Ryc3RhcnQ+RC53X3NpemUtUT9ELnN0cnN0YXJ0LShELndfc2l6ZS1RKTowLGd0PUQud2luZG93LEN0PUQud19tYXNrLHh0PUQucHJldixtdD1ELnN0cnN0YXJ0K1gsenQ9Z3RbSytwdC0xXSxHdD1ndFtLK3B0XTtELnByZXZfbGVuZ3RoPj1ELmdvb2RfbWF0Y2gmJihqPj49MiksdnQ+RC5sb29rYWhlYWQmJih2dD1ELmxvb2thaGVhZCk7ZG8gaWYoZ3RbKG90PXV0KStwdF09PT1HdCYmZ3Rbb3QrcHQtMV09PT16dCYmZ3Rbb3RdPT09Z3RbS10mJmd0Wysrb3RdPT09Z3RbSysxXSl7Sys9MixvdCsrO2RvO3doaWxlKGd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZndFsrK0tdPT09Z3RbKytvdF0mJmd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZndFsrK0tdPT09Z3RbKytvdF0mJmd0WysrS109PT1ndFsrK290XSYmZ3RbKytLXT09PWd0Wysrb3RdJiZLPG10KTtpZihWPVgtKG10LUspLEs9bXQtWCxwdDxWKXtpZihELm1hdGNoX3N0YXJ0PXV0LHZ0PD0ocHQ9VikpYnJlYWs7enQ9Z3RbSytwdC0xXSxHdD1ndFtLK3B0XX19d2hpbGUoKHV0PXh0W3V0JkN0XSk+cnQmJi0taiE9MCk7cmV0dXJuIHB0PD1ELmxvb2thaGVhZD9wdDpELmxvb2thaGVhZH1mdW5jdGlvbiB3dChEKXt2YXIgdXQsb3QsVixqLEsscHQsdnQscnQsZ3QsQ3QseHQ9RC53X3NpemU7ZG97aWYoaj1ELndpbmRvd19zaXplLUQubG9va2FoZWFkLUQuc3Ryc3RhcnQsRC5zdHJzdGFydD49eHQrKHh0LVEpKXtmb3Iocy5hcnJheVNldChELndpbmRvdyxELndpbmRvdyx4dCx4dCwwKSxELm1hdGNoX3N0YXJ0LT14dCxELnN0cnN0YXJ0LT14dCxELmJsb2NrX3N0YXJ0LT14dCx1dD1vdD1ELmhhc2hfc2l6ZTtWPUQuaGVhZFstLXV0XSxELmhlYWRbdXRdPXh0PD1WP1YteHQ6MCwtLW90Oyk7Zm9yKHV0PW90PXh0O1Y9RC5wcmV2Wy0tdXRdLEQucHJldlt1dF09eHQ8PVY/Vi14dDowLC0tb3Q7KTtqKz14dH1pZihELnN0cm0uYXZhaWxfaW49PT0wKWJyZWFrO2lmKHB0PUQuc3RybSx2dD1ELndpbmRvdyxydD1ELnN0cnN0YXJ0K0QubG9va2FoZWFkLGd0PWosQ3Q9dm9pZCAwLEN0PXB0LmF2YWlsX2luLGd0PEN0JiYoQ3Q9Z3QpLG90PUN0PT09MD8wOihwdC5hdmFpbF9pbi09Q3Qscy5hcnJheVNldCh2dCxwdC5pbnB1dCxwdC5uZXh0X2luLEN0LHJ0KSxwdC5zdGF0ZS53cmFwPT09MT9wdC5hZGxlcj1vKHB0LmFkbGVyLHZ0LEN0LHJ0KTpwdC5zdGF0ZS53cmFwPT09MiYmKHB0LmFkbGVyPXUocHQuYWRsZXIsdnQsQ3QscnQpKSxwdC5uZXh0X2luKz1DdCxwdC50b3RhbF9pbis9Q3QsQ3QpLEQubG9va2FoZWFkKz1vdCxELmxvb2thaGVhZCtELmluc2VydD49VSlmb3IoSz1ELnN0cnN0YXJ0LUQuaW5zZXJ0LEQuaW5zX2g9RC53aW5kb3dbS10sRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0srMV0pJkQuaGFzaF9tYXNrO0QuaW5zZXJ0JiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0srVS0xXSkmRC5oYXNoX21hc2ssRC5wcmV2W0smRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09SyxLKyssRC5pbnNlcnQtLSwhKEQubG9va2FoZWFkK0QuaW5zZXJ0PFUpKTspO313aGlsZShELmxvb2thaGVhZDxRJiZELnN0cm0uYXZhaWxfaW4hPT0wKX1mdW5jdGlvbiBTdChELHV0KXtmb3IodmFyIG90LFY7Oyl7aWYoRC5sb29rYWhlYWQ8USl7aWYod3QoRCksRC5sb29rYWhlYWQ8USYmdXQ9PT1iKXJldHVybiB3O2lmKEQubG9va2FoZWFkPT09MClicmVha31pZihvdD0wLEQubG9va2FoZWFkPj1VJiYoRC5pbnNfaD0oRC5pbnNfaDw8RC5oYXNoX3NoaWZ0XkQud2luZG93W0Quc3Ryc3RhcnQrVS0xXSkmRC5oYXNoX21hc2ssb3Q9RC5wcmV2W0Quc3Ryc3RhcnQmRC53X21hc2tdPUQuaGVhZFtELmluc19oXSxELmhlYWRbRC5pbnNfaF09RC5zdHJzdGFydCksb3QhPT0wJiZELnN0cnN0YXJ0LW90PD1ELndfc2l6ZS1RJiYoRC5tYXRjaF9sZW5ndGg9ZXQoRCxvdCkpLEQubWF0Y2hfbGVuZ3RoPj1VKWlmKFY9aS5fdHJfdGFsbHkoRCxELnN0cnN0YXJ0LUQubWF0Y2hfc3RhcnQsRC5tYXRjaF9sZW5ndGgtVSksRC5sb29rYWhlYWQtPUQubWF0Y2hfbGVuZ3RoLEQubWF0Y2hfbGVuZ3RoPD1ELm1heF9sYXp5X21hdGNoJiZELmxvb2thaGVhZD49VSl7Zm9yKEQubWF0Y2hfbGVuZ3RoLS07RC5zdHJzdGFydCsrLEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQsLS1ELm1hdGNoX2xlbmd0aCE9MDspO0Quc3Ryc3RhcnQrK31lbHNlIEQuc3Ryc3RhcnQrPUQubWF0Y2hfbGVuZ3RoLEQubWF0Y2hfbGVuZ3RoPTAsRC5pbnNfaD1ELndpbmRvd1tELnN0cnN0YXJ0XSxELmluc19oPShELmluc19oPDxELmhhc2hfc2hpZnReRC53aW5kb3dbRC5zdHJzdGFydCsxXSkmRC5oYXNoX21hc2s7ZWxzZSBWPWkuX3RyX3RhbGx5KEQsMCxELndpbmRvd1tELnN0cnN0YXJ0XSksRC5sb29rYWhlYWQtLSxELnN0cnN0YXJ0Kys7aWYoViYmKEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB3fXJldHVybiBELmluc2VydD1ELnN0cnN0YXJ0PFUtMT9ELnN0cnN0YXJ0OlUtMSx1dD09PWc/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTpELmxhc3RfbGl0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCk/dzprfWZ1bmN0aW9uIFR0KEQsdXQpe2Zvcih2YXIgb3QsVixqOzspe2lmKEQubG9va2FoZWFkPFEpe2lmKHd0KEQpLEQubG9va2FoZWFkPFEmJnV0PT09YilyZXR1cm4gdztpZihELmxvb2thaGVhZD09PTApYnJlYWt9aWYob3Q9MCxELmxvb2thaGVhZD49VSYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLEQucHJldl9sZW5ndGg9RC5tYXRjaF9sZW5ndGgsRC5wcmV2X21hdGNoPUQubWF0Y2hfc3RhcnQsRC5tYXRjaF9sZW5ndGg9VS0xLG90IT09MCYmRC5wcmV2X2xlbmd0aDxELm1heF9sYXp5X21hdGNoJiZELnN0cnN0YXJ0LW90PD1ELndfc2l6ZS1RJiYoRC5tYXRjaF9sZW5ndGg9ZXQoRCxvdCksRC5tYXRjaF9sZW5ndGg8PTUmJihELnN0cmF0ZWd5PT09MXx8RC5tYXRjaF9sZW5ndGg9PT1VJiY0MDk2PEQuc3Ryc3RhcnQtRC5tYXRjaF9zdGFydCkmJihELm1hdGNoX2xlbmd0aD1VLTEpKSxELnByZXZfbGVuZ3RoPj1VJiZELm1hdGNoX2xlbmd0aDw9RC5wcmV2X2xlbmd0aCl7Zm9yKGo9RC5zdHJzdGFydCtELmxvb2thaGVhZC1VLFY9aS5fdHJfdGFsbHkoRCxELnN0cnN0YXJ0LTEtRC5wcmV2X21hdGNoLEQucHJldl9sZW5ndGgtVSksRC5sb29rYWhlYWQtPUQucHJldl9sZW5ndGgtMSxELnByZXZfbGVuZ3RoLT0yOysrRC5zdHJzdGFydDw9aiYmKEQuaW5zX2g9KEQuaW5zX2g8PEQuaGFzaF9zaGlmdF5ELndpbmRvd1tELnN0cnN0YXJ0K1UtMV0pJkQuaGFzaF9tYXNrLG90PUQucHJldltELnN0cnN0YXJ0JkQud19tYXNrXT1ELmhlYWRbRC5pbnNfaF0sRC5oZWFkW0QuaW5zX2hdPUQuc3Ryc3RhcnQpLC0tRC5wcmV2X2xlbmd0aCE9MDspO2lmKEQubWF0Y2hfYXZhaWxhYmxlPTAsRC5tYXRjaF9sZW5ndGg9VS0xLEQuc3Ryc3RhcnQrKyxWJiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0PT09MCkpcmV0dXJuIHd9ZWxzZSBpZihELm1hdGNoX2F2YWlsYWJsZSl7aWYoKFY9aS5fdHJfdGFsbHkoRCwwLEQud2luZG93W0Quc3Ryc3RhcnQtMV0pKSYmRyhELCExKSxELnN0cnN0YXJ0KyssRC5sb29rYWhlYWQtLSxELnN0cm0uYXZhaWxfb3V0PT09MClyZXR1cm4gd31lbHNlIEQubWF0Y2hfYXZhaWxhYmxlPTEsRC5zdHJzdGFydCsrLEQubG9va2FoZWFkLS19cmV0dXJuIEQubWF0Y2hfYXZhaWxhYmxlJiYoVj1pLl90cl90YWxseShELDAsRC53aW5kb3dbRC5zdHJzdGFydC0xXSksRC5tYXRjaF9hdmFpbGFibGU9MCksRC5pbnNlcnQ9RC5zdHJzdGFydDxVLTE/RC5zdHJzdGFydDpVLTEsdXQ9PT1nPyhHKEQsITApLEQuc3RybS5hdmFpbF9vdXQ9PT0wP1M6Qik6RC5sYXN0X2xpdCYmKEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApP3c6a31mdW5jdGlvbiBrdChELHV0LG90LFYsail7dGhpcy5nb29kX2xlbmd0aD1ELHRoaXMubWF4X2xhenk9dXQsdGhpcy5uaWNlX2xlbmd0aD1vdCx0aGlzLm1heF9jaGFpbj1WLHRoaXMuZnVuYz1qfWZ1bmN0aW9uIEx0KCl7dGhpcy5zdHJtPW51bGwsdGhpcy5zdGF0dXM9MCx0aGlzLnBlbmRpbmdfYnVmPW51bGwsdGhpcy5wZW5kaW5nX2J1Zl9zaXplPTAsdGhpcy5wZW5kaW5nX291dD0wLHRoaXMucGVuZGluZz0wLHRoaXMud3JhcD0wLHRoaXMuZ3poZWFkPW51bGwsdGhpcy5nemluZGV4PTAsdGhpcy5tZXRob2Q9Yyx0aGlzLmxhc3RfZmx1c2g9LTEsdGhpcy53X3NpemU9MCx0aGlzLndfYml0cz0wLHRoaXMud19tYXNrPTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLndpbmRvd19zaXplPTAsdGhpcy5wcmV2PW51bGwsdGhpcy5oZWFkPW51bGwsdGhpcy5pbnNfaD0wLHRoaXMuaGFzaF9zaXplPTAsdGhpcy5oYXNoX2JpdHM9MCx0aGlzLmhhc2hfbWFzaz0wLHRoaXMuaGFzaF9zaGlmdD0wLHRoaXMuYmxvY2tfc3RhcnQ9MCx0aGlzLm1hdGNoX2xlbmd0aD0wLHRoaXMucHJldl9tYXRjaD0wLHRoaXMubWF0Y2hfYXZhaWxhYmxlPTAsdGhpcy5zdHJzdGFydD0wLHRoaXMubWF0Y2hfc3RhcnQ9MCx0aGlzLmxvb2thaGVhZD0wLHRoaXMucHJldl9sZW5ndGg9MCx0aGlzLm1heF9jaGFpbl9sZW5ndGg9MCx0aGlzLm1heF9sYXp5X21hdGNoPTAsdGhpcy5sZXZlbD0wLHRoaXMuc3RyYXRlZ3k9MCx0aGlzLmdvb2RfbWF0Y2g9MCx0aGlzLm5pY2VfbWF0Y2g9MCx0aGlzLmR5bl9sdHJlZT1uZXcgcy5CdWYxNigyKk8pLHRoaXMuZHluX2R0cmVlPW5ldyBzLkJ1ZjE2KDIqKDIqXysxKSksdGhpcy5ibF90cmVlPW5ldyBzLkJ1ZjE2KDIqKDIqRisxKSkscSh0aGlzLmR5bl9sdHJlZSkscSh0aGlzLmR5bl9kdHJlZSkscSh0aGlzLmJsX3RyZWUpLHRoaXMubF9kZXNjPW51bGwsdGhpcy5kX2Rlc2M9bnVsbCx0aGlzLmJsX2Rlc2M9bnVsbCx0aGlzLmJsX2NvdW50PW5ldyBzLkJ1ZjE2KGYrMSksdGhpcy5oZWFwPW5ldyBzLkJ1ZjE2KDIqaCsxKSxxKHRoaXMuaGVhcCksdGhpcy5oZWFwX2xlbj0wLHRoaXMuaGVhcF9tYXg9MCx0aGlzLmRlcHRoPW5ldyBzLkJ1ZjE2KDIqaCsxKSxxKHRoaXMuZGVwdGgpLHRoaXMubF9idWY9MCx0aGlzLmxpdF9idWZzaXplPTAsdGhpcy5sYXN0X2xpdD0wLHRoaXMuZF9idWY9MCx0aGlzLm9wdF9sZW49MCx0aGlzLnN0YXRpY19sZW49MCx0aGlzLm1hdGNoZXM9MCx0aGlzLmluc2VydD0wLHRoaXMuYmlfYnVmPTAsdGhpcy5iaV92YWxpZD0wfWZ1bmN0aW9uIEJ0KEQpe3ZhciB1dDtyZXR1cm4gRCYmRC5zdGF0ZT8oRC50b3RhbF9pbj1ELnRvdGFsX291dD0wLEQuZGF0YV90eXBlPVAsKHV0PUQuc3RhdGUpLnBlbmRpbmc9MCx1dC5wZW5kaW5nX291dD0wLHV0LndyYXA8MCYmKHV0LndyYXA9LXV0LndyYXApLHV0LnN0YXR1cz11dC53cmFwP0U6JCxELmFkbGVyPXV0LndyYXA9PT0yPzA6MSx1dC5sYXN0X2ZsdXNoPWIsaS5fdHJfaW5pdCh1dCksbSk6TChELEMpfWZ1bmN0aW9uICR0KEQpe3ZhciB1dD1CdChEKTtyZXR1cm4gdXQ9PT1tJiZmdW5jdGlvbihvdCl7b3Qud2luZG93X3NpemU9MipvdC53X3NpemUscShvdC5oZWFkKSxvdC5tYXhfbGF6eV9tYXRjaD1yW290LmxldmVsXS5tYXhfbGF6eSxvdC5nb29kX21hdGNoPXJbb3QubGV2ZWxdLmdvb2RfbGVuZ3RoLG90Lm5pY2VfbWF0Y2g9cltvdC5sZXZlbF0ubmljZV9sZW5ndGgsb3QubWF4X2NoYWluX2xlbmd0aD1yW290LmxldmVsXS5tYXhfY2hhaW4sb3Quc3Ryc3RhcnQ9MCxvdC5ibG9ja19zdGFydD0wLG90Lmxvb2thaGVhZD0wLG90Lmluc2VydD0wLG90Lm1hdGNoX2xlbmd0aD1vdC5wcmV2X2xlbmd0aD1VLTEsb3QubWF0Y2hfYXZhaWxhYmxlPTAsb3QuaW5zX2g9MH0oRC5zdGF0ZSksdXR9ZnVuY3Rpb24gS3QoRCx1dCxvdCxWLGosSyl7aWYoIUQpcmV0dXJuIEM7dmFyIHB0PTE7aWYodXQ9PT15JiYodXQ9NiksVjwwPyhwdD0wLFY9LVYpOjE1PFYmJihwdD0yLFYtPTE2KSxqPDF8fGw8anx8b3QhPT1jfHxWPDh8fDE1PFZ8fHV0PDB8fDk8dXR8fEs8MHx8VDxLKXJldHVybiBMKEQsQyk7Vj09PTgmJihWPTkpO3ZhciB2dD1uZXcgTHQ7cmV0dXJuKEQuc3RhdGU9dnQpLnN0cm09RCx2dC53cmFwPXB0LHZ0Lmd6aGVhZD1udWxsLHZ0LndfYml0cz1WLHZ0Lndfc2l6ZT0xPDx2dC53X2JpdHMsdnQud19tYXNrPXZ0Lndfc2l6ZS0xLHZ0Lmhhc2hfYml0cz1qKzcsdnQuaGFzaF9zaXplPTE8PHZ0Lmhhc2hfYml0cyx2dC5oYXNoX21hc2s9dnQuaGFzaF9zaXplLTEsdnQuaGFzaF9zaGlmdD1+figodnQuaGFzaF9iaXRzK1UtMSkvVSksdnQud2luZG93PW5ldyBzLkJ1ZjgoMip2dC53X3NpemUpLHZ0LmhlYWQ9bmV3IHMuQnVmMTYodnQuaGFzaF9zaXplKSx2dC5wcmV2PW5ldyBzLkJ1ZjE2KHZ0Lndfc2l6ZSksdnQubGl0X2J1ZnNpemU9MTw8ais2LHZ0LnBlbmRpbmdfYnVmX3NpemU9NCp2dC5saXRfYnVmc2l6ZSx2dC5wZW5kaW5nX2J1Zj1uZXcgcy5CdWY4KHZ0LnBlbmRpbmdfYnVmX3NpemUpLHZ0LmRfYnVmPTEqdnQubGl0X2J1ZnNpemUsdnQubF9idWY9Myp2dC5saXRfYnVmc2l6ZSx2dC5sZXZlbD11dCx2dC5zdHJhdGVneT1LLHZ0Lm1ldGhvZD1vdCwkdChEKX1yPVtuZXcga3QoMCwwLDAsMCxmdW5jdGlvbihELHV0KXt2YXIgb3Q9NjU1MzU7Zm9yKG90PkQucGVuZGluZ19idWZfc2l6ZS01JiYob3Q9RC5wZW5kaW5nX2J1Zl9zaXplLTUpOzspe2lmKEQubG9va2FoZWFkPD0xKXtpZih3dChEKSxELmxvb2thaGVhZD09PTAmJnV0PT09YilyZXR1cm4gdztpZihELmxvb2thaGVhZD09PTApYnJlYWt9RC5zdHJzdGFydCs9RC5sb29rYWhlYWQsRC5sb29rYWhlYWQ9MDt2YXIgVj1ELmJsb2NrX3N0YXJ0K290O2lmKChELnN0cnN0YXJ0PT09MHx8RC5zdHJzdGFydD49VikmJihELmxvb2thaGVhZD1ELnN0cnN0YXJ0LVYsRC5zdHJzdGFydD1WLEcoRCwhMSksRC5zdHJtLmF2YWlsX291dD09PTApfHxELnN0cnN0YXJ0LUQuYmxvY2tfc3RhcnQ+PUQud19zaXplLVEmJihHKEQsITEpLEQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gd31yZXR1cm4gRC5pbnNlcnQ9MCx1dD09PWc/KEcoRCwhMCksRC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTooRC5zdHJzdGFydD5ELmJsb2NrX3N0YXJ0JiYoRyhELCExKSxELnN0cm0uYXZhaWxfb3V0KSx3KX0pLG5ldyBrdCg0LDQsOCw0LFN0KSxuZXcga3QoNCw1LDE2LDgsU3QpLG5ldyBrdCg0LDYsMzIsMzIsU3QpLG5ldyBrdCg0LDQsMTYsMTYsVHQpLG5ldyBrdCg4LDE2LDMyLDMyLFR0KSxuZXcga3QoOCwxNiwxMjgsMTI4LFR0KSxuZXcga3QoOCwzMiwxMjgsMjU2LFR0KSxuZXcga3QoMzIsMTI4LDI1OCwxMDI0LFR0KSxuZXcga3QoMzIsMjU4LDI1OCw0MDk2LFR0KV0sbi5kZWZsYXRlSW5pdD1mdW5jdGlvbihELHV0KXtyZXR1cm4gS3QoRCx1dCxjLDE1LDgsMCl9LG4uZGVmbGF0ZUluaXQyPUt0LG4uZGVmbGF0ZVJlc2V0PSR0LG4uZGVmbGF0ZVJlc2V0S2VlcD1CdCxuLmRlZmxhdGVTZXRIZWFkZXI9ZnVuY3Rpb24oRCx1dCl7cmV0dXJuIEQmJkQuc3RhdGU/RC5zdGF0ZS53cmFwIT09Mj9DOihELnN0YXRlLmd6aGVhZD11dCxtKTpDfSxuLmRlZmxhdGU9ZnVuY3Rpb24oRCx1dCl7dmFyIG90LFYsaixLO2lmKCFEfHwhRC5zdGF0ZXx8NTx1dHx8dXQ8MClyZXR1cm4gRD9MKEQsQyk6QztpZihWPUQuc3RhdGUsIUQub3V0cHV0fHwhRC5pbnB1dCYmRC5hdmFpbF9pbiE9PTB8fFYuc3RhdHVzPT09NjY2JiZ1dCE9PWcpcmV0dXJuIEwoRCxELmF2YWlsX291dD09PTA/LTU6Qyk7aWYoVi5zdHJtPUQsb3Q9Vi5sYXN0X2ZsdXNoLFYubGFzdF9mbHVzaD11dCxWLnN0YXR1cz09PUUpaWYoVi53cmFwPT09MilELmFkbGVyPTAsbnQoViwzMSksbnQoViwxMzkpLG50KFYsOCksVi5nemhlYWQ/KG50KFYsKFYuZ3poZWFkLnRleHQ/MTowKSsoVi5nemhlYWQuaGNyYz8yOjApKyhWLmd6aGVhZC5leHRyYT80OjApKyhWLmd6aGVhZC5uYW1lPzg6MCkrKFYuZ3poZWFkLmNvbW1lbnQ/MTY6MCkpLG50KFYsMjU1JlYuZ3poZWFkLnRpbWUpLG50KFYsVi5nemhlYWQudGltZT4+OCYyNTUpLG50KFYsVi5nemhlYWQudGltZT4+MTYmMjU1KSxudChWLFYuZ3poZWFkLnRpbWU+PjI0JjI1NSksbnQoVixWLmxldmVsPT09OT8yOjI8PVYuc3RyYXRlZ3l8fFYubGV2ZWw8Mj80OjApLG50KFYsMjU1JlYuZ3poZWFkLm9zKSxWLmd6aGVhZC5leHRyYSYmVi5nemhlYWQuZXh0cmEubGVuZ3RoJiYobnQoViwyNTUmVi5nemhlYWQuZXh0cmEubGVuZ3RoKSxudChWLFYuZ3poZWFkLmV4dHJhLmxlbmd0aD4+OCYyNTUpKSxWLmd6aGVhZC5oY3JjJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmcsMCkpLFYuZ3ppbmRleD0wLFYuc3RhdHVzPTY5KToobnQoViwwKSxudChWLDApLG50KFYsMCksbnQoViwwKSxudChWLDApLG50KFYsVi5sZXZlbD09PTk/MjoyPD1WLnN0cmF0ZWd5fHxWLmxldmVsPDI/NDowKSxudChWLDMpLFYuc3RhdHVzPSQpO2Vsc2V7dmFyIHB0PWMrKFYud19iaXRzLTg8PDQpPDw4O3B0fD0oMjw9Vi5zdHJhdGVneXx8Vi5sZXZlbDwyPzA6Vi5sZXZlbDw2PzE6Vi5sZXZlbD09PTY/MjozKTw8NixWLnN0cnN0YXJ0IT09MCYmKHB0fD0zMikscHQrPTMxLXB0JTMxLFYuc3RhdHVzPSQsdHQoVixwdCksVi5zdHJzdGFydCE9PTAmJih0dChWLEQuYWRsZXI+Pj4xNiksdHQoViw2NTUzNSZELmFkbGVyKSksRC5hZGxlcj0xfWlmKFYuc3RhdHVzPT09NjkpaWYoVi5nemhlYWQuZXh0cmEpe2ZvcihqPVYucGVuZGluZztWLmd6aW5kZXg8KDY1NTM1JlYuZ3poZWFkLmV4dHJhLmxlbmd0aCkmJihWLnBlbmRpbmchPT1WLnBlbmRpbmdfYnVmX3NpemV8fChWLmd6aGVhZC5oY3JjJiZWLnBlbmRpbmc+aiYmKEQuYWRsZXI9dShELmFkbGVyLFYucGVuZGluZ19idWYsVi5wZW5kaW5nLWosaikpLHooRCksaj1WLnBlbmRpbmcsVi5wZW5kaW5nIT09Vi5wZW5kaW5nX2J1Zl9zaXplKSk7KW50KFYsMjU1JlYuZ3poZWFkLmV4dHJhW1YuZ3ppbmRleF0pLFYuZ3ppbmRleCsrO1YuZ3poZWFkLmhjcmMmJlYucGVuZGluZz5qJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmctaixqKSksVi5nemluZGV4PT09Vi5nemhlYWQuZXh0cmEubGVuZ3RoJiYoVi5nemluZGV4PTAsVi5zdGF0dXM9NzMpfWVsc2UgVi5zdGF0dXM9NzM7aWYoVi5zdGF0dXM9PT03MylpZihWLmd6aGVhZC5uYW1lKXtqPVYucGVuZGluZztkb3tpZihWLnBlbmRpbmc9PT1WLnBlbmRpbmdfYnVmX3NpemUmJihWLmd6aGVhZC5oY3JjJiZWLnBlbmRpbmc+aiYmKEQuYWRsZXI9dShELmFkbGVyLFYucGVuZGluZ19idWYsVi5wZW5kaW5nLWosaikpLHooRCksaj1WLnBlbmRpbmcsVi5wZW5kaW5nPT09Vi5wZW5kaW5nX2J1Zl9zaXplKSl7Sz0xO2JyZWFrfUs9Vi5nemluZGV4PFYuZ3poZWFkLm5hbWUubGVuZ3RoPzI1NSZWLmd6aGVhZC5uYW1lLmNoYXJDb2RlQXQoVi5nemluZGV4KyspOjAsbnQoVixLKX13aGlsZShLIT09MCk7Vi5nemhlYWQuaGNyYyYmVi5wZW5kaW5nPmomJihELmFkbGVyPXUoRC5hZGxlcixWLnBlbmRpbmdfYnVmLFYucGVuZGluZy1qLGopKSxLPT09MCYmKFYuZ3ppbmRleD0wLFYuc3RhdHVzPTkxKX1lbHNlIFYuc3RhdHVzPTkxO2lmKFYuc3RhdHVzPT09OTEpaWYoVi5nemhlYWQuY29tbWVudCl7aj1WLnBlbmRpbmc7ZG97aWYoVi5wZW5kaW5nPT09Vi5wZW5kaW5nX2J1Zl9zaXplJiYoVi5nemhlYWQuaGNyYyYmVi5wZW5kaW5nPmomJihELmFkbGVyPXUoRC5hZGxlcixWLnBlbmRpbmdfYnVmLFYucGVuZGluZy1qLGopKSx6KEQpLGo9Vi5wZW5kaW5nLFYucGVuZGluZz09PVYucGVuZGluZ19idWZfc2l6ZSkpe0s9MTticmVha31LPVYuZ3ppbmRleDxWLmd6aGVhZC5jb21tZW50Lmxlbmd0aD8yNTUmVi5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KFYuZ3ppbmRleCsrKTowLG50KFYsSyl9d2hpbGUoSyE9PTApO1YuZ3poZWFkLmhjcmMmJlYucGVuZGluZz5qJiYoRC5hZGxlcj11KEQuYWRsZXIsVi5wZW5kaW5nX2J1ZixWLnBlbmRpbmctaixqKSksSz09PTAmJihWLnN0YXR1cz0xMDMpfWVsc2UgVi5zdGF0dXM9MTAzO2lmKFYuc3RhdHVzPT09MTAzJiYoVi5nemhlYWQuaGNyYz8oVi5wZW5kaW5nKzI+Vi5wZW5kaW5nX2J1Zl9zaXplJiZ6KEQpLFYucGVuZGluZysyPD1WLnBlbmRpbmdfYnVmX3NpemUmJihudChWLDI1NSZELmFkbGVyKSxudChWLEQuYWRsZXI+PjgmMjU1KSxELmFkbGVyPTAsVi5zdGF0dXM9JCkpOlYuc3RhdHVzPSQpLFYucGVuZGluZyE9PTApe2lmKHooRCksRC5hdmFpbF9vdXQ9PT0wKXJldHVybiBWLmxhc3RfZmx1c2g9LTEsbX1lbHNlIGlmKEQuYXZhaWxfaW49PT0wJiZSKHV0KTw9UihvdCkmJnV0IT09ZylyZXR1cm4gTChELC01KTtpZihWLnN0YXR1cz09PTY2NiYmRC5hdmFpbF9pbiE9PTApcmV0dXJuIEwoRCwtNSk7aWYoRC5hdmFpbF9pbiE9PTB8fFYubG9va2FoZWFkIT09MHx8dXQhPT1iJiZWLnN0YXR1cyE9PTY2Nil7dmFyIHZ0PVYuc3RyYXRlZ3k9PT0yP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0Ozspe2lmKHJ0Lmxvb2thaGVhZD09PTAmJih3dChydCkscnQubG9va2FoZWFkPT09MCkpe2lmKGd0PT09YilyZXR1cm4gdzticmVha31pZihydC5tYXRjaF9sZW5ndGg9MCxDdD1pLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyssQ3QmJihHKHJ0LCExKSxydC5zdHJtLmF2YWlsX291dD09PTApKXJldHVybiB3fXJldHVybiBydC5pbnNlcnQ9MCxndD09PWc/KEcocnQsITApLHJ0LnN0cm0uYXZhaWxfb3V0PT09MD9TOkIpOnJ0Lmxhc3RfbGl0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKT93Omt9KFYsdXQpOlYuc3RyYXRlZ3k9PT0zP2Z1bmN0aW9uKHJ0LGd0KXtmb3IodmFyIEN0LHh0LG10LHp0LEd0PXJ0LndpbmRvdzs7KXtpZihydC5sb29rYWhlYWQ8PVgpe2lmKHd0KHJ0KSxydC5sb29rYWhlYWQ8PVgmJmd0PT09YilyZXR1cm4gdztpZihydC5sb29rYWhlYWQ9PT0wKWJyZWFrfWlmKHJ0Lm1hdGNoX2xlbmd0aD0wLHJ0Lmxvb2thaGVhZD49VSYmMDxydC5zdHJzdGFydCYmKHh0PUd0W210PXJ0LnN0cnN0YXJ0LTFdKT09PUd0WysrbXRdJiZ4dD09PUd0WysrbXRdJiZ4dD09PUd0WysrbXRdKXt6dD1ydC5zdHJzdGFydCtYO2RvO3doaWxlKHh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJnh0PT09R3RbKyttdF0mJm10PHp0KTtydC5tYXRjaF9sZW5ndGg9WC0oenQtbXQpLHJ0Lm1hdGNoX2xlbmd0aD5ydC5sb29rYWhlYWQmJihydC5tYXRjaF9sZW5ndGg9cnQubG9va2FoZWFkKX1pZihydC5tYXRjaF9sZW5ndGg+PVU/KEN0PWkuX3RyX3RhbGx5KHJ0LDEscnQubWF0Y2hfbGVuZ3RoLVUpLHJ0Lmxvb2thaGVhZC09cnQubWF0Y2hfbGVuZ3RoLHJ0LnN0cnN0YXJ0Kz1ydC5tYXRjaF9sZW5ndGgscnQubWF0Y2hfbGVuZ3RoPTApOihDdD1pLl90cl90YWxseShydCwwLHJ0LndpbmRvd1tydC5zdHJzdGFydF0pLHJ0Lmxvb2thaGVhZC0tLHJ0LnN0cnN0YXJ0KyspLEN0JiYoRyhydCwhMSkscnQuc3RybS5hdmFpbF9vdXQ9PT0wKSlyZXR1cm4gd31yZXR1cm4gcnQuaW5zZXJ0PTAsZ3Q9PT1nPyhHKHJ0LCEwKSxydC5zdHJtLmF2YWlsX291dD09PTA/UzpCKTpydC5sYXN0X2xpdCYmKEcocnQsITEpLHJ0LnN0cm0uYXZhaWxfb3V0PT09MCk/dzprfShWLHV0KTpyW1YubGV2ZWxdLmZ1bmMoVix1dCk7aWYodnQhPT1TJiZ2dCE9PUJ8fChWLnN0YXR1cz02NjYpLHZ0PT09d3x8dnQ9PT1TKXJldHVybiBELmF2YWlsX291dD09PTAmJihWLmxhc3RfZmx1c2g9LTEpLG07aWYodnQ9PT1rJiYodXQ9PT0xP2kuX3RyX2FsaWduKFYpOnV0IT09NSYmKGkuX3RyX3N0b3JlZF9ibG9jayhWLDAsMCwhMSksdXQ9PT0zJiYocShWLmhlYWQpLFYubG9va2FoZWFkPT09MCYmKFYuc3Ryc3RhcnQ9MCxWLmJsb2NrX3N0YXJ0PTAsVi5pbnNlcnQ9MCkpKSx6KEQpLEQuYXZhaWxfb3V0PT09MCkpcmV0dXJuIFYubGFzdF9mbHVzaD0tMSxtfXJldHVybiB1dCE9PWc/bTpWLndyYXA8PTA/MTooVi53cmFwPT09Mj8obnQoViwyNTUmRC5hZGxlciksbnQoVixELmFkbGVyPj44JjI1NSksbnQoVixELmFkbGVyPj4xNiYyNTUpLG50KFYsRC5hZGxlcj4+MjQmMjU1KSxudChWLDI1NSZELnRvdGFsX2luKSxudChWLEQudG90YWxfaW4+PjgmMjU1KSxudChWLEQudG90YWxfaW4+PjE2JjI1NSksbnQoVixELnRvdGFsX2luPj4yNCYyNTUpKToodHQoVixELmFkbGVyPj4+MTYpLHR0KFYsNjU1MzUmRC5hZGxlcikpLHooRCksMDxWLndyYXAmJihWLndyYXA9LVYud3JhcCksVi5wZW5kaW5nIT09MD9tOjEpfSxuLmRlZmxhdGVFbmQ9ZnVuY3Rpb24oRCl7dmFyIHV0O3JldHVybiBEJiZELnN0YXRlPyh1dD1ELnN0YXRlLnN0YXR1cykhPT1FJiZ1dCE9PTY5JiZ1dCE9PTczJiZ1dCE9PTkxJiZ1dCE9PTEwMyYmdXQhPT0kJiZ1dCE9PTY2Nj9MKEQsQyk6KEQuc3RhdGU9bnVsbCx1dD09PSQ/TChELC0zKTptKTpDfSxuLmRlZmxhdGVTZXREaWN0aW9uYXJ5PWZ1bmN0aW9uKEQsdXQpe3ZhciBvdCxWLGosSyxwdCx2dCxydCxndCxDdD11dC5sZW5ndGg7aWYoIUR8fCFELnN0YXRlfHwoSz0ob3Q9RC5zdGF0ZSkud3JhcCk9PT0yfHxLPT09MSYmb3Quc3RhdHVzIT09RXx8b3QubG9va2FoZWFkKXJldHVybiBDO2ZvcihLPT09MSYmKEQuYWRsZXI9byhELmFkbGVyLHV0LEN0LDApKSxvdC53cmFwPTAsQ3Q+PW90Lndfc2l6ZSYmKEs9PT0wJiYocShvdC5oZWFkKSxvdC5zdHJzdGFydD0wLG90LmJsb2NrX3N0YXJ0PTAsb3QuaW5zZXJ0PTApLGd0PW5ldyBzLkJ1Zjgob3Qud19zaXplKSxzLmFycmF5U2V0KGd0LHV0LEN0LW90Lndfc2l6ZSxvdC53X3NpemUsMCksdXQ9Z3QsQ3Q9b3Qud19zaXplKSxwdD1ELmF2YWlsX2luLHZ0PUQubmV4dF9pbixydD1ELmlucHV0LEQuYXZhaWxfaW49Q3QsRC5uZXh0X2luPTAsRC5pbnB1dD11dCx3dChvdCk7b3QubG9va2FoZWFkPj1VOyl7Zm9yKFY9b3Quc3Ryc3RhcnQsaj1vdC5sb29rYWhlYWQtKFUtMSk7b3QuaW5zX2g9KG90Lmluc19oPDxvdC5oYXNoX3NoaWZ0Xm90LndpbmRvd1tWK1UtMV0pJm90Lmhhc2hfbWFzayxvdC5wcmV2W1Ymb3Qud19tYXNrXT1vdC5oZWFkW290Lmluc19oXSxvdC5oZWFkW290Lmluc19oXT1WLFYrKywtLWo7KTtvdC5zdHJzdGFydD1WLG90Lmxvb2thaGVhZD1VLTEsd3Qob3QpfXJldHVybiBvdC5zdHJzdGFydCs9b3QubG9va2FoZWFkLG90LmJsb2NrX3N0YXJ0PW90LnN0cnN0YXJ0LG90Lmluc2VydD1vdC5sb29rYWhlYWQsb3QubG9va2FoZWFkPTAsb3QubWF0Y2hfbGVuZ3RoPW90LnByZXZfbGVuZ3RoPVUtMSxvdC5tYXRjaF9hdmFpbGFibGU9MCxELm5leHRfaW49dnQsRC5pbnB1dD1ydCxELmF2YWlsX2luPXB0LG90LndyYXA9SyxtfSxuLmRlZmxhdGVJbmZvPSJwYWtvIGRlZmxhdGUgKGZyb20gTm9kZWNhIHByb2plY3QpIn0seyIuLi91dGlscy9jb21tb24iOjQxLCIuL2FkbGVyMzIiOjQzLCIuL2NyYzMyIjo0NSwiLi9tZXNzYWdlcyI6NTEsIi4vdHJlZXMiOjUyfV0sNDc6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy50ZXh0PTAsdGhpcy50aW1lPTAsdGhpcy54ZmxhZ3M9MCx0aGlzLm9zPTAsdGhpcy5leHRyYT1udWxsLHRoaXMuZXh0cmFfbGVuPTAsdGhpcy5uYW1lPSIiLHRoaXMuY29tbWVudD0iIix0aGlzLmhjcmM9MCx0aGlzLmRvbmU9ITF9fSx7fV0sNDg6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKHIscyl7dmFyIGksbyx1LHAsYixnLG0sQyx5LFQsUCxjLGwsaCxfLEYsTyxmLFUsWCxRLEUsJCx3LGs7aT1yLnN0YXRlLG89ci5uZXh0X2luLHc9ci5pbnB1dCx1PW8rKHIuYXZhaWxfaW4tNSkscD1yLm5leHRfb3V0LGs9ci5vdXRwdXQsYj1wLShzLXIuYXZhaWxfb3V0KSxnPXArKHIuYXZhaWxfb3V0LTI1NyksbT1pLmRtYXgsQz1pLndzaXplLHk9aS53aGF2ZSxUPWkud25leHQsUD1pLndpbmRvdyxjPWkuaG9sZCxsPWkuYml0cyxoPWkubGVuY29kZSxfPWkuZGlzdGNvZGUsRj0oMTw8aS5sZW5iaXRzKS0xLE89KDE8PGkuZGlzdGJpdHMpLTE7dDpkb3tsPDE1JiYoYys9d1tvKytdPDxsLGwrPTgsYys9d1tvKytdPDxsLGwrPTgpLGY9aFtjJkZdO2U6Zm9yKDs7KXtpZihjPj4+PVU9Zj4+PjI0LGwtPVUsKFU9Zj4+PjE2JjI1NSk9PT0wKWtbcCsrXT02NTUzNSZmO2Vsc2V7aWYoISgxNiZVKSl7aWYoISg2NCZVKSl7Zj1oWyg2NTUzNSZmKSsoYyYoMTw8VSktMSldO2NvbnRpbnVlIGV9aWYoMzImVSl7aS5tb2RlPTEyO2JyZWFrIHR9ci5tc2c9ImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSIsaS5tb2RlPTMwO2JyZWFrIHR9WD02NTUzNSZmLChVJj0xNSkmJihsPFUmJihjKz13W28rK108PGwsbCs9OCksWCs9YyYoMTw8VSktMSxjPj4+PVUsbC09VSksbDwxNSYmKGMrPXdbbysrXTw8bCxsKz04LGMrPXdbbysrXTw8bCxsKz04KSxmPV9bYyZPXTtuOmZvcig7Oyl7aWYoYz4+Pj1VPWY+Pj4yNCxsLT1VLCEoMTYmKFU9Zj4+PjE2JjI1NSkpKXtpZighKDY0JlUpKXtmPV9bKDY1NTM1JmYpKyhjJigxPDxVKS0xKV07Y29udGludWUgbn1yLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIixpLm1vZGU9MzA7YnJlYWsgdH1pZihRPTY1NTM1JmYsbDwoVSY9MTUpJiYoYys9d1tvKytdPDxsLChsKz04KTxVJiYoYys9d1tvKytdPDxsLGwrPTgpKSxtPChRKz1jJigxPDxVKS0xKSl7ci5tc2c9ImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIixpLm1vZGU9MzA7YnJlYWsgdH1pZihjPj4+PVUsbC09VSwoVT1wLWIpPFEpe2lmKHk8KFU9US1VKSYmaS5zYW5lKXtyLm1zZz0iaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siLGkubW9kZT0zMDticmVhayB0fWlmKCQ9UCwoRT0wKT09PVQpe2lmKEUrPUMtVSxVPFgpe2ZvcihYLT1VO2tbcCsrXT1QW0UrK10sLS1VOyk7RT1wLVEsJD1rfX1lbHNlIGlmKFQ8VSl7aWYoRSs9QytULVUsKFUtPVQpPFgpe2ZvcihYLT1VO2tbcCsrXT1QW0UrK10sLS1VOyk7aWYoRT0wLFQ8WCl7Zm9yKFgtPVU9VDtrW3ArK109UFtFKytdLC0tVTspO0U9cC1RLCQ9a319fWVsc2UgaWYoRSs9VC1VLFU8WCl7Zm9yKFgtPVU7a1twKytdPVBbRSsrXSwtLVU7KTtFPXAtUSwkPWt9Zm9yKDsyPFg7KWtbcCsrXT0kW0UrK10sa1twKytdPSRbRSsrXSxrW3ArK109JFtFKytdLFgtPTM7WCYmKGtbcCsrXT0kW0UrK10sMTxYJiYoa1twKytdPSRbRSsrXSkpfWVsc2V7Zm9yKEU9cC1RO2tbcCsrXT1rW0UrK10sa1twKytdPWtbRSsrXSxrW3ArK109a1tFKytdLDI8KFgtPTMpOyk7WCYmKGtbcCsrXT1rW0UrK10sMTxYJiYoa1twKytdPWtbRSsrXSkpfWJyZWFrfX1icmVha319d2hpbGUobzx1JiZwPGcpO28tPVg9bD4+MyxjJj0oMTw8KGwtPVg8PDMpKS0xLHIubmV4dF9pbj1vLHIubmV4dF9vdXQ9cCxyLmF2YWlsX2luPW88dT91LW8rNTo1LShvLXUpLHIuYXZhaWxfb3V0PXA8Zz9nLXArMjU3OjI1Ny0ocC1nKSxpLmhvbGQ9YyxpLmJpdHM9bH19LHt9XSw0OTpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj10KCIuLi91dGlscy9jb21tb24iKSxzPXQoIi4vYWRsZXIzMiIpLGk9dCgiLi9jcmMzMiIpLG89dCgiLi9pbmZmYXN0IiksdT10KCIuL2luZnRyZWVzIikscD0xLGI9MixnPTAsbT0tMixDPTEseT04NTIsVD01OTI7ZnVuY3Rpb24gUChFKXtyZXR1cm4oRT4+PjI0JjI1NSkrKEU+Pj44JjY1MjgwKSsoKDY1MjgwJkUpPDw4KSsoKDI1NSZFKTw8MjQpfWZ1bmN0aW9uIGMoKXt0aGlzLm1vZGU9MCx0aGlzLmxhc3Q9ITEsdGhpcy53cmFwPTAsdGhpcy5oYXZlZGljdD0hMSx0aGlzLmZsYWdzPTAsdGhpcy5kbWF4PTAsdGhpcy5jaGVjaz0wLHRoaXMudG90YWw9MCx0aGlzLmhlYWQ9bnVsbCx0aGlzLndiaXRzPTAsdGhpcy53c2l6ZT0wLHRoaXMud2hhdmU9MCx0aGlzLnduZXh0PTAsdGhpcy53aW5kb3c9bnVsbCx0aGlzLmhvbGQ9MCx0aGlzLmJpdHM9MCx0aGlzLmxlbmd0aD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5leHRyYT0wLHRoaXMubGVuY29kZT1udWxsLHRoaXMuZGlzdGNvZGU9bnVsbCx0aGlzLmxlbmJpdHM9MCx0aGlzLmRpc3RiaXRzPTAsdGhpcy5uY29kZT0wLHRoaXMubmxlbj0wLHRoaXMubmRpc3Q9MCx0aGlzLmhhdmU9MCx0aGlzLm5leHQ9bnVsbCx0aGlzLmxlbnM9bmV3IHIuQnVmMTYoMzIwKSx0aGlzLndvcms9bmV3IHIuQnVmMTYoMjg4KSx0aGlzLmxlbmR5bj1udWxsLHRoaXMuZGlzdGR5bj1udWxsLHRoaXMuc2FuZT0wLHRoaXMuYmFjaz0wLHRoaXMud2FzPTB9ZnVuY3Rpb24gbChFKXt2YXIgJDtyZXR1cm4gRSYmRS5zdGF0ZT8oJD1FLnN0YXRlLEUudG90YWxfaW49RS50b3RhbF9vdXQ9JC50b3RhbD0wLEUubXNnPSIiLCQud3JhcCYmKEUuYWRsZXI9MSYkLndyYXApLCQubW9kZT1DLCQubGFzdD0wLCQuaGF2ZWRpY3Q9MCwkLmRtYXg9MzI3NjgsJC5oZWFkPW51bGwsJC5ob2xkPTAsJC5iaXRzPTAsJC5sZW5jb2RlPSQubGVuZHluPW5ldyByLkJ1ZjMyKHkpLCQuZGlzdGNvZGU9JC5kaXN0ZHluPW5ldyByLkJ1ZjMyKFQpLCQuc2FuZT0xLCQuYmFjaz0tMSxnKTptfWZ1bmN0aW9uIGgoRSl7dmFyICQ7cmV0dXJuIEUmJkUuc3RhdGU/KCgkPUUuc3RhdGUpLndzaXplPTAsJC53aGF2ZT0wLCQud25leHQ9MCxsKEUpKTptfWZ1bmN0aW9uIF8oRSwkKXt2YXIgdyxrO3JldHVybiBFJiZFLnN0YXRlPyhrPUUuc3RhdGUsJDwwPyh3PTAsJD0tJCk6KHc9MSsoJD4+NCksJDw0OCYmKCQmPTE1KSksJCYmKCQ8OHx8MTU8JCk/bTooay53aW5kb3chPT1udWxsJiZrLndiaXRzIT09JCYmKGsud2luZG93PW51bGwpLGsud3JhcD13LGsud2JpdHM9JCxoKEUpKSk6bX1mdW5jdGlvbiBGKEUsJCl7dmFyIHcsaztyZXR1cm4gRT8oaz1uZXcgYywoRS5zdGF0ZT1rKS53aW5kb3c9bnVsbCwodz1fKEUsJCkpIT09ZyYmKEUuc3RhdGU9bnVsbCksdyk6bX12YXIgTyxmLFU9ITA7ZnVuY3Rpb24gWChFKXtpZihVKXt2YXIgJDtmb3IoTz1uZXcgci5CdWYzMig1MTIpLGY9bmV3IHIuQnVmMzIoMzIpLCQ9MDskPDE0NDspRS5sZW5zWyQrK109ODtmb3IoOyQ8MjU2OylFLmxlbnNbJCsrXT05O2Zvcig7JDwyODA7KUUubGVuc1skKytdPTc7Zm9yKDskPDI4ODspRS5sZW5zWyQrK109ODtmb3IodShwLEUubGVucywwLDI4OCxPLDAsRS53b3JrLHtiaXRzOjl9KSwkPTA7JDwzMjspRS5sZW5zWyQrK109NTt1KGIsRS5sZW5zLDAsMzIsZiwwLEUud29yayx7Yml0czo1fSksVT0hMX1FLmxlbmNvZGU9TyxFLmxlbmJpdHM9OSxFLmRpc3Rjb2RlPWYsRS5kaXN0Yml0cz01fWZ1bmN0aW9uIFEoRSwkLHcsayl7dmFyIFMsQj1FLnN0YXRlO3JldHVybiBCLndpbmRvdz09PW51bGwmJihCLndzaXplPTE8PEIud2JpdHMsQi53bmV4dD0wLEIud2hhdmU9MCxCLndpbmRvdz1uZXcgci5CdWY4KEIud3NpemUpKSxrPj1CLndzaXplPyhyLmFycmF5U2V0KEIud2luZG93LCQsdy1CLndzaXplLEIud3NpemUsMCksQi53bmV4dD0wLEIud2hhdmU9Qi53c2l6ZSk6KGs8KFM9Qi53c2l6ZS1CLnduZXh0KSYmKFM9ayksci5hcnJheVNldChCLndpbmRvdywkLHctayxTLEIud25leHQpLChrLT1TKT8oci5hcnJheVNldChCLndpbmRvdywkLHctayxrLDApLEIud25leHQ9ayxCLndoYXZlPUIud3NpemUpOihCLnduZXh0Kz1TLEIud25leHQ9PT1CLndzaXplJiYoQi53bmV4dD0wKSxCLndoYXZlPEIud3NpemUmJihCLndoYXZlKz1TKSkpLDB9bi5pbmZsYXRlUmVzZXQ9aCxuLmluZmxhdGVSZXNldDI9XyxuLmluZmxhdGVSZXNldEtlZXA9bCxuLmluZmxhdGVJbml0PWZ1bmN0aW9uKEUpe3JldHVybiBGKEUsMTUpfSxuLmluZmxhdGVJbml0Mj1GLG4uaW5mbGF0ZT1mdW5jdGlvbihFLCQpe3ZhciB3LGssUyxCLEwsUixxLHosRyxudCx0dCxldCx3dCxTdCxUdCxrdCxMdCxCdCwkdCxLdCxELHV0LG90LFYsaj0wLEs9bmV3IHIuQnVmOCg0KSxwdD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07aWYoIUV8fCFFLnN0YXRlfHwhRS5vdXRwdXR8fCFFLmlucHV0JiZFLmF2YWlsX2luIT09MClyZXR1cm4gbTsodz1FLnN0YXRlKS5tb2RlPT09MTImJih3Lm1vZGU9MTMpLEw9RS5uZXh0X291dCxTPUUub3V0cHV0LHE9RS5hdmFpbF9vdXQsQj1FLm5leHRfaW4saz1FLmlucHV0LFI9RS5hdmFpbF9pbix6PXcuaG9sZCxHPXcuYml0cyxudD1SLHR0PXEsdXQ9Zzt0OmZvcig7Oylzd2l0Y2gody5tb2RlKXtjYXNlIEM6aWYody53cmFwPT09MCl7dy5tb2RlPTEzO2JyZWFrfWZvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKDImdy53cmFwJiZ6PT09MzU2MTUpe0tbdy5jaGVjaz0wXT0yNTUmeixLWzFdPXo+Pj44JjI1NSx3LmNoZWNrPWkody5jaGVjayxLLDIsMCksRz16PTAsdy5tb2RlPTI7YnJlYWt9aWYody5mbGFncz0wLHcuaGVhZCYmKHcuaGVhZC5kb25lPSExKSwhKDEmdy53cmFwKXx8KCgoMjU1JnopPDw4KSsoej4+OCkpJTMxKXtFLm1zZz0iaW5jb3JyZWN0IGhlYWRlciBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfWlmKCgxNSZ6KSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix3Lm1vZGU9MzA7YnJlYWt9aWYoRy09NCxEPTgrKDE1Jih6Pj4+PTQpKSx3LndiaXRzPT09MCl3LndiaXRzPUQ7ZWxzZSBpZihEPncud2JpdHMpe0UubXNnPSJpbnZhbGlkIHdpbmRvdyBzaXplIix3Lm1vZGU9MzA7YnJlYWt9dy5kbWF4PTE8PEQsRS5hZGxlcj13LmNoZWNrPTEsdy5tb2RlPTUxMiZ6PzEwOjEyLEc9ej0wO2JyZWFrO2Nhc2UgMjpmb3IoO0c8MTY7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZih3LmZsYWdzPXosKDI1NSZ3LmZsYWdzKSE9OCl7RS5tc2c9InVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIix3Lm1vZGU9MzA7YnJlYWt9aWYoNTczNDQmdy5mbGFncyl7RS5tc2c9InVua25vd24gaGVhZGVyIGZsYWdzIHNldCIsdy5tb2RlPTMwO2JyZWFrfXcuaGVhZCYmKHcuaGVhZC50ZXh0PXo+PjgmMSksNTEyJncuZmxhZ3MmJihLWzBdPTI1NSZ6LEtbMV09ej4+PjgmMjU1LHcuY2hlY2s9aSh3LmNoZWNrLEssMiwwKSksRz16PTAsdy5tb2RlPTM7Y2FzZSAzOmZvcig7RzwzMjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcuaGVhZCYmKHcuaGVhZC50aW1lPXopLDUxMiZ3LmZsYWdzJiYoS1swXT0yNTUmeixLWzFdPXo+Pj44JjI1NSxLWzJdPXo+Pj4xNiYyNTUsS1szXT16Pj4+MjQmMjU1LHcuY2hlY2s9aSh3LmNoZWNrLEssNCwwKSksRz16PTAsdy5tb2RlPTQ7Y2FzZSA0OmZvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcuaGVhZCYmKHcuaGVhZC54ZmxhZ3M9MjU1Jnosdy5oZWFkLm9zPXo+PjgpLDUxMiZ3LmZsYWdzJiYoS1swXT0yNTUmeixLWzFdPXo+Pj44JjI1NSx3LmNoZWNrPWkody5jaGVjayxLLDIsMCkpLEc9ej0wLHcubW9kZT01O2Nhc2UgNTppZigxMDI0JncuZmxhZ3Mpe2Zvcig7RzwxNjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcubGVuZ3RoPXosdy5oZWFkJiYody5oZWFkLmV4dHJhX2xlbj16KSw1MTImdy5mbGFncyYmKEtbMF09MjU1JnosS1sxXT16Pj4+OCYyNTUsdy5jaGVjaz1pKHcuY2hlY2ssSywyLDApKSxHPXo9MH1lbHNlIHcuaGVhZCYmKHcuaGVhZC5leHRyYT1udWxsKTt3Lm1vZGU9NjtjYXNlIDY6aWYoMTAyNCZ3LmZsYWdzJiYoUjwoZXQ9dy5sZW5ndGgpJiYoZXQ9UiksZXQmJih3LmhlYWQmJihEPXcuaGVhZC5leHRyYV9sZW4tdy5sZW5ndGgsdy5oZWFkLmV4dHJhfHwody5oZWFkLmV4dHJhPW5ldyBBcnJheSh3LmhlYWQuZXh0cmFfbGVuKSksci5hcnJheVNldCh3LmhlYWQuZXh0cmEsayxCLGV0LEQpKSw1MTImdy5mbGFncyYmKHcuY2hlY2s9aSh3LmNoZWNrLGssZXQsQikpLFItPWV0LEIrPWV0LHcubGVuZ3RoLT1ldCksdy5sZW5ndGgpKWJyZWFrIHQ7dy5sZW5ndGg9MCx3Lm1vZGU9NztjYXNlIDc6aWYoMjA0OCZ3LmZsYWdzKXtpZihSPT09MClicmVhayB0O2ZvcihldD0wO0Q9a1tCK2V0KytdLHcuaGVhZCYmRCYmdy5sZW5ndGg8NjU1MzYmJih3LmhlYWQubmFtZSs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmZXQ8UjspO2lmKDUxMiZ3LmZsYWdzJiYody5jaGVjaz1pKHcuY2hlY2ssayxldCxCKSksUi09ZXQsQis9ZXQsRClicmVhayB0fWVsc2Ugdy5oZWFkJiYody5oZWFkLm5hbWU9bnVsbCk7dy5sZW5ndGg9MCx3Lm1vZGU9ODtjYXNlIDg6aWYoNDA5NiZ3LmZsYWdzKXtpZihSPT09MClicmVhayB0O2ZvcihldD0wO0Q9a1tCK2V0KytdLHcuaGVhZCYmRCYmdy5sZW5ndGg8NjU1MzYmJih3LmhlYWQuY29tbWVudCs9U3RyaW5nLmZyb21DaGFyQ29kZShEKSksRCYmZXQ8UjspO2lmKDUxMiZ3LmZsYWdzJiYody5jaGVjaz1pKHcuY2hlY2ssayxldCxCKSksUi09ZXQsQis9ZXQsRClicmVhayB0fWVsc2Ugdy5oZWFkJiYody5oZWFkLmNvbW1lbnQ9bnVsbCk7dy5tb2RlPTk7Y2FzZSA5OmlmKDUxMiZ3LmZsYWdzKXtmb3IoO0c8MTY7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZih6IT09KDY1NTM1JncuY2hlY2spKXtFLm1zZz0iaGVhZGVyIGNyYyBtaXNtYXRjaCIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcuaGVhZCYmKHcuaGVhZC5oY3JjPXcuZmxhZ3M+PjkmMSx3LmhlYWQuZG9uZT0hMCksRS5hZGxlcj13LmNoZWNrPTAsdy5tb2RlPTEyO2JyZWFrO2Nhc2UgMTA6Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9RS5hZGxlcj13LmNoZWNrPVAoeiksRz16PTAsdy5tb2RlPTExO2Nhc2UgMTE6aWYody5oYXZlZGljdD09PTApcmV0dXJuIEUubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9RywyO0UuYWRsZXI9dy5jaGVjaz0xLHcubW9kZT0xMjtjYXNlIDEyOmlmKCQ9PT01fHwkPT09NilicmVhayB0O2Nhc2UgMTM6aWYody5sYXN0KXt6Pj4+PTcmRyxHLT03Jkcsdy5tb2RlPTI3O2JyZWFrfWZvcig7RzwzOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9c3dpdGNoKHcubGFzdD0xJnosRy09MSwzJih6Pj4+PTEpKXtjYXNlIDA6dy5tb2RlPTE0O2JyZWFrO2Nhc2UgMTppZihYKHcpLHcubW9kZT0yMCwkIT09NilicmVhazt6Pj4+PTIsRy09MjticmVhayB0O2Nhc2UgMjp3Lm1vZGU9MTc7YnJlYWs7Y2FzZSAzOkUubXNnPSJpbnZhbGlkIGJsb2NrIHR5cGUiLHcubW9kZT0zMH16Pj4+PTIsRy09MjticmVhaztjYXNlIDE0OmZvcih6Pj4+PTcmRyxHLT03Jkc7RzwzMjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKCg2NTUzNSZ6KSE9KHo+Pj4xNl42NTUzNSkpe0UubXNnPSJpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzIix3Lm1vZGU9MzA7YnJlYWt9aWYody5sZW5ndGg9NjU1MzUmeixHPXo9MCx3Lm1vZGU9MTUsJD09PTYpYnJlYWsgdDtjYXNlIDE1OncubW9kZT0xNjtjYXNlIDE2OmlmKGV0PXcubGVuZ3RoKXtpZihSPGV0JiYoZXQ9UikscTxldCYmKGV0PXEpLGV0PT09MClicmVhayB0O3IuYXJyYXlTZXQoUyxrLEIsZXQsTCksUi09ZXQsQis9ZXQscS09ZXQsTCs9ZXQsdy5sZW5ndGgtPWV0O2JyZWFrfXcubW9kZT0xMjticmVhaztjYXNlIDE3OmZvcig7RzwxNDspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKHcubmxlbj0yNTcrKDMxJnopLHo+Pj49NSxHLT01LHcubmRpc3Q9MSsoMzEmeiksej4+Pj01LEctPTUsdy5uY29kZT00KygxNSZ6KSx6Pj4+PTQsRy09NCwyODY8dy5ubGVufHwzMDx3Lm5kaXN0KXtFLm1zZz0idG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiLHcubW9kZT0zMDticmVha313LmhhdmU9MCx3Lm1vZGU9MTg7Y2FzZSAxODpmb3IoO3cuaGF2ZTx3Lm5jb2RlOyl7Zm9yKDtHPDM7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH13LmxlbnNbcHRbdy5oYXZlKytdXT03Jnosej4+Pj0zLEctPTN9Zm9yKDt3LmhhdmU8MTk7KXcubGVuc1twdFt3LmhhdmUrK11dPTA7aWYody5sZW5jb2RlPXcubGVuZHluLHcubGVuYml0cz03LG90PXtiaXRzOncubGVuYml0c30sdXQ9dSgwLHcubGVucywwLDE5LHcubGVuY29kZSwwLHcud29yayxvdCksdy5sZW5iaXRzPW90LmJpdHMsdXQpe0UubXNnPSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiLHcubW9kZT0zMDticmVha313LmhhdmU9MCx3Lm1vZGU9MTk7Y2FzZSAxOTpmb3IoO3cuaGF2ZTx3Lm5sZW4rdy5uZGlzdDspe2Zvcig7a3Q9KGo9dy5sZW5jb2RlW3omKDE8PHcubGVuYml0cyktMV0pPj4+MTYmMjU1LEx0PTY1NTM1JmosISgoVHQ9aj4+PjI0KTw9Ryk7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH1pZihMdDwxNil6Pj4+PVR0LEctPVR0LHcubGVuc1t3LmhhdmUrK109THQ7ZWxzZXtpZihMdD09PTE2KXtmb3IoVj1UdCsyO0c8Vjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKHo+Pj49VHQsRy09VHQsdy5oYXZlPT09MCl7RS5tc2c9ImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiLHcubW9kZT0zMDticmVha31EPXcubGVuc1t3LmhhdmUtMV0sZXQ9MysoMyZ6KSx6Pj4+PTIsRy09Mn1lbHNlIGlmKEx0PT09MTcpe2ZvcihWPVR0KzM7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9Ry09VHQsRD0wLGV0PTMrKDcmKHo+Pj49VHQpKSx6Pj4+PTMsRy09M31lbHNle2ZvcihWPVR0Kzc7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9Ry09VHQsRD0wLGV0PTExKygxMjcmKHo+Pj49VHQpKSx6Pj4+PTcsRy09N31pZih3LmhhdmUrZXQ+dy5ubGVuK3cubmRpc3Qpe0UubXNnPSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0Iix3Lm1vZGU9MzA7YnJlYWt9Zm9yKDtldC0tOyl3LmxlbnNbdy5oYXZlKytdPUR9fWlmKHcubW9kZT09PTMwKWJyZWFrO2lmKHcubGVuc1syNTZdPT09MCl7RS5tc2c9ImludmFsaWQgY29kZSAtLSBtaXNzaW5nIGVuZC1vZi1ibG9jayIsdy5tb2RlPTMwO2JyZWFrfWlmKHcubGVuYml0cz05LG90PXtiaXRzOncubGVuYml0c30sdXQ9dShwLHcubGVucywwLHcubmxlbix3LmxlbmNvZGUsMCx3Lndvcmssb3QpLHcubGVuYml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0Iix3Lm1vZGU9MzA7YnJlYWt9aWYody5kaXN0Yml0cz02LHcuZGlzdGNvZGU9dy5kaXN0ZHluLG90PXtiaXRzOncuZGlzdGJpdHN9LHV0PXUoYix3LmxlbnMsdy5ubGVuLHcubmRpc3Qsdy5kaXN0Y29kZSwwLHcud29yayxvdCksdy5kaXN0Yml0cz1vdC5iaXRzLHV0KXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZXMgc2V0Iix3Lm1vZGU9MzA7YnJlYWt9aWYody5tb2RlPTIwLCQ9PT02KWJyZWFrIHQ7Y2FzZSAyMDp3Lm1vZGU9MjE7Y2FzZSAyMTppZig2PD1SJiYyNTg8PXEpe0UubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9RyxvKEUsdHQpLEw9RS5uZXh0X291dCxTPUUub3V0cHV0LHE9RS5hdmFpbF9vdXQsQj1FLm5leHRfaW4saz1FLmlucHV0LFI9RS5hdmFpbF9pbix6PXcuaG9sZCxHPXcuYml0cyx3Lm1vZGU9PT0xMiYmKHcuYmFjaz0tMSk7YnJlYWt9Zm9yKHcuYmFjaz0wO2t0PShqPXcubGVuY29kZVt6JigxPDx3LmxlbmJpdHMpLTFdKT4+PjE2JjI1NSxMdD02NTUzNSZqLCEoKFR0PWo+Pj4yNCk8PUcpOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9aWYoa3QmJiEoMjQwJmt0KSl7Zm9yKEJ0PVR0LCR0PWt0LEt0PUx0O2t0PShqPXcubGVuY29kZVtLdCsoKHomKDE8PEJ0KyR0KS0xKT4+QnQpXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmaiwhKEJ0KyhUdD1qPj4+MjQpPD1HKTspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXo+Pj49QnQsRy09QnQsdy5iYWNrKz1CdH1pZih6Pj4+PVR0LEctPVR0LHcuYmFjays9VHQsdy5sZW5ndGg9THQsa3Q9PT0wKXt3Lm1vZGU9MjY7YnJlYWt9aWYoMzIma3Qpe3cuYmFjaz0tMSx3Lm1vZGU9MTI7YnJlYWt9aWYoNjQma3Qpe0UubXNnPSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiLHcubW9kZT0zMDticmVha313LmV4dHJhPTE1Jmt0LHcubW9kZT0yMjtjYXNlIDIyOmlmKHcuZXh0cmEpe2ZvcihWPXcuZXh0cmE7RzxWOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9dy5sZW5ndGgrPXomKDE8PHcuZXh0cmEpLTEsej4+Pj13LmV4dHJhLEctPXcuZXh0cmEsdy5iYWNrKz13LmV4dHJhfXcud2FzPXcubGVuZ3RoLHcubW9kZT0yMztjYXNlIDIzOmZvcig7a3Q9KGo9dy5kaXN0Y29kZVt6JigxPDx3LmRpc3RiaXRzKS0xXSk+Pj4xNiYyNTUsTHQ9NjU1MzUmaiwhKChUdD1qPj4+MjQpPD1HKTspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fWlmKCEoMjQwJmt0KSl7Zm9yKEJ0PVR0LCR0PWt0LEt0PUx0O2t0PShqPXcuZGlzdGNvZGVbS3QrKCh6JigxPDxCdCskdCktMSk+PkJ0KV0pPj4+MTYmMjU1LEx0PTY1NTM1JmosIShCdCsoVHQ9aj4+PjI0KTw9Ryk7KXtpZihSPT09MClicmVhayB0O1ItLSx6Kz1rW0IrK108PEcsRys9OH16Pj4+PUJ0LEctPUJ0LHcuYmFjays9QnR9aWYoej4+Pj1UdCxHLT1UdCx3LmJhY2srPVR0LDY0Jmt0KXtFLm1zZz0iaW52YWxpZCBkaXN0YW5jZSBjb2RlIix3Lm1vZGU9MzA7YnJlYWt9dy5vZmZzZXQ9THQsdy5leHRyYT0xNSZrdCx3Lm1vZGU9MjQ7Y2FzZSAyNDppZih3LmV4dHJhKXtmb3IoVj13LmV4dHJhO0c8Vjspe2lmKFI9PT0wKWJyZWFrIHQ7Ui0tLHorPWtbQisrXTw8RyxHKz04fXcub2Zmc2V0Kz16JigxPDx3LmV4dHJhKS0xLHo+Pj49dy5leHRyYSxHLT13LmV4dHJhLHcuYmFjays9dy5leHRyYX1pZih3Lm9mZnNldD53LmRtYXgpe0UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsdy5tb2RlPTMwO2JyZWFrfXcubW9kZT0yNTtjYXNlIDI1OmlmKHE9PT0wKWJyZWFrIHQ7aWYoZXQ9dHQtcSx3Lm9mZnNldD5ldCl7aWYoKGV0PXcub2Zmc2V0LWV0KT53LndoYXZlJiZ3LnNhbmUpe0UubXNnPSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayIsdy5tb2RlPTMwO2JyZWFrfXd0PWV0Pncud25leHQ/KGV0LT13LnduZXh0LHcud3NpemUtZXQpOncud25leHQtZXQsZXQ+dy5sZW5ndGgmJihldD13Lmxlbmd0aCksU3Q9dy53aW5kb3d9ZWxzZSBTdD1TLHd0PUwtdy5vZmZzZXQsZXQ9dy5sZW5ndGg7Zm9yKHE8ZXQmJihldD1xKSxxLT1ldCx3Lmxlbmd0aC09ZXQ7U1tMKytdPVN0W3d0KytdLC0tZXQ7KTt3Lmxlbmd0aD09PTAmJih3Lm1vZGU9MjEpO2JyZWFrO2Nhc2UgMjY6aWYocT09PTApYnJlYWsgdDtTW0wrK109dy5sZW5ndGgscS0tLHcubW9kZT0yMTticmVhaztjYXNlIDI3OmlmKHcud3JhcCl7Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0senw9a1tCKytdPDxHLEcrPTh9aWYodHQtPXEsRS50b3RhbF9vdXQrPXR0LHcudG90YWwrPXR0LHR0JiYoRS5hZGxlcj13LmNoZWNrPXcuZmxhZ3M/aSh3LmNoZWNrLFMsdHQsTC10dCk6cyh3LmNoZWNrLFMsdHQsTC10dCkpLHR0PXEsKHcuZmxhZ3M/ejpQKHopKSE9PXcuY2hlY2spe0UubXNnPSJpbmNvcnJlY3QgZGF0YSBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcubW9kZT0yODtjYXNlIDI4OmlmKHcud3JhcCYmdy5mbGFncyl7Zm9yKDtHPDMyOyl7aWYoUj09PTApYnJlYWsgdDtSLS0seis9a1tCKytdPDxHLEcrPTh9aWYoeiE9PSg0Mjk0OTY3Mjk1JncudG90YWwpKXtFLm1zZz0iaW5jb3JyZWN0IGxlbmd0aCBjaGVjayIsdy5tb2RlPTMwO2JyZWFrfUc9ej0wfXcubW9kZT0yOTtjYXNlIDI5OnV0PTE7YnJlYWsgdDtjYXNlIDMwOnV0PS0zO2JyZWFrIHQ7Y2FzZSAzMTpyZXR1cm4tNDtjYXNlIDMyOmRlZmF1bHQ6cmV0dXJuIG19cmV0dXJuIEUubmV4dF9vdXQ9TCxFLmF2YWlsX291dD1xLEUubmV4dF9pbj1CLEUuYXZhaWxfaW49Uix3LmhvbGQ9eix3LmJpdHM9Rywody53c2l6ZXx8dHQhPT1FLmF2YWlsX291dCYmdy5tb2RlPDMwJiYody5tb2RlPDI3fHwkIT09NCkpJiZRKEUsRS5vdXRwdXQsRS5uZXh0X291dCx0dC1FLmF2YWlsX291dCk/KHcubW9kZT0zMSwtNCk6KG50LT1FLmF2YWlsX2luLHR0LT1FLmF2YWlsX291dCxFLnRvdGFsX2luKz1udCxFLnRvdGFsX291dCs9dHQsdy50b3RhbCs9dHQsdy53cmFwJiZ0dCYmKEUuYWRsZXI9dy5jaGVjaz13LmZsYWdzP2kody5jaGVjayxTLHR0LEUubmV4dF9vdXQtdHQpOnMody5jaGVjayxTLHR0LEUubmV4dF9vdXQtdHQpKSxFLmRhdGFfdHlwZT13LmJpdHMrKHcubGFzdD82NDowKSsody5tb2RlPT09MTI/MTI4OjApKyh3Lm1vZGU9PT0yMHx8dy5tb2RlPT09MTU/MjU2OjApLChudD09MCYmdHQ9PT0wfHwkPT09NCkmJnV0PT09ZyYmKHV0PS01KSx1dCl9LG4uaW5mbGF0ZUVuZD1mdW5jdGlvbihFKXtpZighRXx8IUUuc3RhdGUpcmV0dXJuIG07dmFyICQ9RS5zdGF0ZTtyZXR1cm4gJC53aW5kb3cmJigkLndpbmRvdz1udWxsKSxFLnN0YXRlPW51bGwsZ30sbi5pbmZsYXRlR2V0SGVhZGVyPWZ1bmN0aW9uKEUsJCl7dmFyIHc7cmV0dXJuIEUmJkUuc3RhdGUmJjImKHc9RS5zdGF0ZSkud3JhcD8oKHcuaGVhZD0kKS5kb25lPSExLGcpOm19LG4uaW5mbGF0ZVNldERpY3Rpb25hcnk9ZnVuY3Rpb24oRSwkKXt2YXIgdyxrPSQubGVuZ3RoO3JldHVybiBFJiZFLnN0YXRlPyh3PUUuc3RhdGUpLndyYXAhPT0wJiZ3Lm1vZGUhPT0xMT9tOncubW9kZT09PTExJiZzKDEsJCxrLDApIT09dy5jaGVjaz8tMzpRKEUsJCxrLGspPyh3Lm1vZGU9MzEsLTQpOih3LmhhdmVkaWN0PTEsZyk6bX0sbi5pbmZsYXRlSW5mbz0icGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSJ9LHsiLi4vdXRpbHMvY29tbW9uIjo0MSwiLi9hZGxlcjMyIjo0MywiLi9jcmMzMiI6NDUsIi4vaW5mZmFzdCI6NDgsIi4vaW5mdHJlZXMiOjUwfV0sNTA6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMvY29tbW9uIikscz1bMyw0LDUsNiw3LDgsOSwxMCwxMSwxMywxNSwxNywxOSwyMywyNywzMSwzNSw0Myw1MSw1OSw2Nyw4Myw5OSwxMTUsMTMxLDE2MywxOTUsMjI3LDI1OCwwLDBdLGk9WzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE3LDE3LDE3LDE3LDE4LDE4LDE4LDE4LDE5LDE5LDE5LDE5LDIwLDIwLDIwLDIwLDIxLDIxLDIxLDIxLDE2LDcyLDc4XSxvPVsxLDIsMyw0LDUsNyw5LDEzLDE3LDI1LDMzLDQ5LDY1LDk3LDEyOSwxOTMsMjU3LDM4NSw1MTMsNzY5LDEwMjUsMTUzNywyMDQ5LDMwNzMsNDA5Nyw2MTQ1LDgxOTMsMTIyODksMTYzODUsMjQ1NzcsMCwwXSx1PVsxNiwxNiwxNiwxNiwxNywxNywxOCwxOCwxOSwxOSwyMCwyMCwyMSwyMSwyMiwyMiwyMywyMywyNCwyNCwyNSwyNSwyNiwyNiwyNywyNywyOCwyOCwyOSwyOSw2NCw2NF07ZS5leHBvcnRzPWZ1bmN0aW9uKHAsYixnLG0sQyx5LFQsUCl7dmFyIGMsbCxoLF8sRixPLGYsVSxYLFE9UC5iaXRzLEU9MCwkPTAsdz0wLGs9MCxTPTAsQj0wLEw9MCxSPTAscT0wLHo9MCxHPW51bGwsbnQ9MCx0dD1uZXcgci5CdWYxNigxNiksZXQ9bmV3IHIuQnVmMTYoMTYpLHd0PW51bGwsU3Q9MDtmb3IoRT0wO0U8PTE1O0UrKyl0dFtFXT0wO2ZvcigkPTA7JDxtOyQrKyl0dFtiW2crJF1dKys7Zm9yKFM9USxrPTE1OzE8PWsmJnR0W2tdPT09MDtrLS0pO2lmKGs8UyYmKFM9ayksaz09PTApcmV0dXJuIENbeSsrXT0yMDk3MTUyMCxDW3krK109MjA5NzE1MjAsUC5iaXRzPTEsMDtmb3Iodz0xO3c8ayYmdHRbd109PT0wO3crKyk7Zm9yKFM8dyYmKFM9dyksRT1SPTE7RTw9MTU7RSsrKWlmKFI8PD0xLChSLT10dFtFXSk8MClyZXR1cm4tMTtpZigwPFImJihwPT09MHx8ayE9PTEpKXJldHVybi0xO2ZvcihldFsxXT0wLEU9MTtFPDE1O0UrKylldFtFKzFdPWV0W0VdK3R0W0VdO2ZvcigkPTA7JDxtOyQrKyliW2crJF0hPT0wJiYoVFtldFtiW2crJF1dKytdPSQpO2lmKE89cD09PTA/KEc9d3Q9VCwxOSk6cD09PTE/KEc9cyxudC09MjU3LHd0PWksU3QtPTI1NywyNTYpOihHPW8sd3Q9dSwtMSksRT13LEY9eSxMPSQ9ej0wLGg9LTEsXz0ocT0xPDwoQj1TKSktMSxwPT09MSYmODUyPHF8fHA9PT0yJiY1OTI8cSlyZXR1cm4gMTtmb3IoOzspe2ZvcihmPUUtTCxYPVRbJF08Tz8oVT0wLFRbJF0pOlRbJF0+Tz8oVT13dFtTdCtUWyRdXSxHW250K1RbJF1dKTooVT05NiwwKSxjPTE8PEUtTCx3PWw9MTw8QjtDW0YrKHo+PkwpKyhsLT1jKV09Zjw8MjR8VTw8MTZ8WHwwLGwhPT0wOyk7Zm9yKGM9MTw8RS0xO3omYzspYz4+PTE7aWYoYyE9PTA/KHomPWMtMSx6Kz1jKTp6PTAsJCsrLC0tdHRbRV09PTApe2lmKEU9PT1rKWJyZWFrO0U9YltnK1RbJF1dfWlmKFM8RSYmKHomXykhPT1oKXtmb3IoTD09PTAmJihMPVMpLEYrPXcsUj0xPDwoQj1FLUwpO0IrTDxrJiYhKChSLT10dFtCK0xdKTw9MCk7KUIrKyxSPDw9MTtpZihxKz0xPDxCLHA9PT0xJiY4NTI8cXx8cD09PTImJjU5MjxxKXJldHVybiAxO0NbaD16Jl9dPVM8PDI0fEI8PDE2fEYteXwwfX1yZXR1cm4geiE9PTAmJihDW0Yrel09RS1MPDwyNHw2NDw8MTZ8MCksUC5iaXRzPVMsMH19LHsiLi4vdXRpbHMvY29tbW9uIjo0MX1dLDUxOltmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17MjoibmVlZCBkaWN0aW9uYXJ5IiwxOiJzdHJlYW0gZW5kIiwwOiIiLCItMSI6ImZpbGUgZXJyb3IiLCItMiI6InN0cmVhbSBlcnJvciIsIi0zIjoiZGF0YSBlcnJvciIsIi00IjoiaW5zdWZmaWNpZW50IG1lbW9yeSIsIi01IjoiYnVmZmVyIGVycm9yIiwiLTYiOiJpbmNvbXBhdGlibGUgdmVyc2lvbiJ9fSx7fV0sNTI6W2Z1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9dCgiLi4vdXRpbHMvY29tbW9uIikscz0wLGk9MTtmdW5jdGlvbiBvKGope2Zvcih2YXIgSz1qLmxlbmd0aDswPD0tLUs7KWpbS109MH12YXIgdT0wLHA9MjksYj0yNTYsZz1iKzErcCxtPTMwLEM9MTkseT0yKmcrMSxUPTE1LFA9MTYsYz03LGw9MjU2LGg9MTYsXz0xNyxGPTE4LE89WzAsMCwwLDAsMCwwLDAsMCwxLDEsMSwxLDIsMiwyLDIsMywzLDMsMyw0LDQsNCw0LDUsNSw1LDUsMF0sZj1bMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM10sVT1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN10sWD1bMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV0sUT1uZXcgQXJyYXkoMiooZysyKSk7byhRKTt2YXIgRT1uZXcgQXJyYXkoMiptKTtvKEUpO3ZhciAkPW5ldyBBcnJheSg1MTIpO28oJCk7dmFyIHc9bmV3IEFycmF5KDI1Nik7byh3KTt2YXIgaz1uZXcgQXJyYXkocCk7byhrKTt2YXIgUyxCLEwsUj1uZXcgQXJyYXkobSk7ZnVuY3Rpb24gcShqLEsscHQsdnQscnQpe3RoaXMuc3RhdGljX3RyZWU9aix0aGlzLmV4dHJhX2JpdHM9Syx0aGlzLmV4dHJhX2Jhc2U9cHQsdGhpcy5lbGVtcz12dCx0aGlzLm1heF9sZW5ndGg9cnQsdGhpcy5oYXNfc3RyZWU9aiYmai5sZW5ndGh9ZnVuY3Rpb24geihqLEspe3RoaXMuZHluX3RyZWU9aix0aGlzLm1heF9jb2RlPTAsdGhpcy5zdGF0X2Rlc2M9S31mdW5jdGlvbiBHKGope3JldHVybiBqPDI1Nj8kW2pdOiRbMjU2KyhqPj4+NyldfWZ1bmN0aW9uIG50KGosSyl7ai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109MjU1Jkssai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109Sz4+PjgmMjU1fWZ1bmN0aW9uIHR0KGosSyxwdCl7ai5iaV92YWxpZD5QLXB0PyhqLmJpX2J1Znw9Szw8ai5iaV92YWxpZCY2NTUzNSxudChqLGouYmlfYnVmKSxqLmJpX2J1Zj1LPj5QLWouYmlfdmFsaWQsai5iaV92YWxpZCs9cHQtUCk6KGouYmlfYnVmfD1LPDxqLmJpX3ZhbGlkJjY1NTM1LGouYmlfdmFsaWQrPXB0KX1mdW5jdGlvbiBldChqLEsscHQpe3R0KGoscHRbMipLXSxwdFsyKksrMV0pfWZ1bmN0aW9uIHd0KGosSyl7Zm9yKHZhciBwdD0wO3B0fD0xJmosaj4+Pj0xLHB0PDw9MSwwPC0tSzspO3JldHVybiBwdD4+PjF9ZnVuY3Rpb24gU3QoaixLLHB0KXt2YXIgdnQscnQsZ3Q9bmV3IEFycmF5KFQrMSksQ3Q9MDtmb3IodnQ9MTt2dDw9VDt2dCsrKWd0W3Z0XT1DdD1DdCtwdFt2dC0xXTw8MTtmb3IocnQ9MDtydDw9SztydCsrKXt2YXIgeHQ9alsyKnJ0KzFdO3h0IT09MCYmKGpbMipydF09d3QoZ3RbeHRdKysseHQpKX19ZnVuY3Rpb24gVHQoail7dmFyIEs7Zm9yKEs9MDtLPGc7SysrKWouZHluX2x0cmVlWzIqS109MDtmb3IoSz0wO0s8bTtLKyspai5keW5fZHRyZWVbMipLXT0wO2ZvcihLPTA7SzxDO0srKylqLmJsX3RyZWVbMipLXT0wO2ouZHluX2x0cmVlWzIqbF09MSxqLm9wdF9sZW49ai5zdGF0aWNfbGVuPTAsai5sYXN0X2xpdD1qLm1hdGNoZXM9MH1mdW5jdGlvbiBrdChqKXs4PGouYmlfdmFsaWQ/bnQoaixqLmJpX2J1Zik6MDxqLmJpX3ZhbGlkJiYoai5wZW5kaW5nX2J1ZltqLnBlbmRpbmcrK109ai5iaV9idWYpLGouYmlfYnVmPTAsai5iaV92YWxpZD0wfWZ1bmN0aW9uIEx0KGosSyxwdCx2dCl7dmFyIHJ0PTIqSyxndD0yKnB0O3JldHVybiBqW3J0XTxqW2d0XXx8altydF09PT1qW2d0XSYmdnRbS108PXZ0W3B0XX1mdW5jdGlvbiBCdChqLEsscHQpe2Zvcih2YXIgdnQ9ai5oZWFwW3B0XSxydD1wdDw8MTtydDw9ai5oZWFwX2xlbiYmKHJ0PGouaGVhcF9sZW4mJkx0KEssai5oZWFwW3J0KzFdLGouaGVhcFtydF0sai5kZXB0aCkmJnJ0KyssIUx0KEssdnQsai5oZWFwW3J0XSxqLmRlcHRoKSk7KWouaGVhcFtwdF09ai5oZWFwW3J0XSxwdD1ydCxydDw8PTE7ai5oZWFwW3B0XT12dH1mdW5jdGlvbiAkdChqLEsscHQpe3ZhciB2dCxydCxndCxDdCx4dD0wO2lmKGoubGFzdF9saXQhPT0wKWZvcig7dnQ9ai5wZW5kaW5nX2J1ZltqLmRfYnVmKzIqeHRdPDw4fGoucGVuZGluZ19idWZbai5kX2J1ZisyKnh0KzFdLHJ0PWoucGVuZGluZ19idWZbai5sX2J1Zit4dF0seHQrKyx2dD09PTA/ZXQoaixydCxLKTooZXQoaiwoZ3Q9d1tydF0pK2IrMSxLKSwoQ3Q9T1tndF0pIT09MCYmdHQoaixydC09a1tndF0sQ3QpLGV0KGosZ3Q9RygtLXZ0KSxwdCksKEN0PWZbZ3RdKSE9PTAmJnR0KGosdnQtPVJbZ3RdLEN0KSkseHQ8ai5sYXN0X2xpdDspO2V0KGosbCxLKX1mdW5jdGlvbiBLdChqLEspe3ZhciBwdCx2dCxydCxndD1LLmR5bl90cmVlLEN0PUsuc3RhdF9kZXNjLnN0YXRpY190cmVlLHh0PUsuc3RhdF9kZXNjLmhhc19zdHJlZSxtdD1LLnN0YXRfZGVzYy5lbGVtcyx6dD0tMTtmb3Ioai5oZWFwX2xlbj0wLGouaGVhcF9tYXg9eSxwdD0wO3B0PG10O3B0KyspZ3RbMipwdF0hPT0wPyhqLmhlYXBbKytqLmhlYXBfbGVuXT16dD1wdCxqLmRlcHRoW3B0XT0wKTpndFsyKnB0KzFdPTA7Zm9yKDtqLmhlYXBfbGVuPDI7KWd0WzIqKHJ0PWouaGVhcFsrK2ouaGVhcF9sZW5dPXp0PDI/Kyt6dDowKV09MSxqLmRlcHRoW3J0XT0wLGoub3B0X2xlbi0tLHh0JiYoai5zdGF0aWNfbGVuLT1DdFsyKnJ0KzFdKTtmb3IoSy5tYXhfY29kZT16dCxwdD1qLmhlYXBfbGVuPj4xOzE8PXB0O3B0LS0pQnQoaixndCxwdCk7Zm9yKHJ0PW10O3B0PWouaGVhcFsxXSxqLmhlYXBbMV09ai5oZWFwW2ouaGVhcF9sZW4tLV0sQnQoaixndCwxKSx2dD1qLmhlYXBbMV0sai5oZWFwWy0tai5oZWFwX21heF09cHQsai5oZWFwWy0tai5oZWFwX21heF09dnQsZ3RbMipydF09Z3RbMipwdF0rZ3RbMip2dF0sai5kZXB0aFtydF09KGouZGVwdGhbcHRdPj1qLmRlcHRoW3Z0XT9qLmRlcHRoW3B0XTpqLmRlcHRoW3Z0XSkrMSxndFsyKnB0KzFdPWd0WzIqdnQrMV09cnQsai5oZWFwWzFdPXJ0KyssQnQoaixndCwxKSwyPD1qLmhlYXBfbGVuOyk7ai5oZWFwWy0tai5oZWFwX21heF09ai5oZWFwWzFdLGZ1bmN0aW9uKEd0LHZlKXt2YXIgZm4sVGUsdG4sZWUsZ2UsamUsZmU9dmUuZHluX3RyZWUsZHI9dmUubWF4X2NvZGUsVG49dmUuc3RhdF9kZXNjLnN0YXRpY190cmVlLHVyPXZlLnN0YXRfZGVzYy5oYXNfc3RyZWUsY3I9dmUuc3RhdF9kZXNjLmV4dHJhX2JpdHMsZnI9dmUuc3RhdF9kZXNjLmV4dHJhX2Jhc2UsQWU9dmUuc3RhdF9kZXNjLm1heF9sZW5ndGgsV2U9MDtmb3IoZWU9MDtlZTw9VDtlZSsrKUd0LmJsX2NvdW50W2VlXT0wO2ZvcihmZVsyKkd0LmhlYXBbR3QuaGVhcF9tYXhdKzFdPTAsZm49R3QuaGVhcF9tYXgrMTtmbjx5O2ZuKyspQWU8KGVlPWZlWzIqZmVbMiooVGU9R3QuaGVhcFtmbl0pKzFdKzFdKzEpJiYoZWU9QWUsV2UrKyksZmVbMipUZSsxXT1lZSxkcjxUZXx8KEd0LmJsX2NvdW50W2VlXSsrLGdlPTAsZnI8PVRlJiYoZ2U9Y3JbVGUtZnJdKSxqZT1mZVsyKlRlXSxHdC5vcHRfbGVuKz1qZSooZWUrZ2UpLHVyJiYoR3Quc3RhdGljX2xlbis9amUqKFRuWzIqVGUrMV0rZ2UpKSk7aWYoV2UhPT0wKXtkb3tmb3IoZWU9QWUtMTtHdC5ibF9jb3VudFtlZV09PT0wOyllZS0tO0d0LmJsX2NvdW50W2VlXS0tLEd0LmJsX2NvdW50W2VlKzFdKz0yLEd0LmJsX2NvdW50W0FlXS0tLFdlLT0yfXdoaWxlKDA8V2UpO2ZvcihlZT1BZTtlZSE9PTA7ZWUtLSlmb3IoVGU9R3QuYmxfY291bnRbZWVdO1RlIT09MDspZHI8KHRuPUd0LmhlYXBbLS1mbl0pfHwoZmVbMip0bisxXSE9PWVlJiYoR3Qub3B0X2xlbis9KGVlLWZlWzIqdG4rMV0pKmZlWzIqdG5dLGZlWzIqdG4rMV09ZWUpLFRlLS0pfX0oaixLKSxTdChndCx6dCxqLmJsX2NvdW50KX1mdW5jdGlvbiBEKGosSyxwdCl7dmFyIHZ0LHJ0LGd0PS0xLEN0PUtbMV0seHQ9MCxtdD03LHp0PTQ7Zm9yKEN0PT09MCYmKG10PTEzOCx6dD0zKSxLWzIqKHB0KzEpKzFdPTY1NTM1LHZ0PTA7dnQ8PXB0O3Z0KyspcnQ9Q3QsQ3Q9S1syKih2dCsxKSsxXSwrK3h0PG10JiZydD09PUN0fHwoeHQ8enQ/ai5ibF90cmVlWzIqcnRdKz14dDpydCE9PTA/KHJ0IT09Z3QmJmouYmxfdHJlZVsyKnJ0XSsrLGouYmxfdHJlZVsyKmhdKyspOnh0PD0xMD9qLmJsX3RyZWVbMipfXSsrOmouYmxfdHJlZVsyKkZdKyssZ3Q9cnQsenQ9KHh0PTApPT09Q3Q/KG10PTEzOCwzKTpydD09PUN0PyhtdD02LDMpOihtdD03LDQpKX1mdW5jdGlvbiB1dChqLEsscHQpe3ZhciB2dCxydCxndD0tMSxDdD1LWzFdLHh0PTAsbXQ9Nyx6dD00O2ZvcihDdD09PTAmJihtdD0xMzgsenQ9MyksdnQ9MDt2dDw9cHQ7dnQrKylpZihydD1DdCxDdD1LWzIqKHZ0KzEpKzFdLCEoKyt4dDxtdCYmcnQ9PT1DdCkpe2lmKHh0PHp0KWZvcig7ZXQoaixydCxqLmJsX3RyZWUpLC0teHQhPTA7KTtlbHNlIHJ0IT09MD8ocnQhPT1ndCYmKGV0KGoscnQsai5ibF90cmVlKSx4dC0tKSxldChqLGgsai5ibF90cmVlKSx0dChqLHh0LTMsMikpOnh0PD0xMD8oZXQoaixfLGouYmxfdHJlZSksdHQoaix4dC0zLDMpKTooZXQoaixGLGouYmxfdHJlZSksdHQoaix4dC0xMSw3KSk7Z3Q9cnQsenQ9KHh0PTApPT09Q3Q/KG10PTEzOCwzKTpydD09PUN0PyhtdD02LDMpOihtdD03LDQpfX1vKFIpO3ZhciBvdD0hMTtmdW5jdGlvbiBWKGosSyxwdCx2dCl7dHQoaiwodTw8MSkrKHZ0PzE6MCksMyksZnVuY3Rpb24ocnQsZ3QsQ3QseHQpe2t0KHJ0KSx4dCYmKG50KHJ0LEN0KSxudChydCx+Q3QpKSxyLmFycmF5U2V0KHJ0LnBlbmRpbmdfYnVmLHJ0LndpbmRvdyxndCxDdCxydC5wZW5kaW5nKSxydC5wZW5kaW5nKz1DdH0oaixLLHB0LCEwKX1uLl90cl9pbml0PWZ1bmN0aW9uKGope290fHwoZnVuY3Rpb24oKXt2YXIgSyxwdCx2dCxydCxndCxDdD1uZXcgQXJyYXkoVCsxKTtmb3IocnQ9dnQ9MDtydDxwLTE7cnQrKylmb3Ioa1tydF09dnQsSz0wO0s8MTw8T1tydF07SysrKXdbdnQrK109cnQ7Zm9yKHdbdnQtMV09cnQscnQ9Z3Q9MDtydDwxNjtydCsrKWZvcihSW3J0XT1ndCxLPTA7SzwxPDxmW3J0XTtLKyspJFtndCsrXT1ydDtmb3IoZ3Q+Pj03O3J0PG07cnQrKylmb3IoUltydF09Z3Q8PDcsSz0wO0s8MTw8ZltydF0tNztLKyspJFsyNTYrZ3QrK109cnQ7Zm9yKHB0PTA7cHQ8PVQ7cHQrKylDdFtwdF09MDtmb3IoSz0wO0s8PTE0MzspUVsyKksrMV09OCxLKyssQ3RbOF0rKztmb3IoO0s8PTI1NTspUVsyKksrMV09OSxLKyssQ3RbOV0rKztmb3IoO0s8PTI3OTspUVsyKksrMV09NyxLKyssQ3RbN10rKztmb3IoO0s8PTI4NzspUVsyKksrMV09OCxLKyssQ3RbOF0rKztmb3IoU3QoUSxnKzEsQ3QpLEs9MDtLPG07SysrKUVbMipLKzFdPTUsRVsyKktdPXd0KEssNSk7Uz1uZXcgcShRLE8sYisxLGcsVCksQj1uZXcgcShFLGYsMCxtLFQpLEw9bmV3IHEobmV3IEFycmF5KDApLFUsMCxDLGMpfSgpLG90PSEwKSxqLmxfZGVzYz1uZXcgeihqLmR5bl9sdHJlZSxTKSxqLmRfZGVzYz1uZXcgeihqLmR5bl9kdHJlZSxCKSxqLmJsX2Rlc2M9bmV3IHooai5ibF90cmVlLEwpLGouYmlfYnVmPTAsai5iaV92YWxpZD0wLFR0KGopfSxuLl90cl9zdG9yZWRfYmxvY2s9VixuLl90cl9mbHVzaF9ibG9jaz1mdW5jdGlvbihqLEsscHQsdnQpe3ZhciBydCxndCxDdD0wOzA8ai5sZXZlbD8oai5zdHJtLmRhdGFfdHlwZT09PTImJihqLnN0cm0uZGF0YV90eXBlPWZ1bmN0aW9uKHh0KXt2YXIgbXQsenQ9NDA5MzYyNDQ0Nztmb3IobXQ9MDttdDw9MzE7bXQrKyx6dD4+Pj0xKWlmKDEmenQmJnh0LmR5bl9sdHJlZVsyKm10XSE9PTApcmV0dXJuIHM7aWYoeHQuZHluX2x0cmVlWzE4XSE9PTB8fHh0LmR5bl9sdHJlZVsyMF0hPT0wfHx4dC5keW5fbHRyZWVbMjZdIT09MClyZXR1cm4gaTtmb3IobXQ9MzI7bXQ8YjttdCsrKWlmKHh0LmR5bl9sdHJlZVsyKm10XSE9PTApcmV0dXJuIGk7cmV0dXJuIHN9KGopKSxLdChqLGoubF9kZXNjKSxLdChqLGouZF9kZXNjKSxDdD1mdW5jdGlvbih4dCl7dmFyIG10O2ZvcihEKHh0LHh0LmR5bl9sdHJlZSx4dC5sX2Rlc2MubWF4X2NvZGUpLEQoeHQseHQuZHluX2R0cmVlLHh0LmRfZGVzYy5tYXhfY29kZSksS3QoeHQseHQuYmxfZGVzYyksbXQ9Qy0xOzM8PW10JiZ4dC5ibF90cmVlWzIqWFttdF0rMV09PT0wO210LS0pO3JldHVybiB4dC5vcHRfbGVuKz0zKihtdCsxKSs1KzUrNCxtdH0oaikscnQ9ai5vcHRfbGVuKzMrNz4+PjMsKGd0PWouc3RhdGljX2xlbiszKzc+Pj4zKTw9cnQmJihydD1ndCkpOnJ0PWd0PXB0KzUscHQrNDw9cnQmJkshPT0tMT9WKGosSyxwdCx2dCk6ai5zdHJhdGVneT09PTR8fGd0PT09cnQ/KHR0KGosMisodnQ/MTowKSwzKSwkdChqLFEsRSkpOih0dChqLDQrKHZ0PzE6MCksMyksZnVuY3Rpb24oeHQsbXQsenQsR3Qpe3ZhciB2ZTtmb3IodHQoeHQsbXQtMjU3LDUpLHR0KHh0LHp0LTEsNSksdHQoeHQsR3QtNCw0KSx2ZT0wO3ZlPEd0O3ZlKyspdHQoeHQseHQuYmxfdHJlZVsyKlhbdmVdKzFdLDMpO3V0KHh0LHh0LmR5bl9sdHJlZSxtdC0xKSx1dCh4dCx4dC5keW5fZHRyZWUsenQtMSl9KGosai5sX2Rlc2MubWF4X2NvZGUrMSxqLmRfZGVzYy5tYXhfY29kZSsxLEN0KzEpLCR0KGosai5keW5fbHRyZWUsai5keW5fZHRyZWUpKSxUdChqKSx2dCYma3Qoail9LG4uX3RyX3RhbGx5PWZ1bmN0aW9uKGosSyxwdCl7cmV0dXJuIGoucGVuZGluZ19idWZbai5kX2J1ZisyKmoubGFzdF9saXRdPUs+Pj44JjI1NSxqLnBlbmRpbmdfYnVmW2ouZF9idWYrMipqLmxhc3RfbGl0KzFdPTI1NSZLLGoucGVuZGluZ19idWZbai5sX2J1ZitqLmxhc3RfbGl0XT0yNTUmcHQsai5sYXN0X2xpdCsrLEs9PT0wP2ouZHluX2x0cmVlWzIqcHRdKys6KGoubWF0Y2hlcysrLEstLSxqLmR5bl9sdHJlZVsyKih3W3B0XStiKzEpXSsrLGouZHluX2R0cmVlWzIqRyhLKV0rKyksai5sYXN0X2xpdD09PWoubGl0X2J1ZnNpemUtMX0sbi5fdHJfYWxpZ249ZnVuY3Rpb24oail7dHQoaiwyLDMpLGV0KGosbCxRKSxmdW5jdGlvbihLKXtLLmJpX3ZhbGlkPT09MTY/KG50KEssSy5iaV9idWYpLEsuYmlfYnVmPTAsSy5iaV92YWxpZD0wKTo4PD1LLmJpX3ZhbGlkJiYoSy5wZW5kaW5nX2J1ZltLLnBlbmRpbmcrK109MjU1JksuYmlfYnVmLEsuYmlfYnVmPj49OCxLLmJpX3ZhbGlkLT04KX0oail9fSx7Ii4uL3V0aWxzL2NvbW1vbiI6NDF9XSw1MzpbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLmlucHV0PW51bGwsdGhpcy5uZXh0X2luPTAsdGhpcy5hdmFpbF9pbj0wLHRoaXMudG90YWxfaW49MCx0aGlzLm91dHB1dD1udWxsLHRoaXMubmV4dF9vdXQ9MCx0aGlzLmF2YWlsX291dD0wLHRoaXMudG90YWxfb3V0PTAsdGhpcy5tc2c9IiIsdGhpcy5zdGF0ZT1udWxsLHRoaXMuZGF0YV90eXBlPTIsdGhpcy5hZGxlcj0wfX0se31dLDU0OltmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHIpeyhmdW5jdGlvbihzLGkpeyJ1c2Ugc3RyaWN0IjtpZighcy5zZXRJbW1lZGlhdGUpe3ZhciBvLHUscCxiLGc9MSxtPXt9LEM9ITEseT1zLmRvY3VtZW50LFQ9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2Yocyk7VD1UJiZULnNldFRpbWVvdXQ/VDpzLG89e30udG9TdHJpbmcuY2FsbChzLnByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iP2Z1bmN0aW9uKGgpe3Byb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24oKXtjKGgpfSl9OmZ1bmN0aW9uKCl7aWYocy5wb3N0TWVzc2FnZSYmIXMuaW1wb3J0U2NyaXB0cyl7dmFyIGg9ITAsXz1zLm9ubWVzc2FnZTtyZXR1cm4gcy5vbm1lc3NhZ2U9ZnVuY3Rpb24oKXtoPSExfSxzLnBvc3RNZXNzYWdlKCIiLCIqIikscy5vbm1lc3NhZ2U9XyxofX0oKT8oYj0ic2V0SW1tZWRpYXRlJCIrTWF0aC5yYW5kb20oKSsiJCIscy5hZGRFdmVudExpc3RlbmVyP3MuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbCwhMSk6cy5hdHRhY2hFdmVudCgib25tZXNzYWdlIixsKSxmdW5jdGlvbihoKXtzLnBvc3RNZXNzYWdlKGIraCwiKiIpfSk6cy5NZXNzYWdlQ2hhbm5lbD8oKHA9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oaCl7YyhoLmRhdGEpfSxmdW5jdGlvbihoKXtwLnBvcnQyLnBvc3RNZXNzYWdlKGgpfSk6eSYmIm9ucmVhZHlzdGF0ZWNoYW5nZSJpbiB5LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpPyh1PXkuZG9jdW1lbnRFbGVtZW50LGZ1bmN0aW9uKGgpe3ZhciBfPXkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Xy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtjKGgpLF8ub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsdS5yZW1vdmVDaGlsZChfKSxfPW51bGx9LHUuYXBwZW5kQ2hpbGQoXyl9KTpmdW5jdGlvbihoKXtzZXRUaW1lb3V0KGMsMCxoKX0sVC5zZXRJbW1lZGlhdGU9ZnVuY3Rpb24oaCl7dHlwZW9mIGghPSJmdW5jdGlvbiImJihoPW5ldyBGdW5jdGlvbigiIitoKSk7Zm9yKHZhciBfPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLEY9MDtGPF8ubGVuZ3RoO0YrKylfW0ZdPWFyZ3VtZW50c1tGKzFdO3ZhciBPPXtjYWxsYmFjazpoLGFyZ3M6X307cmV0dXJuIG1bZ109TyxvKGcpLGcrK30sVC5jbGVhckltbWVkaWF0ZT1QfWZ1bmN0aW9uIFAoaCl7ZGVsZXRlIG1baF19ZnVuY3Rpb24gYyhoKXtpZihDKXNldFRpbWVvdXQoYywwLGgpO2Vsc2V7dmFyIF89bVtoXTtpZihfKXtDPSEwO3RyeXsoZnVuY3Rpb24oRil7dmFyIE89Ri5jYWxsYmFjayxmPUYuYXJncztzd2l0Y2goZi5sZW5ndGgpe2Nhc2UgMDpPKCk7YnJlYWs7Y2FzZSAxOk8oZlswXSk7YnJlYWs7Y2FzZSAyOk8oZlswXSxmWzFdKTticmVhaztjYXNlIDM6TyhmWzBdLGZbMV0sZlsyXSk7YnJlYWs7ZGVmYXVsdDpPLmFwcGx5KGksZil9fSkoXyl9ZmluYWxseXtQKGgpLEM9ITF9fX19ZnVuY3Rpb24gbChoKXtoLnNvdXJjZT09PXMmJnR5cGVvZiBoLmRhdGE9PSJzdHJpbmciJiZoLmRhdGEuaW5kZXhPZihiKT09PTAmJmMoK2guZGF0YS5zbGljZShiLmxlbmd0aCkpfX0pKHR5cGVvZiBzZWxmPiJ1Ij9yPT09dm9pZCAwP3RoaXM6cjpzZWxmKX0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsPCJ1Ij9nbG9iYWw6dHlwZW9mIHNlbGY8InUiP3NlbGY6dHlwZW9mIHdpbmRvdzwidSI/d2luZG93Ont9KX0se31dfSx7fSxbMTBdKSgxMCl9KX0pO3ZhciBhZT1PYSgoTGEseHIpPT57KGZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO3R5cGVvZiB4cj09Im9iamVjdCImJnR5cGVvZiB4ci5leHBvcnRzPT0ib2JqZWN0Ij94ci5leHBvcnRzPXQuZG9jdW1lbnQ/ZSh0LCEwKTpmdW5jdGlvbihuKXtpZighbi5kb2N1bWVudCl0aHJvdyBuZXcgRXJyb3IoImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnQiKTtyZXR1cm4gZShuKX06ZSh0KX0pKHR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzpMYSxmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1bXSxyPU9iamVjdC5nZXRQcm90b3R5cGVPZixzPW4uc2xpY2UsaT1uLmZsYXQ/ZnVuY3Rpb24oYSl7cmV0dXJuIG4uZmxhdC5jYWxsKGEpfTpmdW5jdGlvbihhKXtyZXR1cm4gbi5jb25jYXQuYXBwbHkoW10sYSl9LG89bi5wdXNoLHU9bi5pbmRleE9mLHA9e30sYj1wLnRvU3RyaW5nLGc9cC5oYXNPd25Qcm9wZXJ0eSxtPWcudG9TdHJpbmcsQz1tLmNhbGwoT2JqZWN0KSx5PXt9LFQ9ZnVuY3Rpb24oZCl7cmV0dXJuIHR5cGVvZiBkPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZC5ub2RlVHlwZSE9Im51bWJlciImJnR5cGVvZiBkLml0ZW0hPSJmdW5jdGlvbiJ9LFA9ZnVuY3Rpb24oZCl7cmV0dXJuIGQhPW51bGwmJmQ9PT1kLndpbmRvd30sYz10LmRvY3VtZW50LGw9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfTtmdW5jdGlvbiBoKGEsZCx2KXt2PXZ8fGM7dmFyIHgsQSxJPXYuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aWYoSS50ZXh0PWEsZClmb3IoeCBpbiBsKUE9ZFt4XXx8ZC5nZXRBdHRyaWJ1dGUmJmQuZ2V0QXR0cmlidXRlKHgpLEEmJkkuc2V0QXR0cmlidXRlKHgsQSk7di5oZWFkLmFwcGVuZENoaWxkKEkpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoSSl9ZnVuY3Rpb24gXyhhKXtyZXR1cm4gYT09bnVsbD9hKyIiOnR5cGVvZiBhPT0ib2JqZWN0Inx8dHlwZW9mIGE9PSJmdW5jdGlvbiI/cFtiLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX12YXIgRj0iMy43LjEiLE89L0hUTUwkL2ksZj1mdW5jdGlvbihhLGQpe3JldHVybiBuZXcgZi5mbi5pbml0KGEsZCl9O2YuZm49Zi5wcm90b3R5cGU9e2pxdWVyeTpGLGNvbnN0cnVjdG9yOmYsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBzLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9zLmNhbGwodGhpcyk6YTwwP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBkPWYubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGEpO3JldHVybiBkLnByZXZPYmplY3Q9dGhpcyxkfSxlYWNoOmZ1bmN0aW9uKGEpe3JldHVybiBmLmVhY2godGhpcyxhKX0sbWFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLm1hcCh0aGlzLGZ1bmN0aW9uKGQsdil7cmV0dXJuIGEuY2FsbChkLHYsZCl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHMuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXZlbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLmdyZXAodGhpcyxmdW5jdGlvbihhLGQpe3JldHVybihkKzEpJTJ9KSl9LG9kZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLmdyZXAodGhpcyxmdW5jdGlvbihhLGQpe3JldHVybiBkJTJ9KSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXMubGVuZ3RoLHY9K2ErKGE8MD9kOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayh2Pj0wJiZ2PGQ/W3RoaXNbdl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOm8sc29ydDpuLnNvcnQsc3BsaWNlOm4uc3BsaWNlfSxmLmV4dGVuZD1mLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGQsdix4LEEsSSxOPWFyZ3VtZW50c1swXXx8e30sWT0xLFc9YXJndW1lbnRzLmxlbmd0aCxKPSExO2Zvcih0eXBlb2YgTj09ImJvb2xlYW4iJiYoSj1OLE49YXJndW1lbnRzW1ldfHx7fSxZKyspLHR5cGVvZiBOIT0ib2JqZWN0IiYmIVQoTikmJihOPXt9KSxZPT09VyYmKE49dGhpcyxZLS0pO1k8VztZKyspaWYoKGE9YXJndW1lbnRzW1ldKSE9bnVsbClmb3IoZCBpbiBhKXg9YVtkXSwhKGQ9PT0iX19wcm90b19fInx8Tj09PXgpJiYoSiYmeCYmKGYuaXNQbGFpbk9iamVjdCh4KXx8KEE9QXJyYXkuaXNBcnJheSh4KSkpPyh2PU5bZF0sQSYmIUFycmF5LmlzQXJyYXkodik/ST1bXTohQSYmIWYuaXNQbGFpbk9iamVjdCh2KT9JPXt9Okk9dixBPSExLE5bZF09Zi5leHRlbmQoSixJLHgpKTp4IT09dm9pZCAwJiYoTltkXT14KSk7cmV0dXJuIE59LGYuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhGK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKGEpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBkLHY7cmV0dXJuIWF8fGIuY2FsbChhKSE9PSJbb2JqZWN0IE9iamVjdF0iPyExOihkPXIoYSksZD8odj1nLmNhbGwoZCwiY29uc3RydWN0b3IiKSYmZC5jb25zdHJ1Y3Rvcix0eXBlb2Ygdj09ImZ1bmN0aW9uIiYmbS5jYWxsKHYpPT09Qyk6ITApfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBkO2ZvcihkIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oYSxkLHYpe2goYSx7bm9uY2U6ZCYmZC5ub25jZX0sdil9LGVhY2g6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTA7aWYoVShhKSlmb3Iodj1hLmxlbmd0aDt4PHYmJmQuY2FsbChhW3hdLHgsYVt4XSkhPT0hMTt4KyspO2Vsc2UgZm9yKHggaW4gYSlpZihkLmNhbGwoYVt4XSx4LGFbeF0pPT09ITEpYnJlYWs7cmV0dXJuIGF9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGQsdj0iIix4PTAsQT1hLm5vZGVUeXBlO2lmKCFBKWZvcig7ZD1hW3grK107KXYrPWYudGV4dChkKTtyZXR1cm4gQT09PTF8fEE9PT0xMT9hLnRleHRDb250ZW50OkE9PT05P2EuZG9jdW1lbnRFbGVtZW50LnRleHRDb250ZW50OkE9PT0zfHxBPT09ND9hLm5vZGVWYWx1ZTp2fSxtYWtlQXJyYXk6ZnVuY3Rpb24oYSxkKXt2YXIgdj1kfHxbXTtyZXR1cm4gYSE9bnVsbCYmKFUoT2JqZWN0KGEpKT9mLm1lcmdlKHYsdHlwZW9mIGE9PSJzdHJpbmciP1thXTphKTpvLmNhbGwodixhKSksdn0saW5BcnJheTpmdW5jdGlvbihhLGQsdil7cmV0dXJuIGQ9PW51bGw/LTE6dS5jYWxsKGQsYSx2KX0saXNYTUxEb2M6ZnVuY3Rpb24oYSl7dmFyIGQ9YSYmYS5uYW1lc3BhY2VVUkksdj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIU8udGVzdChkfHx2JiZ2Lm5vZGVOYW1lfHwiSFRNTCIpfSxtZXJnZTpmdW5jdGlvbihhLGQpe2Zvcih2YXIgdj0rZC5sZW5ndGgseD0wLEE9YS5sZW5ndGg7eDx2O3grKylhW0ErK109ZFt4XTtyZXR1cm4gYS5sZW5ndGg9QSxhfSxncmVwOmZ1bmN0aW9uKGEsZCx2KXtmb3IodmFyIHgsQT1bXSxJPTAsTj1hLmxlbmd0aCxZPSF2O0k8TjtJKyspeD0hZChhW0ldLEkpLHghPT1ZJiZBLnB1c2goYVtJXSk7cmV0dXJuIEF9LG1hcDpmdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJPTAsTj1bXTtpZihVKGEpKWZvcih4PWEubGVuZ3RoO0k8eDtJKyspQT1kKGFbSV0sSSx2KSxBIT1udWxsJiZOLnB1c2goQSk7ZWxzZSBmb3IoSSBpbiBhKUE9ZChhW0ldLEksdiksQSE9bnVsbCYmTi5wdXNoKEEpO3JldHVybiBpKE4pfSxndWlkOjEsc3VwcG9ydDp5fSksdHlwZW9mIFN5bWJvbD09ImZ1bmN0aW9uIiYmKGYuZm5bU3ltYm9sLml0ZXJhdG9yXT1uW1N5bWJvbC5pdGVyYXRvcl0pLGYuZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2wiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxkKXtwWyJbb2JqZWN0ICIrZCsiXSJdPWQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIFUoYSl7dmFyIGQ9ISFhJiYibGVuZ3RoImluIGEmJmEubGVuZ3RoLHY9XyhhKTtyZXR1cm4gVChhKXx8UChhKT8hMTp2PT09ImFycmF5Inx8ZD09PTB8fHR5cGVvZiBkPT0ibnVtYmVyIiYmZD4wJiZkLTEgaW4gYX1mdW5jdGlvbiBYKGEsZCl7cmV0dXJuIGEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWQudG9Mb3dlckNhc2UoKX12YXIgUT1uLnBvcCxFPW4uc29ydCwkPW4uc3BsaWNlLHc9IltcXHgyMFxcdFxcclxcblxcZl0iLGs9bmV3IFJlZ0V4cCgiXiIrdysiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIit3KyIrJCIsImciKTtmLmNvbnRhaW5zPWZ1bmN0aW9uKGEsZCl7dmFyIHY9ZCYmZC5wYXJlbnROb2RlO3JldHVybiBhPT09dnx8ISEodiYmdi5ub2RlVHlwZT09PTEmJihhLmNvbnRhaW5zP2EuY29udGFpbnModik6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih2KSYxNikpfTt2YXIgUz0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlx4ODAtXHVGRkZGXHctXS9nO2Z1bmN0aW9uIEIoYSxkKXtyZXR1cm4gZD9hPT09IlwwIj8iXHVGRkZEIjphLnNsaWNlKDAsLTEpKyJcXCIrYS5jaGFyQ29kZUF0KGEubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIithfWYuZXNjYXBlU2VsZWN0b3I9ZnVuY3Rpb24oYSl7cmV0dXJuKGErIiIpLnJlcGxhY2UoUyxCKX07dmFyIEw9YyxSPW87KGZ1bmN0aW9uKCl7dmFyIGEsZCx2LHgsQSxJPVIsTixZLFcsSixkdCxmdD1mLmV4cGFuZG8sc3Q9MCx5dD0wLE90PXZyKCksWHQ9dnIoKSxWdD12cigpLHVlPXZyKCksb2U9ZnVuY3Rpb24oTSxaKXtyZXR1cm4gTT09PVomJihBPSEwKSwwfSxHZT0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLHFlPSIoPzpcXFxcW1xcZGEtZkEtRl17MSw2fSIrdysiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixxdD0iXFxbIit3KyIqKCIrcWUrIikoPzoiK3crIiooWypeJHwhfl0/PSkiK3crYCooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3wiKCg/OlxcXFwufFteXFxcXCJdKSopInwoYCtxZSsiKSl8KSIrdysiKlxcXSIsYm49IjooIitxZStgKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8IigoPzpcXFxcLnxbXlxcXFwiXSkqKSIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfGArcXQrIikqKXwuKilcXCl8KSIsWXQ9bmV3IFJlZ0V4cCh3KyIrIiwiZyIpLHJlPW5ldyBSZWdFeHAoIl4iK3crIiosIit3KyIqIiksWG49bmV3IFJlZ0V4cCgiXiIrdysiKihbPit+XXwiK3crIikiK3crIioiKSxvaT1uZXcgUmVnRXhwKHcrInw+IiksWGU9bmV3IFJlZ0V4cChibiksWW49bmV3IFJlZ0V4cCgiXiIrcWUrIiQiKSxZZT17SUQ6bmV3IFJlZ0V4cCgiXiMoIitxZSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitxZSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrcWUrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIitxdCksUFNFVURPOm5ldyBSZWdFeHAoIl4iK2JuKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK3crIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK3crIiooPzooWystXXwpIit3KyIqKFxcZCspfCkpIit3KyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitHZSsiKSQiLCJpIiksbmVlZHNDb250ZXh0Om5ldyBSZWdFeHAoIl4iK3crIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrdysiKigoPzotXFxkKT9cXGQqKSIrdysiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sZW49L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxubj0vXmhcZCQvaSxQZT0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLGxpPS9bK35dLyxKZT1uZXcgUmVnRXhwKCJcXFxcW1xcZGEtZkEtRl17MSw2fSIrdysiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIiksUWU9ZnVuY3Rpb24oTSxaKXt2YXIgaXQ9IjB4IitNLnNsaWNlKDEpLTY1NTM2O3JldHVybiBafHwoaXQ8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKGl0KzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGl0Pj4xMHw1NTI5NixpdCYxMDIzfDU2MzIwKSl9LGpvPWZ1bmN0aW9uKCl7cm4oKX0sTW89eXIoZnVuY3Rpb24oTSl7cmV0dXJuIE0uZGlzYWJsZWQ9PT0hMCYmWChNLCJmaWVsZHNldCIpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7ZnVuY3Rpb24gVm8oKXt0cnl7cmV0dXJuIE4uYWN0aXZlRWxlbWVudH1jYXRjaHt9fXRyeXtJLmFwcGx5KG49cy5jYWxsKEwuY2hpbGROb2RlcyksTC5jaGlsZE5vZGVzKSxuW0wuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoe0k9e2FwcGx5OmZ1bmN0aW9uKFosaXQpe1IuYXBwbHkoWixzLmNhbGwoaXQpKX0sY2FsbDpmdW5jdGlvbihaKXtSLmFwcGx5KFoscy5jYWxsKGFyZ3VtZW50cywxKSl9fX1mdW5jdGlvbiBKdChNLFosaXQsbHQpe3ZhciBjdCxfdCxEdCxQdCxBdCxIdCxOdCxSdD1aJiZaLm93bmVyRG9jdW1lbnQsVXQ9Wj9aLm5vZGVUeXBlOjk7aWYoaXQ9aXR8fFtdLHR5cGVvZiBNIT0ic3RyaW5nInx8IU18fFV0IT09MSYmVXQhPT05JiZVdCE9PTExKXJldHVybiBpdDtpZighbHQmJihybihaKSxaPVp8fE4sVykpe2lmKFV0IT09MTEmJihBdD1QZS5leGVjKE0pKSlpZihjdD1BdFsxXSl7aWYoVXQ9PT05KWlmKER0PVouZ2V0RWxlbWVudEJ5SWQoY3QpKXtpZihEdC5pZD09PWN0KXJldHVybiBJLmNhbGwoaXQsRHQpLGl0fWVsc2UgcmV0dXJuIGl0O2Vsc2UgaWYoUnQmJihEdD1SdC5nZXRFbGVtZW50QnlJZChjdCkpJiZKdC5jb250YWlucyhaLER0KSYmRHQuaWQ9PT1jdClyZXR1cm4gSS5jYWxsKGl0LER0KSxpdH1lbHNle2lmKEF0WzJdKXJldHVybiBJLmFwcGx5KGl0LFouZ2V0RWxlbWVudHNCeVRhZ05hbWUoTSkpLGl0O2lmKChjdD1BdFszXSkmJlouZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gSS5hcHBseShpdCxaLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY3QpKSxpdH1pZighdWVbTSsiICJdJiYoIUp8fCFKLnRlc3QoTSkpKXtpZihOdD1NLFJ0PVosVXQ9PT0xJiYob2kudGVzdChNKXx8WG4udGVzdChNKSkpe2ZvcihSdD1saS50ZXN0KE0pJiZkaShaLnBhcmVudE5vZGUpfHxaLChSdCE9Wnx8IXkuc2NvcGUpJiYoKFB0PVouZ2V0QXR0cmlidXRlKCJpZCIpKT9QdD1mLmVzY2FwZVNlbGVjdG9yKFB0KTpaLnNldEF0dHJpYnV0ZSgiaWQiLFB0PWZ0KSksSHQ9JG4oTSksX3Q9SHQubGVuZ3RoO190LS07KUh0W190XT0oUHQ/IiMiK1B0OiI6c2NvcGUiKSsiICIrZ3IoSHRbX3RdKTtOdD1IdC5qb2luKCIsIil9dHJ5e3JldHVybiBJLmFwcGx5KGl0LFJ0LnF1ZXJ5U2VsZWN0b3JBbGwoTnQpKSxpdH1jYXRjaHt1ZShNLCEwKX1maW5hbGx5e1B0PT09ZnQmJloucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIEJhKE0ucmVwbGFjZShrLCIkMSIpLFosaXQsbHQpfWZ1bmN0aW9uIHZyKCl7dmFyIE09W107ZnVuY3Rpb24gWihpdCxsdCl7cmV0dXJuIE0ucHVzaChpdCsiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBaW00uc2hpZnQoKV0sWltpdCsiICJdPWx0fXJldHVybiBafWZ1bmN0aW9uIFZlKE0pe3JldHVybiBNW2Z0XT0hMCxNfWZ1bmN0aW9uIEluKE0pe3ZhciBaPU4uY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKTt0cnl7cmV0dXJuISFNKFopfWNhdGNoe3JldHVybiExfWZpbmFsbHl7Wi5wYXJlbnROb2RlJiZaLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoWiksWj1udWxsfX1mdW5jdGlvbiBIbyhNKXtyZXR1cm4gZnVuY3Rpb24oWil7cmV0dXJuIFgoWiwiaW5wdXQiKSYmWi50eXBlPT09TX19ZnVuY3Rpb24gVW8oTSl7cmV0dXJuIGZ1bmN0aW9uKFope3JldHVybihYKFosImlucHV0Iil8fFgoWiwiYnV0dG9uIikpJiZaLnR5cGU9PT1NfX1mdW5jdGlvbiBQYShNKXtyZXR1cm4gZnVuY3Rpb24oWil7cmV0dXJuImZvcm0iaW4gWj9aLnBhcmVudE5vZGUmJlouZGlzYWJsZWQ9PT0hMT8ibGFiZWwiaW4gWj8ibGFiZWwiaW4gWi5wYXJlbnROb2RlP1oucGFyZW50Tm9kZS5kaXNhYmxlZD09PU06Wi5kaXNhYmxlZD09PU06Wi5pc0Rpc2FibGVkPT09TXx8Wi5pc0Rpc2FibGVkIT09IU0mJk1vKFopPT09TTpaLmRpc2FibGVkPT09TToibGFiZWwiaW4gWj9aLmRpc2FibGVkPT09TTohMX19ZnVuY3Rpb24gbW4oTSl7cmV0dXJuIFZlKGZ1bmN0aW9uKFope3JldHVybiBaPStaLFZlKGZ1bmN0aW9uKGl0LGx0KXtmb3IodmFyIGN0LF90PU0oW10saXQubGVuZ3RoLFopLER0PV90Lmxlbmd0aDtEdC0tOylpdFtjdD1fdFtEdF1dJiYoaXRbY3RdPSEobHRbY3RdPWl0W2N0XSkpfSl9KX1mdW5jdGlvbiBkaShNKXtyZXR1cm4gTSYmdHlwZW9mIE0uZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiJiZNfWZ1bmN0aW9uIHJuKE0pe3ZhciBaLGl0PU0/TS5vd25lckRvY3VtZW50fHxNOkw7cmV0dXJuIGl0PT1OfHxpdC5ub2RlVHlwZSE9PTl8fCFpdC5kb2N1bWVudEVsZW1lbnR8fChOPWl0LFk9Ti5kb2N1bWVudEVsZW1lbnQsVz0hZi5pc1hNTERvYyhOKSxkdD1ZLm1hdGNoZXN8fFkud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxZLm1zTWF0Y2hlc1NlbGVjdG9yLFkubXNNYXRjaGVzU2VsZWN0b3ImJkwhPU4mJihaPU4uZGVmYXVsdFZpZXcpJiZaLnRvcCE9PVomJlouYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixqbykseS5nZXRCeUlkPUluKGZ1bmN0aW9uKGx0KXtyZXR1cm4gWS5hcHBlbmRDaGlsZChsdCkuaWQ9Zi5leHBhbmRvLCFOLmdldEVsZW1lbnRzQnlOYW1lfHwhTi5nZXRFbGVtZW50c0J5TmFtZShmLmV4cGFuZG8pLmxlbmd0aH0pLHkuZGlzY29ubmVjdGVkTWF0Y2g9SW4oZnVuY3Rpb24obHQpe3JldHVybiBkdC5jYWxsKGx0LCIqIil9KSx5LnNjb3BlPUluKGZ1bmN0aW9uKCl7cmV0dXJuIE4ucXVlcnlTZWxlY3RvckFsbCgiOnNjb3BlIil9KSx5LmNzc0hhcz1JbihmdW5jdGlvbigpe3RyeXtyZXR1cm4gTi5xdWVyeVNlbGVjdG9yKCI6aGFzKCosOmpxZmFrZSkiKSwhMX1jYXRjaHtyZXR1cm4hMH19KSx5LmdldEJ5SWQ/KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGx0KXt2YXIgY3Q9bHQucmVwbGFjZShKZSxRZSk7cmV0dXJuIGZ1bmN0aW9uKF90KXtyZXR1cm4gX3QuZ2V0QXR0cmlidXRlKCJpZCIpPT09Y3R9fSxkLmZpbmQuSUQ9ZnVuY3Rpb24obHQsY3Qpe2lmKHR5cGVvZiBjdC5nZXRFbGVtZW50QnlJZDwidSImJlcpe3ZhciBfdD1jdC5nZXRFbGVtZW50QnlJZChsdCk7cmV0dXJuIF90P1tfdF06W119fSk6KGQuZmlsdGVyLklEPWZ1bmN0aW9uKGx0KXt2YXIgY3Q9bHQucmVwbGFjZShKZSxRZSk7cmV0dXJuIGZ1bmN0aW9uKF90KXt2YXIgRHQ9dHlwZW9mIF90LmdldEF0dHJpYnV0ZU5vZGU8InUiJiZfdC5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBEdCYmRHQudmFsdWU9PT1jdH19LGQuZmluZC5JRD1mdW5jdGlvbihsdCxjdCl7aWYodHlwZW9mIGN0LmdldEVsZW1lbnRCeUlkPCJ1IiYmVyl7dmFyIF90LER0LFB0LEF0PWN0LmdldEVsZW1lbnRCeUlkKGx0KTtpZihBdCl7aWYoX3Q9QXQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSxfdCYmX3QudmFsdWU9PT1sdClyZXR1cm5bQXRdO2ZvcihQdD1jdC5nZXRFbGVtZW50c0J5TmFtZShsdCksRHQ9MDtBdD1QdFtEdCsrXTspaWYoX3Q9QXQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSxfdCYmX3QudmFsdWU9PT1sdClyZXR1cm5bQXRdfXJldHVybltdfX0pLGQuZmluZC5UQUc9ZnVuY3Rpb24obHQsY3Qpe3JldHVybiB0eXBlb2YgY3QuZ2V0RWxlbWVudHNCeVRhZ05hbWU8InUiP2N0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGx0KTpjdC5xdWVyeVNlbGVjdG9yQWxsKGx0KX0sZC5maW5kLkNMQVNTPWZ1bmN0aW9uKGx0LGN0KXtpZih0eXBlb2YgY3QuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZTwidSImJlcpcmV0dXJuIGN0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobHQpfSxKPVtdLEluKGZ1bmN0aW9uKGx0KXt2YXIgY3Q7WS5hcHBlbmRDaGlsZChsdCkuaW5uZXJIVE1MPSI8YSBpZD0nIitmdCsiJyBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgaWQ9JyIrZnQrIi1cclxcJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixsdC5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxKLnB1c2goIlxcWyIrdysiKig/OnZhbHVlfCIrR2UrIikiKSxsdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrZnQrIi1dIikubGVuZ3RofHxKLnB1c2goIn49IiksbHQucXVlcnlTZWxlY3RvckFsbCgiYSMiK2Z0KyIrKiIpLmxlbmd0aHx8Si5wdXNoKCIuIy4rWyt+XSIpLGx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxKLnB1c2goIjpjaGVja2VkIiksY3Q9Ti5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGN0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGx0LmFwcGVuZENoaWxkKGN0KS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksWS5hcHBlbmRDaGlsZChsdCkuZGlzYWJsZWQ9ITAsbHQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoIT09MiYmSi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGN0PU4uY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxjdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCIiKSxsdC5hcHBlbmRDaGlsZChjdCksbHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9JyddIikubGVuZ3RofHxKLnB1c2goIlxcWyIrdysiKm5hbWUiK3crIio9Iit3K2AqKD86Jyd8IiIpYCl9KSx5LmNzc0hhc3x8Si5wdXNoKCI6aGFzIiksSj1KLmxlbmd0aCYmbmV3IFJlZ0V4cChKLmpvaW4oInwiKSksb2U9ZnVuY3Rpb24obHQsY3Qpe2lmKGx0PT09Y3QpcmV0dXJuIEE9ITAsMDt2YXIgX3Q9IWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFjdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gX3R8fChfdD0obHQub3duZXJEb2N1bWVudHx8bHQpPT0oY3Qub3duZXJEb2N1bWVudHx8Y3QpP2x0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGN0KToxLF90JjF8fCF5LnNvcnREZXRhY2hlZCYmY3QuY29tcGFyZURvY3VtZW50UG9zaXRpb24obHQpPT09X3Q/bHQ9PT1OfHxsdC5vd25lckRvY3VtZW50PT1MJiZKdC5jb250YWlucyhMLGx0KT8tMTpjdD09PU58fGN0Lm93bmVyRG9jdW1lbnQ9PUwmJkp0LmNvbnRhaW5zKEwsY3QpPzE6eD91LmNhbGwoeCxsdCktdS5jYWxsKHgsY3QpOjA6X3QmND8tMToxKX0pLE59SnQubWF0Y2hlcz1mdW5jdGlvbihNLFope3JldHVybiBKdChNLG51bGwsbnVsbCxaKX0sSnQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKE0sWil7aWYocm4oTSksVyYmIXVlW1orIiAiXSYmKCFKfHwhSi50ZXN0KFopKSl0cnl7dmFyIGl0PWR0LmNhbGwoTSxaKTtpZihpdHx8eS5kaXNjb25uZWN0ZWRNYXRjaHx8TS5kb2N1bWVudCYmTS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBpdH1jYXRjaHt1ZShaLCEwKX1yZXR1cm4gSnQoWixOLG51bGwsW01dKS5sZW5ndGg+MH0sSnQuY29udGFpbnM9ZnVuY3Rpb24oTSxaKXtyZXR1cm4oTS5vd25lckRvY3VtZW50fHxNKSE9TiYmcm4oTSksZi5jb250YWlucyhNLFopfSxKdC5hdHRyPWZ1bmN0aW9uKE0sWil7KE0ub3duZXJEb2N1bWVudHx8TSkhPU4mJnJuKE0pO3ZhciBpdD1kLmF0dHJIYW5kbGVbWi50b0xvd2VyQ2FzZSgpXSxsdD1pdCYmZy5jYWxsKGQuYXR0ckhhbmRsZSxaLnRvTG93ZXJDYXNlKCkpP2l0KE0sWiwhVyk6dm9pZCAwO3JldHVybiBsdCE9PXZvaWQgMD9sdDpNLmdldEF0dHJpYnV0ZShaKX0sSnQuZXJyb3I9ZnVuY3Rpb24oTSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK00pfSxmLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oTSl7dmFyIFosaXQ9W10sbHQ9MCxjdD0wO2lmKEE9IXkuc29ydFN0YWJsZSx4PSF5LnNvcnRTdGFibGUmJnMuY2FsbChNLDApLEUuY2FsbChNLG9lKSxBKXtmb3IoO1o9TVtjdCsrXTspWj09PU1bY3RdJiYobHQ9aXQucHVzaChjdCkpO2Zvcig7bHQtLTspJC5jYWxsKE0saXRbbHRdLDEpfXJldHVybiB4PW51bGwsTX0sZi5mbi51bmlxdWVTb3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGYudW5pcXVlU29ydChzLmFwcGx5KHRoaXMpKSl9LGQ9Zi5leHByPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86VmUsbWF0Y2g6WWUsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKE0pe3JldHVybiBNWzFdPU1bMV0ucmVwbGFjZShKZSxRZSksTVszXT0oTVszXXx8TVs0XXx8TVs1XXx8IiIpLnJlcGxhY2UoSmUsUWUpLE1bMl09PT0ifj0iJiYoTVszXT0iICIrTVszXSsiICIpLE0uc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oTSl7cmV0dXJuIE1bMV09TVsxXS50b0xvd2VyQ2FzZSgpLE1bMV0uc2xpY2UoMCwzKT09PSJudGgiPyhNWzNdfHxKdC5lcnJvcihNWzBdKSxNWzRdPSsoTVs0XT9NWzVdKyhNWzZdfHwxKToyKihNWzNdPT09ImV2ZW4ifHxNWzNdPT09Im9kZCIpKSxNWzVdPSsoTVs3XStNWzhdfHxNWzNdPT09Im9kZCIpKTpNWzNdJiZKdC5lcnJvcihNWzBdKSxNfSxQU0VVRE86ZnVuY3Rpb24oTSl7dmFyIFosaXQ9IU1bNl0mJk1bMl07cmV0dXJuIFllLkNISUxELnRlc3QoTVswXSk/bnVsbDooTVszXT9NWzJdPU1bNF18fE1bNV18fCIiOml0JiZYZS50ZXN0KGl0KSYmKFo9JG4oaXQsITApKSYmKFo9aXQuaW5kZXhPZigiKSIsaXQubGVuZ3RoLVopLWl0Lmxlbmd0aCkmJihNWzBdPU1bMF0uc2xpY2UoMCxaKSxNWzJdPWl0LnNsaWNlKDAsWikpLE0uc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihNKXt2YXIgWj1NLnJlcGxhY2UoSmUsUWUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIE09PT0iKiI/ZnVuY3Rpb24oKXtyZXR1cm4hMH06ZnVuY3Rpb24oaXQpe3JldHVybiBYKGl0LFopfX0sQ0xBU1M6ZnVuY3Rpb24oTSl7dmFyIFo9T3RbTSsiICJdO3JldHVybiBafHwoWj1uZXcgUmVnRXhwKCIoXnwiK3crIikiK00rIigiK3crInwkKSIpKSYmT3QoTSxmdW5jdGlvbihpdCl7cmV0dXJuIFoudGVzdCh0eXBlb2YgaXQuY2xhc3NOYW1lPT0ic3RyaW5nIiYmaXQuY2xhc3NOYW1lfHx0eXBlb2YgaXQuZ2V0QXR0cmlidXRlPCJ1IiYmaXQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihNLFosaXQpe3JldHVybiBmdW5jdGlvbihsdCl7dmFyIGN0PUp0LmF0dHIobHQsTSk7cmV0dXJuIGN0PT1udWxsP1o9PT0iIT0iOlo/KGN0Kz0iIixaPT09Ij0iP2N0PT09aXQ6Wj09PSIhPSI/Y3QhPT1pdDpaPT09Il49Ij9pdCYmY3QuaW5kZXhPZihpdCk9PT0wOlo9PT0iKj0iP2l0JiZjdC5pbmRleE9mKGl0KT4tMTpaPT09IiQ9Ij9pdCYmY3Quc2xpY2UoLWl0Lmxlbmd0aCk9PT1pdDpaPT09In49Ij8oIiAiK2N0LnJlcGxhY2UoWXQsIiAiKSsiICIpLmluZGV4T2YoaXQpPi0xOlo9PT0ifD0iP2N0PT09aXR8fGN0LnNsaWNlKDAsaXQubGVuZ3RoKzEpPT09aXQrIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKE0sWixpdCxsdCxjdCl7dmFyIF90PU0uc2xpY2UoMCwzKSE9PSJudGgiLER0PU0uc2xpY2UoLTQpIT09Imxhc3QiLFB0PVo9PT0ib2YtdHlwZSI7cmV0dXJuIGx0PT09MSYmY3Q9PT0wP2Z1bmN0aW9uKEF0KXtyZXR1cm4hIUF0LnBhcmVudE5vZGV9OmZ1bmN0aW9uKEF0LEh0LE50KXt2YXIgUnQsVXQsRnQsbmUseGUsaGU9X3QhPT1EdD8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLEZlPUF0LnBhcmVudE5vZGUsJGU9UHQmJkF0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksUG49IU50JiYhUHQscGU9ITE7aWYoRmUpe2lmKF90KXtmb3IoO2hlOyl7Zm9yKEZ0PUF0O0Z0PUZ0W2hlXTspaWYoUHQ/WChGdCwkZSk6RnQubm9kZVR5cGU9PT0xKXJldHVybiExO3hlPWhlPU09PT0ib25seSImJiF4ZSYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZih4ZT1bRHQ/RmUuZmlyc3RDaGlsZDpGZS5sYXN0Q2hpbGRdLER0JiZQbil7Zm9yKFV0PUZlW2Z0XXx8KEZlW2Z0XT17fSksUnQ9VXRbTV18fFtdLG5lPVJ0WzBdPT09c3QmJlJ0WzFdLHBlPW5lJiZSdFsyXSxGdD1uZSYmRmUuY2hpbGROb2Rlc1tuZV07RnQ9KytuZSYmRnQmJkZ0W2hlXXx8KHBlPW5lPTApfHx4ZS5wb3AoKTspaWYoRnQubm9kZVR5cGU9PT0xJiYrK3BlJiZGdD09PUF0KXtVdFtNXT1bc3QsbmUscGVdO2JyZWFrfX1lbHNlIGlmKFBuJiYoVXQ9QXRbZnRdfHwoQXRbZnRdPXt9KSxSdD1VdFtNXXx8W10sbmU9UnRbMF09PT1zdCYmUnRbMV0scGU9bmUpLHBlPT09ITEpZm9yKDsoRnQ9KytuZSYmRnQmJkZ0W2hlXXx8KHBlPW5lPTApfHx4ZS5wb3AoKSkmJiEoKFB0P1goRnQsJGUpOkZ0Lm5vZGVUeXBlPT09MSkmJisrcGUmJihQbiYmKFV0PUZ0W2Z0XXx8KEZ0W2Z0XT17fSksVXRbTV09W3N0LHBlXSksRnQ9PT1BdCkpOyk7cmV0dXJuIHBlLT1jdCxwZT09PWx0fHxwZSVsdD09PTAmJnBlL2x0Pj0wfX19LFBTRVVETzpmdW5jdGlvbihNLFope3ZhciBpdCxsdD1kLnBzZXVkb3NbTV18fGQuc2V0RmlsdGVyc1tNLnRvTG93ZXJDYXNlKCldfHxKdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK00pO3JldHVybiBsdFtmdF0/bHQoWik6bHQubGVuZ3RoPjE/KGl0PVtNLE0sIiIsWl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KE0udG9Mb3dlckNhc2UoKSk/VmUoZnVuY3Rpb24oY3QsX3Qpe2Zvcih2YXIgRHQsUHQ9bHQoY3QsWiksQXQ9UHQubGVuZ3RoO0F0LS07KUR0PXUuY2FsbChjdCxQdFtBdF0pLGN0W0R0XT0hKF90W0R0XT1QdFtBdF0pfSk6ZnVuY3Rpb24oY3Qpe3JldHVybiBsdChjdCwwLGl0KX0pOmx0fX0scHNldWRvczp7bm90OlZlKGZ1bmN0aW9uKE0pe3ZhciBaPVtdLGl0PVtdLGx0PWhpKE0ucmVwbGFjZShrLCIkMSIpKTtyZXR1cm4gbHRbZnRdP1ZlKGZ1bmN0aW9uKGN0LF90LER0LFB0KXtmb3IodmFyIEF0LEh0PWx0KGN0LG51bGwsUHQsW10pLE50PWN0Lmxlbmd0aDtOdC0tOykoQXQ9SHRbTnRdKSYmKGN0W050XT0hKF90W050XT1BdCkpfSk6ZnVuY3Rpb24oY3QsX3QsRHQpe3JldHVybiBaWzBdPWN0LGx0KFosbnVsbCxEdCxpdCksWlswXT1udWxsLCFpdC5wb3AoKX19KSxoYXM6VmUoZnVuY3Rpb24oTSl7cmV0dXJuIGZ1bmN0aW9uKFope3JldHVybiBKdChNLFopLmxlbmd0aD4wfX0pLGNvbnRhaW5zOlZlKGZ1bmN0aW9uKE0pe3JldHVybiBNPU0ucmVwbGFjZShKZSxRZSksZnVuY3Rpb24oWil7cmV0dXJuKFoudGV4dENvbnRlbnR8fGYudGV4dChaKSkuaW5kZXhPZihNKT4tMX19KSxsYW5nOlZlKGZ1bmN0aW9uKE0pe3JldHVybiBZbi50ZXN0KE18fCIiKXx8SnQuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrTSksTT1NLnJlcGxhY2UoSmUsUWUpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oWil7dmFyIGl0O2RvIGlmKGl0PVc/Wi5sYW5nOlouZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHxaLmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBpdD1pdC50b0xvd2VyQ2FzZSgpLGl0PT09TXx8aXQuaW5kZXhPZihNKyItIik9PT0wO3doaWxlKChaPVoucGFyZW50Tm9kZSkmJloubm9kZVR5cGU9PT0xKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oTSl7dmFyIFo9dC5sb2NhdGlvbiYmdC5sb2NhdGlvbi5oYXNoO3JldHVybiBaJiZaLnNsaWNlKDEpPT09TS5pZH0scm9vdDpmdW5jdGlvbihNKXtyZXR1cm4gTT09PVl9LGZvY3VzOmZ1bmN0aW9uKE0pe3JldHVybiBNPT09Vm8oKSYmTi5oYXNGb2N1cygpJiYhIShNLnR5cGV8fE0uaHJlZnx8fk0udGFiSW5kZXgpfSxlbmFibGVkOlBhKCExKSxkaXNhYmxlZDpQYSghMCksY2hlY2tlZDpmdW5jdGlvbihNKXtyZXR1cm4gWChNLCJpbnB1dCIpJiYhIU0uY2hlY2tlZHx8WChNLCJvcHRpb24iKSYmISFNLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihNKXtyZXR1cm4gTS5wYXJlbnROb2RlJiZNLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxNLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKE0pe2ZvcihNPU0uZmlyc3RDaGlsZDtNO009TS5uZXh0U2libGluZylpZihNLm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbihNKXtyZXR1cm4hZC5wc2V1ZG9zLmVtcHR5KE0pfSxoZWFkZXI6ZnVuY3Rpb24oTSl7cmV0dXJuIG5uLnRlc3QoTS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKE0pe3JldHVybiBlbi50ZXN0KE0ubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oTSl7cmV0dXJuIFgoTSwiaW5wdXQiKSYmTS50eXBlPT09ImJ1dHRvbiJ8fFgoTSwiYnV0dG9uIil9LHRleHQ6ZnVuY3Rpb24oTSl7dmFyIFo7cmV0dXJuIFgoTSwiaW5wdXQiKSYmTS50eXBlPT09InRleHQiJiYoKFo9TS5nZXRBdHRyaWJ1dGUoInR5cGUiKSk9PW51bGx8fFoudG9Mb3dlckNhc2UoKT09PSJ0ZXh0Iil9LGZpcnN0Om1uKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDptbihmdW5jdGlvbihNLFope3JldHVybltaLTFdfSksZXE6bW4oZnVuY3Rpb24oTSxaLGl0KXtyZXR1cm5baXQ8MD9pdCtaOml0XX0pLGV2ZW46bW4oZnVuY3Rpb24oTSxaKXtmb3IodmFyIGl0PTA7aXQ8WjtpdCs9MilNLnB1c2goaXQpO3JldHVybiBNfSksb2RkOm1uKGZ1bmN0aW9uKE0sWil7Zm9yKHZhciBpdD0xO2l0PFo7aXQrPTIpTS5wdXNoKGl0KTtyZXR1cm4gTX0pLGx0Om1uKGZ1bmN0aW9uKE0sWixpdCl7dmFyIGx0O2ZvcihpdDwwP2x0PWl0K1o6aXQ+Wj9sdD1aOmx0PWl0Oy0tbHQ+PTA7KU0ucHVzaChsdCk7cmV0dXJuIE19KSxndDptbihmdW5jdGlvbihNLFosaXQpe2Zvcih2YXIgbHQ9aXQ8MD9pdCtaOml0OysrbHQ8WjspTS5wdXNoKGx0KTtyZXR1cm4gTX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGEgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2FdPUhvKGEpO2ZvcihhIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2FdPVVvKGEpO2Z1bmN0aW9uIEZhKCl7fUZhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgRmE7ZnVuY3Rpb24gJG4oTSxaKXt2YXIgaXQsbHQsY3QsX3QsRHQsUHQsQXQsSHQ9WHRbTSsiICJdO2lmKEh0KXJldHVybiBaPzA6SHQuc2xpY2UoMCk7Zm9yKER0PU0sUHQ9W10sQXQ9ZC5wcmVGaWx0ZXI7RHQ7KXsoIWl0fHwobHQ9cmUuZXhlYyhEdCkpKSYmKGx0JiYoRHQ9RHQuc2xpY2UobHRbMF0ubGVuZ3RoKXx8RHQpLFB0LnB1c2goY3Q9W10pKSxpdD0hMSwobHQ9WG4uZXhlYyhEdCkpJiYoaXQ9bHQuc2hpZnQoKSxjdC5wdXNoKHt2YWx1ZTppdCx0eXBlOmx0WzBdLnJlcGxhY2UoaywiICIpfSksRHQ9RHQuc2xpY2UoaXQubGVuZ3RoKSk7Zm9yKF90IGluIGQuZmlsdGVyKShsdD1ZZVtfdF0uZXhlYyhEdCkpJiYoIUF0W190XXx8KGx0PUF0W190XShsdCkpKSYmKGl0PWx0LnNoaWZ0KCksY3QucHVzaCh7dmFsdWU6aXQsdHlwZTpfdCxtYXRjaGVzOmx0fSksRHQ9RHQuc2xpY2UoaXQubGVuZ3RoKSk7aWYoIWl0KWJyZWFrfXJldHVybiBaP0R0Lmxlbmd0aDpEdD9KdC5lcnJvcihNKTpYdChNLFB0KS5zbGljZSgwKX1mdW5jdGlvbiBncihNKXtmb3IodmFyIFo9MCxpdD1NLmxlbmd0aCxsdD0iIjtaPGl0O1orKylsdCs9TVtaXS52YWx1ZTtyZXR1cm4gbHR9ZnVuY3Rpb24geXIoTSxaLGl0KXt2YXIgbHQ9Wi5kaXIsY3Q9Wi5uZXh0LF90PWN0fHxsdCxEdD1pdCYmX3Q9PT0icGFyZW50Tm9kZSIsUHQ9eXQrKztyZXR1cm4gWi5maXJzdD9mdW5jdGlvbihBdCxIdCxOdCl7Zm9yKDtBdD1BdFtsdF07KWlmKEF0Lm5vZGVUeXBlPT09MXx8RHQpcmV0dXJuIE0oQXQsSHQsTnQpO3JldHVybiExfTpmdW5jdGlvbihBdCxIdCxOdCl7dmFyIFJ0LFV0LEZ0PVtzdCxQdF07aWYoTnQpe2Zvcig7QXQ9QXRbbHRdOylpZigoQXQubm9kZVR5cGU9PT0xfHxEdCkmJk0oQXQsSHQsTnQpKXJldHVybiEwfWVsc2UgZm9yKDtBdD1BdFtsdF07KWlmKEF0Lm5vZGVUeXBlPT09MXx8RHQpaWYoVXQ9QXRbZnRdfHwoQXRbZnRdPXt9KSxjdCYmWChBdCxjdCkpQXQ9QXRbbHRdfHxBdDtlbHNle2lmKChSdD1VdFtfdF0pJiZSdFswXT09PXN0JiZSdFsxXT09PVB0KXJldHVybiBGdFsyXT1SdFsyXTtpZihVdFtfdF09RnQsRnRbMl09TShBdCxIdCxOdCkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIHVpKE0pe3JldHVybiBNLmxlbmd0aD4xP2Z1bmN0aW9uKFosaXQsbHQpe2Zvcih2YXIgY3Q9TS5sZW5ndGg7Y3QtLTspaWYoIU1bY3RdKFosaXQsbHQpKXJldHVybiExO3JldHVybiEwfTpNWzBdfWZ1bmN0aW9uIFdvKE0sWixpdCl7Zm9yKHZhciBsdD0wLGN0PVoubGVuZ3RoO2x0PGN0O2x0KyspSnQoTSxaW2x0XSxpdCk7cmV0dXJuIGl0fWZ1bmN0aW9uIHdyKE0sWixpdCxsdCxjdCl7Zm9yKHZhciBfdCxEdD1bXSxQdD0wLEF0PU0ubGVuZ3RoLEh0PVohPW51bGw7UHQ8QXQ7UHQrKykoX3Q9TVtQdF0pJiYoIWl0fHxpdChfdCxsdCxjdCkpJiYoRHQucHVzaChfdCksSHQmJloucHVzaChQdCkpO3JldHVybiBEdH1mdW5jdGlvbiBjaShNLFosaXQsbHQsY3QsX3Qpe3JldHVybiBsdCYmIWx0W2Z0XSYmKGx0PWNpKGx0KSksY3QmJiFjdFtmdF0mJihjdD1jaShjdCxfdCkpLFZlKGZ1bmN0aW9uKER0LFB0LEF0LEh0KXt2YXIgTnQsUnQsVXQsRnQsbmU9W10seGU9W10saGU9UHQubGVuZ3RoLEZlPUR0fHxXbyhafHwiKiIsQXQubm9kZVR5cGU/W0F0XTpBdCxbXSksJGU9TSYmKER0fHwhWik/d3IoRmUsbmUsTSxBdCxIdCk6RmU7aWYoaXQ/KEZ0PWN0fHwoRHQ/TTpoZXx8bHQpP1tdOlB0LGl0KCRlLEZ0LEF0LEh0KSk6RnQ9JGUsbHQpZm9yKE50PXdyKEZ0LHhlKSxsdChOdCxbXSxBdCxIdCksUnQ9TnQubGVuZ3RoO1J0LS07KShVdD1OdFtSdF0pJiYoRnRbeGVbUnRdXT0hKCRlW3hlW1J0XV09VXQpKTtpZihEdCl7aWYoY3R8fE0pe2lmKGN0KXtmb3IoTnQ9W10sUnQ9RnQubGVuZ3RoO1J0LS07KShVdD1GdFtSdF0pJiZOdC5wdXNoKCRlW1J0XT1VdCk7Y3QobnVsbCxGdD1bXSxOdCxIdCl9Zm9yKFJ0PUZ0Lmxlbmd0aDtSdC0tOykoVXQ9RnRbUnRdKSYmKE50PWN0P3UuY2FsbChEdCxVdCk6bmVbUnRdKT4tMSYmKER0W050XT0hKFB0W050XT1VdCkpfX1lbHNlIEZ0PXdyKEZ0PT09UHQ/RnQuc3BsaWNlKGhlLEZ0Lmxlbmd0aCk6RnQpLGN0P2N0KG51bGwsUHQsRnQsSHQpOkkuYXBwbHkoUHQsRnQpfSl9ZnVuY3Rpb24gZmkoTSl7Zm9yKHZhciBaLGl0LGx0LGN0PU0ubGVuZ3RoLF90PWQucmVsYXRpdmVbTVswXS50eXBlXSxEdD1fdHx8ZC5yZWxhdGl2ZVsiICJdLFB0PV90PzE6MCxBdD15cihmdW5jdGlvbihSdCl7cmV0dXJuIFJ0PT09Wn0sRHQsITApLEh0PXlyKGZ1bmN0aW9uKFJ0KXtyZXR1cm4gdS5jYWxsKFosUnQpPi0xfSxEdCwhMCksTnQ9W2Z1bmN0aW9uKFJ0LFV0LEZ0KXt2YXIgbmU9IV90JiYoRnR8fFV0IT12KXx8KChaPVV0KS5ub2RlVHlwZT9BdChSdCxVdCxGdCk6SHQoUnQsVXQsRnQpKTtyZXR1cm4gWj1udWxsLG5lfV07UHQ8Y3Q7UHQrKylpZihpdD1kLnJlbGF0aXZlW01bUHRdLnR5cGVdKU50PVt5cih1aShOdCksaXQpXTtlbHNle2lmKGl0PWQuZmlsdGVyW01bUHRdLnR5cGVdLmFwcGx5KG51bGwsTVtQdF0ubWF0Y2hlcyksaXRbZnRdKXtmb3IobHQ9KytQdDtsdDxjdCYmIWQucmVsYXRpdmVbTVtsdF0udHlwZV07bHQrKyk7cmV0dXJuIGNpKFB0PjEmJnVpKE50KSxQdD4xJiZncihNLnNsaWNlKDAsUHQtMSkuY29uY2F0KHt2YWx1ZTpNW1B0LTJdLnR5cGU9PT0iICI/IioiOiIifSkpLnJlcGxhY2UoaywiJDEiKSxpdCxQdDxsdCYmZmkoTS5zbGljZShQdCxsdCkpLGx0PGN0JiZmaShNPU0uc2xpY2UobHQpKSxsdDxjdCYmZ3IoTSkpfU50LnB1c2goaXQpfXJldHVybiB1aShOdCl9ZnVuY3Rpb24gR28oTSxaKXt2YXIgaXQ9Wi5sZW5ndGg+MCxsdD1NLmxlbmd0aD4wLGN0PWZ1bmN0aW9uKF90LER0LFB0LEF0LEh0KXt2YXIgTnQsUnQsVXQsRnQ9MCxuZT0iMCIseGU9X3QmJltdLGhlPVtdLEZlPXYsJGU9X3R8fGx0JiZkLmZpbmQuVEFHKCIqIixIdCksUG49c3QrPUZlPT1udWxsPzE6TWF0aC5yYW5kb20oKXx8LjEscGU9JGUubGVuZ3RoO2ZvcihIdCYmKHY9RHQ9PU58fER0fHxIdCk7bmUhPT1wZSYmKE50PSRlW25lXSkhPW51bGw7bmUrKyl7aWYobHQmJk50KXtmb3IoUnQ9MCwhRHQmJk50Lm93bmVyRG9jdW1lbnQhPU4mJihybihOdCksUHQ9IVcpO1V0PU1bUnQrK107KWlmKFV0KE50LER0fHxOLFB0KSl7SS5jYWxsKEF0LE50KTticmVha31IdCYmKHN0PVBuKX1pdCYmKChOdD0hVXQmJk50KSYmRnQtLSxfdCYmeGUucHVzaChOdCkpfWlmKEZ0Kz1uZSxpdCYmbmUhPT1GdCl7Zm9yKFJ0PTA7VXQ9WltSdCsrXTspVXQoeGUsaGUsRHQsUHQpO2lmKF90KXtpZihGdD4wKWZvcig7bmUtLTspeGVbbmVdfHxoZVtuZV18fChoZVtuZV09US5jYWxsKEF0KSk7aGU9d3IoaGUpfUkuYXBwbHkoQXQsaGUpLEh0JiYhX3QmJmhlLmxlbmd0aD4wJiZGdCtaLmxlbmd0aD4xJiZmLnVuaXF1ZVNvcnQoQXQpfXJldHVybiBIdCYmKHN0PVBuLHY9RmUpLHhlfTtyZXR1cm4gaXQ/VmUoY3QpOmN0fWZ1bmN0aW9uIGhpKE0sWil7dmFyIGl0LGx0PVtdLGN0PVtdLF90PVZ0W00rIiAiXTtpZighX3Qpe2ZvcihafHwoWj0kbihNKSksaXQ9Wi5sZW5ndGg7aXQtLTspX3Q9ZmkoWltpdF0pLF90W2Z0XT9sdC5wdXNoKF90KTpjdC5wdXNoKF90KTtfdD1WdChNLEdvKGN0LGx0KSksX3Quc2VsZWN0b3I9TX1yZXR1cm4gX3R9ZnVuY3Rpb24gQmEoTSxaLGl0LGx0KXt2YXIgY3QsX3QsRHQsUHQsQXQsSHQ9dHlwZW9mIE09PSJmdW5jdGlvbiImJk0sTnQ9IWx0JiYkbihNPUh0LnNlbGVjdG9yfHxNKTtpZihpdD1pdHx8W10sTnQubGVuZ3RoPT09MSl7aWYoX3Q9TnRbMF09TnRbMF0uc2xpY2UoMCksX3QubGVuZ3RoPjImJihEdD1fdFswXSkudHlwZT09PSJJRCImJloubm9kZVR5cGU9PT05JiZXJiZkLnJlbGF0aXZlW190WzFdLnR5cGVdKXtpZihaPShkLmZpbmQuSUQoRHQubWF0Y2hlc1swXS5yZXBsYWNlKEplLFFlKSxaKXx8W10pWzBdLFopSHQmJihaPVoucGFyZW50Tm9kZSk7ZWxzZSByZXR1cm4gaXQ7TT1NLnNsaWNlKF90LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3IoY3Q9WWUubmVlZHNDb250ZXh0LnRlc3QoTSk/MDpfdC5sZW5ndGg7Y3QtLSYmKER0PV90W2N0XSwhZC5yZWxhdGl2ZVtQdD1EdC50eXBlXSk7KWlmKChBdD1kLmZpbmRbUHRdKSYmKGx0PUF0KER0Lm1hdGNoZXNbMF0ucmVwbGFjZShKZSxRZSksbGkudGVzdChfdFswXS50eXBlKSYmZGkoWi5wYXJlbnROb2RlKXx8WikpKXtpZihfdC5zcGxpY2UoY3QsMSksTT1sdC5sZW5ndGgmJmdyKF90KSwhTSlyZXR1cm4gSS5hcHBseShpdCxsdCksaXQ7YnJlYWt9fXJldHVybihIdHx8aGkoTSxOdCkpKGx0LFosIVcsaXQsIVp8fGxpLnRlc3QoTSkmJmRpKFoucGFyZW50Tm9kZSl8fFopLGl0fXkuc29ydFN0YWJsZT1mdC5zcGxpdCgiIikuc29ydChvZSkuam9pbigiIik9PT1mdCxybigpLHkuc29ydERldGFjaGVkPUluKGZ1bmN0aW9uKE0pe3JldHVybiBNLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE4uY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSkmMX0pLGYuZmluZD1KdCxmLmV4cHJbIjoiXT1mLmV4cHIucHNldWRvcyxmLnVuaXF1ZT1mLnVuaXF1ZVNvcnQsSnQuY29tcGlsZT1oaSxKdC5zZWxlY3Q9QmEsSnQuc2V0RG9jdW1lbnQ9cm4sSnQudG9rZW5pemU9JG4sSnQuZXNjYXBlPWYuZXNjYXBlU2VsZWN0b3IsSnQuZ2V0VGV4dD1mLnRleHQsSnQuaXNYTUw9Zi5pc1hNTERvYyxKdC5zZWxlY3RvcnM9Zi5leHByLEp0LnN1cHBvcnQ9Zi5zdXBwb3J0LEp0LnVuaXF1ZVNvcnQ9Zi51bmlxdWVTb3J0fSkoKTt2YXIgcT1mdW5jdGlvbihhLGQsdil7Zm9yKHZhciB4PVtdLEE9diE9PXZvaWQgMDsoYT1hW2RdKSYmYS5ub2RlVHlwZSE9PTk7KWlmKGEubm9kZVR5cGU9PT0xKXtpZihBJiZmKGEpLmlzKHYpKWJyZWFrO3gucHVzaChhKX1yZXR1cm4geH0sej1mdW5jdGlvbihhLGQpe2Zvcih2YXIgdj1bXTthO2E9YS5uZXh0U2libGluZylhLm5vZGVUeXBlPT09MSYmYSE9PWQmJnYucHVzaChhKTtyZXR1cm4gdn0sRz1mLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LG50PS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIHR0KGEsZCx2KXtyZXR1cm4gVChkKT9mLmdyZXAoYSxmdW5jdGlvbih4LEEpe3JldHVybiEhZC5jYWxsKHgsQSx4KSE9PXZ9KTpkLm5vZGVUeXBlP2YuZ3JlcChhLGZ1bmN0aW9uKHgpe3JldHVybiB4PT09ZCE9PXZ9KTp0eXBlb2YgZCE9InN0cmluZyI/Zi5ncmVwKGEsZnVuY3Rpb24oeCl7cmV0dXJuIHUuY2FsbChkLHgpPi0xIT09dn0pOmYuZmlsdGVyKGQsYSx2KX1mLmZpbHRlcj1mdW5jdGlvbihhLGQsdil7dmFyIHg9ZFswXTtyZXR1cm4gdiYmKGE9Ijpub3QoIithKyIpIiksZC5sZW5ndGg9PT0xJiZ4Lm5vZGVUeXBlPT09MT9mLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHgsYSk/W3hdOltdOmYuZmluZC5tYXRjaGVzKGEsZi5ncmVwKGQsZnVuY3Rpb24oQSl7cmV0dXJuIEEubm9kZVR5cGU9PT0xfSkpfSxmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgZCx2LHg9dGhpcy5sZW5ndGgsQT10aGlzO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gdGhpcy5wdXNoU3RhY2soZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoZD0wO2Q8eDtkKyspaWYoZi5jb250YWlucyhBW2RdLHRoaXMpKXJldHVybiEwfSkpO2Zvcih2PXRoaXMucHVzaFN0YWNrKFtdKSxkPTA7ZDx4O2QrKylmLmZpbmQoYSxBW2RdLHYpO3JldHVybiB4PjE/Zi51bmlxdWVTb3J0KHYpOnZ9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodHQodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHR0KHRoaXMsYXx8W10sITApKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISF0dCh0aGlzLHR5cGVvZiBhPT0ic3RyaW5nIiYmRy50ZXN0KGEpP2YoYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgZXQsd3Q9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLyxTdD1mLmZuLmluaXQ9ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEE7aWYoIWEpcmV0dXJuIHRoaXM7aWYodj12fHxldCx0eXBlb2YgYT09InN0cmluZyIpaWYoYVswXT09PSI8IiYmYVthLmxlbmd0aC0xXT09PSI+IiYmYS5sZW5ndGg+PTM/eD1bbnVsbCxhLG51bGxdOng9d3QuZXhlYyhhKSx4JiYoeFsxXXx8IWQpKWlmKHhbMV0pe2lmKGQ9ZCBpbnN0YW5jZW9mIGY/ZFswXTpkLGYubWVyZ2UodGhpcyxmLnBhcnNlSFRNTCh4WzFdLGQmJmQubm9kZVR5cGU/ZC5vd25lckRvY3VtZW50fHxkOmMsITApKSxudC50ZXN0KHhbMV0pJiZmLmlzUGxhaW5PYmplY3QoZCkpZm9yKHggaW4gZClUKHRoaXNbeF0pP3RoaXNbeF0oZFt4XSk6dGhpcy5hdHRyKHgsZFt4XSk7cmV0dXJuIHRoaXN9ZWxzZSByZXR1cm4gQT1jLmdldEVsZW1lbnRCeUlkKHhbMl0pLEEmJih0aGlzWzBdPUEsdGhpcy5sZW5ndGg9MSksdGhpcztlbHNlIHJldHVybiFkfHxkLmpxdWVyeT8oZHx8dikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSk7ZWxzZXtpZihhLm5vZGVUeXBlKXJldHVybiB0aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzO2lmKFQoYSkpcmV0dXJuIHYucmVhZHkhPT12b2lkIDA/di5yZWFkeShhKTphKGYpfXJldHVybiBmLm1ha2VBcnJheShhLHRoaXMpfTtTdC5wcm90b3R5cGU9Zi5mbixldD1mKGMpO3ZhciBUdD0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxrdD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGEpe3ZhciBkPWYoYSx0aGlzKSx2PWQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgeD0wO3g8djt4KyspaWYoZi5jb250YWlucyh0aGlzLGRbeF0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTAsQT10aGlzLmxlbmd0aCxJPVtdLE49dHlwZW9mIGEhPSJzdHJpbmciJiZmKGEpO2lmKCFHLnRlc3QoYSkpe2Zvcig7eDxBO3grKylmb3Iodj10aGlzW3hdO3YmJnYhPT1kO3Y9di5wYXJlbnROb2RlKWlmKHYubm9kZVR5cGU8MTEmJihOP04uaW5kZXgodik+LTE6di5ub2RlVHlwZT09PTEmJmYuZmluZC5tYXRjaGVzU2VsZWN0b3IodixhKSkpe0kucHVzaCh2KTticmVha319cmV0dXJuIHRoaXMucHVzaFN0YWNrKEkubGVuZ3RoPjE/Zi51bmlxdWVTb3J0KEkpOkkpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT90eXBlb2YgYT09InN0cmluZyI/dS5jYWxsKGYoYSksdGhpc1swXSk6dS5jYWxsKHRoaXMsYS5qcXVlcnk/YVswXTphKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmLnVuaXF1ZVNvcnQoZi5tZXJnZSh0aGlzLmdldCgpLGYoYSxkKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQoYT09bnVsbD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gTHQoYSxkKXtmb3IoOyhhPWFbZF0pJiZhLm5vZGVUeXBlIT09MTspO3JldHVybiBhfWYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBkPWEucGFyZW50Tm9kZTtyZXR1cm4gZCYmZC5ub2RlVHlwZSE9PTExP2Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gcShhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHEoYSwicGFyZW50Tm9kZSIsdil9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEx0KGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEx0KGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBxKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIHEoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHEoYSwibmV4dFNpYmxpbmciLHYpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxkLHYpe3JldHVybiBxKGEsInByZXZpb3VzU2libGluZyIsdil9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiB6KChhLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4geihhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gYS5jb250ZW50RG9jdW1lbnQhPW51bGwmJnIoYS5jb250ZW50RG9jdW1lbnQpP2EuY29udGVudERvY3VtZW50OihYKGEsInRlbXBsYXRlIikmJihhPWEuY29udGVudHx8YSksZi5tZXJnZShbXSxhLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGEsZCl7Zi5mblthXT1mdW5jdGlvbih2LHgpe3ZhciBBPWYubWFwKHRoaXMsZCx2KTtyZXR1cm4gYS5zbGljZSgtNSkhPT0iVW50aWwiJiYoeD12KSx4JiZ0eXBlb2YgeD09InN0cmluZyImJihBPWYuZmlsdGVyKHgsQSkpLHRoaXMubGVuZ3RoPjEmJihrdFthXXx8Zi51bmlxdWVTb3J0KEEpLFR0LnRlc3QoYSkmJkEucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhBKX19KTt2YXIgQnQ9L1teXHgyMFx0XHJcblxmXSsvZztmdW5jdGlvbiAkdChhKXt2YXIgZD17fTtyZXR1cm4gZi5lYWNoKGEubWF0Y2goQnQpfHxbXSxmdW5jdGlvbih2LHgpe2RbeF09ITB9KSxkfWYuQ2FsbGJhY2tzPWZ1bmN0aW9uKGEpe2E9dHlwZW9mIGE9PSJzdHJpbmciPyR0KGEpOmYuZXh0ZW5kKHt9LGEpO3ZhciBkLHYseCxBLEk9W10sTj1bXSxZPS0xLFc9ZnVuY3Rpb24oKXtmb3IoQT1BfHxhLm9uY2UseD1kPSEwO04ubGVuZ3RoO1k9LTEpZm9yKHY9Ti5zaGlmdCgpOysrWTxJLmxlbmd0aDspSVtZXS5hcHBseSh2WzBdLHZbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2UmJihZPUkubGVuZ3RoLHY9ITEpO2EubWVtb3J5fHwodj0hMSksZD0hMSxBJiYodj9JPVtdOkk9IiIpfSxKPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gSSYmKHYmJiFkJiYoWT1JLmxlbmd0aC0xLE4ucHVzaCh2KSksZnVuY3Rpb24gZHQoZnQpe2YuZWFjaChmdCxmdW5jdGlvbihzdCx5dCl7VCh5dCk/KCFhLnVuaXF1ZXx8IUouaGFzKHl0KSkmJkkucHVzaCh5dCk6eXQmJnl0Lmxlbmd0aCYmXyh5dCkhPT0ic3RyaW5nIiYmZHQoeXQpfSl9KGFyZ3VtZW50cyksdiYmIWQmJlcoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGYuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZHQsZnQpe2Zvcih2YXIgc3Q7KHN0PWYuaW5BcnJheShmdCxJLHN0KSk+LTE7KUkuc3BsaWNlKHN0LDEpLHN0PD1ZJiZZLS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZHQpe3JldHVybiBkdD9mLmluQXJyYXkoZHQsSSk+LTE6SS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gSSYmKEk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gQT1OPVtdLEk9dj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFJfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIEE9Tj1bXSwhdiYmIWQmJihJPXY9IiIpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiEhQX0sZmlyZVdpdGg6ZnVuY3Rpb24oZHQsZnQpe3JldHVybiBBfHwoZnQ9ZnR8fFtdLGZ0PVtkdCxmdC5zbGljZT9mdC5zbGljZSgpOmZ0XSxOLnB1c2goZnQpLGR8fFcoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBKLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEheH19O3JldHVybiBKfTtmdW5jdGlvbiBLdChhKXtyZXR1cm4gYX1mdW5jdGlvbiBEKGEpe3Rocm93IGF9ZnVuY3Rpb24gdXQoYSxkLHYseCl7dmFyIEE7dHJ5e2EmJlQoQT1hLnByb21pc2UpP0EuY2FsbChhKS5kb25lKGQpLmZhaWwodik6YSYmVChBPWEudGhlbik/QS5jYWxsKGEsZCx2KTpkLmFwcGx5KHZvaWQgMCxbYV0uc2xpY2UoeCkpfWNhdGNoKEkpe3YuYXBwbHkodm9pZCAwLFtJXSl9fWYuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgZD1bWyJub3RpZnkiLCJwcm9ncmVzcyIsZi5DYWxsYmFja3MoIm1lbW9yeSIpLGYuQ2FsbGJhY2tzKCJtZW1vcnkiKSwyXSxbInJlc29sdmUiLCJkb25lIixmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0sdj0icGVuZGluZyIseD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIEEuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbihJKXtyZXR1cm4geC50aGVuKG51bGwsSSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgST1hcmd1bWVudHM7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oTil7Zi5lYWNoKGQsZnVuY3Rpb24oWSxXKXt2YXIgSj1UKElbV1s0XV0pJiZJW1dbNF1dO0FbV1sxXV0oZnVuY3Rpb24oKXt2YXIgZHQ9SiYmSi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7ZHQmJlQoZHQucHJvbWlzZSk/ZHQucHJvbWlzZSgpLnByb2dyZXNzKE4ubm90aWZ5KS5kb25lKE4ucmVzb2x2ZSkuZmFpbChOLnJlamVjdCk6TltXWzBdKyJXaXRoIl0odGhpcyxKP1tkdF06YXJndW1lbnRzKX0pfSksST1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKEksTixZKXt2YXIgVz0wO2Z1bmN0aW9uIEooZHQsZnQsc3QseXQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBPdD10aGlzLFh0PWFyZ3VtZW50cyxWdD1mdW5jdGlvbigpe3ZhciBvZSxHZTtpZighKGR0PFcpKXtpZihvZT1zdC5hcHBseShPdCxYdCksb2U9PT1mdC5wcm9taXNlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uIik7R2U9b2UmJih0eXBlb2Ygb2U9PSJvYmplY3QifHx0eXBlb2Ygb2U9PSJmdW5jdGlvbiIpJiZvZS50aGVuLFQoR2UpP3l0P0dlLmNhbGwob2UsSihXLGZ0LEt0LHl0KSxKKFcsZnQsRCx5dCkpOihXKyssR2UuY2FsbChvZSxKKFcsZnQsS3QseXQpLEooVyxmdCxELHl0KSxKKFcsZnQsS3QsZnQubm90aWZ5V2l0aCkpKTooc3QhPT1LdCYmKE90PXZvaWQgMCxYdD1bb2VdKSwoeXR8fGZ0LnJlc29sdmVXaXRoKShPdCxYdCkpfX0sdWU9eXQ/VnQ6ZnVuY3Rpb24oKXt0cnl7VnQoKX1jYXRjaChvZSl7Zi5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZmLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sob2UsdWUuZXJyb3IpLGR0KzE+PVcmJihzdCE9PUQmJihPdD12b2lkIDAsWHQ9W29lXSksZnQucmVqZWN0V2l0aChPdCxYdCkpfX07ZHQ/dWUoKTooZi5EZWZlcnJlZC5nZXRFcnJvckhvb2s/dWUuZXJyb3I9Zi5EZWZlcnJlZC5nZXRFcnJvckhvb2soKTpmLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKHVlLmVycm9yPWYuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLHQuc2V0VGltZW91dCh1ZSkpfX1yZXR1cm4gZi5EZWZlcnJlZChmdW5jdGlvbihkdCl7ZFswXVszXS5hZGQoSigwLGR0LFQoWSk/WTpLdCxkdC5ub3RpZnlXaXRoKSksZFsxXVszXS5hZGQoSigwLGR0LFQoSSk/STpLdCkpLGRbMl1bM10uYWRkKEooMCxkdCxUKE4pP046RCkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKEkpe3JldHVybiBJIT1udWxsP2YuZXh0ZW5kKEkseCk6eH19LEE9e307cmV0dXJuIGYuZWFjaChkLGZ1bmN0aW9uKEksTil7dmFyIFk9TlsyXSxXPU5bNV07eFtOWzFdXT1ZLmFkZCxXJiZZLmFkZChmdW5jdGlvbigpe3Y9V30sZFszLUldWzJdLmRpc2FibGUsZFszLUldWzNdLmRpc2FibGUsZFswXVsyXS5sb2NrLGRbMF1bM10ubG9jayksWS5hZGQoTlszXS5maXJlKSxBW05bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIEFbTlswXSsiV2l0aCJdKHRoaXM9PT1BP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sQVtOWzBdKyJXaXRoIl09WS5maXJlV2l0aH0pLHgucHJvbWlzZShBKSxhJiZhLmNhbGwoQSxBKSxBfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBkPWFyZ3VtZW50cy5sZW5ndGgsdj1kLHg9QXJyYXkodiksQT1zLmNhbGwoYXJndW1lbnRzKSxJPWYuRGVmZXJyZWQoKSxOPWZ1bmN0aW9uKFkpe3JldHVybiBmdW5jdGlvbihXKXt4W1ldPXRoaXMsQVtZXT1hcmd1bWVudHMubGVuZ3RoPjE/cy5jYWxsKGFyZ3VtZW50cyk6VywtLWR8fEkucmVzb2x2ZVdpdGgoeCxBKX19O2lmKGQ8PTEmJih1dChhLEkuZG9uZShOKHYpKS5yZXNvbHZlLEkucmVqZWN0LCFkKSxJLnN0YXRlKCk9PT0icGVuZGluZyJ8fFQoQVt2XSYmQVt2XS50aGVuKSkpcmV0dXJuIEkudGhlbigpO2Zvcig7di0tOyl1dChBW3ZdLE4odiksSS5yZWplY3QpO3JldHVybiBJLnByb21pc2UoKX19KTt2YXIgb3Q9L14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87Zi5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKGEsZCl7dC5jb25zb2xlJiZ0LmNvbnNvbGUud2FybiYmYSYmb3QudGVzdChhLm5hbWUpJiZ0LmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIithLm1lc3NhZ2UsYS5zdGFjayxkKX0sZi5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihhKXt0LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBhfSl9O3ZhciBWPWYuRGVmZXJyZWQoKTtmLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBWLnRoZW4oYSkuY2F0Y2goZnVuY3Rpb24oZCl7Zi5yZWFkeUV4Y2VwdGlvbihkKX0pLHRoaXN9LGYuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGEpeyhhPT09ITA/LS1mLnJlYWR5V2FpdDpmLmlzUmVhZHkpfHwoZi5pc1JlYWR5PSEwLCEoYSE9PSEwJiYtLWYucmVhZHlXYWl0PjApJiZWLnJlc29sdmVXaXRoKGMsW2ZdKSl9fSksZi5yZWFkeS50aGVuPVYudGhlbjtmdW5jdGlvbiBqKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixqKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLGopLGYucmVhZHkoKX1jLnJlYWR5U3RhdGU9PT0iY29tcGxldGUifHxjLnJlYWR5U3RhdGUhPT0ibG9hZGluZyImJiFjLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD90LnNldFRpbWVvdXQoZi5yZWFkeSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsaiksdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixqKSk7dmFyIEs9ZnVuY3Rpb24oYSxkLHYseCxBLEksTil7dmFyIFk9MCxXPWEubGVuZ3RoLEo9dj09bnVsbDtpZihfKHYpPT09Im9iamVjdCIpe0E9ITA7Zm9yKFkgaW4gdilLKGEsZCxZLHZbWV0sITAsSSxOKX1lbHNlIGlmKHghPT12b2lkIDAmJihBPSEwLFQoeCl8fChOPSEwKSxKJiYoTj8oZC5jYWxsKGEseCksZD1udWxsKTooSj1kLGQ9ZnVuY3Rpb24oZHQsZnQsc3Qpe3JldHVybiBKLmNhbGwoZihkdCksc3QpfSkpLGQpKWZvcig7WTxXO1krKylkKGFbWV0sdixOP3g6eC5jYWxsKGFbWV0sWSxkKGFbWV0sdikpKTtyZXR1cm4gQT9hOko/ZC5jYWxsKGEpOlc/ZChhWzBdLHYpOkl9LHB0PS9eLW1zLS8sdnQ9Ly0oW2Etel0pL2c7ZnVuY3Rpb24gcnQoYSxkKXtyZXR1cm4gZC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIGd0KGEpe3JldHVybiBhLnJlcGxhY2UocHQsIm1zLSIpLnJlcGxhY2UodnQscnQpfXZhciBDdD1mdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF8fGEubm9kZVR5cGU9PT05fHwhK2Eubm9kZVR5cGV9O2Z1bmN0aW9uIHh0KCl7dGhpcy5leHBhbmRvPWYuZXhwYW5kbyt4dC51aWQrK314dC51aWQ9MSx4dC5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGEpe3ZhciBkPWFbdGhpcy5leHBhbmRvXTtyZXR1cm4gZHx8KGQ9e30sQ3QoYSkmJihhLm5vZGVUeXBlP2FbdGhpcy5leHBhbmRvXT1kOk9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLHRoaXMuZXhwYW5kbyx7dmFsdWU6ZCxjb25maWd1cmFibGU6ITB9KSkpLGR9LHNldDpmdW5jdGlvbihhLGQsdil7dmFyIHgsQT10aGlzLmNhY2hlKGEpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIilBW2d0KGQpXT12O2Vsc2UgZm9yKHggaW4gZClBW2d0KHgpXT1kW3hdO3JldHVybiBBfSxnZXQ6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZD09PXZvaWQgMD90aGlzLmNhY2hlKGEpOmFbdGhpcy5leHBhbmRvXSYmYVt0aGlzLmV4cGFuZG9dW2d0KGQpXX0sYWNjZXNzOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZD09PXZvaWQgMHx8ZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiZ2PT09dm9pZCAwP3RoaXMuZ2V0KGEsZCk6KHRoaXMuc2V0KGEsZCx2KSx2IT09dm9pZCAwP3Y6ZCl9LHJlbW92ZTpmdW5jdGlvbihhLGQpe3ZhciB2LHg9YVt0aGlzLmV4cGFuZG9dO2lmKHghPT12b2lkIDApe2lmKGQhPT12b2lkIDApZm9yKEFycmF5LmlzQXJyYXkoZCk/ZD1kLm1hcChndCk6KGQ9Z3QoZCksZD1kIGluIHg/W2RdOmQubWF0Y2goQnQpfHxbXSksdj1kLmxlbmd0aDt2LS07KWRlbGV0ZSB4W2Rbdl1dOyhkPT09dm9pZCAwfHxmLmlzRW1wdHlPYmplY3QoeCkpJiYoYS5ub2RlVHlwZT9hW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBhW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihhKXt2YXIgZD1hW3RoaXMuZXhwYW5kb107cmV0dXJuIGQhPT12b2lkIDAmJiFmLmlzRW1wdHlPYmplY3QoZCl9fTt2YXIgbXQ9bmV3IHh0LHp0PW5ldyB4dCxHdD0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLHZlPS9bQS1aXS9nO2Z1bmN0aW9uIGZuKGEpe3JldHVybiBhPT09InRydWUiPyEwOmE9PT0iZmFsc2UiPyExOmE9PT0ibnVsbCI/bnVsbDphPT09K2ErIiI/K2E6R3QudGVzdChhKT9KU09OLnBhcnNlKGEpOmF9ZnVuY3Rpb24gVGUoYSxkLHYpe3ZhciB4O2lmKHY9PT12b2lkIDAmJmEubm9kZVR5cGU9PT0xKWlmKHg9ImRhdGEtIitkLnJlcGxhY2UodmUsIi0kJiIpLnRvTG93ZXJDYXNlKCksdj1hLmdldEF0dHJpYnV0ZSh4KSx0eXBlb2Ygdj09InN0cmluZyIpe3RyeXt2PWZuKHYpfWNhdGNoe316dC5zZXQoYSxkLHYpfWVsc2Ugdj12b2lkIDA7cmV0dXJuIHZ9Zi5leHRlbmQoe2hhc0RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHp0Lmhhc0RhdGEoYSl8fG10Lmhhc0RhdGEoYSl9LGRhdGE6ZnVuY3Rpb24oYSxkLHYpe3JldHVybiB6dC5hY2Nlc3MoYSxkLHYpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsZCl7enQucmVtb3ZlKGEsZCl9LF9kYXRhOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gbXQuYWNjZXNzKGEsZCx2KX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxkKXttdC5yZW1vdmUoYSxkKX19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGQpe3ZhciB2LHgsQSxJPXRoaXNbMF0sTj1JJiZJLmF0dHJpYnV0ZXM7aWYoYT09PXZvaWQgMCl7aWYodGhpcy5sZW5ndGgmJihBPXp0LmdldChJKSxJLm5vZGVUeXBlPT09MSYmIW10LmdldChJLCJoYXNEYXRhQXR0cnMiKSkpe2Zvcih2PU4ubGVuZ3RoO3YtLTspTlt2XSYmKHg9Tlt2XS5uYW1lLHguaW5kZXhPZigiZGF0YS0iKT09PTAmJih4PWd0KHguc2xpY2UoNSkpLFRlKEkseCxBW3hdKSkpO210LnNldChJLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gQX1yZXR1cm4gdHlwZW9mIGE9PSJvYmplY3QiP3RoaXMuZWFjaChmdW5jdGlvbigpe3p0LnNldCh0aGlzLGEpfSk6Syh0aGlzLGZ1bmN0aW9uKFkpe3ZhciBXO2lmKEkmJlk9PT12b2lkIDApcmV0dXJuIFc9enQuZ2V0KEksYSksVyE9PXZvaWQgMHx8KFc9VGUoSSxhKSxXIT09dm9pZCAwKT9XOnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXt6dC5zZXQodGhpcyxhLFkpfSl9LG51bGwsZCxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3p0LnJlbW92ZSh0aGlzLGEpfSl9fSksZi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsZCx2KXt2YXIgeDtpZihhKXJldHVybiBkPShkfHwiZngiKSsicXVldWUiLHg9bXQuZ2V0KGEsZCksdiYmKCF4fHxBcnJheS5pc0FycmF5KHYpP3g9bXQuYWNjZXNzKGEsZCxmLm1ha2VBcnJheSh2KSk6eC5wdXNoKHYpKSx4fHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihhLGQpe2Q9ZHx8ImZ4Ijt2YXIgdj1mLnF1ZXVlKGEsZCkseD12Lmxlbmd0aCxBPXYuc2hpZnQoKSxJPWYuX3F1ZXVlSG9va3MoYSxkKSxOPWZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsZCl9O0E9PT0iaW5wcm9ncmVzcyImJihBPXYuc2hpZnQoKSx4LS0pLEEmJihkPT09ImZ4IiYmdi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIEkuc3RvcCxBLmNhbGwoYSxOLEkpKSwheCYmSSYmSS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGEsZCl7dmFyIHY9ZCsicXVldWVIb29rcyI7cmV0dXJuIG10LmdldChhLHYpfHxtdC5hY2Nlc3MoYSx2LHtlbXB0eTpmLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXttdC5yZW1vdmUoYSxbZCsicXVldWUiLHZdKX0pfSl9fSksZi5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGEsZCl7dmFyIHY9MjtyZXR1cm4gdHlwZW9mIGEhPSJzdHJpbmciJiYoZD1hLGE9ImZ4Iix2LS0pLGFyZ3VtZW50cy5sZW5ndGg8dj9mLnF1ZXVlKHRoaXNbMF0sYSk6ZD09PXZvaWQgMD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB4PWYucXVldWUodGhpcyxhLGQpO2YuX3F1ZXVlSG9va3ModGhpcyxhKSxhPT09ImZ4IiYmeFswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGQpe3ZhciB2LHg9MSxBPWYuRGVmZXJyZWQoKSxJPXRoaXMsTj10aGlzLmxlbmd0aCxZPWZ1bmN0aW9uKCl7LS14fHxBLnJlc29sdmVXaXRoKEksW0ldKX07Zm9yKHR5cGVvZiBhIT0ic3RyaW5nIiYmKGQ9YSxhPXZvaWQgMCksYT1hfHwiZngiO04tLTspdj1tdC5nZXQoSVtOXSxhKyJxdWV1ZUhvb2tzIiksdiYmdi5lbXB0eSYmKHgrKyx2LmVtcHR5LmFkZChZKSk7cmV0dXJuIFkoKSxBLnByb21pc2UoZCl9fSk7dmFyIHRuPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLGVlPW5ldyBSZWdFeHAoIl4oPzooWystXSk9fCkoIit0bisiKShbYS16JV0qKSQiLCJpIiksZ2U9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxqZT1jLmRvY3VtZW50RWxlbWVudCxmZT1mdW5jdGlvbihhKXtyZXR1cm4gZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl9LGRyPXtjb21wb3NlZDohMH07amUuZ2V0Um9vdE5vZGUmJihmZT1mdW5jdGlvbihhKXtyZXR1cm4gZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQsYSl8fGEuZ2V0Um9vdE5vZGUoZHIpPT09YS5vd25lckRvY3VtZW50fSk7dmFyIFRuPWZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9ZHx8YSxhLnN0eWxlLmRpc3BsYXk9PT0ibm9uZSJ8fGEuc3R5bGUuZGlzcGxheT09PSIiJiZmZShhKSYmZi5jc3MoYSwiZGlzcGxheSIpPT09Im5vbmUifTtmdW5jdGlvbiB1cihhLGQsdix4KXt2YXIgQSxJLE49MjAsWT14P2Z1bmN0aW9uKCl7cmV0dXJuIHguY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIGYuY3NzKGEsZCwiIil9LFc9WSgpLEo9diYmdlszXXx8KGYuY3NzTnVtYmVyW2RdPyIiOiJweCIpLGR0PWEubm9kZVR5cGUmJihmLmNzc051bWJlcltkXXx8SiE9PSJweCImJitXKSYmZWUuZXhlYyhmLmNzcyhhLGQpKTtpZihkdCYmZHRbM10hPT1KKXtmb3IoVz1XLzIsSj1KfHxkdFszXSxkdD0rV3x8MTtOLS07KWYuc3R5bGUoYSxkLGR0K0opLCgxLUkpKigxLShJPVkoKS9XfHwuNSkpPD0wJiYoTj0wKSxkdD1kdC9JO2R0PWR0KjIsZi5zdHlsZShhLGQsZHQrSiksdj12fHxbXX1yZXR1cm4gdiYmKGR0PStkdHx8K1d8fDAsQT12WzFdP2R0Kyh2WzFdKzEpKnZbMl06K3ZbMl0seCYmKHgudW5pdD1KLHguc3RhcnQ9ZHQseC5lbmQ9QSkpLEF9dmFyIGNyPXt9O2Z1bmN0aW9uIGZyKGEpe3ZhciBkLHY9YS5vd25lckRvY3VtZW50LHg9YS5ub2RlTmFtZSxBPWNyW3hdO3JldHVybiBBfHwoZD12LmJvZHkuYXBwZW5kQ2hpbGQodi5jcmVhdGVFbGVtZW50KHgpKSxBPWYuY3NzKGQsImRpc3BsYXkiKSxkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksQT09PSJub25lIiYmKEE9ImJsb2NrIiksY3JbeF09QSxBKX1mdW5jdGlvbiBBZShhLGQpe2Zvcih2YXIgdix4LEE9W10sST0wLE49YS5sZW5ndGg7STxOO0krKyl4PWFbSV0seC5zdHlsZSYmKHY9eC5zdHlsZS5kaXNwbGF5LGQ/KHY9PT0ibm9uZSImJihBW0ldPW10LmdldCh4LCJkaXNwbGF5Iil8fG51bGwsQVtJXXx8KHguc3R5bGUuZGlzcGxheT0iIikpLHguc3R5bGUuZGlzcGxheT09PSIiJiZUbih4KSYmKEFbSV09ZnIoeCkpKTp2IT09Im5vbmUiJiYoQVtJXT0ibm9uZSIsbXQuc2V0KHgsImRpc3BsYXkiLHYpKSk7Zm9yKEk9MDtJPE47SSsrKUFbSV0hPW51bGwmJihhW0ldLnN0eWxlLmRpc3BsYXk9QVtJXSk7cmV0dXJuIGF9Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gQWUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGE9PSJib29sZWFuIj9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1RuKHRoaXMpP2YodGhpcykuc2hvdygpOmYodGhpcykuaGlkZSgpfSl9fSk7dmFyIFdlPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pLHJhPS88KFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKS9pLGlhPS9eJHxebW9kdWxlJHxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaTsoZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxkPWEuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSksdj1jLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7di5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHYuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHYuc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGQuYXBwZW5kQ2hpbGQodikseS5jaGVja0Nsb25lPWQuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLGQuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhZC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsZC5pbm5lckhUTUw9IjxvcHRpb24+PC9vcHRpb24+Iix5Lm9wdGlvbj0hIWQubGFzdENoaWxkfSkoKTt2YXIgSWU9e3RoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtJZS50Ym9keT1JZS50Zm9vdD1JZS5jb2xncm91cD1JZS5jYXB0aW9uPUllLnRoZWFkLEllLnRoPUllLnRkLHkub3B0aW9ufHwoSWUub3B0Z3JvdXA9SWUub3B0aW9uPVsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0pO2Z1bmN0aW9uIHllKGEsZCl7dmFyIHY7cmV0dXJuIHR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lPCJ1Ij92PWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZHx8IioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsPCJ1Ij92PWEucXVlcnlTZWxlY3RvckFsbChkfHwiKiIpOnY9W10sZD09PXZvaWQgMHx8ZCYmWChhLGQpP2YubWVyZ2UoW2FdLHYpOnZ9ZnVuY3Rpb24gWHIoYSxkKXtmb3IodmFyIHY9MCx4PWEubGVuZ3RoO3Y8eDt2KyspbXQuc2V0KGFbdl0sImdsb2JhbEV2YWwiLCFkfHxtdC5nZXQoZFt2XSwiZ2xvYmFsRXZhbCIpKX12YXIgaW89Lzx8JiM/XHcrOy87ZnVuY3Rpb24gYWEoYSxkLHYseCxBKXtmb3IodmFyIEksTixZLFcsSixkdCxmdD1kLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxzdD1bXSx5dD0wLE90PWEubGVuZ3RoO3l0PE90O3l0KyspaWYoST1hW3l0XSxJfHxJPT09MClpZihfKEkpPT09Im9iamVjdCIpZi5tZXJnZShzdCxJLm5vZGVUeXBlP1tJXTpJKTtlbHNlIGlmKCFpby50ZXN0KEkpKXN0LnB1c2goZC5jcmVhdGVUZXh0Tm9kZShJKSk7ZWxzZXtmb3IoTj1OfHxmdC5hcHBlbmRDaGlsZChkLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxZPShyYS5leGVjKEkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLFc9SWVbWV18fEllLl9kZWZhdWx0LE4uaW5uZXJIVE1MPVdbMV0rZi5odG1sUHJlZmlsdGVyKEkpK1dbMl0sZHQ9V1swXTtkdC0tOylOPU4ubGFzdENoaWxkO2YubWVyZ2Uoc3QsTi5jaGlsZE5vZGVzKSxOPWZ0LmZpcnN0Q2hpbGQsTi50ZXh0Q29udGVudD0iIn1mb3IoZnQudGV4dENvbnRlbnQ9IiIseXQ9MDtJPXN0W3l0KytdOyl7aWYoeCYmZi5pbkFycmF5KEkseCk+LTEpe0EmJkEucHVzaChJKTtjb250aW51ZX1pZihKPWZlKEkpLE49eWUoZnQuYXBwZW5kQ2hpbGQoSSksInNjcmlwdCIpLEomJlhyKE4pLHYpZm9yKGR0PTA7ST1OW2R0KytdOylpYS50ZXN0KEkudHlwZXx8IiIpJiZ2LnB1c2goSSl9cmV0dXJuIGZ0fXZhciBzYT0vXihbXi5dKikoPzpcLiguKyl8KS87ZnVuY3Rpb24ga24oKXtyZXR1cm4hMH1mdW5jdGlvbiBTbigpe3JldHVybiExfWZ1bmN0aW9uIFlyKGEsZCx2LHgsQSxJKXt2YXIgTixZO2lmKHR5cGVvZiBkPT0ib2JqZWN0Iil7dHlwZW9mIHYhPSJzdHJpbmciJiYoeD14fHx2LHY9dm9pZCAwKTtmb3IoWSBpbiBkKVlyKGEsWSx2LHgsZFtZXSxJKTtyZXR1cm4gYX1pZih4PT1udWxsJiZBPT1udWxsPyhBPXYseD12PXZvaWQgMCk6QT09bnVsbCYmKHR5cGVvZiB2PT0ic3RyaW5nIj8oQT14LHg9dm9pZCAwKTooQT14LHg9dix2PXZvaWQgMCkpLEE9PT0hMSlBPVNuO2Vsc2UgaWYoIUEpcmV0dXJuIGE7cmV0dXJuIEk9PT0xJiYoTj1BLEE9ZnVuY3Rpb24oVyl7cmV0dXJuIGYoKS5vZmYoVyksTi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LEEuZ3VpZD1OLmd1aWR8fChOLmd1aWQ9Zi5ndWlkKyspKSxhLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LmFkZCh0aGlzLGQsQSx4LHYpfSl9Zi5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihhLGQsdix4LEEpe3ZhciBJLE4sWSxXLEosZHQsZnQsc3QseXQsT3QsWHQsVnQ9bXQuZ2V0KGEpO2lmKEN0KGEpKWZvcih2LmhhbmRsZXImJihJPXYsdj1JLmhhbmRsZXIsQT1JLnNlbGVjdG9yKSxBJiZmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGplLEEpLHYuZ3VpZHx8KHYuZ3VpZD1mLmd1aWQrKyksKFc9VnQuZXZlbnRzKXx8KFc9VnQuZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCkpLChOPVZ0LmhhbmRsZSl8fChOPVZ0LmhhbmRsZT1mdW5jdGlvbih1ZSl7cmV0dXJuIHR5cGVvZiBmPCJ1IiYmZi5ldmVudC50cmlnZ2VyZWQhPT11ZS50eXBlP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0pLGQ9KGR8fCIiKS5tYXRjaChCdCl8fFsiIl0sSj1kLmxlbmd0aDtKLS07KVk9c2EuZXhlYyhkW0pdKXx8W10seXQ9WHQ9WVsxXSxPdD0oWVsyXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLHl0JiYoZnQ9Zi5ldmVudC5zcGVjaWFsW3l0XXx8e30seXQ9KEE/ZnQuZGVsZWdhdGVUeXBlOmZ0LmJpbmRUeXBlKXx8eXQsZnQ9Zi5ldmVudC5zcGVjaWFsW3l0XXx8e30sZHQ9Zi5leHRlbmQoe3R5cGU6eXQsb3JpZ1R5cGU6WHQsZGF0YTp4LGhhbmRsZXI6dixndWlkOnYuZ3VpZCxzZWxlY3RvcjpBLG5lZWRzQ29udGV4dDpBJiZmLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoQSksbmFtZXNwYWNlOk90LmpvaW4oIi4iKX0sSSksKHN0PVdbeXRdKXx8KHN0PVdbeXRdPVtdLHN0LmRlbGVnYXRlQ291bnQ9MCwoIWZ0LnNldHVwfHxmdC5zZXR1cC5jYWxsKGEseCxPdCxOKT09PSExKSYmYS5hZGRFdmVudExpc3RlbmVyJiZhLmFkZEV2ZW50TGlzdGVuZXIoeXQsTikpLGZ0LmFkZCYmKGZ0LmFkZC5jYWxsKGEsZHQpLGR0LmhhbmRsZXIuZ3VpZHx8KGR0LmhhbmRsZXIuZ3VpZD12Lmd1aWQpKSxBP3N0LnNwbGljZShzdC5kZWxlZ2F0ZUNvdW50KyssMCxkdCk6c3QucHVzaChkdCksZi5ldmVudC5nbG9iYWxbeXRdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKGEsZCx2LHgsQSl7dmFyIEksTixZLFcsSixkdCxmdCxzdCx5dCxPdCxYdCxWdD1tdC5oYXNEYXRhKGEpJiZtdC5nZXQoYSk7aWYoISghVnR8fCEoVz1WdC5ldmVudHMpKSl7Zm9yKGQ9KGR8fCIiKS5tYXRjaChCdCl8fFsiIl0sSj1kLmxlbmd0aDtKLS07KXtpZihZPXNhLmV4ZWMoZFtKXSl8fFtdLHl0PVh0PVlbMV0sT3Q9KFlbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSwheXQpe2Zvcih5dCBpbiBXKWYuZXZlbnQucmVtb3ZlKGEseXQrZFtKXSx2LHgsITApO2NvbnRpbnVlfWZvcihmdD1mLmV2ZW50LnNwZWNpYWxbeXRdfHx7fSx5dD0oeD9mdC5kZWxlZ2F0ZVR5cGU6ZnQuYmluZFR5cGUpfHx5dCxzdD1XW3l0XXx8W10sWT1ZWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitPdC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxOPUk9c3QubGVuZ3RoO0ktLTspZHQ9c3RbSV0sKEF8fFh0PT09ZHQub3JpZ1R5cGUpJiYoIXZ8fHYuZ3VpZD09PWR0Lmd1aWQpJiYoIVl8fFkudGVzdChkdC5uYW1lc3BhY2UpKSYmKCF4fHx4PT09ZHQuc2VsZWN0b3J8fHg9PT0iKioiJiZkdC5zZWxlY3RvcikmJihzdC5zcGxpY2UoSSwxKSxkdC5zZWxlY3RvciYmc3QuZGVsZWdhdGVDb3VudC0tLGZ0LnJlbW92ZSYmZnQucmVtb3ZlLmNhbGwoYSxkdCkpO04mJiFzdC5sZW5ndGgmJigoIWZ0LnRlYXJkb3dufHxmdC50ZWFyZG93bi5jYWxsKGEsT3QsVnQuaGFuZGxlKT09PSExKSYmZi5yZW1vdmVFdmVudChhLHl0LFZ0LmhhbmRsZSksZGVsZXRlIFdbeXRdKX1mLmlzRW1wdHlPYmplY3QoVykmJm10LnJlbW92ZShhLCJoYW5kbGUgZXZlbnRzIil9fSxkaXNwYXRjaDpmdW5jdGlvbihhKXt2YXIgZCx2LHgsQSxJLE4sWT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksVz1mLmV2ZW50LmZpeChhKSxKPShtdC5nZXQodGhpcywiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW1cudHlwZV18fFtdLGR0PWYuZXZlbnQuc3BlY2lhbFtXLnR5cGVdfHx7fTtmb3IoWVswXT1XLGQ9MTtkPGFyZ3VtZW50cy5sZW5ndGg7ZCsrKVlbZF09YXJndW1lbnRzW2RdO2lmKFcuZGVsZWdhdGVUYXJnZXQ9dGhpcywhKGR0LnByZURpc3BhdGNoJiZkdC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsVyk9PT0hMSkpe2ZvcihOPWYuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLFcsSiksZD0wOyhBPU5bZCsrXSkmJiFXLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihXLmN1cnJlbnRUYXJnZXQ9QS5lbGVtLHY9MDsoST1BLmhhbmRsZXJzW3YrK10pJiYhVy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOykoIVcucm5hbWVzcGFjZXx8SS5uYW1lc3BhY2U9PT0hMXx8Vy5ybmFtZXNwYWNlLnRlc3QoSS5uYW1lc3BhY2UpKSYmKFcuaGFuZGxlT2JqPUksVy5kYXRhPUkuZGF0YSx4PSgoZi5ldmVudC5zcGVjaWFsW0kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxJLmhhbmRsZXIpLmFwcGx5KEEuZWxlbSxZKSx4IT09dm9pZCAwJiYoVy5yZXN1bHQ9eCk9PT0hMSYmKFcucHJldmVudERlZmF1bHQoKSxXLnN0b3BQcm9wYWdhdGlvbigpKSk7cmV0dXJuIGR0LnBvc3REaXNwYXRjaCYmZHQucG9zdERpc3BhdGNoLmNhbGwodGhpcyxXKSxXLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGEsZCl7dmFyIHYseCxBLEksTixZPVtdLFc9ZC5kZWxlZ2F0ZUNvdW50LEo9YS50YXJnZXQ7aWYoVyYmSi5ub2RlVHlwZSYmIShhLnR5cGU9PT0iY2xpY2siJiZhLmJ1dHRvbj49MSkpe2Zvcig7SiE9PXRoaXM7Sj1KLnBhcmVudE5vZGV8fHRoaXMpaWYoSi5ub2RlVHlwZT09PTEmJiEoYS50eXBlPT09ImNsaWNrIiYmSi5kaXNhYmxlZD09PSEwKSl7Zm9yKEk9W10sTj17fSx2PTA7djxXO3YrKyl4PWRbdl0sQT14LnNlbGVjdG9yKyIgIixOW0FdPT09dm9pZCAwJiYoTltBXT14Lm5lZWRzQ29udGV4dD9mKEEsdGhpcykuaW5kZXgoSik+LTE6Zi5maW5kKEEsdGhpcyxudWxsLFtKXSkubGVuZ3RoKSxOW0FdJiZJLnB1c2goeCk7SS5sZW5ndGgmJlkucHVzaCh7ZWxlbTpKLGhhbmRsZXJzOkl9KX19cmV0dXJuIEo9dGhpcyxXPGQubGVuZ3RoJiZZLnB1c2goe2VsZW06SixoYW5kbGVyczpkLnNsaWNlKFcpfSksWX0sYWRkUHJvcDpmdW5jdGlvbihhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShmLkV2ZW50LnByb3RvdHlwZSxhLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6VChkKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZCh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W2FdfSxzZXQ6ZnVuY3Rpb24odil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dn0pfX0pfSxmaXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbZi5leHBhbmRvXT9hOm5ldyBmLkV2ZW50KGEpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXN8fGE7cmV0dXJuIFdlLnRlc3QoZC50eXBlKSYmZC5jbGljayYmWChkLCJpbnB1dCIpJiZocihkLCJjbGljayIsITApLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGEpe3ZhciBkPXRoaXN8fGE7cmV0dXJuIFdlLnRlc3QoZC50eXBlKSYmZC5jbGljayYmWChkLCJpbnB1dCIpJiZocihkLCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXt2YXIgZD1hLnRhcmdldDtyZXR1cm4gV2UudGVzdChkLnR5cGUpJiZkLmNsaWNrJiZYKGQsImlucHV0IikmJm10LmdldChkLCJjbGljayIpfHxYKGQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGEpe2EucmVzdWx0IT09dm9pZCAwJiZhLm9yaWdpbmFsRXZlbnQmJihhLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9YS5yZXN1bHQpfX19fTtmdW5jdGlvbiBocihhLGQsdil7aWYoIXYpe210LmdldChhLGQpPT09dm9pZCAwJiZmLmV2ZW50LmFkZChhLGQsa24pO3JldHVybn1tdC5zZXQoYSxkLCExKSxmLmV2ZW50LmFkZChhLGQse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKHgpe3ZhciBBLEk9bXQuZ2V0KHRoaXMsZCk7aWYoeC5pc1RyaWdnZXImMSYmdGhpc1tkXSl7aWYoSSkoZi5ldmVudC5zcGVjaWFsW2RdfHx7fSkuZGVsZWdhdGVUeXBlJiZ4LnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoST1zLmNhbGwoYXJndW1lbnRzKSxtdC5zZXQodGhpcyxkLEkpLHRoaXNbZF0oKSxBPW10LmdldCh0aGlzLGQpLG10LnNldCh0aGlzLGQsITEpLEkhPT1BKXJldHVybiB4LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHgucHJldmVudERlZmF1bHQoKSxBfWVsc2UgSSYmKG10LnNldCh0aGlzLGQsZi5ldmVudC50cmlnZ2VyKElbMF0sSS5zbGljZSgxKSx0aGlzKSkseC5zdG9wUHJvcGFnYXRpb24oKSx4LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPWtuKX19KX1mLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGEsZCx2KXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLHYpfSxmLkV2ZW50PWZ1bmN0aW9uKGEsZCl7aWYoISh0aGlzIGluc3RhbmNlb2YgZi5FdmVudCkpcmV0dXJuIG5ldyBmLkV2ZW50KGEsZCk7YSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8YS5kZWZhdWx0UHJldmVudGVkPT09dm9pZCAwJiZhLnJldHVyblZhbHVlPT09ITE/a246U24sdGhpcy50YXJnZXQ9YS50YXJnZXQmJmEudGFyZ2V0Lm5vZGVUeXBlPT09Mz9hLnRhcmdldC5wYXJlbnROb2RlOmEudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1hLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWEsZCYmZi5leHRlbmQodGhpcyxkKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpmLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpTbixpc1Byb3BhZ2F0aW9uU3RvcHBlZDpTbixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpTbixpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1rbixhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1rbixhJiYhdGhpcy5pc1NpbXVsYXRlZCYmYS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9a24sYSYmIXRoaXMuaXNTaW11bGF0ZWQmJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LGYuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxjaGFyOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ITB9LGYuZXZlbnQuYWRkUHJvcCksZi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGQpe2Z1bmN0aW9uIHYoeCl7aWYoYy5kb2N1bWVudE1vZGUpe3ZhciBBPW10LmdldCh0aGlzLCJoYW5kbGUiKSxJPWYuZXZlbnQuZml4KHgpO0kudHlwZT14LnR5cGU9PT0iZm9jdXNpbiI/ImZvY3VzIjoiYmx1ciIsSS5pc1NpbXVsYXRlZD0hMCxBKHgpLEkudGFyZ2V0PT09SS5jdXJyZW50VGFyZ2V0JiZBKEkpfWVsc2UgZi5ldmVudC5zaW11bGF0ZShkLHgudGFyZ2V0LGYuZXZlbnQuZml4KHgpKX1mLmV2ZW50LnNwZWNpYWxbYV09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHg7aWYoaHIodGhpcyxhLCEwKSxjLmRvY3VtZW50TW9kZSl4PW10LmdldCh0aGlzLGQpLHh8fHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihkLHYpLG10LnNldCh0aGlzLGQsKHh8fDApKzEpO2Vsc2UgcmV0dXJuITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gaHIodGhpcyxhKSwhMH0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgeDtpZihjLmRvY3VtZW50TW9kZSl4PW10LmdldCh0aGlzLGQpLTEseD9tdC5zZXQodGhpcyxkLHgpOih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx2KSxtdC5yZW1vdmUodGhpcyxkKSk7ZWxzZSByZXR1cm4hMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oeCl7cmV0dXJuIG10LmdldCh4LnRhcmdldCxhKX0sZGVsZWdhdGVUeXBlOmR9LGYuZXZlbnQuc3BlY2lhbFtkXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgeD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMuZG9jdW1lbnR8fHRoaXMsQT1jLmRvY3VtZW50TW9kZT90aGlzOngsST1tdC5nZXQoQSxkKTtJfHwoYy5kb2N1bWVudE1vZGU/dGhpcy5hZGRFdmVudExpc3RlbmVyKGQsdik6eC5hZGRFdmVudExpc3RlbmVyKGEsdiwhMCkpLG10LnNldChBLGQsKEl8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciB4PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcy5kb2N1bWVudHx8dGhpcyxBPWMuZG9jdW1lbnRNb2RlP3RoaXM6eCxJPW10LmdldChBLGQpLTE7ST9tdC5zZXQoQSxkLEkpOihjLmRvY3VtZW50TW9kZT90aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCx2KTp4LnJlbW92ZUV2ZW50TGlzdGVuZXIoYSx2LCEwKSxtdC5yZW1vdmUoQSxkKSl9fX0pLGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxkKXtmLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpkLGJpbmRUeXBlOmQsaGFuZGxlOmZ1bmN0aW9uKHYpe3ZhciB4LEE9dGhpcyxJPXYucmVsYXRlZFRhcmdldCxOPXYuaGFuZGxlT2JqO3JldHVybighSXx8SSE9PUEmJiFmLmNvbnRhaW5zKEEsSSkpJiYodi50eXBlPU4ub3JpZ1R5cGUseD1OLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHYudHlwZT1kKSx4fX19KSxmLmZuLmV4dGVuZCh7b246ZnVuY3Rpb24oYSxkLHYseCl7cmV0dXJuIFlyKHRoaXMsYSxkLHYseCl9LG9uZTpmdW5jdGlvbihhLGQsdix4KXtyZXR1cm4gWXIodGhpcyxhLGQsdix4LDEpfSxvZmY6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEE7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmopcmV0dXJuIHg9YS5oYW5kbGVPYmosZihhLmRlbGVnYXRlVGFyZ2V0KS5vZmYoeC5uYW1lc3BhY2U/eC5vcmlnVHlwZSsiLiIreC5uYW1lc3BhY2U6eC5vcmlnVHlwZSx4LnNlbGVjdG9yLHguaGFuZGxlciksdGhpcztpZih0eXBlb2YgYT09Im9iamVjdCIpe2ZvcihBIGluIGEpdGhpcy5vZmYoQSxkLGFbQV0pO3JldHVybiB0aGlzfXJldHVybihkPT09ITF8fHR5cGVvZiBkPT0iZnVuY3Rpb24iKSYmKHY9ZCxkPXZvaWQgMCksdj09PSExJiYodj1TbiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLHYsZCl9KX19KTt2YXIgYW89LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksc289L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb289L15ccyo8IVxbQ0RBVEFcW3xcXVxdPlxzKiQvZztmdW5jdGlvbiBvYShhLGQpe3JldHVybiBYKGEsInRhYmxlIikmJlgoZC5ub2RlVHlwZSE9PTExP2Q6ZC5maXJzdENoaWxkLCJ0ciIpJiZmKGEpLmNoaWxkcmVuKCJ0Ym9keSIpWzBdfHxhfWZ1bmN0aW9uIGxvKGEpe3JldHVybiBhLnR5cGU9KGEuZ2V0QXR0cmlidXRlKCJ0eXBlIikhPT1udWxsKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24gdW8oYSl7cmV0dXJuKGEudHlwZXx8IiIpLnNsaWNlKDAsNSk9PT0idHJ1ZS8iP2EudHlwZT1hLnR5cGUuc2xpY2UoNSk6YS5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSxhfWZ1bmN0aW9uIGxhKGEsZCl7dmFyIHYseCxBLEksTixZLFc7aWYoZC5ub2RlVHlwZT09PTEpe2lmKG10Lmhhc0RhdGEoYSkmJihJPW10LmdldChhKSxXPUkuZXZlbnRzLFcpKXttdC5yZW1vdmUoZCwiaGFuZGxlIGV2ZW50cyIpO2ZvcihBIGluIFcpZm9yKHY9MCx4PVdbQV0ubGVuZ3RoO3Y8eDt2KyspZi5ldmVudC5hZGQoZCxBLFdbQV1bdl0pfXp0Lmhhc0RhdGEoYSkmJihOPXp0LmFjY2VzcyhhKSxZPWYuZXh0ZW5kKHt9LE4pLHp0LnNldChkLFkpKX19ZnVuY3Rpb24gY28oYSxkKXt2YXIgdj1kLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7dj09PSJpbnB1dCImJldlLnRlc3QoYS50eXBlKT9kLmNoZWNrZWQ9YS5jaGVja2VkOih2PT09ImlucHV0Inx8dj09PSJ0ZXh0YXJlYSIpJiYoZC5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIERuKGEsZCx2LHgpe2Q9aShkKTt2YXIgQSxJLE4sWSxXLEosZHQ9MCxmdD1hLmxlbmd0aCxzdD1mdC0xLHl0PWRbMF0sT3Q9VCh5dCk7aWYoT3R8fGZ0PjEmJnR5cGVvZiB5dD09InN0cmluZyImJiF5LmNoZWNrQ2xvbmUmJnNvLnRlc3QoeXQpKXJldHVybiBhLmVhY2goZnVuY3Rpb24oWHQpe3ZhciBWdD1hLmVxKFh0KTtPdCYmKGRbMF09eXQuY2FsbCh0aGlzLFh0LFZ0Lmh0bWwoKSkpLERuKFZ0LGQsdix4KX0pO2lmKGZ0JiYoQT1hYShkLGFbMF0ub3duZXJEb2N1bWVudCwhMSxhLHgpLEk9QS5maXJzdENoaWxkLEEuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiYoQT1JKSxJfHx4KSl7Zm9yKE49Zi5tYXAoeWUoQSwic2NyaXB0IiksbG8pLFk9Ti5sZW5ndGg7ZHQ8ZnQ7ZHQrKylXPUEsZHQhPT1zdCYmKFc9Zi5jbG9uZShXLCEwLCEwKSxZJiZmLm1lcmdlKE4seWUoVywic2NyaXB0IikpKSx2LmNhbGwoYVtkdF0sVyxkdCk7aWYoWSlmb3IoSj1OW04ubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsZi5tYXAoTix1byksZHQ9MDtkdDxZO2R0KyspVz1OW2R0XSxpYS50ZXN0KFcudHlwZXx8IiIpJiYhbXQuYWNjZXNzKFcsImdsb2JhbEV2YWwiKSYmZi5jb250YWlucyhKLFcpJiYoVy5zcmMmJihXLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpIT09Im1vZHVsZSI/Zi5fZXZhbFVybCYmIVcubm9Nb2R1bGUmJmYuX2V2YWxVcmwoVy5zcmMse25vbmNlOlcubm9uY2V8fFcuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxKKTpoKFcudGV4dENvbnRlbnQucmVwbGFjZShvbywiIiksVyxKKSl9cmV0dXJuIGF9ZnVuY3Rpb24gZGEoYSxkLHYpe2Zvcih2YXIgeCxBPWQ/Zi5maWx0ZXIoZCxhKTphLEk9MDsoeD1BW0ldKSE9bnVsbDtJKyspIXYmJngubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YSh5ZSh4KSkseC5wYXJlbnROb2RlJiYodiYmZmUoeCkmJlhyKHllKHgsInNjcmlwdCIpKSx4LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoeCkpO3JldHVybiBhfWYuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxjbG9uZTpmdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJLE4sWT1hLmNsb25lTm9kZSghMCksVz1mZShhKTtpZigheS5ub0Nsb25lQ2hlY2tlZCYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSlmb3IoTj15ZShZKSxJPXllKGEpLHg9MCxBPUkubGVuZ3RoO3g8QTt4KyspY28oSVt4XSxOW3hdKTtpZihkKWlmKHYpZm9yKEk9SXx8eWUoYSksTj1OfHx5ZShZKSx4PTAsQT1JLmxlbmd0aDt4PEE7eCsrKWxhKElbeF0sTlt4XSk7ZWxzZSBsYShhLFkpO3JldHVybiBOPXllKFksInNjcmlwdCIpLE4ubGVuZ3RoPjAmJlhyKE4sIVcmJnllKGEsInNjcmlwdCIpKSxZfSxjbGVhbkRhdGE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBkLHYseCxBPWYuZXZlbnQuc3BlY2lhbCxJPTA7KHY9YVtJXSkhPT12b2lkIDA7SSsrKWlmKEN0KHYpKXtpZihkPXZbbXQuZXhwYW5kb10pe2lmKGQuZXZlbnRzKWZvcih4IGluIGQuZXZlbnRzKUFbeF0/Zi5ldmVudC5yZW1vdmUodix4KTpmLnJlbW92ZUV2ZW50KHYseCxkLmhhbmRsZSk7dlttdC5leHBhbmRvXT12b2lkIDB9dlt6dC5leHBhbmRvXSYmKHZbenQuZXhwYW5kb109dm9pZCAwKX19fSksZi5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gZGEodGhpcyxhLCEwKX0scmVtb3ZlOmZ1bmN0aW9uKGEpe3JldHVybiBkYSh0aGlzLGEpfSx0ZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oZCl7cmV0dXJuIGQ9PT12b2lkIDA/Zi50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7KHRoaXMubm9kZVR5cGU9PT0xfHx0aGlzLm5vZGVUeXBlPT09MTF8fHRoaXMubm9kZVR5cGU9PT05KSYmKHRoaXMudGV4dENvbnRlbnQ9ZCl9KX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gRG4odGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlVHlwZT09PTF8fHRoaXMubm9kZVR5cGU9PT0xMXx8dGhpcy5ub2RlVHlwZT09PTkpe3ZhciBkPW9hKHRoaXMsYSk7ZC5hcHBlbmRDaGlsZChhKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXtpZih0aGlzLm5vZGVUeXBlPT09MXx8dGhpcy5ub2RlVHlwZT09PTExfHx0aGlzLm5vZGVUeXBlPT09OSl7dmFyIGQ9b2EodGhpcyxhKTtkLmluc2VydEJlZm9yZShhLGQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pfSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgYSxkPTA7KGE9dGhpc1tkXSkhPW51bGw7ZCsrKWEubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEoeWUoYSwhMSkpLGEudGV4dENvbnRlbnQ9IiIpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbihhLGQpe3JldHVybiBhPWE/PyExLGQ9ZD8/YSx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxkKX0pfSxodG1sOmZ1bmN0aW9uKGEpe3JldHVybiBLKHRoaXMsZnVuY3Rpb24oZCl7dmFyIHY9dGhpc1swXXx8e30seD0wLEE9dGhpcy5sZW5ndGg7aWYoZD09PXZvaWQgMCYmdi5ub2RlVHlwZT09PTEpcmV0dXJuIHYuaW5uZXJIVE1MO2lmKHR5cGVvZiBkPT0ic3RyaW5nIiYmIWFvLnRlc3QoZCkmJiFJZVsocmEuZXhlYyhkKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2Q9Zi5odG1sUHJlZmlsdGVyKGQpO3RyeXtmb3IoO3g8QTt4Kyspdj10aGlzW3hdfHx7fSx2Lm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHllKHYsITEpKSx2LmlubmVySFRNTD1kKTt2PTB9Y2F0Y2h7fX12JiZ0aGlzLmVtcHR5KCkuYXBwZW5kKGQpfSxudWxsLGEsYXJndW1lbnRzLmxlbmd0aCl9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKCl7dmFyIGE9W107cmV0dXJuIERuKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGQpe3ZhciB2PXRoaXMucGFyZW50Tm9kZTtmLmluQXJyYXkodGhpcyxhKTwwJiYoZi5jbGVhbkRhdGEoeWUodGhpcykpLHYmJnYucmVwbGFjZUNoaWxkKGQsdGhpcykpfSxhKX19KSxmLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihhLGQpe2YuZm5bYV09ZnVuY3Rpb24odil7Zm9yKHZhciB4LEE9W10sST1mKHYpLE49SS5sZW5ndGgtMSxZPTA7WTw9TjtZKyspeD1ZPT09Tj90aGlzOnRoaXMuY2xvbmUoITApLGYoSVtZXSlbZF0oeCksby5hcHBseShBLHguZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhBKX19KTt2YXIgJHI9bmV3IFJlZ0V4cCgiXigiK3RuKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksWnI9L14tLS8scHI9ZnVuY3Rpb24oYSl7dmFyIGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybighZHx8IWQub3BlbmVyKSYmKGQ9dCksZC5nZXRDb21wdXRlZFN0eWxlKGEpfSx1YT1mdW5jdGlvbihhLGQsdil7dmFyIHgsQSxJPXt9O2ZvcihBIGluIGQpSVtBXT1hLnN0eWxlW0FdLGEuc3R5bGVbQV09ZFtBXTt4PXYuY2FsbChhKTtmb3IoQSBpbiBkKWEuc3R5bGVbQV09SVtBXTtyZXR1cm4geH0sZm89bmV3IFJlZ0V4cChnZS5qb2luKCJ8IiksImkiKTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7aWYoSil7Vy5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowIixKLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94O292ZXJmbG93OnNjcm9sbDttYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O3dpZHRoOjYwJTt0b3A6MSUiLGplLmFwcGVuZENoaWxkKFcpLmFwcGVuZENoaWxkKEopO3ZhciBkdD10LmdldENvbXB1dGVkU3R5bGUoSik7dj1kdC50b3AhPT0iMSUiLFk9ZChkdC5tYXJnaW5MZWZ0KT09PTEyLEouc3R5bGUucmlnaHQ9IjYwJSIsST1kKGR0LnJpZ2h0KT09PTM2LHg9ZChkdC53aWR0aCk9PT0zNixKLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsQT1kKEoub2Zmc2V0V2lkdGgvMyk9PT0xMixqZS5yZW1vdmVDaGlsZChXKSxKPW51bGx9fWZ1bmN0aW9uIGQoZHQpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZHQpKX12YXIgdix4LEEsSSxOLFksVz1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLEo9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTtKLnN0eWxlJiYoSi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLEouY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix5LmNsZWFyQ2xvbmVTdHlsZT1KLnN0eWxlLmJhY2tncm91bmRDbGlwPT09ImNvbnRlbnQtYm94IixmLmV4dGVuZCh5LHtib3hTaXppbmdSZWxpYWJsZTpmdW5jdGlvbigpe3JldHVybiBhKCkseH0scGl4ZWxCb3hTdHlsZXM6ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLEl9LHBpeGVsUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYSgpLHZ9LHJlbGlhYmxlTWFyZ2luTGVmdDpmdW5jdGlvbigpe3JldHVybiBhKCksWX0sc2Nyb2xsYm94U2l6ZTpmdW5jdGlvbigpe3JldHVybiBhKCksQX0scmVsaWFibGVUckRpbWVuc2lvbnM6ZnVuY3Rpb24oKXt2YXIgZHQsZnQsc3QseXQ7cmV0dXJuIE49PW51bGwmJihkdD1jLmNyZWF0ZUVsZW1lbnQoInRhYmxlIiksZnQ9Yy5jcmVhdGVFbGVtZW50KCJ0ciIpLHN0PWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZHQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGUiLGZ0LnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Y29udGVudC1ib3g7Ym9yZGVyOjFweCBzb2xpZCIsZnQuc3R5bGUuaGVpZ2h0PSIxcHgiLHN0LnN0eWxlLmhlaWdodD0iOXB4IixzdC5zdHlsZS5kaXNwbGF5PSJibG9jayIsamUuYXBwZW5kQ2hpbGQoZHQpLmFwcGVuZENoaWxkKGZ0KS5hcHBlbmRDaGlsZChzdCkseXQ9dC5nZXRDb21wdXRlZFN0eWxlKGZ0KSxOPXBhcnNlSW50KHl0LmhlaWdodCwxMCkrcGFyc2VJbnQoeXQuYm9yZGVyVG9wV2lkdGgsMTApK3BhcnNlSW50KHl0LmJvcmRlckJvdHRvbVdpZHRoLDEwKT09PWZ0Lm9mZnNldEhlaWdodCxqZS5yZW1vdmVDaGlsZChkdCkpLE59fSkpfSkoKTtmdW5jdGlvbiBVbihhLGQsdil7dmFyIHgsQSxJLE4sWT1aci50ZXN0KGQpLFc9YS5zdHlsZTtyZXR1cm4gdj12fHxwcihhKSx2JiYoTj12LmdldFByb3BlcnR5VmFsdWUoZCl8fHZbZF0sWSYmTiYmKE49Ti5yZXBsYWNlKGssIiQxIil8fHZvaWQgMCksTj09PSIiJiYhZmUoYSkmJihOPWYuc3R5bGUoYSxkKSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmJHIudGVzdChOKSYmZm8udGVzdChkKSYmKHg9Vy53aWR0aCxBPVcubWluV2lkdGgsST1XLm1heFdpZHRoLFcubWluV2lkdGg9Vy5tYXhXaWR0aD1XLndpZHRoPU4sTj12LndpZHRoLFcud2lkdGg9eCxXLm1pbldpZHRoPUEsVy5tYXhXaWR0aD1JKSksTiE9PXZvaWQgMD9OKyIiOk59ZnVuY3Rpb24gY2EoYSxkKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoYSgpKXtkZWxldGUgdGhpcy5nZXQ7cmV0dXJufXJldHVybih0aGlzLmdldD1kKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX12YXIgZmE9WyJXZWJraXQiLCJNb3oiLCJtcyJdLGhhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscGE9e307ZnVuY3Rpb24gaG8oYSl7Zm9yKHZhciBkPWFbMF0udG9VcHBlckNhc2UoKSthLnNsaWNlKDEpLHY9ZmEubGVuZ3RoO3YtLTspaWYoYT1mYVt2XStkLGEgaW4gaGEpcmV0dXJuIGF9ZnVuY3Rpb24gS3IoYSl7dmFyIGQ9Zi5jc3NQcm9wc1thXXx8cGFbYV07cmV0dXJuIGR8fChhIGluIGhhP2E6cGFbYV09aG8oYSl8fGEpfXZhciBwbz0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sYm89e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiBtYShhLGQsdil7dmFyIHg9ZWUuZXhlYyhkKTtyZXR1cm4geD9NYXRoLm1heCgwLHhbMl0tKHZ8fDApKSsoeFszXXx8InB4Iik6ZH1mdW5jdGlvbiBKcihhLGQsdix4LEEsSSl7dmFyIE49ZD09PSJ3aWR0aCI/MTowLFk9MCxXPTAsSj0wO2lmKHY9PT0oeD8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7Tjw0O04rPTIpdj09PSJtYXJnaW4iJiYoSis9Zi5jc3MoYSx2K2dlW05dLCEwLEEpKSx4Pyh2PT09ImNvbnRlbnQiJiYoVy09Zi5jc3MoYSwicGFkZGluZyIrZ2VbTl0sITAsQSkpLHYhPT0ibWFyZ2luIiYmKFctPWYuY3NzKGEsImJvcmRlciIrZ2VbTl0rIldpZHRoIiwhMCxBKSkpOihXKz1mLmNzcyhhLCJwYWRkaW5nIitnZVtOXSwhMCxBKSx2IT09InBhZGRpbmciP1crPWYuY3NzKGEsImJvcmRlciIrZ2VbTl0rIldpZHRoIiwhMCxBKTpZKz1mLmNzcyhhLCJib3JkZXIiK2dlW05dKyJXaWR0aCIsITAsQSkpO3JldHVybiF4JiZJPj0wJiYoVys9TWF0aC5tYXgoMCxNYXRoLmNlaWwoYVsib2Zmc2V0IitkWzBdLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKV0tSS1XLVktLjUpKXx8MCksVytKfWZ1bmN0aW9uIHZhKGEsZCx2KXt2YXIgeD1wcihhKSxBPSF5LmJveFNpemluZ1JlbGlhYmxlKCl8fHYsST1BJiZmLmNzcyhhLCJib3hTaXppbmciLCExLHgpPT09ImJvcmRlci1ib3giLE49SSxZPVVuKGEsZCx4KSxXPSJvZmZzZXQiK2RbMF0udG9VcHBlckNhc2UoKStkLnNsaWNlKDEpO2lmKCRyLnRlc3QoWSkpe2lmKCF2KXJldHVybiBZO1k9ImF1dG8ifXJldHVybigheS5ib3hTaXppbmdSZWxpYWJsZSgpJiZJfHwheS5yZWxpYWJsZVRyRGltZW5zaW9ucygpJiZYKGEsInRyIil8fFk9PT0iYXV0byJ8fCFwYXJzZUZsb2F0KFkpJiZmLmNzcyhhLCJkaXNwbGF5IiwhMSx4KT09PSJpbmxpbmUiKSYmYS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKEk9Zi5jc3MoYSwiYm94U2l6aW5nIiwhMSx4KT09PSJib3JkZXItYm94IixOPVcgaW4gYSxOJiYoWT1hW1ddKSksWT1wYXJzZUZsb2F0KFkpfHwwLFkrSnIoYSxkLHZ8fChJPyJib3JkZXIiOiJjb250ZW50IiksTix4LFkpKyJweCJ9Zi5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oYSxkKXtpZihkKXt2YXIgdj1VbihhLCJvcGFjaXR5Iik7cmV0dXJuIHY9PT0iIj8iMSI6dn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxhc3BlY3RSYXRpbzohMCxib3JkZXJJbWFnZVNsaWNlOiEwLGNvbHVtbkNvdW50OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxncmlkQXJlYTohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGdyaWRSb3c6ITAsZ3JpZFJvd0VuZDohMCxncmlkUm93U3RhcnQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsc2NhbGU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGEsZCx2LHgpe2lmKCEoIWF8fGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWEuc3R5bGUpKXt2YXIgQSxJLE4sWT1ndChkKSxXPVpyLnRlc3QoZCksSj1hLnN0eWxlO2lmKFd8fChkPUtyKFkpKSxOPWYuY3NzSG9va3NbZF18fGYuY3NzSG9va3NbWV0sdiE9PXZvaWQgMCl7aWYoST10eXBlb2YgdixJPT09InN0cmluZyImJihBPWVlLmV4ZWModikpJiZBWzFdJiYodj11cihhLGQsQSksST0ibnVtYmVyIiksdj09bnVsbHx8diE9PXYpcmV0dXJuO0k9PT0ibnVtYmVyIiYmIVcmJih2Kz1BJiZBWzNdfHwoZi5jc3NOdW1iZXJbWV0/IiI6InB4IikpLCF5LmNsZWFyQ2xvbmVTdHlsZSYmdj09PSIiJiZkLmluZGV4T2YoImJhY2tncm91bmQiKT09PTAmJihKW2RdPSJpbmhlcml0IiksKCFOfHwhKCJzZXQiaW4gTil8fCh2PU4uc2V0KGEsdix4KSkhPT12b2lkIDApJiYoVz9KLnNldFByb3BlcnR5KGQsdik6SltkXT12KX1lbHNlIHJldHVybiBOJiYiZ2V0ImluIE4mJihBPU4uZ2V0KGEsITEseCkpIT09dm9pZCAwP0E6SltkXX19LGNzczpmdW5jdGlvbihhLGQsdix4KXt2YXIgQSxJLE4sWT1ndChkKSxXPVpyLnRlc3QoZCk7cmV0dXJuIFd8fChkPUtyKFkpKSxOPWYuY3NzSG9va3NbZF18fGYuY3NzSG9va3NbWV0sTiYmImdldCJpbiBOJiYoQT1OLmdldChhLCEwLHYpKSxBPT09dm9pZCAwJiYoQT1VbihhLGQseCkpLEE9PT0ibm9ybWFsIiYmZCBpbiBiYSYmKEE9YmFbZF0pLHY9PT0iInx8dj8oST1wYXJzZUZsb2F0KEEpLHY9PT0hMHx8aXNGaW5pdGUoSSk/SXx8MDpBKTpBfX0pLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxkKXtmLmNzc0hvb2tzW2RdPXtnZXQ6ZnVuY3Rpb24odix4LEEpe2lmKHgpcmV0dXJuIHBvLnRlc3QoZi5jc3ModiwiZGlzcGxheSIpKSYmKCF2LmdldENsaWVudFJlY3RzKCkubGVuZ3RofHwhdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk/dWEodixibyxmdW5jdGlvbigpe3JldHVybiB2YSh2LGQsQSl9KTp2YSh2LGQsQSl9LHNldDpmdW5jdGlvbih2LHgsQSl7dmFyIEksTj1wcih2KSxZPSF5LnNjcm9sbGJveFNpemUoKSYmTi5wb3NpdGlvbj09PSJhYnNvbHV0ZSIsVz1ZfHxBLEo9VyYmZi5jc3ModiwiYm94U2l6aW5nIiwhMSxOKT09PSJib3JkZXItYm94IixkdD1BP0pyKHYsZCxBLEosTik6MDtyZXR1cm4gSiYmWSYmKGR0LT1NYXRoLmNlaWwodlsib2Zmc2V0IitkWzBdLnRvVXBwZXJDYXNlKCkrZC5zbGljZSgxKV0tcGFyc2VGbG9hdChOW2RdKS1Kcih2LGQsImJvcmRlciIsITEsTiktLjUpKSxkdCYmKEk9ZWUuZXhlYyh4KSkmJihJWzNdfHwicHgiKSE9PSJweCImJih2LnN0eWxlW2RdPXgseD1mLmNzcyh2LGQpKSxtYSh2LHgsZHQpfX19KSxmLmNzc0hvb2tzLm1hcmdpbkxlZnQ9Y2EoeS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oYSxkKXtpZihkKXJldHVybihwYXJzZUZsb2F0KFVuKGEsIm1hcmdpbkxlZnQiKSl8fGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC11YShhLHttYXJnaW5MZWZ0OjB9LGZ1bmN0aW9uKCl7cmV0dXJuIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0pKSsicHgifSksZi5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oYSxkKXtmLmNzc0hvb2tzW2ErZF09e2V4cGFuZDpmdW5jdGlvbih2KXtmb3IodmFyIHg9MCxBPXt9LEk9dHlwZW9mIHY9PSJzdHJpbmciP3Yuc3BsaXQoIiAiKTpbdl07eDw0O3grKylBW2ErZ2VbeF0rZF09SVt4XXx8SVt4LTJdfHxJWzBdO3JldHVybiBBfX0sYSE9PSJtYXJnaW4iJiYoZi5jc3NIb29rc1thK2RdLnNldD1tYSl9KSxmLmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIEsodGhpcyxmdW5jdGlvbih2LHgsQSl7dmFyIEksTixZPXt9LFc9MDtpZihBcnJheS5pc0FycmF5KHgpKXtmb3IoST1wcih2KSxOPXgubGVuZ3RoO1c8TjtXKyspWVt4W1ddXT1mLmNzcyh2LHhbV10sITEsSSk7cmV0dXJuIFl9cmV0dXJuIEEhPT12b2lkIDA/Zi5zdHlsZSh2LHgsQSk6Zi5jc3Modix4KX0sYSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9fSk7ZnVuY3Rpb24gd2UoYSxkLHYseCxBKXtyZXR1cm4gbmV3IHdlLnByb3RvdHlwZS5pbml0KGEsZCx2LHgsQSl9Zi5Ud2Vlbj13ZSx3ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOndlLGluaXQ6ZnVuY3Rpb24oYSxkLHYseCxBLEkpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD12LHRoaXMuZWFzaW5nPUF8fGYuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz1kLHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD14LHRoaXMudW5pdD1JfHwoZi5jc3NOdW1iZXJbdl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBhPXdlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBhJiZhLmdldD9hLmdldCh0aGlzKTp3ZS5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oYSl7dmFyIGQsdj13ZS5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPWQ9Zi5lYXNpbmdbdGhpcy5lYXNpbmddKGEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmEsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6dGhpcy5wb3M9ZD1hLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpkK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLHYmJnYuc2V0P3Yuc2V0KHRoaXMpOndlLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LHdlLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT13ZS5wcm90b3R5cGUsd2UucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkO3JldHVybiBhLmVsZW0ubm9kZVR5cGUhPT0xfHxhLmVsZW1bYS5wcm9wXSE9bnVsbCYmYS5lbGVtLnN0eWxlW2EucHJvcF09PW51bGw/YS5lbGVtW2EucHJvcF06KGQ9Zi5jc3MoYS5lbGVtLGEucHJvcCwiIiksIWR8fGQ9PT0iYXV0byI/MDpkKX0sc2V0OmZ1bmN0aW9uKGEpe2YuZnguc3RlcFthLnByb3BdP2YuZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5ub2RlVHlwZT09PTEmJihmLmNzc0hvb2tzW2EucHJvcF18fGEuZWxlbS5zdHlsZVtLcihhLnByb3ApXSE9bnVsbCk/Zi5zdHlsZShhLmVsZW0sYS5wcm9wLGEubm93K2EudW5pdCk6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0sd2UucHJvcEhvb2tzLnNjcm9sbFRvcD13ZS5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGEpe2EuZWxlbS5ub2RlVHlwZSYmYS5lbGVtLnBhcmVudE5vZGUmJihhLmVsZW1bYS5wcm9wXT1hLm5vdyl9fSxmLmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxzd2luZzpmdW5jdGlvbihhKXtyZXR1cm4gLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxmLmZ4PXdlLnByb3RvdHlwZS5pbml0LGYuZnguc3RlcD17fTt2YXIgQW4sYnIsbW89L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLHZvPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gUXIoKXticiYmKGMuaGlkZGVuPT09ITEmJnQucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3QucmVxdWVzdEFuaW1hdGlvbkZyYW1lKFFyKTp0LnNldFRpbWVvdXQoUXIsZi5meC5pbnRlcnZhbCksZi5meC50aWNrKCkpfWZ1bmN0aW9uIGdhKCl7cmV0dXJuIHQuc2V0VGltZW91dChmdW5jdGlvbigpe0FuPXZvaWQgMH0pLEFuPURhdGUubm93KCl9ZnVuY3Rpb24gbXIoYSxkKXt2YXIgdix4PTAsQT17aGVpZ2h0OmF9O2ZvcihkPWQ/MTowO3g8NDt4Kz0yLWQpdj1nZVt4XSxBWyJtYXJnaW4iK3ZdPUFbInBhZGRpbmciK3ZdPWE7cmV0dXJuIGQmJihBLm9wYWNpdHk9QS53aWR0aD1hKSxBfWZ1bmN0aW9uIHlhKGEsZCx2KXtmb3IodmFyIHgsQT0oTWUudHdlZW5lcnNbZF18fFtdKS5jb25jYXQoTWUudHdlZW5lcnNbIioiXSksST0wLE49QS5sZW5ndGg7STxOO0krKylpZih4PUFbSV0uY2FsbCh2LGQsYSkpcmV0dXJuIHh9ZnVuY3Rpb24gZ28oYSxkLHYpe3ZhciB4LEEsSSxOLFksVyxKLGR0LGZ0PSJ3aWR0aCJpbiBkfHwiaGVpZ2h0ImluIGQsc3Q9dGhpcyx5dD17fSxPdD1hLnN0eWxlLFh0PWEubm9kZVR5cGUmJlRuKGEpLFZ0PW10LmdldChhLCJmeHNob3ciKTt2LnF1ZXVlfHwoTj1mLl9xdWV1ZUhvb2tzKGEsImZ4IiksTi51bnF1ZXVlZD09bnVsbCYmKE4udW5xdWV1ZWQ9MCxZPU4uZW1wdHkuZmlyZSxOLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtOLnVucXVldWVkfHxZKCl9KSxOLnVucXVldWVkKyssc3QuYWx3YXlzKGZ1bmN0aW9uKCl7c3QuYWx3YXlzKGZ1bmN0aW9uKCl7Ti51bnF1ZXVlZC0tLGYucXVldWUoYSwiZngiKS5sZW5ndGh8fE4uZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHggaW4gZClpZihBPWRbeF0sbW8udGVzdChBKSl7aWYoZGVsZXRlIGRbeF0sST1JfHxBPT09InRvZ2dsZSIsQT09PShYdD8iaGlkZSI6InNob3ciKSlpZihBPT09InNob3ciJiZWdCYmVnRbeF0hPT12b2lkIDApWHQ9ITA7ZWxzZSBjb250aW51ZTt5dFt4XT1WdCYmVnRbeF18fGYuc3R5bGUoYSx4KX1pZihXPSFmLmlzRW1wdHlPYmplY3QoZCksISghVyYmZi5pc0VtcHR5T2JqZWN0KHl0KSkpe2Z0JiZhLm5vZGVUeXBlPT09MSYmKHYub3ZlcmZsb3c9W090Lm92ZXJmbG93LE90Lm92ZXJmbG93WCxPdC5vdmVyZmxvd1ldLEo9VnQmJlZ0LmRpc3BsYXksSj09bnVsbCYmKEo9bXQuZ2V0KGEsImRpc3BsYXkiKSksZHQ9Zi5jc3MoYSwiZGlzcGxheSIpLGR0PT09Im5vbmUiJiYoSj9kdD1KOihBZShbYV0sITApLEo9YS5zdHlsZS5kaXNwbGF5fHxKLGR0PWYuY3NzKGEsImRpc3BsYXkiKSxBZShbYV0pKSksKGR0PT09ImlubGluZSJ8fGR0PT09ImlubGluZS1ibG9jayImJkohPW51bGwpJiZmLmNzcyhhLCJmbG9hdCIpPT09Im5vbmUiJiYoV3x8KHN0LmRvbmUoZnVuY3Rpb24oKXtPdC5kaXNwbGF5PUp9KSxKPT1udWxsJiYoZHQ9T3QuZGlzcGxheSxKPWR0PT09Im5vbmUiPyIiOmR0KSksT3QuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLHYub3ZlcmZsb3cmJihPdC5vdmVyZmxvdz0iaGlkZGVuIixzdC5hbHdheXMoZnVuY3Rpb24oKXtPdC5vdmVyZmxvdz12Lm92ZXJmbG93WzBdLE90Lm92ZXJmbG93WD12Lm92ZXJmbG93WzFdLE90Lm92ZXJmbG93WT12Lm92ZXJmbG93WzJdfSkpLFc9ITE7Zm9yKHggaW4geXQpV3x8KFZ0PyJoaWRkZW4iaW4gVnQmJihYdD1WdC5oaWRkZW4pOlZ0PW10LmFjY2VzcyhhLCJmeHNob3ciLHtkaXNwbGF5Okp9KSxJJiYoVnQuaGlkZGVuPSFYdCksWHQmJkFlKFthXSwhMCksc3QuZG9uZShmdW5jdGlvbigpe1h0fHxBZShbYV0pLG10LnJlbW92ZShhLCJmeHNob3ciKTtmb3IoeCBpbiB5dClmLnN0eWxlKGEseCx5dFt4XSl9KSksVz15YShYdD9WdFt4XTowLHgsc3QpLHggaW4gVnR8fChWdFt4XT1XLnN0YXJ0LFh0JiYoVy5lbmQ9Vy5zdGFydCxXLnN0YXJ0PTApKX19ZnVuY3Rpb24geW8oYSxkKXt2YXIgdix4LEEsSSxOO2Zvcih2IGluIGEpaWYoeD1ndCh2KSxBPWRbeF0sST1hW3ZdLEFycmF5LmlzQXJyYXkoSSkmJihBPUlbMV0sST1hW3ZdPUlbMF0pLHYhPT14JiYoYVt4XT1JLGRlbGV0ZSBhW3ZdKSxOPWYuY3NzSG9va3NbeF0sTiYmImV4cGFuZCJpbiBOKXtJPU4uZXhwYW5kKEkpLGRlbGV0ZSBhW3hdO2Zvcih2IGluIEkpdiBpbiBhfHwoYVt2XT1JW3ZdLGRbdl09QSl9ZWxzZSBkW3hdPUF9ZnVuY3Rpb24gTWUoYSxkLHYpe3ZhciB4LEEsST0wLE49TWUucHJlZmlsdGVycy5sZW5ndGgsWT1mLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIFcuZWxlbX0pLFc9ZnVuY3Rpb24oKXtpZihBKXJldHVybiExO2Zvcih2YXIgZnQ9QW58fGdhKCksc3Q9TWF0aC5tYXgoMCxKLnN0YXJ0VGltZStKLmR1cmF0aW9uLWZ0KSx5dD1zdC9KLmR1cmF0aW9ufHwwLE90PTEteXQsWHQ9MCxWdD1KLnR3ZWVucy5sZW5ndGg7WHQ8VnQ7WHQrKylKLnR3ZWVuc1tYdF0ucnVuKE90KTtyZXR1cm4gWS5ub3RpZnlXaXRoKGEsW0osT3Qsc3RdKSxPdDwxJiZWdD9zdDooVnR8fFkubm90aWZ5V2l0aChhLFtKLDEsMF0pLFkucmVzb2x2ZVdpdGgoYSxbSl0pLCExKX0sSj1ZLnByb21pc2Uoe2VsZW06YSxwcm9wczpmLmV4dGVuZCh7fSxkKSxvcHRzOmYuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzpmLmVhc2luZy5fZGVmYXVsdH0sdiksb3JpZ2luYWxQcm9wZXJ0aWVzOmQsb3JpZ2luYWxPcHRpb25zOnYsc3RhcnRUaW1lOkFufHxnYSgpLGR1cmF0aW9uOnYuZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKGZ0LHN0KXt2YXIgeXQ9Zi5Ud2VlbihhLEoub3B0cyxmdCxzdCxKLm9wdHMuc3BlY2lhbEVhc2luZ1tmdF18fEoub3B0cy5lYXNpbmcpO3JldHVybiBKLnR3ZWVucy5wdXNoKHl0KSx5dH0sc3RvcDpmdW5jdGlvbihmdCl7dmFyIHN0PTAseXQ9ZnQ/Si50d2VlbnMubGVuZ3RoOjA7aWYoQSlyZXR1cm4gdGhpcztmb3IoQT0hMDtzdDx5dDtzdCsrKUoudHdlZW5zW3N0XS5ydW4oMSk7cmV0dXJuIGZ0PyhZLm5vdGlmeVdpdGgoYSxbSiwxLDBdKSxZLnJlc29sdmVXaXRoKGEsW0osZnRdKSk6WS5yZWplY3RXaXRoKGEsW0osZnRdKSx0aGlzfX0pLGR0PUoucHJvcHM7Zm9yKHlvKGR0LEoub3B0cy5zcGVjaWFsRWFzaW5nKTtJPE47SSsrKWlmKHg9TWUucHJlZmlsdGVyc1tJXS5jYWxsKEosYSxkdCxKLm9wdHMpLHgpcmV0dXJuIFQoeC5zdG9wKSYmKGYuX3F1ZXVlSG9va3MoSi5lbGVtLEoub3B0cy5xdWV1ZSkuc3RvcD14LnN0b3AuYmluZCh4KSkseDtyZXR1cm4gZi5tYXAoZHQseWEsSiksVChKLm9wdHMuc3RhcnQpJiZKLm9wdHMuc3RhcnQuY2FsbChhLEopLEoucHJvZ3Jlc3MoSi5vcHRzLnByb2dyZXNzKS5kb25lKEoub3B0cy5kb25lLEoub3B0cy5jb21wbGV0ZSkuZmFpbChKLm9wdHMuZmFpbCkuYWx3YXlzKEoub3B0cy5hbHdheXMpLGYuZngudGltZXIoZi5leHRlbmQoVyx7ZWxlbTphLGFuaW06SixxdWV1ZTpKLm9wdHMucXVldWV9KSksSn1mLkFuaW1hdGlvbj1mLmV4dGVuZChNZSx7dHdlZW5lcnM6eyIqIjpbZnVuY3Rpb24oYSxkKXt2YXIgdj10aGlzLmNyZWF0ZVR3ZWVuKGEsZCk7cmV0dXJuIHVyKHYuZWxlbSxhLGVlLmV4ZWMoZCksdiksdn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGEsZCl7VChhKT8oZD1hLGE9WyIqIl0pOmE9YS5tYXRjaChCdCk7Zm9yKHZhciB2LHg9MCxBPWEubGVuZ3RoO3g8QTt4Kyspdj1hW3hdLE1lLnR3ZWVuZXJzW3ZdPU1lLnR3ZWVuZXJzW3ZdfHxbXSxNZS50d2VlbmVyc1t2XS51bnNoaWZ0KGQpfSxwcmVmaWx0ZXJzOltnb10scHJlZmlsdGVyOmZ1bmN0aW9uKGEsZCl7ZD9NZS5wcmVmaWx0ZXJzLnVuc2hpZnQoYSk6TWUucHJlZmlsdGVycy5wdXNoKGEpfX0pLGYuc3BlZWQ9ZnVuY3Rpb24oYSxkLHYpe3ZhciB4PWEmJnR5cGVvZiBhPT0ib2JqZWN0Ij9mLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6dnx8IXYmJmR8fFQoYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6diYmZHx8ZCYmIVQoZCkmJmR9O3JldHVybiBmLmZ4Lm9mZj94LmR1cmF0aW9uPTA6dHlwZW9mIHguZHVyYXRpb24hPSJudW1iZXIiJiYoeC5kdXJhdGlvbiBpbiBmLmZ4LnNwZWVkcz94LmR1cmF0aW9uPWYuZnguc3BlZWRzW3guZHVyYXRpb25dOnguZHVyYXRpb249Zi5meC5zcGVlZHMuX2RlZmF1bHQpLCh4LnF1ZXVlPT1udWxsfHx4LnF1ZXVlPT09ITApJiYoeC5xdWV1ZT0iZngiKSx4Lm9sZD14LmNvbXBsZXRlLHguY29tcGxldGU9ZnVuY3Rpb24oKXtUKHgub2xkKSYmeC5vbGQuY2FsbCh0aGlzKSx4LnF1ZXVlJiZmLmRlcXVldWUodGhpcyx4LnF1ZXVlKX0seH0sZi5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGQsdix4KXtyZXR1cm4gdGhpcy5maWx0ZXIoVG4pLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZH0sYSx2LHgpfSxhbmltYXRlOmZ1bmN0aW9uKGEsZCx2LHgpe3ZhciBBPWYuaXNFbXB0eU9iamVjdChhKSxJPWYuc3BlZWQoZCx2LHgpLE49ZnVuY3Rpb24oKXt2YXIgWT1NZSh0aGlzLGYuZXh0ZW5kKHt9LGEpLEkpOyhBfHxtdC5nZXQodGhpcywiZmluaXNoIikpJiZZLnN0b3AoITApfTtyZXR1cm4gTi5maW5pc2g9TixBfHxJLnF1ZXVlPT09ITE/dGhpcy5lYWNoKE4pOnRoaXMucXVldWUoSS5xdWV1ZSxOKX0sc3RvcDpmdW5jdGlvbihhLGQsdil7dmFyIHg9ZnVuY3Rpb24oQSl7dmFyIEk9QS5zdG9wO2RlbGV0ZSBBLnN0b3AsSSh2KX07cmV0dXJuIHR5cGVvZiBhIT0ic3RyaW5nIiYmKHY9ZCxkPWEsYT12b2lkIDApLGQmJnRoaXMucXVldWUoYXx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEE9ITAsST1hIT1udWxsJiZhKyJxdWV1ZUhvb2tzIixOPWYudGltZXJzLFk9bXQuZ2V0KHRoaXMpO2lmKEkpWVtJXSYmWVtJXS5zdG9wJiZ4KFlbSV0pO2Vsc2UgZm9yKEkgaW4gWSlZW0ldJiZZW0ldLnN0b3AmJnZvLnRlc3QoSSkmJngoWVtJXSk7Zm9yKEk9Ti5sZW5ndGg7SS0tOylOW0ldLmVsZW09PT10aGlzJiYoYT09bnVsbHx8TltJXS5xdWV1ZT09PWEpJiYoTltJXS5hbmltLnN0b3AodiksQT0hMSxOLnNwbGljZShJLDEpKTsoQXx8IXYpJiZmLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQsdj1tdC5nZXQodGhpcykseD12W2ErInF1ZXVlIl0sQT12W2ErInF1ZXVlSG9va3MiXSxJPWYudGltZXJzLE49eD94Lmxlbmd0aDowO2Zvcih2LmZpbmlzaD0hMCxmLnF1ZXVlKHRoaXMsYSxbXSksQSYmQS5zdG9wJiZBLnN0b3AuY2FsbCh0aGlzLCEwKSxkPUkubGVuZ3RoO2QtLTspSVtkXS5lbGVtPT09dGhpcyYmSVtkXS5xdWV1ZT09PWEmJihJW2RdLmFuaW0uc3RvcCghMCksSS5zcGxpY2UoZCwxKSk7Zm9yKGQ9MDtkPE47ZCsrKXhbZF0mJnhbZF0uZmluaXNoJiZ4W2RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSB2LmZpbmlzaH0pfX0pLGYuZWFjaChbInRvZ2dsZSIsInNob3ciLCJoaWRlIl0sZnVuY3Rpb24oYSxkKXt2YXIgdj1mLmZuW2RdO2YuZm5bZF09ZnVuY3Rpb24oeCxBLEkpe3JldHVybiB4PT1udWxsfHx0eXBlb2YgeD09ImJvb2xlYW4iP3YuYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShtcihkLCEwKSx4LEEsSSl9fSksZi5lYWNoKHtzbGlkZURvd246bXIoInNob3ciKSxzbGlkZVVwOm1yKCJoaWRlIiksc2xpZGVUb2dnbGU6bXIoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxkKXtmLmZuW2FdPWZ1bmN0aW9uKHYseCxBKXtyZXR1cm4gdGhpcy5hbmltYXRlKGQsdix4LEEpfX0pLGYudGltZXJzPVtdLGYuZngudGljaz1mdW5jdGlvbigpe3ZhciBhLGQ9MCx2PWYudGltZXJzO2ZvcihBbj1EYXRlLm5vdygpO2Q8di5sZW5ndGg7ZCsrKWE9dltkXSwhYSgpJiZ2W2RdPT09YSYmdi5zcGxpY2UoZC0tLDEpO3YubGVuZ3RofHxmLmZ4LnN0b3AoKSxBbj12b2lkIDB9LGYuZngudGltZXI9ZnVuY3Rpb24oYSl7Zi50aW1lcnMucHVzaChhKSxmLmZ4LnN0YXJ0KCl9LGYuZnguaW50ZXJ2YWw9MTMsZi5meC5zdGFydD1mdW5jdGlvbigpe2JyfHwoYnI9ITAsUXIoKSl9LGYuZnguc3RvcD1mdW5jdGlvbigpe2JyPW51bGx9LGYuZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LGYuZm4uZGVsYXk9ZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT1mLmZ4JiZmLmZ4LnNwZWVkc1thXXx8YSxkPWR8fCJmeCIsdGhpcy5xdWV1ZShkLGZ1bmN0aW9uKHYseCl7dmFyIEE9dC5zZXRUaW1lb3V0KHYsYSk7eC5zdG9wPWZ1bmN0aW9uKCl7dC5jbGVhclRpbWVvdXQoQSl9fSl9LGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLGQ9Yy5jcmVhdGVFbGVtZW50KCJzZWxlY3QiKSx2PWQuYXBwZW5kQ2hpbGQoYy5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7YS50eXBlPSJjaGVja2JveCIseS5jaGVja09uPWEudmFsdWUhPT0iIix5Lm9wdFNlbGVjdGVkPXYuc2VsZWN0ZWQsYT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS52YWx1ZT0idCIsYS50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPWEudmFsdWU9PT0idCJ9KCk7dmFyIHdhLFduPWYuZXhwci5hdHRySGFuZGxlO2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIEsodGhpcyxmLmF0dHIsYSxkLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksZi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEEsST1hLm5vZGVUeXBlO2lmKCEoST09PTN8fEk9PT04fHxJPT09Mikpe2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT4idSIpcmV0dXJuIGYucHJvcChhLGQsdik7aWYoKEkhPT0xfHwhZi5pc1hNTERvYyhhKSkmJihBPWYuYXR0ckhvb2tzW2QudG9Mb3dlckNhc2UoKV18fChmLmV4cHIubWF0Y2guYm9vbC50ZXN0KGQpP3dhOnZvaWQgMCkpLHYhPT12b2lkIDApe2lmKHY9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxkKTtyZXR1cm59cmV0dXJuIEEmJiJzZXQiaW4gQSYmKHg9QS5zZXQoYSx2LGQpKSE9PXZvaWQgMD94OihhLnNldEF0dHJpYnV0ZShkLHYrIiIpLHYpfXJldHVybiBBJiYiZ2V0ImluIEEmJih4PUEuZ2V0KGEsZCkpIT09bnVsbD94Oih4PWYuZmluZC5hdHRyKGEsZCkseD8/dm9pZCAwKX19LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsZCl7aWYoIXkucmFkaW9WYWx1ZSYmZD09PSJyYWRpbyImJlgoYSwiaW5wdXQiKSl7dmFyIHY9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGQpLHYmJihhLnZhbHVlPXYpLGR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxkKXt2YXIgdix4PTAsQT1kJiZkLm1hdGNoKEJ0KTtpZihBJiZhLm5vZGVUeXBlPT09MSlmb3IoO3Y9QVt4KytdOylhLnJlbW92ZUF0dHJpYnV0ZSh2KX19KSx3YT17c2V0OmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZD09PSExP2YucmVtb3ZlQXR0cihhLHYpOmEuc2V0QXR0cmlidXRlKHYsdiksdn19LGYuZWFjaChmLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGQpe3ZhciB2PVduW2RdfHxmLmZpbmQuYXR0cjtXbltkXT1mdW5jdGlvbih4LEEsSSl7dmFyIE4sWSxXPUEudG9Mb3dlckNhc2UoKTtyZXR1cm4gSXx8KFk9V25bV10sV25bV109TixOPXYoeCxBLEkpIT1udWxsP1c6bnVsbCxXbltXXT1ZKSxOfX0pO3ZhciB3bz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLHhvPS9eKD86YXxhcmVhKSQvaTtmLmZuLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihhLGQpe3JldHVybiBLKHRoaXMsZi5wcm9wLGEsZCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1tmLnByb3BGaXhbYV18fGFdfSl9fSksZi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxkLHYpe3ZhciB4LEEsST1hLm5vZGVUeXBlO2lmKCEoST09PTN8fEk9PT04fHxJPT09MikpcmV0dXJuKEkhPT0xfHwhZi5pc1hNTERvYyhhKSkmJihkPWYucHJvcEZpeFtkXXx8ZCxBPWYucHJvcEhvb2tzW2RdKSx2IT09dm9pZCAwP0EmJiJzZXQiaW4gQSYmKHg9QS5zZXQoYSx2LGQpKSE9PXZvaWQgMD94OmFbZF09djpBJiYiZ2V0ImluIEEmJih4PUEuZ2V0KGEsZCkpIT09bnVsbD94OmFbZF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgZD1mLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBkP3BhcnNlSW50KGQsMTApOndvLnRlc3QoYS5ub2RlTmFtZSl8fHhvLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGQ9YS5wYXJlbnROb2RlO3JldHVybiBkJiZkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihhKXt2YXIgZD1hLnBhcmVudE5vZGU7ZCYmKGQuc2VsZWN0ZWRJbmRleCxkLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxmLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe2YucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KTtmdW5jdGlvbiBobihhKXt2YXIgZD1hLm1hdGNoKEJ0KXx8W107cmV0dXJuIGQuam9pbigiICIpfWZ1bmN0aW9uIHBuKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIifWZ1bmN0aW9uIHRpKGEpe3JldHVybiBBcnJheS5pc0FycmF5KGEpP2E6dHlwZW9mIGE9PSJzdHJpbmciP2EubWF0Y2goQnQpfHxbXTpbXX1mLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGQsdix4LEEsSSxOO3JldHVybiBUKGEpP3RoaXMuZWFjaChmdW5jdGlvbihZKXtmKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLFkscG4odGhpcykpKX0pOihkPXRpKGEpLGQubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHg9cG4odGhpcyksdj10aGlzLm5vZGVUeXBlPT09MSYmIiAiK2huKHgpKyIgIix2KXtmb3IoST0wO0k8ZC5sZW5ndGg7SSsrKUE9ZFtJXSx2LmluZGV4T2YoIiAiK0ErIiAiKTwwJiYodis9QSsiICIpO049aG4odikseCE9PU4mJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsTil9fSk6dGhpcyl9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBkLHYseCxBLEksTjtyZXR1cm4gVChhKT90aGlzLmVhY2goZnVuY3Rpb24oWSl7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxZLHBuKHRoaXMpKSl9KTphcmd1bWVudHMubGVuZ3RoPyhkPXRpKGEpLGQubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbigpe2lmKHg9cG4odGhpcyksdj10aGlzLm5vZGVUeXBlPT09MSYmIiAiK2huKHgpKyIgIix2KXtmb3IoST0wO0k8ZC5sZW5ndGg7SSsrKWZvcihBPWRbSV07di5pbmRleE9mKCIgIitBKyIgIik+LTE7KXY9di5yZXBsYWNlKCIgIitBKyIgIiwiICIpO049aG4odikseCE9PU4mJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsTil9fSk6dGhpcyk6dGhpcy5hdHRyKCJjbGFzcyIsIiIpfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGQpe3ZhciB2LHgsQSxJLE49dHlwZW9mIGEsWT1OPT09InN0cmluZyJ8fEFycmF5LmlzQXJyYXkoYSk7cmV0dXJuIFQoYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKFcpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsVyxwbih0aGlzKSxkKSxkKX0pOnR5cGVvZiBkPT0iYm9vbGVhbiImJlk/ZD90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6KHY9dGkoYSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoWSlmb3IoST1mKHRoaXMpLEE9MDtBPHYubGVuZ3RoO0ErKyl4PXZbQV0sSS5oYXNDbGFzcyh4KT9JLnJlbW92ZUNsYXNzKHgpOkkuYWRkQ2xhc3MoeCk7ZWxzZShhPT09dm9pZCAwfHxOPT09ImJvb2xlYW4iKSYmKHg9cG4odGhpcykseCYmbXQuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHgpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHh8fGE9PT0hMT8iIjptdC5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSkpfSxoYXNDbGFzczpmdW5jdGlvbihhKXt2YXIgZCx2LHg9MDtmb3IoZD0iICIrYSsiICI7dj10aGlzW3grK107KWlmKHYubm9kZVR5cGU9PT0xJiYoIiAiK2huKHBuKHYpKSsiICIpLmluZGV4T2YoZCk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIF9vPS9cci9nO2YuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oYSl7dmFyIGQsdix4LEE9dGhpc1swXTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1UKGEpLHRoaXMuZWFjaChmdW5jdGlvbihJKXt2YXIgTjt0aGlzLm5vZGVUeXBlPT09MSYmKHg/Tj1hLmNhbGwodGhpcyxJLGYodGhpcykudmFsKCkpOk49YSxOPT1udWxsP049IiI6dHlwZW9mIE49PSJudW1iZXIiP04rPSIiOkFycmF5LmlzQXJyYXkoTikmJihOPWYubWFwKE4sZnVuY3Rpb24oWSl7cmV0dXJuIFk9PW51bGw/IiI6WSsiIn0pKSxkPWYudmFsSG9va3NbdGhpcy50eXBlXXx8Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLCghZHx8ISgic2V0ImluIGQpfHxkLnNldCh0aGlzLE4sInZhbHVlIik9PT12b2lkIDApJiYodGhpcy52YWx1ZT1OKSl9KSk6QT8oZD1mLnZhbEhvb2tzW0EudHlwZV18fGYudmFsSG9va3NbQS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxkJiYiZ2V0ImluIGQmJih2PWQuZ2V0KEEsInZhbHVlIikpIT09dm9pZCAwP3Y6KHY9QS52YWx1ZSx0eXBlb2Ygdj09InN0cmluZyI/di5yZXBsYWNlKF9vLCIiKTp2Pz8iIikpOnZvaWQgMH19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBkPWYuZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIGQ/P2huKGYudGV4dChhKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgZCx2LHgsQT1hLm9wdGlvbnMsST1hLnNlbGVjdGVkSW5kZXgsTj1hLnR5cGU9PT0ic2VsZWN0LW9uZSIsWT1OP251bGw6W10sVz1OP0krMTpBLmxlbmd0aDtmb3IoSTwwP3g9Vzp4PU4/STowO3g8Vzt4KyspaWYodj1BW3hdLCh2LnNlbGVjdGVkfHx4PT09SSkmJiF2LmRpc2FibGVkJiYoIXYucGFyZW50Tm9kZS5kaXNhYmxlZHx8IVgodi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZD1mKHYpLnZhbCgpLE4pcmV0dXJuIGQ7WS5wdXNoKGQpfXJldHVybiBZfSxzZXQ6ZnVuY3Rpb24oYSxkKXtmb3IodmFyIHYseCxBPWEub3B0aW9ucyxJPWYubWFrZUFycmF5KGQpLE49QS5sZW5ndGg7Ti0tOyl4PUFbTl0sKHguc2VsZWN0ZWQ9Zi5pbkFycmF5KGYudmFsSG9va3Mub3B0aW9uLmdldCh4KSxJKT4tMSkmJih2PSEwKTtyZXR1cm4gdnx8KGEuc2VsZWN0ZWRJbmRleD0tMSksSX19fX0pLGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGQpe2lmKEFycmF5LmlzQXJyYXkoZCkpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxkKT4tMX19LHkuY2hlY2tPbnx8KGYudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidmFsdWUiKT09PW51bGw/Im9uIjphLnZhbHVlfSl9KTt2YXIgR249dC5sb2NhdGlvbix4YT17Z3VpZDpEYXRlLm5vdygpfSxlaT0vXD8vO2YucGFyc2VYTUw9ZnVuY3Rpb24oYSl7dmFyIGQsdjtpZighYXx8dHlwZW9mIGEhPSJzdHJpbmciKXJldHVybiBudWxsO3RyeXtkPW5ldyB0LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpfWNhdGNoe31yZXR1cm4gdj1kJiZkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpWzBdLCghZHx8dikmJmYuZXJyb3IoIkludmFsaWQgWE1MOiAiKyh2P2YubWFwKHYuY2hpbGROb2RlcyxmdW5jdGlvbih4KXtyZXR1cm4geC50ZXh0Q29udGVudH0pLmpvaW4oYApgKTphKSksZH07dmFyIF9hPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxDYT1mdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfTtmLmV4dGVuZChmLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKGEsZCx2LHgpe3ZhciBBLEksTixZLFcsSixkdCxmdCxzdD1bdnx8Y10seXQ9Zy5jYWxsKGEsInR5cGUiKT9hLnR5cGU6YSxPdD1nLmNhbGwoYSwibmFtZXNwYWNlIik/YS5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihJPWZ0PU49dj12fHxjLCEodi5ub2RlVHlwZT09PTN8fHYubm9kZVR5cGU9PT04KSYmIV9hLnRlc3QoeXQrZi5ldmVudC50cmlnZ2VyZWQpJiYoeXQuaW5kZXhPZigiLiIpPi0xJiYoT3Q9eXQuc3BsaXQoIi4iKSx5dD1PdC5zaGlmdCgpLE90LnNvcnQoKSksVz15dC5pbmRleE9mKCI6Iik8MCYmIm9uIit5dCxhPWFbZi5leHBhbmRvXT9hOm5ldyBmLkV2ZW50KHl0LHR5cGVvZiBhPT0ib2JqZWN0IiYmYSksYS5pc1RyaWdnZXI9eD8yOjMsYS5uYW1lc3BhY2U9T3Quam9pbigiLiIpLGEucm5hbWVzcGFjZT1hLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIitPdC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKTpudWxsLGEucmVzdWx0PXZvaWQgMCxhLnRhcmdldHx8KGEudGFyZ2V0PXYpLGQ9ZD09bnVsbD9bYV06Zi5tYWtlQXJyYXkoZCxbYV0pLGR0PWYuZXZlbnQuc3BlY2lhbFt5dF18fHt9LCEoIXgmJmR0LnRyaWdnZXImJmR0LnRyaWdnZXIuYXBwbHkodixkKT09PSExKSkpe2lmKCF4JiYhZHQubm9CdWJibGUmJiFQKHYpKXtmb3IoWT1kdC5kZWxlZ2F0ZVR5cGV8fHl0LF9hLnRlc3QoWSt5dCl8fChJPUkucGFyZW50Tm9kZSk7STtJPUkucGFyZW50Tm9kZSlzdC5wdXNoKEkpLE49STtOPT09KHYub3duZXJEb2N1bWVudHx8YykmJnN0LnB1c2goTi5kZWZhdWx0Vmlld3x8Ti5wYXJlbnRXaW5kb3d8fHQpfWZvcihBPTA7KEk9c3RbQSsrXSkmJiFhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZ0PUksYS50eXBlPUE+MT9ZOmR0LmJpbmRUeXBlfHx5dCxKPShtdC5nZXQoSSwiZXZlbnRzIil8fE9iamVjdC5jcmVhdGUobnVsbCkpW2EudHlwZV0mJm10LmdldChJLCJoYW5kbGUiKSxKJiZKLmFwcGx5KEksZCksSj1XJiZJW1ddLEomJkouYXBwbHkmJkN0KEkpJiYoYS5yZXN1bHQ9Si5hcHBseShJLGQpLGEucmVzdWx0PT09ITEmJmEucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIGEudHlwZT15dCwheCYmIWEuaXNEZWZhdWx0UHJldmVudGVkKCkmJighZHQuX2RlZmF1bHR8fGR0Ll9kZWZhdWx0LmFwcGx5KHN0LnBvcCgpLGQpPT09ITEpJiZDdCh2KSYmVyYmVCh2W3l0XSkmJiFQKHYpJiYoTj12W1ddLE4mJih2W1ddPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPXl0LGEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmZnQuYWRkRXZlbnRMaXN0ZW5lcih5dCxDYSksdlt5dF0oKSxhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmZ0LnJlbW92ZUV2ZW50TGlzdGVuZXIoeXQsQ2EpLGYuZXZlbnQudHJpZ2dlcmVkPXZvaWQgMCxOJiYodltXXT1OKSksYS5yZXN1bHR9fSxzaW11bGF0ZTpmdW5jdGlvbihhLGQsdil7dmFyIHg9Zi5leHRlbmQobmV3IGYuRXZlbnQsdix7dHlwZTphLGlzU2ltdWxhdGVkOiEwfSk7Zi5ldmVudC50cmlnZ2VyKHgsbnVsbCxkKX19KSxmLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxkLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsZCl7dmFyIHY9dGhpc1swXTtpZih2KXJldHVybiBmLmV2ZW50LnRyaWdnZXIoYSxkLHYsITApfX0pO3ZhciBDbz0vXFtcXSQvLFRhPS9ccj9cbi9nLFRvPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxrbz0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gbmkoYSxkLHYseCl7dmFyIEE7aWYoQXJyYXkuaXNBcnJheShkKSlmLmVhY2goZCxmdW5jdGlvbihJLE4pe3Z8fENvLnRlc3QoYSk/eChhLE4pOm5pKGErIlsiKyh0eXBlb2YgTj09Im9iamVjdCImJk4hPW51bGw/SToiIikrIl0iLE4sdix4KX0pO2Vsc2UgaWYoIXYmJl8oZCk9PT0ib2JqZWN0Iilmb3IoQSBpbiBkKW5pKGErIlsiK0ErIl0iLGRbQV0sdix4KTtlbHNlIHgoYSxkKX1mLnBhcmFtPWZ1bmN0aW9uKGEsZCl7dmFyIHYseD1bXSxBPWZ1bmN0aW9uKEksTil7dmFyIFk9VChOKT9OKCk6Tjt4W3gubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoSSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChZPz8iIil9O2lmKGE9PW51bGwpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtBKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHYgaW4gYSluaSh2LGFbdl0sZCxBKTtyZXR1cm4geC5qb2luKCImIil9LGYuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPWYucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP2YubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIWYodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZrby50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVG8udGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVdlLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsZCl7dmFyIHY9Zih0aGlzKS52YWwoKTtyZXR1cm4gdj09bnVsbD9udWxsOkFycmF5LmlzQXJyYXkodik/Zi5tYXAodixmdW5jdGlvbih4KXtyZXR1cm57bmFtZTpkLm5hbWUsdmFsdWU6eC5yZXBsYWNlKFRhLGBccgpgKX19KTp7bmFtZTpkLm5hbWUsdmFsdWU6di5yZXBsYWNlKFRhLGBccgpgKX19KS5nZXQoKX19KTt2YXIgU289LyUyMC9nLERvPS8jLiokLyxBbz0vKFs/Jl0pXz1bXiZdKi8sSW89L14oLio/KTpbIFx0XSooW15cclxuXSopJC9tZyxQbz0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxGbz0vXig/OkdFVHxIRUFEKSQvLEJvPS9eXC9cLy8sa2E9e30scmk9e30sU2E9IiovIi5jb25jYXQoIioiKSxpaT1jLmNyZWF0ZUVsZW1lbnQoImEiKTtpaS5ocmVmPUduLmhyZWY7ZnVuY3Rpb24gRGEoYSl7cmV0dXJuIGZ1bmN0aW9uKGQsdil7dHlwZW9mIGQhPSJzdHJpbmciJiYodj1kLGQ9IioiKTt2YXIgeCxBPTAsST1kLnRvTG93ZXJDYXNlKCkubWF0Y2goQnQpfHxbXTtpZihUKHYpKWZvcig7eD1JW0ErK107KXhbMF09PT0iKyI/KHg9eC5zbGljZSgxKXx8IioiLChhW3hdPWFbeF18fFtdKS51bnNoaWZ0KHYpKTooYVt4XT1hW3hdfHxbXSkucHVzaCh2KX19ZnVuY3Rpb24gQWEoYSxkLHYseCl7dmFyIEE9e30sST1hPT09cmk7ZnVuY3Rpb24gTihZKXt2YXIgVztyZXR1cm4gQVtZXT0hMCxmLmVhY2goYVtZXXx8W10sZnVuY3Rpb24oSixkdCl7dmFyIGZ0PWR0KGQsdix4KTtpZih0eXBlb2YgZnQ9PSJzdHJpbmciJiYhSSYmIUFbZnRdKXJldHVybiBkLmRhdGFUeXBlcy51bnNoaWZ0KGZ0KSxOKGZ0KSwhMTtpZihJKXJldHVybiEoVz1mdCl9KSxXfXJldHVybiBOKGQuZGF0YVR5cGVzWzBdKXx8IUFbIioiXSYmTigiKiIpfWZ1bmN0aW9uIGFpKGEsZCl7dmFyIHYseCxBPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IodiBpbiBkKWRbdl0hPT12b2lkIDAmJigoQVt2XT9hOnh8fCh4PXt9KSlbdl09ZFt2XSk7cmV0dXJuIHgmJmYuZXh0ZW5kKCEwLGEseCksYX1mdW5jdGlvbiBObyhhLGQsdil7Zm9yKHZhciB4LEEsSSxOLFk9YS5jb250ZW50cyxXPWEuZGF0YVR5cGVzO1dbMF09PT0iKiI7KVcuc2hpZnQoKSx4PT09dm9pZCAwJiYoeD1hLm1pbWVUeXBlfHxkLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYoeCl7Zm9yKEEgaW4gWSlpZihZW0FdJiZZW0FdLnRlc3QoeCkpe1cudW5zaGlmdChBKTticmVha319aWYoV1swXWluIHYpST1XWzBdO2Vsc2V7Zm9yKEEgaW4gdil7aWYoIVdbMF18fGEuY29udmVydGVyc1tBKyIgIitXWzBdXSl7ST1BO2JyZWFrfU58fChOPUEpfUk9SXx8Tn1pZihJKXJldHVybiBJIT09V1swXSYmVy51bnNoaWZ0KEkpLHZbSV19ZnVuY3Rpb24gT28oYSxkLHYseCl7dmFyIEEsSSxOLFksVyxKPXt9LGR0PWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoZHRbMV0pZm9yKE4gaW4gYS5jb252ZXJ0ZXJzKUpbTi50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbTl07Zm9yKEk9ZHQuc2hpZnQoKTtJOylpZihhLnJlc3BvbnNlRmllbGRzW0ldJiYodlthLnJlc3BvbnNlRmllbGRzW0ldXT1kKSwhVyYmeCYmYS5kYXRhRmlsdGVyJiYoZD1hLmRhdGFGaWx0ZXIoZCxhLmRhdGFUeXBlKSksVz1JLEk9ZHQuc2hpZnQoKSxJKXtpZihJPT09IioiKUk9VztlbHNlIGlmKFchPT0iKiImJlchPT1JKXtpZihOPUpbVysiICIrSV18fEpbIiogIitJXSwhTil7Zm9yKEEgaW4gSilpZihZPUEuc3BsaXQoIiAiKSxZWzFdPT09SSYmKE49SltXKyIgIitZWzBdXXx8SlsiKiAiK1lbMF1dLE4pKXtOPT09ITA/Tj1KW0FdOkpbQV0hPT0hMCYmKEk9WVswXSxkdC51bnNoaWZ0KFlbMV0pKTticmVha319aWYoTiE9PSEwKWlmKE4mJmEudGhyb3dzKWQ9TihkKTtlbHNlIHRyeXtkPU4oZCl9Y2F0Y2goZnQpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOk4/ZnQ6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK1crIiB0byAiK0l9fX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmR9fWYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpHbi5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDpQby50ZXN0KEduLnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOlNhLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpmLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxkKXtyZXR1cm4gZD9haShhaShhLGYuYWpheFNldHRpbmdzKSxkKTphaShmLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpEYShrYSksYWpheFRyYW5zcG9ydDpEYShyaSksYWpheDpmdW5jdGlvbihhLGQpe3R5cGVvZiBhPT0ib2JqZWN0IiYmKGQ9YSxhPXZvaWQgMCksZD1kfHx7fTt2YXIgdix4LEEsSSxOLFksVyxKLGR0LGZ0LHN0PWYuYWpheFNldHVwKHt9LGQpLHl0PXN0LmNvbnRleHR8fHN0LE90PXN0LmNvbnRleHQmJih5dC5ub2RlVHlwZXx8eXQuanF1ZXJ5KT9mKHl0KTpmLmV2ZW50LFh0PWYuRGVmZXJyZWQoKSxWdD1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSx1ZT1zdC5zdGF0dXNDb2RlfHx7fSxvZT17fSxHZT17fSxxZT0iY2FuY2VsZWQiLHF0PXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oWXQpe3ZhciByZTtpZihXKXtpZighSSlmb3IoST17fTtyZT1Jby5leGVjKEEpOylJW3JlWzFdLnRvTG93ZXJDYXNlKCkrIiAiXT0oSVtyZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQocmVbMl0pO3JlPUlbWXQudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiByZT09bnVsbD9udWxsOnJlLmpvaW4oIiwgIil9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBXP0E6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihZdCxyZSl7cmV0dXJuIFc9PW51bGwmJihZdD1HZVtZdC50b0xvd2VyQ2FzZSgpXT1HZVtZdC50b0xvd2VyQ2FzZSgpXXx8WXQsb2VbWXRdPXJlKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKFl0KXtyZXR1cm4gVz09bnVsbCYmKHN0Lm1pbWVUeXBlPVl0KSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKFl0KXt2YXIgcmU7aWYoWXQpaWYoVylxdC5hbHdheXMoWXRbcXQuc3RhdHVzXSk7ZWxzZSBmb3IocmUgaW4gWXQpdWVbcmVdPVt1ZVtyZV0sWXRbcmVdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oWXQpe3ZhciByZT1ZdHx8cWU7cmV0dXJuIHYmJnYuYWJvcnQocmUpLGJuKDAscmUpLHRoaXN9fTtpZihYdC5wcm9taXNlKHF0KSxzdC51cmw9KChhfHxzdC51cmx8fEduLmhyZWYpKyIiKS5yZXBsYWNlKEJvLEduLnByb3RvY29sKyIvLyIpLHN0LnR5cGU9ZC5tZXRob2R8fGQudHlwZXx8c3QubWV0aG9kfHxzdC50eXBlLHN0LmRhdGFUeXBlcz0oc3QuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChCdCl8fFsiIl0sc3QuY3Jvc3NEb21haW49PW51bGwpe1k9Yy5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e1kuaHJlZj1zdC51cmwsWS5ocmVmPVkuaHJlZixzdC5jcm9zc0RvbWFpbj1paS5wcm90b2NvbCsiLy8iK2lpLmhvc3QhPVkucHJvdG9jb2wrIi8vIitZLmhvc3R9Y2F0Y2h7c3QuY3Jvc3NEb21haW49ITB9fWlmKHN0LmRhdGEmJnN0LnByb2Nlc3NEYXRhJiZ0eXBlb2Ygc3QuZGF0YSE9InN0cmluZyImJihzdC5kYXRhPWYucGFyYW0oc3QuZGF0YSxzdC50cmFkaXRpb25hbCkpLEFhKGthLHN0LGQscXQpLFcpcmV0dXJuIHF0O0o9Zi5ldmVudCYmc3QuZ2xvYmFsLEomJmYuYWN0aXZlKys9PT0wJiZmLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLHN0LnR5cGU9c3QudHlwZS50b1VwcGVyQ2FzZSgpLHN0Lmhhc0NvbnRlbnQ9IUZvLnRlc3Qoc3QudHlwZSkseD1zdC51cmwucmVwbGFjZShEbywiIiksc3QuaGFzQ29udGVudD9zdC5kYXRhJiZzdC5wcm9jZXNzRGF0YSYmKHN0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIik9PT0wJiYoc3QuZGF0YT1zdC5kYXRhLnJlcGxhY2UoU28sIisiKSk6KGZ0PXN0LnVybC5zbGljZSh4Lmxlbmd0aCksc3QuZGF0YSYmKHN0LnByb2Nlc3NEYXRhfHx0eXBlb2Ygc3QuZGF0YT09InN0cmluZyIpJiYoeCs9KGVpLnRlc3QoeCk/IiYiOiI/Iikrc3QuZGF0YSxkZWxldGUgc3QuZGF0YSksc3QuY2FjaGU9PT0hMSYmKHg9eC5yZXBsYWNlKEFvLCIkMSIpLGZ0PShlaS50ZXN0KHgpPyImIjoiPyIpKyJfPSIreGEuZ3VpZCsrK2Z0KSxzdC51cmw9eCtmdCksc3QuaWZNb2RpZmllZCYmKGYubGFzdE1vZGlmaWVkW3hdJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRbeF0pLGYuZXRhZ1t4XSYmcXQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsZi5ldGFnW3hdKSksKHN0LmRhdGEmJnN0Lmhhc0NvbnRlbnQmJnN0LmNvbnRlbnRUeXBlIT09ITF8fGQuY29udGVudFR5cGUpJiZxdC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLHN0LmNvbnRlbnRUeXBlKSxxdC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHN0LmRhdGFUeXBlc1swXSYmc3QuYWNjZXB0c1tzdC5kYXRhVHlwZXNbMF1dP3N0LmFjY2VwdHNbc3QuZGF0YVR5cGVzWzBdXSsoc3QuZGF0YVR5cGVzWzBdIT09IioiPyIsICIrU2ErIjsgcT0wLjAxIjoiIik6c3QuYWNjZXB0c1siKiJdKTtmb3IoZHQgaW4gc3QuaGVhZGVycylxdC5zZXRSZXF1ZXN0SGVhZGVyKGR0LHN0LmhlYWRlcnNbZHRdKTtpZihzdC5iZWZvcmVTZW5kJiYoc3QuYmVmb3JlU2VuZC5jYWxsKHl0LHF0LHN0KT09PSExfHxXKSlyZXR1cm4gcXQuYWJvcnQoKTtpZihxZT0iYWJvcnQiLFZ0LmFkZChzdC5jb21wbGV0ZSkscXQuZG9uZShzdC5zdWNjZXNzKSxxdC5mYWlsKHN0LmVycm9yKSx2PUFhKHJpLHN0LGQscXQpLCF2KWJuKC0xLCJObyBUcmFuc3BvcnQiKTtlbHNle2lmKHF0LnJlYWR5U3RhdGU9MSxKJiZPdC50cmlnZ2VyKCJhamF4U2VuZCIsW3F0LHN0XSksVylyZXR1cm4gcXQ7c3QuYXN5bmMmJnN0LnRpbWVvdXQ+MCYmKE49dC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cXQuYWJvcnQoInRpbWVvdXQiKX0sc3QudGltZW91dCkpO3RyeXtXPSExLHYuc2VuZChvZSxibil9Y2F0Y2goWXQpe2lmKFcpdGhyb3cgWXQ7Ym4oLTEsWXQpfX1mdW5jdGlvbiBibihZdCxyZSxYbixvaSl7dmFyIFhlLFluLFllLGVuLG5uLFBlPXJlO1d8fChXPSEwLE4mJnQuY2xlYXJUaW1lb3V0KE4pLHY9dm9pZCAwLEE9b2l8fCIiLHF0LnJlYWR5U3RhdGU9WXQ+MD80OjAsWGU9WXQ+PTIwMCYmWXQ8MzAwfHxZdD09PTMwNCxYbiYmKGVuPU5vKHN0LHF0LFhuKSksIVhlJiZmLmluQXJyYXkoInNjcmlwdCIsc3QuZGF0YVR5cGVzKT4tMSYmZi5pbkFycmF5KCJqc29uIixzdC5kYXRhVHlwZXMpPDAmJihzdC5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSksZW49T28oc3QsZW4scXQsWGUpLFhlPyhzdC5pZk1vZGlmaWVkJiYobm49cXQuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxubiYmKGYubGFzdE1vZGlmaWVkW3hdPW5uKSxubj1xdC5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLG5uJiYoZi5ldGFnW3hdPW5uKSksWXQ9PT0yMDR8fHN0LnR5cGU9PT0iSEVBRCI/UGU9Im5vY29udGVudCI6WXQ9PT0zMDQ/UGU9Im5vdG1vZGlmaWVkIjooUGU9ZW4uc3RhdGUsWW49ZW4uZGF0YSxZZT1lbi5lcnJvcixYZT0hWWUpKTooWWU9UGUsKFl0fHwhUGUpJiYoUGU9ImVycm9yIixZdDwwJiYoWXQ9MCkpKSxxdC5zdGF0dXM9WXQscXQuc3RhdHVzVGV4dD0ocmV8fFBlKSsiIixYZT9YdC5yZXNvbHZlV2l0aCh5dCxbWW4sUGUscXRdKTpYdC5yZWplY3RXaXRoKHl0LFtxdCxQZSxZZV0pLHF0LnN0YXR1c0NvZGUodWUpLHVlPXZvaWQgMCxKJiZPdC50cmlnZ2VyKFhlPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW3F0LHN0LFhlP1luOlllXSksVnQuZmlyZVdpdGgoeXQsW3F0LFBlXSksSiYmKE90LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3F0LHN0XSksLS1mLmFjdGl2ZXx8Zi5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIHF0fSxnZXRKU09OOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gZi5nZXQoYSxkLHYsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsZCl7cmV0dXJuIGYuZ2V0KGEsdm9pZCAwLGQsInNjcmlwdCIpfX0pLGYuZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGQpe2ZbZF09ZnVuY3Rpb24odix4LEEsSSl7cmV0dXJuIFQoeCkmJihJPUl8fEEsQT14LHg9dm9pZCAwKSxmLmFqYXgoZi5leHRlbmQoe3VybDp2LHR5cGU6ZCxkYXRhVHlwZTpJLGRhdGE6eCxzdWNjZXNzOkF9LGYuaXNQbGFpbk9iamVjdCh2KSYmdikpfX0pLGYuYWpheFByZWZpbHRlcihmdW5jdGlvbihhKXt2YXIgZDtmb3IoZCBpbiBhLmhlYWRlcnMpZC50b0xvd2VyQ2FzZSgpPT09ImNvbnRlbnQtdHlwZSImJihhLmNvbnRlbnRUeXBlPWEuaGVhZGVyc1tkXXx8IiIpfSksZi5fZXZhbFVybD1mdW5jdGlvbihhLGQsdil7cmV0dXJuIGYuYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24oeCl7Zi5nbG9iYWxFdmFsKHgsZCx2KX19KX0sZi5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7dmFyIGQ7cmV0dXJuIHRoaXNbMF0mJihUKGEpJiYoYT1hLmNhbGwodGhpc1swXSkpLGQ9ZihhLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmZC5pbnNlcnRCZWZvcmUodGhpc1swXSksZC5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIHY9dGhpczt2LmZpcnN0RWxlbWVudENoaWxkOyl2PXYuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIHZ9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gVChhKT90aGlzLmVhY2goZnVuY3Rpb24oZCl7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsZCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9Zih0aGlzKSx2PWQuY29udGVudHMoKTt2Lmxlbmd0aD92LndyYXBBbGwoYSk6ZC5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgZD1UKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odil7Zih0aGlzKS53cmFwQWxsKGQ/YS5jYWxsKHRoaXMsdik6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBhcmVudChhKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7Zih0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxmLmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5wc2V1ZG9zLnZpc2libGUoYSl9LGYuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuISEoYS5vZmZzZXRXaWR0aHx8YS5vZmZzZXRIZWlnaHR8fGEuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxmLmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyB0LlhNTEh0dHBSZXF1ZXN0fWNhdGNoe319O3ZhciBFbz17MDoyMDAsMTIyMzoyMDR9LHFuPWYuYWpheFNldHRpbmdzLnhocigpO3kuY29ycz0hIXFuJiYid2l0aENyZWRlbnRpYWxzImluIHFuLHkuYWpheD1xbj0hIXFuLGYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXt2YXIgZCx2O2lmKHkuY29yc3x8cW4mJiFhLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKHgsQSl7dmFyIEksTj1hLnhocigpO2lmKE4ub3BlbihhLnR5cGUsYS51cmwsYS5hc3luYyxhLnVzZXJuYW1lLGEucGFzc3dvcmQpLGEueGhyRmllbGRzKWZvcihJIGluIGEueGhyRmllbGRzKU5bSV09YS54aHJGaWVsZHNbSV07YS5taW1lVHlwZSYmTi5vdmVycmlkZU1pbWVUeXBlJiZOLm92ZXJyaWRlTWltZVR5cGUoYS5taW1lVHlwZSksIWEuY3Jvc3NEb21haW4mJiF4WyJYLVJlcXVlc3RlZC1XaXRoIl0mJih4WyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKEkgaW4geClOLnNldFJlcXVlc3RIZWFkZXIoSSx4W0ldKTtkPWZ1bmN0aW9uKFkpe3JldHVybiBmdW5jdGlvbigpe2QmJihkPXY9Ti5vbmxvYWQ9Ti5vbmVycm9yPU4ub25hYm9ydD1OLm9udGltZW91dD1OLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLFk9PT0iYWJvcnQiP04uYWJvcnQoKTpZPT09ImVycm9yIj90eXBlb2YgTi5zdGF0dXMhPSJudW1iZXIiP0EoMCwiZXJyb3IiKTpBKE4uc3RhdHVzLE4uc3RhdHVzVGV4dCk6QShFb1tOLnN0YXR1c118fE4uc3RhdHVzLE4uc3RhdHVzVGV4dCwoTi5yZXNwb25zZVR5cGV8fCJ0ZXh0IikhPT0idGV4dCJ8fHR5cGVvZiBOLnJlc3BvbnNlVGV4dCE9InN0cmluZyI/e2JpbmFyeTpOLnJlc3BvbnNlfTp7dGV4dDpOLnJlc3BvbnNlVGV4dH0sTi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpfX0sTi5vbmxvYWQ9ZCgpLHY9Ti5vbmVycm9yPU4ub250aW1lb3V0PWQoImVycm9yIiksTi5vbmFib3J0IT09dm9pZCAwP04ub25hYm9ydD12Ok4ub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Ti5yZWFkeVN0YXRlPT09NCYmdC5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZCYmdigpfSl9LGQ9ZCgiYWJvcnQiKTt0cnl7Ti5zZW5kKGEuaGFzQ29udGVudCYmYS5kYXRhfHxudWxsKX1jYXRjaChZKXtpZihkKXRocm93IFl9fSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoKX19fSksZi5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGEpe2EuY3Jvc3NEb21haW4mJihhLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxmLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtyZXR1cm4gZi5nbG9iYWxFdmFsKGEpLGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09dm9pZCAwJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIil9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbnx8YS5zY3JpcHRBdHRycyl7dmFyIGQsdjtyZXR1cm57c2VuZDpmdW5jdGlvbih4LEEpe2Q9ZigiPHNjcmlwdD4iKS5hdHRyKGEuc2NyaXB0QXR0cnN8fHt9KS5wcm9wKHtjaGFyc2V0OmEuc2NyaXB0Q2hhcnNldCxzcmM6YS51cmx9KS5vbigibG9hZCBlcnJvciIsdj1mdW5jdGlvbihJKXtkLnJlbW92ZSgpLHY9bnVsbCxJJiZBKEkudHlwZT09PSJlcnJvciI/NDA0OjIwMCxJLnR5cGUpfSksYy5oZWFkLmFwcGVuZENoaWxkKGRbMF0pfSxhYm9ydDpmdW5jdGlvbigpe3YmJnYoKX19fX0pO3ZhciBJYT1bXSxzaT0vKD0pXD8oPz0mfCQpfFw/XD8vO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgYT1JYS5wb3AoKXx8Zi5leHBhbmRvKyJfIit4YS5ndWlkKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxmLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTj1hLmpzb25wIT09ITEmJihzaS50ZXN0KGEudXJsKT8idXJsIjp0eXBlb2YgYS5kYXRhPT0ic3RyaW5nIiYmKGEuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKT09PTAmJnNpLnRlc3QoYS5kYXRhKSYmImRhdGEiKTtpZihOfHxhLmRhdGFUeXBlc1swXT09PSJqc29ucCIpcmV0dXJuIHg9YS5qc29ucENhbGxiYWNrPVQoYS5qc29ucENhbGxiYWNrKT9hLmpzb25wQ2FsbGJhY2soKTphLmpzb25wQ2FsbGJhY2ssTj9hW05dPWFbTl0ucmVwbGFjZShzaSwiJDEiK3gpOmEuanNvbnAhPT0hMSYmKGEudXJsKz0oZWkudGVzdChhLnVybCk/IiYiOiI/IikrYS5qc29ucCsiPSIreCksYS5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIEl8fGYuZXJyb3IoeCsiIHdhcyBub3QgY2FsbGVkIiksSVswXX0sYS5kYXRhVHlwZXNbMF09Impzb24iLEE9dFt4XSx0W3hdPWZ1bmN0aW9uKCl7ST1hcmd1bWVudHN9LHYuYWx3YXlzKGZ1bmN0aW9uKCl7QT09PXZvaWQgMD9mKHQpLnJlbW92ZVByb3AoeCk6dFt4XT1BLGFbeF0mJihhLmpzb25wQ2FsbGJhY2s9ZC5qc29ucENhbGxiYWNrLElhLnB1c2goeCkpLEkmJlQoQSkmJkEoSVswXSksST1BPXZvaWQgMH0pLCJzY3JpcHQifSkseS5jcmVhdGVIVE1MRG9jdW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYT1jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gYS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IixhLmNoaWxkTm9kZXMubGVuZ3RoPT09Mn0oKSxmLnBhcnNlSFRNTD1mdW5jdGlvbihhLGQsdil7aWYodHlwZW9mIGEhPSJzdHJpbmciKXJldHVybltdO3R5cGVvZiBkPT0iYm9vbGVhbiImJih2PWQsZD0hMSk7dmFyIHgsQSxJO3JldHVybiBkfHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KGQ9Yy5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLHg9ZC5jcmVhdGVFbGVtZW50KCJiYXNlIikseC5ocmVmPWMubG9jYXRpb24uaHJlZixkLmhlYWQuYXBwZW5kQ2hpbGQoeCkpOmQ9YyksQT1udC5leGVjKGEpLEk9IXYmJltdLEE/W2QuY3JlYXRlRWxlbWVudChBWzFdKV06KEE9YWEoW2FdLGQsSSksSSYmSS5sZW5ndGgmJmYoSSkucmVtb3ZlKCksZi5tZXJnZShbXSxBLmNoaWxkTm9kZXMpKX0sZi5mbi5sb2FkPWZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTj10aGlzLFk9YS5pbmRleE9mKCIgIik7cmV0dXJuIFk+LTEmJih4PWhuKGEuc2xpY2UoWSkpLGE9YS5zbGljZSgwLFkpKSxUKGQpPyh2PWQsZD12b2lkIDApOmQmJnR5cGVvZiBkPT0ib2JqZWN0IiYmKEE9IlBPU1QiKSxOLmxlbmd0aD4wJiZmLmFqYXgoe3VybDphLHR5cGU6QXx8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6ZH0pLmRvbmUoZnVuY3Rpb24oVyl7ST1hcmd1bWVudHMsTi5odG1sKHg/ZigiPGRpdj4iKS5hcHBlbmQoZi5wYXJzZUhUTUwoVykpLmZpbmQoeCk6Vyl9KS5hbHdheXModiYmZnVuY3Rpb24oVyxKKXtOLmVhY2goZnVuY3Rpb24oKXt2LmFwcGx5KHRoaXMsSXx8W1cucmVzcG9uc2VUZXh0LEosV10pfSl9KSx0aGlzfSxmLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGQpe3JldHVybiBhPT09ZC5lbGVtfSkubGVuZ3RofSxmLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsZCx2KXt2YXIgeCxBLEksTixZLFcsSixkdD1mLmNzcyhhLCJwb3NpdGlvbiIpLGZ0PWYoYSksc3Q9e307ZHQ9PT0ic3RhdGljIiYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksWT1mdC5vZmZzZXQoKSxJPWYuY3NzKGEsInRvcCIpLFc9Zi5jc3MoYSwibGVmdCIpLEo9KGR0PT09ImFic29sdXRlInx8ZHQ9PT0iZml4ZWQiKSYmKEkrVykuaW5kZXhPZigiYXV0byIpPi0xLEo/KHg9ZnQucG9zaXRpb24oKSxOPXgudG9wLEE9eC5sZWZ0KTooTj1wYXJzZUZsb2F0KEkpfHwwLEE9cGFyc2VGbG9hdChXKXx8MCksVChkKSYmKGQ9ZC5jYWxsKGEsdixmLmV4dGVuZCh7fSxZKSkpLGQudG9wIT1udWxsJiYoc3QudG9wPWQudG9wLVkudG9wK04pLGQubGVmdCE9bnVsbCYmKHN0LmxlZnQ9ZC5sZWZ0LVkubGVmdCtBKSwidXNpbmciaW4gZD9kLnVzaW5nLmNhbGwoYSxzdCk6ZnQuY3NzKHN0KX19LGYuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYT09PXZvaWQgMD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihBKXtmLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLEEpfSk7dmFyIGQsdix4PXRoaXNbMF07aWYoeClyZXR1cm4geC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZD14LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9eC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZC50b3Ardi5wYWdlWU9mZnNldCxsZWZ0OmQubGVmdCt2LnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsZCx2LHg9dGhpc1swXSxBPXt0b3A6MCxsZWZ0OjB9O2lmKGYuY3NzKHgsInBvc2l0aW9uIik9PT0iZml4ZWQiKWQ9eC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtlbHNle2ZvcihkPXRoaXMub2Zmc2V0KCksdj14Lm93bmVyRG9jdW1lbnQsYT14Lm9mZnNldFBhcmVudHx8di5kb2N1bWVudEVsZW1lbnQ7YSYmKGE9PT12LmJvZHl8fGE9PT12LmRvY3VtZW50RWxlbWVudCkmJmYuY3NzKGEsInBvc2l0aW9uIik9PT0ic3RhdGljIjspYT1hLnBhcmVudE5vZGU7YSYmYSE9PXgmJmEubm9kZVR5cGU9PT0xJiYoQT1mKGEpLm9mZnNldCgpLEEudG9wKz1mLmNzcyhhLCJib3JkZXJUb3BXaWR0aCIsITApLEEubGVmdCs9Zi5jc3MoYSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6ZC50b3AtQS50b3AtZi5jc3MoeCwibWFyZ2luVG9wIiwhMCksbGVmdDpkLmxlZnQtQS5sZWZ0LWYuY3NzKHgsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5vZmZzZXRQYXJlbnQ7YSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiOylhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxqZX0pfX0pLGYuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGQpe3ZhciB2PWQ9PT0icGFnZVlPZmZzZXQiO2YuZm5bYV09ZnVuY3Rpb24oeCl7cmV0dXJuIEsodGhpcyxmdW5jdGlvbihBLEksTil7dmFyIFk7aWYoUChBKT9ZPUE6QS5ub2RlVHlwZT09PTkmJihZPUEuZGVmYXVsdFZpZXcpLE49PT12b2lkIDApcmV0dXJuIFk/WVtkXTpBW0ldO1k/WS5zY3JvbGxUbyh2P1kucGFnZVhPZmZzZXQ6Tix2P046WS5wYWdlWU9mZnNldCk6QVtJXT1OfSxhLHgsYXJndW1lbnRzLmxlbmd0aCl9fSksZi5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsZCl7Zi5jc3NIb29rc1tkXT1jYSh5LnBpeGVsUG9zaXRpb24sZnVuY3Rpb24odix4KXtpZih4KXJldHVybiB4PVVuKHYsZCksJHIudGVzdCh4KT9mKHYpLnBvc2l0aW9uKClbZF0rInB4Ijp4fSl9KSxmLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGQpe2YuZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpkLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24odix4KXtmLmZuW3hdPWZ1bmN0aW9uKEEsSSl7dmFyIE49YXJndW1lbnRzLmxlbmd0aCYmKHZ8fHR5cGVvZiBBIT0iYm9vbGVhbiIpLFk9dnx8KEE9PT0hMHx8ST09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gSyh0aGlzLGZ1bmN0aW9uKFcsSixkdCl7dmFyIGZ0O3JldHVybiBQKFcpP3guaW5kZXhPZigib3V0ZXIiKT09PTA/V1siaW5uZXIiK2FdOlcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2FdOlcubm9kZVR5cGU9PT05PyhmdD1XLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChXLmJvZHlbInNjcm9sbCIrYV0sZnRbInNjcm9sbCIrYV0sVy5ib2R5WyJvZmZzZXQiK2FdLGZ0WyJvZmZzZXQiK2FdLGZ0WyJjbGllbnQiK2FdKSk6ZHQ9PT12b2lkIDA/Zi5jc3MoVyxKLFkpOmYuc3R5bGUoVyxKLGR0LFkpfSxkLE4/QTp2b2lkIDAsTil9fSl9KSxmLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGQpe2YuZm5bZF09ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMub24oZCx2KX19KSxmLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihhLGQsdil7cmV0dXJuIHRoaXMub24oYSxudWxsLGQsdil9LHVuYmluZDpmdW5jdGlvbihhLGQpe3JldHVybiB0aGlzLm9mZihhLG51bGwsZCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsZCx2LHgpe3JldHVybiB0aGlzLm9uKGQsYSx2LHgpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsZCx2KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihkLGF8fCIqKiIsdil9LGhvdmVyOmZ1bmN0aW9uKGEsZCl7cmV0dXJuIHRoaXMub24oIm1vdXNlZW50ZXIiLGEpLm9uKCJtb3VzZWxlYXZlIixkfHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxkKXtmLmZuW2RdPWZ1bmN0aW9uKHYseCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGQsbnVsbCx2LHgpOnRoaXMudHJpZ2dlcihkKX19KTt2YXIgUm89L15bXHNcdUZFRkZceEEwXSt8KFteXHNcdUZFRkZceEEwXSlbXHNcdUZFRkZceEEwXSskL2c7Zi5wcm94eT1mdW5jdGlvbihhLGQpe3ZhciB2LHgsQTtpZih0eXBlb2YgZD09InN0cmluZyImJih2PWFbZF0sZD1hLGE9diksISFUKGEpKXJldHVybiB4PXMuY2FsbChhcmd1bWVudHMsMiksQT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGR8fHRoaXMseC5jb25jYXQocy5jYWxsKGFyZ3VtZW50cykpKX0sQS5ndWlkPWEuZ3VpZD1hLmd1aWR8fGYuZ3VpZCsrLEF9LGYuaG9sZFJlYWR5PWZ1bmN0aW9uKGEpe2E/Zi5yZWFkeVdhaXQrKzpmLnJlYWR5KCEwKX0sZi5pc0FycmF5PUFycmF5LmlzQXJyYXksZi5wYXJzZUpTT049SlNPTi5wYXJzZSxmLm5vZGVOYW1lPVgsZi5pc0Z1bmN0aW9uPVQsZi5pc1dpbmRvdz1QLGYuY2FtZWxDYXNlPWd0LGYudHlwZT1fLGYubm93PURhdGUubm93LGYuaXNOdW1lcmljPWZ1bmN0aW9uKGEpe3ZhciBkPWYudHlwZShhKTtyZXR1cm4oZD09PSJudW1iZXIifHxkPT09InN0cmluZyIpJiYhaXNOYU4oYS1wYXJzZUZsb2F0KGEpKX0sZi50cmltPWZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOihhKyIiKS5yZXBsYWNlKFJvLCIkMSIpfSx0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZn0pO3ZhciBMbz10LmpRdWVyeSx6bz10LiQ7cmV0dXJuIGYubm9Db25mbGljdD1mdW5jdGlvbihhKXtyZXR1cm4gdC4kPT09ZiYmKHQuJD16byksYSYmdC5qUXVlcnk9PT1mJiYodC5qUXVlcnk9TG8pLGZ9LHR5cGVvZiBlPiJ1IiYmKHQualF1ZXJ5PXQuJD1mKSxmfSl9KTt2YXIgcm89aWUoUmEoKSksdWQ9aWUoYWUoKSk7dmFyIFVsPWllKGFlKCksMSk7dmFyIEthPWllKGFlKCksMSk7dmFyIEg9S2EuZGVmYXVsdCxidD1mdW5jdGlvbih0LGUpe2lmKGJ0LmZhY3RvcnkodCxlKSlyZXR1cm4gYnQ7aWYodGhpcyBpbnN0YW5jZW9mIGJ0KXJldHVybiBIKHQpLkRhdGFUYWJsZShlKTtlPXQ7dmFyIG49dGhpcyxyPWU9PT12b2lkIDAscz10aGlzLmxlbmd0aDtyZXR1cm4gciYmKGU9e30pLHRoaXMuYXBpPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXdCh0aGlzKX0sdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9e30sbz1zPjE/cWEoaSxlLCEwKTplLHU9MCxwLGI9dGhpcy5nZXRBdHRyaWJ1dGUoImlkIiksZz1idC5kZWZhdWx0cyxtPUgodGhpcyk7aWYodGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT0idGFibGUiKXtPZShudWxsLDAsIk5vbi10YWJsZSBub2RlIGluaXRpYWxpc2F0aW9uICgiK3RoaXMubm9kZU5hbWUrIikiLDIpO3JldHVybn1IKHRoaXMpLnRyaWdnZXIoIm9wdGlvbnMuZHQiLG8pLGphKGcpLGVzKGcuY29sdW1uKSxzbihnLGcsITApLHNuKGcuY29sdW1uLGcuY29sdW1uLCEwKSxzbihnLEguZXh0ZW5kKG8sbS5kYXRhKCkpLCEwKTt2YXIgQz1idC5zZXR0aW5ncztmb3IodT0wLHA9Qy5sZW5ndGg7dTxwO3UrKyl7dmFyIHk9Q1t1XTtpZih5Lm5UYWJsZT09dGhpc3x8eS5uVEhlYWQmJnkublRIZWFkLnBhcmVudE5vZGU9PXRoaXN8fHkublRGb290JiZ5Lm5URm9vdC5wYXJlbnROb2RlPT10aGlzKXt2YXIgVD1vLmJSZXRyaWV2ZSE9PXZvaWQgMD9vLmJSZXRyaWV2ZTpnLmJSZXRyaWV2ZSxQPW8uYkRlc3Ryb3khPT12b2lkIDA/by5iRGVzdHJveTpnLmJEZXN0cm95O2lmKHJ8fFQpcmV0dXJuIHkub0luc3RhbmNlO2lmKFApe25ldyBidC5BcGkoeSkuZGVzdHJveSgpO2JyZWFrfWVsc2V7T2UoeSwwLCJDYW5ub3QgcmVpbml0aWFsaXNlIERhdGFUYWJsZSIsMyk7cmV0dXJufX1pZih5LnNUYWJsZUlkPT10aGlzLmlkKXtDLnNwbGljZSh1LDEpO2JyZWFrfX0oYj09PW51bGx8fGI9PT0iIikmJihiPSJEYXRhVGFibGVzX1RhYmxlXyIrYnQuZXh0Ll91bmlxdWUrKyx0aGlzLmlkPWIpO3ZhciBjPUguZXh0ZW5kKCEwLHt9LGJ0Lm1vZGVscy5vU2V0dGluZ3Mse3NEZXN0cm95V2lkdGg6bVswXS5zdHlsZS53aWR0aCxzSW5zdGFuY2U6YixzVGFibGVJZDpiLGNvbGdyb3VwOkgoIjxjb2xncm91cD4iKS5wcmVwZW5kVG8odGhpcyksZmFzdERhdGE6ZnVuY3Rpb24oQixMLFIpe3JldHVybiBSZShjLEIsTCxSKX19KTtjLm5UYWJsZT10aGlzLGMub0luaXQ9byxDLnB1c2goYyksYy5hcGk9bmV3IFd0KGMpLGMub0luc3RhbmNlPW4ubGVuZ3RoPT09MT9uOm0uZGF0YVRhYmxlKCksamEobyksby5hTGVuZ3RoTWVudSYmIW8uaURpc3BsYXlMZW5ndGgmJihvLmlEaXNwbGF5TGVuZ3RoPUFycmF5LmlzQXJyYXkoby5hTGVuZ3RoTWVudVswXSk/by5hTGVuZ3RoTWVudVswXVswXTpILmlzUGxhaW5PYmplY3Qoby5hTGVuZ3RoTWVudVswXSk/by5hTGVuZ3RoTWVudVswXS52YWx1ZTpvLmFMZW5ndGhNZW51WzBdKSxvPXFhKEguZXh0ZW5kKCEwLHt9LGcpLG8pLGxuKGMub0ZlYXR1cmVzLG8sWyJiUGFnaW5hdGUiLCJiTGVuZ3RoQ2hhbmdlIiwiYkZpbHRlciIsImJTb3J0IiwiYlNvcnRNdWx0aSIsImJJbmZvIiwiYlByb2Nlc3NpbmciLCJiQXV0b1dpZHRoIiwiYlNvcnRDbGFzc2VzIiwiYlNlcnZlclNpZGUiLCJiRGVmZXJSZW5kZXIiXSksbG4oYyxvLFsiYWpheCIsImZuRm9ybWF0TnVtYmVyIiwic1NlcnZlck1ldGhvZCIsImFhU29ydGluZyIsImFhU29ydGluZ0ZpeGVkIiwiYUxlbmd0aE1lbnUiLCJzUGFnaW5hdGlvblR5cGUiLCJpU3RhdGVEdXJhdGlvbiIsImJTb3J0Q2VsbHNUb3AiLCJpVGFiSW5kZXgiLCJzRG9tIiwiZm5TdGF0ZUxvYWRDYWxsYmFjayIsImZuU3RhdGVTYXZlQ2FsbGJhY2siLCJyZW5kZXJlciIsInNlYXJjaERlbGF5Iiwicm93SWQiLCJjYXB0aW9uIiwibGF5b3V0Iiwib3JkZXJEZXNjUmV2ZXJzZSIsInR5cGVEZXRlY3QiLFsiaUNvb2tpZUR1cmF0aW9uIiwiaVN0YXRlRHVyYXRpb24iXSxbIm9TZWFyY2giLCJvUHJldmlvdXNTZWFyY2giXSxbImFvU2VhcmNoQ29scyIsImFvUHJlU2VhcmNoQ29scyJdLFsiaURpc3BsYXlMZW5ndGgiLCJfaURpc3BsYXlMZW5ndGgiXV0pLGxuKGMub1Njcm9sbCxvLFtbInNTY3JvbGxYIiwic1giXSxbInNTY3JvbGxYSW5uZXIiLCJzWElubmVyIl0sWyJzU2Nyb2xsWSIsInNZIl0sWyJiU2Nyb2xsQ29sbGFwc2UiLCJiQ29sbGFwc2UiXV0pLGxuKGMub0xhbmd1YWdlLG8sImZuSW5mb0NhbGxiYWNrIiksQmUoYywiYW9EcmF3Q2FsbGJhY2siLG8uZm5EcmF3Q2FsbGJhY2spLEJlKGMsImFvU3RhdGVTYXZlUGFyYW1zIixvLmZuU3RhdGVTYXZlUGFyYW1zKSxCZShjLCJhb1N0YXRlTG9hZFBhcmFtcyIsby5mblN0YXRlTG9hZFBhcmFtcyksQmUoYywiYW9TdGF0ZUxvYWRlZCIsby5mblN0YXRlTG9hZGVkKSxCZShjLCJhb1Jvd0NhbGxiYWNrIixvLmZuUm93Q2FsbGJhY2spLEJlKGMsImFvUm93Q3JlYXRlZENhbGxiYWNrIixvLmZuQ3JlYXRlZFJvdyksQmUoYywiYW9IZWFkZXJDYWxsYmFjayIsby5mbkhlYWRlckNhbGxiYWNrKSxCZShjLCJhb0Zvb3RlckNhbGxiYWNrIixvLmZuRm9vdGVyQ2FsbGJhY2spLEJlKGMsImFvSW5pdENvbXBsZXRlIixvLmZuSW5pdENvbXBsZXRlKSxCZShjLCJhb1ByZURyYXdDYWxsYmFjayIsby5mblByZURyYXdDYWxsYmFjayksYy5yb3dJZEZuPUVuKG8ucm93SWQpLHJsKGMpO3ZhciBsPWMub0NsYXNzZXM7SC5leHRlbmQobCxidC5leHQuY2xhc3NlcyxvLm9DbGFzc2VzKSxtLmFkZENsYXNzKGwudGFibGUpLGMub0ZlYXR1cmVzLmJQYWdpbmF0ZXx8KG8uaURpc3BsYXlTdGFydD0wKSxjLmlJbml0RGlzcGxheVN0YXJ0PT09dm9pZCAwJiYoYy5pSW5pdERpc3BsYXlTdGFydD1vLmlEaXNwbGF5U3RhcnQsYy5faURpc3BsYXlTdGFydD1vLmlEaXNwbGF5U3RhcnQpO3ZhciBoPW8uaURlZmVyTG9hZGluZztpZihoIT09bnVsbCl7Yy5kZWZlckxvYWRpbmc9ITA7dmFyIF89QXJyYXkuaXNBcnJheShoKTtjLl9pUmVjb3Jkc0Rpc3BsYXk9Xz9oWzBdOmgsYy5faVJlY29yZHNUb3RhbD1fP2hbMV06aH12YXIgRj1bXSxPPXRoaXMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRoZWFkIiksZj1scyhjLE9bMF0pO2lmKG8uYW9Db2x1bW5zKUY9by5hb0NvbHVtbnM7ZWxzZSBpZihmLmxlbmd0aClmb3IodT0wLHA9ZlswXS5sZW5ndGg7dTxwO3UrKylGLnB1c2gobnVsbCk7Zm9yKHU9MCxwPUYubGVuZ3RoO3U8cDt1KyspbnMoYyk7c2woYyxvLmFvQ29sdW1uRGVmcyxGLGYsZnVuY3Rpb24oQixMKXt4aShjLEIsTCl9KTt2YXIgVT1tLmNoaWxkcmVuKCJ0Ym9keSIpLmZpbmQoInRyIikuZXEoMCk7aWYoVS5sZW5ndGgpe3ZhciBYPWZ1bmN0aW9uKEIsTCl7cmV0dXJuIEIuZ2V0QXR0cmlidXRlKCJkYXRhLSIrTCkhPT1udWxsP0w6bnVsbH07SChVWzBdKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbihCLEwpe3ZhciBSPWMuYW9Db2x1bW5zW0JdO2lmKFJ8fE9lKGMsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLFIubURhdGE9PT1CKXt2YXIgcT1YKEwsInNvcnQiKXx8WChMLCJvcmRlciIpLHo9WChMLCJmaWx0ZXIiKXx8WChMLCJzZWFyY2giKTsocSE9PW51bGx8fHohPT1udWxsKSYmKFIubURhdGE9e186QisiLmRpc3BsYXkiLHNvcnQ6cSE9PW51bGw/QisiLkBkYXRhLSIrcTp2b2lkIDAsdHlwZTpxIT09bnVsbD9CKyIuQGRhdGEtIitxOnZvaWQgMCxmaWx0ZXI6eiE9PW51bGw/QisiLkBkYXRhLSIrejp2b2lkIDB9LFIuX2lzQXJyYXlIb3N0PSEwLHhpKGMsQikpfX0pfUJlKGMsImFvRHJhd0NhbGxiYWNrIixqcik7dmFyIFE9Yy5vRmVhdHVyZXM7aWYoby5iU3RhdGVTYXZlJiYoUS5iU3RhdGVTYXZlPSEwKSxvLmFhU29ydGluZz09PXZvaWQgMCl7dmFyIEU9Yy5hYVNvcnRpbmc7Zm9yKHU9MCxwPUUubGVuZ3RoO3U8cDt1KyspRVt1XVsxXT1jLmFvQ29sdW1uc1t1XS5hc1NvcnRpbmdbMF19VGkoYyksQmUoYywiYW9EcmF3Q2FsbGJhY2siLGZ1bmN0aW9uKCl7KGMuYlNvcnRlZHx8RWUoYyk9PT0ic3NwInx8US5iRGVmZXJSZW5kZXIpJiZUaShjKX0pO3ZhciAkPW0uY2hpbGRyZW4oImNhcHRpb24iKTtjLmNhcHRpb24mJigkLmxlbmd0aD09PTAmJigkPUgoIjxjYXB0aW9uLz4iKS5hcHBlbmRUbyhtKSksJC5odG1sKGMuY2FwdGlvbikpLCQubGVuZ3RoJiYoJFswXS5fY2FwdGlvblNpZGU9JC5jc3MoImNhcHRpb24tc2lkZSIpLGMuY2FwdGlvbk5vZGU9JFswXSksTy5sZW5ndGg9PT0wJiYoTz1IKCI8dGhlYWQvPiIpLmFwcGVuZFRvKG0pKSxjLm5USGVhZD1PWzBdLEgoInRyIixPKS5hZGRDbGFzcyhsLnRoZWFkLnJvdyk7dmFyIHc9bS5jaGlsZHJlbigidGJvZHkiKTt3Lmxlbmd0aD09PTAmJih3PUgoIjx0Ym9keS8+IikuaW5zZXJ0QWZ0ZXIoTykpLGMublRCb2R5PXdbMF07dmFyIGs9bS5jaGlsZHJlbigidGZvb3QiKTtrLmxlbmd0aD09PTAmJihrPUgoIjx0Zm9vdC8+IikuYXBwZW5kVG8obSkpLGMublRGb290PWtbMF0sSCgidHIiLGspLmFkZENsYXNzKGwudGZvb3Qucm93KSxjLmFpRGlzcGxheT1jLmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLGMuYkluaXRpYWxpc2VkPSEwO3ZhciBTPWMub0xhbmd1YWdlO0guZXh0ZW5kKCEwLFMsby5vTGFuZ3VhZ2UpLFMuc1VybD9ILmFqYXgoe2RhdGFUeXBlOiJqc29uIix1cmw6Uy5zVXJsLHN1Y2Nlc3M6ZnVuY3Rpb24oQil7c24oZy5vTGFuZ3VhZ2UsQiksSC5leHRlbmQoITAsUyxCLGMub0luaXQub0xhbmd1YWdlKSxadChjLG51bGwsImkxOG4iLFtjXSwhMCksa3IoYyl9LGVycm9yOmZ1bmN0aW9uKCl7T2UoYywwLCJpMThuIGZpbGUgbG9hZGluZyBlcnJvciIsMjEpLGtyKGMpfX0pOihadChjLG51bGwsImkxOG4iLFtjXSwhMCksa3IoYykpfSksbj1udWxsLHRoaXN9O2J0LmV4dD1sZT17YnV0dG9uczp7fSxjbGFzc2VzOnt9LGJ1aWxkZXI6Ii1zb3VyY2UtIixlcnJNb2RlOiJhbGVydCIsZmVhdHVyZTpbXSxmZWF0dXJlczp7fSxzZWFyY2g6W10sc2VsZWN0b3I6e2NlbGw6W10sY29sdW1uOltdLHJvdzpbXX0sbGVnYWN5OnthamF4Om51bGx9LHBhZ2VyOnt9LHJlbmRlcmVyOntwYWdlQnV0dG9uOnt9LGhlYWRlcjp7fX0sb3JkZXI6e30sdHlwZTp7Y2xhc3NOYW1lOnt9LGRldGVjdDpbXSxyZW5kZXI6e30sc2VhcmNoOnt9LG9yZGVyOnt9fSxfdW5pcXVlOjAsZm5WZXJzaW9uQ2hlY2s6YnQuZm5WZXJzaW9uQ2hlY2ssaUFwaUluZGV4OjAsc1ZlcnNpb246YnQudmVyc2lvbn07SC5leHRlbmQobGUse2FmbkZpbHRlcmluZzpsZS5zZWFyY2gsYVR5cGVzOmxlLnR5cGUuZGV0ZWN0LG9mblNlYXJjaDpsZS50eXBlLnNlYXJjaCxvU29ydDpsZS50eXBlLm9yZGVyLGFmblNvcnREYXRhOmxlLm9yZGVyLGFvRmVhdHVyZXM6bGUuZmVhdHVyZSxvU3RkQ2xhc3NlczpsZS5jbGFzc2VzLG9QYWdpbmF0aW9uOmxlLnBhZ2VyfSk7SC5leHRlbmQoYnQuZXh0LmNsYXNzZXMse2NvbnRhaW5lcjoiZHQtY29udGFpbmVyIixlbXB0eTp7cm93OiJkdC1lbXB0eSJ9LGluZm86e2NvbnRhaW5lcjoiZHQtaW5mbyJ9LGxheW91dDp7cm93OiJkdC1sYXlvdXQtcm93IixjZWxsOiJkdC1sYXlvdXQtY2VsbCIsdGFibGVSb3c6ImR0LWxheW91dC10YWJsZSIsdGFibGVDZWxsOiIiLHN0YXJ0OiJkdC1sYXlvdXQtc3RhcnQiLGVuZDoiZHQtbGF5b3V0LWVuZCIsZnVsbDoiZHQtbGF5b3V0LWZ1bGwifSxsZW5ndGg6e2NvbnRhaW5lcjoiZHQtbGVuZ3RoIixzZWxlY3Q6ImR0LWlucHV0In0sb3JkZXI6e2NhbkFzYzoiZHQtb3JkZXJhYmxlLWFzYyIsY2FuRGVzYzoiZHQtb3JkZXJhYmxlLWRlc2MiLGlzQXNjOiJkdC1vcmRlcmluZy1hc2MiLGlzRGVzYzoiZHQtb3JkZXJpbmctZGVzYyIsbm9uZToiZHQtb3JkZXJhYmxlLW5vbmUiLHBvc2l0aW9uOiJzb3J0aW5nXyJ9LHByb2Nlc3Npbmc6e2NvbnRhaW5lcjoiZHQtcHJvY2Vzc2luZyJ9LHNjcm9sbGluZzp7Ym9keToiZHQtc2Nyb2xsLWJvZHkiLGNvbnRhaW5lcjoiZHQtc2Nyb2xsIixmb290ZXI6e3NlbGY6ImR0LXNjcm9sbC1mb290Iixpbm5lcjoiZHQtc2Nyb2xsLWZvb3RJbm5lciJ9LGhlYWRlcjp7c2VsZjoiZHQtc2Nyb2xsLWhlYWQiLGlubmVyOiJkdC1zY3JvbGwtaGVhZElubmVyIn19LHNlYXJjaDp7Y29udGFpbmVyOiJkdC1zZWFyY2giLGlucHV0OiJkdC1pbnB1dCJ9LHRhYmxlOiJkYXRhVGFibGUiLHRib2R5OntjZWxsOiIiLHJvdzoiIn0sdGhlYWQ6e2NlbGw6IiIscm93OiIifSx0Zm9vdDp7Y2VsbDoiIixyb3c6IiJ9LHBhZ2luZzp7YWN0aXZlOiJjdXJyZW50IixidXR0b246ImR0LXBhZ2luZy1idXR0b24iLGNvbnRhaW5lcjoiZHQtcGFnaW5nIixkaXNhYmxlZDoiZGlzYWJsZWQiLG5hdjoiIn19KTt2YXIgbGUsV3QsSXQsUXQsYmk9e30sSm89L1tcclxuXHUyMDI4XS9nLFNpPS88KFtePl0qPikvZyxRbz1NYXRoLnBvdygyLDI4KSx6YT0vXlxkezIsNH1bLi8tXVxkezEsMn1bLi8tXVxkezEsMn0oW1QgXXsxfVxkezEsMn1bOi5dXGR7Mn0oWy46XVxkezJ9KT8pPyQvLHRsPW5ldyBSZWdFeHAoIihcXCIrWyIvIiwiLiIsIioiLCIrIiwiPyIsInwiLCIoIiwiKSIsIlsiLCJdIiwieyIsIn0iLCJcXCIsIiQiLCJeIiwiLSJdLmpvaW4oInxcXCIpKyIpIiwiZyIpLERpPS9bJ1x1MDBBMCwkwqPigqzCpSVcdTIwMDlcdTIwMkZcdTIwQkRcdTIwYTlcdTIwQkFyZmvJg86eXS9naSxIZT1mdW5jdGlvbih0KXtyZXR1cm4hdHx8dD09PSEwfHx0PT09Ii0ifSxKYT1mdW5jdGlvbih0KXt2YXIgZT1wYXJzZUludCh0LDEwKTtyZXR1cm4haXNOYU4oZSkmJmlzRmluaXRlKHQpP2U6bnVsbH0sUWE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYmlbZV18fChiaVtlXT1uZXcgUmVnRXhwKENpKGUpLCJnIikpLHR5cGVvZiB0PT0ic3RyaW5nIiYmZSE9PSIuIj90LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoYmlbZV0sIi4iKTp0fSxRbj1mdW5jdGlvbih0LGUsbixyKXt2YXIgcz10eXBlb2YgdCxpPXM9PT0ic3RyaW5nIjtyZXR1cm4gcz09PSJudW1iZXIifHxzPT09ImJpZ2ludCJ8fHImJkhlKHQpPyEwOihlJiZpJiYodD1RYSh0LGUpKSxuJiZpJiYodD10LnJlcGxhY2UoRGksIiIpKSwhaXNOYU4ocGFyc2VGbG9hdCh0KSkmJmlzRmluaXRlKHQpKX0sZWw9ZnVuY3Rpb24odCl7cmV0dXJuIEhlKHQpfHx0eXBlb2YgdD09InN0cmluZyJ9LFNyPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHImJkhlKHQpKXJldHVybiEwO2lmKHR5cGVvZiB0PT0ic3RyaW5nIiYmdC5tYXRjaCgvPChpbnB1dHxzZWxlY3QpL2kpKXJldHVybiBudWxsO3ZhciBzPWVsKHQpO3JldHVybiBzJiZRbihnbih0KSxlLG4scik/ITA6bnVsbH0sQ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciByPVtdLHM9MCxpPXQubGVuZ3RoO2lmKG4hPT12b2lkIDApZm9yKDtzPGk7cysrKXRbc10mJnRbc11bZV0mJnIucHVzaCh0W3NdW2VdW25dKTtlbHNlIGZvcig7czxpO3MrKyl0W3NdJiZyLnB1c2godFtzXVtlXSk7cmV0dXJuIHJ9LGVyPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPVtdLGk9MCxvPWUubGVuZ3RoO2lmKHIhPT12b2lkIDApZm9yKDtpPG87aSsrKXRbZVtpXV0mJnRbZVtpXV1bbl0mJnMucHVzaCh0W2VbaV1dW25dW3JdKTtlbHNlIGZvcig7aTxvO2krKyl0W2VbaV1dJiZzLnB1c2godFtlW2ldXVtuXSk7cmV0dXJuIHN9LGFuPWZ1bmN0aW9uKHQsZSl7dmFyIG49W10scjtlPT09dm9pZCAwPyhlPTAscj10KToocj1lLGU9dCk7Zm9yKHZhciBzPWU7czxyO3MrKyluLnB1c2gocyk7cmV0dXJuIG59LHRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTAscj10Lmxlbmd0aDtuPHI7bisrKXRbbl0mJmUucHVzaCh0W25dKTtyZXR1cm4gZX0sZ249ZnVuY3Rpb24odCl7aWYoIXR8fHR5cGVvZiB0IT0ic3RyaW5nIilyZXR1cm4gdDtpZih0Lmxlbmd0aD5Rbyl0aHJvdyBuZXcgRXJyb3IoIkV4Y2VlZGVkIG1heCBzdHIgbGVuIik7dmFyIGU7dD10LnJlcGxhY2UoU2ksIiIpO2RvIGU9dCx0PXQucmVwbGFjZSgvPHNjcmlwdC9pLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIGV9LE5uPWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYodD10LmpvaW4oIiwiKSksdHlwZW9mIHQ9PSJzdHJpbmciP3QucmVwbGFjZSgvJi9nLCImYW1wOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iik6dH0sRHI9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgdCE9InN0cmluZyIpcmV0dXJuIHQ7dmFyIG49dC5ub3JtYWxpemUoIk5GRCIpO3JldHVybiBuLmxlbmd0aCE9PXQubGVuZ3RoPyhlPT09ITA/dCsiICI6IiIpK24ucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csIiIpOm59LG5sPWZ1bmN0aW9uKHQpe2lmKHQubGVuZ3RoPDIpcmV0dXJuITA7Zm9yKHZhciBlPXQuc2xpY2UoKS5zb3J0KCksbj1lWzBdLHI9MSxzPWUubGVuZ3RoO3I8cztyKyspe2lmKGVbcl09PT1uKXJldHVybiExO249ZVtyXX1yZXR1cm4hMH0seG49ZnVuY3Rpb24odCl7aWYoQXJyYXkuZnJvbSYmU2V0KXJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodCkpO2lmKG5sKHQpKXJldHVybiB0LnNsaWNlKCk7dmFyIGU9W10sbixyLHM9dC5sZW5ndGgsaSxvPTA7dDpmb3Iocj0wO3I8cztyKyspe2ZvcihuPXRbcl0saT0wO2k8bztpKyspaWYoZVtpXT09PW4pY29udGludWUgdDtlLnB1c2gobiksbysrfXJldHVybiBlfSxBaT1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspQWkodCxlW25dKTtlbHNlIHQucHVzaChlKTtyZXR1cm4gdH07ZnVuY3Rpb24gT24odCxlKXtlJiZlLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihuKXtuJiZ0LmNsYXNzTGlzdC5hZGQobil9KX1idC51dGlsPXtkaWFjcml0aWNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dHlwZW9mIHQ7aWYobiE9PSJmdW5jdGlvbiIpcmV0dXJuIERyKHQsZSk7RHI9dH0sZGVib3VuY2U6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj10aGlzLHM9YXJndW1lbnRzO2NsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmFwcGx5KHIscyl9LGV8fDI1MCl9fSx0aHJvdHRsZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUhPT12b2lkIDA/ZToyMDAscixzO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPXRoaXMsbz0rbmV3IERhdGUsdT1hcmd1bWVudHM7ciYmbzxyK24/KGNsZWFyVGltZW91dChzKSxzPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtyPXZvaWQgMCx0LmFwcGx5KGksdSl9LG4pKToocj1vLHQuYXBwbHkoaSx1KSl9fSxlc2NhcGVSZWdleDpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKHRsLCJcXCQxIil9LHNldDpmdW5jdGlvbih0KXtpZihILmlzUGxhaW5PYmplY3QodCkpcmV0dXJuIGJ0LnV0aWwuc2V0KHQuXyk7aWYodD09PW51bGwpcmV0dXJuIGZ1bmN0aW9uKCl7fTtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gZnVuY3Rpb24obixyLHMpe3Qobiwic2V0IixyLHMpfTtpZih0eXBlb2YgdD09InN0cmluZyImJih0LmluZGV4T2YoIi4iKSE9PS0xfHx0LmluZGV4T2YoIlsiKSE9PS0xfHx0LmluZGV4T2YoIigiKSE9PS0xKSl7dmFyIGU9ZnVuY3Rpb24obixyLHMpe2Zvcih2YXIgaT1WYShzKSxvLHU9aVtpLmxlbmd0aC0xXSxwLGIsZyxtLEM9MCx5PWkubGVuZ3RoLTE7Qzx5O0MrKyl7aWYoaVtDXT09PSJfX3Byb3RvX18ifHxpW0NdPT09ImNvbnN0cnVjdG9yIil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcHJvdG90eXBlIHZhbHVlcyIpO2lmKHA9aVtDXS5tYXRjaChLbiksYj1pW0NdLm1hdGNoKEZuKSxwKXtpZihpW0NdPWlbQ10ucmVwbGFjZShLbiwiIiksbltpW0NdXT1bXSxvPWkuc2xpY2UoKSxvLnNwbGljZSgwLEMrMSksbT1vLmpvaW4oIi4iKSxBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgVD0wLFA9ci5sZW5ndGg7VDxQO1QrKylnPXt9LGUoZyxyW1RdLG0pLG5baVtDXV0ucHVzaChnKTtlbHNlIG5baVtDXV09cjtyZXR1cm59ZWxzZSBiJiYoaVtDXT1pW0NdLnJlcGxhY2UoRm4sIiIpLG49bltpW0NdXShyKSk7KG5baVtDXV09PT1udWxsfHxuW2lbQ11dPT09dm9pZCAwKSYmKG5baVtDXV09e30pLG49bltpW0NdXX11Lm1hdGNoKEZuKT9uPW5bdS5yZXBsYWNlKEZuLCIiKV0ocik6blt1LnJlcGxhY2UoS24sIiIpXT1yfTtyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZShuLHIsdCl9fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKG4scil7blt0XT1yfX0sZ2V0OmZ1bmN0aW9uKHQpe2lmKEguaXNQbGFpbk9iamVjdCh0KSl7dmFyIGU9e307cmV0dXJuIEguZWFjaCh0LGZ1bmN0aW9uKHIscyl7cyYmKGVbcl09YnQudXRpbC5nZXQocykpfSksZnVuY3Rpb24ocixzLGksbyl7dmFyIHU9ZVtzXXx8ZS5fO3JldHVybiB1IT09dm9pZCAwP3UocixzLGksbyk6cn19ZWxzZXtpZih0PT09bnVsbClyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIHJ9O2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBmdW5jdGlvbihyLHMsaSxvKXtyZXR1cm4gdChyLHMsaSxvKX07aWYodHlwZW9mIHQ9PSJzdHJpbmciJiYodC5pbmRleE9mKCIuIikhPT0tMXx8dC5pbmRleE9mKCJbIikhPT0tMXx8dC5pbmRleE9mKCIoIikhPT0tMSkpe3ZhciBuPWZ1bmN0aW9uKHIscyxpKXt2YXIgbyx1LHAsYjtpZihpIT09IiIpZm9yKHZhciBnPVZhKGkpLG09MCxDPWcubGVuZ3RoO208QzttKyspe2lmKG89Z1ttXS5tYXRjaChLbiksdT1nW21dLm1hdGNoKEZuKSxvKXtpZihnW21dPWdbbV0ucmVwbGFjZShLbiwiIiksZ1ttXSE9PSIiJiYocj1yW2dbbV1dKSxwPVtdLGcuc3BsaWNlKDAsbSsxKSxiPWcuam9pbigiLiIpLEFycmF5LmlzQXJyYXkocikpZm9yKHZhciB5PTAsVD1yLmxlbmd0aDt5PFQ7eSsrKXAucHVzaChuKHJbeV0scyxiKSk7dmFyIFA9b1swXS5zdWJzdHJpbmcoMSxvWzBdLmxlbmd0aC0xKTtyPVA9PT0iIj9wOnAuam9pbihQKTticmVha31lbHNlIGlmKHUpe2dbbV09Z1ttXS5yZXBsYWNlKEZuLCIiKSxyPXJbZ1ttXV0oKTtjb250aW51ZX1pZihyPT09bnVsbHx8cltnW21dXT09PW51bGwpcmV0dXJuIG51bGw7aWYocj09PXZvaWQgMHx8cltnW21dXT09PXZvaWQgMClyZXR1cm47cj1yW2dbbV1dfXJldHVybiByfTtyZXR1cm4gZnVuY3Rpb24ocixzKXtyZXR1cm4gbihyLHMsdCl9fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiByW3RdfX19LHN0cmlwSHRtbDpmdW5jdGlvbih0KXt2YXIgZT10eXBlb2YgdDtpZihlPT09ImZ1bmN0aW9uIil7Z249dDtyZXR1cm59ZWxzZSBpZihlPT09InN0cmluZyIpcmV0dXJuIGduKHQpO3JldHVybiB0fSxlc2NhcGVIdG1sOmZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O2lmKGU9PT0iZnVuY3Rpb24iKXtObj10O3JldHVybn1lbHNlIGlmKGU9PT0ic3RyaW5nInx8QXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gTm4odCk7cmV0dXJuIHR9LHVuaXF1ZTp4bn07ZnVuY3Rpb24gTnIodCl7dmFyIGU9ImEgYWEgYWkgYW8gYXMgYiBmbiBpIG0gbyBzICIsbixyLHM9e307SC5lYWNoKHQsZnVuY3Rpb24oaSl7bj1pLm1hdGNoKC9eKFteQS1aXSs/KShbQS1aXSkvKSxuJiZlLmluZGV4T2YoblsxXSsiICIpIT09LTEmJihyPWkucmVwbGFjZShuWzBdLG5bMl0udG9Mb3dlckNhc2UoKSksc1tyXT1pLG5bMV09PT0ibyImJk5yKHRbaV0pKX0pLHQuX2h1bmdhcmlhbk1hcD1zfWZ1bmN0aW9uIHNuKHQsZSxuKXt0Ll9odW5nYXJpYW5NYXB8fE5yKHQpO3ZhciByO0guZWFjaChlLGZ1bmN0aW9uKHMpe3I9dC5faHVuZ2FyaWFuTWFwW3NdLHIhPT12b2lkIDAmJihufHxlW3JdPT09dm9pZCAwKSYmKHIuY2hhckF0KDApPT09Im8iPyhlW3JdfHwoZVtyXT17fSksSC5leHRlbmQoITAsZVtyXSxlW3NdKSxzbih0W3JdLGVbcl0sbikpOmVbcl09ZVtzXSl9KX12YXIgX2U9ZnVuY3Rpb24odCxlLG4pe3RbZV0hPT12b2lkIDAmJih0W25dPXRbZV0pfTtmdW5jdGlvbiBqYSh0KXtfZSh0LCJvcmRlcmluZyIsImJTb3J0IiksX2UodCwib3JkZXJNdWx0aSIsImJTb3J0TXVsdGkiKSxfZSh0LCJvcmRlckNsYXNzZXMiLCJiU29ydENsYXNzZXMiKSxfZSh0LCJvcmRlckNlbGxzVG9wIiwiYlNvcnRDZWxsc1RvcCIpLF9lKHQsIm9yZGVyIiwiYWFTb3J0aW5nIiksX2UodCwib3JkZXJGaXhlZCIsImFhU29ydGluZ0ZpeGVkIiksX2UodCwicGFnaW5nIiwiYlBhZ2luYXRlIiksX2UodCwicGFnaW5nVHlwZSIsInNQYWdpbmF0aW9uVHlwZSIpLF9lKHQsInBhZ2VMZW5ndGgiLCJpRGlzcGxheUxlbmd0aCIpLF9lKHQsInNlYXJjaGluZyIsImJGaWx0ZXIiKSx0eXBlb2YgdC5zU2Nyb2xsWD09ImJvb2xlYW4iJiYodC5zU2Nyb2xsWD10LnNTY3JvbGxYPyIxMDAlIjoiIiksdHlwZW9mIHQuc2Nyb2xsWD09ImJvb2xlYW4iJiYodC5zY3JvbGxYPXQuc2Nyb2xsWD8iMTAwJSI6IiIpO3ZhciBlPXQuYW9TZWFyY2hDb2xzO2lmKGUpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0mJnNuKGJ0Lm1vZGVscy5vU2VhcmNoLGVbbl0pO3Quc2VydmVyU2lkZSYmIXQuc2VhcmNoRGVsYXkmJih0LnNlYXJjaERlbGF5PTQwMCl9ZnVuY3Rpb24gZXModCl7X2UodCwib3JkZXJhYmxlIiwiYlNvcnRhYmxlIiksX2UodCwib3JkZXJEYXRhIiwiYURhdGFTb3J0IiksX2UodCwib3JkZXJTZXF1ZW5jZSIsImFzU29ydGluZyIpLF9lKHQsIm9yZGVyRGF0YVR5cGUiLCJzb3J0RGF0YVR5cGUiKTt2YXIgZT10LmFEYXRhU29ydDt0eXBlb2YgZT09Im51bWJlciImJiFBcnJheS5pc0FycmF5KGUpJiYodC5hRGF0YVNvcnQ9W2VdKX1mdW5jdGlvbiBybCh0KXtpZighYnQuX19icm93c2VyKXt2YXIgZT17fTtidC5fX2Jyb3dzZXI9ZTt2YXIgbj1IKCI8ZGl2Lz4iKS5jc3Moe3Bvc2l0aW9uOiJmaXhlZCIsdG9wOjAsbGVmdDotMSp3aW5kb3cucGFnZVhPZmZzZXQsaGVpZ2h0OjEsd2lkdGg6MSxvdmVyZmxvdzoiaGlkZGVuIn0pLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjEsbGVmdDoxLHdpZHRoOjEwMCxvdmVyZmxvdzoic2Nyb2xsIn0pLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOiIxMDAlIixoZWlnaHQ6MTB9KSkpLmFwcGVuZFRvKCJib2R5Iikscj1uLmNoaWxkcmVuKCkscz1yLmNoaWxkcmVuKCk7ZS5iYXJXaWR0aD1yWzBdLm9mZnNldFdpZHRoLXJbMF0uY2xpZW50V2lkdGgsZS5iU2Nyb2xsYmFyTGVmdD1NYXRoLnJvdW5kKHMub2Zmc2V0KCkubGVmdCkhPT0xLG4ucmVtb3ZlKCl9SC5leHRlbmQodC5vQnJvd3NlcixidC5fX2Jyb3dzZXIpLHQub1Njcm9sbC5pQmFyV2lkdGg9YnQuX19icm93c2VyLmJhcldpZHRofWZ1bmN0aW9uIG5zKHQpe3ZhciBlPWJ0LmRlZmF1bHRzLmNvbHVtbixuPXQuYW9Db2x1bW5zLmxlbmd0aCxyPUguZXh0ZW5kKHt9LGJ0Lm1vZGVscy5vQ29sdW1uLGUse2FEYXRhU29ydDplLmFEYXRhU29ydD9lLmFEYXRhU29ydDpbbl0sbURhdGE6ZS5tRGF0YT9lLm1EYXRhOm4saWR4Om4sc2VhcmNoRml4ZWQ6e30sY29sRWw6SCgiPGNvbD4iKS5hdHRyKCJkYXRhLWR0LWNvbHVtbiIsbil9KTt0LmFvQ29sdW1ucy5wdXNoKHIpO3ZhciBzPXQuYW9QcmVTZWFyY2hDb2xzO3Nbbl09SC5leHRlbmQoe30sYnQubW9kZWxzLm9TZWFyY2gsc1tuXSl9ZnVuY3Rpb24geGkodCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zW2VdO2lmKG4hPW51bGwpe2VzKG4pLHNuKGJ0LmRlZmF1bHRzLmNvbHVtbixuLCEwKSxuLm1EYXRhUHJvcCE9PXZvaWQgMCYmIW4ubURhdGEmJihuLm1EYXRhPW4ubURhdGFQcm9wKSxuLnNUeXBlJiYoci5fc01hbnVhbFR5cGU9bi5zVHlwZSksbi5jbGFzc05hbWUmJiFuLnNDbGFzcyYmKG4uc0NsYXNzPW4uY2xhc3NOYW1lKTt2YXIgcz1yLnNDbGFzcztILmV4dGVuZChyLG4pLGxuKHIsbiwic1dpZHRoIiwic1dpZHRoT3JpZyIpLHMhPT1yLnNDbGFzcyYmKHIuc0NsYXNzPXMrIiAiK3Iuc0NsYXNzKSxuLmlEYXRhU29ydCE9PXZvaWQgMCYmKHIuYURhdGFTb3J0PVtuLmlEYXRhU29ydF0pLGxuKHIsbiwiYURhdGFTb3J0Iil9dmFyIGk9ci5tRGF0YSxvPUVuKGkpO2lmKHIubVJlbmRlciYmQXJyYXkuaXNBcnJheShyLm1SZW5kZXIpKXt2YXIgdT1yLm1SZW5kZXIuc2xpY2UoKSxwPXUuc2hpZnQoKTtyLm1SZW5kZXI9YnQucmVuZGVyW3BdLmFwcGx5KHdpbmRvdyx1KX1yLl9yZW5kZXI9ci5tUmVuZGVyP0VuKHIubVJlbmRlcik6bnVsbDt2YXIgYj1mdW5jdGlvbihnKXtyZXR1cm4gdHlwZW9mIGc9PSJzdHJpbmciJiZnLmluZGV4T2YoIkAiKSE9PS0xfTtyLl9iQXR0clNyYz1ILmlzUGxhaW5PYmplY3QoaSkmJihiKGkuc29ydCl8fGIoaS50eXBlKXx8YihpLmZpbHRlcikpLHIuX3NldHRlcj1udWxsLHIuZm5HZXREYXRhPWZ1bmN0aW9uKGcsbSxDKXt2YXIgeT1vKGcsbSx2b2lkIDAsQyk7cmV0dXJuIHIuX3JlbmRlciYmbT9yLl9yZW5kZXIoeSxtLGcsQyk6eX0sci5mblNldERhdGE9ZnVuY3Rpb24oZyxtLEMpe3JldHVybiB2bihpKShnLG0sQyl9LHR5cGVvZiBpIT0ibnVtYmVyIiYmIXIuX2lzQXJyYXlIb3N0JiYodC5fcm93UmVhZE9iamVjdD0hMCksdC5vRmVhdHVyZXMuYlNvcnR8fChyLmJTb3J0YWJsZT0hMSl9ZnVuY3Rpb24gT3IodCl7eGwodCksaWwodCk7dmFyIGU9dC5vU2Nyb2xsOyhlLnNZIT09IiJ8fGUuc1ghPT0iIikmJmZzKHQpLFp0KHQsbnVsbCwiY29sdW1uLXNpemluZyIsW3RdKX1mdW5jdGlvbiBpbCh0KXtmb3IodmFyIGU9dC5hb0NvbHVtbnMsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1ycyh0LFtuXSwhMSwhMSk7ZVtuXS5jb2xFbC5jc3MoIndpZHRoIixyKS5jc3MoIm1pbi13aWR0aCIscil9fWZ1bmN0aW9uIElpKHQsZSl7dmFyIG49UGkodCwiYlZpc2libGUiKTtyZXR1cm4gdHlwZW9mIG5bZV09PSJudW1iZXIiP25bZV06bnVsbH1mdW5jdGlvbiBucih0LGUpe3ZhciBuPVBpKHQsImJWaXNpYmxlIikscj1uLmluZGV4T2YoZSk7cmV0dXJuIHIhPT0tMT9yOm51bGx9ZnVuY3Rpb24gRXIodCl7dmFyIGU9dC5hb0hlYWRlcixuPXQuYW9Db2x1bW5zLHI9MDtpZihlLmxlbmd0aClmb3IodmFyIHM9MCxpPWVbMF0ubGVuZ3RoO3M8aTtzKyspbltzXS5iVmlzaWJsZSYmSChlWzBdW3NdLmNlbGwpLmNzcygiZGlzcGxheSIpIT09Im5vbmUiJiZyKys7cmV0dXJuIHJ9ZnVuY3Rpb24gUGkodCxlKXt2YXIgbj1bXTtyZXR1cm4gdC5hb0NvbHVtbnMubWFwKGZ1bmN0aW9uKHIscyl7cltlXSYmbi5wdXNoKHMpfSksbn1mdW5jdGlvbiBtaSh0LGUpe3JldHVybiBlPT09ITA/dC5uYW1lOmV9ZnVuY3Rpb24gRmkodCl7dmFyIGU9dC5hb0NvbHVtbnMsbj10LmFvRGF0YSxyPWJ0LmV4dC50eXBlLmRldGVjdCxzLGksbyx1LHAsYixnLG0sQztmb3Iocz0wLGk9ZS5sZW5ndGg7czxpO3MrKyl7aWYoZz1lW3NdLEM9W10sIWcuc1R5cGUmJmcuX3NNYW51YWxUeXBlKWcuc1R5cGU9Zy5fc01hbnVhbFR5cGU7ZWxzZSBpZighZy5zVHlwZSl7aWYoIXQudHlwZURldGVjdClyZXR1cm47Zm9yKG89MCx1PXIubGVuZ3RoO288dTtvKyspe3ZhciB5PXJbb10sVD15Lm9uZU9mLFA9eS5hbGxPZnx8eSxjPXkuaW5pdCxsPSExO2lmKG09bnVsbCxjJiYobT1taSh5LGModCxnLHMpKSxtKSl7Zy5zVHlwZT1tO2JyZWFrfWZvcihwPTAsYj1uLmxlbmd0aDtwPGImJiEobltwXSYmKENbcF09PT12b2lkIDAmJihDW3BdPVJlKHQscCxzLCJ0eXBlIikpLFQmJiFsJiYobD1taSh5LFQoQ1twXSx0KSkpLG09bWkoeSxQKENbcF0sdCkpLCFtJiZvIT09ci5sZW5ndGgtM3x8bT09PSJodG1sIiYmIUhlKENbcF0pKSk7cCsrKTtpZihUJiZsJiZtfHwhVCYmbSl7Zy5zVHlwZT1tO2JyZWFrfX1nLnNUeXBlfHwoZy5zVHlwZT0ic3RyaW5nIil9dmFyIGg9bGUudHlwZS5jbGFzc05hbWVbZy5zVHlwZV07aCYmKE1hKHQuYW9IZWFkZXIscyxoKSxNYSh0LmFvRm9vdGVyLHMsaCkpO3ZhciBfPWxlLnR5cGUucmVuZGVyW2cuc1R5cGVdO18mJiFnLl9yZW5kZXImJihnLl9yZW5kZXI9YnQudXRpbC5nZXQoXyksYWwodCxzKSl9fWZ1bmN0aW9uIGFsKHQsZSl7Zm9yKHZhciBuPXQuYW9EYXRhLHI9MDtyPG4ubGVuZ3RoO3IrKylpZihuW3JdLm5Ucil7dmFyIHM9UmUodCxyLGUsImRpc3BsYXkiKTtuW3JdLmRpc3BsYXlEYXRhW2VdPXMsQXIobltyXS5hbkNlbGxzW2VdLHMpfX1mdW5jdGlvbiBNYSh0LGUsbil7dC5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JbZV0mJnJbZV0udW5pcXVlJiZPbihyW2VdLmNlbGwsbil9KX1mdW5jdGlvbiBzbCh0LGUsbixyLHMpe3ZhciBpLG8sdSxwLGIsZyxtLEM9dC5hb0NvbHVtbnM7aWYobilmb3IoaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldJiZuW2ldLm5hbWUmJihDW2ldLnNOYW1lPW5baV0ubmFtZSk7aWYoZSlmb3IoaT1lLmxlbmd0aC0xO2k+PTA7aS0tKXttPWVbaV07dmFyIHk9bS50YXJnZXQhPT12b2lkIDA/bS50YXJnZXQ6bS50YXJnZXRzIT09dm9pZCAwP20udGFyZ2V0czptLmFUYXJnZXRzO2ZvcihBcnJheS5pc0FycmF5KHkpfHwoeT1beV0pLHU9MCxwPXkubGVuZ3RoO3U8cDt1Kyspe3ZhciBUPXlbdV07aWYodHlwZW9mIFQ9PSJudW1iZXIiJiZUPj0wKXtmb3IoO0MubGVuZ3RoPD1UOylucyh0KTtzKFQsbSl9ZWxzZSBpZih0eXBlb2YgVD09Im51bWJlciImJlQ8MClzKEMubGVuZ3RoK1QsbSk7ZWxzZSBpZih0eXBlb2YgVD09InN0cmluZyIpZm9yKGI9MCxnPUMubGVuZ3RoO2I8ZztiKyspVD09PSJfYWxsIj9zKGIsbSk6VC5pbmRleE9mKCI6bmFtZSIpIT09LTE/Q1tiXS5zTmFtZT09PVQucmVwbGFjZSgiOm5hbWUiLCIiKSYmcyhiLG0pOnIuZm9yRWFjaChmdW5jdGlvbihQKXtpZihQW2JdKXt2YXIgYz1IKFBbYl0uY2VsbCk7VC5tYXRjaCgvXlthLXpdW1x3LV0qJC9pKSYmKFQ9Ii4iK1QpLGMuaXMoVCkmJnMoYixtKX19KX19aWYobilmb3IoaT0wLG89bi5sZW5ndGg7aTxvO2krKylzKGksbltpXSl9ZnVuY3Rpb24gcnModCxlLG4scil7QXJyYXkuaXNBcnJheShlKXx8KGU9QmkoZSkpO2Zvcih2YXIgcz0wLGksbz10LmFvQ29sdW1ucyx1PTAscD1lLmxlbmd0aDt1PHA7dSsrKXt2YXIgYj1vW2VbdV1dLGc9bj9iLnNXaWR0aE9yaWc6Yi5zV2lkdGg7aWYoISghciYmYi5iVmlzaWJsZT09PSExKSl7aWYoZz09bnVsbClyZXR1cm4gbnVsbDtpZih0eXBlb2YgZz09Im51bWJlciIpaT0icHgiLHMrPWc7ZWxzZXt2YXIgbT1nLm1hdGNoKC8oW1xkXC5dKykoW15cZF0qKS8pO20mJihzKz1tWzFdKjEsaT1tLmxlbmd0aD09PTM/bVsyXToicHgiKX19fXJldHVybiBzK2l9ZnVuY3Rpb24gQmkodCl7dmFyIGU9SCh0KS5jbG9zZXN0KCJbZGF0YS1kdC1jb2x1bW5dIikuYXR0cigiZGF0YS1kdC1jb2x1bW4iKTtyZXR1cm4gZT9lLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuKjF9KTpbXX1mdW5jdGlvbiB5bih0LGUsbixyKXt2YXIgcz10LmFvRGF0YS5sZW5ndGgsaT1ILmV4dGVuZCghMCx7fSxidC5tb2RlbHMub1Jvdyx7c3JjOm4/ImRvbSI6ImRhdGEiLGlkeDpzfSk7aS5fYURhdGE9ZSx0LmFvRGF0YS5wdXNoKGkpO2Zvcih2YXIgbz10LmFvQ29sdW1ucyx1PTAscD1vLmxlbmd0aDt1PHA7dSsrKW9bdV0uc1R5cGU9bnVsbDt0LmFpRGlzcGxheU1hc3Rlci5wdXNoKHMpO3ZhciBiPXQucm93SWRGbihlKTtyZXR1cm4gYiE9PXZvaWQgMCYmKHQuYUlkc1tiXT1pKSwobnx8IXQub0ZlYXR1cmVzLmJEZWZlclJlbmRlcikmJmFzKHQscyxuLHIpLHN9ZnVuY3Rpb24gTmkodCxlKXt2YXIgbjtyZXR1cm4gZSBpbnN0YW5jZW9mIEh8fChlPUgoZSkpLGUubWFwKGZ1bmN0aW9uKHIscyl7cmV0dXJuIG49aXModCxzKSx5bih0LG4uZGF0YSxzLG4uY2VsbHMpfSl9ZnVuY3Rpb24gUmUodCxlLG4scil7cj09PSJzZWFyY2giP3I9ImZpbHRlciI6cj09PSJvcmRlciImJihyPSJzb3J0Iik7dmFyIHM9dC5hb0RhdGFbZV07aWYocyl7dmFyIGk9dC5pRHJhdyxvPXQuYW9Db2x1bW5zW25dLHU9cy5fYURhdGEscD1vLnNEZWZhdWx0Q29udGVudCxiPW8uZm5HZXREYXRhKHUscix7c2V0dGluZ3M6dCxyb3c6ZSxjb2w6bn0pO2lmKHIhPT0iZGlzcGxheSImJmImJnR5cGVvZiBiPT0ib2JqZWN0IiYmYi5ub2RlTmFtZSYmKGI9Yi5pbm5lckhUTUwpLGI9PT12b2lkIDApcmV0dXJuIHQuaURyYXdFcnJvciE9aSYmcD09PW51bGwmJihPZSh0LDAsIlJlcXVlc3RlZCB1bmtub3duIHBhcmFtZXRlciAiKyh0eXBlb2Ygby5tRGF0YT09ImZ1bmN0aW9uIj8ie2Z1bmN0aW9ufSI6IiciK28ubURhdGErIiciKSsiIGZvciByb3cgIitlKyIsIGNvbHVtbiAiK24sNCksdC5pRHJhd0Vycm9yPWkpLHA7aWYoKGI9PT11fHxiPT09bnVsbCkmJnAhPT1udWxsJiZyIT09dm9pZCAwKWI9cDtlbHNlIGlmKHR5cGVvZiBiPT0iZnVuY3Rpb24iKXJldHVybiBiLmNhbGwodSk7aWYoYj09PW51bGwmJnI9PT0iZGlzcGxheSIpcmV0dXJuIiI7aWYocj09PSJmaWx0ZXIiKXt2YXIgZz1idC5leHQudHlwZS5zZWFyY2g7Z1tvLnNUeXBlXSYmKGI9Z1tvLnNUeXBlXShiKSl9cmV0dXJuIGJ9fWZ1bmN0aW9uIG9sKHQsZSxuLHIpe3ZhciBzPXQuYW9Db2x1bW5zW25dLGk9dC5hb0RhdGFbZV0uX2FEYXRhO3MuZm5TZXREYXRhKGkscix7c2V0dGluZ3M6dCxyb3c6ZSxjb2w6bn0pfWZ1bmN0aW9uIEFyKHQsZSl7ZSYmdHlwZW9mIGU9PSJvYmplY3QiJiZlLm5vZGVOYW1lP0godCkuZW1wdHkoKS5hcHBlbmQoZSk6dC5pbm5lckhUTUw9ZX12YXIgS249L1xbLio/XF0kLyxGbj0vXChcKSQvO2Z1bmN0aW9uIFZhKHQpe3ZhciBlPXQubWF0Y2goLyhcXC58W14uXSkrL2cpfHxbIiJdO3JldHVybiBlLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9cXFwuL2csIi4iKX0pfXZhciBFbj1idC51dGlsLmdldCx2bj1idC51dGlsLnNldDtmdW5jdGlvbiBIYSh0KXtyZXR1cm4gQ2UodC5hb0RhdGEsIl9hRGF0YSIpfWZ1bmN0aW9uIE9pKHQpe3QuYW9EYXRhLmxlbmd0aD0wLHQuYWlEaXNwbGF5TWFzdGVyLmxlbmd0aD0wLHQuYWlEaXNwbGF5Lmxlbmd0aD0wLHQuYUlkcz17fX1mdW5jdGlvbiBScih0LGUsbixyKXt2YXIgcz10LmFvRGF0YVtlXSxpLG87aWYocy5fYVNvcnREYXRhPW51bGwscy5fYUZpbHRlckRhdGE9bnVsbCxzLmRpc3BsYXlEYXRhPW51bGwsbj09PSJkb20ifHwoIW58fG49PT0iYXV0byIpJiZzLnNyYz09PSJkb20iKXMuX2FEYXRhPWlzKHQscyxyLHI9PT12b2lkIDA/dm9pZCAwOnMuX2FEYXRhKS5kYXRhO2Vsc2V7dmFyIHU9cy5hbkNlbGxzLHA9RWkodCxlKTtpZih1KWlmKHIhPT12b2lkIDApQXIodVtyXSxwW3JdKTtlbHNlIGZvcihpPTAsbz11Lmxlbmd0aDtpPG87aSsrKUFyKHVbaV0scFtpXSl9dmFyIGI9dC5hb0NvbHVtbnM7aWYociE9PXZvaWQgMCliW3JdLnNUeXBlPW51bGwsYltyXS5tYXhMZW5TdHJpbmc9bnVsbDtlbHNle2ZvcihpPTAsbz1iLmxlbmd0aDtpPG87aSsrKWJbaV0uc1R5cGU9bnVsbCxiW2ldLm1heExlblN0cmluZz1udWxsO3NzKHQscyl9fWZ1bmN0aW9uIGlzKHQsZSxuLHIpe3ZhciBzPVtdLGk9ZS5maXJzdENoaWxkLG8sdSxwPTAsYixnPXQuYW9Db2x1bW5zLG09dC5fcm93UmVhZE9iamVjdDtyPXIhPT12b2lkIDA/cjptP3t9OltdO3ZhciBDPWZ1bmN0aW9uKGgsXyl7aWYodHlwZW9mIGg9PSJzdHJpbmciKXt2YXIgRj1oLmluZGV4T2YoIkAiKTtpZihGIT09LTEpe3ZhciBPPWguc3Vic3RyaW5nKEYrMSksZj12bihoKTtmKHIsXy5nZXRBdHRyaWJ1dGUoTykpfX19LHk9ZnVuY3Rpb24oaCl7aWYobj09PXZvaWQgMHx8bj09PXApaWYodT1nW3BdLGI9aC5pbm5lckhUTUwudHJpbSgpLHUmJnUuX2JBdHRyU3JjKXt2YXIgXz12bih1Lm1EYXRhLl8pO18ocixiKSxDKHUubURhdGEuc29ydCxoKSxDKHUubURhdGEudHlwZSxoKSxDKHUubURhdGEuZmlsdGVyLGgpfWVsc2UgbT8odS5fc2V0dGVyfHwodS5fc2V0dGVyPXZuKHUubURhdGEpKSx1Ll9zZXR0ZXIocixiKSk6cltwXT1iO3ArK307aWYoaSlmb3IoO2k7KW89aS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpLChvPT0iVEQifHxvPT0iVEgiKSYmKHkoaSkscy5wdXNoKGkpKSxpPWkubmV4dFNpYmxpbmc7ZWxzZXtzPWUuYW5DZWxscztmb3IodmFyIFQ9MCxQPXMubGVuZ3RoO1Q8UDtUKyspeShzW1RdKX12YXIgYz1lLmZpcnN0Q2hpbGQ/ZTplLm5UcjtpZihjKXt2YXIgbD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtsJiZ2bih0LnJvd0lkKShyLGwpfXJldHVybntkYXRhOnIsY2VsbHM6c319ZnVuY3Rpb24gRWkodCxlKXtsZXQgbj10LmFvRGF0YVtlXSxyPXQuYW9Db2x1bW5zO2lmKCFuLmRpc3BsYXlEYXRhKXtuLmRpc3BsYXlEYXRhPVtdO2Zvcih2YXIgcz0wLGk9ci5sZW5ndGg7czxpO3MrKyluLmRpc3BsYXlEYXRhLnB1c2goUmUodCxlLHMsImRpc3BsYXkiKSl9cmV0dXJuIG4uZGlzcGxheURhdGF9ZnVuY3Rpb24gYXModCxlLG4scil7dmFyIHM9dC5hb0RhdGFbZV0saT1zLl9hRGF0YSxvPVtdLHUscCxiLGcsbSxDLHk9dC5vQ2xhc3Nlcy50Ym9keS5yb3c7aWYocy5uVHI9PT1udWxsKXtmb3IodT1ufHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLHMublRyPXUscy5hbkNlbGxzPW8sT24odSx5KSx1Ll9EVF9Sb3dJbmRleD1lLHNzKHQscyksZz0wLG09dC5hb0NvbHVtbnMubGVuZ3RoO2c8bTtnKyspe2I9dC5hb0NvbHVtbnNbZ10sQz0hKG4mJnJbZ10pLHA9Qz9kb2N1bWVudC5jcmVhdGVFbGVtZW50KGIuc0NlbGxUeXBlKTpyW2ddLHB8fE9lKHQsMCwiSW5jb3JyZWN0IGNvbHVtbiBjb3VudCIsMTgpLHAuX0RUX0NlbGxJbmRleD17cm93OmUsY29sdW1uOmd9LG8ucHVzaChwKTt2YXIgVD1FaSh0LGUpOyhDfHwoYi5tUmVuZGVyfHxiLm1EYXRhIT09ZykmJighSC5pc1BsYWluT2JqZWN0KGIubURhdGEpfHxiLm1EYXRhLl8hPT1nKyIuZGlzcGxheSIpKSYmQXIocCxUW2ddKSxPbihwLGIuc0NsYXNzKSxiLmJWaXNpYmxlJiZDP3UuYXBwZW5kQ2hpbGQocCk6IWIuYlZpc2libGUmJiFDJiZwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocCksYi5mbkNyZWF0ZWRDZWxsJiZiLmZuQ3JlYXRlZENlbGwuY2FsbCh0Lm9JbnN0YW5jZSxwLFJlKHQsZSxnKSxpLGUsZyl9WnQodCwiYW9Sb3dDcmVhdGVkQ2FsbGJhY2siLCJyb3ctY3JlYXRlZCIsW3UsaSxlLG9dKX1lbHNlIE9uKHMublRyLHkpfWZ1bmN0aW9uIHNzKHQsZSl7dmFyIG49ZS5uVHIscj1lLl9hRGF0YTtpZihuKXt2YXIgcz10LnJvd0lkRm4ocik7aWYocyYmKG4uaWQ9cyksci5EVF9Sb3dDbGFzcyl7dmFyIGk9ci5EVF9Sb3dDbGFzcy5zcGxpdCgiICIpO2UuX19yb3djPWUuX19yb3djP3huKGUuX19yb3djLmNvbmNhdChpKSk6aSxIKG4pLnJlbW92ZUNsYXNzKGUuX19yb3djLmpvaW4oIiAiKSkuYWRkQ2xhc3Moci5EVF9Sb3dDbGFzcyl9ci5EVF9Sb3dBdHRyJiZIKG4pLmF0dHIoci5EVF9Sb3dBdHRyKSxyLkRUX1Jvd0RhdGEmJkgobikuZGF0YShyLkRUX1Jvd0RhdGEpfX1mdW5jdGlvbiBVYSh0LGUpe3ZhciBuPXQub0NsYXNzZXMscj10LmFvQ29sdW1ucyxzLGksbyx1PWU9PT0iaGVhZGVyIj90Lm5USGVhZDp0Lm5URm9vdCxwPWU9PT0iaGVhZGVyIj8ic1RpdGxlIjplO2lmKHUpe2lmKChlPT09ImhlYWRlciJ8fENlKHQuYW9Db2x1bW5zLHApLmpvaW4oIiIpKSYmKG89SCgidHIiLHUpLG8ubGVuZ3RofHwobz1IKCI8dHIvPiIpLmFwcGVuZFRvKHUpKSxvLmxlbmd0aD09PTEpKXt2YXIgYj1IKCJ0ZCwgdGgiLG8pO2ZvcihzPWIubGVuZ3RoLGk9ci5sZW5ndGg7czxpO3MrKylIKCI8dGgvPiIpLmh0bWwocltzXVtwXXx8IiIpLmFwcGVuZFRvKG8pfXZhciBnPWxzKHQsdSwhMCk7ZT09PSJoZWFkZXIiP3QuYW9IZWFkZXI9Zzp0LmFvRm9vdGVyPWcsSCh1KS5jaGlsZHJlbigidHIiKS5hdHRyKCJyb2xlIiwicm93IiksSCh1KS5jaGlsZHJlbigidHIiKS5jaGlsZHJlbigidGgsIHRkIikuZWFjaChmdW5jdGlvbigpe0ZyKHQsZSkodCxIKHRoaXMpLG4pfSl9fWZ1bmN0aW9uIG9zKHQsZSxuKXt2YXIgcixzLGksbz1bXSx1PVtdLHA9dC5hb0NvbHVtbnMsYj1wLmxlbmd0aCxnLG07aWYoZSl7Zm9yKG58fChuPWFuKGIpLmZpbHRlcihmdW5jdGlvbihUKXtyZXR1cm4gcFtUXS5iVmlzaWJsZX0pKSxyPTA7cjxlLmxlbmd0aDtyKyspb1tyXT1lW3JdLnNsaWNlKCkuZmlsdGVyKGZ1bmN0aW9uKFQsUCl7cmV0dXJuIG4uaW5jbHVkZXMoUCl9KSx1LnB1c2goW10pO2ZvcihyPTA7cjxvLmxlbmd0aDtyKyspZm9yKHM9MDtzPG9bcl0ubGVuZ3RoO3MrKylpZihnPTEsbT0xLHVbcl1bc109PT12b2lkIDApe2ZvcihpPW9bcl1bc10uY2VsbDtvW3IrZ10hPT12b2lkIDAmJm9bcl1bc10uY2VsbD09b1tyK2ddW3NdLmNlbGw7KXVbcitnXVtzXT1udWxsLGcrKztmb3IoO29bcl1bcyttXSE9PXZvaWQgMCYmb1tyXVtzXS5jZWxsPT1vW3JdW3MrbV0uY2VsbDspe2Zvcih2YXIgQz0wO0M8ZztDKyspdVtyK0NdW3MrbV09bnVsbDttKyt9dmFyIHk9SCgic3Bhbi5kdC1jb2x1bW4tdGl0bGUiLGkpO3Vbcl1bc109e2NlbGw6aSxjb2xzcGFuOm0scm93c3BhbjpnLHRpdGxlOnkubGVuZ3RoP3kuaHRtbCgpOkgoaSkuaHRtbCgpfX1yZXR1cm4gdX19ZnVuY3Rpb24gSXIodCxlKXtmb3IodmFyIG49b3ModCxlKSxyLHMsaT0wO2k8ZS5sZW5ndGg7aSsrKXtpZihyPWVbaV0ucm93LHIpZm9yKDtzPXIuZmlyc3RDaGlsZDspci5yZW1vdmVDaGlsZChzKTtmb3IodmFyIG89MDtvPG5baV0ubGVuZ3RoO28rKyl7dmFyIHU9bltpXVtvXTt1JiZIKHUuY2VsbCkuYXBwZW5kVG8ocikuYXR0cigicm93c3BhbiIsdS5yb3dzcGFuKS5hdHRyKCJjb2xzcGFuIix1LmNvbHNwYW4pfX19ZnVuY3Rpb24gTG4odCxlKXtmbCh0KTt2YXIgbj1adCh0LCJhb1ByZURyYXdDYWxsYmFjayIsInByZURyYXciLFt0XSk7aWYobi5pbmRleE9mKCExKSE9PS0xKXtrZSh0LCExKTtyZXR1cm59dmFyIHI9W10scz0wLGk9RWUodCk9PSJzc3AiLG89dC5haURpc3BsYXksdT10Ll9pRGlzcGxheVN0YXJ0LHA9dC5mbkRpc3BsYXlFbmQoKSxiPXQuYW9Db2x1bW5zLGc9SCh0Lm5UQm9keSk7aWYodC5iRHJhd2luZz0hMCx0LmRlZmVyTG9hZGluZyl0LmRlZmVyTG9hZGluZz0hMSx0LmlEcmF3Kyssa2UodCwhMSk7ZWxzZSBpZighaSl0LmlEcmF3Kys7ZWxzZSBpZighdC5iRGVzdHJveWluZyYmIWUpe3QuaURyYXc9PT0wJiZnLmVtcHR5KCkuYXBwZW5kKFdhKHQpKSxobCh0KTtyZXR1cm59aWYoby5sZW5ndGghPT0wKWZvcih2YXIgbT1pPzA6dSxDPWk/dC5hb0RhdGEubGVuZ3RoOnAseT1tO3k8Qzt5Kyspe3ZhciBUPW9beV0sUD10LmFvRGF0YVtUXTtQLm5Ucj09PW51bGwmJmFzKHQsVCk7Zm9yKHZhciBjPVAublRyLGw9MDtsPGIubGVuZ3RoO2wrKyl7dmFyIGg9YltsXSxfPVAuYW5DZWxsc1tsXTtPbihfLGxlLnR5cGUuY2xhc3NOYW1lW2guc1R5cGVdKSxPbihfLHQub0NsYXNzZXMudGJvZHkuY2VsbCl9WnQodCwiYW9Sb3dDYWxsYmFjayIsbnVsbCxbYyxQLl9hRGF0YSxzLHksVF0pLHIucHVzaChjKSxzKyt9ZWxzZSByWzBdPVdhKHQpO1p0KHQsImFvSGVhZGVyQ2FsbGJhY2siLCJoZWFkZXIiLFtIKHQublRIZWFkKS5jaGlsZHJlbigidHIiKVswXSxIYSh0KSx1LHAsb10pLFp0KHQsImFvRm9vdGVyQ2FsbGJhY2siLCJmb290ZXIiLFtIKHQublRGb290KS5jaGlsZHJlbigidHIiKVswXSxIYSh0KSx1LHAsb10pLGdbMF0ucmVwbGFjZUNoaWxkcmVuP2dbMF0ucmVwbGFjZUNoaWxkcmVuLmFwcGx5KGdbMF0scik6KGcuY2hpbGRyZW4oKS5kZXRhY2goKSxnLmFwcGVuZChIKHIpKSksSCh0Lm5UYWJsZVdyYXBwZXIpLnRvZ2dsZUNsYXNzKCJkdC1lbXB0eS1mb290ZXIiLEgoInRyIix0Lm5URm9vdCkubGVuZ3RoPT09MCksWnQodCwiYW9EcmF3Q2FsbGJhY2siLCJkcmF3IixbdF0sITApLHQuYlNvcnRlZD0hMSx0LmJGaWx0ZXJlZD0hMSx0LmJEcmF3aW5nPSExfWZ1bmN0aW9uIFJuKHQsZSxuKXt2YXIgcj10Lm9GZWF0dXJlcyxzPXIuYlNvcnQsaT1yLmJGaWx0ZXI7KG49PT12b2lkIDB8fG49PT0hMCkmJihGaSh0KSxzJiZ6aSh0KSxpP3RyKHQsdC5vUHJldmlvdXNTZWFyY2gpOnQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCkpLGUhPT0hMCYmKHQuX2lEaXNwbGF5U3RhcnQ9MCksdC5fZHJhd0hvbGQ9ZSxMbih0KSx0Ll9kcmF3SG9sZD0hMX1mdW5jdGlvbiBXYSh0KXt2YXIgZT10Lm9MYW5ndWFnZSxuPWUuc1plcm9SZWNvcmRzLHI9RWUodCk7cmV0dXJuIHQuaURyYXc8MSYmcj09PSJzc3AifHx0LmlEcmF3PD0xJiZyPT09ImFqYXgiP249ZS5zTG9hZGluZ1JlY29yZHM6ZS5zRW1wdHlUYWJsZSYmdC5mblJlY29yZHNUb3RhbCgpPT09MCYmKG49ZS5zRW1wdHlUYWJsZSksSCgiPHRyLz4iKS5hcHBlbmQoSCgiPHRkIC8+Iix7Y29sU3BhbjpFcih0KSxjbGFzczp0Lm9DbGFzc2VzLmVtcHR5LnJvd30pLmh0bWwobikpWzBdfWZ1bmN0aW9uIF9pKHQsZSxuKXtpZihBcnJheS5pc0FycmF5KG4pKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKylfaSh0LGUsbltyXSk7cmV0dXJufXZhciBzPXRbZV07SC5pc1BsYWluT2JqZWN0KG4pP24uZmVhdHVyZXM/KG4ucm93SWQmJih0LmlkPW4ucm93SWQpLG4ucm93Q2xhc3MmJih0LmNsYXNzTmFtZT1uLnJvd0NsYXNzKSxzLmlkPW4uaWQscy5jbGFzc05hbWU9bi5jbGFzc05hbWUsX2kodCxlLG4uZmVhdHVyZXMpKTpPYmplY3Qua2V5cyhuKS5tYXAoZnVuY3Rpb24oaSl7cy5jb250ZW50cy5wdXNoKHtmZWF0dXJlOmksb3B0czpuW2ldfSl9KTpzLmNvbnRlbnRzLnB1c2gobil9ZnVuY3Rpb24gbGwodCxlLG4pe2Zvcih2YXIgcixzPTA7czx0Lmxlbmd0aDtzKyspaWYocj10W3NdLHIucm93TnVtPT09ZSYmKG49PT0iZnVsbCImJnIuZnVsbHx8KG49PT0ic3RhcnQifHxuPT09ImVuZCIpJiYoci5zdGFydHx8ci5lbmQpKSlyZXR1cm4gcltuXXx8KHJbbl09e2NvbnRlbnRzOltdfSkscjtyZXR1cm4gcj17cm93TnVtOmV9LHJbbl09e2NvbnRlbnRzOltdfSx0LnB1c2gocikscn1mdW5jdGlvbiBHYSh0LGUsbil7dmFyIHI9W107SC5lYWNoKGUsZnVuY3Rpb24oaSxvKXtpZihvIT09bnVsbCl7dmFyIHU9aS5tYXRjaCgvXihbYS16XSspKFswLTldKikoW0EtWmEtel0qKSQvKSxwPXVbMl0/dVsyXSoxOjAsYj11WzNdP3VbM10udG9Mb3dlckNhc2UoKToiZnVsbCI7aWYodVsxXT09PW4pe3ZhciBnPWxsKHIscCxiKTtfaShnLGIsbyl9fX0pLHIuc29ydChmdW5jdGlvbihpLG8pe3ZhciB1PWkucm93TnVtLHA9by5yb3dOdW07aWYodT09PXApe3ZhciBiPWkuZnVsbCYmIW8uZnVsbD8tMToxO3JldHVybiBuPT09ImJvdHRvbSI/YiotMTpifXJldHVybiBwLXV9KSxuPT09ImJvdHRvbSImJnIucmV2ZXJzZSgpO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKWRlbGV0ZSByW3NdLnJvd051bSxkbCh0LHJbc10pO3JldHVybiByfWZ1bmN0aW9uIGRsKHQsZSl7dmFyIG49ZnVuY3Rpb24ocyxpKXtyZXR1cm4gbGUuZmVhdHVyZXNbc118fE9lKHQsMCwiVW5rbm93biBmZWF0dXJlOiAiK3MpLGxlLmZlYXR1cmVzW3NdLmFwcGx5KHRoaXMsW3QsaV0pfSxyPWZ1bmN0aW9uKHMpe2lmKGVbc10pZm9yKHZhciBpPWVbc10uY29udGVudHMsbz0wLHU9aS5sZW5ndGg7bzx1O28rKylpZihpW29dKXtpZih0eXBlb2YgaVtvXT09InN0cmluZyIpaVtvXT1uKGlbb10sbnVsbCk7ZWxzZSBpZihILmlzUGxhaW5PYmplY3QoaVtvXSkpaVtvXT1uKGlbb10uZmVhdHVyZSxpW29dLm9wdHMpO2Vsc2UgaWYodHlwZW9mIGlbb10ubm9kZT09ImZ1bmN0aW9uIilpW29dPWlbb10ubm9kZSh0KTtlbHNlIGlmKHR5cGVvZiBpW29dPT0iZnVuY3Rpb24iKXt2YXIgcD1pW29dKHQpO2lbb109dHlwZW9mIHAubm9kZT09ImZ1bmN0aW9uIj9wLm5vZGUoKTpwfX1lbHNlIGNvbnRpbnVlfTtyKCJzdGFydCIpLHIoImVuZCIpLHIoImZ1bGwiKX1mdW5jdGlvbiB1bCh0KXt2YXIgZT10Lm9DbGFzc2VzLG49SCh0Lm5UYWJsZSkscj1IKCI8ZGl2Lz4iKS5hdHRyKHtpZDp0LnNUYWJsZUlkKyJfd3JhcHBlciIsY2xhc3M6ZS5jb250YWluZXJ9KS5pbnNlcnRCZWZvcmUobik7aWYodC5uVGFibGVXcmFwcGVyPXJbMF0sdC5zRG9tKWNsKHQsdC5zRG9tLHIpO2Vsc2V7dmFyIHM9R2EodCx0LmxheW91dCwidG9wIiksaT1HYSh0LHQubGF5b3V0LCJib3R0b20iKSxvPUZyKHQsImxheW91dCIpO3MuZm9yRWFjaChmdW5jdGlvbih1KXtvKHQscix1KX0pLG8odCxyLHtmdWxsOnt0YWJsZTohMCxjb250ZW50czpbY3ModCldfX0pLGkuZm9yRWFjaChmdW5jdGlvbih1KXtvKHQscix1KX0pfXdsKHQpfWZ1bmN0aW9uIGNsKHQsZSxuKXtmb3IodmFyIHI9ZS5tYXRjaCgvKCIuKj8iKXwoJy4qPycpfC4vZykscyxpLG8sdSxwLGI9MDtiPHIubGVuZ3RoO2IrKyl7aWYocz1udWxsLGk9cltiXSxpPT0iPCIpe2lmKG89SCgiPGRpdi8+IiksdT1yW2IrMV0sdVswXT09IicifHx1WzBdPT0nIicpe3A9dS5yZXBsYWNlKC9bJyJdL2csIiIpO3ZhciBnPSIiLG07aWYocC5pbmRleE9mKCIuIikhPS0xKXt2YXIgQz1wLnNwbGl0KCIuIik7Zz1DWzBdLG09Q1sxXX1lbHNlIHBbMF09PSIjIj9nPXA6bT1wO28uYXR0cigiaWQiLGcuc3Vic3RyaW5nKDEpKS5hZGRDbGFzcyhtKSxiKyt9bi5hcHBlbmQobyksbj1vfWVsc2UgaT09Ij4iP249bi5wYXJlbnQoKTppPT0idCI/cz1jcyh0KTpidC5leHQuZmVhdHVyZS5mb3JFYWNoKGZ1bmN0aW9uKHkpe2k9PXkuY0ZlYXR1cmUmJihzPXkuZm5Jbml0KHQpKX0pO3MmJm4uYXBwZW5kKHMpfX1mdW5jdGlvbiBscyh0LGUsbil7dmFyIHI9dC5hb0NvbHVtbnMscz1IKGUpLmNoaWxkcmVuKCJ0ciIpLGksbyx1LHAsYixnLG0sQyx5LFQsUD1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0idGhlYWQiLGM9W10sbCxoPWZ1bmN0aW9uKFUsWCxRKXtmb3IodmFyIEU9VVtYXTtFW1FdOylRKys7cmV0dXJuIFF9O2Zvcih1PTAsZz1zLmxlbmd0aDt1PGc7dSsrKWMucHVzaChbXSk7Zm9yKHU9MCxnPXMubGVuZ3RoO3U8Zzt1KyspZm9yKGk9c1t1XSxDPTAsbz1pLmZpcnN0Q2hpbGQ7bzspe2lmKG8ubm9kZU5hbWUudG9VcHBlckNhc2UoKT09IlREInx8by5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT0iVEgiKXt2YXIgXz1bXTtpZih5PW8uZ2V0QXR0cmlidXRlKCJjb2xzcGFuIikqMSxUPW8uZ2V0QXR0cmlidXRlKCJyb3dzcGFuIikqMSx5PSF5fHx5PT09MHx8eT09PTE/MTp5LFQ9IVR8fFQ9PT0wfHxUPT09MT8xOlQsbT1oKGMsdSxDKSxsPXk9PT0xLG4pe2lmKGwpe3hpKHQsbSxIKG8pLmRhdGEoKSk7dmFyIEY9clttXSxPPW8uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpfHxudWxsLGY9by5zdHlsZS53aWR0aC5tYXRjaCgvd2lkdGg6XHMqKFxkK1tweGVtJV0rKS8pO2YmJihPPWZbMV0pLEYuc1dpZHRoT3JpZz1GLnNXaWR0aHx8TyxQPyhGLnNUaXRsZSE9PW51bGwmJiFGLmF1dG9UaXRsZSYmKG8uaW5uZXJIVE1MPUYuc1RpdGxlKSwhRi5zVGl0bGUmJmwmJihGLnNUaXRsZT1nbihvLmlubmVySFRNTCksRi5hdXRvVGl0bGU9ITApKTpGLmZvb3RlciYmKG8uaW5uZXJIVE1MPUYuZm9vdGVyKSxGLmFyaWFUaXRsZXx8KEYuYXJpYVRpdGxlPUgobykuYXR0cigiYXJpYS1sYWJlbCIpfHxGLnNUaXRsZSksRi5jbGFzc05hbWUmJkgobykuYWRkQ2xhc3MoRi5jbGFzc05hbWUpfUgoInNwYW4uZHQtY29sdW1uLXRpdGxlIixvKS5sZW5ndGg9PT0wJiZIKCI8c3Bhbj4iKS5hZGRDbGFzcygiZHQtY29sdW1uLXRpdGxlIikuYXBwZW5kKG8uY2hpbGROb2RlcykuYXBwZW5kVG8obyksUCYmSCgic3Bhbi5kdC1jb2x1bW4tb3JkZXIiLG8pLmxlbmd0aD09PTAmJkgoIjxzcGFuPiIpLmFkZENsYXNzKCJkdC1jb2x1bW4tb3JkZXIiKS5hcHBlbmRUbyhvKX1mb3IoYj0wO2I8eTtiKyspe2ZvcihwPTA7cDxUO3ArKyljW3UrcF1bbStiXT17Y2VsbDpvLHVuaXF1ZTpsfSxjW3UrcF0ucm93PWk7Xy5wdXNoKG0rYil9by5zZXRBdHRyaWJ1dGUoImRhdGEtZHQtY29sdW1uIix4bihfKS5qb2luKCIsIikpfW89by5uZXh0U2libGluZ31yZXR1cm4gY31mdW5jdGlvbiBmbCh0KXt2YXIgZT1FZSh0KT09InNzcCIsbj10LmlJbml0RGlzcGxheVN0YXJ0O24hPT12b2lkIDAmJm4hPT0tMSYmKHQuX2lEaXNwbGF5U3RhcnQ9ZT9uOm4+PXQuZm5SZWNvcmRzRGlzcGxheSgpPzA6bix0LmlJbml0RGlzcGxheVN0YXJ0PS0xKX1mdW5jdGlvbiBSaSh0LGUsbil7dmFyIHIscz10LmFqYXgsaT10Lm9JbnN0YW5jZSxvPWZ1bmN0aW9uKGcpe3ZhciBtPXQuanFYSFI/dC5qcVhIUi5zdGF0dXM6bnVsbDsoZz09PW51bGx8fHR5cGVvZiBtPT0ibnVtYmVyIiYmbT09MjA0KSYmKGc9e30sTHIodCxnLFtdKSk7dmFyIEM9Zy5lcnJvcnx8Zy5zRXJyb3I7aWYoQyYmT2UodCwwLEMpLGcuZCYmdHlwZW9mIGcuZD09InN0cmluZyIpdHJ5e2c9SlNPTi5wYXJzZShnLmQpfWNhdGNoe310Lmpzb249ZyxadCh0LG51bGwsInhociIsW3QsZyx0LmpxWEhSXSwhMCksbihnKX07aWYoSC5pc1BsYWluT2JqZWN0KHMpJiZzLmRhdGEpe3I9cy5kYXRhO3ZhciB1PXR5cGVvZiByPT0iZnVuY3Rpb24iP3IoZSx0KTpyO2U9dHlwZW9mIHI9PSJmdW5jdGlvbiImJnU/dTpILmV4dGVuZCghMCxlLHUpLGRlbGV0ZSBzLmRhdGF9dmFyIHA9e3VybDp0eXBlb2Ygcz09InN0cmluZyI/czoiIixkYXRhOmUsc3VjY2VzczpvLGRhdGFUeXBlOiJqc29uIixjYWNoZTohMSx0eXBlOnQuc1NlcnZlck1ldGhvZCxlcnJvcjpmdW5jdGlvbihnLG0pe3ZhciBDPVp0KHQsbnVsbCwieGhyIixbdCxudWxsLHQuanFYSFJdLCEwKTtDLmluZGV4T2YoITApPT09LTEmJihtPT0icGFyc2VyZXJyb3IiP09lKHQsMCwiSW52YWxpZCBKU09OIHJlc3BvbnNlIiwxKTpnLnJlYWR5U3RhdGU9PT00JiZPZSh0LDAsIkFqYXggZXJyb3IiLDcpKSxrZSh0LCExKX19O2lmKEguaXNQbGFpbk9iamVjdChzKSYmSC5leHRlbmQocCxzKSx0Lm9BamF4RGF0YT1lLFp0KHQsbnVsbCwicHJlWGhyIixbdCxlLHBdLCEwKSx0eXBlb2Ygcz09ImZ1bmN0aW9uIil0LmpxWEhSPXMuY2FsbChpLGUsbyx0KTtlbHNlIGlmKHMudXJsPT09IiIpe3ZhciBiPXt9O2J0LnV0aWwuc2V0KHMuZGF0YVNyYykoYixbXSksbyhiKX1lbHNlIHQuanFYSFI9SC5hamF4KHApO3ImJihzLmRhdGE9cil9ZnVuY3Rpb24gaGwodCl7dC5pRHJhdysrLGtlKHQsITApLFJpKHQscGwodCksZnVuY3Rpb24oZSl7YmwodCxlKX0pfWZ1bmN0aW9uIHBsKHQpe3ZhciBlPXQuYW9Db2x1bW5zLG49dC5vRmVhdHVyZXMscj10Lm9QcmV2aW91c1NlYXJjaCxzPXQuYW9QcmVTZWFyY2hDb2xzLGk9ZnVuY3Rpb24obyx1KXtyZXR1cm4gdHlwZW9mIGVbb11bdV09PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjplW29dW3VdfTtyZXR1cm57ZHJhdzp0LmlEcmF3LGNvbHVtbnM6ZS5tYXAoZnVuY3Rpb24obyx1KXtyZXR1cm57ZGF0YTppKHUsIm1EYXRhIiksbmFtZTpvLnNOYW1lLHNlYXJjaGFibGU6by5iU2VhcmNoYWJsZSxvcmRlcmFibGU6by5iU29ydGFibGUsc2VhcmNoOnt2YWx1ZTpzW3VdLnNlYXJjaCxyZWdleDpzW3VdLnJlZ2V4LGZpeGVkOk9iamVjdC5rZXlzKG8uc2VhcmNoRml4ZWQpLm1hcChmdW5jdGlvbihwKXtyZXR1cm57bmFtZTpwLHRlcm06by5zZWFyY2hGaXhlZFtwXS50b1N0cmluZygpfX0pfX19KSxvcmRlcjp6cih0KS5tYXAoZnVuY3Rpb24obyl7cmV0dXJue2NvbHVtbjpvLmNvbCxkaXI6by5kaXIsbmFtZTppKG8uY29sLCJzTmFtZSIpfX0pLHN0YXJ0OnQuX2lEaXNwbGF5U3RhcnQsbGVuZ3RoOm4uYlBhZ2luYXRlP3QuX2lEaXNwbGF5TGVuZ3RoOi0xLHNlYXJjaDp7dmFsdWU6ci5zZWFyY2gscmVnZXg6ci5yZWdleCxmaXhlZDpPYmplY3Qua2V5cyh0LnNlYXJjaEZpeGVkKS5tYXAoZnVuY3Rpb24obyl7cmV0dXJue25hbWU6byx0ZXJtOnQuc2VhcmNoRml4ZWRbb10udG9TdHJpbmcoKX19KX19fWZ1bmN0aW9uIGJsKHQsZSl7dmFyIG49THIodCxlKSxyPXZpKHQsImRyYXciLGUpLHM9dmkodCwicmVjb3Jkc1RvdGFsIixlKSxpPXZpKHQsInJlY29yZHNGaWx0ZXJlZCIsZSk7aWYociE9PXZvaWQgMCl7aWYocioxPHQuaURyYXcpcmV0dXJuO3QuaURyYXc9cioxfW58fChuPVtdKSxPaSh0KSx0Ll9pUmVjb3Jkc1RvdGFsPXBhcnNlSW50KHMsMTApLHQuX2lSZWNvcmRzRGlzcGxheT1wYXJzZUludChpLDEwKTtmb3IodmFyIG89MCx1PW4ubGVuZ3RoO288dTtvKyspeW4odCxuW29dKTt0LmFpRGlzcGxheT10LmFpRGlzcGxheU1hc3Rlci5zbGljZSgpLEZpKHQpLExuKHQsITApLFByKHQpLGtlKHQsITEpfWZ1bmN0aW9uIExyKHQsZSxuKXt2YXIgcj0iZGF0YSI7aWYoSC5pc1BsYWluT2JqZWN0KHQuYWpheCkmJnQuYWpheC5kYXRhU3JjIT09dm9pZCAwKXt2YXIgcz10LmFqYXguZGF0YVNyYzt0eXBlb2Ygcz09InN0cmluZyJ8fHR5cGVvZiBzPT0iZnVuY3Rpb24iP3I9czpzLmRhdGEhPT12b2lkIDAmJihyPXMuZGF0YSl9aWYoIW4pcmV0dXJuIHI9PT0iZGF0YSI/ZS5hYURhdGF8fGVbcl06ciE9PSIiP0VuKHIpKGUpOmU7dm4ocikoZSxuKX1mdW5jdGlvbiB2aSh0LGUsbil7dmFyIHI9SC5pc1BsYWluT2JqZWN0KHQuYWpheCk/dC5hamF4LmRhdGFTcmM6bnVsbDtpZihyJiZyW2VdKXJldHVybiBFbihyW2VdKShuKTt2YXIgcz0iIjtyZXR1cm4gZT09PSJkcmF3Ij9zPSJzRWNobyI6ZT09PSJyZWNvcmRzVG90YWwiP3M9ImlUb3RhbFJlY29yZHMiOmU9PT0icmVjb3Jkc0ZpbHRlcmVkIiYmKHM9ImlUb3RhbERpc3BsYXlSZWNvcmRzIiksbltzXSE9PXZvaWQgMD9uW3NdOm5bZV19ZnVuY3Rpb24gdHIodCxlKXt2YXIgbj10LmFvUHJlU2VhcmNoQ29scztpZihFZSh0KSE9InNzcCIpe3lsKHQpLHQuYWlEaXNwbGF5PXQuYWlEaXNwbGF5TWFzdGVyLnNsaWNlKCksX3IodC5haURpc3BsYXksdCxlLnNlYXJjaCxlKSxILmVhY2godC5zZWFyY2hGaXhlZCxmdW5jdGlvbihpLG8pe19yKHQuYWlEaXNwbGF5LHQsbyx7fSl9KTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIHM9bltyXTtfcih0LmFpRGlzcGxheSx0LHMuc2VhcmNoLHMsciksSC5lYWNoKHQuYW9Db2x1bW5zW3JdLnNlYXJjaEZpeGVkLGZ1bmN0aW9uKGksbyl7X3IodC5haURpc3BsYXksdCxvLHt9LHIpfSl9bWwodCl9dC5iRmlsdGVyZWQ9ITAsWnQodCxudWxsLCJzZWFyY2giLFt0XSl9ZnVuY3Rpb24gbWwodCl7Zm9yKHZhciBlPWJ0LmV4dC5zZWFyY2gsbj10LmFpRGlzcGxheSxyLHMsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Zm9yKHZhciB1PVtdLHA9MCxiPW4ubGVuZ3RoO3A8YjtwKyspcz1uW3BdLHI9dC5hb0RhdGFbc10sZVtpXSh0LHIuX2FGaWx0ZXJEYXRhLHMsci5fYURhdGEscCkmJnUucHVzaChzKTtuLmxlbmd0aD0wLG4ucHVzaC5hcHBseShuLHUpfX1mdW5jdGlvbiBfcih0LGUsbixyLHMpe2lmKG4hPT0iIil7dmFyIGk9MCxvPVtdLHU9dHlwZW9mIG49PSJmdW5jdGlvbiI/bjpudWxsLHA9biBpbnN0YW5jZW9mIFJlZ0V4cD9uOnU/bnVsbDp2bChuLHIpO2ZvcihpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBiPWUuYW9EYXRhW3RbaV1dLGc9cz09PXZvaWQgMD9iLl9zRmlsdGVyUm93OmIuX2FGaWx0ZXJEYXRhW3NdOyh1JiZ1KGcsYi5fYURhdGEsdFtpXSxzKXx8cCYmcC50ZXN0KGcpKSYmby5wdXNoKHRbaV0pfWZvcih0Lmxlbmd0aD1vLmxlbmd0aCxpPTA7aTxvLmxlbmd0aDtpKyspdFtpXT1vW2ldfX1mdW5jdGlvbiB2bCh0LGUpe3ZhciBuPVtdLHI9SC5leHRlbmQoe30se2JvdW5kYXJ5OiExLGNhc2VJbnNlbnNpdGl2ZTohMCxleGFjdDohMSxyZWdleDohMSxzbWFydDohMH0sZSk7aWYodHlwZW9mIHQhPSJzdHJpbmciJiYodD10LnRvU3RyaW5nKCkpLHQ9RHIodCksci5leGFjdClyZXR1cm4gbmV3IFJlZ0V4cCgiXiIrQ2kodCkrIiQiLHIuY2FzZUluc2Vuc2l0aXZlPyJpIjoiIik7aWYodD1yLnJlZ2V4P3Q6Q2kodCksci5zbWFydCl7dmFyIHM9dC5tYXRjaCgvIT9bIlx1MjAxQ11bXiJcdTIwMURdK1siXHUyMDFEXXxbXiBdKy9nKXx8WyIiXSxpPXMubWFwKGZ1bmN0aW9uKHApe3ZhciBiPSExLGc7cmV0dXJuIHAuY2hhckF0KDApPT09IiEiJiYoYj0hMCxwPXAuc3Vic3RyaW5nKDEpKSxwLmNoYXJBdCgwKT09PSciJz8oZz1wLm1hdGNoKC9eIiguKikiJC8pLHA9Zz9nWzFdOnApOnAuY2hhckF0KDApPT09Ilx1MjAxQyImJihnPXAubWF0Y2goL15cdTIwMUMoLiopXHUyMDFEJC8pLHA9Zz9nWzFdOnApLGImJihwLmxlbmd0aD4xJiZuLnB1c2goIig/ISIrcCsiKSIpLHA9IiIpLHAucmVwbGFjZSgvIi9nLCIiKX0pLG89bi5sZW5ndGg/bi5qb2luKCIiKToiIix1PXIuYm91bmRhcnk/IlxcYiI6IiI7dD0iXig/PS4qPyIrdStpLmpvaW4oIikoPz0uKj8iK3UpKyIpKCIrbysiLikqJCJ9cmV0dXJuIG5ldyBSZWdFeHAodCxyLmNhc2VJbnNlbnNpdGl2ZT8iaSI6IiIpfXZhciBDaT1idC51dGlsLmVzY2FwZVJlZ2V4LFRyPUgoIjxkaXY+IilbMF0sZ2w9VHIudGV4dENvbnRlbnQhPT12b2lkIDA7ZnVuY3Rpb24geWwodCl7Zm9yKHZhciBlPXQuYW9Db2x1bW5zLG49dC5hb0RhdGEscixzLGksbyx1LHAsYj0hMSxnPTA7ZzxuLmxlbmd0aDtnKyspaWYobltnXSYmKHA9bltnXSwhcC5fYUZpbHRlckRhdGEpKXtmb3Iobz1bXSxzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXI9ZVtzXSxyLmJTZWFyY2hhYmxlPyh1PVJlKHQsZyxzLCJmaWx0ZXIiKSx1PT09bnVsbCYmKHU9IiIpLHR5cGVvZiB1IT0ic3RyaW5nIiYmdS50b1N0cmluZyYmKHU9dS50b1N0cmluZygpKSk6dT0iIix1LmluZGV4T2YmJnUuaW5kZXhPZigiJiIpIT09LTEmJihUci5pbm5lckhUTUw9dSx1PWdsP1RyLnRleHRDb250ZW50OlRyLmlubmVyVGV4dCksdS5yZXBsYWNlJiYodT11LnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIiKSksby5wdXNoKHUpO3AuX2FGaWx0ZXJEYXRhPW8scC5fc0ZpbHRlclJvdz1vLmpvaW4oIiAgIiksYj0hMH1yZXR1cm4gYn1mdW5jdGlvbiBrcih0KXt2YXIgZSxuPXQub0luaXQscj10LmRlZmVyTG9hZGluZyxzPUVlKHQpO2lmKCF0LmJJbml0aWFsaXNlZCl7c2V0VGltZW91dChmdW5jdGlvbigpe2tyKHQpfSwyMDApO3JldHVybn1VYSh0LCJoZWFkZXIiKSxVYSh0LCJmb290ZXIiKSxTbCh0LG4sZnVuY3Rpb24oKXtJcih0LHQuYW9IZWFkZXIpLElyKHQsdC5hb0Zvb3Rlcik7dmFyIGk9dC5pSW5pdERpc3BsYXlTdGFydDtpZihuLmFhRGF0YSlmb3IoZT0wO2U8bi5hYURhdGEubGVuZ3RoO2UrKyl5bih0LG4uYWFEYXRhW2VdKTtlbHNlKHJ8fHM9PSJkb20iKSYmTmkodCxIKHQublRCb2R5KS5jaGlsZHJlbigidHIiKSk7dC5haURpc3BsYXk9dC5haURpc3BsYXlNYXN0ZXIuc2xpY2UoKSx1bCh0KSxDbCh0KSxocyh0KSxrZSh0LCEwKSxadCh0LG51bGwsInByZUluaXQiLFt0XSwhMCksUm4odCksKHMhPSJzc3AifHxyKSYmKHM9PSJhamF4Ij9SaSh0LHt9LGZ1bmN0aW9uKG8pe3ZhciB1PUxyKHQsbyk7Zm9yKGU9MDtlPHUubGVuZ3RoO2UrKyl5bih0LHVbZV0pO3QuaUluaXREaXNwbGF5U3RhcnQ9aSxSbih0KSxrZSh0LCExKSxQcih0KX0sdCk6KFByKHQpLGtlKHQsITEpKSl9KX1mdW5jdGlvbiBQcih0KXtpZighdC5fYkluaXRDb21wbGV0ZSl7dmFyIGU9W3QsdC5qc29uXTt0Ll9iSW5pdENvbXBsZXRlPSEwLE9yKHQpLFp0KHQsbnVsbCwicGx1Z2luLWluaXQiLGUsITApLFp0KHQsImFvSW5pdENvbXBsZXRlIiwiaW5pdCIsZSwhMCl9fWZ1bmN0aW9uIGRzKHQsZSl7dmFyIG49cGFyc2VJbnQoZSwxMCk7dC5faURpc3BsYXlMZW5ndGg9bix2cyh0KSxadCh0LG51bGwsImxlbmd0aCIsW3Qsbl0pfWZ1bmN0aW9uIExpKHQsZSxuKXt2YXIgcj10Ll9pRGlzcGxheVN0YXJ0LHM9dC5faURpc3BsYXlMZW5ndGgsaT10LmZuUmVjb3Jkc0Rpc3BsYXkoKTtpZihpPT09MHx8cz09PS0xKXI9MDtlbHNlIGlmKHR5cGVvZiBlPT0ibnVtYmVyIilyPWUqcyxyPmkmJihyPTApO2Vsc2UgaWYoZT09ImZpcnN0IilyPTA7ZWxzZSBpZihlPT0icHJldmlvdXMiKXI9cz49MD9yLXM6MCxyPDAmJihyPTApO2Vsc2UgaWYoZT09Im5leHQiKXIrczxpJiYocis9cyk7ZWxzZSBpZihlPT0ibGFzdCIpcj1NYXRoLmZsb29yKChpLTEpL3MpKnM7ZWxzZXtpZihlPT09ImVsbGlwc2lzIilyZXR1cm47T2UodCwwLCJVbmtub3duIHBhZ2luZyBhY3Rpb246ICIrZSw1KX12YXIgbz10Ll9pRGlzcGxheVN0YXJ0IT09cjtyZXR1cm4gdC5faURpc3BsYXlTdGFydD1yLFp0KHQsbnVsbCxvPyJwYWdlIjoicGFnZS1uYyIsW3RdKSxvJiZuJiZMbih0KSxvfWZ1bmN0aW9uIHdsKHQpe3ZhciBlPXQublRhYmxlLG49dC5vU2Nyb2xsLnNYIT09IiJ8fHQub1Njcm9sbC5zWSE9PSIiO2lmKHQub0ZlYXR1cmVzLmJQcm9jZXNzaW5nKXt2YXIgcj1IKCI8ZGl2Lz4iLHtpZDp0LnNUYWJsZUlkKyJfcHJvY2Vzc2luZyIsY2xhc3M6dC5vQ2xhc3Nlcy5wcm9jZXNzaW5nLmNvbnRhaW5lcixyb2xlOiJzdGF0dXMifSkuaHRtbCh0Lm9MYW5ndWFnZS5zUHJvY2Vzc2luZykuYXBwZW5kKCI8ZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+Iik7bj9yLnByZXBlbmRUbyhIKCJkaXYuZHQtc2Nyb2xsIix0Lm5UYWJsZVdyYXBwZXIpKTpyLmluc2VydEJlZm9yZShlKSxIKGUpLm9uKCJwcm9jZXNzaW5nLmR0LkRUIixmdW5jdGlvbihzLGksbyl7ci5jc3MoImRpc3BsYXkiLG8/ImJsb2NrIjoibm9uZSIpfSl9fWZ1bmN0aW9uIGtlKHQsZSl7dC5iRHJhd2luZyYmZT09PSExfHxadCh0LG51bGwsInByb2Nlc3NpbmciLFt0LGVdKX1mdW5jdGlvbiB1cyh0LGUsbil7ZT8oa2UodCwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe24oKSxrZSh0LCExKX0sMCkpOm4oKX1mdW5jdGlvbiBjcyh0KXt2YXIgZT1IKHQublRhYmxlKSxuPXQub1Njcm9sbDtpZihuLnNYPT09IiImJm4uc1k9PT0iIilyZXR1cm4gdC5uVGFibGU7dmFyIHI9bi5zWCxzPW4uc1ksaT10Lm9DbGFzc2VzLnNjcm9sbGluZyxvPXQuY2FwdGlvbk5vZGUsdT1vP28uX2NhcHRpb25TaWRlOm51bGwscD1IKGVbMF0uY2xvbmVOb2RlKCExKSksYj1IKGVbMF0uY2xvbmVOb2RlKCExKSksZz1lLmNoaWxkcmVuKCJ0Zm9vdCIpLG09IjxkaXYvPiIsQz1mdW5jdGlvbihoKXtyZXR1cm4gaD9vbihoKTpudWxsfTtnLmxlbmd0aHx8KGc9bnVsbCk7dmFyIHk9SChtLHtjbGFzczppLmNvbnRhaW5lcn0pLmFwcGVuZChIKG0se2NsYXNzOmkuaGVhZGVyLnNlbGZ9KS5jc3Moe292ZXJmbG93OiJoaWRkZW4iLHBvc2l0aW9uOiJyZWxhdGl2ZSIsYm9yZGVyOjAsd2lkdGg6cj9DKHIpOiIxMDAlIn0pLmFwcGVuZChIKG0se2NsYXNzOmkuaGVhZGVyLmlubmVyfSkuY3NzKHsiYm94LXNpemluZyI6ImNvbnRlbnQtYm94Iix3aWR0aDpuLnNYSW5uZXJ8fCIxMDAlIn0pLmFwcGVuZChwLnJlbW92ZUF0dHIoImlkIikuY3NzKCJtYXJnaW4tbGVmdCIsMCkuYXBwZW5kKHU9PT0idG9wIj9vOm51bGwpLmFwcGVuZChlLmNoaWxkcmVuKCJ0aGVhZCIpKSkpKS5hcHBlbmQoSChtLHtjbGFzczppLmJvZHl9KS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsb3ZlcmZsb3c6ImF1dG8iLHdpZHRoOkMocil9KS5hcHBlbmQoZSkpO2cmJnkuYXBwZW5kKEgobSx7Y2xhc3M6aS5mb290ZXIuc2VsZn0pLmNzcyh7b3ZlcmZsb3c6ImhpZGRlbiIsYm9yZGVyOjAsd2lkdGg6cj9DKHIpOiIxMDAlIn0pLmFwcGVuZChIKG0se2NsYXNzOmkuZm9vdGVyLmlubmVyfSkuYXBwZW5kKGIucmVtb3ZlQXR0cigiaWQiKS5jc3MoIm1hcmdpbi1sZWZ0IiwwKS5hcHBlbmQodT09PSJib3R0b20iP286bnVsbCkuYXBwZW5kKGUuY2hpbGRyZW4oInRmb290IikpKSkpO3ZhciBUPXkuY2hpbGRyZW4oKSxQPVRbMF0sYz1UWzFdLGw9Zz9UWzJdOm51bGw7cmV0dXJuIEgoYykub24oInNjcm9sbC5EVCIsZnVuY3Rpb24oKXt2YXIgaD10aGlzLnNjcm9sbExlZnQ7UC5zY3JvbGxMZWZ0PWgsZyYmKGwuc2Nyb2xsTGVmdD1oKX0pLEgoInRoLCB0ZCIsUCkub24oImZvY3VzIixmdW5jdGlvbigpe3ZhciBoPVAuc2Nyb2xsTGVmdDtjLnNjcm9sbExlZnQ9aCxnJiYoYy5zY3JvbGxMZWZ0PWgpfSksSChjKS5jc3MoIm1heC1oZWlnaHQiLHMpLG4uYkNvbGxhcHNlfHxIKGMpLmNzcygiaGVpZ2h0IixzKSx0Lm5TY3JvbGxIZWFkPVAsdC5uU2Nyb2xsQm9keT1jLHQublNjcm9sbEZvb3Q9bCx0LmFvRHJhd0NhbGxiYWNrLnB1c2goZnMpLHlbMF19ZnVuY3Rpb24gZnModCl7dmFyIGU9dC5vU2Nyb2xsLG49ZS5pQmFyV2lkdGgscj1IKHQublNjcm9sbEhlYWQpLHM9ci5jaGlsZHJlbigiZGl2IiksaT1zLmNoaWxkcmVuKCJ0YWJsZSIpLG89dC5uU2Nyb2xsQm9keSx1PUgobykscD1IKHQublNjcm9sbEZvb3QpLGI9cC5jaGlsZHJlbigiZGl2IiksZz1iLmNoaWxkcmVuKCJ0YWJsZSIpLG09SCh0Lm5USGVhZCksQz1IKHQublRhYmxlKSx5PXQublRGb290JiZIKCJ0aCwgdGQiLHQublRGb290KS5sZW5ndGg/SCh0Lm5URm9vdCk6bnVsbCxUPXQub0Jyb3dzZXIsUCxjLGw9by5zY3JvbGxIZWlnaHQ+by5jbGllbnRIZWlnaHQ7aWYodC5zY3JvbGxCYXJWaXMhPT1sJiZ0LnNjcm9sbEJhclZpcyE9PXZvaWQgMCl7dC5zY3JvbGxCYXJWaXM9bCxPcih0KTtyZXR1cm59ZWxzZSB0LnNjcm9sbEJhclZpcz1sO2lmKEMuY2hpbGRyZW4oInRoZWFkLCB0Zm9vdCIpLnJlbW92ZSgpLFA9bS5jbG9uZSgpLnByZXBlbmRUbyhDKSxQLmZpbmQoInRoLCB0ZCIpLnJlbW92ZUF0dHIoInRhYmluZGV4IiksUC5maW5kKCJbaWRdIikucmVtb3ZlQXR0cigiaWQiKSx5JiYoYz15LmNsb25lKCkucHJlcGVuZFRvKEMpLGMuZmluZCgiW2lkXSIpLnJlbW92ZUF0dHIoImlkIikpLHQuYWlEaXNwbGF5Lmxlbmd0aCl7dmFyIGg9bnVsbDtmb3IoZj0wO2Y8dC5haURpc3BsYXkubGVuZ3RoO2YrKyl7dmFyIF89dC5haURpc3BsYXlbZl0sRj10LmFvRGF0YVtfXS5uVHI7aWYoRil7aD1GO2JyZWFrfX1pZihoKWZvcih2YXIgTz1IKGgpLmNoaWxkcmVuKCJ0aCwgdGQiKS5tYXAoZnVuY3Rpb24odyl7cmV0dXJue2lkeDpJaSh0LHcpLHdpZHRoOkgodGhpcykub3V0ZXJXaWR0aCgpfX0pLGY9MDtmPE8ubGVuZ3RoO2YrKyl7dmFyIFU9dC5hb0NvbHVtbnNbT1tmXS5pZHhdLmNvbEVsWzBdLFg9VS5zdHlsZS53aWR0aC5yZXBsYWNlKCJweCIsIiIpO1ghPT1PW2ZdLndpZHRoJiYoVS5zdHlsZS53aWR0aD1PW2ZdLndpZHRoKyJweCIpfX1pLmZpbmQoImNvbGdyb3VwIikucmVtb3ZlKCksaS5hcHBlbmQodC5jb2xncm91cC5jbG9uZSgpKSx5JiYoZy5maW5kKCJjb2xncm91cCIpLnJlbW92ZSgpLGcuYXBwZW5kKHQuY29sZ3JvdXAuY2xvbmUoKSkpLEgoInRoLCB0ZCIsUCkuZWFjaChmdW5jdGlvbigpe0godGhpcy5jaGlsZE5vZGVzKS53cmFwQWxsKCc8ZGl2IGNsYXNzPSJkdC1zY3JvbGwtc2l6aW5nIj4nKX0pLHkmJkgoInRoLCB0ZCIsYykuZWFjaChmdW5jdGlvbigpe0godGhpcy5jaGlsZE5vZGVzKS53cmFwQWxsKCc8ZGl2IGNsYXNzPSJkdC1zY3JvbGwtc2l6aW5nIj4nKX0pO3ZhciBRPU1hdGguZmxvb3IoQy5oZWlnaHQoKSk+by5jbGllbnRIZWlnaHR8fHUuY3NzKCJvdmVyZmxvdy15Iik9PSJzY3JvbGwiLEU9InBhZGRpbmciKyhULmJTY3JvbGxiYXJMZWZ0PyJMZWZ0IjoiUmlnaHQiKSwkPUMub3V0ZXJXaWR0aCgpO2kuY3NzKCJ3aWR0aCIsb24oJCkpLHMuY3NzKCJ3aWR0aCIsb24oJCkpLmNzcyhFLFE/bisicHgiOiIwcHgiKSx5JiYoZy5jc3MoIndpZHRoIixvbigkKSksYi5jc3MoIndpZHRoIixvbigkKSkuY3NzKEUsUT9uKyJweCI6IjBweCIpKSxDLmNoaWxkcmVuKCJjb2xncm91cCIpLnByZXBlbmRUbyhDKSx1LnRyaWdnZXIoInNjcm9sbCIpLCh0LmJTb3J0ZWR8fHQuYkZpbHRlcmVkKSYmIXQuX2RyYXdIb2xkJiYoby5zY3JvbGxUb3A9MCl9ZnVuY3Rpb24geGwodCl7aWYodC5vRmVhdHVyZXMuYkF1dG9XaWR0aCl7dmFyIGU9dC5uVGFibGUsbj10LmFvQ29sdW1ucyxyPXQub1Njcm9sbCxzPXIuc1ksaT1yLnNYLG89ci5zWElubmVyLHU9UGkodCwiYlZpc2libGUiKSxwPWUuZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGI9ZS5wYXJlbnROb2RlLGcsbSxDLHk9ZS5zdHlsZS53aWR0aDsheSYmIXAmJihlLnN0eWxlLndpZHRoPSIxMDAlIix5PSIxMDAlIikseSYmeS5pbmRleE9mKCIlIikhPT0tMSYmKHA9eSksWnQodCxudWxsLCJjb2x1bW4tY2FsYyIse3Zpc2libGU6dX0sITEpO3ZhciBUPUgoZS5jbG9uZU5vZGUoKSkuY3NzKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikucmVtb3ZlQXR0cigiaWQiKTtULmFwcGVuZCgiPHRib2R5PiIpO3ZhciBQPUgoIjx0ci8+IikuYXBwZW5kVG8oVC5maW5kKCJ0Ym9keSIpKTtmb3IoVC5hcHBlbmQoSCh0Lm5USGVhZCkuY2xvbmUoKSkuYXBwZW5kKEgodC5uVEZvb3QpLmNsb25lKCkpLFQuZmluZCgidGZvb3QgdGgsIHRmb290IHRkIikuY3NzKCJ3aWR0aCIsIiIpLFQuZmluZCgidGhlYWQgdGgsIHRoZWFkIHRkIikuZWFjaChmdW5jdGlvbigpe3ZhciBRPXJzKHQsdGhpcywhMCwhMSk7UT8odGhpcy5zdHlsZS53aWR0aD1RLHRoaXMuc3R5bGUubWluV2lkdGg9USxpJiZIKHRoaXMpLmFwcGVuZChIKCI8ZGl2Lz4iKS5jc3Moe3dpZHRoOlEsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjowLGhlaWdodDoxfSkpKTp0aGlzLnN0eWxlLndpZHRoPSIifSksZz0wO2c8dS5sZW5ndGg7ZysrKXtDPXVbZ10sbT1uW0NdO3ZhciBjPV9sKHQsQyksbD1sZS50eXBlLmNsYXNzTmFtZVttLnNUeXBlXSxoPWMrbS5zQ29udGVudFBhZGRpbmcsXz1jLmluZGV4T2YoIjwiKT09PS0xP2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGgpOmg7SCgiPHRkLz4iKS5hZGRDbGFzcyhsKS5hZGRDbGFzcyhtLnNDbGFzcykuYXBwZW5kKF8pLmFwcGVuZFRvKFApfUgoIltuYW1lXSIsVCkucmVtb3ZlQXR0cigibmFtZSIpO3ZhciBGPUgoIjxkaXYvPiIpLmNzcyhpfHxzP3twb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDowLGxlZnQ6MCxoZWlnaHQ6MSxyaWdodDowLG92ZXJmbG93OiJoaWRkZW4ifTp7fSkuYXBwZW5kKFQpLmFwcGVuZFRvKGIpO2kmJm8/VC53aWR0aChvKTppPyhULmNzcygid2lkdGgiLCJhdXRvIiksVC5yZW1vdmVBdHRyKCJ3aWR0aCIpLFQud2lkdGgoKTxiLmNsaWVudFdpZHRoJiZwJiZULndpZHRoKGIuY2xpZW50V2lkdGgpKTpzP1Qud2lkdGgoYi5jbGllbnRXaWR0aCk6cCYmVC53aWR0aChwKTt2YXIgTz0wLGY9VC5maW5kKCJ0Ym9keSB0ciIpLmVxKDApLmNoaWxkcmVuKCk7Zm9yKGc9MDtnPHUubGVuZ3RoO2crKyl7dmFyIFU9ZltnXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtPKz1VLG5bdVtnXV0uc1dpZHRoPW9uKFUpfWlmKGUuc3R5bGUud2lkdGg9b24oTyksRi5yZW1vdmUoKSxwJiYoZS5zdHlsZS53aWR0aD1vbihwKSksKHB8fGkpJiYhdC5fcmVzekV2dCl7dmFyIFg9ZnVuY3Rpb24oKXtIKHdpbmRvdykub24oInJlc2l6ZS5EVC0iK3Quc0luc3RhbmNlLGJ0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXt0LmJEZXN0cm95aW5nfHxPcih0KX0pKX07WCgpLHQuX3Jlc3pFdnQ9ITB9fX1mdW5jdGlvbiBfbCh0LGUpe3ZhciBuPXQuYW9Db2x1bW5zW2VdO2lmKCFuLm1heExlblN0cmluZyl7Zm9yKHZhciByLHM9IiIsaT0tMSxvPTAsdT10LmFpRGlzcGxheU1hc3Rlci5sZW5ndGg7bzx1O28rKyl7dmFyIHA9dC5haURpc3BsYXlNYXN0ZXJbb10sYj1FaSh0LHApW2VdLGc9YiYmdHlwZW9mIGI9PSJvYmplY3QiJiZiLm5vZGVUeXBlP2IuaW5uZXJIVE1MOmIrIiI7Zz1nLnJlcGxhY2UoL2lkPSIuKj8iL2csIiIpLnJlcGxhY2UoL25hbWU9Ii4qPyIvZywiIikscj1nbihnKS5yZXBsYWNlKC8mbmJzcDsvZywiICIpLHIubGVuZ3RoPmkmJihzPWcsaT1yLmxlbmd0aCl9bi5tYXhMZW5TdHJpbmc9c31yZXR1cm4gbi5tYXhMZW5TdHJpbmd9ZnVuY3Rpb24gb24odCl7cmV0dXJuIHQ9PT1udWxsPyIwcHgiOnR5cGVvZiB0PT0ibnVtYmVyIj90PDA/IjBweCI6dCsicHgiOnQubWF0Y2goL1xkJC8pP3QrInB4Ijp0fWZ1bmN0aW9uIGhzKHQpe3ZhciBlPXQuYW9Db2x1bW5zO2Zvcih0LmNvbGdyb3VwLmVtcHR5KCksTmU9MDtOZTxlLmxlbmd0aDtOZSsrKWVbTmVdLmJWaXNpYmxlJiZ0LmNvbGdyb3VwLmFwcGVuZChlW05lXS5jb2xFbCl9ZnVuY3Rpb24gQ2wodCl7dmFyIGU9dC5uVEhlYWQsbj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInRyIikscj10LmJTb3J0Q2VsbHNUb3Ascz0nOm5vdChbZGF0YS1kdC1vcmRlcj0iZGlzYWJsZSJdKTpub3QoW2RhdGEtZHQtb3JkZXI9Imljb24tb25seSJdKSc7cj09PSEwP2U9blswXTpyPT09ITEmJihlPW5bbi5sZW5ndGgtMV0pLHBzKHQsZSxlPT09dC5uVEhlYWQ/InRyIitzKyIgdGgiK3MrIiwgdHIiK3MrIiB0ZCIrczoidGgiK3MrIiwgdGQiK3MpO3ZhciBpPVtdO0puKHQsaSx0LmFhU29ydGluZyksdC5hYVNvcnRpbmc9aX1mdW5jdGlvbiBwcyh0LGUsbixyLHMpe21zKGUsbixmdW5jdGlvbihpKXt2YXIgbz0hMSx1PXI9PT12b2lkIDA/QmkoaS50YXJnZXQpOltyXTtpZih1Lmxlbmd0aCl7Zm9yKHZhciBwPTAsYj11Lmxlbmd0aDtwPGI7cCsrKXt2YXIgZz1UbCh0LHVbcF0scCxpLnNoaWZ0S2V5KTtpZihnIT09ITEmJihvPSEwKSx0LmFhU29ydGluZy5sZW5ndGg9PT0xJiZ0LmFhU29ydGluZ1swXVsxXT09PSIiKWJyZWFrfW8mJnVzKHQsITAsZnVuY3Rpb24oKXt6aSh0KSxicyh0LHQuYWlEaXNwbGF5KSxSbih0LCExLCExKSxzJiZzKCl9KX19KX1mdW5jdGlvbiBicyh0LGUpe2lmKCEoZS5sZW5ndGg8Mikpe3ZhciBuPXQuYWlEaXNwbGF5TWFzdGVyLHI9e30scz17fSxpO2ZvcihpPTA7aTxuLmxlbmd0aDtpKyspcltuW2ldXT1pO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspc1tlW2ldXT1yW2VbaV1dO2Uuc29ydChmdW5jdGlvbihvLHUpe3JldHVybiBzW29dLXNbdV19KX19ZnVuY3Rpb24gSm4odCxlLG4pe3ZhciByPWZ1bmN0aW9uKGkpe2lmKEguaXNQbGFpbk9iamVjdChpKSl7aWYoaS5pZHghPT12b2lkIDApZS5wdXNoKFtpLmlkeCxpLmRpcl0pO2Vsc2UgaWYoaS5uYW1lKXt2YXIgbz1DZSh0LmFvQ29sdW1ucywic05hbWUiKSx1PW8uaW5kZXhPZihpLm5hbWUpO3UhPT0tMSYmZS5wdXNoKFt1LGkuZGlyXSl9fWVsc2UgZS5wdXNoKGkpfTtpZihILmlzUGxhaW5PYmplY3QobikpcihuKTtlbHNlIGlmKG4ubGVuZ3RoJiZ0eXBlb2YgblswXT09Im51bWJlciIpcihuKTtlbHNlIGlmKG4ubGVuZ3RoKWZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXIobltzXSl9ZnVuY3Rpb24genIodCl7dmFyIGUsbixyLHM9W10saT1idC5leHQudHlwZS5vcmRlcixvPXQuYW9Db2x1bW5zLHUscCxiLGcsbT10LmFhU29ydGluZ0ZpeGVkLEM9SC5pc1BsYWluT2JqZWN0KG0pLHk9W107aWYoIXQub0ZlYXR1cmVzLmJTb3J0KXJldHVybiBzO2ZvcihBcnJheS5pc0FycmF5KG0pJiZKbih0LHksbSksQyYmbS5wcmUmJkpuKHQseSxtLnByZSksSm4odCx5LHQuYWFTb3J0aW5nKSxDJiZtLnBvc3QmJkpuKHQseSxtLnBvc3QpLGU9MDtlPHkubGVuZ3RoO2UrKylpZihnPXlbZV1bMF0sb1tnXSlmb3IodT1vW2ddLmFEYXRhU29ydCxuPTAscj11Lmxlbmd0aDtuPHI7bisrKXA9dVtuXSxiPW9bcF0uc1R5cGV8fCJzdHJpbmciLHlbZV0uX2lkeD09PXZvaWQgMCYmKHlbZV0uX2lkeD1vW3BdLmFzU29ydGluZy5pbmRleE9mKHlbZV1bMV0pKSx5W2VdWzFdJiZzLnB1c2goe3NyYzpnLGNvbDpwLGRpcjp5W2VdWzFdLGluZGV4OnlbZV0uX2lkeCx0eXBlOmIsZm9ybWF0dGVyOmlbYisiLXByZSJdLHNvcnRlcjppW2IrIi0iK3lbZV1bMV1dfSk7cmV0dXJuIHN9ZnVuY3Rpb24gemkodCxlLG4pe3ZhciByLHMsaSxvPVtdLHU9YnQuZXh0LnR5cGUub3JkZXIscD10LmFvRGF0YSxiLGc9dC5haURpc3BsYXlNYXN0ZXIsbTtpZihlIT09dm9pZCAwKXt2YXIgQz10LmFvQ29sdW1uc1tlXTttPVt7c3JjOmUsY29sOmUsZGlyOm4saW5kZXg6MCx0eXBlOkMuc1R5cGUsZm9ybWF0dGVyOnVbQy5zVHlwZSsiLXByZSJdLHNvcnRlcjp1W0Muc1R5cGUrIi0iK25dfV0sZz1nLnNsaWNlKCl9ZWxzZSBtPXpyKHQpO2ZvcihyPTAscz1tLmxlbmd0aDtyPHM7cisrKWI9bVtyXSxrbCh0LGIuY29sKTtpZihFZSh0KSE9InNzcCImJm0ubGVuZ3RoIT09MCl7Zm9yKHI9MCxpPWcubGVuZ3RoO3I8aTtyKyspb1tyXT1yO20ubGVuZ3RoJiZtWzBdLmRpcj09PSJkZXNjIiYmdC5vcmRlckRlc2NSZXZlcnNlJiZvLnJldmVyc2UoKSxnLnNvcnQoZnVuY3Rpb24oeSxUKXt2YXIgUCxjLGwsaCxfLEY9bS5sZW5ndGgsTz1wW3ldLl9hU29ydERhdGEsZj1wW1RdLl9hU29ydERhdGE7Zm9yKGw9MDtsPEY7bCsrKWlmKF89bVtsXSxQPU9bXy5jb2xdLGM9ZltfLmNvbF0sXy5zb3J0ZXIpe2lmKGg9Xy5zb3J0ZXIoUCxjKSxoIT09MClyZXR1cm4gaH1lbHNlIGlmKGg9UDxjPy0xOlA+Yz8xOjAsaCE9PTApcmV0dXJuIF8uZGlyPT09ImFzYyI/aDotaDtyZXR1cm4gUD1vW3ldLGM9b1tUXSxQPGM/LTE6UD5jPzE6MH0pfWVsc2UgbS5sZW5ndGg9PT0wJiZnLnNvcnQoZnVuY3Rpb24oeSxUKXtyZXR1cm4geTxUPy0xOnk+VD8xOjB9KTtyZXR1cm4gZT09PXZvaWQgMCYmKHQuYlNvcnRlZD0hMCx0LnNvcnREZXRhaWxzPW0sWnQodCxudWxsLCJvcmRlciIsW3QsbV0pKSxnfWZ1bmN0aW9uIFRsKHQsZSxuLHIpe3ZhciBzPXQuYW9Db2x1bW5zW2VdLGk9dC5hYVNvcnRpbmcsbz1zLmFzU29ydGluZyx1LHA9ZnVuY3Rpb24oZyxtKXt2YXIgQz1nLl9pZHg7cmV0dXJuIEM9PT12b2lkIDAmJihDPW8uaW5kZXhPZihnWzFdKSksQysxPG8ubGVuZ3RoP0MrMTptP251bGw6MH07aWYoIXMuYlNvcnRhYmxlKXJldHVybiExO2lmKHR5cGVvZiBpWzBdPT0ibnVtYmVyIiYmKGk9dC5hYVNvcnRpbmc9W2ldKSwocnx8bikmJnQub0ZlYXR1cmVzLmJTb3J0TXVsdGkpe3ZhciBiPUNlKGksIjAiKS5pbmRleE9mKGUpO2IhPT0tMT8odT1wKGlbYl0sITApLHU9PT1udWxsJiZpLmxlbmd0aD09PTEmJih1PTApLHU9PT1udWxsP2kuc3BsaWNlKGIsMSk6KGlbYl1bMV09b1t1XSxpW2JdLl9pZHg9dSkpOnI/KGkucHVzaChbZSxvWzBdLDBdKSxpW2kubGVuZ3RoLTFdLl9pZHg9MCk6KGkucHVzaChbZSxpWzBdWzFdLDBdKSxpW2kubGVuZ3RoLTFdLl9pZHg9MCl9ZWxzZSBpLmxlbmd0aCYmaVswXVswXT09ZT8odT1wKGlbMF0pLGkubGVuZ3RoPTEsaVswXVsxXT1vW3VdLGlbMF0uX2lkeD11KTooaS5sZW5ndGg9MCxpLnB1c2goW2Usb1swXV0pLGlbMF0uX2lkeD0wKX1mdW5jdGlvbiBUaSh0KXt2YXIgZT10LmFMYXN0U29ydCxuPXQub0NsYXNzZXMub3JkZXIucG9zaXRpb24scj16cih0KSxzPXQub0ZlYXR1cmVzLGksbyx1O2lmKHMuYlNvcnQmJnMuYlNvcnRDbGFzc2VzKXtmb3IoaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl1PWVbaV0uc3JjLEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5yZW1vdmVDbGFzcyhuKyhpPDI/aSsxOjMpKTtmb3IoaT0wLG89ci5sZW5ndGg7aTxvO2krKyl1PXJbaV0uc3JjLEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLHUpKS5hZGRDbGFzcyhuKyhpPDI/aSsxOjMpKX10LmFMYXN0U29ydD1yfWZ1bmN0aW9uIGtsKHQsZSl7dmFyIG49dC5hb0NvbHVtbnNbZV0scj1idC5leHQub3JkZXJbbi5zU29ydERhdGFUeXBlXSxzO3ImJihzPXIuY2FsbCh0Lm9JbnN0YW5jZSx0LGUsbnIodCxlKSkpO2Zvcih2YXIgaSxvLHU9YnQuZXh0LnR5cGUub3JkZXJbbi5zVHlwZSsiLXByZSJdLHA9dC5hb0RhdGEsYj0wO2I8cC5sZW5ndGg7YisrKXBbYl0mJihpPXBbYl0saS5fYVNvcnREYXRhfHwoaS5fYVNvcnREYXRhPVtdKSwoIWkuX2FTb3J0RGF0YVtlXXx8cikmJihvPXI/c1tiXTpSZSh0LGIsZSwic29ydCIpLGkuX2FTb3J0RGF0YVtlXT11P3Uobyx0KTpvKSl9ZnVuY3Rpb24ganIodCl7aWYoIXQuX2JMb2FkaW5nU3RhdGUpe3ZhciBlPXt0aW1lOituZXcgRGF0ZSxzdGFydDp0Ll9pRGlzcGxheVN0YXJ0LGxlbmd0aDp0Ll9pRGlzcGxheUxlbmd0aCxvcmRlcjpILmV4dGVuZCghMCxbXSx0LmFhU29ydGluZyksc2VhcmNoOkguZXh0ZW5kKHt9LHQub1ByZXZpb3VzU2VhcmNoKSxjb2x1bW5zOnQuYW9Db2x1bW5zLm1hcChmdW5jdGlvbihuLHIpe3JldHVybnt2aXNpYmxlOm4uYlZpc2libGUsc2VhcmNoOkguZXh0ZW5kKHt9LHQuYW9QcmVTZWFyY2hDb2xzW3JdKX19KX07dC5vU2F2ZWRTdGF0ZT1lLFp0KHQsImFvU3RhdGVTYXZlUGFyYW1zIiwic3RhdGVTYXZlUGFyYW1zIixbdCxlXSksdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSYmIXQuYkRlc3Ryb3lpbmcmJnQuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQsZSl9fWZ1bmN0aW9uIFNsKHQsZSxuKXtpZighdC5vRmVhdHVyZXMuYlN0YXRlU2F2ZSl7bigpO3JldHVybn12YXIgcj1mdW5jdGlvbihpKXtraSh0LGksbil9LHM9dC5mblN0YXRlTG9hZENhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxyKTtyZXR1cm4gcyE9PXZvaWQgMCYma2kodCxzLG4pLCEwfWZ1bmN0aW9uIGtpKHQsZSxuKXt2YXIgcixzLGk9dC5hb0NvbHVtbnM7dC5fYkxvYWRpbmdTdGF0ZT0hMDt2YXIgbz10Ll9iSW5pdENvbXBsZXRlP25ldyBidC5BcGkodCk6bnVsbDtpZighZXx8IWUudGltZSl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxuKCk7cmV0dXJufXZhciB1PXQuaVN0YXRlRHVyYXRpb247aWYodT4wJiZlLnRpbWU8K25ldyBEYXRlLXUqMWUzKXt0Ll9iTG9hZGluZ1N0YXRlPSExLG4oKTtyZXR1cm59dmFyIHA9WnQodCwiYW9TdGF0ZUxvYWRQYXJhbXMiLCJzdGF0ZUxvYWRQYXJhbXMiLFt0LGVdKTtpZihwLmluZGV4T2YoITEpIT09LTEpe3QuX2JMb2FkaW5nU3RhdGU9ITEsbigpO3JldHVybn1pZihlLmNvbHVtbnMmJmkubGVuZ3RoIT09ZS5jb2x1bW5zLmxlbmd0aCl7dC5fYkxvYWRpbmdTdGF0ZT0hMSxuKCk7cmV0dXJufWlmKHQub0xvYWRlZFN0YXRlPUguZXh0ZW5kKCEwLHt9LGUpLFp0KHQsbnVsbCwic3RhdGVMb2FkSW5pdCIsW3QsZV0sITApLGUubGVuZ3RoIT09dm9pZCAwJiYobz9vLnBhZ2UubGVuKGUubGVuZ3RoKTp0Ll9pRGlzcGxheUxlbmd0aD1lLmxlbmd0aCksZS5zdGFydCE9PXZvaWQgMCYmKG89PT1udWxsPyh0Ll9pRGlzcGxheVN0YXJ0PWUuc3RhcnQsdC5pSW5pdERpc3BsYXlTdGFydD1lLnN0YXJ0KTpMaSh0LGUuc3RhcnQvdC5faURpc3BsYXlMZW5ndGgpKSxlLm9yZGVyIT09dm9pZCAwJiYodC5hYVNvcnRpbmc9W10sSC5lYWNoKGUub3JkZXIsZnVuY3Rpb24oZyxtKXt0LmFhU29ydGluZy5wdXNoKG1bMF0+PWkubGVuZ3RoP1swLG1bMV1dOm0pfSkpLGUuc2VhcmNoIT09dm9pZCAwJiZILmV4dGVuZCh0Lm9QcmV2aW91c1NlYXJjaCxlLnNlYXJjaCksZS5jb2x1bW5zKXtmb3Iocj0wLHM9ZS5jb2x1bW5zLmxlbmd0aDtyPHM7cisrKXt2YXIgYj1lLmNvbHVtbnNbcl07Yi52aXNpYmxlIT09dm9pZCAwJiYobz9vLmNvbHVtbihyKS52aXNpYmxlKGIudmlzaWJsZSwhMSk6aVtyXS5iVmlzaWJsZT1iLnZpc2libGUpLGIuc2VhcmNoIT09dm9pZCAwJiZILmV4dGVuZCh0LmFvUHJlU2VhcmNoQ29sc1tyXSxiLnNlYXJjaCl9byYmby5jb2x1bW5zLmFkanVzdCgpfXQuX2JMb2FkaW5nU3RhdGU9ITEsWnQodCwiYW9TdGF0ZUxvYWRlZCIsInN0YXRlTG9hZGVkIixbdCxlXSksbigpfWZ1bmN0aW9uIE9lKHQsZSxuLHIpe2lmKG49IkRhdGFUYWJsZXMgd2FybmluZzogIisodD8idGFibGUgaWQ9Iit0LnNUYWJsZUlkKyIgLSAiOiIiKStuLHImJihuKz0iLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVycm9yLCBwbGVhc2Ugc2VlIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vIityKSxlKXdpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2cobik7ZWxzZXt2YXIgcz1idC5leHQsaT1zLnNFcnJNb2RlfHxzLmVyck1vZGU7aWYodCYmWnQodCxudWxsLCJkdC1lcnJvciIsW3QscixuXSwhMCksaT09ImFsZXJ0IilhbGVydChuKTtlbHNle2lmKGk9PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKG4pO3R5cGVvZiBpPT0iZnVuY3Rpb24iJiZpKHQscixuKX19fWZ1bmN0aW9uIGxuKHQsZSxuLHIpe2lmKEFycmF5LmlzQXJyYXkobikpe0guZWFjaChuLGZ1bmN0aW9uKHMsaSl7QXJyYXkuaXNBcnJheShpKT9sbih0LGUsaVswXSxpWzFdKTpsbih0LGUsaSl9KTtyZXR1cm59cj09PXZvaWQgMCYmKHI9biksZVtuXSE9PXZvaWQgMCYmKHRbcl09ZVtuXSl9ZnVuY3Rpb24gcWEodCxlLG4pe3ZhciByO2Zvcih2YXIgcyBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHMpJiYocj1lW3NdLEguaXNQbGFpbk9iamVjdChyKT8oSC5pc1BsYWluT2JqZWN0KHRbc10pfHwodFtzXT17fSksSC5leHRlbmQoITAsdFtzXSxyKSk6biYmcyE9PSJkYXRhIiYmcyE9PSJhYURhdGEiJiZBcnJheS5pc0FycmF5KHIpP3Rbc109ci5zbGljZSgpOnRbc109cik7cmV0dXJuIHR9ZnVuY3Rpb24gbXModCxlLG4pe0godCkub24oImNsaWNrLkRUIixlLGZ1bmN0aW9uKHIpe24ocil9KS5vbigia2V5cHJlc3MuRFQiLGUsZnVuY3Rpb24ocil7ci53aGljaD09PTEzJiYoci5wcmV2ZW50RGVmYXVsdCgpLG4ocikpfSkub24oInNlbGVjdHN0YXJ0LkRUIixlLGZ1bmN0aW9uKCl7cmV0dXJuITF9KX1mdW5jdGlvbiBCZSh0LGUsbil7biYmdFtlXS5wdXNoKG4pfWZ1bmN0aW9uIFp0KHQsZSxuLHIscyl7dmFyIGk9W107aWYoZSYmKGk9dFtlXS5zbGljZSgpLnJldmVyc2UoKS5tYXAoZnVuY3Rpb24ocCl7cmV0dXJuIHAuYXBwbHkodC5vSW5zdGFuY2Uscil9KSksbiE9PW51bGwpe3ZhciBvPUguRXZlbnQobisiLmR0IiksdT1IKHQublRhYmxlKTtvLmR0PXQuYXBpLHVbcz8idHJpZ2dlciI6InRyaWdnZXJIYW5kbGVyIl0obyxyKSxzJiZ1LnBhcmVudHMoImJvZHkiKS5sZW5ndGg9PT0wJiZIKCJib2R5IikudHJpZ2dlcihvLHIpLGkucHVzaChvLnJlc3VsdCl9cmV0dXJuIGl9ZnVuY3Rpb24gdnModCl7dmFyIGU9dC5faURpc3BsYXlTdGFydCxuPXQuZm5EaXNwbGF5RW5kKCkscj10Ll9pRGlzcGxheUxlbmd0aDtlPj1uJiYoZT1uLXIpLGUtPWUlciwocj09PS0xfHxlPDApJiYoZT0wKSx0Ll9pRGlzcGxheVN0YXJ0PWV9ZnVuY3Rpb24gRnIodCxlKXt2YXIgbj10LnJlbmRlcmVyLHI9YnQuZXh0LnJlbmRlcmVyW2VdO3JldHVybiBILmlzUGxhaW5PYmplY3QobikmJm5bZV0/cltuW2VdXXx8ci5fOnR5cGVvZiBuPT0ic3RyaW5nIiYmcltuXXx8ci5ffWZ1bmN0aW9uIEVlKHQpe3JldHVybiB0Lm9GZWF0dXJlcy5iU2VydmVyU2lkZT8ic3NwIjp0LmFqYXg/ImFqYXgiOiJkb20ifWZ1bmN0aW9uIGppKHQsZSxuKXt2YXIgcj10LmZuRm9ybWF0TnVtYmVyLHM9dC5faURpc3BsYXlTdGFydCsxLGk9dC5faURpc3BsYXlMZW5ndGgsbz10LmZuUmVjb3Jkc0Rpc3BsYXkoKSx1PXQuZm5SZWNvcmRzVG90YWwoKSxwPWk9PT0tMTtyZXR1cm4gZS5yZXBsYWNlKC9fU1RBUlRfL2csci5jYWxsKHQscykpLnJlcGxhY2UoL19FTkRfL2csci5jYWxsKHQsdC5mbkRpc3BsYXlFbmQoKSkpLnJlcGxhY2UoL19NQVhfL2csci5jYWxsKHQsdSkpLnJlcGxhY2UoL19UT1RBTF8vZyxyLmNhbGwodCxvKSkucmVwbGFjZSgvX1BBR0VfL2csci5jYWxsKHQscD8xOk1hdGguY2VpbChzL2kpKSkucmVwbGFjZSgvX1BBR0VTXy9nLHIuY2FsbCh0LHA/MTpNYXRoLmNlaWwoby9pKSkpLnJlcGxhY2UoL19FTlRSSUVTXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLG4pKS5yZXBsYWNlKC9fRU5UUklFUy1NQVhfL2csdC5hcGkuaTE4bigiZW50cmllcyIsIiIsdSkpLnJlcGxhY2UoL19FTlRSSUVTLVRPVEFMXy9nLHQuYXBpLmkxOG4oImVudHJpZXMiLCIiLG8pKX12YXIgTWk9W10sYmU9QXJyYXkucHJvdG90eXBlLERsPWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1idC5zZXR0aW5ncyxzPUNlKHIsIm5UYWJsZSIpO2lmKHQpe2lmKHQublRhYmxlJiZ0Lm9GZWF0dXJlcylyZXR1cm5bdF07aWYodC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRhYmxlIilyZXR1cm4gZT1zLmluZGV4T2YodCksZSE9PS0xP1tyW2VdXTpudWxsO2lmKHQmJnR5cGVvZiB0LnNldHRpbmdzPT0iZnVuY3Rpb24iKXJldHVybiB0LnNldHRpbmdzKCkudG9BcnJheSgpO3R5cGVvZiB0PT0ic3RyaW5nIj9uPUgodCkuZ2V0KCk6dCBpbnN0YW5jZW9mIEgmJihuPXQuZ2V0KCkpfWVsc2UgcmV0dXJuW107aWYobilyZXR1cm4gci5maWx0ZXIoZnVuY3Rpb24oaSxvKXtyZXR1cm4gbi5pbmNsdWRlcyhzW29dKX0pfTtXdD1mdW5jdGlvbih0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFd0KSlyZXR1cm4gbmV3IFd0KHQsZSk7dmFyIG4scj1bXSxzPWZ1bmN0aW9uKGkpe3ZhciBvPURsKGkpO28mJnIucHVzaC5hcHBseShyLG8pfTtpZihBcnJheS5pc0FycmF5KHQpKWZvcihuPTA7bjx0Lmxlbmd0aDtuKyspcyh0W25dKTtlbHNlIHModCk7aWYodGhpcy5jb250ZXh0PXIubGVuZ3RoPjE/eG4ocik6cixlKWlmKGUubGVuZ3RoPDFlNCl0aGlzLnB1c2guYXBwbHkodGhpcyxlKTtlbHNlIGZvcihuPTA7bjxlLmxlbmd0aDtuKyspdGhpcy5wdXNoKGVbbl0pO3RoaXMuc2VsZWN0b3I9e3Jvd3M6bnVsbCxjb2xzOm51bGwsb3B0czpudWxsfSxXdC5leHRlbmQodGhpcyx0aGlzLE1pKX07YnQuQXBpPVd0O0guZXh0ZW5kKFd0LnByb3RvdHlwZSx7YW55OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY291bnQoKSE9PTB9LGNvbnRleHQ6W10sY291bnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mbGF0dGVuKCkubGVuZ3RofSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLG49dGhpcy5sZW5ndGg7ZTxuO2UrKyl0LmNhbGwodGhpcyx0aGlzW2VdLGUsdGhpcyk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dDtyZXR1cm4gZS5sZW5ndGg+dD9uZXcgV3QoZVt0XSx0aGlzW3RdKTpudWxsfSxmaWx0ZXI6ZnVuY3Rpb24odCl7dmFyIGU9YmUuZmlsdGVyLmNhbGwodGhpcyx0LHRoaXMpO3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LGUpfSxmbGF0dGVuOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsdC5jb25jYXQuYXBwbHkodCx0aGlzLnRvQXJyYXkoKSkpfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbdF19LGpvaW46YmUuam9pbixpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbmRleE9mKHQpIT09LTF9LGluZGV4T2Y6YmUuaW5kZXhPZixpdGVyYXRvcjpmdW5jdGlvbih0LGUsbixyKXt2YXIgcz1bXSxpLG8sdSxwLGIsZz10aGlzLmNvbnRleHQsbSxDLHksVD10aGlzLnNlbGVjdG9yO2Zvcih0eXBlb2YgdD09InN0cmluZyImJihyPW4sbj1lLGU9dCx0PSExKSxvPTAsdT1nLmxlbmd0aDtvPHU7bysrKXt2YXIgUD1uZXcgV3QoZ1tvXSk7aWYoZT09PSJ0YWJsZSIpaT1uLmNhbGwoUCxnW29dLG8pLGkhPT12b2lkIDAmJnMucHVzaChpKTtlbHNlIGlmKGU9PT0iY29sdW1ucyJ8fGU9PT0icm93cyIpaT1uLmNhbGwoUCxnW29dLHRoaXNbb10sbyksaSE9PXZvaWQgMCYmcy5wdXNoKGkpO2Vsc2UgaWYoZT09PSJldmVyeSJ8fGU9PT0iY29sdW1uInx8ZT09PSJjb2x1bW4tcm93cyJ8fGU9PT0icm93Inx8ZT09PSJjZWxsIilmb3IoQz10aGlzW29dLGU9PT0iY29sdW1uLXJvd3MiJiYobT1NcihnW29dLFQub3B0cykpLHA9MCxiPUMubGVuZ3RoO3A8YjtwKyspeT1DW3BdLGU9PT0iY2VsbCI/aT1uLmNhbGwoUCxnW29dLHkucm93LHkuY29sdW1uLG8scCk6aT1uLmNhbGwoUCxnW29dLHksbyxwLG0pLGkhPT12b2lkIDAmJnMucHVzaChpKX1pZihzLmxlbmd0aHx8cil7dmFyIGM9bmV3IFd0KGcsdD9zLmNvbmNhdC5hcHBseShbXSxzKTpzKSxsPWMuc2VsZWN0b3I7cmV0dXJuIGwucm93cz1ULnJvd3MsbC5jb2xzPVQuY29scyxsLm9wdHM9VC5vcHRzLGN9cmV0dXJuIHRoaXN9LGxhc3RJbmRleE9mOmJlLmxhc3RJbmRleE9mLGxlbmd0aDowLG1hcDpmdW5jdGlvbih0KXt2YXIgZT1iZS5tYXAuY2FsbCh0aGlzLHQsdGhpcyk7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsZSl9LHBsdWNrOmZ1bmN0aW9uKHQpe3ZhciBlPWJ0LnV0aWwuZ2V0KHQpO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZShuKX0pfSxwb3A6YmUucG9wLHB1c2g6YmUucHVzaCxyZWR1Y2U6YmUucmVkdWNlLHJlZHVjZVJpZ2h0OmJlLnJlZHVjZVJpZ2h0LHJldmVyc2U6YmUucmV2ZXJzZSxzZWxlY3RvcjpudWxsLHNoaWZ0OmJlLnNoaWZ0LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBXdCh0aGlzLmNvbnRleHQsdGhpcyl9LHNvcnQ6YmUuc29ydCxzcGxpY2U6YmUuc3BsaWNlLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gYmUuc2xpY2UuY2FsbCh0aGlzKX0sdG8kOmZ1bmN0aW9uKCl7cmV0dXJuIEgodGhpcyl9LHRvSlF1ZXJ5OmZ1bmN0aW9uKCl7cmV0dXJuIEgodGhpcyl9LHVuaXF1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHhuKHRoaXMudG9BcnJheSgpKSl9LHVuc2hpZnQ6YmUudW5zaGlmdH0pO2Z1bmN0aW9uIEFsKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHR8fHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gV3QuZXh0ZW5kKHIscixuLm1ldGhvZEV4dCkscn19ZnVuY3Rpb24gSWwodCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYodFtuXS5uYW1lPT09ZSlyZXR1cm4gdFtuXTtyZXR1cm4gbnVsbH13aW5kb3cuX19hcGlTdHJ1Y3Q9TWk7V3QuZXh0ZW5kPWZ1bmN0aW9uKHQsZSxuKXtpZighKCFuLmxlbmd0aHx8IWV8fCEoZSBpbnN0YW5jZW9mIFd0KSYmIWUuX19kdF93cmFwcGVyKSl7dmFyIHIscyxpO2ZvcihyPTAscz1uLmxlbmd0aDtyPHM7cisrKWk9bltyXSxpLm5hbWUhPT0iX19wcm90b19fIiYmKGVbaS5uYW1lXT1pLnR5cGU9PT0iZnVuY3Rpb24iP0FsKHQsaS52YWwsaSk6aS50eXBlPT09Im9iamVjdCI/e306aS52YWwsZVtpLm5hbWVdLl9fZHRfd3JhcHBlcj0hMCxXdC5leHRlbmQodCxlW2kubmFtZV0saS5wcm9wRXh0KSl9fTtXdC5yZWdpc3Rlcj1JdD1mdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylXdC5yZWdpc3Rlcih0W25dLGUpO3JldHVybn12YXIgcyxpLG89dC5zcGxpdCgiLiIpLHU9TWkscCxiO2ZvcihzPTAsaT1vLmxlbmd0aDtzPGk7cysrKXtiPW9bc10uaW5kZXhPZigiKCkiKSE9PS0xLHA9Yj9vW3NdLnJlcGxhY2UoIigpIiwiIik6b1tzXTt2YXIgZz1JbCh1LHApO2d8fChnPXtuYW1lOnAsdmFsOnt9LG1ldGhvZEV4dDpbXSxwcm9wRXh0OltdLHR5cGU6Im9iamVjdCJ9LHUucHVzaChnKSkscz09PWktMT8oZy52YWw9ZSxnLnR5cGU9dHlwZW9mIGU9PSJmdW5jdGlvbiI/ImZ1bmN0aW9uIjpILmlzUGxhaW5PYmplY3QoZSk/Im9iamVjdCI6Im90aGVyIik6dT1iP2cubWV0aG9kRXh0OmcucHJvcEV4dH19O1d0LnJlZ2lzdGVyUGx1cmFsPVF0PWZ1bmN0aW9uKHQsZSxuKXtXdC5yZWdpc3Rlcih0LG4pLFd0LnJlZ2lzdGVyKGUsZnVuY3Rpb24oKXt2YXIgcj1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gcj09PXRoaXM/dGhpczpyIGluc3RhbmNlb2YgV3Q/ci5sZW5ndGg/QXJyYXkuaXNBcnJheShyWzBdKT9uZXcgV3Qoci5jb250ZXh0LHJbMF0pOnJbMF06dm9pZCAwOnJ9KX07dmFyIGdzPWZ1bmN0aW9uKHQsZSl7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG49W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihzKXt2YXIgaT1ncyhzLGUpO24ucHVzaC5hcHBseShuLGkpfSksbi5maWx0ZXIoZnVuY3Rpb24ocyl7cmV0dXJuIHN9KX1pZih0eXBlb2YgdD09Im51bWJlciIpcmV0dXJuW2VbdF1dO3ZhciByPWUubWFwKGZ1bmN0aW9uKHMpe3JldHVybiBzLm5UYWJsZX0pO3JldHVybiBIKHIpLmZpbHRlcih0KS5tYXAoZnVuY3Rpb24oKXt2YXIgcz1yLmluZGV4T2YodGhpcyk7cmV0dXJuIGVbc119KS50b0FycmF5KCl9O0l0KCJ0YWJsZXMoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQhPW51bGw/bmV3IFd0KGdzKHQsdGhpcy5jb250ZXh0KSk6dGhpc30pO0l0KCJ0YWJsZSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLnRhYmxlcyh0KSxuPWUuY29udGV4dDtyZXR1cm4gbi5sZW5ndGg/bmV3IFd0KG5bMF0pOmV9KTtbWyJub2RlcyIsIm5vZGUiLCJuVGFibGUiXSxbImJvZHkiLCJib2R5IiwiblRCb2R5Il0sWyJoZWFkZXIiLCJoZWFkZXIiLCJuVEhlYWQiXSxbImZvb3RlciIsImZvb3RlciIsIm5URm9vdCJdXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1F0KCJ0YWJsZXMoKS4iK3RbMF0rIigpIiwidGFibGUoKS4iK3RbMV0rIigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7cmV0dXJuIGVbdFsyXV19LDEpfSl9KTtbWyJoZWFkZXIiLCJhb0hlYWRlciJdLFsiZm9vdGVyIiwiYW9Gb290ZXIiXV0uZm9yRWFjaChmdW5jdGlvbih0KXtJdCgidGFibGUoKS4iK3RbMF0rIi5zdHJ1Y3R1cmUoKSIsZnVuY3Rpb24oZSl7dmFyIG49dGhpcy5jb2x1bW5zKGUpLmluZGV4ZXMoKS5mbGF0dGVuKCkscj10aGlzLmNvbnRleHRbMF07cmV0dXJuIG9zKHIsclt0WzFdXSxuKX0pfSk7UXQoInRhYmxlcygpLmNvbnRhaW5lcnMoKSIsInRhYmxlKCkuY29udGFpbmVyKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtyZXR1cm4gdC5uVGFibGVXcmFwcGVyfSwxKX0pO0l0KCJ0YWJsZXMoKS5ldmVyeSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obixyKXt0LmNhbGwoZS50YWJsZShyKSxyKX0pfSk7SXQoImNhcHRpb24oKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQ7aWYodD09PXZvaWQgMCl7dmFyIHI9blswXS5jYXB0aW9uTm9kZTtyZXR1cm4gciYmbi5sZW5ndGg/ci5pbm5lckhUTUw6bnVsbH1yZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHMpe3ZhciBpPUgocy5uVGFibGUpLG89SChzLmNhcHRpb25Ob2RlKSx1PUgocy5uVGFibGVXcmFwcGVyKTtpZihvLmxlbmd0aHx8KG89SCgiPGNhcHRpb24vPiIpLmh0bWwodCkscy5jYXB0aW9uTm9kZT1vWzBdLGV8fChpLnByZXBlbmQobyksZT1vLmNzcygiY2FwdGlvbi1zaWRlIikpKSxvLmh0bWwodCksZSYmKG8uY3NzKCJjYXB0aW9uLXNpZGUiLGUpLG9bMF0uX2NhcHRpb25TaWRlPWUpLHUuZmluZCgiZGl2LmRhdGFUYWJsZXNfc2Nyb2xsIikubGVuZ3RoKXt2YXIgcD1lPT09InRvcCI/IkhlYWQiOiJGb290Ijt1LmZpbmQoImRpdi5kYXRhVGFibGVzX3Njcm9sbCIrcCsiIHRhYmxlIikucHJlcGVuZChvKX1lbHNlIGkucHJlcGVuZChvKX0sMSl9KTtJdCgiY2FwdGlvbi5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aD90WzBdLmNhcHRpb25Ob2RlOm51bGx9KTtJdCgiZHJhdygpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3Q9PT0icGFnZSI/TG4oZSk6KHR5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9dCE9PSJmdWxsLWhvbGQiKSxSbihlLHQ9PT0hMSkpfSl9KTtJdCgicGFnZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLnBhZ2UuaW5mbygpLnBhZ2U6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe0xpKGUsdCl9KX0pO0l0KCJwYWdlLmluZm8oKSIsZnVuY3Rpb24oKXtpZih0aGlzLmNvbnRleHQubGVuZ3RoIT09MCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdLGU9dC5faURpc3BsYXlTdGFydCxuPXQub0ZlYXR1cmVzLmJQYWdpbmF0ZT90Ll9pRGlzcGxheUxlbmd0aDotMSxyPXQuZm5SZWNvcmRzRGlzcGxheSgpLHM9bj09PS0xO3JldHVybntwYWdlOnM/MDpNYXRoLmZsb29yKGUvbikscGFnZXM6cz8xOk1hdGguY2VpbChyL24pLHN0YXJ0OmUsZW5kOnQuZm5EaXNwbGF5RW5kKCksbGVuZ3RoOm4scmVjb3Jkc1RvdGFsOnQuZm5SZWNvcmRzVG90YWwoKSxyZWNvcmRzRGlzcGxheTpyLHNlcnZlclNpZGU6RWUodCk9PT0ic3NwIn19fSk7SXQoInBhZ2UubGVuKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dC5sZW5ndGghPT0wP3RoaXMuY29udGV4dFswXS5faURpc3BsYXlMZW5ndGg6dm9pZCAwOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtkcyhlLHQpfSl9KTt2YXIgeXM9ZnVuY3Rpb24odCxlLG4pe2lmKG4pe3ZhciByPW5ldyBXdCh0KTtyLm9uZSgiZHJhdyIsZnVuY3Rpb24oKXtuKHIuYWpheC5qc29uKCkpfSl9aWYoRWUodCk9PSJzc3AiKVJuKHQsZSk7ZWxzZXtrZSh0LCEwKTt2YXIgcz10LmpxWEhSO3MmJnMucmVhZHlTdGF0ZSE9PTQmJnMuYWJvcnQoKSxSaSh0LHt9LGZ1bmN0aW9uKGkpe09pKHQpO2Zvcih2YXIgbz1Mcih0LGkpLHU9MCxwPW8ubGVuZ3RoO3U8cDt1KyspeW4odCxvW3VdKTtSbih0LGUpLFByKHQpLGtlKHQsITEpfSl9fTtJdCgiYWpheC5qc29uKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O2lmKHQubGVuZ3RoPjApcmV0dXJuIHRbMF0uanNvbn0pO0l0KCJhamF4LnBhcmFtcygpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtpZih0Lmxlbmd0aD4wKXJldHVybiB0WzBdLm9BamF4RGF0YX0pO0l0KCJhamF4LnJlbG9hZCgpIixmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7eXMobixlPT09ITEsdCl9KX0pO0l0KCJhamF4LnVybCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIHQ9PT12b2lkIDA/ZS5sZW5ndGg9PT0wP3ZvaWQgMDooZT1lWzBdLEguaXNQbGFpbk9iamVjdChlLmFqYXgpP2UuYWpheC51cmw6ZS5hamF4KTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24obil7SC5pc1BsYWluT2JqZWN0KG4uYWpheCk/bi5hamF4LnVybD10Om4uYWpheD10fSl9KTtJdCgiYWpheC51cmwoKS5sb2FkKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuKXt5cyhuLGU9PT0hMSx0KX0pfSk7dmFyIFZpPWZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9W10sbyx1LHAsYixnLG0sQz10eXBlb2YgZTtmb3IoKCFlfHxDPT09InN0cmluZyJ8fEM9PT0iZnVuY3Rpb24ifHxlLmxlbmd0aD09PXZvaWQgMCkmJihlPVtlXSkscD0wLGI9ZS5sZW5ndGg7cDxiO3ArKylmb3IodT1lW3BdJiZlW3BdLnNwbGl0JiYhZVtwXS5tYXRjaCgvW1soOl0vKT9lW3BdLnNwbGl0KCIsIik6W2VbcF1dLGc9MCxtPXUubGVuZ3RoO2c8bTtnKyspbz1uKHR5cGVvZiB1W2ddPT0ic3RyaW5nIj91W2ddLnRyaW0oKTp1W2ddKSxvPW8uZmlsdGVyKGZ1bmN0aW9uKFQpe3JldHVybiBUIT1udWxsfSksbyYmby5sZW5ndGgmJihpPWkuY29uY2F0KG8pKTt2YXIgeT1sZS5zZWxlY3Rvclt0XTtpZih5Lmxlbmd0aClmb3IocD0wLGI9eS5sZW5ndGg7cDxiO3ArKylpPXlbcF0ocixzLGkpO3JldHVybiB4bihpKX0sSGk9ZnVuY3Rpb24odCl7cmV0dXJuIHR8fCh0PXt9KSx0LmZpbHRlciYmdC5zZWFyY2g9PT12b2lkIDAmJih0LnNlYXJjaD10LmZpbHRlciksSC5leHRlbmQoe3NlYXJjaDoibm9uZSIsb3JkZXI6ImN1cnJlbnQiLHBhZ2U6ImFsbCJ9LHQpfSxVaT1mdW5jdGlvbih0KXtsZXQgZT1uZXcgV3QodC5jb250ZXh0WzBdKTtyZXR1cm4gdC5sZW5ndGgmJmUucHVzaCh0WzBdKSxlLnNlbGVjdG9yPXQuc2VsZWN0b3IsZS5sZW5ndGgmJmVbMF0ubGVuZ3RoPjEmJmVbMF0uc3BsaWNlKDEpLGV9LE1yPWZ1bmN0aW9uKHQsZSl7dmFyIG4scixzLGk9W10sbz10LmFpRGlzcGxheSx1PXQuYWlEaXNwbGF5TWFzdGVyLHA9ZS5zZWFyY2gsYj1lLm9yZGVyLGc9ZS5wYWdlO2lmKEVlKHQpPT0ic3NwIilyZXR1cm4gcD09PSJyZW1vdmVkIj9bXTphbigwLHUubGVuZ3RoKTtpZihnPT0iY3VycmVudCIpZm9yKG49dC5faURpc3BsYXlTdGFydCxyPXQuZm5EaXNwbGF5RW5kKCk7bjxyO24rKylpLnB1c2gob1tuXSk7ZWxzZSBpZihiPT0iY3VycmVudCJ8fGI9PSJhcHBsaWVkIil7aWYocD09Im5vbmUiKWk9dS5zbGljZSgpO2Vsc2UgaWYocD09ImFwcGxpZWQiKWk9by5zbGljZSgpO2Vsc2UgaWYocD09InJlbW92ZWQiKXt2YXIgbT17fTtmb3Iobj0wLHI9by5sZW5ndGg7bjxyO24rKyltW29bbl1dPW51bGw7dS5mb3JFYWNoKGZ1bmN0aW9uKHkpe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtLHkpfHxpLnB1c2goeSl9KX19ZWxzZSBpZihiPT0iaW5kZXgifHxiPT0ib3JpZ2luYWwiKWZvcihuPTAscj10LmFvRGF0YS5sZW5ndGg7bjxyO24rKyl0LmFvRGF0YVtuXSYmKHA9PSJub25lIj9pLnB1c2gobik6KHM9by5pbmRleE9mKG4pLChzPT09LTEmJnA9PSJyZW1vdmVkInx8cz49MCYmcD09ImFwcGxpZWQiKSYmaS5wdXNoKG4pKSk7ZWxzZSBpZih0eXBlb2YgYj09Im51bWJlciIpe3ZhciBDPXppKHQsYiwiYXNjIik7aWYocD09PSJub25lIilpPUM7ZWxzZSBmb3Iobj0wO248Qy5sZW5ndGg7bisrKXM9by5pbmRleE9mKENbbl0pLChzPT09LTEmJnA9PSJyZW1vdmVkInx8cz49MCYmcD09ImFwcGxpZWQiKSYmaS5wdXNoKENbbl0pfXJldHVybiBpfSxQbD1mdW5jdGlvbih0LGUsbil7dmFyIHIscz1mdW5jdGlvbihvKXt2YXIgdT1KYShvKSxwPXQuYW9EYXRhO2lmKHUhPT1udWxsJiYhbilyZXR1cm5bdV07aWYocnx8KHI9TXIodCxuKSksdSE9PW51bGwmJnIuaW5kZXhPZih1KSE9PS0xKXJldHVyblt1XTtpZihvPT1udWxsfHxvPT09IiIpcmV0dXJuIHI7aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpcmV0dXJuIHIubWFwKGZ1bmN0aW9uKFQpe3ZhciBQPXBbVF07cmV0dXJuIG8oVCxQLl9hRGF0YSxQLm5Ucik/VDpudWxsfSk7aWYoby5ub2RlTmFtZSl7dmFyIGI9by5fRFRfUm93SW5kZXgsZz1vLl9EVF9DZWxsSW5kZXg7aWYoYiE9PXZvaWQgMClyZXR1cm4gcFtiXSYmcFtiXS5uVHI9PT1vP1tiXTpbXTtpZihnKXJldHVybiBwW2cucm93XSYmcFtnLnJvd10ublRyPT09by5wYXJlbnROb2RlP1tnLnJvd106W107dmFyIG09SChvKS5jbG9zZXN0KCIqW2RhdGEtZHQtcm93XSIpO3JldHVybiBtLmxlbmd0aD9bbS5kYXRhKCJkdC1yb3ciKV06W119aWYodHlwZW9mIG89PSJzdHJpbmciJiZvLmNoYXJBdCgwKT09PSIjIil7dmFyIEM9dC5hSWRzW28ucmVwbGFjZSgvXiMvLCIiKV07aWYoQyE9PXZvaWQgMClyZXR1cm5bQy5pZHhdfXZhciB5PXRzKGVyKHQuYW9EYXRhLHIsIm5UciIpKTtyZXR1cm4gSCh5KS5maWx0ZXIobykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX0RUX1Jvd0luZGV4fSkudG9BcnJheSgpfSxpPVZpKCJyb3ciLGUscyx0LG4pO3JldHVybihuLm9yZGVyPT09ImN1cnJlbnQifHxuLm9yZGVyPT09ImFwcGxpZWQiKSYmYnModCxpKSxpfTtJdCgicm93cygpIixmdW5jdGlvbih0LGUpe3Q9PT12b2lkIDA/dD0iIjpILmlzUGxhaW5PYmplY3QodCkmJihlPXQsdD0iIiksZT1IaShlKTt2YXIgbj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cmV0dXJuIFBsKHIsdCxlKX0sMSk7cmV0dXJuIG4uc2VsZWN0b3Iucm93cz10LG4uc2VsZWN0b3Iub3B0cz1lLG59KTtJdCgicm93cygpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5hb0RhdGFbZV0ublRyfHx2b2lkIDB9LDEpfSk7SXQoInJvd3MoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInJvd3MiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGVyKHQuYW9EYXRhLGUsIl9hRGF0YSIpfSwxKX0pO1F0KCJyb3dzKCkuY2FjaGUoKSIsInJvdygpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0RhdGFbbl07cmV0dXJuIHQ9PT0ic2VhcmNoIj9yLl9hRmlsdGVyRGF0YTpyLl9hU29ydERhdGF9LDEpfSk7UXQoInJvd3MoKS5pbnZhbGlkYXRlKCkiLCJyb3coKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJyb3ciLGZ1bmN0aW9uKGUsbil7UnIoZSxuLHQpfSl9KTtRdCgicm93cygpLmluZGV4ZXMoKSIsInJvdygpLmluZGV4KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInJvdyIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZX0sMSl9KTtRdCgicm93cygpLmlkcygpIiwicm93KCkuaWQoKSIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49dGhpcy5jb250ZXh0LHI9MCxzPW4ubGVuZ3RoO3I8cztyKyspZm9yKHZhciBpPTAsbz10aGlzW3JdLmxlbmd0aDtpPG87aSsrKXt2YXIgdT1uW3JdLnJvd0lkRm4obltyXS5hb0RhdGFbdGhpc1tyXVtpXV0uX2FEYXRhKTtlLnB1c2goKHQ9PT0hMD8iIyI6IiIpK3UpfXJldHVybiBuZXcgV3QobixlKX0pO1F0KCJyb3dzKCkucmVtb3ZlKCkiLCJyb3coKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbih0LGUpe3ZhciBuPXQuYW9EYXRhLHI9bltlXSxzPXQuYWlEaXNwbGF5TWFzdGVyLmluZGV4T2YoZSk7cyE9PS0xJiZ0LmFpRGlzcGxheU1hc3Rlci5zcGxpY2UocywxKSx0Ll9pUmVjb3Jkc0Rpc3BsYXk+MCYmdC5faVJlY29yZHNEaXNwbGF5LS0sdnModCk7dmFyIGk9dC5yb3dJZEZuKHIuX2FEYXRhKTtpIT09dm9pZCAwJiZkZWxldGUgdC5hSWRzW2ldLG5bZV09bnVsbH0pLHRoaXN9KTtJdCgicm93cy5hZGQoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHIpe3ZhciBzLGksbyx1PVtdO2ZvcihpPTAsbz10Lmxlbmd0aDtpPG87aSsrKXM9dFtpXSxzLm5vZGVOYW1lJiZzLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iVFIiP3UucHVzaChOaShyLHMpWzBdKTp1LnB1c2goeW4ocixzKSk7cmV0dXJuIHV9LDEpLG49dGhpcy5yb3dzKC0xKTtyZXR1cm4gbi5wb3AoKSxuLnB1c2guYXBwbHkobixlKSxufSk7SXQoInJvdygpIixmdW5jdGlvbih0LGUpe3JldHVybiBVaSh0aGlzLnJvd3ModCxlKSl9KTtJdCgicm93KCkuZGF0YSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7aWYodD09PXZvaWQgMClyZXR1cm4gZS5sZW5ndGgmJnRoaXMubGVuZ3RoJiZ0aGlzWzBdLmxlbmd0aD9lWzBdLmFvRGF0YVt0aGlzWzBdXS5fYURhdGE6dm9pZCAwO3ZhciBuPWVbMF0uYW9EYXRhW3RoaXNbMF1dO3JldHVybiBuLl9hRGF0YT10LEFycmF5LmlzQXJyYXkodCkmJm4ublRyJiZuLm5Uci5pZCYmdm4oZVswXS5yb3dJZCkodCxuLm5Uci5pZCksUnIoZVswXSx0aGlzWzBdLCJkYXRhIiksdGhpc30pO0l0KCJyb3coKS5ub2RlKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O2lmKHQubGVuZ3RoJiZ0aGlzLmxlbmd0aCYmdGhpc1swXS5sZW5ndGgpe3ZhciBlPXRbMF0uYW9EYXRhW3RoaXNbMF1dO2lmKGUmJmUublRyKXJldHVybiBlLm5Ucn1yZXR1cm4gbnVsbH0pO0l0KCJyb3cuYWRkKCkiLGZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBIJiZ0Lmxlbmd0aCYmKHQ9dFswXSk7dmFyIGU9dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4pe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0iVFIiP05pKG4sdClbMF06eW4obix0KX0pO3JldHVybiB0aGlzLnJvdyhlWzBdKX0pO0goZG9jdW1lbnQpLm9uKCJwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgV3QoZSk7bi5vbigic3RhdGVTYXZlUGFyYW1zLkRUIixmdW5jdGlvbihyLHMsaSl7Zm9yKHZhciBvPXMucm93SWRGbix1PXMuYWlEaXNwbGF5TWFzdGVyLHA9W10sYj0wO2I8dS5sZW5ndGg7YisrKXt2YXIgZz11W2JdLG09cy5hb0RhdGFbZ107bS5fZGV0YWlsc1Nob3cmJnAucHVzaCgiIyIrbyhtLl9hRGF0YSkpfWkuY2hpbGRSb3dzPXB9KSxuLm9uKCJzdGF0ZUxvYWRlZC5EVCIsZnVuY3Rpb24ocixzLGkpe1hhKG4saSl9KSxYYShuLG4uc3RhdGUubG9hZGVkKCkpfSk7dmFyIFhhPWZ1bmN0aW9uKHQsZSl7ZSYmZS5jaGlsZFJvd3MmJnQucm93cyhlLmNoaWxkUm93cy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvKFteOlxcXSooPzpcXC5bXjpcXF0qKSopOi9nLCIkMVxcOiIpfSkpLmV2ZXJ5KGZ1bmN0aW9uKCl7WnQodC5zZXR0aW5ncygpWzBdLG51bGwsInJlcXVlc3RDaGlsZCIsW3RoaXNdKX0pfSxGbD1mdW5jdGlvbih0LGUsbixyKXt2YXIgcz1bXSxpPWZ1bmN0aW9uKG8sdSl7aWYoQXJyYXkuaXNBcnJheShvKXx8byBpbnN0YW5jZW9mIEgpe2Zvcih2YXIgcD0wLGI9by5sZW5ndGg7cDxiO3ArKylpKG9bcF0sdSk7cmV0dXJufWlmKG8ubm9kZU5hbWUmJm8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciIpby5zZXRBdHRyaWJ1dGUoImRhdGEtZHQtcm93IixlLmlkeCkscy5wdXNoKG8pO2Vsc2V7dmFyIGc9SCgiPHRyPjx0ZD48L3RkPjwvdHI+IikuYXR0cigiZGF0YS1kdC1yb3ciLGUuaWR4KS5hZGRDbGFzcyh1KTtIKCJ0ZCIsZykuYWRkQ2xhc3ModSkuaHRtbChvKVswXS5jb2xTcGFuPUVyKHQpLHMucHVzaChnWzBdKX19O2kobixyKSxlLl9kZXRhaWxzJiZlLl9kZXRhaWxzLmRldGFjaCgpLGUuX2RldGFpbHM9SChzKSxlLl9kZXRhaWxzU2hvdyYmZS5fZGV0YWlscy5pbnNlcnRBZnRlcihlLm5Ucil9LHdzPWJ0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24odCl7anIodFswXSl9LDUwMCksV2k9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmNvbnRleHQ7aWYobi5sZW5ndGgpe3ZhciByPW5bMF0uYW9EYXRhW2UhPT12b2lkIDA/ZTp0WzBdXTtyJiZyLl9kZXRhaWxzJiYoci5fZGV0YWlscy5yZW1vdmUoKSxyLl9kZXRhaWxzU2hvdz12b2lkIDAsci5fZGV0YWlscz12b2lkIDAsSChyLm5UcikucmVtb3ZlQ2xhc3MoImR0LWhhc0NoaWxkIiksd3MobikpfX0seHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmNvbnRleHQ7aWYobi5sZW5ndGgmJnQubGVuZ3RoKXt2YXIgcj1uWzBdLmFvRGF0YVt0WzBdXTtyLl9kZXRhaWxzJiYoci5fZGV0YWlsc1Nob3c9ZSxlPyhyLl9kZXRhaWxzLmluc2VydEFmdGVyKHIublRyKSxIKHIublRyKS5hZGRDbGFzcygiZHQtaGFzQ2hpbGQiKSk6KHIuX2RldGFpbHMuZGV0YWNoKCksSChyLm5UcikucmVtb3ZlQ2xhc3MoImR0LWhhc0NoaWxkIikpLFp0KG5bMF0sbnVsbCwiY2hpbGRSb3ciLFtlLHQucm93KHRbMF0pXSksQmwoblswXSksd3MobikpfX0sQmw9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IFd0KHQpLG49Ii5kdC5EVF9kZXRhaWxzIixyPSJkcmF3IituLHM9ImNvbHVtbi1zaXppbmciK24saT0iZGVzdHJveSIrbixvPXQuYW9EYXRhO2Uub2ZmKHIrIiAiK3MrIiAiK2kpLENlKG8sIl9kZXRhaWxzIikubGVuZ3RoPjAmJihlLm9uKHIsZnVuY3Rpb24odSxwKXt0PT09cCYmZS5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmVxKDApLmVhY2goZnVuY3Rpb24oYil7dmFyIGc9b1tiXTtnLl9kZXRhaWxzU2hvdyYmZy5fZGV0YWlscy5pbnNlcnRBZnRlcihnLm5Ucil9KX0pLGUub24ocyxmdW5jdGlvbih1LHApe2lmKHQ9PT1wKWZvcih2YXIgYixnPUVyKHApLG09MCxDPW8ubGVuZ3RoO208QzttKyspYj1vW21dLGImJmIuX2RldGFpbHMmJmIuX2RldGFpbHMuZWFjaChmdW5jdGlvbigpe3ZhciB5PUgodGhpcykuY2hpbGRyZW4oInRkIik7eS5sZW5ndGg9PTEmJnkuYXR0cigiY29sc3BhbiIsZyl9KX0pLGUub24oaSxmdW5jdGlvbih1LHApe2lmKHQ9PT1wKWZvcih2YXIgYj0wLGc9by5sZW5ndGg7YjxnO2IrKylvW2JdJiZvW2JdLl9kZXRhaWxzJiZXaShlLGIpfSkpfSxObD0iIixycj1ObCsicm93KCkuY2hpbGQiLFZyPXJyKyIoKSI7SXQoVnIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQ7cmV0dXJuIHQ9PT12b2lkIDA/bi5sZW5ndGgmJnRoaXMubGVuZ3RoJiZuWzBdLmFvRGF0YVt0aGlzWzBdXT9uWzBdLmFvRGF0YVt0aGlzWzBdXS5fZGV0YWlsczp2b2lkIDA6KHQ9PT0hMD90aGlzLmNoaWxkLnNob3coKTp0PT09ITE/V2kodGhpcyk6bi5sZW5ndGgmJnRoaXMubGVuZ3RoJiZGbChuWzBdLG5bMF0uYW9EYXRhW3RoaXNbMF1dLHQsZSksdGhpcyl9KTtJdChbcnIrIi5zaG93KCkiLFZyKyIuc2hvdygpIl0sZnVuY3Rpb24oKXtyZXR1cm4geHModGhpcywhMCksdGhpc30pO0l0KFtycisiLmhpZGUoKSIsVnIrIi5oaWRlKCkiXSxmdW5jdGlvbigpe3JldHVybiB4cyh0aGlzLCExKSx0aGlzfSk7SXQoW3JyKyIucmVtb3ZlKCkiLFZyKyIucmVtb3ZlKCkiXSxmdW5jdGlvbigpe3JldHVybiBXaSh0aGlzKSx0aGlzfSk7SXQocnIrIi5pc1Nob3duKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aCYmdGhpcy5sZW5ndGgmJnRbMF0uYW9EYXRhW3RoaXNbMF1dJiZ0WzBdLmFvRGF0YVt0aGlzWzBdXS5fZGV0YWlsc1Nob3d8fCExfSk7dmFyIE9sPS9eKFteOl0rKT86KG5hbWV8dGl0bGV8dmlzSWR4fHZpc2libGUpJC8sR2k9ZnVuY3Rpb24odCxlLG4scixzLGkpe2Zvcih2YXIgbz1bXSx1PTAscD1zLmxlbmd0aDt1PHA7dSsrKW8ucHVzaChSZSh0LHNbdV0sZSxpKSk7cmV0dXJuIG99LF9zPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LmFvSGVhZGVyLHM9biE9PXZvaWQgMD9uOnQuYlNvcnRDZWxsc1RvcD8wOnIubGVuZ3RoLTE7cmV0dXJuIHJbc11bZV0uY2VsbH0sRWw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zLHM9Q2Uociwic05hbWUiKSxpPUNlKHIsInNUaXRsZSIpLG89YnQudXRpbC5nZXQoIltdLltdLmNlbGwiKSh0LmFvSGVhZGVyKSx1PXhuKEFpKFtdLG8pKSxwPWZ1bmN0aW9uKGIpe3ZhciBnPUphKGIpO2lmKGI9PT0iIilyZXR1cm4gYW4oci5sZW5ndGgpO2lmKGchPT1udWxsKXJldHVybltnPj0wP2c6ci5sZW5ndGgrZ107aWYodHlwZW9mIGI9PSJmdW5jdGlvbiIpe3ZhciBtPU1yKHQsbik7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGIoaCxHaSh0LGgsMCwwLG0pLF9zKHQsaCkpP2g6bnVsbH0pfXZhciBDPXR5cGVvZiBiPT0ic3RyaW5nIj9iLm1hdGNoKE9sKToiIjtpZihDKXN3aXRjaChDWzJdKXtjYXNlInZpc0lkeCI6Y2FzZSJ2aXNpYmxlIjppZihDWzFdJiZDWzFdLm1hdGNoKC9eXGQrJC8pKXt2YXIgeT1wYXJzZUludChDWzFdLDEwKTtpZih5PDApe3ZhciBUPXIubWFwKGZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuYlZpc2libGU/aDpudWxsfSk7cmV0dXJuW1RbVC5sZW5ndGgreV1dfXJldHVybltJaSh0LHkpXX1yZXR1cm4gci5tYXAoZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5iVmlzaWJsZT9DWzFdP0godVtoXSkuZmlsdGVyKENbMV0pLmxlbmd0aD4wP2g6bnVsbDpoOm51bGx9KTtjYXNlIm5hbWUiOnJldHVybiBzLm1hcChmdW5jdGlvbihsLGgpe3JldHVybiBsPT09Q1sxXT9oOm51bGx9KTtjYXNlInRpdGxlIjpyZXR1cm4gaS5tYXAoZnVuY3Rpb24obCxoKXtyZXR1cm4gbD09PUNbMV0/aDpudWxsfSk7ZGVmYXVsdDpyZXR1cm5bXX1pZihiLm5vZGVOYW1lJiZiLl9EVF9DZWxsSW5kZXgpcmV0dXJuW2IuX0RUX0NlbGxJbmRleC5jb2x1bW5dO3ZhciBQPUgodSkuZmlsdGVyKGIpLm1hcChmdW5jdGlvbigpe3JldHVybiBCaSh0aGlzKX0pLnRvQXJyYXkoKTtpZihQLmxlbmd0aHx8IWIubm9kZU5hbWUpcmV0dXJuIFA7dmFyIGM9SChiKS5jbG9zZXN0KCIqW2RhdGEtZHQtY29sdW1uXSIpO3JldHVybiBjLmxlbmd0aD9bYy5kYXRhKCJkdC1jb2x1bW4iKV06W119O3JldHVybiBWaSgiY29sdW1uIixlLHAsdCxuKX0sUmw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9Db2x1bW5zLHM9cltlXSxpPXQuYW9EYXRhLG8sdSxwLGI7aWYobj09PXZvaWQgMClyZXR1cm4gcy5iVmlzaWJsZTtpZihzLmJWaXNpYmxlPT09bilyZXR1cm4hMTtpZihuKXt2YXIgZz1DZShyLCJiVmlzaWJsZSIpLmluZGV4T2YoITAsZSsxKTtmb3IodT0wLHA9aS5sZW5ndGg7dTxwO3UrKylpW3VdJiYoYj1pW3VdLm5UcixvPWlbdV0uYW5DZWxscyxiJiZiLmluc2VydEJlZm9yZShvW2VdLG9bZ118fG51bGwpKX1lbHNlIEgoQ2UodC5hb0RhdGEsImFuQ2VsbHMiLGUpKS5kZXRhY2goKTtyZXR1cm4gcy5iVmlzaWJsZT1uLGhzKHQpLCEwfTtJdCgiY29sdW1ucygpIixmdW5jdGlvbih0LGUpe3Q9PT12b2lkIDA/dD0iIjpILmlzUGxhaW5PYmplY3QodCkmJihlPXQsdD0iIiksZT1IaShlKTt2YXIgbj10aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cmV0dXJuIEVsKHIsdCxlKX0sMSk7cmV0dXJuIG4uc2VsZWN0b3IuY29scz10LG4uc2VsZWN0b3Iub3B0cz1lLG59KTtRdCgiY29sdW1ucygpLmhlYWRlcigpIiwiY29sdW1uKCkuaGVhZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7cmV0dXJuIF9zKGUsbix0KX0sMSl9KTtRdCgiY29sdW1ucygpLmZvb3RlcigpIiwiY29sdW1uKCkuZm9vdGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0Zvb3RlcjtyZXR1cm4gci5sZW5ndGg/ZS5hb0Zvb3Rlclt0IT09dm9pZCAwP3Q6MF1bbl0uY2VsbDpudWxsfSwxKX0pO1F0KCJjb2x1bW5zKCkuZGF0YSgpIiwiY29sdW1uKCkuZGF0YSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsR2ksMSl9KTtRdCgiY29sdW1ucygpLnJlbmRlcigpIiwiY29sdW1uKCkucmVuZGVyKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxuLHIscyxpKXtyZXR1cm4gR2koZSxuLHIscyxpLHQpfSwxKX0pO1F0KCJjb2x1bW5zKCkuZGF0YVNyYygpIiwiY29sdW1uKCkuZGF0YVNyYygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdLm1EYXRhfSwxKX0pO1F0KCJjb2x1bW5zKCkuY2FjaGUoKSIsImNvbHVtbigpLmNhY2hlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4tcm93cyIsZnVuY3Rpb24oZSxuLHIscyxpKXtyZXR1cm4gZXIoZS5hb0RhdGEsaSx0PT09InNlYXJjaCI/Il9hRmlsdGVyRGF0YSI6Il9hU29ydERhdGEiLG4pfSwxKX0pO1F0KCJjb2x1bW5zKCkuaW5pdCgpIiwiY29sdW1uKCkuaW5pdCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuYW9Db2x1bW5zW2VdfSwxKX0pO1F0KCJjb2x1bW5zKCkubm9kZXMoKSIsImNvbHVtbigpLm5vZGVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbi1yb3dzIixmdW5jdGlvbih0LGUsbixyLHMpe3JldHVybiBlcih0LmFvRGF0YSxzLCJhbkNlbGxzIixlKX0sMSl9KTtRdCgiY29sdW1ucygpLnRpdGxlcygpIiwiY29sdW1uKCkudGl0bGUoKSIsZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihuLHIpe3R5cGVvZiB0PT0ibnVtYmVyIiYmKGU9dCx0PXZvaWQgMCk7dmFyIHM9SCgic3Bhbi5kdC1jb2x1bW4tdGl0bGUiLHRoaXMuY29sdW1uKHIpLmhlYWRlcihlKSk7cmV0dXJuIHQhPT12b2lkIDA/KHMuaHRtbCh0KSx0aGlzKTpzLmh0bWwoKX0sMSl9KTtRdCgiY29sdW1ucygpLnR5cGVzKCkiLCJjb2x1bW4oKS50eXBlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odCxlKXt2YXIgbj10LmFvQ29sdW1uc1tlXS5zVHlwZTtyZXR1cm4gbnx8RmkodCksbn0sMSl9KTtRdCgiY29sdW1ucygpLnZpc2libGUoKSIsImNvbHVtbigpLnZpc2libGUoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9W10scz10aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGksbyl7aWYodD09PXZvaWQgMClyZXR1cm4gaS5hb0NvbHVtbnNbb10uYlZpc2libGU7UmwoaSxvLHQpJiZyLnB1c2gobyl9KTtyZXR1cm4gdCE9PXZvaWQgMCYmdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGkpe0lyKGksaS5hb0hlYWRlciksSXIoaSxpLmFvRm9vdGVyKSxpLmFpRGlzcGxheS5sZW5ndGh8fEgoaS5uVEJvZHkpLmZpbmQoInRkW2NvbHNwYW5dIikuYXR0cigiY29sc3BhbiIsRXIoaSkpLGpyKGkpLG4uaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24obyx1KXtyLmluY2x1ZGVzKHUpJiZadChvLG51bGwsImNvbHVtbi12aXNpYmlsaXR5Iixbbyx1LHQsZV0pfSksci5sZW5ndGgmJihlPT09dm9pZCAwfHxlKSYmbi5jb2x1bW5zLmFkanVzdCgpfSksc30pO1F0KCJjb2x1bW5zKCkud2lkdGhzKCkiLCJjb2x1bW4oKS53aWR0aCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29sdW1ucygiOnZpc2libGUiKS5jb3VudCgpLGU9SCgiPHRyPiIpLmh0bWwoIjx0ZD4iK0FycmF5KHQpLmpvaW4oIjwvdGQ+PHRkPiIpKyI8L3RkPiIpO0godGhpcy50YWJsZSgpLmJvZHkoKSkuYXBwZW5kKGUpO3ZhciBuPWUuY2hpbGRyZW4oKS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gSCh0aGlzKS5vdXRlcldpZHRoKCl9KTtyZXR1cm4gZS5yZW1vdmUoKSx0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKHIscyl7dmFyIGk9bnIocixzKTtyZXR1cm4gaSE9PW51bGw/bltpXTowfSwxKX0pO1F0KCJjb2x1bW5zKCkuaW5kZXhlcygpIiwiY29sdW1uKCkuaW5kZXgoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxuKXtyZXR1cm4gdD09PSJ2aXNpYmxlIj9ucihlLG4pOm59LDEpfSk7SXQoImNvbHVtbnMuYWRqdXN0KCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbih0KXtPcih0KX0sMSl9KTtJdCgiY29sdW1uLmluZGV4KCkiLGZ1bmN0aW9uKHQsZSl7aWYodGhpcy5jb250ZXh0Lmxlbmd0aCE9PTApe3ZhciBuPXRoaXMuY29udGV4dFswXTtpZih0PT09ImZyb21WaXNpYmxlInx8dD09PSJ0b0RhdGEiKXJldHVybiBJaShuLGUpO2lmKHQ9PT0iZnJvbURhdGEifHx0PT09InRvVmlzaWJsZSIpcmV0dXJuIG5yKG4sZSl9fSk7SXQoImNvbHVtbigpIixmdW5jdGlvbih0LGUpe3JldHVybiBVaSh0aGlzLmNvbHVtbnModCxlKSl9KTt2YXIgTGw9ZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9EYXRhLHM9TXIodCxuKSxpPXRzKGVyKHIscywiYW5DZWxscyIpKSxvPUgoQWkoW10saSkpLHUscD10LmFvQ29sdW1ucy5sZW5ndGgsYixnLG0sQyx5LFQsUD1mdW5jdGlvbihjKXt2YXIgbD10eXBlb2YgYz09ImZ1bmN0aW9uIjtpZihjPT1udWxsfHxsKXtmb3IoYj1bXSxnPTAsbT1zLmxlbmd0aDtnPG07ZysrKWZvcih1PXNbZ10sQz0wO0M8cDtDKyspeT17cm93OnUsY29sdW1uOkN9LGw/KFQ9clt1XSxjKHksUmUodCx1LEMpLFQuYW5DZWxscz9ULmFuQ2VsbHNbQ106bnVsbCkmJmIucHVzaCh5KSk6Yi5wdXNoKHkpO3JldHVybiBifWlmKEguaXNQbGFpbk9iamVjdChjKSlyZXR1cm4gYy5jb2x1bW4hPT12b2lkIDAmJmMucm93IT09dm9pZCAwJiZzLmluZGV4T2YoYy5yb3cpIT09LTE/W2NdOltdO3ZhciBoPW8uZmlsdGVyKGMpLm1hcChmdW5jdGlvbihfLEYpe3JldHVybntyb3c6Ri5fRFRfQ2VsbEluZGV4LnJvdyxjb2x1bW46Ri5fRFRfQ2VsbEluZGV4LmNvbHVtbn19KS50b0FycmF5KCk7cmV0dXJuIGgubGVuZ3RofHwhYy5ub2RlTmFtZT9oOihUPUgoYykuY2xvc2VzdCgiKltkYXRhLWR0LXJvd10iKSxULmxlbmd0aD9be3JvdzpULmRhdGEoImR0LXJvdyIpLGNvbHVtbjpULmRhdGEoImR0LWNvbHVtbiIpfV06W10pfTtyZXR1cm4gVmkoImNlbGwiLGUsUCx0LG4pfTtJdCgiY2VsbHMoKSIsZnVuY3Rpb24odCxlLG4pe2lmKEguaXNQbGFpbk9iamVjdCh0KSYmKHQucm93PT09dm9pZCAwPyhuPXQsdD1udWxsKToobj1lLGU9bnVsbCkpLEguaXNQbGFpbk9iamVjdChlKSYmKG49ZSxlPW51bGwpLGU9PW51bGwpcmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihDKXtyZXR1cm4gTGwoQyx0LEhpKG4pKX0pO3ZhciByPW4/e3BhZ2U6bi5wYWdlLG9yZGVyOm4ub3JkZXIsc2VhcmNoOm4uc2VhcmNofTp7fSxzPXRoaXMuY29sdW1ucyhlLHIpLGk9dGhpcy5yb3dzKHQsciksbyx1LHAsYixnPXRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihDLHkpe3ZhciBUPVtdO2ZvcihvPTAsdT1pW3ldLmxlbmd0aDtvPHU7bysrKWZvcihwPTAsYj1zW3ldLmxlbmd0aDtwPGI7cCsrKVQucHVzaCh7cm93OmlbeV1bb10sY29sdW1uOnNbeV1bcF19KTtyZXR1cm4gVH0sMSksbT1uJiZuLnNlbGVjdGVkP3RoaXMuY2VsbHMoZyxuKTpnO3JldHVybiBILmV4dGVuZChtLnNlbGVjdG9yLHtjb2xzOmUscm93czp0LG9wdHM6bn0pLG19KTtRdCgiY2VsbHMoKS5ub2RlcygpIiwiY2VsbCgpLm5vZGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLG4pe3ZhciByPXQuYW9EYXRhW2VdO3JldHVybiByJiZyLmFuQ2VsbHM/ci5hbkNlbGxzW25dOnZvaWQgMH0sMSl9KTtJdCgiY2VsbHMoKS5kYXRhKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNlbGwiLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUmUodCxlLG4pfSwxKX0pO1F0KCJjZWxscygpLmNhY2hlKCkiLCJjZWxsKCkuY2FjaGUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9dD09PSJzZWFyY2giPyJfYUZpbHRlckRhdGEiOiJfYVNvcnREYXRhIix0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLG4scil7cmV0dXJuIGUuYW9EYXRhW25dW3RdW3JdfSwxKX0pO1F0KCJjZWxscygpLnJlbmRlcigpIiwiY2VsbCgpLnJlbmRlcigpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiBSZShlLG4scix0KX0sMSl9KTtRdCgiY2VsbHMoKS5pbmRleGVzKCkiLCJjZWxsKCkuaW5kZXgoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24odCxlLG4pe3JldHVybntyb3c6ZSxjb2x1bW46bixjb2x1bW5WaXNpYmxlOm5yKHQsbil9fSwxKX0pO1F0KCJjZWxscygpLmludmFsaWRhdGUoKSIsImNlbGwoKS5pbnZhbGlkYXRlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihlLG4scil7UnIoZSxuLHQscil9KX0pO0l0KCJjZWxsKCkiLGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVWkodGhpcy5jZWxscyh0LGUsbikpfSk7SXQoImNlbGwoKS5kYXRhKCkiLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY29udGV4dCxuPXRoaXNbMF07cmV0dXJuIHQ9PT12b2lkIDA/ZS5sZW5ndGgmJm4ubGVuZ3RoP1JlKGVbMF0sblswXS5yb3csblswXS5jb2x1bW4pOnZvaWQgMDoob2woZVswXSxuWzBdLnJvdyxuWzBdLmNvbHVtbix0KSxScihlWzBdLG5bMF0ucm93LCJkYXRhIixuWzBdLmNvbHVtbiksdGhpcyl9KTtJdCgib3JkZXIoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmNvbnRleHQscj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0PT09dm9pZCAwP24ubGVuZ3RoIT09MD9uWzBdLmFhU29ydGluZzp2b2lkIDA6KHR5cGVvZiB0PT0ibnVtYmVyIj90PVtbdCxlXV06ci5sZW5ndGg+MSYmKHQ9ciksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHMpe3MuYWFTb3J0aW5nPUFycmF5LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9KSl9KTtJdCgib3JkZXIubGlzdGVuZXIoKSIsZnVuY3Rpb24odCxlLG4pe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7cHMocix0LHt9LGUsbil9KX0pO0l0KCJvcmRlci5maXhlZCgpIixmdW5jdGlvbih0KXtpZighdCl7dmFyIGU9dGhpcy5jb250ZXh0LG49ZS5sZW5ndGg/ZVswXS5hYVNvcnRpbmdGaXhlZDp2b2lkIDA7cmV0dXJuIEFycmF5LmlzQXJyYXkobik/e3ByZTpufTpufXJldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7ci5hYVNvcnRpbmdGaXhlZD1ILmV4dGVuZCghMCx7fSx0KX0pfSk7SXQoWyJjb2x1bW5zKCkub3JkZXIoKSIsImNvbHVtbigpLm9yZGVyKCkiXSxmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0P3RoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuLHIpe24uYWFTb3J0aW5nPWVbcl0ubWFwKGZ1bmN0aW9uKHMpe3JldHVybltzLHRdfSl9KTp0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKG4scil7Zm9yKHZhciBzPXpyKG4pLGk9MCxvPXMubGVuZ3RoO2k8bztpKyspaWYoc1tpXS5jb2w9PT1yKXJldHVybiBzW2ldLmRpcjtyZXR1cm4gbnVsbH0sMSl9KTtRdCgiY29sdW1ucygpLm9yZGVyYWJsZSgpIiwiY29sdW1uKCkub3JkZXJhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjb2x1bW4iLGZ1bmN0aW9uKGUsbil7dmFyIHI9ZS5hb0NvbHVtbnNbbl07cmV0dXJuIHQ/ci5hc1NvcnRpbmc6ci5iU29ydGFibGV9LDEpfSk7SXQoInByb2Nlc3NpbmcoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtrZShlLHQpfSl9KTtJdCgic2VhcmNoKCkiLGZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMuY29udGV4dDtyZXR1cm4gdD09PXZvaWQgMD9zLmxlbmd0aCE9PTA/c1swXS5vUHJldmlvdXNTZWFyY2guc2VhcmNoOnZvaWQgMDp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oaSl7aS5vRmVhdHVyZXMuYkZpbHRlciYmKHR5cGVvZiBlPT0ib2JqZWN0Ij90cihpLEguZXh0ZW5kKGkub1ByZXZpb3VzU2VhcmNoLGUse3NlYXJjaDp0fSkpOnRyKGksSC5leHRlbmQoaS5vUHJldmlvdXNTZWFyY2gse3NlYXJjaDp0LHJlZ2V4OmU9PT1udWxsPyExOmUsc21hcnQ6bj09PW51bGw/ITA6bixjYXNlSW5zZW5zaXRpdmU6cj09PW51bGw/ITA6cn0pKSl9KX0pO0l0KCJzZWFyY2guZml4ZWQoKSIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLml0ZXJhdG9yKCEwLCJ0YWJsZSIsZnVuY3Rpb24ocil7dmFyIHM9ci5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBzW3RdO2U9PT1udWxsP2RlbGV0ZSBzW3RdOnNbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhzKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP25bMF06bn0pO1F0KCJjb2x1bW5zKCkuc2VhcmNoKCkiLCJjb2x1bW4oKS5zZWFyY2goKSIsZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24ocyxpKXt2YXIgbz1zLmFvUHJlU2VhcmNoQ29scztpZih0PT09dm9pZCAwKXJldHVybiBvW2ldLnNlYXJjaDtzLm9GZWF0dXJlcy5iRmlsdGVyJiYodHlwZW9mIGU9PSJvYmplY3QiP0guZXh0ZW5kKG9baV0sZSx7c2VhcmNoOnR9KTpILmV4dGVuZChvW2ldLHtzZWFyY2g6dCxyZWdleDplPT09bnVsbD8hMTplLHNtYXJ0Om49PT1udWxsPyEwOm4sY2FzZUluc2Vuc2l0aXZlOnI9PT1udWxsPyEwOnJ9KSx0cihzLHMub1ByZXZpb3VzU2VhcmNoKSl9KX0pO0l0KFsiY29sdW1ucygpLnNlYXJjaC5maXhlZCgpIiwiY29sdW1uKCkuc2VhcmNoLmZpeGVkKCkiXSxmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuaXRlcmF0b3IoITAsImNvbHVtbiIsZnVuY3Rpb24ocixzKXt2YXIgaT1yLmFvQ29sdW1uc1tzXS5zZWFyY2hGaXhlZDtpZih0KXtpZihlPT09dm9pZCAwKXJldHVybiBpW3RdO2U9PT1udWxsP2RlbGV0ZSBpW3RdOmlbdF09ZX1lbHNlIHJldHVybiBPYmplY3Qua2V5cyhpKTtyZXR1cm4gdGhpc30pO3JldHVybiB0IT09dm9pZCAwJiZlPT09dm9pZCAwP25bMF06bn0pO0l0KCJzdGF0ZSgpIixmdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0aGlzLmNvbnRleHQubGVuZ3RoP3RoaXMuY29udGV4dFswXS5vU2F2ZWRTdGF0ZTpudWxsO3ZhciBuPUguZXh0ZW5kKCEwLHt9LHQpO3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24ocil7ZSE9PSExJiYobi50aW1lPStuZXcgRGF0ZSsxMDApLGtpKHIsbixmdW5jdGlvbigpe30pfSl9KTtJdCgic3RhdGUuY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3QuZm5TdGF0ZVNhdmVDYWxsYmFjay5jYWxsKHQub0luc3RhbmNlLHQse30pfSl9KTtJdCgic3RhdGUubG9hZGVkKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dC5sZW5ndGg/dGhpcy5jb250ZXh0WzBdLm9Mb2FkZWRTdGF0ZTpudWxsfSk7SXQoInN0YXRlLnNhdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe2pyKHQpfSl9KTtidC51c2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10eXBlb2YgdD09InN0cmluZyI/ZTp0LHI9dHlwZW9mIGU9PSJzdHJpbmciP2U6dDtpZihuPT09dm9pZCAwJiZ0eXBlb2Ygcj09InN0cmluZyIpc3dpdGNoKHIpe2Nhc2UibGliIjpjYXNlImpxIjpyZXR1cm4gSDtjYXNlIndpbiI6cmV0dXJuIHdpbmRvdztjYXNlImRhdGV0aW1lIjpyZXR1cm4gYnQuRGF0ZVRpbWU7Y2FzZSJsdXhvbiI6cmV0dXJuIGRuO2Nhc2UibW9tZW50IjpyZXR1cm4gd247ZGVmYXVsdDpyZXR1cm4gbnVsbH1yPT09ImxpYiJ8fHI9PT0ianEifHxuJiZuLmZuJiZuLmZuLmpxdWVyeT9IPW46cj09IndpbiJ8fG4mJm4uZG9jdW1lbnQ/KHdpbmRvdz1uLGRvY3VtZW50PW4uZG9jdW1lbnQpOnI9PT0iZGF0ZXRpbWUifHxuJiZuLnR5cGU9PT0iRGF0ZVRpbWUiP2J0LkRhdGVUaW1lPW46cj09PSJsdXhvbiJ8fG4mJm4uRml4ZWRPZmZzZXRab25lP2RuPW46KHI9PT0ibW9tZW50Inx8biYmbi5pc01vbWVudCkmJih3bj1uKX07YnQuZmFjdG9yeT1mdW5jdGlvbih0LGUpe3ZhciBuPSExO3JldHVybiB0JiZ0LmRvY3VtZW50JiYod2luZG93PXQsZG9jdW1lbnQ9dC5kb2N1bWVudCksZSYmZS5mbiYmZS5mbi5qcXVlcnkmJihIPWUsbj0hMCksbn07YnQudmVyc2lvbkNoZWNrPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPWU/ZS5zcGxpdCgiLiIpOmJ0LnZlcnNpb24uc3BsaXQoIi4iKSxyPXQuc3BsaXQoIi4iKSxzLGksbz0wLHU9ci5sZW5ndGg7bzx1O28rKylpZihzPXBhcnNlSW50KG5bb10sMTApfHwwLGk9cGFyc2VJbnQocltvXSwxMCl8fDAscyE9PWkpcmV0dXJuIHM+aTtyZXR1cm4hMH07YnQuaXNEYXRhVGFibGU9ZnVuY3Rpb24odCl7dmFyIGU9SCh0KS5nZXQoMCksbj0hMTtyZXR1cm4gdCBpbnN0YW5jZW9mIGJ0LkFwaT8hMDooSC5lYWNoKGJ0LnNldHRpbmdzLGZ1bmN0aW9uKHIscyl7dmFyIGk9cy5uU2Nyb2xsSGVhZD9IKCJ0YWJsZSIscy5uU2Nyb2xsSGVhZClbMF06bnVsbCxvPXMublNjcm9sbEZvb3Q/SCgidGFibGUiLHMublNjcm9sbEZvb3QpWzBdOm51bGw7KHMublRhYmxlPT09ZXx8aT09PWV8fG89PT1lKSYmKG49ITApfSksbil9O2J0LnRhYmxlcz1mdW5jdGlvbih0KXt2YXIgZT0hMTtILmlzUGxhaW5PYmplY3QodCkmJihlPXQuYXBpLHQ9dC52aXNpYmxlKTt2YXIgbj1idC5zZXR0aW5ncy5maWx0ZXIoZnVuY3Rpb24ocil7cmV0dXJuISEoIXR8fHQmJkgoci5uVGFibGUpLmlzKCI6dmlzaWJsZSIpKX0pLm1hcChmdW5jdGlvbihyKXtyZXR1cm4gci5uVGFibGV9KTtyZXR1cm4gZT9uZXcgV3Qobik6bn07YnQuY2FtZWxUb0h1bmdhcmlhbj1zbjtJdCgiJCgpIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMucm93cyhlKS5ub2RlcygpLHI9SChuKTtyZXR1cm4gSChbXS5jb25jYXQoci5maWx0ZXIodCkudG9BcnJheSgpLHIuZmluZCh0KS50b0FycmF5KCkpKX0pO0guZWFjaChbIm9uIiwib25lIiwib2ZmIl0sZnVuY3Rpb24odCxlKXtJdChlKyIoKSIsZnVuY3Rpb24oKXt2YXIgbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO25bMF09blswXS5zcGxpdCgvXHMvKS5tYXAoZnVuY3Rpb24ocyl7cmV0dXJuIHMubWF0Y2goL1wuZHRcYi8pP3M6cysiLmR0In0pLmpvaW4oIiAiKTt2YXIgcj1IKHRoaXMudGFibGVzKCkubm9kZXMoKSk7cmV0dXJuIHJbZV0uYXBwbHkocixuKSx0aGlzfSl9KTtJdCgiY2xlYXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe09pKHQpfSl9KTtJdCgiZXJyb3IoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtPZShlLDAsdCl9KX0pO0l0KCJzZXR0aW5ncygpIixmdW5jdGlvbigpe3JldHVybiBuZXcgV3QodGhpcy5jb250ZXh0LHRoaXMuY29udGV4dCl9KTtJdCgiaW5pdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGV4dDtyZXR1cm4gdC5sZW5ndGg/dFswXS5vSW5pdDpudWxsfSk7SXQoImRhdGEoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3JldHVybiBDZSh0LmFvRGF0YSwiX2FEYXRhIil9KS5mbGF0dGVuKCl9KTtJdCgidHJpZ2dlcigpIixmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihyKXtyZXR1cm4gWnQocixudWxsLHQsZSxuKX0pLmZsYXR0ZW4oKX0pO0l0KCJyZWFkeSgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvbnRleHQ7cmV0dXJuIHQ/dGhpcy50YWJsZXMoKS5ldmVyeShmdW5jdGlvbigpe3RoaXMuY29udGV4dFswXS5fYkluaXRDb21wbGV0ZT90LmNhbGwodGhpcyk6dGhpcy5vbigiaW5pdCIsZnVuY3Rpb24oKXt0LmNhbGwodGhpcyl9KX0pOmUubGVuZ3RoP2VbMF0uX2JJbml0Q29tcGxldGV8fCExOm51bGx9KTtJdCgiZGVzdHJveSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD10fHwhMSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7dmFyIG49ZS5vQ2xhc3NlcyxyPWUublRhYmxlLHM9ZS5uVEJvZHksaT1lLm5USGVhZCxvPWUublRGb290LHU9SChyKSxwPUgocyksYj1IKGUublRhYmxlV3JhcHBlciksZz1lLmFvRGF0YS5tYXAoZnVuY3Rpb24oYyl7cmV0dXJuIGM/Yy5uVHI6bnVsbH0pLG09bi5vcmRlcjtlLmJEZXN0cm95aW5nPSEwLFp0KGUsImFvRGVzdHJveUNhbGxiYWNrIiwiZGVzdHJveSIsW2VdLCEwKSx0fHxuZXcgV3QoZSkuY29sdW1ucygpLnZpc2libGUoITApLGIub2ZmKCIuRFQiKS5maW5kKCI6bm90KHRib2R5ICopIikub2ZmKCIuRFQiKSxIKHdpbmRvdykub2ZmKCIuRFQtIitlLnNJbnN0YW5jZSksciE9aS5wYXJlbnROb2RlJiYodS5jaGlsZHJlbigidGhlYWQiKS5kZXRhY2goKSx1LmFwcGVuZChpKSksbyYmciE9by5wYXJlbnROb2RlJiYodS5jaGlsZHJlbigidGZvb3QiKS5kZXRhY2goKSx1LmFwcGVuZChvKSksZS5jb2xncm91cC5yZW1vdmUoKSxlLmFhU29ydGluZz1bXSxlLmFhU29ydGluZ0ZpeGVkPVtdLFRpKGUpLEgoInRoLCB0ZCIsaSkucmVtb3ZlQ2xhc3MobS5jYW5Bc2MrIiAiK20uY2FuRGVzYysiICIrbS5pc0FzYysiICIrbS5pc0Rlc2MpLmNzcygid2lkdGgiLCIiKSxwLmNoaWxkcmVuKCkuZGV0YWNoKCkscC5hcHBlbmQoZyk7dmFyIEM9ZS5uVGFibGVXcmFwcGVyLnBhcmVudE5vZGUseT1lLm5UYWJsZVdyYXBwZXIubmV4dFNpYmxpbmcsVD10PyJyZW1vdmUiOiJkZXRhY2giO3VbVF0oKSxiW1RdKCksIXQmJkMmJihDLmluc2VydEJlZm9yZShyLHkpLHUuY3NzKCJ3aWR0aCIsZS5zRGVzdHJveVdpZHRoKS5yZW1vdmVDbGFzcyhuLnRhYmxlKSk7dmFyIFA9YnQuc2V0dGluZ3MuaW5kZXhPZihlKTtQIT09LTEmJmJ0LnNldHRpbmdzLnNwbGljZShQLDEpfSl9KTtILmVhY2goWyJjb2x1bW4iLCJyb3ciLCJjZWxsIl0sZnVuY3Rpb24odCxlKXtJdChlKyJzKCkuZXZlcnkoKSIsZnVuY3Rpb24obil7dmFyIHI9dGhpcy5zZWxlY3Rvci5vcHRzLHM9dGhpcyxpLG89MDtyZXR1cm4gdGhpcy5pdGVyYXRvcigiZXZlcnkiLGZ1bmN0aW9uKHUscCxiKXtpPXNbZV0ocCxyKSxlPT09ImNlbGwiP24uY2FsbChpLGlbMF1bMF0ucm93LGlbMF1bMF0uY29sdW1uLGIsbyk6bi5jYWxsKGkscCxiLG8pLG8rK30pfSl9KTtJdCgiaTE4bigpIixmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5jb250ZXh0WzBdLHM9RW4odCkoci5vTGFuZ3VhZ2UpO3JldHVybiBzPT09dm9pZCAwJiYocz1lKSxILmlzUGxhaW5PYmplY3QocykmJihzPW4hPT12b2lkIDAmJnNbbl0hPT12b2lkIDA/c1tuXTpzLl8pLHR5cGVvZiBzPT0ic3RyaW5nIj9zLnJlcGxhY2UoIiVkIixuKTpzfSk7YnQudmVyc2lvbj0iMi4xLjYiO2J0LnNldHRpbmdzPVtdO2J0Lm1vZGVscz17fTtidC5tb2RlbHMub1NlYXJjaD17Y2FzZUluc2Vuc2l0aXZlOiEwLHNlYXJjaDoiIixyZWdleDohMSxzbWFydDohMCxyZXR1cm46ITF9O2J0Lm1vZGVscy5vUm93PXtuVHI6bnVsbCxhbkNlbGxzOm51bGwsX2FEYXRhOltdLF9hU29ydERhdGE6bnVsbCxfYUZpbHRlckRhdGE6bnVsbCxfc0ZpbHRlclJvdzpudWxsLHNyYzpudWxsLGlkeDotMSxkaXNwbGF5RGF0YTpudWxsfTtidC5tb2RlbHMub0NvbHVtbj17aWR4Om51bGwsYURhdGFTb3J0Om51bGwsYXNTb3J0aW5nOm51bGwsYlNlYXJjaGFibGU6bnVsbCxiU29ydGFibGU6bnVsbCxiVmlzaWJsZTpudWxsLF9zTWFudWFsVHlwZTpudWxsLF9iQXR0clNyYzohMSxmbkNyZWF0ZWRDZWxsOm51bGwsZm5HZXREYXRhOm51bGwsZm5TZXREYXRhOm51bGwsbURhdGE6bnVsbCxtUmVuZGVyOm51bGwsc0NsYXNzOm51bGwsc0NvbnRlbnRQYWRkaW5nOm51bGwsc0RlZmF1bHRDb250ZW50Om51bGwsc05hbWU6bnVsbCxzU29ydERhdGFUeXBlOiJzdGQiLHNTb3J0aW5nQ2xhc3M6bnVsbCxzVGl0bGU6bnVsbCxzVHlwZTpudWxsLHNXaWR0aDpudWxsLHNXaWR0aE9yaWc6bnVsbCxtYXhMZW5TdHJpbmc6bnVsbCxzZWFyY2hGaXhlZDpudWxsfTtidC5kZWZhdWx0cz17YWFEYXRhOm51bGwsYWFTb3J0aW5nOltbMCwiYXNjIl1dLGFhU29ydGluZ0ZpeGVkOltdLGFqYXg6bnVsbCxhTGVuZ3RoTWVudTpbMTAsMjUsNTAsMTAwXSxhb0NvbHVtbnM6bnVsbCxhb0NvbHVtbkRlZnM6bnVsbCxhb1NlYXJjaENvbHM6W10sYkF1dG9XaWR0aDohMCxiRGVmZXJSZW5kZXI6ITAsYkRlc3Ryb3k6ITEsYkZpbHRlcjohMCxiSW5mbzohMCxiTGVuZ3RoQ2hhbmdlOiEwLGJQYWdpbmF0ZTohMCxiUHJvY2Vzc2luZzohMSxiUmV0cmlldmU6ITEsYlNjcm9sbENvbGxhcHNlOiExLGJTZXJ2ZXJTaWRlOiExLGJTb3J0OiEwLGJTb3J0TXVsdGk6ITAsYlNvcnRDZWxsc1RvcDpudWxsLGJTb3J0Q2xhc3NlczohMCxiU3RhdGVTYXZlOiExLGZuQ3JlYXRlZFJvdzpudWxsLGZuRHJhd0NhbGxiYWNrOm51bGwsZm5Gb290ZXJDYWxsYmFjazpudWxsLGZuRm9ybWF0TnVtYmVyOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKCkucmVwbGFjZSgvXEIoPz0oXGR7M30pKyg/IVxkKSkvZyx0aGlzLm9MYW5ndWFnZS5zVGhvdXNhbmRzKX0sZm5IZWFkZXJDYWxsYmFjazpudWxsLGZuSW5mb0NhbGxiYWNrOm51bGwsZm5Jbml0Q29tcGxldGU6bnVsbCxmblByZURyYXdDYWxsYmFjazpudWxsLGZuUm93Q2FsbGJhY2s6bnVsbCxmblN0YXRlTG9hZENhbGxiYWNrOmZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gSlNPTi5wYXJzZSgodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuZ2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSkpfWNhdGNoe3JldHVybnt9fX0sZm5TdGF0ZUxvYWRQYXJhbXM6bnVsbCxmblN0YXRlTG9hZGVkOm51bGwsZm5TdGF0ZVNhdmVDYWxsYmFjazpmdW5jdGlvbih0LGUpe3RyeXsodC5pU3RhdGVEdXJhdGlvbj09PS0xP3Nlc3Npb25TdG9yYWdlOmxvY2FsU3RvcmFnZSkuc2V0SXRlbSgiRGF0YVRhYmxlc18iK3Quc0luc3RhbmNlKyJfIitsb2NhdGlvbi5wYXRobmFtZSxKU09OLnN0cmluZ2lmeShlKSl9Y2F0Y2h7fX0sZm5TdGF0ZVNhdmVQYXJhbXM6bnVsbCxpU3RhdGVEdXJhdGlvbjo3MjAwLGlEaXNwbGF5TGVuZ3RoOjEwLGlEaXNwbGF5U3RhcnQ6MCxpVGFiSW5kZXg6MCxvQ2xhc3Nlczp7fSxvTGFuZ3VhZ2U6e29BcmlhOntvcmRlcmFibGU6IjogQWN0aXZhdGUgdG8gc29ydCIsb3JkZXJhYmxlUmV2ZXJzZToiOiBBY3RpdmF0ZSB0byBpbnZlcnQgc29ydGluZyIsb3JkZXJhYmxlUmVtb3ZlOiI6IEFjdGl2YXRlIHRvIHJlbW92ZSBzb3J0aW5nIixwYWdpbmF0ZTp7Zmlyc3Q6IkZpcnN0IixsYXN0OiJMYXN0IixuZXh0OiJOZXh0IixwcmV2aW91czoiUHJldmlvdXMiLG51bWJlcjoiIn19LG9QYWdpbmF0ZTp7c0ZpcnN0OiJceEFCIixzTGFzdDoiXHhCQiIsc05leHQ6Ilx1MjAzQSIsc1ByZXZpb3VzOiJcdTIwMzkifSxlbnRyaWVzOntfOiJlbnRyaWVzIiwxOiJlbnRyeSJ9LHNFbXB0eVRhYmxlOiJObyBkYXRhIGF2YWlsYWJsZSBpbiB0YWJsZSIsc0luZm86IlNob3dpbmcgX1NUQVJUXyB0byBfRU5EXyBvZiBfVE9UQUxfIF9FTlRSSUVTLVRPVEFMXyIsc0luZm9FbXB0eToiU2hvd2luZyAwIHRvIDAgb2YgMCBfRU5UUklFUy1UT1RBTF8iLHNJbmZvRmlsdGVyZWQ6IihmaWx0ZXJlZCBmcm9tIF9NQVhfIHRvdGFsIF9FTlRSSUVTLU1BWF8pIixzSW5mb1Bvc3RGaXg6IiIsc0RlY2ltYWw6IiIsc1Rob3VzYW5kczoiLCIsc0xlbmd0aE1lbnU6Il9NRU5VXyBfRU5UUklFU18gcGVyIHBhZ2UiLHNMb2FkaW5nUmVjb3JkczoiTG9hZGluZy4uLiIsc1Byb2Nlc3Npbmc6IiIsc1NlYXJjaDoiU2VhcmNoOiIsc1NlYXJjaFBsYWNlaG9sZGVyOiIiLHNVcmw6IiIsc1plcm9SZWNvcmRzOiJObyBtYXRjaGluZyByZWNvcmRzIGZvdW5kIn0sb3JkZXJEZXNjUmV2ZXJzZTohMCxvU2VhcmNoOkguZXh0ZW5kKHt9LGJ0Lm1vZGVscy5vU2VhcmNoKSxsYXlvdXQ6e3RvcFN0YXJ0OiJwYWdlTGVuZ3RoIix0b3BFbmQ6InNlYXJjaCIsYm90dG9tU3RhcnQ6ImluZm8iLGJvdHRvbUVuZDoicGFnaW5nIn0sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiIiLHNTY3JvbGxYOiIiLHNTY3JvbGxYSW5uZXI6IiIsc1Njcm9sbFk6IiIsc1NlcnZlck1ldGhvZDoiR0VUIixyZW5kZXJlcjpudWxsLHJvd0lkOiJEVF9Sb3dJZCIsY2FwdGlvbjpudWxsLGlEZWZlckxvYWRpbmc6bnVsbH07TnIoYnQuZGVmYXVsdHMpO2J0LmRlZmF1bHRzLmNvbHVtbj17YURhdGFTb3J0Om51bGwsaURhdGFTb3J0Oi0xLGFyaWFUaXRsZToiIixhc1NvcnRpbmc6WyJhc2MiLCJkZXNjIiwiIl0sYlNlYXJjaGFibGU6ITAsYlNvcnRhYmxlOiEwLGJWaXNpYmxlOiEwLGZuQ3JlYXRlZENlbGw6bnVsbCxtRGF0YTpudWxsLG1SZW5kZXI6bnVsbCxzQ2VsbFR5cGU6InRkIixzQ2xhc3M6IiIsc0NvbnRlbnRQYWRkaW5nOiIiLHNEZWZhdWx0Q29udGVudDpudWxsLHNOYW1lOiIiLHNTb3J0RGF0YVR5cGU6InN0ZCIsc1RpdGxlOm51bGwsc1R5cGU6bnVsbCxzV2lkdGg6bnVsbH07TnIoYnQuZGVmYXVsdHMuY29sdW1uKTtidC5tb2RlbHMub1NldHRpbmdzPXtvRmVhdHVyZXM6e2JBdXRvV2lkdGg6bnVsbCxiRGVmZXJSZW5kZXI6bnVsbCxiRmlsdGVyOm51bGwsYkluZm86ITAsYkxlbmd0aENoYW5nZTohMCxiUGFnaW5hdGU6bnVsbCxiUHJvY2Vzc2luZzpudWxsLGJTZXJ2ZXJTaWRlOm51bGwsYlNvcnQ6bnVsbCxiU29ydE11bHRpOm51bGwsYlNvcnRDbGFzc2VzOm51bGwsYlN0YXRlU2F2ZTpudWxsfSxvU2Nyb2xsOntiQ29sbGFwc2U6bnVsbCxpQmFyV2lkdGg6MCxzWDpudWxsLHNYSW5uZXI6bnVsbCxzWTpudWxsfSxvTGFuZ3VhZ2U6e2ZuSW5mb0NhbGxiYWNrOm51bGx9LG9Ccm93c2VyOntiU2Nyb2xsYmFyTGVmdDohMSxiYXJXaWR0aDowfSxhamF4Om51bGwsYWFuRmVhdHVyZXM6W10sYW9EYXRhOltdLGFpRGlzcGxheTpbXSxhaURpc3BsYXlNYXN0ZXI6W10sYUlkczp7fSxhb0NvbHVtbnM6W10sYW9IZWFkZXI6W10sYW9Gb290ZXI6W10sb1ByZXZpb3VzU2VhcmNoOnt9LHNlYXJjaEZpeGVkOnt9LGFvUHJlU2VhcmNoQ29sczpbXSxhYVNvcnRpbmc6bnVsbCxhYVNvcnRpbmdGaXhlZDpbXSxzRGVzdHJveVdpZHRoOjAsYW9Sb3dDYWxsYmFjazpbXSxhb0hlYWRlckNhbGxiYWNrOltdLGFvRm9vdGVyQ2FsbGJhY2s6W10sYW9EcmF3Q2FsbGJhY2s6W10sYW9Sb3dDcmVhdGVkQ2FsbGJhY2s6W10sYW9QcmVEcmF3Q2FsbGJhY2s6W10sYW9Jbml0Q29tcGxldGU6W10sYW9TdGF0ZVNhdmVQYXJhbXM6W10sYW9TdGF0ZUxvYWRQYXJhbXM6W10sYW9TdGF0ZUxvYWRlZDpbXSxzVGFibGVJZDoiIixuVGFibGU6bnVsbCxuVEhlYWQ6bnVsbCxuVEZvb3Q6bnVsbCxuVEJvZHk6bnVsbCxuVGFibGVXcmFwcGVyOm51bGwsYkluaXRpYWxpc2VkOiExLGFvT3BlblJvd3M6W10sc0RvbTpudWxsLHNlYXJjaERlbGF5Om51bGwsc1BhZ2luYXRpb25UeXBlOiJ0d29fYnV0dG9uIixwYWdpbmdDb250cm9sczowLGlTdGF0ZUR1cmF0aW9uOjAsYW9TdGF0ZVNhdmU6W10sYW9TdGF0ZUxvYWQ6W10sb1NhdmVkU3RhdGU6bnVsbCxvTG9hZGVkU3RhdGU6bnVsbCxiQWpheERhdGFHZXQ6ITAsanFYSFI6bnVsbCxqc29uOnZvaWQgMCxvQWpheERhdGE6dm9pZCAwLHNTZXJ2ZXJNZXRob2Q6bnVsbCxmbkZvcm1hdE51bWJlcjpudWxsLGFMZW5ndGhNZW51Om51bGwsaURyYXc6MCxiRHJhd2luZzohMSxpRHJhd0Vycm9yOi0xLF9pRGlzcGxheUxlbmd0aDoxMCxfaURpc3BsYXlTdGFydDowLF9pUmVjb3Jkc1RvdGFsOjAsX2lSZWNvcmRzRGlzcGxheTowLG9DbGFzc2VzOnt9LGJGaWx0ZXJlZDohMSxiU29ydGVkOiExLGJTb3J0Q2VsbHNUb3A6bnVsbCxvSW5pdDpudWxsLGFvRGVzdHJveUNhbGxiYWNrOltdLGZuUmVjb3Jkc1RvdGFsOmZ1bmN0aW9uKCl7cmV0dXJuIEVlKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc1RvdGFsKjE6dGhpcy5haURpc3BsYXlNYXN0ZXIubGVuZ3RofSxmblJlY29yZHNEaXNwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIEVlKHRoaXMpPT0ic3NwIj90aGlzLl9pUmVjb3Jkc0Rpc3BsYXkqMTp0aGlzLmFpRGlzcGxheS5sZW5ndGh9LGZuRGlzcGxheUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2lEaXNwbGF5TGVuZ3RoLGU9dGhpcy5faURpc3BsYXlTdGFydCxuPWUrdCxyPXRoaXMuYWlEaXNwbGF5Lmxlbmd0aCxzPXRoaXMub0ZlYXR1cmVzLGk9cy5iUGFnaW5hdGU7cmV0dXJuIHMuYlNlcnZlclNpZGU/aT09PSExfHx0PT09LTE/ZStyOk1hdGgubWluKGUrdCx0aGlzLl9pUmVjb3Jkc0Rpc3BsYXkpOiFpfHxuPnJ8fHQ9PT0tMT9yOm59LG9JbnN0YW5jZTpudWxsLHNJbnN0YW5jZTpudWxsLGlUYWJJbmRleDowLG5TY3JvbGxIZWFkOm51bGwsblNjcm9sbEZvb3Q6bnVsbCxhTGFzdFNvcnQ6W10sb1BsdWdpbnM6e30scm93SWRGbjpudWxsLHJvd0lkOm51bGwsY2FwdGlvbjoiIixjYXB0aW9uTm9kZTpudWxsLGNvbGdyb3VwOm51bGwsZGVmZXJMb2FkaW5nOm51bGwsdHlwZURldGVjdDohMH07dmFyIHpsPWJ0LmV4dC5wYWdlcjtILmV4dGVuZCh6bCx7c2ltcGxlOmZ1bmN0aW9uKCl7cmV0dXJuWyJwcmV2aW91cyIsIm5leHQiXX0sZnVsbDpmdW5jdGlvbigpe3JldHVyblsiZmlyc3QiLCJwcmV2aW91cyIsIm5leHQiLCJsYXN0Il19LG51bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bIm51bWJlcnMiXX0sc2ltcGxlX251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiXX0sZnVsbF9udW1iZXJzOmZ1bmN0aW9uKCl7cmV0dXJuWyJmaXJzdCIsInByZXZpb3VzIiwibnVtYmVycyIsIm5leHQiLCJsYXN0Il19LGZpcnN0X2xhc3Q6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibGFzdCJdfSxmaXJzdF9sYXN0X251bWJlcnM6ZnVuY3Rpb24oKXtyZXR1cm5bImZpcnN0IiwibnVtYmVycyIsImxhc3QiXX0sX251bWJlcnM6U3MsbnVtYmVyc19sZW5ndGg6N30pO0guZXh0ZW5kKCEwLGJ0LmV4dC5yZW5kZXJlcix7cGFnaW5nQnV0dG9uOntfOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9dC5vQ2xhc3Nlcy5wYWdpbmcsbz1baS5idXR0b25dLHU7cmV0dXJuIHImJm8ucHVzaChpLmFjdGl2ZSkscyYmby5wdXNoKGkuZGlzYWJsZWQpLGU9PT0iZWxsaXBzaXMiP3U9SCgnPHNwYW4gY2xhc3M9ImVsbGlwc2lzIj48L3NwYW4+JykuaHRtbChuKVswXTp1PUgoIjxidXR0b24+Iix7Y2xhc3M6by5qb2luKCIgIikscm9sZToibGluayIsdHlwZToiYnV0dG9uIn0pLmh0bWwobikse2Rpc3BsYXk6dSxjbGlja2VyOnV9fX0scGFnaW5nQ29udGFpbmVyOntfOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9fX0pO3ZhciBpcj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gSGUobil8fHR5cGVvZiBuIT0ic3RyaW5nInx8KG49bi5yZXBsYWNlKEpvLCIgIiksdCYmKG49Z24obikpLGUmJihuPURyKG4sITEpKSksbn19O2Z1bmN0aW9uIFlhKHQsZSxuLHIscyl7cmV0dXJuIHduP3RbZV0ocyk6ZG4/dFtuXShzKTpyP3Rbcl0ocyk6dH12YXIgJGE9ITEsZG4sd247ZnVuY3Rpb24gamwoKXt3aW5kb3cubHV4b24mJiFkbiYmKGRuPXdpbmRvdy5sdXhvbiksd2luZG93Lm1vbWVudCYmIXduJiYod249d2luZG93Lm1vbWVudCl9ZnVuY3Rpb24gQnIodCxlLG4pe3ZhciByO2lmKGpsKCksd24pe2lmKHI9d24udXRjKHQsZSxuLCEwKSwhci5pc1ZhbGlkKCkpcmV0dXJuIG51bGx9ZWxzZSBpZihkbil7aWYocj1lJiZ0eXBlb2YgdD09InN0cmluZyI/ZG4uRGF0ZVRpbWUuZnJvbUZvcm1hdCh0LGUpOmRuLkRhdGVUaW1lLmZyb21JU08odCksIXIuaXNWYWxpZClyZXR1cm4gbnVsbDtyLnNldExvY2FsZShuKX1lbHNlIGU/KCRhfHxhbGVydCgiRGF0YVRhYmxlcyB3YXJuaW5nOiBGb3JtYXR0ZWQgZGF0ZSB3aXRob3V0IE1vbWVudC5qcyBvciBMdXhvbiAtIGh0dHBzOi8vZGF0YXRhYmxlcy5uZXQvdG4vMTciKSwkYT0hMCk6cj1uZXcgRGF0ZSh0KTtyZXR1cm4gcn1mdW5jdGlvbiBnaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHIscyl7YXJndW1lbnRzLmxlbmd0aD09PTA/KHI9ImVuIixuPW51bGwsZT1udWxsKTphcmd1bWVudHMubGVuZ3RoPT09MT8ocj0iZW4iLG49ZSxlPW51bGwpOmFyZ3VtZW50cy5sZW5ndGg9PT0yJiYocj1uLG49ZSxlPW51bGwpO3ZhciBpPSJkYXRldGltZSIrKG4/Ii0iK246IiIpO3JldHVybiBidC5leHQudHlwZS5vcmRlcltpXXx8YnQudHlwZShpLHtkZXRlY3Q6ZnVuY3Rpb24obyl7cmV0dXJuIG89PT1pP2k6ITF9LG9yZGVyOntwcmU6ZnVuY3Rpb24obyl7cmV0dXJuIG8udmFsdWVPZigpfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KSxmdW5jdGlvbihvLHUpe2lmKG89PW51bGwpaWYocz09PSItLW5vdyIpe3ZhciBwPW5ldyBEYXRlO289bmV3IERhdGUoRGF0ZS5VVEMocC5nZXRGdWxsWWVhcigpLHAuZ2V0TW9udGgoKSxwLmdldERhdGUoKSxwLmdldEhvdXJzKCkscC5nZXRNaW51dGVzKCkscC5nZXRTZWNvbmRzKCkpKX1lbHNlIG89IiI7aWYodT09PSJ0eXBlIilyZXR1cm4gaTtpZihvPT09IiIpcmV0dXJuIHUhPT0ic29ydCI/IiI6QnIoIjAwMDAtMDEtMDEgMDA6MDA6MDAiLG51bGwscik7aWYobiE9PW51bGwmJmU9PT1uJiZ1IT09InNvcnQiJiZ1IT09InR5cGUiJiYhKG8gaW5zdGFuY2VvZiBEYXRlKSlyZXR1cm4gbzt2YXIgYj1CcihvLGUscik7aWYoYj09PW51bGwpcmV0dXJuIG87aWYodT09PSJzb3J0IilyZXR1cm4gYjt2YXIgZz1uPT09bnVsbD9ZYShiLCJ0b0RhdGUiLCJ0b0pTRGF0ZSIsIiIpW3RdKCk6WWEoYiwiZm9ybWF0IiwidG9Gb3JtYXQiLCJ0b0lTT1N0cmluZyIsbik7cmV0dXJuIHU9PT0iZGlzcGxheSI/Tm4oZyk6Z319fXZhciBDcz0iLCIsVHM9Ii4iO2lmKHdpbmRvdy5JbnRsIT09dm9pZCAwKXRyeXtmb3IoQm49bmV3IEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0VG9QYXJ0cygxMDAwMDAuMSksTmU9MDtOZTxCbi5sZW5ndGg7TmUrKylCbltOZV0udHlwZT09PSJncm91cCI/Q3M9Qm5bTmVdLnZhbHVlOkJuW05lXS50eXBlPT09ImRlY2ltYWwiJiYoVHM9Qm5bTmVdLnZhbHVlKX1jYXRjaHt9dmFyIEJuLE5lO2J0LmRhdGV0aW1lPWZ1bmN0aW9uKHQsZSl7dmFyIG49ImRhdGV0aW1lLSIrdDtlfHwoZT0iZW4iKSxidC5leHQudHlwZS5vcmRlcltuXXx8YnQudHlwZShuLHtkZXRlY3Q6ZnVuY3Rpb24ocil7dmFyIHM9QnIocix0LGUpO3JldHVybiByPT09IiJ8fHM/bjohMX0sb3JkZXI6e3ByZTpmdW5jdGlvbihyKXtyZXR1cm4gQnIocix0LGUpfHwwfX0sY2xhc3NOYW1lOiJkdC1yaWdodCJ9KX07YnQucmVuZGVyPXtkYXRlOmdpKCJ0b0xvY2FsZURhdGVTdHJpbmciKSxkYXRldGltZTpnaSgidG9Mb2NhbGVTdHJpbmciKSx0aW1lOmdpKCJ0b0xvY2FsZVRpbWVTdHJpbmciKSxudW1iZXI6ZnVuY3Rpb24odCxlLG4scixzKXtyZXR1cm4gdD09bnVsbCYmKHQ9Q3MpLGU9PW51bGwmJihlPVRzKSx7ZGlzcGxheTpmdW5jdGlvbihpKXtpZih0eXBlb2YgaSE9Im51bWJlciImJnR5cGVvZiBpIT0ic3RyaW5nInx8aT09PSIifHxpPT09bnVsbClyZXR1cm4gaTt2YXIgbz1pPDA/Ii0iOiIiLHU9cGFyc2VGbG9hdChpKSxwPU1hdGguYWJzKHUpO2lmKHA+PTFlMTF8fHA8MWUtNCYmcCE9PTApe3ZhciBiPXUudG9FeHBvbmVudGlhbChuKS5zcGxpdCgvZVwrPy8pO3JldHVybiBiWzBdKyIgeCAxMDxzdXA+IitiWzFdKyI8L3N1cD4ifWlmKGlzTmFOKHUpKXJldHVybiBObihpKTt1PXUudG9GaXhlZChuKSxpPU1hdGguYWJzKHUpO3ZhciBnPXBhcnNlSW50KGksMTApLG09bj9lKyhpLWcpLnRvRml4ZWQobikuc3Vic3RyaW5nKDIpOiIiO3JldHVybiBnPT09MCYmcGFyc2VGbG9hdChtKT09PTAmJihvPSIiKSxvKyhyfHwiIikrZy50b1N0cmluZygpLnJlcGxhY2UoL1xCKD89KFxkezN9KSsoPyFcZCkpL2csdCkrbSsoc3x8IiIpfX19LHRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZGlzcGxheTpObixmaWx0ZXI6Tm59fX07dmFyIG1lPWJ0LmV4dC50eXBlO2J0LnR5cGU9ZnVuY3Rpb24odCxlLG4pe2lmKCFlKXJldHVybntjbGFzc05hbWU6bWUuY2xhc3NOYW1lW3RdLGRldGVjdDptZS5kZXRlY3QuZmluZChmdW5jdGlvbihvKXtyZXR1cm4gby5uYW1lPT09dH0pLG9yZGVyOntwcmU6bWUub3JkZXJbdCsiLXByZSJdLGFzYzptZS5vcmRlclt0KyItYXNjIl0sZGVzYzptZS5vcmRlclt0KyItZGVzYyJdfSxyZW5kZXI6bWUucmVuZGVyW3RdLHNlYXJjaDptZS5zZWFyY2hbdF19O3ZhciByPWZ1bmN0aW9uKG8sdSl7bWVbb11bdF09dX0scz1mdW5jdGlvbihvKXtPYmplY3QuZGVmaW5lUHJvcGVydHkobywibmFtZSIse3ZhbHVlOnR9KTt2YXIgdT1tZS5kZXRlY3QuZmluZEluZGV4KGZ1bmN0aW9uKHApe3JldHVybiBwLm5hbWU9PT10fSk7dT09PS0xP21lLmRldGVjdC51bnNoaWZ0KG8pOm1lLmRldGVjdC5zcGxpY2UodSwxLG8pfSxpPWZ1bmN0aW9uKG8pe21lLm9yZGVyW3QrIi1wcmUiXT1vLnByZSxtZS5vcmRlclt0KyItYXNjIl09by5hc2MsbWUub3JkZXJbdCsiLWRlc2MiXT1vLmRlc2N9O249PT12b2lkIDAmJihuPWUsZT1udWxsKSxlPT09ImNsYXNzTmFtZSI/cigiY2xhc3NOYW1lIixuKTplPT09ImRldGVjdCI/cyhuKTplPT09Im9yZGVyIj9pKG4pOmU9PT0icmVuZGVyIj9yKCJyZW5kZXIiLG4pOmU9PT0ic2VhcmNoIj9yKCJzZWFyY2giLG4pOmV8fChuLmNsYXNzTmFtZSYmcigiY2xhc3NOYW1lIixuLmNsYXNzTmFtZSksbi5kZXRlY3QhPT12b2lkIDAmJnMobi5kZXRlY3QpLG4ub3JkZXImJmkobi5vcmRlciksbi5yZW5kZXIhPT12b2lkIDAmJnIoInJlbmRlciIsbi5yZW5kZXIpLG4uc2VhcmNoIT09dm9pZCAwJiZyKCJzZWFyY2giLG4uc2VhcmNoKSl9O2J0LnR5cGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG1lLmRldGVjdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZX0pfTt2YXIgWmE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD10LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSxlPWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLHQubG9jYWxlQ29tcGFyZShlLG5hdmlnYXRvci5sYW5ndWFnZXNbMF18fG5hdmlnYXRvci5sYW5ndWFnZSx7bnVtZXJpYzohMCxpZ25vcmVQdW5jdHVhdGlvbjohMH0pfTtidC50eXBlKCJzdHJpbmciLHtkZXRlY3Q6ZnVuY3Rpb24oKXtyZXR1cm4ic3RyaW5nIn0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXtyZXR1cm4gSGUodCkmJnR5cGVvZiB0IT0iYm9vbGVhbiI/IiI6dHlwZW9mIHQ9PSJzdHJpbmciP3QudG9Mb3dlckNhc2UoKTp0LnRvU3RyaW5nP3QudG9TdHJpbmcoKToiIn19LHNlYXJjaDppcighMSwhMCl9KTtidC50eXBlKCJzdHJpbmctdXRmOCIse2RldGVjdDp7YWxsT2Y6ZnVuY3Rpb24odCl7cmV0dXJuITB9LG9uZU9mOmZ1bmN0aW9uKHQpe3JldHVybiFIZSh0KSYmbmF2aWdhdG9yLmxhbmd1YWdlcyYmdHlwZW9mIHQ9PSJzdHJpbmciJiZ0Lm1hdGNoKC9bXlx4MDAtXHg3Rl0vKX19LG9yZGVyOnthc2M6WmEsZGVzYzpmdW5jdGlvbih0LGUpe3JldHVybiBaYSh0LGUpKi0xfX0sc2VhcmNoOmlyKCExLCEwKX0pO2J0LnR5cGUoImh0bWwiLHtkZXRlY3Q6e2FsbE9mOmZ1bmN0aW9uKHQpe3JldHVybiBIZSh0KXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ0LmluZGV4T2YoIjwiKSE9PS0xfSxvbmVPZjpmdW5jdGlvbih0KXtyZXR1cm4hSGUodCkmJnR5cGVvZiB0PT0ic3RyaW5nIiYmdC5pbmRleE9mKCI8IikhPT0tMX19LG9yZGVyOntwcmU6ZnVuY3Rpb24odCl7cmV0dXJuIEhlKHQpPyIiOnQucmVwbGFjZT9nbih0KS50cmltKCkudG9Mb3dlckNhc2UoKTp0KyIifX0sc2VhcmNoOmlyKCEwLCEwKX0pO2J0LnR5cGUoImRhdGUiLHtjbGFzc05hbWU6ImR0LXR5cGUtZGF0ZSIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0KXtpZih0JiYhKHQgaW5zdGFuY2VvZiBEYXRlKSYmIXphLnRlc3QodCkpcmV0dXJuIG51bGw7dmFyIGU9RGF0ZS5wYXJzZSh0KTtyZXR1cm4gZSE9PW51bGwmJiFpc05hTihlKXx8SGUodCl9LG9uZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZXx8dHlwZW9mIHQ9PSJzdHJpbmciJiZ6YS50ZXN0KHQpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0KXt2YXIgZT1EYXRlLnBhcnNlKHQpO3JldHVybiBpc05hTihlKT8tMS8wOmV9fX0pO2J0LnR5cGUoImh0bWwtbnVtLWZtdCIse2NsYXNzTmFtZToiZHQtdHlwZS1udW1lcmljIixkZXRlY3Q6e2FsbE9mOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFNyKHQsbiwhMCwhMSl9LG9uZU9mOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIFNyKHQsbiwhMCwhMSl9fSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7cmV0dXJuIEhyKHQsbixTaSxEaSl9fSxzZWFyY2g6aXIoITAsITApfSk7YnQudHlwZSgiaHRtbC1udW0iLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBTcih0LG4sITEsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBTcih0LG4sITEsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4sU2kpfX0sc2VhcmNoOmlyKCEwLCEwKX0pO2J0LnR5cGUoIm51bS1mbXQiLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITAsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITAsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4sRGkpfX19KTtidC50eXBlKCJudW0iLHtjbGFzc05hbWU6ImR0LXR5cGUtbnVtZXJpYyIsZGV0ZWN0OnthbGxPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITEsITApfSxvbmVPZjpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBRbih0LG4sITEsITEpfX0sb3JkZXI6e3ByZTpmdW5jdGlvbih0LGUpe3ZhciBuPWUub0xhbmd1YWdlLnNEZWNpbWFsO3JldHVybiBIcih0LG4pfX19KTt2YXIgSHI9ZnVuY3Rpb24odCxlLG4scil7aWYodCE9PTAmJighdHx8dD09PSItIikpcmV0dXJuLTEvMDt2YXIgcz10eXBlb2YgdDtyZXR1cm4gcz09PSJudW1iZXIifHxzPT09ImJpZ2ludCI/dDooZSYmKHQ9UWEodCxlKSksdC5yZXBsYWNlJiYobiYmKHQ9dC5yZXBsYWNlKG4sIiIpKSxyJiYodD10LnJlcGxhY2UociwiIikpKSx0KjEpfTtILmV4dGVuZCghMCxidC5leHQucmVuZGVyZXIse2Zvb3Rlcjp7XzpmdW5jdGlvbih0LGUsbil7ZS5hZGRDbGFzcyhuLnRmb290LmNlbGwpfX0saGVhZGVyOntfOmZ1bmN0aW9uKHQsZSxuKXtlLmFkZENsYXNzKG4udGhlYWQuY2VsbCksdC5vRmVhdHVyZXMuYlNvcnR8fGUuYWRkQ2xhc3Mobi5vcmRlci5ub25lKTt2YXIgcj10LmJTb3J0Q2VsbHNUb3Ascz1lLmNsb3Nlc3QoInRoZWFkIikuZmluZCgidHIiKSxpPWUucGFyZW50KCkuaW5kZXgoKTtlLmF0dHIoImRhdGEtZHQtb3JkZXIiKT09PSJkaXNhYmxlInx8ZS5wYXJlbnQoKS5hdHRyKCJkYXRhLWR0LW9yZGVyIik9PT0iZGlzYWJsZSJ8fHI9PT0hMCYmaSE9PTB8fHI9PT0hMSYmaSE9PXMubGVuZ3RoLTF8fEgodC5uVGFibGUpLm9uKCJvcmRlci5kdC5EVCBjb2x1bW4tdmlzaWJpbGl0eS5kdC5EVCIsZnVuY3Rpb24obyx1KXtpZih0PT09dSl7dmFyIHA9dS5zb3J0RGV0YWlscztpZihwKXt2YXIgYixnPW4ub3JkZXIsbT11LmFwaS5jb2x1bW5zKGUpLEM9dC5hb0NvbHVtbnNbbS5mbGF0dGVuKClbMF1dLHk9bS5vcmRlcmFibGUoKS5pbmNsdWRlcyghMCksVD0iIixQPW0uaW5kZXhlcygpLGM9bS5vcmRlcmFibGUoITApLmZsYXR0ZW4oKSxsPUNlKHAsImNvbCIpO2UucmVtb3ZlQ2xhc3MoZy5pc0FzYysiICIrZy5pc0Rlc2MpLnRvZ2dsZUNsYXNzKGcubm9uZSwheSkudG9nZ2xlQ2xhc3MoZy5jYW5Bc2MseSYmYy5pbmNsdWRlcygiYXNjIikpLnRvZ2dsZUNsYXNzKGcuY2FuRGVzYyx5JiZjLmluY2x1ZGVzKCJkZXNjIikpO3ZhciBoPSEwO2ZvcihiPTA7YjxQLmxlbmd0aDtiKyspbC5pbmNsdWRlcyhQW2JdKXx8KGg9ITEpO2lmKGgpe3ZhciBfPW0ub3JkZXIoKTtlLmFkZENsYXNzKF8uaW5jbHVkZXMoImFzYyIpP2cuaXNBc2M6IiIrXy5pbmNsdWRlcygiZGVzYyIpP2cuaXNEZXNjOiIiKX12YXIgRj0tMTtmb3IoYj0wO2I8bC5sZW5ndGg7YisrKWlmKHQuYW9Db2x1bW5zW2xbYl1dLmJWaXNpYmxlKXtGPWxbYl07YnJlYWt9aWYoUFswXT09Ril7dmFyIE89cFswXSxmPUMuYXNTb3J0aW5nO2UuYXR0cigiYXJpYS1zb3J0IixPLmRpcj09PSJhc2MiPyJhc2NlbmRpbmciOiJkZXNjZW5kaW5nIiksVD1mW08uaW5kZXgrMV0/IlJldmVyc2UiOiJSZW1vdmUifWVsc2UgZS5yZW1vdmVBdHRyKCJhcmlhLXNvcnQiKTtlLmF0dHIoImFyaWEtbGFiZWwiLHk/Qy5hcmlhVGl0bGUrdS5hcGkuaTE4bigib0FyaWEub3JkZXJhYmxlIitUKTpDLmFyaWFUaXRsZSkseSYmKGUuZmluZCgiLmR0LWNvbHVtbi10aXRsZSIpLmF0dHIoInJvbGUiLCJidXR0b24iKSxlLmF0dHIoInRhYmluZGV4IiwwKSl9fX0pfX0sbGF5b3V0OntfOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10Lm9DbGFzc2VzLmxheW91dCxzPUgoIjxkaXYvPiIpLmF0dHIoImlkIixuLmlkfHxudWxsKS5hZGRDbGFzcyhuLmNsYXNzTmFtZXx8ci5yb3cpLmFwcGVuZFRvKGUpO0guZWFjaChuLGZ1bmN0aW9uKGksbyl7aWYoIShpPT09ImlkInx8aT09PSJjbGFzc05hbWUiKSl7dmFyIHU9IiI7by50YWJsZSYmKHMuYWRkQ2xhc3Moci50YWJsZVJvdyksdSs9ci50YWJsZUNlbGwrIiAiKSxpPT09InN0YXJ0Ij91Kz1yLnN0YXJ0Omk9PT0iZW5kIj91Kz1yLmVuZDp1Kz1yLmZ1bGwsSCgiPGRpdi8+IikuYXR0cih7aWQ6by5pZHx8bnVsbCxjbGFzczpvLmNsYXNzTmFtZT9vLmNsYXNzTmFtZTpyLmNlbGwrIiAiK3V9KS5hcHBlbmQoby5jb250ZW50cykuYXBwZW5kVG8ocyl9fSl9fX0pO2J0LmZlYXR1cmU9e307YnQuZmVhdHVyZS5yZWdpc3Rlcj1mdW5jdGlvbih0LGUsbil7YnQuZXh0LmZlYXR1cmVzW3RdPWUsbiYmbGUuZmVhdHVyZS5wdXNoKHtjRmVhdHVyZTpuLGZuSW5pdDplfSl9O2Z1bmN0aW9uIENyKHQsZSxuKXtuJiYodFtlXT1uKX1idC5mZWF0dXJlLnJlZ2lzdGVyKCJkaXYiLGZ1bmN0aW9uKHQsZSl7dmFyIG49SCgiPGRpdj4iKVswXTtyZXR1cm4gZSYmKENyKG4sImNsYXNzTmFtZSIsZS5jbGFzc05hbWUpLENyKG4sImlkIixlLmlkKSxDcihuLCJpbm5lckhUTUwiLGUuaHRtbCksQ3IobiwidGV4dENvbnRlbnQiLGUudGV4dCkpLG59KTtidC5mZWF0dXJlLnJlZ2lzdGVyKCJpbmZvIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iSW5mbylyZXR1cm4gbnVsbDt2YXIgbj10Lm9MYW5ndWFnZSxyPXQuc1RhYmxlSWQscz1IKCI8ZGl2Lz4iLHtjbGFzczp0Lm9DbGFzc2VzLmluZm8uY29udGFpbmVyfSk7cmV0dXJuIGU9SC5leHRlbmQoe2NhbGxiYWNrOm4uZm5JbmZvQ2FsbGJhY2ssZW1wdHk6bi5zSW5mb0VtcHR5LHBvc3RmaXg6bi5zSW5mb1Bvc3RGaXgsc2VhcmNoOm4uc0luZm9GaWx0ZXJlZCx0ZXh0Om4uc0luZm99LGUpLHQuYW9EcmF3Q2FsbGJhY2sucHVzaChmdW5jdGlvbihpKXtNbChpLGUscyl9KSx0Ll9pbmZvRWx8fChzLmF0dHIoeyJhcmlhLWxpdmUiOiJwb2xpdGUiLGlkOnIrIl9pbmZvIixyb2xlOiJzdGF0dXMifSksSCh0Lm5UYWJsZSkuYXR0cigiYXJpYS1kZXNjcmliZWRieSIscisiX2luZm8iKSx0Ll9pbmZvRWw9cyksc30sImkiKTtmdW5jdGlvbiBNbCh0LGUsbil7dmFyIHI9dC5faURpc3BsYXlTdGFydCsxLHM9dC5mbkRpc3BsYXlFbmQoKSxpPXQuZm5SZWNvcmRzVG90YWwoKSxvPXQuZm5SZWNvcmRzRGlzcGxheSgpLHU9bz9lLnRleHQ6ZS5lbXB0eTtvIT09aSYmKHUrPSIgIitlLnNlYXJjaCksdSs9ZS5wb3N0Zml4LHU9amkodCx1KSxlLmNhbGxiYWNrJiYodT1lLmNhbGxiYWNrLmNhbGwodC5vSW5zdGFuY2UsdCxyLHMsaSxvLHUpKSxuLmh0bWwodSksWnQodCxudWxsLCJpbmZvIixbdCxuWzBdLHVdKX12YXIgeWk9MDtidC5mZWF0dXJlLnJlZ2lzdGVyKCJzZWFyY2giLGZ1bmN0aW9uKHQsZSl7aWYoIXQub0ZlYXR1cmVzLmJGaWx0ZXIpcmV0dXJuIG51bGw7dmFyIG49dC5vQ2xhc3Nlcy5zZWFyY2gscj10LnNUYWJsZUlkLHM9dC5vTGFuZ3VhZ2UsaT10Lm9QcmV2aW91c1NlYXJjaCxvPSc8aW5wdXQgdHlwZT0ic2VhcmNoIiBjbGFzcz0iJytuLmlucHV0KyciLz4nO2U9SC5leHRlbmQoe3BsYWNlaG9sZGVyOnMuc1NlYXJjaFBsYWNlaG9sZGVyLHByb2Nlc3Npbmc6ITEsdGV4dDpzLnNTZWFyY2h9LGUpLGUudGV4dC5pbmRleE9mKCJfSU5QVVRfIik9PT0tMSYmKGUudGV4dCs9Il9JTlBVVF8iKSxlLnRleHQ9amkodCxlLnRleHQpO3ZhciB1PWUudGV4dC5tYXRjaCgvX0lOUFVUXyQvKSxwPWUudGV4dC5tYXRjaCgvXl9JTlBVVF8vKSxiPWUudGV4dC5yZXBsYWNlKC9fSU5QVVRfLywiIiksZz0iPGxhYmVsPiIrZS50ZXh0KyI8L2xhYmVsPiI7cD9nPSJfSU5QVVRfPGxhYmVsPiIrYisiPC9sYWJlbD4iOnUmJihnPSI8bGFiZWw+IitiKyI8L2xhYmVsPl9JTlBVVF8iKTt2YXIgbT1IKCI8ZGl2PiIpLmFkZENsYXNzKG4uY29udGFpbmVyKS5hcHBlbmQoZy5yZXBsYWNlKC9fSU5QVVRfLyxvKSk7bS5maW5kKCJsYWJlbCIpLmF0dHIoImZvciIsImR0LXNlYXJjaC0iK3lpKSxtLmZpbmQoImlucHV0IikuYXR0cigiaWQiLCJkdC1zZWFyY2gtIit5aSkseWkrKzt2YXIgQz1mdW5jdGlvbihQKXt2YXIgYz10aGlzLnZhbHVlO2kucmV0dXJuJiZQLmtleSE9PSJFbnRlciJ8fGMhPWkuc2VhcmNoJiZ1cyh0LGUucHJvY2Vzc2luZyxmdW5jdGlvbigpe2kuc2VhcmNoPWMsdHIodCxpKSx0Ll9pRGlzcGxheVN0YXJ0PTAsTG4odCl9KX0seT10LnNlYXJjaERlbGF5IT09bnVsbD90LnNlYXJjaERlbGF5OjAsVD1IKCJpbnB1dCIsbSkudmFsKGkuc2VhcmNoKS5hdHRyKCJwbGFjZWhvbGRlciIsZS5wbGFjZWhvbGRlcikub24oImtleXVwLkRUIHNlYXJjaC5EVCBpbnB1dC5EVCBwYXN0ZS5EVCBjdXQuRFQiLHk/YnQudXRpbC5kZWJvdW5jZShDLHkpOkMpLm9uKCJtb3VzZXVwLkRUIixmdW5jdGlvbihQKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5jYWxsKFRbMF0sUCl9LDEwKX0pLm9uKCJrZXlwcmVzcy5EVCIsZnVuY3Rpb24oUCl7aWYoUC5rZXlDb2RlPT0xMylyZXR1cm4hMX0pLmF0dHIoImFyaWEtY29udHJvbHMiLHIpO3JldHVybiBIKHQublRhYmxlKS5vbigic2VhcmNoLmR0LkRUIixmdW5jdGlvbihQLGMpe3Q9PT1jJiZUWzBdIT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmVC52YWwodHlwZW9mIGkuc2VhcmNoIT0iZnVuY3Rpb24iP2kuc2VhcmNoOiIiKX0pLG19LCJmIik7YnQuZmVhdHVyZS5yZWdpc3RlcigicGFnaW5nIixmdW5jdGlvbih0LGUpe2lmKCF0Lm9GZWF0dXJlcy5iUGFnaW5hdGUpcmV0dXJuIG51bGw7ZT1ILmV4dGVuZCh7YnV0dG9uczpidC5leHQucGFnZXIubnVtYmVyc19sZW5ndGgsdHlwZTp0LnNQYWdpbmF0aW9uVHlwZSxib3VuZGFyeU51bWJlcnM6ITAsZmlyc3RMYXN0OiEwLHByZXZpb3VzTmV4dDohMCxudW1iZXJzOiEwfSxlKTt2YXIgbj1IKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0Lm9DbGFzc2VzLnBhZ2luZy5jb250YWluZXIrKGUudHlwZT8iIHBhZ2luZ18iK2UudHlwZToiIikpLmFwcGVuZChIKCI8bmF2PiIpLmF0dHIoImFyaWEtbGFiZWwiLCJwYWdpbmF0aW9uIikuYWRkQ2xhc3ModC5vQ2xhc3Nlcy5wYWdpbmcubmF2KSkscj1mdW5jdGlvbigpe2tzKHQsbi5jaGlsZHJlbigpLGUpfTtyZXR1cm4gdC5hb0RyYXdDYWxsYmFjay5wdXNoKHIpLEgodC5uVGFibGUpLm9uKCJjb2x1bW4tc2l6aW5nLmR0LkRUIixyKSxufSwicCIpO2Z1bmN0aW9uIFZsKHQpe3ZhciBlPVtdO3JldHVybiB0Lm51bWJlcnMmJmUucHVzaCgibnVtYmVycyIpLHQucHJldmlvdXNOZXh0JiYoZS51bnNoaWZ0KCJwcmV2aW91cyIpLGUucHVzaCgibmV4dCIpKSx0LmZpcnN0TGFzdCYmKGUudW5zaGlmdCgiZmlyc3QiKSxlLnB1c2goImxhc3QiKSksZX1mdW5jdGlvbiBrcyh0LGUsbil7aWYodC5fYkluaXRDb21wbGV0ZSl7Zm9yKHZhciByPW4udHlwZT9idC5leHQucGFnZXJbbi50eXBlXTpWbCxzPXQub0xhbmd1YWdlLm9BcmlhLnBhZ2luYXRlfHx7fSxpPXQuX2lEaXNwbGF5U3RhcnQsbz10Ll9pRGlzcGxheUxlbmd0aCx1PXQuZm5SZWNvcmRzRGlzcGxheSgpLHA9bz09PS0xLGI9cD8wOk1hdGguY2VpbChpL28pLGc9cD8xOk1hdGguY2VpbCh1L28pLG09cihuKS5tYXAoZnVuY3Rpb24oRil7cmV0dXJuIEY9PT0ibnVtYmVycyI/U3MoYixnLG4uYnV0dG9ucyxuLmJvdW5kYXJ5TnVtYmVycyk6Rn0pLmZsYXQoKSxDPVtdLHk9MDt5PG0ubGVuZ3RoO3krKyl7dmFyIFQ9bVt5XSxQPUhsKHQsVCxiLGcpLGM9RnIodCwicGFnaW5nQnV0dG9uIikodCxULFAuZGlzcGxheSxQLmFjdGl2ZSxQLmRpc2FibGVkKSxsPXR5cGVvZiBUPT0ic3RyaW5nIj9zW1RdOnMubnVtYmVyP3MubnVtYmVyKyhUKzEpOm51bGw7SChjLmNsaWNrZXIpLmF0dHIoeyJhcmlhLWNvbnRyb2xzIjp0LnNUYWJsZUlkLCJhcmlhLWRpc2FibGVkIjpQLmRpc2FibGVkPyJ0cnVlIjpudWxsLCJhcmlhLWN1cnJlbnQiOlAuYWN0aXZlPyJwYWdlIjpudWxsLCJhcmlhLWxhYmVsIjpsLCJkYXRhLWR0LWlkeCI6VCx0YWJJbmRleDpQLmRpc2FibGVkPy0xOnQuaVRhYkluZGV4P3QuaVRhYkluZGV4Om51bGx9KSx0eXBlb2YgVCE9Im51bWJlciImJkgoYy5jbGlja2VyKS5hZGRDbGFzcyhUKSxtcyhjLmNsaWNrZXIse2FjdGlvbjpUfSxmdW5jdGlvbihGKXtGLnByZXZlbnREZWZhdWx0KCksTGkodCxGLmRhdGEuYWN0aW9uLCEwKX0pLEMucHVzaChjLmRpc3BsYXkpfXZhciBoPUZyKHQsInBhZ2luZ0NvbnRhaW5lciIpKHQsQyksXz1lLmZpbmQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkuZGF0YSgiZHQtaWR4Iik7ZS5lbXB0eSgpLmFwcGVuZChoKSxfIT09dm9pZCAwJiZlLmZpbmQoIltkYXRhLWR0LWlkeD0iK18rIl0iKS50cmlnZ2VyKCJmb2N1cyIpLEMubGVuZ3RoJiZuLmJ1dHRvbnM+MSYmSChlKS5oZWlnaHQoKT49SChDWzBdKS5vdXRlckhlaWdodCgpKjItMTAmJmtzKHQsZSxILmV4dGVuZCh7fSxuLHtidXR0b25zOm4uYnV0dG9ucy0yfSkpfX1mdW5jdGlvbiBIbCh0LGUsbixyKXt2YXIgcz10Lm9MYW5ndWFnZS5vUGFnaW5hdGUsaT17ZGlzcGxheToiIixhY3RpdmU6ITEsZGlzYWJsZWQ6ITF9O3N3aXRjaChlKXtjYXNlImVsbGlwc2lzIjppLmRpc3BsYXk9IiYjeDIwMjY7IixpLmRpc2FibGVkPSEwO2JyZWFrO2Nhc2UiZmlyc3QiOmkuZGlzcGxheT1zLnNGaXJzdCxuPT09MCYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UicHJldmlvdXMiOmkuZGlzcGxheT1zLnNQcmV2aW91cyxuPT09MCYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibmV4dCI6aS5kaXNwbGF5PXMuc05leHQsKHI9PT0wfHxuPT09ci0xKSYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2Nhc2UibGFzdCI6aS5kaXNwbGF5PXMuc0xhc3QsKHI9PT0wfHxuPT09ci0xKSYmKGkuZGlzYWJsZWQ9ITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIGU9PSJudW1iZXIiJiYoaS5kaXNwbGF5PXQuZm5Gb3JtYXROdW1iZXIoZSsxKSxuPT09ZSYmKGkuYWN0aXZlPSEwKSk7YnJlYWt9cmV0dXJuIGl9ZnVuY3Rpb24gU3ModCxlLG4scil7dmFyIHM9W10saT1NYXRoLmZsb29yKG4vMiksbz1yPzI6MSx1PXI/MTowO3JldHVybiBlPD1uP3M9YW4oMCxlKTpuPT09MT9zPVt0XTpuPT09Mz90PD0xP3M9WzAsMSwiZWxsaXBzaXMiXTp0Pj1lLTI/KHM9YW4oZS0yLGUpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSk6cz1bImVsbGlwc2lzIix0LCJlbGxpcHNpcyJdOnQ8PWk/KHM9YW4oMCxuLW8pLHMucHVzaCgiZWxsaXBzaXMiKSxyJiZzLnB1c2goZS0xKSk6dD49ZS0xLWk/KHM9YW4oZS0obi1vKSxlKSxzLnVuc2hpZnQoImVsbGlwc2lzIiksciYmcy51bnNoaWZ0KDApKToocz1hbih0LWkrbyx0K2ktdSkscy5wdXNoKCJlbGxpcHNpcyIpLHMudW5zaGlmdCgiZWxsaXBzaXMiKSxyJiYocy5wdXNoKGUtMSkscy51bnNoaWZ0KDApKSksc312YXIgd2k9MDtidC5mZWF0dXJlLnJlZ2lzdGVyKCJwYWdlTGVuZ3RoIixmdW5jdGlvbih0LGUpe3ZhciBuPXQub0ZlYXR1cmVzO2lmKCFuLmJQYWdpbmF0ZXx8IW4uYkxlbmd0aENoYW5nZSlyZXR1cm4gbnVsbDtlPUguZXh0ZW5kKHttZW51OnQuYUxlbmd0aE1lbnUsdGV4dDp0Lm9MYW5ndWFnZS5zTGVuZ3RoTWVudX0sZSk7dmFyIHI9dC5vQ2xhc3Nlcy5sZW5ndGgscz10LnNUYWJsZUlkLGk9ZS5tZW51LG89W10sdT1bXSxwO2lmKEFycmF5LmlzQXJyYXkoaVswXSkpbz1pWzBdLHU9aVsxXTtlbHNlIGZvcihwPTA7cDxpLmxlbmd0aDtwKyspSC5pc1BsYWluT2JqZWN0KGlbcF0pPyhvLnB1c2goaVtwXS52YWx1ZSksdS5wdXNoKGlbcF0ubGFiZWwpKTooby5wdXNoKGlbcF0pLHUucHVzaChpW3BdKSk7dmFyIGI9ZS50ZXh0Lm1hdGNoKC9fTUVOVV8kLyksZz1lLnRleHQubWF0Y2goL15fTUVOVV8vKSxtPWUudGV4dC5yZXBsYWNlKC9fTUVOVV8vLCIiKSxDPSI8bGFiZWw+IitlLnRleHQrIjwvbGFiZWw+IjtnP0M9Il9NRU5VXzxsYWJlbD4iK20rIjwvbGFiZWw+IjpiJiYoQz0iPGxhYmVsPiIrbSsiPC9sYWJlbD5fTUVOVV8iKTt2YXIgeT0idG1wLSIrICtuZXcgRGF0ZSxUPUgoIjxkaXYvPiIpLmFkZENsYXNzKHIuY29udGFpbmVyKS5hcHBlbmQoQy5yZXBsYWNlKCJfTUVOVV8iLCc8c3BhbiBpZD0iJyt5KyciPjwvc3Bhbj4nKSksUD1bXTtULmZpbmQoImxhYmVsIilbMF0uY2hpbGROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGgpe2gubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSYmUC5wdXNoKHtlbDpoLHRleHQ6aC50ZXh0Q29udGVudH0pfSk7dmFyIGM9ZnVuY3Rpb24oaCl7UC5mb3JFYWNoKGZ1bmN0aW9uKF8pe18uZWwudGV4dENvbnRlbnQ9amkodCxfLnRleHQsaCl9KX0sbD1IKCI8c2VsZWN0Lz4iLHtuYW1lOnMrIl9sZW5ndGgiLCJhcmlhLWNvbnRyb2xzIjpzLGNsYXNzOnIuc2VsZWN0fSk7Zm9yKHA9MDtwPG8ubGVuZ3RoO3ArKylsWzBdW3BdPW5ldyBPcHRpb24odHlwZW9mIHVbcF09PSJudW1iZXIiP3QuZm5Gb3JtYXROdW1iZXIodVtwXSk6dVtwXSxvW3BdKTtyZXR1cm4gVC5maW5kKCJsYWJlbCIpLmF0dHIoImZvciIsImR0LWxlbmd0aC0iK3dpKSxsLmF0dHIoImlkIiwiZHQtbGVuZ3RoLSIrd2kpLHdpKyssVC5maW5kKCIjIit5KS5yZXBsYWNlV2l0aChsKSxIKCJzZWxlY3QiLFQpLnZhbCh0Ll9pRGlzcGxheUxlbmd0aCkub24oImNoYW5nZS5EVCIsZnVuY3Rpb24oKXtkcyh0LEgodGhpcykudmFsKCkpLExuKHQpfSksSCh0Lm5UYWJsZSkub24oImxlbmd0aC5kdC5EVCIsZnVuY3Rpb24oaCxfLEYpe3Q9PT1fJiYoSCgic2VsZWN0IixUKS52YWwoRiksYyhGKSl9KSxjKHQuX2lEaXNwbGF5TGVuZ3RoKSxUfSwibCIpO0guZm4uZGF0YVRhYmxlPWJ0O2J0LiQ9SDtILmZuLmRhdGFUYWJsZVNldHRpbmdzPWJ0LnNldHRpbmdzO0guZm4uZGF0YVRhYmxlRXh0PWJ0LmV4dDtILmZuLkRhdGFUYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gSCh0aGlzKS5kYXRhVGFibGUodCkuYXBpKCl9O0guZWFjaChidCxmdW5jdGlvbih0LGUpe0guZm4uRGF0YVRhYmxlW3RdPWV9KTt2YXIgYXQ9YnQ7dmFyIExlPWF0O3ZhciAkbD1pZShhZSgpLDEpO3ZhciBQcz1pZShhZSgpLDEpO3ZhciBodD1Qcy5kZWZhdWx0LFdsPTAsR2w9MCxTZT1hdC5leHQuYnV0dG9ucyxxaT1udWxsO2Z1bmN0aW9uIFhpKHQsZSxuKXtodC5mbi5hbmltYXRlP3Quc3RvcCgpLmZhZGVJbihlLG4pOih0LmNzcygiZGlzcGxheSIsImJsb2NrIiksbiYmbi5jYWxsKHQpKX1mdW5jdGlvbiBZaSh0LGUsbil7aHQuZm4uYW5pbWF0ZT90LnN0b3AoKS5mYWRlT3V0KGUsbik6KHQuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLG4mJm4uY2FsbCh0KSl9dmFyIHRlPWZ1bmN0aW9uKHQsZSl7aWYoIWF0LnZlcnNpb25DaGVjaygiMiIpKXRocm93Ildhcm5pbmc6IEJ1dHRvbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIjtpZighKHRoaXMgaW5zdGFuY2VvZiB0ZSkpcmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgdGUobix0KS5jb250YWluZXIoKX07dHlwZW9mIGU+InUiJiYoZT17fSksZT09PSEwJiYoZT17fSksQXJyYXkuaXNBcnJheShlKSYmKGU9e2J1dHRvbnM6ZX0pLHRoaXMuYz1odC5leHRlbmQoITAse30sdGUuZGVmYXVsdHMsZSksZS5idXR0b25zJiYodGhpcy5jLmJ1dHRvbnM9ZS5idXR0b25zKSx0aGlzLnM9e2R0Om5ldyBhdC5BcGkodCksYnV0dG9uczpbXSxsaXN0ZW5LZXlzOiIiLG5hbWVzcGFjZToiZHRiIitXbCsrfSx0aGlzLmRvbT17Y29udGFpbmVyOmh0KCI8Iit0aGlzLmMuZG9tLmNvbnRhaW5lci50YWcrIi8+IikuYWRkQ2xhc3ModGhpcy5jLmRvbS5jb250YWluZXIuY2xhc3NOYW1lKX0sdGhpcy5fY29uc3RydWN0b3IoKX07aHQuZXh0ZW5kKHRlLnByb3RvdHlwZSx7YWN0aW9uOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP24uY29uZi5hY3Rpb246KG4uY29uZi5hY3Rpb249ZSx0aGlzKX0sYWN0aXZlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpLHI9dGhpcy5jLmRvbS5idXR0b24uYWN0aXZlLHM9aHQobi5ub2RlKTtyZXR1cm4gbi5pbkNvbGxlY3Rpb24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24mJnRoaXMuYy5kb20uY29sbGVjdGlvbi5idXR0b24uYWN0aXZlIT09dm9pZCAwJiYocj10aGlzLmMuZG9tLmNvbGxlY3Rpb24uYnV0dG9uLmFjdGl2ZSksZT09PXZvaWQgMD9zLmhhc0NsYXNzKHIpOihzLnRvZ2dsZUNsYXNzKHIsZT09PXZvaWQgMD8hMDplKSx0aGlzKX0sYWRkOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnMuYnV0dG9ucztpZih0eXBlb2YgZT09InN0cmluZyIpe2Zvcih2YXIgcz1lLnNwbGl0KCItIiksaT10aGlzLnMsbz0wLHU9cy5sZW5ndGgtMTtvPHU7bysrKWk9aS5idXR0b25zW3Nbb10qMV07cj1pLmJ1dHRvbnMsZT1zW3MubGVuZ3RoLTFdKjF9cmV0dXJuIHRoaXMuX2V4cGFuZEJ1dHRvbihyLHQsdCE9PXZvaWQgMD90LnNwbGl0OnZvaWQgMCwodD09PXZvaWQgMHx8dC5zcGxpdD09PXZvaWQgMHx8dC5zcGxpdC5sZW5ndGg9PT0wKSYmaSE9PXZvaWQgMCwhMSxlKSwobj09PXZvaWQgMHx8bj09PSEwKSYmdGhpcy5fZHJhdygpLHRoaXN9LGNvbGxlY3Rpb25SZWJ1aWxkOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbm9kZVRvQnV0dG9uKHQpO2lmKGUhPT12b2lkIDApe3ZhciByO2ZvcihyPW4uYnV0dG9ucy5sZW5ndGgtMTtyPj0wO3ItLSl0aGlzLnJlbW92ZShuLmJ1dHRvbnNbcl0ubm9kZSk7Zm9yKG4uY29uZi5wcmVmaXhCdXR0b25zJiZlLnVuc2hpZnQuYXBwbHkoZSxuLmNvbmYucHJlZml4QnV0dG9ucyksbi5jb25mLnBvc3RmaXhCdXR0b25zJiZlLnB1c2guYXBwbHkoZSxuLmNvbmYucG9zdGZpeEJ1dHRvbnMpLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIHM9ZVtyXTt0aGlzLl9leHBhbmRCdXR0b24obi5idXR0b25zLHMscyE9PXZvaWQgMCYmcy5jb25maWchPT12b2lkIDAmJnMuY29uZmlnLnNwbGl0IT09dm9pZCAwLCEwLHMucGFyZW50Q29uZiE9PXZvaWQgMCYmcy5wYXJlbnRDb25mLnNwbGl0IT09dm9pZCAwLG51bGwscy5wYXJlbnRDb25mKX19dGhpcy5fZHJhdyhuLmNvbGxlY3Rpb24sbi5idXR0b25zKX0sY29udGFpbmVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sZGlzYWJsZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9ub2RlVG9CdXR0b24odCk7cmV0dXJuIGh0KGUubm9kZSkuYWRkQ2xhc3ModGhpcy5jLmRvbS5idXR0b24uZGlzYWJsZWQpLnByb3AoImRpc2FibGVkIiwhMCksdGhpc30sZGVzdHJveTpmdW5jdGlvbigpe2h0KCJib2R5Iikub2ZmKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UpO3ZhciB0PXRoaXMucy5idXR0b25zLnNsaWNlKCksZSxuO2ZvcihlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXRoaXMucmVtb3ZlKHRbZV0ubm9kZSk7dGhpcy5kb20uY29udGFpbmVyLnJlbW92ZSgpO3ZhciByPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2ZvcihlPTAsbj1yLmxlbmd0aDtlPG47ZSsrKWlmKHIuaW5zdD09PXRoaXMpe3Iuc3BsaWNlKGUsMSk7YnJlYWt9cmV0dXJuIHRoaXN9LGVuYWJsZTpmdW5jdGlvbih0LGUpe2lmKGU9PT0hMSlyZXR1cm4gdGhpcy5kaXNhYmxlKHQpO3ZhciBuPXRoaXMuX25vZGVUb0J1dHRvbih0KTtyZXR1cm4gaHQobi5ub2RlKS5yZW1vdmVDbGFzcyh0aGlzLmMuZG9tLmJ1dHRvbi5kaXNhYmxlZCkucHJvcCgiZGlzYWJsZWQiLCExKSx0aGlzfSxpbmRleDpmdW5jdGlvbih0LGUsbil7ZXx8KGU9IiIsbj10aGlzLnMuYnV0dG9ucyk7Zm9yKHZhciByPTAscz1uLmxlbmd0aDtyPHM7cisrKXt2YXIgaT1uW3JdLmJ1dHRvbnM7aWYobltyXS5ub2RlPT09dClyZXR1cm4gZStyO2lmKGkmJmkubGVuZ3RoKXt2YXIgbz10aGlzLmluZGV4KHQscisiLSIsaSk7aWYobyE9PW51bGwpcmV0dXJuIG99fXJldHVybiBudWxsfSxuYW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5uYW1lfSxub2RlOmZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiB0aGlzLmRvbS5jb250YWluZXI7dmFyIGU9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBodChlLm5vZGUpfSxwcm9jZXNzaW5nOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zLmR0LHI9dGhpcy5fbm9kZVRvQnV0dG9uKHQpO3JldHVybiBlPT09dm9pZCAwP2h0KHIubm9kZSkuaGFzQ2xhc3MoInByb2Nlc3NpbmciKTooaHQoci5ub2RlKS50b2dnbGVDbGFzcygicHJvY2Vzc2luZyIsZSksaHQobi50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtcHJvY2Vzc2luZy5kdCIsW2Usbi5idXR0b24odCksbixodCh0KSxyLmNvbmZdKSx0aGlzKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX25vZGVUb0J1dHRvbih0KSxuPXRoaXMuX25vZGVUb0hvc3QodCkscj10aGlzLnMuZHQ7aWYoZS5idXR0b25zLmxlbmd0aClmb3IodmFyIHM9ZS5idXR0b25zLmxlbmd0aC0xO3M+PTA7cy0tKXRoaXMucmVtb3ZlKGUuYnV0dG9uc1tzXS5ub2RlKTtlLmNvbmYuZGVzdHJveWluZz0hMCxlLmNvbmYuZGVzdHJveSYmZS5jb25mLmRlc3Ryb3kuY2FsbChyLmJ1dHRvbih0KSxyLGh0KHQpLGUuY29uZiksdGhpcy5fcmVtb3ZlS2V5KGUuY29uZiksaHQoZS5ub2RlKS5yZW1vdmUoKTt2YXIgaT1odC5pbkFycmF5KGUsbik7cmV0dXJuIG4uc3BsaWNlKGksMSksdGhpc30sdGV4dDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX25vZGVUb0J1dHRvbih0KSxyPW4udGV4dE5vZGUscz10aGlzLnMuZHQsaT1odChuLm5vZGUpLG89ZnVuY3Rpb24odSl7cmV0dXJuIHR5cGVvZiB1PT0iZnVuY3Rpb24iP3UocyxpLG4uY29uZik6dX07cmV0dXJuIGU9PT12b2lkIDA/byhuLmNvbmYudGV4dCk6KG4uY29uZi50ZXh0PWUsci5odG1sKG8oZSkpLHRoaXMpfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LG49ZS5zZXR0aW5ncygpWzBdLHI9dGhpcy5jLmJ1dHRvbnM7bi5fYnV0dG9uc3x8KG4uX2J1dHRvbnM9W10pLG4uX2J1dHRvbnMucHVzaCh7aW5zdDp0aGlzLG5hbWU6dGhpcy5jLm5hbWV9KTtmb3IodmFyIHM9MCxpPXIubGVuZ3RoO3M8aTtzKyspdGhpcy5hZGQocltzXSk7ZS5vbigiZGVzdHJveSIsZnVuY3Rpb24obyx1KXt1PT09biYmdC5kZXN0cm95KCl9KSxodCgiYm9keSIpLm9uKCJrZXl1cC4iK3RoaXMucy5uYW1lc3BhY2UsZnVuY3Rpb24obyl7aWYoIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnR8fGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5KXt2YXIgdT1TdHJpbmcuZnJvbUNoYXJDb2RlKG8ua2V5Q29kZSkudG9Mb3dlckNhc2UoKTt0LnMubGlzdGVuS2V5cy50b0xvd2VyQ2FzZSgpLmluZGV4T2YodSkhPT0tMSYmdC5fa2V5cHJlc3ModSxvKX19KX0sX2FkZEtleTpmdW5jdGlvbih0KXt0LmtleSYmKHRoaXMucy5saXN0ZW5LZXlzKz1odC5pc1BsYWluT2JqZWN0KHQua2V5KT90LmtleS5rZXk6dC5rZXkpfSxfZHJhdzpmdW5jdGlvbih0LGUpe3R8fCh0PXRoaXMuZG9tLmNvbnRhaW5lcixlPXRoaXMucy5idXR0b25zKSx0LmNoaWxkcmVuKCkuZGV0YWNoKCk7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQuYXBwZW5kKGVbbl0uaW5zZXJ0ZXIpLHQuYXBwZW5kKCIgIiksZVtuXS5idXR0b25zJiZlW25dLmJ1dHRvbnMubGVuZ3RoJiZ0aGlzLl9kcmF3KGVbbl0uY29sbGVjdGlvbixlW25dLmJ1dHRvbnMpfSxfZXhwYW5kQnV0dG9uOmZ1bmN0aW9uKHQsZSxuLHIscyxpLG8pe3ZhciB1PXRoaXMucy5kdCxwPSExLGI9dGhpcy5jLmRvbS5jb2xsZWN0aW9uLGc9QXJyYXkuaXNBcnJheShlKT9lOltlXTtlPT09dm9pZCAwJiYoZz1BcnJheS5pc0FycmF5KG4pP246W25dKTtmb3IodmFyIG09MCxDPWcubGVuZ3RoO208QzttKyspe3ZhciB5PXRoaXMuX3Jlc29sdmVFeHRlbmRzKGdbbV0pO2lmKHkpe2lmKHA9ISEoeS5jb25maWcmJnkuY29uZmlnLnNwbGl0KSxBcnJheS5pc0FycmF5KHkpKXt0aGlzLl9leHBhbmRCdXR0b24odCx5LFQhPT12b2lkIDAmJlQuY29uZiE9PXZvaWQgMD9ULmNvbmYuc3BsaXQ6dm9pZCAwLHIsbyE9PXZvaWQgMCYmby5zcGxpdCE9PXZvaWQgMCxpLG8pO2NvbnRpbnVlfXZhciBUPXRoaXMuX2J1aWxkQnV0dG9uKHkscix5LnNwbGl0IT09dm9pZCAwfHx5LmNvbmZpZyE9PXZvaWQgMCYmeS5jb25maWcuc3BsaXQhPT12b2lkIDAscyk7aWYoVCl7aWYoaSE9bnVsbD8odC5zcGxpY2UoaSwwLFQpLGkrKyk6dC5wdXNoKFQpLFQuY29uZi5idXR0b25zJiYoVC5jb2xsZWN0aW9uPWh0KCI8IitiLmNvbnRhaW5lci5jb250ZW50LnRhZysiLz4iKSxULmNvbmYuX2NvbGxlY3Rpb249VC5jb2xsZWN0aW9uLGh0KFQubm9kZSkuYXBwZW5kKGIuYWN0aW9uLmRyb3BIdG1sKSx0aGlzLl9leHBhbmRCdXR0b24oVC5idXR0b25zLFQuY29uZi5idXR0b25zLFQuY29uZi5zcGxpdCwhcCxwLGksVC5jb25mKSksVC5jb25mLnNwbGl0KXtULmNvbGxlY3Rpb249aHQoIjwiK2IuY29udGFpbmVyLnRhZysiLz4iKSxULmNvbmYuX2NvbGxlY3Rpb249VC5jb2xsZWN0aW9uO2Zvcih2YXIgUD0wO1A8VC5jb25mLnNwbGl0Lmxlbmd0aDtQKyspe3ZhciBjPVQuY29uZi5zcGxpdFtQXTt0eXBlb2YgYz09Im9iamVjdCImJihjLnBhcmVudD1vLGMuY29sbGVjdGlvbkxheW91dD09PXZvaWQgMCYmKGMuY29sbGVjdGlvbkxheW91dD1ULmNvbmYuY29sbGVjdGlvbkxheW91dCksYy5kcm9wdXA9PT12b2lkIDAmJihjLmRyb3B1cD1ULmNvbmYuZHJvcHVwKSxjLmZhZGU9PT12b2lkIDAmJihjLmZhZGU9VC5jb25mLmZhZGUpKX10aGlzLl9leHBhbmRCdXR0b24oVC5idXR0b25zLFQuY29uZi5idXR0b25zLFQuY29uZi5zcGxpdCwhcCxwLGksVC5jb25mKX1ULmNvbmYucGFyZW50PW8seS5pbml0JiZ5LmluaXQuY2FsbCh1LmJ1dHRvbihULm5vZGUpLHUsaHQoVC5ub2RlKSx5KX19fX0sX2J1aWxkQnV0dG9uOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMsaT10aGlzLmMuZG9tLG8sdT10aGlzLnMuZHQscD1mdW5jdGlvbihRKXtyZXR1cm4gdHlwZW9mIFE9PSJmdW5jdGlvbiI/USh1LG0sdCk6UX0sYj1odC5leHRlbmQoITAse30saS5idXR0b24pO2lmKGUmJm4mJmkuY29sbGVjdGlvbi5zcGxpdD9odC5leHRlbmQoITAsYixpLmNvbGxlY3Rpb24uc3BsaXQuYWN0aW9uKTpyfHxlP2h0LmV4dGVuZCghMCxiLGkuY29sbGVjdGlvbi5idXR0b24pOm4mJmh0LmV4dGVuZCghMCxiLGkuc3BsaXQuYnV0dG9uKSx0LnNwYWNlcil7dmFyIGc9aHQoIjwiK2Iuc3BhY2VyLnRhZysiLz4iKS5hZGRDbGFzcygiZHQtYnV0dG9uLXNwYWNlciAiK3Quc3R5bGUrIiAiK2Iuc3BhY2VyLmNsYXNzTmFtZSkuaHRtbChwKHQudGV4dCkpO3JldHVybntjb25mOnQsbm9kZTpnLGluc2VydGVyOmcsYnV0dG9uczpbXSxpbkNvbGxlY3Rpb246ZSxpc1NwbGl0Om4sY29sbGVjdGlvbjpudWxsLHRleHROb2RlOmd9fWlmKHQuYXZhaWxhYmxlJiYhdC5hdmFpbGFibGUodSx0KSYmIXQuaHRtbClyZXR1cm4hMTt2YXIgbTtpZih0Lmh0bWwpbT1odCh0Lmh0bWwpO2Vsc2V7dmFyIEM9ZnVuY3Rpb24oUSxFLCQsdyxrKXt3LmFjdGlvbi5jYWxsKEUuYnV0dG9uKCQpLFEsRSwkLHcsayksaHQoRS50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbRS5idXR0b24oJCksRSwkLHddKX0seT1mdW5jdGlvbihRLEUsJCx3KXt3LmFzeW5jPyhzLnByb2Nlc3NpbmcoJFswXSwhMCksc2V0VGltZW91dChmdW5jdGlvbigpe0MoUSxFLCQsdyxmdW5jdGlvbigpe3MucHJvY2Vzc2luZygkWzBdLCExKX0pfSx3LmFzeW5jKSk6QyhRLEUsJCx3LGZ1bmN0aW9uKCl7fSl9LFQ9dC50YWd8fGIudGFnLFA9dC5jbGlja0JsdXJzPT09dm9pZCAwPyEwOnQuY2xpY2tCbHVycztpZihtPWh0KCI8IitUKyIvPiIpLmFkZENsYXNzKGIuY2xhc3NOYW1lKS5hdHRyKCJ0YWJpbmRleCIsdGhpcy5zLmR0LnNldHRpbmdzKClbMF0uaVRhYkluZGV4KS5hdHRyKCJhcmlhLWNvbnRyb2xzIix0aGlzLnMuZHQudGFibGUoKS5ub2RlKCkuaWQpLm9uKCJjbGljay5kdGIiLGZ1bmN0aW9uKFEpe1EucHJldmVudERlZmF1bHQoKSwhbS5oYXNDbGFzcyhiLmRpc2FibGVkKSYmdC5hY3Rpb24mJnkoUSx1LG0sdCksUCYmbS50cmlnZ2VyKCJibHVyIil9KS5vbigia2V5cHJlc3MuZHRiIixmdW5jdGlvbihRKXtRLmtleUNvZGU9PT0xMyYmKFEucHJldmVudERlZmF1bHQoKSwhbS5oYXNDbGFzcyhiLmRpc2FibGVkKSYmdC5hY3Rpb24mJnkoUSx1LG0sdCkpfSksVC50b0xvd2VyQ2FzZSgpPT09ImEiJiZtLmF0dHIoImhyZWYiLCIjIiksVC50b0xvd2VyQ2FzZSgpPT09ImJ1dHRvbiImJm0uYXR0cigidHlwZSIsImJ1dHRvbiIpLGIubGluZXIudGFnKXt2YXIgYz1odCgiPCIrYi5saW5lci50YWcrIi8+IikuaHRtbChwKHQudGV4dCkpLmFkZENsYXNzKGIubGluZXIuY2xhc3NOYW1lKTtiLmxpbmVyLnRhZy50b0xvd2VyQ2FzZSgpPT09ImEiJiZjLmF0dHIoImhyZWYiLCIjIiksbS5hcHBlbmQoYyksbz1jfWVsc2UgbS5odG1sKHAodC50ZXh0KSksbz1tO3QuZW5hYmxlZD09PSExJiZtLmFkZENsYXNzKGIuZGlzYWJsZWQpLHQuY2xhc3NOYW1lJiZtLmFkZENsYXNzKHQuY2xhc3NOYW1lKSx0LnRpdGxlQXR0ciYmbS5hdHRyKCJ0aXRsZSIscCh0LnRpdGxlQXR0cikpLHQuYXR0ciYmbS5hdHRyKHQuYXR0ciksdC5uYW1lc3BhY2V8fCh0Lm5hbWVzcGFjZT0iLmR0LWJ1dHRvbi0iK0dsKyspLHQuY29uZmlnIT09dm9pZCAwJiZ0LmNvbmZpZy5zcGxpdCYmKHQuc3BsaXQ9dC5jb25maWcuc3BsaXQpfXZhciBsPXRoaXMuYy5kb20uYnV0dG9uQ29udGFpbmVyLGg7bCYmbC50YWc/aD1odCgiPCIrbC50YWcrIi8+IikuYWRkQ2xhc3MobC5jbGFzc05hbWUpLmFwcGVuZChtKTpoPW0sdGhpcy5fYWRkS2V5KHQpLHRoaXMuYy5idXR0b25DcmVhdGVkJiYoaD10aGlzLmMuYnV0dG9uQ3JlYXRlZCh0LGgpKTt2YXIgXztpZihuKXt2YXIgRj1lP2h0LmV4dGVuZCghMCx0aGlzLmMuZG9tLnNwbGl0LHRoaXMuYy5kb20uY29sbGVjdGlvbi5zcGxpdCk6dGhpcy5jLmRvbS5zcGxpdCxPPUYud3JhcHBlcjtfPWh0KCI8IitPLnRhZysiLz4iKS5hZGRDbGFzcyhPLmNsYXNzTmFtZSkuYXBwZW5kKG0pO3ZhciBmPWh0LmV4dGVuZCh0LHthbGlnbjpGLmRyb3Bkb3duLmFsaWduLGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIiwiYXJpYS1leHBhbmRlZCI6ITF9LGNsYXNzTmFtZTpGLmRyb3Bkb3duLmNsYXNzTmFtZSxjbG9zZUJ1dHRvbjohMSxzcGxpdEFsaWduQ2xhc3M6Ri5kcm9wZG93bi5zcGxpdEFsaWduQ2xhc3MsdGV4dDpGLmRyb3Bkb3duLnRleHR9KTt0aGlzLl9hZGRLZXkoZik7dmFyIFU9ZnVuY3Rpb24oUSxFLCQsdyl7U2Uuc3BsaXQuYWN0aW9uLmNhbGwoRS5idXR0b24oXyksUSxFLCQsdyksaHQoRS50YWJsZSgpLm5vZGUoKSkudHJpZ2dlckhhbmRsZXIoImJ1dHRvbnMtYWN0aW9uLmR0IixbRS5idXR0b24oJCksRSwkLHddKSwkLmF0dHIoImFyaWEtZXhwYW5kZWQiLCEwKX0sWD1odCgnPGJ1dHRvbiBjbGFzcz0iJytGLmRyb3Bkb3duLmNsYXNzTmFtZSsnIGR0LWJ1dHRvbiI+PC9idXR0b24+JykuaHRtbChGLmRyb3Bkb3duLmRyb3BIdG1sKS5vbigiY2xpY2suZHRiIixmdW5jdGlvbihRKXtRLnByZXZlbnREZWZhdWx0KCksUS5zdG9wUHJvcGFnYXRpb24oKSxYLmhhc0NsYXNzKGIuZGlzYWJsZWQpfHxVKFEsdSxYLGYpLFAmJlgudHJpZ2dlcigiYmx1ciIpfSkub24oImtleXByZXNzLmR0YiIsZnVuY3Rpb24oUSl7US5rZXlDb2RlPT09MTMmJihRLnByZXZlbnREZWZhdWx0KCksWC5oYXNDbGFzcyhiLmRpc2FibGVkKXx8VShRLHUsWCxmKSl9KTt0LnNwbGl0Lmxlbmd0aD09PTAmJlguYWRkQ2xhc3MoImR0Yi1oaWRlLWRyb3AiKSxfLmFwcGVuZChYKS5hdHRyKGYuYXR0cil9cmV0dXJue2NvbmY6dCxub2RlOm4/Xy5nZXQoMCk6bS5nZXQoMCksaW5zZXJ0ZXI6bj9fOmgsYnV0dG9uczpbXSxpbkNvbGxlY3Rpb246ZSxpc1NwbGl0Om4saW5TcGxpdDpyLGNvbGxlY3Rpb246bnVsbCx0ZXh0Tm9kZTpvfX0sX25vZGVUb0J1dHRvbjpmdW5jdGlvbih0LGUpe2V8fChlPXRoaXMucy5idXR0b25zKTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspe2lmKGVbbl0ubm9kZT09PXQpcmV0dXJuIGVbbl07aWYoZVtuXS5idXR0b25zLmxlbmd0aCl7dmFyIHM9dGhpcy5fbm9kZVRvQnV0dG9uKHQsZVtuXS5idXR0b25zKTtpZihzKXJldHVybiBzfX19LF9ub2RlVG9Ib3N0OmZ1bmN0aW9uKHQsZSl7ZXx8KGU9dGhpcy5zLmJ1dHRvbnMpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl7aWYoZVtuXS5ub2RlPT09dClyZXR1cm4gZTtpZihlW25dLmJ1dHRvbnMubGVuZ3RoKXt2YXIgcz10aGlzLl9ub2RlVG9Ib3N0KHQsZVtuXS5idXR0b25zKTtpZihzKXJldHVybiBzfX19LF9rZXlwcmVzczpmdW5jdGlvbih0LGUpe2lmKCFlLl9idXR0b25zSGFuZGxlZCl7dmFyIG49ZnVuY3Rpb24ocyxpKXtpZihzLmtleSl7aWYocy5rZXk9PT10KWUuX2J1dHRvbnNIYW5kbGVkPSEwLGh0KGkpLmNsaWNrKCk7ZWxzZSBpZihodC5pc1BsYWluT2JqZWN0KHMua2V5KSl7aWYocy5rZXkua2V5IT09dHx8cy5rZXkuc2hpZnRLZXkmJiFlLnNoaWZ0S2V5fHxzLmtleS5hbHRLZXkmJiFlLmFsdEtleXx8cy5rZXkuY3RybEtleSYmIWUuY3RybEtleXx8cy5rZXkubWV0YUtleSYmIWUubWV0YUtleSlyZXR1cm47ZS5fYnV0dG9uc0hhbmRsZWQ9ITAsaHQoaSkuY2xpY2soKX19fSxyPWZ1bmN0aW9uKHMpe2Zvcih2YXIgaT0wLG89cy5sZW5ndGg7aTxvO2krKyluKHNbaV0uY29uZixzW2ldLm5vZGUpLHNbaV0uYnV0dG9ucy5sZW5ndGgmJnIoc1tpXS5idXR0b25zKX07cih0aGlzLnMuYnV0dG9ucyl9fSxfcmVtb3ZlS2V5OmZ1bmN0aW9uKHQpe2lmKHQua2V5KXt2YXIgZT1odC5pc1BsYWluT2JqZWN0KHQua2V5KT90LmtleS5rZXk6dC5rZXksbj10aGlzLnMubGlzdGVuS2V5cy5zcGxpdCgiIikscj1odC5pbkFycmF5KGUsbik7bi5zcGxpY2UociwxKSx0aGlzLnMubGlzdGVuS2V5cz1uLmpvaW4oIiIpfX0sX3Jlc29sdmVFeHRlbmRzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLnMuZHQscixzLGk9ZnVuY3Rpb24oZyl7Zm9yKHZhciBtPTA7IWh0LmlzUGxhaW5PYmplY3QoZykmJiFBcnJheS5pc0FycmF5KGcpOyl7aWYoZz09PXZvaWQgMClyZXR1cm47aWYodHlwZW9mIGc9PSJmdW5jdGlvbiIpe2lmKGc9Zy5jYWxsKGUsbix0KSwhZylyZXR1cm4hMX1lbHNlIGlmKHR5cGVvZiBnPT0ic3RyaW5nIil7aWYoIVNlW2ddKXJldHVybntodG1sOmd9O2c9U2VbZ119aWYobSsrLG0+MzApdGhyb3ciQnV0dG9uczogVG9vIG1hbnkgaXRlcmF0aW9ucyJ9cmV0dXJuIEFycmF5LmlzQXJyYXkoZyk/ZzpodC5leHRlbmQoe30sZyl9O2Zvcih0PWkodCk7dCYmdC5leHRlbmQ7KXtpZighU2VbdC5leHRlbmRdKXRocm93IkNhbm5vdCBleHRlbmQgdW5rbm93biBidXR0b24gdHlwZTogIit0LmV4dGVuZDt2YXIgbz1pKFNlW3QuZXh0ZW5kXSk7aWYoQXJyYXkuaXNBcnJheShvKSlyZXR1cm4gbztpZighbylyZXR1cm4hMTt2YXIgdT1vLmNsYXNzTmFtZTt0LmNvbmZpZyE9PXZvaWQgMCYmby5jb25maWchPT12b2lkIDAmJih0LmNvbmZpZz1odC5leHRlbmQoe30sby5jb25maWcsdC5jb25maWcpKSx0PWh0LmV4dGVuZCh7fSxvLHQpLHUmJnQuY2xhc3NOYW1lIT09dSYmKHQuY2xhc3NOYW1lPXUrIiAiK3QuY2xhc3NOYW1lKSx0LmV4dGVuZD1vLmV4dGVuZH12YXIgcD10LnBvc3RmaXhCdXR0b25zO2lmKHApZm9yKHQuYnV0dG9uc3x8KHQuYnV0dG9ucz1bXSkscj0wLHM9cC5sZW5ndGg7cjxzO3IrKyl0LmJ1dHRvbnMucHVzaChwW3JdKTt2YXIgYj10LnByZWZpeEJ1dHRvbnM7aWYoYilmb3IodC5idXR0b25zfHwodC5idXR0b25zPVtdKSxyPTAscz1iLmxlbmd0aDtyPHM7cisrKXQuYnV0dG9ucy5zcGxpY2UociwwLGJbcl0pO3JldHVybiB0fSxfcG9wb3ZlcjpmdW5jdGlvbih0LGUsbil7dmFyIHI9ZSxzPXRoaXMuYyxpPSExLG89aHQuZXh0ZW5kKHthbGlnbjoiYnV0dG9uLWxlZnQiLGF1dG9DbG9zZTohMSxiYWNrZ3JvdW5kOiEwLGJhY2tncm91bmRDbGFzc05hbWU6ImR0LWJ1dHRvbi1iYWNrZ3JvdW5kIixjbG9zZUJ1dHRvbjohMCxjb250YWluZXJDbGFzc05hbWU6cy5kb20uY29sbGVjdGlvbi5jb250YWluZXIuY2xhc3NOYW1lLGNvbnRlbnRDbGFzc05hbWU6cy5kb20uY29sbGVjdGlvbi5jb250YWluZXIuY29udGVudC5jbGFzc05hbWUsY29sbGVjdGlvbkxheW91dDoiIixjb2xsZWN0aW9uVGl0bGU6IiIsZHJvcHVwOiExLGZhZGU6NDAwLHBvcG92ZXJUaXRsZToiIixyaWdodEFsaWduQ2xhc3NOYW1lOiJkdC1idXR0b24tcmlnaHQiLHRhZzpzLmRvbS5jb2xsZWN0aW9uLmNvbnRhaW5lci50YWd9LG4pLHU9by50YWcrIi4iK28uY29udGFpbmVyQ2xhc3NOYW1lLnJlcGxhY2UoLyAvZywiLiIpLHA9ZS5ub2RlKCksYj1mdW5jdGlvbigpe2k9ITAsWWkoaHQodSksby5mYWRlLGZ1bmN0aW9uKCl7aHQodGhpcykuZGV0YWNoKCl9KSxodChyLmJ1dHRvbnMoJ1thcmlhLWhhc3BvcHVwPSJkaWFsb2ciXVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKS5ub2RlcygpKS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwiZmFsc2UiKSxodCgiZGl2LmR0LWJ1dHRvbi1iYWNrZ3JvdW5kIikub2ZmKCJjbGljay5kdGItY29sbGVjdGlvbiIpLHRlLmJhY2tncm91bmQoITEsby5iYWNrZ3JvdW5kQ2xhc3NOYW1lLG8uZmFkZSxwKSxodCh3aW5kb3cpLm9mZigicmVzaXplLnJlc2l6ZS5kdGItY29sbGVjdGlvbiIpLGh0KCJib2R5Iikub2ZmKCIuZHRiLWNvbGxlY3Rpb24iKSxyLm9mZigiYnV0dG9ucy1hY3Rpb24uYi1pbnRlcm5hbCIpLHIub2ZmKCJkZXN0cm95Iil9O2lmKHQ9PT0hMSl7YigpO3JldHVybn12YXIgZz1odChyLmJ1dHRvbnMoJ1thcmlhLWhhc3BvcHVwPSJkaWFsb2ciXVthcmlhLWV4cGFuZGVkPSJ0cnVlIl0nKS5ub2RlcygpKTtnLmxlbmd0aCYmKHAuY2xvc2VzdCh1KS5sZW5ndGgmJihwPWcuZXEoMCkpLGIoKSk7dmFyIG09aHQoIi5kdC1idXR0b24iLHQpLmxlbmd0aCxDPSIiO209PT0zP0M9ImR0Yi1iMyI6bT09PTI/Qz0iZHRiLWIyIjptPT09MSYmKEM9ImR0Yi1iMSIpO3ZhciB5PWh0KCI8IitvLnRhZysiLz4iKS5hZGRDbGFzcyhvLmNvbnRhaW5lckNsYXNzTmFtZSkuYWRkQ2xhc3Moby5jb2xsZWN0aW9uTGF5b3V0KS5hZGRDbGFzcyhvLnNwbGl0QWxpZ25DbGFzcykuYWRkQ2xhc3MoQykuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoeyJhcmlhLW1vZGFsIjohMCxyb2xlOiJkaWFsb2cifSk7dD1odCh0KS5hZGRDbGFzcyhvLmNvbnRlbnRDbGFzc05hbWUpLmF0dHIoInJvbGUiLCJtZW51IikuYXBwZW5kVG8oeSkscC5hdHRyKCJhcmlhLWV4cGFuZGVkIiwidHJ1ZSIpLHAucGFyZW50cygiYm9keSIpWzBdIT09ZG9jdW1lbnQuYm9keSYmKHA9ZG9jdW1lbnQuYm9keS5sYXN0Q2hpbGQpLG8ucG9wb3ZlclRpdGxlP3kucHJlcGVuZCgnPGRpdiBjbGFzcz0iZHQtYnV0dG9uLWNvbGxlY3Rpb24tdGl0bGUiPicrby5wb3BvdmVyVGl0bGUrIjwvZGl2PiIpOm8uY29sbGVjdGlvblRpdGxlJiZ5LnByZXBlbmQoJzxkaXYgY2xhc3M9ImR0LWJ1dHRvbi1jb2xsZWN0aW9uLXRpdGxlIj4nK28uY29sbGVjdGlvblRpdGxlKyI8L2Rpdj4iKSxvLmNsb3NlQnV0dG9uJiZ5LnByZXBlbmQoJzxkaXYgY2xhc3M9ImR0Yi1wb3BvdmVyLWNsb3NlIj4mdGltZXM7PC9kaXY+JykuYWRkQ2xhc3MoImR0Yi1jb2xsZWN0aW9uLWNsb3NlYWJsZSIpLFhpKHkuaW5zZXJ0QWZ0ZXIocCksby5mYWRlKTt2YXIgVD1odChlLnRhYmxlKCkuY29udGFpbmVyKCkpLFA9eS5jc3MoInBvc2l0aW9uIik7aWYoKG8uc3Bhbj09PSJjb250YWluZXIifHxvLmFsaWduPT09ImR0LWNvbnRhaW5lciIpJiYocD1wLnBhcmVudCgpLHkuY3NzKCJ3aWR0aCIsVC53aWR0aCgpKSksUD09PSJhYnNvbHV0ZSIpe3ZhciBjPWh0KHBbMF0ub2Zmc2V0UGFyZW50KSxsPXAucG9zaXRpb24oKSxoPXAub2Zmc2V0KCksXz1jLm9mZnNldCgpLEY9Yy5wb3NpdGlvbigpLE89d2luZG93LmdldENvbXB1dGVkU3R5bGUoY1swXSk7Xy5oZWlnaHQ9Yy5vdXRlckhlaWdodCgpLF8ud2lkdGg9Yy53aWR0aCgpK3BhcnNlRmxvYXQoTy5wYWRkaW5nTGVmdCksXy5yaWdodD1fLmxlZnQrXy53aWR0aCxfLmJvdHRvbT1fLnRvcCtfLmhlaWdodDt2YXIgZj1sLnRvcCtwLm91dGVySGVpZ2h0KCksVT1sLmxlZnQ7eS5jc3Moe3RvcDpmLGxlZnQ6VX0pLE89d2luZG93LmdldENvbXB1dGVkU3R5bGUoeVswXSk7dmFyIFg9eS5vZmZzZXQoKTtYLmhlaWdodD15Lm91dGVySGVpZ2h0KCksWC53aWR0aD15Lm91dGVyV2lkdGgoKSxYLnJpZ2h0PVgubGVmdCtYLndpZHRoLFguYm90dG9tPVgudG9wK1guaGVpZ2h0LFgubWFyZ2luVG9wPXBhcnNlRmxvYXQoTy5tYXJnaW5Ub3ApLFgubWFyZ2luQm90dG9tPXBhcnNlRmxvYXQoTy5tYXJnaW5Cb3R0b20pLG8uZHJvcHVwJiYoZj1sLnRvcC1YLmhlaWdodC1YLm1hcmdpblRvcC1YLm1hcmdpbkJvdHRvbSksKG8uYWxpZ249PT0iYnV0dG9uLXJpZ2h0Inx8eS5oYXNDbGFzcyhvLnJpZ2h0QWxpZ25DbGFzc05hbWUpKSYmKFU9bC5sZWZ0LVgud2lkdGgrcC5vdXRlcldpZHRoKCkpLChvLmFsaWduPT09ImR0LWNvbnRhaW5lciJ8fG8uYWxpZ249PT0iY29udGFpbmVyIikmJlU8bC5sZWZ0JiYoVT0tbC5sZWZ0KSxGLmxlZnQrVStYLndpZHRoPmh0KHdpbmRvdykud2lkdGgoKSYmKFU9aHQod2luZG93KS53aWR0aCgpLVgud2lkdGgtRi5sZWZ0KSxoLmxlZnQrVTwwJiYoVT0taC5sZWZ0KSxGLnRvcCtmK1guaGVpZ2h0Pmh0KHdpbmRvdykuaGVpZ2h0KCkraHQod2luZG93KS5zY3JvbGxUb3AoKSYmKGY9bC50b3AtWC5oZWlnaHQtWC5tYXJnaW5Ub3AtWC5tYXJnaW5Cb3R0b20pLEYudG9wK2Y8aHQod2luZG93KS5zY3JvbGxUb3AoKSYmKGY9bC50b3ArcC5vdXRlckhlaWdodCgpKSx5LmNzcyh7dG9wOmYsbGVmdDpVfSl9ZWxzZXt2YXIgUT1mdW5jdGlvbigpe3ZhciBFPWh0KHdpbmRvdykuaGVpZ2h0KCkvMiwkPXkuaGVpZ2h0KCkvMjskPkUmJigkPUUpLHkuY3NzKCJtYXJnaW5Ub3AiLCQqLTEpfTtRKCksaHQod2luZG93KS5vbigicmVzaXplLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbigpe1EoKX0pfW8uYmFja2dyb3VuZCYmdGUuYmFja2dyb3VuZCghMCxvLmJhY2tncm91bmRDbGFzc05hbWUsby5mYWRlLG8uYmFja2dyb3VuZEhvc3R8fHApLGh0KCJkaXYuZHQtYnV0dG9uLWJhY2tncm91bmQiKS5vbigiY2xpY2suZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKCl7fSksby5hdXRvQ2xvc2UmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLm9uKCJidXR0b25zLWFjdGlvbi5iLWludGVybmFsIixmdW5jdGlvbihFLCQsdyxrKXtrWzBdIT09cFswXSYmYigpfSl9LDApLGh0KHkpLnRyaWdnZXIoImJ1dHRvbnMtcG9wb3Zlci5kdCIpLHIub24oImRlc3Ryb3kiLGIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPSExLGh0KCJib2R5Iikub24oImNsaWNrLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbihFKXtpZighaSl7dmFyICQ9aHQuZm4uYWRkQmFjaz8iYWRkQmFjayI6ImFuZFNlbGYiLHc9aHQoRS50YXJnZXQpLnBhcmVudCgpWzBdOyghaHQoRS50YXJnZXQpLnBhcmVudHMoKVskXSgpLmZpbHRlcih0KS5sZW5ndGgmJiFodCh3KS5oYXNDbGFzcygiZHQtYnV0dG9ucyIpfHxodChFLnRhcmdldCkuaGFzQ2xhc3MoImR0LWJ1dHRvbi1iYWNrZ3JvdW5kIikpJiZiKCl9fSkub24oImtleXVwLmR0Yi1jb2xsZWN0aW9uIixmdW5jdGlvbihFKXtFLmtleUNvZGU9PT0yNyYmYigpfSkub24oImtleWRvd24uZHRiLWNvbGxlY3Rpb24iLGZ1bmN0aW9uKEUpe3ZhciAkPWh0KCJhLCBidXR0b24iLHQpLHc9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtFLmtleUNvZGU9PT05JiYoJC5pbmRleCh3KT09PS0xPygkLmZpcnN0KCkuZm9jdXMoKSxFLnByZXZlbnREZWZhdWx0KCkpOkUuc2hpZnRLZXk/dz09PSRbMF0mJigkLmxhc3QoKS5mb2N1cygpLEUucHJldmVudERlZmF1bHQoKSk6dz09PSQubGFzdCgpWzBdJiYoJC5maXJzdCgpLmZvY3VzKCksRS5wcmV2ZW50RGVmYXVsdCgpKSl9KX0sMCl9fSk7dGUuYmFja2dyb3VuZD1mdW5jdGlvbih0LGUsbixyKXtuPT09dm9pZCAwJiYobj00MDApLHJ8fChyPWRvY3VtZW50LmJvZHkpLHQ/WGkoaHQoIjxkaXYvPiIpLmFkZENsYXNzKGUpLmNzcygiZGlzcGxheSIsIm5vbmUiKS5pbnNlcnRBZnRlcihyKSxuKTpZaShodCgiZGl2LiIrZSksbixmdW5jdGlvbigpe2h0KHRoaXMpLnJlbW92ZUNsYXNzKGUpLnJlbW92ZSgpfSl9O3RlLmluc3RhbmNlU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtpZih0PT1udWxsKXJldHVybiBodC5tYXAoZSxmdW5jdGlvbihpKXtyZXR1cm4gaS5pbnN0fSk7dmFyIG49W10scj1odC5tYXAoZSxmdW5jdGlvbihpKXtyZXR1cm4gaS5uYW1lfSkscz1mdW5jdGlvbihpKXtpZihBcnJheS5pc0FycmF5KGkpKXtmb3IodmFyIG89MCx1PWkubGVuZ3RoO288dTtvKyspcyhpW29dKTtyZXR1cm59aWYodHlwZW9mIGk9PSJzdHJpbmciKWlmKGkuaW5kZXhPZigiLCIpIT09LTEpcyhpLnNwbGl0KCIsIikpO2Vsc2V7dmFyIHA9aHQuaW5BcnJheShpLnRyaW0oKSxyKTtwIT09LTEmJm4ucHVzaChlW3BdLmluc3QpfWVsc2UgaWYodHlwZW9mIGk9PSJudW1iZXIiKW4ucHVzaChlW2ldLmluc3QpO2Vsc2UgaWYodHlwZW9mIGk9PSJvYmplY3QiJiZpLm5vZGVOYW1lKWZvcih2YXIgYj0wO2I8ZS5sZW5ndGg7YisrKWVbYl0uaW5zdC5kb20uY29udGFpbmVyWzBdPT09aSYmbi5wdXNoKGVbYl0uaW5zdCk7ZWxzZSB0eXBlb2YgaT09Im9iamVjdCImJm4ucHVzaChpKX07cmV0dXJuIHModCksbn07dGUuYnV0dG9uU2VsZWN0b3I9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj1mdW5jdGlvbihwLGIsZyl7Zm9yKHZhciBtLEMseT0wLFQ9Yi5sZW5ndGg7eTxUO3krKyltPWJbeV0sbSYmKEM9ZyE9PXZvaWQgMD9nK3k6eSsiIixwLnB1c2goe25vZGU6bS5ub2RlLG5hbWU6bS5jb25mLm5hbWUsaWR4OkN9KSxtLmJ1dHRvbnMmJnIocCxtLmJ1dHRvbnMsQysiLSIpKX0scz1mdW5jdGlvbihwLGIpe3ZhciBnLG0sQz1bXTtyKEMsYi5zLmJ1dHRvbnMpO3ZhciB5PWh0Lm1hcChDLGZ1bmN0aW9uKGgpe3JldHVybiBoLm5vZGV9KTtpZihBcnJheS5pc0FycmF5KHApfHxwIGluc3RhbmNlb2YgaHQpe2ZvcihnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXMocFtnXSxiKTtyZXR1cm59aWYocD09bnVsbHx8cD09PSIqIilmb3IoZz0wLG09Qy5sZW5ndGg7ZzxtO2crKyluLnB1c2goe2luc3Q6Yixub2RlOkNbZ10ubm9kZX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJudW1iZXIiKWIucy5idXR0b25zW3BdJiZuLnB1c2goe2luc3Q6Yixub2RlOmIucy5idXR0b25zW3BdLm5vZGV9KTtlbHNlIGlmKHR5cGVvZiBwPT0ic3RyaW5nIilpZihwLmluZGV4T2YoIiwiKSE9PS0xKXt2YXIgVD1wLnNwbGl0KCIsIik7Zm9yKGc9MCxtPVQubGVuZ3RoO2c8bTtnKyspcyhUW2ddLnRyaW0oKSxiKX1lbHNlIGlmKHAubWF0Y2goL15cZCsoXC1cZCspKiQvKSl7dmFyIFA9aHQubWFwKEMsZnVuY3Rpb24oaCl7cmV0dXJuIGguaWR4fSk7bi5wdXNoKHtpbnN0OmIsbm9kZTpDW2h0LmluQXJyYXkocCxQKV0ubm9kZX0pfWVsc2UgaWYocC5pbmRleE9mKCI6bmFtZSIpIT09LTEpe3ZhciBjPXAucmVwbGFjZSgiOm5hbWUiLCIiKTtmb3IoZz0wLG09Qy5sZW5ndGg7ZzxtO2crKylDW2ddLm5hbWU9PT1jJiZuLnB1c2goe2luc3Q6Yixub2RlOkNbZ10ubm9kZX0pfWVsc2UgaHQoeSkuZmlsdGVyKHApLmVhY2goZnVuY3Rpb24oKXtuLnB1c2goe2luc3Q6Yixub2RlOnRoaXN9KX0pO2Vsc2UgaWYodHlwZW9mIHA9PSJvYmplY3QiJiZwLm5vZGVOYW1lKXt2YXIgbD1odC5pbkFycmF5KHAseSk7bCE9PS0xJiZuLnB1c2goe2luc3Q6Yixub2RlOnlbbF19KX19LGk9MCxvPXQubGVuZ3RoO2k8bztpKyspe3ZhciB1PXRbaV07cyhlLHUpfXJldHVybiBufTt0ZS5zdHJpcERhdGE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdHlwZW9mIHQhPSJzdHJpbmcifHwodD10ZS5zdHJpcEh0bWxTY3JpcHQodCksdD10ZS5zdHJpcEh0bWxDb21tZW50cyh0KSwoIWV8fGUuc3RyaXBIdG1sKSYmKHQ9YXQudXRpbC5zdHJpcEh0bWwodCkpLCghZXx8ZS50cmltKSYmKHQ9dC50cmltKCkpLCghZXx8ZS5zdHJpcE5ld2xpbmVzKSYmKHQ9dC5yZXBsYWNlKC9cbi9nLCIgIikpLCghZXx8ZS5kZWNvZGVFbnRpdGllcykmJihxaT90PXFpKHQpOihBcy5pbm5lckhUTUw9dCx0PUFzLnZhbHVlKSkpLHR9O3RlLmVudGl0eURlY29kZXI9ZnVuY3Rpb24odCl7cWk9dH07dGUuc3RyaXBIdG1sQ29tbWVudHM9ZnVuY3Rpb24odCl7dmFyIGU7ZG8gZT10LHQ9dC5yZXBsYWNlKC8oPCEtLS4qPy0tIT8+KXwoPCEtLVtcU1xzXSs/LS0hPz4pfCg8IS0tW1xTXHNdKj8kKS9nLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIHR9O3RlLnN0cmlwSHRtbFNjcmlwdD1mdW5jdGlvbih0KXt2YXIgZTtkbyBlPXQsdD10LnJlcGxhY2UoLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0W14+XSo+KTxbXjxdKikqPFwvc2NyaXB0W14+XSo+L2dpLCIiKTt3aGlsZSh0IT09ZSk7cmV0dXJuIHR9O3RlLmRlZmF1bHRzPXtidXR0b25zOlsiY29weSIsImV4Y2VsIiwiY3N2IiwicGRmIiwicHJpbnQiXSxuYW1lOiJtYWluIix0YWJJbmRleDowLGRvbTp7Y29udGFpbmVyOnt0YWc6ImRpdiIsY2xhc3NOYW1lOiJkdC1idXR0b25zIn0sY29sbGVjdGlvbjp7YWN0aW9uOntkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nfSxjb250YWluZXI6e2NsYXNzTmFtZToiZHQtYnV0dG9uLWNvbGxlY3Rpb24iLGNvbnRlbnQ6e2NsYXNzTmFtZToiIix0YWc6ImRpdiJ9LHRhZzoiZGl2In19LGJ1dHRvbjp7dGFnOiJidXR0b24iLGNsYXNzTmFtZToiZHQtYnV0dG9uIixhY3RpdmU6ImR0LWJ1dHRvbi1hY3RpdmUiLGRpc2FibGVkOiJkaXNhYmxlZCIsc3BhY2VyOntjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGFjZXIiLHRhZzoic3BhbiJ9LGxpbmVyOnt0YWc6InNwYW4iLGNsYXNzTmFtZToiIn19LHNwbGl0OnthY3Rpb246e2NsYXNzTmFtZToiZHQtYnV0dG9uLXNwbGl0LWRyb3AtYnV0dG9uIGR0LWJ1dHRvbiIsdGFnOiJidXR0b24ifSxkcm9wZG93bjp7YWxpZ246InNwbGl0LXJpZ2h0IixjbGFzc05hbWU6ImR0LWJ1dHRvbi1zcGxpdC1kcm9wIixkcm9wSHRtbDonPHNwYW4gY2xhc3M9ImR0LWJ1dHRvbi1kb3duLWFycm93Ij4mI3gyNUJDOzwvc3Bhbj4nLHNwbGl0QWxpZ25DbGFzczoiZHQtYnV0dG9uLXNwbGl0LWxlZnQiLHRhZzoiYnV0dG9uIn0sd3JhcHBlcjp7Y2xhc3NOYW1lOiJkdC1idXR0b24tc3BsaXQiLHRhZzoiZGl2In19fX07dGUudmVyc2lvbj0iMy4xLjIiO2h0LmV4dGVuZChTZSx7Y29sbGVjdGlvbjp7dGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIil9LGNsYXNzTmFtZToiYnV0dG9ucy1jb2xsZWN0aW9uIixjbG9zZUJ1dHRvbjohMSxpbml0OmZ1bmN0aW9uKHQsZSl7ZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXtyLl9jb2xsZWN0aW9uLnBhcmVudHMoImJvZHkiKS5sZW5ndGg/dGhpcy5wb3BvdmVyKCExLHIpOnRoaXMucG9wb3ZlcihyLl9jb2xsZWN0aW9uLHIpLHQudHlwZT09PSJrZXlwcmVzcyImJmh0KCJhLCBidXR0b24iLHIuX2NvbGxlY3Rpb24pLmVxKDApLmZvY3VzKCl9LGF0dHI6eyJhcmlhLWhhc3BvcHVwIjoiZGlhbG9nIn19LHNwbGl0Ont0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuc3BsaXQiLCJTcGxpdCIpfSxjbGFzc05hbWU6ImJ1dHRvbnMtc3BsaXQiLGNsb3NlQnV0dG9uOiExLGluaXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5hdHRyKCJhcmlhLWV4cGFuZGVkIiwhMSl9LGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXt0aGlzLnBvcG92ZXIoci5fY29sbGVjdGlvbixyKX0sYXR0cjp7ImFyaWEtaGFzcG9wdXAiOiJkaWFsb2cifX0sY29weTpmdW5jdGlvbigpe2lmKFNlLmNvcHlIdG1sNSlyZXR1cm4iY29weUh0bWw1In0sY3N2OmZ1bmN0aW9uKHQsZSl7aWYoU2UuY3N2SHRtbDUmJlNlLmNzdkh0bWw1LmF2YWlsYWJsZSh0LGUpKXJldHVybiJjc3ZIdG1sNSJ9LGV4Y2VsOmZ1bmN0aW9uKHQsZSl7aWYoU2UuZXhjZWxIdG1sNSYmU2UuZXhjZWxIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4iZXhjZWxIdG1sNSJ9LHBkZjpmdW5jdGlvbih0LGUpe2lmKFNlLnBkZkh0bWw1JiZTZS5wZGZIdG1sNS5hdmFpbGFibGUodCxlKSlyZXR1cm4icGRmSHRtbDUifSxwYWdlTGVuZ3RoOmZ1bmN0aW9uKHQpe3ZhciBlPXQuc2V0dGluZ3MoKVswXS5hTGVuZ3RoTWVudSxuPVtdLHI9W10scz1mdW5jdGlvbih1KXtyZXR1cm4gdS5pMThuKCJidXR0b25zLnBhZ2VMZW5ndGgiLHsiLTEiOiJTaG93IGFsbCByb3dzIixfOiJTaG93ICVkIHJvd3MifSx1LnBhZ2UubGVuKCkpfTtpZihBcnJheS5pc0FycmF5KGVbMF0pKW49ZVswXSxyPWVbMV07ZWxzZSBmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtodC5pc1BsYWluT2JqZWN0KG8pPyhuLnB1c2goby52YWx1ZSksci5wdXNoKG8ubGFiZWwpKToobi5wdXNoKG8pLHIucHVzaChvKSl9cmV0dXJue2V4dGVuZDoiY29sbGVjdGlvbiIsdGV4dDpzLGNsYXNzTmFtZToiYnV0dG9ucy1wYWdlLWxlbmd0aCIsYXV0b0Nsb3NlOiEwLGJ1dHRvbnM6aHQubWFwKG4sZnVuY3Rpb24odSxwKXtyZXR1cm57dGV4dDpyW3BdLGNsYXNzTmFtZToiYnV0dG9uLXBhZ2UtbGVuZ3RoIixhY3Rpb246ZnVuY3Rpb24oYixnKXtnLnBhZ2UubGVuKHUpLmRyYXcoKX0saW5pdDpmdW5jdGlvbihiLGcsbSl7dmFyIEM9dGhpcyx5PWZ1bmN0aW9uKCl7Qy5hY3RpdmUoYi5wYWdlLmxlbigpPT09dSl9O2Iub24oImxlbmd0aC5kdCIrbS5uYW1lc3BhY2UseSkseSgpfSxkZXN0cm95OmZ1bmN0aW9uKGIsZyxtKXtiLm9mZigibGVuZ3RoLmR0IittLm5hbWVzcGFjZSl9fX0pLGluaXQ6ZnVuY3Rpb24odSxwLGIpe3ZhciBnPXRoaXM7dS5vbigibGVuZ3RoLmR0IitiLm5hbWVzcGFjZSxmdW5jdGlvbigpe2cudGV4dChiLnRleHQpfSl9LGRlc3Ryb3k6ZnVuY3Rpb24odSxwLGIpe3Uub2ZmKCJsZW5ndGguZHQiK2IubmFtZXNwYWNlKX19fSxzcGFjZXI6e3N0eWxlOiJlbXB0eSIsc3BhY2VyOiEwLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5zcGFjZXIiLCIiKX19fSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkiLGZ1bmN0aW9uKHQsZSl7ZT09PXZvaWQgMCYmKGU9dCx0PXZvaWQgMCksdGhpcy5zZWxlY3Rvci5idXR0b25Hcm91cD10O3ZhciBuPXRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihyKXtpZihyLl9idXR0b25zKXJldHVybiB0ZS5idXR0b25TZWxlY3Rvcih0ZS5pbnN0YW5jZVNlbGVjdG9yKHQsci5fYnV0dG9ucyksZSl9LCEwKTtyZXR1cm4gbi5fZ3JvdXBTZWxlY3Rvcj10LG59KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpIixmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuYnV0dG9ucyh0LGUpO3JldHVybiBuLmxlbmd0aD4xJiZuLnNwbGljZSgxLG4ubGVuZ3RoKSxufSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aXZlKCkiLCJidXR0b24oKS5hY3RpdmUoKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3RpdmUoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aXZlKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuYWN0aW9uKCkiLCJidXR0b24oKS5hY3Rpb24oKSIsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5zdC5hY3Rpb24oZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuYWN0aW9uKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkuY29sbGVjdGlvblJlYnVpbGQoKSIsImJ1dHRvbigpLmNvbGxlY3Rpb25SZWJ1aWxkKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspdHlwZW9mIHRbbl09PSJvYmplY3QiJiYodFtuXS5wYXJlbnRDb25mPWUpO2UuaW5zdC5jb2xsZWN0aW9uUmVidWlsZChlLm5vZGUsdCl9KX0pO2F0LkFwaS5yZWdpc3RlcihbImJ1dHRvbnMoKS5lbmFibGUoKSIsImJ1dHRvbigpLmVuYWJsZSgpIl0sZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QuZW5hYmxlKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyKFsiYnV0dG9ucygpLmRpc2FibGUoKSIsImJ1dHRvbigpLmRpc2FibGUoKSJdLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt0Lmluc3QuZGlzYWJsZSh0Lm5vZGUpfSl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbigpLmluZGV4KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9bnVsbDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuaW5zdC5pbmRleChlLm5vZGUpO24hPT1udWxsJiYodD1uKX0pLHR9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5ub2RlcygpIiwiYnV0dG9uKCkubm9kZSgpIixmdW5jdGlvbigpe3ZhciB0PWh0KCk7cmV0dXJuIGh0KHRoaXMuZWFjaChmdW5jdGlvbihlKXt0PXQuYWRkKGUuaW5zdC5ub2RlKGUubm9kZSkpfSkpLHR9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5wcm9jZXNzaW5nKCkiLCJidXR0b24oKS5wcm9jZXNzaW5nKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmluc3QucHJvY2Vzc2luZyhlLm5vZGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe2UuaW5zdC5wcm9jZXNzaW5nKGUubm9kZSx0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyUGx1cmFsKCJidXR0b25zKCkudGV4dCgpIiwiYnV0dG9uKCkudGV4dCgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbnN0LnRleHQoZS5ub2RlKX0pOnRoaXMuZWFjaChmdW5jdGlvbihlKXtlLmluc3QudGV4dChlLm5vZGUsdCl9KX0pO2F0LkFwaS5yZWdpc3RlclBsdXJhbCgiYnV0dG9ucygpLnRyaWdnZXIoKSIsImJ1dHRvbigpLnRyaWdnZXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5ub2RlKHQubm9kZSkudHJpZ2dlcigiY2xpY2siKX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b24oKS5wb3BvdmVyKCkiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLmluc3QuX3BvcG92ZXIodCx0aGlzLmJ1dHRvbih0aGlzWzBdLm5vZGUpLGUpfSl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMoKS5jb250YWluZXJzKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9aHQoKSxlPXRoaXMuX2dyb3VwU2VsZWN0b3I7cmV0dXJuIHRoaXMuaXRlcmF0b3IoITAsInRhYmxlIixmdW5jdGlvbihuKXtpZihuLl9idXR0b25zKWZvcih2YXIgcj10ZS5pbnN0YW5jZVNlbGVjdG9yKGUsbi5fYnV0dG9ucykscz0wLGk9ci5sZW5ndGg7czxpO3MrKyl0PXQuYWRkKHJbc10uY29udGFpbmVyKCkpfSksdH0pO2F0LkFwaS5yZWdpc3RlcigiYnV0dG9ucygpLmNvbnRhaW5lcigpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcnMoKS5lcSgwKX0pO2F0LkFwaS5yZWdpc3RlcigiYnV0dG9uKCkuYWRkKCkiLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLmNvbnRleHQ7aWYoci5sZW5ndGgpe3ZhciBzPXRlLmluc3RhbmNlU2VsZWN0b3IodGhpcy5fZ3JvdXBTZWxlY3RvcixyWzBdLl9idXR0b25zKTtzLmxlbmd0aCYmc1swXS5hZGQoZSx0LG4pfXJldHVybiB0aGlzLmJ1dHRvbih0aGlzLl9ncm91cFNlbGVjdG9yLHQpfSk7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zKCkuZGVzdHJveSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsdWNrKCJpbnN0IikudW5pcXVlKCkuZWFjaChmdW5jdGlvbih0KXt0LmRlc3Ryb3koKX0pLHRoaXN9KTthdC5BcGkucmVnaXN0ZXJQbHVyYWwoImJ1dHRvbnMoKS5yZW1vdmUoKSIsImJ1dHRvbnMoKS5yZW1vdmUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3QuaW5zdC5yZW1vdmUodC5ub2RlKX0pLHRoaXN9KTt2YXIgYXI7YXQuQXBpLnJlZ2lzdGVyKCJidXR0b25zLmluZm8oKSIsZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7cmV0dXJuIHQ9PT0hMT8odGhpcy5vZmYoImRlc3Ryb3kuYnRuLWluZm8iKSxZaShodCgiI2RhdGF0YWJsZXNfYnV0dG9uc19pbmZvIiksNDAwLGZ1bmN0aW9uKCl7aHQodGhpcykucmVtb3ZlKCl9KSxjbGVhclRpbWVvdXQoYXIpLGFyPW51bGwsdGhpcyk6KGFyJiZjbGVhclRpbWVvdXQoYXIpLGh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5sZW5ndGgmJmh0KCIjZGF0YXRhYmxlc19idXR0b25zX2luZm8iKS5yZW1vdmUoKSx0PXQ/IjxoMj4iK3QrIjwvaDI+IjoiIixYaShodCgnPGRpdiBpZD0iZGF0YXRhYmxlc19idXR0b25zX2luZm8iIGNsYXNzPSJkdC1idXR0b24taW5mbyIvPicpLmh0bWwodCkuYXBwZW5kKGh0KCI8ZGl2Lz4iKVt0eXBlb2YgZT09InN0cmluZyI/Imh0bWwiOiJhcHBlbmQiXShlKSkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLmFwcGVuZFRvKCJib2R5IikpLG4hPT12b2lkIDAmJm4hPT0wJiYoYXI9c2V0VGltZW91dChmdW5jdGlvbigpe3IuYnV0dG9ucy5pbmZvKCExKX0sbikpLHRoaXMub24oImRlc3Ryb3kuYnRuLWluZm8iLGZ1bmN0aW9uKCl7ci5idXR0b25zLmluZm8oITEpfSksdGhpcyl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0RGF0YSgpIixmdW5jdGlvbih0KXtpZih0aGlzLmNvbnRleHQubGVuZ3RoKXJldHVybiBZbChuZXcgYXQuQXBpKHRoaXMuY29udGV4dFswXSksdCl9KTthdC5BcGkucmVnaXN0ZXIoImJ1dHRvbnMuZXhwb3J0SW5mbygpIixmdW5jdGlvbih0KXtyZXR1cm4gdHx8KHQ9e30pLHtmaWxlbmFtZTpxbCh0LHRoaXMpLHRpdGxlOlhsKHQsdGhpcyksbWVzc2FnZVRvcDpEcyh0aGlzLHQsdC5tZXNzYWdlfHx0Lm1lc3NhZ2VUb3AsInRvcCIpLG1lc3NhZ2VCb3R0b206RHModGhpcyx0LHQubWVzc2FnZUJvdHRvbSwiYm90dG9tIil9fSk7dmFyIHFsPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5maWxlbmFtZT09PSIqIiYmdC50aXRsZSE9PSIqIiYmdC50aXRsZSE9PXZvaWQgMCYmdC50aXRsZSE9PW51bGwmJnQudGl0bGUhPT0iIj90LnRpdGxlOnQuZmlsZW5hbWU7aWYodHlwZW9mIG49PSJmdW5jdGlvbiImJihuPW4odCxlKSksbj09bnVsbClyZXR1cm4gbnVsbDtuLmluZGV4T2YoIioiKSE9PS0xJiYobj1uLnJlcGxhY2UoL1wqL2csaHQoImhlYWQgPiB0aXRsZSIpLnRleHQoKSkudHJpbSgpKSxuPW4ucmVwbGFjZSgvW15hLXpBLVowLTlfXHUwMEExLVx1RkZGRlwuLFwtXyAhXChcKV0vZywiIik7dmFyIHI9JGkodC5leHRlbnNpb24sdCxlKTtyZXR1cm4gcnx8KHI9IiIpLG4rcn0sJGk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PT1udWxsP251bGw6dHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlLG4pOnR9LFhsPWZ1bmN0aW9uKHQsZSl7dmFyIG49JGkodC50aXRsZSx0LGUpO3JldHVybiBuPT09bnVsbD9udWxsOm4uaW5kZXhPZigiKiIpIT09LTE/bi5yZXBsYWNlKC9cKi9nLGh0KCJoZWFkID4gdGl0bGUiKS50ZXh0KCl8fCJFeHBvcnRlZCBkYXRhIik6bn0sRHM9ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9JGkobixlLHQpO2lmKHM9PT1udWxsKXJldHVybiBudWxsO3ZhciBpPWh0KCJjYXB0aW9uIix0LnRhYmxlKCkuY29udGFpbmVyKCkpLmVxKDApO2lmKHM9PT0iKiIpe3ZhciBvPWkuY3NzKCJjYXB0aW9uLXNpZGUiKTtyZXR1cm4gbyE9PXI/bnVsbDppLmxlbmd0aD9pLnRleHQoKToiIn1yZXR1cm4gc30sQXM9aHQoIjx0ZXh0YXJlYS8+IilbMF0sWWw9ZnVuY3Rpb24odCxlKXt2YXIgbj1odC5leHRlbmQoITAse30se3Jvd3M6bnVsbCxjb2x1bW5zOiIiLG1vZGlmaWVyOntzZWFyY2g6ImFwcGxpZWQiLG9yZGVyOiJhcHBsaWVkIn0sb3J0aG9nb25hbDoiZGlzcGxheSIsc3RyaXBIdG1sOiEwLHN0cmlwTmV3bGluZXM6ITAsZGVjb2RlRW50aXRpZXM6ITAsdHJpbTohMCxmb3JtYXQ6e2hlYWRlcjpmdW5jdGlvbihGKXtyZXR1cm4gdGUuc3RyaXBEYXRhKEYsbil9LGZvb3RlcjpmdW5jdGlvbihGKXtyZXR1cm4gdGUuc3RyaXBEYXRhKEYsbil9LGJvZHk6ZnVuY3Rpb24oRil7cmV0dXJuIHRlLnN0cmlwRGF0YShGLG4pfX0sY3VzdG9taXplRGF0YTpudWxsLGN1c3RvbWl6ZVppcDpudWxsfSxlKSxyPXQuY29sdW1ucyhuLmNvbHVtbnMpLmluZGV4ZXMoKS5tYXAoZnVuY3Rpb24oRil7dmFyIE89dC5jb2x1bW4oRik7cmV0dXJuIG4uZm9ybWF0LmhlYWRlcihPLnRpdGxlKCksRixPLmhlYWRlcigpKX0pLnRvQXJyYXkoKSxzPXQudGFibGUoKS5mb290ZXIoKT90LmNvbHVtbnMobi5jb2x1bW5zKS5pbmRleGVzKCkubWFwKGZ1bmN0aW9uKEYpe3ZhciBPPXQuY29sdW1uKEYpLmZvb3RlcigpLGY9IiI7aWYoTyl7dmFyIFU9aHQoIi5kdC1jb2x1bW4tdGl0bGUiLE8pO2Y9VS5sZW5ndGg/VS5odG1sKCk6aHQoTykuaHRtbCgpfXJldHVybiBuLmZvcm1hdC5mb290ZXIoZixGLE8pfSkudG9BcnJheSgpOm51bGwsaT1odC5leHRlbmQoe30sbi5tb2RpZmllcik7dC5zZWxlY3QmJnR5cGVvZiB0LnNlbGVjdC5pbmZvPT0iZnVuY3Rpb24iJiZpLnNlbGVjdGVkPT09dm9pZCAwJiZ0LnJvd3Mobi5yb3dzLGh0LmV4dGVuZCh7c2VsZWN0ZWQ6ITB9LGkpKS5hbnkoKSYmaHQuZXh0ZW5kKGkse3NlbGVjdGVkOiEwfSk7Zm9yKHZhciBvPXQucm93cyhuLnJvd3MsaSkuaW5kZXhlcygpLnRvQXJyYXkoKSx1PXQuY2VsbHMobyxuLmNvbHVtbnMse29yZGVyOmkub3JkZXJ9KSxwPXUucmVuZGVyKG4ub3J0aG9nb25hbCkudG9BcnJheSgpLGI9dS5ub2RlcygpLnRvQXJyYXkoKSxnPXUuaW5kZXhlcygpLnRvQXJyYXkoKSxtPXQuY29sdW1ucyhuLmNvbHVtbnMpLmNvdW50KCksQz1tPjA/cC5sZW5ndGgvbTowLHk9W10sVD0wLFA9MCxjPUM7UDxjO1ArKyl7Zm9yKHZhciBsPVttXSxoPTA7aDxtO2grKylsW2hdPW4uZm9ybWF0LmJvZHkocFtUXSxnW1RdLnJvdyxnW1RdLmNvbHVtbixiW1RdKSxUKys7eVtQXT1sfXZhciBfPXtoZWFkZXI6cixoZWFkZXJTdHJ1Y3R1cmU6SXMobi5mb3JtYXQuaGVhZGVyLHQudGFibGUoKS5oZWFkZXIuc3RydWN0dXJlKG4uY29sdW1ucykpLGZvb3RlcjpzLGZvb3RlclN0cnVjdHVyZTpJcyhuLmZvcm1hdC5mb290ZXIsdC50YWJsZSgpLmZvb3Rlci5zdHJ1Y3R1cmUobi5jb2x1bW5zKSksYm9keTp5fTtyZXR1cm4gbi5jdXN0b21pemVEYXRhJiZuLmN1c3RvbWl6ZURhdGEoXyksX307ZnVuY3Rpb24gSXModCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylmb3IodmFyIHI9MDtyPGVbbl0ubGVuZ3RoO3IrKyl7dmFyIHM9ZVtuXVtyXTtzJiYocy50aXRsZT10KHMudGl0bGUscixzLmNlbGwpKX1yZXR1cm4gZX1odC5mbi5kYXRhVGFibGUuQnV0dG9ucz10ZTtodC5mbi5EYXRhVGFibGUuQnV0dG9ucz10ZTtodChkb2N1bWVudCkub24oImluaXQuZHQgcGx1Z2luLWluaXQuZHQiLGZ1bmN0aW9uKHQsZSl7aWYodC5uYW1lc3BhY2U9PT0iZHQiKXt2YXIgbj1lLm9Jbml0LmJ1dHRvbnN8fGF0LmRlZmF1bHRzLmJ1dHRvbnM7biYmIWUuX2J1dHRvbnMmJm5ldyB0ZShlLG4pLmNvbnRhaW5lcigpfX0pO2Z1bmN0aW9uIEZzKHQsZSl7dmFyIG49bmV3IGF0LkFwaSh0KSxyPWV8fG4uaW5pdCgpLmJ1dHRvbnN8fGF0LmRlZmF1bHRzLmJ1dHRvbnM7cmV0dXJuIG5ldyB0ZShuLHIpLmNvbnRhaW5lcigpfWF0LmV4dC5mZWF0dXJlLnB1c2goe2ZuSW5pdDpGcyxjRmVhdHVyZToiQiJ9KTthdC5mZWF0dXJlJiZhdC5mZWF0dXJlLnJlZ2lzdGVyKCJidXR0b25zIixGcyk7dmFyIFJzPWllKGFlKCksMSk7dmFyIHNlPVJzLmRlZmF1bHQsTHMsenM7ZnVuY3Rpb24gWmkoKXtyZXR1cm4gTHN8fHdpbmRvdy5KU1ppcH1mdW5jdGlvbiBLaSgpe3JldHVybiB6c3x8d2luZG93LnBkZk1ha2V9YXQuQnV0dG9ucy5wZGZNYWtlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiBLaSgpO3pzPXR9LGF0LkJ1dHRvbnMuanN6aXA9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIFppKCk7THM9dH07dmFyIFdyPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuLHIscyxpLG8sdSxwLGIsZyxtO2lmKCEodD09PXZvaWQgMHx8dHlwZW9mIG5hdmlnYXRvcjwidSImJi9NU0lFIFsxLTldXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpKXJldHVybiBtPXQuZG9jdW1lbnQsZT1mdW5jdGlvbigpe3JldHVybiB0LlVSTHx8dC53ZWJraXRVUkx8fHR9LG49bS5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJhIikscj0iZG93bmxvYWQiaW4gbixzPS9jb25zdHJ1Y3Rvci9pLnRlc3QodC5IVE1MRWxlbWVudCl8fHQuc2FmYXJpLGk9L0NyaU9TXC9bXGRdKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxvPWZ1bmN0aW9uKEMpeyh0LnNldEltbWVkaWF0ZXx8dC5zZXRUaW1lb3V0KShmdW5jdGlvbigpe3Rocm93IEN9LDApfSx1PTRlNCxwPWZ1bmN0aW9uKEMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0eXBlb2YgQz09InN0cmluZyI/ZSgpLnJldm9rZU9iamVjdFVSTChDKTpDLnJlbW92ZSgpfSx1KX0sYj1mdW5jdGlvbihDKXtyZXR1cm4vXlxzKig/OnRleHRcL1xTKnxhcHBsaWNhdGlvblwveG1sfFxTKlwvXFMqXCt4bWwpXHMqOy4qY2hhcnNldFxzKj1ccyp1dGYtOC9pLnRlc3QoQy50eXBlKT9uZXcgQmxvYihbIlx1RkVGRiIsQ10se3R5cGU6Qy50eXBlfSk6Q30sbT0oZz1mdW5jdGlvbihDLHksaCl7aHx8KEM9YihDKSk7dmFyIFAsYyxsPXRoaXMsaD1DLnR5cGU9PT0iYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIixfPWZ1bmN0aW9uKCl7Zm9yKHZhciBGPWwsTz0id3JpdGVzdGFydCBwcm9ncmVzcyB3cml0ZSB3cml0ZWVuZCIuc3BsaXQoIiAiKSxmPXZvaWQgMCxVPShPPVtdLmNvbmNhdChPKSkubGVuZ3RoO1UtLTspe3ZhciBYPUZbIm9uIitPW1VdXTtpZih0eXBlb2YgWD09ImZ1bmN0aW9uIil0cnl7WC5jYWxsKEYsZnx8Ril9Y2F0Y2goUSl7byhRKX19fTtsLnJlYWR5U3RhdGU9bC5JTklULHI/KFA9ZSgpLmNyZWF0ZU9iamVjdFVSTChDKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIEYsTztuLmhyZWY9UCxuLmRvd25sb2FkPXksRj1uLE89bmV3IE1vdXNlRXZlbnQoImNsaWNrIiksRi5kaXNwYXRjaEV2ZW50KE8pLF8oKSxwKFApLGwucmVhZHlTdGF0ZT1sLkRPTkV9KSk6KGl8fGgmJnMpJiZ0LkZpbGVSZWFkZXI/KChjPW5ldyBGaWxlUmVhZGVyKS5vbmxvYWRlbmQ9ZnVuY3Rpb24oKXt2YXIgRj1pP2MucmVzdWx0OmMucmVzdWx0LnJlcGxhY2UoL15kYXRhOlteO10qOy8sImRhdGE6YXR0YWNobWVudC9maWxlOyIpO3Qub3BlbihGLCJfYmxhbmsiKXx8KHQubG9jYXRpb24uaHJlZj1GKSxsLnJlYWR5U3RhdGU9bC5ET05FLF8oKX0sYy5yZWFkQXNEYXRhVVJMKEMpLGwucmVhZHlTdGF0ZT1sLklOSVQpOihQPVB8fGUoKS5jcmVhdGVPYmplY3RVUkwoQyksIWgmJnQub3BlbihQLCJfYmxhbmsiKXx8KHQubG9jYXRpb24uaHJlZj1QKSxsLnJlYWR5U3RhdGU9bC5ET05FLF8oKSxwKFApKX0pLnByb3RvdHlwZSx0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2I/ZnVuY3Rpb24oQyx5LFQpe3JldHVybiB5PXl8fEMubmFtZXx8ImRvd25sb2FkIixUfHwoQz1iKEMpKSxuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihDLHkpfToobS5hYm9ydD1mdW5jdGlvbigpe30sbS5yZWFkeVN0YXRlPW0uSU5JVD0wLG0uV1JJVElORz0xLG0uRE9ORT0yLG0uZXJyb3I9bS5vbndyaXRlc3RhcnQ9bS5vbnByb2dyZXNzPW0ub253cml0ZT1tLm9uYWJvcnQ9bS5vbmVycm9yPW0ub253cml0ZWVuZD1udWxsLGZ1bmN0aW9uKEMseSxUKXtyZXR1cm4gbmV3IGcoQyx5fHxDLm5hbWV8fCJkb3dubG9hZCIsVCl9KX0odHlwZW9mIHNlbGY8InUiJiZzZWxmfHx0eXBlb2Ygd2luZG93PCJ1IiYmd2luZG93fHwodm9pZCAwKS5jb250ZW50KSxCcz0oYXQuZmlsZVNhdmU9V3IsZnVuY3Rpb24odCl7dmFyIGU9IlNoZWV0MSI7cmV0dXJuIGU9dC5zaGVldE5hbWU/dC5zaGVldE5hbWUucmVwbGFjZSgvW1xbXF1cKlwvXFxcP1w6XS9nLCIiKTplfSksanM9ZnVuY3Rpb24odCl7cmV0dXJuIHQubmV3bGluZXx8KG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbmRvd3MvKT9gXHIKYDpgCmApfSxOcz1mdW5jdGlvbihiLGUpe2Z1bmN0aW9uIG4oVCl7Zm9yKHZhciBQPSIiLGM9MCxsPVQubGVuZ3RoO2M8bDtjKyspMDxjJiYoUCs9byksUCs9aT9pKygiIitUW2NdKS5yZXBsYWNlKHUscCtpKStpOlRbY107cmV0dXJuIFB9dmFyIHI9anMoZSkscz1iLmJ1dHRvbnMuZXhwb3J0RGF0YShlLmV4cG9ydE9wdGlvbnMpLGk9ZS5maWVsZEJvdW5kYXJ5LG89ZS5maWVsZFNlcGFyYXRvcix1PW5ldyBSZWdFeHAoaSwiZyIpLHA9ZS5lc2NhcGVDaGFyIT09dm9pZCAwP2UuZXNjYXBlQ2hhcjoiXFwiLGI9IiIsZz0iIixtPVtdO2UuaGVhZGVyJiYoYj1zLmhlYWRlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIG4oVC5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrciksZS5mb290ZXImJnMuZm9vdGVyJiYoZz1zLmZvb3RlclN0cnVjdHVyZS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIG4oVC5tYXAoZnVuY3Rpb24oUCl7cmV0dXJuIFA/UC50aXRsZToiIn0pKX0pLmpvaW4ocikrcik7Zm9yKHZhciBDPTAseT1zLmJvZHkubGVuZ3RoO0M8eTtDKyspbS5wdXNoKG4ocy5ib2R5W0NdKSk7cmV0dXJue3N0cjpiK20uam9pbihyKStyK2cscm93czptLmxlbmd0aH19LE9zPWZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiU2FmYXJpIikhPT0tMSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJDaHJvbWUiKT09PS0xJiZuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIik9PT0tMSYmISEoKHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQXBwbGVXZWJLaXRcLyhcZCtcLlxkKykvKSkmJjE8dC5sZW5ndGgmJit0WzFdPDYwMy4xKX07ZnVuY3Rpb24gb3IodCl7Zm9yKHZhciBlPTY1LG49OTAtZSsxLHI9IiI7MDw9dDspcj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQlbitlKStyLHQ9TWF0aC5mbG9vcih0L24pLTE7cmV0dXJuIHJ9dHJ5e0dyPW5ldyBYTUxTZXJpYWxpemVyfWNhdGNoe312YXIgc3IsR3I7ZnVuY3Rpb24gTXModCxlKXtzcj09PXZvaWQgMCYmKHNyPUdyLnNlcmlhbGl6ZVRvU3RyaW5nKG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKFZzWyJ4bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiXSwidGV4dC94bWwiKSkuaW5kZXhPZigieG1sbnM6ciIpPT09LTEpLHNlLmVhY2goZSxmdW5jdGlvbihuLHIpe2lmKHNlLmlzUGxhaW5PYmplY3QocikpTXModC5mb2xkZXIobikscik7ZWxzZXtpZihzcil7Zm9yKHZhciBzLGk9ci5jaGlsZE5vZGVzWzBdLG89W10sdT1pLmF0dHJpYnV0ZXMubGVuZ3RoLTE7MDw9dTt1LS0pe3ZhciBwPWkuYXR0cmlidXRlc1t1XS5ub2RlTmFtZSxiPWkuYXR0cmlidXRlc1t1XS5ub2RlVmFsdWU7cC5pbmRleE9mKCI6IikhPT0tMSYmKG8ucHVzaCh7bmFtZTpwLHZhbHVlOmJ9KSxpLnJlbW92ZUF0dHJpYnV0ZShwKSl9Zm9yKHU9MCxzPW8ubGVuZ3RoO3U8czt1Kyspe3ZhciBnPXIuY3JlYXRlQXR0cmlidXRlKG9bdV0ubmFtZS5yZXBsYWNlKCI6IiwiX2R0X2JfbmFtZXNwYWNlX3Rva2VuXyIpKTtnLnZhbHVlPW9bdV0udmFsdWUsaS5zZXRBdHRyaWJ1dGVOb2RlKGcpfX12YXIgbT1Hci5zZXJpYWxpemVUb1N0cmluZyhyKSxtPShtPXNyPyhtPShtPW0uaW5kZXhPZigiPD94bWwiKT09PS0xPyc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+JyttOm0pLnJlcGxhY2UoL19kdF9iX25hbWVzcGFjZV90b2tlbl8vZywiOiIpKS5yZXBsYWNlKC94bWxuczpOU1tcZF0rPSIiIE5TW1xkXSs6L2csIiIpOm0pLnJlcGxhY2UoLzwoW148Pl0qPykgeG1sbnM9IiIoW148Pl0qPyk+L2csIjwkMSAkMj4iKTt0LmZpbGUobixtKX19KX1mdW5jdGlvbiBEZSh0LGUsbil7dmFyIHI9dC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBuJiYobi5hdHRyJiZzZShyKS5hdHRyKG4uYXR0ciksbi5jaGlsZHJlbiYmc2UuZWFjaChuLmNoaWxkcmVuLGZ1bmN0aW9uKHMsaSl7ci5hcHBlbmRDaGlsZChpKX0pLG4udGV4dCE9PW51bGwpJiZuLnRleHQhPT12b2lkIDAmJnIuYXBwZW5kQ2hpbGQodC5jcmVhdGVUZXh0Tm9kZShuLnRleHQpKSxyfWZ1bmN0aW9uIFpsKHQsZSl7dmFyIG49dC5oZWFkZXJbZV0ubGVuZ3RoO3QuZm9vdGVyJiZ0LmZvb3RlcltlXSYmdC5mb290ZXJbZV0ubGVuZ3RoPm4mJihuPXQuZm9vdGVyW2VdLmxlbmd0aCk7Zm9yKHZhciByPTAscz10LmJvZHkubGVuZ3RoO3I8cztyKyspe3ZhciBpLG89dC5ib2R5W3JdW2VdO2lmKDQwPChuPW48KGk9KChvPW8hPW51bGw/by50b1N0cmluZygpOiIiKS5pbmRleE9mKGAKYCkhPT0tMT8oKGk9by5zcGxpdChgCmApKS5zb3J0KGZ1bmN0aW9uKHUscCl7cmV0dXJuIHAubGVuZ3RoLXUubGVuZ3RofSksaVswXSk6bykubGVuZ3RoKT9pOm4pKXJldHVybiA1NH1yZXR1cm4gNjwobio9MS4zNSk/bjo2fXZhciBWcz17Il9yZWxzLy5yZWxzIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiIFRhcmdldD0ieGwvd29ya2Jvb2sueG1sIi8+PC9SZWxhdGlvbnNoaXBzPicsInhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvd29ya3NoZWV0IiBUYXJnZXQ9IndvcmtzaGVldHMvc2hlZXQxLnhtbCIvPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDIiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvc3R5bGVzIiBUYXJnZXQ9InN0eWxlcy54bWwiLz48L1JlbGF0aW9uc2hpcHM+JywiW0NvbnRlbnRfVHlwZXNdLnhtbCI6Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz48VHlwZXMgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlcyI+PERlZmF1bHQgRXh0ZW5zaW9uPSJ4bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi94bWwiIC8+PERlZmF1bHQgRXh0ZW5zaW9uPSJyZWxzIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UucmVsYXRpb25zaGlwcyt4bWwiIC8+PERlZmF1bHQgRXh0ZW5zaW9uPSJqcGVnIiBDb250ZW50VHlwZT0iaW1hZ2UvanBlZyIgLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3JrYm9vay54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbCIgLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3Jrc2hlZXRzL3NoZWV0MS54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIiAvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3N0eWxlcy54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zdHlsZXMreG1sIiAvPjwvVHlwZXM+JywieGwvd29ya2Jvb2sueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjx3b3JrYm9vayB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIj48ZmlsZVZlcnNpb24gYXBwTmFtZT0ieGwiIGxhc3RFZGl0ZWQ9IjUiIGxvd2VzdEVkaXRlZD0iNSIgcnVwQnVpbGQ9IjI0ODE2Ii8+PHdvcmtib29rUHIgc2hvd0lua0Fubm90YXRpb249IjAiIGF1dG9Db21wcmVzc1BpY3R1cmVzPSIwIi8+PGJvb2tWaWV3cz48d29ya2Jvb2tWaWV3IHhXaW5kb3c9IjAiIHlXaW5kb3c9IjAiIHdpbmRvd1dpZHRoPSIyNTYwMCIgd2luZG93SGVpZ2h0PSIxOTAyMCIgdGFiUmF0aW89IjUwMCIvPjwvYm9va1ZpZXdzPjxzaGVldHM+PHNoZWV0IG5hbWU9IlNoZWV0MSIgc2hlZXRJZD0iMSIgcjppZD0icklkMSIvPjwvc2hlZXRzPjxkZWZpbmVkTmFtZXMvPjwvd29ya2Jvb2s+JywieGwvd29ya3NoZWV0cy9zaGVldDEueG1sIjonPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pjx3b3Jrc2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIgeG1sbnM6cj0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyIgeG1sbnM6bWM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2IiBtYzpJZ25vcmFibGU9IngxNGFjIiB4bWxuczp4MTRhYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWMiPjxzaGVldERhdGEvPjxtZXJnZUNlbGxzIGNvdW50PSIwIi8+PC93b3Jrc2hlZXQ+JywieGwvc3R5bGVzLnhtbCI6Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHN0eWxlU2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiIgeG1sbnM6bWM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9tYXJrdXAtY29tcGF0aWJpbGl0eS8yMDA2IiBtYzpJZ25vcmFibGU9IngxNGFjIiB4bWxuczp4MTRhYz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvc3ByZWFkc2hlZXRtbC8yMDA5LzkvYWMiPjxudW1GbXRzIGNvdW50PSI2Ij48bnVtRm10IG51bUZtdElkPSIxNjQiIGZvcm1hdENvZGU9IlskJC00MDldIywjIzAuMDA7LVskJC00MDldIywjIzAuMDAiLz48bnVtRm10IG51bUZtdElkPSIxNjUiIGZvcm1hdENvZGU9IiZxdW90O1x4QTMmcXVvdDsjLCMjMC4wMCIvPjxudW1GbXQgbnVtRm10SWQ9IjE2NiIgZm9ybWF0Q29kZT0iWyRcdTIwQUMtMl0gIywjIzAuMDAiLz48bnVtRm10IG51bUZtdElkPSIxNjciIGZvcm1hdENvZGU9IjAuMCUiLz48bnVtRm10IG51bUZtdElkPSIxNjgiIGZvcm1hdENvZGU9IiMsIyMwOygjLCMjMCkiLz48bnVtRm10IG51bUZtdElkPSIxNjkiIGZvcm1hdENvZGU9IiMsIyMwLjAwOygjLCMjMC4wMCkiLz48L251bUZtdHM+PGZvbnRzIGNvdW50PSI1IiB4MTRhYzprbm93bkZvbnRzPSIxIj48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48Y29sb3IgcmdiPSJGRkZGRkZGRiIgLz48L2ZvbnQ+PGZvbnQ+PHN6IHZhbD0iMTEiIC8+PG5hbWUgdmFsPSJDYWxpYnJpIiAvPjxiIC8+PC9mb250Pjxmb250PjxzeiB2YWw9IjExIiAvPjxuYW1lIHZhbD0iQ2FsaWJyaSIgLz48aSAvPjwvZm9udD48Zm9udD48c3ogdmFsPSIxMSIgLz48bmFtZSB2YWw9IkNhbGlicmkiIC8+PHUgLz48L2ZvbnQ+PC9mb250cz48ZmlsbHMgY291bnQ9IjYiPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ibm9uZSIgLz48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJub25lIiAvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9IkZGRDlEOUQ5IiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT0ic29saWQiPjxmZ0NvbG9yIHJnYj0iRkZEOTk3OTUiIC8+PGJnQ29sb3IgaW5kZXhlZD0iNjQiIC8+PC9wYXR0ZXJuRmlsbD48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPSJzb2xpZCI+PGZnQ29sb3IgcmdiPSJmZmM2ZWZjZSIgLz48YmdDb2xvciBpbmRleGVkPSI2NCIgLz48L3BhdHRlcm5GaWxsPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9InNvbGlkIj48ZmdDb2xvciByZ2I9ImZmYzZjZmVmIiAvPjxiZ0NvbG9yIGluZGV4ZWQ9IjY0IiAvPjwvcGF0dGVybkZpbGw+PC9maWxsPjwvZmlsbHM+PGJvcmRlcnMgY291bnQ9IjIiPjxib3JkZXI+PGxlZnQgLz48cmlnaHQgLz48dG9wIC8+PGJvdHRvbSAvPjxkaWFnb25hbCAvPjwvYm9yZGVyPjxib3JkZXIgZGlhZ29uYWxVcD0iZmFsc2UiIGRpYWdvbmFsRG93bj0iZmFsc2UiPjxsZWZ0IHN0eWxlPSJ0aGluIj48Y29sb3IgYXV0bz0iMSIgLz48L2xlZnQ+PHJpZ2h0IHN0eWxlPSJ0aGluIj48Y29sb3IgYXV0bz0iMSIgLz48L3JpZ2h0Pjx0b3Agc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvdG9wPjxib3R0b20gc3R5bGU9InRoaW4iPjxjb2xvciBhdXRvPSIxIiAvPjwvYm90dG9tPjxkaWFnb25hbCAvPjwvYm9yZGVyPjwvYm9yZGVycz48Y2VsbFN0eWxlWGZzIGNvdW50PSIxIj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgLz48L2NlbGxTdHlsZVhmcz48Y2VsbFhmcyBjb3VudD0iNjgiPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIyIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIzIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSI1IiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSIwIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iMiIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjIiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSIyIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIxIiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMiIgZmlsbElkPSIzIiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjMiIGZpbGxJZD0iMyIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSI0IiBmaWxsSWQ9IjMiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjEiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIyIiBmaWxsSWQ9IjQiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMyIgZmlsbElkPSI0IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjQiIGZpbGxJZD0iNCIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIwIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMSIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjIiIGZpbGxJZD0iNSIgYm9yZGVySWQ9IjEiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIvPjx4ZiBudW1GbXRJZD0iMCIgZm9udElkPSIzIiBmaWxsSWQ9IjUiIGJvcmRlcklkPSIxIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiLz48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iNCIgZmlsbElkPSI1IiBib3JkZXJJZD0iMSIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIi8+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0ibGVmdCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0iY2VudGVyIi8+PC94Zj48eGYgbnVtRm10SWQ9IjAiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseUFsaWdubWVudD0iMSI+PGFsaWdubWVudCBob3Jpem9udGFsPSJyaWdodCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgaG9yaXpvbnRhbD0iZmlsbCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgdGV4dFJvdGF0aW9uPSI5MCIvPjwveGY+PHhmIG51bUZtdElkPSIwIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlBbGlnbm1lbnQ9IjEiPjxhbGlnbm1lbnQgd3JhcFRleHQ9IjEiLz48L3hmPjx4ZiBudW1GbXRJZD0iOSIgICBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjUiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY2IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjE2NyIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxNjgiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTY5IiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjMiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iNCIgZm9udElkPSIwIiBmaWxsSWQ9IjAiIGJvcmRlcklkPSIwIiBhcHBseUZvbnQ9IjEiIGFwcGx5RmlsbD0iMSIgYXBwbHlCb3JkZXI9IjEiIHhmSWQ9IjAiIGFwcGx5TnVtYmVyRm9ybWF0PSIxIi8+PHhmIG51bUZtdElkPSIxIiBmb250SWQ9IjAiIGZpbGxJZD0iMCIgYm9yZGVySWQ9IjAiIGFwcGx5Rm9udD0iMSIgYXBwbHlGaWxsPSIxIiBhcHBseUJvcmRlcj0iMSIgeGZJZD0iMCIgYXBwbHlOdW1iZXJGb3JtYXQ9IjEiLz48eGYgbnVtRm10SWQ9IjIiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjx4ZiBudW1GbXRJZD0iMTQiIGZvbnRJZD0iMCIgZmlsbElkPSIwIiBib3JkZXJJZD0iMCIgYXBwbHlGb250PSIxIiBhcHBseUZpbGw9IjEiIGFwcGx5Qm9yZGVyPSIxIiB4ZklkPSIwIiBhcHBseU51bWJlckZvcm1hdD0iMSIvPjwvY2VsbFhmcz48Y2VsbFN0eWxlcyBjb3VudD0iMSI+PGNlbGxTdHlsZSBuYW1lPSJOb3JtYWwiIHhmSWQ9IjAiIGJ1aWx0aW5JZD0iMCIgLz48L2NlbGxTdHlsZXM+PGR4ZnMgY291bnQ9IjAiIC8+PHRhYmxlU3R5bGVzIGNvdW50PSIwIiBkZWZhdWx0VGFibGVTdHlsZT0iVGFibGVTdHlsZU1lZGl1bTkiIGRlZmF1bHRQaXZvdFN0eWxlPSJQaXZvdFN0eWxlTWVkaXVtNCIgLz48L3N0eWxlU2hlZXQ+J30sRXM9W3ttYXRjaDovXlwtP1xkK1wuXGQlJC8sc3R5bGU6NjAsZm10OmZ1bmN0aW9uKHQpe3JldHVybiB0LzEwMH19LHttYXRjaDovXlwtP1xkK1wuP1xkKiUkLyxzdHlsZTo1NixmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQvMTAwfX0se21hdGNoOi9eXC0/XCRbXGQsXSsuP1xkKiQvLHN0eWxlOjU3fSx7bWF0Y2g6L15cLT/Co1tcZCxdKy4/XGQqJC8sc3R5bGU6NTh9LHttYXRjaDovXlwtP+KCrFtcZCxdKy4/XGQqJC8sc3R5bGU6NTl9LHttYXRjaDovXlwtP1xkKyQvLHN0eWxlOjY1fSx7bWF0Y2g6L15cLT9cZCtcLlxkezJ9JC8sc3R5bGU6NjZ9LHttYXRjaDovXlwoW1xkLF0rXCkkLyxzdHlsZTo2MSxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuLTEqdC5yZXBsYWNlKC9bXChcKV0vZywiIil9fSx7bWF0Y2g6L15cKFtcZCxdK1wuXGR7Mn1cKSQvLHN0eWxlOjYyLGZtdDpmdW5jdGlvbih0KXtyZXR1cm4tMSp0LnJlcGxhY2UoL1tcKFwpXS9nLCIiKX19LHttYXRjaDovXlwtP1tcZCxdKyQvLHN0eWxlOjYzfSx7bWF0Y2g6L15cLT9bXGQsXStcLlxkezJ9JC8sc3R5bGU6NjR9LHttYXRjaDovXigxOVxkXGR8WzItOV1cZFxkXGQpXC0oMFxkfDFbMDEyXSlcLVswMTIzXVtcZF0kLyxzdHlsZTo2NyxmbXQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQoMjU1NjkrRGF0ZS5wYXJzZSh0KS84NjRlNSl9fV0sVXI9ZnVuY3Rpb24odCxlLG4scixzKXt2YXIgaT1zZSgibWVyZ2VDZWxscyIsdCk7aVswXS5hcHBlbmRDaGlsZChEZSh0LCJtZXJnZUNlbGwiLHthdHRyOntyZWY6b3IobikrZSsiOiIrb3IobitzLTEpKyhlK3ItMSl9fSkpLGkuYXR0cigiY291bnQiLHBhcnNlRmxvYXQoaS5hdHRyKCJjb3VudCIpKSsxKX07YXQuZXh0LmJ1dHRvbnMuY29weUh0bWw1PXtjbGFzc05hbWU6ImJ1dHRvbnMtY29weSBidXR0b25zLWh0bWw1Iix0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuY29weSIsIkNvcHkiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9TnMoZSxyKSxtPWUuYnV0dG9ucy5leHBvcnRJbmZvKHIpLHA9anMociksbz1pLnN0cix1PXNlKCI8ZGl2Lz4iKS5jc3Moe2hlaWdodDoxLHdpZHRoOjEsb3ZlcmZsb3c6ImhpZGRlbiIscG9zaXRpb246ImZpeGVkIix0b3A6MCxsZWZ0OjB9KSxwPShtLnRpdGxlJiYobz1tLnRpdGxlK3ArcCtvKSxtLm1lc3NhZ2VUb3AmJihvPW0ubWVzc2FnZVRvcCtwK3ArbyksbS5tZXNzYWdlQm90dG9tJiYobz1vK3ArcCttLm1lc3NhZ2VCb3R0b20pLHIuY3VzdG9taXplJiYobz1yLmN1c3RvbWl6ZShvLHIsZSkpLHNlKCI8dGV4dGFyZWEgcmVhZG9ubHkvPiIpLnZhbChvKS5hcHBlbmRUbyh1KSk7aWYoZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKCJjb3B5Iikpe3UuYXBwZW5kVG8oZS50YWJsZSgpLmNvbnRhaW5lcigpKSxwWzBdLmZvY3VzKCkscFswXS5zZWxlY3QoKTt0cnl7dmFyIGI9ZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTtpZih1LnJlbW92ZSgpLGIpcmV0dXJuIHIuY29weVN1Y2Nlc3MmJmUuYnV0dG9ucy5pbmZvKGUuaTE4bigiYnV0dG9ucy5jb3B5VGl0bGUiLCJDb3B5IHRvIGNsaXBib2FyZCIpLGUuaTE4bigiYnV0dG9ucy5jb3B5U3VjY2VzcyIsezE6IkNvcGllZCBvbmUgcm93IHRvIGNsaXBib2FyZCIsXzoiQ29waWVkICVkIHJvd3MgdG8gY2xpcGJvYXJkIn0saS5yb3dzKSwyZTMpLHZvaWQgcygpfWNhdGNoe319ZnVuY3Rpb24gZygpe0Mub2ZmKCJjbGljay5idXR0b25zLWNvcHkiKSxzZShkb2N1bWVudCkub2ZmKCIuYnV0dG9ucy1jb3B5IiksZS5idXR0b25zLmluZm8oITEpfXZhciBtPXNlKCI8c3Bhbj4iK2UuaTE4bigiYnV0dG9ucy5jb3B5S2V5cyIsIlByZXNzIDxpPmN0cmw8L2k+IG9yIDxpPlx1MjMxODwvaT4gKyA8aT5DPC9pPiB0byBjb3B5IHRoZSB0YWJsZSBkYXRhPGJyPnRvIHlvdXIgc3lzdGVtIGNsaXBib2FyZC48YnI+PGJyPlRvIGNhbmNlbCwgY2xpY2sgdGhpcyBtZXNzYWdlIG9yIHByZXNzIGVzY2FwZS4iKSsiPC9zcGFuPiIpLmFwcGVuZCh1KSxDPShlLmJ1dHRvbnMuaW5mbyhlLmkxOG4oImJ1dHRvbnMuY29weVRpdGxlIiwiQ29weSB0byBjbGlwYm9hcmQiKSxtLDApLHBbMF0uZm9jdXMoKSxwWzBdLnNlbGVjdCgpLHNlKG0pLmNsb3Nlc3QoIi5kdC1idXR0b24taW5mbyIpKTtDLm9uKCJjbGljay5idXR0b25zLWNvcHkiLGZ1bmN0aW9uKCl7ZygpLHMoKX0pLHNlKGRvY3VtZW50KS5vbigia2V5ZG93bi5idXR0b25zLWNvcHkiLGZ1bmN0aW9uKHkpe3kua2V5Q29kZT09PTI3JiYoZygpLHMoKSl9KS5vbigiY29weS5idXR0b25zLWNvcHkgY3V0LmJ1dHRvbnMtY29weSIsZnVuY3Rpb24oKXtnKCkscygpfSl9LGFzeW5jOjEwMCxjb3B5U3VjY2VzczohMCxleHBvcnRPcHRpb25zOnt9LGZpZWxkU2VwYXJhdG9yOiIJIixmaWVsZEJvdW5kYXJ5OiIiLGhlYWRlcjohMCxmb290ZXI6ITAsdGl0bGU6IioiLG1lc3NhZ2VUb3A6IioiLG1lc3NhZ2VCb3R0b206IioifSxhdC5leHQuYnV0dG9ucy5jc3ZIdG1sNT17Ym9tOiExLGNsYXNzTmFtZToiYnV0dG9ucy1jc3YgYnV0dG9ucy1odG1sNSIsYXZhaWxhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5GaWxlUmVhZGVyIT09dm9pZCAwJiZ3aW5kb3cuQmxvYn0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLmNzdiIsIkNTViIpfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scixzKXt2YXIgaT1OcyhlLHIpLnN0cixvPWUuYnV0dG9ucy5leHBvcnRJbmZvKHIpLHU9ci5jaGFyc2V0O3IuY3VzdG9taXplJiYoaT1yLmN1c3RvbWl6ZShpLHIsZSkpLHU9dSE9PSExPyh1PXV8fGRvY3VtZW50LmNoYXJhY3RlclNldHx8ZG9jdW1lbnQuY2hhcnNldCkmJiI7Y2hhcnNldD0iK3U6IiIsci5ib20mJihpPSJcdUZFRkYiK2kpLFdyKG5ldyBCbG9iKFtpXSx7dHlwZToidGV4dC9jc3YiK3V9KSxvLmZpbGVuYW1lLCEwKSxzKCl9LGFzeW5jOjEwMCxmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIuY3N2IixleHBvcnRPcHRpb25zOnt9LGZpZWxkU2VwYXJhdG9yOiIsIixmaWVsZEJvdW5kYXJ5OiciJyxlc2NhcGVDaGFyOiciJyxjaGFyc2V0Om51bGwsaGVhZGVyOiEwLGZvb3RlcjohMH0sYXQuZXh0LmJ1dHRvbnMuZXhjZWxIdG1sNT17Y2xhc3NOYW1lOiJidXR0b25zLWV4Y2VsIGJ1dHRvbnMtaHRtbDUiLGF2YWlsYWJsZTpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuRmlsZVJlYWRlciE9PXZvaWQgMCYmWmkoKSE9PXZvaWQgMCYmIU9zKCkmJkdyfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0LmkxOG4oImJ1dHRvbnMuZXhjZWwiLCJFeGNlbCIpfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scixzKXtmdW5jdGlvbiBpKFEpe3JldHVybiBRPVZzW1FdLHNlLnBhcnNlWE1MKFEpfWZ1bmN0aW9uIG8oUSl7Zz1EZShDLCJyb3ciLHthdHRyOntyOmI9bSsxfX0pO2Zvcih2YXIgRT0wLCQ9US5sZW5ndGg7RTwkO0UrKyl7dmFyIHc9b3IoRSkrIiIrYixrPW51bGw7aWYoUVtFXT09PW51bGx8fFFbRV09PT12b2lkIDB8fFFbRV09PT0iIil7aWYoci5jcmVhdGVFbXB0eUNlbGxzIT09ITApY29udGludWU7UVtFXT0iIn12YXIgUz1RW0VdO1FbRV09dHlwZW9mIFFbRV0udHJpbT09ImZ1bmN0aW9uIj9RW0VdLnRyaW0oKTpRW0VdO2Zvcih2YXIgQj0wLEw9RXMubGVuZ3RoO0I8TDtCKyspe3ZhciBSPUVzW0JdO2lmKFFbRV0ubWF0Y2gmJiFRW0VdLm1hdGNoKC9eMFxkKy8pJiZRW0VdLm1hdGNoKFIubWF0Y2gpKXt2YXIgcT1RW0VdLnJlcGxhY2UoL1teXGRcLlwtXS9nLCIiKTtSLmZtdCYmKHE9Ui5mbXQocSkpLGs9RGUoQywiYyIse2F0dHI6e3I6dyxzOlIuc3R5bGV9LGNoaWxkcmVuOltEZShDLCJ2Iix7dGV4dDpxfSldfSk7YnJlYWt9fWs9a3x8KHR5cGVvZiBRW0VdPT0ibnVtYmVyInx8UVtFXS5tYXRjaCYmUVtFXS5tYXRjaCgvXi0/XGQrKFwuXGQrKT8oW2VFXVwtP1xkKyk/JC8pJiYhUVtFXS5tYXRjaCgvXjBcZCsvKT9EZShDLCJjIix7YXR0cjp7dDoibiIscjp3fSxjaGlsZHJlbjpbRGUoQywidiIse3RleHQ6UVtFXX0pXX0pOihTPVMucmVwbGFjZT9TLnJlcGxhY2UoL1tceDAwLVx4MDlceDBCXHgwQ1x4MEUtXHgxRlx4N0YtXHg5Rl0vZywiIik6UyxEZShDLCJjIix7YXR0cjp7dDoiaW5saW5lU3RyIixyOnd9LGNoaWxkcmVuOntyb3c6RGUoQywiaXMiLHtjaGlsZHJlbjp7cm93OkRlKEMsInQiLHt0ZXh0OlMsYXR0cjp7InhtbDpzcGFjZSI6InByZXNlcnZlIn19KX19KX19KSkpLGcuYXBwZW5kQ2hpbGQoayl9eS5hcHBlbmRDaGlsZChnKSxtKyt9ZnVuY3Rpb24gdShRKXtRLmZvckVhY2goZnVuY3Rpb24oRSl7byhFLm1hcChmdW5jdGlvbigkKXtyZXR1cm4gJD8kLnRpdGxlOiIifSkpLHNlKCJyb3c6bGFzdCBjIixDKS5hdHRyKCJzIiwiMiIpLEUuZm9yRWFjaChmdW5jdGlvbigkLHcpeyQmJigxPCQuY29sU3Bhbnx8MTwkLnJvd1NwYW4pJiZVcihDLG0sdywkLnJvd1NwYW4sJC5jb2xTcGFuKX0pfSl9dmFyIHAsYixnLG09MCxDPWkoInhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbCIpLHk9Qy5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2hlZXREYXRhIilbMF0sVD17X3JlbHM6eyIucmVscyI6aSgiX3JlbHMvLnJlbHMiKX0seGw6e19yZWxzOnsid29ya2Jvb2sueG1sLnJlbHMiOmkoInhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzIil9LCJ3b3JrYm9vay54bWwiOmkoInhsL3dvcmtib29rLnhtbCIpLCJzdHlsZXMueG1sIjppKCJ4bC9zdHlsZXMueG1sIiksd29ya3NoZWV0czp7InNoZWV0MS54bWwiOkN9fSwiW0NvbnRlbnRfVHlwZXNdLnhtbCI6aSgiW0NvbnRlbnRfVHlwZXNdLnhtbCIpfSxQPWUuYnV0dG9ucy5leHBvcnREYXRhKHIuZXhwb3J0T3B0aW9ucyksYz1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhyKTtjLnRpdGxlJiYobyhbYy50aXRsZV0pLFVyKEMsbSwwLDEsUC5oZWFkZXIubGVuZ3RoKSxzZSgicm93Omxhc3QgYyIsQykuYXR0cigicyIsIjUxIikpLGMubWVzc2FnZVRvcCYmKG8oW2MubWVzc2FnZVRvcF0pLFVyKEMsbSwwLDEsUC5oZWFkZXIubGVuZ3RoKSksci5oZWFkZXImJnUoUC5oZWFkZXJTdHJ1Y3R1cmUpO2Zvcih2YXIgVT1tLGw9MCxoPVAuYm9keS5sZW5ndGg7bDxoO2wrKylvKFAuYm9keVtsXSk7cD1tLHIuZm9vdGVyJiZQLmZvb3RlciYmdShQLmZvb3RlclN0cnVjdHVyZSksYy5tZXNzYWdlQm90dG9tJiYobyhbYy5tZXNzYWdlQm90dG9tXSksVXIoQyxtLDAsMSxQLmhlYWRlci5sZW5ndGgpKTt2YXIgXz1EZShDLCJjb2xzIik7c2UoIndvcmtzaGVldCIsQykucHJlcGVuZChfKTtmb3IodmFyIEY9MCxPPVAuaGVhZGVyLmxlbmd0aDtGPE87RisrKV8uYXBwZW5kQ2hpbGQoRGUoQywiY29sIix7YXR0cjp7bWluOkYrMSxtYXg6RisxLHdpZHRoOlpsKFAsRiksY3VzdG9tV2lkdGg6MX19KSk7dmFyIGY9VC54bFsid29ya2Jvb2sueG1sIl07c2UoInNoZWV0cyBzaGVldCIsZikuYXR0cigibmFtZSIsQnMocikpLHIuYXV0b0ZpbHRlciYmKHNlKCJtZXJnZUNlbGxzIixDKS5iZWZvcmUoRGUoQywiYXV0b0ZpbHRlciIse2F0dHI6e3JlZjoiQSIrVSsiOiIrb3IoUC5oZWFkZXIubGVuZ3RoLTEpK3B9fSkpLHNlKCJkZWZpbmVkTmFtZXMiLGYpLmFwcGVuZChEZShmLCJkZWZpbmVkTmFtZSIse2F0dHI6e25hbWU6Il94bG5tLl9GaWx0ZXJEYXRhYmFzZSIsbG9jYWxTaGVldElkOiIwIixoaWRkZW46MX0sdGV4dDoiJyIrQnMocikucmVwbGFjZSgvJy9nLCInJyIpKyInISRBJCIrVSsiOiIrb3IoUC5oZWFkZXIubGVuZ3RoLTEpK3B9KSkpLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShULHIsZSksc2UoIm1lcmdlQ2VsbHMiLEMpLmNoaWxkcmVuKCkubGVuZ3RoPT09MCYmc2UoIm1lcmdlQ2VsbHMiLEMpLnJlbW92ZSgpO3ZhciBmPW5ldyhaaSgpKSxVPXtjb21wcmVzc2lvbjoiREVGTEFURSIsdHlwZToiYmxvYiIsbWltZVR5cGU6ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0In0sWD0oTXMoZixUKSxjLmZpbGVuYW1lKTsxNzU8WCYmKFg9WC5zdWJzdHIoMCwxNzUpKSxyLmN1c3RvbWl6ZVppcCYmci5jdXN0b21pemVaaXAoZixQLFgpLGYuZ2VuZXJhdGVBc3luYz9mLmdlbmVyYXRlQXN5bmMoVSkudGhlbihmdW5jdGlvbihRKXtXcihRLFgpLHMoKX0pOihXcihmLmdlbmVyYXRlKFUpLFgpLHMoKSl9LGFzeW5jOjEwMCxmaWxlbmFtZToiKiIsZXh0ZW5zaW9uOiIueGxzeCIsZXhwb3J0T3B0aW9uczp7fSxoZWFkZXI6ITAsZm9vdGVyOiEwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixjcmVhdGVFbXB0eUNlbGxzOiExLGF1dG9GaWx0ZXI6ITEsc2hlZXROYW1lOiIifSxhdC5leHQuYnV0dG9ucy5wZGZIdG1sNT17Y2xhc3NOYW1lOiJidXR0b25zLXBkZiBidXR0b25zLWh0bWw1IixhdmFpbGFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LkZpbGVSZWFkZXIhPT12b2lkIDAmJktpKCl9LHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5wZGYiLCJQREYiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsbSxuLHIscyl7dmFyIGk9bS5idXR0b25zLmV4cG9ydERhdGEoci5leHBvcnRPcHRpb25zKSxvPW0uYnV0dG9ucy5leHBvcnRJbmZvKHIpLHU9W107ci5oZWFkZXImJmkuaGVhZGVyU3RydWN0dXJlLmZvckVhY2goZnVuY3Rpb24oQyl7dS5wdXNoKEMubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5P3t0ZXh0OnkudGl0bGUsY29sU3Bhbjp5LmNvbHNwYW4scm93U3Bhbjp5LnJvd3NwYW4sc3R5bGU6InRhYmxlSGVhZGVyIn06e319KSl9KTtmb3IodmFyIHA9MCxiPWkuYm9keS5sZW5ndGg7cDxiO3ArKyl1LnB1c2goaS5ib2R5W3BdLm1hcChmdW5jdGlvbihDKXtyZXR1cm57dGV4dDpDPT1udWxsPyIiOnR5cGVvZiBDPT0ic3RyaW5nIj9DOkMudG9TdHJpbmcoKX19KSk7ci5mb290ZXImJmkuZm9vdGVyU3RydWN0dXJlLmZvckVhY2goZnVuY3Rpb24oQyl7dS5wdXNoKEMubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5P3t0ZXh0OnkudGl0bGUsY29sU3Bhbjp5LmNvbHNwYW4scm93U3Bhbjp5LnJvd3NwYW4sc3R5bGU6InRhYmxlSGVhZGVyIn06e319KSl9KTt2YXIgZz17cGFnZVNpemU6ci5wYWdlU2l6ZSxwYWdlT3JpZW50YXRpb246ci5vcmllbnRhdGlvbixjb250ZW50Olt7c3R5bGU6InRhYmxlIix0YWJsZTp7aGVhZGVyUm93czppLmhlYWRlclN0cnVjdHVyZS5sZW5ndGgsZm9vdGVyUm93czppLmZvb3RlclN0cnVjdHVyZS5sZW5ndGgsYm9keTp1fSxsYXlvdXQ6e2hMaW5lV2lkdGg6ZnVuY3Rpb24oQyx5KXtyZXR1cm4gQz09PTB8fEM9PT15LnRhYmxlLmJvZHkubGVuZ3RoPzA6LjV9LHZMaW5lV2lkdGg6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saExpbmVDb2xvcjpmdW5jdGlvbihDLHkpe3JldHVybiBDPT09eS50YWJsZS5oZWFkZXJSb3dzfHxDPT09eS50YWJsZS5ib2R5Lmxlbmd0aC15LnRhYmxlLmZvb3RlclJvd3M/IiMzMzMiOiIjZGRkIn0sZmlsbENvbG9yOmZ1bmN0aW9uKEMpe3JldHVybiBDPGkuaGVhZGVyU3RydWN0dXJlLmxlbmd0aD8iI2ZmZiI6QyUyPT0wPyIjZjNmM2YzIjpudWxsfSxwYWRkaW5nVG9wOmZ1bmN0aW9uKCl7cmV0dXJuIDV9LHBhZGRpbmdCb3R0b206ZnVuY3Rpb24oKXtyZXR1cm4gNX19fV0sc3R5bGVzOnt0YWJsZUhlYWRlcjp7Ym9sZDohMCxmb250U2l6ZToxMSxhbGlnbm1lbnQ6ImNlbnRlciJ9LHRhYmxlRm9vdGVyOntib2xkOiEwLGZvbnRTaXplOjExfSx0YWJsZTp7bWFyZ2luOlswLDUsMCw1XX0sdGl0bGU6e2FsaWdubWVudDoiY2VudGVyIixmb250U2l6ZToxM30sbWVzc2FnZTp7fX0sZGVmYXVsdFN0eWxlOntmb250U2l6ZToxMH19LG09KG8ubWVzc2FnZVRvcCYmZy5jb250ZW50LnVuc2hpZnQoe3RleHQ6by5tZXNzYWdlVG9wLHN0eWxlOiJtZXNzYWdlIixtYXJnaW46WzAsMCwwLDEyXX0pLG8ubWVzc2FnZUJvdHRvbSYmZy5jb250ZW50LnB1c2goe3RleHQ6by5tZXNzYWdlQm90dG9tLHN0eWxlOiJtZXNzYWdlIixtYXJnaW46WzAsMCwwLDEyXX0pLG8udGl0bGUmJmcuY29udGVudC51bnNoaWZ0KHt0ZXh0Om8udGl0bGUsc3R5bGU6InRpdGxlIixtYXJnaW46WzAsMCwwLDEyXX0pLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShnLHIsbSksS2koKS5jcmVhdGVQZGYoZykpO3IuZG93bmxvYWQhPT0ib3BlbiJ8fE9zKCk/bS5kb3dubG9hZChvLmZpbGVuYW1lKTptLm9wZW4oKSxzKCl9LGFzeW5jOjEwMCx0aXRsZToiKiIsZmlsZW5hbWU6IioiLGV4dGVuc2lvbjoiLnBkZiIsZXhwb3J0T3B0aW9uczp7fSxvcmllbnRhdGlvbjoicG9ydHJhaXQiLHBhZ2VTaXplOm5hdmlnYXRvci5sYW5ndWFnZT09PSJlbi1VUyJ8fG5hdmlnYXRvci5sYW5ndWFnZT09PSJlbi1DQSI/IkxFVFRFUiI6IkE0IixoZWFkZXI6ITAsZm9vdGVyOiEwLG1lc3NhZ2VUb3A6IioiLG1lc3NhZ2VCb3R0b206IioiLGN1c3RvbWl6ZTpudWxsLGRvd25sb2FkOiJkb3dubG9hZCJ9O3ZhciBIcz1pZShhZSgpLDEpO3ZhciBqbj1Icy5kZWZhdWx0LHpuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxLbD1mdW5jdGlvbih0KXtyZXR1cm4gdD1qbih0KS5jbG9uZSgpWzBdLHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJsaW5rIiYmKHQuaHJlZj1Vcyh0LmhyZWYpKSx0Lm91dGVySFRNTH0sVXM9ZnVuY3Rpb24odCl7cmV0dXJuIHpuLmhyZWY9dCx0PXpuLmhvc3QsdC5pbmRleE9mKCIvIik9PT0tMSYmem4ucGF0aG5hbWUuaW5kZXhPZigiLyIpIT09MCYmKHQrPSIvIiksem4ucHJvdG9jb2wrIi8vIit0K3puLnBhdGhuYW1lK3puLnNlYXJjaH07YXQuZXh0LmJ1dHRvbnMucHJpbnQ9e2NsYXNzTmFtZToiYnV0dG9ucy1wcmludCIsdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdC5pMThuKCJidXR0b25zLnByaW50IiwiUHJpbnQiKX0sYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9ZS5idXR0b25zLmV4cG9ydERhdGEoam4uZXh0ZW5kKHtkZWNvZGVFbnRpdGllczohMX0sci5leHBvcnRPcHRpb25zKSksbz1lLmJ1dHRvbnMuZXhwb3J0SW5mbyhyKSx1PWUuY29sdW1ucyhyLmV4cG9ydE9wdGlvbnMuY29sdW1ucykubm9kZXMoKS5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHkuY2xhc3NOYW1lfSkudG9BcnJheSgpLHA9Jzx0YWJsZSBjbGFzcz0iJytlLnRhYmxlKCkubm9kZSgpLmNsYXNzTmFtZSsnIj4nO3IuaGVhZGVyJiYocCs9Ijx0aGVhZD4iK2kuaGVhZGVyU3RydWN0dXJlLm1hcChmdW5jdGlvbih5KXtyZXR1cm4iPHRyPiIreS5tYXAoZnVuY3Rpb24oVCl7cmV0dXJuIFQ/Jzx0aCBjb2xzcGFuPSInK1QuY29sc3BhbisnIiByb3dzcGFuPSInK1Qucm93c3BhbisnIj4nK1QudGl0bGUrIjwvdGg+IjoiIn0pLmpvaW4oIiIpKyI8L3RyPiJ9KS5qb2luKCIiKSsiPC90aGVhZD4iKSxwKz0iPHRib2R5PiI7Zm9yKHZhciBiPTAsZz1pLmJvZHkubGVuZ3RoO2I8ZztiKyspcCs9ZnVuY3Rpb24oeSxUKXtmb3IodmFyIFA9Ijx0cj4iLGM9MCxsPXkubGVuZ3RoO2M8bDtjKyspe3ZhciBoPXlbY109PT1udWxsfHx5W2NdPT09dm9pZCAwPyIiOnlbY107UCs9IjwiK1QrIiAiKyh1W2NdPydjbGFzcz0iJyt1W2NdKyciJzoiIikrIj4iK2grIjwvIitUKyI+In1yZXR1cm4gUCsiPC90cj4ifShpLmJvZHlbYl0sInRkIik7cCs9IjwvdGJvZHk+IixyLmZvb3RlciYmaS5mb290ZXImJihwKz0iPHRmb290PiIraS5mb290ZXJTdHJ1Y3R1cmUubWFwKGZ1bmN0aW9uKHkpe3JldHVybiI8dHI+Iit5Lm1hcChmdW5jdGlvbihUKXtyZXR1cm4gVD8nPHRoIGNvbHNwYW49IicrVC5jb2xzcGFuKyciIHJvd3NwYW49IicrVC5yb3dzcGFuKyciPicrVC50aXRsZSsiPC90aD4iOiIifSkuam9pbigiIikrIjwvdHI+In0pLmpvaW4oIiIpKyI8L3Rmb290PiIpLHArPSI8L3RhYmxlPiI7dmFyIG09d2luZG93Lm9wZW4oIiIsIiIpO2lmKG0pe20uZG9jdW1lbnQuY2xvc2UoKTt2YXIgQz0iPHRpdGxlPiIrby50aXRsZSsiPC90aXRsZT4iO2puKCJzdHlsZSwgbGluayIpLmVhY2goZnVuY3Rpb24oKXtDKz1LbCh0aGlzKX0pO3RyeXttLmRvY3VtZW50LmhlYWQuaW5uZXJIVE1MPUN9Y2F0Y2h7am4obS5kb2N1bWVudC5oZWFkKS5odG1sKEMpfXIuY3VzdG9tU2NyaXB0cyYmci5jdXN0b21TY3JpcHRzLmZvckVhY2goZnVuY3Rpb24oeSl7dmFyIFQ9bS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtULnNyYz15LG0uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChUKX0pLG0uZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxoMT4iK28udGl0bGUrIjwvaDE+PGRpdj4iKyhvLm1lc3NhZ2VUb3B8fCIiKSsiPC9kaXY+IitwKyI8ZGl2PiIrKG8ubWVzc2FnZUJvdHRvbXx8IiIpKyI8L2Rpdj4iLGpuKG0uZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoImR0LXByaW50LXZpZXciKSxqbigiaW1nIixtLmRvY3VtZW50LmJvZHkpLmVhY2goZnVuY3Rpb24oeSxUKXtULnNldEF0dHJpYnV0ZSgic3JjIixVcyhULmdldEF0dHJpYnV0ZSgic3JjIikpKX0pLHIuY3VzdG9taXplJiZyLmN1c3RvbWl6ZShtLHIsZSksbS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5hdXRvUHJpbnQmJihtLnByaW50KCksbS5jbG9zZSgpKX0sMWUzKSxzKCl9ZWxzZSBlLmJ1dHRvbnMuaW5mbyhlLmkxOG4oImJ1dHRvbnMucHJpbnRFcnJvclRpdGxlIiwiVW5hYmxlIHRvIG9wZW4gcHJpbnQgdmlldyIpLGUuaTE4bigiYnV0dG9ucy5wcmludEVycm9yTXNnIiwiUGxlYXNlIGFsbG93IHBvcHVwcyBpbiB5b3VyIGJyb3dzZXIgZm9yIHRoaXMgc2l0ZSB0byBiZSBhYmxlIHRvIHZpZXcgdGhlIHByaW50IHZpZXcuIiksNWUzKX0sYXN5bmM6MTAwLHRpdGxlOiIqIixtZXNzYWdlVG9wOiIqIixtZXNzYWdlQm90dG9tOiIqIixleHBvcnRPcHRpb25zOnt9LGhlYWRlcjohMCxmb290ZXI6ITAsYXV0b1ByaW50OiEwLGN1c3RvbWl6ZTpudWxsfTt2YXIgV3M9aWUoYWUoKSwxKTt2YXIgSmw9V3MuZGVmYXVsdDtKbC5leHRlbmQoYXQuZXh0LmJ1dHRvbnMse2NvbHZpczpmdW5jdGlvbih0LGUpe3ZhciBuPW51bGwscj17ZXh0ZW5kOiJjb2xsZWN0aW9uIixpbml0OmZ1bmN0aW9uKHMsaSl7bj1pfSx0ZXh0OmZ1bmN0aW9uKHMpe3JldHVybiBzLmkxOG4oImJ1dHRvbnMuY29sdmlzIiwiQ29sdW1uIHZpc2liaWxpdHkiKX0sY2xhc3NOYW1lOiJidXR0b25zLWNvbHZpcyIsY2xvc2VCdXR0b246ITEsYnV0dG9uczpbe2V4dGVuZDoiY29sdW1uc1RvZ2dsZSIsY29sdW1uczplLmNvbHVtbnMsY29sdW1uVGV4dDplLmNvbHVtblRleHR9XX07cmV0dXJuIHQub24oImNvbHVtbi1yZW9yZGVyLmR0IitlLm5hbWVzcGFjZSxmdW5jdGlvbigpe3QuYnV0dG9uKG51bGwsdC5idXR0b24obnVsbCxuKS5ub2RlKCkpLmNvbGxlY3Rpb25SZWJ1aWxkKFt7ZXh0ZW5kOiJjb2x1bW5zVG9nZ2xlIixjb2x1bW5zOmUuY29sdW1ucyxjb2x1bW5UZXh0OmUuY29sdW1uVGV4dH1dKX0pLHJ9LGNvbHVtbnNUb2dnbGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb2x1bW5zKGUuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5Ub2dnbGUiLGNvbHVtbnM6bixjb2x1bW5UZXh0OmUuY29sdW1uVGV4dH19KS50b0FycmF5KCl9LGNvbHVtblRvZ2dsZTpmdW5jdGlvbih0LGUpe3JldHVybntleHRlbmQ6ImNvbHVtblZpc2liaWxpdHkiLGNvbHVtbnM6ZS5jb2x1bW5zLGNvbHVtblRleHQ6ZS5jb2x1bW5UZXh0fX0sY29sdW1uc1Zpc2liaWxpdHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jb2x1bW5zKGUuY29sdW1ucykuaW5kZXhlcygpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57ZXh0ZW5kOiJjb2x1bW5WaXNpYmlsaXR5Iixjb2x1bW5zOm4sdmlzaWJpbGl0eTplLnZpc2liaWxpdHksY29sdW1uVGV4dDplLmNvbHVtblRleHR9fSkudG9BcnJheSgpfSxjb2x1bW5WaXNpYmlsaXR5Ontjb2x1bW5zOnZvaWQgMCx0ZXh0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbi5fY29sdW1uVGV4dCh0LG4pfSxjbGFzc05hbWU6ImJ1dHRvbnMtY29sdW1uVmlzaWJpbGl0eSIsYWN0aW9uOmZ1bmN0aW9uKHQscyxuLHIpe3ZhciBzPXMuY29sdW1ucyhyLmNvbHVtbnMpLGk9cy52aXNpYmxlKCk7cy52aXNpYmxlKHIudmlzaWJpbGl0eSE9PXZvaWQgMD9yLnZpc2liaWxpdHk6IShpLmxlbmd0aCYmaVswXSkpfSxpbml0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2UuYXR0cigiZGF0YS1jdi1pZHgiLG4uY29sdW1ucyksdC5vbigiY29sdW1uLXZpc2liaWxpdHkuZHQiK24ubmFtZXNwYWNlLGZ1bmN0aW9uKHMsaSl7aS5iRGVzdHJveWluZ3x8aS5uVGFibGUhPXQuc2V0dGluZ3MoKVswXS5uVGFibGV8fHIuYWN0aXZlKHQuY29sdW1uKG4uY29sdW1ucykudmlzaWJsZSgpKX0pLm9uKCJjb2x1bW4tcmVvcmRlci5kdCIrbi5uYW1lc3BhY2UsZnVuY3Rpb24oKXtuLmRlc3Ryb3lpbmd8fHQuY29sdW1ucyhuLmNvbHVtbnMpLmNvdW50KCk9PT0xJiYoci50ZXh0KG4uX2NvbHVtblRleHQodCxuKSksci5hY3RpdmUodC5jb2x1bW4obi5jb2x1bW5zKS52aXNpYmxlKCkpKX0pLHRoaXMuYWN0aXZlKHQuY29sdW1uKG4uY29sdW1ucykudmlzaWJsZSgpKX0sZGVzdHJveTpmdW5jdGlvbih0LGUsbil7dC5vZmYoImNvbHVtbi12aXNpYmlsaXR5LmR0IituLm5hbWVzcGFjZSkub2ZmKCJjb2x1bW4tcmVvcmRlci5kdCIrbi5uYW1lc3BhY2UpfSxfY29sdW1uVGV4dDpmdW5jdGlvbih0LGUpe3ZhciBuLHI7cmV0dXJuIHR5cGVvZiBlLnRleHQ9PSJzdHJpbmciP2UudGV4dDoocj10LmNvbHVtbihlLmNvbHVtbnMpLnRpdGxlKCksbj10LmNvbHVtbihlLmNvbHVtbnMpLmluZGV4KCkscj1yLnJlcGxhY2UoL1xuL2csIiAiKS5yZXBsYWNlKC88YnJccypcLz8+L2dpLCIgIikucmVwbGFjZSgvPHNlbGVjdCguKj8pPFwvc2VsZWN0XHMqPi9naSwiIikscj1hdC5CdXR0b25zLnN0cmlwSHRtbENvbW1lbnRzKHIpLHI9YXQudXRpbC5zdHJpcEh0bWwocikudHJpbSgpLGUuY29sdW1uVGV4dD9lLmNvbHVtblRleHQodCxuLHIpOnIpfX0sY29sdmlzUmVzdG9yZTp7Y2xhc3NOYW1lOiJidXR0b25zLWNvbHZpc1Jlc3RvcmUiLHRleHQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaTE4bigiYnV0dG9ucy5jb2x2aXNSZXN0b3JlIiwiUmVzdG9yZSB2aXNpYmlsaXR5Iil9LGluaXQ6ZnVuY3Rpb24odCxlLG4pe3QuY29sdW1ucygpLmV2ZXJ5KGZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5pbml0KCk7ci5fX3Zpc09yaWdpbmFsPT09dm9pZCAwJiYoci5fX3Zpc09yaWdpbmFsPXRoaXMudmlzaWJsZSgpKX0pfSxhY3Rpb246ZnVuY3Rpb24odCxlLG4scil7ZS5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24ocyl7dmFyIGk9dGhpcy5pbml0KCk7dGhpcy52aXNpYmxlKGkuX192aXNPcmlnaW5hbCl9KX19LGNvbHZpc0dyb3VwOntjbGFzc05hbWU6ImJ1dHRvbnMtY29sdmlzR3JvdXAiLGFjdGlvbjpmdW5jdGlvbih0LGUsbixyKXtlLmNvbHVtbnMoci5zaG93KS52aXNpYmxlKCEwLCExKSxlLmNvbHVtbnMoci5oaWRlKS52aXNpYmxlKCExLCExKSxlLmNvbHVtbnMuYWRqdXN0KCl9LHNob3c6W10saGlkZTpbXX19KTt2YXIgUWw9aWUoYWUoKSwxKTt2YXIgR3M9aWUoYWUoKSwxKTt2YXIgdW49R3MuZGVmYXVsdDsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQsZTtmdW5jdGlvbiBuKG8pe3Q9byxlPXQuZm4uZGF0YVRhYmxlfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyh1LHApe3ZhciBiPXRoaXM7aWYoIWV8fCFlLnZlcnNpb25DaGVja3x8IWUudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJGaXhlZENvbHVtbnMgcmVxdWlyZXMgRGF0YVRhYmxlcyAyIG9yIG5ld2VyIik7dmFyIGc9bmV3IGUuQXBpKHUpO3RoaXMuY2xhc3Nlcz10LmV4dGVuZCghMCx7fSxvLmNsYXNzZXMpLHRoaXMuYz10LmV4dGVuZCghMCx7fSxvLmRlZmF1bHRzLHApLHRoaXMucz17ZHQ6ZyxydGw6dChnLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCJ9LHAmJnAubGVmdENvbHVtbnMhPT12b2lkIDAmJihwLmxlZnQ9cC5sZWZ0Q29sdW1ucykscCYmcC5sZWZ0IT09dm9pZCAwJiYodGhpcy5jW3RoaXMucy5ydGw/ImVuZCI6InN0YXJ0Il09cC5sZWZ0KSxwJiZwLnJpZ2h0Q29sdW1ucyE9PXZvaWQgMCYmKHAucmlnaHQ9cC5yaWdodENvbHVtbnMpLHAmJnAucmlnaHQhPT12b2lkIDAmJih0aGlzLmNbdGhpcy5zLnJ0bD8ic3RhcnQiOiJlbmQiXT1wLnJpZ2h0KSx0aGlzLmRvbT17Ym90dG9tQmxvY2tlcjp0KCI8ZGl2PiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3R0b21CbG9ja2VyKSx0b3BCbG9ja2VyOnQoIjxkaXY+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRvcEJsb2NrZXIpLHNjcm9sbGVyOnQoImRpdi5kdC1zY3JvbGwtYm9keSIsdGhpcy5zLmR0LnRhYmxlKCkuY29udGFpbmVyKCkpfSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT8odGhpcy5fYWRkU3R5bGVzKCksdGhpcy5fc2V0S2V5VGFibGVMaXN0ZW5lcigpKTpnLm9uZSgiaW5pdC5kdC5kdGZjIixmdW5jdGlvbigpe2IuX2FkZFN0eWxlcygpLGIuX3NldEtleVRhYmxlTGlzdGVuZXIoKX0pLGcub24oImNvbHVtbi1zaXppbmcuZHQuZHRmYyBjb2x1bW4tcmVvcmRlci5kdC5kdGZjIGRyYXcuZHQuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fYWRkU3R5bGVzKCl9KTt2YXIgbT1lLnV0aWwuZGVib3VuY2UoZnVuY3Rpb24oKXtiLl9hZGRTdHlsZXMoKX0sNTApO3JldHVybiBnLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdGZjIixmdW5jdGlvbigpe20oKX0pLHRoaXMuZG9tLnNjcm9sbGVyLm9uKCJzY3JvbGwuZHRmYyIsZnVuY3Rpb24oKXtyZXR1cm4gYi5fc2Nyb2xsKCl9KSx0aGlzLl9zY3JvbGwoKSxnLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucz10aGlzLGcub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7cmV0dXJuIGIuX2Rlc3Ryb3koKX0pLHRoaXN9cmV0dXJuIG8ucHJvdG90eXBlLmVuZD1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXZvaWQgMD8odT49MCYmdTw9dGhpcy5zLmR0LmNvbHVtbnMoKS5jb3VudCgpJiYodGhpcy5jLmVuZD11LHRoaXMuX2FkZFN0eWxlcygpKSx0aGlzKTp0aGlzLmMuZW5kfSxvLnByb3RvdHlwZS5sZWZ0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuZW5kKHUpOnRoaXMuc3RhcnQodSl9LG8ucHJvdG90eXBlLnJpZ2h0PWZ1bmN0aW9uKHUpe3JldHVybiB0aGlzLnMucnRsP3RoaXMuc3RhcnQodSk6dGhpcy5lbmQodSl9LG8ucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKHUpe3JldHVybiB1IT09dm9pZCAwPyh1Pj0wJiZ1PD10aGlzLnMuZHQuY29sdW1ucygpLmNvdW50KCkmJih0aGlzLmMuc3RhcnQ9dSx0aGlzLl9hZGRTdHlsZXMoKSksdGhpcyk6dGhpcy5jLnN0YXJ0fSxvLnByb3RvdHlwZS5fYWRkU3R5bGVzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5zLmR0LHA9dGhpcyxiPXRoaXMucy5kdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmNvdW50KCksZz11LnRhYmxlKCkuaGVhZGVyLnN0cnVjdHVyZSgiOnZpc2libGUiKSxtPXUudGFibGUoKS5mb290ZXIuc3RydWN0dXJlKCI6dmlzaWJsZSIpLEM9dS5jb2x1bW5zKCI6dmlzaWJsZSIpLndpZHRocygpLnRvQXJyYXkoKSx5PXQodS50YWJsZSgpLm5vZGUoKSkuY2xvc2VzdCgiZGl2LmR0LXNjcm9sbCIpLFQ9dCh1LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKVswXSxQPXRoaXMucy5ydGwsYz10aGlzLmMuc3RhcnQsbD10aGlzLmMuZW5kLGg9UD9sOmMsXz1QP2M6bCxGPXUuc2V0dGluZ3MoKVswXS5vQnJvd3Nlci5iYXJXaWR0aDtpZih5Lmxlbmd0aD09PTApcmV0dXJuIHRoaXM7VC5vZmZzZXRXaWR0aD09PVQuY2xpZW50V2lkdGgmJihGPTApLHUuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihRKXt2YXIgRT11LmNvbHVtbi5pbmRleCgidG9WaXNpYmxlIixRKSwkO0U8Yz8oJD1wLl9zdW0oQyxFKSxwLl9maXhDb2x1bW4oRSwkLCJzdGFydCIsZyxtLEYpKTpFPj1iLWw/KCQ9cC5fc3VtKEMsYi1FLTEsITApLHAuX2ZpeENvbHVtbihFLCQsImVuZCIsZyxtLEYpKTpwLl9maXhDb2x1bW4oRSwwLCJub25lIixnLG0sRil9KSx0KHUudGFibGUoKS5ub2RlKCkpLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkU3RhcnQsYz4wKS50b2dnbGVDbGFzcyhwLmNsYXNzZXMudGFibGVGaXhlZEVuZCxsPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkTGVmdCxoPjApLnRvZ2dsZUNsYXNzKHAuY2xhc3Nlcy50YWJsZUZpeGVkUmlnaHQsXz4wKTt2YXIgTz11LnRhYmxlKCkuaGVhZGVyKCksZj11LnRhYmxlKCkuZm9vdGVyKCksVT10KE8pLm91dGVySGVpZ2h0KCksWD10KGYpLm91dGVySGVpZ2h0KCk7dGhpcy5kb20udG9wQmxvY2tlci5hcHBlbmRUbyh5KS5jc3MoInRvcCIsMCkuY3NzKHRoaXMucy5ydGw/ImxlZnQiOiJyaWdodCIsMCkuY3NzKCJoZWlnaHQiLFUpLmNzcygid2lkdGgiLEYrMSkuY3NzKCJkaXNwbGF5IixGPyJibG9jayI6Im5vbmUiKSxmJiZ0aGlzLmRvbS5ib3R0b21CbG9ja2VyLmFwcGVuZFRvKHkpLmNzcygiYm90dG9tIiwwKS5jc3ModGhpcy5zLnJ0bD8ibGVmdCI6InJpZ2h0IiwwKS5jc3MoImhlaWdodCIsWCkuY3NzKCJ3aWR0aCIsRisxKS5jc3MoImRpc3BsYXkiLEY/ImJsb2NrIjoibm9uZSIpfSxvLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbigpe3RoaXMucy5kdC5vZmYoIi5kdGZjIiksdGhpcy5kb20uc2Nyb2xsZXIub2ZmKCIuZHRmYyIpLHQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdFbmQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0xlZnQrIiAiK3RoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ1N0YXJ0KyIgIit0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdSaWdodCksdGhpcy5kb20uYm90dG9tQmxvY2tlci5yZW1vdmUoKSx0aGlzLmRvbS50b3BCbG9ja2VyLnJlbW92ZSgpfSxvLnByb3RvdHlwZS5fZml4Q29sdW1uPWZ1bmN0aW9uKHUscCxiLGcsbSxDKXt2YXIgeT10aGlzLFQ9dGhpcy5zLmR0LFA9ZnVuY3Rpb24oYyxsKXtpZihiPT09Im5vbmUiKWMuY3NzKCJwb3NpdGlvbiIsIiIpLmNzcygibGVmdCIsIiIpLmNzcygicmlnaHQiLCIiKS5yZW1vdmVDbGFzcyh5LmNsYXNzZXMuZml4ZWRFbmQrIiAiK3kuY2xhc3Nlcy5maXhlZExlZnQrIiAiK3kuY2xhc3Nlcy5maXhlZFJpZ2h0KyIgIit5LmNsYXNzZXMuZml4ZWRTdGFydCk7ZWxzZXt2YXIgaD1iPT09InN0YXJ0Ij8ibGVmdCI6InJpZ2h0Ijt5LnMucnRsJiYoaD1iPT09InN0YXJ0Ij8icmlnaHQiOiJsZWZ0Iik7dmFyIF89cDtiPT09ImVuZCImJihsPT09ImhlYWRlciJ8fGw9PT0iZm9vdGVyIikmJihfKz1DKSxjLmNzcygicG9zaXRpb24iLCJzdGlja3kiKS5jc3MoaCxfKS5hZGRDbGFzcyhiPT09InN0YXJ0Ij95LmNsYXNzZXMuZml4ZWRTdGFydDp5LmNsYXNzZXMuZml4ZWRFbmQpLmFkZENsYXNzKGg9PT0ibGVmdCI/eS5jbGFzc2VzLmZpeGVkTGVmdDp5LmNsYXNzZXMuZml4ZWRSaWdodCl9fTtnLmZvckVhY2goZnVuY3Rpb24oYyl7Y1t1XSYmUCh0KGNbdV0uY2VsbCksImhlYWRlciIpfSksUChULmNvbHVtbih1KyI6dmlzaWJsZSIse3BhZ2U6ImN1cnJlbnQifSkubm9kZXMoKS50byQoKSwiYm9keSIpLG0mJm0uZm9yRWFjaChmdW5jdGlvbihjKXtjW3VdJiZQKHQoY1t1XS5jZWxsKSwiZm9vdGVyIil9KX0sby5wcm90b3R5cGUuX3Njcm9sbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuZG9tLnNjcm9sbGVyWzBdO2lmKHUpe3ZhciBwPXQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5hZGQodGhpcy5zLmR0LnRhYmxlKCkuaGVhZGVyKCkucGFyZW50Tm9kZSkuYWRkKHRoaXMucy5kdC50YWJsZSgpLmZvb3RlcigpLnBhcmVudE5vZGUpLmFkZCgiZGl2LmR0LXNjcm9sbC1oZWFkSW5uZXIgdGFibGUiLHRoaXMucy5kdC50YWJsZSgpLmNvbnRhaW5lcigpKS5hZGQoImRpdi5kdC1zY3JvbGwtZm9vdElubmVyIHRhYmxlIix0aGlzLnMuZHQudGFibGUoKS5jb250YWluZXIoKSksYj11LnNjcm9sbExlZnQsZz0hdGhpcy5zLnJ0bCxtPWIhPT0wLEM9dS5zY3JvbGxXaWR0aD51LmNsaWVudFdpZHRoK01hdGguYWJzKGIpKzE7cC50b2dnbGVDbGFzcyh0aGlzLmNsYXNzZXMudGFibGVTY3JvbGxpbmdTdGFydCxtKSxwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0VuZCxDKSxwLnRvZ2dsZUNsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZVNjcm9sbGluZ0xlZnQsbSYmZ3x8QyYmIWcpLHAudG9nZ2xlQ2xhc3ModGhpcy5jbGFzc2VzLnRhYmxlU2Nyb2xsaW5nUmlnaHQsQyYmZ3x8bSYmIWcpfX0sby5wcm90b3R5cGUuX3NldEtleVRhYmxlTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzO3RoaXMucy5kdC5vbigia2V5LWZvY3VzLmR0LmR0ZmMiLGZ1bmN0aW9uKHAsYixnKXt2YXIgbSxDPXQoZy5ub2RlKCkpLm9mZnNldCgpLHk9dS5kb20uc2Nyb2xsZXJbMF0sVD10KHQodS5zLmR0LnRhYmxlKCkubm9kZSgpKS5jbG9zZXN0KCJkaXYuZHQtc2Nyb2xsLWJvZHkiKSk7aWYodS5jLnN0YXJ0PjApe3ZhciBQPXQodS5zLmR0LmNvbHVtbih1LmMuc3RhcnQtMSkuaGVhZGVyKCkpLGM9UC5vZmZzZXQoKSxsPVAub3V0ZXJXaWR0aCgpO3QoZy5ub2RlKCkpLmhhc0NsYXNzKHUuY2xhc3Nlcy5maXhlZExlZnQpP1Quc2Nyb2xsTGVmdCgwKTpDLmxlZnQ8Yy5sZWZ0K2wmJihtPVQuc2Nyb2xsTGVmdCgpLFQuc2Nyb2xsTGVmdChtLShjLmxlZnQrbC1DLmxlZnQpKSl9aWYodS5jLmVuZD4wKXt2YXIgaD11LnMuZHQuY29sdW1ucygpLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoLF89dChnLm5vZGUoKSkub3V0ZXJXaWR0aCgpLEY9dCh1LnMuZHQuY29sdW1uKGgtdS5jLmVuZCkuaGVhZGVyKCkpLE89Ri5vZmZzZXQoKTt0KGcubm9kZSgpKS5oYXNDbGFzcyh1LmNsYXNzZXMuZml4ZWRSaWdodCk/VC5zY3JvbGxMZWZ0KHkuc2Nyb2xsV2lkdGgteS5jbGllbnRXaWR0aCk6Qy5sZWZ0K18+Ty5sZWZ0JiYobT1ULnNjcm9sbExlZnQoKSxULnNjcm9sbExlZnQobS0oTy5sZWZ0LShDLmxlZnQrXykpKSl9fSl9LG8ucHJvdG90eXBlLl9zdW09ZnVuY3Rpb24odSxwLGIpe3JldHVybiBiPT09dm9pZCAwJiYoYj0hMSksYiYmKHU9dS5zbGljZSgpLnJldmVyc2UoKSksdS5zbGljZSgwLHApLnJlZHVjZShmdW5jdGlvbihnLG0pe3JldHVybiBnK219LDApfSxvLnZlcnNpb249IjUuMC4wIixvLmNsYXNzZXM9e2JvdHRvbUJsb2NrZXI6ImR0ZmMtYm90dG9tLWJsb2NrZXIiLGZpeGVkRW5kOiJkdGZjLWZpeGVkLWVuZCIsZml4ZWRMZWZ0OiJkdGZjLWZpeGVkLWxlZnQiLGZpeGVkUmlnaHQ6ImR0ZmMtZml4ZWQtcmlnaHQiLGZpeGVkU3RhcnQ6ImR0ZmMtZml4ZWQtc3RhcnQiLHRhYmxlRml4ZWRFbmQ6ImR0ZmMtaGFzLWVuZCIsdGFibGVGaXhlZExlZnQ6ImR0ZmMtaGFzLWxlZnQiLHRhYmxlRml4ZWRSaWdodDoiZHRmYy1oYXMtcmlnaHQiLHRhYmxlRml4ZWRTdGFydDoiZHRmYy1oYXMtc3RhcnQiLHRhYmxlU2Nyb2xsaW5nRW5kOiJkdGZjLXNjcm9sbGluZy1lbmQiLHRhYmxlU2Nyb2xsaW5nTGVmdDoiZHRmYy1zY3JvbGxpbmctbGVmdCIsdGFibGVTY3JvbGxpbmdSaWdodDoiZHRmYy1zY3JvbGxpbmctcmlnaHQiLHRhYmxlU2Nyb2xsaW5nU3RhcnQ6ImR0ZmMtc2Nyb2xsaW5nLXN0YXJ0Iix0b3BCbG9ja2VyOiJkdGZjLXRvcC1ibG9ja2VyIn0sby5kZWZhdWx0cz17aTE4bjp7YnV0dG9uOiJGaXhlZENvbHVtbnMifSxzdGFydDoxLGVuZDowfSxvfSgpO24odW4pLHVuLmZuLmRhdGFUYWJsZS5GaXhlZENvbHVtbnM9cix1bi5mbi5EYXRhVGFibGUuRml4ZWRDb2x1bW5zPXI7dmFyIHM9YXQuQXBpLnJlZ2lzdGVyO3MoImZpeGVkQ29sdW1ucygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzfSkscygiZml4ZWRDb2x1bW5zKCkuc3RhcnQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMuc3RhcnQobyksdGhpcyk6dS5fZml4ZWRDb2x1bW5zLnN0YXJ0KCl9KSxzKCJmaXhlZENvbHVtbnMoKS5lbmQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMuZW5kKG8pLHRoaXMpOnUuX2ZpeGVkQ29sdW1ucy5lbmQoKX0pLHMoImZpeGVkQ29sdW1ucygpLmxlZnQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMubGVmdChvKSx0aGlzKTp1Ll9maXhlZENvbHVtbnMubGVmdCgpfSkscygiZml4ZWRDb2x1bW5zKCkucmlnaHQoKSIsZnVuY3Rpb24obyl7dmFyIHU9dGhpcy5jb250ZXh0WzBdO3JldHVybiBvIT09dm9pZCAwPyh1Ll9maXhlZENvbHVtbnMucmlnaHQobyksdGhpcyk6dS5fZml4ZWRDb2x1bW5zLnJpZ2h0KCl9KSxhdC5leHQuYnV0dG9ucy5maXhlZENvbHVtbnM9e2FjdGlvbjpmdW5jdGlvbihvLHUscCxiKXt1bihwKS5hdHRyKCJhY3RpdmUiKT8odW4ocCkucmVtb3ZlQXR0cigiYWN0aXZlIikucmVtb3ZlQ2xhc3MoImFjdGl2ZSIpLHUuZml4ZWRDb2x1bW5zKCkuc3RhcnQoMCksdS5maXhlZENvbHVtbnMoKS5lbmQoMCkpOih1bihwKS5hdHRyKCJhY3RpdmUiLCJ0cnVlIikuYWRkQ2xhc3MoImFjdGl2ZSIpLHUuZml4ZWRDb2x1bW5zKCkuc3RhcnQoYi5jb25maWcuc3RhcnQpLHUuZml4ZWRDb2x1bW5zKCkuZW5kKGIuY29uZmlnLmVuZCkpfSxjb25maWc6e3N0YXJ0OjEsZW5kOjB9LGluaXQ6ZnVuY3Rpb24obyx1LHApe28uc2V0dGluZ3MoKVswXS5fZml4ZWRDb2x1bW5zPT09dm9pZCAwJiZpKG8uc2V0dGluZ3MoKSxwKSx1bih1KS5hdHRyKCJhY3RpdmUiLCJ0cnVlIikuYWRkQ2xhc3MoImFjdGl2ZSIpLG8uYnV0dG9uKHUpLnRleHQocC50ZXh0fHxvLmkxOG4oImJ1dHRvbnMuZml4ZWRDb2x1bW5zIixvLnNldHRpbmdzKClbMF0uX2ZpeGVkQ29sdW1ucy5jLmkxOG4uYnV0dG9uKSl9LHRleHQ6bnVsbH07ZnVuY3Rpb24gaShvLHUpe3U9PT12b2lkIDAmJih1PW51bGwpO3ZhciBwPW5ldyBhdC5BcGkobyksYj11fHxwLmluaXQoKS5maXhlZENvbHVtbnN8fGF0LmRlZmF1bHRzLmZpeGVkQ29sdW1ucyxnPW5ldyByKHAsYik7cmV0dXJuIGd9dW4oZG9jdW1lbnQpLm9uKCJwbHVnaW4taW5pdC5kdCIsZnVuY3Rpb24obyx1KXtvLm5hbWVzcGFjZT09PSJkdCImJih1Lm9Jbml0LmZpeGVkQ29sdW1uc3x8YXQuZGVmYXVsdHMuZml4ZWRDb2x1bW5zKSYmKHUuX2ZpeGVkQ29sdW1uc3x8aSh1LG51bGwpKX0pfSkoKTt2YXIgbmQ9aWUoYWUoKSwxKTt2YXIgcXM9aWUoYWUoKSwxKTt2YXIganQ9cXMuZGVmYXVsdCx0ZD0wLGVkPTAsX249ZnVuY3Rpb24odCxlKXtpZighYXQudmVyc2lvbkNoZWNrfHwhYXQudmVyc2lvbkNoZWNrKCIxLjEwLjgiKSl0aHJvdyJLZXlUYWJsZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAuOCBvciBuZXdlciI7dGhpcy5jPWp0LmV4dGVuZCghMCx7fSxhdC5kZWZhdWx0cy5rZXlUYWJsZSxfbi5kZWZhdWx0cyxlKSx0aGlzLnM9e2R0Om5ldyBhdC5BcGkodCksZHREcmF3aW5nOiExLGVuYWJsZTohMCxmb2N1c0RyYXc6ITEsd2FpdGluZ0ZvckRyYXc6ITEsbGFzdEZvY3VzOm51bGwsbmFtZXNwYWNlOiIua2V5VGFibGUtIit0ZCsrLHRhYklucHV0Om51bGx9LHRoaXMuZG9tPXt9O3ZhciBuPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHI9bi5rZXl0YWJsZTtpZihyKXJldHVybiByO24ua2V5dGFibGU9dGhpcyx0aGlzLl9jb25zdHJ1Y3RvcigpfTtqdC5leHRlbmQoX24ucHJvdG90eXBlLHtibHVyOmZ1bmN0aW9uKCl7dGhpcy5fYmx1cigpfSxlbmFibGU6ZnVuY3Rpb24odCl7dGhpcy5zLmVuYWJsZT10fSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5lbmFibGV9LGZvY3VzOmZ1bmN0aW9uKHQsZSl7dGhpcy5fZm9jdXModGhpcy5zLmR0LmNlbGwodCxlKSl9LGZvY3VzZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmxhc3RGb2N1cztpZighZSlyZXR1cm4hMTt2YXIgbj10aGlzLnMubGFzdEZvY3VzLmNlbGwuaW5kZXgoKTtyZXR1cm4gdC5yb3c9PT1uLnJvdyYmdC5jb2x1bW49PT1uLmNvbHVtbn0sX2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fdGFiSW5wdXQoKTt2YXIgdD10aGlzLGU9dGhpcy5zLmR0LG49anQoZS50YWJsZSgpLm5vZGUoKSkscj10aGlzLnMubmFtZXNwYWNlLHM9ITE7aWYobi5jc3MoInBvc2l0aW9uIik9PT0ic3RhdGljIiYmbi5jc3MoInBvc2l0aW9uIiwicmVsYXRpdmUiKSxqdChlLnRhYmxlKCkuYm9keSgpKS5vbigiY2xpY2siK3IsInRoLCB0ZCIsZnVuY3Rpb24odSl7aWYodC5zLmVuYWJsZSE9PSExKXt2YXIgcD1lLmNlbGwodGhpcyk7cC5hbnkoKSYmdC5fZm9jdXMocCxudWxsLCExLHUpfX0pLGp0KGRvY3VtZW50KS5vbigia2V5ZG93biIrcixmdW5jdGlvbih1KXshcyYmIXQucy5kdERyYXdpbmc/dC5fa2V5KHUpOnUucHJldmVudERlZmF1bHQoKX0pLHRoaXMuYy5ibHVyYWJsZSYmanQoZG9jdW1lbnQpLm9uKCJtb3VzZWRvd24iK3IsZnVuY3Rpb24odSl7anQodS50YXJnZXQpLnBhcmVudHMoIi5kYXRhVGFibGVzX2ZpbHRlciwgLmR0LXNlYXJjaCIpLmxlbmd0aCYmdC5fYmx1cigpLCFqdCh1LnRhcmdldCkucGFyZW50cygpLmZpbHRlcihlLnRhYmxlKCkuY29udGFpbmVyKCkpLmxlbmd0aCYmKGp0KHUudGFyZ2V0KS5wYXJlbnRzKCJkaXYuRFRFIikubGVuZ3RofHxqdCh1LnRhcmdldCkucGFyZW50cygiZGl2LmVkaXRvci1kYXRldGltZSIpLmxlbmd0aHx8anQodS50YXJnZXQpLnBhcmVudHMoImRpdi5kdC1kYXRldGltZSIpLmxlbmd0aHx8anQodS50YXJnZXQpLnBhcmVudHMoKS5maWx0ZXIoIi5EVEZDX0Nsb25lZCIpLmxlbmd0aHx8dC5fYmx1cigpKX0pLHRoaXMuYy5lZGl0b3Ipe3ZhciBpPXRoaXMuYy5lZGl0b3I7aS5vbigib3Blbi5rZXlUYWJsZU1haW4iLGZ1bmN0aW9uKHUscCxiKXtwIT09ImlubGluZSImJnQucy5lbmFibGUmJih0LmVuYWJsZSghMSksaS5vbmUoImNsb3NlIityLGZ1bmN0aW9uKCl7dC5lbmFibGUoITApfSkpfSksdGhpcy5jLmVkaXRPbkZvY3VzJiZlLm9uKCJrZXktZm9jdXMiK3IrIiBrZXktcmVmb2N1cyIrcixmdW5jdGlvbih1LHAsYixnKXt0Ll9lZGl0b3IobnVsbCxnLCEwKX0pLGUub24oImtleSIrcixmdW5jdGlvbih1LHAsYixnLG0pe3QuX2VkaXRvcihiLG0sITEpfSksanQoZS50YWJsZSgpLmJvZHkoKSkub24oImRibGNsaWNrIityLCJ0aCwgdGQiLGZ1bmN0aW9uKHUpe2lmKHQucy5lbmFibGUhPT0hMSl7dmFyIHA9ZS5jZWxsKHRoaXMpO3AuYW55KCkmJih0LnMubGFzdEZvY3VzJiZ0aGlzIT09dC5zLmxhc3RGb2N1cy5jZWxsLm5vZGUoKXx8dC5fZWRpdG9yKG51bGwsdSwhMCkpfX0pLGkub24oInByZVN1Ym1pdCIsZnVuY3Rpb24oKXtzPSEwfSkub24oInByZVN1Ym1pdENhbmNlbGxlZCIsZnVuY3Rpb24oKXtzPSExfSkub24oInN1Ym1pdENvbXBsZXRlIixmdW5jdGlvbigpe3M9ITF9KX1lLm9uKCJzdGF0ZVNhdmVQYXJhbXMiK3IsZnVuY3Rpb24odSxwLGIpe2Iua2V5VGFibGU9dC5zLmxhc3RGb2N1cz90LnMubGFzdEZvY3VzLmNlbGwuaW5kZXgoKTpudWxsfSksZS5vbigiY29sdW1uLXZpc2liaWxpdHkiK3IsZnVuY3Rpb24odSl7dC5fdGFiSW5wdXQoKX0pLGUub24oImNvbHVtbi1yZW9yZGVyIityLGZ1bmN0aW9uKHUscCxiKXt2YXIgZz10LnMubGFzdEZvY3VzO2lmKGcmJmcuY2VsbCl7dmFyIG09Zy5yZWxhdGl2ZS5jb2x1bW47Zy5jZWxsWzBdWzBdLmNvbHVtbj1iLm1hcHBpbmcuaW5kZXhPZihtKSxnLnJlbGF0aXZlLmNvbHVtbj1iLm1hcHBpbmcuaW5kZXhPZihtKX19KSxlLm9uKCJwcmVEcmF3IityKyIgc2Nyb2xsZXItd2lsbC1kcmF3IityLGZ1bmN0aW9uKHUpe3Qucy5kdERyYXdpbmc9ITB9KSxlLm9uKCJkcmF3IityLGZ1bmN0aW9uKHUpe2lmKHQucy5kdERyYXdpbmc9ITEsdC5fdGFiSW5wdXQoKSwhdC5zLmZvY3VzRHJhdyl7dmFyIHA9dC5zLmxhc3RGb2N1cztpZihwKXt2YXIgYj10LnMubGFzdEZvY3VzLnJlbGF0aXZlLGc9ZS5wYWdlLmluZm8oKSxtPWIucm93O2lmKGcucmVjb3Jkc0Rpc3BsYXk9PT0wfHxtPGcuc3RhcnR8fG0+Zy5zdGFydCtnLmxlbmd0aClyZXR1cm47bT49Zy5yZWNvcmRzRGlzcGxheSYmKG09Zy5yZWNvcmRzRGlzcGxheS0xKSx0Ll9mb2N1cyhtLGIuY29sdW1uLCEwLHUpfX19KSx0aGlzLmMuY2xpcGJvYXJkJiZ0aGlzLl9jbGlwYm9hcmQoKSxlLm9uKCJkZXN0cm95IityLGZ1bmN0aW9uKCl7dC5fYmx1cighMCksZS5vZmYociksanQoZS50YWJsZSgpLmJvZHkoKSkub2ZmKCJjbGljayIrciwidGgsIHRkIikub2ZmKCJkYmxjbGljayIrciwidGgsIHRkIiksanQoZG9jdW1lbnQpLm9mZigibW91c2Vkb3duIityKS5vZmYoImtleWRvd24iK3IpLm9mZigiY29weSIrcikub2ZmKCJwYXN0ZSIrcil9KTt2YXIgbz1lLnN0YXRlLmxvYWRlZCgpO28mJm8ua2V5VGFibGU/ZS5vbmUoImluaXQiLGZ1bmN0aW9uKCl7dmFyIHU9ZS5jZWxsKG8ua2V5VGFibGUpO3UuYW55KCkmJnUuZm9jdXMoKX0pOnRoaXMuYy5mb2N1cyYmZS5jZWxsKHRoaXMuYy5mb2N1cykuZm9jdXMoKX0sX2JsdXI6ZnVuY3Rpb24odCl7aWYoISghdGhpcy5zLmVuYWJsZXx8IXRoaXMucy5sYXN0Rm9jdXMpKXt2YXIgZT10aGlzLnMubGFzdEZvY3VzLmNlbGw7anQoZS5ub2RlKCkpLnJlbW92ZUNsYXNzKHRoaXMuYy5jbGFzc05hbWUpLHRoaXMucy5sYXN0Rm9jdXM9bnVsbCx0fHwodGhpcy5fdXBkYXRlRml4ZWRDb2x1bW5zKGUuaW5kZXgoKS5jb2x1bW4pLHRoaXMuX2VtaXRFdmVudCgia2V5LWJsdXIiLFt0aGlzLnMuZHQsZV0pKX19LF9jbGlwYm9hcmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnMuZHQsZT10aGlzLG49dGhpcy5zLm5hbWVzcGFjZSxyPXRoaXMuYy5jbGlwYm9hcmQ7d2luZG93LmdldFNlbGVjdGlvbiYmKChyPT09ITB8fHIuY29weSkmJmp0KGRvY3VtZW50KS5vbigiY29weSIrbixmdW5jdGlvbihzKXt2YXIgaT1zLm9yaWdpbmFsRXZlbnQsbz13aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKSx1PWUucy5sYXN0Rm9jdXM7IW8mJnUmJihpLmNsaXBib2FyZERhdGEuc2V0RGF0YSgidGV4dC9wbGFpbiIsdS5jZWxsLnJlbmRlcihlLmMuY2xpcGJvYXJkT3J0aG9nb25hbCkpLGkucHJldmVudERlZmF1bHQoKSl9KSwocj09PSEwfHxyLnBhc3RlKSYmanQoZG9jdW1lbnQpLm9uKCJwYXN0ZSIrbixmdW5jdGlvbihzKXt2YXIgaT1zLm9yaWdpbmFsRXZlbnQsbz1lLnMubGFzdEZvY3VzLHU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxwPWUuYy5lZGl0b3IsYjtpZihvJiYoIXV8fHUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJib2R5IikpaWYoaS5wcmV2ZW50RGVmYXVsdCgpLHdpbmRvdy5jbGlwYm9hcmREYXRhJiZ3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhP2I9d2luZG93LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgiVGV4dCIpOmkuY2xpcGJvYXJkRGF0YSYmaS5jbGlwYm9hcmREYXRhLmdldERhdGEmJihiPWkuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0L3BsYWluIikpLHApe3ZhciBnPWUuX2lubGluZU9wdGlvbnMoby5jZWxsLmluZGV4KCkpO3AuaW5saW5lKGcuY2VsbCxnLmZpZWxkLGcub3B0aW9ucykuc2V0KHAuZGlzcGxheWVkKClbMF0sYikuc3VibWl0KCl9ZWxzZSBvLmNlbGwuZGF0YShiKSx0LmRyYXcoITEpfSkpfSxfY29sdW1uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdCxlPXQuY29sdW1ucyh0aGlzLmMuY29sdW1ucykuaW5kZXhlcygpLG49W107cmV0dXJuIHQuY29sdW1ucygiOnZpc2libGUiKS5ldmVyeShmdW5jdGlvbihyKXtlLmluZGV4T2YocikhPT0tMSYmbi5wdXNoKHIpfSksbn0sX2VkaXRvcjpmdW5jdGlvbih0LGUsbil7aWYodGhpcy5zLmxhc3RGb2N1cyYmIShlJiZlLnR5cGU9PT0iZHJhdyIpKXt2YXIgcj10aGlzLHM9dGhpcy5zLmR0LGk9dGhpcy5jLmVkaXRvcixvPXRoaXMucy5sYXN0Rm9jdXMuY2VsbCx1PXRoaXMucy5uYW1lc3BhY2UrImUiK2VkKys7aWYoIWp0KCJkaXYuRFRFIixvLm5vZGUoKSkubGVuZ3RoJiYhKHQhPT1udWxsJiYodD49MCYmdDw9OXx8dD09PTExfHx0PT09MTJ8fHQ+PTE0JiZ0PD0zMXx8dD49MTEyJiZ0PD0xMjN8fHQ+PTEyNyYmdDw9MTU5KSkpe2UmJihlLnN0b3BQcm9wYWdhdGlvbigpLHQ9PT0xMyYmZS5wcmV2ZW50RGVmYXVsdCgpKTt2YXIgcD1mdW5jdGlvbigpe3ZhciBiPXIuX2lubGluZU9wdGlvbnMoby5pbmRleCgpKTtpLm9uZSgib3BlbiIrdSxmdW5jdGlvbigpe2kub2ZmKCJjYW5jZWxPcGVuIit1KSxufHxqdCgiZGl2LkRURV9GaWVsZF9JbnB1dENvbnRyb2wgaW5wdXQsIGRpdi5EVEVfRmllbGRfSW5wdXRDb250cm9sIHRleHRhcmVhIikuc2VsZWN0KCkscy5rZXlzLmVuYWJsZShuPyJ0YWItb25seSI6Im5hdmlnYXRpb24tb25seSIpLHMub24oImtleS1ibHVyLmVkaXRvciIsZnVuY3Rpb24oZyxtLEMpe2kucy5lZGl0T3B0cy5vbkJsdXIhPT0ic3VibWl0IiYmaS5kaXNwbGF5ZWQoKSYmQy5ub2RlKCk9PT1vLm5vZGUoKSYmaS5zdWJtaXQoKX0pLG4mJmp0KHMudGFibGUoKS5jb250YWluZXIoKSkuYWRkQ2xhc3MoImR0ay1mb2N1cy1hbHQiKSxpLm9uKCJwcmVTdWJtaXRDYW5jZWxsZWQiK3UsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5fZm9jdXMobyxudWxsLCExKX0sNTApfSksaS5vbigic3VibWl0VW5zdWNjZXNzZnVsIit1LGZ1bmN0aW9uKCl7ci5fZm9jdXMobyxudWxsLCExKX0pLGkub25lKCJjbG9zZSIrdSxmdW5jdGlvbigpe3Mua2V5cy5lbmFibGUoITApLHMub2ZmKCJrZXktYmx1ci5lZGl0b3IiKSxpLm9mZih1KSxqdChzLnRhYmxlKCkuY29udGFpbmVyKCkpLnJlbW92ZUNsYXNzKCJkdGstZm9jdXMtYWx0Iiksci5zLnJldHVyblN1Ym1pdCYmKHIucy5yZXR1cm5TdWJtaXQ9ITEsci5fZW1pdEV2ZW50KCJrZXktcmV0dXJuLXN1Ym1pdCIsW3Msb10pKX0pfSkub25lKCJjYW5jZWxPcGVuIit1LGZ1bmN0aW9uKCl7aS5vZmYodSl9KS5pbmxpbmUoYi5jZWxsLGIuZmllbGQsYi5vcHRpb25zKX07dD09PTEzPyhuPSEwLGp0KGRvY3VtZW50KS5vbmUoImtleXVwIixmdW5jdGlvbigpe3AoKX0pKTpwKCl9fX0sX2lubGluZU9wdGlvbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYy5lZGl0b3JPcHRpb25zP3RoaXMuYy5lZGl0b3JPcHRpb25zKHQpOntjZWxsOnQsZmllbGQ6dm9pZCAwLG9wdGlvbnM6dm9pZCAwfX0sX2VtaXRFdmVudDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnMuZHQuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihuLHIpe3JldHVybiBqdChuLm5UYWJsZSkudHJpZ2dlckhhbmRsZXIodCxlKX0pfSxfZm9jdXM6ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9dGhpcyxpPXRoaXMucy5kdCxvPWkucGFnZS5pbmZvKCksdT10aGlzLnMubGFzdEZvY3VzO2lmKHJ8fChyPW51bGwpLCEhdGhpcy5zLmVuYWJsZSl7aWYodHlwZW9mIHQhPSJudW1iZXIiKXtpZighdC5hbnkoKSlyZXR1cm47dmFyIHA9dC5pbmRleCgpO2lmKGU9cC5jb2x1bW4sdD1pLnJvd3Moe2ZpbHRlcjoiYXBwbGllZCIsb3JkZXI6ImFwcGxpZWQifSkuaW5kZXhlcygpLmluZGV4T2YocC5yb3cpLHQ8MClyZXR1cm47by5zZXJ2ZXJTaWRlJiYodCs9by5zdGFydCl9aWYoby5sZW5ndGghPT0tMSYmKHQ8by5zdGFydHx8dD49by5zdGFydCtvLmxlbmd0aCkpe3RoaXMucy5mb2N1c0RyYXc9ITAsdGhpcy5zLndhaXRpbmdGb3JEcmF3PSEwLGkub25lKCJkcmF3IixmdW5jdGlvbigpe3Mucy5mb2N1c0RyYXc9ITEscy5zLndhaXRpbmdGb3JEcmF3PSExLHMuX2ZvY3VzKHQsZSx2b2lkIDAscil9KS5wYWdlKE1hdGguZmxvb3IodC9vLmxlbmd0aCkpLmRyYXcoITEpO3JldHVybn1pZihqdC5pbkFycmF5KGUsdGhpcy5fY29sdW1ucygpKSE9PS0xKXtvLnNlcnZlclNpZGUmJih0LT1vLnN0YXJ0KTt2YXIgYj1pLmNlbGxzKG51bGwsZSx7c2VhcmNoOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5mbGF0dGVuKCksZz1pLmNlbGwoYlt0XSksbT10aGlzLl9lbWl0RXZlbnQoImtleS1wcmVmb2N1cyIsW3RoaXMucy5kdCxnLHJ8fG51bGxdKTtpZihtLmluZGV4T2YoITEpPT09LTEpe2lmKHUpe2lmKHUubm9kZT09PWcubm9kZSgpKXt0aGlzLl9lbWl0RXZlbnQoImtleS1yZWZvY3VzIixbdGhpcy5zLmR0LGcscnx8bnVsbF0pO3JldHVybn10aGlzLl9ibHVyKCl9dGhpcy5fcmVtb3ZlT3RoZXJGb2N1cygpO3ZhciBDPWp0KGcubm9kZSgpKTtpZihDLmFkZENsYXNzKHRoaXMuYy5jbGFzc05hbWUpLHRoaXMuX3VwZGF0ZUZpeGVkQ29sdW1ucyhlKSxuPT09dm9pZCAwfHxuPT09ITApe3RoaXMuX3Njcm9sbChqdCh3aW5kb3cpLGp0KGRvY3VtZW50LmJvZHkpLEMsIm9mZnNldCIpO3ZhciB5PWkudGFibGUoKS5ib2R5KCkucGFyZW50Tm9kZTtpZih5IT09aS50YWJsZSgpLmhlYWRlcigpLnBhcmVudE5vZGUpe3ZhciBUPWp0KHkucGFyZW50Tm9kZSk7dGhpcy5fc2Nyb2xsKFQsVCxDLCJwb3NpdGlvbiIpfX12YXIgUD1pLnBhZ2UuaW5mbygpO3RoaXMucy5sYXN0Rm9jdXM9e2NlbGw6Zyxub2RlOmcubm9kZSgpLHJlbGF0aXZlOntyb3c6UC5zdGFydCtpLnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuaW5kZXhlcygpLmluZGV4T2YoZy5pbmRleCgpLnJvdyksY29sdW1uOmcuaW5kZXgoKS5jb2x1bW59fSx0aGlzLl9lbWl0RXZlbnQoImtleS1mb2N1cyIsW3RoaXMucy5kdCxnLHJ8fG51bGxdKSxpLnN0YXRlLnNhdmUoKX19fX0sX2tleTpmdW5jdGlvbih0KXtpZih0aGlzLnMud2FpdGluZ0ZvckRyYXcpe3QucHJldmVudERlZmF1bHQoKTtyZXR1cm59aWYoIWp0KHQudGFyZ2V0KS5jbG9zZXN0KCIuZHRlLWlubGluZUFkZCIpLmxlbmd0aCl7dmFyIGU9dGhpcy5zLmVuYWJsZTt0aGlzLnMucmV0dXJuU3VibWl0PShlPT09Im5hdmlnYXRpb24tb25seSJ8fGU9PT0idGFiLW9ubHkiKSYmdC5rZXlDb2RlPT09MTM7dmFyIG49ZT09PSEwfHxlPT09Im5hdmlnYXRpb24tb25seSI7aWYoZSYmISgodC5rZXlDb2RlPT09MHx8dC5jdHJsS2V5fHx0Lm1ldGFLZXl8fHQuYWx0S2V5KSYmISh0LmN0cmxLZXkmJnQuYWx0S2V5KSkpe3ZhciByPXRoaXMucy5sYXN0Rm9jdXM7aWYocil7aWYoIXRoaXMucy5kdC5jZWxsKHIubm9kZSkuYW55KCkpe3RoaXMucy5sYXN0Rm9jdXM9bnVsbDtyZXR1cm59dmFyIHM9dGhpcyxpPXRoaXMucy5kdCxvPSEhdGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub1Njcm9sbC5zWTtpZighKHRoaXMuYy5rZXlzJiZqdC5pbkFycmF5KHQua2V5Q29kZSx0aGlzLmMua2V5cyk9PT0tMSkpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSA5OnQucHJldmVudERlZmF1bHQoKSx0aGlzLl9rZXlBY3Rpb24oZnVuY3Rpb24oKXtzLl9zaGlmdCh0LHQuc2hpZnRLZXk/ImxlZnQiOiJyaWdodCIsITApfSk7YnJlYWs7Y2FzZSAyNzppZihqdChyLm5vZGUpLmZpbmQoImRpdi5EVEUiKS5sZW5ndGgpcmV0dXJuO3RoaXMuYy5ibHVyYWJsZSYmZT09PSEwJiZ0aGlzLl9ibHVyKCk7YnJlYWs7Y2FzZSAzMzpjYXNlIDM0Om4mJiFvJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe2kucGFnZSh0LmtleUNvZGU9PT0zMz8icHJldmlvdXMiOiJuZXh0IikuZHJhdyghMSl9KSk7YnJlYWs7Y2FzZSAzNTpjYXNlIDM2Om4mJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7dmFyIHU9aS5jZWxscyh7cGFnZToiY3VycmVudCJ9KS5pbmRleGVzKCkscD1zLl9jb2x1bW5zKCk7cy5fZm9jdXMoaS5jZWxsKHVbdC5rZXlDb2RlPT09MzU/dS5sZW5ndGgtMTpwWzBdXSksbnVsbCwhMCx0KX0pKTticmVhaztjYXNlIDM3Om4mJnRoaXMuX2tleUFjdGlvbihmdW5jdGlvbigpe3MuX3NoaWZ0KHQsImxlZnQiKX0pO2JyZWFrO2Nhc2UgMzg6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwidXAiKX0pO2JyZWFrO2Nhc2UgMzk6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwicmlnaHQiKX0pO2JyZWFrO2Nhc2UgNDA6biYmdGhpcy5fa2V5QWN0aW9uKGZ1bmN0aW9uKCl7cy5fc2hpZnQodCwiZG93biIpfSk7YnJlYWs7Y2FzZSAxMTM6aWYodGhpcy5jLmVkaXRvcil7dGhpcy5fZWRpdG9yKG51bGwsdCwhMCk7YnJlYWt9ZGVmYXVsdDplPT09ITAmJnRoaXMuX2VtaXRFdmVudCgia2V5IixbaSx0LmtleUNvZGUsdGhpcy5zLmxhc3RGb2N1cy5jZWxsLHRdKTticmVha319fX19LF9rZXlBY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jLmVkaXRvcjtlJiZlLm1vZGUoKSYmZS5kaXNwbGF5KCk/ZS5zdWJtaXQodCk6dCgpfSxfcmVtb3ZlT3RoZXJGb2N1czpmdW5jdGlvbigpe3ZhciB0PXRoaXMucy5kdC50YWJsZSgpLm5vZGUoKTtqdC5mbi5kYXRhVGFibGUudGFibGVzKHthcGk6ITB9KS5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe3RoaXMudGFibGUoKS5ub2RlKCkhPT10JiZ0aGlzLmNlbGwuYmx1cigpfSl9LF9zY3JvbGw6ZnVuY3Rpb24odCxlLG4scil7dmFyIHM9bltyXSgpLGk9bi5vdXRlckhlaWdodCgpLG89bi5vdXRlcldpZHRoKCksdT1lLnNjcm9sbFRvcCgpLHA9ZS5zY3JvbGxMZWZ0KCksYj10LmhlaWdodCgpLGc9dC53aWR0aCgpO3I9PT0icG9zaXRpb24iJiYocy50b3ArPXBhcnNlSW50KG4uY2xvc2VzdCgidGFibGUiKS5jc3MoInRvcCIpLDEwKSkscy50b3A8dSYmcy50b3AraT51LTUmJmUuc2Nyb2xsVG9wKHMudG9wKSxzLmxlZnQ8cCYmZS5zY3JvbGxMZWZ0KHMubGVmdCkscy50b3AraT51K2ImJnMudG9wPHUrYis1JiZpPGImJmUuc2Nyb2xsVG9wKHMudG9wK2ktYikscy5sZWZ0K28+cCtnJiZvPGcmJmUuc2Nyb2xsTGVmdChzLmxlZnQrby1nKX0sX3NoaWZ0OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLnMuZHQscz1yLnBhZ2UuaW5mbygpLGk9cy5yZWNvcmRzRGlzcGxheSxvPXRoaXMuX2NvbHVtbnMoKSx1PXRoaXMucy5sYXN0Rm9jdXM7aWYodSl7dmFyIHA9dS5jZWxsO2lmKHApe3ZhciBiPXIucm93cyh7ZmlsdGVyOiJhcHBsaWVkIixvcmRlcjoiYXBwbGllZCJ9KS5pbmRleGVzKCkuaW5kZXhPZihwLmluZGV4KCkucm93KTtzLnNlcnZlclNpZGUmJihiKz1zLnN0YXJ0KTt2YXIgZz1yLmNvbHVtbnMobykuaW5kZXhlcygpLmluZGV4T2YocC5pbmRleCgpLmNvbHVtbiksbT1iLEM9b1tnXTtqdChyLnRhYmxlKCkubm9kZSgpKS5jc3MoImRpcmVjdGlvbiIpPT09InJ0bCImJihlPT09InJpZ2h0Ij9lPSJsZWZ0IjplPT09ImxlZnQiJiYoZT0icmlnaHQiKSksZT09PSJyaWdodCI/Zz49by5sZW5ndGgtMT8obSsrLEM9b1swXSk6Qz1vW2crMV06ZT09PSJsZWZ0Ij9nPT09MD8obS0tLEM9b1tvLmxlbmd0aC0xXSk6Qz1vW2ctMV06ZT09PSJ1cCI/bS0tOmU9PT0iZG93biImJm0rKyxtPj0wJiZtPGkmJmp0LmluQXJyYXkoQyxvKSE9PS0xPyh0JiZ0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fZm9jdXMobSxDLCEwLHQpKTohbnx8IXRoaXMuYy5ibHVyYWJsZT90JiZ0LnByZXZlbnREZWZhdWx0KCk6dGhpcy5fYmx1cigpfX19LF90YWJJbnB1dDpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZHQsbj10aGlzLmMudGFiSW5kZXghPT1udWxsP3RoaXMuYy50YWJJbmRleDplLnNldHRpbmdzKClbMF0uaVRhYkluZGV4O2lmKG4hPS0xKXtpZighdGhpcy5zLnRhYklucHV0KXt2YXIgcj1qdCgnPGRpdj48aW5wdXQgdHlwZT0idGV4dCIgdGFiaW5kZXg9IicrbisnIi8+PC9kaXY+JykuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGhlaWdodDoxLHdpZHRoOjAsb3ZlcmZsb3c6ImhpZGRlbiJ9KTtyLmNoaWxkcmVuKCkub24oImZvY3VzIixmdW5jdGlvbihpKXt2YXIgbz1lLmNlbGwoIjplcSgwKSIsdC5fY29sdW1ucygpLHtwYWdlOiJjdXJyZW50In0pO28uYW55KCkmJnQuX2ZvY3VzKG8sbnVsbCwhMCxpKX0pLHRoaXMucy50YWJJbnB1dD1yfXZhciBzPXRoaXMucy5kdC5jZWxsKCI6ZXEoMCkiLCIwOnZpc2libGUiLHtwYWdlOiJjdXJyZW50IixvcmRlcjoiY3VycmVudCJ9KS5ub2RlKCk7cyYmanQocykucHJlcGVuZCh0aGlzLnMudGFiSW5wdXQpfX0sX3VwZGF0ZUZpeGVkQ29sdW1uczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnMuZHQsbj1lLnNldHRpbmdzKClbMF07aWYobi5fb0ZpeGVkQ29sdW1ucyl7dmFyIHI9bi5fb0ZpeGVkQ29sdW1ucy5zLmlMZWZ0Q29sdW1ucyxzPW4uYW9Db2x1bW5zLmxlbmd0aC1uLl9vRml4ZWRDb2x1bW5zLnMuaVJpZ2h0Q29sdW1uczsodDxyfHx0Pj1zKSYmZS5maXhlZENvbHVtbnMoKS51cGRhdGUoKX19fSk7X24uZGVmYXVsdHM9e2JsdXJhYmxlOiEwLGNsYXNzTmFtZToiZm9jdXMiLGNsaXBib2FyZDohMCxjbGlwYm9hcmRPcnRob2dvbmFsOiJkaXNwbGF5Iixjb2x1bW5zOiIiLGVkaXRvcjpudWxsLGVkaXRPbkZvY3VzOiExLGVkaXRvck9wdGlvbnM6bnVsbCxmb2N1czpudWxsLGtleXM6bnVsbCx0YWJJbmRleDpudWxsfTtfbi52ZXJzaW9uPSIyLjEyLjEiO2p0LmZuLmRhdGFUYWJsZS5LZXlUYWJsZT1fbjtqdC5mbi5EYXRhVGFibGUuS2V5VGFibGU9X247YXQuQXBpLnJlZ2lzdGVyKCJjZWxsLmJsdXIoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qua2V5dGFibGUmJnQua2V5dGFibGUuYmx1cigpfSl9KTthdC5BcGkucmVnaXN0ZXIoImNlbGwoKS5mb2N1cygpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbih0LGUsbil7dC5rZXl0YWJsZSYmdC5rZXl0YWJsZS5mb2N1cyhlLG4pfSl9KTthdC5BcGkucmVnaXN0ZXIoImtleXMuZGlzYWJsZSgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24odCl7dC5rZXl0YWJsZSYmdC5rZXl0YWJsZS5lbmFibGUoITEpfSl9KTthdC5BcGkucmVnaXN0ZXIoImtleXMuZW5hYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5rZXl0YWJsZSYmZS5rZXl0YWJsZS5lbmFibGUodD09PXZvaWQgMD8hMDp0KX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJrZXlzLmVuYWJsZWQoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250ZXh0O3JldHVybiBlLmxlbmd0aCYmZVswXS5rZXl0YWJsZT9lWzBdLmtleXRhYmxlLmVuYWJsZWQoKTohMX0pO2F0LkFwaS5yZWdpc3Rlcigia2V5cy5tb3ZlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5rZXl0YWJsZSYmZS5rZXl0YWJsZS5fc2hpZnQobnVsbCx0LCExKX0pfSk7YXQuZXh0LnNlbGVjdG9yLmNlbGwucHVzaChmdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5mb2N1c2VkLHM9dC5rZXl0YWJsZSxpPVtdO2lmKCFzfHxyPT09dm9pZCAwKXJldHVybiBuO2Zvcih2YXIgbz0wLHU9bi5sZW5ndGg7bzx1O28rKykocj09PSEwJiZzLmZvY3VzZWQobltvXSl8fHI9PT0hMSYmIXMuZm9jdXNlZChuW29dKSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0pO2p0KGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdGsiLGZ1bmN0aW9uKHQsZSxuKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQua2V5cyxzPWF0LmRlZmF1bHRzLmtleXM7aWYocnx8cyl7dmFyIGk9anQuZXh0ZW5kKHt9LHMscik7ciE9PSExJiZuZXcgX24oZSxpKX19fSk7dmFyIHJkPWllKGFlKCksMSk7dmFyIFhzPWllKGFlKCksMSk7dmFyIHplPVhzLmRlZmF1bHQsQ249ZnVuY3Rpb24odCxlKXtpZighYXQudmVyc2lvbkNoZWNrfHwhYXQudmVyc2lvbkNoZWNrKCIxLjExIikpdGhyb3ciUm93R3JvdXAgcmVxdWlyZXMgRGF0YVRhYmxlcyAxLjExIG9yIG5ld2VyIjt0aGlzLmM9emUuZXh0ZW5kKCEwLHt9LGF0LmRlZmF1bHRzLnJvd0dyb3VwLENuLmRlZmF1bHRzLGUpLHRoaXMucz17ZHQ6bmV3IGF0LkFwaSh0KX0sdGhpcy5kb209e307dmFyIG49dGhpcy5zLmR0LnNldHRpbmdzKClbMF0scj1uLnJvd0dyb3VwO2lmKHIpcmV0dXJuIHI7bi5yb3dHcm91cD10aGlzLHRoaXMuX2NvbnN0cnVjdG9yKCl9O3plLmV4dGVuZChDbi5wcm90b3R5cGUse2RhdGFTcmM6ZnVuY3Rpb24odCl7aWYodD09PXZvaWQgMClyZXR1cm4gdGhpcy5jLmRhdGFTcmM7dmFyIGU9dGhpcy5zLmR0O3JldHVybiB0aGlzLmMuZGF0YVNyYz10LHplKGUudGFibGUoKS5ub2RlKCkpLnRyaWdnZXJIYW5kbGVyKCJyb3dncm91cC1kYXRhc3JjLmR0IixbZSx0XSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuZW5hYmxlPSExLHRoaXN9LGVuYWJsZTpmdW5jdGlvbih0KXtyZXR1cm4gdD09PSExP3RoaXMuZGlzYWJsZSgpOih0aGlzLmMuZW5hYmxlPSEwLHRoaXMpfSxlbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5lbmFibGV9LF9jb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZHQsbj1lLnNldHRpbmdzKClbMF07ZS5vbigiZHJhdy5kdHJnIixmdW5jdGlvbihyLHMpe3QuYy5lbmFibGUmJm49PT1zJiZ0Ll9kcmF3KCl9KSxlLm9uKCJjb2x1bW4tdmlzaWJpbGl0eS5kdC5kdHJnIHJlc3BvbnNpdmUtcmVzaXplLmR0LmR0cmciLGZ1bmN0aW9uKCl7dC5fYWRqdXN0Q29sc3BhbigpfSksZS5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtlLm9mZigiLmR0cmciKX0pfSxfYWRqdXN0Q29sc3BhbjpmdW5jdGlvbigpe3plKCJ0ci4iK3RoaXMuYy5jbGFzc05hbWUsdGhpcy5zLmR0LnRhYmxlKCkuYm9keSgpKS5maW5kKCJ0aDp2aXNpYmxlLCB0ZDp2aXNpYmxlIikuYXR0cigiY29sc3BhbiIsdGhpcy5fY29sc3BhbigpKX0sX2NvbHNwYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zLmR0LmNvbHVtbnMoKS52aXNpYmxlKCkucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZX0sMCl9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zLmR0LGU9dGhpcy5fZ3JvdXAoMCx0LnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuaW5kZXhlcygpKTt0aGlzLl9ncm91cERpc3BsYXkoMCxlKX0sX2dyb3VwOmZ1bmN0aW9uKHQsZSl7dmFyIG49QXJyYXkuaXNBcnJheSh0aGlzLmMuZGF0YVNyYyk/dGhpcy5jLmRhdGFTcmM6W3RoaXMuYy5kYXRhU3JjXSxyPWF0LnV0aWwuZ2V0KG5bdF0pLHM9dGhpcy5zLmR0LGksbyx1LHAsYj1bXSxnPXRoaXM7Zm9yKHU9MCxwPWUubGVuZ3RoO3U8cDt1Kyspe3ZhciBtPWVbdV0sQz1zLnJvdyhtKS5kYXRhKCk7aT1yKEMsdCksaT09bnVsbCYmKGk9Zy5jLmVtcHR5RGF0YUdyb3VwKSwobz09PXZvaWQgMHx8aSE9PW8pJiYoYi5wdXNoKHtkYXRhUG9pbnQ6aSxyb3dzOltdfSksbz1pKSxiW2IubGVuZ3RoLTFdLnJvd3MucHVzaChtKX1pZihuW3QrMV0hPT12b2lkIDApZm9yKHU9MCxwPWIubGVuZ3RoO3U8cDt1KyspYlt1XS5jaGlsZHJlbj10aGlzLl9ncm91cCh0KzEsYlt1XS5yb3dzKTtyZXR1cm4gYn0sX2dyb3VwRGlzcGxheTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnMuZHQscixzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXt2YXIgbz1lW3NdLHU9by5kYXRhUG9pbnQscCxiPW8ucm93czt0aGlzLmMuc3RhcnRSZW5kZXImJihyPXRoaXMuYy5zdGFydFJlbmRlci5jYWxsKHRoaXMsbi5yb3dzKGIpLHUsdCkscD10aGlzLl9yb3dXcmFwKHIsdGhpcy5jLnN0YXJ0Q2xhc3NOYW1lLHQpLHAmJnAuaW5zZXJ0QmVmb3JlKG4ucm93KGJbMF0pLm5vZGUoKSkpLHRoaXMuYy5lbmRSZW5kZXImJihyPXRoaXMuYy5lbmRSZW5kZXIuY2FsbCh0aGlzLG4ucm93cyhiKSx1LHQpLHA9dGhpcy5fcm93V3JhcChyLHRoaXMuYy5lbmRDbGFzc05hbWUsdCkscCYmcC5pbnNlcnRBZnRlcihuLnJvdyhiW2IubGVuZ3RoLTFdKS5ub2RlKCkpKSxvLmNoaWxkcmVuJiZ0aGlzLl9ncm91cERpc3BsYXkodCsxLG8uY2hpbGRyZW4pfX0sX3Jvd1dyYXA6ZnVuY3Rpb24odCxlLG4pe3ZhciByO3JldHVybih0PT09bnVsbHx8dD09PSIiKSYmKHQ9dGhpcy5jLmVtcHR5RGF0YUdyb3VwKSx0PT1udWxsP251bGw6KHR5cGVvZiB0PT0ib2JqZWN0IiYmdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09InRyIj9yPXplKHQpOnQgaW5zdGFuY2VvZiB6ZSYmdC5sZW5ndGgmJnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJ0ciI/cj10OnI9emUoIjx0ci8+IikuYXBwZW5kKHplKCI8dGgvPiIpLmF0dHIoImNvbHNwYW4iLHRoaXMuX2NvbHNwYW4oKSkuYXR0cigic2NvcGUiLCJyb3ciKS5hcHBlbmQodCkpLHIuYWRkQ2xhc3ModGhpcy5jLmNsYXNzTmFtZSkuYWRkQ2xhc3MoZSkuYWRkQ2xhc3MoImR0cmctbGV2ZWwtIituKSl9fSk7Q24uZGVmYXVsdHM9e2NsYXNzTmFtZToiZHRyZy1ncm91cCIsZGF0YVNyYzowLGVtcHR5RGF0YUdyb3VwOiJObyBncm91cCIsZW5hYmxlOiEwLGVuZENsYXNzTmFtZToiZHRyZy1lbmQiLGVuZFJlbmRlcjpudWxsLHN0YXJ0Q2xhc3NOYW1lOiJkdHJnLXN0YXJ0IixzdGFydFJlbmRlcjpmdW5jdGlvbih0LGUpe3JldHVybiBlfX07Q24udmVyc2lvbj0iMS41LjAiO3plLmZuLmRhdGFUYWJsZS5Sb3dHcm91cD1Dbjt6ZS5mbi5EYXRhVGFibGUuUm93R3JvdXA9Q247YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpIixmdW5jdGlvbigpe3JldHVybiB0aGlzfSk7YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpLmRpc2FibGUoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe3Qucm93R3JvdXAmJnQucm93R3JvdXAuZW5hYmxlKCExKX0pfSk7YXQuQXBpLnJlZ2lzdGVyKCJyb3dHcm91cCgpLmVuYWJsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uucm93R3JvdXAmJmUucm93R3JvdXAuZW5hYmxlKHQ9PT12b2lkIDA/ITA6dCl9KX0pO2F0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5lbmFibGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0O3JldHVybiB0Lmxlbmd0aCYmdFswXS5yb3dHcm91cD90WzBdLnJvd0dyb3VwLmVuYWJsZWQoKTohMX0pO2F0LkFwaS5yZWdpc3Rlcigicm93R3JvdXAoKS5kYXRhU3JjKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5yb3dHcm91cC5kYXRhU3JjKCk6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2Uucm93R3JvdXAmJmUucm93R3JvdXAuZGF0YVNyYyh0KX0pfSk7emUoZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0cmciLGZ1bmN0aW9uKHQsZSxuKXtpZih0Lm5hbWVzcGFjZT09PSJkdCIpe3ZhciByPWUub0luaXQucm93R3JvdXAscz1hdC5kZWZhdWx0cy5yb3dHcm91cDtpZihyfHxzKXt2YXIgaT16ZS5leHRlbmQoe30scyxyKTtyIT09ITEmJm5ldyBDbihlLGkpfX19KTt2YXIgWXM9aWUoYWUoKSwxKTt2YXIgTXQ9WXMuZGVmYXVsdCxjZSxkZT1mdW5jdGlvbih0LGUpe2lmKGRlLmZhY3RvcnkodCxlKSlyZXR1cm4gZGU7dHlwZW9mIGNlPiJ1IiYmKGNlPXdpbmRvdy5tb21lbnQ/d2luZG93Lm1vbWVudDp3aW5kb3cuZGF5anM/d2luZG93LmRheWpzOndpbmRvdy5sdXhvbj93aW5kb3cubHV4b246bnVsbCksdGhpcy5jPU10LmV4dGVuZCghMCx7fSxkZS5kZWZhdWx0cyxlKTt2YXIgbj10aGlzLmMuY2xhc3NQcmVmaXg7aWYoIWNlJiZ0aGlzLmMuZm9ybWF0IT09IllZWVktTU0tREQiKXRocm93IkRhdGVUaW1lOiBXaXRob3V0IG1vbWVudGpzLCBkYXlqcyBvciBsdXhvbiBvbmx5IHRoZSBmb3JtYXQgJ1lZWVktTU0tREQnIGNhbiBiZSB1c2VkIjt0eXBlb2YgdGhpcy5jLm1pbkRhdGU9PSJzdHJpbmciJiYodGhpcy5jLm1pbkRhdGU9bmV3IERhdGUodGhpcy5jLm1pbkRhdGUpKSx0eXBlb2YgdGhpcy5jLm1heERhdGU9PSJzdHJpbmciJiYodGhpcy5jLm1heERhdGU9bmV3IERhdGUodGhpcy5jLm1heERhdGUpKTt2YXIgcj1NdCgnPGRpdiBjbGFzcz0iJytuKyciPjxkaXYgY2xhc3M9IicrbisnLWRhdGUiPjxkaXYgY2xhc3M9IicrbisnLXRpdGxlIj48ZGl2IGNsYXNzPSInK24rJy1pY29uTGVmdCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWljb25SaWdodCI+PGJ1dHRvbiB0eXBlPSJidXR0b24iPjwvYnV0dG9uPjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWxhYmVsIj48c3Bhbj48L3NwYW4+PHNlbGVjdCBjbGFzcz0iJytuKyctbW9udGgiPjwvc2VsZWN0PjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLWxhYmVsIj48c3Bhbj48L3NwYW4+PHNlbGVjdCBjbGFzcz0iJytuKycteWVhciI+PC9zZWxlY3Q+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iJytuKyctYnV0dG9ucyI+PGEgY2xhc3M9IicrbisnLWNsZWFyIj48L2E+PGEgY2xhc3M9IicrbisnLXRvZGF5Ij48L2E+PC9kaXY+PGRpdiBjbGFzcz0iJytuKyctY2FsZW5kYXIiPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9IicrbisnLXRpbWUiPjxkaXYgY2xhc3M9IicrbisnLWhvdXJzIj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1taW51dGVzIj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1zZWNvbmRzIj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSInK24rJy1lcnJvciI+PC9kaXY+PC9kaXY+Jyk7dGhpcy5kb209e2NvbnRhaW5lcjpyLGRhdGU6ci5maW5kKCIuIituKyItZGF0ZSIpLHRpdGxlOnIuZmluZCgiLiIrbisiLXRpdGxlIiksY2FsZW5kYXI6ci5maW5kKCIuIituKyItY2FsZW5kYXIiKSx0aW1lOnIuZmluZCgiLiIrbisiLXRpbWUiKSxlcnJvcjpyLmZpbmQoIi4iK24rIi1lcnJvciIpLGJ1dHRvbnM6ci5maW5kKCIuIituKyItYnV0dG9ucyIpLGNsZWFyOnIuZmluZCgiLiIrbisiLWNsZWFyIiksdG9kYXk6ci5maW5kKCIuIituKyItdG9kYXkiKSxwcmV2aW91czpyLmZpbmQoIi4iK24rIi1pY29uTGVmdCIpLG5leHQ6ci5maW5kKCIuIituKyItaWNvblJpZ2h0IiksaW5wdXQ6TXQodCl9LHRoaXMucz17ZDpudWxsLGRpc3BsYXk6bnVsbCxtaW51dGVzUmFuZ2U6bnVsbCxzZWNvbmRzUmFuZ2U6bnVsbCxuYW1lc3BhY2U6ImRhdGVpbWUtIitkZS5faW5zdGFuY2UrKyxwYXJ0czp7ZGF0ZTp0aGlzLmMuZm9ybWF0Lm1hdGNoKC9bWU1EXXxMKD8hVCl8bC8pIT09bnVsbCx0aW1lOnRoaXMuYy5mb3JtYXQubWF0Y2goL1tIaG1dfExUfExUUy8pIT09bnVsbCxzZWNvbmRzOnRoaXMuYy5mb3JtYXQuaW5kZXhPZigicyIpIT09LTEsaG91cnMxMjp0aGlzLmMuZm9ybWF0Lm1hdGNoKC9baGFBXS8pIT09bnVsbH19LHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0ZSkuYXBwZW5kKHRoaXMuZG9tLnRpbWUpLmFwcGVuZCh0aGlzLmRvbS5lcnJvciksdGhpcy5kb20uZGF0ZS5hcHBlbmQodGhpcy5kb20udGl0bGUpLmFwcGVuZCh0aGlzLmRvbS5idXR0b25zKS5hcHBlbmQodGhpcy5kb20uY2FsZW5kYXIpLHRoaXMuZG9tLmlucHV0LmFkZENsYXNzKCJkdC1kYXRldGltZSIpLHRoaXMuX2NvbnN0cnVjdG9yKCl9O010LmV4dGVuZChkZS5wcm90b3R5cGUse2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9oaWRlKCEwKSx0aGlzLmRvbS5jb250YWluZXIub2ZmKCkuZW1wdHkoKSx0aGlzLmRvbS5pbnB1dC5yZW1vdmVDbGFzcygiZHQtZGF0ZXRpbWUiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5vZmYoIi5kYXRldGltZSIpfSxkaXNwbGF5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT12b2lkIDAmJnRoaXMucy5kaXNwbGF5LnNldFVUQ0Z1bGxZZWFyKHQpLGUhPT12b2lkIDAmJnRoaXMucy5kaXNwbGF5LnNldFVUQ01vbnRoKGUtMSksdCE9PXZvaWQgMHx8ZSE9PXZvaWQgMD8odGhpcy5fc2V0VGl0bGUoKSx0aGlzLl9zZXRDYWxhbmRlcigpLHRoaXMpOnttb250aDp0aGlzLnMuZGlzcGxheS5nZXRVVENNb250aCgpKzEseWVhcjp0aGlzLnMuZGlzcGxheS5nZXRVVENGdWxsWWVhcigpfX0sZXJyb3JNc2c6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kb20uZXJyb3I7cmV0dXJuIHQ/ZS5odG1sKHQpOmUuZW1wdHkoKSx0aGlzfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hpZGUoKSx0aGlzfSxtYXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuYy5tYXhEYXRlPXR5cGVvZiB0PT0ic3RyaW5nIj9uZXcgRGF0ZSh0KTp0LHRoaXMuX29wdGlvbnNUaXRsZSgpLHRoaXMuX3NldENhbGFuZGVyKCksdGhpc30sbWluOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmMubWluRGF0ZT10eXBlb2YgdD09InN0cmluZyI/bmV3IERhdGUodCk6dCx0aGlzLl9vcHRpb25zVGl0bGUoKSx0aGlzLl9zZXRDYWxhbmRlcigpLHRoaXN9LG93bnM6ZnVuY3Rpb24odCl7cmV0dXJuIE10KHQpLnBhcmVudHMoKS5maWx0ZXIodGhpcy5kb20uY29udGFpbmVyKS5sZW5ndGg+MH0sdmFsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT12b2lkIDA/dGhpcy5zLmQ6KHQgaW5zdGFuY2VvZiBEYXRlP3RoaXMucy5kPXRoaXMuX2RhdGVUb1V0Yyh0KTp0PT09bnVsbHx8dD09PSIiP3RoaXMucy5kPW51bGw6dD09PSItLW5vdyI/dGhpcy5zLmQ9dGhpcy5fZGF0ZVRvVXRjKG5ldyBEYXRlKTp0eXBlb2YgdD09InN0cmluZyImJih0aGlzLnMuZD10aGlzLl9kYXRlVG9VdGModGhpcy5fY29udmVydCh0LHRoaXMuYy5mb3JtYXQsbnVsbCkpKSwoZXx8ZT09PXZvaWQgMCkmJih0aGlzLnMuZD90aGlzLl93cml0ZU91dHB1dCgpOnRoaXMuZG9tLmlucHV0LnZhbCh0KSksdGhpcy5zLmRpc3BsYXk9dGhpcy5zLmQ/bmV3IERhdGUodGhpcy5zLmQudG9TdHJpbmcoKSk6bmV3IERhdGUsdGhpcy5zLmRpc3BsYXkuc2V0VVRDRGF0ZSgxKSx0aGlzLl9zZXRUaXRsZSgpLHRoaXMuX3NldENhbGFuZGVyKCksdGhpcy5fc2V0VGltZSgpLHRoaXMpfSx2YWxGb3JtYXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT8odGhpcy52YWwodGhpcy5fY29udmVydChlLHQsbnVsbCkpLHRoaXMpOnRoaXMuX2NvbnZlcnQodGhpcy52YWwoKSxudWxsLHQpfSxfY29uc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5jLmNsYXNzUHJlZml4LG49dGhpcy5kb20uaW5wdXQudmFsKCkscj1mdW5jdGlvbigpe3ZhciBzPXQuZG9tLmlucHV0LnZhbCgpO3MhPT1uJiYodC5jLm9uQ2hhbmdlLmNhbGwodCxzLHQucy5kLHQuZG9tLmlucHV0KSxuPXMpfTt0aGlzLnMucGFydHMuZGF0ZXx8dGhpcy5kb20uZGF0ZS5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5zLnBhcnRzLnRpbWV8fHRoaXMuZG9tLnRpbWUuY3NzKCJkaXNwbGF5Iiwibm9uZSIpLHRoaXMucy5wYXJ0cy5zZWNvbmRzfHwodGhpcy5kb20udGltZS5jaGlsZHJlbigiZGl2LiIrZSsiLXNlY29uZHMiKS5yZW1vdmUoKSx0aGlzLmRvbS50aW1lLmNoaWxkcmVuKCJzcGFuIikuZXEoMSkucmVtb3ZlKCkpLHRoaXMuYy5idXR0b25zLmNsZWFyfHx0aGlzLmRvbS5jbGVhci5jc3MoImRpc3BsYXkiLCJub25lIiksdGhpcy5jLmJ1dHRvbnMudG9kYXl8fHRoaXMuZG9tLnRvZGF5LmNzcygiZGlzcGxheSIsIm5vbmUiKSx0aGlzLl9vcHRpb25zVGl0bGUoKSxNdChkb2N1bWVudCkub24oImkxOG4uZHQiLGZ1bmN0aW9uKHMsaSl7aS5vTGFuZ3VhZ2UuZGF0ZXRpbWUmJihNdC5leHRlbmQoITAsdC5jLmkxOG4saS5vTGFuZ3VhZ2UuZGF0ZXRpbWUpLHQuX29wdGlvbnNUaXRsZSgpKX0pLHRoaXMuZG9tLmlucHV0LmF0dHIoInR5cGUiKT09PSJoaWRkZW4iJiYodGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKCJpbmxpbmUiKSx0aGlzLmMuYXR0YWNoVG89ImlucHV0Iix0aGlzLnZhbCh0aGlzLmRvbS5pbnB1dC52YWwoKSwhMSksdGhpcy5fc2hvdygpKSxuJiZ0aGlzLnZhbChuLCExKSx0aGlzLmRvbS5pbnB1dC5hdHRyKCJhdXRvY29tcGxldGUiLCJvZmYiKS5vbigiZm9jdXMuZGF0ZXRpbWUgY2xpY2suZGF0ZXRpbWUiLGZ1bmN0aW9uKCl7dC5kb20uY29udGFpbmVyLmlzKCI6dmlzaWJsZSIpfHx0LmRvbS5pbnB1dC5pcygiOmRpc2FibGVkIil8fCh0LnZhbCh0LmRvbS5pbnB1dC52YWwoKSwhMSksdC5fc2hvdygpKX0pLm9uKCJrZXl1cC5kYXRldGltZSIsZnVuY3Rpb24oKXt0LmRvbS5jb250YWluZXIuaXMoIjp2aXNpYmxlIikmJnQudmFsKHQuZG9tLmlucHV0LnZhbCgpLCExKX0pLHRoaXMuZG9tLmNvbnRhaW5lclswXS5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIixmdW5jdGlvbihzKXtzLnN0b3BQcm9wYWdhdGlvbigpfSksdGhpcy5kb20uY29udGFpbmVyLm9uKCJjaGFuZ2UiLCJzZWxlY3QiLGZ1bmN0aW9uKCl7dmFyIHM9TXQodGhpcyksaT1zLnZhbCgpO2lmKHMuaGFzQ2xhc3MoZSsiLW1vbnRoIikpdC5fY29ycmVjdE1vbnRoKHQucy5kaXNwbGF5LGkpLHQuX3NldFRpdGxlKCksdC5fc2V0Q2FsYW5kZXIoKTtlbHNlIGlmKHMuaGFzQ2xhc3MoZSsiLXllYXIiKSl0LnMuZGlzcGxheS5zZXRVVENGdWxsWWVhcihpKSx0Ll9zZXRUaXRsZSgpLHQuX3NldENhbGFuZGVyKCk7ZWxzZSBpZihzLmhhc0NsYXNzKGUrIi1ob3VycyIpfHxzLmhhc0NsYXNzKGUrIi1hbXBtIikpe2lmKHQucy5wYXJ0cy5ob3VyczEyKXt2YXIgbz1NdCh0LmRvbS5jb250YWluZXIpLmZpbmQoIi4iK2UrIi1ob3VycyIpLnZhbCgpKjEsdT1NdCh0LmRvbS5jb250YWluZXIpLmZpbmQoIi4iK2UrIi1hbXBtIikudmFsKCk9PT0icG0iO3Qucy5kLnNldFVUQ0hvdXJzKG89PT0xMiYmIXU/MDp1JiZvIT09MTI/bysxMjpvKX1lbHNlIHQucy5kLnNldFVUQ0hvdXJzKGkpO3QuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpfWVsc2Ugcy5oYXNDbGFzcyhlKyItbWludXRlcyIpPyh0LnMuZC5zZXRVVENNaW51dGVzKGkpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpKTpzLmhhc0NsYXNzKGUrIi1zZWNvbmRzIikmJih0LnMuZC5zZXRTZWNvbmRzKGkpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpKTt0LmRvbS5pbnB1dC5mb2N1cygpLHQuX3Bvc2l0aW9uKCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHMpe3ZhciBpPXQucy5kLG89cy50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSx1PW89PT0ic3BhbiI/cy50YXJnZXQucGFyZW50Tm9kZTpzLnRhcmdldDtpZihvPXUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxvIT09InNlbGVjdCIpaWYocy5zdG9wUHJvcGFnYXRpb24oKSxvPT09ImEiJiYocy5wcmV2ZW50RGVmYXVsdCgpLE10KHUpLmhhc0NsYXNzKGUrIi1jbGVhciIpPyh0LnMuZD1udWxsLHQuZG9tLmlucHV0LnZhbCgiIiksdC5fd3JpdGVPdXRwdXQoKSx0Ll9zZXRDYWxhbmRlcigpLHQuX3NldFRpbWUoKSxyKCkpOk10KHUpLmhhc0NsYXNzKGUrIi10b2RheSIpJiYodC5zLmRpc3BsYXk9bmV3IERhdGUsdC5fc2V0VGl0bGUoKSx0Ll9zZXRDYWxhbmRlcigpKSksbz09PSJidXR0b24iKXt2YXIgcD1NdCh1KSxiPXAucGFyZW50KCk7aWYoYi5oYXNDbGFzcygiZGlzYWJsZWQiKSYmIWIuaGFzQ2xhc3MoInJhbmdlIikpe3AuYmx1cigpO3JldHVybn1pZihiLmhhc0NsYXNzKGUrIi1pY29uTGVmdCIpKXQucy5kaXNwbGF5LnNldFVUQ01vbnRoKHQucy5kaXNwbGF5LmdldFVUQ01vbnRoKCktMSksdC5fc2V0VGl0bGUoKSx0Ll9zZXRDYWxhbmRlcigpLHQuZG9tLmlucHV0LmZvY3VzKCk7ZWxzZSBpZihiLmhhc0NsYXNzKGUrIi1pY29uUmlnaHQiKSl0Ll9jb3JyZWN0TW9udGgodC5zLmRpc3BsYXksdC5zLmRpc3BsYXkuZ2V0VVRDTW9udGgoKSsxKSx0Ll9zZXRUaXRsZSgpLHQuX3NldENhbGFuZGVyKCksdC5kb20uaW5wdXQuZm9jdXMoKTtlbHNlIGlmKHAucGFyZW50cygiLiIrZSsiLXRpbWUiKS5sZW5ndGgpe3ZhciBnPXAuZGF0YSgidmFsdWUiKSxtPXAuZGF0YSgidW5pdCIpO2lmKGk9dC5fbmVlZFZhbHVlKCksbT09PSJtaW51dGVzIilpZihiLmhhc0NsYXNzKCJkaXNhYmxlZCIpJiZiLmhhc0NsYXNzKCJyYW5nZSIpKXt0LnMubWludXRlc1JhbmdlPWcsdC5fc2V0VGltZSgpO3JldHVybn1lbHNlIHQucy5taW51dGVzUmFuZ2U9bnVsbDtpZihtPT09InNlY29uZHMiKWlmKGIuaGFzQ2xhc3MoImRpc2FibGVkIikmJmIuaGFzQ2xhc3MoInJhbmdlIikpe3Qucy5zZWNvbmRzUmFuZ2U9Zyx0Ll9zZXRUaW1lKCk7cmV0dXJufWVsc2UgdC5zLnNlY29uZHNSYW5nZT1udWxsO2lmKGc9PT0iYW0iKWlmKGkuZ2V0VVRDSG91cnMoKT49MTIpZz1pLmdldFVUQ0hvdXJzKCktMTI7ZWxzZSByZXR1cm47ZWxzZSBpZihnPT09InBtIilpZihpLmdldFVUQ0hvdXJzKCk8MTIpZz1pLmdldFVUQ0hvdXJzKCkrMTI7ZWxzZSByZXR1cm47dmFyIEM9bT09PSJob3VycyI/InNldFVUQ0hvdXJzIjptPT09Im1pbnV0ZXMiPyJzZXRVVENNaW51dGVzIjoic2V0U2Vjb25kcyI7aVtDXShnKSx0Ll9zZXRDYWxhbmRlcigpLHQuX3NldFRpbWUoKSx0Ll93cml0ZU91dHB1dCghMCkscigpfWVsc2UgaT10Ll9uZWVkVmFsdWUoKSxpLnNldFVUQ0RhdGUoMSksaS5zZXRVVENGdWxsWWVhcihwLmRhdGEoInllYXIiKSksaS5zZXRVVENNb250aChwLmRhdGEoIm1vbnRoIikpLGkuc2V0VVRDRGF0ZShwLmRhdGEoImRheSIpKSx0Ll93cml0ZU91dHB1dCghMCksdC5zLnBhcnRzLnRpbWU/KHQuX3NldENhbGFuZGVyKCksdC5fc2V0VGltZSgpKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5faGlkZSgpfSwxMCkscigpfWVsc2UgdC5kb20uaW5wdXQuZm9jdXMoKX0pfSxfY29tcGFyZURhdGVzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2lzTHV4b24oKT9jZS5EYXRlVGltZS5mcm9tSlNEYXRlKHQpLnRvVVRDKCkudG9JU09EYXRlKCk9PT1jZS5EYXRlVGltZS5mcm9tSlNEYXRlKGUpLnRvVVRDKCkudG9JU09EYXRlKCk6dGhpcy5fZGF0ZVRvVXRjU3RyaW5nKHQpPT09dGhpcy5fZGF0ZVRvVXRjU3RyaW5nKGUpfSxfY29udmVydDpmdW5jdGlvbih0LGUsbil7aWYoIXQpcmV0dXJuIHQ7aWYoY2UpaWYodGhpcy5faXNMdXhvbigpKXt2YXIgcz10IGluc3RhbmNlb2YgRGF0ZT9jZS5EYXRlVGltZS5mcm9tSlNEYXRlKHQpLnRvVVRDKCk6Y2UuRGF0ZVRpbWUuZnJvbUZvcm1hdCh0LGUpO3JldHVybiBzLmlzVmFsaWQ/bj9zLnRvRm9ybWF0KG4pOnMudG9KU0RhdGUoKTpudWxsfWVsc2V7dmFyIGk9dCBpbnN0YW5jZW9mIERhdGU/Y2UudXRjKHQsdm9pZCAwLHRoaXMuYy5sb2NhbGUsdGhpcy5jLnN0cmljdCk6Y2UodCxlLHRoaXMuYy5sb2NhbGUsdGhpcy5jLnN0cmljdCk7cmV0dXJuIGkuaXNWYWxpZCgpP24/aS5mb3JtYXQobik6aS50b0RhdGUoKTpudWxsfWVsc2V7aWYoIWUmJiFufHxlJiZuKXJldHVybiB0O2lmKGUpe3ZhciByPXQubWF0Y2goLyhcZHs0fSlcLShcZHsyfSlcLShcZHsyfSkvKTtyZXR1cm4gcj9uZXcgRGF0ZShyWzFdLHJbMl0tMSxyWzNdKTpudWxsfWVsc2UgcmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKSsiLSIrdGhpcy5fcGFkKHQuZ2V0VVRDTW9udGgoKSsxKSsiLSIrdGhpcy5fcGFkKHQuZ2V0VVRDRGF0ZSgpKX19LF9jb3JyZWN0TW9udGg6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9kYXlzSW5Nb250aCh0LmdldFVUQ0Z1bGxZZWFyKCksZSkscj10LmdldFVUQ0RhdGUoKT5uO3Quc2V0VVRDTW9udGgoZSksciYmKHQuc2V0VVRDRGF0ZShuKSx0LnNldFVUQ01vbnRoKGUpKX0sX2RheXNJbk1vbnRoOmZ1bmN0aW9uKHQsZSl7dmFyIG49dCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKSxyPVszMSxuPzI5OjI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxXTtyZXR1cm4gcltlXX0sX2RhdGVUb1V0YzpmdW5jdGlvbih0KXtyZXR1cm4gdCYmbmV3IERhdGUoRGF0ZS5VVEModC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSx0LmdldEhvdXJzKCksdC5nZXRNaW51dGVzKCksdC5nZXRTZWNvbmRzKCkpKX0sX2RhdGVUb1V0Y1N0cmluZzpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXNMdXhvbigpP2NlLkRhdGVUaW1lLmZyb21KU0RhdGUodCkudG9VVEMoKS50b0lTT0RhdGUoKTp0LmdldFVUQ0Z1bGxZZWFyKCkrIi0iK3RoaXMuX3BhZCh0LmdldFVUQ01vbnRoKCkrMSkrIi0iK3RoaXMuX3BhZCh0LmdldFVUQ0RhdGUoKSl9LF9oaWRlOmZ1bmN0aW9uKHQpe2lmKCEoIXQmJnRoaXMuZG9tLmlucHV0LmF0dHIoInR5cGUiKT09PSJoaWRkZW4iKSl7dmFyIGU9dGhpcy5zLm5hbWVzcGFjZTt0aGlzLmRvbS5jb250YWluZXIuZGV0YWNoKCksTXQod2luZG93KS5vZmYoIi4iK2UpLE10KGRvY3VtZW50KS5vZmYoImtleWRvd24uIitlKSxNdCgiZGl2LmRhdGFUYWJsZXNfc2Nyb2xsQm9keSIpLm9mZigic2Nyb2xsLiIrZSksTXQoImRpdi5EVEVfQm9keV9Db250ZW50Iikub2ZmKCJzY3JvbGwuIitlKSxNdCgiYm9keSIpLm9mZigiY2xpY2suIitlKSxNdCh0aGlzLmRvbS5pbnB1dFswXS5vZmZzZXRQYXJlbnQpLm9mZigiLiIrZSl9fSxfaG91cnMyNFRvMTI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0wPzEyOnQ+MTI/dC0xMjp0fSxfaHRtbERheTpmdW5jdGlvbih0KXtpZih0LmVtcHR5KXJldHVybic8dGQgY2xhc3M9ImVtcHR5Ij48L3RkPic7dmFyIGU9WyJzZWxlY3RhYmxlIl0sbj10aGlzLmMuY2xhc3NQcmVmaXg7cmV0dXJuIHQuZGlzYWJsZWQmJmUucHVzaCgiZGlzYWJsZWQiKSx0LnRvZGF5JiZlLnB1c2goIm5vdyIpLHQuc2VsZWN0ZWQmJmUucHVzaCgic2VsZWN0ZWQiKSwnPHRkIGRhdGEtZGF5PSInK3QuZGF5KyciIGNsYXNzPSInK2Uuam9pbigiICIpKyciPjxidXR0b24gY2xhc3M9IicrbisiLWJ1dHRvbiAiK24rJy1kYXkiIHR5cGU9ImJ1dHRvbiIgZGF0YS15ZWFyPSInK3QueWVhcisnIiBkYXRhLW1vbnRoPSInK3QubW9udGgrJyIgZGF0YS1kYXk9IicrdC5kYXkrJyI+PHNwYW4+Jyt0LmRheSsiPC9zcGFuPjwvYnV0dG9uPjwvdGQ+In0sX2h0bWxNb250aDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2RhdGVUb1V0YyhuZXcgRGF0ZSkscj10aGlzLl9kYXlzSW5Nb250aCh0LGUpLHM9bmV3IERhdGUoRGF0ZS5VVEModCxlLDEpKS5nZXRVVENEYXkoKSxpPVtdLG89W107dGhpcy5jLmZpcnN0RGF5PjAmJihzLT10aGlzLmMuZmlyc3REYXksczwwJiYocys9NykpO2Zvcih2YXIgdT1yK3MscD11O3A+NzspcC09Nzt1Kz03LXA7dmFyIGI9dGhpcy5jLm1pbkRhdGUsZz10aGlzLmMubWF4RGF0ZTtiJiYoYi5zZXRVVENIb3VycygwKSxiLnNldFVUQ01pbnV0ZXMoMCksYi5zZXRTZWNvbmRzKDApKSxnJiYoZy5zZXRVVENIb3VycygyMyksZy5zZXRVVENNaW51dGVzKDU5KSxnLnNldFNlY29uZHMoNTkpKTtmb3IodmFyIG09MCxDPTA7bTx1O20rKyl7dmFyIHk9bmV3IERhdGUoRGF0ZS5VVEModCxlLDErKG0tcykpKSxUPXRoaXMucy5kP3RoaXMuX2NvbXBhcmVEYXRlcyh5LHRoaXMucy5kKTohMSxQPXRoaXMuX2NvbXBhcmVEYXRlcyh5LG4pLGM9bTxzfHxtPj1yK3MsbD1iJiZ5PGJ8fGcmJnk+ZyxoPXRoaXMuYy5kaXNhYmxlRGF5czsoQXJyYXkuaXNBcnJheShoKSYmTXQuaW5BcnJheSh5LmdldFVUQ0RheSgpLGgpIT09LTF8fHR5cGVvZiBoPT0iZnVuY3Rpb24iJiZoKHkpPT09ITApJiYobD0hMCk7dmFyIF89e2RheToxKyhtLXMpLG1vbnRoOmUseWVhcjp0LHNlbGVjdGVkOlQsdG9kYXk6UCxkaXNhYmxlZDpsLGVtcHR5OmN9O28ucHVzaCh0aGlzLl9odG1sRGF5KF8pKSwrK0M9PT03JiYodGhpcy5jLnNob3dXZWVrTnVtYmVyJiZvLnVuc2hpZnQodGhpcy5faHRtbFdlZWtPZlllYXIobS1zLGUsdCkpLGkucHVzaCgiPHRyPiIrby5qb2luKCIiKSsiPC90cj4iKSxvPVtdLEM9MCl9dmFyIEY9dGhpcy5jLmNsYXNzUHJlZml4LE89RisiLXRhYmxlIjtpZih0aGlzLmMuc2hvd1dlZWtOdW1iZXImJihPKz0iIHdlZWtOdW1iZXIiKSxiKXt2YXIgZj1iPj1uZXcgRGF0ZShEYXRlLlVUQyh0LGUsMSwwLDAsMCkpO3RoaXMuZG9tLnRpdGxlLmZpbmQoImRpdi4iK0YrIi1pY29uTGVmdCIpLmNzcygiZGlzcGxheSIsZj8ibm9uZSI6ImJsb2NrIil9aWYoZyl7dmFyIFU9ZzxuZXcgRGF0ZShEYXRlLlVUQyh0LGUrMSwxLDAsMCwwKSk7dGhpcy5kb20udGl0bGUuZmluZCgiZGl2LiIrRisiLWljb25SaWdodCIpLmNzcygiZGlzcGxheSIsVT8ibm9uZSI6ImJsb2NrIil9cmV0dXJuJzx0YWJsZSBjbGFzcz0iJytPKyciPjx0aGVhZD4nK3RoaXMuX2h0bWxNb250aEhlYWQoKSsiPC90aGVhZD48dGJvZHk+IitpLmpvaW4oIiIpKyI8L3Rib2R5PjwvdGFibGU+In0sX2h0bWxNb250aEhlYWQ6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuYy5maXJzdERheSxuPXRoaXMuYy5pMThuLHI9ZnVuY3Rpb24oaSl7Zm9yKGkrPWU7aT49NzspaS09NztyZXR1cm4gbi53ZWVrZGF5c1tpXX07dGhpcy5jLnNob3dXZWVrTnVtYmVyJiZ0LnB1c2goIjx0aD48L3RoPiIpO2Zvcih2YXIgcz0wO3M8NztzKyspdC5wdXNoKCI8dGg+IityKHMpKyI8L3RoPiIpO3JldHVybiB0LmpvaW4oIiIpfSxfaHRtbFdlZWtPZlllYXI6ZnVuY3Rpb24odCxlLG4pe3ZhciByPW5ldyBEYXRlKG4sZSx0LDAsMCwwLDApO3Iuc2V0RGF0ZShyLmdldERhdGUoKSs0LShyLmdldERheSgpfHw3KSk7dmFyIHM9bmV3IERhdGUobiwwLDEpLGk9TWF0aC5jZWlsKCgoci1zKS84NjRlNSsxKS83KTtyZXR1cm4nPHRkIGNsYXNzPSInK3RoaXMuYy5jbGFzc1ByZWZpeCsnLXdlZWsiPicraSsiPC90ZD4ifSxfaXNMdXhvbjpmdW5jdGlvbigpe3JldHVybiEhKGNlJiZjZS5EYXRlVGltZSYmY2UuRHVyYXRpb24mJmNlLlNldHRpbmdzKX0sX25lZWRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnMuZHx8KHRoaXMucy5kPXRoaXMuX2RhdGVUb1V0YyhuZXcgRGF0ZSksdGhpcy5zLnBhcnRzLnRpbWV8fCh0aGlzLnMuZC5zZXRVVENIb3VycygwKSx0aGlzLnMuZC5zZXRVVENNaW51dGVzKDApLHRoaXMucy5kLnNldFNlY29uZHMoMCksdGhpcy5zLmQuc2V0TWlsbGlzZWNvbmRzKDApKSksdGhpcy5zLmR9LF9vcHRpb25zOmZ1bmN0aW9uKHQsZSxuKXtufHwobj1lKTt2YXIgcj10aGlzLmRvbS5jb250YWluZXIuZmluZCgic2VsZWN0LiIrdGhpcy5jLmNsYXNzUHJlZml4KyItIit0KTtyLmVtcHR5KCk7Zm9yKHZhciBzPTAsaT1lLmxlbmd0aDtzPGk7cysrKXIuYXBwZW5kKCc8b3B0aW9uIHZhbHVlPSInK2Vbc10rJyI+JytuW3NdKyI8L29wdGlvbj4iKX0sX29wdGlvblNldDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCJzZWxlY3QuIit0aGlzLmMuY2xhc3NQcmVmaXgrIi0iK3QpLHI9bi5wYXJlbnQoKS5jaGlsZHJlbigic3BhbiIpO24udmFsKGUpO3ZhciBzPW4uZmluZCgib3B0aW9uOnNlbGVjdGVkIik7ci5odG1sKHMubGVuZ3RoIT09MD9zLnRleHQoKTp0aGlzLmMuaTE4bi51bmtub3duKX0sX29wdGlvbnNUaW1lOmZ1bmN0aW9uKHQsZSxuLHIscyl7dmFyIGk9dGhpcy5jLmNsYXNzUHJlZml4LG89dGhpcy5kb20uY29udGFpbmVyLmZpbmQoImRpdi4iK2krIi0iK3QpLHUscCxiPWU9PT0xMj9mdW5jdGlvbihsKXtyZXR1cm4gbH06dGhpcy5fcGFkLGc9aSsiLXRhYmxlIixtPXRoaXMuYy5pMThuO2lmKG8ubGVuZ3RoKXt2YXIgQz0iIix5PTEwLFQ9ZnVuY3Rpb24obCxoLF8pe2U9PT0xMiYmdHlwZW9mIGw9PSJudW1iZXIiJiYobj49MTImJihsKz0xMiksbD09MTI/bD0wOmw9PTI0JiYobD0xMikpO3ZhciBGPW49PT1sfHxsPT09ImFtIiYmbjwxMnx8bD09PSJwbSImJm4+PTEyPyJzZWxlY3RlZCI6IiI7cmV0dXJuIHR5cGVvZiBsPT0ibnVtYmVyIiYmciYmTXQuaW5BcnJheShsLHIpPT09LTEmJihGKz0iIGRpc2FibGVkIiksXyYmKEYrPSIgIitfKSwnPHRkIGNsYXNzPSJzZWxlY3RhYmxlICcrRisnIj48YnV0dG9uIGNsYXNzPSInK2krIi1idXR0b24gIitpKyctZGF5IiB0eXBlPSJidXR0b24iIGRhdGEtdW5pdD0iJyt0KyciIGRhdGEtdmFsdWU9IicrbCsnIj48c3Bhbj4nK2grIjwvc3Bhbj48L2J1dHRvbj48L3RkPiJ9O2lmKGU9PT0xMil7Zm9yKEMrPSI8dHI+Iix1PTE7dTw9Njt1KyspQys9VCh1LGIodSkpO2ZvcihDKz1UKCJhbSIsbS5hbVBtWzBdKSxDKz0iPC90cj4iLEMrPSI8dHI+Iix1PTc7dTw9MTI7dSsrKUMrPVQodSxiKHUpKTtDKz1UKCJwbSIsbS5hbVBtWzFdKSxDKz0iPC90cj4iLHk9N31lbHNlIGlmKGU9PT0yNCl7dmFyIFA9MDtmb3IocD0wO3A8NDtwKyspe2ZvcihDKz0iPHRyPiIsdT0wO3U8Njt1KyspQys9VChQLGIoUCkpLFArKztDKz0iPC90cj4ifXk9Nn1lbHNle2ZvcihDKz0iPHRyPiIscD0wO3A8NjA7cCs9MTApQys9VChwLGIocCksInJhbmdlIik7Qys9IjwvdHI+IixDKz0nPC90Ym9keT48L3RoZWFkPjx0YWJsZSBjbGFzcz0iJytnKyIgIitnKyctbm9zcGFjZSI+PHRib2R5Pic7dmFyIGM9cyE9PW51bGw/czpuPT09LTE/MDpNYXRoLmZsb29yKG4vMTApKjEwO2ZvcihDKz0iPHRyPiIscD1jKzE7cDxjKzEwO3ArKylDKz1UKHAsYihwKSk7Qys9IjwvdHI+Iix5PTZ9by5lbXB0eSgpLmFwcGVuZCgnPHRhYmxlIGNsYXNzPSInK2crJyI+PHRoZWFkPjx0cj48dGggY29sc3Bhbj0iJyt5KyciPicrbVt0XSsiPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5PiIrQysiPC90Ym9keT48L3RhYmxlPiIpfX0sX29wdGlvbnNUaXRsZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYy5pMThuLGU9dGhpcy5jLm1pbkRhdGUsbj10aGlzLmMubWF4RGF0ZSxyPWU/ZS5nZXRGdWxsWWVhcigpOm51bGwscz1uP24uZ2V0RnVsbFllYXIoKTpudWxsLGk9ciE9PW51bGw/cjpuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCktdGhpcy5jLnllYXJSYW5nZSxvPXMhPT1udWxsP3M6bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpK3RoaXMuYy55ZWFyUmFuZ2U7dGhpcy5fb3B0aW9ucygibW9udGgiLHRoaXMuX3JhbmdlKDAsMTEpLHQubW9udGhzKSx0aGlzLl9vcHRpb25zKCJ5ZWFyIix0aGlzLl9yYW5nZShpLG8pKSx0aGlzLmRvbS50b2RheS50ZXh0KHQudG9kYXkpLnRleHQodC50b2RheSksdGhpcy5kb20uY2xlYXIudGV4dCh0LmNsZWFyKS50ZXh0KHQuY2xlYXIpLHRoaXMuZG9tLnByZXZpb3VzLmF0dHIoInRpdGxlIix0LnByZXZpb3VzKS5jaGlsZHJlbigiYnV0dG9uIikudGV4dCh0LnByZXZpb3VzKSx0aGlzLmRvbS5uZXh0LmF0dHIoInRpdGxlIix0Lm5leHQpLmNoaWxkcmVuKCJidXR0b24iKS50ZXh0KHQubmV4dCl9LF9wYWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8MTA/IjAiK3Q6dH0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jLmF0dGFjaFRvPT09ImlucHV0Ij90aGlzLmRvbS5pbnB1dC5wb3NpdGlvbigpOnRoaXMuZG9tLmlucHV0Lm9mZnNldCgpLGU9dGhpcy5kb20uY29udGFpbmVyLG49dGhpcy5kb20uaW5wdXQub3V0ZXJIZWlnaHQoKTtpZihlLmhhc0NsYXNzKCJpbmxpbmUiKSl7ZS5pbnNlcnRBZnRlcih0aGlzLmRvbS5pbnB1dCk7cmV0dXJufXRoaXMucy5wYXJ0cy5kYXRlJiZ0aGlzLnMucGFydHMudGltZSYmTXQod2luZG93KS53aWR0aCgpPjU1MD9lLmFkZENsYXNzKCJob3Jpem9udGFsIik6ZS5yZW1vdmVDbGFzcygiaG9yaXpvbnRhbCIpLHRoaXMuYy5hdHRhY2hUbz09PSJpbnB1dCI/ZS5jc3Moe3RvcDp0LnRvcCtuLGxlZnQ6dC5sZWZ0fSkuaW5zZXJ0QWZ0ZXIodGhpcy5kb20uaW5wdXQpOmUuY3NzKHt0b3A6dC50b3ArbixsZWZ0OnQubGVmdH0pLmFwcGVuZFRvKCJib2R5Iik7dmFyIHI9ZS5vdXRlckhlaWdodCgpLHM9ZS5vdXRlcldpZHRoKCksaT1NdCh3aW5kb3cpLnNjcm9sbFRvcCgpO2lmKHQudG9wK24rci1pPk10KHdpbmRvdykuaGVpZ2h0KCkpe3ZhciBvPXQudG9wLXI7ZS5jc3MoInRvcCIsbzwwPzA6byl9aWYocyt0LmxlZnQ+TXQod2luZG93KS53aWR0aCgpKXt2YXIgdT1NdCh3aW5kb3cpLndpZHRoKCktczt0aGlzLmMuYXR0YWNoVG89PT0iaW5wdXQiJiYodS09TXQoZSkub2Zmc2V0UGFyZW50KCkub2Zmc2V0KCkubGVmdCksZS5jc3MoImxlZnQiLHU8MD8wOnUpfX0sX3JhbmdlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1bXTtufHwobj0xKTtmb3IodmFyIHM9dDtzPD1lO3MrPW4pci5wdXNoKHMpO3JldHVybiByfSxfc2V0Q2FsYW5kZXI6ZnVuY3Rpb24oKXt0aGlzLnMuZGlzcGxheSYmdGhpcy5kb20uY2FsZW5kYXIuZW1wdHkoKS5hcHBlbmQodGhpcy5faHRtbE1vbnRoKHRoaXMucy5kaXNwbGF5LmdldFVUQ0Z1bGxZZWFyKCksdGhpcy5zLmRpc3BsYXkuZ2V0VVRDTW9udGgoKSkpfSxfc2V0VGl0bGU6ZnVuY3Rpb24oKXt0aGlzLl9vcHRpb25TZXQoIm1vbnRoIix0aGlzLnMuZGlzcGxheS5nZXRVVENNb250aCgpKSx0aGlzLl9vcHRpb25TZXQoInllYXIiLHRoaXMucy5kaXNwbGF5LmdldFVUQ0Z1bGxZZWFyKCkpfSxfc2V0VGltZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLnMuZCxuPW51bGw7dGhpcy5faXNMdXhvbigpJiYobj1jZS5EYXRlVGltZS5mcm9tSlNEYXRlKGUpLnRvVVRDKCkpO3ZhciByPW4hPW51bGw/bi5ob3VyOmU/ZS5nZXRVVENIb3VycygpOi0xLHM9ZnVuY3Rpb24oaSl7cmV0dXJuIHQuY1tpKyJBdmFpbGFibGUiXT90LmNbaSsiQXZhaWxhYmxlIl06dC5fcmFuZ2UoMCw1OSx0LmNbaSsiSW5jcmVtZW50Il0pfTt0aGlzLl9vcHRpb25zVGltZSgiaG91cnMiLHRoaXMucy5wYXJ0cy5ob3VyczEyPzEyOjI0LHIsdGhpcy5jLmhvdXJzQXZhaWxhYmxlKSx0aGlzLl9vcHRpb25zVGltZSgibWludXRlcyIsNjAsbiE9bnVsbD9uLm1pbnV0ZTplP2UuZ2V0VVRDTWludXRlcygpOi0xLHMoIm1pbnV0ZXMiKSx0aGlzLnMubWludXRlc1JhbmdlKSx0aGlzLl9vcHRpb25zVGltZSgic2Vjb25kcyIsNjAsbiE9bnVsbD9uLnNlY29uZDplP2UuZ2V0U2Vjb25kcygpOi0xLHMoInNlY29uZHMiKSx0aGlzLnMuc2Vjb25kc1JhbmdlKX0sX3Nob3c6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5zLm5hbWVzcGFjZTt0aGlzLl9wb3NpdGlvbigpLE10KHdpbmRvdykub24oInNjcm9sbC4iK2UrIiByZXNpemUuIitlLGZ1bmN0aW9uKCl7dC5fcG9zaXRpb24oKX0pLE10KCJkaXYuRFRFX0JvZHlfQ29udGVudCIpLm9uKCJzY3JvbGwuIitlLGZ1bmN0aW9uKCl7dC5fcG9zaXRpb24oKX0pLE10KCJkaXYuZGF0YVRhYmxlc19zY3JvbGxCb2R5Iikub24oInNjcm9sbC4iK2UsZnVuY3Rpb24oKXt0Ll9wb3NpdGlvbigpfSk7dmFyIG49dGhpcy5kb20uaW5wdXRbMF0ub2Zmc2V0UGFyZW50O24hPT1kb2N1bWVudC5ib2R5JiZNdChuKS5vbigic2Nyb2xsLiIrZSxmdW5jdGlvbigpe3QuX3Bvc2l0aW9uKCl9KSxNdChkb2N1bWVudCkub24oImtleWRvd24uIitlLGZ1bmN0aW9uKHIpeyhyLmtleUNvZGU9PT05fHxyLmtleUNvZGU9PT0yN3x8ci5rZXlDb2RlPT09MTMpJiZ0Ll9oaWRlKCl9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TXQoImJvZHkiKS5vbigiY2xpY2suIitlLGZ1bmN0aW9uKHIpe3ZhciBzPU10KHIudGFyZ2V0KS5wYXJlbnRzKCk7IXMuZmlsdGVyKHQuZG9tLmNvbnRhaW5lcikubGVuZ3RoJiZyLnRhcmdldCE9PXQuZG9tLmlucHV0WzBdJiZ0Ll9oaWRlKCl9KX0sMTApfSxfd3JpdGVPdXRwdXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zLmQsbj0iIixyPXRoaXMuZG9tLmlucHV0O2UmJihuPXRoaXMuX2NvbnZlcnQoZSxudWxsLHRoaXMuYy5mb3JtYXQpKSxyLnZhbChuKTt2YXIgcz1uZXcgRXZlbnQoImNoYW5nZSIse2J1YmJsZXM6ITB9KTtyWzBdLmRpc3BhdGNoRXZlbnQocyksci5hdHRyKCJ0eXBlIik9PT0iaGlkZGVuIiYmdGhpcy52YWwobiwhMSksdCYmci5mb2N1cygpfX0pO2RlLnVzZT1mdW5jdGlvbih0KXtjZT10fTtkZS5faW5zdGFuY2U9MDtkZS50eXBlPSJEYXRlVGltZSI7ZGUuZGVmYXVsdHM9e2F0dGFjaFRvOiJib2R5IixidXR0b25zOntjbGVhcjohMSx0b2RheTohMX0sY2xhc3NQcmVmaXg6ImR0LWRhdGV0aW1lIixkaXNhYmxlRGF5czpudWxsLGZpcnN0RGF5OjEsZm9ybWF0OiJZWVlZLU1NLUREIixob3Vyc0F2YWlsYWJsZTpudWxsLGkxOG46e2NsZWFyOiJDbGVhciIscHJldmlvdXM6IlByZXZpb3VzIixuZXh0OiJOZXh0Iixtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHdlZWtkYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sYW1QbTpbImFtIiwicG0iXSxob3VyczoiSG91ciIsbWludXRlczoiTWludXRlIixzZWNvbmRzOiJTZWNvbmQiLHVua25vd246Ii0iLHRvZGF5OiJUb2RheSJ9LG1heERhdGU6bnVsbCxtaW5EYXRlOm51bGwsbWludXRlc0F2YWlsYWJsZTpudWxsLG1pbnV0ZXNJbmNyZW1lbnQ6MSxzdHJpY3Q6ITAsbG9jYWxlOiJlbiIsb25DaGFuZ2U6ZnVuY3Rpb24oKXt9LHNlY29uZHNBdmFpbGFibGU6bnVsbCxzZWNvbmRzSW5jcmVtZW50OjEsc2hvd1dlZWtOdW1iZXI6ITEseWVhclJhbmdlOjI1fTtkZS52ZXJzaW9uPSIxLjUuMyI7ZGUuZmFjdG9yeT1mdW5jdGlvbih0LGUpe3ZhciBuPSExO3JldHVybiB0JiZ0LmRvY3VtZW50JiYod2luZG93PXQsZG9jdW1lbnQ9dC5kb2N1bWVudCksZSYmZS5mbiYmZS5mbi5qcXVlcnkmJihNdD1lLG49ITApLG59O3dpbmRvdy5EYXRlVGltZXx8KHdpbmRvdy5EYXRlVGltZT1kZSk7d2luZG93LkRhdGFUYWJsZSYmKHdpbmRvdy5EYXRhVGFibGUuRGF0ZVRpbWU9ZGUpO010LmZuLmR0RGF0ZVRpbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe25ldyBkZSh0aGlzLHQpfSl9O010LmZuLmRhdGFUYWJsZSYmKE10LmZuLmRhdGFUYWJsZS5EYXRlVGltZT1kZSxNdC5mbi5EYXRhVGFibGUuRGF0ZVRpbWU9ZGUsTXQuZm4uZGF0YVRhYmxlLkVkaXRvciYmKE10LmZuLmRhdGFUYWJsZS5FZGl0b3IuRGF0ZVRpbWU9ZGUpKTt2YXIgaWQ9ZGU7dmFyIGFkPWllKGFlKCksMSk7dmFyICRzPWllKGFlKCksMSk7dmFyIGNuPSRzLmRlZmF1bHQ7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB0LGU7ZnVuY3Rpb24gbigpe3ZhciBjPWF0LnVzZSgibW9tZW50Iik7cmV0dXJuIGN8fHdpbmRvdy5tb21lbnR9ZnVuY3Rpb24gcigpe3ZhciBjPWF0LnVzZSgibHV4b24iKTtyZXR1cm4gY3x8d2luZG93Lmx1eG9ufWZ1bmN0aW9uIHMoYyl7dD1jLGU9Yy5mbi5kYXRhVGFibGV9dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBjKGwsaCxfLEYsTyxmLFUpe0Y9PT12b2lkIDAmJihGPTApLE89PT12b2lkIDAmJihPPTEpLGY9PT12b2lkIDAmJihmPXZvaWQgMCksVT09PXZvaWQgMCYmKFU9ITEpO3ZhciBYPXRoaXM7dGhpcy5jbGFzc2VzPXQuZXh0ZW5kKCEwLHt9LGMuY2xhc3NlcyksdGhpcy5jPXQuZXh0ZW5kKCEwLHt9LGMuZGVmYXVsdHMsdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaEJ1aWxkZXIsaCk7dmFyIFE9dGhpcy5jLmkxOG47aWYodGhpcy5zPXtjb25kaXRpb246dm9pZCAwLGNvbmRpdGlvbnM6e30sZGF0YTp2b2lkIDAsZGF0YUlkeDotMSxkYXRhUG9pbnRzOltdLGRhdGVGb3JtYXQ6ITEsZGVwdGg6TyxkdDpsLGZpbGxlZDohMSxpbmRleDpGLGxpdmVTZWFyY2g6VSxvcmlnRGF0YTp2b2lkIDAscHJldmVudFJlZHJhdzohMSxzZXJ2ZXJEYXRhOmYsdG9wR3JvdXA6Xyx0eXBlOiIiLHZhbHVlOltdfSx0aGlzLmRvbT17YnV0dG9uczp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uQ29udGFpbmVyKSxjb25kaXRpb246dCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbmRpdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hdHRyKCJhdXRvY29tcGxldGUiLCJoYWNraW5nIiksY29uZGl0aW9uVGl0bGU6dCgnPG9wdGlvbiB2YWx1ZT0iIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9uIixRLmNvbmRpdGlvbikpLGNvbnRhaW5lcjp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSxkYXRhOnQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kYXRhKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLGRhdGFUaXRsZTp0KCc8b3B0aW9uIHZhbHVlPSIiIGRpc2FibGVkIHNlbGVjdGVkIGhpZGRlbi8+JykuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5kYXRhIixRLmRhdGEpKSxkZWZhdWx0VmFsdWU6dCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLGRlbGV0ZTp0KCI8YnV0dG9uLz4iKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmRlbGV0ZSIsUS5kZWxldGUpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGVsZXRlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uKS5hdHRyKCJ0aXRsZSIsdGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuZGVsZXRlVGl0bGUiLFEuZGVsZXRlVGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksaW5wdXRDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pbnB1dENvbnQpLGxlZnQ6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5sZWZ0IixRLmxlZnQpKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubGVmdCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxlZnRUaXRsZSIsUS5sZWZ0VGl0bGUpKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIikscmlnaHQ6dCgiPGJ1dHRvbi8+IikuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci5yaWdodCIsUS5yaWdodCkpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5yaWdodCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidGl0bGUiLHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnJpZ2h0VGl0bGUiLFEucmlnaHRUaXRsZSkpLmF0dHIoInR5cGUiLCJidXR0b24iKSx2YWx1ZTpbdCgiPHNlbGVjdCBkaXNhYmxlZC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZHJvcERvd24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3QpXSx2YWx1ZVRpdGxlOnQoJzxvcHRpb24gdmFsdWU9Ii0tdmFsdWVUaXRsZS0tIiBkaXNhYmxlZCBzZWxlY3RlZCBoaWRkZW4vPicpLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIudmFsdWUiLFEudmFsdWUpKX0sdGhpcy5jLmdyZXlzY2FsZSl7dGhpcy5kb20uZGF0YS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKSx0aGlzLmRvbS5jb25kaXRpb24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20uZGVmYXVsdFZhbHVlLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncmV5c2NhbGUpO2Zvcih2YXIgRT0wLCQ9dGhpcy5kb20udmFsdWU7RTwkLmxlbmd0aDtFKyspe3ZhciB3PSRbRV07dy5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZ3JleXNjYWxlKX19cmV0dXJuIHQod2luZG93KS5vbigicmVzaXplLmR0c2IiLGUudXRpbC50aHJvdHRsZShmdW5jdGlvbigpe1gucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSksdGhpcy5fYnVpbGRDcml0ZXJpYSgpLHRoaXN9cmV0dXJuIGMuX2VzY2FwZUhUTUw9ZnVuY3Rpb24obCl7cmV0dXJuIGwudG9TdHJpbmcoKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mcXVvdDsvZywnIicpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sYy5wcm90b3R5cGUuZG9TZWFyY2g9ZnVuY3Rpb24oKXt0aGlzLmMubGl2ZVNlYXJjaCYmdGhpcy5zLmR0LmRyYXcoKX0sYy5wYXJzZU51bUZtdD1mdW5jdGlvbihsKXtyZXR1cm4rbC5yZXBsYWNlKC8oPyFeLSlbXjAtOS5dL2csIiIpfSxjLnByb3RvdHlwZS51cGRhdGVBcnJvd3M9ZnVuY3Rpb24obCl7bD09PXZvaWQgMCYmKGw9ITEpLHRoaXMuZG9tLmNvbnRhaW5lci5jaGlsZHJlbigpLmRldGFjaCgpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0YSkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvbikuYXBwZW5kKHRoaXMuZG9tLmlucHV0Q29udCksdGhpcy5zZXRMaXN0ZW5lcnMoKSx0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMCYmdCh0aGlzLmRvbS52YWx1ZVswXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpO2Zvcih2YXIgaD0xO2g8dGhpcy5kb20udmFsdWUubGVuZ3RoO2grKyl0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKHRoaXMuZG9tLnZhbHVlW2hdKSx0KHRoaXMuZG9tLnZhbHVlW2hdKS50cmlnZ2VyKCJkdHNiLWluc2VydGVkIik7dGhpcy5zLmRlcHRoPjEmJnRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmxlZnQpLCh0aGlzLmMuZGVwdGhMaW1pdD09PSExfHx0aGlzLnMuZGVwdGg8dGhpcy5jLmRlcHRoTGltaXQpJiZsP3RoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLnJpZ2h0KTp0aGlzLmRvbS5yaWdodC5yZW1vdmUoKSx0aGlzLmRvbS5idXR0b25zLmFwcGVuZCh0aGlzLmRvbS5kZWxldGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uYnV0dG9ucyl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kYXRhLm9mZigiLmR0c2IiKSx0aGlzLmRvbS5jb25kaXRpb24ub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmRlbGV0ZS5vZmYoIi5kdHNiIik7Zm9yKHZhciBsPTAsaD10aGlzLmRvbS52YWx1ZTtsPGgubGVuZ3RoO2wrKyl7dmFyIF89aFtsXTtfLm9mZigiLmR0c2IiKX10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlKCl9LGMucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbihsLGgpe3ZhciBfPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLEY9dGhpcy5zLmNvbmRpdGlvbnNbdGhpcy5zLmNvbmRpdGlvbl07aWYodGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCYmRiE9PXZvaWQgMCl7dmFyIE89bFt0aGlzLnMuZGF0YUlkeF07aWYodGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0iKSYmKF8ub0xhbmd1YWdlLnNEZWNpbWFsIT09IiJ8fF8ub0xhbmd1YWdlLnNUaG91c2FuZHMhPT0iIikpe3ZhciBmPVtsW3RoaXMucy5kYXRhSWR4XV07aWYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iIiYmKGY9bFt0aGlzLnMuZGF0YUlkeF0uc3BsaXQoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwpKSxfLm9MYW5ndWFnZS5zVGhvdXNhbmRzIT09IiIpZm9yKHZhciBVPTA7VTxmLmxlbmd0aDtVKyspZltVXT1mW1VdLnJlcGxhY2UoXy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcywiLCIpO089Zi5qb2luKCIuIil9aWYodGhpcy5jLm9ydGhvZ29uYWwuc2VhcmNoIT09ImZpbHRlciImJihPPV8uZmFzdERhdGEoaCx0aGlzLnMuZGF0YUlkeCx0eXBlb2YgdGhpcy5jLm9ydGhvZ29uYWw9PSJzdHJpbmciP3RoaXMuYy5vcnRob2dvbmFsOnRoaXMuYy5vcnRob2dvbmFsLnNlYXJjaCkpLHRoaXMucy50eXBlPT09ImFycmF5Iil7QXJyYXkuaXNBcnJheShPKXx8KE89W09dKSxPLnNvcnQoKTtmb3IodmFyIFg9MCxRPU87WDxRLmxlbmd0aDtYKyspe3ZhciBFPVFbWF07RSYmdHlwZW9mIEU9PSJzdHJpbmciJiYoRT1FLnJlcGxhY2UoL1tcclxuXHUyMDI4XS9nLCIgIikpfX1lbHNlIE8hPT1udWxsJiZ0eXBlb2YgTz09InN0cmluZyImJihPPU8ucmVwbGFjZSgvW1xyXG5cdTIwMjhdL2csIiAiKSk7cmV0dXJuIHRoaXMucy50eXBlLmluY2x1ZGVzKCJodG1sIikmJnR5cGVvZiBPPT0ic3RyaW5nIiYmKE89Ty5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIikpLE89PT1udWxsJiYoTz0iIiksRi5zZWFyY2goTyx0aGlzLnMudmFsdWUsdGhpcyl9fSxjLnByb3RvdHlwZS5nZXREZXRhaWxzPWZ1bmN0aW9uKGwpe2w9PT12b2lkIDAmJihsPSExKTt2YXIgaCxfPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO2lmKHRoaXMucy50eXBlIT09bnVsbCYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iInx8Xy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspe3ZhciBGPVt0aGlzLnMudmFsdWVbaF0udG9TdHJpbmcoKV07aWYoXy5vTGFuZ3VhZ2Uuc0RlY2ltYWwhPT0iIiYmKEY9dGhpcy5zLnZhbHVlW2hdLnNwbGl0KF8ub0xhbmd1YWdlLnNEZWNpbWFsKSksXy5vTGFuZ3VhZ2Uuc1Rob3VzYW5kcyE9PSIiKWZvcih2YXIgTz0wO088Ri5sZW5ndGg7TysrKUZbT109RltPXS5yZXBsYWNlKF8ub0xhbmd1YWdlLnNUaG91c2FuZHMsIiwiKTt0aGlzLnMudmFsdWVbaF09Ri5qb2luKCIuIil9ZWxzZSBpZih0aGlzLnMudHlwZSE9PW51bGwmJmwpe2lmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJkYXRlIil8fHRoaXMucy50eXBlLmluY2x1ZGVzKCJ0aW1lIikpZm9yKGg9MDtoPHRoaXMucy52YWx1ZS5sZW5ndGg7aCsrKXRoaXMucy52YWx1ZVtoXS5tYXRjaCgvXlxkezR9LShbMF1cZHwxWzAtMl0pLShbMC0yXVxkfDNbMDFdKSQvZyk9PT1udWxsJiYodGhpcy5zLnZhbHVlW2hdPSIiKTtlbHNlIGlmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdJiZ0aGlzLnMudmFsdWVbaF0ubGVuZ3RoPjAmJm4oKSh0aGlzLnMudmFsdWVbaF0sdGhpcy5zLmRhdGVGb3JtYXQsITApLmlzVmFsaWQoKSYmKHRoaXMucy52YWx1ZVtoXT1uKCkodGhpcy5zLnZhbHVlW2hdLHRoaXMucy5kYXRlRm9ybWF0KS5mb3JtYXQoIllZWVktTU0tREQgSEg6bW06c3MiKSk7ZWxzZSBpZih0aGlzLnMudHlwZS5pbmNsdWRlcygibHV4b24iKSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdJiZ0aGlzLnMudmFsdWVbaF0ubGVuZ3RoPjAmJnIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KHRoaXMucy52YWx1ZVtoXSx0aGlzLnMuZGF0ZUZvcm1hdCkuaW52YWxpZD09PW51bGwmJih0aGlzLnMudmFsdWVbaF09cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQodGhpcy5zLnZhbHVlW2hdLHRoaXMucy5kYXRlRm9ybWF0KS50b0Zvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcyIpKX1pZih0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoIm51bSIpJiZ0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSlmb3IoaD0wO2g8dGhpcy5zLnZhbHVlLmxlbmd0aDtoKyspdGhpcy5zLnZhbHVlW2hdPXRoaXMucy52YWx1ZVtoXS5yZXBsYWNlKC9bXjAtOS5cLV0vZywiIik7cmV0dXJue2NvbmRpdGlvbjp0aGlzLnMuY29uZGl0aW9uLGRhdGE6dGhpcy5zLmRhdGEsb3JpZ0RhdGE6dGhpcy5zLm9yaWdEYXRhLHR5cGU6dGhpcy5zLnR5cGUsdmFsdWU6dGhpcy5zLnZhbHVlLm1hcChmdW5jdGlvbihmKXtyZXR1cm4gZiE9bnVsbD9mLnRvU3RyaW5nKCk6Zn0pfX0sYy5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGMucHJvdG90eXBlLnBhcnNlTnVtYmVyPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMucy5kdC5pMThuKCJkZWNpbWFsIik7cmV0dXJuIGgmJmghPT0iLiImJihsPWwucmVwbGFjZSgvXC4vZywiIikucmVwbGFjZShoLCIuIikpLCtsLnJlcGxhY2UoLyg/IV4tKVteMC05Ll0vZywiIil9LGMucHJvdG90eXBlLnBvcHVsYXRlPWZ1bmN0aW9uKCl7dGhpcy5fcG9wdWxhdGVEYXRhKCksdGhpcy5zLmRhdGFJZHghPT0tMSYmKHRoaXMuX3BvcHVsYXRlQ29uZGl0aW9uKCksdGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCYmdGhpcy5fcG9wdWxhdGVWYWx1ZSgpKX0sYy5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihsKXt2YXIgaD0hMSxfLEY7aWYodGhpcy5fcG9wdWxhdGVEYXRhKCksbC5kYXRhIT09dm9pZCAwKXt2YXIgTz10aGlzLmNsYXNzZXMuaXRhbGljLGY9dGhpcy5kb20uZGF0YTt0aGlzLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7IWgmJih0KHRoaXMpLnRleHQoKT09PWwuZGF0YXx8bC5vcmlnRGF0YSYmdCh0aGlzKS5wcm9wKCJvcmlnRGF0YSIpPT09bC5vcmlnRGF0YSk/KHQodGhpcykucHJvcCgic2VsZWN0ZWQiLCEwKSxmLnJlbW92ZUNsYXNzKE8pLGg9ITAsXz1wYXJzZUludCh0KHRoaXMpLnZhbCgpLDEwKSk6dCh0aGlzKS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfSl9aWYoaCl7dGhpcy5zLmRhdGE9bC5kYXRhLHRoaXMucy5vcmlnRGF0YT1sLm9yaWdEYXRhLHRoaXMucy5kYXRhSWR4PV8sdGhpcy5jLm9ydGhvZ29uYWw9dGhpcy5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsdGhpcy5kb20uZGF0YVRpdGxlLnJlbW92ZSgpLHRoaXMuX3BvcHVsYXRlQ29uZGl0aW9uKCksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucmVtb3ZlKCk7dmFyIFU9dm9pZCAwLFg9dGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCJvcHRpb24iKTtmb3IoRj0wO0Y8WC5sZW5ndGg7RisrKXt2YXIgUT10KFhbRl0pO2wuY29uZGl0aW9uIT09dm9pZCAwJiZRLnZhbCgpPT09bC5jb25kaXRpb24mJnR5cGVvZiBsLmNvbmRpdGlvbj09InN0cmluZyI/KFEucHJvcCgic2VsZWN0ZWQiLCEwKSxVPVEudmFsKCkpOlEucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX1pZih0aGlzLnMuY29uZGl0aW9uPVUsdGhpcy5zLmNvbmRpdGlvbiE9PXZvaWQgMCl7Zm9yKHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIiksdGhpcy5kb20uY29uZGl0aW9uVGl0bGUucmVtb3ZlKCksdGhpcy5kb20uY29uZGl0aW9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5pdGFsaWMpLEY9MDtGPFgubGVuZ3RoO0YrKyl7dmFyIEU9dChYW0ZdKTtFLnZhbCgpIT09dGhpcy5zLmNvbmRpdGlvbiYmRS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfXRoaXMuX3BvcHVsYXRlVmFsdWUobCl9ZWxzZSB0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcmVwZW5kVG8odGhpcy5kb20uY29uZGl0aW9uKS5wcm9wKCJzZWxlY3RlZCIsITApfX0sYy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLmRvbS5kYXRhLnVuYmluZCgiY2hhbmdlIikub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe2wuZG9tLmRhdGFUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgaD1sLmRvbS5kYXRhLmNoaWxkcmVuKCJvcHRpb24uIitsLmNsYXNzZXMub3B0aW9uKSxfPTA7XzxoLmxlbmd0aDtfKyspe3ZhciBGPXQoaFtfXSk7Ri52YWwoKT09PWwuZG9tLmRhdGEudmFsKCk/KGwuZG9tLmRhdGEucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksRi5wcm9wKCJzZWxlY3RlZCIsITApLGwucy5kYXRhSWR4PStGLnZhbCgpLGwucy5kYXRhPUYudGV4dCgpLGwucy5vcmlnRGF0YT1GLnByb3AoIm9yaWdEYXRhIiksbC5jLm9ydGhvZ29uYWw9bC5fZ2V0T3B0aW9ucygpLm9ydGhvZ29uYWwsbC5fY2xlYXJDb25kaXRpb24oKSxsLl9jbGVhclZhbHVlKCksbC5fcG9wdWxhdGVDb25kaXRpb24oKSxsLnMuZmlsbGVkJiYobC5zLmZpbGxlZD0hMSxsLmRvU2VhcmNoKCksbC5zZXRMaXN0ZW5lcnMoKSksbC5zLmR0LnN0YXRlLnNhdmUoKSk6Ri5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pLHRoaXMuZG9tLmNvbmRpdGlvbi51bmJpbmQoImNoYW5nZSIpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXtsLmRvbS5jb25kaXRpb25UaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpO2Zvcih2YXIgaD1sLmRvbS5jb25kaXRpb24uY2hpbGRyZW4oIm9wdGlvbi4iK2wuY2xhc3Nlcy5vcHRpb24pLF89MDtfPGgubGVuZ3RoO18rKyl7dmFyIEY9dChoW19dKTtpZihGLnZhbCgpPT09bC5kb20uY29uZGl0aW9uLnZhbCgpKXtsLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksRi5wcm9wKCJzZWxlY3RlZCIsITApO2Zvcih2YXIgTz1GLnZhbCgpLGY9MCxVPU9iamVjdC5rZXlzKGwucy5jb25kaXRpb25zKTtmPFUubGVuZ3RoO2YrKyl7dmFyIFg9VVtmXTtpZihYPT09Tyl7bC5zLmNvbmRpdGlvbj1PO2JyZWFrfX1sLl9jbGVhclZhbHVlKCksbC5fcG9wdWxhdGVWYWx1ZSgpO2Zvcih2YXIgUT0wLEU9bC5kb20udmFsdWU7UTxFLmxlbmd0aDtRKyspe3ZhciAkPUVbUV07bC5zLmZpbGxlZCYmJCE9PXZvaWQgMCYmbC5kb20uaW5wdXRDb250LmhhcygkWzBdKS5sZW5ndGghPT0wJiYobC5zLmZpbGxlZD0hMSxsLmRvU2VhcmNoKCksbC5zZXRMaXN0ZW5lcnMoKSl9KGwuZG9tLnZhbHVlLmxlbmd0aD09PTB8fGwuZG9tLnZhbHVlLmxlbmd0aD09PTEmJmwuZG9tLnZhbHVlWzBdPT09dm9pZCAwKSYmbC5kb1NlYXJjaCgpfWVsc2UgRi5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpfX0pfSxjLnByb3RvdHlwZS5zZXR1cEJ1dHRvbnM9ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5uZXJXaWR0aD41NTApe3RoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMudmVydGljYWwpLHRoaXMuZG9tLmJ1dHRvbnMuY3NzKCJsZWZ0IixudWxsKSx0aGlzLmRvbS5idXR0b25zLmNzcygidG9wIixudWxsKTtyZXR1cm59dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52ZXJ0aWNhbCksdGhpcy5kb20uYnV0dG9ucy5jc3MoImxlZnQiLHRoaXMuZG9tLmRhdGEuaW5uZXJXaWR0aCgpKSx0aGlzLmRvbS5idXR0b25zLmNzcygidG9wIix0aGlzLmRvbS5kYXRhLnBvc2l0aW9uKCkudG9wKX0sYy5wcm90b3R5cGUuX2J1aWxkQ3JpdGVyaWE9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kYXRhLmFwcGVuZCh0aGlzLmRvbS5kYXRhVGl0bGUpLHRoaXMuZG9tLmNvbmRpdGlvbi5hcHBlbmQodGhpcy5kb20uY29uZGl0aW9uVGl0bGUpLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uZGF0YSkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvbiksdGhpcy5kb20uaW5wdXRDb250LmVtcHR5KCk7Zm9yKHZhciBsPTAsaD10aGlzLmRvbS52YWx1ZTtsPGgubGVuZ3RoO2wrKyl7dmFyIF89aFtsXTtfLmFwcGVuZCh0aGlzLmRvbS52YWx1ZVRpdGxlKSx0aGlzLmRvbS5pbnB1dENvbnQuYXBwZW5kKF8pfXRoaXMuZG9tLmJ1dHRvbnMuYXBwZW5kKHRoaXMuZG9tLmRlbGV0ZSkuYXBwZW5kKHRoaXMuZG9tLnJpZ2h0KSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmlucHV0Q29udCkuYXBwZW5kKHRoaXMuZG9tLmJ1dHRvbnMpLHRoaXMuc2V0TGlzdGVuZXJzKCl9LGMucHJvdG90eXBlLl9jbGVhckNvbmRpdGlvbj1mdW5jdGlvbigpe3RoaXMuZG9tLmNvbmRpdGlvbi5lbXB0eSgpLHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlLnByb3AoInNlbGVjdGVkIiwhMCkuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5kb20uY29uZGl0aW9uLnByZXBlbmQodGhpcy5kb20uY29uZGl0aW9uVGl0bGUpLnByb3AoInNlbGVjdGVkSW5kZXgiLDApLHRoaXMucy5jb25kaXRpb25zPXt9LHRoaXMucy5jb25kaXRpb249dm9pZCAwfSxjLnByb3RvdHlwZS5fY2xlYXJWYWx1ZT1mdW5jdGlvbigpe3ZhciBsO2lmKHRoaXMucy5jb25kaXRpb24hPT12b2lkIDApe2lmKHRoaXMuZG9tLnZhbHVlLmxlbmd0aD4wJiZ0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMClmb3IodmFyIGg9MCxfPXRoaXMuZG9tLnZhbHVlO2g8Xy5sZW5ndGg7aCsrKWw9X1toXSxsIT09dm9pZCAwJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bC5yZW1vdmUoKX0sNTApO2lmKHRoaXMuZG9tLnZhbHVlPVtdLmNvbmNhdCh0aGlzLnMuY29uZGl0aW9uc1t0aGlzLnMuY29uZGl0aW9uXS5pbml0KHRoaXMsYy51cGRhdGVMaXN0ZW5lcikpLHRoaXMuZG9tLnZhbHVlLmxlbmd0aD4wJiZ0aGlzLmRvbS52YWx1ZVswXSE9PXZvaWQgMCl7dGhpcy5kb20uaW5wdXRDb250LmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLnZhbHVlWzBdKS5pbnNlcnRBZnRlcih0aGlzLmRvbS5jb25kaXRpb24pLHQodGhpcy5kb20udmFsdWVbMF0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTtmb3IodmFyIEY9MTtGPHRoaXMuZG9tLnZhbHVlLmxlbmd0aDtGKyspdGhpcy5kb20uaW5wdXRDb250LmFwcGVuZCh0aGlzLmRvbS52YWx1ZVtGXSksdCh0aGlzLmRvbS52YWx1ZVtGXSkudHJpZ2dlcigiZHRzYi1pbnNlcnRlZCIpfX1lbHNle2Zvcih2YXIgTz0wLGY9dGhpcy5kb20udmFsdWU7TzxmLmxlbmd0aDtPKyspbD1mW09dLGwhPT12b2lkIDAmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtsLnJlbW92ZSgpfSw1MCk7dGhpcy5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApLHRoaXMuZG9tLmRlZmF1bHRWYWx1ZS5hcHBlbmQodGhpcy5kb20udmFsdWVUaXRsZSkuaW5zZXJ0QWZ0ZXIodGhpcy5kb20uY29uZGl0aW9uKX10aGlzLnMudmFsdWU9W10sdGhpcy5kb20udmFsdWU9W3QoIjxzZWxlY3QgZGlzYWJsZWQvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQodGhpcy5kb20udmFsdWVUaXRsZS5jbG9uZSgpKV19LGMucHJvdG90eXBlLl9nZXRPcHRpb25zPWZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5zLmR0O3JldHVybiB0LmV4dGVuZCghMCx7fSxjLmRlZmF1bHRzLGwuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbdGhpcy5zLmRhdGFJZHhdLnNlYXJjaEJ1aWxkZXIpfSxjLnByb3RvdHlwZS5fcG9wdWxhdGVDb25kaXRpb249ZnVuY3Rpb24oKXt2YXIgbD1bXSxoPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKS5sZW5ndGgsXz10aGlzLnMuZHQsRj1fLnNldHRpbmdzKClbMF0uYW9Db2x1bW5zLE89K3RoaXMuZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLGYsVTtpZihoPT09MCl7aWYodGhpcy5zLnR5cGU9Xy5jb2x1bW4oTykudHlwZSgpLEYhPT12b2lkIDApe3ZhciBYPUZbT107WC5zZWFyY2hCdWlsZGVyVHlwZSE9PXZvaWQgMCYmWC5zZWFyY2hCdWlsZGVyVHlwZSE9PW51bGw/dGhpcy5zLnR5cGU9WC5zZWFyY2hCdWlsZGVyVHlwZToodGhpcy5zLnR5cGU9PT12b2lkIDB8fHRoaXMucy50eXBlPT09bnVsbCkmJih0aGlzLnMudHlwZT1YLnNUeXBlKX0odGhpcy5zLnR5cGU9PT1udWxsfHx0aGlzLnMudHlwZT09PXZvaWQgMCkmJih0LmZuLmRhdGFUYWJsZS5leHQub0FwaSYmdC5mbi5kYXRhVGFibGUuZXh0Lm9BcGkuX2ZuQ29sdW1uVHlwZXMoXy5zZXR0aW5ncygpWzBdKSx0aGlzLnMudHlwZT1fLmNvbHVtbihPKS50eXBlKCkpLHRoaXMuZG9tLmNvbmRpdGlvbi5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLmVtcHR5KCkuYXBwZW5kKHRoaXMuZG9tLmNvbmRpdGlvblRpdGxlKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSx0aGlzLmRvbS5jb25kaXRpb25UaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBRPV8uc2V0dGluZ3MoKVswXS5vTGFuZ3VhZ2Uuc0RlY2ltYWw7USE9PSIiJiZ0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5kZXhPZihRKT09PXRoaXMucy50eXBlLmxlbmd0aC1RLmxlbmd0aCYmKHRoaXMucy50eXBlLmluY2x1ZGVzKCJudW0tZm10Iik/dGhpcy5zLnR5cGU9dGhpcy5zLnR5cGUucmVwbGFjZShRLCIiKTp0aGlzLnMudHlwZS5pbmNsdWRlcygibnVtIikmJih0aGlzLnMudHlwZT10aGlzLnMudHlwZS5yZXBsYWNlKFEsIiIpKSk7dmFyIEU9dm9pZCAwO3RoaXMuYy5jb25kaXRpb25zW3RoaXMucy50eXBlXSE9PXZvaWQgMD9FPXRoaXMuYy5jb25kaXRpb25zW3RoaXMucy50eXBlXTp0aGlzLnMudHlwZSYmdGhpcy5zLnR5cGUuaW5jbHVkZXMoImRhdGV0aW1lLSIpPyhFPWF0LnVzZSgibW9tZW50Iik/dGhpcy5jLmNvbmRpdGlvbnMubW9tZW50OnRoaXMuYy5jb25kaXRpb25zLmx1eG9uLHRoaXMucy5kYXRlRm9ybWF0PXRoaXMucy50eXBlLnJlcGxhY2UoL2RhdGV0aW1lLS9nLCIiKSk6dGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJtb21lbnQiKT8oRT10aGlzLmMuY29uZGl0aW9ucy5tb21lbnQsdGhpcy5zLmRhdGVGb3JtYXQ9dGhpcy5zLnR5cGUucmVwbGFjZSgvbW9tZW50LS9nLCIiKSk6dGhpcy5zLnR5cGUmJnRoaXMucy50eXBlLmluY2x1ZGVzKCJsdXhvbiIpPyhFPXRoaXMuYy5jb25kaXRpb25zLmx1eG9uLHRoaXMucy5kYXRlRm9ybWF0PXRoaXMucy50eXBlLnJlcGxhY2UoL2x1eG9uLS9nLCIiKSk6RT10aGlzLmMuY29uZGl0aW9ucy5zdHJpbmc7Zm9yKHZhciAkPTAsdz1PYmplY3Qua2V5cyhFKTskPHcubGVuZ3RoOyQrKylpZihmPXdbJF0sRVtmXSE9PW51bGwpe2lmKF8ucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmRVtmXS5pbml0PT09Yy5pbml0U2VsZWN0KXt2YXIgaz1GW09dO3RoaXMucy5zZXJ2ZXJEYXRhJiZ0aGlzLnMuc2VydmVyRGF0YVtrLmRhdGFdPyhFW2ZdLmluaXQ9Yy5pbml0U2VsZWN0U1NQLEVbZl0uaW5wdXRWYWx1ZT1jLmlucHV0VmFsdWVTZWxlY3QsRVtmXS5pc0lucHV0VmFsaWQ9Yy5pc0lucHV0VmFsaWRTZWxlY3QpOihFW2ZdLmluaXQ9Yy5pbml0SW5wdXQsRVtmXS5pbnB1dFZhbHVlPWMuaW5wdXRWYWx1ZUlucHV0LEVbZl0uaXNJbnB1dFZhbGlkPWMuaXNJbnB1dFZhbGlkSW5wdXQpfXRoaXMucy5jb25kaXRpb25zW2ZdPUVbZl0sVT1FW2ZdLmNvbmRpdGlvbk5hbWUsdHlwZW9mIFU9PSJmdW5jdGlvbiImJihVPVUoXyx0aGlzLmMuaTE4bikpLGwucHVzaCh0KCI8b3B0aW9uPiIse3RleHQ6VSx2YWx1ZTpmfSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm9wdGlvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5vdEl0YWxpYykpfX1lbHNlIGlmKGg+MCl7dGhpcy5kb20uY29uZGl0aW9uLmVtcHR5KCkucmVtb3ZlQXR0cigiZGlzYWJsZWQiKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKTtmb3IodmFyIFM9MCxCPU9iamVjdC5rZXlzKHRoaXMucy5jb25kaXRpb25zKTtTPEIubGVuZ3RoO1MrKyl7Zj1CW1NdO3ZhciBMPXRoaXMucy5jb25kaXRpb25zW2ZdLmNvbmRpdGlvbk5hbWU7dHlwZW9mIEw9PSJmdW5jdGlvbiImJihMPUwoXyx0aGlzLmMuaTE4bikpO3ZhciBSPXQoIjxvcHRpb24+Iix7dGV4dDpMLHZhbHVlOmZ9KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubm90SXRhbGljKTt0aGlzLnMuY29uZGl0aW9uIT09dm9pZCAwJiZ0aGlzLnMuY29uZGl0aW9uPT09TCYmKFIucHJvcCgic2VsZWN0ZWQiLCEwKSx0aGlzLmRvbS5jb25kaXRpb24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYykpLGwucHVzaChSKX19ZWxzZXt0aGlzLmRvbS5jb25kaXRpb24uYXR0cigiZGlzYWJsZWQiLCJ0cnVlIikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLml0YWxpYyk7cmV0dXJufWZvcih2YXIgcT0wLHo9bDtxPHoubGVuZ3RoO3ErKyl7dmFyIEc9eltxXTt0aGlzLmRvbS5jb25kaXRpb24uYXBwZW5kKEcpfWlmKEZbT10uc2VhcmNoQnVpbGRlciYmRltPXS5zZWFyY2hCdWlsZGVyLmRlZmF1bHRDb25kaXRpb24pe3ZhciBudD1GW09dLnNlYXJjaEJ1aWxkZXIuZGVmYXVsdENvbmRpdGlvbjtpZih0eXBlb2YgbnQ9PSJudW1iZXIiKXRoaXMuZG9tLmNvbmRpdGlvbi5wcm9wKCJzZWxlY3RlZEluZGV4IixudCksdGhpcy5kb20uY29uZGl0aW9uLnRyaWdnZXIoImNoYW5nZSIpO2Vsc2UgaWYodHlwZW9mIG50PT0ic3RyaW5nIilmb3IodmFyIHR0PTA7dHQ8bC5sZW5ndGg7dHQrKylmb3IodmFyIGV0PTAsd3Q9T2JqZWN0LmtleXModGhpcy5zLmNvbmRpdGlvbnMpO2V0PHd0Lmxlbmd0aDtldCsrKXt2YXIgU3Q9d3RbZXRdO2lmKFU9dGhpcy5zLmNvbmRpdGlvbnNbU3RdLmNvbmRpdGlvbk5hbWUsKHR5cGVvZiBVPT0ic3RyaW5nIj9VOlUoXyx0aGlzLmMuaTE4bikpPT09bFt0dF0udGV4dCgpJiZTdD09PW50KXt0aGlzLmRvbS5jb25kaXRpb24ucHJvcCgic2VsZWN0ZWRJbmRleCIsdGhpcy5kb20uY29uZGl0aW9uLmNoaWxkcmVuKCkudG9BcnJheSgpLmluZGV4T2YobFt0dF1bMF0pKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaXRhbGljKSx0aGlzLmRvbS5jb25kaXRpb24udHJpZ2dlcigiY2hhbmdlIiksdHQ9bC5sZW5ndGg7YnJlYWt9fX1lbHNlIHRoaXMuZG9tLmNvbmRpdGlvbi5wcm9wKCJzZWxlY3RlZEluZGV4IiwwKX0sYy5wcm90b3R5cGUuX3BvcHVsYXRlRGF0YT1mdW5jdGlvbigpe3ZhciBsPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1ucyxoPXRoaXMucy5kdC5jb2x1bW5zKHRoaXMuYy5jb2x1bW5zKS5pbmRleGVzKCkudG9BcnJheSgpO3RoaXMuZG9tLmRhdGEuZW1wdHkoKS5hcHBlbmQodGhpcy5kb20uZGF0YVRpdGxlKTtmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKylpZih0aGlzLmMuY29sdW1ucz09PSEwfHxoLmluY2x1ZGVzKF8pKXt2YXIgRj1sW19dLE89e2luZGV4Ol8sb3JpZ0RhdGE6Ri5kYXRhLHRleHQ6KEYuc2VhcmNoQnVpbGRlclRpdGxlfHxGLnNUaXRsZSkucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpfTt0aGlzLmRvbS5kYXRhLmFwcGVuZCh0KCI8b3B0aW9uPiIse3RleHQ6Ty50ZXh0LHZhbHVlOk8uaW5kZXh9KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubm90SXRhbGljKS5wcm9wKCJvcmlnRGF0YSIsRi5kYXRhKS5wcm9wKCJzZWxlY3RlZCIsdGhpcy5zLmRhdGFJZHg9PT1PLmluZGV4KSksdGhpcy5zLmRhdGFJZHg9PT1PLmluZGV4JiZ0aGlzLmRvbS5kYXRhVGl0bGUucmVtb3ZlUHJvcCgic2VsZWN0ZWQiKX19LGMucHJvdG90eXBlLl9wb3B1bGF0ZVZhbHVlPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMsXz10aGlzLnMuZmlsbGVkLEY7dGhpcy5zLmZpbGxlZD0hMSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5kb20uZGVmYXVsdFZhbHVlLnJlbW92ZSgpfSw1MCk7Zm9yKHZhciBPPWZ1bmN0aW9uKEUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtFIT09dm9pZCAwJiZFLnJlbW92ZSgpfSw1MCl9LGY9MCxVPXRoaXMuZG9tLnZhbHVlO2Y8VS5sZW5ndGg7ZisrKXt2YXIgWD1VW2ZdO08oWCl9dmFyIFE9dGhpcy5kb20uaW5wdXRDb250LmNoaWxkcmVuKCk7aWYoUS5sZW5ndGg+MSlmb3IoRj0wO0Y8US5sZW5ndGg7RisrKXQoUVtGXSkucmVtb3ZlKCk7Zm9yKGwhPT12b2lkIDAmJnRoaXMucy5kdC5jb2x1bW5zKCkuZXZlcnkoZnVuY3Rpb24oRSl7aC5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW0VdLnNUaXRsZT09PWwuZGF0YSYmKGgucy5kYXRhSWR4PUUpfSksdGhpcy5kb20udmFsdWU9W10uY29uY2F0KHRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmluaXQodGhpcyxjLnVwZGF0ZUxpc3RlbmVyLGwhPT12b2lkIDA/bC52YWx1ZTp2b2lkIDApKSxsIT09dm9pZCAwJiZsLnZhbHVlIT09dm9pZCAwJiYodGhpcy5zLnZhbHVlPWwudmFsdWUpLHRoaXMuZG9tLmlucHV0Q29udC5lbXB0eSgpLHRoaXMuZG9tLnZhbHVlWzBdIT09dm9pZCAwJiZ0KHRoaXMuZG9tLnZhbHVlWzBdKS5hcHBlbmRUbyh0aGlzLmRvbS5pbnB1dENvbnQpLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKSxGPTE7Rjx0aGlzLmRvbS52YWx1ZS5sZW5ndGg7RisrKXQodGhpcy5kb20udmFsdWVbRl0pLmluc2VydEFmdGVyKHRoaXMuZG9tLnZhbHVlW0YtMV0pLnRyaWdnZXIoImR0c2ItaW5zZXJ0ZWQiKTt0aGlzLnMuZmlsbGVkPXRoaXMucy5jb25kaXRpb25zW3RoaXMucy5jb25kaXRpb25dLmlzSW5wdXRWYWxpZCh0aGlzLmRvbS52YWx1ZSx0aGlzKSx0aGlzLnNldExpc3RlbmVycygpLCF0aGlzLnMucHJldmVudFJlZHJhdyYmXyE9PXRoaXMucy5maWxsZWQmJih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZXx8dGhpcy5kb1NlYXJjaCgpLHRoaXMuc2V0TGlzdGVuZXJzKCkpfSxjLnByb3RvdHlwZS5fdGhyb3R0bGU9ZnVuY3Rpb24obCxoKXtoPT09dm9pZCAwJiYoaD0yMDApO3ZhciBfPW51bGwsRj1udWxsLE89dGhpcztyZXR1cm4gaD09PW51bGwmJihoPTIwMCksZnVuY3Rpb24oKXtmb3IodmFyIGY9W10sVT0wO1U8YXJndW1lbnRzLmxlbmd0aDtVKyspZltVXT1hcmd1bWVudHNbVV07dmFyIFg9K25ldyBEYXRlO18hPT1udWxsJiZYPF8raD9jbGVhclRpbWVvdXQoRik6Xz1YLEY9c2V0VGltZW91dChmdW5jdGlvbigpe189bnVsbCxsLmFwcGx5KE8sZil9LGgpfX0sYy52ZXJzaW9uPSIxLjEuMCIsYy5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixidXR0b25Db250YWluZXI6ImR0c2ItYnV0dG9uQ29udGFpbmVyIixjb25kaXRpb246ImR0c2ItY29uZGl0aW9uIixjb250YWluZXI6ImR0c2ItY3JpdGVyaWEiLGRhdGE6ImR0c2ItZGF0YSIsZGVsZXRlOiJkdHNiLWRlbGV0ZSIsZHJvcERvd246ImR0c2ItZHJvcERvd24iLGdyZXlzY2FsZToiZHRzYi1ncmV5c2NhbGUiLGlucHV0OiJkdHNiLWlucHV0IixpbnB1dENvbnQ6ImR0c2ItaW5wdXRDb250IixpdGFsaWM6ImR0c2ItaXRhbGljIixqb2luZXI6ImR0c2Itam9pbmVyIixsZWZ0OiJkdHNiLWxlZnQiLG5vdEl0YWxpYzoiZHRzYi1ub3RJdGFsaWMiLG9wdGlvbjoiZHRzYi1vcHRpb24iLHJpZ2h0OiJkdHNiLXJpZ2h0IixzZWxlY3Q6ImR0c2Itc2VsZWN0Iix2YWx1ZToiZHRzYi12YWx1ZSIsdmVydGljYWw6ImR0c2ItdmVydGljYWwifSxjLmluaXRTZWxlY3Q9ZnVuY3Rpb24obCxoLF8sRil7Xz09PXZvaWQgMCYmKF89bnVsbCksRj09PXZvaWQgMCYmKEY9ITEpO3ZhciBPPWwuZG9tLmRhdGEuY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLnZhbCgpLGY9bC5zLmR0LnJvd3MoKS5pbmRleGVzKCkudG9BcnJheSgpLFU9bC5zLmR0LnNldHRpbmdzKClbMF0uZmFzdERhdGE7bC5kb20udmFsdWVUaXRsZS5wcm9wKCJzZWxlY3RlZCIsITApO3ZhciBYPXQoIjxzZWxlY3QvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmRyb3BEb3duKS5hZGRDbGFzcyhjLmNsYXNzZXMuaXRhbGljKS5hZGRDbGFzcyhjLmNsYXNzZXMuc2VsZWN0KS5hcHBlbmQobC5kb20udmFsdWVUaXRsZSkub24oImNoYW5nZS5kdHNiIixmdW5jdGlvbigpe3QodGhpcykucmVtb3ZlQ2xhc3MoYy5jbGFzc2VzLml0YWxpYyksaChsLHRoaXMpfSk7bC5jLmdyZXlzY2FsZSYmWC5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKTtmb3IodmFyIFE9W10sRT1bXSwkPTAsdz1mOyQ8dy5sZW5ndGg7JCsrKXt2YXIgaz13WyRdLFM9VShrLE8sdHlwZW9mIGwuYy5vcnRob2dvbmFsPT0ic3RyaW5nIj9sLmMub3J0aG9nb25hbDpsLmMub3J0aG9nb25hbC5zZWFyY2gpLEI9e2ZpbHRlcjp0eXBlb2YgUz09InN0cmluZyI/Uy5yZXBsYWNlKC9bXHJcblx1MjAyOF0vZywiICIpOlMsaW5kZXg6ayx0ZXh0OlUoayxPLHR5cGVvZiBsLmMub3J0aG9nb25hbD09InN0cmluZyI/bC5jLm9ydGhvZ29uYWw6bC5jLm9ydGhvZ29uYWwuZGlzcGxheSl9O2wucy50eXBlPT09ImFycmF5IiYmKEIuZmlsdGVyPUFycmF5LmlzQXJyYXkoQi5maWx0ZXIpP0IuZmlsdGVyOltCLmZpbHRlcl0sQi50ZXh0PUFycmF5LmlzQXJyYXkoQi50ZXh0KT9CLnRleHQ6W0IudGV4dF0pO3ZhciBMPWZ1bmN0aW9uKG50LHR0KXtsLnMudHlwZS5pbmNsdWRlcygiaHRtbCIpJiZudCE9PW51bGwmJnR5cGVvZiBudD09InN0cmluZyImJm50LnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTt2YXIgZXQ9dCgiPG9wdGlvbj4iLHt0eXBlOkFycmF5LmlzQXJyYXkobnQpPyJBcnJheSI6IlN0cmluZyIsdmFsdWU6bnR9KS5kYXRhKCJzYnYiLG50KS5hZGRDbGFzcyhsLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyhsLmNsYXNzZXMubm90SXRhbGljKS5odG1sKHR5cGVvZiB0dD09InN0cmluZyI/dHQucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpOnR0KSx3dD1ldC52YWwoKTtRLmluZGV4T2Yod3QpPT09LTEmJihRLnB1c2god3QpLEUucHVzaChldCksXyE9PW51bGwmJkFycmF5LmlzQXJyYXkoX1swXSkmJihfWzBdPV9bMF0uc29ydCgpLmpvaW4oIiwiKSksXyE9PW51bGwmJmV0LnZhbCgpPT09X1swXSYmKGV0LnByb3AoInNlbGVjdGVkIiwhMCksWC5yZW1vdmVDbGFzcyhjLmNsYXNzZXMuaXRhbGljKSxsLmRvbS52YWx1ZVRpdGxlLnJlbW92ZVByb3AoInNlbGVjdGVkIikpKX07aWYoRilmb3IodmFyIFI9MDtSPEIuZmlsdGVyLmxlbmd0aDtSKyspTChCLmZpbHRlcltSXSxCLnRleHRbUl0pO2Vsc2UgTChCLmZpbHRlcixBcnJheS5pc0FycmF5KEIudGV4dCk/Qi50ZXh0LmpvaW4oIiwgIik6Qi50ZXh0KX1FLnNvcnQoZnVuY3Rpb24obnQsdHQpe2lmKGwucy50eXBlPT09ImFycmF5Inx8bC5zLnR5cGU9PT0ic3RyaW5nInx8bC5zLnR5cGU9PT0iaHRtbCIpcmV0dXJuIG50LnZhbCgpPHR0LnZhbCgpPy0xOm50LnZhbCgpPnR0LnZhbCgpPzE6MDtpZihsLnMudHlwZT09PSJudW0ifHxsLnMudHlwZT09PSJodG1sLW51bSIpcmV0dXJuK250LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTwrdHQudmFsKCkucmVwbGFjZSgvKDwoW14+XSspPikvaWcsIiIpPy0xOitudC52YWwoKS5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKT8xOjA7aWYobC5zLnR5cGU9PT0ibnVtLWZtdCJ8fGwucy50eXBlPT09Imh0bWwtbnVtLWZtdCIpcmV0dXJuK250LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik8K3R0LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik/LTE6K250LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik+K3R0LnZhbCgpLnJlcGxhY2UoL1teMC05Ll0vZywiIik/MTowfSk7Zm9yKHZhciBxPTAsej1FO3E8ei5sZW5ndGg7cSsrKXt2YXIgRz16W3FdO1guYXBwZW5kKEcpfXJldHVybiBYfSxjLmluaXRTZWxlY3RTU1A9ZnVuY3Rpb24obCxoLF8pe189PT12b2lkIDAmJihfPW51bGwpLGwuZG9tLnZhbHVlVGl0bGUucHJvcCgic2VsZWN0ZWQiLCEwKTt2YXIgRj10KCI8c2VsZWN0Lz4iKS5hZGRDbGFzcyhjLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGMuY2xhc3Nlcy5kcm9wRG93bikuYWRkQ2xhc3MoYy5jbGFzc2VzLml0YWxpYykuYWRkQ2xhc3MoYy5jbGFzc2VzLnNlbGVjdCkuYXBwZW5kKGwuZG9tLnZhbHVlVGl0bGUpLm9uKCJjaGFuZ2UuZHRzYiIsZnVuY3Rpb24oKXt0KHRoaXMpLnJlbW92ZUNsYXNzKGMuY2xhc3Nlcy5pdGFsaWMpLGgobCx0aGlzKX0pO2wuYy5ncmV5c2NhbGUmJkYuYWRkQ2xhc3MoYy5jbGFzc2VzLmdyZXlzY2FsZSk7Zm9yKHZhciBPPVtdLGY9MCxVPWwucy5zZXJ2ZXJEYXRhW2wucy5vcmlnRGF0YV07ZjxVLmxlbmd0aDtmKyspe3ZhciBYPVVbZl0sUT1YLnZhbHVlLEU9WC5sYWJlbCwkPWZ1bmN0aW9uKEIsTCl7bC5zLnR5cGUuaW5jbHVkZXMoImh0bWwiKSYmQiE9PW51bGwmJnR5cGVvZiBCPT0ic3RyaW5nIiYmQi5yZXBsYWNlKC8oPChbXj5dKyk+KS9pZywiIik7dmFyIFI9dCgiPG9wdGlvbj4iLHt0eXBlOkFycmF5LmlzQXJyYXkoQik/IkFycmF5IjoiU3RyaW5nIix2YWx1ZTpCfSkuZGF0YSgic2J2IixCKS5hZGRDbGFzcyhsLmNsYXNzZXMub3B0aW9uKS5hZGRDbGFzcyhsLmNsYXNzZXMubm90SXRhbGljKS5odG1sKHR5cGVvZiBMPT0ic3RyaW5nIj9MLnJlcGxhY2UoLyg8KFtePl0rKT4pL2lnLCIiKTpMKTtPLnB1c2goUiksXyE9PW51bGwmJlIudmFsKCk9PT1fWzBdJiYoUi5wcm9wKCJzZWxlY3RlZCIsITApLEYucmVtb3ZlQ2xhc3MoYy5jbGFzc2VzLml0YWxpYyksbC5kb20udmFsdWVUaXRsZS5yZW1vdmVQcm9wKCJzZWxlY3RlZCIpKX07JChRLEUpfWZvcih2YXIgdz0wLGs9Tzt3PGsubGVuZ3RoO3crKyl7dmFyIFM9a1t3XTtGLmFwcGVuZChTKX1yZXR1cm4gRn0sYy5pbml0U2VsZWN0QXJyYXk9ZnVuY3Rpb24obCxoLF8pe3JldHVybiBfPT09dm9pZCAwJiYoXz1udWxsKSxjLmluaXRTZWxlY3QobCxoLF8sITApfSxjLmluaXRJbnB1dD1mdW5jdGlvbihsLGgsXyl7Xz09PXZvaWQgMCYmKF89bnVsbCk7dmFyIEY9bC5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksTz10KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIixsLl90aHJvdHRsZShmdW5jdGlvbihmKXt2YXIgVT1mLmtleUNvZGV8fGYud2hpY2g7cmV0dXJuIGgobCx0aGlzLFUpfSxGPT09bnVsbD8xMDA6RikpO3JldHVybiBsLmMuZ3JleXNjYWxlJiZPLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpLF8hPT1udWxsJiZPLnZhbChfWzBdKSxsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLE99LGMuaW5pdDJJbnB1dD1mdW5jdGlvbihsLGgsXyl7Xz09PXZvaWQgMCYmKF89bnVsbCk7dmFyIEY9bC5zLmR0LnNldHRpbmdzKClbMF0uc2VhcmNoRGVsYXksTz1bdCgiPGlucHV0Lz4iKS5hZGRDbGFzcyhjLmNsYXNzZXMudmFsdWUpLmFkZENsYXNzKGMuY2xhc3Nlcy5pbnB1dCkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsbC5fdGhyb3R0bGUoZnVuY3Rpb24oZil7dmFyIFU9Zi5rZXlDb2RlfHxmLndoaWNoO3JldHVybiBoKGwsdGhpcyxVKX0sRj09PW51bGw/MTAwOkYpKSx0KCI8c3Bhbj4iKS5hZGRDbGFzcyhsLmNsYXNzZXMuam9pbmVyKS5odG1sKGwucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLnZhbHVlSm9pbmVyIixsLmMuaTE4bi52YWx1ZUpvaW5lcikpLHQoIjxpbnB1dC8+IikuYWRkQ2xhc3MoYy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhjLmNsYXNzZXMuaW5wdXQpLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLGwuX3Rocm90dGxlKGZ1bmN0aW9uKGYpe3ZhciBVPWYua2V5Q29kZXx8Zi53aGljaDtyZXR1cm4gaChsLHRoaXMsVSl9LEY9PT1udWxsPzEwMDpGKSldO3JldHVybiBsLmMuZ3JleXNjYWxlJiYoT1swXS5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKSxPWzJdLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpKSxfIT09bnVsbCYmKE9bMF0udmFsKF9bMF0pLE9bMl0udmFsKF9bMV0pKSxsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLE99LGMuaW5pdERhdGU9ZnVuY3Rpb24obCxoLF8pe189PT12b2lkIDAmJihfPW51bGwpO3ZhciBGPWwucy5kdC5zZXR0aW5ncygpWzBdLnNlYXJjaERlbGF5LE89bC5zLmR0LmkxOG4oImRhdGV0aW1lIix7fSksZj10KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpsLnMuZGF0ZUZvcm1hdD9sLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjpPfSkub24oImNoYW5nZS5kdHNiIixsLl90aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBoKGwsdGhpcyl9LEY9PT1udWxsPzEwMDpGKSkub24oImlucHV0LmR0c2Iga2V5cHJlc3MuZHRzYiIsZnVuY3Rpb24oVSl7bC5fdGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgWD1VLmtleUNvZGV8fFUud2hpY2g7cmV0dXJuIGgobCx0aGlzLFgpfSxGPT09bnVsbD8xMDA6Ril9KTtyZXR1cm4gbC5jLmdyZXlzY2FsZSYmZi5hZGRDbGFzcyhjLmNsYXNzZXMuZ3JleXNjYWxlKSxfIT09bnVsbCYmZi52YWwoX1swXSksbC5zLmR0Lm9uZSgiZHJhdy5kdHNiIixmdW5jdGlvbigpe2wucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0xvZ2ljIil9KSxmfSxjLmluaXROb1ZhbHVlPWZ1bmN0aW9uKGwpe3JldHVybiBsLnMuZHQub25lKCJkcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3TG9naWMiKX0pLFtdfSxjLmluaXQyRGF0ZT1mdW5jdGlvbihsLGgsXyl7dmFyIEY9dGhpcztfPT09dm9pZCAwJiYoXz1udWxsKTt2YXIgTz1sLnMuZHQuc2V0dGluZ3MoKVswXS5zZWFyY2hEZWxheSxmPWwucy5kdC5pMThuKCJkYXRldGltZSIse30pLFU9W3QoIjxpbnB1dC8+IikuYWRkQ2xhc3MoYy5jbGFzc2VzLnZhbHVlKS5hZGRDbGFzcyhjLmNsYXNzZXMuaW5wdXQpLmR0RGF0ZVRpbWUoe2F0dGFjaFRvOiJpbnB1dCIsZm9ybWF0Omwucy5kYXRlRm9ybWF0P2wucy5kYXRlRm9ybWF0OnZvaWQgMCxpMThuOmZ9KS5vbigiY2hhbmdlLmR0c2IiLE8hPT1udWxsP2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtyZXR1cm4gaChsLHRoaXMpfSxPKTpmdW5jdGlvbigpe2gobCxGKX0pLm9uKCJpbnB1dC5kdHNiIGtleXByZXNzLmR0c2IiLGZ1bmN0aW9uKFgpe2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXt2YXIgUT1YLmtleUNvZGV8fFgud2hpY2g7cmV0dXJuIGgobCx0aGlzLFEpfSxPPT09bnVsbD8wOk8pfSksdCgiPHNwYW4+IikuYWRkQ2xhc3MobC5jbGFzc2VzLmpvaW5lcikuaHRtbChsLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci52YWx1ZUpvaW5lciIsbC5jLmkxOG4udmFsdWVKb2luZXIpKSx0KCI8aW5wdXQvPiIpLmFkZENsYXNzKGMuY2xhc3Nlcy52YWx1ZSkuYWRkQ2xhc3MoYy5jbGFzc2VzLmlucHV0KS5kdERhdGVUaW1lKHthdHRhY2hUbzoiaW5wdXQiLGZvcm1hdDpsLnMuZGF0ZUZvcm1hdD9sLnMuZGF0ZUZvcm1hdDp2b2lkIDAsaTE4bjpmfSkub24oImNoYW5nZS5kdHNiIixPIT09bnVsbD9hdC51dGlsLnRocm90dGxlKGZ1bmN0aW9uKCl7cmV0dXJuIGgobCx0aGlzKX0sTyk6ZnVuY3Rpb24oKXtoKGwsRil9KS5vbigiaW5wdXQuZHRzYiBrZXlwcmVzcy5kdHNiIiwhbC5jLmVudGVyU2VhcmNoJiYhKGwucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmbC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybikmJk8hPT1udWxsP2F0LnV0aWwudGhyb3R0bGUoZnVuY3Rpb24oKXtyZXR1cm4gaChsLHRoaXMpfSxPKTpmdW5jdGlvbihYKXt2YXIgUT1YLmtleUNvZGV8fFgud2hpY2g7aChsLEYsUSl9KV07cmV0dXJuIGwuYy5ncmV5c2NhbGUmJihVWzBdLmFkZENsYXNzKGMuY2xhc3Nlcy5ncmV5c2NhbGUpLFVbMl0uYWRkQ2xhc3MoYy5jbGFzc2VzLmdyZXlzY2FsZSkpLF8hPT1udWxsJiZfLmxlbmd0aD4wJiYoVVswXS52YWwoX1swXSksVVsyXS52YWwoX1sxXSkpLGwucy5kdC5vbmUoImRyYXcuZHRzYiIsZnVuY3Rpb24oKXtsLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdMb2dpYyIpfSksVX0sYy5pc0lucHV0VmFsaWRTZWxlY3Q9ZnVuY3Rpb24obCl7Zm9yKHZhciBoPSEwLF89MCxGPWw7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107Ty5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIikubGVuZ3RoPT09Ty5jaGlsZHJlbigib3B0aW9uIikubGVuZ3RoLU8uY2hpbGRyZW4oIm9wdGlvbi4iK2MuY2xhc3Nlcy5ub3RJdGFsaWMpLmxlbmd0aCYmTy5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIikubGVuZ3RoPT09MSYmTy5jaGlsZHJlbigib3B0aW9uOnNlbGVjdGVkIilbMF09PT1PLmNoaWxkcmVuKCJvcHRpb24iKVswXSYmKGg9ITEpfXJldHVybiBofSxjLmlzSW5wdXRWYWxpZElucHV0PWZ1bmN0aW9uKGwpe2Zvcih2YXIgaD0hMCxfPTAsRj1sO188Ri5sZW5ndGg7XysrKXt2YXIgTz1GW19dO08uaXMoImlucHV0IikmJk8udmFsKCkubGVuZ3RoPT09MCYmKGg9ITEpfXJldHVybiBofSxjLmlucHV0VmFsdWVTZWxlY3Q9ZnVuY3Rpb24obCl7Zm9yKHZhciBoPVtdLF89MCxGPWw7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107Ty5pcygic2VsZWN0IikmJmgucHVzaChjLl9lc2NhcGVIVE1MKE8uY2hpbGRyZW4oIm9wdGlvbjpzZWxlY3RlZCIpLmRhdGEoInNidiIpKSl9cmV0dXJuIGh9LGMuaW5wdXRWYWx1ZUlucHV0PWZ1bmN0aW9uKGwpe2Zvcih2YXIgaD1bXSxfPTAsRj1sO188Ri5sZW5ndGg7XysrKXt2YXIgTz1GW19dO08uaXMoImlucHV0IikmJmgucHVzaChjLl9lc2NhcGVIVE1MKE8udmFsKCkpKX1yZXR1cm4gaH0sYy51cGRhdGVMaXN0ZW5lcj1mdW5jdGlvbihsLGgsXyl7dmFyIEY9bC5zLmNvbmRpdGlvbnNbbC5zLmNvbmRpdGlvbl0sTztpZihsLnMuZmlsbGVkPUYuaXNJbnB1dFZhbGlkKGwuZG9tLnZhbHVlLGwpLGwucy52YWx1ZT1GLmlucHV0VmFsdWUobC5kb20udmFsdWUsbCksIWwucy5maWxsZWQpeyghbC5jLmVudGVyU2VhcmNoJiYhKGwucy5kdC5zZXR0aW5ncygpWzBdLm9Jbml0LnNlYXJjaCE9PXZvaWQgMCYmbC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoLnJldHVybil8fF89PT0xMykmJmwuZG9TZWFyY2goKTtyZXR1cm59Zm9yKEFycmF5LmlzQXJyYXkobC5zLnZhbHVlKXx8KGwucy52YWx1ZT1bbC5zLnZhbHVlXSksTz0wO088bC5zLnZhbHVlLmxlbmd0aDtPKyspQXJyYXkuaXNBcnJheShsLnMudmFsdWVbT10pJiZsLnMudmFsdWVbT10uc29ydCgpO3ZhciBmPW51bGwsVT1udWxsO2ZvcihPPTA7TzxsLmRvbS52YWx1ZS5sZW5ndGg7TysrKWg9PT1sLmRvbS52YWx1ZVtPXVswXSYmKGY9TyxoLnNlbGVjdGlvblN0YXJ0IT09dm9pZCAwJiYoVT1oLnNlbGVjdGlvblN0YXJ0KSk7KCFsLmMuZW50ZXJTZWFyY2gmJiEobC5zLmR0LnNldHRpbmdzKClbMF0ub0luaXQuc2VhcmNoIT09dm9pZCAwJiZsLnMuZHQuc2V0dGluZ3MoKVswXS5vSW5pdC5zZWFyY2gucmV0dXJuKXx8Xz09PTEzKSYmbC5kb1NlYXJjaCgpLGYhPT1udWxsJiYobC5kb20udmFsdWVbZl0ucmVtb3ZlQ2xhc3MobC5jbGFzc2VzLml0YWxpYyksbC5kb20udmFsdWVbZl0uZm9jdXMoKSxVIT09bnVsbCYmbC5kb20udmFsdWVbZl1bMF0uc2V0U2VsZWN0aW9uUmFuZ2UoVSxVKSl9LGMuZGF0ZUNvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVxdWFscyIsaC5jb25kaXRpb25zLmRhdGUuZXF1YWxzKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbD09PWhbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixoLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbD1sLnJlcGxhY2UoLyhcL3wtfCwpL2csIi0iKSxsIT09aFswXX19LCI8Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJlZm9yZSIsaC5jb25kaXRpb25zLmRhdGUuYmVmb3JlKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbDxoWzBdfX0sIj4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYWZ0ZXIiLGguY29uZGl0aW9ucy5kYXRlLmFmdGVyKX0saW5pdDpjLmluaXREYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksbD5oWzBdfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGguY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmMuaW5pdDJEYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGw9bC5yZXBsYWNlKC8oXC98LXwsKS9nLCItIiksaFswXTxoWzFdP2hbMF08PWwmJmw8PWhbMV06aFsxXTw9bCYmbDw9aFswXX19LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuIixoLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuKX0saW5pdDpjLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsPWwucmVwbGFjZSgvKFwvfC18LCkvZywiLSIpLGhbMF08aFsxXT8hKGhbMF08PWwmJmw8PWhbMV0pOiEoaFsxXTw9bCYmbDw9aFswXSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLmVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PW51bGx8fGwubGVuZ3RoPT09MH19LCIhbnVsbCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSIsaC5jb25kaXRpb25zLmRhdGUubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4hKGw9PW51bGx8fGwubGVuZ3RoPT09MCl9fX0sYy5tb21lbnREYXRlQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZXF1YWxzIixoLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPT09bigpKGhbMF0sXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3QiLGguY29uZGl0aW9ucy5kYXRlLm5vdCl9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIG4oKShsLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCkhPT1uKCkoaFswXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmVmb3JlIixoLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPG4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5hZnRlciIsaC5jb25kaXRpb25zLmRhdGUuYWZ0ZXIpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBuKCkobCxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpPm4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCl9fSxiZXR3ZWVuOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmV0d2VlbiIsaC5jb25kaXRpb25zLmRhdGUuYmV0d2Vlbil9LGluaXQ6Yy5pbml0MkRhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPW4oKShsLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksTz1uKCkoaFswXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpLGY9bigpKGhbMV0sXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKTtyZXR1cm4gTzxmP088PUYmJkY8PWY6Zjw9RiYmRjw9T319LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuIixoLmNvbmRpdGlvbnMuZGF0ZS5ub3RCZXR3ZWVuKX0saW5pdDpjLmluaXQyRGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7dmFyIEY9bigpKGwsXy5zLmRhdGVGb3JtYXQpLnZhbHVlT2YoKSxPPW4oKShoWzBdLF8ucy5kYXRlRm9ybWF0KS52YWx1ZU9mKCksZj1uKCkoaFsxXSxfLnMuZGF0ZUZvcm1hdCkudmFsdWVPZigpO3JldHVybiBPPGY/ISgrTzw9K0YmJitGPD0rZik6ISgrZjw9K0YmJitGPD0rTyl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuZW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLmVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIGw9PW51bGx8fGwubGVuZ3RoPT09MH19LCIhbnVsbCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5ub3RFbXB0eSIsaC5jb25kaXRpb25zLmRhdGUubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4hKGw9PW51bGx8fGwubGVuZ3RoPT09MCl9fX0sYy5sdXhvbkRhdGVDb25kaXRpb25zPXsiPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuZGF0ZS5lcXVhbHMiLGguY29uZGl0aW9ucy5kYXRlLmVxdWFscyl9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIHIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzPT09cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFswXSxfLnMuZGF0ZUZvcm1hdCkudHN9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90IixoLmNvbmRpdGlvbnMuZGF0ZS5ub3QpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiByKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50cyE9PXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUuYmVmb3JlIixoLmNvbmRpdGlvbnMuZGF0ZS5iZWZvcmUpfSxpbml0OmMuaW5pdERhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiByKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50czxyKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChoWzBdLF8ucy5kYXRlRm9ybWF0KS50c319LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmFmdGVyIixoLmNvbmRpdGlvbnMuZGF0ZS5hZnRlcil9LGluaXQ6Yy5pbml0RGF0ZSxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIHIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzPnIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmJldHdlZW4iLGguY29uZGl0aW9ucy5kYXRlLmJldHdlZW4pfSxpbml0OmMuaW5pdDJEYXRlLGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXt2YXIgRj1yKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChsLF8ucy5kYXRlRm9ybWF0KS50cyxPPXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGhbMF0sXy5zLmRhdGVGb3JtYXQpLnRzLGY9cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFsxXSxfLnMuZGF0ZUZvcm1hdCkudHM7cmV0dXJuIE88Zj9PPD1GJiZGPD1mOmY8PUYmJkY8PU99fSwiIWJldHdlZW4iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90QmV0d2VlbiIsaC5jb25kaXRpb25zLmRhdGUubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MkRhdGUsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPXIoKS5EYXRlVGltZS5mcm9tRm9ybWF0KGwsXy5zLmRhdGVGb3JtYXQpLnRzLE89cigpLkRhdGVUaW1lLmZyb21Gb3JtYXQoaFswXSxfLnMuZGF0ZUZvcm1hdCkudHMsZj1yKCkuRGF0ZVRpbWUuZnJvbUZvcm1hdChoWzFdLF8ucy5kYXRlRm9ybWF0KS50cztyZXR1cm4gTzxmPyEoK088PStGJiYrRjw9K2YpOiEoK2Y8PStGJiYrRjw9K08pfX0sbnVsbDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5kYXRlLmVtcHR5IixoLmNvbmRpdGlvbnMuZGF0ZS5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmRhdGUubm90RW1wdHkiLGguY29uZGl0aW9ucy5kYXRlLm5vdEVtcHR5KX0saW5pdDpjLmluaXROb1ZhbHVlLGlucHV0VmFsdWU6ZnVuY3Rpb24oKXt9LGlzSW5wdXRWYWxpZDpmdW5jdGlvbigpe3JldHVybiEwfSxzZWFyY2g6ZnVuY3Rpb24obCl7cmV0dXJuIShsPT1udWxsfHxsLmxlbmd0aD09PTApfX19LGMubnVtQ29uZGl0aW9ucz17Ij0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lcXVhbHMiLGguY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzKX0saW5pdDpjLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybitsPT0raFswXX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdCIsaC5jb25kaXRpb25zLm51bWJlci5ub3QpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2whPStoWzBdfX0sIjwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5sdCIsaC5jb25kaXRpb25zLm51bWJlci5sdCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4rbDwraFswXX19LCI8PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0ZSIsaC5jb25kaXRpb25zLm51bWJlci5sdGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2w8PStoWzBdfX0sIj49Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZ3RlIixoLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4rbD49K2hbMF19fSwiPiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0IixoLmNvbmRpdGlvbnMubnVtYmVyLmd0KX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybitsPitoWzBdfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuYmV0d2VlbiIsaC5jb25kaXRpb25zLm51bWJlci5iZXR3ZWVuKX0saW5pdDpjLmluaXQySW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4raFswXTwraFsxXT8raFswXTw9K2wmJitsPD0raFsxXToraFsxXTw9K2wmJitsPD0raFswXX19LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4iLGguY29uZGl0aW9ucy5udW1iZXIubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MklucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuK2hbMF08K2hbMV0/ISgraFswXTw9K2wmJitsPD0raFsxXSk6ISgraFsxXTw9K2wmJitsPD0raFswXSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLm51bUZtdENvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZXF1YWxzIixoLmNvbmRpdGlvbnMubnVtYmVyLmVxdWFscyl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3JldHVybiBfLnBhcnNlTnVtYmVyKGwpPT09Xy5wYXJzZU51bWJlcihoWzBdKX19LCIhPSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdCIsaC5jb25kaXRpb25zLm51bWJlci5ub3QpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKSE9PV8ucGFyc2VOdW1iZXIoaFswXSl9fSwiPCI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0IixoLmNvbmRpdGlvbnMubnVtYmVyLmx0KX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgsXyl7cmV0dXJuIF8ucGFyc2VOdW1iZXIobCk8Xy5wYXJzZU51bWJlcihoWzBdKX19LCI8PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmx0ZSIsaC5jb25kaXRpb25zLm51bWJlci5sdGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKTw9Xy5wYXJzZU51bWJlcihoWzBdKX19LCI+PSI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLmd0ZSIsaC5jb25kaXRpb25zLm51bWJlci5ndGUpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKT49Xy5wYXJzZU51bWJlcihoWzBdKX19LCI+Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuZ3QiLGguY29uZGl0aW9ucy5udW1iZXIuZ3QpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXtyZXR1cm4gXy5wYXJzZU51bWJlcihsKT5fLnBhcnNlTnVtYmVyKGhbMF0pfX0sYmV0d2Vlbjp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5udW1iZXIuYmV0d2VlbiIsaC5jb25kaXRpb25zLm51bWJlci5iZXR3ZWVuKX0saW5pdDpjLmluaXQySW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoLF8pe3ZhciBGPV8ucGFyc2VOdW1iZXIobCksTz1fLnBhcnNlTnVtYmVyKGhbMF0pLGY9Xy5wYXJzZU51bWJlcihoWzFdKTtyZXR1cm4rTzwrZj8rTzw9K0YmJitGPD0rZjorZjw9K0YmJitGPD0rT319LCIhYmV0d2VlbiI6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMubnVtYmVyLm5vdEJldHdlZW4iLGguY29uZGl0aW9ucy5udW1iZXIubm90QmV0d2Vlbil9LGluaXQ6Yy5pbml0MklucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCxfKXt2YXIgRj1fLnBhcnNlTnVtYmVyKGwpLE89Xy5wYXJzZU51bWJlcihoWzBdKSxmPV8ucGFyc2VOdW1iZXIoaFsxXSk7cmV0dXJuK088K2Y/ISgrTzw9K0YmJitGPD0rZik6ISgrZjw9K0YmJitGPD0rTyl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5lbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSIsaC5jb25kaXRpb25zLm51bWJlci5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLnN0cmluZ0NvbmRpdGlvbnM9eyI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5zdHJpbmcuZXF1YWxzIixoLmNvbmRpdGlvbnMuc3RyaW5nLmVxdWFscyl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbD09PWhbMF19fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3QiLGguY29uZGl0aW9ucy5zdHJpbmcubm90KX0saW5pdDpjLmluaXRTZWxlY3QsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwhPT1oWzBdfX0sc3RhcnRzOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5zdGFydHNXaXRoIixoLmNvbmRpdGlvbnMuc3RyaW5nLnN0YXJ0c1dpdGgpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGhbMF0udG9Mb3dlckNhc2UoKSk9PT0wfX0sIiFzdGFydHMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RTdGFydHNXaXRoIixoLmNvbmRpdGlvbnMuc3RyaW5nLm5vdFN0YXJ0c1dpdGgpfSxpbml0OmMuaW5pdElucHV0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlSW5wdXQsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkSW5wdXQsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGhbMF0udG9Mb3dlckNhc2UoKSkhPT0wfX0sY29udGFpbnM6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuc3RyaW5nLmNvbnRhaW5zIixoLmNvbmRpdGlvbnMuc3RyaW5nLmNvbnRhaW5zKX0saW5pdDpjLmluaXRJbnB1dCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZUlucHV0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZElucHV0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoaFswXS50b0xvd2VyQ2FzZSgpKX19LCIhY29udGFpbnMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RDb250YWlucyIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RDb250YWlucyl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4hbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGhbMF0udG9Mb3dlckNhc2UoKSl9fSxlbmRzOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5lbmRzV2l0aCIsaC5jb25kaXRpb25zLnN0cmluZy5lbmRzV2l0aCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGhbMF0udG9Mb3dlckNhc2UoKSl9fSwiIWVuZHMiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RFbmRzV2l0aCIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RFbmRzV2l0aCl9LGluaXQ6Yy5pbml0SW5wdXQsaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVJbnB1dCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRJbnB1dCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtyZXR1cm4hbC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKGhbMF0udG9Mb3dlckNhc2UoKSl9fSxudWxsOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5lbXB0eSIsaC5jb25kaXRpb25zLnN0cmluZy5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLnN0cmluZy5ub3RFbXB0eSIsaC5jb25kaXRpb25zLnN0cmluZy5ub3RFbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiEobD09bnVsbHx8bC5sZW5ndGg9PT0wKX19fSxjLmFycmF5Q29uZGl0aW9ucz17Y29udGFpbnM6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuY29udGFpbnMiLGguY29uZGl0aW9ucy5hcnJheS5jb250YWlucyl9LGluaXQ6Yy5pbml0U2VsZWN0QXJyYXksaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLmluY2x1ZGVzKGhbMF0pfX0sd2l0aG91dDp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS53aXRob3V0IixoLmNvbmRpdGlvbnMuYXJyYXkud2l0aG91dCl9LGluaXQ6Yy5pbml0U2VsZWN0QXJyYXksaW5wdXRWYWx1ZTpjLmlucHV0VmFsdWVTZWxlY3QsaXNJbnB1dFZhbGlkOmMuaXNJbnB1dFZhbGlkU2VsZWN0LHNlYXJjaDpmdW5jdGlvbihsLGgpe3JldHVybiBsLmluZGV4T2YoaFswXSk9PT0tMX19LCI9Ijp7Y29uZGl0aW9uTmFtZTpmdW5jdGlvbihsLGgpe3JldHVybiBsLmkxOG4oInNlYXJjaEJ1aWxkZXIuY29uZGl0aW9ucy5hcnJheS5lcXVhbHMiLGguY29uZGl0aW9ucy5hcnJheS5lcXVhbHMpfSxpbml0OmMuaW5pdFNlbGVjdCxpbnB1dFZhbHVlOmMuaW5wdXRWYWx1ZVNlbGVjdCxpc0lucHV0VmFsaWQ6Yy5pc0lucHV0VmFsaWRTZWxlY3Qsc2VhcmNoOmZ1bmN0aW9uKGwsaCl7aWYobC5sZW5ndGg9PT1oWzBdLmxlbmd0aCl7Zm9yKHZhciBfPTA7XzxsLmxlbmd0aDtfKyspaWYobFtfXSE9PWhbMF1bX10pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuITF9fSwiIT0iOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5Lm5vdCIsaC5jb25kaXRpb25zLmFycmF5Lm5vdCl9LGluaXQ6Yy5pbml0U2VsZWN0LGlucHV0VmFsdWU6Yy5pbnB1dFZhbHVlU2VsZWN0LGlzSW5wdXRWYWxpZDpjLmlzSW5wdXRWYWxpZFNlbGVjdCxzZWFyY2g6ZnVuY3Rpb24obCxoKXtpZihsLmxlbmd0aD09PWhbMF0ubGVuZ3RoKXtmb3IodmFyIF89MDtfPGwubGVuZ3RoO18rKylpZihsW19dIT09aFswXVtfXSlyZXR1cm4hMDtyZXR1cm4hMX1yZXR1cm4hMH19LG51bGw6e2NvbmRpdGlvbk5hbWU6ZnVuY3Rpb24obCxoKXtyZXR1cm4gbC5pMThuKCJzZWFyY2hCdWlsZGVyLmNvbmRpdGlvbnMuYXJyYXkuZW1wdHkiLGguY29uZGl0aW9ucy5hcnJheS5lbXB0eSl9LGluaXQ6Yy5pbml0Tm9WYWx1ZSxpbnB1dFZhbHVlOmZ1bmN0aW9uKCl7fSxpc0lucHV0VmFsaWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sc2VhcmNoOmZ1bmN0aW9uKGwpe3JldHVybiBsPT1udWxsfHxsLmxlbmd0aD09PTB9fSwiIW51bGwiOntjb25kaXRpb25OYW1lOmZ1bmN0aW9uKGwsaCl7cmV0dXJuIGwuaTE4bigic2VhcmNoQnVpbGRlci5jb25kaXRpb25zLmFycmF5Lm5vdEVtcHR5IixoLmNvbmRpdGlvbnMuYXJyYXkubm90RW1wdHkpfSxpbml0OmMuaW5pdE5vVmFsdWUsaW5wdXRWYWx1ZTpmdW5jdGlvbigpe30saXNJbnB1dFZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHNlYXJjaDpmdW5jdGlvbihsKXtyZXR1cm4gbCE9bnVsbCYmbC5sZW5ndGghPT0wfX19LGMuZGVmYXVsdHM9e2NvbHVtbnM6ITAsY29uZGl0aW9uczp7YXJyYXk6Yy5hcnJheUNvbmRpdGlvbnMsZGF0ZTpjLmRhdGVDb25kaXRpb25zLGh0bWw6Yy5zdHJpbmdDb25kaXRpb25zLCJodG1sLW51bSI6Yy5udW1Db25kaXRpb25zLCJodG1sLW51bS1mbXQiOmMubnVtRm10Q29uZGl0aW9ucyxsdXhvbjpjLmx1eG9uRGF0ZUNvbmRpdGlvbnMsbW9tZW50OmMubW9tZW50RGF0ZUNvbmRpdGlvbnMsbnVtOmMubnVtQ29uZGl0aW9ucywibnVtLWZtdCI6Yy5udW1GbXRDb25kaXRpb25zLHN0cmluZzpjLnN0cmluZ0NvbmRpdGlvbnN9LGRlcHRoTGltaXQ6ITEsZW50ZXJTZWFyY2g6ITEsZmlsdGVyQ2hhbmdlZDp2b2lkIDAsZ3JleXNjYWxlOiExLGkxOG46e2FkZDoiQWRkIENvbmRpdGlvbiIsYnV0dG9uOnswOiJTZWFyY2ggQnVpbGRlciIsXzoiU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LGNsZWFyQWxsOiJDbGVhciBBbGwiLGNvbmRpdGlvbjoiQ29uZGl0aW9uIixkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbGl2ZVNlYXJjaDohMCxsb2dpYzoiQU5EIixvcnRob2dvbmFsOntkaXNwbGF5OiJkaXNwbGF5IixzZWFyY2g6ImZpbHRlciJ9LHByZURlZmluZWQ6ITF9LGN9KCksbztmdW5jdGlvbiB1KGMpe289YyxjLmZuLmRhdGFUYWJsZX12YXIgcD1mdW5jdGlvbigpe2Z1bmN0aW9uIGMobCxoLF8sRixPLGYsVSl7cmV0dXJuIEY9PT12b2lkIDAmJihGPTApLE89PT12b2lkIDAmJihPPSExKSxmPT09dm9pZCAwJiYoZj0xKSxVPT09dm9pZCAwJiYoVT12b2lkIDApLHRoaXMuY2xhc3Nlcz1vLmV4dGVuZCghMCx7fSxjLmNsYXNzZXMpLHRoaXMuYz1vLmV4dGVuZCghMCx7fSxjLmRlZmF1bHRzLGgpLHRoaXMucz17Y3JpdGVyaWE6W10sZGVwdGg6ZixkdDpsLGluZGV4OkYsaXNDaGlsZDpPLGxvZ2ljOnZvaWQgMCxvcHRzOmgscHJldmVudFJlZHJhdzohMSxzZXJ2ZXJEYXRhOlUsdG9Ecm9wOnZvaWQgMCx0b3BHcm91cDpffSx0aGlzLmRvbT17YWRkOm8oIjxidXR0b24vPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5hZGQpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKSxjbGVhcjpvKCI8YnV0dG9uPiZ0aW1lczwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckdyb3VwKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIiksY29udGFpbmVyOm8oIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ncm91cCksbG9naWM6bygiPGJ1dHRvbj48ZGl2Lz48L2J1dHRvbj4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubG9naWMpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5idXR0b24pLmF0dHIoInR5cGUiLCJidXR0b24iKSxsb2dpY0NvbnRhaW5lcjpvKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubG9naWNDb250YWluZXIpLHNlYXJjaDpvKCI8YnV0dG9uLz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2VhcmNoKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuYnV0dG9uKS5hdHRyKCJ0eXBlIiwiYnV0dG9uIikuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSx0aGlzLnMudG9wR3JvdXA9PT12b2lkIDAmJih0aGlzLnMudG9wR3JvdXA9dGhpcy5kb20uY29udGFpbmVyKSx0aGlzLl9zZXR1cCgpLHRoaXN9cmV0dXJuIGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRvbS5hZGQub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmxvZ2ljLm9mZigiLmR0c2IiKSx0aGlzLmRvbS5zZWFyY2gub2ZmKCIuZHRzYiIpLHRoaXMuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWRlc3Ryb3kiKS5yZW1vdmUoKSx0aGlzLnMuY3JpdGVyaWE9W119LGMucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obCl7aWYobD09PXZvaWQgMCYmKGw9ITEpLHRoaXMucy5jcml0ZXJpYS5sZW5ndGg9PT0wKXJldHVybnt9O2Zvcih2YXIgaD17Y3JpdGVyaWE6W10sbG9naWM6dGhpcy5zLmxvZ2ljfSxfPTAsRj10aGlzLnMuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107aC5jcml0ZXJpYS5wdXNoKE8uY3JpdGVyaWEuZ2V0RGV0YWlscyhsKSl9cmV0dXJuIGh9LGMucHJvdG90eXBlLmdldE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyfSxjLnByb3RvdHlwZS5yZWJ1aWxkPWZ1bmN0aW9uKGwpe3ZhciBoO2lmKCEobC5jcml0ZXJpYT09PXZvaWQgMHx8bC5jcml0ZXJpYT09PW51bGx8fEFycmF5LmlzQXJyYXkobC5jcml0ZXJpYSkmJmwuY3JpdGVyaWEubGVuZ3RoPT09MCkpe2lmKHRoaXMucy5sb2dpYz1sLmxvZ2ljLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5sb2dpYz09PSJPUiI/dGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubG9naWNPciIsdGhpcy5jLmkxOG4ubG9naWNPcik6dGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIubG9naWNBbmQiLHRoaXMuYy5pMThuLmxvZ2ljQW5kKSksQXJyYXkuaXNBcnJheShsLmNyaXRlcmlhKSlmb3IodmFyIF89MCxGPWwuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspaD1GW19dLGgubG9naWMhPT12b2lkIDA/dGhpcy5fYWRkUHJldkdyb3VwKGgpOmgubG9naWM9PT12b2lkIDAmJnRoaXMuX2FkZFByZXZDcml0ZXJpYShoKTtmb3IodmFyIE89MCxmPXRoaXMucy5jcml0ZXJpYTtPPGYubGVuZ3RoO08rKyloPWZbT10saC5jcml0ZXJpYSBpbnN0YW5jZW9mIGkmJihoLmNyaXRlcmlhLnVwZGF0ZUFycm93cyh0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPjEpLHRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKGguY3JpdGVyaWEpKX19LGMucHJvdG90eXBlLnJlZHJhd0NvbnRlbnRzPWZ1bmN0aW9uKCl7aWYoIXRoaXMucy5wcmV2ZW50UmVkcmF3KXt0aGlzLmRvbS5jb250YWluZXIuY2hpbGRyZW4oKS5kZXRhY2goKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyKS5hcHBlbmQodGhpcy5kb20uYWRkKSx0aGlzLmMubGl2ZVNlYXJjaHx8dGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS5zZWFyY2gpLHRoaXMucy5jcml0ZXJpYS5zb3J0KGZ1bmN0aW9uKF8sRil7cmV0dXJuIF8uY3JpdGVyaWEucy5pbmRleDxGLmNyaXRlcmlhLnMuaW5kZXg/LTE6Xy5jcml0ZXJpYS5zLmluZGV4PkYuY3JpdGVyaWEucy5pbmRleD8xOjB9KSx0aGlzLnNldExpc3RlbmVycygpO2Zvcih2YXIgbD0wO2w8dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDtsKyspe3ZhciBoPXRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYTtoIGluc3RhbmNlb2YgaT8odGhpcy5zLmNyaXRlcmlhW2xdLmluZGV4PWwsdGhpcy5zLmNyaXRlcmlhW2xdLmNyaXRlcmlhLnMuaW5kZXg9bCx0aGlzLnMuY3JpdGVyaWFbbF0uY3JpdGVyaWEuZG9tLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUodGhpcy5kb20uYWRkKSx0aGlzLl9zZXRDcml0ZXJpYUxpc3RlbmVycyhoKSx0aGlzLnMuY3JpdGVyaWFbbF0uY3JpdGVyaWEucy5wcmV2ZW50UmVkcmF3PXRoaXMucy5wcmV2ZW50UmVkcmF3LHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5yZWJ1aWxkKHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5nZXREZXRhaWxzKCkpLHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5zLnByZXZlbnRSZWRyYXc9ITEpOmggaW5zdGFuY2VvZiBjJiZoLnMuY3JpdGVyaWEubGVuZ3RoPjA/KHRoaXMucy5jcml0ZXJpYVtsXS5pbmRleD1sLHRoaXMucy5jcml0ZXJpYVtsXS5jcml0ZXJpYS5zLmluZGV4PWwsdGhpcy5zLmNyaXRlcmlhW2xdLmNyaXRlcmlhLmRvbS5jb250YWluZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZG9tLmFkZCksaC5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsaC5yZWRyYXdDb250ZW50cygpLGgucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMuX3NldEdyb3VwTGlzdGVuZXJzKGgpKToodGhpcy5zLmNyaXRlcmlhLnNwbGljZShsLDEpLGwtLSl9dGhpcy5zZXR1cExvZ2ljKCl9fSxjLnByb3RvdHlwZS5yZWRyYXdMb2dpYz1mdW5jdGlvbigpe2Zvcih2YXIgbD0wLGg9dGhpcy5zLmNyaXRlcmlhO2w8aC5sZW5ndGg7bCsrKXt2YXIgXz1oW2xdO18uY3JpdGVyaWEgaW5zdGFuY2VvZiBjJiZfLmNyaXRlcmlhLnJlZHJhd0xvZ2ljKCl9dGhpcy5zZXR1cExvZ2ljKCl9LGMucHJvdG90eXBlLnNlYXJjaD1mdW5jdGlvbihsLGgpe3JldHVybiB0aGlzLnMubG9naWM9PT0iQU5EIj90aGlzLl9hbmRTZWFyY2gobCxoKTp0aGlzLnMubG9naWM9PT0iT1IiP3RoaXMuX29yU2VhcmNoKGwsaCk6ITB9LGMucHJvdG90eXBlLnNldHVwTG9naWM9ZnVuY3Rpb24oKXtpZih0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5yZW1vdmUoKSx0aGlzLmRvbS5jbGVhci5yZW1vdmUoKSx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPDEpe3RoaXMucy5pc0NoaWxkfHwodGhpcy5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItZGVzdHJveSIpLHRoaXMuZG9tLmNvbnRhaW5lci5jc3MoIm1hcmdpbi1sZWZ0IiwwKSksdGhpcy5kb20uc2VhcmNoLmNzcygiZGlzcGxheSIsIm5vbmUiKTtyZXR1cm59dGhpcy5kb20uY2xlYXIuaGVpZ2h0KCIwcHgiKSx0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uY2xlYXIpLHRoaXMucy5pc0NoaWxkfHx0aGlzLmRvbS5zZWFyY2guY3NzKCJkaXNwbGF5IiwiaW5saW5lLWJsb2NrIiksdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmQodGhpcy5kb20ubG9naWNDb250YWluZXIpO2Zvcih2YXIgbD0wLGg9dGhpcy5zLmNyaXRlcmlhO2w8aC5sZW5ndGg7bCsrKXt2YXIgXz1oW2xdO18uY3JpdGVyaWEgaW5zdGFuY2VvZiBpJiZfLmNyaXRlcmlhLnNldHVwQnV0dG9ucygpfXZhciBGPXRoaXMuZG9tLmNvbnRhaW5lci5vdXRlckhlaWdodCgpLTE7dGhpcy5kb20ubG9naWNDb250YWluZXIud2lkdGgoRiksdGhpcy5fc2V0TG9naWNMaXN0ZW5lcigpLHRoaXMuZG9tLmNvbnRhaW5lci5jc3MoIm1hcmdpbi1sZWZ0Iix0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vdXRlckhlaWdodCghMCkpO3ZhciBPPXRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm9mZnNldCgpLGY9Ty5sZWZ0LFU9dGhpcy5kb20uY29udGFpbmVyLm9mZnNldCgpLmxlZnQsWD1mLVUsUT1mLVgtdGhpcy5kb20ubG9naWNDb250YWluZXIub3V0ZXJIZWlnaHQoITApO3RoaXMuZG9tLmxvZ2ljQ29udGFpbmVyLm9mZnNldCh7bGVmdDpRfSk7dmFyIEU9dGhpcy5kb20ubG9naWNDb250YWluZXIubmV4dCgpLCQ9Ty50b3Asdz1vKEUpLm9mZnNldCgpLnRvcCxrPSQtdyxTPSQtazt0aGlzLmRvbS5sb2dpY0NvbnRhaW5lci5vZmZzZXQoe3RvcDpTfSksdGhpcy5kb20uY2xlYXIub3V0ZXJIZWlnaHQodGhpcy5kb20ubG9naWNDb250YWluZXIuaGVpZ2h0KCkpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKX0sYy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLmRvbS5hZGQudW5iaW5kKCJjbGljayIpLHRoaXMuZG9tLmFkZC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gbC5zLmlzQ2hpbGR8fGwuZG9tLmNvbnRhaW5lci5wcmVwZW5kKGwuZG9tLmxvZ2ljQ29udGFpbmVyKSxsLmFkZENyaXRlcmlhKCksbC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItYWRkIiksbC5zLmR0LnN0YXRlLnNhdmUoKSwhMX0pLHRoaXMuZG9tLnNlYXJjaC5vZmYoImNsaWNrLmR0c2IiKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLnMuZHQuZHJhdygpfSk7Zm9yKHZhciBoPTAsXz10aGlzLnMuY3JpdGVyaWE7aDxfLmxlbmd0aDtoKyspe3ZhciBGPV9baF07Ri5jcml0ZXJpYS5zZXRMaXN0ZW5lcnMoKX10aGlzLl9zZXRDbGVhckxpc3RlbmVyKCksdGhpcy5fc2V0TG9naWNMaXN0ZW5lcigpfSxjLnByb3RvdHlwZS5hZGRDcml0ZXJpYT1mdW5jdGlvbihsKXtsPT09dm9pZCAwJiYobD1udWxsKTt2YXIgaD1sPT09bnVsbD90aGlzLnMuY3JpdGVyaWEubGVuZ3RoOmwucy5pbmRleCxfPW5ldyBpKHRoaXMucy5kdCx0aGlzLnMub3B0cyx0aGlzLnMudG9wR3JvdXAsaCx0aGlzLnMuZGVwdGgsdGhpcy5zLnNlcnZlckRhdGEsdGhpcy5jLmxpdmVTZWFyY2gpO2whPT1udWxsJiYoXy5jPWwuYyxfLnM9bC5zLF8ucy5kZXB0aD10aGlzLnMuZGVwdGgsXy5jbGFzc2VzPWwuY2xhc3NlcyksXy5wb3B1bGF0ZSgpO2Zvcih2YXIgRj0hMSxPPTA7Tzx0aGlzLnMuY3JpdGVyaWEubGVuZ3RoO08rKylPPT09MCYmdGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLnMuaW5kZXg+Xy5zLmluZGV4PyhfLmdldE5vZGUoKS5pbnNlcnRCZWZvcmUodGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLmRvbS5jb250YWluZXIpLEY9ITApOk88dGhpcy5zLmNyaXRlcmlhLmxlbmd0aC0xJiZ0aGlzLnMuY3JpdGVyaWFbT10uY3JpdGVyaWEucy5pbmRleDxfLnMuaW5kZXgmJnRoaXMucy5jcml0ZXJpYVtPKzFdLmNyaXRlcmlhLnMuaW5kZXg+Xy5zLmluZGV4JiYoXy5nZXROb2RlKCkuaW5zZXJ0QWZ0ZXIodGhpcy5zLmNyaXRlcmlhW09dLmNyaXRlcmlhLmRvbS5jb250YWluZXIpLEY9ITApO0Z8fF8uZ2V0Tm9kZSgpLmluc2VydEJlZm9yZSh0aGlzLmRvbS5hZGQpLHRoaXMucy5jcml0ZXJpYS5wdXNoKHtjcml0ZXJpYTpfLGluZGV4Omh9KSx0aGlzLnMuY3JpdGVyaWE9dGhpcy5zLmNyaXRlcmlhLnNvcnQoZnVuY3Rpb24oUSxFKXtyZXR1cm4gUS5jcml0ZXJpYS5zLmluZGV4LUUuY3JpdGVyaWEucy5pbmRleH0pO2Zvcih2YXIgZj0wLFU9dGhpcy5zLmNyaXRlcmlhO2Y8VS5sZW5ndGg7ZisrKXt2YXIgWD1VW2ZdO1guY3JpdGVyaWEgaW5zdGFuY2VvZiBpJiZYLmNyaXRlcmlhLnVwZGF0ZUFycm93cyh0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPjEpfXRoaXMuX3NldENyaXRlcmlhTGlzdGVuZXJzKF8pLF8uc2V0TGlzdGVuZXJzKCksdGhpcy5zZXR1cExvZ2ljKCl9LGMucHJvdG90eXBlLmNoZWNrRmlsbGVkPWZ1bmN0aW9uKCl7Zm9yKHZhciBsPTAsaD10aGlzLnMuY3JpdGVyaWE7bDxoLmxlbmd0aDtsKyspe3ZhciBfPWhbbF07aWYoXy5jcml0ZXJpYSBpbnN0YW5jZW9mIGkmJl8uY3JpdGVyaWEucy5maWxsZWR8fF8uY3JpdGVyaWEgaW5zdGFuY2VvZiBjJiZfLmNyaXRlcmlhLmNoZWNrRmlsbGVkKCkpcmV0dXJuITB9cmV0dXJuITF9LGMucHJvdG90eXBlLmNvdW50PWZ1bmN0aW9uKCl7Zm9yKHZhciBsPTAsaD0wLF89dGhpcy5zLmNyaXRlcmlhO2g8Xy5sZW5ndGg7aCsrKXt2YXIgRj1fW2hdO0YuY3JpdGVyaWEgaW5zdGFuY2VvZiBjP2wrPUYuY3JpdGVyaWEuY291bnQoKTpsKyt9cmV0dXJuIGx9LGMucHJvdG90eXBlLl9hZGRQcmV2R3JvdXA9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5zLmNyaXRlcmlhLmxlbmd0aCxfPW5ldyBjKHRoaXMucy5kdCx0aGlzLmMsdGhpcy5zLnRvcEdyb3VwLGgsITAsdGhpcy5zLmRlcHRoKzEsdGhpcy5zLnNlcnZlckRhdGEpO3RoaXMucy5jcml0ZXJpYS5wdXNoKHtjcml0ZXJpYTpfLGluZGV4OmgsbG9naWM6Xy5zLmxvZ2ljfSksXy5yZWJ1aWxkKGwpLHRoaXMucy5jcml0ZXJpYVtoXS5jcml0ZXJpYT1fLHRoaXMucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksdGhpcy5fc2V0R3JvdXBMaXN0ZW5lcnMoXyl9LGMucHJvdG90eXBlLl9hZGRQcmV2Q3JpdGVyaWE9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcy5zLmNyaXRlcmlhLmxlbmd0aCxfPW5ldyBpKHRoaXMucy5kdCx0aGlzLnMub3B0cyx0aGlzLnMudG9wR3JvdXAsaCx0aGlzLnMuZGVwdGgsdGhpcy5zLnNlcnZlckRhdGEpO18ucG9wdWxhdGUoKSx0aGlzLnMuY3JpdGVyaWEucHVzaCh7Y3JpdGVyaWE6XyxpbmRleDpofSksXy5zLnByZXZlbnRSZWRyYXc9dGhpcy5zLnByZXZlbnRSZWRyYXcsXy5yZWJ1aWxkKGwpLF8ucy5wcmV2ZW50UmVkcmF3PSExLHRoaXMucy5jcml0ZXJpYVtoXS5jcml0ZXJpYT1fLHRoaXMucy5wcmV2ZW50UmVkcmF3fHx0aGlzLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpfSxjLnByb3RvdHlwZS5fYW5kU2VhcmNoPWZ1bmN0aW9uKGwsaCl7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJuITA7Zm9yKHZhciBfPTAsRj10aGlzLnMuY3JpdGVyaWE7XzxGLmxlbmd0aDtfKyspe3ZhciBPPUZbX107aWYoIShPLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmIU8uY3JpdGVyaWEucy5maWxsZWQpJiYhTy5jcml0ZXJpYS5zZWFyY2gobCxoKSlyZXR1cm4hMX1yZXR1cm4hMH0sYy5wcm90b3R5cGUuX29yU2VhcmNoPWZ1bmN0aW9uKGwsaCl7aWYodGhpcy5zLmNyaXRlcmlhLmxlbmd0aD09PTApcmV0dXJuITA7Zm9yKHZhciBfPSExLEY9MCxPPXRoaXMucy5jcml0ZXJpYTtGPE8ubGVuZ3RoO0YrKyl7dmFyIGY9T1tGXTtpZihmLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmZi5jcml0ZXJpYS5zLmZpbGxlZCl7aWYoXz0hMCxmLmNyaXRlcmlhLnNlYXJjaChsLGgpKXJldHVybiEwfWVsc2UgaWYoZi5jcml0ZXJpYSBpbnN0YW5jZW9mIGMmJmYuY3JpdGVyaWEuY2hlY2tGaWxsZWQoKSYmKF89ITAsZi5jcml0ZXJpYS5zZWFyY2gobCxoKSkpcmV0dXJuITB9cmV0dXJuIV99LGMucHJvdG90eXBlLl9yZW1vdmVDcml0ZXJpYT1mdW5jdGlvbihsLGgpe2g9PT12b2lkIDAmJihoPSExKTt2YXIgXztpZih0aGlzLnMuY3JpdGVyaWEubGVuZ3RoPD0xJiZ0aGlzLnMuaXNDaGlsZCl0aGlzLmRlc3Ryb3koKTtlbHNle3ZhciBGPXZvaWQgMDtmb3IoXz0wO188dGhpcy5zLmNyaXRlcmlhLmxlbmd0aDtfKyspdGhpcy5zLmNyaXRlcmlhW19dLmluZGV4PT09bC5zLmluZGV4JiYoIWh8fHRoaXMucy5jcml0ZXJpYVtfXS5jcml0ZXJpYSBpbnN0YW5jZW9mIGMpJiYoRj1fKTtmb3IoRiE9PXZvaWQgMCYmdGhpcy5zLmNyaXRlcmlhLnNwbGljZShGLDEpLF89MDtfPHRoaXMucy5jcml0ZXJpYS5sZW5ndGg7XysrKXRoaXMucy5jcml0ZXJpYVtfXS5pbmRleD1fLHRoaXMucy5jcml0ZXJpYVtfXS5jcml0ZXJpYS5zLmluZGV4PV99fSxjLnByb3RvdHlwZS5fc2V0Q3JpdGVyaWFMaXN0ZW5lcnM9ZnVuY3Rpb24obCl7dmFyIGg9dGhpcztsLmRvbS5kZWxldGUudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe2guX3JlbW92ZUNyaXRlcmlhKGwpLGwuZG9tLmNvbnRhaW5lci5yZW1vdmUoKTtmb3IodmFyIF89MCxGPWgucy5jcml0ZXJpYTtfPEYubGVuZ3RoO18rKyl7dmFyIE89RltfXTtPLmNyaXRlcmlhIGluc3RhbmNlb2YgaSYmTy5jcml0ZXJpYS51cGRhdGVBcnJvd3MoaC5zLmNyaXRlcmlhLmxlbmd0aD4xKX1yZXR1cm4gbC5kZXN0cm95KCksaC5zLmR0LmRyYXcoKSxoLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLCExfSksbC5kb20ucmlnaHQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3ZhciBfPWwucy5pbmRleCxGPW5ldyBjKGgucy5kdCxoLnMub3B0cyxoLnMudG9wR3JvdXAsbC5zLmluZGV4LCEwLGgucy5kZXB0aCsxLGgucy5zZXJ2ZXJEYXRhKTtyZXR1cm4gRi5hZGRDcml0ZXJpYShsKSxoLnMuY3JpdGVyaWFbX10uY3JpdGVyaWE9RixoLnMuY3JpdGVyaWFbX10ubG9naWM9IkFORCIsaC5zLnRvcEdyb3VwLnRyaWdnZXIoImR0c2ItcmVkcmF3Q29udGVudHMiKSxoLl9zZXRHcm91cExpc3RlbmVycyhGKSwhMX0pLGwuZG9tLmxlZnQudW5iaW5kKCJjbGljayIpLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe2gucy50b0Ryb3A9bmV3IGkoaC5zLmR0LGgucy5vcHRzLGgucy50b3BHcm91cCxsLnMuaW5kZXgsdm9pZCAwLGgucy5zZXJ2ZXJEYXRhKSxoLnMudG9Ecm9wLnM9bC5zLGgucy50b0Ryb3AuYz1sLmMsaC5zLnRvRHJvcC5jbGFzc2VzPWwuY2xhc3NlcyxoLnMudG9Ecm9wLnBvcHVsYXRlKCk7dmFyIF89aC5zLnRvRHJvcC5zLmluZGV4O3JldHVybiBoLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1kcm9wQ3JpdGVyaWEiKSxsLnMuaW5kZXg9XyxoLl9yZW1vdmVDcml0ZXJpYShsKSxoLnMudG9wR3JvdXAudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLGgucy5kdC5kcmF3KCksITF9KX0sYy5wcm90b3R5cGUuX3NldENsZWFyTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmNsZWFyLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gbC5zLmlzQ2hpbGQ/KGwuZGVzdHJveSgpLGwucy50b3BHcm91cC50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzIiksITEpOihsLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1jbGVhckNvbnRlbnRzIiksITEpfSl9LGMucHJvdG90eXBlLl9zZXRHcm91cExpc3RlbmVycz1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2wuZG9tLmFkZC51bmJpbmQoImNsaWNrIikub24oImNsaWNrLmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGguc2V0dXBMb2dpYygpLGguZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLWFkZCIpLCExfSksbC5kb20uY29udGFpbmVyLnVuYmluZCgiZHRzYi1hZGQiKS5vbigiZHRzYi1hZGQuZHRzYiIsZnVuY3Rpb24oKXtyZXR1cm4gaC5zZXR1cExvZ2ljKCksaC5kb20uY29udGFpbmVyLnRyaWdnZXIoImR0c2ItYWRkIiksITF9KSxsLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWRlc3Ryb3kiKS5vbigiZHRzYi1kZXN0cm95LmR0c2IiLGZ1bmN0aW9uKCl7cmV0dXJuIGguX3JlbW92ZUNyaXRlcmlhKGwsITApLGwuZG9tLmNvbnRhaW5lci5yZW1vdmUoKSxoLnNldHVwTG9naWMoKSwhMX0pLGwuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItZHJvcENyaXRlcmlhIikub24oImR0c2ItZHJvcENyaXRlcmlhLmR0c2IiLGZ1bmN0aW9uKCl7dmFyIF89bC5zLnRvRHJvcDtyZXR1cm4gXy5zLmluZGV4PWwucy5pbmRleCxfLnVwZGF0ZUFycm93cyhoLnMuY3JpdGVyaWEubGVuZ3RoPjEpLGguYWRkQ3JpdGVyaWEoXyksITF9KSxsLnNldExpc3RlbmVycygpfSxjLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0aGlzLnNldExpc3RlbmVycygpLHRoaXMuZG9tLmFkZC5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmFkZCIsdGhpcy5jLmkxOG4uYWRkKSksdGhpcy5kb20uc2VhcmNoLmh0bWwodGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuc2VhcmNoIix0aGlzLmMuaTE4bi5zZWFyY2gpKSx0aGlzLmRvbS5sb2dpYy5jaGlsZHJlbigpLmZpcnN0KCkuaHRtbCh0aGlzLmMubG9naWM9PT0iT1IiP3RoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljT3IiLHRoaXMuYy5pMThuLmxvZ2ljT3IpOnRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljQW5kIix0aGlzLmMuaTE4bi5sb2dpY0FuZCkpLHRoaXMucy5sb2dpYz10aGlzLmMubG9naWM9PT0iT1IiPyJPUiI6IkFORCIsdGhpcy5jLmdyZXlzY2FsZSYmdGhpcy5kb20ubG9naWMuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmdyZXlzY2FsZSksdGhpcy5kb20ubG9naWNDb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljKS5hcHBlbmQodGhpcy5kb20uY2xlYXIpLHRoaXMucy5pc0NoaWxkJiZ0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmxvZ2ljQ29udGFpbmVyKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLmFkZCksdGhpcy5jLmxpdmVTZWFyY2h8fHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmQodGhpcy5kb20uc2VhcmNoKX0sYy5wcm90b3R5cGUuX3NldExvZ2ljTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmxvZ2ljLnVuYmluZCgiY2xpY2siKS5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLl90b2dnbGVMb2dpYygpLGwucy5kdC5kcmF3KCk7Zm9yKHZhciBoPTAsXz1sLnMuY3JpdGVyaWE7aDxfLmxlbmd0aDtoKyspe3ZhciBGPV9baF07Ri5jcml0ZXJpYS5zZXRMaXN0ZW5lcnMoKX19KX0sYy5wcm90b3R5cGUuX3RvZ2dsZUxvZ2ljPWZ1bmN0aW9uKCl7dGhpcy5zLmxvZ2ljPT09Ik9SIj8odGhpcy5zLmxvZ2ljPSJBTkQiLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljQW5kIix0aGlzLmMuaTE4bi5sb2dpY0FuZCkpKTp0aGlzLnMubG9naWM9PT0iQU5EIiYmKHRoaXMucy5sb2dpYz0iT1IiLHRoaXMuZG9tLmxvZ2ljLmNoaWxkcmVuKCkuZmlyc3QoKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hCdWlsZGVyLmxvZ2ljT3IiLHRoaXMuYy5pMThuLmxvZ2ljT3IpKSl9LGMudmVyc2lvbj0iMS4xLjAiLGMuY2xhc3Nlcz17YWRkOiJkdHNiLWFkZCIsYnV0dG9uOiJkdHNiLWJ1dHRvbiIsY2xlYXJHcm91cDoiZHRzYi1jbGVhckdyb3VwIixncmV5c2NhbGU6ImR0c2ItZ3JleXNjYWxlIixncm91cDoiZHRzYi1ncm91cCIsaW5wdXRCdXR0b246ImR0c2ItaXB0YnRuIixsb2dpYzoiZHRzYi1sb2dpYyIsbG9naWNDb250YWluZXI6ImR0c2ItbG9naWNDb250YWluZXIiLHNlYXJjaDoiZHRzYi1zZWFyY2gifSxjLmRlZmF1bHRzPXtjb2x1bW5zOiEwLGNvbmRpdGlvbnM6e2RhdGU6aS5kYXRlQ29uZGl0aW9ucyxodG1sOmkuc3RyaW5nQ29uZGl0aW9ucywiaHRtbC1udW0iOmkubnVtQ29uZGl0aW9ucywiaHRtbC1udW0tZm10IjppLm51bUZtdENvbmRpdGlvbnMsbHV4b246aS5sdXhvbkRhdGVDb25kaXRpb25zLG1vbWVudDppLm1vbWVudERhdGVDb25kaXRpb25zLG51bTppLm51bUNvbmRpdGlvbnMsIm51bS1mbXQiOmkubnVtRm10Q29uZGl0aW9ucyxzdHJpbmc6aS5zdHJpbmdDb25kaXRpb25zfSxkZXB0aExpbWl0OiExLGVudGVyU2VhcmNoOiExLGZpbHRlckNoYW5nZWQ6dm9pZCAwLGdyZXlzY2FsZTohMSxsaXZlU2VhcmNoOiEwLGkxOG46e2FkZDoiQWRkIENvbmRpdGlvbiIsYnV0dG9uOnswOiJTZWFyY2ggQnVpbGRlciIsXzoiU2VhcmNoIEJ1aWxkZXIgKCVkKSJ9LGNsZWFyQWxsOiJDbGVhciBBbGwiLGNvbmRpdGlvbjoiQ29uZGl0aW9uIixkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxjfSgpLGIsZztmdW5jdGlvbiBtKGMpe2I9YyxnPWMuZm4uRGF0YVRhYmxlfXZhciBDPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYyhsLGgpe3ZhciBfPXRoaXM7aWYoIWd8fCFnLnZlcnNpb25DaGVja3x8IWcudmVyc2lvbkNoZWNrKCIyIikpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hCdWlsZGVyIHJlcXVpcmVzIERhdGFUYWJsZXMgMiBvciBuZXdlciIpO3ZhciBGPW5ldyBnLkFwaShsKTtpZih0aGlzLmNsYXNzZXM9Yi5leHRlbmQoITAse30sYy5jbGFzc2VzKSx0aGlzLmM9Yi5leHRlbmQoITAse30sYy5kZWZhdWx0cyxoKSx0aGlzLmRvbT17Y2xlYXJBbGw6YignPGJ1dHRvbiB0eXBlPSJidXR0b24iPicrRi5pMThuKCJzZWFyY2hCdWlsZGVyLmNsZWFyQWxsIix0aGlzLmMuaTE4bi5jbGVhckFsbCkrIjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jbGVhckFsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbikuYXR0cigidHlwZSIsImJ1dHRvbiIpLGNvbnRhaW5lcjpiKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKSx0aXRsZTpiKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGUpLHRpdGxlUm93OmIoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50aXRsZVJvdyksdG9wR3JvdXA6dm9pZCAwfSx0aGlzLnM9e2R0OkYsb3B0czpoLHNlYXJjaDp2b2lkIDAsc2VydmVyRGF0YTp2b2lkIDAsdG9wR3JvdXA6dm9pZCAwfSxGLnNldHRpbmdzKClbMF0uX3NlYXJjaEJ1aWxkZXI9PT12b2lkIDApcmV0dXJuIEYuc2V0dGluZ3MoKVswXS5fc2VhcmNoQnVpbGRlcj10aGlzLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYodGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24oTyxmLFUpe3ZhciBYPV8ucy5kdC5zdGF0ZS5sb2FkZWQoKTtYJiZYLnNlYXJjaEJ1aWxkZXImJihVLnNlYXJjaEJ1aWxkZXI9Xy5fY29sbGFwc2VBcnJheShYLnNlYXJjaEJ1aWxkZXIpKX0pLHRoaXMucy5kdC5vbigieGhyLmR0c2IiLGZ1bmN0aW9uKE8sZixVKXtVJiZVLnNlYXJjaEJ1aWxkZXImJlUuc2VhcmNoQnVpbGRlci5vcHRpb25zJiYoXy5zLnNlcnZlckRhdGE9VS5zZWFyY2hCdWlsZGVyLm9wdGlvbnMpfSkpLHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLl9iSW5pdENvbXBsZXRlP3RoaXMuX3NldFVwKCk6Ri5vbmUoImluaXQuZHQiLGZ1bmN0aW9uKCl7Xy5fc2V0VXAoKX0pLHRoaXN9cmV0dXJuIGMucHJvdG90eXBlLmdldERldGFpbHM9ZnVuY3Rpb24obCl7cmV0dXJuIGw9PT12b2lkIDAmJihsPSExKSx0aGlzLnMudG9wR3JvdXAuZ2V0RGV0YWlscyhsKX0sYy5wcm90b3R5cGUuZ2V0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbS5jb250YWluZXJ9LGMucHJvdG90eXBlLnJlYnVpbGQ9ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZG9tLmNsZWFyQWxsLmNsaWNrKCksbD09bnVsbD90aGlzOih0aGlzLnMudG9wR3JvdXAucy5wcmV2ZW50UmVkcmF3PSEwLHRoaXMucy50b3BHcm91cC5yZWJ1aWxkKGwpLHRoaXMucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITEsdGhpcy5fY2hlY2tDbGVhcigpLHRoaXMuX3VwZGF0ZVRpdGxlKHRoaXMucy50b3BHcm91cC5jb3VudCgpKSx0aGlzLnMudG9wR3JvdXAucmVkcmF3Q29udGVudHMoKSx0aGlzLnMuZHQuZHJhdyghMSksdGhpcy5zLnRvcEdyb3VwLnNldExpc3RlbmVycygpLHRoaXMpfSxjLnByb3RvdHlwZS5fYXBwbHlQcmVEZWZEZWZhdWx0cz1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2wuY3JpdGVyaWEhPT12b2lkIDAmJmwubG9naWM9PT12b2lkIDAmJihsLmxvZ2ljPSJBTkQiKTtmb3IodmFyIF89ZnVuY3Rpb24oWCl7WC5jcml0ZXJpYSE9PXZvaWQgMD9YPUYuX2FwcGx5UHJlRGVmRGVmYXVsdHMoWCk6Ri5zLmR0LmNvbHVtbnMoKS5ldmVyeShmdW5jdGlvbihRKXtoLnMuZHQuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbUV0uc1RpdGxlPT09WC5kYXRhJiYoWC5kYXRhSWR4PVEpfSl9LEY9dGhpcyxPPTAsZj1sLmNyaXRlcmlhO088Zi5sZW5ndGg7TysrKXt2YXIgVT1mW09dO18oVSl9cmV0dXJuIGx9LGMucHJvdG90eXBlLl9zZXRVcD1mdW5jdGlvbihsKXt2YXIgaD10aGlzO2lmKGw9PT12b2lkIDAmJihsPSEwKSx0eXBlb2YgdGhpcy5zLmR0LmNvbHVtbigpLnR5cGUhPSJmdW5jdGlvbiImJmF0LkFwaS5yZWdpc3RlclBsdXJhbCgiY29sdW1ucygpLnR5cGVzKCkiLCJjb2x1bW4oKS50eXBlKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24odyxrKXtyZXR1cm4gdy5hb0NvbHVtbnNba10uc1R5cGV9LDEpfSksIWcuRGF0ZVRpbWUpe3ZhciBfPXRoaXMucy5kdC5jb2x1bW5zKCkudHlwZXMoKS50b0FycmF5KCk7aWYoXz09PXZvaWQgMHx8Xy5pbmNsdWRlcyh2b2lkIDApfHxfLmluY2x1ZGVzKG51bGwpKXtfPVtdO2Zvcih2YXIgRj0wLE89dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zO0Y8Ty5sZW5ndGg7RisrKXt2YXIgZj1PW0ZdO18ucHVzaChmLnNlYXJjaEJ1aWxkZXJUeXBlIT09dm9pZCAwP2Yuc2VhcmNoQnVpbGRlclR5cGU6Zi5zVHlwZSl9fXZhciBVPXRoaXMucy5kdC5jb2x1bW5zKCkudG9BcnJheSgpOyhfPT09dm9pZCAwfHxfLmluY2x1ZGVzKHZvaWQgMCl8fF8uaW5jbHVkZXMobnVsbCkpJiYoYi5mbi5kYXRhVGFibGUuZXh0Lm9BcGkmJmIuZm4uZGF0YVRhYmxlLmV4dC5vQXBpLl9mbkNvbHVtblR5cGVzKHRoaXMucy5kdC5zZXR0aW5ncygpWzBdKSxfPXRoaXMucy5kdC5jb2x1bW5zKCkudHlwZXMoKS50b0FycmF5KCkpO2Zvcih2YXIgWD0wO1g8VVswXS5sZW5ndGg7WCsrKXt2YXIgUT1VWzBdW1hdLEU9X1tRXTtpZigodGhpcy5jLmNvbHVtbnM9PT0hMHx8QXJyYXkuaXNBcnJheSh0aGlzLmMuY29sdW1ucykmJnRoaXMuYy5jb2x1bW5zLmluY2x1ZGVzKFgpKSYmKEUuaW5jbHVkZXMoImRhdGUiKXx8RS5pbmNsdWRlcygibW9tZW50Iil8fEUuaW5jbHVkZXMoImx1eG9uIikpKXRocm93IGFsZXJ0KCJTZWFyY2hCdWlsZGVyIFJlcXVpcmVzIERhdGVUaW1lIHdoZW4gdXNlZCB3aXRoIGRhdGVzLiIpLG5ldyBFcnJvcigiU2VhcmNoQnVpbGRlciByZXF1aXJlcyBEYXRlVGltZSIpfX1pZih0aGlzLnMudG9wR3JvdXA9bmV3IHAodGhpcy5zLmR0LHRoaXMuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdGhpcy5zLnNlcnZlckRhdGEpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNiIixmdW5jdGlvbih3LGssUyl7Uy5zZWFyY2hCdWlsZGVyPWguZ2V0RGV0YWlscygpLFMuc2Nyb2xsZXI/Uy5zdGFydD1oLnMuZHQuc3RhdGUoKS5zdGFydDpTLnBhZ2U9aC5zLmR0LnBhZ2UoKX0pLHRoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c2IiLGZ1bmN0aW9uKHcsayxTKXtoLnJlYnVpbGQoUy5zZWFyY2hCdWlsZGVyKX0pLHRoaXMuX2J1aWxkKCksdGhpcy5zLmR0Lm9uKCJwcmVYaHIuZHRzYiIsZnVuY3Rpb24odyxrLFMpe2gucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYoUy5zZWFyY2hCdWlsZGVyPWguX2NvbGxhcHNlQXJyYXkoaC5nZXREZXRhaWxzKCEwKSkpfSksdGhpcy5zLmR0Lm9uKCJjb2x1bW5zLXJlb3JkZXJlZCIsZnVuY3Rpb24oKXtoLnJlYnVpbGQoaC5nZXREZXRhaWxzKCkpfSksbCl7dmFyICQ9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpOyQhPT1udWxsJiYkLnNlYXJjaEJ1aWxkZXIhPT12b2lkIDA/KHRoaXMucy50b3BHcm91cC5yZWJ1aWxkKCQuc2VhcmNoQnVpbGRlciksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudHJpZ2dlcigiZHRzYi1yZWRyYXdDb250ZW50cyIpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHwoJC5wYWdlP3RoaXMucy5kdC5wYWdlKCQucGFnZSkuZHJhdygicGFnZSIpOnRoaXMucy5kdC5zY3JvbGxlciYmJC5zY3JvbGxlciYmdGhpcy5zLmR0LnNjcm9sbGVyKCkuc2Nyb2xsVG9Sb3coJC5zY3JvbGxlci50b3BSb3cpKSx0aGlzLnMudG9wR3JvdXAuc2V0TGlzdGVuZXJzKCkpOnRoaXMuYy5wcmVEZWZpbmVkIT09ITEmJih0aGlzLmMucHJlRGVmaW5lZD10aGlzLl9hcHBseVByZURlZkRlZmF1bHRzKHRoaXMuYy5wcmVEZWZpbmVkKSx0aGlzLnJlYnVpbGQodGhpcy5jLnByZURlZmluZWQpKX10aGlzLl9zZXRFbXB0eUxpc3RlbmVyKCksdGhpcy5zLmR0LnN0YXRlLnNhdmUoKX0sYy5wcm90b3R5cGUuX2NvbGxhcHNlQXJyYXk9ZnVuY3Rpb24obCl7aWYobC5sb2dpYz09PXZvaWQgMClsLnZhbHVlIT09dm9pZCAwJiYobC52YWx1ZS5zb3J0KGZ1bmN0aW9uKF8sRil7cmV0dXJuIGlzTmFOKCtfKXx8KF89K18sRj0rRiksXzxGPy0xOkY8Xz8xOjB9KSxsLnZhbHVlMT1sLnZhbHVlWzBdLGwudmFsdWUyPWwudmFsdWVbMV0pO2Vsc2UgZm9yKHZhciBoPTA7aDxsLmNyaXRlcmlhLmxlbmd0aDtoKyspbC5jcml0ZXJpYVtoXT10aGlzLl9jb2xsYXBzZUFycmF5KGwuY3JpdGVyaWFbaF0pO3JldHVybiBsfSxjLnByb3RvdHlwZS5fdXBkYXRlVGl0bGU9ZnVuY3Rpb24obCl7dGhpcy5kb20udGl0bGUuaHRtbCh0aGlzLnMuZHQuaTE4bigic2VhcmNoQnVpbGRlci50aXRsZSIsdGhpcy5jLmkxOG4udGl0bGUsbCkpfSxjLnByb3RvdHlwZS5fYnVpbGQ9ZnVuY3Rpb24oKXt2YXIgbD10aGlzO3RoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZSgpLHRoaXMuZG9tLmNvbnRhaW5lci5lbXB0eSgpO3ZhciBoPXRoaXMucy50b3BHcm91cC5jb3VudCgpO3RoaXMuX3VwZGF0ZVRpdGxlKGgpLHRoaXMuZG9tLnRpdGxlUm93LmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5kb20uY29udGFpbmVyLmFwcGVuZCh0aGlzLmRvbS50aXRsZVJvdyksdGhpcy5kb20udG9wR3JvdXA9dGhpcy5zLnRvcEdyb3VwLmdldE5vZGUoKSx0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kKHRoaXMuZG9tLnRvcEdyb3VwKSx0aGlzLl9zZXRSZWRyYXdMaXN0ZW5lcigpO3ZhciBfPXRoaXMucy5kdC50YWJsZSgwKS5ub2RlKCk7Yi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5pbmNsdWRlcyh0aGlzLnMuc2VhcmNoKXx8KHRoaXMucy5zZWFyY2g9ZnVuY3Rpb24oRixPLGYpe3JldHVybiBGLm5UYWJsZSE9PV8/ITA6bC5zLnRvcEdyb3VwLnNlYXJjaChPLGYpfSxiLmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaCkpLHRoaXMucy5kdC5vbigiZGVzdHJveS5kdHNiIixmdW5jdGlvbigpe2wuZG9tLmNvbnRhaW5lci5yZW1vdmUoKSxsLmRvbS5jbGVhckFsbC5yZW1vdmUoKTtmb3IodmFyIEY9Yi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5pbmRleE9mKGwucy5zZWFyY2gpO0YhPT0tMTspYi5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5zcGxpY2UoRiwxKSxGPWIuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guaW5kZXhPZihsLnMuc2VhcmNoKTtsLnMuZHQub2ZmKCIuZHRzYiIpLGIobC5zLmR0LnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNiIil9KX0sYy5wcm90b3R5cGUuX2NoZWNrQ2xlYXI9ZnVuY3Rpb24oKXt0aGlzLnMudG9wR3JvdXAucy5jcml0ZXJpYS5sZW5ndGg+MD8odGhpcy5kb20uY2xlYXJBbGwuaW5zZXJ0QWZ0ZXIodGhpcy5kb20udGl0bGUpLHRoaXMuX3NldENsZWFyTGlzdGVuZXIoKSk6dGhpcy5kb20uY2xlYXJBbGwucmVtb3ZlKCl9LGMucHJvdG90eXBlLl9maWx0ZXJDaGFuZ2VkPWZ1bmN0aW9uKGwpe3ZhciBoPXRoaXMuYy5maWx0ZXJDaGFuZ2VkO3R5cGVvZiBoPT0iZnVuY3Rpb24iJiZoKGwsdGhpcy5zLmR0LmkxOG4oInNlYXJjaEJ1aWxkZXIuYnV0dG9uIix0aGlzLmMuaTE4bi5idXR0b24sbCkpfSxjLnByb3RvdHlwZS5fc2V0Q2xlYXJMaXN0ZW5lcj1mdW5jdGlvbigpe3ZhciBsPXRoaXM7dGhpcy5kb20uY2xlYXJBbGwudW5iaW5kKCJjbGljayIpLHRoaXMuZG9tLmNsZWFyQWxsLm9uKCJjbGljay5kdHNiIixmdW5jdGlvbigpe3JldHVybiBsLnMudG9wR3JvdXA9bmV3IHAobC5zLmR0LGwuYyx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbC5zLnNlcnZlckRhdGEpLGwuX2J1aWxkKCksbC5zLmR0LmRyYXcoKSxsLnMudG9wR3JvdXAuc2V0TGlzdGVuZXJzKCksbC5kb20uY2xlYXJBbGwucmVtb3ZlKCksbC5fc2V0RW1wdHlMaXN0ZW5lcigpLGwuX2ZpbHRlckNoYW5nZWQoMCksITF9KX0sYy5wcm90b3R5cGUuX3NldFJlZHJhd0xpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItcmVkcmF3Q29udGVudHMiKSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1yZWRyYXdDb250ZW50cy5kdHNiIixmdW5jdGlvbigpe2wuX2NoZWNrQ2xlYXIoKSxsLnMudG9wR3JvdXAucmVkcmF3Q29udGVudHMoKSxsLnMudG9wR3JvdXAuc2V0dXBMb2dpYygpLGwuX3NldEVtcHR5TGlzdGVuZXIoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpLGwucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlfHxsLnMuZHQuZHJhdygpLGwucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItcmVkcmF3Q29udGVudHMtbm9EcmF3IiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3Q29udGVudHMtbm9EcmF3LmR0c2IiLGZ1bmN0aW9uKCl7bC5fY2hlY2tDbGVhcigpLGwucy50b3BHcm91cC5zLnByZXZlbnRSZWRyYXc9ITAsbC5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCksbC5zLnRvcEdyb3VwLnMucHJldmVudFJlZHJhdz0hMSxsLnMudG9wR3JvdXAuc2V0dXBMb2dpYygpLGwuX3NldEVtcHR5TGlzdGVuZXIoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLXJlZHJhd0xvZ2ljIiksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIub24oImR0c2ItcmVkcmF3TG9naWMuZHRzYiIsZnVuY3Rpb24oKXtsLnMudG9wR3JvdXAucmVkcmF3TG9naWMoKTt2YXIgaD1sLnMudG9wR3JvdXAuY291bnQoKTtsLl91cGRhdGVUaXRsZShoKSxsLl9maWx0ZXJDaGFuZ2VkKGgpfSksdGhpcy5zLnRvcEdyb3VwLmRvbS5jb250YWluZXIudW5iaW5kKCJkdHNiLWFkZCIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLWFkZC5kdHNiIixmdW5jdGlvbigpe3ZhciBoPWwucy50b3BHcm91cC5jb3VudCgpO2wuX3VwZGF0ZVRpdGxlKGgpLGwuX2ZpbHRlckNoYW5nZWQoaCksbC5fY2hlY2tDbGVhcigpfSksdGhpcy5zLmR0Lm9uKCJwb3N0RWRpdC5kdHNiIHBvc3RDcmVhdGUuZHRzYiBwb3N0UmVtb3ZlLmR0c2IiLGZ1bmN0aW9uKCl7bC5zLnRvcEdyb3VwLnJlZHJhd0NvbnRlbnRzKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci51bmJpbmQoImR0c2ItY2xlYXJDb250ZW50cyIpLHRoaXMucy50b3BHcm91cC5kb20uY29udGFpbmVyLm9uKCJkdHNiLWNsZWFyQ29udGVudHMuZHRzYiIsZnVuY3Rpb24oKXtsLl9zZXRVcCghMSksbC5fZmlsdGVyQ2hhbmdlZCgwKSxsLnMuZHQuZHJhdygpfSl9LGMucHJvdG90eXBlLl9zZXRFbXB0eUxpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLnMudG9wR3JvdXAuZG9tLmFkZC5vbigiY2xpY2suZHRzYiIsZnVuY3Rpb24oKXtsLl9jaGVja0NsZWFyKCl9KSx0aGlzLnMudG9wR3JvdXAuZG9tLmNvbnRhaW5lci5vbigiZHRzYi1kZXN0cm95LmR0c2IiLGZ1bmN0aW9uKCl7bC5kb20uY2xlYXJBbGwucmVtb3ZlKCl9KX0sYy52ZXJzaW9uPSIxLjguMCIsYy5jbGFzc2VzPXtidXR0b246ImR0c2ItYnV0dG9uIixjbGVhckFsbDoiZHRzYi1jbGVhckFsbCIsY29udGFpbmVyOiJkdHNiLXNlYXJjaEJ1aWxkZXIiLGlucHV0QnV0dG9uOiJkdHNiLWlwdGJ0biIsdGl0bGU6ImR0c2ItdGl0bGUiLHRpdGxlUm93OiJkdHNiLXRpdGxlUm93In0sYy5kZWZhdWx0cz17Y29sdW1uczohMCxjb25kaXRpb25zOntkYXRlOmkuZGF0ZUNvbmRpdGlvbnMsaHRtbDppLnN0cmluZ0NvbmRpdGlvbnMsImh0bWwtbnVtIjppLm51bUNvbmRpdGlvbnMsImh0bWwtbnVtLWZtdCI6aS5udW1GbXRDb25kaXRpb25zLGx1eG9uOmkubHV4b25EYXRlQ29uZGl0aW9ucyxtb21lbnQ6aS5tb21lbnREYXRlQ29uZGl0aW9ucyxudW06aS5udW1Db25kaXRpb25zLCJudW0tZm10IjppLm51bUZtdENvbmRpdGlvbnMsc3RyaW5nOmkuc3RyaW5nQ29uZGl0aW9uc30sZGVwdGhMaW1pdDohMSxlbnRlclNlYXJjaDohMSxmaWx0ZXJDaGFuZ2VkOnZvaWQgMCxncmV5c2NhbGU6ITEsbGl2ZVNlYXJjaDohMCxpMThuOnthZGQ6IkFkZCBDb25kaXRpb24iLGJ1dHRvbjp7MDoiU2VhcmNoIEJ1aWxkZXIiLF86IlNlYXJjaCBCdWlsZGVyICglZCkifSxjbGVhckFsbDoiQ2xlYXIgQWxsIixjb25kaXRpb246IkNvbmRpdGlvbiIsY29uZGl0aW9uczp7YXJyYXk6e2NvbnRhaW5zOiJDb250YWlucyIsZW1wdHk6IkVtcHR5IixlcXVhbHM6IkVxdWFscyIsbm90OiJOb3QiLG5vdEVtcHR5OiJOb3QgRW1wdHkiLHdpdGhvdXQ6IldpdGhvdXQifSxkYXRlOnthZnRlcjoiQWZ0ZXIiLGJlZm9yZToiQmVmb3JlIixiZXR3ZWVuOiJCZXR3ZWVuIixlbXB0eToiRW1wdHkiLGVxdWFsczoiRXF1YWxzIixub3Q6Ik5vdCIsbm90QmV0d2VlbjoiTm90IEJldHdlZW4iLG5vdEVtcHR5OiJOb3QgRW1wdHkifSxudW1iZXI6e2JldHdlZW46IkJldHdlZW4iLGVtcHR5OiJFbXB0eSIsZXF1YWxzOiJFcXVhbHMiLGd0OiJHcmVhdGVyIFRoYW4iLGd0ZToiR3JlYXRlciBUaGFuIEVxdWFsIFRvIixsdDoiTGVzcyBUaGFuIixsdGU6Ikxlc3MgVGhhbiBFcXVhbCBUbyIsbm90OiJOb3QiLG5vdEJldHdlZW46Ik5vdCBCZXR3ZWVuIixub3RFbXB0eToiTm90IEVtcHR5In0sc3RyaW5nOntjb250YWluczoiQ29udGFpbnMiLGVtcHR5OiJFbXB0eSIsZW5kc1dpdGg6IkVuZHMgV2l0aCIsZXF1YWxzOiJFcXVhbHMiLG5vdDoiTm90Iixub3RDb250YWluczoiRG9lcyBOb3QgQ29udGFpbiIsbm90RW1wdHk6Ik5vdCBFbXB0eSIsbm90RW5kc1dpdGg6IkRvZXMgTm90IEVuZCBXaXRoIixub3RTdGFydHNXaXRoOiJEb2VzIE5vdCBTdGFydCBXaXRoIixzdGFydHNXaXRoOiJTdGFydHMgV2l0aCJ9fSxkYXRhOiJEYXRhIixkZWxldGU6IiZ0aW1lcyIsZGVsZXRlVGl0bGU6IkRlbGV0ZSBmaWx0ZXJpbmcgcnVsZSIsbGVmdDoiPCIsbGVmdFRpdGxlOiJPdXRkZW50IGNyaXRlcmlhIixsb2dpY0FuZDoiQW5kIixsb2dpY09yOiJPciIscmlnaHQ6Ij4iLHJpZ2h0VGl0bGU6IkluZGVudCBjcml0ZXJpYSIsc2VhcmNoOiJTZWFyY2giLHRpdGxlOnswOiJDdXN0b20gU2VhcmNoIEJ1aWxkZXIiLF86IkN1c3RvbSBTZWFyY2ggQnVpbGRlciAoJWQpIn0sdmFsdWU6IlZhbHVlIix2YWx1ZUpvaW5lcjoiYW5kIn0sbG9naWM6IkFORCIsb3J0aG9nb25hbDp7ZGlzcGxheToiZGlzcGxheSIsc2VhcmNoOiJmaWx0ZXIifSxwcmVEZWZpbmVkOiExfSxjfSgpO20oY24pLHUoY24pLHMoY24pO3ZhciB5PWNuLmZuLmRhdGFUYWJsZTthdC5TZWFyY2hCdWlsZGVyPUMseS5TZWFyY2hCdWlsZGVyPUMsYXQuR3JvdXA9cCx5Lkdyb3VwPXAsYXQuQ3JpdGVyaWE9aSx5LkNyaXRlcmlhPWk7dmFyIFQ9YXQuQXBpLnJlZ2lzdGVyO2F0LmV4dC5zZWFyY2hCdWlsZGVyPXtjb25kaXRpb25zOnt9fSxhdC5leHQuYnV0dG9ucy5zZWFyY2hCdWlsZGVyPXthY3Rpb246ZnVuY3Rpb24oYyxsLGgsXyl7dGhpcy5wb3BvdmVyKF8uX3NlYXJjaEJ1aWxkZXIuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSk7dmFyIEY9Xy5fc2VhcmNoQnVpbGRlci5zLnRvcEdyb3VwO0YhPT12b2lkIDAmJkYuZG9tLmNvbnRhaW5lci50cmlnZ2VyKCJkdHNiLXJlZHJhd0NvbnRlbnRzLW5vRHJhdyIpLEYucy5jcml0ZXJpYS5sZW5ndGg9PT0wJiZjbigiLiIrY24uZm4uZGF0YVRhYmxlLkdyb3VwLmNsYXNzZXMuYWRkLnJlcGxhY2UoLyAvZywiLiIpKS5jbGljaygpfSxjb25maWc6e30saW5pdDpmdW5jdGlvbihjLGwsaCl7dmFyIF89bmV3IGF0LlNlYXJjaEJ1aWxkZXIoYyxjbi5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oRixPKXtjLmJ1dHRvbihsKS50ZXh0KE8pfX0saC5jb25maWcpKTtjLmJ1dHRvbihsKS50ZXh0KGgudGV4dHx8Yy5pMThuKCJzZWFyY2hCdWlsZGVyLmJ1dHRvbiIsXy5jLmkxOG4uYnV0dG9uLDApKSxoLl9zZWFyY2hCdWlsZGVyPV99LHRleHQ6bnVsbH0sVCgic2VhcmNoQnVpbGRlci5nZXREZXRhaWxzKCkiLGZ1bmN0aW9uKGMpe2M9PT12b2lkIDAmJihjPSExKTt2YXIgbD10aGlzLmNvbnRleHRbMF07cmV0dXJuIGwuX3NlYXJjaEJ1aWxkZXI/bC5fc2VhcmNoQnVpbGRlci5nZXREZXRhaWxzKGMpOm51bGx9KSxUKCJzZWFyY2hCdWlsZGVyLnJlYnVpbGQoKSIsZnVuY3Rpb24oYyl7dmFyIGw9dGhpcy5jb250ZXh0WzBdO3JldHVybiBsLl9zZWFyY2hCdWlsZGVyPT09dm9pZCAwP251bGw6KGwuX3NlYXJjaEJ1aWxkZXIucmVidWlsZChjKSx0aGlzKX0pLFQoInNlYXJjaEJ1aWxkZXIuY29udGFpbmVyKCkiLGZ1bmN0aW9uKCl7dmFyIGM9dGhpcy5jb250ZXh0WzBdO3JldHVybiBjLl9zZWFyY2hCdWlsZGVyP2MuX3NlYXJjaEJ1aWxkZXIuZ2V0Tm9kZSgpOm51bGx9KTtmdW5jdGlvbiBQKGMsbCl7dmFyIGg9bmV3IGF0LkFwaShjKSxfPWx8fGguaW5pdCgpLnNlYXJjaEJ1aWxkZXJ8fGF0LmRlZmF1bHRzLnNlYXJjaEJ1aWxkZXIsRj1uZXcgQyhoLF8pLE89Ri5nZXROb2RlKCk7cmV0dXJuIE99Y24oZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0c3AiLGZ1bmN0aW9uKGMsbCl7Yy5uYW1lc3BhY2U9PT0iZHQiJiYobC5vSW5pdC5zZWFyY2hCdWlsZGVyfHxhdC5kZWZhdWx0cy5zZWFyY2hCdWlsZGVyKSYmKGwuX3NlYXJjaEJ1aWxkZXJ8fFAobCkpfSksYXQuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlEiLGZuSW5pdDpQfSksYXQuZmVhdHVyZSYmYXQuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoQnVpbGRlciIsUCl9KSgpO3ZhciBzZD1pZShhZSgpLDEpO3ZhciBacz1pZShhZSgpLDEpO3ZhciBaZT1acy5kZWZhdWx0OyhmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgdCxlO2Z1bmN0aW9uIG4odyl7dD13LGU9dy5mbi5kYXRhVGFibGV9dmFyIHI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB3KGssUyxCLEwsUil7dmFyIHE9dGhpcztpZihSPT09dm9pZCAwJiYoUj1udWxsKSwhZXx8IWUudmVyc2lvbkNoZWNrfHwhZS52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighZS5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciB6PW5ldyBlLkFwaShrKTt0aGlzLmNsYXNzZXM9dC5leHRlbmQoITAse30sdy5jbGFzc2VzKSx0aGlzLmM9dC5leHRlbmQoITAse30sdy5kZWZhdWx0cyxTLFIpLFMmJlMuaGlkZUNvdW50JiZTLnZpZXdDb3VudD09PXZvaWQgMCYmKHRoaXMuYy52aWV3Q291bnQ9IXRoaXMuYy5oaWRlQ291bnQpO3ZhciBHPXouY29sdW1ucygpLmVxKDApLnRvQXJyYXkoKS5sZW5ndGg7dGhpcy5zPXtjb2xFeGlzdHM6QjxHLGNvbE9wdHM6dm9pZCAwLGN1c3RvbVBhbmVTZXR0aW5nczpSLGRpc3BsYXllZDohMSxkdDp6LGR0UGFuZTp2b2lkIDAsZmlyc3RTZXQ6ITAsaW5kZXg6QixpbmRleGVzOltdLGxpc3RTZXQ6ITEsbmFtZTp2b2lkIDAscm93RGF0YTp7YXJyYXlGaWx0ZXI6W10sYXJyYXlPcmlnaW5hbDpbXSxiaW5zOnt9LGJpbnNPcmlnaW5hbDp7fSxmaWx0ZXJNYXA6bmV3IE1hcCx0b3RhbE9wdGlvbnM6MH0sc2Nyb2xsVG9wOjAsc2VhcmNoRnVuY3Rpb246dm9pZCAwLHNlbGVjdGlvbnM6W10sc2VydmVyU2VsZWN0OltdLHNlcnZlclNlbGVjdGluZzohMSx0YWJsZUxlbmd0aDpudWxsLHVwZGF0aW5nOiExfSx0aGlzLnMuY29sT3B0cz10aGlzLnMuY29sRXhpc3RzP3RoaXMuX2dldE9wdGlvbnMoKTp0aGlzLl9nZXRCb251c09wdGlvbnMoKSx0aGlzLmRvbT17YnV0dG9uR3JvdXA6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmJ1dHRvbkdyb3VwKSxjbGVhcjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+JiMyMTU7PC9idXR0b24+JykuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNsZWFyQnV0dG9uKS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jbGVhclBhbmUiLHRoaXMuYy5pMThuLmNsZWFyUGFuZSkpLGNvbGxhcHNlQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3BhbiBjbGFzcz0iJyt0aGlzLmNsYXNzZXMuY2FyZXQrJyI+JiN4NWU7PC9zcGFuPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29sbGFwc2VCdXR0b24pLGNvbnRhaW5lcjp0KCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKS5hZGRDbGFzcyh0aGlzLnMuY29sT3B0cy5jbGFzc05hbWUpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sYXlvdXQrKHBhcnNlSW50KHRoaXMuYy5sYXlvdXQuc3BsaXQoIi0iKVsxXSwxMCk8MTA/dGhpcy5jLmxheW91dDp0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMF0rIi05IikpLmFkZENsYXNzKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MuY2xhc3NOYW1lOiIiKSxjb3VudEJ1dHRvbjp0KCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiI+PHNwYW4+PC9zcGFuPjwvYnV0dG9uPicpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY291bnRCdXR0b24pLGR0UDp0KCc8dGFibGUgd2lkdGg9IjEwMCUiPjx0aGVhZD48dHI+PHRoPjwvdGg+PHRoPjwvdGg+PC90cj48L3RoZWFkPjwvdGFibGU+JyksbG93ZXI6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnN1YlJvdzIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dCdXR0b24pLG5hbWVCdXR0b246dCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iPjxzcGFuPjwvc3Bhbj48L2J1dHRvbj4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMucGFuZUJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hbWVCdXR0b24pLHBhbmVzQ29udGFpbmVyOnQoTCksc2VhcmNoQm94OnQoIjxpbnB1dC8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVJbnB1dEJ1dHRvbikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaCksc2VhcmNoQnV0dG9uOnQoJzxidXR0b24gdHlwZT0iYnV0dG9uIj48c3Bhbj48L3NwYW4+PC9idXR0b24+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaEljb24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lQnV0dG9uKSxzZWFyY2hDb250OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWFyY2hDb250KSxzZWFyY2hMYWJlbENvbnQ6dCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNlYXJjaExhYmVsQ29udCksdG9wUm93OnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50b3BSb3cpLHVwcGVyOnQoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zdWJSb3cxKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U2VhcmNoKX07dmFyIG50PSIiO3RoaXMucy5jb2xFeGlzdHM/KG50PXQodGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLmhlYWRlcigpKS50ZXh0KCksdGhpcy5kb20uZHRQLmZpbmQoInRoIikuZXEoMCkudGV4dChudCkpOihudD10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmhlYWRlcnx8IkN1c3RvbSBQYW5lIix0aGlzLmRvbS5kdFAuZmluZCgidGgiKS5lcSgwKS5odG1sKG50KSksdGhpcy5zLmNvbE9wdHMubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY29sT3B0cy5uYW1lOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MubmFtZT90aGlzLnMubmFtZT10aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm5hbWU6dGhpcy5zLm5hbWU9bnQ7dmFyIHR0PXRoaXMucy5kdC50YWJsZSgwKS5ub2RlKCk7cmV0dXJuIHRoaXMucy5zZWFyY2hGdW5jdGlvbj1mdW5jdGlvbihldCx3dCxTdCl7aWYocS5zLnNlbGVjdGlvbnMubGVuZ3RoPT09MHx8ZXQublRhYmxlIT09dHQpcmV0dXJuITA7dmFyIFR0PW51bGw7cmV0dXJuIHEucy5jb2xFeGlzdHMmJihUdD13dFtxLnMuaW5kZXhdLHEucy5jb2xPcHRzLm9ydGhvZ29uYWwuZmlsdGVyIT09ImZpbHRlciImJihUdD1xLnMucm93RGF0YS5maWx0ZXJNYXAuZ2V0KFN0KSxUdCBpbnN0YW5jZW9mIHQuZm4uZGF0YVRhYmxlLkFwaSYmKFR0PVR0LnRvQXJyYXkoKSkpKSxxLl9zZWFyY2goVHQsU3QpfSx0LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLnB1c2godGhpcy5zLnNlYXJjaEZ1bmN0aW9uKSx0aGlzLmMuY2xlYXImJnRoaXMuZG9tLmNsZWFyLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBldD1xLmRvbS5jb250YWluZXIuZmluZCgiLiIrcS5jbGFzc2VzLnNlYXJjaC5yZXBsYWNlKC9ccysvZywiLiIpKTtldC5lYWNoKGZ1bmN0aW9uKCl7dCh0aGlzKS52YWwoIiIpLnRyaWdnZXIoImlucHV0Iil9KSxxLmNsZWFyUGFuZSgpfSksdGhpcy5zLmR0Lm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImJ1dHRvbnMtYWN0aW9uLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYWRqdXN0VG9wUm93KCl9KSx0aGlzLnMuZHQub24oImNvbHVtbi1yZW9yZGVyLmR0c3AiLGZ1bmN0aW9uKGV0LHd0LFN0KXtxLnMuaW5kZXg9U3QubWFwcGluZ1txLnMuaW5kZXhdfSksdGhpc31yZXR1cm4gdy5wcm90b3R5cGUuYWRkUm93PWZ1bmN0aW9uKGssUyxCLEwsUixxLHope3F8fChxPXRoaXMucy5yb3dEYXRhLmJpbnNbU10/dGhpcy5zLnJvd0RhdGEuYmluc1tTXTowKSx6fHwoej10aGlzLl9nZXRTaG93bihTKSk7Zm9yKHZhciBHLG50PTAsdHQ9dGhpcy5zLmluZGV4ZXM7bnQ8dHQubGVuZ3RoO250Kyspe3ZhciBldD10dFtudF07ZXQuZmlsdGVyPT09UyYmKEc9ZXQuaW5kZXgpfXJldHVybiBHPT09dm9pZCAwJiYoRz10aGlzLnMuaW5kZXhlcy5sZW5ndGgsdGhpcy5zLmluZGV4ZXMucHVzaCh7ZmlsdGVyOlMsaW5kZXg6R30pKSx0aGlzLnMuZHRQYW5lLnJvdy5hZGQoe2NsYXNzTmFtZTpSLGRpc3BsYXk6ayE9PSIiP2s6dGhpcy5lbXB0eU1lc3NhZ2UoKSxmaWx0ZXI6UyxpbmRleDpHLHNob3duOnosc29ydDpCLHRvdGFsOnEsdHlwZTpMfSl9LHcucHJvdG90eXBlLmFkanVzdFRvcFJvdz1mdW5jdGlvbigpe3ZhciBrPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93c0NvbnRhaW5lci5yZXBsYWNlKC9ccysvZywiLiIpKSxTPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93MS5yZXBsYWNlKC9ccysvZywiLiIpKSxCPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc3ViUm93Mi5yZXBsYWNlKC9ccysvZywiLiIpKSxMPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMudG9wUm93LnJlcGxhY2UoL1xzKy9nLCIuIikpOyh0KGtbMF0pLndpZHRoKCk8MjUyfHx0KExbMF0pLndpZHRoKCk8MjUyKSYmdChrWzBdKS53aWR0aCgpIT09MD8odChrWzBdKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93KSx0KFNbMF0pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTdWIpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3dTZWFyY2gpLHQoQlswXSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd0J1dHRvbikpOih0KGtbMF0pLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5uYXJyb3cpLHQoU1swXSkucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1N1YikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLm5hcnJvd1NlYXJjaCksdChCWzBdKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93U3ViKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMubmFycm93QnV0dG9uKSl9LHcucHJvdG90eXBlLmNsZWFyRGF0YT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhPXthcnJheUZpbHRlcjpbXSxhcnJheU9yaWdpbmFsOltdLGJpbnM6e30sYmluc09yaWdpbmFsOnt9LGZpbHRlck1hcDpuZXcgTWFwLHRvdGFsT3B0aW9uczowfX0sdy5wcm90b3R5cGUuY2xlYXJQYW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kZXNlbGVjdCgpLHRoaXMudXBkYXRlVGFibGUoKSx0aGlzfSx3LnByb3RvdHlwZS5jb2xsYXBzZT1mdW5jdGlvbigpe3ZhciBrPXRoaXM7IXRoaXMucy5kaXNwbGF5ZWR8fCF0aGlzLmMuY29sbGFwc2UmJnRoaXMucy5jb2xPcHRzLmNvbGxhcHNlIT09ITB8fHRoaXMucy5jb2xPcHRzLmNvbGxhcHNlPT09ITF8fCh0KHRoaXMucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGRlbiksdGhpcy5kb20udG9wUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5ib3JkZXJlZCksdGhpcy5kb20ubmFtZUJ1dHRvbi5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLHRoaXMuZG9tLmNvdW50QnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uc2VhcmNoQnV0dG9uLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24uYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnJvdGF0ZWQpLHRoaXMuZG9tLnRvcFJvdy5vbmUoImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuc2hvdygpfSksdGhpcy5kb20udG9wUm93LnRyaWdnZXIoImNvbGxhcHNlLmR0c3BzIikpfSx3LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5zLmR0UGFuZSYmdGhpcy5zLmR0UGFuZS5vZmYoIi5kdHNwIiksdGhpcy5zLmR0Lm9mZigiLmR0c3AiKSx0aGlzLmRvbS5jbGVhci5vZmYoIi5kdHNwIiksdGhpcy5kb20ubmFtZUJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCIuZHRzcCIpLHRoaXMuZG9tLnNlYXJjaEJ1dHRvbi5vZmYoIi5kdHNwIiksdGhpcy5kb20uY29sbGFwc2VCdXR0b24ub2ZmKCIuZHRzcCIpLHQodGhpcy5zLmR0LnRhYmxlKCkubm9kZSgpKS5vZmYoIi5kdHNwIiksdGhpcy5kb20uY29udGFpbmVyLmRldGFjaCgpO2Zvcih2YXIgaz10LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2YodGhpcy5zLnNlYXJjaEZ1bmN0aW9uKTtrIT09LTE7KXQuZm4uZGF0YVRhYmxlLmV4dC5zZWFyY2guc3BsaWNlKGssMSksaz10LmZuLmRhdGFUYWJsZS5leHQuc2VhcmNoLmluZGV4T2YodGhpcy5zLnNlYXJjaEZ1bmN0aW9uKTt0aGlzLnMuZHRQYW5lJiZ0aGlzLnMuZHRQYW5lLmRlc3Ryb3koKSx0aGlzLnMubGlzdFNldD0hMX0sdy5wcm90b3R5cGUuZW1wdHlNZXNzYWdlPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5jLmkxOG4uZW1wdHlNZXNzYWdlO3JldHVybiB0aGlzLmMuZW1wdHlNZXNzYWdlJiYoaz10aGlzLmMuZW1wdHlNZXNzYWdlKSx0aGlzLnMuY29sT3B0cy5lbXB0eU1lc3NhZ2UhPT0hMSYmdGhpcy5zLmNvbE9wdHMuZW1wdHlNZXNzYWdlIT09bnVsbCYmKGs9dGhpcy5zLmNvbE9wdHMuZW1wdHlNZXNzYWdlKSx0aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuZW1wdHlNZXNzYWdlIixrKX0sdy5wcm90b3R5cGUuZ2V0UGFuZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucy5kdFBhbmU/dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkubGVuZ3RoOjB9LHcucHJvdG90eXBlLnJlYnVpbGRQYW5lPWZ1bmN0aW9uKGssUyl7az09PXZvaWQgMCYmKGs9bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpLHRoaXMuY2xlYXJEYXRhKCk7dmFyIEI9W107dGhpcy5zLnNlcnZlclNlbGVjdD1bXTt2YXIgTD1udWxsO3JldHVybiB0aGlzLnMuZHRQYW5lJiYoUyYmKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCk6Qj10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSksdGhpcy5zLmR0UGFuZS5jbGVhcigpLmRlc3Ryb3koKSxMPXRoaXMuZG9tLmNvbnRhaW5lci5wcmV2KCksdGhpcy5kZXN0cm95KCksdGhpcy5zLmR0UGFuZT12b2lkIDAsdC5mbi5kYXRhVGFibGUuZXh0LnNlYXJjaC5wdXNoKHRoaXMucy5zZWFyY2hGdW5jdGlvbikpLHRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExLHRoaXMuX2J1aWxkUGFuZSh0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZT90aGlzLnMuc2VydmVyU2VsZWN0OkIsayxMKSx0aGlzfSx3LnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oayl7dGhpcy5jLmxheW91dD1rLHRoaXMuZG9tLmNvbnRhaW5lci5yZW1vdmVDbGFzcygpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zaG93KS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY29udGFpbmVyKS5hZGRDbGFzcyh0aGlzLnMuY29sT3B0cy5jbGFzc05hbWUpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5sYXlvdXQrKHBhcnNlSW50KGsuc3BsaXQoIi0iKVsxXSwxMCk8MTA/azprLnNwbGl0KCItIilbMF0rIi05IikpLmFkZENsYXNzKHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MhPT1udWxsJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZT90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmNsYXNzTmFtZToiIiksdGhpcy5hZGp1c3RUb3BSb3coKX0sdy5wcm90b3R5cGUuc2V0TGlzdGVuZXJzPWZ1bmN0aW9uKCl7dmFyIGs9dGhpczt0aGlzLnMuZHRQYW5lJiYodGhpcy5zLmR0UGFuZS5vZmYoInNlbGVjdC5kdHNwIikub24oInNlbGVjdC5kdHNwIixmdW5jdGlvbigpe2NsZWFyVGltZW91dChrLnMuZGVzZWxlY3RUaW1lb3V0KSxrLl91cGRhdGVTZWxlY3Rpb24oIWsucy51cGRhdGluZyksay5kb20uY2xlYXIucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpfSksdGhpcy5zLmR0UGFuZS5vZmYoImRlc2VsZWN0LmR0c3AiKS5vbigiZGVzZWxlY3QuZHRzcCIsZnVuY3Rpb24oKXtrLnMuZGVzZWxlY3RUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtrLl91cGRhdGVTZWxlY3Rpb24oITApLGsucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkudG9BcnJheSgpLmxlbmd0aD09PTAmJmsuZG9tLmNsZWFyLmFkZENsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIil9LDUwKX0pLHRoaXMucy5maXJzdFNldCYmKHRoaXMucy5maXJzdFNldD0hMSx0aGlzLnMuZHQub24oInN0YXRlU2F2ZVBhcmFtcy5kdHNwIixmdW5jdGlvbihTLEIsTCl7aWYodC5pc0VtcHR5T2JqZWN0KEwpKXtrLnMuZHRQYW5lLnN0YXRlLmNsZWFyKCk7cmV0dXJufXZhciBSLHEsej1bXSxHLG50LHR0O2sucy5kdFBhbmUmJih6PWsucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkubWFwKGZ1bmN0aW9uKHd0KXtyZXR1cm4gd3QuZmlsdGVyIT09bnVsbD93dC5maWx0ZXIudG9TdHJpbmcoKTpudWxsfSkudG9BcnJheSgpLG50PWsuZG9tLnNlYXJjaEJveC52YWwoKSxxPWsucy5kdFBhbmUub3JkZXIoKSxSPWsucy5yb3dEYXRhLmJpbnNPcmlnaW5hbCx0dD1rLnMucm93RGF0YS5hcnJheU9yaWdpbmFsLEc9ay5kb20uY29sbGFwc2VCdXR0b24uaGFzQ2xhc3Moay5jbGFzc2VzLnJvdGF0ZWQpKSxMLnNlYXJjaFBhbmVzPT09dm9pZCAwJiYoTC5zZWFyY2hQYW5lcz17fSksTC5zZWFyY2hQYW5lcy5wYW5lcz09PXZvaWQgMCYmKEwuc2VhcmNoUGFuZXMucGFuZXM9W10pO2Zvcih2YXIgZXQ9MDtldDxMLnNlYXJjaFBhbmVzLnBhbmVzLmxlbmd0aDtldCsrKUwuc2VhcmNoUGFuZXMucGFuZXNbZXRdLmlkPT09ay5zLmluZGV4JiYoTC5zZWFyY2hQYW5lcy5wYW5lcy5zcGxpY2UoZXQsMSksZXQtLSk7TC5zZWFyY2hQYW5lcy5wYW5lcy5wdXNoKHthcnJheUZpbHRlcjp0dCxiaW5zOlIsY29sbGFwc2VkOkcsaWQ6ay5zLmluZGV4LG9yZGVyOnEsc2VhcmNoVGVybTpudCxzZWxlY3RlZDp6fSl9KSksdGhpcy5zLmR0UGFuZS5vZmYoInVzZXItc2VsZWN0LmR0c3AiKS5vbigidXNlci1zZWxlY3QuZHRzcCIsZnVuY3Rpb24oUyxCLEwsUixxKXtxLnN0b3BQcm9wYWdhdGlvbigpfSksdGhpcy5zLmR0UGFuZS5vZmYoImRyYXcuZHRzcCIpLm9uKCJkcmF3LmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuYWRqdXN0VG9wUm93KCl9KSx0aGlzLmRvbS5uYW1lQnV0dG9uLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsucy5kdFBhbmUub3JkZXIoKVswXVsxXTtrLnMuZHRQYW5lLm9yZGVyKFtbMCxTPT09ImFzYyI/ImRlc2MiOiJhc2MiXV0pLmRyYXcoKSxrLnMuZHQuc3RhdGUuc2F2ZSgpfSksdGhpcy5kb20uY291bnRCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7dmFyIFM9ay5zLmR0UGFuZS5vcmRlcigpWzBdWzFdO2sucy5kdFBhbmUub3JkZXIoW1sxLFM9PT0iYXNjIj8iZGVzYyI6ImFzYyJdXSkuZHJhdygpLGsucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5vZmYoImNsaWNrLmR0c3AiKS5vbigiY2xpY2suZHRzcCIsZnVuY3Rpb24oUyl7Uy5zdG9wUHJvcGFnYXRpb24oKTt2YXIgQj10KGsucy5kdFBhbmUudGFibGUoKS5jb250YWluZXIoKSk7Qi50b2dnbGVDbGFzcyhrLmNsYXNzZXMuaGlkZGVuKSxrLmRvbS50b3BSb3cudG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmJvcmRlcmVkKSxrLmRvbS5uYW1lQnV0dG9uLnRvZ2dsZUNsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksay5kb20uY291bnRCdXR0b24udG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSxrLmRvbS5zZWFyY2hCdXR0b24udG9nZ2xlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSxrLmRvbS5jb2xsYXBzZUJ1dHRvbi50b2dnbGVDbGFzcyhrLmNsYXNzZXMucm90YXRlZCksQi5oYXNDbGFzcyhrLmNsYXNzZXMuaGlkZGVuKT9rLmRvbS50b3BSb3cub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuZG9tLmNvbGxhcHNlQnV0dG9uLmNsaWNrKCl9KTprLmRvbS50b3BSb3cub2ZmKCJjbGljay5kdHNwIiksay5zLmR0LnN0YXRlLnNhdmUoKSxrLmRvbS50b3BSb3cudHJpZ2dlcigiY29sbGFwc2UuZHRzcHMiKX0pLHRoaXMuZG9tLmNsZWFyLm9mZigiY2xpY2suZHRzcCIpLm9uKCJjbGljay5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsuZG9tLmNvbnRhaW5lci5maW5kKCIuIitrLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoLyAvZywiLiIpKTtTLmVhY2goZnVuY3Rpb24oKXt0KHRoaXMpLnZhbCgiIikudHJpZ2dlcigiaW5wdXQiKX0pLGsuY2xlYXJQYW5lKCl9KSx0aGlzLmRvbS5zZWFyY2hCdXR0b24ub2ZmKCJjbGljay5kdHNwIikub24oImNsaWNrLmR0c3AiLGZ1bmN0aW9uKCl7cmV0dXJuIGsuZG9tLnNlYXJjaEJveC5mb2N1cygpfSksdGhpcy5kb20uc2VhcmNoQm94Lm9mZigiY2xpY2suZHRzcCIpLm9uKCJpbnB1dC5kdHNwIixmdW5jdGlvbigpe3ZhciBTPWsuZG9tLnNlYXJjaEJveC52YWwoKTtrLnMuZHRQYW5lLnNlYXJjaChTKS5kcmF3KCksdHlwZW9mIFM9PSJzdHJpbmciJiYoUy5sZW5ndGg+MHx8Uy5sZW5ndGg9PT0wJiZrLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg+MCk/ay5kb20uY2xlYXIucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpOmsuZG9tLmNsZWFyLmFkZENsYXNzKGsuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksay5zLmR0LnN0YXRlLnNhdmUoKX0pLHRoaXMucy5kdFBhbmUuc2VsZWN0LnN0eWxlKHRoaXMucy5jb2xPcHRzLmR0T3B0cyYmdGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdCYmdGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlbGVjdC5zdHlsZT90aGlzLnMuY29sT3B0cy5kdE9wdHMuc2VsZWN0LnN0eWxlOnRoaXMuYy5kdE9wdHMmJnRoaXMuYy5kdE9wdHMuc2VsZWN0JiZ0aGlzLmMuZHRPcHRzLnNlbGVjdC5zdHlsZT90aGlzLmMuZHRPcHRzLnNlbGVjdC5zdHlsZToib3MiKSl9LHcucHJvdG90eXBlLl9zZXJ2ZXJQb3B1bGF0ZT1mdW5jdGlvbihrKXtrLnRhYmxlTGVuZ3RoPyh0aGlzLnMudGFibGVMZW5ndGg9ay50YWJsZUxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKToodGhpcy5zLnRhYmxlTGVuZ3RoPT09bnVsbHx8dGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGg+dGhpcy5zLnRhYmxlTGVuZ3RoKSYmKHRoaXMucy50YWJsZUxlbmd0aD10aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aCx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9dGhpcy5zLnRhYmxlTGVuZ3RoKTt2YXIgUz10aGlzLnMuZHQuY29sdW1uKHRoaXMucy5pbmRleCkuZGF0YVNyYygpO2lmKGsuc2VhcmNoUGFuZXMub3B0aW9uc1tTXSlmb3IodmFyIEI9MCxMPWsuc2VhcmNoUGFuZXMub3B0aW9uc1tTXTtCPEwubGVuZ3RoO0IrKyl7dmFyIFI9TFtCXTt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5wdXNoKHtkaXNwbGF5OlIubGFiZWwsZmlsdGVyOlIudmFsdWUsc29ydDpSLmxhYmVsLHR5cGU6Ui5sYWJlbH0pLHRoaXMucy5yb3dEYXRhLmJpbnNbUi52YWx1ZV09Ui50b3RhbH12YXIgcT1PYmplY3Qua2V5cyh0aGlzLnMucm93RGF0YS5iaW5zKS5sZW5ndGgsej10aGlzLl91bmlxdWVSYXRpbyhxLHRoaXMucy50YWJsZUxlbmd0aCk7aWYodGhpcy5zLmRpc3BsYXllZD09PSExJiYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnRocmVzaG9sZD09PW51bGw/ej50aGlzLmMudGhyZXNob2xkOno+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZxPD0xKSl7dGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITE7cmV0dXJufXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsdGhpcy5zLnJvd0RhdGEuYmluc09yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmJpbnMsdGhpcy5zLmRpc3BsYXllZD0hMH0sdy5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbigpe3RoaXMucy5kaXNwbGF5ZWQmJih0aGlzLmRvbS50b3BSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmJvcmRlcmVkKSx0aGlzLmRvbS5uYW1lQnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbiksdGhpcy5kb20uY291bnRCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5zZWFyY2hCdXR0b24ucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKSx0aGlzLmRvbS5jb2xsYXBzZUJ1dHRvbi5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMucm90YXRlZCksdCh0aGlzLnMuZHRQYW5lLnRhYmxlKCkuY29udGFpbmVyKCkpLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMuZG9tLnRvcFJvdy50cmlnZ2VyKCJjb2xsYXBzZS5kdHNwcyIpKX0sdy5wcm90b3R5cGUuX3VuaXF1ZVJhdGlvPWZ1bmN0aW9uKGssUyl7cmV0dXJuIFM+MCYmKHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz4wJiYhdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMudGFibGVMZW5ndGg+MCk/ay90aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM6MX0sdy5wcm90b3R5cGUudXBkYXRlVGFibGU9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oUyl7cmV0dXJuIFMuZmlsdGVyfSk7dGhpcy5zLnNlbGVjdGlvbnM9ayx0aGlzLl9zZWFyY2hFeHRyYXMoKX0sdy5wcm90b3R5cGUuX2dldENvbXBhcmlzb25Sb3dzPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5zLmNvbE9wdHMub3B0aW9ucz90aGlzLnMuY29sT3B0cy5vcHRpb25zOnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucz90aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLm9wdGlvbnM6dm9pZCAwO2lmKGshPT12b2lkIDApe3ZhciBTPXRoaXMucy5kdC5yb3dzKCksQj1TLmRhdGEoKS50b0FycmF5KCksTD1bXTt0aGlzLnMuZHRQYW5lLmNsZWFyKCksdGhpcy5zLmluZGV4ZXM9W107Zm9yKHZhciBSPTAscT1rO1I8cS5sZW5ndGg7UisrKXt2YXIgej1xW1JdLEc9ei5sYWJlbCE9PSIiP3oubGFiZWw6dGhpcy5lbXB0eU1lc3NhZ2UoKSxudD17Y2xhc3NOYW1lOnouY2xhc3NOYW1lLGRpc3BsYXk6RyxmaWx0ZXI6dHlwZW9mIHoudmFsdWU9PSJmdW5jdGlvbiI/ei52YWx1ZTpbXSxzb3J0Onoub3JkZXIhPT12b2lkIDA/ei5vcmRlcjpHLHRvdGFsOjAsdHlwZTpHfTtpZih0eXBlb2Ygei52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciB0dD0wO3R0PEIubGVuZ3RoO3R0Kyspei52YWx1ZS5jYWxsKHRoaXMucy5kdCxCW3R0XSxTWzBdW3R0XSkmJm50LnRvdGFsKys7dHlwZW9mIG50LmZpbHRlciE9ImZ1bmN0aW9uIiYmbnQuZmlsdGVyLnB1c2goei5maWx0ZXIpfUwucHVzaCh0aGlzLmFkZFJvdyhudC5kaXNwbGF5LG50LmZpbHRlcixudC5zb3J0LG50LnR5cGUsbnQuY2xhc3NOYW1lLG50LnRvdGFsKSl9cmV0dXJuIEx9fSx3LnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLGsudG90YWwpfSx3LnByb3RvdHlwZS5fZ2V0U2hvd249ZnVuY3Rpb24oayl7fSx3LnByb3RvdHlwZS5fZ2V0UGFuZUNvbmZpZz1mdW5jdGlvbigpe3ZhciBrPXRoaXMsUz1lLlNjcm9sbGVyLEI9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0xhbmd1YWdlO3JldHVybiBCLnVybD12b2lkIDAsQi5zVXJsPXZvaWQgMCx7Y29sdW1uRGVmczpbe2NsYXNzTmFtZToiZHRzcC1uYW1lQ29sdW1uIixkYXRhOiJkaXNwbGF5IixyZW5kZXI6ZnVuY3Rpb24oTCxSLHEpe2lmKFI9PT0ic29ydCIpcmV0dXJuIHEuc29ydDtpZihSPT09InR5cGUiKXJldHVybiBxLnR5cGU7dmFyIHo9ay5fZ2V0TWVzc2FnZShxKSxHPSc8c3BhbiBjbGFzcz0iJytrLmNsYXNzZXMucGlsbCsnIj4nK3orIjwvc3Bhbj4iO3JldHVybighay5jLnZpZXdDb3VudHx8IWsucy5jb2xPcHRzLnZpZXdDb3VudCkmJihHPSIiKSxSPT09ImZpbHRlciI/dHlwZW9mIEw9PSJzdHJpbmciJiZMLm1hdGNoKC88W14+XSo+LykhPT1udWxsP0wucmVwbGFjZSgvPFtePl0qPi9nLCIiKTpMOic8ZGl2IGNsYXNzPSInK2suY2xhc3Nlcy5uYW1lQ29udCsnIj48c3BhbiB0aXRsZT0iJysodHlwZW9mIEw9PSJzdHJpbmciJiZMLm1hdGNoKC88W14+XSo+LykhPT1udWxsP0wucmVwbGFjZSgvPFtePl0qPi9nLCIiKTpMKSsnIiBjbGFzcz0iJytrLmNsYXNzZXMubmFtZSsnIj4nK0wrIjwvc3Bhbj4iK0crIjwvZGl2PiJ9LHRhcmdldHM6MCx0eXBlOnRoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdP3RoaXMucy5kdC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uc1t0aGlzLnMuaW5kZXhdLl9zTWFudWFsVHlwZTpudWxsfSx7Y2xhc3NOYW1lOiJkdHNwLWNvdW50Q29sdW1uICIrdGhpcy5jbGFzc2VzLmJhZGdlUGlsbCxkYXRhOiJ0b3RhbCIsc2VhcmNoYWJsZTohMSx0YXJnZXRzOjEsdmlzaWJsZTohMX1dLGRlZmVyUmVuZGVyOiEwLGluZm86ITEsbGFuZ3VhZ2U6QixwYWdpbmc6ISFTLHNjcm9sbFg6ITEsc2Nyb2xsWToiMjAwcHgiLHNjcm9sbGVyOiEhUyxzZWxlY3Q6ITAsc3RhdGVTYXZlOiEhdGhpcy5zLmR0LnNldHRpbmdzKClbMF0ub0ZlYXR1cmVzLmJTdGF0ZVNhdmV9fSx3LnByb3RvdHlwZS5fbWFrZVNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMudXBkYXRlVGFibGUoKSx0aGlzLnMudXBkYXRpbmc9ITAsdGhpcy5zLmR0LmRyYXcoKSx0aGlzLnMudXBkYXRpbmc9ITF9LHcucHJvdG90eXBlLl9wb3B1bGF0ZVBhbmVBcnJheT1mdW5jdGlvbihrLFMsQixMKXtMPT09dm9pZCAwJiYoTD10aGlzLnMucm93RGF0YS5iaW5zKTt2YXIgUj1CLmZhc3REYXRhP0IuZmFzdERhdGE6ZnVuY3Rpb24oRyxudCx0dCl7cmV0dXJuIEIub0FwaS5fZm5HZXRDZWxsRGF0YShCLEcsbnQsdHQpfTtpZih0eXBlb2YgdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbD09InN0cmluZyIpe3ZhciBxPVIoayx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbCk7dGhpcy5zLnJvd0RhdGEuZmlsdGVyTWFwLnNldChrLHEpLHRoaXMuX2FkZE9wdGlvbihxLHEscSxxLFMsTCksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyt9ZWxzZXt2YXIgej1SKGssdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc2VhcmNoKTt6PT09bnVsbCYmKHo9IiIpLHR5cGVvZiB6PT0ic3RyaW5nIiYmKHo9ei5yZXBsYWNlKC88W14+XSo+L2csIiIpKSx0aGlzLnMucm93RGF0YS5maWx0ZXJNYXAuc2V0KGsseiksTFt6XT8oTFt6XSsrLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucysrKTooTFt6XT0xLHRoaXMuX2FkZE9wdGlvbih6LFIoayx0aGlzLnMuaW5kZXgsdGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC5kaXNwbGF5KSxSKGssdGhpcy5zLmluZGV4LHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWwuc29ydCksUihrLHRoaXMucy5pbmRleCx0aGlzLnMuY29sT3B0cy5vcnRob2dvbmFsLnR5cGUpLFMsTCksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspfX0sdy5wcm90b3R5cGUuX3JlbG9hZFNlbGVjdD1mdW5jdGlvbihrKXtpZihrIT09dm9pZCAwKXtmb3IodmFyIFMsQj0wO0I8ay5zZWFyY2hQYW5lcy5wYW5lcy5sZW5ndGg7QisrKWlmKGsuc2VhcmNoUGFuZXMucGFuZXNbQl0uaWQ9PT10aGlzLnMuaW5kZXgpe1M9QjticmVha31pZihTKWZvcih2YXIgTD10aGlzLnMuZHRQYW5lLFI9TC5yb3dzKHtvcmRlcjoiaW5kZXgifSkuZGF0YSgpLm1hcChmdW5jdGlvbih0dCl7cmV0dXJuIHR0LmZpbHRlciE9PW51bGw/dHQuZmlsdGVyLnRvU3RyaW5nKCk6bnVsbH0pLnRvQXJyYXkoKSxxPTAsej1rLnNlYXJjaFBhbmVzLnBhbmVzW1NdLnNlbGVjdGVkO3E8ei5sZW5ndGg7cSsrKXt2YXIgRz16W3FdLG50PS0xO0chPT1udWxsJiYobnQ9Ui5pbmRleE9mKEcudG9TdHJpbmcoKSkpLG50Pi0xJiYodGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxMLnJvdyhudCkuc2VsZWN0KCksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMSl9fX0sdy5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbihrKXt2YXIgUz10aGlzLEI9ZnVuY3Rpb24oUil7aWYoYXQudmVyc2lvbkNoZWNrKCIyIikpUy5zLmR0LnByb2Nlc3NpbmcoUik7ZWxzZXt2YXIgcT1TLnMuZHQuc2V0dGluZ3MoKVswXSx6PXEub0FwaTt6Ll9mblByb2Nlc3NpbmdEaXNwbGF5KHEsITEpfX0sTD1mdW5jdGlvbigpe1Mucy5zY3JvbGxUb3A9dChTLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpKS5wYXJlbnQoKVswXS5zY3JvbGxUb3AsUy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUmJiFTLnMudXBkYXRpbmc/Uy5zLnNlcnZlclNlbGVjdGluZ3x8KFMucy5zZXJ2ZXJTZWxlY3Q9Uy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCksUy5zLmR0LmRyYXcoITEpKTprJiZTLl9tYWtlU2VsZWN0aW9uKCksQighMSl9O0IoITApLHNldFRpbWVvdXQoTCwxKX0sdy5wcm90b3R5cGUuX2FkZE9wdGlvbj1mdW5jdGlvbihrLFMsQixMLFIscSl7aWYoQXJyYXkuaXNBcnJheShrKXx8ayBpbnN0YW5jZW9mIGUuQXBpKXtpZihrIGluc3RhbmNlb2YgZS5BcGkmJihrPWsudG9BcnJheSgpLFM9Uy50b0FycmF5KCkpLGsubGVuZ3RoPT09Uy5sZW5ndGgpe2Zvcih2YXIgej0wO3o8ay5sZW5ndGg7eisrKXFba1t6XV0/cVtrW3pdXSsrOihxW2tbel1dPTEsUi5wdXNoKHtkaXNwbGF5OlNbel0sZmlsdGVyOmtbel0sc29ydDpCW3pdLHR5cGU6TFt6XX0pKSx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKztyZXR1cm59dGhyb3cgbmV3IEVycm9yKCJkaXNwbGF5IGFuZCBmaWx0ZXIgbm90IHRoZSBzYW1lIGxlbmd0aCIpfWVsc2UgdHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciP3Fba10/KHFba10rKyx0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnMrKyk6KHFba109MSxSLnB1c2goe2Rpc3BsYXk6UyxmaWx0ZXI6ayxzb3J0OkIsdHlwZTpMfSksdGhpcy5zLnJvd0RhdGEudG90YWxPcHRpb25zKyspOlIucHVzaCh7ZGlzcGxheTpTLGZpbHRlcjprLHNvcnQ6Qix0eXBlOkx9KX0sdy5wcm90b3R5cGUuX2J1aWxkUGFuZT1mdW5jdGlvbihrLFMsQil7dmFyIEw9dGhpcztrPT09dm9pZCAwJiYoaz1bXSksUz09PXZvaWQgMCYmKFM9bnVsbCksQj09PXZvaWQgMCYmKEI9bnVsbCksdGhpcy5zLnNlbGVjdGlvbnM9W107dmFyIFI9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpLHE7aWYodGhpcy5zLmxpc3RTZXQmJihSPXRoaXMucy5kdC5zdGF0ZSgpKSx0aGlzLnMuY29sRXhpc3RzKXt2YXIgej0tMTtpZihSJiZSLnNlYXJjaFBhbmVzJiZSLnNlYXJjaFBhbmVzLnBhbmVzKXtmb3IodmFyIEc9MDtHPFIuc2VhcmNoUGFuZXMucGFuZXMubGVuZ3RoO0crKylpZihSLnNlYXJjaFBhbmVzLnBhbmVzW0ddLmlkPT09dGhpcy5zLmluZGV4KXt6PUc7YnJlYWt9fWlmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09ITF8fHRoaXMucy5jb2xPcHRzLnNob3chPT12b2lkIDAmJnRoaXMucy5jb2xPcHRzLnNob3chPT0hMCkmJno9PT0tMSlyZXR1cm4gdGhpcy5kb20uY29udGFpbmVyLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRkZW4pLHRoaXMucy5kaXNwbGF5ZWQ9ITEsITE7aWYoKHRoaXMucy5jb2xPcHRzLnNob3c9PT0hMHx8eiE9PS0xKSYmKHRoaXMucy5kaXNwbGF5ZWQ9ITApLCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmKCFTfHwhUy5zZWFyY2hQYW5lc3x8IVMuc2VhcmNoUGFuZXMub3B0aW9ucykpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLmxlbmd0aD09PTAmJih0aGlzLnMucm93RGF0YS50b3RhbE9wdGlvbnM9MCx0aGlzLl9wb3B1bGF0ZVBhbmUoKSx0aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zKTt2YXIgbnQ9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmluc09yaWdpbmFsKS5sZW5ndGgsdHQ9dGhpcy5fdW5pcXVlUmF0aW8obnQsdGhpcy5zLmR0LnJvd3MoKVswXS5sZW5ndGgpO2lmKHRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP3R0PnRoaXMuYy50aHJlc2hvbGQ6dHQ+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZudDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn10aGlzLmRvbS5jb250YWluZXIuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNob3cpLHRoaXMucy5kaXNwbGF5ZWQ9ITB9ZWxzZSBTJiZTLnNlYXJjaFBhbmVzJiZTLnNlYXJjaFBhbmVzLm9wdGlvbnMmJnRoaXMuX3NlcnZlclBvcHVsYXRlKFMpfWVsc2UgdGhpcy5zLmRpc3BsYXllZD0hMDt0aGlzLl9kaXNwbGF5UGFuZSgpLHRoaXMucy5saXN0U2V0fHx0aGlzLmRvbS5kdFAub24oInN0YXRlTG9hZFBhcmFtcy5kdHNwIixmdW5jdGlvbihwdCx2dCxydCl7dC5pc0VtcHR5T2JqZWN0KEwucy5kdC5zdGF0ZS5sb2FkZWQoKSkmJnQuZWFjaChydCxmdW5jdGlvbihndCl7ZGVsZXRlIHJ0W2d0XX0pfSksQiE9PW51bGwmJnRoaXMuZG9tLnBhbmVzQ29udGFpbmVyLmhhcyhCKS5sZW5ndGg+MD90aGlzLmRvbS5jb250YWluZXIuaW5zZXJ0QWZ0ZXIoQik6dGhpcy5kb20ucGFuZXNDb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS5jb250YWluZXIpO3ZhciBldD10LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZTt0LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZT0ibm9uZSIsdGhpcy5kb20uZHRQLm9uKCJpbml0LmR0IixmdW5jdGlvbihwdCx2dCl7dmFyIHJ0PUwuZG9tLmR0UC5EYXRhVGFibGUoKSxndD1ydC5zZWxlY3Quc3R5bGUoKTtydC5zZWxlY3Quc3R5bGUoZ3QpfSksdGhpcy5zLmR0UGFuZT10aGlzLmRvbS5kdFAuRGF0YVRhYmxlKHQuZXh0ZW5kKCEwLHRoaXMuX2dldFBhbmVDb25maWcoKSx0aGlzLmMuZHRPcHRzLHRoaXMucy5jb2xPcHRzP3RoaXMucy5jb2xPcHRzLmR0T3B0czp7fSx0aGlzLnMuY29sT3B0cy5vcHRpb25zfHwhdGhpcy5zLmNvbEV4aXN0cz97Y3JlYXRlZFJvdzpmdW5jdGlvbihwdCx2dCl7dChwdCkuYWRkQ2xhc3ModnQuY2xhc3NOYW1lKX19OnZvaWQgMCx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzIT09bnVsbCYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHM/dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHM6e30sdC5mbi5kYXRhVGFibGUudmVyc2lvbkNoZWNrKCIyIik/e2xheW91dDp7Ym90dG9tU3RhcnQ6bnVsbCxib3R0b21FbmQ6bnVsbCx0b3BTdGFydDpudWxsLHRvcEVuZDpudWxsfX06e2RvbToidCJ9KSksdGhpcy5kb20uZHRQLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy50YWJsZSk7dmFyIHd0PSJDdXN0b20gUGFuZSI7aWYodGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXI/d3Q9dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5oZWFkZXI6dGhpcy5zLmNvbE9wdHMuaGVhZGVyP3d0PXRoaXMucy5jb2xPcHRzLmhlYWRlcjp0aGlzLnMuY29sRXhpc3RzJiYod3Q9dC5mbi5kYXRhVGFibGUudmVyc2lvbkNoZWNrKCIyIik/dGhpcy5zLmR0LmNvbHVtbih0aGlzLnMuaW5kZXgpLnRpdGxlKCk6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Db2x1bW5zW3RoaXMucy5pbmRleF0uc1RpdGxlKSx3dD10aGlzLl9lc2NhcGVIVE1MKHd0KSx0aGlzLmRvbS5zZWFyY2hCb3guYXR0cigicGxhY2Vob2xkZXIiLHd0KSx0LmZuLmRhdGFUYWJsZS5leHQuZXJyTW9kZT1ldCx0aGlzLnMuY29sRXhpc3RzKWZvcih2YXIgU3Q9MCxUdD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5sZW5ndGg7U3Q8VHQ7U3QrKylpZih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7cT10aGlzLmFkZFJvdyh0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZGlzcGxheSx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZmlsdGVyLHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1N0XS5zb3J0LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyW1N0XS50eXBlKTtmb3IodmFyIGt0PTAsTHQ9dGhpcy5zLnNlcnZlclNlbGVjdDtrdDxMdC5sZW5ndGg7a3QrKyl7dmFyIEJ0PUx0W2t0XTtCdC5maWx0ZXI9PT10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uZmlsdGVyJiYodGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxxLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpfX1lbHNlIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0/dGhpcy5hZGRSb3codGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbU3RdLmRpc3BsYXksdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXJbU3RdLmZpbHRlcix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0uc29ydCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcltTdF0udHlwZSk6dGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMuYWRkUm93KCIiLCIiLCIiLCIiKTsodGhpcy5zLmNvbE9wdHMub3B0aW9uc3x8dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zKSYmdGhpcy5fZ2V0Q29tcGFyaXNvblJvd3MoKSx0aGlzLnMuZHRQYW5lLmRyYXcoKSx0aGlzLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpLnBhcmVudE5vZGUuc2Nyb2xsVG9wPXRoaXMucy5zY3JvbGxUb3AsdGhpcy5hZGp1c3RUb3BSb3coKSx0aGlzLnNldExpc3RlbmVycygpLHRoaXMucy5saXN0U2V0PSEwO2Zvcih2YXIgJHQ9MCxLdD1rOyR0PEt0Lmxlbmd0aDskdCsrKXt2YXIgRD1LdFskdF07aWYoRClmb3IodmFyIHV0PTAsb3Q9dGhpcy5zLmR0UGFuZS5yb3dzKCkuaW5kZXhlcygpLnRvQXJyYXkoKTt1dDxvdC5sZW5ndGg7dXQrKylxPW90W3V0XSx0aGlzLnMuZHRQYW5lLnJvdyhxKS5kYXRhKCkmJkQuZmlsdGVyPT09dGhpcy5zLmR0UGFuZS5yb3cocSkuZGF0YSgpLmZpbHRlciYmKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlPyh0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSEwLHRoaXMucy5kdFBhbmUucm93KHEpLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEpOnRoaXMucy5kdFBhbmUucm93KHEpLnNlbGVjdCgpKX1pZih0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSYmdGhpcy5zLmR0UGFuZS5zZWFyY2godGhpcy5kb20uc2VhcmNoQm94LnZhbCgpKS5kcmF3KCksKHRoaXMuYy5pbml0Q29sbGFwc2VkJiZ0aGlzLnMuY29sT3B0cy5pbml0Q29sbGFwc2VkIT09ITF8fHRoaXMucy5jb2xPcHRzLmluaXRDb2xsYXBzZWQpJiYodGhpcy5jLmNvbGxhcHNlJiZ0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSE9PSExfHx0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSkmJih0aGlzLnMuZHRQYW5lLnNldHRpbmdzKClbMF0uX2JJbml0Q29tcGxldGU/dGhpcy5jb2xsYXBzZSgpOnRoaXMucy5kdFBhbmUub25lKCJpbml0IixmdW5jdGlvbigpe3JldHVybiBMLmNvbGxhcHNlKCl9KSksUiYmUi5zZWFyY2hQYW5lcyYmUi5zZWFyY2hQYW5lcy5wYW5lcyYmKCFTfHxTLmRyYXc9PT0xKSl7dGhpcy5fcmVsb2FkU2VsZWN0KFIpO2Zvcih2YXIgVj0wLGo9Ui5zZWFyY2hQYW5lcy5wYW5lcztWPGoubGVuZ3RoO1YrKyl7dmFyIEs9altWXTtLLmlkPT09dGhpcy5zLmluZGV4JiYoSy5zZWFyY2hUZXJtJiZLLnNlYXJjaFRlcm0ubGVuZ3RoPjAmJnRoaXMuZG9tLnNlYXJjaEJveC52YWwoSy5zZWFyY2hUZXJtKS50cmlnZ2VyKCJpbnB1dCIpLEsub3JkZXImJnRoaXMucy5kdFBhbmUub3JkZXIoSy5vcmRlcikuZHJhdygpLEsuY29sbGFwc2VkP3RoaXMuY29sbGFwc2UoKTp0aGlzLnNob3coKSl9fXJldHVybiEwfSx3LnByb3RvdHlwZS5fZGlzcGxheVBhbmU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5kdFAuZW1wdHkoKSx0aGlzLmRvbS50b3BSb3cuZW1wdHkoKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudG9wUm93KSxwYXJzZUludCh0aGlzLmMubGF5b3V0LnNwbGl0KCItIilbMV0sMTApPjMmJnRoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc21hbGxHYXApLHRoaXMuZG9tLnRvcFJvdy5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc3ViUm93c0NvbnRhaW5lcikuYXBwZW5kKHRoaXMuZG9tLnVwcGVyLmFwcGVuZCh0aGlzLmRvbS5zZWFyY2hDb250KSkuYXBwZW5kKHRoaXMuZG9tLmxvd2VyLmFwcGVuZCh0aGlzLmRvbS5idXR0b25Hcm91cCkpLCh0aGlzLmMuZHRPcHRzLnNlYXJjaGluZz09PSExfHx0aGlzLnMuY29sT3B0cy5kdE9wdHMmJnRoaXMucy5jb2xPcHRzLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8IXRoaXMuYy5jb250cm9sc3x8IXRoaXMucy5jb2xPcHRzLmNvbnRyb2xzfHx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmR0T3B0cyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nIT09dm9pZCAwJiYhdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nKSYmdGhpcy5kb20uc2VhcmNoQm94LnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5wYW5lSW5wdXRCdXR0b24pLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksdGhpcy5kb20uc2VhcmNoQm94LmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaENvbnQpLHRoaXMuX3NlYXJjaENvbnRTZXR1cCgpLHRoaXMuYy5jbGVhciYmdGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20uY2xlYXIuYXBwZW5kVG8odGhpcy5kb20uYnV0dG9uR3JvdXApLHRoaXMuYy5vcmRlcmFibGUmJnRoaXMucy5jb2xPcHRzLm9yZGVyYWJsZSYmdGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20ubmFtZUJ1dHRvbi5hcHBlbmRUbyh0aGlzLmRvbS5idXR0b25Hcm91cCksdGhpcy5jLnZpZXdDb3VudCYmdGhpcy5zLmNvbE9wdHMudmlld0NvdW50JiZ0aGlzLmMub3JkZXJhYmxlJiZ0aGlzLnMuY29sT3B0cy5vcmRlcmFibGUmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNvdW50QnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSwodGhpcy5jLmNvbGxhcHNlJiZ0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSE9PSExfHx0aGlzLnMuY29sT3B0cy5jb2xsYXBzZSkmJnRoaXMuYy5jb250cm9scyYmdGhpcy5zLmNvbE9wdHMuY29udHJvbHMmJnRoaXMuZG9tLmNvbGxhcHNlQnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLmJ1dHRvbkdyb3VwKSx0aGlzLmRvbS5jb250YWluZXIucHJlcGVuZCh0aGlzLmRvbS50b3BSb3cpLmFwcGVuZCh0aGlzLmRvbS5kdFApLnNob3coKX0sdy5wcm90b3R5cGUuX2VzY2FwZUhUTUw9ZnVuY3Rpb24oayl7cmV0dXJuIGsudG9TdHJpbmcoKS5yZXBsYWNlKC8mbHQ7L2csIjwiKS5yZXBsYWNlKC8mZ3Q7L2csIj4iKS5yZXBsYWNlKC8mcXVvdDsvZywnIicpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sdy5wcm90b3R5cGUuX2dldEJvbnVzT3B0aW9ucz1mdW5jdGlvbigpe3ZhciBrPXt0aHJlc2hvbGQ6bnVsbH07cmV0dXJuIHQuZXh0ZW5kKCEwLHt9LHcuZGVmYXVsdHMsayx0aGlzLmM/dGhpcy5jOnt9KX0sdy5wcm90b3R5cGUuX2dldE9wdGlvbnM9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMuZHQsUz17Y29sbGFwc2U6bnVsbCxlbXB0eU1lc3NhZ2U6ITEsaW5pdENvbGxhcHNlZDpudWxsLHRocmVzaG9sZDpudWxsfSxCPWsuc2V0dGluZ3MoKVswXS5hb0NvbHVtbnNbdGhpcy5zLmluZGV4XS5zZWFyY2hQYW5lcyxMPXQuZXh0ZW5kKCEwLHt9LHcuZGVmYXVsdHMsUyxCKTtyZXR1cm4gQiYmQi5oaWRlQ291bnQmJkIudmlld0NvdW50PT09dm9pZCAwJiYoTC52aWV3Q291bnQ9IUIuaGlkZUNvdW50KSxMfSx3LnByb3RvdHlwZS5fcG9wdWxhdGVQYW5lPWZ1bmN0aW9uKCl7dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI9W10sdGhpcy5zLnJvd0RhdGEuYmlucz17fTt2YXIgaz10aGlzLnMuZHQuY29udGV4dFswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBTPTAsQj10aGlzLnMuZHQucm93cygpLmluZGV4ZXMoKS50b0FycmF5KCk7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoTCx0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixrKX19LHcucHJvdG90eXBlLl9zZWFyY2g9ZnVuY3Rpb24oayxTKXtmb3IodmFyIEI9dGhpcy5zLmNvbE9wdHMsTD10aGlzLnMuZHQsUj0wLHE9dGhpcy5zLnNlbGVjdGlvbnM7UjxxLmxlbmd0aDtSKyspe3ZhciB6PXFbUl07aWYodHlwZW9mIHo9PSJzdHJpbmciJiZ0eXBlb2Ygaz09InN0cmluZyImJih6PXRoaXMuX2VzY2FwZUhUTUwoeikpLEFycmF5LmlzQXJyYXkoaykpe2lmKEIuY29tYmluZXI9PT0iYW5kIil7aWYoIWsuaW5jbHVkZXMoeikpcmV0dXJuITF9ZWxzZSBpZihrLmluY2x1ZGVzKHopKXJldHVybiEwfWVsc2UgaWYodHlwZW9mIHo9PSJmdW5jdGlvbiIpe2lmKHouY2FsbChMLEwucm93KFMpLmRhdGEoKSxTKSl7aWYoQi5jb21iaW5lcj09PSJvciIpcmV0dXJuITB9ZWxzZSBpZihCLmNvbWJpbmVyPT09ImFuZCIpcmV0dXJuITF9ZWxzZSBpZihrPT09enx8ISh0eXBlb2Ygaz09InN0cmluZyImJmsubGVuZ3RoPT09MCkmJms9PXp8fHo9PT1udWxsJiZ0eXBlb2Ygaz09InN0cmluZyImJms9PT0iIilyZXR1cm4hMH1yZXR1cm4gQi5jb21iaW5lcj09PSJhbmQifSx3LnByb3RvdHlwZS5fc2VhcmNoQ29udFNldHVwPWZ1bmN0aW9uKCl7dGhpcy5jLmNvbnRyb2xzJiZ0aGlzLnMuY29sT3B0cy5jb250cm9scyYmdGhpcy5kb20uc2VhcmNoQnV0dG9uLmFwcGVuZFRvKHRoaXMuZG9tLnNlYXJjaExhYmVsQ29udCksdGhpcy5jLmR0T3B0cy5zZWFyY2hpbmc9PT0hMXx8dGhpcy5zLmNvbE9wdHMuZHRPcHRzLnNlYXJjaGluZz09PSExfHx0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzJiZ0aGlzLnMuY3VzdG9tUGFuZVNldHRpbmdzLmR0T3B0cyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nIT09dm9pZCAwJiYhdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5kdE9wdHMuc2VhcmNoaW5nfHx0aGlzLmRvbS5zZWFyY2hMYWJlbENvbnQuYXBwZW5kVG8odGhpcy5kb20uc2VhcmNoQ29udCl9LHcucHJvdG90eXBlLl9zZWFyY2hFeHRyYXM9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLnMudXBkYXRpbmc7dGhpcy5zLnVwZGF0aW5nPSEwO3ZhciBTPXRoaXMucy5kdFBhbmUucm93cyh7c2VsZWN0ZWQ6ITB9KS5kYXRhKCkucGx1Y2soImZpbHRlciIpLnRvQXJyYXkoKSxCPVMuaW5kZXhPZih0aGlzLmVtcHR5TWVzc2FnZSgpKSxMPXQodGhpcy5zLmR0UGFuZS50YWJsZSgpLmNvbnRhaW5lcigpKTtCPi0xJiYoU1tCXT0iIiksUy5sZW5ndGg+MD9MLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3RlZCk6Uy5sZW5ndGg9PT0wJiZMLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5zZWxlY3RlZCksdGhpcy5zLnVwZGF0aW5nPWt9LHcudmVyc2lvbj0iMi4xLjIiLHcuY2xhc3Nlcz17Ym9yZGVyZWQ6ImR0c3AtYm9yZGVyZWQiLGJ1dHRvbkdyb3VwOiJkdHNwLWJ1dHRvbkdyb3VwIixidXR0b25TdWI6ImR0c3AtYnV0dG9uU3ViIixjYXJldDoiZHRzcC1jYXJldCIsY2xlYXI6ImR0c3AtY2xlYXIiLGNsZWFyQWxsOiJkdHNwLWNsZWFyQWxsIixjbGVhckJ1dHRvbjoiY2xlYXJCdXR0b24iLGNvbGxhcHNlQWxsOiJkdHNwLWNvbGxhcHNlQWxsIixjb2xsYXBzZUJ1dHRvbjoiZHRzcC1jb2xsYXBzZUJ1dHRvbiIsY29udGFpbmVyOiJkdHNwLXNlYXJjaFBhbmUiLGNvdW50QnV0dG9uOiJkdHNwLWNvdW50QnV0dG9uIixkaXNhYmxlZEJ1dHRvbjoiZHRzcC1kaXNhYmxlZEJ1dHRvbiIsaGlkZGVuOiJkdHNwLWhpZGRlbiIsaGlkZToiZHRzcC1oaWRlIixsYXlvdXQ6ImR0c3AtIixuYW1lOiJkdHNwLW5hbWUiLG5hbWVCdXR0b246ImR0c3AtbmFtZUJ1dHRvbiIsbmFtZUNvbnQ6ImR0c3AtbmFtZUNvbnQiLG5hcnJvdzoiZHRzcC1uYXJyb3ciLHBhbmVCdXR0b246ImR0c3AtcGFuZUJ1dHRvbiIscGFuZUlucHV0QnV0dG9uOiJkdHNwLXBhbmVJbnB1dEJ1dHRvbiIscGlsbDoiZHRzcC1waWxsIixyb3RhdGVkOiJkdHNwLXJvdGF0ZWQiLHNlYXJjaDoiZHRzcC1zZWFyY2giLHNlYXJjaENvbnQ6ImR0c3Atc2VhcmNoQ29udCIsc2VhcmNoSWNvbjoiZHRzcC1zZWFyY2hJY29uIixzZWFyY2hMYWJlbENvbnQ6ImR0c3Atc2VhcmNoQnV0dG9uQ29udCIsc2VsZWN0ZWQ6ImR0c3Atc2VsZWN0ZWQiLHNtYWxsR2FwOiJkdHNwLXNtYWxsR2FwIixzdWJSb3cxOiJkdHNwLXN1YlJvdzEiLHN1YlJvdzI6ImR0c3Atc3ViUm93MiIsc3ViUm93c0NvbnRhaW5lcjoiZHRzcC1zdWJSb3dzQ29udGFpbmVyIix0aXRsZToiZHRzcC10aXRsZSIsdG9wUm93OiJkdHNwLXRvcFJvdyJ9LHcuZGVmYXVsdHM9e2NsZWFyOiEwLGNvbGxhcHNlOiEwLGNvbWJpbmVyOiJvciIsY29udGFpbmVyOmZ1bmN0aW9uKGspe3JldHVybiBrLnRhYmxlKCkuY29udGFpbmVyKCl9LGNvbnRyb2xzOiEwLGR0T3B0czp7fSxlbXB0eU1lc3NhZ2U6bnVsbCxoaWRlQ291bnQ6ITEsaTE4bjp7Y2xlYXJQYW5lOiImdGltZXM7Iixjb3VudDoie3RvdGFsfSIsZW1wdHlNZXNzYWdlOiI8ZW0+Tm8gZGF0YTwvZW0+In0saW5pdENvbGxhcHNlZDohMSxsYXlvdXQ6ImF1dG8iLG5hbWU6dm9pZCAwLG9yZGVyYWJsZTohMCxvcnRob2dvbmFsOntkaXNwbGF5OiJkaXNwbGF5IixmaWx0ZXI6ImZpbHRlciIsaGlkZUNvdW50OiExLHNlYXJjaDoiZmlsdGVyIixzaG93OnZvaWQgMCxzb3J0OiJzb3J0Iix0aHJlc2hvbGQ6LjYsdHlwZToidHlwZSIsdmlld0NvdW50OiEwfSxwcmVTZWxlY3Q6W10sdGhyZXNob2xkOi42LHZpZXdDb3VudDohMH0sd30oKSxzPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksaT1mdW5jdGlvbih3KXtzKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3JldHVybiB3LmNhbGwodGhpcyxTLEIsTCxSLHEpfHx0aGlzfXJldHVybiBrLnByb3RvdHlwZS5fZW1wdHlQYW5lPWZ1bmN0aW9uKCl7dmFyIFM9dGhpcy5zLmR0UGFuZTtpZihhdC52ZXJzaW9uQ2hlY2soIjIiKSl7dmFyIEI9Uy5zZWxlY3QubGFzdCgpLEw7cmV0dXJuIEImJlMucm93KEIucm93KS5hbnkoKSYmKEw9Uy5yb3coQi5yb3cpLmRhdGEoKS5pbmRleCksUy5yb3dzKCkucmVtb3ZlKCksZnVuY3Rpb24oKXtpZihMIT09dm9pZCAwKXt2YXIgUj1TLnJvdyhmdW5jdGlvbihxLHope3JldHVybiB6LmluZGV4PT09TH0pLmluZGV4KCk7Uy5zZWxlY3QubGFzdCh7cm93OlIsY29sdW1uOjB9KX19fXJldHVybiBTLnJvd3MoKS5yZW1vdmUoKSxmdW5jdGlvbigpe319LGsucHJvdG90eXBlLl9zZXJ2ZXJQb3B1bGF0ZT1mdW5jdGlvbihTKXt2YXIgQixMLFI7dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9LHRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLFMudGFibGVMZW5ndGghPT12b2lkIDA/KHRoaXMucy50YWJsZUxlbmd0aD1TLnRhYmxlTGVuZ3RoLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz10aGlzLnMudGFibGVMZW5ndGgpOih0aGlzLnMudGFibGVMZW5ndGg9PT1udWxsfHx0aGlzLnMuZHQucm93cygpWzBdLmxlbmd0aD50aGlzLnMudGFibGVMZW5ndGgpJiYodGhpcy5zLnRhYmxlTGVuZ3RoPXRoaXMucy5kdC5yb3dzKClbMF0ubGVuZ3RoLHRoaXMucy5yb3dEYXRhLnRvdGFsT3B0aW9ucz10aGlzLnMudGFibGVMZW5ndGgpO3ZhciBxPXRoaXMucy5kdC5jb2x1bW4odGhpcy5zLmluZGV4KS5kYXRhU3JjKCk7aWYoUy5zZWFyY2hQYW5lcy5vcHRpb25zW3FdIT09dm9pZCAwKWZvcih2YXIgej0wLEc9Uy5zZWFyY2hQYW5lcy5vcHRpb25zW3FdO3o8Ry5sZW5ndGg7eisrKXt2YXIgbnQ9R1t6XTt0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlci5wdXNoKHtkaXNwbGF5Om50LmxhYmVsLGZpbHRlcjpudC52YWx1ZSxzaG93bjorbnQuY291bnQsc29ydDpudC5sYWJlbCx0b3RhbDorbnQudG90YWwsdHlwZTpudC5sYWJlbH0pLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltudC52YWx1ZV09K250LmNvdW50LHRoaXMucy5yb3dEYXRhLmJpbnNbbnQudmFsdWVdPStudC50b3RhbH12YXIgdHQ9T2JqZWN0LmtleXModGhpcy5zLnJvd0RhdGEuYmlucykubGVuZ3RoLGV0PXRoaXMuX3VuaXF1ZVJhdGlvKHR0LHRoaXMucy50YWJsZUxlbmd0aCk7aWYoIXRoaXMucy5jb2xPcHRzLnNob3cmJnRoaXMucy5kaXNwbGF5ZWQ9PT0hMSYmKCh0aGlzLnMuY29sT3B0cy5zaG93PT09dm9pZCAwJiZ0aGlzLnMuY29sT3B0cy50aHJlc2hvbGQ9PT1udWxsP2V0PnRoaXMuYy50aHJlc2hvbGQ6ZXQ+dGhpcy5zLmNvbE9wdHMudGhyZXNob2xkKXx8dGhpcy5zLmNvbE9wdHMuc2hvdyE9PSEwJiZ0dDw9MSkpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZGVuKSx0aGlzLnMuZGlzcGxheWVkPSExO3JldHVybn1pZih0aGlzLnMucm93RGF0YS5hcnJheU9yaWdpbmFsPXRoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyLHRoaXMucy5yb3dEYXRhLmJpbnNPcmlnaW5hbD10aGlzLnMucm93RGF0YS5iaW5zLHRoaXMucy5kaXNwbGF5ZWQ9ITAsdGhpcy5zLmR0UGFuZSl7Zm9yKHZhciB3dD10aGlzLnMuc2VydmVyU2VsZWN0LFN0PXRoaXMuX2VtcHR5UGFuZSgpLFR0PTAsa3Q9dGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXI7VHQ8a3QubGVuZ3RoO1R0KyspaWYoUj1rdFtUdF0sdGhpcy5fc2hvdWxkQWRkUm93KFIpKXtMPXRoaXMuYWRkUm93KFIuZGlzcGxheSxSLmZpbHRlcixSLnNvcnQsUi50eXBlKTtmb3IodmFyIEx0PTA7THQ8d3QubGVuZ3RoO0x0KyspaWYoQj13dFtMdF0sQi5maWx0ZXI9PT1SLmZpbHRlcil7dGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMCxMLnNlbGVjdCgpLHRoaXMucy5zZXJ2ZXJTZWxlY3Rpbmc9ITEsd3Quc3BsaWNlKEx0LDEpLHRoaXMucy5zZWxlY3Rpb25zLnB1c2goUi5maWx0ZXIpO2JyZWFrfX1mb3IodmFyIEJ0PTAsJHQ9d3Q7QnQ8JHQubGVuZ3RoO0J0Kyspe0I9JHRbQnRdO2Zvcih2YXIgS3Q9MCxEPXRoaXMucy5yb3dEYXRhLmFycmF5T3JpZ2luYWw7S3Q8RC5sZW5ndGg7S3QrKylSPURbS3RdLFIuZmlsdGVyPT09Qi5maWx0ZXImJihMPXRoaXMuYWRkUm93KFIuZGlzcGxheSxSLmZpbHRlcixSLnNvcnQsUi50eXBlKSx0aGlzLnMuc2VydmVyU2VsZWN0aW5nPSEwLEwuc2VsZWN0KCksdGhpcy5zLnNlcnZlclNlbGVjdGluZz0hMSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKFIuZmlsdGVyKSl9dGhpcy5zLnNlcnZlclNlbGVjdD10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSx0aGlzLnMuZHRQYW5lLmRyYXcoKSxTdCgpfX0say5wcm90b3R5cGUudXBkYXRlUm93cz1mdW5jdGlvbigpe2lmKCF0aGlzLnMuZHQucGFnZS5pbmZvKCkuc2VydmVyU2lkZSl7dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duPXt9O2Zvcih2YXIgUz0wLEI9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO3RoaXMuX3VwZGF0ZVNob3duKEwsdGhpcy5zLmR0LnNldHRpbmdzKClbMF0sdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duKX19Zm9yKHZhciBSPWZ1bmN0aW9uKHR0KXt0dC5zaG93bj10eXBlb2YgcS5zLnJvd0RhdGEuYmluc1Nob3duW3R0LmZpbHRlcl09PSJudW1iZXIiP3Eucy5yb3dEYXRhLmJpbnNTaG93blt0dC5maWx0ZXJdOjAscS5zLmR0UGFuZS5yb3coZnVuY3Rpb24oZXQsd3Qpe3JldHVybiB3dCYmd3QuaW5kZXg9PT10dC5pbmRleH0pLmRhdGEodHQpfSxxPXRoaXMsej0wLEc9dGhpcy5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKTt6PEcubGVuZ3RoO3orKyl7dmFyIG50PUdbel07UihudCl9dGhpcy5zLmR0UGFuZS5kcmF3KCksdGhpcy5zLmR0UGFuZS50YWJsZSgpLm5vZGUoKS5wYXJlbnROb2RlLnNjcm9sbFRvcD10aGlzLnMuc2Nyb2xsVG9wfSxrLnByb3RvdHlwZS5fbWFrZVNlbGVjdGlvbj1mdW5jdGlvbigpe30say5wcm90b3R5cGUuX3JlbG9hZFNlbGVjdD1mdW5jdGlvbigpe30say5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4hMH0say5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiYhdGhpcy5zLnVwZGF0aW5nJiYhdGhpcy5zLnNlcnZlclNlbGVjdGluZyYmKHRoaXMucy5zZXJ2ZXJTZWxlY3Q9dGhpcy5zLmR0UGFuZS5yb3dzKHtzZWxlY3RlZDohMH0pLmRhdGEoKS50b0FycmF5KCkpfSxrLnByb3RvdHlwZS5fdXBkYXRlU2hvd249ZnVuY3Rpb24oUyxCLEwpe0w9PT12b2lkIDAmJihMPXRoaXMucy5yb3dEYXRhLmJpbnNTaG93bik7dmFyIFI9dHlwZW9mIHRoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw9PSJzdHJpbmciP3RoaXMucy5jb2xPcHRzLm9ydGhvZ29uYWw6dGhpcy5zLmNvbE9wdHMub3J0aG9nb25hbC5zZWFyY2gscT1CLmZhc3REYXRhP0IuZmFzdERhdGE6ZnVuY3Rpb24od3QsU3QsVHQpe3JldHVybiBCLm9BcGkuX2ZuR2V0Q2VsbERhdGEoQix3dCxTdCxUdCl9LHo9cShTLHRoaXMucy5pbmRleCxSKSxHPWZ1bmN0aW9uKHd0KXtMW3d0XT9MW3d0XSsrOkxbd3RdPTF9O2lmKEFycmF5LmlzQXJyYXkoeikpZm9yKHZhciBudD0wLHR0PXo7bnQ8dHQubGVuZ3RoO250Kyspe3ZhciBldD10dFtudF07RyhldCl9ZWxzZSBHKHopfSxrfShyKSxvPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksdTtmdW5jdGlvbiBwKHcpe3U9d312YXIgYj1mdW5jdGlvbih3KXtvKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3ZhciB6PXRoaXMsRz17aTE4bjp7Y291bnRGaWx0ZXJlZDoie3Nob3dufSAoe3RvdGFsfSkifX07cmV0dXJuIHo9dy5jYWxsKHRoaXMsUyx1LmV4dGVuZChHLEIpLEwsUixxKXx8dGhpcyx6fXJldHVybiBrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgQj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxMPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9MOkIpLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LGsucHJvdG90eXBlLl9nZXRTaG93bj1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLnJvd0RhdGEuYmluc1Nob3duJiZ0aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU10/dGhpcy5zLnJvd0RhdGEuYmluc1Nob3duW1NdOjB9LGt9KGkpLGc9d2luZG93JiZ3aW5kb3cuX19leHRlbmRzfHxmdW5jdGlvbigpe3ZhciB3PWZ1bmN0aW9uKGssUyl7cmV0dXJuIHc9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKEIsTCl7Qi5fX3Byb3RvX189TH18fGZ1bmN0aW9uKEIsTCl7Zm9yKHZhciBSIGluIEwpTC5oYXNPd25Qcm9wZXJ0eShSKSYmKEJbUl09TFtSXSl9LHcoayxTKX07cmV0dXJuIGZ1bmN0aW9uKGssUyl7dyhrLFMpO2Z1bmN0aW9uIEIoKXt0aGlzLmNvbnN0cnVjdG9yPWt9ay5wcm90b3R5cGU9Uz09PW51bGw/T2JqZWN0LmNyZWF0ZShTKTooQi5wcm90b3R5cGU9Uy5wcm90b3R5cGUsbmV3IEIpfX0oKSxtO2Z1bmN0aW9uIEModyl7bT13fXZhciB5PWZ1bmN0aW9uKHcpe2coayx3KTtmdW5jdGlvbiBrKFMsQixMLFIscSl7dmFyIHo9dGhpcyxHPXtpMThuOntjb3VudDoie3Nob3dufSJ9fTtyZXR1cm4gej13LmNhbGwodGhpcyxTLG0uZXh0ZW5kKEcsQiksTCxSLHEpfHx0aGlzLHp9cmV0dXJuIGsucHJvdG90eXBlLnVwZGF0ZVJvd3M9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSxCO2lmKHRoaXMucy5jb2xPcHRzLm9wdGlvbnN8fHRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3MmJnRoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9ucyl7dGhpcy5fZ2V0Q29tcGFyaXNvblJvd3MoKTtmb3IodmFyIEw9dGhpcy5zLmR0UGFuZS5yb3dzKCkudG9BcnJheSgpWzBdLFI9MDtSPEwubGVuZ3RoO1IrKyl7dmFyIHE9dGhpcy5zLmR0UGFuZS5yb3coTFtSXSksej1xLmRhdGEoKTtpZih6IT09dm9pZCAwKXtpZih6LnNob3duPT09MCl7cS5yZW1vdmUoKSxMPXRoaXMucy5kdFBhbmUucm93cygpLnRvQXJyYXkoKVswXSxSLS07Y29udGludWV9Zm9yKHZhciBHPTAsbnQ9UztHPG50Lmxlbmd0aDtHKyspaWYoQj1udFtHXSx6LmZpbHRlcj09PUIuZmlsdGVyKXtxLnNlbGVjdCgpLFMuc3BsaWNlKFIsMSksdGhpcy5zLnNlbGVjdGlvbnMucHVzaCh6LmZpbHRlcik7YnJlYWt9fX19ZWxzZXtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMuX2FjdGl2ZVBvcHVsYXRlUGFuZSgpLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTtmb3IodmFyIHR0PTAsZXQ9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO3R0PGV0Lmxlbmd0aDt0dCsrKXt2YXIgd3Q9ZXRbdHRdO3RoaXMuX3VwZGF0ZVNob3duKHd0LHRoaXMucy5kdC5zZXR0aW5ncygpWzBdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fXRoaXMucy5kdFBhbmUucm93cygpLnJlbW92ZSgpO2Zvcih2YXIgU3Q9MCxUdD10aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcjtTdDxUdC5sZW5ndGg7U3QrKyl7dmFyIGt0PVR0W1N0XTtpZihrdC5zaG93biE9PTApZm9yKHZhciBMdD10aGlzLmFkZFJvdyhrdC5kaXNwbGF5LGt0LmZpbHRlcixrdC5zb3J0LGt0LnR5cGUsdm9pZCAwKSxCdD0wO0J0PFMubGVuZ3RoO0J0Kyspe3ZhciAkdD1TW0J0XTtpZigkdC5maWx0ZXI9PT1rdC5maWx0ZXIpe0x0LnNlbGVjdCgpLFMuc3BsaWNlKEJ0LDEpLHRoaXMucy5zZWxlY3Rpb25zLnB1c2goa3QuZmlsdGVyKTticmVha319fWZvcih2YXIgS3Q9MCxEPVM7S3Q8RC5sZW5ndGg7S3QrKyl7Qj1EW0t0XTtmb3IodmFyIHV0PTAsb3Q9dGhpcy5zLnJvd0RhdGEuYXJyYXlPcmlnaW5hbDt1dDxvdC5sZW5ndGg7dXQrKyl7dmFyIFY9b3RbdXRdO2lmKFYuZmlsdGVyPT09Qi5maWx0ZXIpe3ZhciBqPXRoaXMuYWRkUm93KFYuZGlzcGxheSxWLmZpbHRlcixWLnNvcnQsVi50eXBlLHZvaWQgMCk7ai5zZWxlY3QoKSx0aGlzLnMuc2VsZWN0aW9ucy5wdXNoKFYuZmlsdGVyKX19fX10aGlzLnMuZHRQYW5lLmRyYXcoKSx0aGlzLnMuZHRQYW5lLnRhYmxlKCkubm9kZSgpLnBhcmVudE5vZGUuc2Nyb2xsVG9wPXRoaXMucy5zY3JvbGxUb3AsdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fHRoaXMucy5kdC5kcmF3KCExKX0say5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnM9e307dmFyIFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF07aWYoIXRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKWZvcih2YXIgQj0wLEw9dGhpcy5zLmR0LnJvd3Moe3NlYXJjaDoiYXBwbGllZCJ9KS5pbmRleGVzKCkudG9BcnJheSgpO0I8TC5sZW5ndGg7QisrKXt2YXIgUj1MW0JdO3RoaXMuX3BvcHVsYXRlUGFuZUFycmF5KFIsdGhpcy5zLnJvd0RhdGEuYXJyYXlGaWx0ZXIsUyl9fSxrLnByb3RvdHlwZS5fZ2V0Q29tcGFyaXNvblJvd3M9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLnMuY29sT3B0cy5vcHRpb25zP3RoaXMucy5jb2xPcHRzLm9wdGlvbnM6dGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncyYmdGhpcy5zLmN1c3RvbVBhbmVTZXR0aW5ncy5vcHRpb25zP3RoaXMucy5jdXN0b21QYW5lU2V0dGluZ3Mub3B0aW9uczp2b2lkIDA7aWYoUyE9PXZvaWQgMCl7dmFyIEI9dGhpcy5zLmR0LnJvd3MoKSxMPXRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSksUj1CLmRhdGEoKS50b0FycmF5KCkscT1MLmRhdGEoKS50b0FycmF5KCksej1bXTt0aGlzLnMuZHRQYW5lLmNsZWFyKCksdGhpcy5zLmluZGV4ZXM9W107Zm9yKHZhciBHPTAsbnQ9UztHPG50Lmxlbmd0aDtHKyspe3ZhciB0dD1udFtHXSxldD10dC5sYWJlbCE9PSIiP3R0LmxhYmVsOnRoaXMuZW1wdHlNZXNzYWdlKCksd3Q9e2NsYXNzTmFtZTp0dC5jbGFzc05hbWUsZGlzcGxheTpldCxmaWx0ZXI6dHlwZW9mIHR0LnZhbHVlPT0iZnVuY3Rpb24iP3R0LnZhbHVlOltdLHNob3duOjAsc29ydDpldCx0b3RhbDowLHR5cGU6ZXR9O2lmKHR5cGVvZiB0dC52YWx1ZT09ImZ1bmN0aW9uIil7Zm9yKHZhciBTdD0wO1N0PFIubGVuZ3RoO1N0KyspdHQudmFsdWUuY2FsbCh0aGlzLnMuZHQsUltTdF0sQlswXVtTdF0pJiZ3dC50b3RhbCsrO2Zvcih2YXIgVHQ9MDtUdDxxLmxlbmd0aDtUdCsrKXR0LnZhbHVlLmNhbGwodGhpcy5zLmR0LHFbVHRdLExbMF1bVHRdKSYmd3Quc2hvd24rKzt0eXBlb2Ygd3QuZmlsdGVyIT0iZnVuY3Rpb24iJiZ3dC5maWx0ZXIucHVzaCh0dC5maWx0ZXIpfXoucHVzaCh0aGlzLmFkZFJvdyh3dC5kaXNwbGF5LHd0LmZpbHRlcix3dC5zb3J0LHd0LnR5cGUsd3QuY2xhc3NOYW1lLHd0LnRvdGFsLHd0LnNob3duKSl9cmV0dXJuIHp9fSxrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXtyZXR1cm4gdGhpcy5zLmR0LmkxOG4oInNlYXJjaFBhbmVzLmNvdW50Iix0aGlzLmMuaTE4bi5jb3VudCkucmVwbGFjZSgve3RvdGFsfS9nLFMudG90YWwpLnJlcGxhY2UoL3tzaG93bn0vZyxTLnNob3duKX0say5wcm90b3R5cGUuX2dldFNob3duPWZ1bmN0aW9uKFMpe3JldHVybiB0aGlzLnMucm93RGF0YS5iaW5zU2hvd24mJnRoaXMucy5yb3dEYXRhLmJpbnNTaG93bltTXT90aGlzLnMucm93RGF0YS5iaW5zU2hvd25bU106MH0say5wcm90b3R5cGUuX3Nob3VsZEFkZFJvdz1mdW5jdGlvbihTKXtyZXR1cm4gUy5zaG93bj4wfSxrfShpKSxUPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksUDtmdW5jdGlvbiBjKHcpe1A9d312YXIgbD1mdW5jdGlvbih3KXtUKGssdyk7ZnVuY3Rpb24gayhTLEIsTCxSLHEpe3ZhciB6PXRoaXMsRz17aTE4bjp7Y291bnQ6Int0b3RhbH0iLGNvdW50RmlsdGVyZWQ6IntzaG93bn0gKHt0b3RhbH0pIn19O3JldHVybiB6PXcuY2FsbCh0aGlzLFMsUC5leHRlbmQoRyxCKSxMLFIscSl8fHRoaXMsen1yZXR1cm4gay5wcm90b3R5cGUuX2FjdGl2ZVBvcHVsYXRlUGFuZT1mdW5jdGlvbigpe3RoaXMucy5yb3dEYXRhLmFycmF5RmlsdGVyPVtdLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bj17fTt2YXIgUz10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTtpZighdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpZm9yKHZhciBCPTAsTD10aGlzLnMuZHQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKS50b0FycmF5KCk7QjxMLmxlbmd0aDtCKyspe3ZhciBSPUxbQl07dGhpcy5fcG9wdWxhdGVQYW5lQXJyYXkoUix0aGlzLnMucm93RGF0YS5hcnJheUZpbHRlcixTLHRoaXMucy5yb3dEYXRhLmJpbnNTaG93bil9fSxrLnByb3RvdHlwZS5fZ2V0TWVzc2FnZT1mdW5jdGlvbihTKXt2YXIgQj10aGlzLnMuZHQuaTE4bigic2VhcmNoUGFuZXMuY291bnQiLHRoaXMuYy5pMThuLmNvdW50KSxMPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5jb3VudEZpbHRlcmVkIix0aGlzLmMuaTE4bi5jb3VudEZpbHRlcmVkKTtyZXR1cm4odGhpcy5zLmZpbHRlcmluZ0FjdGl2ZT9MOkIpLnJlcGxhY2UoL3t0b3RhbH0vZyxTLnRvdGFsKS5yZXBsYWNlKC97c2hvd259L2csUy5zaG93bil9LGt9KHkpLGgsXztmdW5jdGlvbiBGKHcpe2g9dyxfPXcuZm4uZGF0YVRhYmxlfXZhciBPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdyhrLFMsQixMKXt2YXIgUj10aGlzO2lmKEI9PT12b2lkIDAmJihCPSExKSxMPT09dm9pZCAwJiYoTD1yKSwhX3x8IV8udmVyc2lvbkNoZWNrfHwhXy52ZXJzaW9uQ2hlY2soIjEuMTAuMCIpKXRocm93IG5ldyBFcnJvcigiU2VhcmNoUGFuZSByZXF1aXJlcyBEYXRhVGFibGVzIDEuMTAgb3IgbmV3ZXIiKTtpZighXy5zZWxlY3QpdGhyb3cgbmV3IEVycm9yKCJTZWFyY2hQYW5lIHJlcXVpcmVzIFNlbGVjdCIpO3ZhciBxPW5ldyBfLkFwaShrKTtpZih0aGlzLmNsYXNzZXM9aC5leHRlbmQoITAse30sdy5jbGFzc2VzKSx0aGlzLmM9aC5leHRlbmQoITAse30sdy5kZWZhdWx0cyxTKSx0aGlzLmRvbT17Y2xlYXJBbGw6aCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuY2xlYXJBbGwpLmh0bWwocS5pMThuKCJzZWFyY2hQYW5lcy5jbGVhck1lc3NhZ2UiLHRoaXMuYy5pMThuLmNsZWFyTWVzc2FnZSkpLGNvbGxhcHNlQWxsOmgoJzxidXR0b24gdHlwZT0iYnV0dG9uIi8+JykuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmNvbGxhcHNlQWxsKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2VNZXNzYWdlIix0aGlzLmMuaTE4bi5jb2xsYXBzZU1lc3NhZ2UpKSxjb250YWluZXI6aCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnBhbmVzKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMubG9hZE1lc3NhZ2UiLHRoaXMuYy5pMThuLmxvYWRNZXNzYWdlKSksZW1wdHlNZXNzYWdlOmgoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5lbXB0eU1lc3NhZ2UpLHBhbmVzOmgoIjxkaXYvPiIpLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5jb250YWluZXIpLHNob3dBbGw6aCgnPGJ1dHRvbiB0eXBlPSJidXR0b24iLz4nKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuc2hvd0FsbCkuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKS5odG1sKHEuaTE4bigic2VhcmNoUGFuZXMuc2hvd01lc3NhZ2UiLHRoaXMuYy5pMThuLnNob3dNZXNzYWdlKSksdGl0bGU6aCgiPGRpdi8+IikuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnRpdGxlKSx0aXRsZVJvdzpoKCI8ZGl2Lz4iKS5hZGRDbGFzcyh0aGlzLmNsYXNzZXMudGl0bGVSb3cpfSx0aGlzLnM9e2NvbE9wdHM6W10sZHQ6cSxmaWx0ZXJDb3VudDowLG1pblBhbmVXaWR0aDoyNjAscGFnZTowLHBhZ2luZzohMSxwYWdpbmdTVDohMSxwYW5lQ2xhc3M6TCxwYW5lczpbXSxzZWxlY3Rpb25MaXN0OltdLHNlcnZlckRhdGE6e30sc3RhdGVSZWFkOiExLHVwZGF0aW5nOiExfSwhcS5zZXR0aW5ncygpWzBdLl9zZWFyY2hQYW5lcyl7aWYoaChkb2N1bWVudCkub24oImRyYXcuZHQiLGZ1bmN0aW9uKEcpe1IuZG9tLmNvbnRhaW5lci5maW5kKEcudGFyZ2V0KS5sZW5ndGgmJlIuX3VwZGF0ZUZpbHRlckNvdW50KCl9KSx0aGlzLl9nZXRTdGF0ZSgpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgej10aGlzLnMuZHQuc2V0dGluZ3MoKVswXTt0aGlzLnMuZHQub24oInByZVhoci5kdHNwcyIsZnVuY3Rpb24oRyxudCx0dCl7aWYoej09PW50KXt0dC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsPT09dm9pZCAwJiYodHQuc2VhcmNoUGFuZXNfbnVsbD17fSk7Zm9yKHZhciBldCx3dD0wLFN0PVIucy5zZWxlY3Rpb25MaXN0O3d0PFN0Lmxlbmd0aDt3dCsrKXt2YXIgVHQ9U3Rbd3RdO2V0PVIucy5kdC5jb2x1bW4oVHQuY29sdW1uKS5kYXRhU3JjKCksdHQuc2VhcmNoUGFuZXNbZXRdPT09dm9pZCAwJiYodHQuc2VhcmNoUGFuZXNbZXRdPXt9KSx0dC5zZWFyY2hQYW5lc19udWxsW2V0XT09PXZvaWQgMCYmKHR0LnNlYXJjaFBhbmVzX251bGxbZXRdPXt9KTtmb3IodmFyIGt0PTA7a3Q8VHQucm93cy5sZW5ndGg7a3QrKyl0dC5zZWFyY2hQYW5lc1tldF1ba3RdPVR0LnJvd3Nba3RdLHR0LnNlYXJjaFBhbmVzW2V0XVtrdF09PT1udWxsP3R0LnNlYXJjaFBhbmVzX251bGxbZXRdW2t0XT0hMDp0dC5zZWFyY2hQYW5lc19udWxsW2V0XVtrdF09ITF9Ui5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJih0dC5zZWFyY2hQYW5lc0xhc3Q9ZXQpLHR0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Ui5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Ui5jLnZpZXdDb3VudCx2aWV3VG90YWw6Ui5jLnZpZXdUb3RhbH19fSl9cmV0dXJuIHRoaXMuX3NldFhIUigpLHEuc2V0dGluZ3MoKVswXS5fc2VhcmNoUGFuZXM9dGhpcyx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZXx8Qj90aGlzLl9wYW5lRGVjbGFyZShxLGssUyk6cS5vbmUoInByZUluaXQuZHRzcHMiLGZ1bmN0aW9uKCl7Ui5fcGFuZURlY2xhcmUocSxrLFMpfSksdGhpc319cmV0dXJuIHcucHJvdG90eXBlLmNsZWFyU2VsZWN0aW9ucz1mdW5jdGlvbigpe2Zvcih2YXIgayxTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspaz1CW1NdLGsucy5kdFBhbmUmJihrLnMuc2Nyb2xsVG9wPWsucy5kdFBhbmUudGFibGUoKS5ub2RlKCkucGFyZW50Tm9kZS5zY3JvbGxUb3ApO3ZhciBMPXRoaXMuZG9tLmNvbnRhaW5lci5maW5kKCIuIit0aGlzLmNsYXNzZXMuc2VhcmNoLnJlcGxhY2UoL1xzKy9nLCIuIikpO0wuZWFjaChmdW5jdGlvbigpe2godGhpcykudmFsKCIiKS50cmlnZ2VyKCJpbnB1dCIpfSksdGhpcy5zLnNlbGVjdGlvbkxpc3Q9W107Zm9yKHZhciBSPVtdLHE9MCx6PXRoaXMucy5wYW5lcztxPHoubGVuZ3RoO3ErKylrPXpbcV0say5zLmR0UGFuZSYmUi5wdXNoKGsuY2xlYXJQYW5lKCkpO3JldHVybiBSfSx3LnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmNvbnRhaW5lcn0sdy5wcm90b3R5cGUucmVidWlsZD1mdW5jdGlvbihrLFMpe2s9PT12b2lkIDAmJihrPSExKSxTPT09dm9pZCAwJiYoUz0hMSksdGhpcy5kb20uZW1wdHlNZXNzYWdlLmRldGFjaCgpLGs9PT0hMSYmdGhpcy5kb20ucGFuZXMuZW1wdHkoKTtmb3IodmFyIEI9W10sTD0wLFI9dGhpcy5zLnBhbmVzO0w8Ui5sZW5ndGg7TCsrKXt2YXIgcT1SW0xdOyhrPT09ITF8fHEucy5pbmRleD09PWspJiYocS5jbGVhckRhdGEoKSxxLnJlYnVpbGRQYW5lKHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlP3RoaXMucy5zZXJ2ZXJEYXRhOnZvaWQgMCxTKSx0aGlzLmRvbS5wYW5lcy5hcHBlbmQocS5kb20uY29udGFpbmVyKSxCLnB1c2gocSkpfXJldHVybiB0aGlzLl91cGRhdGVTZWxlY3Rpb24oKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLHRoaXMuX2F0dGFjaFBhbmVDb250YWluZXIoKSx0aGlzLl9pbml0U2VsZWN0aW9uTGlzdGVuZXJzKCExKSx0aGlzLnMuZHQuZHJhdyghUyksdGhpcy5yZXNpemVQYW5lcygpLEIubGVuZ3RoPT09MT9CWzBdOkJ9LHcucHJvdG90eXBlLnJlc2l6ZVBhbmVzPWZ1bmN0aW9uKCl7dmFyIGs7aWYodGhpcy5jLmxheW91dD09PSJhdXRvIil7Zm9yKHZhciBTPWgodGhpcy5zLmR0LnNlYXJjaFBhbmVzLmNvbnRhaW5lcigpKS53aWR0aCgpLEI9TWF0aC5mbG9vcihTL3RoaXMucy5taW5QYW5lV2lkdGgpLEw9MSxSPTAscT1bXSx6PTAsRz10aGlzLnMucGFuZXM7ejxHLmxlbmd0aDt6Kyspaz1HW3pdLGsucy5kaXNwbGF5ZWQmJnEucHVzaChrLnMuaW5kZXgpO3ZhciBudD1xLmxlbmd0aDtpZihCPT09bnQpTD1CO2Vsc2UgZm9yKHZhciB0dD1CO3R0PjE7dHQtLSl7dmFyIGV0PW50JXR0O2lmKGV0PT09MCl7TD10dCxSPTA7YnJlYWt9ZWxzZSBldD5SJiYoTD10dCxSPWV0KX12YXIgd3Q9UiE9PTA/cS5zbGljZShxLmxlbmd0aC1SLHEubGVuZ3RoKTpbXTt0aGlzLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihrdCl7a3Qucy5kaXNwbGF5ZWQmJmt0LnJlc2l6ZSgiY29sdW1ucy0iKyh3dC5pbmNsdWRlcyhrdC5zLmluZGV4KT9SOkwpKX0pfWVsc2UgZm9yKHZhciBTdD0wLFR0PXRoaXMucy5wYW5lcztTdDxUdC5sZW5ndGg7U3QrKylrPVR0W1N0XSxrLmFkanVzdFRvcFJvdygpO3JldHVybiB0aGlzfSx3LnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihrKXt9LHcucHJvdG90eXBlLl9zZXJ2ZXJUb3RhbHM9ZnVuY3Rpb24oKXt9LHcucHJvdG90eXBlLl9zZXRYSFI9ZnVuY3Rpb24oKXt2YXIgaz10aGlzLFM9dGhpcy5zLmR0LnNldHRpbmdzKClbMF0sQj1mdW5jdGlvbihMKXtMJiZMLnNlYXJjaFBhbmVzJiZMLnNlYXJjaFBhbmVzLm9wdGlvbnMmJihrLnMuc2VydmVyRGF0YT1MLGsucy5zZXJ2ZXJEYXRhLnRhYmxlTGVuZ3RoPUwucmVjb3Jkc1RvdGFsLGsuX3NlcnZlclRvdGFscygpKX07dGhpcy5zLmR0Lm9uKCJ4aHIuZHRzcHMiLGZ1bmN0aW9uKEwsUixxKXtTPT09UiYmQihxKX0pLEIodGhpcy5zLmR0LmFqYXguanNvbigpKX0sdy5wcm90b3R5cGUuX3N0YXRlTG9hZExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcyxTPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdO3RoaXMucy5kdC5vbigic3RhdGVMb2FkUGFyYW1zLmR0c3BzIixmdW5jdGlvbihCLEwsUil7aWYoIShSLnNlYXJjaFBhbmVzPT09dm9pZCAwfHxMIT09Uykpe2lmKGsuY2xlYXJTZWxlY3Rpb25zKCksay5zLnNlbGVjdGlvbkxpc3Q9Ui5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P1Iuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpbXSxSLnNlYXJjaFBhbmVzLnBhbmVzKWZvcih2YXIgcT0wLHo9Ui5zZWFyY2hQYW5lcy5wYW5lcztxPHoubGVuZ3RoO3ErKylmb3IodmFyIEc9eltxXSxudD0wLHR0PWsucy5wYW5lcztudDx0dC5sZW5ndGg7bnQrKyl7dmFyIGV0PXR0W250XTtHLmlkPT09ZXQucy5pbmRleCYmZXQucy5kdFBhbmUmJihldC5kb20uc2VhcmNoQm94LnZhbChHLnNlYXJjaFRlcm0pLGV0LnMuZHRQYW5lLm9yZGVyKEcub3JkZXIpKX1rLl9tYWtlU2VsZWN0aW9ucyhrLnMuc2VsZWN0aW9uTGlzdCl9fSl9LHcucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnMuc2VsZWN0aW9uTGlzdD1bXTtmb3IodmFyIGs9MCxTPXRoaXMucy5wYW5lcztrPFMubGVuZ3RoO2srKyl7dmFyIEI9U1trXTtpZihCLnMuZHRQYW5lKXt2YXIgTD1CLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oUil7cmV0dXJuIFIuZmlsdGVyfSk7TC5sZW5ndGgmJnRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpCLnMuaW5kZXgscm93czpMfSl9fX0sdy5wcm90b3R5cGUuX2F0dGFjaD1mdW5jdGlvbigpe3ZhciBrPXRoaXM7dGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLmRldGFjaCgpLmFwcGVuZCh0aGlzLmRvbS50aXRsZSksdGhpcy5jLmNsZWFyJiZ0aGlzLmRvbS5jbGVhckFsbC5hcHBlbmRUbyh0aGlzLmRvbS50aXRsZVJvdykub2ZmKCJjbGljay5kdHNwcyIpLm9uKCJjbGljay5kdHNwcyIsZnVuY3Rpb24oKXtyZXR1cm4gay5jbGVhclNlbGVjdGlvbnMoKX0pLHRoaXMuYy5jb2xsYXBzZSYmKHRoaXMuZG9tLnNob3dBbGwuYXBwZW5kVG8odGhpcy5kb20udGl0bGVSb3cpLHRoaXMuZG9tLmNvbGxhcHNlQWxsLmFwcGVuZFRvKHRoaXMuZG9tLnRpdGxlUm93KSx0aGlzLl9zZXRDb2xsYXBzZUxpc3RlbmVyKCkpO2Zvcih2YXIgUz0wLEI9dGhpcy5zLnBhbmVzO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO3RoaXMuZG9tLnBhbmVzLmFwcGVuZChMLmRvbS5jb250YWluZXIpfXRoaXMuZG9tLmNvbnRhaW5lci50ZXh0KCIiKS5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSkuYXBwZW5kKHRoaXMuZG9tLnRpdGxlUm93KS5hcHBlbmQodGhpcy5kb20ucGFuZXMpLHRoaXMucy5wYW5lcy5mb3JFYWNoKGZ1bmN0aW9uKFIpe3JldHVybiBSLnNldExpc3RlbmVycygpfSksaCgiZGl2LiIrdGhpcy5jbGFzc2VzLmNvbnRhaW5lcikubGVuZ3RoPT09MCYmdGhpcy5kb20uY29udGFpbmVyLnByZXBlbmRUbyh0aGlzLnMuZHQpfSx3LnByb3RvdHlwZS5fYXR0YWNoTWVzc2FnZT1mdW5jdGlvbigpe3ZhciBrO3RyeXtrPXRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy5lbXB0eVBhbmVzIix0aGlzLmMuaTE4bi5lbXB0eVBhbmVzKX1jYXRjaHtrPW51bGx9aWYoaz09PW51bGwpe3RoaXMuZG9tLmNvbnRhaW5lci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuaGlkZSksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn10aGlzLmRvbS5jb250YWluZXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpLHRoaXMuZG9tLnRpdGxlUm93LmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5oaWRlKSx0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuaHRtbChrKS5hcHBlbmRUbyh0aGlzLmRvbS5jb250YWluZXIpfSx3LnByb3RvdHlwZS5fYXR0YWNoUGFuZUNvbnRhaW5lcj1mdW5jdGlvbigpe2Zvcih2YXIgaz0wLFM9dGhpcy5zLnBhbmVzO2s8Uy5sZW5ndGg7aysrKXt2YXIgQj1TW2tdO2lmKEIucy5kaXNwbGF5ZWQ9PT0hMCl7dGhpcy5fYXR0YWNoKCk7cmV0dXJufX10aGlzLl9hdHRhY2hNZXNzYWdlKCl9LHcucHJvdG90eXBlLl9jaGVja0NvbGxhcHNlPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPSEwLFM9ITAsQj0wLEw9dGhpcy5zLnBhbmVzO0I8TC5sZW5ndGg7QisrKXt2YXIgUj1MW0JdO1Iucy5kaXNwbGF5ZWQmJihSLmRvbS5jb2xsYXBzZUJ1dHRvbi5oYXNDbGFzcyhSLmNsYXNzZXMucm90YXRlZCk/KHRoaXMuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLFM9ITEpOih0aGlzLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksaz0hMSkpfWsmJnRoaXMuZG9tLmNvbGxhcHNlQWxsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikuYXR0cigiZGlzYWJsZWQiLCJ0cnVlIiksUyYmdGhpcy5kb20uc2hvd0FsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpfSx3LnByb3RvdHlwZS5fY2hlY2tNZXNzYWdlPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsUz10aGlzLnMucGFuZXM7azxTLmxlbmd0aDtrKyspe3ZhciBCPVNba107aWYoQi5zLmRpc3BsYXllZD09PSEwKXt0aGlzLmRvbS5lbXB0eU1lc3NhZ2UuZGV0YWNoKCksdGhpcy5kb20udGl0bGVSb3cucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmhpZGUpO3JldHVybn19dGhpcy5fYXR0YWNoTWVzc2FnZSgpfSx3LnByb3RvdHlwZS5fY29sbGFwc2VBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIGs9MCxTPXRoaXMucy5wYW5lcztrPFMubGVuZ3RoO2srKyl7dmFyIEI9U1trXTtCLmNvbGxhcHNlKCl9fSx3LnByb3RvdHlwZS5fZmluZFBhbmU9ZnVuY3Rpb24oayl7Zm9yKHZhciBTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107aWYoaz09PUwucy5uYW1lKXJldHVybiBMfX0sdy5wcm90b3R5cGUuX2dldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGs9dGhpcy5zLmR0LnN0YXRlLmxvYWRlZCgpO2smJmsuc2VhcmNoUGFuZXMmJmsuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PWsuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCl9LHcucHJvdG90eXBlLl9tYWtlU2VsZWN0aW9ucz1mdW5jdGlvbihrKXtmb3IodmFyIFM9MCxCPWs7UzxCLmxlbmd0aDtTKyspe2Zvcih2YXIgTD1CW1NdLFI9dm9pZCAwLHE9MCx6PXRoaXMucy5wYW5lcztxPHoubGVuZ3RoO3ErKyl7dmFyIEc9eltxXTtpZihHLnMuaW5kZXg9PT1MLmNvbHVtbil7Uj1HO2JyZWFrfX1pZihSJiZSLnMuZHRQYW5lKXtmb3IodmFyIG50PTA7bnQ8Ui5zLmR0UGFuZS5yb3dzKCkuZGF0YSgpLnRvQXJyYXkoKS5sZW5ndGg7bnQrKylMLnJvd3MuaW5jbHVkZXModHlwZW9mIFIucy5kdFBhbmUucm93KG50KS5kYXRhKCkuZmlsdGVyPT0iZnVuY3Rpb24iP1Iucy5kdFBhbmUuY2VsbChudCwwKS5kYXRhKCk6Ui5zLmR0UGFuZS5yb3cobnQpLmRhdGEoKS5maWx0ZXIpJiZSLnMuZHRQYW5lLnJvdyhudCkuc2VsZWN0KCk7Ui51cGRhdGVUYWJsZSgpfX19LHcucHJvdG90eXBlLl9wYW5lRGVjbGFyZT1mdW5jdGlvbihrLFMsQil7dmFyIEw9dGhpcztrLmNvbHVtbnModGhpcy5jLmNvbHVtbnMubGVuZ3RoPjA/dGhpcy5jLmNvbHVtbnM6dm9pZCAwKS5lcSgwKS5lYWNoKGZ1bmN0aW9uKEcpe0wucy5wYW5lcy5wdXNoKG5ldyBMLnMucGFuZUNsYXNzKFMsQixHLEwuZG9tLnBhbmVzKSl9KTtmb3IodmFyIFI9ay5jb2x1bW5zKCkuZXEoMCkudG9BcnJheSgpLmxlbmd0aCxxPTA7cTx0aGlzLmMucGFuZXMubGVuZ3RoO3ErKyl7dmFyIHo9UitxO3RoaXMucy5wYW5lcy5wdXNoKG5ldyB0aGlzLnMucGFuZUNsYXNzKFMsQix6LHRoaXMuZG9tLnBhbmVzLHRoaXMuYy5wYW5lc1txXSkpfXRoaXMuYy5vcmRlci5sZW5ndGg+MCYmKHRoaXMucy5wYW5lcz10aGlzLmMub3JkZXIubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBMLl9maW5kUGFuZShHKX0pKSx0aGlzLnMuZHQuc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT90aGlzLl9zdGFydHVwKGspOl8udmVyc2lvbkNoZWNrKCIyIik/dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Jbml0Q29tcGxldGUucHVzaChmdW5jdGlvbigpe3JldHVybiBMLl9zdGFydHVwKGspfSk6dGhpcy5zLmR0LnNldHRpbmdzKClbMF0uYW9Jbml0Q29tcGxldGUucHVzaCh7Zm46ZnVuY3Rpb24oKXtyZXR1cm4gTC5fc3RhcnR1cChrKX19KX0sdy5wcm90b3R5cGUuX3NldENvbGxhcHNlTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgaz10aGlzO3RoaXMuZG9tLmNvbGxhcHNlQWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7ay5fY29sbGFwc2VBbGwoKSxrLmRvbS5jb2xsYXBzZUFsbC5hZGRDbGFzcyhrLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLGsuZG9tLnNob3dBbGwucmVtb3ZlQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpLGsucy5kdC5zdGF0ZS5zYXZlKCl9KSx0aGlzLmRvbS5zaG93QWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7ay5fc2hvd0FsbCgpLGsuZG9tLnNob3dBbGwuYWRkQ2xhc3Moay5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5hdHRyKCJkaXNhYmxlZCIsInRydWUiKSxrLmRvbS5jb2xsYXBzZUFsbC5yZW1vdmVDbGFzcyhrLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLnJlbW92ZUF0dHIoImRpc2FibGVkIiksay5zLmR0LnN0YXRlLnNhdmUoKX0pO2Zvcih2YXIgUz0wLEI9dGhpcy5zLnBhbmVzO1M8Qi5sZW5ndGg7UysrKXt2YXIgTD1CW1NdO0wuZG9tLnRvcFJvdy5vZmYoImNvbGxhcHNlLmR0c3BzIikub24oImNvbGxhcHNlLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBrLl9jaGVja0NvbGxhcHNlKCl9KX10aGlzLl9jaGVja0NvbGxhcHNlKCl9LHcucHJvdG90eXBlLl9zaG93QWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciBrPTAsUz10aGlzLnMucGFuZXM7azxTLmxlbmd0aDtrKyspe3ZhciBCPVNba107Qi5zaG93KCl9fSx3LnByb3RvdHlwZS5fc3RhcnR1cD1mdW5jdGlvbihrKXt2YXIgUz10aGlzO3RoaXMuX2F0dGFjaCgpLHRoaXMuZG9tLnBhbmVzLmVtcHR5KCk7Zm9yKHZhciBCPXRoaXMucy5kdC5zZXR0aW5ncygpWzBdLEw9MCxSPXRoaXMucy5wYW5lcztMPFIubGVuZ3RoO0wrKyl7dmFyIHE9UltMXTtxLnJlYnVpbGRQYW5lKE9iamVjdC5rZXlzKHRoaXMucy5zZXJ2ZXJEYXRhKS5sZW5ndGg+MD90aGlzLnMuc2VydmVyRGF0YTp2b2lkIDApLHRoaXMuZG9tLnBhbmVzLmFwcGVuZChxLmRvbS5jb250YWluZXIpfXRoaXMuYy5sYXlvdXQ9PT0iYXV0byImJnRoaXMucmVzaXplUGFuZXMoKTt2YXIgej10aGlzLnMuZHQuc3RhdGUubG9hZGVkKCk7IXRoaXMucy5zdGF0ZVJlYWQmJnomJnRoaXMucy5kdC5wYWdlKHouc3RhcnQvdGhpcy5zLmR0LnBhZ2UubGVuKCkpLmRyYXcoInBhZ2UiKSx0aGlzLnMuc3RhdGVSZWFkPSEwLHRoaXMuX2NoZWNrTWVzc2FnZSgpLGsub24oInByZURyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7IVMucy51cGRhdGluZyYmIVMucy5wYWdpbmcmJihTLl91cGRhdGVGaWx0ZXJDb3VudCgpLFMuX3VwZGF0ZVNlbGVjdGlvbigpKSxTLnMucGFnaW5nPSExfSksaCh3aW5kb3cpLm9uKCJyZXNpemUuZHRzcHMiLF8udXRpbC50aHJvdHRsZShmdW5jdGlvbigpe3JldHVybiBTLnJlc2l6ZVBhbmVzKCl9KSksdGhpcy5zLmR0Lm9uKCJzdGF0ZVNhdmVQYXJhbXMuZHRzcHMiLGZ1bmN0aW9uKG50LHR0LGV0KXt0dD09PUImJihldC5zZWFyY2hQYW5lcz09PXZvaWQgMCYmKGV0LnNlYXJjaFBhbmVzPXt9KSxldC5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0PVMucy5zZWxlY3Rpb25MaXN0KX0pLHRoaXMuX3N0YXRlTG9hZExpc3RlbmVyKCksay5vZmYoInBhZ2UuZHRzcHMgcGFnZS1uYy5kdHNwcyIpLm9uKCJwYWdlLmR0c3BzIHBhZ2UtbmMuZHRzcHMiLGZ1bmN0aW9uKG50LHR0KXtTLnMucGFnaW5nPSEwLFMucy5wYWdpbmdTVD0hMCxTLnMucGFnZT1TLnMuZHQucGFnZSgpfSksdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGU/ay5vZmYoInByZVhoci5kdHNwcyIpLm9uKCJwcmVYaHIuZHRzcHMiLGZ1bmN0aW9uKG50LHR0LGV0KXtpZih0dD09PUIpe2V0LnNlYXJjaFBhbmVzfHwoZXQuc2VhcmNoUGFuZXM9e30pLGV0LnNlYXJjaFBhbmVzX251bGx8fChldC5zZWFyY2hQYW5lc19udWxsPXt9KTtmb3IodmFyIHd0PTAsU3Q9MCxUdD1TLnMucGFuZXM7U3Q8VHQubGVuZ3RoO1N0Kyspe3ZhciBrdD1UdFtTdF0sTHQ9Uy5zLmR0LmNvbHVtbihrdC5zLmluZGV4KS5kYXRhU3JjKCk7aWYoZXQuc2VhcmNoUGFuZXNbTHRdfHwoZXQuc2VhcmNoUGFuZXNbTHRdPXt9KSxldC5zZWFyY2hQYW5lc19udWxsW0x0XXx8KGV0LnNlYXJjaFBhbmVzX251bGxbTHRdPXt9KSxrdC5zLmR0UGFuZSlmb3IodmFyIEJ0PWt0LnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKSwkdD0wOyR0PEJ0Lmxlbmd0aDskdCsrKWV0LnNlYXJjaFBhbmVzW0x0XVskdF09QnRbJHRdLmZpbHRlcixldC5zZWFyY2hQYW5lc1tMdF1bJHRdP2V0LnNlYXJjaFBhbmVzX251bGxbTHRdWyR0XT0hMTpldC5zZWFyY2hQYW5lc19udWxsW0x0XVskdF09ITAsd3QrK313dD4wJiYod3QhPT1TLnMuZmlsdGVyQ291bnQ/KGV0LnN0YXJ0PTAsUy5zLnBhZ2U9MCk6ZXQuc3RhcnQ9Uy5zLnBhZ2UqUy5zLmR0LnBhZ2UubGVuKCksUy5zLmR0LnBhZ2UoUy5zLnBhZ2UpLFMucy5maWx0ZXJDb3VudD13dCksUy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoPjAmJihldC5zZWFyY2hQYW5lc0xhc3Q9Uy5zLmR0LmNvbHVtbihTLnMuc2VsZWN0aW9uTGlzdFtTLnMuc2VsZWN0aW9uTGlzdC5sZW5ndGgtMV0uY29sdW1uKS5kYXRhU3JjKCkpLGV0LnNlYXJjaFBhbmVzX29wdGlvbnM9e2Nhc2NhZGU6Uy5jLmNhc2NhZGVQYW5lcyx2aWV3Q291bnQ6Uy5jLnZpZXdDb3VudCx2aWV3VG90YWw6Uy5jLnZpZXdUb3RhbH19fSk6ay5vbigicHJlWGhyLmR0c3BzIixmdW5jdGlvbigpe3JldHVybiBTLnMucGFuZXMuZm9yRWFjaChmdW5jdGlvbihudCl7cmV0dXJuIG50LmNsZWFyRGF0YSgpfSl9KSx0aGlzLnMuZHQub24oInhoci5kdHNwcyIsZnVuY3Rpb24obnQsdHQpe2lmKHR0Lm5UYWJsZT09PVMucy5kdC50YWJsZSgpLm5vZGUoKSYmIVMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlKXt2YXIgZXQ9ITE7Uy5zLmR0Lm9uZSgicHJlRHJhdy5kdHNwcyIsZnVuY3Rpb24oKXtpZighZXQpe3ZhciB3dD1TLnMuZHQucGFnZSgpO2V0PSEwLFMucy51cGRhdGluZz0hMCxTLmRvbS5wYW5lcy5lbXB0eSgpO2Zvcih2YXIgU3Q9MCxUdD1TLnMucGFuZXM7U3Q8VHQubGVuZ3RoO1N0Kyspe3ZhciBrdD1UdFtTdF07a3QuY2xlYXJEYXRhKCksa3QucmVidWlsZFBhbmUodm9pZCAwLCEwKSxTLmRvbS5wYW5lcy5hcHBlbmQoa3QuZG9tLmNvbnRhaW5lcil9Uy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGV8fFMucy5kdC5kcmF3KCksUy5zLnVwZGF0aW5nPSExLFMuX3VwZGF0ZVNlbGVjdGlvbigpLFMuX2NoZWNrTWVzc2FnZSgpLFMucy5kdC5vbmUoImRyYXcuZHRzcHMiLGZ1bmN0aW9uKCl7Uy5zLnVwZGF0aW5nPSEwLFMucy5kdC5wYWdlKHd0KS5kcmF3KCExKSxTLnMudXBkYXRpbmc9ITF9KX19KX19KTt2YXIgRz10aGlzLmMucHJlU2VsZWN0O3omJnouc2VhcmNoUGFuZXMmJnouc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdCYmKEc9ei5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0KSx0aGlzLl9tYWtlU2VsZWN0aW9ucyhHKSx0aGlzLl91cGRhdGVGaWx0ZXJDb3VudCgpLGsub24oImRlc3Ryb3kuZHRzcHMiLGZ1bmN0aW9uKG50LHR0KXtpZih0dD09PUIpe2Zvcih2YXIgZXQ9MCx3dD1TLnMucGFuZXM7ZXQ8d3QubGVuZ3RoO2V0Kyspe3ZhciBTdD13dFtldF07U3QuZGVzdHJveSgpfWsub2ZmKCIuZHRzcHMiKSxTLmRvbS5zaG93QWxsLm9mZigiLmR0c3BzIiksUy5kb20uY2xlYXJBbGwub2ZmKCIuZHRzcHMiKSxTLmRvbS5jb2xsYXBzZUFsbC5vZmYoIi5kdHNwcyIpLGgoay50YWJsZSgpLm5vZGUoKSkub2ZmKCIuZHRzcHMiKSxTLmRvbS5jb250YWluZXIuZGV0YWNoKCksUy5jbGVhclNlbGVjdGlvbnMoKX19KSx0aGlzLmMuY29sbGFwc2UmJnRoaXMuX3NldENvbGxhcHNlTGlzdGVuZXIoKSx0aGlzLmMuY2xlYXImJnRoaXMuZG9tLmNsZWFyQWxsLm9mZigiY2xpY2suZHRzcHMiKS5vbigiY2xpY2suZHRzcHMiLGZ1bmN0aW9uKCl7cmV0dXJuIFMuY2xlYXJTZWxlY3Rpb25zKCl9KSxCLl9zZWFyY2hQYW5lcz10aGlzLHRoaXMucy5kdC5zdGF0ZS5zYXZlKCl9LHcucHJvdG90eXBlLl91cGRhdGVGaWx0ZXJDb3VudD1mdW5jdGlvbigpe2Zvcih2YXIgaz0wLFM9MCxCPTAsTD10aGlzLnMucGFuZXM7QjxMLmxlbmd0aDtCKyspe3ZhciBSPUxbQl07Ui5zLmR0UGFuZSYmKGsrPVIuZ2V0UGFuZUNvdW50KCksUi5zLmR0UGFuZS5zZWFyY2goKSYmUysrKX10aGlzLmRvbS50aXRsZS5odG1sKHRoaXMucy5kdC5pMThuKCJzZWFyY2hQYW5lcy50aXRsZSIsdGhpcy5jLmkxOG4udGl0bGUsaykpLHRoaXMuYy5maWx0ZXJDaGFuZ2VkJiZ0eXBlb2YgdGhpcy5jLmZpbHRlckNoYW5nZWQ9PSJmdW5jdGlvbiImJnRoaXMuYy5maWx0ZXJDaGFuZ2VkLmNhbGwodGhpcy5zLmR0LGspLGs9PT0wJiZTPT09MD90aGlzLmRvbS5jbGVhckFsbC5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpOnRoaXMuZG9tLmNsZWFyQWxsLnJlbW92ZUNsYXNzKHRoaXMuY2xhc3Nlcy5kaXNhYmxlZEJ1dHRvbikucmVtb3ZlQXR0cigiZGlzYWJsZWQiKX0sdy52ZXJzaW9uPSIyLjMuMiIsdy5jbGFzc2VzPXtjbGVhcjoiZHRzcC1jbGVhciIsY2xlYXJBbGw6ImR0c3AtY2xlYXJBbGwiLGNvbGxhcHNlQWxsOiJkdHNwLWNvbGxhcHNlQWxsIixjb250YWluZXI6ImR0c3Atc2VhcmNoUGFuZXMiLGRpc2FibGVkQnV0dG9uOiJkdHNwLWRpc2FibGVkQnV0dG9uIixlbXB0eU1lc3NhZ2U6ImR0c3AtZW1wdHlNZXNzYWdlIixoaWRlOiJkdHNwLWhpZGRlbiIscGFuZXM6ImR0c3AtcGFuZXNDb250YWluZXIiLHNlYXJjaDoiZHRzcC1zZWFyY2giLHNob3dBbGw6ImR0c3Atc2hvd0FsbCIsdGl0bGU6ImR0c3AtdGl0bGUiLHRpdGxlUm93OiJkdHNwLXRpdGxlUm93In0sdy5kZWZhdWx0cz17Y2FzY2FkZVBhbmVzOiExLGNsZWFyOiEwLGNvbGxhcHNlOiEwLGNvbHVtbnM6W10sY29udGFpbmVyOmZ1bmN0aW9uKGspe3JldHVybiBrLnRhYmxlKCkuY29udGFpbmVyKCl9LGZpbHRlckNoYW5nZWQ6dm9pZCAwLGkxOG46e2NsZWFyTWVzc2FnZToiQ2xlYXIgQWxsIixjbGVhclBhbmU6IiZ0aW1lczsiLGNvbGxhcHNlOnswOiJTZWFyY2hQYW5lcyIsXzoiU2VhcmNoUGFuZXMgKCVkKSJ9LGNvbGxhcHNlTWVzc2FnZToiQ29sbGFwc2UgQWxsIixjb3VudDoie3RvdGFsfSIsZW1wdHlNZXNzYWdlOiI8ZW0+Tm8gZGF0YTwvZW0+IixlbXB0eVBhbmVzOiJObyBTZWFyY2hQYW5lcyIsbG9hZE1lc3NhZ2U6IkxvYWRpbmcgU2VhcmNoIFBhbmVzLi4uIixzaG93TWVzc2FnZToiU2hvdyBBbGwiLHRpdGxlOiJGaWx0ZXJzIEFjdGl2ZSAtICVkIn0sbGF5b3V0OiJhdXRvIixvcmRlcjpbXSxwYW5lczpbXSxwcmVTZWxlY3Q6W10sdmlld0NvdW50OiEwLHZpZXdUb3RhbDohMX0sd30oKSxmPXdpbmRvdyYmd2luZG93Ll9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXt2YXIgdz1mdW5jdGlvbihrLFMpe3JldHVybiB3PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihCLEwpe0IuX19wcm90b19fPUx9fHxmdW5jdGlvbihCLEwpe2Zvcih2YXIgUiBpbiBMKUwuaGFzT3duUHJvcGVydHkoUikmJihCW1JdPUxbUl0pfSx3KGssUyl9O3JldHVybiBmdW5jdGlvbihrLFMpe3coayxTKTtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1rfWsucHJvdG90eXBlPVM9PT1udWxsP09iamVjdC5jcmVhdGUoUyk6KEIucHJvdG90eXBlPVMucHJvdG90eXBlLG5ldyBCKX19KCksVT1mdW5jdGlvbih3KXtmKGssdyk7ZnVuY3Rpb24gayhTLEIsTCl7TD09PXZvaWQgMCYmKEw9ITEpO3ZhciBSPXRoaXMscTtCLmNhc2NhZGVQYW5lcyYmQi52aWV3VG90YWw/cT1sOkIuY2FzY2FkZVBhbmVzP3E9eTpCLnZpZXdUb3RhbCYmKHE9YiksUj13LmNhbGwodGhpcyxTLEIsTCxxKXx8dGhpczt2YXIgej1SLnMuZHQsRz16LnN0YXRlLmxvYWRlZCgpLG50PWZ1bmN0aW9uKCl7cmV0dXJuIFIuX2luaXRTZWxlY3Rpb25MaXN0ZW5lcnMoITAsRyYmRy5zZWFyY2hQYW5lcyYmRy5zZWFyY2hQYW5lcy5zZWxlY3Rpb25MaXN0P0cuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdDpSLmMucHJlU2VsZWN0KX07cmV0dXJuIHouc2V0dGluZ3MoKVswXS5fYkluaXRDb21wbGV0ZT9udCgpOnoub2ZmKCJpbml0LmR0c3BzIikub24oImluaXQuZHRzcHMiLG50KSxSfXJldHVybiBrLnByb3RvdHlwZS5faW5pdFNlbGVjdGlvbkxpc3RlbmVycz1mdW5jdGlvbihTLEIpe1M9PT12b2lkIDAmJihTPSEwKSxCPT09dm9pZCAwJiYoQj1bXSksUyYmKHRoaXMucy5zZWxlY3Rpb25MaXN0PUIpO2Zvcih2YXIgTD0wLFI9dGhpcy5zLnBhbmVzO0w8Ui5sZW5ndGg7TCsrKXt2YXIgcT1SW0xdO3Eucy5kaXNwbGF5ZWQmJnEucy5kdFBhbmUub2ZmKCJzZWxlY3QuZHRzcCIpLm9uKCJzZWxlY3QuZHRzcCIsdGhpcy5fdXBkYXRlKHEpKS5vZmYoImRlc2VsZWN0LmR0c3AiKS5vbigiZGVzZWxlY3QuZHRzcCIsdGhpcy5fdXBkYXRlVGltZW91dChxKSl9dGhpcy5zLmR0Lm9mZigiZHJhdy5kdHNwcyIpLm9uKCJkcmF3LmR0c3BzIix0aGlzLl91cGRhdGUoKSksdGhpcy5fdXBkYXRlU2VsZWN0aW9uTGlzdCgpfSxrLnByb3RvdHlwZS5fc2VydmVyVG90YWxzPWZ1bmN0aW9uKCl7Zm9yKHZhciBTPTAsQj10aGlzLnMucGFuZXM7UzxCLmxlbmd0aDtTKyspe3ZhciBMPUJbU107aWYoTC5zLmNvbE9wdHMuc2hvdyl7dmFyIFI9dGhpcy5zLmR0LmNvbHVtbihMLnMuaW5kZXgpLmRhdGFTcmMoKSxxPSEwO2lmKHRoaXMucy5zZXJ2ZXJEYXRhLnNlYXJjaFBhbmVzLm9wdGlvbnNbUl0pZm9yKHZhciB6PTAsRz10aGlzLnMuc2VydmVyRGF0YS5zZWFyY2hQYW5lcy5vcHRpb25zW1JdO3o8Ry5sZW5ndGg7eisrKXt2YXIgbnQ9R1t6XTtpZihudC50b3RhbCE9PW50LmNvdW50KXtxPSExO2JyZWFrfX1MLnMuZmlsdGVyaW5nQWN0aXZlPSFxLEwuX3NlcnZlclBvcHVsYXRlKHRoaXMucy5zZXJ2ZXJEYXRhKX19fSxrLnByb3RvdHlwZS5fc3RhdGVMb2FkTGlzdGVuZXI9ZnVuY3Rpb24oKXt2YXIgUz10aGlzLEI9ZnVuY3Rpb24oTCxSLHEpe2lmKHEuc2VhcmNoUGFuZXMhPT12b2lkIDApe2lmKFMucy5zZWxlY3Rpb25MaXN0PXEuc2VhcmNoUGFuZXMuc2VsZWN0aW9uTGlzdD9xLnNlYXJjaFBhbmVzLnNlbGVjdGlvbkxpc3Q6W10scS5zZWFyY2hQYW5lcy5wYW5lcylmb3IodmFyIHo9MCxHPXEuc2VhcmNoUGFuZXMucGFuZXM7ejxHLmxlbmd0aDt6KyspZm9yKHZhciBudD1HW3pdLHR0PTAsZXQ9Uy5zLnBhbmVzO3R0PGV0Lmxlbmd0aDt0dCsrKXt2YXIgd3Q9ZXRbdHRdO250LmlkPT09d3Qucy5pbmRleCYmd3Qucy5kdFBhbmUmJih3dC5kb20uc2VhcmNoQm94LnZhbChudC5zZWFyY2hUZXJtKSx3dC5zLmR0UGFuZS5vcmRlcihudC5vcmRlcikpfVMuX3VwZGF0ZVNlbGVjdGlvbkxpc3QoKX19O3RoaXMucy5kdC5vZmYoInN0YXRlTG9hZFBhcmFtcy5kdHNwcyIsQikub24oInN0YXRlTG9hZFBhcmFtcy5kdHNwcyIsQil9LGsucHJvdG90eXBlLl91cGRhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt9LGsucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oUyl7dmFyIEI9dGhpcztyZXR1cm4gUz09PXZvaWQgMCYmKFM9dm9pZCAwKSxmdW5jdGlvbigpe1MmJmNsZWFyVGltZW91dChTLnMuZGVzZWxlY3RUaW1lb3V0KSxCLl91cGRhdGVTZWxlY3Rpb25MaXN0KFMpfX0say5wcm90b3R5cGUuX3VwZGF0ZVRpbWVvdXQ9ZnVuY3Rpb24oUyl7dmFyIEI9dGhpcztyZXR1cm4gUz09PXZvaWQgMCYmKFM9dm9pZCAwKSxmdW5jdGlvbigpe3JldHVybiBTP1Mucy5kZXNlbGVjdFRpbWVvdXQ9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBCLl91cGRhdGVTZWxlY3Rpb25MaXN0KFMpfSw1MCk6Qi5fdXBkYXRlU2VsZWN0aW9uTGlzdCgpfX0say5wcm90b3R5cGUuX3VwZGF0ZVNlbGVjdGlvbkxpc3Q9ZnVuY3Rpb24oUyl7aWYoUz09PXZvaWQgMCYmKFM9dm9pZCAwKSx0aGlzLnMucGFnaW5nU1Qpe3RoaXMucy5wYWdpbmdTVD0hMTtyZXR1cm59ZWxzZSBpZih0aGlzLnMudXBkYXRpbmd8fFMmJlMucy5zZXJ2ZXJTZWxlY3RpbmcpcmV0dXJuO2lmKFMhPT12b2lkIDApe3RoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZTLl91cGRhdGVTZWxlY3Rpb24oKTt2YXIgQj1TLnMuZHRQYW5lLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGF0YSgpLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIEwuZmlsdGVyfSk7dGhpcy5zLnNlbGVjdGlvbkxpc3Q9dGhpcy5zLnNlbGVjdGlvbkxpc3QuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBMLmNvbHVtbiE9PVMucy5pbmRleH0pLEIubGVuZ3RoPjA/KHRoaXMucy5zZWxlY3Rpb25MaXN0LnB1c2goe2NvbHVtbjpTLnMuaW5kZXgscm93czpCfSksUy5kb20uY2xlYXIucmVtb3ZlQ2xhc3ModGhpcy5jbGFzc2VzLmRpc2FibGVkQnV0dG9uKS5yZW1vdmVBdHRyKCJkaXNhYmxlZCIpKTpTLmRvbS5jbGVhci5hZGRDbGFzcyh0aGlzLmNsYXNzZXMuZGlzYWJsZWRCdXR0b24pLmF0dHIoImRpc2FibGVkIiwidHJ1ZSIpLHRoaXMucy5kdC5wYWdlLmluZm8oKS5zZXJ2ZXJTaWRlJiZ0aGlzLnMuZHQuZHJhdyghMSl9dGhpcy5fcmVtYWtlU2VsZWN0aW9ucygpLHRoaXMuX3VwZGF0ZUZpbHRlckNvdW50KCl9LGsucHJvdG90eXBlLl9yZW1ha2VTZWxlY3Rpb25zPWZ1bmN0aW9uKCl7dmFyIFMsQjtpZih0aGlzLnMudXBkYXRpbmc9ITAsdGhpcy5zLmR0LnBhZ2UuaW5mbygpLnNlcnZlclNpZGUpe3RoaXMucy5zZWxlY3Rpb25MaXN0Lmxlbmd0aD4wJiYoQj10aGlzLnMucGFuZXNbdGhpcy5zLnNlbGVjdGlvbkxpc3RbdGhpcy5zLnNlbGVjdGlvbkxpc3QubGVuZ3RoLTFdLmNvbHVtbl0pO2Zvcih2YXIgQ3Q9MCx4dD10aGlzLnMucGFuZXM7Q3Q8eHQubGVuZ3RoO0N0KyspUz14dFtDdF0sUy5zLmRpc3BsYXllZCYmKCFCfHxTLnMuaW5kZXghPT1CLnMuaW5kZXgpJiZTLnVwZGF0ZVJvd3MoKX1lbHNle3ZhciBMPXRoaXMucy5zZWxlY3Rpb25MaXN0LFI9ITE7dGhpcy5jbGVhclNlbGVjdGlvbnMoKSx0aGlzLnMuZHQuZHJhdyghMSksdGhpcy5zLmR0LnJvd3MoKS50b0FycmF5KClbMF0ubGVuZ3RoPnRoaXMucy5kdC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkudG9BcnJheSgpWzBdLmxlbmd0aCYmKFI9ITApLHRoaXMucy5zZWxlY3Rpb25MaXN0PUw7Zm9yKHZhciBxPTAsej10aGlzLnMucGFuZXM7cTx6Lmxlbmd0aDtxKyspQj16W3FdLEIucy5kaXNwbGF5ZWQmJihCLnMuZmlsdGVyaW5nQWN0aXZlPVIsQi51cGRhdGVSb3dzKCkpO2Zvcih2YXIgRz0wLG50PXRoaXMucy5zZWxlY3Rpb25MaXN0O0c8bnQubGVuZ3RoO0crKyl7dmFyIHR0PW50W0ddO0I9bnVsbDtmb3IodmFyIGV0PTAsd3Q9dGhpcy5zLnBhbmVzO2V0PHd0Lmxlbmd0aDtldCsrKXt2YXIgU3Q9d3RbZXRdO2lmKFN0LnMuaW5kZXg9PT10dC5jb2x1bW4pe0I9U3Q7YnJlYWt9fWlmKEIucy5kdFBhbmUpe2Zvcih2YXIgVHQ9Qi5zLmR0UGFuZS5yb3dzKCkuaW5kZXhlcygpLnRvQXJyYXkoKSxrdD0wO2t0PHR0LnJvd3MubGVuZ3RoO2t0Kyspe2Zvcih2YXIgTHQ9ITEsQnQ9MCwkdD1UdDtCdDwkdC5sZW5ndGg7QnQrKyl7dmFyIEt0PSR0W0J0XSxEPUIucy5kdFBhbmUucm93KEt0KSx1dD1ELmRhdGEoKTt0dC5yb3dzW2t0XT09PXV0LmZpbHRlciYmKEQuc2VsZWN0KCksTHQ9ITApfUx0fHwodHQucm93cy5zcGxpY2Uoa3QsMSksa3QtLSl9aWYoQi5zLnNlbGVjdGlvbnM9dHQucm93cyx0dC5yb3dzLmxlbmd0aCE9PTApe3RoaXMucy5kdC5kcmF3KCk7Zm9yKHZhciBvdD0hMSxWPTAsaj0wLEs9MCxwdD0wLHZ0PXRoaXMucy5wYW5lcztwdDx2dC5sZW5ndGg7cHQrKylTPXZ0W3B0XSxTLnMuZHRQYW5lJiYoVis9Uy5nZXRQYW5lQ291bnQoKSxWPmomJihLKyssaj1WKSk7b3Q9Vj4wO2Zvcih2YXIgcnQ9MCxndD10aGlzLnMucGFuZXM7cnQ8Z3QubGVuZ3RoO3J0KyspUz1ndFtydF0sUy5zLmRpc3BsYXllZCYmKFJ8fEIucy5pbmRleCE9PVMucy5pbmRleHx8IW90P1Mucy5maWx0ZXJpbmdBY3RpdmU9b3R8fFI6Sz09PTEmJihTLnMuZmlsdGVyaW5nQWN0aXZlPSExKSxTLnMuaW5kZXghPT1CLnMuaW5kZXgmJlMudXBkYXRlUm93cygpKX19fXRoaXMucy5kdC5kcmF3KCExKX10aGlzLnMudXBkYXRpbmc9ITF9LGt9KE8pO24oWmUpLEYoWmUpLHAoWmUpLEMoWmUpLGMoWmUpO3ZhciBYPVplLmZuLmRhdGFUYWJsZTtYLlNlYXJjaFBhbmVzPU8sYXQuU2VhcmNoUGFuZXM9TyxYLlNlYXJjaFBhbmVzU1Q9VSxhdC5TZWFyY2hQYW5lc1NUPVUsWC5TZWFyY2hQYW5lPXIsYXQuU2VhcmNoUGFuZT1yLFguU2VhcmNoUGFuZVZpZXdUb3RhbD1iLGF0LlNlYXJjaFBhbmVWaWV3VG90YWw9YixYLlNlYXJjaFBhbmVDYXNjYWRlPXksYXQuU2VhcmNoUGFuZUNhc2NhZGU9eSxYLlNlYXJjaFBhbmVDYXNjYWRlVmlld1RvdGFsPWwsYXQuU2VhcmNoUGFuZUNhc2NhZGVWaWV3VG90YWw9bDt2YXIgUT1aZS5mbi5kYXRhVGFibGUuQXBpLnJlZ2lzdGVyO1EoInNlYXJjaFBhbmVzKCkiLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSxRKCJzZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHcpe3cuX3NlYXJjaFBhbmVzJiZ3Ll9zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0pfSksUSgic2VhcmNoUGFuZXMucmVidWlsZFBhbmUoKSIsZnVuY3Rpb24odyxrKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKFMpe1MuX3NlYXJjaFBhbmVzJiZTLl9zZWFyY2hQYW5lcy5yZWJ1aWxkKHcsayl9KX0pLFEoInNlYXJjaFBhbmVzLnJlc2l6ZVBhbmVzKCkiLGZ1bmN0aW9uKCl7dmFyIHc9dGhpcy5jb250ZXh0WzBdO3JldHVybiB3Ll9zZWFyY2hQYW5lcz93Ll9zZWFyY2hQYW5lcy5yZXNpemVQYW5lcygpOm51bGx9KSxRKCJzZWFyY2hQYW5lcy5jb250YWluZXIoKSIsZnVuY3Rpb24oKXt2YXIgdz10aGlzLmNvbnRleHRbMF07cmV0dXJuIHcuX3NlYXJjaFBhbmVzP3cuX3NlYXJjaFBhbmVzLmdldE5vZGUoKTpudWxsfSksYXQuZXh0LmJ1dHRvbnMuc2VhcmNoUGFuZXNDbGVhcj17YWN0aW9uOmZ1bmN0aW9uKHcsayl7ay5zZWFyY2hQYW5lcy5jbGVhclNlbGVjdGlvbnMoKX0sdGV4dDoiQ2xlYXIgUGFuZXMifSxhdC5leHQuYnV0dG9ucy5zZWFyY2hQYW5lcz17YWN0aW9uOmZ1bmN0aW9uKHcsayxTLEIpe3ZhciBMPXRoaXMsUj10aGlzO0IuX3BhbmVzPyh0aGlzLnBvcG92ZXIoQi5fcGFuZXMuZ2V0Tm9kZSgpLHthbGlnbjoiY29udGFpbmVyIixzcGFuOiJjb250YWluZXIifSksQi5fcGFuZXMucmVidWlsZCh2b2lkIDAsITApKToodGhpcy5wcm9jZXNzaW5nKCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7RShrLFMsQiksTC5wb3BvdmVyKEIuX3BhbmVzLmdldE5vZGUoKSx7YWxpZ246ImNvbnRhaW5lciIsc3BhbjoiY29udGFpbmVyIn0pLEIuX3BhbmVzLnJlYnVpbGQodm9pZCAwLCEwKSxaZSgidGFibGUuZGF0YVRhYmxlIixCLl9wYW5lcy5nZXROb2RlKCkpLkRhdGFUYWJsZSgpLmNvbHVtbnMuYWRqdXN0KCksUi5wcm9jZXNzaW5nKCExKX0sMTApKX0saW5pdDpmdW5jdGlvbih3LGssUyl7dy5idXR0b24oaykudGV4dChTLnRleHR8fHcuaTE4bigic2VhcmNoUGFuZXMuY29sbGFwc2UiLCJTZWFyY2hQYW5lcyIsMCkpLCh3LmluaXQoKS5zdGF0ZVNhdmV8fFMuZGVsYXlJbml0PT09ITEpJiZFKHcsayxTKX0sY29uZmlnOnt9LHRleHQ6IiIsZGVsYXlJbml0OiEwfTtmdW5jdGlvbiBFKHcsayxTKXt2YXIgQj1aZS5leHRlbmQoe2ZpbHRlckNoYW5nZWQ6ZnVuY3Rpb24oUil7dy5idXR0b24oaykudGV4dCh3LmkxOG4oInNlYXJjaFBhbmVzLmNvbGxhcHNlIix3LmNvbnRleHRbMF0ub0xhbmd1YWdlLnNlYXJjaFBhbmVzIT09dm9pZCAwP3cuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc2VhcmNoUGFuZXMuY29sbGFwc2U6dy5jb250ZXh0WzBdLl9zZWFyY2hQYW5lcy5jLmkxOG4uY29sbGFwc2UsUikpfX0sUy5jb25maWcpLEw9QiYmKEIuY2FzY2FkZVBhbmVzfHxCLnZpZXdUb3RhbCk/bmV3IGF0LlNlYXJjaFBhbmVzU1QodyxCKTpuZXcgYXQuU2VhcmNoUGFuZXModyxCKTt3LmJ1dHRvbihrKS50ZXh0KFMudGV4dHx8dy5pMThuKCJzZWFyY2hQYW5lcy5jb2xsYXBzZSIsTC5jLmkxOG4uY29sbGFwc2UsMCkpLFMuX3BhbmVzPUx9ZnVuY3Rpb24gJCh3LGssUyl7az09PXZvaWQgMCYmKGs9bnVsbCksUz09PXZvaWQgMCYmKFM9ITEpO3ZhciBCPW5ldyBYLkFwaSh3KSxMPWt8fEIuaW5pdCgpLnNlYXJjaFBhbmVzfHxYLmRlZmF1bHRzLnNlYXJjaFBhbmVzLFI9TCYmKEwuY2FzY2FkZVBhbmVzfHxMLnZpZXdUb3RhbCk/bmV3IFUoQixMLFMpOm5ldyBPKEIsTCxTKSxxPVIuZ2V0Tm9kZSgpO3JldHVybiBxfVplKGRvY3VtZW50KS5vbigicHJlSW5pdC5kdC5kdHNwIixmdW5jdGlvbih3LGspe3cubmFtZXNwYWNlPT09ImR0IiYmKGsub0luaXQuc2VhcmNoUGFuZXN8fGF0LmRlZmF1bHRzLnNlYXJjaFBhbmVzKSYmKGsuX3NlYXJjaFBhbmVzfHwkKGssbnVsbCwhMCkpfSksYXQuZXh0LmZlYXR1cmUucHVzaCh7Y0ZlYXR1cmU6IlAiLGZuSW5pdDokfSksYXQuZmVhdHVyZSYmYXQuZmVhdHVyZS5yZWdpc3Rlcigic2VhcmNoUGFuZXMiLCQpfSkoKTt2YXIgZGQ9aWUoYWUoKSwxKTt2YXIgZW89aWUoYWUoKSwxKTt2YXIgRXQ9ZW8uZGVmYXVsdDthdC5zZWxlY3Q9e307YXQuc2VsZWN0LmNsYXNzZXM9e2NoZWNrYm94OiJkdC1zZWxlY3QtY2hlY2tib3gifTthdC5zZWxlY3QudmVyc2lvbj0iMi4wLjUiO2F0LnNlbGVjdC5pbml0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2V0dGluZ3MoKVswXTtpZighYXQudmVyc2lvbkNoZWNrKCIyIikpdGhyb3ciV2FybmluZzogU2VsZWN0IHJlcXVpcmVzIERhdGFUYWJsZXMgMiBvciBuZXdlciI7aWYoIWUuX3NlbGVjdCl7dmFyIG49dC5zdGF0ZS5sb2FkZWQoKSxyPWZ1bmN0aW9uKGMsbCxoKXtpZighKGg9PT1udWxsfHxoLnNlbGVjdD09PXZvaWQgMCkpe2lmKHQucm93cyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKSYmdC5yb3dzKCkuZGVzZWxlY3QoKSxoLnNlbGVjdC5yb3dzIT09dm9pZCAwJiZ0LnJvd3MoaC5zZWxlY3Qucm93cykuc2VsZWN0KCksdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmFueSgpJiZ0LmNvbHVtbnMoKS5kZXNlbGVjdCgpLGguc2VsZWN0LmNvbHVtbnMhPT12b2lkIDAmJnQuY29sdW1ucyhoLnNlbGVjdC5jb2x1bW5zKS5zZWxlY3QoKSx0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiZ0LmNlbGxzKCkuZGVzZWxlY3QoKSxoLnNlbGVjdC5jZWxscyE9PXZvaWQgMClmb3IodmFyIF89MDtfPGguc2VsZWN0LmNlbGxzLmxlbmd0aDtfKyspdC5jZWxsKGguc2VsZWN0LmNlbGxzW19dLnJvdyxoLnNlbGVjdC5jZWxsc1tfXS5jb2x1bW4pLnNlbGVjdCgpO3Quc3RhdGUuc2F2ZSgpfX07dC5vbigic3RhdGVTYXZlUGFyYW1zIixmdW5jdGlvbihjLGwsaCl7aC5zZWxlY3Q9e30saC5zZWxlY3Qucm93cz10LnJvd3Moe3NlbGVjdGVkOiEwfSkuaWRzKCEwKS50b0FycmF5KCksaC5zZWxlY3QuY29sdW1ucz10LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSlbMF0saC5zZWxlY3QuY2VsbHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KVswXS5tYXAoZnVuY3Rpb24oXyl7cmV0dXJue3Jvdzp0LnJvdyhfLnJvdykuaWQoITApLGNvbHVtbjpfLmNvbHVtbn19KX0pLm9uKCJzdGF0ZUxvYWRQYXJhbXMiLHIpLm9uZSgiaW5pdCIsZnVuY3Rpb24oKXtyKHZvaWQgMCx2b2lkIDAsbil9KTt2YXIgcz1lLm9Jbml0LnNlbGVjdCxpPWF0LmRlZmF1bHRzLnNlbGVjdCxvPXM9PT12b2lkIDA/aTpzLHU9InJvdyIscD0iYXBpIixiPSExLGc9ITAsbT0hMCxDPSJ0ZCwgdGgiLHk9InNlbGVjdGVkIixUPSEwLFA9ITE7ZS5fc2VsZWN0PXtpbmZvRWxzOltdfSxvPT09ITA/KHA9Im9zIixQPSEwKTp0eXBlb2Ygbz09InN0cmluZyI/KHA9byxQPSEwKTpFdC5pc1BsYWluT2JqZWN0KG8pJiYoby5ibHVyYWJsZSE9PXZvaWQgMCYmKGI9by5ibHVyYWJsZSksby50b2dnbGVhYmxlIT09dm9pZCAwJiYoZz1vLnRvZ2dsZWFibGUpLG8uaW5mbyE9PXZvaWQgMCYmKG09by5pbmZvKSxvLml0ZW1zIT09dm9pZCAwJiYodT1vLml0ZW1zKSxvLnN0eWxlIT09dm9pZCAwPyhwPW8uc3R5bGUsUD0hMCk6KHA9Im9zIixQPSEwKSxvLnNlbGVjdG9yIT09dm9pZCAwJiYoQz1vLnNlbGVjdG9yKSxvLmNsYXNzTmFtZSE9PXZvaWQgMCYmKHk9by5jbGFzc05hbWUpLG8uaGVhZGVyQ2hlY2tib3ghPT12b2lkIDAmJihUPW8uaGVhZGVyQ2hlY2tib3gpKSx0LnNlbGVjdC5zZWxlY3RvcihDKSx0LnNlbGVjdC5pdGVtcyh1KSx0LnNlbGVjdC5zdHlsZShwKSx0LnNlbGVjdC5ibHVyYWJsZShiKSx0LnNlbGVjdC50b2dnbGVhYmxlKGcpLHQuc2VsZWN0LmluZm8obSksZS5fc2VsZWN0LmNsYXNzTmFtZT15LCFQJiZFdCh0LnRhYmxlKCkubm9kZSgpKS5oYXNDbGFzcygic2VsZWN0YWJsZSIpJiZ0LnNlbGVjdC5zdHlsZSgib3MiKSwoVHx8VD09PSJzZWxlY3QtcGFnZSJ8fFQ9PT0ic2VsZWN0LWFsbCIpJiYoUXModCxUKSx0Lm9uKCJpbml0IixmdW5jdGlvbigpe1FzKHQsVCl9KSl9fTtmdW5jdGlvbiBLcyh0LGUsbil7dmFyIHIscyxpLG89ZnVuY3Rpb24ocCxiKXtpZihwPmIpe3ZhciBnPWI7Yj1wLHA9Z312YXIgbT0hMTtyZXR1cm4gdC5jb2x1bW5zKCI6dmlzaWJsZSIpLmluZGV4ZXMoKS5maWx0ZXIoZnVuY3Rpb24oQyl7cmV0dXJuIEM9PT1wJiYobT0hMCksQz09PWI/KG09ITEsITApOm19KX0sdT1mdW5jdGlvbihwLGIpe3ZhciBnPXQucm93cyh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKTtpZihnLmluZGV4T2YocCk+Zy5pbmRleE9mKGIpKXt2YXIgbT1iO2I9cCxwPW19dmFyIEM9ITE7cmV0dXJuIGcuZmlsdGVyKGZ1bmN0aW9uKHkpe3JldHVybiB5PT09cCYmKEM9ITApLHk9PT1iPyhDPSExLCEwKTpDfSl9OyF0LmNlbGxzKHtzZWxlY3RlZDohMH0pLmFueSgpJiYhbj8ocz1vKDAsZS5jb2x1bW4pLGk9dSgwLGUucm93KSk6KHM9byhuLmNvbHVtbixlLmNvbHVtbiksaT11KG4ucm93LGUucm93KSkscj10LmNlbGxzKGkscykuZmxhdHRlbigpLHQuY2VsbHMoZSx7c2VsZWN0ZWQ6ITB9KS5hbnkoKT90LmNlbGxzKHIpLmRlc2VsZWN0KCk6dC5jZWxscyhyKS5zZWxlY3QoKX1mdW5jdGlvbiBWbih0KXt2YXIgZT1hdC5zZWxlY3QuY2xhc3Nlcy5jaGVja2JveDtyZXR1cm4gdD9lLnJlcGxhY2UoLyAvZywiLiIpOmV9ZnVuY3Rpb24gZWEodCl7dmFyIGU9dC5zZXR0aW5ncygpWzBdLG49ZS5fc2VsZWN0LnNlbGVjdG9yO0V0KHQudGFibGUoKS5jb250YWluZXIoKSkub2ZmKCJtb3VzZWRvd24uZHRTZWxlY3QiLG4pLm9mZigibW91c2V1cC5kdFNlbGVjdCIsbikub2ZmKCJjbGljay5kdFNlbGVjdCIsbiksRXQoImJvZHkiKS5vZmYoImNsaWNrLmR0U2VsZWN0IituYSh0LnRhYmxlKCkubm9kZSgpKSl9ZnVuY3Rpb24gbm8odCl7dmFyIGU9RXQodC50YWJsZSgpLmNvbnRhaW5lcigpKSxuPXQuc2V0dGluZ3MoKVswXSxyPW4uX3NlbGVjdC5zZWxlY3RvcixzO2Uub24oIm1vdXNlZG93bi5kdFNlbGVjdCIscixmdW5jdGlvbihpKXsoaS5zaGlmdEtleXx8aS5tZXRhS2V5fHxpLmN0cmxLZXkpJiZlLmNzcygiLW1vei11c2VyLXNlbGVjdCIsIm5vbmUiKS5vbmUoInNlbGVjdHN0YXJ0LmR0U2VsZWN0IixyLGZ1bmN0aW9uKCl7cmV0dXJuITF9KSx3aW5kb3cuZ2V0U2VsZWN0aW9uJiYocz13aW5kb3cuZ2V0U2VsZWN0aW9uKCkpfSkub24oIm1vdXNldXAuZHRTZWxlY3QiLHIsZnVuY3Rpb24oKXtlLmNzcygiLW1vei11c2VyLXNlbGVjdCIsIiIpfSkub24oImNsaWNrLmR0U2VsZWN0IixyLGZ1bmN0aW9uKGkpe3ZhciBvPXQuc2VsZWN0Lml0ZW1zKCksdTtpZihzKXt2YXIgcD13aW5kb3cuZ2V0U2VsZWN0aW9uKCk7aWYoKCFwLmFuY2hvck5vZGV8fEV0KHAuYW5jaG9yTm9kZSkuY2xvc2VzdCgidGFibGUiKVswXT09PXQudGFibGUoKS5ub2RlKCkpJiZwIT09cylyZXR1cm59dmFyIGI9dC5zZXR0aW5ncygpWzBdLGc9dC50YWJsZSgpLmNvbnRhaW5lcigpO2lmKEV0KGkudGFyZ2V0KS5jbG9zZXN0KCJkaXYuZHQtY29udGFpbmVyIilbMF09PWcpe3ZhciBtPXQuY2VsbChFdChpLnRhcmdldCkuY2xvc2VzdCgidGQsIHRoIikpO2lmKG0uYW55KCkpe3ZhciBDPUV0LkV2ZW50KCJ1c2VyLXNlbGVjdC5kdCIpO2lmKEtlKHQsQyxbbyxtLGldKSwhQy5pc0RlZmF1bHRQcmV2ZW50ZWQoKSl7dmFyIHk9bS5pbmRleCgpO289PT0icm93Ij8odT15LnJvdyxKaShpLHQsYiwicm93Iix1KSk6bz09PSJjb2x1bW4iPyh1PW0uaW5kZXgoKS5jb2x1bW4sSmkoaSx0LGIsImNvbHVtbiIsdSkpOm89PT0iY2VsbCImJih1PW0uaW5kZXgoKSxKaShpLHQsYiwiY2VsbCIsdSkpLGIuX3NlbGVjdF9sYXN0Q2VsbD15fX19fSksRXQoImJvZHkiKS5vbigiY2xpY2suZHRTZWxlY3QiK25hKHQudGFibGUoKS5ub2RlKCkpLGZ1bmN0aW9uKGkpe2lmKG4uX3NlbGVjdC5ibHVyYWJsZSl7aWYoRXQoaS50YXJnZXQpLnBhcmVudHMoKS5maWx0ZXIodC50YWJsZSgpLmNvbnRhaW5lcigpKS5sZW5ndGh8fEV0KGkudGFyZ2V0KS5wYXJlbnRzKCJodG1sIikubGVuZ3RoPT09MHx8RXQoaS50YXJnZXQpLnBhcmVudHMoImRpdi5EVEUiKS5sZW5ndGgpcmV0dXJuO3ZhciBvPUV0LkV2ZW50KCJzZWxlY3QtYmx1ci5kdCIpO2lmKEtlKHQsbyxbaS50YXJnZXQsaV0pLG8uaXNEZWZhdWx0UHJldmVudGVkKCkpcmV0dXJuO2xyKG4sITApfX0pfWZ1bmN0aW9uIEtlKHQsZSxuLHIpe3ImJiF0LmZsYXR0ZW4oKS5sZW5ndGh8fCh0eXBlb2YgZT09InN0cmluZyImJihlPWUrIi5kdCIpLG4udW5zaGlmdCh0KSxFdCh0LnRhYmxlKCkubm9kZSgpKS50cmlnZ2VyKGUsbikpfWZ1bmN0aW9uIHFyKHQpe3JldHVybiB0Lm1SZW5kZXImJnQubVJlbmRlci5fbmFtZT09PSJzZWxlY3RDaGVja2JveCJ9ZnVuY3Rpb24gSnModCxlKXtpZighKHQuc2VsZWN0LnN0eWxlKCk9PT0iYXBpInx8dC5zZWxlY3QuaW5mbygpPT09ITEpKXt2YXIgbj10LnJvd3Moe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aCxyPXQuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLHM9dC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoLGk9ZnVuY3Rpb24oYixnLG0pe2IuYXBwZW5kKEV0KCc8c3BhbiBjbGFzcz0ic2VsZWN0LWl0ZW0iLz4nKS5hcHBlbmQodC5pMThuKCJzZWxlY3QuIitnKyJzIix7XzoiJWQgIitnKyJzIHNlbGVjdGVkIiwwOiIiLDE6IjEgIitnKyIgc2VsZWN0ZWQifSxtKSkpfSxvPUV0KGUpLHU9RXQoJzxzcGFuIGNsYXNzPSJzZWxlY3QtaW5mbyIvPicpO2kodSwicm93IixuKSxpKHUsImNvbHVtbiIsciksaSh1LCJjZWxsIixzKTt2YXIgcD1vLmNoaWxkcmVuKCJzcGFuLnNlbGVjdC1pbmZvIik7cC5sZW5ndGgmJnAucmVtb3ZlKCksdS50ZXh0KCkhPT0iIiYmby5hcHBlbmQodSl9fWZ1bmN0aW9uIFFzKHQsZSl7dmFyIG49dC5zZXR0aW5ncygpWzBdLmFvQ29sdW1uczt0LmNvbHVtbnMoKS5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihyLHMpe3ZhciBpPW5bc107aWYocXIoaSkpe3ZhciBvPXQuY29sdW1uKHMpLmhlYWRlcigpO2lmKCFFdCgiaW5wdXQiLG8pLmxlbmd0aCl7dmFyIHU9RXQoIjxpbnB1dD4iKS5hdHRyKHtjbGFzczpWbighMCksdHlwZToiY2hlY2tib3giLCJhcmlhLWxhYmVsIjp0LmkxOG4oInNlbGVjdC5hcmlhLmhlYWRlckNoZWNrYm94Iil8fCJTZWxlY3QgYWxsIHJvd3MifSkuYXBwZW5kVG8obykub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0aGlzLmNoZWNrZWQ/ZT09InNlbGVjdC1wYWdlIj90LnJvd3Moe3BhZ2U6ImN1cnJlbnQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuc2VsZWN0KCk6dC5yb3dzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9KS5vbigiY2xpY2siLGZ1bmN0aW9uKHApe3Auc3RvcFByb3BhZ2F0aW9uKCl9KTt0Lm9uKCJkcmF3IHNlbGVjdCBkZXNlbGVjdCIsZnVuY3Rpb24ocCxiLGcpe2lmKGc9PT0icm93Inx8IWcpe3ZhciBtPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5jb3VudCgpLEM9dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQiLHNlbGVjdGVkOiEwfSkuY291bnQoKSx5PWU9PSJzZWxlY3QtcGFnZSI/dC5yb3dzKHtwYWdlOiJjdXJyZW50In0pLmNvdW50KCk6dC5yb3dzKHtzZWFyY2g6ImFwcGxpZWQifSkuY291bnQoKTtDJiZDPD1tJiZDPT09eT91LnByb3AoImNoZWNrZWQiLCEwKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMSk6Qz09PTAmJm09PT0wP3UucHJvcCgiY2hlY2tlZCIsITEpLnByb3AoImluZGV0ZXJtaW5hdGUiLCExKTp1LnByb3AoImNoZWNrZWQiLCExKS5wcm9wKCJpbmRldGVybWluYXRlIiwhMCl9fSl9fX0pfWZ1bmN0aW9uIG9kKHQpe3ZhciBlPW5ldyBhdC5BcGkodCk7dC5fc2VsZWN0X2luaXQ9ITAsdC5hb1Jvd0NyZWF0ZWRDYWxsYmFjay5wdXNoKGZ1bmN0aW9uKG4scixzKXt2YXIgaSxvLHU9dC5hb0RhdGFbc107Zm9yKHUuX3NlbGVjdF9zZWxlY3RlZCYmRXQobikuYWRkQ2xhc3ModC5fc2VsZWN0LmNsYXNzTmFtZSkuZmluZCgiaW5wdXQuIitWbighMCkpLnByb3AoImNoZWNrZWQiLCEwKSxpPTAsbz10LmFvQ29sdW1ucy5sZW5ndGg7aTxvO2krKykodC5hb0NvbHVtbnNbaV0uX3NlbGVjdF9zZWxlY3RlZHx8dS5fc2VsZWN0ZWRfY2VsbHMmJnUuX3NlbGVjdGVkX2NlbGxzW2ldKSYmRXQodS5hbkNlbGxzW2ldKS5hZGRDbGFzcyh0Ll9zZWxlY3QuY2xhc3NOYW1lKX0pLGUub24oInByZVhoci5kdC5kdFNlbGVjdCIsZnVuY3Rpb24obixyKXtpZihyPT09ZS5zZXR0aW5ncygpWzBdKXt2YXIgcz1lLnJvd3Moe3NlbGVjdGVkOiEwfSkuaWRzKCEwKS5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIG8hPT12b2lkIDB9KSxpPWUuY2VsbHMoe3NlbGVjdGVkOiEwfSkuZXEoMCkubWFwKGZ1bmN0aW9uKG8pe3ZhciB1PWUucm93KG8ucm93KS5pZCghMCk7cmV0dXJuIHU/e3Jvdzp1LGNvbHVtbjpvLmNvbHVtbn06dm9pZCAwfSkuZmlsdGVyKGZ1bmN0aW9uKG8pe3JldHVybiBvIT09dm9pZCAwfSk7ZS5vbmUoImRyYXcuZHQuZHRTZWxlY3QiLGZ1bmN0aW9uKCl7ZS5yb3dzKHMpLnNlbGVjdCgpLGkuYW55KCkmJmkuZWFjaChmdW5jdGlvbihvKXtlLmNlbGxzKG8ucm93LG8uY29sdW1uKS5zZWxlY3QoKX0pfSl9fSksZS5vbigiaW5mby5kdCIsZnVuY3Rpb24obixyLHMpe3IuX3NlbGVjdC5pbmZvRWxzLmluY2x1ZGVzKHMpfHxyLl9zZWxlY3QuaW5mb0Vscy5wdXNoKHMpLEpzKGUscyl9KSxlLm9uKCJzZWxlY3QuZHRTZWxlY3QuZHQgZGVzZWxlY3QuZHRTZWxlY3QuZHQiLGZ1bmN0aW9uKCl7dC5fc2VsZWN0LmluZm9FbHMuZm9yRWFjaChmdW5jdGlvbihuKXtKcyhlLG4pfSksZS5zdGF0ZS5zYXZlKCl9KSxlLm9uKCJkZXN0cm95LmR0U2VsZWN0IixmdW5jdGlvbigpe0V0KGUucm93cyh7c2VsZWN0ZWQ6ITB9KS5ub2RlcygpKS5yZW1vdmVDbGFzcyhlLnNldHRpbmdzKClbMF0uX3NlbGVjdC5jbGFzc05hbWUpLEV0KCJpbnB1dC4iK1ZuKCEwKSxlLnRhYmxlKCkuaGVhZGVyKCkpLnJlbW92ZSgpLGVhKGUpLGUub2ZmKCIuZHRTZWxlY3QiKSxFdCgiYm9keSIpLm9mZigiLmR0U2VsZWN0IituYShlLnRhYmxlKCkubm9kZSgpKSl9KX1mdW5jdGlvbiB0byh0LGUsbixyKXt2YXIgcz10W2UrInMiXSh7c2VhcmNoOiJhcHBsaWVkIn0pLmluZGV4ZXMoKSxpPXMuaW5kZXhPZihyKSxvPXMuaW5kZXhPZihuKTtpZighdFtlKyJzIl0oe3NlbGVjdGVkOiEwfSkuYW55KCkmJmk9PT0tMSlzLnNwbGljZShzLmluZGV4T2YobikrMSxzLmxlbmd0aCk7ZWxzZXtpZihpPm8pe3ZhciB1PW87bz1pLGk9dX1zLnNwbGljZShvKzEscy5sZW5ndGgpLHMuc3BsaWNlKDAsaSl9dFtlXShuLHtzZWxlY3RlZDohMH0pLmFueSgpPyhzLnNwbGljZShzLmluZGV4T2YobiksMSksdFtlKyJzIl0ocykuZGVzZWxlY3QoKSk6dFtlKyJzIl0ocykuc2VsZWN0KCl9ZnVuY3Rpb24gbHIodCxlKXtpZihlfHx0Ll9zZWxlY3Quc3R5bGU9PT0ic2luZ2xlIil7dmFyIG49bmV3IGF0LkFwaSh0KTtuLnJvd3Moe3NlbGVjdGVkOiEwfSkuZGVzZWxlY3QoKSxuLmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuZGVzZWxlY3QoKSxuLmNlbGxzKHtzZWxlY3RlZDohMH0pLmRlc2VsZWN0KCl9fWZ1bmN0aW9uIEppKHQsZSxuLHIscyl7dmFyIGk9ZS5zZWxlY3Quc3R5bGUoKSxvPWUuc2VsZWN0LnRvZ2dsZWFibGUoKSx1PWVbcl0ocyx7c2VsZWN0ZWQ6ITB9KS5hbnkoKTtpZighKHUmJiFvKSlpZihpPT09Im9zIilpZih0LmN0cmxLZXl8fHQubWV0YUtleSllW3JdKHMpLnNlbGVjdCghdSk7ZWxzZSBpZih0LnNoaWZ0S2V5KXI9PT0iY2VsbCI/S3MoZSxzLG4uX3NlbGVjdF9sYXN0Q2VsbHx8bnVsbCk6dG8oZSxyLHMsbi5fc2VsZWN0X2xhc3RDZWxsP24uX3NlbGVjdF9sYXN0Q2VsbFtyXTpudWxsKTtlbHNle3ZhciBwPWVbcisicyJdKHtzZWxlY3RlZDohMH0pO3UmJnAuZmxhdHRlbigpLmxlbmd0aD09PTE/ZVtyXShzKS5kZXNlbGVjdCgpOihwLmRlc2VsZWN0KCksZVtyXShzKS5zZWxlY3QoKSl9ZWxzZSBpPT0ibXVsdGkrc2hpZnQiJiZ0LnNoaWZ0S2V5P3I9PT0iY2VsbCI/S3MoZSxzLG4uX3NlbGVjdF9sYXN0Q2VsbHx8bnVsbCk6dG8oZSxyLHMsbi5fc2VsZWN0X2xhc3RDZWxsP24uX3NlbGVjdF9sYXN0Q2VsbFtyXTpudWxsKTplW3JdKHMpLnNlbGVjdCghdSl9ZnVuY3Rpb24gbmEodCl7cmV0dXJuIHQuaWQucmVwbGFjZSgvW15hLXpBLVowLTlcLVxfXS9nLCItIil9RXQuZWFjaChbe3R5cGU6InJvdyIscHJvcDoiYW9EYXRhIn0se3R5cGU6ImNvbHVtbiIscHJvcDoiYW9Db2x1bW5zIn1dLGZ1bmN0aW9uKHQsZSl7YXQuZXh0LnNlbGVjdG9yW2UudHlwZV0ucHVzaChmdW5jdGlvbihuLHIscyl7dmFyIGk9ci5zZWxlY3RlZCxvLHU9W107aWYoaSE9PSEwJiZpIT09ITEpcmV0dXJuIHM7Zm9yKHZhciBwPTAsYj1zLmxlbmd0aDtwPGI7cCsrKW89bltlLnByb3BdW3NbcF1dLG8mJihpPT09ITAmJm8uX3NlbGVjdF9zZWxlY3RlZD09PSEwfHxpPT09ITEmJiFvLl9zZWxlY3Rfc2VsZWN0ZWQpJiZ1LnB1c2goc1twXSk7cmV0dXJuIHV9KX0pO2F0LmV4dC5zZWxlY3Rvci5jZWxsLnB1c2goZnVuY3Rpb24odCxlLG4pe3ZhciByPWUuc2VsZWN0ZWQscyxpPVtdO2lmKHI9PT12b2lkIDApcmV0dXJuIG47Zm9yKHZhciBvPTAsdT1uLmxlbmd0aDtvPHU7bysrKXM9dC5hb0RhdGFbbltvXS5yb3ddLHMmJihyPT09ITAmJnMuX3NlbGVjdGVkX2NlbGxzJiZzLl9zZWxlY3RlZF9jZWxsc1tuW29dLmNvbHVtbl09PT0hMHx8cj09PSExJiYoIXMuX3NlbGVjdGVkX2NlbGxzfHwhcy5fc2VsZWN0ZWRfY2VsbHNbbltvXS5jb2x1bW5dKSkmJmkucHVzaChuW29dKTtyZXR1cm4gaX0pO3ZhciBVZT1hdC5BcGkucmVnaXN0ZXIsSG49YXQuQXBpLnJlZ2lzdGVyUGx1cmFsO1VlKCJzZWxlY3QoKSIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKHQpe2F0LnNlbGVjdC5pbml0KG5ldyBhdC5BcGkodCkpfSl9KTtVZSgic2VsZWN0LmJsdXJhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LmJsdXJhYmxlOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuYmx1cmFibGU9dH0pfSk7VWUoInNlbGVjdC50b2dnbGVhYmxlKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LnRvZ2dsZWFibGU6dGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKGUpe2UuX3NlbGVjdC50b2dnbGVhYmxlPXR9KX0pO1VlKCJzZWxlY3QuaW5mbygpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5pbmZvOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuaW5mbz10fSl9KTtVZSgic2VsZWN0Lml0ZW1zKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0Lml0ZW1zOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlLl9zZWxlY3QuaXRlbXM9dCxLZShuZXcgYXQuQXBpKGUpLCJzZWxlY3RJdGVtcyIsW3RdKX0pfSk7VWUoInNlbGVjdC5zdHlsZSgpIixmdW5jdGlvbih0KXtyZXR1cm4gdD09PXZvaWQgMD90aGlzLmNvbnRleHRbMF0uX3NlbGVjdC5zdHlsZTp0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSl7ZS5fc2VsZWN0fHxhdC5zZWxlY3QuaW5pdChuZXcgYXQuQXBpKGUpKSxlLl9zZWxlY3RfaW5pdHx8b2QoZSksZS5fc2VsZWN0LnN0eWxlPXQ7dmFyIG49bmV3IGF0LkFwaShlKTtlYShuKSx0IT09ImFwaSImJm5vKG4pLEtlKG5ldyBhdC5BcGkoZSksInNlbGVjdFN0eWxlIixbdF0pfSl9KTtVZSgic2VsZWN0LnNlbGVjdG9yKCkiLGZ1bmN0aW9uKHQpe3JldHVybiB0PT09dm9pZCAwP3RoaXMuY29udGV4dFswXS5fc2VsZWN0LnNlbGVjdG9yOnRoaXMuaXRlcmF0b3IoInRhYmxlIixmdW5jdGlvbihlKXtlYShuZXcgYXQuQXBpKGUpKSxlLl9zZWxlY3Quc2VsZWN0b3I9dCxlLl9zZWxlY3Quc3R5bGUhPT0iYXBpIiYmbm8obmV3IGF0LkFwaShlKSl9KX0pO1VlKCJzZWxlY3QubGFzdCgpIixmdW5jdGlvbih0KXtsZXQgZT10aGlzLmNvbnRleHRbMF07cmV0dXJuIHQ/KGUuX3NlbGVjdF9sYXN0Q2VsbD10LHRoaXMpOmUuX3NlbGVjdF9sYXN0Q2VsbH0pO0huKCJyb3dzKCkuc2VsZWN0KCkiLCJyb3coKS5zZWxlY3QoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD09PSExP3RoaXMuZGVzZWxlY3QoKToodGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihuLHIpe2xyKG4pO3ZhciBzPW4uYW9EYXRhW3JdLGk9bi5hb0NvbHVtbnM7RXQocy5uVHIpLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpLHMuX3NlbGVjdF9zZWxlY3RlZD0hMDtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHU9aVtvXTtpZih1LnNUeXBlPT09bnVsbCYmZS5jb2x1bW5zKCkudHlwZXMoKSxxcih1KSl7dmFyIHA9cy5hbkNlbGxzO3AmJnBbb10mJkV0KCJpbnB1dC4iK1ZuKCEwKSxwW29dKS5wcm9wKCJjaGVja2VkIiwhMCkscy5fYVNvcnREYXRhIT09bnVsbCYmKHMuX2FTb3J0RGF0YVtvXT1udWxsKX19fSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbInJvdyIsZVtyXV0sITApfSksdGhpcyl9KTtVZSgicm93KCkuc2VsZWN0ZWQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRbMF07cmV0dXJuISEodCYmdGhpcy5sZW5ndGgmJnQuYW9EYXRhW3RoaXNbMF1dJiZ0LmFvRGF0YVt0aGlzWzBdXS5fc2VsZWN0X3NlbGVjdGVkKX0pO0huKCJjb2x1bW5zKCkuc2VsZWN0KCkiLCJjb2x1bW4oKS5zZWxlY3QoKSIsZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdD09PSExP3RoaXMuZGVzZWxlY3QoKToodGhpcy5pdGVyYXRvcigiY29sdW1uIixmdW5jdGlvbihuLHIpe2xyKG4pLG4uYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQ9ITA7dmFyIHM9bmV3IGF0LkFwaShuKS5jb2x1bW4ocik7RXQocy5oZWFkZXIoKSkuYWRkQ2xhc3Mobi5fc2VsZWN0LmNsYXNzTmFtZSksRXQocy5mb290ZXIoKSkuYWRkQ2xhc3Mobi5fc2VsZWN0LmNsYXNzTmFtZSkscy5ub2RlcygpLnRvJCgpLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpfSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbImNvbHVtbiIsZVtyXV0sITApfSksdGhpcyl9KTtVZSgiY29sdW1uKCkuc2VsZWN0ZWQoKSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnRleHRbMF07cmV0dXJuISEodCYmdGhpcy5sZW5ndGgmJnQuYW9Db2x1bW5zW3RoaXNbMF1dJiZ0LmFvQ29sdW1uc1t0aGlzWzBdXS5fc2VsZWN0X3NlbGVjdGVkKX0pO0huKCJjZWxscygpLnNlbGVjdCgpIiwiY2VsbCgpLnNlbGVjdCgpIixmdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0PT09ITE/dGhpcy5kZXNlbGVjdCgpOih0aGlzLml0ZXJhdG9yKCJjZWxsIixmdW5jdGlvbihuLHIscyl7bHIobik7dmFyIGk9bi5hb0RhdGFbcl07aS5fc2VsZWN0ZWRfY2VsbHM9PT12b2lkIDAmJihpLl9zZWxlY3RlZF9jZWxscz1bXSksaS5fc2VsZWN0ZWRfY2VsbHNbc109ITAsaS5hbkNlbGxzJiZFdChpLmFuQ2VsbHNbc10pLmFkZENsYXNzKG4uX3NlbGVjdC5jbGFzc05hbWUpfSksdGhpcy5pdGVyYXRvcigidGFibGUiLGZ1bmN0aW9uKG4scil7S2UoZSwic2VsZWN0IixbImNlbGwiLGUuY2VsbHMoZVtyXSkuaW5kZXhlcygpLnRvQXJyYXkoKV0sITApfSksdGhpcyl9KTtVZSgiY2VsbCgpLnNlbGVjdGVkKCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZXh0WzBdO2lmKHQmJnRoaXMubGVuZ3RoKXt2YXIgZT10LmFvRGF0YVt0aGlzWzBdWzBdLnJvd107aWYoZSYmZS5fc2VsZWN0ZWRfY2VsbHMmJmUuX3NlbGVjdGVkX2NlbGxzW3RoaXNbMF1bMF0uY29sdW1uXSlyZXR1cm4hMH1yZXR1cm4hMX0pO0huKCJyb3dzKCkuZGVzZWxlY3QoKSIsInJvdygpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigicm93IixmdW5jdGlvbihlLG4pe3ZhciByPWUuYW9EYXRhW25dLHM9ZS5hb0NvbHVtbnM7RXQoci5uVHIpLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpLHIuX3NlbGVjdF9zZWxlY3RlZD0hMSxlLl9zZWxlY3RfbGFzdENlbGw9bnVsbDtmb3IodmFyIGk9MDtpPHMubGVuZ3RoO2krKyl7dmFyIG89c1tpXTtpZihvLnNUeXBlPT09bnVsbCYmdC5jb2x1bW5zKCkudHlwZXMoKSxxcihvKSl7dmFyIHU9ci5hbkNlbGxzO3UmJnVbaV0mJkV0KCJpbnB1dC4iK1ZuKCEwKSxyLmFuQ2VsbHNbaV0pLnByb3AoImNoZWNrZWQiLCExKSxyLl9hU29ydERhdGEhPT1udWxsJiYoci5fYVNvcnREYXRhW2ldPW51bGwpfX19KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJyb3ciLHRbbl1dLCEwKX0pLHRoaXN9KTtIbigiY29sdW1ucygpLmRlc2VsZWN0KCkiLCJjb2x1bW4oKS5kZXNlbGVjdCgpIixmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMuaXRlcmF0b3IoImNvbHVtbiIsZnVuY3Rpb24oZSxuKXtlLmFvQ29sdW1uc1tuXS5fc2VsZWN0X3NlbGVjdGVkPSExO3ZhciByPW5ldyBhdC5BcGkoZSkscz1yLmNvbHVtbihuKTtFdChzLmhlYWRlcigpKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKSxFdChzLmZvb3RlcigpKS5yZW1vdmVDbGFzcyhlLl9zZWxlY3QuY2xhc3NOYW1lKSxyLmNlbGxzKG51bGwsbikuaW5kZXhlcygpLmVhY2goZnVuY3Rpb24oaSl7dmFyIG89ZS5hb0RhdGFbaS5yb3ddLHU9by5fc2VsZWN0ZWRfY2VsbHM7by5hbkNlbGxzJiYoIXV8fCF1W2kuY29sdW1uXSkmJkV0KG8uYW5DZWxsc1tpLmNvbHVtbl0pLnJlbW92ZUNsYXNzKGUuX3NlbGVjdC5jbGFzc05hbWUpfSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJjb2x1bW4iLHRbbl1dLCEwKX0pLHRoaXN9KTtIbigiY2VsbHMoKS5kZXNlbGVjdCgpIiwiY2VsbCgpLmRlc2VsZWN0KCkiLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5pdGVyYXRvcigiY2VsbCIsZnVuY3Rpb24oZSxuLHIpe3ZhciBzPWUuYW9EYXRhW25dO3MuX3NlbGVjdGVkX2NlbGxzIT09dm9pZCAwJiYocy5fc2VsZWN0ZWRfY2VsbHNbcl09ITEpLHMuYW5DZWxscyYmIWUuYW9Db2x1bW5zW3JdLl9zZWxlY3Rfc2VsZWN0ZWQmJkV0KHMuYW5DZWxsc1tyXSkucmVtb3ZlQ2xhc3MoZS5fc2VsZWN0LmNsYXNzTmFtZSl9KSx0aGlzLml0ZXJhdG9yKCJ0YWJsZSIsZnVuY3Rpb24oZSxuKXtLZSh0LCJkZXNlbGVjdCIsWyJjZWxsIix0W25dXSwhMCl9KSx0aGlzfSk7ZnVuY3Rpb24gTW4odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4uaTE4bigiYnV0dG9ucy4iK3QsZSl9fWZ1bmN0aW9uIFFpKHQpe3ZhciBlPXQuX2V2ZW50TmFtZXNwYWNlO3JldHVybiJkcmF3LmR0LkRUIitlKyIgc2VsZWN0LmR0LkRUIitlKyIgZGVzZWxlY3QuZHQuRFQiK2V9ZnVuY3Rpb24gbGQodCxlKXtyZXR1cm4hIShlLmxpbWl0VG8uaW5kZXhPZigicm93cyIpIT09LTEmJnQucm93cyh7c2VsZWN0ZWQ6ITB9KS5hbnkoKXx8ZS5saW1pdFRvLmluZGV4T2YoImNvbHVtbnMiKSE9PS0xJiZ0LmNvbHVtbnMoe3NlbGVjdGVkOiEwfSkuYW55KCl8fGUubGltaXRUby5pbmRleE9mKCJjZWxscyIpIT09LTEmJnQuY2VsbHMoe3NlbGVjdGVkOiEwfSkuYW55KCkpfXZhciB0YT0wO0V0LmV4dGVuZChhdC5leHQuYnV0dG9ucyx7c2VsZWN0ZWQ6e3RleHQ6TW4oInNlbGVjdGVkIiwiU2VsZWN0ZWQiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0ZWQiLGxpbWl0VG86WyJyb3dzIiwiY29sdW1ucyIsImNlbGxzIl0saW5pdDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztuLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrdGErKyx0Lm9uKFFpKG4pLGZ1bmN0aW9uKCl7ci5lbmFibGUobGQodCxuKSl9KSx0aGlzLmRpc2FibGUoKX0sZGVzdHJveTpmdW5jdGlvbih0LGUsbil7dC5vZmYobi5fZXZlbnROYW1lc3BhY2UpfX0sc2VsZWN0ZWRTaW5nbGU6e3RleHQ6TW4oInNlbGVjdGVkU2luZ2xlIiwiU2VsZWN0ZWQgc2luZ2xlIiksY2xhc3NOYW1lOiJidXR0b25zLXNlbGVjdGVkLXNpbmdsZSIsaW5pdDpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztuLl9ldmVudE5hbWVzcGFjZT0iLnNlbGVjdCIrdGErKyx0Lm9uKFFpKG4pLGZ1bmN0aW9uKCl7dmFyIHM9dC5yb3dzKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jb2x1bW5zKHtzZWxlY3RlZDohMH0pLmZsYXR0ZW4oKS5sZW5ndGgrdC5jZWxscyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoO3IuZW5hYmxlKHM9PT0xKX0pLHRoaXMuZGlzYWJsZSgpfSxkZXN0cm95OmZ1bmN0aW9uKHQsZSxuKXt0Lm9mZihuLl9ldmVudE5hbWVzcGFjZSl9fSxzZWxlY3RBbGw6e3RleHQ6TW4oInNlbGVjdEFsbCIsIlNlbGVjdCBhbGwiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0LWFsbCIsYWN0aW9uOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBzPXRoaXMuc2VsZWN0Lml0ZW1zKCksaT1yLnNlbGVjdG9yTW9kaWZpZXI7aT8odHlwZW9mIGk9PSJmdW5jdGlvbiImJihpPWkuY2FsbChlLHQsZSxuLHIpKSx0aGlzW3MrInMiXShpKS5zZWxlY3QoKSk6dGhpc1tzKyJzIl0oKS5zZWxlY3QoKX19LHNlbGVjdE5vbmU6e3RleHQ6TW4oInNlbGVjdE5vbmUiLCJEZXNlbGVjdCBhbGwiKSxjbGFzc05hbWU6ImJ1dHRvbnMtc2VsZWN0LW5vbmUiLGFjdGlvbjpmdW5jdGlvbigpe2xyKHRoaXMuc2V0dGluZ3MoKVswXSwhMCl9LGluaXQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXM7bi5fZXZlbnROYW1lc3BhY2U9Ii5zZWxlY3QiK3RhKyssdC5vbihRaShuKSxmdW5jdGlvbigpe3ZhciBzPXQucm93cyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoK3QuY29sdW1ucyh7c2VsZWN0ZWQ6ITB9KS5mbGF0dGVuKCkubGVuZ3RoK3QuY2VsbHMoe3NlbGVjdGVkOiEwfSkuZmxhdHRlbigpLmxlbmd0aDtyLmVuYWJsZShzPjApfSksdGhpcy5kaXNhYmxlKCl9LGRlc3Ryb3k6ZnVuY3Rpb24odCxlLG4pe3Qub2ZmKG4uX2V2ZW50TmFtZXNwYWNlKX19LHNob3dTZWxlY3RlZDp7dGV4dDpNbigic2hvd1NlbGVjdGVkIiwiU2hvdyBvbmx5IHNlbGVjdGVkIiksY2xhc3NOYW1lOiJidXR0b25zLXNob3ctc2VsZWN0ZWQiLGFjdGlvbjpmdW5jdGlvbih0LGUpe2lmKGUuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiKSllLnNlYXJjaC5maXhlZCgiZHQtc2VsZWN0IixudWxsKSx0aGlzLmFjdGl2ZSghMSk7ZWxzZXt2YXIgbj1lLnNldHRpbmdzKClbMF0uYW9EYXRhO2Uuc2VhcmNoLmZpeGVkKCJkdC1zZWxlY3QiLGZ1bmN0aW9uKHIscyxpKXtyZXR1cm4gbltpXS5fc2VsZWN0X3NlbGVjdGVkfSksdGhpcy5hY3RpdmUoITApfWUuZHJhdygpfX19KTtFdC5lYWNoKFsiUm93IiwiQ29sdW1uIiwiQ2VsbCJdLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpO2F0LmV4dC5idXR0b25zWyJzZWxlY3QiK2UrInMiXT17dGV4dDpNbigic2VsZWN0IitlKyJzIiwiU2VsZWN0ICIrbisicyIpLGNsYXNzTmFtZToiYnV0dG9ucy1zZWxlY3QtIituKyJzIixhY3Rpb246ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdC5pdGVtcyhuKX0saW5pdDpmdW5jdGlvbihyKXt2YXIgcz10aGlzO3Iub24oInNlbGVjdEl0ZW1zLmR0LkRUIixmdW5jdGlvbihpLG8sdSl7cy5hY3RpdmUodT09PW4pfSl9fX0pO2F0LnR5cGUoInNlbGVjdC1jaGVja2JveCIse2NsYXNzTmFtZToiZHQtc2VsZWN0IixkZXRlY3Q6YXQudmVyc2lvbkNoZWNrKCIyLjEiKT97b25lT2Y6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sYWxsT2Y6ZnVuY3Rpb24oKXtyZXR1cm4hMX0saW5pdDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHFyKGUpfX06ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0ic2VsZWN0LWNoZWNrYm94Ij90OiExfSxvcmRlcjp7cHJlOmZ1bmN0aW9uKHQpe3JldHVybiB0PT09IlgiPy0xOjB9fX0pO0V0LmV4dGVuZCghMCxhdC5kZWZhdWx0cy5vTGFuZ3VhZ2Use3NlbGVjdDp7YXJpYTp7cm93Q2hlY2tib3g6IlNlbGVjdCByb3cifX19KTthdC5yZW5kZXIuc2VsZWN0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dD9hdC51dGlsLmdldCh0KTpudWxsLHI9ZT9hdC51dGlsLmdldChlKTpudWxsLHM9ZnVuY3Rpb24oaSxvLHUscCl7dmFyIGI9cC5zZXR0aW5ncy5hb0RhdGFbcC5yb3ddLGc9Yi5fc2VsZWN0X3NlbGVjdGVkLG09cC5zZXR0aW5ncy5vTGFuZ3VhZ2Uuc2VsZWN0LmFyaWEucm93Q2hlY2tib3g7cmV0dXJuIG89PT0iZGlzcGxheSI/RXQoIjxpbnB1dD4iKS5hdHRyKHsiYXJpYS1sYWJlbCI6bSxjbGFzczpWbigpLG5hbWU6cj9yKHUpOm51bGwsdHlwZToiY2hlY2tib3giLHZhbHVlOm4/bih1KTpudWxsLGNoZWNrZWQ6Z30pLm9uKCJpbnB1dCIsZnVuY3Rpb24oQyl7Qy5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2hlY2tlZD1FdCh0aGlzKS5jbG9zZXN0KCJ0ciIpLmhhc0NsYXNzKCJzZWxlY3RlZCIpfSlbMF06bz09PSJ0eXBlIj8ic2VsZWN0LWNoZWNrYm94IjpvPT09ImZpbHRlciI/IiI6Zz8iWCI6IiJ9O3JldHVybiBzLl9uYW1lPSJzZWxlY3RDaGVja2JveCIsc307YXQuZXh0Lm9yZGVyWyJzZWxlY3QtY2hlY2tib3giXT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmFwaSgpLmNvbHVtbihlLHtvcmRlcjoiaW5kZXgifSkubm9kZXMoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQuX3NlbGVjdC5pdGVtcz09PSJyb3ciP0V0KG4pLnBhcmVudCgpLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpLnRvU3RyaW5nKCk6dC5fc2VsZWN0Lml0ZW1zPT09ImNlbGwiP0V0KG4pLmhhc0NsYXNzKHQuX3NlbGVjdC5jbGFzc05hbWUpLnRvU3RyaW5nKCk6ITF9KX07RXQuZm4uRGF0YVRhYmxlLnNlbGVjdD1hdC5zZWxlY3Q7RXQoZG9jdW1lbnQpLm9uKCJwcmVJbml0LmR0LmR0U2VsZWN0IixmdW5jdGlvbih0LGUpe3QubmFtZXNwYWNlPT09ImR0IiYmYXQuc2VsZWN0LmluaXQobmV3IGF0LkFwaShlKSl9KTtMZS5CdXR0b25zLmpzemlwKHJvLmRlZmF1bHQpO0xlLmdldF9zZWxlY3RlZF9yb3dzPWZ1bmN0aW9uKHQsZSl7bGV0IHI9dC5yb3dzKCkuY291bnQoKS8yO3JldHVybiBBcnJheS5mcm9tKHQucm93cyh7c2VsZWN0ZWQ6ITB9KS5pbmRleGVzKCkubWFwKHM9PnM8cj9zOnMrZSkpfTtMZS5zZXRfc2VsZWN0ZWRfcm93cz1mdW5jdGlvbih0LGUsbil7bGV0IHI9dC5yb3dzKCkuY291bnQoKSxzPXIvMixpPXMrZSxvPXIrZTtuPUFycmF5LmZyb20obi5maWx0ZXIodT0+dT49MCYmdTxvJiYodTxzfHx1Pj1pKSkubWFwKHU9PnU8cz91OnUtZSkpLHQucm93cygpLmRlc2VsZWN0KCksdC5yb3dzKG4pLnNlbGVjdCgpfTt2YXIgYWM9TGU7dmFyIGV4cG9ydF9qUXVlcnk9dWQuZGVmYXVsdDtleHBvcnR7TGUgYXMgRGF0YVRhYmxlLGlkIGFzIERhdGVUaW1lLGFjIGFzIGRlZmF1bHQsZXhwb3J0X2pRdWVyeSBhcyBqUXVlcnl9OwovKiEgQnVuZGxlZCBsaWNlbnNlIGluZm9ybWF0aW9uOgoKanN6aXAvZGlzdC9qc3ppcC5taW4uanM6CiAgKCohCiAgCiAgSlNaaXAgdjMuMTAuMSAtIEEgSmF2YVNjcmlwdCBjbGFzcyBmb3IgZ2VuZXJhdGluZyBhbmQgcmVhZGluZyB6aXAgZmlsZXMKICA8aHR0cDovL3N0dWFydGsuY29tL2pzemlwPgogIAogIChjKSAyMDA5LTIwMTYgU3R1YXJ0IEtuaWdodGxleSA8c3R1YXJ0IFthdF0gc3R1YXJ0ay5jb20+CiAgRHVhbCBsaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2Ugb3IgR1BMdjMuIFNlZSBodHRwczovL3Jhdy5naXRodWIuY29tL1N0dWsvanN6aXAvbWFpbi9MSUNFTlNFLm1hcmtkb3duLgogIAogIEpTWmlwIHVzZXMgdGhlIGxpYnJhcnkgcGFrbyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgOgogIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9ibG9iL21haW4vTElDRU5TRQogICopCgpqcXVlcnkvZGlzdC9qcXVlcnkuanM6CiAgKCohCiAgICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My43LjEKICAgKiBodHRwczovL2pxdWVyeS5jb20vCiAgICoKICAgKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogICAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogICAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAgICoKICAgKiBEYXRlOiAyMDIzLTA4LTI4VDEzOjM3WgogICAqKQoKZGF0YXRhYmxlcy5uZXQvanMvZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgMi4xLjYKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtZHQvanMvZGF0YVRhYmxlcy5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIGludGVncmF0aW9uCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvZGF0YVRhYmxlcy5idXR0b25zLm1qczoKICAoKiEgQnV0dG9ucyBmb3IgRGF0YVRhYmxlcyAzLjEuMgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1idXR0b25zLWR0L2pzL2J1dHRvbnMuZGF0YVRhYmxlcy5tanM6CiAgKCohIERhdGFUYWJsZXMgc3R5bGluZyB3cmFwcGVyIGZvciBCdXR0b25zCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvYnV0dG9ucy5odG1sNS5taW4ubWpzOgogICgqIQogICAqIEhUTUw1IGV4cG9ydCBidXR0b25zIGZvciBCdXR0b25zIGFuZCBEYXRhVGFibGVzLgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICoKICAgKiBGaWxlU2F2ZXIuanMgKDEuMy4zKSAtIE1JVCBsaWNlbnNlCiAgICogQ29weXJpZ2h0IMKpIDIwMTYgRWxpIEdyZXkgLSBodHRwOi8vZWxpZ3JleS5jb20KICAgKikKCmRhdGF0YWJsZXMubmV0LWJ1dHRvbnMvanMvYnV0dG9ucy5wcmludC5taW4ubWpzOgogICgqIQogICAqIFByaW50IGJ1dHRvbiBmb3IgQnV0dG9ucyBhbmQgRGF0YVRhYmxlcy4KICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtYnV0dG9ucy9qcy9idXR0b25zLmNvbFZpcy5taW4ubWpzOgogICgqIQogICAqIENvbHVtbiB2aXNpYmlsaXR5IGJ1dHRvbnMgZm9yIEJ1dHRvbnMgYW5kIERhdGFUYWJsZXMuCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWZpeGVkY29sdW1ucy9qcy9kYXRhVGFibGVzLmZpeGVkQ29sdW1ucy5tanM6CiAgKCohIEZpeGVkQ29sdW1ucyA1LjAuMAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMtZHQvanMvZml4ZWRDb2x1bW5zLmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIGludGVncmF0aW9uIGZvciBEYXRhVGFibGVzJyBGaXhlZENvbHVtbnMKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQta2V5dGFibGUvanMvZGF0YVRhYmxlcy5rZXlUYWJsZS5tanM6CiAgKCohIEtleVRhYmxlIDIuMTIuMQogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1rZXl0YWJsZS1kdC9qcy9rZXlUYWJsZS5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIEtleVRhYmxlCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LXJvd2dyb3VwL2pzL2RhdGFUYWJsZXMucm93R3JvdXAubWpzOgogICgqISBSb3dHcm91cCAxLjUuMAogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1yb3dncm91cC1kdC9qcy9yb3dHcm91cC5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBzdHlsaW5nIHdyYXBwZXIgZm9yIFJvd0dyb3VwCiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKCmRhdGF0YWJsZXMubmV0LWRhdGV0aW1lL2Rpc3QvZGF0YVRhYmxlcy5kYXRlVGltZS5tanM6CiAgKCohIERhdGVUaW1lIHBpY2tlciBmb3IgRGF0YVRhYmxlcy5uZXQgdjEuNS4zCiAgICoKICAgKiDCqSBTcHJ5TWVkaWEgTHRkLCBhbGwgcmlnaHRzIHJlc2VydmVkLgogICAqIExpY2Vuc2U6IE1JVCBkYXRhdGFibGVzLm5ldC9saWNlbnNlL21pdAogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VhcmNoYnVpbGRlci9qcy9kYXRhVGFibGVzLnNlYXJjaEJ1aWxkZXIubWpzOgogICgqISBTZWFyY2hCdWlsZGVyIDEuOC4wCiAgICogwqlTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZS9taXQKICAgKikKCmRhdGF0YWJsZXMubmV0LXNlYXJjaGJ1aWxkZXItZHQvanMvc2VhcmNoQnVpbGRlci5kYXRhVGFibGVzLm1qczoKICAoKiEgRGF0YVRhYmxlcyBpbnRlZ3JhdGlvbiBmb3IgRGF0YVRhYmxlcycgU2VhcmNoQnVpbGRlcgogICAqIMKpIFNwcnlNZWRpYSBMdGQgLSBkYXRhdGFibGVzLm5ldC9saWNlbnNlCiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWFyY2hwYW5lcy9qcy9kYXRhVGFibGVzLnNlYXJjaFBhbmVzLm1qczoKICAoKiEgU2VhcmNoUGFuZXMgMi4zLjIKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VhcmNocGFuZXMtZHQvanMvc2VhcmNoUGFuZXMuZGF0YVRhYmxlcy5tanM6CiAgKCohIEJvb3RzdHJhcCBpbnRlZ3JhdGlvbiBmb3IgRGF0YVRhYmxlcycgU2VhcmNoUGFuZXMKICAgKiDCqSBTcHJ5TWVkaWEgTHRkIC0gZGF0YXRhYmxlcy5uZXQvbGljZW5zZQogICAqKQoKZGF0YXRhYmxlcy5uZXQtc2VsZWN0L2pzL2RhdGFUYWJsZXMuc2VsZWN0Lm1qczoKICAoKiEgU2VsZWN0IGZvciBEYXRhVGFibGVzIDIuMC41CiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UvbWl0CiAgICopCgpkYXRhdGFibGVzLm5ldC1zZWxlY3QtZHQvanMvc2VsZWN0LmRhdGFUYWJsZXMubWpzOgogICgqISBEYXRhVGFibGVzIHN0eWxpbmcgd3JhcHBlciBmb3IgU2VsZWN0CiAgICogwqkgU3ByeU1lZGlhIEx0ZCAtIGRhdGF0YWJsZXMubmV0L2xpY2Vuc2UKICAgKikKKi8K\";\n",
       "</script>\n",
       "<noscript>\n",
       "<div style=\"float:left; margin-right: 10px;\">\n",
       "<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
       "    <g style=\"fill:#d9d7fc\">\n",
       "        <path d=\"M100,400H500V357H100Z\" />\n",
       "        <path d=\"M100,300H400V257H100Z\" />\n",
       "        <path d=\"M0,200H400V157H0Z\" />\n",
       "        <path d=\"M100,100H500V57H100Z\" />\n",
       "        <path d=\"M100,350H500V307H100Z\" />\n",
       "        <path d=\"M100,250H400V207H100Z\" />\n",
       "        <path d=\"M0,150H400V107H0Z\" />\n",
       "        <path d=\"M100,50H500V7H100Z\" />\n",
       "    </g>\n",
       "    <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
       "   <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"0;0;400\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;300;0\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;400\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
       "            <g transform=\"translate(45 50) rotate(-45)\">\n",
       "                <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
       "                <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(450 152)\">\n",
       "                <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
       "                <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(50 352)\">\n",
       "                <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
       "                <polygon points=\"-35,10 0,45 35,10\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(75 250)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(425 250) rotate(180)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "        </g>\n",
       "    </g>\n",
       "</svg>\n",
       "</a>\n",
       "</div>\n",
       "\n",
       "This is the <code>init_notebook_mode</code> cell from ITables v2.2.2<br>\n",
       "(you should not see this message - is your notebook <it>trusted</it>?)\n",
       "</noscript>\n",
       "</div>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from itables import init_notebook_mode\n",
    "\n",
    "init_notebook_mode(all_interactive=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "domains   = pd.read_csv('/vol/sleepstudy/datasets/mesa/datasets/mesa-data-dictionary-0.7.0-domains.csv')\n",
    "forms     = pd.read_csv('/vol/sleepstudy/datasets/mesa/datasets/mesa-data-dictionary-0.7.0-forms.csv')\n",
    "variables = pd.read_csv('/vol/sleepstudy/datasets/mesa/datasets/mesa-data-dictionary-0.7.0-variables.csv')\n",
    "dataset   = pd.read_csv('/vol/sleepstudy/datasets/mesa/datasets/mesa-sleep-dataset-0.7.0.csv')\n",
    "harm_data = pd.read_csv('/vol/sleepstudy/datasets/mesa/datasets/mesa-sleep-harmonized-dataset-0.7.0.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"itables_cb9d068d_6ae0_462a_acd0_5bf13bd157f3\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
       "<thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>folder</th>\n",
       "      <th>domain_id</th>\n",
       "      <th>value</th>\n",
       "      <th>display_name</th>\n",
       "      <th>description</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr>\n",
       "<td style=\"vertical-align:middle; text-align:left\">\n",
       "<div style=\"float:left; margin-right: 10px;\">\n",
       "<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
       "    <g style=\"fill:#d9d7fc\">\n",
       "        <path d=\"M100,400H500V357H100Z\" />\n",
       "        <path d=\"M100,300H400V257H100Z\" />\n",
       "        <path d=\"M0,200H400V157H0Z\" />\n",
       "        <path d=\"M100,100H500V57H100Z\" />\n",
       "        <path d=\"M100,350H500V307H100Z\" />\n",
       "        <path d=\"M100,250H400V207H100Z\" />\n",
       "        <path d=\"M0,150H400V107H0Z\" />\n",
       "        <path d=\"M100,50H500V7H100Z\" />\n",
       "    </g>\n",
       "    <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
       "   <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"0;0;400\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;300;0\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;400\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
       "            <g transform=\"translate(45 50) rotate(-45)\">\n",
       "                <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
       "                <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(450 152)\">\n",
       "                <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
       "                <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(50 352)\">\n",
       "                <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
       "                <polygon points=\"-35,10 0,45 35,10\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(75 250)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(425 250) rotate(180)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "        </g>\n",
       "    </g>\n",
       "</svg>\n",
       "</a>\n",
       "</div>\n",
       "<div>\n",
       "Loading ITables v2.2.2 from the <code>init_notebook_mode</code> cell...\n",
       "(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
       "</div>\n",
       "</tr></tbody>\n",
       "\n",
       "</table>\n",
       "<script type=\"module\">\n",
       "    const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_2_2);\n",
       "\n",
       "    document.querySelectorAll(\"#itables_cb9d068d_6ae0_462a_acd0_5bf13bd157f3:not(.dataTable)\").forEach(table => {\n",
       "        if (!(table instanceof HTMLTableElement))\n",
       "            return;\n",
       "\n",
       "        // Define the table data\n",
       "        const data = [[NaN, \"checkednotchecked\", \"0\", \"Not checked\", NaN], [NaN, \"checkednotchecked\", \"1\", \"Checked\", NaN], [NaN, \"daylightsavingoverlap\", \"0\", \"No overlap \", NaN], [NaN, \"daylightsavingoverlap\", \"1\", \" Overlaps with DST Start \", NaN], [NaN, \"daylightsavingoverlap\", \"2\", \"Overlaps with DST End\", NaN], [NaN, \"dozingchance\", \"1\", \"No chance\", NaN], [NaN, \"dozingchance\", \"2\", \"Slight chance\", NaN], [NaN, \"dozingchance\", \"3\", \"Moderate chance\", NaN], [NaN, \"dozingchance\", \"4\", \"High chance\", NaN], [NaN, \"examnumber\", \"5\", \"Exam 5\", NaN], [NaN, \"feelingbest\", \"1\", \"5:00 - 6:30 AM\", NaN], [NaN, \"feelingbest\", \"2\", \"6:30 - 7:45 AM\", NaN], [NaN, \"feelingbest\", \"3\", \"7:45 - 9:45 AM\", NaN], [NaN, \"feelingbest\", \"4\", \"9:45 - 11:00 AM\", NaN], [NaN, \"feelingbest\", \"5\", \"After 11:00 AM\", NaN], [NaN, \"feelingpeak\", \"1\", \"5:00 - 8:00 AM\", NaN], [NaN, \"feelingpeak\", \"2\", \"8:00 - 10:00 AM\", NaN], [NaN, \"feelingpeak\", \"3\", \"10:00 - 4:45 PM\", NaN], [NaN, \"feelingpeak\", \"4\", \"4:45 - 9:45 PM\", NaN], [NaN, \"feelingpeak\", \"5\", \"After 9:45 PM\", NaN], [NaN, \"freq4weeks\", \"1\", \"No, not in the past 4 weeks\", NaN], [NaN, \"freq4weeks\", \"2\", \"Yes, less than once a week\", NaN], [NaN, \"freq4weeks\", \"3\", \"Yes, 1 or 2 times a week\", NaN], [NaN, \"freq4weeks\", \"4\", \"Yes, 3 or 4 times a week\", NaN], [NaN, \"freq4weeks\", \"5\", \"Yes, 5 or more times a week\", NaN], [NaN, \"freq4weeksdk\", \"1\", \"Never\", NaN], [NaN, \"freq4weeksdk\", \"2\", \"Rarely (1-2 nights a week)\", NaN], [NaN, \"freq4weeksdk\", \"3\", \"Sometimes (3-5 nights a week)\", NaN], [NaN, \"freq4weeksdk\", \"4\", \"Always or almost always (6-7 nights a week)\", NaN], [NaN, \"freq4weeksdk\", \"9\", \"Don't know\", NaN], [NaN, \"gender\", \"0\", \"Female\", NaN], [NaN, \"gender\", \"1\", \"Male\", NaN], [NaN, \"mosttired\", \"1\", \"8:00 - 9:00 PM\", NaN], [NaN, \"mosttired\", \"2\", \"9:00 - 10:15 PM\", NaN], [NaN, \"mosttired\", \"3\", \"10:15 - 12:45 AM\", NaN], [NaN, \"mosttired\", \"4\", \"12:45 - 2:00 AM\", NaN], [NaN, \"mosttired\", \"5\", \"After 2:00 AM\", NaN], [NaN, \"noyes\", \"0\", \"No\", NaN], [NaN, \"noyes\", \"1\", \"Yes\", NaN], [NaN, \"noyesdk\", \"0\", \"No\", NaN], [NaN, \"noyesdk\", \"1\", \"Yes\", NaN], [NaN, \"noyesdk\", \"9\", \"Do not know\", NaN], [NaN, \"noyesinc\", \"0\", \"No\", NaN], [NaN, \"noyesinc\", \"1\", \"Yes\", NaN], [NaN, \"noyesinc\", \"9\", \"Incomplete\", NaN], [NaN, \"nsrr_age_gt89\", \"no\", \"no\", NaN], [NaN, \"nsrr_age_gt89\", \"yes\", \"yes\", NaN], [NaN, \"nsrr_current_smoker\", \"no\", \"no\", NaN], [NaN, \"nsrr_current_smoker\", \"yes\", \"yes\", NaN], [NaN, \"nsrr_current_smoker\", \"not reported\", \"not reported\", NaN], [NaN, \"nsrr_ever_smoker\", \"no\", \"no\", NaN], [NaN, \"nsrr_ever_smoker\", \"yes\", \"yes\", NaN], [NaN, \"nsrr_ever_smoker\", \"not reported\", \"not reported\", NaN], [NaN, \"nsrr_flag_spsw\", \"sleep/wake only\", \"sleep/wake only\", NaN], [NaN, \"nsrr_flag_spsw\", \"full scoring\", \"full scoring\", NaN], [NaN, \"nsrr_flag_spsw\", \"unknown\", \"unknown\", NaN], [NaN, \"nsrr_race\", \"white\", \"white\", NaN], [NaN, \"nsrr_race\", \"american indian or alaska native\", \"american indian or alaska native\", NaN], [NaN, \"nsrr_race\", \"black or african american\", \"black or african american\", NaN], [NaN, \"nsrr_race\", \"asian\", \"asian\", NaN], [NaN, \"nsrr_race\", \"native hawaiian or other pacific islander\", \"native hawaiian or other pacific islander\", NaN], [NaN, \"nsrr_race\", \"hispanic\", \"hispanic\", NaN], [NaN, \"nsrr_race\", \"multiple\", \"multiple\", NaN], [NaN, \"nsrr_race\", \"other\", \"other\", NaN], [NaN, \"nsrr_race\", \"unknown\", \"unknown\", NaN], [NaN, \"nsrr_race\", \"not reported\", \"not reported\", NaN], [NaN, \"nsrr_race\", \"not allowed to collect\", \"not allowed to collect\", NaN], [NaN, \"nsrr_sex\", \"female\", \"female\", NaN], [NaN, \"nsrr_sex\", \"male\", \"male\", NaN], [NaN, \"nsrr_sex\", \"not reported\", \"not reported\", NaN], [NaN, \"overallqualitygrade\", \"2\", \"Poor\", NaN], [NaN, \"overallqualitygrade\", \"3\", \"Fair\", NaN], [NaN, \"overallqualitygrade\", \"4\", \"Good\", NaN], [NaN, \"overallqualitygrade\", \"5\", \"Very Good\", NaN], [NaN, \"overallqualitygrade\", \"6\", \"Excellent\", NaN], [NaN, \"overallqualitygrade\", \"7\", \"Outstanding\", NaN], [NaN, \"overallstudyqualitygrade\", \"2\", \"Failed\", NaN], [NaN, \"overallstudyqualitygrade\", \"3\", \"Fair\", NaN], [NaN, \"overallstudyqualitygrade\", \"4\", \"Good\", NaN], [NaN, \"overallstudyqualitygrade\", \"5\", \"Very Good\", NaN], [NaN, \"overallstudyqualitygrade\", \"6\", \"Excellent\", NaN], [NaN, \"overallstudyqualitygrade\", \"7\", \"Outstanding\", NaN], [NaN, \"persontype\", \"1\", \"Definitely a morning type\", NaN], [NaN, \"persontype\", \"2\", \"Rather more a morning than an evening type\", NaN], [NaN, \"persontype\", \"3\", \"Rather more an evening than a morning type\", NaN], [NaN, \"persontype\", \"4\", \"Definitely an evening type\", NaN], [NaN, \"persontype\", \"5\", \"Neither a morning or an evening type\", NaN], [NaN, \"psgpassfail\", \"1\", \"Passed\", NaN], [NaN, \"psgpassfail\", \"2\", \"Failed at RC\", NaN], [NaN, \"psgpassfail\", \"3\", \"Failed-study not sent\", NaN], [NaN, \"psgreasonfail\", \"1\", \"Oximetry\", NaN], [NaN, \"psgreasonfail\", \"2\", \"EEG\", NaN], [NaN, \"psgreasonfail\", \"3\", \"Short recording\", NaN], [NaN, \"psgreasonfail\", \"4\", \"Other\", NaN], [NaN, \"psgreasonfail\", \"5\", \"No signals\", NaN], [NaN, \"psgreasonfail\", \"6\", \"Participant\", NaN], [NaN, \"psgreasonfail\", \"7\", \"Missing files\", NaN], [NaN, \"psgsignalquality\", \"1\", \"Signal good for < 25% of sleep time\", NaN], [NaN, \"psgsignalquality\", \"2\", \"Signal good for 25-49% of sleep time\", NaN], [NaN, \"psgsignalquality\", \"3\", \"Signal good for 50-74% of sleep time\", NaN], [NaN, \"psgsignalquality\", \"4\", \"Signal good for 75-94% of sleep time\", NaN], [NaN, \"psgsignalquality\", \"5\", \"Signal good >= 95% of sleep time\", NaN], [NaN, \"race\", \"1\", \"White, Caucasian\", NaN], [NaN, \"race\", \"2\", \"Chinese American\", NaN], [NaN, \"race\", \"3\", \"Black, African-American\", NaN], [NaN, \"race\", \"4\", \"Hispanic\", NaN], [NaN, \"site\", \"3\", \"WFU\", NaN], [NaN, \"site\", \"4\", \"COL\", NaN], [NaN, \"site\", \"5\", \"JHU\", NaN], [NaN, \"site\", \"6\", \"MN\", NaN], [NaN, \"site\", \"7\", \"NWU\", NaN], [NaN, \"site\", \"8\", \"UCLA\", NaN], [NaN, \"sleepdiarycomplete\", \"0\", \"Sleep diary absent\", NaN], [NaN, \"sleepdiarycomplete\", \"1\", \"Incomplete (<75%)\", NaN], [NaN, \"sleepdiarycomplete\", \"2\", \"Mostly complete (>=75%)\", NaN], [NaN, \"sleepdiarypresabs\", \"0\", \"Sleep diary absent\", NaN], [NaN, \"sleepdiarypresabs\", \"1\", \"Sleep diary present\", NaN], [NaN, \"smokingstatus\", \"0\", \"Never smoked\", NaN], [NaN, \"smokingstatus\", \"1\", \"Former smoker quit more than 1 year ago\", NaN], [NaN, \"smokingstatus\", \"2\", \"Former smoker quit less than 1 year ago\", NaN], [NaN, \"smokingstatus\", \"3\", \"Current smoker\", NaN], [NaN, \"smokingstatus\", \"4\", \"Do not know\", NaN], [NaN, \"tiredafter\", \"1\", \"Very tired\", NaN], [NaN, \"tiredafter\", \"2\", \"Fairly tired\", NaN], [NaN, \"tiredafter\", \"3\", \"Fairly refreshed\", NaN], [NaN, \"tiredafter\", \"4\", \"Very refreshed\", NaN], [NaN, \"typicalsleep\", \"0\", \"Very sound or restful\", NaN], [NaN, \"typicalsleep\", \"1\", \"Sound and restful\", NaN], [NaN, \"typicalsleep\", \"2\", \"Average quality\", NaN], [NaN, \"typicalsleep\", \"3\", \"Restless\", NaN], [NaN, \"typicalsleep\", \"4\", \"Very restless\", NaN], [NaN, \"urgentunusualhr\", \"0\", \"No heart rate issues\", NaN], [NaN, \"urgentunusualhr\", \"1\", \"Abnormalitites seen-not clinically\", NaN], [NaN, \"urgentunusualhr\", \"2\", \"Potential urgent- A-fib/flutter HR\", NaN], [NaN, \"urgentunusualhr\", \"4\", \"Urgent referral- heart rate (No A-Fib) \", NaN], [NaN, \"usualwork\", \"1\", \"Day shift\", NaN], [NaN, \"usualwork\", \"2\", \"Afternoon shift\", NaN], [NaN, \"usualwork\", \"3\", \"Night shift\", NaN], [NaN, \"usualwork\", \"4\", \"Split shift\", NaN], [NaN, \"usualwork\", \"5\", \"Irregular shift / on-call\", NaN], [NaN, \"usualwork\", \"6\", \"Rotating shifts\", NaN], [NaN, \"usualwork\", \"7\", \"Do not work\", NaN]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"layout\": {\"topStart\": \"pageLength\", \"topEnd\": \"search\", \"bottomStart\": \"info\", \"bottomEnd\": \"paging\"}, \"order\": [], \"warn_on_selected_rows_not_rendered\": true};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        \n",
       "        new DataTable(table, dt_args);\n",
       "    });\n",
       "</script>\n"
      ],
      "text/plain": [
       "     folder              domain_id value               display_name  \\\n",
       "0       NaN      checkednotchecked     0                Not checked   \n",
       "1       NaN      checkednotchecked     1                    Checked   \n",
       "2       NaN  daylightsavingoverlap     0                No overlap    \n",
       "3       NaN  daylightsavingoverlap     1   Overlaps with DST Start    \n",
       "4       NaN  daylightsavingoverlap     2      Overlaps with DST End   \n",
       "..      ...                    ...   ...                        ...   \n",
       "137     NaN              usualwork     3                Night shift   \n",
       "138     NaN              usualwork     4                Split shift   \n",
       "139     NaN              usualwork     5  Irregular shift / on-call   \n",
       "140     NaN              usualwork     6            Rotating shifts   \n",
       "141     NaN              usualwork     7                Do not work   \n",
       "\n",
       "     description  \n",
       "0            NaN  \n",
       "1            NaN  \n",
       "2            NaN  \n",
       "3            NaN  \n",
       "4            NaN  \n",
       "..           ...  \n",
       "137          NaN  \n",
       "138          NaN  \n",
       "139          NaN  \n",
       "140          NaN  \n",
       "141          NaN  \n",
       "\n",
       "[142 rows x 5 columns]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "domains"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"itables_eda33ee8_a238_49fe_a887_976d508b5273\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
       "<thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>folder</th>\n",
       "      <th>id</th>\n",
       "      <th>display_name</th>\n",
       "      <th>code_book</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr>\n",
       "<td style=\"vertical-align:middle; text-align:left\">\n",
       "<div style=\"float:left; margin-right: 10px;\">\n",
       "<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
       "    <g style=\"fill:#d9d7fc\">\n",
       "        <path d=\"M100,400H500V357H100Z\" />\n",
       "        <path d=\"M100,300H400V257H100Z\" />\n",
       "        <path d=\"M0,200H400V157H0Z\" />\n",
       "        <path d=\"M100,100H500V57H100Z\" />\n",
       "        <path d=\"M100,350H500V307H100Z\" />\n",
       "        <path d=\"M100,250H400V207H100Z\" />\n",
       "        <path d=\"M0,150H400V107H0Z\" />\n",
       "        <path d=\"M100,50H500V7H100Z\" />\n",
       "    </g>\n",
       "    <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
       "   <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"0;0;400\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;300;0\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;400\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
       "            <g transform=\"translate(45 50) rotate(-45)\">\n",
       "                <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
       "                <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(450 152)\">\n",
       "                <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
       "                <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(50 352)\">\n",
       "                <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
       "                <polygon points=\"-35,10 0,45 35,10\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(75 250)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(425 250) rotate(180)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "        </g>\n",
       "    </g>\n",
       "</svg>\n",
       "</a>\n",
       "</div>\n",
       "<div>\n",
       "Loading ITables v2.2.2 from the <code>init_notebook_mode</code> cell...\n",
       "(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
       "</div>\n",
       "</tr></tbody>\n",
       "\n",
       "</table>\n",
       "<script type=\"module\">\n",
       "    const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_2_2);\n",
       "\n",
       "    document.querySelectorAll(\"#itables_eda33ee8_a238_49fe_a887_976d508b5273:not(.dataTable)\").forEach(table => {\n",
       "        if (!(table instanceof HTMLTableElement))\n",
       "            return;\n",
       "\n",
       "        // Define the table data\n",
       "        const data = [[NaN, \"mesa_qs_annotated\", \"MESA PSG QS Form\", \"MESA_PSG_QS_Annotated.pdf\"], [NaN, \"mesa_sleep_questionnaire\", \"MESA Sleep Questionnaire\", \"MESA_Sleep_Questionnaire.pdf\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"layout\": {\"topStart\": null, \"topEnd\": null, \"bottomStart\": null, \"bottomEnd\": null}, \"order\": [], \"warn_on_selected_rows_not_rendered\": true};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        \n",
       "        new DataTable(table, dt_args);\n",
       "    });\n",
       "</script>\n"
      ],
      "text/plain": [
       "   folder                        id              display_name  \\\n",
       "0     NaN         mesa_qs_annotated          MESA PSG QS Form   \n",
       "1     NaN  mesa_sleep_questionnaire  MESA Sleep Questionnaire   \n",
       "\n",
       "                      code_book  \n",
       "0     MESA_PSG_QS_Annotated.pdf  \n",
       "1  MESA_Sleep_Questionnaire.pdf  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forms"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"itables_1ab1df67_a63e_48f0_a231_64d532f23b7f\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
       "<thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>folder</th>\n",
       "      <th>id</th>\n",
       "      <th>display_name</th>\n",
       "      <th>description</th>\n",
       "      <th>type</th>\n",
       "      <th>units</th>\n",
       "      <th>domain</th>\n",
       "      <th>labels</th>\n",
       "      <th>calculation</th>\n",
       "      <th>commonly_used</th>\n",
       "      <th>forms</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr>\n",
       "<td style=\"vertical-align:middle; text-align:left\">\n",
       "<div style=\"float:left; margin-right: 10px;\">\n",
       "<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
       "    <g style=\"fill:#d9d7fc\">\n",
       "        <path d=\"M100,400H500V357H100Z\" />\n",
       "        <path d=\"M100,300H400V257H100Z\" />\n",
       "        <path d=\"M0,200H400V157H0Z\" />\n",
       "        <path d=\"M100,100H500V57H100Z\" />\n",
       "        <path d=\"M100,350H500V307H100Z\" />\n",
       "        <path d=\"M100,250H400V207H100Z\" />\n",
       "        <path d=\"M0,150H400V107H0Z\" />\n",
       "        <path d=\"M100,50H500V7H100Z\" />\n",
       "    </g>\n",
       "    <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
       "   <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"0;0;400\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;300;0\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;400\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
       "            <g transform=\"translate(45 50) rotate(-45)\">\n",
       "                <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
       "                <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(450 152)\">\n",
       "                <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
       "                <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(50 352)\">\n",
       "                <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
       "                <polygon points=\"-35,10 0,45 35,10\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(75 250)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(425 250) rotate(180)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "        </g>\n",
       "    </g>\n",
       "</svg>\n",
       "</a>\n",
       "</div>\n",
       "<div>\n",
       "Loading ITables v2.2.2 from the <code>init_notebook_mode</code> cell...\n",
       "(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
       "</div>\n",
       "</tr></tbody>\n",
       "\n",
       "</table>\n",
       "<script type=\"module\">\n",
       "    const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_2_2);\n",
       "\n",
       "    document.querySelectorAll(\"#itables_1ab1df67_a63e_48f0_a231_64d532f23b7f:not(.dataTable)\").forEach(table => {\n",
       "        if (!(table instanceof HTMLTableElement))\n",
       "            return;\n",
       "\n",
       "        // Define the table data\n",
       "        const data = [[\"Administrative\", \"cucmcn1c\", \"Current participant consent for commercial use of data\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Administrative\", \"examnumber\", \"MESA exam number\", \"Note: The MESA Sleep ancillary study took place during MESA Exam 5.\", \"choices\", \"NaN\", \"examnumber\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Administrative\", \"gender1\", \"Gender of the participant\", \"NaN\", \"choices\", \"NaN\", \"gender\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Administrative\", \"mesaid\", \"MESA BioLINCC ID\", \"This subject identifier code matches what has been used previously in MESA datasets on BioLINCC.\", \"identifier\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Administrative\", \"race1c\", \"Race/ethnicity of the participant\", \"Note from MESA Coordinating Center: It is recommended that Investigators make use of the terminology \\\"race/ethnicity\\\" when publishing or presenting variable race1c results (e.g. descriptive summaries, associations, ...).  It has been noted that Chinese and Hispanic are not race groups, and that race itself is an ill-defined, non-scientific concept.\", \"choices\", \"NaN\", \"race\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Administrative\", \"site5c\", \"Site at Exam 5\", \"NaN\", \"choices\", \"NaN\", \"site\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Administrative\", \"sleepage5c\", \"Participant Age at MESA Sleep Visit\", \"NaN\", \"integer\", \"years\", \"NaN\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Administrative\", \"sleepqsid\", \"Sleep questionnaire staff ID\", \"NaN\", \"string\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Anthropometry\", \"bmi5c\", \"Body mass index\", \"NaN\", \"numeric\", \"kilograms per meters squared (kg/m2)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Anthropometry\", \"htcm5\", \"Height (cm)\", \"NaN\", \"numeric\", \"centimeters (cm)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Anthropometry\", \"wtlb5\", \"Weight (lbs)\", \"NaN\", \"numeric\", \"pounds (lb)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"avnn_fn5\", \"Normal-to-normal intervals, full night: Mean\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"hf_fn5\", \"Normal-to-normal intervals between 0.15 and 0.4 Hz, full night: Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"hfn_fn5\", \"Low frequency power, full night: Normalized ratio\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"ihr_fn5\", \"Instantaneous heart rate, full night: Average\", \"NaN\", \"numeric\", \"beats per minute (bpm)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"lf_fn5\", \"Normal-to-normal intervals between 0.04 and 0.15 Hz, full night: Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"lf_hf_fn5\", \"Low frequency power / high frequency power, full night\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"lfn_fn5\", \"High frequency power, full night: Normalized ratio\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"nn_rr_fn5\", \"Consecutive normal-to-normal intervals / all inter-beat intervals, full night\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"pnn10_fn5\", \"Adjacent normal-to-normal intervals, full night: Percentage of differences > 10 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"pnn20_fn5\", \"Adjacent normal-to-normal intervals, full night: Percentage of differences > 20 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"pnn30_fn5\", \"Adjacent normal-to-normal intervals, full night: Percentage of differences > 30 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"pnn40_fn5\", \"Adjacent normal-to-normal intervals, full night: Percentage of differences > 40 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"pnn50_fn5\", \"Adjacent normal-to-normal intervals, full night: Percentage of differences > 50 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"rmssd_fn5\", \"Adjacent normal-to-normal intervals, full night: Square root of the mean of the squares of differences\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"sdann_fn5\", \"Normal-to-normal intervals in all 5-minute segments, full night: Standard deviation of the averages\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"sdnn_fn5\", \"Normal-to-normal intervals, full night: Standard deviation\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"sdnnidx_fn5\", \"Normal-to-normal intervals in all 5-minute segments, full night: Mean of the standard deviations\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"totpwr_fn5\", \"Normal-to-normal intervals up to 0.04 Hz, full night: Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"ulf_fn5\", \"Normal-to-normal intervals up to 0.003 Hz, full night: Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Full Night\", \"vlf_fn5\", \"Normal-to-normal intervals between 0.003 and 0.04 Hz (and between 0 and 0.04 Hz in 5-minute windows), full night:  Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"avnn_5m5\", \"Normal-to-normal intervals, non-overlapping windows: Mean\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"hf_5m5\", \"Normal-to-normal intervals between 0.15 and 0.4 Hz, non-overlapping windows: Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"hfn_5m5\", \"Low frequency power, non-overlapping windows: Normalized ratio\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"ihr_5m5\", \"Instantaneous heart rate, non-overlapping windows: Average\", \"NaN\", \"numeric\", \"beats per minute (bpm)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"lf_5m5\", \"Normal-to-normal intervals between 0.04 and 0.15 Hz, non-overlapping windows: Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"lf_hf_5m5\", \"Low frequency power / high frequency power, non-overlapping windows\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"lfn_5m5\", \"High frequency power, non-overlapping windows: Normalized ratio\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"nn_rr_5m5\", \"Consecutive normal-to-normal intervals / all inter-beat intervals, non-overlapping windows\", \"NaN\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"pnn10_5m5\", \"Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 10 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"pnn20_5m5\", \"Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 20 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"pnn30_5m5\", \"Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 30 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"pnn40_5m5\", \"Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 40 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"pnn50_5m5\", \"Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 50 ms\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"rmssd_5m5\", \"Adjacent normal-to-normal intervals, non-overlapping windows: Square root of the mean of the squares of differences\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"sdnn_5m5\", \"Normal-to-normal intervals, non-overlapping windows: Standard deviation\", \"NaN\", \"numeric\", \"milliseconds (ms)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"totpwr_5m5\", \"Normal-to-normal intervals up to 0.04 Hz, non-overlapping windows: Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Clinical Data/Diagnostic Studies/Heart Rate Variability/Non-Overlapping Windows\", \"vlf_5m5\", \"Normal-to-normal intervals between 0.003 and 0.04 Hz (and between 0 and 0.04 Hz in 5-minute windows), non-overlapping windows:  Total spectral power\", \"NaN\", \"numeric\", \"milliseconds squared\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Demographics/Employment\", \"extrahrs5\", \"Days per month working extra hours beyong usual schedule\", \"Original question: *23. How many days per month do you work extra hours beyond your usual schedule?*\", \"integer\", \"days\", \"NaN\", \"work_schedule\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Demographics/Employment\", \"wrksched5\", \"Usual work schedule\", \"Original question: *22. Which of the following best describes your usual work schedule?*\", \"choices\", \"NaN\", \"usualwork\", \"work_schedule\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Harmonized/Anthropometry\", \"nsrr_bmi\", \"Body mass index (BMI)\", \"Harmonized by the NSRR team to align with <a href=\\\"https://github.com/UW-GAC/topmed-dcc-harmonized-phenotypes\\\" target=\\\"_blank\\\">TOPMed</a> and <a href=\\\"https://github.com/uc-cdis/gtex-dictionary/tree/master/gdcdictionary/schemas/\\\" target=\\\"_blank\\\">BioDataCatalyst standards</a>. Source: :bmi5c:\", \"numeric\", \"kilograms per meters squared (kg/m2)\", \"NaN\", \"bmi\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Demographics\", \"nsrr_age\", \"Subject age\", \"Harmonized by the NSRR team to align with <a href=\\\"https://github.com/UW-GAC/topmed-dcc-harmonized-phenotypes\\\" target=\\\"_blank\\\">TOPMed</a> and <a href=\\\"https://github.com/uc-cdis/gtex-dictionary/tree/master/gdcdictionary/schemas/\\\" target=\\\"_blank\\\">BioDataCatalyst standards</a>. Source: :sleepage5c: at Visit 5\", \"numeric\", \"years\", \"NaN\", \"age\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Demographics\", \"nsrr_age_gt89\", \"Indicates whether the subject's age (in years) used during date obfuscation is greater than 89 years\", \"Harmonized by the NSRR team to align with <a href=\\\"https://github.com/UW-GAC/topmed-dcc-harmonized-phenotypes\\\" target=\\\"_blank\\\">TOPMed</a> and <a href=\\\"https://github.com/uc-cdis/gtex-dictionary/tree/master/gdcdictionary/schemas/\\\" target=\\\"_blank\\\">BioDataCatalyst standards</a>. Source: :sleepage5c: at Visit 5\", \"choices\", \"NaN\", \"nsrr_age_gt89\", \"age_gt89\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Demographics\", \"nsrr_race\", \"Subject race\", \"Harmonized by the NSRR team to align with <a href=\\\"https://github.com/UW-GAC/topmed-dcc-harmonized-phenotypes\\\" target=\\\"_blank\\\">TOPMed</a> and <a href=\\\"https://github.com/uc-cdis/gtex-dictionary/tree/master/gdcdictionary/schemas/\\\" target=\\\"_blank\\\">BioDataCatalyst standards</a>. Source: :race1c: at Visit 5\", \"choices\", \"NaN\", \"nsrr_race\", \"race\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Demographics\", \"nsrr_sex\", \"Subject sex\", \"Harmonized by the NSRR team to align with <a href=\\\"https://github.com/UW-GAC/topmed-dcc-harmonized-phenotypes\\\" target=\\\"_blank\\\">TOPMed</a> and <a href=\\\"https://github.com/uc-cdis/gtex-dictionary/tree/master/gdcdictionary/schemas/\\\" target=\\\"_blank\\\">BioDataCatalyst standards</a>. Source: :gender1: at Visit 5\", \"choices\", \"NaN\", \"nsrr_sex\", \"annotated_sex\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Lifestyle and Behavioral Health\", \"nsrr_current_smoker\", \"Currently smoking cigarettes\", \"Indicates whether subject currently smokes cigarettes. <br><br>Harmonized by the NSRR team to align with <a href=\\\"https://github.com/UW-GAC/topmed-dcc-harmonized-phenotypes\\\" target=\\\"_blank\\\">TOPMed</a> and <a href=\\\"https://github.com/uc-cdis/gtex-dictionary/tree/master/gdcdictionary/schemas/\\\" target=\\\"_blank\\\">BioDataCatalyst standards</a>. Source: :cursmk5:\", \"choices\", \"NaN\", \"nsrr_current_smoker\", \"current_smoker;smoking\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Lifestyle and Behavioral Health\", \"nsrr_ever_smoker\", \"Ever smoked cigarettes\", \"Indicates whether subject ever regularly smoked cigarettes. <br><br>Harmonized by the NSRR team to align with <a href=\\\"https://github.com/UW-GAC/topmed-dcc-harmonized-phenotypes\\\" target=\\\"_blank\\\">TOPMed</a> and <a href=\\\"https://github.com/uc-cdis/gtex-dictionary/tree/master/gdcdictionary/schemas/\\\" target=\\\"_blank\\\">BioDataCatalyst standards</a>. Source: :smkstat5:\", \"choices\", \"NaN\", \"nsrr_ever_smoker\", \"ever_smoker;smoking\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Apnea-Hypopnea Indices\", \"nsrr_ahi_hp3r_aasm15\", \"Apnea-Hypopnea Index : (All apneas + hypopneas with >=30% nasal cannula [or alternative sensor] reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep \", \"Harmonized by the NSRR team. <br><br> The definition for hypopneas is consistent with the following clinical guidelines: (1) American Academy of Sleep Medicine (AASM) 2007 Manual (2012 update) (recommended). [Berry RB et al. 2012 (PubMed ID:23066376)] (https://www.ncbi.nlm.nih.gov/pubmed/23066376), and (2) American Academy of Sleep Medicine (AASM) 2015 (recommended) [Berry RB et al. The AASM Manual for the Scoring of Sleep and Associated Events: Rules, Terminology and Technical Specifications, Version 2.2. American Academy of Sleep Medicine, Darien, IL, 2015.]<br><br> Refer to the source for detailed definition for respiratory events: :ahi_a0h3a:\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_ap0uhp3x3r_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Apnea-Hypopnea Indices\", \"nsrr_ahi_hp3u\", \"Apnea-Hypopnea Index : (All apneas + hypopneas with >= 3% oxygen desaturation) / hour of sleep \", \"Harmonized by the NSRR team. Refer to the source for detailed definition for respiratory events: :ahi_a0h3:\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_ap0uhp3x3u_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Apnea-Hypopnea Indices\", \"nsrr_ahi_hp4r\", \"Apnea-Hypopnea Index : (All apneas + hypopneas with >= 4% oxygen desaturation or with arousal) / hour of sleep \", \"Harmonized by the NSRR team. Refer to the source for detailed definition for respiratory events: :ahi_a0h4a:\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_ap0uhp3x4r_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Apnea-Hypopnea Indices\", \"nsrr_ahi_hp4u_aasm15\", \"Apnea-Hypopnea Index : (All apneas + hypopneas with >=30% nasal cannula [or alternative sensor] reduction with >= 4% oxygen desaturation) / hour of sleep\", \"Harmonized by the NSRR team.<br><br>The definition of hypopnea events is consistent with the following clinical guidelines: (1) AASM 2012 update (alternative) Berry RB et al. 2012 (PubMed ID:23066376), and (2) AASM 2015 (acceptable) [Berry RB et al. The AASM Manual for the Scoring of Sleep and Associated Events: Rules, Terminology and Technical Specifications, Version 2.2. American Academy of Sleep Medicine, Darien, IL, 2015.].<br><br> Refer to the source for detailed definition for respiratory events: :ahi_a0h4:\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_ap0uhp3x4u_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Arousal\", \"nsrr_phrnumar_f1\", \"Arousal Index: Number of arousals per hour of sleep from polysomnography\", \"Harmonized by the NSRR team. Source: :ai_all5:\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumar_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Signal Quality\", \"nsrr_flag_spsw\", \"Study scored sleep/wake rather than with full sleep staging if there is not sufficient quality on EEG lead. Studies scored as sleep wake have all sleep stages scored using a default of Stage 2 and no arousals are scored.  \", \"Harmonized by the NSRR team. Source: :slewake5:\", \"choices\", \"NaN\", \"nsrr_flag_spsw\", \"NaN\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_pctdursp_s1\", \"Percentage of total sleep duration (i.e., total sleep time, TST) in stage 1 from polysomnography\", \"Harmonized by the NSRR team. Source: :timest1p5:\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_s1_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_pctdursp_s2\", \"Percentage of total sleep duration (i.e., total sleep time, TST) in stage 2 from polysomnography\", \"Harmonized by the NSRR team. Source: :timest2p5:\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_s2_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_pctdursp_s3\", \"Percentage of total sleep duration (i.e., total sleep time, TST) in stage 3/4 from polysomnography\", \"Harmonized by the NSRR team. Source: :times34p5:\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_s3_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_pctdursp_sr\", \"Percentage of total sleep duration (i.e., total sleep time, TST) in REM from polysomnography\", \"Harmonized by the NSRR team. Source: :timeremp5:\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_sr_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_tib_f1\", \"Total In-bed Period: the interval between lights off/in-bed time and lights on/out-bed time from polysomnography\", \"Harmonized by the NSRR team. Conventionally, this would be called time in bed (TIB) <br><br> Source: :time_bed5:\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttlprdbd_f1t2;tib\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_tst_f1\", \"Total Sleep Duration: the interval between sleep onset and sleep offset while the participant is asleep from polysomnography\", \"Conventionally, this would be called total sleep time (TST) (i.e. total time spent in stage 1 or greater).<br><br>Harmonized by the NSRR team. Source: :slpprdp5:\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_f1t2;tst\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_ttldursp_s1sr\", \"REM Sleep Latency: the interval between the first sleep epoch and REM sleep excluding wake\", \"Harmonized by the NSRR team. Source: :remlaiip5:\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_s1sr_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_ttleffsp_f1\", \"Sleep Efficiency: the ratio of total sleep duration (i.e., total sleep time) to in-bed period (i.e., time in bed) from polysomnography\", \"Harmonized by the NSRR team. Source: :slp_eff5:\", \"numeric\", \"percent (%)\", \"NaN\", \"ttleffsp_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_ttllatsp_f1\", \"Sleep Latency: the interval between lights-out/in-bed time and sleep onset from polysomnography\", \"Harmonized by the NSRR team. Source: :slp_lat5:\", \"integer\", \"minutes (min)\", \"NaN\", \"ttllatsp_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_ttlmefsp_f1\", \"Sleep Maintenance Efficiency: the proportion of total sleep duration (i.e., total sleep time) in sleep period (i.e., interval between sleep onset and offset including wake) from polysomnography\", \"Harmonized by the NSRR team. Source: :slp_maint_eff5:\", \"numeric\", \"percent (%)\", \"NaN\", \"ttlmefsp_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_ttlprdsp_s1sr\", \"REM Sleep Latency: the interval between the first sleep epoch and REM sleep including wake\", \"Harmonized by the NSRR team. Source: :rem_lat15:\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttlprdsp_s1sr_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Harmonized/Polysomnography/Sleep Architecture\", \"nsrr_waso_f1\", \"Wake After Sleep Onset: the total duration being awake between sleep onset and lights-on/out-bed time from polysomnography\", \"Harmonized by the NSRR team. Source: :waso5:\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldurws_f1t2;waso\", \"NaN\", \"True\", \"NaN\"], [\"Lifestyle and Behavioral Health\", \"cursmk5\", \"Smoked cigarettes in last 30 days\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Lifestyle and Behavioral Health\", \"smkstat5\", \"Current smoking status\", \"NaN\", \"choices\", \"NaN\", \"smokingstatus\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avg24hrsleep5\", \"Average daily total sleep duration in main sleep and naps combined in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_ib_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avg24hrsleepnw5\", \"Average daily total sleep duration in main sleep and naps combined in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_ib_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avg24hrsleepwd5\", \"Average daily total sleep duration in main sleep and naps combined in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_ib_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avg24hrsleepwe5\", \"Average daily total sleep duration in main sleep and naps combined in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_ib_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avg24hrsleepwo5\", \"Average daily total sleep duration in main sleep and naps combined in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_ib_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgbluetalt5\", \"Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallb_ib_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgbluetaltnw5\", \"Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallb_ib_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgbluetaltwd5\", \"Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallb_ib_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgbluetaltwe5\", \"Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallb_ib_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgbluetaltwo5\", \"Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallb_ib_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgefficiency5\", \"Average daily sleep efficiency in all days  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgeffsp_im_w7_f2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgefficiencynw5\", \"Average daily sleep efficiency in non-workdays  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgeffsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgefficiencywd5\", \"Average daily sleep efficiency in weekdays  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgeffsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgefficiencywe5\", \"Average daily sleep efficiency in weekends  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgeffsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgefficiencywo5\", \"Average daily sleep efficiency in workdays  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgeffsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgfragmentation5\", \"Average daily total sleep fragmentation index in main sleep in all days  from actigraphy\", \"Sleep Fragmentation is an index of restlessness during the sleep period expressed as a percentage. [Kristen L et al. 2011 (PubMed ID:21411507)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3114508/) <br><br>There are three type of measures for sleep fragmentation: movement Index (MI), fragmentation index (FI), and total sleep fragmentation Index. The fragmentation index refers to the percentage of 60?s periods of sleep out of the total number of periods of immobility. The movement index refers to the total of scored awake minutes divided by sleep period (i.e. total time in bed). The total sleep fragmentation index is the sum of FI and MI. (ActiGraph validation reference)[https://actigraphcorp.force.com/support/s/article/Sleep-Fragmentation-Index-Validation-Reference]\", \"numeric\", \"percent (%)\", \"NaN\", \"avgindfg_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgfragmentationnw5\", \"Average daily total sleep fragmentation index in main sleep in non-workdays  from actigraphy\", \"Sleep Fragmentation is an index of restlessness during the sleep period expressed as a percentage. [Kristen L et al. 2011 (PubMed ID:21411507)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3114508/) <br><br>There are three type of measures for sleep fragmentation: movement Index (MI), fragmentation index (FI), and total sleep fragmentation Index. The fragmentation index refers to the percentage of 60?s periods of sleep out of the total number of periods of immobility. The movement index refers to the total of scored awake minutes divided by sleep period (i.e. total time in bed). The total sleep fragmentation index is the sum of FI and MI. (ActiGraph validation reference)[https://actigraphcorp.force.com/support/s/article/Sleep-Fragmentation-Index-Validation-Reference]\", \"numeric\", \"percent (%)\", \"NaN\", \"avgindfg_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgfragmentationwd5\", \"Average daily total sleep fragmentation index in main sleep in weekdays  from actigraphy\", \"Sleep Fragmentation is an index of restlessness during the sleep period expressed as a percentage. [Kristen L et al. 2011 (PubMed ID:21411507)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3114508/) <br><br>There are three type of measures for sleep fragmentation: movement Index (MI), fragmentation index (FI), and total sleep fragmentation Index. The fragmentation index refers to the percentage of 60?s periods of sleep out of the total number of periods of immobility. The movement index refers to the total of scored awake minutes divided by sleep period (i.e. total time in bed). The total sleep fragmentation index is the sum of FI and MI. (ActiGraph validation reference)[https://actigraphcorp.force.com/support/s/article/Sleep-Fragmentation-Index-Validation-Reference]\", \"numeric\", \"percent (%)\", \"NaN\", \"avgindfg_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgfragmentationwe5\", \"Average daily total sleep fragmentation index in main sleep in weekends  from actigraphy\", \"Sleep Fragmentation is an index of restlessness during the sleep period expressed as a percentage. [Kristen L et al. 2011 (PubMed ID:21411507)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3114508/) <br><br>There are three type of measures for sleep fragmentation: movement Index (MI), fragmentation index (FI), and total sleep fragmentation Index. The fragmentation index refers to the percentage of 60?s periods of sleep out of the total number of periods of immobility. The movement index refers to the total of scored awake minutes divided by sleep period (i.e. total time in bed). The total sleep fragmentation index is the sum of FI and MI. (ActiGraph validation reference)[https://actigraphcorp.force.com/support/s/article/Sleep-Fragmentation-Index-Validation-Reference]\", \"numeric\", \"percent (%)\", \"NaN\", \"avgindfg_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgfragmentationwo5\", \"Average daily total sleep fragmentation index in main sleep in workdays  from actigraphy\", \"Sleep Fragmentation is an index of restlessness during the sleep period expressed as a percentage. [Kristen L et al. 2011 (PubMed ID:21411507)](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3114508/) <br><br>There are three type of measures for sleep fragmentation: movement Index (MI), fragmentation index (FI), and total sleep fragmentation Index. The fragmentation index refers to the percentage of 60?s periods of sleep out of the total number of periods of immobility. The movement index refers to the total of scored awake minutes divided by sleep period (i.e. total time in bed). The total sleep fragmentation index is the sum of FI and MI. (ActiGraph validation reference)[https://actigraphcorp.force.com/support/s/article/Sleep-Fragmentation-Index-Validation-Reference]\", \"numeric\", \"percent (%)\", \"NaN\", \"avgindfg_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avggreentalt5\", \"Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallg_ib_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avggreentaltnw5\", \"Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallg_ib_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avggreentaltwd5\", \"Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallg_ib_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avggreentaltwe5\", \"Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallg_ib_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avggreentaltwo5\", \"Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallg_ib_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedduration5\", \"Average daily duration of rest period in all days  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbeddurationnw5\", \"Average daily duration of rest period in non-workdays  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbeddurationwd5\", \"Average daily duration of rest period in weekdays  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbeddurationwe5\", \"Average daily duration of rest period in weekends  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbeddurationwo5\", \"Average daily duration of rest period in workdays  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedtime5\", \"Average daily start time for rest period in all days  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"NaN\", \"NaN\", \"avgbptbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedtimenw5\", \"Average daily start time for rest period in non-workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"NaN\", \"NaN\", \"avgbptbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedtimewd5\", \"Average daily start time for rest period in weekdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"NaN\", \"NaN\", \"avgbptbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedtimewe5\", \"Average daily start time for rest period in weekends  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"NaN\", \"NaN\", \"avgbptbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedtimewo5\", \"Average daily start time for rest period in workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"NaN\", \"NaN\", \"avgbptbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedwake5\", \"Average daily duration of wake in bed in all days  from actigraphy\", \"Duration of wake in bed is the sum of sleep latency, wake after sleep onset (WASO) and wake after sleep offset in main sleep. Conventionally, this variable would be called \\\"total wake time\\\" (TWT).\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurwk_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedwakenw5\", \"Average daily duration of wake in bed in non-workdays  from actigraphy\", \"Duration of wake in bed is the sum of sleep latency, wake after sleep onset (WASO) and wake after sleep offset in main sleep. Conventionally, this variable would be called \\\"total wake time\\\" (TWT).\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurwk_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedwakewd5\", \"Average daily duration of wake in bed in weekdays  from actigraphy\", \"Duration of wake in bed is the sum of sleep latency, wake after sleep onset (WASO) and wake after sleep offset in main sleep. Conventionally, this variable would be called \\\"total wake time\\\" (TWT).\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurwk_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedwakewe5\", \"Average daily duration of wake in bed in weekends  from actigraphy\", \"Duration of wake in bed is the sum of sleep latency, wake after sleep onset (WASO) and wake after sleep offset in main sleep. Conventionally, this variable would be called \\\"total wake time\\\" (TWT).\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurwk_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avginbedwakewo5\", \"Average daily duration of wake in bed in workdays  from actigraphy\", \"Duration of wake in bed is the sum of sleep latency, wake after sleep onset (WASO) and wake after sleep offset in main sleep. Conventionally, this variable would be called \\\"total wake time\\\" (TWT).\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurwk_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainsleep5\", \"Average daily total sleep duration in main sleep in all days  from actigraphy\", \"Conventionally this variable would be called total sleep time (TST)\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_im_w7_f2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainsleepnw5\", \"Average daily total sleep duration in main sleep in non-workdays  from actigraphy\", \"Conventionally this variable would be called total sleep time (TST)\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainsleepwd5\", \"Average daily total sleep duration in main sleep in weekdays  from actigraphy\", \"Conventionally this variable would be called total sleep time (TST)\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainsleepwe5\", \"Average daily total sleep duration in main sleep in weekends  from actigraphy\", \"Conventionally this variable would be called total sleep time (TST)\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainsleepwo5\", \"Average daily total sleep duration in main sleep in workdays  from actigraphy\", \"Conventionally this variable would be called total sleep time (TST)\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainteff5\", \"Average daily sleep maintenance efficiency in all days  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgmefsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainteffnw5\", \"Average daily sleep maintenance efficiency in non-workdays  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgmefsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainteffwd5\", \"Average daily sleep maintenance efficiency in weekdays  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgmefsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainteffwe5\", \"Average daily sleep maintenance efficiency in weekends  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgmefsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgmainteffwo5\", \"Average daily sleep maintenance efficiency in workdays  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"avgmefsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapsall5\", \"Average daily number of naps in all days  from actigraphy\", \"In this study, naps were marked based on sleep diaries and sustained periods (>5 minutes) of inactivity.\", \"numeric\", \"number of events\", \"NaN\", \"pdynumnp_in_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapsallnw5\", \"Average daily number of naps in non-workdays  from actigraphy\", \"In this study, naps were marked based on sleep diaries and sustained periods (>5 minutes) of inactivity.\", \"numeric\", \"number of events\", \"NaN\", \"pdynumnp_in_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapsallwd5\", \"Average daily number of naps in weekdays  from actigraphy\", \"In this study, naps were marked based on sleep diaries and sustained periods (>5 minutes) of inactivity.\", \"numeric\", \"number of events\", \"NaN\", \"pdynumnp_in_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapsallwe5\", \"Average daily number of naps in weekends  from actigraphy\", \"In this study, naps were marked based on sleep diaries and sustained periods (>5 minutes) of inactivity.\", \"numeric\", \"number of events\", \"NaN\", \"pdynumnp_in_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapsallwo5\", \"Average daily number of naps in workdays  from actigraphy\", \"In this study, naps were marked based on sleep diaries and sustained periods (>5 minutes) of inactivity.\", \"numeric\", \"number of events\", \"NaN\", \"pdynumnp_in_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleep155\", \"Average daily number of naps (>= 15 minutes) in all days  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleep15nw5\", \"Average daily number of naps (>= 15 minutes) in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleep15wd5\", \"Average daily number of naps (>= 15 minutes) in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleep15we5\", \"Average daily number of naps (>= 15 minutes) in weekends  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleep15wo5\", \"Average daily number of naps  (>= 15 minutes) in workdays  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleep5\", \"Average daily number of naps (with some sleep are counted) in all days  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleepnw5\", \"Average daily number of naps (with some sleep are counted) in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleepwd5\", \"Average daily number of naps (with some sleep are counted) in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleepwe5\", \"Average daily number of naps (with some sleep are counted) in weekends  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgnnapssleepwo5\", \"Average daily number of naps (with some sleep are counted) in workdays  from actigraphy\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgonsetlatency5\", \"Average daily sleep onset latency in all days  from actigraphy\", \"Sleep latency is the interval between the start of rest period (i.e. rest interval) and sleep onset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avglatsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgonsetlatencynw5\", \"Average daily sleep onset latency in non-workdays  from actigraphy\", \"Sleep latency is the interval between the start of rest period (i.e. rest interval) and sleep onset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avglatsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgonsetlatencywd5\", \"Average daily sleep onset latency in weekdays  from actigraphy\", \"Sleep latency is the interval between the start of rest period (i.e. rest interval) and sleep onset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avglatsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgonsetlatencywe5\", \"Average daily sleep onset latency in weekends  from actigraphy\", \"Sleep latency is the interval between the start of rest period (i.e. rest interval) and sleep onset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avglatsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgonsetlatencywo5\", \"Average daily sleep onset latency in workdays  from actigraphy\", \"Sleep latency is the interval between the start of rest period (i.e. rest interval) and sleep onset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avglatsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgoutbedtime5\", \"Average daily end time for rest period in all days  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgoutbedtimenw5\", \"Average daily end time for rest period in non-workdays  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgoutbedtimewd5\", \"Average daily end time for rest period in weekdays  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgoutbedtimewe5\", \"Average daily end time for rest period in weekends  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgoutbedtimewo5\", \"Average daily end time for rest period in workdays  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgredtalt5\", \"Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallr_ib_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgredtaltnw5\", \"Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallr_ib_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgredtaltwd5\", \"Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallr_ib_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgredtaltwe5\", \"Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallr_ib_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgredtaltwo5\", \"Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallr_ib_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgrestmidpoint5\", \"Average daily midpoint for rest period in main sleep in all days  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgrestmidpointnw5\", \"Average daily midpoint for rest period in main sleep in non-workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgrestmidpointwd5\", \"Average daily midpoint for rest period in main sleep in weekdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgrestmidpointwe5\", \"Average daily midpoint for rest period in main sleep in weekends  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgrestmidpointwo5\", \"Average daily midpoint for rest period in main sleep in workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepbouts5\", \"Average daily number of sleep bouts in main sleep in all days  from actigraphy\", \"sleep bouts are continuous blocks, one or more epochs in duration, with each epoch of each block scored as \\\"sleep\\\", between the start time and the end time of the given interval.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepboutsnw5\", \"Average daily number of sleep bouts in main sleep in non-workdays  from actigraphy\", \"sleep bouts are continuous blocks, one or more epochs in duration, with each epoch of each block scored as \\\"sleep\\\", between the start time and the end time of the given interval.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepboutswd5\", \"Average daily number of sleep bouts in main sleep in weekdays  from actigraphy\", \"sleep bouts are continuous blocks, one or more epochs in duration, with each epoch of each block scored as \\\"sleep\\\", between the start time and the end time of the given interval.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepboutswe5\", \"Average daily number of sleep bouts in main sleep in weekends  from actigraphy\", \"sleep bouts are continuous blocks, one or more epochs in duration, with each epoch of each block scored as \\\"sleep\\\", between the start time and the end time of the given interval.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepboutswo5\", \"Average daily number of sleep bouts in main sleep in workdays  from actigraphy\", \"sleep bouts are continuous blocks, one or more epochs in duration, with each epoch of each block scored as \\\"sleep\\\", between the start time and the end time of the given interval.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepmidpoint5\", \"Average daily midpoint for sleep period in all days  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptsp_im_w7_f2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepmidpointnw5\", \"Average daily midpoint for sleep period in non-workdays  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepmidpointwd5\", \"Average daily midpoint for sleep period in weekdays  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepmidpointwe5\", \"Average daily midpoint for sleep period in weekends  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepmidpointwo5\", \"Average daily midpoint for sleep period in workdays  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgmptsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdaily155\", \"Average daily total sleep duration in naps (>= 15 minutes) in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdaily15nw5\", \"Average daily total sleep duration in naps (>= 15 minutes) in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdaily15wd5\", \"Average daily total sleep duration in naps (>= 15 minutes) in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdaily15we5\", \"Average daily total sleep duration in naps (>= 15 minutes) in all weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdaily15wo5\", \"Average daily total sleep duration in naps (>= 15 minutes) in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdaily5\", \"Average daily total sleep duration in naps (with some sleep are counted) in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdailyrd5\", \"Average daily total sleep duration in naps (with some sleep are counted) in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdailywd5\", \"Average daily total sleep duration in naps (with some sleep are counted) in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdailywe5\", \"Average daily total sleep duration in naps (with some sleep are counted) in all weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapdailywo5\", \"Average daily total sleep duration in naps (with some sleep are counted) in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapsall5\", \"Average sleep duration per nap in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"pnpdursp_in_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapsallnw5\", \"Average sleep duration per nap in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"pnpdursp_in_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapsallwd5\", \"Average sleep duration per nap in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"pnpdursp_in_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapsallwe5\", \"Average sleep duration per nap in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"pnpdursp_in_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapsallwo5\", \"Average sleep duration per nap in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"pnpdursp_in_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleep155\", \"Average sleep duration per nap (>= 15 minutes) in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleep15nw5\", \"Average sleep duration per nap (>= 15 minutes) in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleep15wd5\", \"Average sleep duration per nap (>= 15 minutes) in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleep15we5\", \"Average sleep duration per nap (>= 15 minutes) in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleep15wo5\", \"Average sleep duration per nap (>= 15 minutes) in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleep5\", \"Average sleep duration per nap (with some sleep are counted) in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleepnw5\", \"Average sleep duration per nap (with some sleep are counted) in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleepwd5\", \"Average sleep duration per nap (with some sleep are counted) in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleepwe5\", \"Average sleep duration per nap (with some sleep are counted) in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepnapssleepwo5\", \"Average sleep duration per nap (with some sleep are counted) in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepoffsettime5\", \"Average daily sleep offset time in all days  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepoffsettimenw5\", \"Average daily sleep offset time in non-workdays  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepoffsettimewd5\", \"Average daily sleep offset time in weekdays  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepoffsettimewe5\", \"Average daily sleep offset time in weekends  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepoffsettimewo5\", \"Average daily sleep offset time in workdays  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgeptsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleeponsettime5\", \"Average daily sleep onset time in all days  from actigraphy\", \"Sleep onset time is the start time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgbptsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleeponsettimenw5\", \"Average daily sleep onset time in non-workdays  from actigraphy\", \"Sleep onset time is the start time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgbptsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleeponsettimewd5\", \"Average daily sleep onset time in weekdays  from actigraphy\", \"Sleep onset time is the start time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgbptsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleeponsettimewe5\", \"Average daily sleep onset time in weekends  from actigraphy\", \"Sleep onset time is the start time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgbptsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleeponsettimewo5\", \"Average daily sleep onset time in workdays  from actigraphy\", \"Sleep onset time is the start time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"avgbptsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepperiodduration5\", \"Average daily sleep period in all days  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepperioddurationnw5\", \"Average daily sleep period in non-workdays  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepperioddurationwd5\", \"Average daily sleep period in weekdays  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepperioddurationwe5\", \"Average daily sleep period in weekends  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsleepperioddurationwo5\", \"Average daily sleep period in workdays  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgprdsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsnooze5\", \"Average daily duration of wake after sleep offset in all days  from actigraphy\", \"Wake after sleep offset refers to the time elapsed between the end of sleep and the end of ret interval in main sleeps.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursz_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsnoozenw5\", \"Average daily duration of wake after sleep offset in non-workdays  from actigraphy\", \"Wake after sleep offset refers to the time elapsed between the end of sleep and the end of ret interval in main sleeps.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursz_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsnoozewd5\", \"Average daily duration of wake after sleep offset in weekdays  from actigraphy\", \"Wake after sleep offset refers to the time elapsed between the end of sleep and the end of ret interval in main sleeps.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursz_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsnoozewe5\", \"Average daily duration of wake after sleep offset in weekends  from actigraphy\", \"Wake after sleep offset refers to the time elapsed between the end of sleep and the end of ret interval in main sleeps.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursz_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgsnoozewo5\", \"Average daily duration of wake after sleep offset in workdays  from actigraphy\", \"Wake after sleep offset refers to the time elapsed between the end of sleep and the end of ret interval in main sleeps.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdursz_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwakebouts5\", \"Average daily number of wake bouts in main sleep in all days  from actigraphy\", \"Wake bouts is also referred to as \\\"nocturnal awakenings\\\". There are always comparable number of wake bouts to sleep bouts.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotwk_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwakeboutsnw5\", \"Average daily number of wake bouts in main sleep in non-workdays  from actigraphy\", \"Wake bouts is also referred to as \\\"nocturnal awakenings\\\". There are always comparable number of wake bouts to sleep bouts.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotwk_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwakeboutswd5\", \"Average daily number of wake bouts in main sleep in weekdays  from actigraphy\", \"Wake bouts is also referred to as \\\"nocturnal awakenings\\\". There are always comparable number of wake bouts to sleep bouts.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotwk_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwakeboutswe5\", \"Average daily number of wake bouts in main sleep in weekends  from actigraphy\", \"Wake bouts is also referred to as \\\"nocturnal awakenings\\\". There are always comparable number of wake bouts to sleep bouts.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotwk_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwakeboutswo5\", \"Average daily number of wake bouts in main sleep in workdays  from actigraphy\", \"Wake bouts is also referred to as \\\"nocturnal awakenings\\\". There are always comparable number of wake bouts to sleep bouts.\", \"numeric\", \"number of events\", \"NaN\", \"avgbotwk_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwaso5\", \"Average daily duration of wake after sleep onset (waso) in all days  from actigraphy\", \"WASO is the duration of being awake between sleep onset and offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurws_im_w7_f2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwasonw5\", \"Average daily duration of wake after sleep onset (waso) in non-workdays  from actigraphy\", \"WASO is the duration of being awake between sleep onset and offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurws_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwasowd5\", \"Average daily duration of wake after sleep onset (waso) in weekdays  from actigraphy\", \"WASO is the duration of being awake between sleep onset and offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurws_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwasowe5\", \"Average daily duration of wake after sleep onset (waso) in weekends  from actigraphy\", \"WASO is the duration of being awake between sleep onset and offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurws_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwasowo5\", \"Average daily duration of wake after sleep onset (waso) in workdays  from actigraphy\", \"WASO is the duration of being awake between sleep onset and offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgdurws_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwhitetalt5\", \"Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallw_ib_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwhitetaltnw5\", \"Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallw_ib_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwhitetaltwd5\", \"Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallw_ib_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwhitetaltwe5\", \"Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallw_ib_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"avgwhitetaltwo5\", \"Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"avgtallw_ib_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"diarycomplete5\", \"Actigraphy QS: Diary Completeness\", \"NaN\", \"choices\", \"NaN\", \"sleepdiarycomplete\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"diarypresent5\", \"Actigraphy QS: Diary Present\", \"NaN\", \"choices\", \"NaN\", \"sleepdiarypresabs\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"dstoverlap5\", \"Study Overlaps With Daylight Saving Time Start (March) Or End (November)\", \"NaN\", \"choices\", \"NaN\", \"daylightsavingoverlap\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"epochlength5\", \"Original Epoch Length For Processed Actigraphy Study  (Seconds)\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndays5\", \"Total number of days with sleep data in the entire actigraphy recording period in all days  from actigraphy\", \"NaN\", \"integer\", \"days\", \"NaN\", \"ttldaysp_ir_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapsall5\", \"Total number of days with naps in the entire actigraphy recording period in all days  from actigraphy\", \"NaN\", \"integer\", \"days\", \"NaN\", \"ttldaynp_ir_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapsallnw5\", \"Total number of days with naps in the entire actigraphy recording period in non-workdays  from actigraphy\", \"NaN\", \"integer\", \"non-workdays\", \"NaN\", \"ttldaynp_ir_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapsallwd5\", \"Total number of days with naps in the entire actigraphy recording period in weekdays  from actigraphy\", \"NaN\", \"integer\", \"weekend days\", \"NaN\", \"ttldaynp_ir_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapsallwe5\", \"Total number of days with naps in the entire actigraphy recording period in weekends  from actigraphy\", \"NaN\", \"integer\", \"weekend days\", \"NaN\", \"ttldaynp_ir_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapsallwo5\", \"Total number of days with naps in the entire actigraphy recording period in workdays  from actigraphy\", \"NaN\", \"integer\", \"workdays\", \"NaN\", \"ttldaynp_ir_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleep155\", \"Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in all days  from actigraphy\", \"NaN\", \"integer\", \"days\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleep15nw5\", \"Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in non-workdays  from actigraphy\", \"NaN\", \"integer\", \"non-workdays\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleep15wd5\", \"Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in weekdays  from actigraphy\", \"NaN\", \"integer\", \"weekdays\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleep15we5\", \"Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in weekends  from actigraphy\", \"NaN\", \"integer\", \"weekend days\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleep15wo5\", \"Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in workdays  from actigraphy\", \"NaN\", \"integer\", \"workdays\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleep5\", \"Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in all days  from actigraphy\", \"NaN\", \"integer\", \"days\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleepnw5\", \"Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in non-workdays  from actigraphy\", \"NaN\", \"integer\", \"non-workdays\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleepwd5\", \"Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in weekdays  from actigraphy\", \"NaN\", \"integer\", \"weekend days\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleepwe5\", \"Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in weekends  from actigraphy\", \"NaN\", \"integer\", \"weekend days\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnapssleepwo5\", \"Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in workdays  from actigraphy\", \"NaN\", \"integer\", \"workdays\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndaysnw5\", \"Total number of days with sleep data in the entire actigraphy recording period in non-workdays  from actigraphy\", \"NaN\", \"integer\", \"non-workdays\", \"NaN\", \"ttldaysp_ir_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndayswd5\", \"Total number of days with sleep data in the entire actigraphy recording period in weekdays  from actigraphy\", \"NaN\", \"integer\", \"weekdays\", \"NaN\", \"ttldaysp_ir_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndayswe5\", \"Total number of days with sleep data in the entire actigraphy recording period in weekends  from actigraphy\", \"NaN\", \"integer\", \"weekend days\", \"NaN\", \"ttldaysp_ir_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"ndayswo5\", \"Total number of days with sleep data in the entire actigraphy recording period in workdays  from actigraphy\", \"NaN\", \"integer\", \"workdays\", \"NaN\", \"ttldaysp_ir_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"nightsinvalid5\", \"Actigraphy QS: # of Invalid Nights\", \"NaN\", \"integer\", \"invalid nights\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"nightsrec5\", \"Actigraphy QS: # of Nights Recorded\", \"NaN\", \"integer\", \"nights\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"nightsvalid5\", \"Actigraphy QS: # of Valid Nights\", \"NaN\", \"integer\", \"valid nights\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"overallqual5\", \"Actigraphy QS: Overall Quality Grading (QS)\", \"NaN\", \"choices\", \"NaN\", \"overallqualitygrade\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sd24hrsleep5\", \"Standard deviation of daily total sleep duration in main sleep and naps combined in all days  from actigraphy\", \"This variable measures the within subject variability of daily total sleep duration in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_ib_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sd24hrsleepnw5\", \"Standard deviation of daily total sleep duration in main sleep and naps combined in non-workdays  from actigraphy\", \"This variable measures the within subject variability of daily total sleep duration in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_ib_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sd24hrsleepwd5\", \"Standard deviation of daily total sleep duration in main sleep and naps combined in weekdays  from actigraphy\", \"This variable measures the within subject variability of daily total sleep duration in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_ib_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sd24hrsleepwe5\", \"Standard deviation of daily total sleep duration in main sleep and naps combined in weekends  from actigraphy\", \"This variable measures the within subject variability of daily total sleep duration in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_ib_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sd24hrsleepwo5\", \"Standard deviation of daily total sleep duration in main sleep and naps combined in workdays  from actigraphy\", \"This variable measures the within subject variability of daily total sleep duration in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_ib_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdefficiency5\", \"Standard deviation of the daily sleep efficiency in all days  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdeffsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdefficiencynw5\", \"Standard deviation of the daily sleep efficiency in non-workdays  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdeffsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdefficiencywd5\", \"Standard deviation of the daily sleep efficiency in weekdays  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdeffsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdefficiencywe5\", \"Standard deviation of the daily sleep efficiency in weekends  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdeffsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdefficiencywo5\", \"Standard deviation of the daily sleep efficiency in workdays  from actigraphy\", \"Sleep efficiency is the proportion of sleep duration (i.e. total sleep time, tst) in total rest period (i.e. rest interval) in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep. In this study, rest interval is the same as in-bed period. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdeffsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbedduration5\", \"Standard deviation of daily rest period in all days  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbeddurationnw5\", \"Standard deviation of daily rest period in non-workdays  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbeddurationwd5\", \"Standard deviation of daily rest period in weekdays  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbeddurationwe5\", \"Standard deviation of daily rest period in weekends  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbeddurationwo5\", \"Standard deviation of daily rest period in workdays  from actigraphy\", \"In this study, rest period (i.e. rest internal) is defined as in-bed period (i.e. time in bed, TIB) in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbedtime5\", \"Standard deviation of the daily start time for rest period in all days  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbedtimenw5\", \"Standard deviation of the daily start time for rest period in non-workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbedtimewd5\", \"Standard deviation of the daily start time for rest period in weekdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbedtimewe5\", \"Standard deviation of the daily start time for rest period in weekends  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdinbedtimewo5\", \"Standard deviation of the daily start time for rest period in workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed, TIB), therefore the start time of rest period is in-bed time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainsleep5\", \"Standard deviation of daily total sleep duration in main sleep in all days  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainsleepnw5\", \"Standard deviation of daily total sleep duration in main sleep in non-workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainsleepwd5\", \"Standard deviation of daily total sleep duration in main sleep in weekdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainsleepwe5\", \"Standard deviation of daily total sleep duration in main sleep in weekends  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainsleepwo5\", \"Standard deviation of daily total sleep duration in main sleep in workdays  from actigraphy\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"stddursp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainteff5\", \"Standard deviation of the daily sleep maintenance efficiency in all days  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdmefsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainteffnw5\", \"Standard deviation of the daily sleep maintenance efficiency in non-workdays  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdmefsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainteffwd5\", \"Standard deviation of the daily sleep maintenance efficiency in weekdays  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdmefsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainteffwe5\", \"Standard deviation of the daily sleep maintenance efficiency in weekends  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdmefsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdmainteffwo5\", \"Standard deviation of the daily sleep maintenance efficiency in workdays  from actigraphy\", \"Sleep maintenance efficiency is the ratio between sleep duration (i.e. total sleep time, tst) and sleep period in main sleep. Sleep duration is the interval between sleep onset time and sleep offset time while asleep, while sleep period is the interval between sleep onset time and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"stdmefsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdoutbedtime5\", \"Standard deviation of the daily end time for rest period in all days  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdoutbedtimenw5\", \"Standard deviation of the daily end time for rest period in non-workdays  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdoutbedtimewd5\", \"Standard deviation of the daily end time for rest period in weekdays  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdoutbedtimewe5\", \"Standard deviation of the daily end time for rest period in weekends  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdoutbedtimewo5\", \"Standard deviation of the daily end time for rest period in workdays  from actigraphy\", \"In this study, the end time for rest period (i.e. rest interval) is defined as the out-bed time in main sleeps.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdrestmidpoint5\", \"Standard deviation of the daily midpoint for rest period in main sleep in all days  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptbd_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdrestmidpointnw5\", \"Standard deviation of the daily midpoint for rest period in main sleep in non-workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptbd_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdrestmidpointwd5\", \"Standard deviation of the daily midpoint for rest period in main sleep in weekdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptbd_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdrestmidpointwe5\", \"Standard deviation of the daily midpoint for rest period in main sleep in weekends  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptbd_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdrestmidpointwo5\", \"Standard deviation of the daily midpoint for rest period in main sleep in workdays  from actigraphy\", \"In this study, rest period (i.e. rest interval) is defined as in-bed period (i.e. time in bed). \", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptbd_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepmidpoint5\", \"Standard deviation of the daily midpoint for sleep period in all days  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepmidpointnw5\", \"Standard deviation of the daily midpoint for sleep period in non-workdays  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepmidpointwd5\", \"Standard deviation of the daily midpoint for sleep period in weekdays  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepmidpointwe5\", \"Standard deviation of the daily midpoint for sleep period in weekends  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepmidpointwo5\", \"Standard deviation of the daily midpoint for sleep period in workdays  from actigraphy\", \"Sleep period is the interval between sleep onset time and sleep offset time in main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdmptsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepoffsettime5\", \"Standard deviation of daily sleep offset time in all days  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepoffsettimenw5\", \"Standard deviation of daily sleep offset time in non-workdays  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"NaN\", \"NaN\", \"stdeptsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepoffsettimewd5\", \"Standard deviation of daily sleep offset time in weekdays  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepoffsettimewe5\", \"Standard deviation of daily sleep offset time in weekends  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepoffsettimewo5\", \"Standard deviation of daily sleep offset time in workdays  from actigraphy\", \"Sleep offset time is the end time of main sleep.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdeptsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleeponsettime5\", \"Standard deviation of the daily sleep onset time in all days  from actigraphy\", \"Sleep onset time is the start time of main sleep. This variable measures the within subject variability of sleep onset time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleeponsettimenw5\", \"Standard deviation of the daily sleep onset time in non-workdays  from actigraphy\", \"Sleep onset time is the start time of main sleep. This variable measures the within subject variability of sleep onset time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleeponsettimewd5\", \"Standard deviation of the daily sleep onset time in weekdays  from actigraphy\", \"Sleep onset time is the start time of main sleep. This variable measures the within subject variability of sleep onset time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleeponsettimewe5\", \"Standard deviation of the daily sleep onset time in weekends  from actigraphy\", \"Sleep onset time is the start time of main sleep. This variable measures the within subject variability of sleep onset time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleeponsettimewo5\", \"Standard deviation of the daily sleep onset time in workdays  from actigraphy\", \"Sleep onset time is the start time of main sleep. This variable measures the within subject variability of sleep onset time.\", \"time\", \"hh:mm:ss\", \"NaN\", \"stdbptsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepperiodduration5\", \"Standard deviation of daily sleep period in all days  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdsp_im_w7_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepperioddurationnw5\", \"Standard deviation of daily sleep period in non-workdays  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdsp_im_wn_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepperioddurationwd5\", \"Standard deviation of daily sleep period in weekdays  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdsp_im_w5_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepperioddurationwe5\", \"Standard deviation of daily sleep period in weekends  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdsp_im_w2_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sdsleepperioddurationwo5\", \"Standard deviation of daily sleep period in workdays  from actigraphy\", \"Sleep period (i.e. total sleep time, TST) is the interval between sleep onset time and sleep offset time in main sleep.\", \"numeric\", \"minutes (min)\", \"NaN\", \"stdprdsp_im_ww_f2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"sleepjournal5\", \"Actigraphy QS: Sleep Journal Received\", \"NaN\", \"choices\", \"NaN\", \"noyesinc\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"stdyady5c\", \"Actigraphy QS: Days From Exam 5 To Study Date\", \"NaN\", \"numeric\", \"days\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"timeend5\", \"Actigraphy QS: Data Collection End Time\", \"NaN\", \"time\", \"hh:mm:ss\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Actigraphy\", \"timestart5\", \"Actigraphy QS: Data Collection Start Time\", \"NaN\", \"time\", \"hh:mm:ss\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Administrative\", \"haveact5\", \"MESA Sleep: Has Actigraphy Data (5+ Valid Nights) from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Administrative\", \"havepsg5\", \"MESA Sleep: Has PSG Data (Passed Overnight Study) from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Administrative\", \"match5\", \"MESA Sleep: PSG/Actigraphy Start Dates Match (I.E. No Failures; Tests Were Concurrent) from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Administrative\", \"scorerid5\", \"PSG Report: Scorer ID from type II polysomnography\", \"NaN\", \"string\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Administrative\", \"stdypdy5c\", \"PSG QS: Days From Exam 5 To Study Date from type II polysomnography\", \"NaN\", \"numeric\", \"days\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4p_nrem5\", \"Apnea-Hypopnea Index (NREM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_sn_ap0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4p_nsup5\", \"Apnea-Hypopnea Index (Non-Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_po_ap0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4p_rem5\", \"Apnea-Hypopnea Index (REM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_sr_ap0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4p_sup5\", \"Apnea-Hypopnea Index (Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_pb_ap0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4pa_nrem5\", \"Apnea-Hypopnea Index (NREM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_sn_ap0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4pa_nsup5\", \"Apnea-Hypopnea Index (Non-Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_po_ap0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4pa_rem5\", \"Apnea-Hypopnea Index (REM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_sr_ap0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi4pa_sup5\", \"Apnea-Hypopnea Index (Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_pb_ap0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_a0h3\", \"Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;ahi_ap0uhp3x3u_f1t2\", \"60 * (hrembp3 + hrop3 + hnrbp3 + hnrop3 + urbp3 + urop3 + unrbp3 + unrop3 + carbp + carop + canbp + canop + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_a0h3a\", \"Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events. The definition for hypopneas is consistent with the following clinical guidelines: (1) American Academy of Sleep Medicine (AASM) 2007 Manual (2012 update) (recommended). [Berry RB et al. 2012 (PubMed ID:23066376)] (https://www.ncbi.nlm.nih.gov/pubmed/23066376), and (2) American Academy of Sleep Medicine (AASM) 2015 (recommended) [Berry RB et al. The AASM Manual for the Scoring of Sleep and Associated Events: Rules, Terminology and Technical Specifications, Version 2.2. American Academy of Sleep Medicine, Darien, IL, 2015.] <br><br> [Search for all AHI variables consistent with the same clinical guidelines within this dataset]( https://sleepdata.org/datasets/mesa/variables?search=aasm15_recommended)\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;a0h3ai5;ahi_ap0uhp3x3r_f1t2;aasm15_recommended\", \"60 * (hremba3 + hroa3 + hnrba3 + hnroa3 + urbpa3 + uropa3 + unrbpa3 + unropa3 + carbp + carop + canbp + canop + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_a0h4\", \"Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events. The definition of hypopnea events is consistent with the following clinical guidelines: (1) AASM 2012 update (alternative) [Berry RB et al. 2012 (PubMed ID:23066376)] (https://www.ncbi.nlm.nih.gov/pubmed/23066376), and (2) AASM 2015 (acceptable) [Berry RB et al. The AASM Manual for the Scoring of Sleep and Associated Events: Rules, Terminology and Technical Specifications, Version 2.2. American Academy of Sleep Medicine, Darien, IL, 2015.]. <br><br>[Search for all AHI variables consistent with the same clinical guidelines within this dataset](https://sleepdata.org/datasets/mesa/variables?search=aasm15_acceptable)\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;ahi4p5;ahi_ap0uhp3x4u_f1t2;aasm15_acceptable\", \"60 * (hrembp4 + hrop4 + hnrbp4 + hnrop4 + urbp4 + urop4 + unrbp4 + unrop4 + carbp + carop + canbp + canop + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_a0h4a\", \"Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;ahi4pa5;ahi_ap0uhp3x4r_f1t2\", \"60 * (hremba4 + hroa4 + hnrba4 + hnroa4 + urbpa4 + uropa4 + unrbpa4 + unropa4 + carbp + carop + canbp + canop + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_c0h3\", \"Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;cahi_ca0uhp3x3u_f1t2\", \"60 * (hrembp3 + hrop3 + hnrbp3 + hnrop3 + urbp3 + urop3 + unrbp3 + unrop3 + carbp + carop + canbp + canop) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_c0h3a\", \"Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;cahi_ca0uhp3x3r_f1t2\", \"60 * (hremba3 + hroa3 + hnrba3 + hnroa3 + urbpa3 + uropa3 + unrbpa3 + unropa3 + carbp + carop + canbp + canop) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_c0h4\", \"Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;cahi_ca0uhp3x4u_f1t2\", \"60 * (hrembp4 + hrop4 + hnrbp4 + hnrop4 + urbp4 + urop4 + unrbp4 + unrop4 + carbp + carop + canbp + canop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_c0h4a\", \"Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;cahi_ca0uhp3x4r_f1t2\", \"60 * (hremba4 + hroa4 + hnrba4 + hnroa4 + urbpa4 + uropa4 + unrbpa4 + unropa4 + carbp + carop + canbp + canop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_o0h3\", \"Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;oahi_oa0uhp3x3u_f1t2\", \"60 * (hrembp3 + hrop3 + hnrbp3 + hnrop3 + urbp3 + urop3 + unrbp3 + unrop3 + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_o0h3a\", \"Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;oahi_oa0uhp3x3r_f1t2\", \"60 * (hremba3 + hroa3 + hnrba3 + hnroa3 + urbpa3 + uropa3 + unrbpa3 + unropa3 + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_o0h4\", \"Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;oahi_oa0uhp3x4u_f1t2\", \"60 * (hrembp3 + hrop3 + hnrbp3 + hnrop3 + urbp4 + urop4 + unrbp4 + unrop4 + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahi_o0h4a\", \"Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events.\", \"numeric\", \"number of events per hour\", \"NaN\", \"icsd;oahi_oa0uhp3x4r_f1t2\", \"60 * (hremba4 + hroa4 + hnrba4 + hnroa4 + urbpa4 + uropa4 + unrbpa4 + unropa4 + oarbp + oarop + oanbp + oanop ) / slpprdp\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"ahiu35\", \"Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"ahi_ap0uhp3x3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cai0p5\", \"Central Apnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cai0p_nrem5\", \"Central Apnea Index (NREM): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_sn_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cai0p_nsup5\", \"Central Apnea Index (Non-Supine): (Central apeneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_po_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cai0p_rem5\", \"Central Apnea Index (REM): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_sr_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cai0p_sup5\", \"Central Apnea Index (Supine): (Central apeneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_pb_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cai4p5\", \"Central Apnea Index: (Central apneas with >= 4% oxygen desaturation threshold used and with or without arousal) / hour of sleep  from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_ca4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cai4pa5\", \"Central Apnea Index: (Central apneas with >= 4% oxygen desaturation threshold used or with arousal) / hour of sleep  from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_ca4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardnba35\", \"Central Apnea Index (NREM, Supine): (Central apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_snpb_ca3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardnba5\", \"Central Apnea Index (NREM, Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_snpb_ca0o_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardnbp5\", \"Central Apnea Index (NREM, Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_snpb_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardnoa35\", \"Central Apnea Index (NREM, Non-Supine): (Central apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_snpo_ca3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardnoa5\", \"Central Apnea Index (NREM, Non-Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_snpo_ca0o_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardnop5\", \"Central Apnea Index (NREM, Non-Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_snpo_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardrba35\", \"Central Apnea Index (REM, Supine): (Central apneas with >= 3% oxygen desaturation threshold or with arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_srpb_ca3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardrba5\", \"Central Apnea Index (REM, Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_srpb_ca0o_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardrbp5\", \"Central Apnea Index (REM, Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_srpb_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardroa35\", \"Central Apnea Index (REM, Non-Supine): (Central apneas with >= 3% oxygen desaturation or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_srpo_ca3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardroa5\", \"Central Apnea Index (REM, Non-Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_srpo_ca0r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"cardrop5\", \"Central Apnea Index (REM, Non-Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"cai_srpo_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hunrbp5\", \"Hypopnea Index (NREM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_snpb_hp5x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hunrbpa35\", \"Hypopnea Index (NREM, Supine): (Hypopneas with > 50% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_snpb_hp5x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hunrbpa5\", \"Hypopnea Index (NREM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_snpb_hp5x0r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hunrop5\", \"Hypopnea Index (NREM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_snpo_hp5x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hunropa35\", \"Hypopnea Index (NREM, Non-Supine): (Hypopneas with > 50% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_snpo_hp5x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hunropa5\", \"Hypopnea Index (NREM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_snpo_hp5x0r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hurbp25\", \"Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and >= 2% oxygen desaturation and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_srpb_hp5x2u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hurbp5\", \"Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_srpb_hp5x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hurbpa35\", \"Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_srpb_hp5x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hurbpa5\", \"Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_srpb_hp5x0r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"hurop5\", \"Hypopnea Index (REM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_srpo_hp5x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"huropa35\", \"Hypopnea Index (REM, Non-Supine): (Hypopneas with > 50% flow reduction and >= 3%oxygen desaturation or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_srpo_hp5x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"huropa5\", \"Hypopnea Index (REM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"hi_srpo_hp5x0r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi35\", \"Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_oa0uhp3x3u_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3_nrem5\", \"Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of NREM sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sn_oa0uhp3x3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3_nsup5\", \"Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_po_oa0uhp3x3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3_rem5\", \"Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of REM sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sr_oa0uhp3x3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3_sup5\", \"Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep in supine position from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_pb_oa0uhp3x3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3pa5\", \"Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_oa0uhp3x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3pa_nrem5\", \"Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sn_oa0uhp3x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3pa_nsup5\", \"Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_po_oa0uhp3x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3pa_rem5\", \"Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sr_oa0uhp3x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi3pa_sup5\", \"Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_pb_oa0uhp3x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi45\", \"Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_oa0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4_nrem5\", \"Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of NREM sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sn_oa0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4_nsup5\", \"Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_po_oa0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4_rem5\", \"Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of REM sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sr_oa0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4_sup5\", \"Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in supine position from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_pb_oa0uhp3x4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4pa5\", \"Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_oa0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4pa_nrem5\", \"Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sn_oa0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4pa_nsup5\", \"Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_po_oa0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4pa_rem5\", \"Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_sr_oa0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oahi4pa_sup5\", \"Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oahi_pb_oa0uhp3x4r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oai0p5\", \"Obstructive Apnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_oa0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oai4p5\", \"Obstructive Apnea Index: (Obstructive apneas with >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\", \"Calculated - Summary metric of sleep disordered breathing events\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_oa4u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardnba35\", \"Obstructive Apnea Index (NREM, Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_snpb_oa3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardnba5\", \"Obstructive Apnea Index (NREM, Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_snpb_oa0o_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardnbp5\", \"Obstructive Apnea Index (NREM, Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_snpb_oa0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardnoa35\", \"Obstructive Apnea Index (NREM, Non-Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_snpo_oa3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardnoa5\", \"Obstructive Apnea Index (NREM, Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_snpo_oa0o_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardnop5\", \"Obstructive Apnea Index (NREM, Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_snpo_oa0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardrba35\", \"Obstructive Apnea Index (REM, Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_srpb_oa3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardrba5\", \"Obstructive Apnea Index (REM, Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_srpb_oa0o_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardrbp5\", \"Obstructive Apnea Index (REM, Supine): (obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_srpb_oa0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardroa35\", \"Obstructive Apnea Index (REM, Non-Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_srpo_oa3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Apnea-Hypopnea Indices\", \"oardroa5\", \"Obstructive Apnea Index (REM, Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"oai_srpo_oa0o_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"ahnrembp5\", \"Arousal Index (NREM, Supine): Number of arousals per hour of NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumrs_snpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"ahnremop5\", \"Arousal Index (NREM, Non-Supine): Number of arousals per hour of NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumrs_snpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"ahrembp5\", \"Arousal Index (REM, Supine): Number of arousals per hour of REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumrs_srpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"ahremop5\", \"Arousal Index (REM, Non-Supine): Number of arousals per hour of REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumrs_srpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"ai_all5\", \"Arousal Index: Number of arousals per hour of sleep from type II polysomnography\", \"Calculated\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumrs_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"ai_nrem5\", \"Arousal Index (NREM): Number of arousals per hour of NREM sleep from type II polysomnography\", \"Calculated\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumrs_sn_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"ai_rem5\", \"Arousal Index (REM): Number of arousals per hour of REM sleep from type II polysomnography\", \"Calculated\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumrs_sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"arnrembp5\", \"Total number of arousals during NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumrs_snpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"arnremop5\", \"Total number of arousals during NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumrs_snpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"arrembp5\", \"Total number of arousals during REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumrs_srpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Arousals\", \"arremop5\", \"Total number of arousals during REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumrs_srpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Heart Rate\", \"bpmavg5\", \"Average heart rate during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"beats per minute (bpm)\", \"NaN\", \"avglvlhr_sp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Heart Rate\", \"bpmmax5\", \"Maximum heart rate during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"beats per minute (bpm)\", \"NaN\", \"maxlvlhr_sp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Heart Rate\", \"bpmmin5\", \"Minimum heart rate during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"beats per minute (bpm)\", \"NaN\", \"minlvlhr_sp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Limb Movements\", \"avgnplm5\", \"Number of periodic limb movements per hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumpl_sn_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Limb Movements\", \"avgplm5\", \"Number of periodic limb movements per hour of sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumpl_sp_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Limb Movements\", \"avgplma5\", \"Number of periodic limb movements with arousals per hour of sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumpl_so_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Limb Movements\", \"avgrplm5\", \"Number of periodic limb movements per hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumpl_sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Limb Movements\", \"noplm5\", \"Total number of periodic limb movements during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumpl_sp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Limb Movements\", \"plmaslp5\", \"Number of periodic limb movements with arousal during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumpl_so_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"avdnbp5\", \"Average level of oxygen desaturation during NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlds_snpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"avdnop5\", \"Average level of oxygen desaturation during NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlds_snpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"avdrbp5\", \"Average level of oxygen desaturation during REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlds_srpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"avdrop5\", \"Average level of oxygen desaturation during REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlds_srpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"avgsat5\", \"Average level of oxygen saturation during total sleep duration from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlsa_sp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"avsao2nh5\", \"Average level of oxygen saturation during NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlsa_sn_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"avsao2rh5\", \"Average level of oxygen saturation during REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlsa_sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsnr25\", \"Number of oxygen desaturations with >= 2% desat per hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sn_dsge2_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsnr35\", \"Number of oxygen desaturations with >= 3% desat per hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sn_dsge3_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsnr45\", \"Number of oxygen desaturations with >= 4% desat per hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sn_dsge4_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsnr55\", \"Number of oxygen desaturations with >= 5% desat per hour of NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sn_dsge5_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsrem25\", \"Number of oxygen desaturations with >= 2% desat per hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sr_dsge2_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsrem35\", \"Number of oxygen desaturations with >= 3% desat per hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sr_dsge3_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsrem45\", \"Number of oxygen desaturations with >= 4% desat per hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sr_dsge4_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dsrem55\", \"Number of oxygen desaturations with >= 5% desat per hour of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sr_dsge5_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"dssao905\", \"Total number of oxygen desaturations with < 90% desat during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumds_salt90_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"minsat5\", \"Minimum oxygen saturation during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"minlvlsa_sp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mndnbp5\", \"Minimum oxygen saturation during NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"minlvlsa_snpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mndnop5\", \"Minimum oxygen saturation during NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"minlvlsa_snpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mndrbp5\", \"Minimum oxygen saturation during REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"minlvlsa_srpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mndrop5\", \"Minimum oxygen saturation during REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"minlvlsa_srpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mnsao2nh5\", \"Minimum oxygen saturation during NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"losao2nr5;minlvlsa_sn_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mnsao2rh5\", \"Minimum oxygen saturation during REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"losao2r5;minlvlsa_sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mxdnbp5\", \"Maximum oxygen desaturation during NREM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"maxlvlds_snpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mxdnop5\", \"Maximum oxygen desaturation during NREM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"maxlvlds_snpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mxdrbp5\", \"Maximum oxygen desaturation during REM sleep in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"maxlvlds_srpb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mxdrop5\", \"Maximum oxygen desaturation during REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"maxlvlds_srpo_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mxsao2nh5\", \"Maximum oxygen saturation during NREM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"maxlvlsa_sn_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"mxsao2rh5\", \"Maximum oxygen saturation during REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"maxlvlsa_sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"ndes2ph5\", \"Total number of oxygen desaturations with >= 2% desat during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumds_sp_dsge2_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"ndes3ph5\", \"Total number of oxygen desaturations with >= 3% desat during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumds_sp_dsge3_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"ndes4ph5\", \"Total number of oxygen desaturations with >= 4% desat during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumds_sp_dsge4_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"ndes5ph5\", \"Total number of oxygen desaturations with >= 5% desat during total sleep duration from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumds_sp_dsge4_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"odi35\", \"Oxygen Desaturation Index: Oxygen desaturation with >= 3% desat per hour of sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sp_dsge3_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"odi45\", \"Oxygen Desaturation Index: Oxygen desaturation with >= 4% desat per hour of sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"phrnumds_sp_dsge4_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctle925\", \"Percent of total sleep duration with < 92% oxygen saturation from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt92_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctlt755\", \"Percent total sleep duration with below 75% oxygen saturation from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt75_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctlt805\", \"Percent total sleep duration with below 80% oxygen saturation from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt80_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctlt855\", \"Percent total sleep duration with below 85% oxygen saturation from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt85_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctlt905\", \"Percent total sleep duration with below 90% oxygen saturation from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt90_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctsa80h5\", \"Percent total sleep duration with below 80% oxygen saturation from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt80_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctsa85h5\", \"Percent total sleep duration with below 85% oxygen saturation from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt85_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctsa90h5\", \"Percent total sleep duration with below 90% oxygen saturation from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt90_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"pctsa95h5\", \"Percent total sleep duration with below 95% oxygen saturation from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_salt95_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"sao2nrem5\", \"Average level of oxygen saturation during NREM sleep from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlsa_sn_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Oxygen Saturation\", \"sao2rem5\", \"Average level of oxygen saturation during REM sleep from type II polysomnography\", \"Calculated\", \"numeric\", \"percent (%)\", \"NaN\", \"avglvlsa_sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Quantitative Respiratory Analysis\", \"lgn\", \"Overall instability (NREM)\", \"The magnitude of reflex (opposing) ventilatory drive response to a change in ventilation; it describes the ventilatory control stability and includes the effect of circulatory delays. Ventilatory drive is the level of ventilation that would be observed at any moment if the respiratory mechanics were normal, i.e. intended ventilation.\", \"numeric\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Counts\", \"apnea35\", \"Total number of apneas with >= 3% oxygen desaturation and with or without arousal during sleep from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumap_ap3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Counts\", \"cent_obs_ratio\", \"Ratio of the number of central apneas with no oxygen desaturation threshold used and with or without arousal to the number of obstructive apneas with no oxygen desaturation threshold used and with or without arousal from type II polysomnography\", \"Calculated\", \"numeric\", \"NaN\", \"NaN\", \"icsd;ratnumap_ca0u_oa0u_f1t2\", \"(carbp + carop + canbp + canop) / (oarbp + oarop + oanbp + oanop)\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Counts\", \"cent_obs_ratioa\", \"Ratio of the number of central apneas with no oxygen desaturation threshold used or without arousal to the number of obstructive apneas with no oxygen desaturation threshold used or with arousal from type II polysomnography\", \"Calculated\", \"numeric\", \"NaN\", \"NaN\", \"icsd;ratnumap_ca0r_oa0r_f1t2\", \"(carba + caroa + canba + canoa) / (oarba + oaroa + oanba + oanoa)\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Counts\", \"oarop5\", \"Total number of obstructive apneas with no oxygen desaturation threshold used and with or without arousal during REM sleep in non-supine position from type II polysomnography\", \"NaN\", \"numeric\", \"number of events\", \"NaN\", \"ttlnumoa_srpo_oa0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"apavgdur5\", \"Average length of apnea with no oxygen desaturation threshold used and with or without arousal during sleep from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"avgdurap_ap0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"cavgdur5\", \"Average length of central apneas with no oxygen desaturation threshold used and with or without arousal during sleep from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"avgdurca_ca0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"havgdur5\", \"Average length of hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"avgdurhp_hp3x5x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"hbavgdur5\", \"Average length of hypopneas with > 30% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"avgdurhp_hp3x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"longap5\", \"Maximum length of apneas with no oxygen desaturation threshold used an with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"maxdurap_ap0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"longhyp5\", \"Maximum length of hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"maxdurhp_hp3x5x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"longhypb5\", \"Maximun length of hypopneas with > 30% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"maxdurhp_hp3x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"oavgdur5\", \"Average length of obstructive apneas with no oxygen desaturation threshold and with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"seconds (s)\", \"NaN\", \"avgduroa_oa0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pcohb3slp5\", \"Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal + hypopneas with > 30% flow reduction and > 3% oxygen desaturation and with or without arousal) from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_ap0uhp3x3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pcohb3waslp5\", \"Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal + hypopneas with > 30% flow reduction and > 3% oxygen desaturation or with arousal) from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_ap0uhp3x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pcohbwaslp5\", \"Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal + hypopneas with > 30% flow reduction and with no oxygen desaturation threhold or with arousal) from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_ap0uhp3x0r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pcoslp5\", \"Percentage of total sleep duration with apneas with no oxygen desaturation threshold used and with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_ap0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pcstah3d5\", \"Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with 30 - 50% flow reduction and >= 3% oxygen desaturation and with or without arousal) from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_ap0uhp3x5x3u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pcstahar5\", \"Percent total sleep duration with apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used or with arousal from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_ap0uhp3x5x0r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pcstahda5\", \"Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with 30 - 50% flow reduction and >= 3% oxygen desaturation or with arousal) from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_ap0uhp3x5x3r_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"pctsthyp5\", \"Percentage of total sleep duration with hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_hp3x5x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Respiratory Event Lengths\", \"phbslp5\", \"Percentage of total sleep duration with hypopneas with > 30% flow reduction and with no oxygen desaturation threhold or with arousal from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_hp3x0u_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"abdodur5\", \"Abdo Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"abnoreeg5\", \"Abnormal Awake EEG from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"ahiov505\", \"Abnormal Referral - AHI> 50 from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"airdur5\", \"Airflow Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"alpdel5\", \"Physiologic Alpha Intrusion from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"apnhyppr5\", \"Scoring Apnea/Hypopnea Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"arsl3ou5\", \"Arousal Index < 3 Verified from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"arunrel5\", \"Scoring Arousals Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"c4dur5\", \"Cz-Oz Signal Duration (Hours)  EEG from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"casndur5\", \"Cannula Snore Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"number of events per hour\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"chestdur5\", \"Chest Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"chindur5\", \"Chin (Lchin-Cchin)  Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"e1dur5\", \"E1 (Eogl) Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"e2dur5\", \"E2 (Eogr) Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"ecgdur5\", \"ECG Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"fpz5\", \"Signal Quality Issues Found On Fpz Signal from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"fzm1dur5\", \"Fz-Cz  Signal Duration (Hours)   EEG from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"inhomepsgyn5\", \"PSG: Test Was Conducted In-Home  1=Yes from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"lagbreath5\", \"Periodic Large Breaths from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"lighoff5\", \"PSG QS: Participant Reported Time To Bed from type II polysomnography\", \"NaN\", \"time\", \"hh:mm:ss\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"limbdur5\", \"Limb Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"losbeg5\", \"Data Lost At Beginning Of Study from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"losend5\", \"Data Lost At End Of Study from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"losoth5\", \"Data Lost During Study from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"m15\", \"Signal Quality Issues Found On M1 Signal from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"maxresou5\", \"Long Respiratory Events Verified from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"npflow5\", \"Flow Limitation from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"o2m1dur5\", \"C4-M1 Signal Duration (Hours)  EEG from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"overall5\", \"Overall Study Quality Grade from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"overallstudyqualitygrade\", \"NaN\", \"NaN\", \"True\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"oximdur5\", \"Spo2 Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"period5\", \"Periodic Breathing >=10 Min from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"plethdur5\", \"Pleth Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"plmou5\", \"PLM > 100 Verified from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"plmwake5\", \"Leg Movements In Wake from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"posn5\", \"Signal Quality Issues Found On Position Signal from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quabdo5\", \"Abdo Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quair5\", \"Airflow Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quc45\", \"Cz-Oz Signal Quality-EEG Mismatched Variable Name And Label. Confirmed As \\\"Cz-Oz\\\" Signal from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"qucasn5\", \"Cannula Snore Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quchest5\", \"Chest Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quchin5\", \"Chin Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"que15\", \"E1 Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"que25\", \"E2 Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quecg5\", \"ECG Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"qufzm15\", \"Fz-Cz Signal Quality - EEG -  Mismatched Variable Name And Label. Confirmed As \\\"Fz-Cz\\\" Signal from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"qulimb5\", \"Limb Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quo2m15\", \"C4-M1 Signal Quality-EEG Mismatched Variable Name And Label. Confirmed As \\\"C4-M1\\\" Signal from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quoxim5\", \"Spo2 Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"qupleth5\", \"Pleth Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"quxflow5\", \"Cannula Flow Signal Quality from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgsignalquality\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"recbeaw5\", \"Data Lost - Recording Ended Before Wake from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"ref5\", \"Signal Quality Issues Found On Reference / Ground Signal from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"remarunrel5\", \"Scoring Arousals In REM (Only) Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"remnrempr5\", \"Scoring REM/NREM Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"respevpr5\", \"Scoring Respiratory Events (RDI) Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"rsnco5\", \"Reason For Study Failure from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgreasonfail\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"sao2lt855\", \"Urgent Referral - O2sat < 85% For >10% Total Sleep Time from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"scorid5\", \"PSG QS: Scorer ID from type II polysomnography\", \"NaN\", \"string\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"slewake5\", \"Study Scored Sleep / Wake Only (All Sleep Scored As N2 And No Arousals Scored Due To Poor Quality EEG) from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"True\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"status_psg5\", \"Pass/Fail Status from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"psgpassfail\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"stg1stg2pr5\", \"Scoring Stage1/Stage2 Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"stg2stg3pr5\", \"Scoring Stage2/Deep Sleep Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"svpulse5\", \"Manual Pulse At Time Of Hookup From Sv Form from type II polysomnography\", \"NaN\", \"integer\", \"beats per minute (bpm)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"svspo25\", \"Spo2 From Signal Verification Form - Reading At Time Of Hookup from type II polysomnography\", \"NaN\", \"integer\", \"percent (%)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unuhrou4a5\", \"Urgent Referral - Unusual HR: 2nd Or 3rd Degree Block from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"checkednotchecked\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unuhrou4b5\", \"Urgent Referral - Unusual HR: Acute St Segment from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"checkednotchecked\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unuhrou4c5\", \"Urgent Referral - Unusual HR: Nsvt 3-Beat Run from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"checkednotchecked\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unuhrou4d5\", \"Urgent Referral - Unusual HR: HR Above 150 BPM For >= 2 Min from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"checkednotchecked\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unuhrou4e5\", \"Urgent Referral - Unusual HR: HR < 30 BPM For >= 2 Min from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"checkednotchecked\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unuhrou4f5\", \"Urgent Referral - Unusual HR: Other from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"checkednotchecked\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unuhrou5\", \"Urgent Referral - Unusual HR/ECG (Categorical) from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"urgentunusualhr\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"unustgou5\", \"Unusual Staging from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"wakslepr5\", \"Scoring Stage Wake/Sleep Unreliable from type II polysomnography\", \"NaN\", \"choices\", \"NaN\", \"noyes\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Signal Quality\", \"xflowdur5\", \"Cannula Flow Signal Duration (Hours) from type II polysomnography\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"mesa_qs_annotated\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"nsupinep5\", \"Percentage of total sleep duration in non-supine position from type II polysomnography\", \"Sleep duration is the interval between sleep onset time and lights on/out-bed time while asleep, conventionally called total sleep time.\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_po_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"rem_lat15\", \"REM Latency I: the interval between sleep onset and first REM (including wake) from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttlprdsp_s1sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"remlaiip5\", \"REM Latency II: the interval between sleep onset and first REM while asleep (excluding wake) from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_s1sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"slp_eff5\", \"Sleep Efficiency: the proportion of total sleep duration in in-bed period from type II polysomnography\", \"Sleep duration is the interval between sleep onset time and lights on/out-bed time while asleep, while in-bed period is the interval between lights off/in-bed time and lights on/out-bed time. Conventionally, this variable could be described as the ratio between total sleep time (TST) and time in bed (TIB).\", \"numeric\", \"percent (%)\", \"NaN\", \"ttleffsp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"slp_lat5\", \"Sleep Latency: the interval between lights-out/in-bed time and sleep onset time from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttllatsp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"slp_maint_eff5\", \"Sleep Maintenance Efficiency: the proportion of sleep duration in sleep period  from type II polysomnography\", \"Sleep duration (i.e. total sleep time, TST) is the interval between sleep onset and sleep offset time while asleep. Sleep period is just the interval between sleep onset and sleep offset time. \", \"numeric\", \"percent (%)\", \"NaN\", \"ttlmefsp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"slpprdp5\", \"Total Sleep Duration: the interval between sleep onset and sleep offset while the participant is asleep from type II polysomnography\", \"Conventionally this variable would be called total sleep time (TST)(i.e. total time spent in stage 1 or greater).\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_f1t2;tst\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"stdurm5\", \"Total Recording Period: the interval between recording start and end time from type II polysomnography\", \"Conventionally this variable would be called total recording time.\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttlprdrd_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"stendp5\", \"Clock time when the recording (study) ends from type II polysomnography\", \"NaN\", \"time\", \"hh:mm:ss\", \"NaN\", \"endtimrd_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"stlonp5\", \"Clock time when the participant is out of bed or lights are on from type II polysomnography\", \"Conventionally, this variable would be called the end of time in bed (TIB).\", \"time\", \"hh:mm:ss\", \"NaN\", \"endtimbd_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"stloutp5\", \"Clock time when the participant is in bed or lights are out from type II polysomnography\", \"Conventionally, this variable would be called the start of time in bed (TIB).\", \"time\", \"hh:mm:ss\", \"NaN\", \"begtimbd_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"stonsetp5\", \"Sleep onset time from type II polysomnography\", \"Conventionally this variable would be called the start of total sleep time (TST)(i.e. total time spent in stage 1 or greater).\", \"time\", \"hh:mm:ss\", \"NaN\", \"stonset15;begtimsp_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"ststartp5\", \"Clock time when the recording (study) begins from type II polysomnography\", \"NaN\", \"time\", \"hh:mm:ss\", \"NaN\", \"begtimrd_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"supinep5\", \"Percentage of total sleep duration in supine position from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_pb_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"time_bed5\", \"Total In-bed Period: the interval between lights out/in-bed time and lights off/out-bed time from type II polysomnography\", \"Conventionally this variable would be called time in bed (TIB).\", \"numeric\", \"minutes (min)\", \"NaN\", \"timebedm5;ttlprdbd_f1t2;tib\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"timerem5\", \"Total duration of REM sleep from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_sr_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"timeremp5\", \"Percentage of total sleep duration in REM from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_sr_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"times34p5\", \"Percentage of total sleep duration in Stage 3 and 4 from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_s3_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"timest15\", \"Total duration of Stage 1 sleep from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_s1_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"timest1p5\", \"Percentage of total sleep duration in Stage 1 from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_s1_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"timest25\", \"Total duration of Stage 2 sleep from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_s2_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"timest2p5\", \"Percentage of total sleep duration in Stage 2 from type II polysomnography\", \"NaN\", \"numeric\", \"percent (%)\", \"NaN\", \"pctdursp_s2_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"timest345\", \"Total duration of Stage 3 and 4 sleep from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"ttldursp_s3_f1t2\", \"NaN\", \"NaN\", \"NaN\"], [\"Sleep Monitoring/Polysomnography/Sleep Architecture\", \"waso5\", \"Wake after Sleep Onset: the total duration between sleep onset and sleep offset time while being awake from type II polysomnography\", \"NaN\", \"numeric\", \"minutes (min)\", \"NaN\", \"waso;ttldurws_f1t2\", \"NaN\", \"True\", \"NaN\"], [\"Sleep Questionnaires/Chronotype\", \"feelngbstpk5\", \"Horne-Ostberg Morningness-Eveningness Questionnaire: Time of day reaching \\\"feeling best\\\" peak\", \"Item from the modified Horne-Ostberg Morningness-Eveningness Questionnaire. [Horne JA and Ostberg O, 1976 (PubMed ID: 1027738)](https://www.ncbi.nlm.nih.gov/pubmed/1027738) <br><br> Original question: *19. At what time of the day do you think that you reach your \\\"feeling best\\\" peak?* <br><br> [Search for all HOMEQ variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=homeq)\", \"choices\", \"NaN\", \"feelingpeak\", \"chronotype;homeq;homeq_19feelbest\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Chronotype\", \"feelngbstr5\", \"Horne-Ostberg Morningness-Eveningness Questionnaire: Ideal scheduled wake time\", \"Item from the modified Horne-Ostberg Morningness-Eveningness Questionnaire. [Horne JA and Ostberg O, 1976 (PubMed ID: 1027738)](https://www.ncbi.nlm.nih.gov/pubmed/1027738) <br><br> Original question: *16. Considering only your own \\\"feeling best\\\" rhythm, at what time would you get up if you were entirely free to plan your day?* <br><br> [Search for all HOMEQ variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=homeq)\", \"choices\", \"NaN\", \"feelingbest\", \"chronotype;homeq;homeq_02wake\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Chronotype\", \"hoostmeq5c\", \"Modified Horne-Ostberg Morningness-Eveningness Questionnaire (MEQ) Score\", \"Calculated Summary score based on modified Horne-Ostberg Morningness-Eveningness Questionnaire. Participants with an MEQ >= 18 were considered to have a morning preference, those with an MEQ between 11 and 18 were considered to have an intermediate preference, and participants with an MEQ <= 11 were considered to have an evening preference. [Horne JA and Ostberg O, 1976 (PubMed ID: 1027738)](https://www.ncbi.nlm.nih.gov/pubmed/1027738)<br><br> [Search for all HOMEQ variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=homeq)\", \"integer\", \"NaN\", \"NaN\", \"chronotype;homeq;homeq_score\", \"NaN\", \"True\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Chronotype\", \"mosttired4\", \"Horne-Ostberg Morningness-Eveningness Questionnaire: Time of evening you need sleep\", \"Item from the modified Horne-Ostberg Morningness-Eveningness Questionnaire. [Horne JA and Ostberg O, 1976 (PubMed ID: 1027738)](https://www.ncbi.nlm.nih.gov/pubmed/1027738) <br><br> Original question: *18. At what time in the evening do you feel most tired and, as a result, most in need of sleep?* <br><br> [Search for all HOMEQ variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=homeq)\", \"choices\", \"NaN\", \"mosttired\", \"chronotype;homeq;homeq_09needslp\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Chronotype\", \"tired5\", \"Horne-Ostberg Morningness-Eveningness Questionnaire: Tiredness during first half-hour after waking\", \"Item from the modified Horne-Ostberg Morningness-Eveningness Questionnaire. [Horne JA and Ostberg O, 1976 (PubMed ID: 1027738)](https://www.ncbi.nlm.nih.gov/pubmed/1027738) <br><br> Original question: *17. During the first half hour after having woken in the morning, how  tired do you feel?* <br><br> [Search for all HOMEQ variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=homeq)\", \"choices\", \"NaN\", \"tiredafter\", \"chronotype;homeq;homeq_08tired\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Chronotype\", \"types5\", \"Horne-Ostberg Morningness-Eveningness Questionnaire: Morning or evening type\", \"Item from the modified Horne-Ostberg Morningness-Eveningness Questionnaire. [Horne JA and Ostberg O, 1976 (PubMed ID: 1027738)](https://www.ncbi.nlm.nih.gov/pubmed/1027738) <br><br> Original question: *20. One hears about \\\"morning\\\" and \\\"evening\\\" types of people. Which ONE of these types do you consider yourself to be?* <br><br> [Search for all HOMEQ variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=homeq)\", \"choices\", \"NaN\", \"persontype\", \"chronotype;homeq;homeq_04type\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"car5\", \"Epworth Sleepiness Scale: Chance of dozing while in a car, while stopped for a few minutes in traffic\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12h. In a car, while stopped for a few minutes in traffic* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth) \", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_8stoppedcar\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"lyngdwn5\", \"Epworth Sleepiness Scale: Chance of dozing while lying down in the afternoon when circumstances permit\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12e. Lying down to rest in the afternoon when circumstances permit* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_5lyingdown\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"quietly5\", \"Epworth Sleepiness Scale: Chance of dozing while sitting quietly after lunch without alcohol\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12g. Sitting quietly after lunch without alcohol* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_7afterlunch\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"readng5\", \"Epworth Sleepiness Scale: Chance of dozing while sitting and reading\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12a. Sitting and reading* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_1sitread\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"riding5\", \"Epworth Sleepiness Scale: Chance of dozing as a passenger in a car for an hour without a break\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12d. Riding as a passenger in a car for an hour without a break* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_4passenger\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"sittng5\", \"Epworth Sleepiness Scale: Chance of dozing while sitting, inactive in a public place\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12c. Sitting inactive in a public place (such as a theater or a meeting)* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_3sitinactive\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"talkng5\", \"Epworth Sleepiness Scale: Chance of dozing while sitting and talking to someone\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12f. Sitting and talking to someone* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_6sittalk\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia/Epworth Sleepiness Scale (ESS)\", \"tv5\", \"Epworth Sleepiness Scale: Chance of dozing while watching TV\", \"Item from the Epworth Sleepiness Scale [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888) <br><br> Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12b. Watching TV* <br><br> [Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"choices\", \"NaN\", \"dozingchance\", \"subjective_sleepiness;epworth;ess_2watchingtv\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia\", \"dinner5\", \"Chance of dozing while at dinner table\", \"Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12i. At the dinner table*\", \"choices\", \"NaN\", \"dozingchance\", \"ess_diner;subjective_sleepiness\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia\", \"driving5\", \"Chance of dozing while driving\", \"Original question: *What is the chance that you would doze off or fall asleep (or just \\\"feel tired\\\") in each of the following situations? 12j. While driving*\", \"choices\", \"NaN\", \"dozingchance\", \"ess_driving;subjective_sleepiness\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia\", \"epslpscl5c\", \"Epworth Sleepiness Scale: Total score\", \"Calculated - Total score based on an 8-item questionnaires ranking likelihood of dozing off [Johns MW 1991 (PubMed ID: 1798888)](https://www.ncbi.nlm.nih.gov/pubmed/1798888). Scale 0-3 for individual items; 0 to 24 for overall score. <br><br>[Search for all ESS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=epworth)\", \"integer\", \"NaN\", \"NaN\", \"ess_score;subjective_sleepiness;epworth\", \"NaN\", \"True\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Hypersomnia\", \"sleepy5\", \"Frequency of excessive sleepiness during the day in the last 4 weeks\", \"Original question: *The next questions ask about your sleep habits. Please choose one of the answers for each of the following questions. Pick the answer that best describes how often you experienced the situation in the past 4 weeks. 10. Did you feel overly sleepy during the day?* \", \"choices\", \"NaN\", \"freq4weeks\", \"subjective_sleepiness;nhanes_15sleepy\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Parasomnia\", \"legsdscmfrt5\", \"Experience desire to move legs because of discomfort or disagreeable sensations in legs\", \"Original question: *15. Do you ever experience a desire to move your legs because of discomfort or disagreeable sensations in your legs?*\", \"choices\", \"NaN\", \"noyesdk\", \"rls_plms\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Parasomnia\", \"rubbnglgs5\", \"Feel need to move to relieve discomfort by walking or rub legs\", \"Original question: *15a. Do you sometimes feel the need to move to relieve the discomfort, for example by walking, or by rubbing your legs?*\", \"choices\", \"NaN\", \"noyesdk\", \"rls_plms\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Parasomnia\", \"wrseltr5\", \"Symptoms worse later in day or night\", \"Original question: *15c. Are these symptoms worse later in the day or at night?*\", \"choices\", \"NaN\", \"noyesdk\", \"rls_plms\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Parasomnia\", \"wrserest5\", \"Symptoms worse when at rest with temporary relief by activity\", \"Original question: *15b. Are these symptoms worse when you are at rest, with at least temporary relief by activity?*\", \"choices\", \"NaN\", \"noyesdk\", \"rls_plms\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disorder\", \"insmnia5\", \"Insomnia: Self-reported diagnosis by a physician\", \"Original question: *21b. Have you been told by a doctor that you have any of the following: Insomnia?*\", \"choices\", \"NaN\", \"noyes\", \"insomnia;nhanes_08insomnia\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disorder\", \"rstlesslgs5\", \"Restless Legs: Self-reported diagnosis by a physician\", \"Original question: *21c. Have you been told by a doctor that you have any of the following: Restless Legs?*\", \"choices\", \"NaN\", \"noyes\", \"rls_plms;nhanes_09rls\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disorder\", \"slpapnea5\", \"Sleep Apnea: Self-reported diagnosis by a physician\", \"Original question: *21a. Have you been told by a doctor that you have any of the following: Sleep Apnea (or obstructive sleep apnea, OSA)?*\", \"choices\", \"NaN\", \"noyes\", \"sdb;nhanes_07apnea\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disordered Breathing\", \"snored5\", \"Frequency of snoring in the past 4 weeks\", \"Original question: *13. Over the past 4 weeks, how often have you snored?*\", \"choices\", \"NaN\", \"freq4weeksdk\", \"sdb;nhanes_03snore\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disordered Breathing\", \"stpbrthng5\", \"Frequency of breathing-stop during sleep in the past 4 weeks\", \"Original question: *14. Over the past 4 weeks, how often do you have times when you stop breathing during your sleep?*\", \"choices\", \"NaN\", \"freq4weeksdk\", \"sdb;nhanes_04stop\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance/Women's Health Initiative Insomnia Rating Scale (WHIIRS)\", \"bcksleep5\", \"Women's Health Initiative Insomnia Rating Scale: Trouble getting back to sleep after waking too early\", \"Item from the Women's Health Initiative Insomnia Rating Scale. [Levine et al. (2003)](https://psycnet.apa.org/record/2003-06188-004) <br><br> Original question: *The next questions ask about your sleep habits. Please choose one of the answers for each of the following questions. Pick the answer that best describes how often you experienced the situation in the past 4 weeks. 7. Did you have trouble getting back to sleep after you woke up too early?* <br><br> [Search for all WHIIRS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=whiirs)\", \"choices\", \"NaN\", \"freq4weeks\", \"insomnia;whiirs;whiirs_4backtosleep\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance/Women's Health Initiative Insomnia Rating Scale (WHIIRS)\", \"trbleslpng5\", \"Women's Health Initiative Insomnia Rating Scale: Trouble falling asleep\", \"Item from the Women's Health Initiative Insomnia Rating Scale. [Levine et al. (2003)](https://psycnet.apa.org/record/2003-06188-004) <br><br> Original question: *The next questions ask about your sleep habits. Please choose one of the answers for each of the following questions. Pick the answer that best describes how often you experienced the situation in the past 4 weeks. 4. Did you have trouble falling asleep?* <br><br> [Search for all WHIIRS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=whiirs)\", \"choices\", \"NaN\", \"freq4weeks\", \"insomnia;whiirs;whiirs_1fallasleep\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance/Women's Health Initiative Insomnia Rating Scale (WHIIRS)\", \"typicalslp5\", \"Women's Health Initiative Insomnia Rating Scale: Typical night sleep\", \"Item from the Women's Health Initiative Insomnia Rating Scale. [Levine et al. (2003)](https://psycnet.apa.org/record/2003-06188-004) <br><br> Original question: *11. Overall, was your typical night's sleep during the past 4 weeks:* <br><br> [Search for all WHIIRS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=whiirs)\", \"choices\", \"NaN\", \"typicalsleep\", \"insomnia;whiirs;whiirs_5quality\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance/Women's Health Initiative Insomnia Rating Scale (WHIIRS)\", \"wakeearly5\", \"Women's Health Initiative Insomnia Rating Scale: Wake earlier than planned\", \"Item from the Women's Health Initiative Insomnia Rating Scale. [Levine et al. (2003)](https://psycnet.apa.org/record/2003-06188-004) <br><br> Original question: *The next questions ask about your sleep habits. Please choose one of the answers for each of the following questions. Pick the answer that best describes how often you experienced the situation in the past 4 weeks. 6. Did you wake up earlier than you planned to?* <br><br> [Search for all WHIIRS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=whiirs)\", \"choices\", \"NaN\", \"freq4weeks\", \"insomnia;whiirs;whiirs_3earlywake\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance/Women's Health Initiative Insomnia Rating Scale (WHIIRS)\", \"wakeup5\", \"Women's Health Initiative Insomnia Rating Scale: Wake several times at night\", \"Item from the Women's Health Initiative Insomnia Rating Scale. [Levine et al. (2003)](https://psycnet.apa.org/record/2003-06188-004) <br><br> Original question: *The next questions ask about your sleep habits. Please choose one of the answers for each of the following questions. Pick the answer that best describes how often you experienced the situation in the past 4 weeks. 5. Did you wake up several times a night?* <br><br> [Search for all WHIIRS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=whiirs)\", \"choices\", \"NaN\", \"freq4weeks\", \"insomnia;whiirs;whiirs_2freqwake\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance\", \"irritable5\", \"Frequency of irritability due to sleep difficulties in the last 4 weeks\", \"Original question: *The next questions ask about your sleep habits. Please choose one of the answers for each of the following questions. Pick the answer that best describes how often you experienced the situation in the past 4 weeks. 9. Did you have sleep difficulties that made you very irritable?*\", \"choices\", \"NaN\", \"freq4weeks\", \"sleep_related_impairment\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance\", \"slpngpills5\", \"Frequency of taking sleeping pills to help with sleep in the last 4 weeks\", \"Original question: *The next questions ask about your sleep habits. Please choose one of the answers for each of the following questions. Pick the answer that best describes how often you experienced the situation in the past 4 weeks. 8. Did you take sleeping pills to help you sleep?*\", \"choices\", \"NaN\", \"freq4weeks\", \"insomnia;nhanes_17meds\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Disturbance\", \"whiirs5c\", \"Women's Health Initiative Insomnia Rating Scale: Total score\", \"Calculated - The Women's Health Initiative Insomnia Rating Scale (WHIIRS) has 5 items. Each item is scored on a 5 point scale (from 0-4). The total score is the sum of all five items ranging from 0 to 20. Higher score indicates more severe insomnia. A score of 9 or higher is considered clinically significant insomnia. [Levine et al.(2003)](https://psycnet.apa.org/record/2003-06188-004) <br><br> [Search for all WHIIRS variables within this dataset](https://sleepdata.org/datasets/mesa/variables?search=whiirs)\", \"integer\", \"NaN\", \"NaN\", \"insomnia;whiirs;whiirs_score\", \"NaN\", \"True\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"bedtmwkday5c\", \"Self-reported start time of the in-bed period on weekdays in 24-hour format\", \"Conventionally this variable would be called time to bed.<br><br>Original question: *1. What time do you usually go to bed? a. On weekdays or work or school days?*\", \"time\", \"hh:mm:ss\", \"NaN\", \"sleep_timing;begtimbd_w5_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"bedtmwkend5c\", \"Self-reported start time of the in-bed period on weekends in 24-hour format\", \"Conventionally this variable would be called time to bed.<br><br>Original question: *1. What time do you usually go to bed? b. On weekends, or days off?*\", \"time\", \"hh:mm:ss\", \"NaN\", \"sleep_timing;begtimbd_w2_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"nap5\", \"Typical number of naps in a usual week from survey questionnaires\", \"Original question: *3. During a usual week, how many times do you nap for 5 minutes or more?*\", \"integer\", \"number of events\", \"NaN\", \"ttlnumnp_in_w7_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"waketmwkday5c\", \"Self-reported end time of the in-bed period on weekdays in 24-hour format from survey questionnaires\", \"Conventionally this variable would be called wake time.<br><br>Original question: *2. What time do you usually wake up: a. On weekdays or work or school days?*\", \"time\", \"hh:mm:ss\", \"NaN\", \"sleep_timing;endtimbd_w5_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"waketmwkend5c\", \"Self-reported end time of the in-bed period on weekends in 24-hour format from survey questionnaires\", \"Conventionally this variable would be called wake time.<br><br>Original question: *2. What time do you usually wake up: b. On weekends, or days off?*\", \"time\", \"hh:mm:ss\", \"NaN\", \"sleep_timing;endtimbd_w2_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"wkdaysleepdur5c\", \"Self-reported daily sleep duration on weekdays from survey questionnaires\", \"NaN\", \"time\", \"hh:mm:ss\", \"NaN\", \"sleep_duration;avgdursp_w5_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"wkdaysleepdur5t\", \"Self-reported daily sleep duration on weekdays from survey questionnaires\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"sleep_duration;avgdursp_w5_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"wkendsleepdur5c\", \"Self-reported daily sleep duration on weekends from survey questionnaires\", \"NaN\", \"time\", \"hh:mm:ss\", \"NaN\", \"sleep_duration;avgdursp_w2_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Questionnaires/Sleep Habits\", \"wkendsleepdur5t\", \"Self-reported daily sleep duration on weekends from survey questionnaires\", \"NaN\", \"numeric\", \"hours (hr)\", \"NaN\", \"sleep_duration;avgdursp_w2_f3\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Treatment\", \"cpap5\", \"CPAP or BiPAP Machine for Sleep Apnea: Self-reported\", \"Original question: *21a. Did you receive treatment for sleep apnea with any of the following: CPAP or BIPAP machine?*\", \"choices\", \"NaN\", \"noyes\", \"sdb\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Treatment\", \"dntaldv5\", \"Dental (Oral) Device for Sleep Apnea: Self-reported\", \"Original question: *21a. Did you receive treatment for sleep apnea with any of the following: Dental (Oral) Device?*\", \"choices\", \"NaN\", \"noyes\", \"sdb\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"], [\"Sleep Treatment\", \"uvula5\", \"Throat/Uvula Surgery for Sleep Apnea: Self-reported\", \"Original question: *21a. Did you receive treatment for sleep apnea with any of the following: Throat/Uvula Surgery?*\", \"choices\", \"NaN\", \"noyes\", \"sdb\", \"NaN\", \"NaN\", \"mesa_sleep_questionnaire\"]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"layout\": {\"topStart\": \"pageLength\", \"topEnd\": \"search\", \"bottomStart\": \"info\", \"bottomEnd\": \"paging\"}, \"order\": [], \"warn_on_selected_rows_not_rendered\": true};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        \n",
       "        new DataTable(table, dt_args);\n",
       "    });\n",
       "</script>\n"
      ],
      "text/plain": [
       "                                folder               id  \\\n",
       "0                       Administrative         cucmcn1c   \n",
       "1                       Administrative       examnumber   \n",
       "2                       Administrative          gender1   \n",
       "3                       Administrative           mesaid   \n",
       "4                       Administrative           race1c   \n",
       "..                                 ...              ...   \n",
       "643  Sleep Questionnaires/Sleep Habits  wkendsleepdur5c   \n",
       "644  Sleep Questionnaires/Sleep Habits  wkendsleepdur5t   \n",
       "645                    Sleep Treatment            cpap5   \n",
       "646                    Sleep Treatment         dntaldv5   \n",
       "647                    Sleep Treatment           uvula5   \n",
       "\n",
       "                                          display_name  \\\n",
       "0    Current participant consent for commercial use...   \n",
       "1                                     MESA exam number   \n",
       "2                            Gender of the participant   \n",
       "3                                     MESA BioLINCC ID   \n",
       "4                    Race/ethnicity of the participant   \n",
       "..                                                 ...   \n",
       "643  Self-reported daily sleep duration on weekends...   \n",
       "644  Self-reported daily sleep duration on weekends...   \n",
       "645  CPAP or BiPAP Machine for Sleep Apnea: Self-re...   \n",
       "646  Dental (Oral) Device for Sleep Apnea: Self-rep...   \n",
       "647  Throat/Uvula Surgery for Sleep Apnea: Self-rep...   \n",
       "\n",
       "                                           description        type  \\\n",
       "0                                                  NaN     choices   \n",
       "1    Note: The MESA Sleep ancillary study took plac...     choices   \n",
       "2                                                  NaN     choices   \n",
       "3    This subject identifier code matches what has ...  identifier   \n",
       "4    Note from MESA Coordinating Center: It is reco...     choices   \n",
       "..                                                 ...         ...   \n",
       "643                                                NaN        time   \n",
       "644                                                NaN     numeric   \n",
       "645  Original question: *21a. Did you receive treat...     choices   \n",
       "646  Original question: *21a. Did you receive treat...     choices   \n",
       "647  Original question: *21a. Did you receive treat...     choices   \n",
       "\n",
       "          units      domain                         labels calculation  \\\n",
       "0           NaN       noyes                            NaN         NaN   \n",
       "1           NaN  examnumber                            NaN         NaN   \n",
       "2           NaN      gender                            NaN         NaN   \n",
       "3           NaN         NaN                            NaN         NaN   \n",
       "4           NaN        race                            NaN         NaN   \n",
       "..          ...         ...                            ...         ...   \n",
       "643    hh:mm:ss         NaN  sleep_duration;avgdursp_w2_f3         NaN   \n",
       "644  hours (hr)         NaN  sleep_duration;avgdursp_w2_f3         NaN   \n",
       "645         NaN       noyes                            sdb         NaN   \n",
       "646         NaN       noyes                            sdb         NaN   \n",
       "647         NaN       noyes                            sdb         NaN   \n",
       "\n",
       "    commonly_used                     forms  \n",
       "0            True                       NaN  \n",
       "1            True                       NaN  \n",
       "2            True                       NaN  \n",
       "3            True                       NaN  \n",
       "4            True                       NaN  \n",
       "..            ...                       ...  \n",
       "643           NaN  mesa_sleep_questionnaire  \n",
       "644           NaN  mesa_sleep_questionnaire  \n",
       "645           NaN  mesa_sleep_questionnaire  \n",
       "646           NaN  mesa_sleep_questionnaire  \n",
       "647           NaN  mesa_sleep_questionnaire  \n",
       "\n",
       "[648 rows x 11 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "variables"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"itables_3d35e4a5_dd1b_4e25_af42_082fe95d67ee\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
       "<thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>mesaid</th>\n",
       "      <th>examnumber</th>\n",
       "      <th>race1c</th>\n",
       "      <th>gender1</th>\n",
       "      <th>cucmcn1c</th>\n",
       "      <th>sleepage5c</th>\n",
       "      <th>site5c</th>\n",
       "      <th>htcm5</th>\n",
       "      <th>wtlb5</th>\n",
       "      <th>bmi5c</th>\n",
       "      <th>smkstat5</th>\n",
       "      <th>cursmk5</th>\n",
       "      <th>bedtmwkday5c</th>\n",
       "      <th>waketmwkday5c</th>\n",
       "      <th>wkdaysleepdur5c</th>\n",
       "      <th>wkdaysleepdur5t</th>\n",
       "      <th>bedtmwkend5c</th>\n",
       "      <th>waketmwkend5c</th>\n",
       "      <th>wkendsleepdur5c</th>\n",
       "      <th>wkendsleepdur5t</th>\n",
       "      <th>nap5</th>\n",
       "      <th>trbleslpng5</th>\n",
       "      <th>wakeup5</th>\n",
       "      <th>wakeearly5</th>\n",
       "      <th>bcksleep5</th>\n",
       "      <th>slpngpills5</th>\n",
       "      <th>irritable5</th>\n",
       "      <th>sleepy5</th>\n",
       "      <th>typicalslp5</th>\n",
       "      <th>readng5</th>\n",
       "      <th>tv5</th>\n",
       "      <th>sittng5</th>\n",
       "      <th>riding5</th>\n",
       "      <th>lyngdwn5</th>\n",
       "      <th>talkng5</th>\n",
       "      <th>quietly5</th>\n",
       "      <th>car5</th>\n",
       "      <th>dinner5</th>\n",
       "      <th>driving5</th>\n",
       "      <th>snored5</th>\n",
       "      <th>stpbrthng5</th>\n",
       "      <th>legsdscmfrt5</th>\n",
       "      <th>rubbnglgs5</th>\n",
       "      <th>wrserest5</th>\n",
       "      <th>wrseltr5</th>\n",
       "      <th>avgsleepperioddurationnw5</th>\n",
       "      <th>sdsleepperioddurationnw5</th>\n",
       "      <th>avgmainsleepnw5</th>\n",
       "      <th>sdmainsleepnw5</th>\n",
       "      <th>avgonsetlatencynw5</th>\n",
       "      <th>avgwasonw5</th>\n",
       "      <th>avgsnoozenw5</th>\n",
       "      <th>avginbedwakenw5</th>\n",
       "      <th>avgefficiencynw5</th>\n",
       "      <th>sdefficiencynw5</th>\n",
       "      <th>avgmainteffnw5</th>\n",
       "      <th>sdmainteffnw5</th>\n",
       "      <th>avgfragmentationnw5</th>\n",
       "      <th>avgsleepboutsnw5</th>\n",
       "      <th>avgwakeboutsnw5</th>\n",
       "      <th>ndaysnapsallnw5</th>\n",
       "      <th>ndaysnapssleepnw5</th>\n",
       "      <th>ndaysnapssleep15nw5</th>\n",
       "      <th>avgnnapsallnw5</th>\n",
       "      <th>avgnnapssleepnw5</th>\n",
       "      <th>avgnnapssleep15nw5</th>\n",
       "      <th>avgsleepnapsallnw5</th>\n",
       "      <th>avgsleepnapssleepnw5</th>\n",
       "      <th>avgsleepnapssleep15nw5</th>\n",
       "      <th>avgsleepnapdaily15nw5</th>\n",
       "      <th>avginbedtimenw5</th>\n",
       "      <th>sdinbedtimenw5</th>\n",
       "      <th>avgsleeponsettimenw5</th>\n",
       "      <th>sdsleeponsettimenw5</th>\n",
       "      <th>avgsleepoffsettimenw5</th>\n",
       "      <th>sdsleepoffsettimenw5</th>\n",
       "      <th>avgoutbedtimenw5</th>\n",
       "      <th>sdoutbedtimenw5</th>\n",
       "      <th>avgrestmidpointnw5</th>\n",
       "      <th>sdrestmidpointnw5</th>\n",
       "      <th>avgsleepmidpointnw5</th>\n",
       "      <th>sdsleepmidpointnw5</th>\n",
       "      <th>avgwhitetaltnw5</th>\n",
       "      <th>avgbluetaltnw5</th>\n",
       "      <th>avggreentaltnw5</th>\n",
       "      <th>avgredtaltnw5</th>\n",
       "      <th>avgsleepnapdailyrd5</th>\n",
       "      <th>dstoverlap5</th>\n",
       "      <th>epochlength5</th>\n",
       "      <th>lgn</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr>\n",
       "<td style=\"vertical-align:middle; text-align:left\">\n",
       "<div style=\"float:left; margin-right: 10px;\">\n",
       "<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
       "    <g style=\"fill:#d9d7fc\">\n",
       "        <path d=\"M100,400H500V357H100Z\" />\n",
       "        <path d=\"M100,300H400V257H100Z\" />\n",
       "        <path d=\"M0,200H400V157H0Z\" />\n",
       "        <path d=\"M100,100H500V57H100Z\" />\n",
       "        <path d=\"M100,350H500V307H100Z\" />\n",
       "        <path d=\"M100,250H400V207H100Z\" />\n",
       "        <path d=\"M0,150H400V107H0Z\" />\n",
       "        <path d=\"M100,50H500V7H100Z\" />\n",
       "    </g>\n",
       "    <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
       "   <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"0;0;400\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;300;0\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;400\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
       "            <g transform=\"translate(45 50) rotate(-45)\">\n",
       "                <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
       "                <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(450 152)\">\n",
       "                <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
       "                <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(50 352)\">\n",
       "                <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
       "                <polygon points=\"-35,10 0,45 35,10\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(75 250)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(425 250) rotate(180)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "        </g>\n",
       "    </g>\n",
       "</svg>\n",
       "</a>\n",
       "</div>\n",
       "<div>\n",
       "Loading ITables v2.2.2 from the <code>init_notebook_mode</code> cell...\n",
       "(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
       "</div>\n",
       "</tr></tbody>\n",
       "\n",
       "</table>\n",
       "<script type=\"module\">\n",
       "    const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_2_2);\n",
       "\n",
       "    document.querySelectorAll(\"#itables_3d35e4a5_dd1b_4e25_af42_082fe95d67ee:not(.dataTable)\").forEach(table => {\n",
       "        if (!(table instanceof HTMLTableElement))\n",
       "            return;\n",
       "\n",
       "        // Define the table data\n",
       "        const data = [[1, 5, 1, 0, 1, 70, 7, 156.6, 119.0, 22.010834, 1.0, 0.0, \"22:30:00\", \"7:30:00\", \"9:00:00\", 9.0, \"23:00:00\", \"7:30:00\", \"8:30:00\", 8.5, 0.0, 1.0, 5.0, 3.0, 3.0, 1.0, 1.0, 1.0, 2.0, 3.0, 4.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 1.0, 1.0, 1.0, 1.0, 395.75, 134.896565, 343.875, 121.359229, 0.375, 51.875, 1.125, 53.375, 86.452574, 2.179829, 86.712675, 2.257229, 23.314435, 32.75, 32.75, 3.0, 3.0, 2.0, 0.75, 0.75, 0.5, 28.333333, 28.333333, 36.5, 18.25, \"0:24:08\", \"1:42:58\", \"0:24:30\", \"1:42:24\", \"7:00:15\", \"0:28:08\", \"7:01:23\", \"0:28:55\", \"3:42:45\", \"0:47:00\", \"3:42:23\", \"0:47:11\", 25.625, 0.0, 1.25, 0.125, 28.875, 0.0, 30.0, 0.417], [2, 5, 1, 0, 1, 83, 5, 159.1, 122.2, 21.897972, 0.0, NaN, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, 1.0, 2.0, 5.0, 2.0, 2.0, 2.0, 1.0, 1.0, 3.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, NaN, NaN, NaN, 455.9, 78.217166, 419.5, 70.558486, 5.2, 36.4, 2.8, 44.4, 90.441488, 1.223952, 92.060718, 1.362962, 11.05654, 27.8, 27.2, 2.0, 2.0, 2.0, 0.6, 0.6, 0.6, 24.166667, 24.166667, 24.166667, 14.5, \"22:10:00\", \"0:33:25\", \"22:15:12\", \"0:36:38\", \"5:51:06\", \"1:02:50\", \"5:53:54\", \"1:04:10\", \"2:01:57\", \"0:37:24\", \"2:03:09\", \"0:37:42\", 0.5, 0.0, 0.0, 0.0, 24.5, 0.0, 30.0, 0.461], [6, 5, 4, 0, 1, 57, 8, 146.5, 265.0, 56.007175, 1.0, 0.0, \"23:30:00\", \"6:30:00\", \"7:00:00\", 7.0, \"23:30:00\", \"6:30:00\", \"7:00:00\", 7.0, 1.0, 4.0, 5.0, 2.0, 5.0, 5.0, 5.0, 5.0, 2.0, 4.0, 3.0, 3.0, 3.0, 4.0, 3.0, 3.0, 1.0, 3.0, 1.0, 4.0, 2.0, 0.0, NaN, NaN, NaN, 443.571429, 79.883993, 378.928571, 68.38642, 5.928571, 64.642857, 3.714286, 74.285714, 83.678096, 4.456892, 85.445019, 4.103509, 29.95009, 43.428571, 42.857143, 2.0, 2.0, 2.0, 0.333333, 0.333333, 0.333333, 37.75, 37.75, 37.75, 12.583333, \"23:42:13\", \"1:00:05\", \"23:48:09\", \"0:59:49\", \"7:11:43\", \"0:43:22\", \"7:15:26\", \"0:41:51\", \"3:28:49\", \"0:34:53\", \"3:29:56\", \"0:36:54\", 104.857143, 6.0, 20.071429, 9.428571, 15.428571, 0.0, 30.0, 0.274], [10, 5, 1, 1, 1, 57, 5, 169.1, 125.1, 19.844636, 0.0, NaN, \"23:30:00\", \"5:00:00\", \"5:30:00\", 5.5, \"0:00:00\", \"6:30:00\", \"6:30:00\", 6.5, 1.0, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0, 2.0, 2.0, 3.0, 3.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 9.0, 1.0, 1.0, 0.0, 1.0, 193.125, 66.731271, 172.625, 64.03173, 3.5, 20.5, 1.875, 25.875, 86.493106, 6.494019, 88.898812, 4.6565, 27.537629, 11.25, 10.75, 3.0, 3.0, 2.0, 4.0, 4.0, 3.5, 63.96875, 63.96875, 71.428571, 250.0, \"0:55:15\", \"2:21:35\", \"0:58:45\", \"2:20:43\", \"4:11:53\", \"3:09:23\", \"4:13:45\", \"3:08:07\", \"2:34:30\", \"2:43:56\", \"2:35:19\", \"2:44:18\", 1.125, 0.0, 0.375, 0.0, 235.0, 0.0, 30.0, 0.532], [12, 5, 1, 1, 1, 80, 7, 178.0, 194.0, 27.773766, 0.0, NaN, \"20:30:00\", \"7:00:00\", \"10:30:00\", 10.5, \"22:00:00\", \"8:00:00\", \"10:00:00\", 10.0, 1.0, 2.0, 4.0, 2.0, 2.0, 1.0, 1.0, 3.0, 2.0, 1.0, 2.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 1.0, 1.0, 9.0, 9.0, 9.0, 464.833333, 100.18616, 411.916667, 72.611581, 4.583333, 52.916667, 2.25, 59.75, 88.157598, 5.031998, 89.35484, 4.921707, 22.061922, 42.833333, 42.5, 4.0, 4.0, 4.0, 1.2, 1.2, 1.2, 48.75, 48.75, 48.75, 58.5, \"9:14:20\", \"11:20:15\", \"9:18:55\", \"11:19:51\", \"17:03:45\", \"10:31:58\", \"17:06:00\", \"10:31:32\", \"13:10:10\", \"11:05:02\", \"13:11:20\", \"11:04:51\", 80.583333, 5.583333, 14.0, 9.916667, 38.0, 0.0, 30.0, 0.486], [14, 5, 3, 0, 1, 60, 3, 159.6, 176.6, 31.448358, 3.0, 1.0, \"1:00:00\", \"9:00:00\", \"8:00:00\", 8.0, \"22:00:00\", \"8:00:00\", \"10:00:00\", 10.0, 1.0, 3.0, 5.0, 1.0, NaN, 1.0, 1.0, 5.0, 2.0, 3.0, 3.0, 1.0, 3.0, 4.0, 1.0, 4.0, 1.0, 1.0, 1.0, 9.0, 9.0, 1.0, 0.0, 0.0, 0.0, 430.071429, 96.54508, 370.928571, 65.569574, 3.0, 59.142857, 12.357143, 74.5, 83.893083, 4.393495, 87.183404, 5.475501, 22.756388, 34.428571, 33.571429, 5.0, 5.0, 4.0, 2.0, 2.0, 1.833333, 56.708333, 56.708333, 61.045455, 111.916667, \"2:55:34\", \"1:36:39\", \"2:58:34\", \"1:37:17\", \"10:08:39\", \"1:45:41\", \"10:21:00\", \"1:47:32\", \"6:38:17\", \"1:32:31\", \"6:33:36\", \"1:31:13\", 1.928571, 0.0, 0.071429, 0.0, 97.214286, 0.0, 30.0, 0.426], [16, 5, 4, 0, 1, 57, 4, 161.5, 136.0, 23.651947, 1.0, 0.0, \"22:00:00\", \"7:00:00\", \"9:00:00\", 9.0, \"2:00:00\", \"7:00:00\", \"5:00:00\", 5.0, 0.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 4.0, 1.0, 3.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 1.0, 1.0, 1.0, 509.0, 100.440696, 477.0, 94.674002, 1.714286, 32.0, 2.928571, 36.642857, 92.869903, 1.166784, 93.712866, 1.013185, 10.606957, 31.285714, 31.0, 2.0, 2.0, 2.0, 0.333333, 0.333333, 0.333333, 33.75, 33.75, 33.75, 11.25, \"22:06:43\", \"1:21:23\", \"22:08:26\", \"1:20:47\", \"6:37:26\", \"1:10:34\", \"6:40:21\", \"1:10:29\", \"2:23:32\", \"0:59:56\", \"2:22:56\", \"0:59:55\", 47.071429, 6.5, 11.928571, 7.142857, 13.5, 0.0, 30.0, 0.307], [21, 5, 4, 0, 1, 78, 8, 165.2, 137.0, 22.77055, 0.0, NaN, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:30:00\", \"8:30:00\", 8.5, 1.0, 1.0, 2.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 2.0, 2.0, 3.0, 2.0, 1.0, 2.0, 2.0, 1.0, 1.0, 3.0, 9.0, 1.0, 1.0, 0.0, 0.0, 581.5, 65.468313, 554.083333, 55.011287, 7.416667, 27.416667, 0.583333, 35.416667, 94.077231, 1.799099, 95.395733, 1.624255, 11.809006, 20.333333, 20.166667, 3.0, 3.0, 3.0, 0.5, 0.5, 0.5, 61.666667, 61.666667, 61.666667, 30.833333, \"21:58:40\", \"0:52:32\", \"22:06:05\", \"0:53:44\", \"7:47:35\", \"0:10:53\", \"7:48:10\", \"0:11:14\", \"2:53:25\", \"0:24:16\", \"2:56:50\", \"0:24:41\", 41.083333, 0.666667, 4.666667, 0.916667, 56.1, 0.0, 30.0, 0.421], [27, 5, 1, 0, 1, 72, 5, 164.1, 120.0, 20.213296, 0.0, NaN, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 0.0, 3.0, 5.0, 4.0, 5.0, 5.0, 4.0, 5.0, 2.0, 2.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 0.0, 1.0, 1.0, 502.916667, 77.789084, 463.833333, 63.172515, 3.916667, 39.083333, 4.25, 47.25, 90.935262, 3.407989, 92.459343, 3.40183, 14.632927, 27.333333, 27.166667, 1.0, 1.0, 1.0, 0.166667, 0.166667, 0.166667, 49.5, 49.5, 49.5, 8.25, \"22:33:00\", \"1:03:02\", \"22:36:55\", \"1:00:14\", \"6:59:50\", \"0:35:08\", \"7:04:05\", \"0:31:35\", \"2:48:33\", \"0:35:08\", \"2:48:23\", \"0:34:13\", 28.666667, 3.666667, 6.0, 3.916667, 24.785714, 0.0, 30.0, 0.319], [28, 5, 1, 0, 1, 60, 6, 170.6, 210.0, 32.729117, 3.0, 1.0, \"21:30:00\", \"5:00:00\", \"7:30:00\", 7.5, \"0:00:00\", \"6:30:00\", \"6:30:00\", 6.5, 1.0, 2.0, 5.0, 1.0, NaN, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 0.0, NaN, NaN, NaN, 427.25, 25.102291, 407.25, 26.516504, 4.5, 20.0, 3.75, 28.25, 93.465534, 2.446585, 95.301066, 0.607081, 15.608495, 24.0, 24.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"22:30:15\", \"0:33:45\", \"22:34:45\", \"0:29:15\", \"5:42:00\", \"0:47:00\", \"5:45:45\", \"0:45:45\", \"2:08:00\", \"0:39:45\", \"2:08:23\", \"0:38:08\", 72.5, 3.75, 19.0, 2.75, 16.833333, 0.0, 30.0, 0.308], [29, 5, 1, 1, 1, 77, 8, 185.0, 178.0, 23.591176, 1.0, 0.0, \"23:30:00\", \"7:00:00\", \"7:30:00\", 7.5, \"23:30:00\", \"7:00:00\", \"7:30:00\", 7.5, 1.0, 1.0, 4.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 1.0, 0.0, NaN, NaN, NaN, 376.357143, 114.586472, 341.714286, 107.013573, 4.857143, 34.642857, 1.857143, 41.357143, 88.944526, 4.0909, 90.575111, 3.232464, 27.2744, 33.571429, 33.142857, 6.0, 6.0, 6.0, 1.666667, 1.666667, 1.666667, 54.65, 54.65, 54.65, 91.083333, \"22:57:43\", \"0:57:12\", \"23:02:34\", \"0:56:27\", \"5:18:56\", \"1:57:34\", \"5:20:47\", \"1:58:39\", \"2:09:15\", \"1:16:15\", \"2:10:45\", \"1:15:26\", 50.214286, 7.285714, 19.928571, 12.142857, 71.5, 0.0, 30.0, NaN], [33, 5, 2, 1, 1, 77, 8, 164.5, 172.0, 28.831663, 0.0, NaN, \"21:30:00\", \"7:00:00\", \"9:30:00\", 9.5, \"21:30:00\", \"7:00:00\", \"9:30:00\", 9.5, 1.0, 1.0, 4.0, 1.0, NaN, 1.0, 2.0, 2.0, 2.0, 3.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 9.0, 653.0, 53.448106, 607.416667, 48.457628, 1.5, 45.583333, 1.916667, 49.0, 92.519538, 1.424746, 93.034499, 1.091601, 14.752136, 38.166667, 37.833333, 5.0, 5.0, 5.0, 2.2, 2.2, 2.2, 90.181818, 90.181818, 90.181818, 198.4, \"21:08:20\", \"0:48:25\", \"21:09:50\", \"0:48:31\", \"8:02:50\", \"0:37:47\", \"8:04:45\", \"0:35:15\", \"2:36:33\", \"0:35:34\", \"2:36:20\", \"0:35:59\", 0.583333, 0.0, 0.0, 0.0, 80.5, 0.0, 30.0, 0.491], [35, 5, 4, 1, 1, 67, 8, 172.5, 151.0, 23.018223, 0.0, NaN, \"23:00:00\", \"6:30:00\", \"7:30:00\", 7.5, \"23:00:00\", \"6:30:00\", \"7:30:00\", 7.5, 1.0, 1.0, 1.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 452.916667, 95.457539, 420.166667, 91.066825, 3.0, 32.75, 0.916667, 36.666667, 91.894711, 3.698183, 92.762338, 3.407508, 14.601676, 33.0, 32.833333, 2.0, 2.0, 2.0, 0.4, 0.4, 0.4, 35.25, 35.25, 35.25, 14.1, \"23:31:40\", \"0:57:50\", \"23:34:40\", \"0:59:31\", \"7:07:35\", \"1:03:35\", \"7:08:30\", \"1:03:33\", \"3:20:05\", \"0:43:05\", \"3:21:08\", \"0:43:31\", 188.083333, 35.583333, 67.166667, 36.666667, 36.25, 0.0, 30.0, 0.333], [36, 5, 4, 1, 1, 75, 8, 171.4, 214.0, 33.041913, 0.0, NaN, \"22:00:00\", \"5:00:00\", \"7:00:00\", 7.0, \"22:00:00\", \"5:00:00\", \"7:00:00\", 7.0, 0.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 4.0, 3.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 0.0, NaN, NaN, NaN, 418.25, 60.86255, 388.25, 58.05816, 2.25, 30.0, 3.125, 35.375, 91.594124, 1.94122, 92.81735, 2.056463, 13.135509, 19.75, 19.75, 2.0, 2.0, 2.0, 0.6, 0.6, 0.6, 33.166667, 33.166667, 33.166667, 19.9, \"22:43:53\", \"0:28:53\", \"22:46:08\", \"0:30:43\", \"5:44:23\", \"0:27:31\", \"5:47:30\", \"0:28:31\", \"2:15:41\", \"0:12:12\", \"2:15:15\", \"0:12:28\", 180.125, 34.375, 62.0, 34.125, 22.571429, 0.0, 30.0, 0.539], [38, 5, 1, 1, 0, 63, 8, 174.0, 212.0, 31.762188, 0.0, NaN, \"22:00:00\", \"3:15:00\", \"5:15:00\", 5.25, \"22:00:00\", \"3:15:00\", \"5:15:00\", 5.25, 1.0, 1.0, 1.0, 1.0, NaN, 1.0, 1.0, 4.0, 1.0, 4.0, 2.0, 2.0, 2.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 9.0, 0.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.353], [46, 5, 1, 0, 1, 79, 4, 154.5, 140.5, 26.698841, 1.0, 0.0, \"23:30:00\", \"7:30:00\", \"8:00:00\", 8.0, \"23:30:00\", \"7:30:00\", \"8:00:00\", 8.0, 1.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 3.0, 4.0, 4.0, 1.0, 1.0, 3.0, 4.0, 1.0, 3.0, 1.0, 1.0, 1.0, 3.0, 9.0, 1.0, 1.0, 1.0, 1.0, 366.214286, 70.436057, 340.142857, 62.168262, 3.214286, 26.071429, 2.214286, 31.5, 91.647659, 1.600053, 93.060773, 2.022839, 18.773361, 21.0, 20.571429, 4.0, 4.0, 4.0, 1.0, 1.0, 0.833333, 42.0, 42.0, 48.4, 40.333333, \"0:31:30\", \"1:03:55\", \"0:34:43\", \"1:04:56\", \"6:49:30\", \"1:17:31\", \"6:51:43\", \"1:17:46\", \"3:41:36\", \"1:01:24\", \"3:42:06\", \"1:01:38\", 1.428571, 0.071429, 0.142857, 0.071429, 56.166667, 1.0, 30.0, 0.448], [48, 5, 1, 0, 1, 82, 4, 149.0, 133.5, 27.276069, 0.0, NaN, \"23:00:00\", \"9:00:00\", \"10:00:00\", 10.0, \"23:00:00\", \"9:00:00\", \"10:00:00\", 10.0, 0.0, 4.0, 5.0, 1.0, NaN, 3.0, 1.0, 3.0, 3.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 9.0, 1.0, 1.0, 1.0, 1.0, 474.142857, 125.046896, 418.0, 115.057956, 4.285714, 56.142857, 3.357143, 63.785714, 86.39628, 3.337314, 87.915696, 2.747012, 25.995736, 39.142857, 38.714286, 2.0, 2.0, 2.0, 0.666667, 0.666667, 0.666667, 69.875, 69.875, 69.875, 46.583333, \"23:47:43\", \"1:11:27\", \"23:52:00\", \"1:11:06\", \"7:46:09\", \"1:42:34\", \"7:49:30\", \"1:43:53\", \"3:48:36\", \"1:08:09\", \"3:49:04\", \"1:06:36\", 11.285714, 0.142857, 0.714286, 0.357143, 26.25, 0.0, 30.0, 0.614], [50, 5, 3, 1, 1, 68, 3, 173.5, 170.0, 25.61669, 1.0, 0.0, \"22:00:00\", \"4:00:00\", \"6:00:00\", 6.0, \"22:00:00\", \"4:00:00\", \"6:00:00\", 6.0, 1.0, 1.0, 5.0, 5.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 381.6, 77.464024, 354.2, 68.691885, 4.5, 27.4, 1.2, 33.1, 91.768686, 3.514022, 92.999381, 2.610658, 13.211817, 25.4, 25.0, 4.0, 4.0, 4.0, 1.2, 1.2, 1.2, 103.916667, 103.916667, 103.916667, 124.7, \"22:16:48\", \"0:56:33\", \"22:21:18\", \"0:56:10\", \"4:42:54\", \"1:13:18\", \"4:44:06\", \"1:13:46\", \"1:30:27\", \"0:54:49\", \"1:32:06\", \"0:55:21\", 85.3, 6.5, 15.3, 8.9, 57.4, 0.0, 30.0, 0.459], [52, 5, 3, 1, 1, 56, 7, 181.2, 193.0, 26.663304, 0.0, NaN, \"0:00:00\", \"6:00:00\", \"6:00:00\", 6.0, \"1:00:00\", \"8:00:00\", \"7:00:00\", 7.0, 1.0, 1.0, 2.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 3.0, 2.0, 1.0, 4.0, 4.0, 1.0, 2.0, 1.0, 1.0, 1.0, 2.0, 9.0, 0.0, NaN, NaN, NaN, 413.0, 64.395264, 369.0, 65.251437, 1.333333, 44.0, 3.0, 48.333333, 88.239624, 5.219961, 89.274644, 5.237666, 18.734378, 33.333333, 33.333333, 1.0, 1.0, 1.0, 0.25, 0.25, 0.25, 38.5, 38.5, 38.5, 9.625, \"22:50:30\", \"0:48:36\", \"22:51:50\", \"0:50:20\", \"5:44:50\", \"0:27:02\", \"5:47:50\", \"0:27:12\", \"2:19:10\", \"0:30:40\", \"2:18:20\", \"0:30:41\", 1.166667, 0.0, 0.333333, 0.0, 6.416667, 0.0, 30.0, 0.343], [54, 5, 3, 0, 1, 61, 3, 158.8, 167.5, 30.129149, 0.0, NaN, \"22:30:00\", \"5:30:00\", \"7:00:00\", 7.0, \"0:00:00\", \"5:30:00\", \"5:30:00\", 5.5, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 1.0, 1.0, 1.0, 489.928571, 83.130133, 436.0, 53.582491, 3.857143, 53.928571, 0.928571, 58.714286, 88.719231, 5.630543, 89.641552, 5.793579, 20.463864, 34.571429, 34.0, 2.0, 2.0, 2.0, 0.333333, 0.333333, 0.333333, 120.25, 120.25, 120.25, 40.083333, \"23:37:13\", \"1:21:07\", \"23:41:04\", \"1:20:29\", \"7:51:00\", \"1:11:54\", \"7:51:56\", \"1:12:09\", \"3:44:34\", \"1:06:42\", \"3:46:02\", \"1:05:54\", 240.357143, 69.5, 114.071429, 68.785714, 21.0, 0.0, 30.0, 0.451], [56, 5, 3, 0, 1, 63, 7, 159.9, 127.5, 22.619672, 0.0, NaN, \"0:00:00\", \"8:30:00\", \"8:30:00\", 8.5, \"0:00:00\", \"8:30:00\", \"8:30:00\", 8.5, 1.0, 1.0, 4.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 2.0, 2.0, 0.0, NaN, NaN, NaN, 396.642857, 91.109236, 375.714286, 89.304189, 3.428571, 20.928571, 3.357143, 27.714286, 92.916967, 1.882718, 94.516379, 1.225278, 14.356285, 24.571429, 24.428571, 6.0, 6.0, 5.0, 6.333333, 6.333333, 1.666667, 14.026316, 14.026316, 27.25, 45.416667, \"1:29:00\", \"1:12:40\", \"1:32:26\", \"1:09:47\", \"8:09:04\", \"1:32:06\", \"8:12:26\", \"1:30:55\", \"4:50:43\", \"1:10:06\", \"4:50:45\", \"1:09:59\", 30.142857, 0.357143, 1.785714, 0.142857, 76.333333, 0.0, 30.0, 0.476], [64, 5, 4, 1, 1, 58, 8, 165.0, 197.8, 32.955769, 0.0, NaN, \"22:50:00\", \"5:45:00\", \"6:55:00\", 6.916667, \"22:30:00\", \"8:30:00\", \"10:00:00\", 10.0, 1.0, 4.0, 3.0, 3.0, 1.0, 1.0, 3.0, 3.0, 3.0, 2.0, 2.0, 1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 4.0, 1.0, 0.0, NaN, NaN, NaN, 266.0, 138.489169, 249.166667, 123.217626, 2.166667, 16.833333, 0.5, 19.5, 94.136736, 3.980589, 94.943461, 3.74312, 8.640469, 17.0, 16.333333, 1.0, 1.0, 1.0, 0.333333, 0.333333, 0.333333, 69.0, 69.0, 69.0, 23.0, \"23:46:20\", \"1:36:40\", \"23:48:30\", \"1:35:19\", \"4:14:30\", \"0:25:57\", \"4:15:00\", \"0:26:39\", \"2:00:40\", \"0:41:15\", \"2:01:30\", \"0:41:01\", 74.666667, 15.666667, 30.166667, 15.333333, 57.625, 0.0, 30.0, 0.337], [70, 5, 1, 0, 1, 59, 5, 160.3, 283.4, 50.02716, 1.0, 0.0, \"23:00:00\", \"8:30:00\", \"9:30:00\", 9.5, \"23:00:00\", \"8:30:00\", \"9:30:00\", 9.5, 1.0, 5.0, 5.0, 3.0, 1.0, 5.0, 1.0, 4.0, 3.0, 1.0, 3.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 9.0, 0.0, NaN, NaN, NaN, 454.416667, 48.257037, 411.25, 42.720897, 1.916667, 43.166667, 4.333333, 49.416667, 89.307886, 1.705415, 90.521243, 0.867936, 27.146887, 36.166667, 35.5, 3.0, 3.0, 3.0, 0.5, 0.5, 0.5, 38.166667, 38.166667, 38.166667, 19.083333, \"0:09:20\", \"0:44:53\", \"0:11:15\", \"0:43:03\", \"7:45:40\", \"0:34:43\", \"7:50:00\", \"0:34:02\", \"3:59:40\", \"0:32:49\", \"3:58:28\", \"0:32:18\", 83.083333, 11.0, 29.5, 11.166667, 14.0, 0.0, 30.0, 0.285], [74, 5, 3, 1, 1, 75, 7, 172.0, 188.3, 28.871309, 1.0, 0.0, \"22:30:00\", \"5:30:00\", \"7:00:00\", 7.0, \"23:30:00\", \"6:00:00\", \"6:30:00\", 6.5, 1.0, 3.0, 4.0, 3.0, 3.0, 1.0, 3.0, 4.0, 3.0, 2.0, 2.0, 2.0, 2.0, 4.0, 1.0, 3.0, 1.0, 1.0, 1.0, 3.0, 2.0, 1.0, 1.0, 9.0, 9.0, 287.583333, 57.650166, 260.833333, 48.923069, 3.833333, 26.75, 0.916667, 31.5, 89.270876, 2.353568, 90.92427, 2.314714, 25.326413, 23.666667, 23.0, 3.0, 3.0, 3.0, 1.333333, 1.333333, 1.333333, 61.125, 61.125, 61.125, 81.5, \"22:47:05\", \"2:00:11\", \"22:50:55\", \"1:58:31\", \"3:38:30\", \"1:55:57\", \"3:39:25\", \"1:56:56\", \"1:13:15\", \"1:55:52\", \"1:14:43\", \"1:54:15\", 12.333333, 0.5, 1.333333, 0.666667, 120.0, 0.0, 30.0, 0.4], [77, 5, 4, 1, 1, 61, 4, 172.2, 186.5, 28.528937, 0.0, NaN, \"23:00:00\", \"5:30:00\", \"6:30:00\", 6.5, \"0:00:00\", \"9:00:00\", \"9:00:00\", 9.0, 0.0, 1.0, 4.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 1.0, 1.0, 1.0, 451.928571, 54.493447, 400.285714, 53.782631, 5.714286, 51.642857, 2.857143, 60.214286, 86.870423, 4.066676, 88.484192, 3.566867, 21.441814, 50.285714, 49.714286, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"0:34:09\", \"0:53:15\", \"0:39:51\", \"0:51:56\", \"8:11:47\", \"1:10:00\", \"8:14:39\", \"1:09:29\", \"4:24:24\", \"0:56:09\", \"4:25:49\", \"0:56:14\", 2.857143, 0.0, 0.071429, 0.0, 0.0, 0.0, 30.0, 0.425], [79, 5, 1, 0, 1, 74, 4, 147.8, 129.0, 26.786372, 2.0, 0.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 0.0, 2.0, 5.0, 3.0, 3.0, 1.0, 3.0, 3.0, 1.0, 4.0, 4.0, 1.0, 1.0, 3.0, 1.0, 2.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 452.857143, 137.257579, 422.428571, 129.164439, 3.571429, 30.428571, 8.071429, 42.071429, 90.535317, 2.377965, 92.980753, 2.594047, 13.703692, 27.0, 26.714286, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"23:04:39\", \"1:49:52\", \"23:08:13\", \"1:49:57\", \"6:41:04\", \"0:27:08\", \"6:49:09\", \"0:27:55\", \"2:56:54\", \"0:48:43\", \"2:54:39\", \"0:48:45\", 69.714286, 1.142857, 8.857143, 1.5, 8.642857, 0.0, 30.0, 0.428], [81, 5, 3, 0, 1, 80, 4, 160.8, 169.5, 29.735186, 0.0, NaN, \"23:00:00\", \"6:00:00\", \"7:00:00\", 7.0, \"23:00:00\", \"6:00:00\", \"7:00:00\", 7.0, 1.0, 4.0, 4.0, 1.0, NaN, 1.0, 1.0, 3.0, 2.0, 3.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 400.357143, 94.509133, 372.785714, 88.281679, 2.785714, 27.571429, 1.642857, 32.0, 92.216908, 1.896152, 93.139513, 1.758659, 22.156759, 29.285714, 28.714286, 3.0, 3.0, 3.0, 1.333333, 1.333333, 1.333333, 36.125, 36.125, 36.125, 48.166667, \"23:29:26\", \"0:44:24\", \"23:32:13\", \"0:44:06\", \"6:12:34\", \"1:39:43\", \"6:14:13\", \"1:40:14\", \"2:51:49\", \"1:03:10\", \"2:52:24\", \"1:03:29\", 0.142857, 0.0, 0.0, 0.0, 47.714286, 0.0, 30.0, 0.368], [84, 5, 4, 0, 1, 58, 4, 157.0, 163.0, 29.995862, 0.0, NaN, \"22:30:00\", \"5:45:00\", \"7:15:00\", 7.25, \"23:00:00\", \"8:00:00\", \"9:00:00\", 9.0, 0.0, 1.0, 4.0, 4.0, 4.0, 1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 0.0, 1.0, 427.5, 58.884421, 393.7, 42.980519, 4.7, 33.8, 6.0, 44.5, 90.109824, 3.284851, 92.387392, 3.061566, 12.390328, 27.6, 27.0, 1.0, 1.0, 1.0, 0.2, 0.2, 0.2, 22.5, 22.5, 22.5, 4.5, \"23:10:06\", \"0:35:25\", \"23:14:48\", \"0:34:32\", \"6:22:18\", \"0:57:57\", \"6:28:18\", \"1:01:22\", \"2:49:12\", \"0:42:31\", \"2:48:33\", \"0:39:46\", 4.7, 0.0, 0.1, 0.0, 5.625, 0.0, 30.0, NaN], [85, 5, 3, 0, 1, 60, 7, 175.7, 178.0, 26.154687, 3.0, 1.0, \"19:30:00\", \"4:30:00\", \"9:00:00\", 9.0, \"22:00:00\", \"4:30:00\", \"6:30:00\", 6.5, 1.0, 1.0, 2.0, 4.0, 1.0, 1.0, 1.0, 1.0, 0.0, 2.0, 3.0, 1.0, 2.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 1.0, 9.0, 9.0, 9.0, 358.416667, 108.421131, 327.0, 95.381864, 4.333333, 31.416667, 0.75, 36.5, 90.104134, 1.312124, 91.509391, 1.46973, 21.227445, 29.833333, 29.5, 5.0, 5.0, 4.0, 1.5, 1.5, 1.0, 40.166667, 40.166667, 54.083333, 54.083333, \"21:38:35\", \"1:07:15\", \"21:42:55\", \"1:10:50\", \"3:41:20\", \"1:48:58\", \"3:42:05\", \"1:49:12\", \"0:40:20\", \"1:16:15\", \"0:42:08\", \"1:17:26\", 21.583333, 2.416667, 8.833333, 3.666667, 41.25, 0.0, 30.0, 0.381], [87, 5, 3, 0, 1, 75, 5, 162.5, 195.5, 33.582504, 1.0, 0.0, \"23:30:00\", \"6:00:00\", \"6:30:00\", 6.5, \"23:30:00\", \"6:00:00\", \"6:30:00\", 6.5, 1.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 1.0, 0.0, 1.0, 4.0, 1.0, 1.0, 4.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 335.071429, 111.782687, 295.285714, 91.418387, 4.5, 39.785714, 7.928571, 52.214286, 85.533283, 4.825195, 89.013976, 4.977497, 18.18357, 24.285714, 24.142857, 3.0, 3.0, 3.0, 0.666667, 0.666667, 0.666667, 59.5, 59.5, 59.5, 39.666667, \"23:13:47\", \"1:06:18\", \"23:18:17\", \"1:05:47\", \"4:53:21\", \"2:07:19\", \"5:01:17\", \"2:06:27\", \"2:07:32\", \"1:26:44\", \"2:05:49\", \"1:27:08\", 17.785714, 2.642857, 4.5, 2.785714, 34.0, 0.0, 30.0, 0.515], [93, 5, 2, 1, 1, 79, 8, 163.4, 157.0, 26.672799, 0.0, NaN, \"22:30:00\", \"5:30:00\", \"7:00:00\", 7.0, \"22:30:00\", \"5:30:00\", \"7:00:00\", 7.0, 1.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 1.0, 3.0, 2.0, 2.0, 1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 0.0, NaN, NaN, NaN, 397.0, 52.104063, 339.642857, 57.459199, 11.0, 57.357143, 4.214286, 72.571429, 82.093226, 5.008773, 85.288818, 4.700589, 30.283075, 42.0, 41.285714, 6.0, 6.0, 5.0, 1.833333, 1.666667, 1.333333, 24.863636, 27.35, 31.4375, 41.916667, \"22:31:56\", \"0:58:24\", \"22:42:56\", \"1:00:39\", \"5:19:56\", \"0:34:27\", \"5:24:09\", \"0:35:15\", \"1:58:02\", \"0:42:10\", \"2:01:26\", \"0:43:01\", 126.857143, 8.642857, 47.714286, 20.357143, 39.071429, 0.0, 30.0, NaN], [99, 5, 1, 1, 1, 71, 6, 183.2, 226.0, 30.544326, 1.0, 0.0, \"21:00:00\", \"5:00:00\", \"8:00:00\", 8.0, \"21:00:00\", \"5:00:00\", \"8:00:00\", 8.0, 1.0, 1.0, 5.0, 5.0, 4.0, 1.0, 1.0, 1.0, 2.0, 2.0, 4.0, 2.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 460.75, 16.617009, 448.0, 14.142136, 0.5, 12.75, 1.25, 14.5, 96.87398, 0.496848, 97.240664, 0.437624, 9.968371, 14.0, 14.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 33.875, 33.875, 33.875, 67.75, \"21:24:15\", \"0:04:45\", \"21:24:45\", \"0:04:45\", \"5:05:30\", \"0:16:30\", \"5:06:45\", \"0:16:45\", \"1:15:30\", \"0:10:45\", \"1:15:08\", \"0:10:38\", 36.75, 5.75, 8.5, 3.5, 31.142857, 0.0, 30.0, NaN], [101, 5, 4, 0, 1, 63, 4, 161.8, 188.0, 32.574208, 0.0, NaN, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, \"21:00:00\", \"8:00:00\", \"11:00:00\", 11.0, 0.0, 1.0, 3.0, 1.0, NaN, 1.0, 1.0, 3.0, 2.0, 1.0, 3.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 345.125, 217.517959, 308.875, 188.068416, 24.0, 36.25, 1.75, 62.0, 80.822917, 13.852328, 90.613864, 2.873197, 20.158092, 27.75, 27.75, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 70.75, 70.75, 70.75, 141.5, \"23:06:08\", \"1:36:53\", \"23:30:08\", \"1:16:33\", \"5:15:15\", \"2:47:31\", \"5:17:00\", \"2:47:49\", \"2:11:34\", \"1:44:06\", \"2:22:41\", \"1:29:56\", 6.0, 0.25, 1.25, 1.0, 70.428571, 0.0, 30.0, NaN], [105, 5, 3, 0, 0, 68, 5, 164.7, 229.5, 38.37678, 0.0, NaN, \"23:00:00\", \"5:00:00\", \"6:00:00\", 6.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 1.0, 4.0, 4.0, 3.0, 4.0, 1.0, 3.0, 4.0, 2.0, 4.0, 3.0, 2.0, 3.0, 4.0, 2.0, 2.0, 1.0, 1.0, 1.0, 9.0, 9.0, 1.0, 1.0, 1.0, 1.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", NaN, NaN, NaN, NaN, 32.8, 0.0, 30.0, 0.6], [107, 5, 1, 1, 1, 82, 7, 157.7, 185.4, 33.815778, 1.0, 0.0, \"22:30:00\", \"6:15:00\", \"7:45:00\", 7.75, \"22:30:00\", \"6:15:00\", \"7:45:00\", 7.75, 0.0, 2.0, 3.0, 1.0, NaN, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 1.0, 1.0, 1.0, 510.071429, 53.212959, 494.5, 51.08979, 11.785714, 15.571429, 2.571429, 29.928571, 94.479276, 2.338719, 96.960522, 0.779602, 12.247812, 20.0, 19.571429, 1.0, 1.0, 1.0, 0.166667, 0.166667, 0.166667, 51.0, 51.0, 51.0, 8.5, \"23:07:39\", \"0:31:48\", \"23:19:26\", \"0:34:42\", \"7:49:30\", \"1:01:09\", \"7:52:04\", \"1:01:25\", \"3:29:51\", \"0:38:57\", \"3:34:28\", \"0:43:11\", 89.857143, 13.928571, 31.785714, 16.5, 7.285714, 0.0, 30.0, 0.422], [109, 5, 4, 1, 1, 66, 4, 166.0, 164.0, 26.996081, 1.0, 0.0, \"1:00:00\", \"7:00:00\", \"6:00:00\", 6.0, \"1:00:00\", \"7:00:00\", \"6:00:00\", 6.0, 1.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 3.0, 2.0, 3.0, 3.0, 2.0, 1.0, 3.0, 1.0, 2.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 9.0, 410.357143, 116.18115, 369.142857, 102.346517, 2.928571, 40.714286, 1.714286, 45.357143, 89.102514, 1.23427, 90.243694, 1.337913, 20.868164, 41.285714, 41.0, 4.0, 4.0, 4.0, 0.833333, 0.833333, 0.833333, 78.1, 78.1, 78.1, 65.083333, \"1:24:47\", \"1:21:54\", \"1:27:43\", \"1:23:08\", \"8:18:04\", \"1:01:44\", \"8:19:47\", \"1:01:45\", \"4:52:17\", \"0:48:50\", \"4:52:54\", \"0:49:41\", 35.0, 0.714286, 3.071429, 1.0, 55.785714, 0.0, 30.0, 0.422], [110, 5, 1, 1, 1, 60, 6, 169.8, 185.0, 29.105121, 0.0, 0.0, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"10:00:00\", \"11:00:00\", 11.0, 1.0, 5.0, 1.0, 1.0, NaN, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 2.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 1.0, 1.0, 1.0, 461.0, 57.275649, 432.75, 40.65864, 6.0, 28.25, 0.75, 35.0, 92.70734, 3.009929, 94.050014, 2.865318, 13.540076, 23.0, 22.5, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 34.5, 34.5, 34.5, 17.25, \"23:30:00\", \"0:16:30\", \"23:36:00\", \"0:14:30\", \"7:17:00\", \"0:26:00\", \"7:17:45\", \"0:25:15\", \"3:23:53\", \"0:04:23\", \"3:26:30\", \"0:05:45\", 71.25, 2.5, 11.0, 3.25, 4.928571, 0.0, 30.0, 0.453], [111, 5, 1, 0, 1, 77, 3, 161.8, 116.0, 20.098979, 0.0, NaN, \"23:00:00\", \"7:30:00\", \"8:30:00\", 8.5, \"23:00:00\", \"7:30:00\", \"8:30:00\", 8.5, NaN, 5.0, 5.0, 5.0, 5.0, 1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, NaN, NaN, NaN, 484.071429, 50.246417, 448.357143, 66.815489, 7.071429, 27.642857, 2.428571, 37.142857, 92.205422, 1.579045, 94.06194, 2.055684, 15.024715, 20.857143, 20.142857, 1.0, 1.0, 1.0, 0.166667, 0.166667, 0.166667, 44.5, 44.5, 44.5, 7.416667, \"23:12:56\", \"0:29:48\", \"23:20:00\", \"0:30:13\", \"7:24:04\", \"0:25:55\", \"7:26:30\", \"0:25:12\", \"3:19:43\", \"0:14:37\", \"3:22:02\", \"0:15:52\", 46.142857, 3.714286, 4.785714, 2.857143, 6.357143, 0.0, 30.0, NaN], [113, 5, 2, 0, 0, 61, 7, 157.8, 122.0, 22.223829, 0.0, NaN, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 1.0, 1.0, 1.0, 3.0, 3.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 3.0, 1.0, 1.0, 1.0, 9.0, 1.0, 0.0, NaN, NaN, NaN, 430.25, 39.951533, 405.0, 41.7193, 1.75, 25.25, 3.75, 30.75, 92.858247, 2.115262, 94.08675, 0.959954, 6.627088, 24.0, 24.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"1:12:15\", \"0:32:45\", \"1:14:00\", \"0:31:30\", \"8:24:15\", \"0:59:45\", \"8:28:00\", \"0:57:30\", \"4:50:08\", \"0:45:08\", \"4:49:08\", \"0:45:38\", 103.25, 7.25, 15.0, 5.5, 0.0, 0.0, 30.0, 0.318], [117, 5, 3, 0, 1, 65, 8, 158.6, 159.0, 28.672384, 0.0, NaN, \"23:00:00\", \"9:00:00\", \"10:00:00\", 10.0, \"23:00:00\", \"9:00:00\", \"10:00:00\", 10.0, 1.0, 4.0, 5.0, 5.0, 5.0, 1.0, 3.0, 5.0, 1.0, 4.0, 4.0, 4.0, 4.0, 4.0, 1.0, 2.0, 3.0, 1.0, 2.0, 4.0, 9.0, 1.0, 1.0, 1.0, 1.0, 455.285714, 100.50533, 377.642857, 93.460649, 0.5, 77.642857, 0.428571, 78.571429, 82.525971, 5.738982, 82.717045, 5.850782, 39.620302, 54.857143, 54.285714, 6.0, 6.0, 6.0, 2.333333, 2.333333, 2.333333, 65.714286, 65.714286, 65.714286, 153.333333, \"23:25:30\", \"1:08:42\", \"23:26:00\", \"1:09:07\", \"7:01:17\", \"1:07:24\", \"7:01:43\", \"1:07:42\", \"3:13:36\", \"0:50:01\", \"3:13:39\", \"0:49:57\", 1.5, 0.0, 0.357143, 0.0, 39.0, 0.0, 30.0, NaN], [118, 5, 4, 0, 1, 56, 4, 156.3, 154.5, 28.686897, 0.0, NaN, \"23:00:00\", \"5:30:00\", \"6:30:00\", 6.5, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 0.0, 1.0, 1.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 3.0, 3.0, 3.0, 3.0, 3.0, 1.0, 3.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 236.071429, 156.829905, 215.214286, 143.198539, 2.357143, 20.857143, 0.785714, 24.0, 89.679593, 3.117308, 91.08057, 2.087451, 16.874147, 21.714286, 21.285714, 4.0, 4.0, 4.0, 1.333333, 1.333333, 1.166667, 48.4375, 48.4375, 54.571429, 63.666667, \"0:49:39\", \"1:14:32\", \"0:52:00\", \"1:13:28\", \"4:48:04\", \"2:02:37\", \"4:48:51\", \"2:02:54\", \"2:49:15\", \"1:10:55\", \"2:50:02\", \"1:10:20\", 5.714286, 0.071429, 0.214286, 0.214286, NaN, 0.0, 30.0, 0.396], [120, 5, 4, 0, 1, 60, 4, 153.6, 158.0, 30.377197, 1.0, 0.0, \"22:30:00\", \"9:00:00\", \"10:30:00\", 10.5, \"22:30:00\", \"9:00:00\", \"10:30:00\", 10.5, 0.0, 4.0, 3.0, 2.0, 5.0, 1.0, 5.0, 5.0, 3.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 4.0, 1.0, 9.0, 9.0, 1.0, 1.0, 0.0, 1.0, 587.357143, 70.551231, 517.785714, 58.522686, 4.214286, 69.571429, 1.714286, 75.5, 87.423621, 2.774291, 88.269164, 2.592827, 24.747161, 59.714286, 59.571429, 1.0, 1.0, 1.0, 0.166667, 0.166667, 0.166667, 52.5, 52.5, 52.5, 8.75, \"23:18:21\", \"0:51:17\", \"23:22:34\", \"0:48:00\", \"9:09:56\", \"0:32:21\", \"9:11:39\", \"0:32:28\", \"4:15:00\", \"0:26:21\", \"4:16:15\", \"0:24:41\", 0.0, 0.0, 0.0, 0.0, 12.928571, 0.0, 30.0, 0.413], [121, 5, 1, 1, 1, 58, 5, 176.0, 200.0, 29.28719, 3.0, 1.0, \"22:00:00\", \"5:30:00\", \"7:30:00\", 7.5, \"22:00:00\", \"6:30:00\", \"8:30:00\", 8.5, 0.0, 1.0, 2.0, 3.0, 1.0, 1.0, 3.0, 1.0, 2.0, 3.0, 2.0, 2.0, 2.0, 3.0, 1.0, 3.0, 2.0, 1.0, 2.0, 2.0, 1.0, 0.0, NaN, NaN, NaN, 463.166667, 228.394578, 399.166667, 189.037254, 2.5, 64.0, 3.0, 69.5, 86.222514, 3.20881, 87.157672, 2.979663, 34.574577, 72.0, 71.666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"22:11:20\", \"2:46:18\", \"22:13:50\", \"2:44:45\", \"5:57:00\", \"0:39:57\", \"6:00:00\", \"0:42:47\", \"2:05:40\", \"1:16:04\", \"2:05:25\", \"1:15:20\", 73.666667, 1.5, 10.0, 3.0, 0.0, 0.0, 30.0, 0.393], [125, 5, 1, 1, 1, 82, 7, 179.6, 158.0, 22.21864, 0.0, NaN, \"18:30:00\", \"5:30:00\", \"11:00:00\", 11.0, \"18:30:00\", \"5:30:00\", \"11:00:00\", 11.0, 1.0, 3.0, 3.0, 3.0, 3.0, 1.0, 1.0, 1.0, 2.0, 3.0, 1.0, 1.0, 2.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 539.333333, 46.959202, 488.25, 44.575498, 6.166667, 51.083333, 5.416667, 62.666667, 88.614149, 1.441469, 90.523001, 1.843921, 24.032075, 45.833333, 45.166667, 5.0, 5.0, 3.0, 2.5, 2.5, 0.5, 13.233333, 13.233333, 35.666667, 17.833333, \"20:14:15\", \"0:36:25\", \"20:20:25\", \"0:33:18\", \"5:19:45\", \"0:10:57\", \"5:25:10\", \"0:08:37\", \"0:49:43\", \"0:14:46\", \"0:50:05\", \"0:12:27\", 20.0, 0.25, 1.583333, 0.166667, 30.071429, 0.0, 30.0, 0.691], [128, 5, 4, 1, 1, 62, 6, 168.5, 225.5, 36.02631, 0.0, NaN, \"23:00:00\", \"6:30:00\", \"7:30:00\", 7.5, \"23:30:00\", \"6:30:00\", \"7:00:00\", 7.0, 1.0, 3.0, 3.0, 1.0, NaN, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 1.0, 1.0, 9.0, 2.0, 1.0, 1.0, 1.0, 1.0, 411.0, 43.832066, 389.357143, 40.238574, 3.571429, 21.642857, 2.357143, 27.571429, 93.41553, 2.500459, 94.772172, 2.537863, 9.89736, 23.571429, 23.428571, 6.0, 6.0, 6.0, 2.0, 2.0, 2.0, 48.5, 48.5, 48.5, 97.0, \"0:31:21\", \"1:09:57\", \"0:34:56\", \"1:09:11\", \"7:25:56\", \"0:50:43\", \"7:28:17\", \"0:51:09\", \"3:59:49\", \"0:57:48\", \"4:00:26\", \"0:57:10\", 25.428571, 0.357143, 1.571429, 1.142857, 93.428571, 0.0, 30.0, NaN], [6672, 5, 1, 1, 1, 90, 7, 168.5, 153.9, 24.587357, 0.0, NaN, \"21:00:00\", \"6:30:00\", \"9:30:00\", 9.5, \"21:00:00\", \"7:00:00\", \"10:00:00\", 10.0, 1.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 3.0, 0.0, 3.0, 2.0, 1.0, 2.0, 4.0, 1.0, 2.0, 1.0, 1.0, 1.0, 9.0, 9.0, 1.0, 1.0, 1.0, 1.0, 594.416667, 97.183032, 547.666667, 84.638447, 2.916667, 46.75, 1.666667, 51.333333, 91.678508, 3.301361, 92.305495, 2.718624, 20.940268, 45.333333, 44.666667, 3.0, 3.0, 3.0, 0.428571, 0.428571, 0.428571, 49.666667, 49.666667, 49.666667, 21.285714, \"21:23:00\", \"1:08:37\", \"21:25:55\", \"1:06:19\", \"7:20:20\", \"0:54:03\", \"7:22:00\", \"0:54:32\", \"2:22:30\", \"0:41:37\", \"2:23:08\", \"0:41:08\", 30.75, 2.416667, 5.5, 2.75, 18.25, 2.0, 30.0, 0.725], [6680, 5, 3, 0, 1, 69, 5, 162.0, 185.0, 31.975309, 3.0, 1.0, \"0:00:00\", \"7:00:00\", \"7:00:00\", 7.0, \"0:00:00\", \"7:00:00\", \"7:00:00\", 7.0, 1.0, 1.0, 3.0, 1.0, NaN, 1.0, 1.0, 1.0, 2.0, 4.0, 4.0, 1.0, 1.0, 4.0, 1.0, 4.0, 1.0, 1.0, 1.0, 4.0, 9.0, 0.0, NaN, NaN, NaN, 392.428571, 58.665314, 342.5, 60.495179, 2.357143, 49.928571, 2.571429, 54.857143, 86.008289, 4.564558, 87.126079, 4.725309, 24.18557, 26.714286, 26.285714, 6.0, 6.0, 6.0, 1.571429, 1.571429, 1.428571, 86.181818, 86.181818, 93.3, 133.285714, \"0:33:56\", \"0:34:33\", \"0:36:17\", \"0:34:53\", \"7:08:43\", \"0:56:23\", \"7:11:17\", \"0:56:15\", \"3:52:36\", \"0:38:10\", \"3:52:30\", \"0:38:13\", 49.214286, 7.214286, 17.928571, 8.928571, 140.333333, 0.0, 30.0, 0.33], [6682, 5, 1, 1, 1, 70, 6, 180.5, 166.0, 23.111425, 1.0, 0.0, \"22:30:00\", \"8:30:00\", \"10:00:00\", 10.0, \"22:30:00\", \"8:30:00\", \"10:00:00\", 10.0, 1.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 9.0, 0.0, NaN, NaN, NaN, 529.928571, 51.830998, 441.357143, 50.202684, 5.142857, 88.571429, 2.357143, 96.071429, 82.005932, 2.083887, 83.198999, 2.032431, 27.300232, 85.571429, 85.285714, 2.0, 2.0, 2.0, 0.333333, 0.333333, 0.333333, 27.25, 27.25, 27.25, 9.083333, \"22:59:17\", \"0:23:02\", \"23:04:26\", \"0:25:08\", \"7:54:21\", \"0:44:00\", \"7:56:43\", \"0:44:26\", \"3:28:00\", \"0:26:53\", \"3:29:24\", \"0:26:37\", 10.571429, 0.071429, 0.071429, 0.0, 7.785714, 0.0, 15.0, 0.562], [6685, 5, 1, 1, 1, 69, 5, 167.8, 210.2, 33.86272, 1.0, 0.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 1.0, 1.0, 5.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 2.0, 2.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 3.0, 0.0, NaN, NaN, NaN, 434.5, NaN, 407.5, NaN, 20.0, 27.0, 3.0, 50.0, 89.071038, NaN, 93.785961, NaN, 18.305113, 32.0, 31.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 52.25, 52.25, 52.25, 104.5, \"23:30:00\", \"0:00:00\", \"23:50:00\", \"0:00:00\", \"7:04:30\", \"0:00:00\", \"7:07:30\", \"0:00:00\", \"3:18:45\", \"0:00:00\", \"3:27:15\", \"0:00:00\", 56.0, 14.5, 20.0, 14.5, 80.416667, 0.0, 30.0, 0.373], [6686, 5, 4, 0, 1, 74, 8, 158.8, 189.8, 34.140373, 0.0, NaN, \"23:00:00\", \"7:30:00\", \"8:30:00\", 8.5, \"22:00:00\", \"7:30:00\", \"9:30:00\", 9.5, 1.0, 1.0, 5.0, 1.0, NaN, 5.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 0.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.404], [6693, 5, 4, 0, 1, 62, 6, 153.5, 220.0, 42.352492, 1.0, 0.0, \"0:00:00\", \"8:00:00\", \"8:00:00\", 8.0, \"0:00:00\", \"8:00:00\", \"8:00:00\", 8.0, 0.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 3.0, 2.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 1.0, 1.0, 1.0, 444.583333, 67.692257, 392.416667, 51.107159, 6.0, 52.166667, 3.166667, 61.333333, 86.850413, 3.006465, 88.524611, 2.094645, 23.672799, 35.833333, 35.333333, 3.0, 3.0, 3.0, 0.5, 0.5, 0.5, 96.5, 96.5, 96.5, 48.25, \"0:53:35\", \"0:49:35\", \"0:59:35\", \"0:46:20\", \"8:24:10\", \"1:13:56\", \"8:27:20\", \"1:12:18\", \"4:40:28\", \"0:52:23\", \"4:41:53\", \"0:53:24\", 30.25, 1.666667, 3.166667, 1.583333, 45.166667, 0.0, 30.0, 0.362], [6695, 5, 1, 1, 1, 55, 7, 180.5, 220.5, 30.699212, 0.0, NaN, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 0.0, 4.0, 5.0, 3.0, 3.0, 1.0, 1.0, 5.0, 3.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 2.0, 0.0, NaN, NaN, NaN, 432.0, 82.731493, 414.75, 79.549513, 2.0, 17.25, 0.5, 19.75, 95.397991, 0.609673, 96.0042, 0.028658, 4.531275, 16.5, 16.0, 1.0, 1.0, 1.0, 1.5, 1.5, 1.5, 45.5, 45.5, 45.5, 68.25, \"22:40:30\", \"0:08:00\", \"22:42:30\", \"0:06:00\", \"5:54:30\", \"1:04:30\", \"5:55:00\", \"1:05:00\", \"2:17:45\", \"0:36:30\", \"2:18:30\", \"0:35:15\", 10.75, 0.0, 0.0, 0.25, 27.3, 0.0, 30.0, 0.386], [6697, 5, 1, 1, 1, 65, 5, 173.6, 255.0, 38.380779, 0.0, NaN, \"23:30:00\", \"7:30:00\", \"8:00:00\", 8.0, \"23:30:00\", \"8:30:00\", \"9:00:00\", 9.0, 0.0, 1.0, 1.0, 1.0, NaN, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 9.0, 0.0, NaN, NaN, NaN, 459.25, 10.253048, 397.25, 15.909903, 1.5, 62.0, 1.0, 64.5, 86.014401, 1.930795, 86.482609, 1.533544, 26.572126, 41.0, 40.5, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 18.0, 18.0, 18.0, 9.0, \"0:01:00\", \"0:15:30\", \"0:02:30\", \"0:17:00\", \"7:41:45\", \"0:09:45\", \"7:42:45\", \"0:09:45\", \"3:51:53\", \"0:12:38\", \"3:52:08\", \"0:13:23\", 165.0, 18.5, 62.75, 25.25, 8.0, 0.0, 30.0, 0.384], [6699, 5, 4, 1, 1, 76, 8, 172.2, 239.8, 36.682247, 1.0, 0.0, \"21:00:00\", \"3:00:00\", \"6:00:00\", 6.0, \"21:00:00\", \"8:00:00\", \"11:00:00\", 11.0, 1.0, 3.0, 1.0, 5.0, 1.0, 3.0, 1.0, 5.0, 2.0, 4.0, 3.0, 2.0, 4.0, 4.0, 1.0, 4.0, 1.0, 4.0, 4.0, 4.0, 4.0, 0.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", NaN, NaN, NaN, NaN, 145.0, 0.0, 30.0, NaN], [6704, 5, 1, 1, 1, 86, 7, 171.2, 140.5, 21.744121, 0.0, NaN, \"22:00:00\", \"6:15:00\", \"8:15:00\", 8.25, \"22:00:00\", \"8:00:00\", \"10:00:00\", 10.0, 0.0, 1.0, 5.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 9.0, 0.0, NaN, NaN, NaN, 304.071429, 108.669771, 260.857143, 88.770169, 7.142857, 43.214286, 1.5, 51.857143, 84.190467, 5.485188, 86.577288, 4.303239, 36.721727, 29.142857, 28.428571, 4.0, 4.0, 4.0, 1.333333, 1.333333, 1.333333, 35.6875, 35.6875, 35.6875, 47.583333, \"0:00:56\", \"1:23:45\", \"0:08:04\", \"1:17:16\", \"5:12:09\", \"1:07:29\", \"5:13:39\", \"1:08:42\", \"2:37:17\", \"0:55:56\", \"2:40:06\", \"0:52:16\", 82.714286, 6.071429, 19.642857, 7.357143, 35.75, 0.0, 30.0, 0.623], [6707, 5, 3, 0, 1, 82, 4, 154.4, 129.0, 24.54529, 1.0, 0.0, \"21:30:00\", \"6:30:00\", \"9:00:00\", 9.0, \"21:30:00\", \"6:30:00\", \"9:00:00\", 9.0, 1.0, 3.0, 3.0, 1.0, NaN, 4.0, 1.0, 3.0, 2.0, 1.0, 2.0, 1.0, 2.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 515.928571, 102.877933, 473.714286, 93.761602, 3.214286, 40.428571, 2.214286, 45.857143, 91.294192, 1.971325, 92.218374, 1.757263, 17.139003, 25.571429, 25.571429, 6.0, 6.0, 6.0, 1.5, 1.5, 1.5, 59.555556, 59.555556, 59.555556, 89.333333, \"21:54:13\", \"0:59:41\", \"21:57:26\", \"0:58:49\", \"6:33:21\", \"0:59:45\", \"6:35:34\", \"1:00:14\", \"2:14:54\", \"0:35:17\", \"2:15:24\", \"0:35:19\", 0.357143, 0.0, 0.0, 0.071429, 70.333333, 0.0, 30.0, 0.533], [6709, 5, 4, 0, 1, 85, 4, 143.5, 162.0, 35.684881, 0.0, NaN, \"23:00:00\", \"5:00:00\", \"6:00:00\", 6.0, \"23:00:00\", \"5:00:00\", \"6:00:00\", 6.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 1.0, 1.0, 0.0, 0.0, 0.0, 403.428571, 78.199227, 381.857143, 75.756581, 5.857143, 21.571429, 0.571429, 28.0, 93.187357, 2.967622, 94.620921, 2.266182, 19.516591, 26.428571, 26.142857, 6.0, 6.0, 6.0, 1.5, 1.5, 1.333333, 80.222222, 80.222222, 88.5625, 118.083333, \"0:56:21\", \"1:35:13\", \"1:02:13\", \"1:33:19\", \"7:45:39\", \"1:25:17\", \"7:46:13\", \"1:24:30\", \"4:21:17\", \"1:22:04\", \"4:23:56\", \"1:21:44\", 10.0, 0.0, 0.0, 0.0, 113.25, 0.0, 30.0, 0.518], [6722, 5, 4, 0, 1, 61, 6, 160.5, 188.0, 33.104027, 0.0, NaN, \"23:00:00\", \"8:00:00\", \"9:00:00\", 9.0, \"23:00:00\", \"8:30:00\", \"9:30:00\", 9.5, 0.0, 3.0, 3.0, 3.0, 2.0, 4.0, 4.0, 3.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 0.0, NaN, NaN, NaN, 446.785714, 85.551572, 404.714286, 74.732778, 5.071429, 42.071429, 3.857143, 51.0, 88.801061, 2.315786, 90.672169, 1.79628, 23.613162, 42.428571, 42.142857, 1.0, 1.0, 0.0, 0.166667, 0.166667, 0.0, 6.0, 6.0, NaN, 0.0, \"23:53:56\", \"1:07:34\", \"23:59:00\", \"1:08:06\", \"7:25:47\", \"0:31:23\", \"7:29:39\", \"0:31:36\", \"3:41:47\", \"0:35:47\", \"3:42:24\", \"0:35:15\", 1.928571, 0.285714, 0.428571, 0.285714, 1.0, 0.0, 30.0, 0.392], [6723, 5, 1, 1, 1, 58, 6, 191.4, 274.0, 33.926553, 0.0, NaN, \"1:00:00\", \"9:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"8:00:00\", \"9:00:00\", 9.0, 0.0, 1.0, 3.0, 4.0, 1.0, 1.0, 2.0, 4.0, 0.0, 4.0, 3.0, 1.0, 2.0, 4.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 453.25, 149.553084, 413.0, 123.03658, 8.0, 40.25, 1.25, 49.5, 89.647269, 2.18007, 91.629194, 3.088297, 15.808446, 45.0, 44.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"1:58:00\", \"2:09:00\", \"2:06:00\", \"2:10:00\", \"9:39:15\", \"0:24:15\", \"9:40:30\", \"0:24:00\", \"5:49:15\", \"1:16:30\", \"5:52:38\", \"1:17:08\", 25.5, 0.25, 0.5, 0.0, 0.0, 0.0, 30.0, 0.266], [6726, 5, 3, 0, 1, 63, 3, 159.0, 241.0, 43.241011, 1.0, 0.0, \"23:00:00\", \"6:30:00\", \"7:30:00\", 7.5, \"23:30:00\", \"9:00:00\", \"9:30:00\", 9.5, 1.0, 1.0, 5.0, 4.0, 1.0, 1.0, 1.0, 1.0, 2.0, 4.0, 2.0, 2.0, 1.0, 4.0, 1.0, 2.0, 1.0, 1.0, 1.0, 4.0, 4.0, 0.0, NaN, NaN, NaN, 295.125, 131.696858, 266.625, 115.96147, 3.875, 28.5, 0.375, 32.75, 89.683657, 3.058824, 90.712756, 2.211525, 42.827624, 31.25, 30.75, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 35.333333, 35.333333, 35.333333, 35.333333, \"23:25:38\", \"0:24:21\", \"23:29:30\", \"0:22:31\", \"4:24:38\", \"1:45:53\", \"4:25:00\", \"1:46:13\", \"1:55:19\", \"0:50:17\", \"1:57:04\", \"0:51:03\", 118.125, 28.875, 66.625, 29.125, 17.666667, 0.0, 30.0, 0.454], [6727, 5, 1, 0, 1, 71, 6, 166.5, 174.5, 28.552228, 0.0, NaN, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 0.0, 2.0, 4.0, 4.0, 4.0, 1.0, 1.0, 3.0, 2.0, 2.0, 3.0, 1.0, 2.0, 2.0, 1.0, 2.0, 1.0, 1.0, 1.0, 9.0, 9.0, 9.0, NaN, NaN, NaN, 459.0, 65.303777, 390.428571, 49.170137, 4.357143, 68.571429, 2.285714, 75.214286, 84.233281, 6.575967, 85.505712, 6.897243, 27.774351, 43.142857, 42.857143, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"23:17:39\", \"0:19:51\", \"23:22:00\", \"0:22:19\", \"7:01:00\", \"0:49:11\", \"7:03:17\", \"0:49:13\", \"3:10:28\", \"0:22:37\", \"3:11:30\", \"0:23:21\", 132.642857, 16.785714, 46.0, 20.214286, 0.0, 0.0, 30.0, 0.249], [6730, 5, 3, 0, 1, 60, 4, 159.5, 130.0, 23.179018, 0.0, NaN, \"0:00:00\", \"5:30:00\", \"5:30:00\", 5.5, \"0:00:00\", \"7:00:00\", \"7:00:00\", 7.0, 1.0, 1.0, 2.0, 1.0, NaN, 1.0, 1.0, 1.0, 3.0, 3.0, 2.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 289.5, 37.272644, 271.333333, 40.771722, 1.5, 15.333333, 2.166667, 19.0, 93.441893, 1.18377, 94.604419, 2.308573, 12.725306, 14.333333, 14.666667, 1.0, 1.0, 1.0, 0.333333, 0.333333, 0.333333, 22.0, 22.0, 22.0, 7.333333, \"0:44:00\", \"0:35:10\", \"0:45:30\", \"0:34:44\", \"5:35:00\", \"0:04:18\", \"5:37:10\", \"0:04:02\", \"3:10:35\", \"0:19:24\", \"3:10:15\", \"0:19:31\", 23.666667, 0.0, 2.833333, 0.666667, 6.571429, 0.0, 30.0, 0.468], [6734, 5, 1, 0, 1, 61, 8, 155.9, 240.0, 44.791134, 1.0, 0.0, \"0:00:00\", \"6:00:00\", \"6:00:00\", 6.0, \"0:00:00\", \"6:00:00\", \"6:00:00\", 6.0, 0.0, 1.0, 1.0, 1.0, NaN, 4.0, 1.0, 1.0, 2.0, 4.0, 3.0, 2.0, 4.0, 1.0, 2.0, 4.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.486], [6737, 5, 1, 1, 1, 62, 8, 167.2, 149.0, 24.176129, 0.0, NaN, \"23:30:00\", \"7:30:00\", \"8:00:00\", 8.0, \"23:30:00\", \"8:30:00\", \"9:00:00\", 9.0, 1.0, 2.0, 1.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, 0.521], [6739, 5, 1, 0, 1, 77, 7, 157.9, 115.5, 21.013131, 0.0, NaN, \"23:00:00\", \"8:00:00\", \"9:00:00\", 9.0, \"23:00:00\", \"8:00:00\", \"9:00:00\", 9.0, 0.0, 1.0, 4.0, 3.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 1.0, 0.0, NaN, NaN, NaN, 517.785714, 46.234779, 497.642857, 40.696759, 4.357143, 20.142857, 1.428571, 25.928571, 95.142627, 1.518247, 96.175976, 1.107228, 10.662852, 19.571429, 19.428571, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"22:55:21\", \"0:38:08\", \"22:59:43\", \"0:38:00\", \"7:37:30\", \"0:59:59\", \"7:38:56\", \"1:00:18\", \"3:17:09\", \"0:45:13\", \"3:18:36\", \"0:45:25\", 8.285714, 0.571429, 2.714286, 1.857143, 0.0, 0.0, 30.0, 0.577], [6741, 5, 2, 1, 1, 81, 8, 169.5, 138.0, 21.787767, 0.0, NaN, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, NaN, 1.0, 1.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 0.0, NaN, NaN, NaN, 506.214286, 68.362915, 438.571429, 73.753773, 9.142857, 67.642857, 0.571429, 77.357143, 84.838464, 4.522496, 86.344477, 4.208082, 32.804924, 51.571429, 50.857143, 4.0, 4.0, 4.0, 0.666667, 0.666667, 0.666667, 35.125, 35.125, 35.125, 23.416667, \"22:56:21\", \"1:06:50\", \"23:05:30\", \"1:05:02\", \"7:31:43\", \"0:50:10\", \"7:32:17\", \"0:50:14\", \"3:14:19\", \"0:47:55\", \"3:18:36\", \"0:48:42\", 22.642857, 0.642857, 0.928571, 0.857143, 46.5, 0.0, 30.0, 0.538], [6746, 5, 4, 0, 1, 71, 4, 152.0, 141.8, 27.839543, 0.0, NaN, \"0:00:00\", \"6:00:00\", \"6:00:00\", 6.0, \"23:30:00\", \"9:00:00\", \"9:30:00\", 9.5, 1.0, 4.0, 5.0, 3.0, 3.0, 1.0, 4.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 3.0, 1.0, 3.0, 3.0, 1.0, 9.0, 9.0, 1.0, 1.0, 1.0, 1.0, 419.5, 66.772936, 387.1, 53.078244, 3.2, 32.4, 3.4, 39.0, 91.173553, 2.729626, 92.573412, 2.508025, 13.133281, 31.4, 31.4, 2.0, 2.0, 2.0, 0.8, 0.8, 0.8, 61.875, 61.875, 61.875, 49.5, \"0:05:48\", \"0:18:08\", \"0:09:00\", \"0:17:13\", \"7:08:30\", \"0:56:18\", \"7:11:54\", \"0:56:09\", \"3:38:51\", \"0:28:03\", \"3:38:45\", \"0:29:00\", 54.5, 0.5, 4.8, 1.2, 47.583333, 0.0, 30.0, NaN], [6751, 5, 1, 1, 1, 68, 4, 191.2, 219.0, 27.173238, 1.0, 0.0, \"21:30:00\", \"7:00:00\", \"9:30:00\", 9.5, \"22:00:00\", \"7:00:00\", \"9:00:00\", 9.0, 1.0, 1.0, 3.0, 2.0, NaN, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 2.0, 3.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 1.0, 0.0, NaN, NaN, NaN, 533.583333, 35.540704, 447.333333, 31.466914, 2.416667, 86.25, 2.333333, 91.0, 83.145885, 3.319902, 83.876976, 3.23284, 31.979644, 58.5, 58.166667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"21:42:35\", \"0:37:04\", \"21:45:00\", \"0:35:43\", \"6:38:35\", \"0:54:05\", \"6:40:55\", \"0:54:44\", \"2:11:45\", \"0:43:42\", \"2:11:48\", \"0:42:52\", 1.833333, 0.0, 0.0, 0.0, 0.0, 0.0, 30.0, 0.432], [6754, 5, 1, 1, 1, 62, 3, 184.8, 228.5, 30.349764, 2.0, 0.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 1.0, 1.0, 5.0, 3.0, 1.0, 1.0, 1.0, 1.0, 2.0, 4.0, 1.0, 1.0, 1.0, 4.0, 1.0, 4.0, 1.0, 1.0, 1.0, 2.0, 1.0, 0.0, NaN, NaN, NaN, 394.25, 32.580285, 359.416667, 36.505365, 5.583333, 34.833333, 4.75, 45.166667, 88.717272, 1.974699, 91.049788, 2.325568, 22.398253, 31.333333, 31.0, 4.0, 4.0, 4.0, 1.0, 1.0, 1.0, 54.916667, 54.916667, 54.916667, 54.916667, \"23:56:35\", \"0:12:54\", \"0:02:10\", \"0:13:59\", \"6:36:25\", \"0:33:14\", \"6:41:10\", \"0:33:13\", \"3:18:53\", \"0:20:06\", \"3:19:18\", \"0:20:43\", 133.75, 20.0, 45.166667, 23.75, 54.916667, 0.0, 30.0, 0.495], [6755, 5, 1, 0, 1, 63, 7, 165.1, 151.5, 25.211085, 3.0, 1.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 0.0, 1.0, 1.0, 1.0, NaN, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 4.0, 9.0, 0.0, NaN, NaN, NaN, 535.928571, 56.688791, 491.571429, 43.474541, 2.857143, 44.357143, 2.5, 49.714286, 91.027095, 3.692223, 91.924208, 3.553157, 19.086514, 46.571429, 46.428571, 1.0, 1.0, 1.0, 0.166667, 0.166667, 0.166667, 45.0, 45.0, 45.0, 7.5, \"23:32:39\", \"0:29:34\", \"23:35:30\", \"0:30:26\", \"8:31:26\", \"0:45:51\", \"8:33:56\", \"0:47:10\", \"4:03:17\", \"0:28:49\", \"4:03:28\", \"0:28:44\", 108.928571, 6.571429, 19.142857, 9.571429, 7.5, 0.0, 30.0, 0.399], [6756, 5, 1, 0, 1, 71, 6, 162.7, 191.0, 32.728892, 1.0, 0.0, \"22:00:00\", \"6:30:00\", \"8:30:00\", 8.5, \"22:00:00\", \"6:30:00\", \"8:30:00\", 8.5, 1.0, 1.0, 4.0, 4.0, 4.0, 1.0, 1.0, 5.0, 2.0, 4.0, 2.0, 1.0, 1.0, 4.0, 1.0, 2.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 0.0, 9.0, 9.0, 532.285714, 55.424767, 478.928571, 46.640852, 2.428571, 53.357143, 3.357143, 59.142857, 89.107177, 2.332724, 90.069284, 2.189157, 25.773517, 33.428571, 33.285714, 2.0, 2.0, 2.0, 0.5, 0.5, 0.5, 30.333333, 30.333333, 30.333333, 15.166667, \"21:55:09\", \"0:28:07\", \"21:57:34\", \"0:27:14\", \"6:49:51\", \"0:46:10\", \"6:53:13\", \"0:46:25\", \"2:24:11\", \"0:28:10\", \"2:23:43\", \"0:27:54\", 25.785714, 1.142857, 8.5, 3.357143, 13.0, 0.0, 30.0, 0.465], [6757, 5, 4, 0, 1, 73, 6, 155.0, 180.0, 33.984599, 0.0, NaN, \"0:00:00\", \"7:00:00\", \"7:00:00\", 7.0, \"0:00:00\", \"7:00:00\", \"7:00:00\", 7.0, 0.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, NaN, NaN, NaN, 386.875, 30.990254, 358.0, 23.416518, 2.625, 28.875, 2.625, 34.125, 91.426718, 2.535294, 92.629064, 2.085776, 21.148571, 27.75, 27.5, 1.0, 1.0, 1.0, 0.25, 0.25, 0.25, 31.0, 31.0, 31.0, 7.75, \"0:09:23\", \"0:26:31\", \"0:12:00\", \"0:26:42\", \"6:38:53\", \"0:27:09\", \"6:41:30\", \"0:28:33\", \"3:25:26\", \"0:23:28\", \"3:25:26\", \"0:23:21\", 124.375, 12.625, 36.25, 17.375, 11.0, 0.0, 30.0, 0.351], [6759, 5, 4, 0, 1, 63, 4, 159.0, 169.0, 30.322535, 0.0, NaN, \"22:30:00\", \"4:30:00\", \"6:00:00\", 6.0, \"22:30:00\", \"7:00:00\", \"8:30:00\", 8.5, 0.0, 1.0, 5.0, 2.0, 1.0, 1.0, 1.0, 3.0, 2.0, 3.0, 3.0, 1.0, 3.0, 1.0, 1.0, 2.0, 3.0, 1.0, 1.0, 9.0, 1.0, 0.0, NaN, NaN, NaN, 435.5, 94.753188, 387.25, 84.644846, 3.0, 48.25, 3.25, 54.5, 87.533442, 1.612565, 88.924079, 1.232493, 17.883512, 39.0, 38.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"22:48:30\", \"1:06:06\", \"22:51:30\", \"1:05:36\", \"6:07:00\", \"0:55:48\", \"6:10:15\", \"0:56:25\", \"2:29:23\", \"0:46:42\", \"2:29:15\", \"0:44:59\", 39.625, 1.25, 3.5, 2.25, 0.0, 0.0, 30.0, 0.492], [6773, 5, 4, 0, 0, 60, 4, 149.3, 141.0, 28.692774, 1.0, 0.0, \"23:00:00\", \"5:15:00\", \"6:15:00\", 6.25, \"23:00:00\", \"7:00:00\", \"8:00:00\", 8.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 2.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 0.0, NaN, NaN, NaN, 388.0, 43.84062, 355.5, 26.870058, 10.0, 32.5, 0.75, 43.25, 89.235545, 1.727383, 91.818589, 3.449428, 13.972148, 29.0, 28.5, 1.0, 1.0, 1.0, 0.333333, 0.333333, 0.333333, 32.5, 32.5, 32.5, 10.833333, \"23:32:45\", \"0:24:45\", \"23:42:45\", \"0:20:45\", \"6:10:45\", \"0:51:45\", \"6:11:30\", \"0:51:30\", \"2:52:08\", \"0:38:08\", \"2:56:45\", \"0:36:15\", 12.25, 0.0, 0.5, 0.0, 23.142857, 0.0, 30.0, 0.441], [6781, 5, 4, 1, 1, 66, 8, 179.0, 205.0, 29.021566, 0.0, NaN, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, \"22:00:00\", \"6:00:00\", \"8:00:00\", 8.0, 1.0, 5.0, 5.0, 1.0, NaN, 1.0, 1.0, 5.0, 2.0, 1.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 1.0, 0.0, NaN, NaN, NaN, 444.0, NaN, 415.5, NaN, 1.0, 28.5, 1.5, 31.0, 93.057111, NaN, 93.581081, NaN, 17.53003, 33.0, 33.0, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 23.5, 23.5, 23.5, 11.75, \"22:34:30\", \"0:00:00\", \"22:35:30\", \"0:00:00\", \"5:59:30\", \"0:00:00\", \"6:01:00\", \"0:00:00\", \"2:17:45\", \"0:00:00\", \"2:17:30\", \"0:00:00\", 91.0, 21.0, 40.5, 24.5, 47.1, 0.0, 30.0, 0.333], [6783, 5, 1, 0, 1, 85, 6, 153.2, 103.5, 20.003034, 0.0, NaN, \"22:00:00\", \"7:30:00\", \"9:30:00\", 9.5, \"22:00:00\", \"7:30:00\", \"9:30:00\", 9.5, 1.0, 1.0, 4.0, 3.0, 3.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 1.0, 0.0, NaN, NaN, NaN, 580.357143, 25.605524, 529.071429, 19.404528, 4.714286, 51.285714, 2.214286, 58.214286, 90.15123, 2.438184, 91.214842, 2.407982, 22.547234, 47.714286, 47.571429, 2.0, 2.0, 2.0, 0.333333, 0.333333, 0.333333, 37.25, 37.25, 37.25, 12.416667, \"22:13:56\", \"0:18:21\", \"22:18:39\", \"0:17:01\", \"7:59:00\", \"0:15:18\", \"8:01:13\", \"0:14:18\", \"3:07:34\", \"0:10:15\", \"3:08:49\", \"0:11:01\", 9.428571, 0.5, 0.785714, 0.357143, 10.642857, 0.0, 30.0, 0.39], [6784, 5, 3, 0, 1, 78, 5, 168.4, 162.2, 25.944166, 0.0, NaN, \"23:30:00\", \"6:30:00\", \"7:00:00\", 7.0, \"23:30:00\", \"6:00:00\", \"6:30:00\", 6.5, 1.0, 1.0, 5.0, 1.0, NaN, 5.0, 1.0, 4.0, 0.0, 2.0, 3.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 9.0, 0.0, NaN, NaN, NaN, 430.714286, 55.613141, 414.0, 52.375249, 3.142857, 16.714286, 2.214286, 22.071429, 94.966143, 0.895566, 96.151165, 1.29633, 15.60979, 18.857143, 18.714286, 2.0, 2.0, 2.0, 0.833333, 0.833333, 0.833333, 29.1, 29.1, 29.1, 24.25, \"23:50:51\", \"0:42:47\", \"23:54:00\", \"0:42:54\", \"7:04:43\", \"0:38:30\", \"7:06:56\", \"0:37:21\", \"3:28:54\", \"0:30:38\", \"3:29:21\", \"0:31:36\", 50.071429, 3.785714, 15.571429, 8.357143, 20.785714, 0.0, 30.0, 0.432], [6786, 5, 3, 0, 1, 60, 3, 164.9, 208.0, 34.697251, 0.0, NaN, \"23:00:00\", \"5:00:00\", \"6:00:00\", 6.0, \"23:00:00\", \"5:00:00\", \"6:00:00\", 6.0, 0.0, 3.0, 3.0, 4.0, 3.0, 1.0, 1.0, 3.0, 3.0, 2.0, 2.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 460.642857, 58.771956, 432.0, 49.761933, 2.071429, 28.642857, 0.714286, 31.428571, 93.352174, 2.028642, 93.924087, 1.926111, 13.937305, 23.285714, 23.142857, 3.0, 3.0, 2.0, 0.5, 0.5, 0.333333, 26.166667, 26.166667, 32.75, 10.916667, \"23:39:56\", \"0:56:40\", \"23:42:00\", \"0:57:38\", \"7:22:39\", \"0:51:04\", \"7:23:21\", \"0:50:56\", \"3:31:39\", \"0:46:34\", \"3:32:19\", \"0:47:10\", 93.285714, 20.785714, 45.642857, 26.642857, 13.0, 0.0, 30.0, 0.795], [6788, 5, 3, 0, 1, 59, 5, 169.4, 267.5, 42.283412, 0.0, NaN, \"22:30:00\", \"7:00:00\", \"8:30:00\", 8.5, \"22:30:00\", \"7:00:00\", \"8:30:00\", 8.5, 1.0, 3.0, 5.0, 4.0, 1.0, 1.0, 1.0, 4.0, 1.0, 1.0, 4.0, 1.0, 1.0, 4.0, 1.0, 2.0, 1.0, 1.0, 1.0, 4.0, 9.0, 1.0, 1.0, 0.0, 0.0, 375.625, 79.646485, 341.875, 69.816874, 2.0, 33.75, 0.875, 36.625, 90.462434, 2.419972, 91.192065, 2.664019, 12.566081, 16.75, 16.25, 3.0, 3.0, 2.0, 1.5, 1.5, 1.25, 86.75, 86.75, 103.0, 128.75, \"23:53:45\", \"1:24:38\", \"23:55:45\", \"1:23:02\", \"6:11:23\", \"1:38:59\", \"6:12:15\", \"1:38:44\", \"3:03:00\", \"1:25:21\", \"3:03:34\", \"1:24:36\", 108.625, 9.5, 23.0, 12.0, 167.5, 0.0, 30.0, 0.52], [6789, 5, 3, 1, 1, 74, 3, 172.0, 195.0, 29.898594, 1.0, 0.0, \"0:00:00\", \"7:00:00\", \"7:00:00\", 7.0, \"0:00:00\", \"7:00:00\", \"7:00:00\", 7.0, 1.0, 1.0, 4.0, 1.0, NaN, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 3.0, 9.0, 0.0, NaN, NaN, NaN, 381.857143, 56.605149, 355.928571, 48.139925, 2.428571, 25.928571, 1.642857, 30.0, 92.438611, 2.26041, 93.353665, 1.656569, 24.435454, 39.714286, 39.0, 3.0, 3.0, 3.0, 0.5, 0.5, 0.5, 42.5, 42.5, 42.5, 21.25, \"0:09:26\", \"1:06:34\", \"0:11:51\", \"1:06:26\", \"6:33:43\", \"1:13:39\", \"6:35:21\", \"1:14:28\", \"3:22:24\", \"1:05:03\", \"3:22:47\", \"1:05:03\", 1.928571, 0.214286, 0.357143, 0.214286, 32.8, 0.0, 30.0, 0.457], [6790, 5, 1, 1, 1, 72, 7, 173.6, 186.5, 28.070648, 0.0, NaN, \"21:00:00\", \"6:30:00\", \"9:30:00\", 9.5, \"21:00:00\", \"6:30:00\", \"9:30:00\", 9.5, 0.0, 1.0, 5.0, 5.0, 3.0, 1.0, 1.0, 3.0, 2.0, 3.0, 3.0, 3.0, 3.0, 3.0, 1.0, 1.0, 1.0, NaN, 2.0, 2.0, 9.0, 0.0, NaN, NaN, NaN, 347.833333, 51.913068, 328.916667, 53.522347, 1.583333, 18.916667, 1.0, 21.5, 93.704287, 1.546279, 94.429001, 1.506614, 12.992875, 16.5, 16.166667, 4.0, 4.0, 4.0, 1.4, 1.4, 1.4, 82.357143, 82.357143, 82.357143, 115.3, \"5:18:55\", \"8:02:41\", \"5:20:30\", \"8:02:39\", \"11:08:20\", \"8:07:53\", \"11:09:20\", \"8:07:53\", \"8:14:08\", \"8:04:43\", \"8:14:25\", \"8:04:42\", 101.083333, 7.333333, 19.333333, 10.416667, 92.5, 0.0, 30.0, 0.333], [6792, 5, 1, 1, 1, 62, 6, 190.8, 240.0, 29.90388, 2.0, 0.0, \"21:00:00\", \"5:00:00\", \"8:00:00\", 8.0, \"21:00:00\", \"5:00:00\", \"8:00:00\", 8.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 2.0, 2.0, 1.0, 2.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 3.0, 0.0, NaN, NaN, NaN, 459.142857, 28.261744, 390.214286, 24.645583, 4.5, 68.928571, 1.5, 74.928571, 83.909729, 2.153167, 85.009255, 2.142279, 34.649198, 54.714286, 54.571429, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"22:10:30\", \"0:37:43\", \"22:15:00\", \"0:37:57\", \"5:54:09\", \"0:26:34\", \"5:55:39\", \"0:26:36\", \"2:03:04\", \"0:29:54\", \"2:04:34\", \"0:30:02\", 48.357143, 3.0, 7.785714, 2.857143, 0.0, 0.0, 30.0, 0.445], [6795, 5, 1, 0, 1, 63, 4, 157.5, 159.0, 29.074286, 0.0, NaN, \"0:00:00\", \"6:30:00\", \"6:30:00\", 6.5, \"0:00:00\", \"8:30:00\", \"8:30:00\", 8.5, 1.0, 4.0, 3.0, 1.0, NaN, 1.0, 1.0, 4.0, 2.0, 2.0, 3.0, 1.0, 2.0, 3.0, 2.0, 3.0, 2.0, 1.0, 1.0, 3.0, 1.0, 0.0, NaN, NaN, NaN, 454.166667, 54.224841, 419.5, 46.572524, 9.166667, 34.666667, 2.833333, 46.666667, 90.100713, 3.397477, 92.433602, 2.227248, 13.305188, 32.333333, 32.333333, 1.0, 1.0, 1.0, 0.333333, 0.333333, 0.333333, 17.5, 17.5, 17.5, 5.833333, \"0:20:20\", \"0:43:53\", \"0:29:30\", \"0:47:23\", \"8:03:40\", \"0:50:30\", \"8:06:30\", \"0:51:45\", \"4:13:25\", \"0:41:52\", \"4:16:35\", \"0:43:40\", 0.166667, 0.0, 0.0, 0.0, 9.0, 0.0, 30.0, 0.341], [6796, 5, 3, 0, 1, 55, 5, 160.0, 162.0, 28.704375, 1.0, 0.0, \"23:00:00\", \"6:00:00\", \"7:00:00\", 7.0, \"0:30:00\", \"6:00:00\", \"5:30:00\", 5.5, 1.0, 1.0, 3.0, 4.0, 3.0, 1.0, 1.0, 1.0, 2.0, 4.0, 4.0, 3.0, 4.0, 2.0, 2.0, 3.0, 2.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 0.0, 9.0, 423.375, 48.710668, 373.0, 31.013438, 3.625, 50.375, 1.125, 55.125, 87.298204, 2.713345, 88.329678, 2.974022, 20.665015, 39.5, 39.0, 2.0, 2.0, 2.0, 0.4, 0.4, 0.4, 36.5, 36.5, 36.5, 14.6, \"23:48:15\", \"0:31:04\", \"23:51:53\", \"0:34:11\", \"6:55:15\", \"0:25:51\", \"6:56:23\", \"0:25:35\", \"3:22:19\", \"0:20:10\", \"3:23:34\", \"0:21:45\", 149.25, 8.125, 34.375, 9.875, 14.6, 0.0, 30.0, 0.334], [6802, 5, 3, 0, 1, 65, 3, 164.6, 258.7, 43.312157, 0.0, NaN, \"23:00:00\", \"8:30:00\", \"9:30:00\", 9.5, \"23:00:00\", \"8:30:00\", \"9:30:00\", 9.5, 0.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 9.0, 0.0, NaN, NaN, NaN, 509.928571, 59.999603, 475.928571, 52.983825, 6.5, 34.0, 3.0, 43.5, 91.731841, 2.568912, 93.411821, 1.984594, 21.729341, 45.428571, 44.857143, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"23:36:47\", \"0:47:36\", \"23:43:17\", \"0:46:17\", \"8:13:13\", \"0:21:58\", \"8:16:13\", \"0:21:25\", \"3:56:30\", \"0:23:14\", \"3:58:15\", \"0:23:16\", 58.857143, 9.857143, 20.428571, 8.928571, 0.0, 0.0, 30.0, 0.437], [6804, 5, 3, 0, 1, 77, 4, 156.3, 131.0, 24.323518, 0.0, NaN, \"22:00:00\", \"7:00:00\", \"9:00:00\", 9.0, \"22:00:00\", \"7:00:00\", \"9:00:00\", 9.0, 1.0, 1.0, 1.0, 3.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 4.0, 1.0, 1.0, 1.0, 9.0, 9.0, 0.0, NaN, NaN, NaN, 534.571429, 32.682091, 481.071429, 23.202781, 4.571429, 53.5, 1.0, 59.071429, 89.216191, 4.324444, 90.142881, 4.347718, 23.3265, 51.0, 50.428571, 4.0, 4.0, 4.0, 1.5, 1.5, 1.5, 48.888889, 48.888889, 48.888889, 73.333333, \"22:08:43\", \"0:29:24\", \"22:13:17\", \"0:27:37\", \"7:07:51\", \"0:14:24\", \"7:08:51\", \"0:13:28\", \"2:38:47\", \"0:16:56\", \"2:40:34\", \"0:16:00\", 53.071429, 0.285714, 2.214286, 0.357143, 43.75, 0.0, 30.0, 0.579], [6807, 5, 4, 1, 1, 60, 4, 174.9, 191.0, 28.322188, 1.0, 0.0, \"21:00:00\", \"5:30:00\", \"8:30:00\", 8.5, \"22:00:00\", \"7:00:00\", \"9:00:00\", 9.0, 0.0, 3.0, 5.0, 3.0, 3.0, 1.0, 2.0, 1.0, 2.0, 1.0, 3.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 3.0, 1.0, 0.0, 0.0, 1.0, 397.833333, 37.649259, 292.166667, 13.607596, 3.083333, 105.666667, 2.5, 111.25, 72.724713, 4.549991, 73.807724, 5.372544, 41.224227, 59.666667, 59.5, 1.0, 1.0, 1.0, 0.2, 0.2, 0.2, 28.5, 28.5, 28.5, 5.7, \"22:35:55\", \"0:46:54\", \"22:39:00\", \"0:48:12\", \"5:16:50\", \"0:18:40\", \"5:19:20\", \"0:17:52\", \"1:57:38\", \"0:31:18\", \"1:57:55\", \"0:32:15\", 112.666667, 31.833333, 61.416667, 32.0, 4.75, 0.0, 30.0, 0.376], [6810, 5, 4, 1, 1, 77, 6, 178.9, 215.0, 30.471289, 1.0, 0.0, \"22:30:00\", \"7:00:00\", \"8:30:00\", 8.5, \"22:30:00\", \"7:00:00\", \"8:30:00\", 8.5, 1.0, 1.0, 5.0, 3.0, 3.0, 3.0, 1.0, 1.0, 3.0, 4.0, 1.0, 1.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 0.0, NaN, NaN, NaN, 453.916667, 69.608488, 423.416667, 68.621729, 0.833333, 30.5, 4.166667, 35.5, 92.065249, 2.197422, 93.205597, 1.850995, 17.041162, 26.5, 26.333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"22:57:15\", \"0:34:48\", \"22:58:05\", \"0:33:52\", \"6:32:00\", \"0:44:16\", \"6:36:10\", \"0:40:23\", \"2:46:43\", \"0:22:36\", \"2:45:03\", \"0:23:19\", 157.666667, 11.416667, 27.333333, 9.416667, 0.0, 0.0, 30.0, 0.477], [6811, 5, 4, 1, 1, 79, 4, 162.8, 162.0, 27.725492, 1.0, 0.0, \"21:30:00\", \"5:00:00\", \"7:30:00\", 7.5, \"23:00:00\", \"6:00:00\", \"7:00:00\", 7.0, 1.0, 1.0, 3.0, 3.0, 4.0, 1.0, 1.0, 1.0, 0.0, 3.0, 4.0, 1.0, 1.0, 4.0, 1.0, 2.0, 1.0, 1.0, 1.0, 2.0, 1.0, 0.0, NaN, NaN, NaN, 516.166667, 31.750066, 468.583333, 22.648216, 6.583333, 47.583333, 2.666667, 56.833333, 89.284068, 2.199578, 90.8471, 1.650628, 23.57032, 42.5, 41.666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, NaN, NaN, NaN, 0.0, \"21:14:20\", \"0:18:34\", \"21:20:55\", \"0:17:17\", \"5:57:05\", \"0:20:27\", \"5:59:45\", \"0:20:12\", \"1:37:03\", \"0:10:49\", \"1:39:00\", \"0:12:11\", 3.75, 0.0, 0.166667, 0.166667, 4.571429, 0.0, 30.0, 0.411], [6812, 5, 4, 0, 1, 68, 8, 159.0, 150.6, 27.021146, 3.0, 1.0, \"23:00:00\", \"8:00:00\", \"9:00:00\", 9.0, \"23:00:00\", \"8:00:00\", \"9:00:00\", 9.0, 0.0, 3.0, 5.0, 1.0, NaN, 1.0, 3.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", \"NaN\", NaN, NaN, NaN, NaN, 0.0, 0.0, 30.0, 0.296]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"layout\": {\"topStart\": \"pageLength\", \"topEnd\": \"search\", \"bottomStart\": \"info\", \"bottomEnd\": \"paging\"}, \"order\": [], \"warn_on_selected_rows_not_rendered\": true, \"filtered_row_count\": 2147, \"fnInfoCallback\": function (oSettings, iStart, iEnd, iMax, iTotal, sPre) { return sPre + ' (<a href=\"https://mwouts.github.io/itables/downsampling.html\">downsampled</a> from 2,237x623 to 90x90 as maxColumns=200 and maxBytes=64KB)'; }};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        \n",
       "        new DataTable(table, dt_args);\n",
       "    });\n",
       "</script>\n"
      ],
      "text/plain": [
       "      mesaid  examnumber  race1c  gender1  cucmcn1c  sleepage5c  site5c  \\\n",
       "0          1           5       1        0         1          70       7   \n",
       "1          2           5       1        0         1          83       5   \n",
       "2          6           5       4        0         1          57       8   \n",
       "3         10           5       1        1         1          57       5   \n",
       "4         12           5       1        1         1          80       7   \n",
       "...      ...         ...     ...      ...       ...         ...     ...   \n",
       "2232    6804           5       3        0         1          77       4   \n",
       "2233    6807           5       4        1         1          60       4   \n",
       "2234    6810           5       4        1         1          77       6   \n",
       "2235    6811           5       4        1         1          79       4   \n",
       "2236    6812           5       4        0         1          68       8   \n",
       "\n",
       "      htcm5  wtlb5      bmi5c  ...  avgsleepmidpointnw5  sdsleepmidpointnw5  \\\n",
       "0     156.6  119.0  22.010834  ...              3:42:23             0:47:11   \n",
       "1     159.1  122.2  21.897972  ...              2:03:09             0:37:42   \n",
       "2     146.5  265.0  56.007175  ...              3:29:56             0:36:54   \n",
       "3     169.1  125.1  19.844636  ...              2:35:19             2:44:18   \n",
       "4     178.0  194.0  27.773766  ...             13:11:20            11:04:51   \n",
       "...     ...    ...        ...  ...                  ...                 ...   \n",
       "2232  156.3  131.0  24.323518  ...              2:40:34             0:16:00   \n",
       "2233  174.9  191.0  28.322188  ...              1:57:55             0:32:15   \n",
       "2234  178.9  215.0  30.471289  ...              2:45:03             0:23:19   \n",
       "2235  162.8  162.0  27.725492  ...              1:39:00             0:12:11   \n",
       "2236  159.0  150.6  27.021146  ...                  NaN                 NaN   \n",
       "\n",
       "     avgwhitetaltnw5 avgbluetaltnw5 avggreentaltnw5  avgredtaltnw5  \\\n",
       "0          25.625000       0.000000        1.250000       0.125000   \n",
       "1           0.500000       0.000000        0.000000       0.000000   \n",
       "2         104.857143       6.000000       20.071429       9.428571   \n",
       "3           1.125000       0.000000        0.375000       0.000000   \n",
       "4          80.583333       5.583333       14.000000       9.916667   \n",
       "...              ...            ...             ...            ...   \n",
       "2232       53.071429       0.285714        2.214286       0.357143   \n",
       "2233      112.666667      31.833333       61.416667      32.000000   \n",
       "2234      157.666667      11.416667       27.333333       9.416667   \n",
       "2235        3.750000       0.000000        0.166667       0.166667   \n",
       "2236             NaN            NaN             NaN            NaN   \n",
       "\n",
       "     avgsleepnapdailyrd5 dstoverlap5 epochlength5    lgn  \n",
       "0              28.875000         0.0         30.0  0.417  \n",
       "1              24.500000         0.0         30.0  0.461  \n",
       "2              15.428571         0.0         30.0  0.274  \n",
       "3             235.000000         0.0         30.0  0.532  \n",
       "4              38.000000         0.0         30.0  0.486  \n",
       "...                  ...         ...          ...    ...  \n",
       "2232           43.750000         0.0         30.0  0.579  \n",
       "2233            4.750000         0.0         30.0  0.376  \n",
       "2234            0.000000         0.0         30.0  0.477  \n",
       "2235            4.571429         0.0         30.0  0.411  \n",
       "2236            0.000000         0.0         30.0  0.296  \n",
       "\n",
       "[2237 rows x 623 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"itables_f204f246_b06a_4def_b82e_bca68a33f6a2\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
       "<thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>mesaid</th>\n",
       "      <th>examnumber</th>\n",
       "      <th>nsrr_age</th>\n",
       "      <th>nsrr_bmi</th>\n",
       "      <th>nsrr_age_gt89</th>\n",
       "      <th>nsrr_sex</th>\n",
       "      <th>nsrr_race</th>\n",
       "      <th>nsrr_current_smoker</th>\n",
       "      <th>nsrr_ever_smoker</th>\n",
       "      <th>nsrr_ahi_hp3u</th>\n",
       "      <th>nsrr_ahi_hp3r_aasm15</th>\n",
       "      <th>nsrr_ahi_hp4u_aasm15</th>\n",
       "      <th>nsrr_ahi_hp4r</th>\n",
       "      <th>nsrr_tst_f1</th>\n",
       "      <th>nsrr_phrnumar_f1</th>\n",
       "      <th>nsrr_flag_spsw</th>\n",
       "      <th>nsrr_ttleffsp_f1</th>\n",
       "      <th>nsrr_ttlmefsp_f1</th>\n",
       "      <th>nsrr_ttllatsp_f1</th>\n",
       "      <th>nsrr_ttlprdsp_s1sr</th>\n",
       "      <th>nsrr_ttldursp_s1sr</th>\n",
       "      <th>nsrr_waso_f1</th>\n",
       "      <th>nsrr_pctdursp_s1</th>\n",
       "      <th>nsrr_pctdursp_s2</th>\n",
       "      <th>nsrr_pctdursp_s3</th>\n",
       "      <th>nsrr_pctdursp_sr</th>\n",
       "      <th>nsrr_tib_f1</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr>\n",
       "<td style=\"vertical-align:middle; text-align:left\">\n",
       "<div style=\"float:left; margin-right: 10px;\">\n",
       "<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
       "    <g style=\"fill:#d9d7fc\">\n",
       "        <path d=\"M100,400H500V357H100Z\" />\n",
       "        <path d=\"M100,300H400V257H100Z\" />\n",
       "        <path d=\"M0,200H400V157H0Z\" />\n",
       "        <path d=\"M100,100H500V57H100Z\" />\n",
       "        <path d=\"M100,350H500V307H100Z\" />\n",
       "        <path d=\"M100,250H400V207H100Z\" />\n",
       "        <path d=\"M0,150H400V107H0Z\" />\n",
       "        <path d=\"M100,50H500V7H100Z\" />\n",
       "    </g>\n",
       "    <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
       "   <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"0;0;400\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;300;0\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;400\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
       "            <g transform=\"translate(45 50) rotate(-45)\">\n",
       "                <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
       "                <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(450 152)\">\n",
       "                <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
       "                <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(50 352)\">\n",
       "                <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
       "                <polygon points=\"-35,10 0,45 35,10\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(75 250)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(425 250) rotate(180)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "        </g>\n",
       "    </g>\n",
       "</svg>\n",
       "</a>\n",
       "</div>\n",
       "<div>\n",
       "Loading ITables v2.2.2 from the <code>init_notebook_mode</code> cell...\n",
       "(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
       "</div>\n",
       "</tr></tbody>\n",
       "\n",
       "</table>\n",
       "<script type=\"module\">\n",
       "    const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_2_2);\n",
       "\n",
       "    document.querySelectorAll(\"#itables_f204f246_b06a_4def_b82e_bca68a33f6a2:not(.dataTable)\").forEach(table => {\n",
       "        if (!(table instanceof HTMLTableElement))\n",
       "            return;\n",
       "\n",
       "        // Define the table data\n",
       "        const data = [[1, 5, 70.0, 22.01, \"no\", \"female\", \"white\", \"no\", \"yes\", 18.14, 27.56, 9.94, 23.02, 344.0, 27.03, \"full scoring\", 59.83, 62.66, 26.0, 124.0, 67.0, 205.5, 19.7, 66.2, 2.77, 11.4, 575.0], [2, 5, 83.0, 21.9, \"no\", \"female\", \"white\", \"not reported\", \"no\", 8.34, 10.75, 3.85, 7.38, 374.0, 24.55, \"full scoring\", 86.37, 86.37, NaN, 67.0, 54.0, 59.0, 6.55, 48.4, 20.9, 24.2, 433.0], [6, 5, 57.0, 56.01, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 62.51, 67.21, 51.12, 58.32, 358.0, 21.79, \"full scoring\", 72.03, 72.03, NaN, 78.0, 21.0, 139.0, 19.7, 53.1, 10.5, 16.6, 497.0], [10, 5, 57.0, 19.84, \"no\", \"male\", \"white\", \"not reported\", \"no\", 40.91, 48.0, 32.18, 45.27, 110.0, 46.91, \"full scoring\", 55.28, 55.28, NaN, 0.0, 0.0, 89.0, 9.13, 57.5, 33.3, 0.0, 199.0], [12, 5, 80.0, 27.77, \"no\", \"male\", \"white\", \"not reported\", \"no\", 27.47, 33.63, 20.22, 29.89, 273.0, 28.79, \"full scoring\", 46.83, 47.81, 12.0, 416.0, 138.0, 298.0, 15.6, 69.0, 2.94, 12.5, 583.0], [14, 5, 60.0, 31.45, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 11.37, 12.94, 6.54, 9.24, 422.0, 11.23, \"full scoring\", 84.4, 85.08, 4.0, 61.0, 57.0, 73.5, 2.61, 45.2, 31.1, 21.1, 500.0], [16, 5, 57.0, 23.65, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 2.7, 4.41, 1.42, 3.7, 422.0, 14.93, \"full scoring\", 91.54, 91.54, NaN, 60.0, 43.0, 38.0, 8.53, 60.5, 4.62, 26.3, 461.0], [21, 5, 78.0, 22.77, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 19.28, 25.91, 12.51, 21.06, 470.0, 29.36, \"full scoring\", 87.2, 87.2, NaN, 218.0, 184.0, 69.0, 23.1, 54.5, 14.2, 8.2, 539.0], [27, 5, 72.0, 20.21, \"no\", \"female\", \"white\", \"not reported\", \"no\", 10.0, 12.93, 5.37, 8.54, 492.0, 13.17, \"full scoring\", 95.16, 95.16, NaN, 48.0, 45.0, 24.5, 13.2, 65.1, 2.44, 19.2, 517.0], [28, 5, 60.0, 32.73, \"no\", \"female\", \"white\", \"yes\", \"yes\", 21.87, 27.47, 17.89, 24.58, 332.0, 29.82, \"full scoring\", 89.01, 89.01, NaN, 43.0, 33.0, 40.5, 10.5, 56.2, 10.8, 22.4, 373.0], [29, 5, 77.0, 23.59, \"no\", \"male\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [33, 5, 77.0, 28.83, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 70.48, 73.61, 66.69, 71.82, 269.0, 59.33, \"full scoring\", 56.04, 56.04, NaN, 173.0, 34.0, 210.5, 20.1, 61.2, 0.0, 18.8, 480.0], [35, 5, 67.0, 23.02, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 4.89, 11.13, 2.71, 10.05, 221.0, 18.46, \"full scoring\", 48.36, 48.36, NaN, 264.0, 69.0, 235.5, 12.0, 53.4, 9.5, 25.1, 457.0], [36, 5, 75.0, 33.04, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 12.0, 18.75, 6.25, 14.25, 240.0, 24.5, \"full scoring\", 65.4, 65.4, NaN, 3.0, 3.0, 126.5, 16.0, 47.9, 16.0, 20.0, 367.0], [38, 5, 63.0, 31.76, \"no\", \"male\", \"white\", \"not reported\", \"no\", 7.33, 8.32, 3.56, 4.95, 303.0, 7.52, \"full scoring\", 98.38, 98.38, NaN, 55.0, 55.0, 4.5, 4.63, 55.9, 18.0, 21.5, 308.0], [46, 5, 79.0, 26.7, \"no\", \"female\", \"white\", \"no\", \"yes\", 23.41, 24.81, 19.69, 22.48, 387.0, 15.19, \"full scoring\", 76.63, 76.63, NaN, 186.0, 92.0, 118.0, 14.1, 42.7, 27.7, 15.5, 505.0], [48, 5, 82.0, 27.28, \"no\", \"female\", \"white\", \"not reported\", \"no\", 8.12, 9.28, 4.31, 5.97, 362.0, 18.4, \"full scoring\", 70.02, 70.29, 2.0, 44.0, 32.0, 152.5, 7.88, 57.4, 13.3, 21.4, 517.0], [50, 5, 68.0, 25.62, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 8.92, 9.97, 5.59, 7.1, 397.0, 11.49, \"full scoring\", 82.37, 82.37, NaN, 27.0, 27.0, 84.5, 3.4, 66.9, 8.69, 21.0, 482.0], [52, 5, 56.0, 26.66, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 8.29, 10.76, 3.88, 7.24, 340.0, 14.82, \"full scoring\", 77.63, 77.63, NaN, 86.0, 80.0, 97.5, 10.4, 62.8, 0.74, 26.0, 438.0], [54, 5, 61.0, 30.13, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 27.27, 33.12, 20.45, 27.66, 308.0, 32.14, \"full scoring\", 64.84, 64.84, NaN, 118.0, 98.0, 166.5, 10.7, 66.2, 10.2, 12.8, 475.0], [56, 5, 63.0, 22.62, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 4.39, 5.03, 1.55, 2.45, 465.0, 11.23, \"full scoring\", 83.63, 85.16, 10.0, 74.0, 61.0, 81.0, 8.93, 62.3, 8.18, 20.6, 556.0], [64, 5, 58.0, 32.96, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 43.7, 46.42, 35.77, 40.98, 265.0, 28.3, \"full scoring\", 66.75, 66.75, NaN, 155.0, 71.0, 131.5, 22.1, 61.5, 5.28, 11.1, 397.0], [70, 5, 59.0, 50.03, \"no\", \"female\", \"white\", \"no\", \"yes\", 8.97, 9.21, 4.36, 4.73, 495.0, 10.06, \"full scoring\", 92.87, 92.87, NaN, 424.0, 389.0, 38.0, 4.45, 64.3, 23.6, 7.68, 533.0], [74, 5, 75.0, 28.87, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 17.44, 22.46, 11.08, 18.92, 406.0, 20.39, \"full scoring\", 70.86, 70.86, NaN, 149.0, 107.0, 167.0, 9.74, 71.1, 6.29, 12.8, 573.0], [77, 5, 61.0, 28.53, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 4.55, 6.34, 2.76, 4.97, 435.0, 11.59, \"full scoring\", 90.06, 90.06, NaN, 65.0, 61.0, 48.0, 5.87, 68.8, 0.12, 25.2, 483.0], [79, 5, 74.0, 26.79, \"no\", \"female\", \"white\", \"no\", \"yes\", 27.22, 30.4, 19.56, 25.64, 227.0, 28.55, \"full scoring\", 57.76, 64.67, 42.0, 195.0, 80.0, 123.5, 9.93, 32.0, 39.1, 19.0, 393.0], [81, 5, 80.0, 29.74, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 41.66, 46.11, 38.1, 44.69, 337.0, 37.74, \"full scoring\", 75.9, 84.67, 46.0, 55.0, 48.0, 61.5, 19.7, 42.3, 15.4, 22.6, 444.0], [84, 5, 58.0, 30.0, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.67, 8.41, 4.35, 7.1, 414.0, 18.26, \"full scoring\", 85.71, 85.71, NaN, 78.0, 54.0, 68.5, 7.38, 60.8, 12.7, 19.1, 483.0], [85, 5, 60.0, 26.15, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 4.96, 12.46, 3.31, 10.93, 472.0, 13.73, \"full scoring\", 78.15, 88.89, 73.0, 85.0, 61.0, 58.5, 10.3, 46.7, 14.9, 28.1, 604.0], [87, 5, 75.0, 33.58, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 11.91, 12.63, 7.46, 8.61, 418.0, 8.04, \"full scoring\", 95.65, 95.65, NaN, 16.0, 16.0, 18.5, 4.55, 55.0, 14.2, 26.2, 437.0], [93, 5, 79.0, 26.67, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [99, 5, 71.0, 30.54, \"no\", \"male\", \"white\", \"no\", \"yes\", 24.4, 26.54, 16.98, 21.76, 364.0, 22.09, \"full scoring\", 79.3, 79.3, NaN, 48.0, 43.0, 95.0, 14.9, 52.5, 8.53, 24.1, 459.0], [101, 5, 63.0, 32.57, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.14, 7.67, 2.92, 5.06, 391.0, 12.89, \"full scoring\", 84.82, 84.82, NaN, 9.0, 8.0, 69.5, 4.74, 40.3, 33.9, 21.0, 461.0], [105, 5, 68.0, 38.38, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 19.72, 21.07, 14.66, 17.02, 356.0, 11.29, \"full scoring\", 78.24, 78.24, NaN, 119.0, 57.0, 98.5, 9.13, 46.6, 21.9, 22.3, 455.0], [107, 5, 82.0, 33.82, \"no\", \"male\", \"white\", \"no\", \"yes\", 52.57, 58.83, 49.96, 56.61, 460.0, 23.74, \"full scoring\", 93.69, 93.69, NaN, 138.0, 130.0, 31.0, 14.5, 59.7, 11.5, 14.3, 491.0], [109, 5, 66.0, 27.0, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 16.03, 23.02, 8.73, 17.3, 378.0, 26.67, \"full scoring\", 82.35, 82.35, NaN, 125.0, 84.0, 80.5, 19.3, 54.8, 4.5, 21.4, 459.0], [110, 5, 60.0, 29.11, \"no\", \"male\", \"white\", \"no\", \"no\", 36.23, 39.46, 27.46, 33.23, 260.0, 17.31, \"full scoring\", 75.36, 83.07, 32.0, 84.0, 63.0, 53.0, 10.0, 67.7, 13.8, 8.46, 345.0], [111, 5, 77.0, 20.1, \"no\", \"female\", \"white\", \"not reported\", \"no\", 0.0, 0.0, 0.0, 0.0, 231.0, 18.18, \"full scoring\", 51.22, 59.69, 64.0, 82.0, 44.0, 155.5, 18.7, 38.0, 12.1, 31.2, 451.0], [113, 5, 61.0, 22.22, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 1.96, 3.27, 0.33, 2.29, 367.0, 12.26, \"full scoring\", 85.55, 93.62, 37.0, 95.0, 91.0, 24.5, 7.77, 60.9, 12.9, 18.4, 429.0], [117, 5, 65.0, 28.67, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [118, 5, 56.0, 28.69, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 12.87, 13.59, 7.95, 9.69, 415.0, 17.49, \"full scoring\", 86.64, 87.92, 7.0, 109.0, 94.0, 57.0, 6.27, 53.7, 24.1, 15.9, 479.0], [120, 5, 60.0, 30.38, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 8.21, 18.37, 4.89, 16.61, 307.0, 23.84, \"full scoring\", 60.08, 68.68, 64.0, 123.0, 59.0, 140.0, 19.9, 55.1, 1.79, 23.2, 511.0], [121, 5, 58.0, 29.29, \"no\", \"male\", \"white\", \"yes\", \"yes\", 13.9, 18.12, 8.62, 14.25, 341.0, 30.09, \"full scoring\", 86.33, 86.33, NaN, 60.0, 54.0, 54.0, 21.4, 40.5, 17.4, 20.7, 395.0], [125, 5, 82.0, 22.22, \"no\", \"male\", \"white\", \"not reported\", \"no\", 43.72, 46.65, 38.14, 41.66, 409.0, 19.8, \"full scoring\", 77.32, 77.32, NaN, 130.0, 117.0, 120.0, 22.0, 68.3, 0.73, 8.92, 529.0], [128, 5, 62.0, 36.03, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [132, 5, 62.0, 31.16, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 4.55, 6.83, 1.25, 4.21, 527.0, 23.11, \"full scoring\", 88.42, 88.42, NaN, 86.0, 84.0, 69.0, 13.7, 70.2, 1.8, 14.3, 596.0], [133, 5, 84.0, 26.64, \"no\", \"male\", \"white\", \"not reported\", \"no\", 22.09, 26.61, 14.09, 20.35, 345.0, 25.39, \"full scoring\", 73.09, 81.37, 48.0, 86.0, 77.0, 79.0, 15.5, 62.6, 0.0, 21.9, 472.0], [134, 5, 89.0, 21.61, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [138, 5, 63.0, 26.55, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 30.47, 30.94, 24.33, 25.98, 254.0, 21.73, \"full scoring\", 95.13, 95.13, NaN, 4.0, 4.0, 13.0, 14.8, 62.5, 1.18, 21.5, 267.0], [139, 5, 65.0, 30.18, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [140, 5, 67.0, 32.97, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 43.98, 50.12, 36.89, 44.72, 322.0, 35.59, \"full scoring\", 73.68, 73.68, NaN, 53.0, 48.0, 115.0, 23.3, 54.0, 3.73, 19.0, 437.0], [144, 5, 67.0, 36.05, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 16.61, 20.95, 9.42, 15.25, 484.0, 18.84, \"full scoring\", 85.36, 87.84, 16.0, 75.0, 68.0, 66.5, 8.27, 54.3, 7.86, 29.6, 567.0], [149, 5, 81.0, 30.65, \"no\", \"female\", \"white\", \"no\", \"yes\", 15.41, 20.55, 9.04, 15.21, 292.0, 17.47, \"full scoring\", 57.82, 69.86, 87.0, 126.0, 74.0, 125.5, 16.1, 51.9, 14.2, 17.8, 505.0], [152, 5, 80.0, 26.97, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 7.06, 10.82, 1.41, 6.59, 255.0, 17.65, \"full scoring\", 62.2, 84.72, 109.0, 199.0, 176.0, 46.0, 6.08, 86.5, 5.69, 1.76, 410.0], [155, 5, 76.0, 29.21, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 29.55, 34.9, 25.84, 31.63, 404.0, 12.03, \"full scoring\", 75.8, 75.8, NaN, 31.0, 30.0, 128.5, 12.5, 65.7, 1.36, 20.4, 533.0], [159, 5, 58.0, 27.9, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 1.37, 4.1, 0.68, 3.42, 439.0, 15.17, \"full scoring\", 79.24, 87.1, 50.0, 176.0, 130.0, 65.5, 5.59, 59.9, 18.1, 16.4, 554.0], [167, 5, 59.0, 19.82, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 0.45, 3.17, 0.0, 2.94, 265.0, 18.57, \"full scoring\", 55.32, 94.31, 198.0, 33.0, 32.0, 16.0, 5.28, 47.5, 25.5, 21.7, 479.0], [168, 5, 63.0, 21.9, \"no\", \"female\", \"white\", \"yes\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [169, 5, 71.0, 30.35, \"no\", \"male\", \"white\", \"no\", \"yes\", 43.93, 45.76, 38.03, 40.68, 295.0, 33.97, \"full scoring\", 64.84, 64.84, NaN, 125.0, 74.0, 160.0, 39.5, 39.5, 0.68, 20.3, 455.0], [171, 5, 59.0, 38.26, \"no\", \"female\", \"white\", \"not reported\", \"no\", 5.92, 6.74, 2.48, 3.85, 436.0, 13.49, \"full scoring\", 85.16, 85.16, NaN, 243.0, 209.0, 75.5, 11.8, 73.5, 2.18, 12.5, 512.0], [179, 5, 75.0, 34.32, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [182, 5, 72.0, 24.72, \"no\", \"male\", \"black or african american\", \"yes\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [183, 5, 65.0, 34.27, \"no\", \"male\", \"black or african american\", \"yes\", \"yes\", 38.66, 39.93, 32.75, 34.86, 284.0, 18.59, \"full scoring\", 84.52, 84.52, NaN, 81.0, 77.0, 52.0, 14.4, 58.1, 15.3, 12.1, 336.0], [187, 5, 62.0, 34.47, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 14.85, 16.39, 9.31, 12.02, 509.0, 9.31, \"full scoring\", 93.22, 97.32, 23.0, 78.0, 77.0, 14.0, 5.51, 68.0, 14.6, 11.9, 546.0], [188, 5, 71.0, 24.37, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 20.84, 31.44, 15.27, 30.36, 334.0, 31.44, \"full scoring\", 70.91, 70.91, NaN, 77.0, 48.0, 136.5, 16.0, 59.3, 14.1, 10.6, 471.0], [193, 5, 89.0, 24.62, \"no\", \"male\", \"white\", \"not reported\", \"no\", 17.54, 20.05, 13.23, 16.98, 431.0, 19.07, \"full scoring\", 74.31, 74.31, NaN, 82.0, 45.0, 148.5, 18.6, 46.2, 6.85, 28.3, 580.0], [194, 5, 57.0, 27.03, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 8.02, 11.89, 5.12, 9.4, 434.0, 11.75, \"full scoring\", 84.11, 94.97, 59.0, 37.0, 36.0, 23.0, 8.54, 55.2, 3.46, 32.8, 516.0], [195, 5, 84.0, 22.97, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.46, 18.28, 4.98, 17.72, 325.0, 26.03, \"full scoring\", 72.22, 72.22, NaN, 164.0, 83.0, 125.0, 23.0, 47.8, 14.3, 14.9, 450.0], [196, 5, 75.0, 27.42, \"no\", \"male\", \"white\", \"not reported\", \"no\", 51.58, 54.04, 34.74, 39.3, 171.0, 20.7, \"full scoring\", 62.41, 91.44, 87.0, 81.0, 73.0, 16.0, 20.2, 42.5, 21.4, 15.8, 274.0], [197, 5, 67.0, 41.54, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 27.33, 29.04, 18.79, 21.14, 281.0, 11.74, \"full scoring\", 60.95, 60.95, NaN, 73.0, 60.0, 180.0, 12.1, 60.7, 3.38, 23.8, 461.0], [199, 5, 90.0, 24.28, \"yes\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [204, 5, 75.0, 22.69, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 2.17, 6.36, 0.62, 5.12, 387.0, 16.9, \"full scoring\", 80.79, 83.05, 13.0, 47.0, 43.0, 79.0, 5.94, 64.3, 10.2, 19.5, 479.0], [209, 5, 82.0, 18.88, \"no\", \"male\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [211, 5, 61.0, 28.45, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 14.33, 14.87, 9.13, 11.1, 335.0, 22.57, \"full scoring\", 75.11, 75.11, NaN, 65.0, 27.0, 110.5, 13.9, 47.3, 13.1, 25.7, 446.0], [214, 5, 88.0, 47.0, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [219, 5, 68.0, 21.31, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 21.37, 24.46, 13.65, 17.77, 233.0, 13.39, \"full scoring\", 76.9, 85.35, 30.0, 91.0, 65.0, 40.0, 8.17, 36.6, 29.0, 26.2, 303.0], [220, 5, 81.0, 23.17, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 39.21, 40.0, 33.82, 34.74, 456.0, 22.5, \"full scoring\", 78.35, 78.35, NaN, 107.0, 66.0, 125.5, 18.6, 44.0, 14.3, 23.1, 582.0], [225, 5, 63.0, 26.11, \"no\", \"female\", \"white\", \"yes\", \"yes\", 1.96, 2.27, 1.21, 1.51, 397.0, 5.44, \"full scoring\", 85.75, 85.75, NaN, 116.0, 62.0, 66.0, 5.04, 46.7, 26.2, 22.1, 463.0], [236, 5, 75.0, 31.34, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 19.92, 29.38, 9.96, 21.91, 241.0, 22.66, \"full scoring\", 68.08, 68.08, NaN, 164.0, 92.0, 113.0, 12.4, 72.2, 0.62, 14.7, 354.0], [241, 5, 79.0, 29.93, \"no\", \"female\", \"white\", \"not reported\", \"no\", 9.68, 12.62, 4.25, 8.36, 409.0, 21.86, \"full scoring\", 74.77, 85.74, 70.0, 72.0, 70.0, 67.5, 9.18, 70.0, 8.45, 12.4, 547.0], [248, 5, 69.0, 29.9, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 26.74, 34.42, 15.81, 26.74, 258.0, 37.21, \"full scoring\", 55.6, 55.6, NaN, 218.0, 98.0, 205.5, 19.2, 59.6, 5.83, 15.3, 464.0], [251, 5, 73.0, 32.67, \"no\", \"female\", \"black or african american\", \"not reported\", \"not reported\", 4.59, 5.7, 2.06, 3.8, 379.0, 20.58, \"full scoring\", 85.94, 85.94, NaN, 0.0, 0.0, 61.5, 10.7, 59.9, 4.62, 24.8, 441.0], [255, 5, 61.0, 33.62, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [258, 5, 64.0, 22.87, \"no\", \"female\", \"white\", \"not reported\", \"no\", 1.55, 2.25, 0.85, 1.69, 426.0, 8.31, \"full scoring\", 79.48, 79.48, NaN, 169.0, 71.0, 109.5, 3.64, 64.3, 9.98, 22.1, 536.0], [269, 5, 80.0, 28.98, \"no\", \"male\", \"white\", \"no\", \"yes\", 29.59, 36.77, 22.12, 32.63, 217.0, 40.92, \"full scoring\", 48.98, 48.98, NaN, 234.0, 89.0, 225.5, 11.1, 62.9, 15.2, 10.8, 443.0], [271, 5, 56.0, 30.94, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 18.45, 19.01, 14.79, 15.63, 426.0, 8.73, \"full scoring\", 93.63, 93.63, NaN, 109.0, 91.0, 29.0, 5.99, 73.1, 5.76, 15.2, 455.0], [275, 5, 59.0, 21.87, \"no\", \"male\", \"white\", \"no\", \"yes\", 3.93, 5.97, 3.64, 5.68, 412.0, 13.98, \"full scoring\", 86.92, 96.26, 46.0, 262.0, 257.0, 16.0, 2.67, 41.0, 33.3, 23.1, 474.0], [282, 5, 68.0, 27.81, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 17.98, 19.88, 11.41, 14.01, 347.0, 18.5, \"full scoring\", 79.22, 79.22, NaN, 117.0, 43.0, 91.0, 9.94, 39.9, 21.8, 28.4, 438.0], [284, 5, 60.0, 27.61, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 1.96, 5.61, 0.98, 5.05, 428.0, 26.07, \"full scoring\", 88.61, 91.85, 17.0, 105.0, 91.0, 38.5, 4.09, 53.4, 26.6, 15.9, 483.0], [285, 5, 70.0, 30.6, \"no\", \"male\", \"white\", \"no\", \"not reported\", 20.71, 24.56, 15.8, 20.5, 281.0, 18.79, \"full scoring\", 85.15, 85.15, NaN, 64.0, 59.0, 49.0, 8.38, 57.0, 23.0, 11.6, 330.0], [286, 5, 68.0, 26.84, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 78.83, 81.93, 69.69, 73.99, 446.0, 48.3, \"full scoring\", 91.39, 91.39, NaN, 225.0, 201.0, 42.0, 40.1, 38.1, 9.08, 12.7, 488.0], [288, 5, 64.0, 21.87, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 5.31, 5.78, 2.34, 3.28, 384.0, 12.19, \"full scoring\", 86.88, 86.88, NaN, 76.0, 65.0, 57.5, 5.08, 59.3, 3.26, 32.3, 442.0], [292, 5, 57.0, 28.67, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 1.12, 1.44, 0.96, 1.44, 374.0, 6.26, \"full scoring\", 69.65, 76.8, 50.0, 128.0, 119.0, 113.5, 6.95, 72.6, 0.0, 20.5, 537.0], [295, 5, 62.0, 24.14, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.0, 0.12, 0.0, 0.12, 490.0, 16.04, \"full scoring\", 89.91, 89.91, NaN, 81.0, 74.0, 55.0, 10.7, 67.1, 0.0, 22.1, 545.0], [299, 5, 74.0, 30.5, \"no\", \"male\", \"white\", \"no\", \"yes\", 11.84, 16.44, 5.59, 13.97, 365.0, 43.73, \"full scoring\", 61.14, 61.14, NaN, 84.0, 64.0, 231.5, 21.3, 59.8, 0.27, 18.7, 597.0], [301, 5, 63.0, 31.38, \"no\", \"male\", \"white\", \"not reported\", \"no\", 18.81, 22.07, 12.59, 17.25, 386.0, 19.27, \"full scoring\", 86.55, 86.55, NaN, 102.0, 87.0, 60.0, 20.1, 56.5, 0.0, 23.3, 446.0], [303, 5, 64.0, 19.83, \"no\", \"female\", \"white\", \"yes\", \"yes\", 7.18, 12.68, 3.38, 9.51, 284.0, 13.31, \"full scoring\", 76.96, 92.81, 63.0, 46.0, 45.0, 21.5, 8.99, 47.1, 9.7, 34.2, 369.0], [306, 5, 77.0, 26.6, \"no\", \"male\", \"white\", \"no\", \"yes\", 29.81, 32.83, 16.79, 22.45, 318.0, 19.25, \"full scoring\", 68.39, 68.39, NaN, 63.0, 57.0, 147.0, 6.92, 64.0, 20.1, 8.96, 465.0], [310, 5, 57.0, 46.8, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 24.71, 30.13, 18.24, 24.85, 454.0, 30.0, \"full scoring\", 84.86, 87.64, 17.0, 96.0, 90.0, 64.0, 10.7, 55.2, 11.2, 22.8, 535.0], [312, 5, 75.0, 28.31, \"no\", \"male\", \"hispanic\", \"yes\", \"yes\", 31.97, 39.84, 24.84, 36.89, 244.0, 41.31, \"full scoring\", 49.49, 49.49, NaN, 343.0, 155.0, 249.0, 25.4, 64.5, 0.41, 9.63, 493.0], [314, 5, 77.0, 24.65, \"no\", \"male\", \"white\", \"not reported\", \"no\", 16.28, 19.18, 13.61, 17.4, 269.0, 20.52, \"full scoring\", 56.16, 72.12, 106.0, 66.0, 57.0, 104.5, 21.9, 49.6, 11.3, 17.1, 479.0], [318, 5, 75.0, 29.51, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 8.53, 13.87, 4.27, 10.93, 225.0, 40.8, \"full scoring\", 46.97, 58.9, 97.0, 200.0, 88.0, 157.0, 12.4, 55.3, 18.7, 13.6, 479.0], [319, 5, 75.0, 28.23, \"no\", \"female\", \"white\", \"not reported\", \"no\", 27.83, 35.92, 18.95, 30.59, 304.0, 27.63, \"full scoring\", 84.68, 92.4, 30.0, 276.0, 252.0, 25.0, 15.5, 44.6, 22.9, 17.1, 359.0], [320, 5, 61.0, 23.99, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [323, 5, 79.0, 23.7, \"no\", \"male\", \"white\", \"no\", \"yes\", 2.46, 6.32, 1.4, 5.26, 171.0, 11.23, \"full scoring\", 43.62, 44.42, 7.0, 198.0, 68.0, 214.0, 9.06, 63.5, 20.5, 7.02, 392.0], [328, 5, 73.0, 26.19, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 17.23, 18.0, 11.03, 12.58, 310.0, 20.13, \"full scoring\", 60.19, 60.19, NaN, 147.0, 98.0, 205.0, 14.0, 74.0, 0.0, 11.9, 515.0], [329, 5, 61.0, 26.4, \"no\", \"male\", \"white\", \"not reported\", \"no\", 9.13, 36.74, 1.74, 35.65, 276.0, 46.96, \"full scoring\", 55.42, 55.42, NaN, 127.0, 29.0, 221.5, 36.4, 45.8, 0.36, 17.4, 498.0], [332, 5, 74.0, 28.83, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 42.36, 52.53, 37.73, 50.09, 466.0, 49.44, \"full scoring\", 60.52, 60.52, NaN, 141.0, 55.0, 303.5, 42.7, 43.6, 0.0, 13.6, 770.0], [337, 5, 78.0, 32.2, \"no\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [338, 5, 56.0, 34.57, \"no\", \"male\", \"white\", \"no\", \"yes\", 75.23, 78.02, 71.89, 76.72, 323.0, 70.22, \"full scoring\", 71.3, 90.48, 96.0, 141.0, 127.0, 34.5, 70.6, 19.5, 0.0, 9.91, 453.0], [339, 5, 86.0, 24.9, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.96, 5.11, 0.0, 4.47, 188.0, 37.98, \"full scoring\", 46.65, 87.85, 189.0, 130.0, 116.0, 26.5, 13.6, 73.9, 5.87, 6.67, 403.0], [344, 5, 69.0, 27.52, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 11.91, 12.34, 8.09, 9.5, 423.0, 8.51, \"full scoring\", 82.78, 82.78, NaN, 77.0, 34.0, 88.0, 9.11, 63.6, 6.51, 20.8, 511.0], [345, 5, 58.0, 20.59, \"no\", \"male\", \"white\", \"not reported\", \"no\", 8.2, 10.65, 2.59, 6.33, 417.0, 11.37, \"full scoring\", 87.61, 92.67, NaN, 59.0, 55.0, 33.5, 7.67, 46.5, 19.7, 26.1, 476.0], [346, 5, 65.0, 24.98, \"no\", \"male\", \"hispanic\", \"yes\", \"yes\", 69.76, 69.76, 66.6, 67.46, 209.0, 37.89, \"full scoring\", 37.19, 48.38, 130.0, 94.0, 89.0, 222.5, 29.7, 59.7, 4.32, 6.24, 562.0], [347, 5, 84.0, 27.06, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 15.22, 18.27, 10.39, 14.15, 335.0, 24.54, \"full scoring\", 67.68, 69.65, 14.0, 153.0, 78.0, 146.0, 6.87, 57.2, 23.0, 13.0, 495.0], [350, 5, 71.0, 33.4, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 19.63, 22.06, 12.02, 15.66, 544.0, 13.35, \"full scoring\", 86.76, 86.76, NaN, 99.0, 84.0, 83.0, 8.82, 54.1, 17.0, 20.0, 627.0], [359, 5, 56.0, 29.28, \"no\", \"male\", \"hispanic\", \"yes\", \"yes\", 14.92, 16.79, 9.17, 11.81, 386.0, 17.56, \"full scoring\", 81.61, 92.34, 55.0, 143.0, 119.0, 32.0, 9.86, 61.9, 8.3, 20.0, 473.0], [363, 5, 64.0, 41.09, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 22.85, 23.47, 18.03, 19.12, 386.0, 15.39, \"full scoring\", 73.66, 76.59, 20.0, 236.0, 133.0, 118.0, 12.3, 70.2, 0.52, 17.0, 524.0], [368, 5, 82.0, 24.4, \"no\", \"male\", \"white\", \"no\", \"not reported\", 12.0, 22.29, 3.43, 16.29, 70.0, 27.43, \"full scoring\", 27.24, 61.4, 143.0, 0.0, 0.0, 44.0, 9.35, 82.7, 7.91, 0.0, 257.0], [372, 5, 57.0, 39.51, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 10.86, 11.84, 6.65, 8.27, 370.0, 14.43, \"full scoring\", 77.89, 79.57, 10.0, 63.0, 59.0, 95.5, 8.53, 62.7, 9.74, 19.1, 475.0], [374, 5, 76.0, 32.13, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 58.73, 60.64, 54.91, 58.89, 377.0, 41.06, \"full scoring\", 80.21, 80.21, NaN, 147.0, 113.0, 93.0, 46.8, 39.3, 0.0, 13.9, 470.0], [380, 5, 58.0, 33.87, \"no\", \"male\", \"white\", \"no\", \"yes\", 38.2, 40.9, 34.83, 38.43, 267.0, 30.34, \"full scoring\", 75.85, 86.69, 44.0, 52.0, 49.0, 40.5, 25.7, 49.9, 3.19, 21.2, 352.0], [381, 5, 77.0, 27.88, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 27.58, 34.33, 15.99, 25.23, 409.0, 23.62, \"full scoring\", 90.69, 90.69, NaN, 54.0, 51.0, 42.0, 6.6, 60.3, 10.3, 22.9, 451.0], [382, 5, 61.0, 32.33, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 8.53, 9.45, 3.81, 5.12, 457.0, 6.7, \"full scoring\", 90.14, 90.14, NaN, 152.0, 141.0, 50.0, 5.91, 55.0, 24.4, 14.7, 507.0], [384, 5, 73.0, 24.23, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 7.86, 8.86, 4.37, 5.86, 481.0, 15.34, \"full scoring\", 91.27, 92.32, 6.0, 51.0, 46.0, 39.5, 10.7, 70.3, 0.1, 18.9, 527.0], [385, 5, 63.0, 37.22, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 1.68, 2.05, 1.12, 1.68, 322.0, 9.13, \"full scoring\", 70.0, 77.78, 46.0, 201.0, 121.0, 91.5, 7.62, 67.8, 3.27, 21.3, 460.0], [386, 5, 87.0, 27.29, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 63.71, 64.5, 58.15, 59.74, 453.0, 18.15, \"full scoring\", 73.66, 73.66, NaN, 139.0, 103.0, 161.5, 12.5, 74.3, 8.18, 5.08, 615.0], [388, 5, 82.0, 22.9, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 9.32, 12.52, 3.79, 7.57, 206.0, 12.23, \"full scoring\", 58.03, 58.03, NaN, 15.0, 15.0, 148.5, 6.31, 71.1, 6.07, 16.5, 355.0], [392, 5, 84.0, 23.1, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 16.08, 17.34, 9.79, 12.45, 429.0, 14.55, \"full scoring\", 82.18, 82.18, NaN, 141.0, 92.0, 93.0, 16.2, 56.9, 5.36, 21.6, 522.0], [393, 5, 82.0, 22.24, \"no\", \"female\", \"white\", \"no\", \"yes\", 0.91, 2.57, 0.6, 2.27, 397.0, 16.32, \"full scoring\", 66.5, 66.72, 2.0, 107.0, 64.0, 198.5, 11.1, 63.8, 8.95, 16.1, 597.0], [399, 5, 62.0, 39.56, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 63.91, 67.23, 48.08, 54.72, 307.0, 26.19, \"full scoring\", 75.62, 79.33, 19.0, 83.0, 78.0, 80.0, 9.61, 60.9, 13.8, 15.6, 406.0], [402, 5, 78.0, 27.52, \"no\", \"male\", \"white\", \"not reported\", \"no\", 40.29, 44.67, 37.45, 43.14, 274.0, 36.79, \"full scoring\", 68.16, 85.09, 80.0, 38.0, 38.0, 48.0, 18.2, 50.0, 17.3, 14.4, 402.0], [403, 5, 77.0, 32.82, \"no\", \"female\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [405, 5, 78.0, 26.73, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 41.13, 43.4, 37.36, 41.89, 318.0, 30.19, \"full scoring\", 70.67, 71.3, 4.0, 41.0, 26.0, 127.5, 38.6, 46.0, 0.0, 15.4, 450.0], [407, 5, 77.0, 35.66, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 26.29, 28.39, 21.13, 23.71, 372.0, 16.13, \"full scoring\", 77.5, 77.5, NaN, 56.0, 34.0, 107.5, 21.1, 53.0, 0.0, 25.9, 480.0], [408, 5, 62.0, 21.53, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 1.37, 8.24, 0.98, 8.24, 306.0, 22.16, \"full scoring\", 56.77, 78.46, 149.0, 167.0, 122.0, 84.0, 20.5, 47.1, 9.66, 22.7, 539.0], [414, 5, 65.0, 17.08, \"no\", \"female\", \"white\", \"yes\", \"yes\", 4.09, 7.33, 0.51, 4.94, 352.0, 24.72, \"full scoring\", 75.54, 82.24, 38.0, 120.0, 81.0, 76.5, 13.6, 49.1, 7.24, 30.0, 466.0], [415, 5, 75.0, 21.4, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 1.0, 4.99, 0.57, 4.85, 421.0, 30.21, \"full scoring\", 77.39, 77.68, 2.0, 156.0, 65.0, 121.0, 3.21, 59.3, 25.9, 11.5, 544.0], [416, 5, 58.0, 21.77, \"no\", \"male\", \"white\", \"not reported\", \"no\", 2.16, 11.35, 2.16, 11.35, 222.0, 18.38, \"full scoring\", 88.1, 88.1, NaN, 60.0, 60.0, 30.0, 11.3, 66.2, 6.31, 16.2, 252.0], [419, 5, 69.0, 23.15, \"no\", \"female\", \"white\", \"not reported\", \"no\", 4.16, 6.98, 1.78, 5.94, 404.0, 10.1, \"full scoring\", 71.89, 75.37, 26.0, 79.0, 70.0, 132.0, 10.0, 63.6, 5.58, 20.8, 562.0], [423, 5, 61.0, 35.46, \"no\", \"male\", \"white\", \"not reported\", \"no\", 21.71, 22.44, 17.56, 18.54, 246.0, 21.22, \"full scoring\", 57.88, 68.72, 67.0, 69.0, 68.0, 112.5, 19.1, 62.9, 0.0, 17.9, 425.0], [427, 5, 56.0, 32.31, \"no\", \"female\", \"white\", \"not reported\", \"no\", 0.59, 0.74, 0.0, 0.15, 406.0, 12.71, \"full scoring\", 92.91, 92.91, NaN, 227.0, 210.0, 31.0, 7.77, 66.6, 16.2, 9.49, 437.0], [435, 5, 69.0, 31.16, \"no\", \"male\", \"white\", \"no\", \"yes\", 44.03, 47.58, 39.03, 44.68, 372.0, 34.03, \"full scoring\", 81.58, 81.58, NaN, 93.0, 87.0, 83.5, 15.5, 58.7, 12.4, 13.4, 456.0], [439, 5, 61.0, 26.31, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [440, 5, 73.0, 30.46, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 6.37, 12.03, 3.68, 10.61, 424.0, 33.25, \"full scoring\", 78.66, 92.37, 80.0, 88.0, 78.0, 35.0, 24.1, 58.3, 1.3, 16.3, 539.0], [443, 5, 64.0, 23.44, \"no\", \"male\", \"white\", \"not reported\", \"no\", 14.22, 24.05, 8.53, 22.24, 464.0, 39.57, \"full scoring\", 69.88, 77.33, 64.0, 49.0, 40.0, 136.5, 36.1, 40.3, 1.4, 22.1, 664.0], [445, 5, 56.0, 26.9, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 2.07, 2.26, 1.69, 1.88, 319.0, 9.97, \"full scoring\", 53.17, 65.5, 113.0, 232.0, 89.0, 167.5, 8.48, 59.3, 19.8, 12.4, 600.0], [446, 5, 73.0, 24.43, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [452, 5, 73.0, 34.52, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 7.18, 8.77, 3.99, 5.78, 301.0, 9.97, \"full scoring\", 65.58, 73.96, 52.0, 54.0, 42.0, 105.5, 6.31, 54.2, 18.8, 20.8, 459.0], [457, 5, 58.0, 32.94, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 12.73, 13.76, 5.56, 7.17, 410.0, 7.46, \"full scoring\", 69.02, 69.02, NaN, 242.0, 76.0, 183.5, 3.05, 66.8, 14.0, 16.1, 594.0], [458, 5, 57.0, 23.18, \"no\", \"female\", \"white\", \"not reported\", \"no\", 4.4, 6.13, 2.2, 4.4, 382.0, 13.98, \"full scoring\", 95.02, 95.02, NaN, 127.0, 124.0, 19.5, 2.49, 42.1, 35.5, 19.9, 402.0], [459, 5, 63.0, 35.18, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 30.53, 34.13, 23.32, 28.41, 283.0, 22.26, \"full scoring\", 91.29, 91.29, NaN, 63.0, 59.0, 27.0, 12.7, 46.7, 19.8, 20.7, 310.0], [6337, 5, 56.0, 22.13, \"no\", \"male\", \"white\", \"yes\", \"yes\", 0.72, 4.31, 0.36, 4.31, 334.0, 23.71, \"full scoring\", 77.49, 78.22, 4.0, 109.0, 90.0, 93.5, 12.1, 69.5, 6.14, 12.3, 431.0], [6340, 5, 63.0, 29.57, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 5.37, 11.94, 3.58, 10.6, 402.0, 12.39, \"full scoring\", 81.38, 81.38, NaN, 122.0, 50.0, 91.5, 5.1, 54.1, 19.5, 21.3, 494.0], [6350, 5, 65.0, 35.27, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 75.16, 79.35, 65.48, 70.0, 186.0, 25.16, \"full scoring\", 69.4, NaN, 48.0, 74.0, 61.0, 34.0, 13.2, 67.9, 1.62, 17.3, 268.0], [6351, 5, 62.0, 32.44, \"no\", \"female\", \"white\", \"no\", \"yes\", 27.68, 28.18, 21.42, 22.42, 479.0, 5.76, \"full scoring\", 79.57, 82.59, 22.0, 196.0, 128.0, 101.5, 2.82, 69.0, 15.0, 13.2, 602.0], [6353, 5, 65.0, 26.99, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 8.25, 10.65, 5.25, 8.55, 400.0, 15.9, \"full scoring\", 91.32, 91.32, NaN, 78.0, 76.0, 37.5, 8.25, 50.3, 18.8, 22.8, 438.0], [6354, 5, 57.0, 29.65, \"no\", \"female\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6362, 5, 89.0, 21.33, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 11.25, 16.88, 7.5, 16.88, 32.0, 35.63, \"full scoring\", 10.6, 10.6, NaN, 0.0, 0.0, 269.5, 42.9, 54.0, 3.17, 0.0, 302.0], [6366, 5, 62.0, 30.09, \"no\", \"male\", \"white\", \"no\", \"yes\", 31.98, 33.01, 23.91, 26.26, 409.0, 21.56, \"full scoring\", 95.12, 95.12, NaN, 19.0, 18.0, 20.5, 9.55, 58.4, 12.5, 19.6, 430.0], [6367, 5, 67.0, 29.46, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 25.94, 27.1, 19.16, 20.32, 310.0, 13.35, \"full scoring\", 80.1, 90.12, 43.0, 50.0, 50.0, 34.0, 6.29, 56.1, 7.1, 30.5, 387.0], [6370, 5, 59.0, 22.61, \"no\", \"female\", \"white\", \"not reported\", \"no\", 0.65, 6.77, 0.16, 6.45, 372.0, 30.0, \"full scoring\", 76.7, 76.7, NaN, 90.0, 77.0, 113.0, 17.1, 37.6, 19.7, 25.7, 485.0], [6372, 5, 67.0, 25.71, \"no\", \"male\", \"white\", \"yes\", \"yes\", 24.23, 32.83, 16.08, 28.3, 265.0, 39.85, \"full scoring\", 63.25, 65.11, 12.0, 115.0, 75.0, 142.0, 32.7, 53.3, 0.0, 14.0, 419.0], [6374, 5, 79.0, 21.69, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 4.4, 5.38, 3.42, 4.4, 368.0, 20.05, \"full scoring\", 80.7, 82.33, 9.0, 88.0, 67.0, 79.0, 13.7, 49.9, 16.5, 19.9, 456.0], [6376, 5, 80.0, 26.12, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 10.43, 12.71, 4.14, 8.43, 420.0, 17.29, \"full scoring\", 67.52, 67.52, NaN, 284.0, 112.0, 201.5, 12.4, 55.4, 7.62, 24.6, 622.0], [6382, 5, 57.0, 34.27, \"no\", \"male\", \"white\", \"not reported\", \"no\", 31.21, 34.48, 21.21, 27.24, 348.0, 21.38, \"full scoring\", 71.9, NaN, 50.0, 111.0, 94.0, 86.0, 11.5, 73.3, 2.44, 12.8, 484.0], [6383, 5, 62.0, 23.97, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.15, 9.17, 3.95, 7.89, 517.0, 19.15, \"full scoring\", 89.91, 89.91, NaN, 142.0, 128.0, 57.5, 15.2, 55.9, 9.48, 19.4, 575.0], [6384, 5, 68.0, 22.48, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 5.77, 11.17, 4.05, 9.94, 489.0, 18.77, \"full scoring\", 81.5, 81.5, NaN, 94.0, 90.0, 110.5, 10.4, 68.9, 0.0, 20.7, 600.0], [6385, 5, 59.0, 25.94, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 38.87, 46.59, 27.49, 39.82, 443.0, 36.03, \"full scoring\", 76.51, 76.51, NaN, 183.0, 109.0, 136.0, 26.6, 57.3, 0.0, 16.2, 579.0], [6390, 5, 88.0, 24.38, \"no\", \"male\", \"white\", \"not reported\", \"no\", 31.49, 36.93, 14.9, 24.1, 463.0, 24.23, \"full scoring\", 89.21, 89.21, NaN, 60.0, 43.0, 56.0, 19.3, 58.3, 1.84, 20.5, 519.0], [6396, 5, 77.0, 29.41, \"no\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6401, 5, 83.0, 23.56, \"no\", \"female\", \"white\", \"not reported\", \"no\", 18.68, 23.8, 10.41, 18.51, 363.0, 18.35, \"full scoring\", 82.13, 83.07, 5.0, 79.0, 48.0, 73.5, 14.5, 33.9, 27.7, 23.9, 442.0], [6402, 5, 72.0, 36.2, \"no\", \"female\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6408, 5, 90.0, 21.82, \"yes\", \"male\", \"black or african american\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6410, 5, 62.0, 25.46, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 0.73, 1.02, 0.73, 1.02, 410.0, 4.68, \"full scoring\", 82.33, 84.54, 13.0, 53.0, 42.0, 75.0, 5.85, 66.2, 2.68, 25.2, 498.0], [6413, 5, 65.0, 31.53, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 62.86, 66.43, 54.76, 60.24, 252.0, 31.9, \"full scoring\", 52.72, 77.06, 151.0, 66.0, 61.0, 75.0, 15.9, 70.0, 0.6, 13.5, 478.0], [6414, 5, 77.0, 25.16, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 3.86, 5.43, 1.86, 3.86, 420.0, 22.86, \"full scoring\", 87.68, 89.17, 8.0, 72.0, 70.0, 51.0, 11.3, 55.3, 16.1, 17.3, 479.0], [6415, 5, 78.0, 25.45, \"no\", \"male\", \"white\", \"no\", \"yes\", 10.62, 13.6, 5.4, 9.5, 322.0, 15.65, \"full scoring\", 65.85, 70.0, 29.0, 97.0, 44.0, 137.5, 10.9, 61.6, 0.31, 27.2, 489.0], [6416, 5, 74.0, 25.86, \"no\", \"male\", \"white\", \"not reported\", \"no\", 7.75, 10.77, 5.02, 8.76, 418.0, 24.11, \"full scoring\", 87.45, 88.0, 3.0, 50.0, 45.0, 56.5, 14.7, 61.6, 1.2, 22.5, 478.0], [6417, 5, 81.0, 26.31, \"no\", \"male\", \"white\", \"not reported\", \"no\", 25.86, 36.65, 16.26, 30.3, 406.0, 31.33, \"full scoring\", 74.77, 76.89, 15.0, 58.0, 43.0, 121.5, 27.1, 40.3, 0.74, 31.8, 543.0], [6419, 5, 73.0, 22.74, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 3.84, 6.06, 1.77, 4.58, 406.0, 19.51, \"full scoring\", 86.94, 86.94, NaN, 68.0, 61.0, 61.0, 7.14, 64.5, 16.6, 11.7, 467.0], [6422, 5, 81.0, 24.87, \"no\", \"female\", \"white\", \"no\", \"yes\", 11.28, 15.31, 5.15, 10.86, 431.0, 16.15, \"full scoring\", 84.34, 84.34, NaN, 59.0, 55.0, 80.0, 11.3, 62.4, 2.44, 23.9, 511.0], [6424, 5, 69.0, 28.0, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 15.2, 18.02, 10.97, 13.94, 383.0, 11.91, \"full scoring\", 70.15, 70.15, NaN, 160.0, 79.0, 163.0, 10.7, 64.4, 0.26, 24.7, 546.0], [6430, 5, 58.0, 30.39, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 0.36, 1.42, 0.36, 1.42, 337.0, 6.05, \"full scoring\", 94.93, 94.93, NaN, 65.0, 59.0, 17.5, 4.9, 70.2, 1.19, 23.7, 355.0], [6431, 5, 67.0, 24.12, \"no\", \"male\", \"asian\", \"no\", \"yes\", 15.29, 19.61, 8.14, 14.63, 361.0, 13.96, \"full scoring\", 77.3, 89.8, 65.0, 95.0, 89.0, 41.0, 11.9, 63.2, 1.11, 23.7, 467.0], [6432, 5, 60.0, 44.35, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 92.88, 94.32, 74.64, 79.92, 250.0, 45.6, \"full scoring\", 65.96, 65.96, NaN, 268.0, 148.0, 128.5, 42.0, 48.4, 2.0, 7.6, 379.0], [6433, 5, 76.0, 38.2, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 12.3, 15.19, 7.44, 11.7, 395.0, 17.77, \"full scoring\", 73.15, 78.53, 37.0, 241.0, 171.0, 108.0, 17.6, 59.4, 8.11, 14.8, 540.0], [6435, 5, 70.0, 29.4, \"no\", \"female\", \"white\", \"no\", \"yes\", 2.92, 3.51, 0.97, 2.14, 308.0, 10.91, \"full scoring\", 84.85, 84.85, NaN, 231.0, 183.0, 55.0, 10.1, 59.2, 12.7, 18.0, 363.0], [6438, 5, 61.0, 40.44, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 4.48, 5.84, 0.97, 2.92, 308.0, 19.68, \"full scoring\", 71.96, 73.33, 8.0, 190.0, 162.0, 112.0, 10.9, 75.0, 5.36, 8.77, 428.0], [6440, 5, 85.0, 28.65, \"no\", \"male\", \"white\", \"no\", \"yes\", 29.18, 33.08, 17.36, 23.4, 477.0, 23.9, \"full scoring\", 81.68, 81.68, NaN, 89.0, 61.0, 106.5, 11.8, 61.8, 10.2, 16.1, 584.0], [6442, 5, 88.0, 23.93, \"no\", \"male\", \"white\", \"no\", \"yes\", 22.82, 23.85, 15.13, 17.95, 468.0, 14.36, \"full scoring\", 83.72, 83.72, NaN, 67.0, 49.0, 90.5, 10.1, 69.3, 3.31, 17.2, 559.0], [6444, 5, 63.0, 32.02, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 39.76, 42.93, 33.41, 38.54, 246.0, 26.83, \"full scoring\", 41.48, 55.28, 148.0, 243.0, 54.0, 199.0, 11.4, 37.9, 28.1, 22.6, 593.0], [6445, 5, 60.0, 45.31, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 11.67, 15.5, 9.48, 14.04, 329.0, 14.04, \"full scoring\", 95.92, 95.92, NaN, 48.0, 44.0, 12.5, 4.86, 53.6, 21.3, 20.2, 343.0], [6447, 5, 69.0, 32.57, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.33, 1.66, 0.17, 1.49, 362.0, 25.19, \"full scoring\", 67.16, 81.17, 93.0, 51.0, 51.0, 84.5, 9.25, 66.4, 8.7, 15.6, 539.0], [6450, 5, 67.0, 23.97, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 4.29, 10.22, 1.98, 8.9, 182.0, 17.14, \"full scoring\", 85.85, 85.85, NaN, 83.0, 59.0, 30.0, 10.2, 34.3, 26.4, 29.1, 212.0], [6452, 5, 75.0, 29.67, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 9.33, 16.57, 5.95, 14.64, 373.0, 28.47, \"full scoring\", 74.6, 74.6, NaN, 94.0, 50.0, 127.0, 17.3, 56.6, 6.57, 19.6, 500.0], [6454, 5, 65.0, 26.27, \"no\", \"male\", \"white\", \"not reported\", \"no\", 6.25, 7.81, 2.34, 5.16, 384.0, 19.06, \"full scoring\", 88.28, 89.51, 6.0, 71.0, 55.0, 44.5, 7.03, 65.1, 3.26, 24.6, 435.0], [6460, 5, 57.0, 29.76, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 1.03, 1.2, 0.34, 0.51, 350.0, 12.17, \"full scoring\", 94.85, 94.85, NaN, 82.0, 74.0, 18.5, 11.0, 61.2, 5.44, 22.3, 369.0], [6462, 5, 58.0, 29.0, \"no\", \"female\", \"white\", \"no\", \"yes\", 35.1, 37.87, 29.05, 33.72, 347.0, 30.26, \"full scoring\", 77.28, 88.52, 57.0, 64.0, 61.0, 45.5, 20.6, 38.8, 16.3, 24.4, 449.0], [6467, 5, 60.0, 26.65, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 10.98, 12.79, 5.25, 7.54, 366.0, 9.84, \"full scoring\", 76.41, 92.19, 82.0, 232.0, 224.0, 31.0, 8.07, 74.1, 0.0, 17.8, 479.0], [6471, 5, 62.0, 32.28, \"no\", \"female\", \"white\", \"no\", \"yes\", 9.74, 20.41, 5.88, 17.47, 388.0, 22.11, \"full scoring\", 87.78, 90.23, 12.0, 116.0, 102.0, 42.0, 22.9, 63.5, 0.64, 12.9, 442.0], [6475, 5, 63.0, 25.95, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 18.49, 27.15, 12.59, 24.2, 305.0, 31.67, \"full scoring\", 63.67, NaN, 4.0, 70.0, 59.0, 170.0, 12.3, 68.0, 3.28, 16.4, 479.0], [6476, 5, 83.0, 21.87, \"no\", \"female\", \"white\", \"no\", \"yes\", 0.6, 2.53, 0.15, 2.08, 403.0, 18.61, \"full scoring\", 89.96, 89.96, NaN, 104.0, 91.0, 44.5, 7.32, 58.6, 18.9, 15.3, 448.0], [6477, 5, 57.0, 41.1, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 45.35, 61.23, 33.16, 54.6, 389.0, 50.13, \"full scoring\", 81.04, 81.04, NaN, 135.0, 106.0, 90.5, 30.3, 58.4, 0.0, 11.3, 480.0], [6479, 5, 61.0, 28.65, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6482, 5, 72.0, 29.8, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 20.98, 22.78, 13.98, 18.95, 266.0, 22.56, \"full scoring\", 84.71, 94.66, 33.0, 92.0, 88.0, 15.5, 11.3, 55.8, 16.5, 16.4, 314.0], [6485, 5, 71.0, 29.62, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 64.16, 70.1, 56.14, 64.75, 202.0, 44.26, \"full scoring\", 46.87, 46.87, NaN, 125.0, 59.0, 229.0, 41.6, 43.6, 0.74, 14.1, 431.0], [6491, 5, 64.0, 26.46, \"no\", \"male\", \"white\", \"no\", \"yes\", 1.56, 8.91, 0.78, 8.59, 384.0, 23.13, \"full scoring\", 83.84, 83.84, NaN, 104.0, 66.0, 74.0, 7.16, 69.9, 2.99, 19.9, 458.0], [6492, 5, 88.0, 33.15, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 52.57, 53.94, 48.08, 50.42, 307.0, 28.34, \"full scoring\", 62.65, 62.65, NaN, 166.0, 102.0, 182.5, 32.9, 59.0, 0.0, 8.14, 490.0], [6493, 5, 61.0, 28.16, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 11.88, 15.84, 7.92, 13.1, 197.0, 25.89, \"full scoring\", 41.13, 43.11, 22.0, 53.0, 37.0, 259.5, 20.3, 59.6, 1.78, 18.3, 479.0], [6500, 5, 67.0, 20.16, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 1.1, 3.29, 1.1, 3.29, 492.0, 19.02, \"full scoring\", 76.16, 76.16, NaN, 194.0, 82.0, 153.5, 14.0, 62.0, 5.9, 18.1, 646.0], [6501, 5, 64.0, 30.13, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 4.19, 5.9, 1.71, 4.19, 315.0, 7.43, \"full scoring\", 63.0, 64.81, 14.0, 74.0, 65.0, 171.0, 6.67, 74.9, 1.9, 16.5, 500.0], [6502, 5, 74.0, 18.97, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 5.93, 8.44, 4.13, 7.01, 334.0, 22.63, \"full scoring\", 69.73, 83.08, 77.0, 81.0, 48.0, 68.0, 8.25, 59.7, 12.1, 19.9, 479.0], [6503, 5, 60.0, 22.03, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 4.5, 5.67, 2.0, 3.33, 360.0, 11.5, \"full scoring\", 75.16, 87.38, 67.0, 53.0, 53.0, 52.5, 3.61, 49.3, 19.9, 27.2, 479.0], [6505, 5, 63.0, 26.32, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 0.0, 6.83, 0.0, 6.83, 202.0, 31.78, \"full scoring\", 62.54, 76.52, 59.0, 95.0, 77.0, 61.5, 20.5, 64.9, 1.98, 12.6, 323.0], [6506, 5, 64.0, 31.54, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 85.95, 94.05, 74.59, 84.32, 37.0, 66.49, \"full scoring\", 9.02, 15.74, 175.0, 0.0, 0.0, 197.5, 28.4, 71.6, 0.0, 0.0, 410.0], [6509, 5, 76.0, 21.7, \"no\", \"female\", \"white\", \"not reported\", \"no\", 6.62, 10.03, 6.62, 10.03, 317.0, 17.41, \"full scoring\", 66.88, 72.21, 35.0, 166.0, 122.0, 122.5, 22.3, 64.6, 0.95, 12.2, 474.0], [6514, 5, 76.0, 26.15, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 7.52, 9.26, 4.24, 6.17, 311.0, 7.91, \"full scoring\", 90.14, 90.14, NaN, 0.0, 0.0, 33.5, 17.6, 82.0, 0.48, 0.0, 345.0], [6516, 5, 80.0, 26.58, \"no\", \"male\", \"white\", \"not reported\", \"no\", 25.67, 27.61, 15.37, 17.91, 402.0, 14.18, \"full scoring\", 75.0, 76.43, 10.0, 89.0, 76.0, 123.5, 7.46, 45.0, 23.4, 24.1, 536.0], [6521, 5, 76.0, 38.69, \"no\", \"male\", \"white\", \"not reported\", \"no\", 61.27, 63.02, 46.67, 49.37, 378.0, 20.16, \"full scoring\", 76.21, 76.21, NaN, 166.0, 153.0, 117.5, 15.1, 72.5, 0.0, 12.5, 496.0], [6527, 5, 59.0, 20.37, \"no\", \"female\", \"white\", \"no\", \"yes\", 1.11, 3.47, 0.16, 2.84, 380.0, 11.37, \"full scoring\", 71.83, 84.82, 81.0, 60.0, 55.0, 67.5, 10.5, 55.7, 12.9, 20.8, 529.0], [6528, 5, 60.0, 39.44, \"no\", \"female\", \"white\", \"no\", \"yes\", 29.5, 32.0, 11.0, 16.25, 240.0, 18.0, \"full scoring\", 42.18, 45.54, 42.0, 409.0, 126.0, 287.0, 19.2, 62.9, 7.92, 10.0, 569.0], [6538, 5, 82.0, 27.64, \"no\", \"male\", \"white\", \"no\", \"yes\", 77.72, 82.03, 65.06, 75.95, 237.0, 57.72, \"full scoring\", 41.51, 53.74, 130.0, 221.0, 112.0, 203.5, 24.5, 54.1, 11.2, 10.1, 571.0], [6549, 5, 65.0, 30.04, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 44.69, 48.91, 33.78, 40.65, 341.0, 33.26, \"full scoring\", 82.57, 86.99, 21.0, 48.0, 43.0, 51.0, 13.5, 52.6, 18.9, 15.0, 413.0], [6550, 5, 63.0, 25.18, \"no\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6557, 5, 58.0, 31.77, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 22.33, 33.36, 16.68, 30.67, 223.0, 30.67, \"full scoring\", 86.43, 86.43, NaN, 72.0, 50.0, 34.5, 8.31, 58.4, 13.9, 19.3, 258.0], [6566, 5, 77.0, 42.64, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 17.12, 22.98, 5.85, 15.37, 410.0, 30.88, \"full scoring\", 78.54, 78.54, NaN, 81.0, 64.0, 112.0, 7.33, 65.3, 13.4, 13.9, 522.0], [6567, 5, 70.0, 36.42, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 18.82, 24.9, 12.94, 22.16, 306.0, 46.67, \"full scoring\", 56.88, 70.83, 106.0, 191.0, 134.0, 126.0, 13.1, 81.7, 0.33, 4.91, 538.0], [6568, 5, 58.0, 39.63, \"no\", \"female\", \"white\", \"not reported\", \"no\", 21.13, 24.05, 15.55, 19.19, 247.0, 17.25, \"full scoring\", 70.98, 86.06, 61.0, 78.0, 77.0, 40.0, 6.07, 44.1, 35.4, 14.4, 348.0], [6569, 5, 76.0, 21.39, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6575, 5, 80.0, 21.7, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6577, 5, 71.0, 27.58, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 28.89, 34.29, 18.25, 27.62, 378.0, 32.7, \"full scoring\", 70.52, 74.7, 30.0, 8.0, 6.0, 127.5, 22.8, 55.2, 6.09, 15.9, 536.0], [6582, 5, 78.0, 24.8, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 19.39, 23.7, 12.43, 18.73, 362.0, 24.86, \"full scoring\", 82.09, 82.09, NaN, 115.0, 64.0, 79.0, 3.04, 47.6, 37.3, 12.0, 441.0], [6583, 5, 78.0, 28.64, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 15.86, 16.34, 12.72, 13.35, 382.0, 5.34, \"full scoring\", 89.46, 89.46, NaN, 109.0, 88.0, 44.5, 9.44, 65.5, 0.39, 24.6, 427.0], [6593, 5, 58.0, 27.38, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 3.38, 4.46, 1.85, 3.38, 390.0, 8.31, \"full scoring\", 86.28, 89.24, 15.0, 74.0, 69.0, 48.5, 8.34, 63.3, 8.22, 20.2, 452.0], [6599, 5, 68.0, 24.47, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 9.74, 10.74, 7.73, 9.02, 419.0, 22.34, \"full scoring\", 77.59, 77.59, NaN, 29.0, 23.0, 120.5, 24.5, 50.9, 2.39, 22.2, 540.0], [6607, 5, 70.0, 22.67, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 4.73, 8.8, 2.76, 7.48, 457.0, 20.09, \"full scoring\", 91.77, 91.77, NaN, 41.0, 29.0, 41.0, 5.04, 41.2, 33.4, 20.4, 498.0], [6610, 5, 74.0, 37.06, \"no\", \"female\", \"white\", \"no\", \"yes\", 24.09, 34.19, 6.67, 23.66, 279.0, 34.19, \"full scoring\", 52.84, 65.19, 100.0, 182.0, 100.0, 149.5, 7.35, 49.1, 23.1, 20.4, 528.0], [6614, 5, 77.0, 23.52, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 11.53, 16.36, 6.86, 13.09, 385.0, 18.86, \"full scoring\", 73.61, 73.61, NaN, 58.0, 55.0, 137.5, 16.5, 43.7, 25.0, 14.8, 523.0], [6616, 5, 74.0, 23.69, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 56.64, 57.52, 56.5, 57.37, 411.0, 15.18, \"full scoring\", 79.5, 84.22, 29.0, 114.0, 95.0, 77.0, 17.3, 60.0, 4.14, 18.6, 517.0], [6618, 5, 72.0, 27.0, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6619, 5, 69.0, 33.41, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 15.96, 21.27, 8.64, 15.46, 361.0, 24.93, \"full scoring\", 66.73, 70.51, 29.0, 97.0, 40.0, 151.0, 10.7, 53.0, 8.74, 27.6, 541.0], [6621, 5, 58.0, 23.3, \"no\", \"female\", \"white\", \"no\", \"yes\", 1.74, 3.84, 0.62, 3.1, 484.0, 14.63, \"full scoring\", 84.62, 93.08, 52.0, 53.0, 48.0, 35.5, 6.31, 55.5, 10.9, 27.3, 572.0], [6622, 5, 82.0, 31.72, \"no\", \"female\", \"white\", \"no\", \"yes\", 15.52, 21.2, 4.73, 12.11, 317.0, 25.93, \"full scoring\", 71.88, 71.88, NaN, 237.0, 118.0, 124.0, 13.9, 58.0, 9.95, 18.2, 441.0], [6625, 5, 80.0, 26.03, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6627, 5, 64.0, 38.69, \"no\", \"female\", \"white\", \"not reported\", \"no\", 9.56, 22.89, 8.22, 22.44, 270.0, 30.44, \"full scoring\", 83.33, 95.74, 42.0, 132.0, 126.0, 12.0, 21.3, 54.4, 3.71, 20.6, 324.0], [6629, 5, 78.0, 29.86, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 31.62, 32.65, 27.5, 28.97, 408.0, 15.0, \"full scoring\", 73.25, 73.25, NaN, 97.0, 67.0, 149.0, 7.48, 44.4, 23.1, 25.0, 557.0], [6630, 5, 77.0, 21.07, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 22.84, 28.84, 15.48, 24.97, 310.0, 24.19, \"full scoring\", 63.52, 63.52, NaN, 74.0, 61.0, 178.0, 7.26, 54.0, 11.5, 27.3, 488.0], [6632, 5, 83.0, 26.56, \"no\", \"female\", \"white\", \"no\", \"yes\", 36.8, 39.36, 27.04, 31.2, 375.0, 23.84, \"full scoring\", 81.52, 81.52, NaN, 88.0, 82.0, 84.5, 18.9, 56.8, 1.47, 22.8, 460.0], [6641, 5, 87.0, 29.11, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 16.96, 22.36, 12.3, 19.19, 322.0, 19.75, \"full scoring\", 67.51, 73.68, 40.0, 168.0, 106.0, 115.0, 17.4, 42.5, 20.2, 19.9, 477.0], [6646, 5, 73.0, 26.45, \"no\", \"male\", \"asian\", \"no\", \"yes\", 31.87, 34.45, 19.23, 23.83, 209.0, 21.53, \"full scoring\", 57.73, 57.73, NaN, 22.0, 21.0, 153.0, 20.6, 60.3, 5.02, 14.1, 362.0], [6648, 5, 66.0, 27.39, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 24.61, 28.47, 16.57, 21.88, 373.0, 13.35, \"full scoring\", 70.51, 81.09, 69.0, 50.0, 42.0, 87.5, 8.04, 51.9, 13.1, 26.9, 529.0], [6653, 5, 61.0, 27.93, \"no\", \"male\", \"white\", \"no\", \"yes\", 35.23, 37.16, 24.61, 29.12, 373.0, 22.04, \"full scoring\", 77.07, 80.04, 18.0, 332.0, 251.0, 93.5, 14.6, 74.0, 4.56, 6.85, 484.0], [6655, 5, 74.0, 39.52, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 40.88, 45.88, 26.47, 35.88, 204.0, 27.06, \"full scoring\", 44.84, 44.84, NaN, 33.0, 19.0, 250.5, 35.4, 46.4, 0.0, 18.2, 455.0], [6656, 5, 65.0, 25.08, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 36.74, 41.74, 24.78, 33.7, 276.0, 28.26, \"full scoring\", 64.94, 70.23, 32.0, 136.0, 95.0, 117.0, 19.2, 72.1, 0.54, 8.15, 425.0], [6657, 5, 57.0, 30.15, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 7.65, 22.71, 2.39, 18.88, 251.0, 32.27, \"full scoring\", 60.92, 74.04, NaN, 70.0, 66.0, 88.0, 13.9, 64.9, 3.78, 17.3, 412.0], [6663, 5, 68.0, 31.47, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 5.55, 11.32, 2.35, 9.61, 281.0, 17.08, \"full scoring\", 77.41, 77.41, NaN, 108.0, 64.0, 82.0, 15.3, 64.5, 4.1, 16.0, 363.0], [6671, 5, 58.0, 33.35, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 14.12, 18.66, 7.06, 14.45, 357.0, 25.71, \"full scoring\", 84.8, NaN, NaN, 93.0, 72.0, 64.0, 12.9, 45.9, 12.9, 28.3, 421.0], [6672, 5, 90.0, 24.59, \"yes\", \"male\", \"white\", \"not reported\", \"no\", 29.09, 34.34, 19.19, 27.07, 297.0, 20.81, \"full scoring\", 54.9, 54.9, NaN, 155.0, 74.0, 243.5, 17.2, 60.5, 10.8, 11.5, 541.0], [6680, 5, 69.0, 31.98, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 14.17, 15.46, 9.57, 11.96, 326.0, 16.2, \"full scoring\", 84.24, 88.83, 20.0, 65.0, 57.0, 41.0, 7.36, 44.9, 21.9, 25.8, 387.0], [6682, 5, 70.0, 23.11, \"no\", \"male\", \"white\", \"no\", \"yes\", 16.88, 20.94, 11.46, 18.23, 487.0, 25.26, \"full scoring\", 80.63, 80.63, NaN, 47.0, 39.0, 117.0, 16.0, 40.2, 23.8, 19.9, 604.0], [6685, 5, 69.0, 33.86, \"no\", \"male\", \"white\", \"no\", \"yes\", 24.63, 26.57, 21.82, 24.63, 341.0, 16.54, \"full scoring\", 63.27, 63.27, NaN, 179.0, 119.0, 198.0, 15.4, 65.1, 10.1, 9.4, 539.0], [6686, 5, 74.0, 34.14, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 22.63, 26.06, 7.54, 14.57, 350.0, 26.4, \"full scoring\", 80.83, 85.78, 25.0, 118.0, 104.0, 58.5, 15.7, 73.2, 1.57, 9.44, 433.0], [6693, 5, 62.0, 42.35, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 21.0, 22.42, 13.58, 15.16, 380.0, 9.63, \"full scoring\", 89.41, 89.41, NaN, 161.0, 140.0, 45.0, 5.8, 76.5, 1.58, 16.1, 425.0], [6695, 5, 55.0, 30.7, \"no\", \"male\", \"white\", \"not reported\", \"no\", 50.6, 55.55, 40.38, 48.13, 364.0, 33.46, \"full scoring\", 80.71, NaN, 18.0, 270.0, 208.0, 69.0, 10.9, 67.7, 9.35, 12.1, 451.0], [6697, 5, 65.0, 38.38, \"no\", \"male\", \"white\", \"not reported\", \"no\", 34.52, 38.06, 26.29, 32.58, 372.0, 26.29, \"full scoring\", 76.23, 83.97, 45.0, 134.0, 110.0, 71.0, 7.26, 47.4, 20.2, 25.1, 488.0], [6699, 5, 76.0, 36.68, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6704, 5, 86.0, 21.74, \"no\", \"male\", \"white\", \"not reported\", \"no\", 77.33, 81.23, 71.7, 78.41, 277.0, 52.42, \"full scoring\", 48.94, 48.94, NaN, 235.0, 95.0, 289.0, 31.5, 63.5, 0.0, 5.06, 566.0], [6707, 5, 82.0, 24.55, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 13.69, 17.3, 11.89, 16.4, 333.0, 24.32, \"full scoring\", 61.78, 72.55, 80.0, 112.0, 45.0, 126.5, 23.3, 71.6, 0.15, 4.96, 539.0], [6709, 5, 85.0, 35.68, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 25.88, 29.54, 21.07, 26.79, 262.0, 21.98, \"full scoring\", 83.97, 83.97, NaN, 56.0, 54.0, 49.5, 18.5, 61.5, 0.76, 19.3, 312.0], [6722, 5, 61.0, 33.1, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 8.26, 10.71, 4.65, 8.65, 465.0, 17.16, \"full scoring\", 89.94, 93.75, 21.0, 64.0, 56.0, 30.5, 9.04, 52.5, 14.4, 24.0, 517.0], [6723, 5, 58.0, 33.93, \"no\", \"male\", \"white\", \"not reported\", \"no\", 3.84, 7.9, 0.64, 5.98, 281.0, 24.77, \"full scoring\", 59.53, 76.57, 105.0, 68.0, 43.0, 86.5, 19.6, 55.5, 7.83, 17.1, 472.0], [6726, 5, 63.0, 43.24, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 80.62, 84.89, 74.86, 81.73, 323.0, 68.17, \"full scoring\", 78.97, 78.97, NaN, 59.0, 49.0, 85.5, 25.2, 51.1, 14.1, 9.6, 409.0], [6727, 5, 71.0, 28.55, \"no\", \"female\", \"white\", \"not reported\", \"no\", 8.86, 12.12, 4.82, 8.39, 386.0, 10.57, \"full scoring\", 71.88, 81.09, 61.0, 74.0, 70.0, 90.0, 5.44, 54.4, 19.9, 20.2, 537.0], [6730, 5, 60.0, 23.18, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.29, 0.71, 0.14, 0.57, 421.0, 13.68, \"full scoring\", 85.92, 85.92, NaN, 59.0, 31.0, 69.0, 10.6, 46.4, 25.8, 17.2, 490.0], [6734, 5, 61.0, 44.79, \"no\", \"female\", \"white\", \"no\", \"yes\", 79.76, 93.41, 61.62, 81.74, 334.0, 62.51, \"full scoring\", 74.39, 74.39, NaN, 222.0, 137.0, 114.5, 14.7, 73.5, 0.3, 11.5, 449.0], [6737, 5, 62.0, 24.18, \"no\", \"male\", \"white\", \"not reported\", \"no\", 10.02, 10.98, 3.71, 5.08, 437.0, 4.26, \"full scoring\", 91.23, 91.23, NaN, 57.0, 52.0, 42.0, 10.2, 63.7, 2.52, 23.6, 479.0], [6739, 5, 77.0, 21.01, \"no\", \"female\", \"white\", \"not reported\", \"no\", 11.59, 13.24, 8.28, 10.07, 435.0, 9.52, \"full scoring\", 86.14, 86.14, NaN, 28.0, 28.0, 70.0, 13.0, 64.5, 0.8, 21.7, 505.0], [6741, 5, 81.0, 21.79, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 44.1, 47.44, 40.26, 46.15, 234.0, 38.46, \"full scoring\", 48.85, 51.66, 26.0, 166.0, 69.0, 218.5, 50.3, 35.8, 0.0, 13.9, 479.0], [6746, 5, 71.0, 27.84, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 2.91, 3.25, 0.68, 1.37, 351.0, NaN, \"sleep/wake only\", 81.44, 81.44, NaN, NaN, NaN, 80.0, NaN, NaN, NaN, NaN, 431.0], [6751, 5, 68.0, 27.17, \"no\", \"male\", \"white\", \"no\", \"yes\", 9.5, 17.5, 2.88, 12.88, 480.0, 21.38, \"full scoring\", 88.07, 88.07, NaN, 208.0, 176.0, 65.0, 17.4, 62.5, 2.09, 18.0, 545.0], [6754, 5, 62.0, 30.35, \"no\", \"male\", \"white\", \"no\", \"yes\", 5.26, 12.92, 0.66, 8.76, 274.0, 23.21, \"full scoring\", 71.17, 75.9, 24.0, 133.0, 84.0, 87.0, 14.3, 51.7, 8.41, 25.6, 385.0], [6755, 5, 63.0, 25.21, \"no\", \"female\", \"white\", \"yes\", \"yes\", 18.47, 28.82, 10.79, 23.65, 406.0, 29.85, \"full scoring\", 84.76, 91.86, 37.0, 68.0, 67.0, 36.5, 23.8, 53.4, 4.8, 18.0, 479.0], [6756, 5, 71.0, 32.73, \"no\", \"female\", \"white\", \"no\", \"yes\", 39.77, 43.67, 32.79, 39.21, 430.0, 39.91, \"full scoring\", 78.32, 78.32, NaN, 147.0, 127.0, 119.0, 25.7, 48.3, 3.84, 22.2, 549.0], [6757, 5, 73.0, 33.98, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 3.64, 7.79, 1.82, 6.23, 231.0, 15.32, \"full scoring\", 74.28, 95.45, 69.0, 58.0, 56.0, 10.5, 12.1, 70.1, 4.12, 13.7, 311.0], [6759, 5, 63.0, 30.32, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 4.42, 5.21, 2.21, 3.32, 380.0, 12.0, \"full scoring\", 74.07, 74.07, NaN, 123.0, 62.0, 133.0, 3.42, 70.3, 12.5, 13.8, 513.0], [6773, 5, 60.0, 28.69, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 1.65, 3.29, 0.47, 2.35, 255.0, 10.82, \"full scoring\", 79.94, 89.47, 34.0, 30.0, 16.0, 30.0, 15.1, 60.8, 0.0, 24.1, 319.0], [6781, 5, 66.0, 29.02, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 24.54, 37.47, 16.51, 33.9, 269.0, 33.01, \"full scoring\", 56.16, 65.61, 69.0, 61.0, 57.0, 141.0, 11.2, 53.3, 15.3, 20.3, 479.0], [6783, 5, 85.0, 20.0, \"no\", \"female\", \"white\", \"not reported\", \"no\", 7.42, 12.33, 4.4, 10.69, 477.0, 23.77, \"full scoring\", 80.85, 89.49, 57.0, 136.0, 126.0, 56.0, 10.2, 60.2, 11.6, 17.9, 590.0], [6784, 5, 78.0, 25.94, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 16.52, 18.08, 12.62, 14.96, 385.0, 17.92, \"full scoring\", 83.15, 83.15, NaN, 82.0, 77.0, 77.5, 9.23, 59.7, 13.7, 17.4, 463.0], [6786, 5, 60.0, 34.7, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 13.35, 14.74, 9.36, 11.1, 346.0, 10.75, \"full scoring\", 77.75, 77.75, NaN, 84.0, 45.0, 99.0, 7.38, 68.9, 7.67, 16.1, 445.0], [6788, 5, 59.0, 42.28, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 8.16, 8.41, 4.52, 5.02, 478.0, 5.27, \"full scoring\", 75.75, 75.75, NaN, 100.0, 54.0, 153.0, 2.62, 45.0, 36.6, 15.7, 631.0], [6789, 5, 74.0, 29.9, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 21.38, 23.44, 15.94, 20.44, 320.0, 28.13, \"full scoring\", 65.71, 65.71, NaN, 137.0, 48.0, 167.0, 8.75, 70.3, 2.66, 18.3, 487.0], [6790, 5, 72.0, 28.07, \"no\", \"male\", \"white\", \"not reported\", \"no\", 22.12, 22.6, 14.32, 16.07, 377.0, 16.23, \"full scoring\", 70.07, NaN, NaN, 208.0, 177.0, 161.0, 12.2, 58.0, 9.03, 20.7, 538.0], [6792, 5, 62.0, 29.9, \"no\", \"male\", \"white\", \"no\", \"yes\", 30.75, 39.69, 21.8, 35.4, 322.0, 34.47, \"full scoring\", 72.52, 75.94, 20.0, 76.0, 57.0, 102.0, 41.1, 31.3, 2.33, 25.3, 444.0], [6795, 5, 63.0, 29.07, \"no\", \"female\", \"white\", \"not reported\", \"no\", 7.48, 9.2, 3.83, 6.33, 313.0, 10.73, \"full scoring\", 73.47, 90.99, 82.0, 86.0, 79.0, 30.5, 13.7, 52.4, 12.5, 21.4, 426.0], [6796, 5, 55.0, 28.7, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 8.52, 11.53, 3.93, 7.73, 458.0, 21.09, \"full scoring\", 90.34, 90.34, NaN, 70.0, 56.0, 49.0, 7.1, 69.8, 10.3, 12.9, 507.0], [6802, 5, 65.0, 43.31, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 9.58, 13.65, 6.83, 11.68, 457.0, 21.27, \"full scoring\", 88.05, 91.04, 17.0, 116.0, 97.0, 44.5, 10.5, 67.0, 7.77, 14.8, 519.0], [6804, 5, 77.0, 24.32, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 34.02, 35.77, 25.23, 28.37, 478.0, 18.2, \"full scoring\", 89.68, 92.1, 14.0, 84.0, 78.0, 41.5, 18.4, 60.9, 1.47, 19.2, 533.0], [6807, 5, 60.0, 28.32, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 48.24, 49.6, 43.42, 46.58, 398.0, 30.75, \"full scoring\", 79.28, 79.28, NaN, 192.0, 148.0, 103.5, 22.4, 60.6, 4.27, 12.8, 502.0], [6810, 5, 77.0, 30.47, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 25.84, 30.44, 15.58, 21.95, 339.0, 20.35, \"full scoring\", 67.53, 67.53, NaN, 79.0, 51.0, 163.0, 21.7, 57.6, 0.0, 20.7, 502.0], [6811, 5, 79.0, 27.73, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 34.24, 45.33, 29.18, 43.53, 368.0, 58.04, \"full scoring\", 69.57, 69.57, NaN, 152.0, 130.0, 161.0, 50.9, 33.7, 0.82, 14.6, 529.0], [6812, 5, 68.0, 27.02, \"no\", \"female\", \"hispanic\", \"yes\", \"yes\", 5.89, 11.16, 2.32, 9.26, 285.0, 18.53, \"full scoring\", 59.5, 76.41, 106.0, 120.0, 55.0, 87.5, 11.2, 59.4, 7.38, 22.0, 479.0]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"layout\": {\"topStart\": \"pageLength\", \"topEnd\": \"search\", \"bottomStart\": \"info\", \"bottomEnd\": \"paging\"}, \"order\": [], \"warn_on_selected_rows_not_rendered\": true, \"filtered_row_count\": 1934, \"fnInfoCallback\": function (oSettings, iStart, iEnd, iMax, iTotal, sPre) { return sPre + ' (<a href=\"https://mwouts.github.io/itables/downsampling.html\">downsampled</a> from 2,237x27 to 303x27 as maxBytes=64KB)'; }};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        \n",
       "        new DataTable(table, dt_args);\n",
       "    });\n",
       "</script>\n"
      ],
      "text/plain": [
       "      mesaid  examnumber  nsrr_age  nsrr_bmi nsrr_age_gt89 nsrr_sex  \\\n",
       "0          1           5      70.0     22.01            no   female   \n",
       "1          2           5      83.0     21.90            no   female   \n",
       "2          6           5      57.0     56.01            no   female   \n",
       "3         10           5      57.0     19.84            no     male   \n",
       "4         12           5      80.0     27.77            no     male   \n",
       "...      ...         ...       ...       ...           ...      ...   \n",
       "2232    6804           5      77.0     24.32            no   female   \n",
       "2233    6807           5      60.0     28.32            no     male   \n",
       "2234    6810           5      77.0     30.47            no     male   \n",
       "2235    6811           5      79.0     27.73            no     male   \n",
       "2236    6812           5      68.0     27.02            no   female   \n",
       "\n",
       "                      nsrr_race nsrr_current_smoker nsrr_ever_smoker  \\\n",
       "0                         white                  no              yes   \n",
       "1                         white        not reported               no   \n",
       "2                      hispanic                  no              yes   \n",
       "3                         white        not reported               no   \n",
       "4                         white        not reported               no   \n",
       "...                         ...                 ...              ...   \n",
       "2232  black or african american        not reported               no   \n",
       "2233                   hispanic                  no              yes   \n",
       "2234                   hispanic                  no              yes   \n",
       "2235                   hispanic                  no              yes   \n",
       "2236                   hispanic                 yes              yes   \n",
       "\n",
       "      nsrr_ahi_hp3u  ...  nsrr_ttlmefsp_f1  nsrr_ttllatsp_f1  \\\n",
       "0             18.14  ...             62.66              26.0   \n",
       "1              8.34  ...             86.37               NaN   \n",
       "2             62.51  ...             72.03               NaN   \n",
       "3             40.91  ...             55.28               NaN   \n",
       "4             27.47  ...             47.81              12.0   \n",
       "...             ...  ...               ...               ...   \n",
       "2232          34.02  ...             92.10              14.0   \n",
       "2233          48.24  ...             79.28               NaN   \n",
       "2234          25.84  ...             67.53               NaN   \n",
       "2235          34.24  ...             69.57               NaN   \n",
       "2236           5.89  ...             76.41             106.0   \n",
       "\n",
       "      nsrr_ttlprdsp_s1sr  nsrr_ttldursp_s1sr  nsrr_waso_f1 nsrr_pctdursp_s1  \\\n",
       "0                  124.0                67.0         205.5            19.70   \n",
       "1                   67.0                54.0          59.0             6.55   \n",
       "2                   78.0                21.0         139.0            19.70   \n",
       "3                    0.0                 0.0          89.0             9.13   \n",
       "4                  416.0               138.0         298.0            15.60   \n",
       "...                  ...                 ...           ...              ...   \n",
       "2232                84.0                78.0          41.5            18.40   \n",
       "2233               192.0               148.0         103.5            22.40   \n",
       "2234                79.0                51.0         163.0            21.70   \n",
       "2235               152.0               130.0         161.0            50.90   \n",
       "2236               120.0                55.0          87.5            11.20   \n",
       "\n",
       "      nsrr_pctdursp_s2  nsrr_pctdursp_s3  nsrr_pctdursp_sr  nsrr_tib_f1  \n",
       "0                 66.2              2.77              11.4        575.0  \n",
       "1                 48.4             20.90              24.2        433.0  \n",
       "2                 53.1             10.50              16.6        497.0  \n",
       "3                 57.5             33.30               0.0        199.0  \n",
       "4                 69.0              2.94              12.5        583.0  \n",
       "...                ...               ...               ...          ...  \n",
       "2232              60.9              1.47              19.2        533.0  \n",
       "2233              60.6              4.27              12.8        502.0  \n",
       "2234              57.6              0.00              20.7        502.0  \n",
       "2235              33.7              0.82              14.6        529.0  \n",
       "2236              59.4              7.38              22.0        479.0  \n",
       "\n",
       "[2237 rows x 27 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "harm_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['folder', 'id', 'display_name', 'description', 'type', 'units',\n",
       "       'domain', 'labels', 'calculation', 'commonly_used', 'forms'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "variables.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            cucmcn1c - Current participant consent for commercial use of data\n",
      "          examnumber - MESA exam number\n",
      "             gender1 - Gender of the participant\n",
      "              mesaid - MESA BioLINCC ID\n",
      "              race1c - Race/ethnicity of the participant\n",
      "              site5c - Site at Exam 5\n",
      "          sleepage5c - Participant Age at MESA Sleep Visit\n",
      "           sleepqsid - Sleep questionnaire staff ID\n",
      "               bmi5c - Body mass index\n",
      "               htcm5 - Height (cm)\n",
      "               wtlb5 - Weight (lbs)\n",
      "            avnn_fn5 - Normal-to-normal intervals, full night: Mean\n",
      "              hf_fn5 - Normal-to-normal intervals between 0.15 and 0.4 Hz, full night: Total spectral power\n",
      "             hfn_fn5 - Low frequency power, full night: Normalized ratio\n",
      "             ihr_fn5 - Instantaneous heart rate, full night: Average\n",
      "              lf_fn5 - Normal-to-normal intervals between 0.04 and 0.15 Hz, full night: Total spectral power\n",
      "           lf_hf_fn5 - Low frequency power / high frequency power, full night\n",
      "             lfn_fn5 - High frequency power, full night: Normalized ratio\n",
      "           nn_rr_fn5 - Consecutive normal-to-normal intervals / all inter-beat intervals, full night\n",
      "           pnn10_fn5 - Adjacent normal-to-normal intervals, full night: Percentage of differences > 10 ms\n",
      "           pnn20_fn5 - Adjacent normal-to-normal intervals, full night: Percentage of differences > 20 ms\n",
      "           pnn30_fn5 - Adjacent normal-to-normal intervals, full night: Percentage of differences > 30 ms\n",
      "           pnn40_fn5 - Adjacent normal-to-normal intervals, full night: Percentage of differences > 40 ms\n",
      "           pnn50_fn5 - Adjacent normal-to-normal intervals, full night: Percentage of differences > 50 ms\n",
      "           rmssd_fn5 - Adjacent normal-to-normal intervals, full night: Square root of the mean of the squares of differences\n",
      "           sdann_fn5 - Normal-to-normal intervals in all 5-minute segments, full night: Standard deviation of the averages\n",
      "            sdnn_fn5 - Normal-to-normal intervals, full night: Standard deviation\n",
      "         sdnnidx_fn5 - Normal-to-normal intervals in all 5-minute segments, full night: Mean of the standard deviations\n",
      "          totpwr_fn5 - Normal-to-normal intervals up to 0.04 Hz, full night: Total spectral power\n",
      "             ulf_fn5 - Normal-to-normal intervals up to 0.003 Hz, full night: Total spectral power\n",
      "             vlf_fn5 - Normal-to-normal intervals between 0.003 and 0.04 Hz (and between 0 and 0.04 Hz in 5-minute windows), full night:  Total spectral power\n",
      "            avnn_5m5 - Normal-to-normal intervals, non-overlapping windows: Mean\n",
      "              hf_5m5 - Normal-to-normal intervals between 0.15 and 0.4 Hz, non-overlapping windows: Total spectral power\n",
      "             hfn_5m5 - Low frequency power, non-overlapping windows: Normalized ratio\n",
      "             ihr_5m5 - Instantaneous heart rate, non-overlapping windows: Average\n",
      "              lf_5m5 - Normal-to-normal intervals between 0.04 and 0.15 Hz, non-overlapping windows: Total spectral power\n",
      "           lf_hf_5m5 - Low frequency power / high frequency power, non-overlapping windows\n",
      "             lfn_5m5 - High frequency power, non-overlapping windows: Normalized ratio\n",
      "           nn_rr_5m5 - Consecutive normal-to-normal intervals / all inter-beat intervals, non-overlapping windows\n",
      "           pnn10_5m5 - Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 10 ms\n",
      "           pnn20_5m5 - Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 20 ms\n",
      "           pnn30_5m5 - Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 30 ms\n",
      "           pnn40_5m5 - Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 40 ms\n",
      "           pnn50_5m5 - Adjacent normal-to-normal intervals, non-overlapping windows: Percentage of differences > 50 ms\n",
      "           rmssd_5m5 - Adjacent normal-to-normal intervals, non-overlapping windows: Square root of the mean of the squares of differences\n",
      "            sdnn_5m5 - Normal-to-normal intervals, non-overlapping windows: Standard deviation\n",
      "          totpwr_5m5 - Normal-to-normal intervals up to 0.04 Hz, non-overlapping windows: Total spectral power\n",
      "             vlf_5m5 - Normal-to-normal intervals between 0.003 and 0.04 Hz (and between 0 and 0.04 Hz in 5-minute windows), non-overlapping windows:  Total spectral power\n",
      "           extrahrs5 - Days per month working extra hours beyong usual schedule\n",
      "           wrksched5 - Usual work schedule\n",
      "            nsrr_bmi - Body mass index (BMI)\n",
      "            nsrr_age - Subject age\n",
      "       nsrr_age_gt89 - Indicates whether the subject's age (in years) used during date obfuscation is greater than 89 years\n",
      "           nsrr_race - Subject race\n",
      "            nsrr_sex - Subject sex\n",
      " nsrr_current_smoker - Currently smoking cigarettes\n",
      "    nsrr_ever_smoker - Ever smoked cigarettes\n",
      "nsrr_ahi_hp3r_aasm15 - Apnea-Hypopnea Index : (All apneas + hypopneas with >=30% nasal cannula [or alternative sensor] reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep \n",
      "       nsrr_ahi_hp3u - Apnea-Hypopnea Index : (All apneas + hypopneas with >= 3% oxygen desaturation) / hour of sleep \n",
      "       nsrr_ahi_hp4r - Apnea-Hypopnea Index : (All apneas + hypopneas with >= 4% oxygen desaturation or with arousal) / hour of sleep \n",
      "nsrr_ahi_hp4u_aasm15 - Apnea-Hypopnea Index : (All apneas + hypopneas with >=30% nasal cannula [or alternative sensor] reduction with >= 4% oxygen desaturation) / hour of sleep\n",
      "    nsrr_phrnumar_f1 - Arousal Index: Number of arousals per hour of sleep from polysomnography\n",
      "      nsrr_flag_spsw - Study scored sleep/wake rather than with full sleep staging if there is not sufficient quality on EEG lead. Studies scored as sleep wake have all sleep stages scored using a default of Stage 2 and no arousals are scored.  \n",
      "    nsrr_pctdursp_s1 - Percentage of total sleep duration (i.e., total sleep time, TST) in stage 1 from polysomnography\n",
      "    nsrr_pctdursp_s2 - Percentage of total sleep duration (i.e., total sleep time, TST) in stage 2 from polysomnography\n",
      "    nsrr_pctdursp_s3 - Percentage of total sleep duration (i.e., total sleep time, TST) in stage 3/4 from polysomnography\n",
      "    nsrr_pctdursp_sr - Percentage of total sleep duration (i.e., total sleep time, TST) in REM from polysomnography\n",
      "         nsrr_tib_f1 - Total In-bed Period: the interval between lights off/in-bed time and lights on/out-bed time from polysomnography\n",
      "         nsrr_tst_f1 - Total Sleep Duration: the interval between sleep onset and sleep offset while the participant is asleep from polysomnography\n",
      "  nsrr_ttldursp_s1sr - REM Sleep Latency: the interval between the first sleep epoch and REM sleep excluding wake\n",
      "    nsrr_ttleffsp_f1 - Sleep Efficiency: the ratio of total sleep duration (i.e., total sleep time) to in-bed period (i.e., time in bed) from polysomnography\n",
      "    nsrr_ttllatsp_f1 - Sleep Latency: the interval between lights-out/in-bed time and sleep onset from polysomnography\n",
      "    nsrr_ttlmefsp_f1 - Sleep Maintenance Efficiency: the proportion of total sleep duration (i.e., total sleep time) in sleep period (i.e., interval between sleep onset and offset including wake) from polysomnography\n",
      "  nsrr_ttlprdsp_s1sr - REM Sleep Latency: the interval between the first sleep epoch and REM sleep including wake\n",
      "        nsrr_waso_f1 - Wake After Sleep Onset: the total duration being awake between sleep onset and lights-on/out-bed time from polysomnography\n",
      "             cursmk5 - Smoked cigarettes in last 30 days\n",
      "            smkstat5 - Current smoking status\n",
      "       avg24hrsleep5 - Average daily total sleep duration in main sleep and naps combined in all days  from actigraphy\n",
      "     avg24hrsleepnw5 - Average daily total sleep duration in main sleep and naps combined in non-workdays  from actigraphy\n",
      "     avg24hrsleepwd5 - Average daily total sleep duration in main sleep and naps combined in weekdays  from actigraphy\n",
      "     avg24hrsleepwe5 - Average daily total sleep duration in main sleep and naps combined in weekends  from actigraphy\n",
      "     avg24hrsleepwo5 - Average daily total sleep duration in main sleep and naps combined in workdays  from actigraphy\n",
      "        avgbluetalt5 - Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\n",
      "      avgbluetaltnw5 - Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in non-workdays  from actigraphy\n",
      "      avgbluetaltwd5 - Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\n",
      "      avgbluetaltwe5 - Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\n",
      "      avgbluetaltwo5 - Average blue light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\n",
      "      avgefficiency5 - Average daily sleep efficiency in all days  from actigraphy\n",
      "    avgefficiencynw5 - Average daily sleep efficiency in non-workdays  from actigraphy\n",
      "    avgefficiencywd5 - Average daily sleep efficiency in weekdays  from actigraphy\n",
      "    avgefficiencywe5 - Average daily sleep efficiency in weekends  from actigraphy\n",
      "    avgefficiencywo5 - Average daily sleep efficiency in workdays  from actigraphy\n",
      "   avgfragmentation5 - Average daily total sleep fragmentation index in main sleep in all days  from actigraphy\n",
      " avgfragmentationnw5 - Average daily total sleep fragmentation index in main sleep in non-workdays  from actigraphy\n",
      " avgfragmentationwd5 - Average daily total sleep fragmentation index in main sleep in weekdays  from actigraphy\n",
      " avgfragmentationwe5 - Average daily total sleep fragmentation index in main sleep in weekends  from actigraphy\n",
      " avgfragmentationwo5 - Average daily total sleep fragmentation index in main sleep in workdays  from actigraphy\n",
      "       avggreentalt5 - Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\n",
      "     avggreentaltnw5 - Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods non-workdays  from actigraphy\n",
      "     avggreentaltwd5 - Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\n",
      "     avggreentaltwe5 - Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\n",
      "     avggreentaltwo5 - Average green light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\n",
      "   avginbedduration5 - Average daily duration of rest period in all days  from actigraphy\n",
      " avginbeddurationnw5 - Average daily duration of rest period in non-workdays  from actigraphy\n",
      " avginbeddurationwd5 - Average daily duration of rest period in weekdays  from actigraphy\n",
      " avginbeddurationwe5 - Average daily duration of rest period in weekends  from actigraphy\n",
      " avginbeddurationwo5 - Average daily duration of rest period in workdays  from actigraphy\n",
      "       avginbedtime5 - Average daily start time for rest period in all days  from actigraphy\n",
      "     avginbedtimenw5 - Average daily start time for rest period in non-workdays  from actigraphy\n",
      "     avginbedtimewd5 - Average daily start time for rest period in weekdays  from actigraphy\n",
      "     avginbedtimewe5 - Average daily start time for rest period in weekends  from actigraphy\n",
      "     avginbedtimewo5 - Average daily start time for rest period in workdays  from actigraphy\n",
      "       avginbedwake5 - Average daily duration of wake in bed in all days  from actigraphy\n",
      "     avginbedwakenw5 - Average daily duration of wake in bed in non-workdays  from actigraphy\n",
      "     avginbedwakewd5 - Average daily duration of wake in bed in weekdays  from actigraphy\n",
      "     avginbedwakewe5 - Average daily duration of wake in bed in weekends  from actigraphy\n",
      "     avginbedwakewo5 - Average daily duration of wake in bed in workdays  from actigraphy\n",
      "       avgmainsleep5 - Average daily total sleep duration in main sleep in all days  from actigraphy\n",
      "     avgmainsleepnw5 - Average daily total sleep duration in main sleep in non-workdays  from actigraphy\n",
      "     avgmainsleepwd5 - Average daily total sleep duration in main sleep in weekdays  from actigraphy\n",
      "     avgmainsleepwe5 - Average daily total sleep duration in main sleep in weekends  from actigraphy\n",
      "     avgmainsleepwo5 - Average daily total sleep duration in main sleep in workdays  from actigraphy\n",
      "        avgmainteff5 - Average daily sleep maintenance efficiency in all days  from actigraphy\n",
      "      avgmainteffnw5 - Average daily sleep maintenance efficiency in non-workdays  from actigraphy\n",
      "      avgmainteffwd5 - Average daily sleep maintenance efficiency in weekdays  from actigraphy\n",
      "      avgmainteffwe5 - Average daily sleep maintenance efficiency in weekends  from actigraphy\n",
      "      avgmainteffwo5 - Average daily sleep maintenance efficiency in workdays  from actigraphy\n",
      "        avgnnapsall5 - Average daily number of naps in all days  from actigraphy\n",
      "      avgnnapsallnw5 - Average daily number of naps in non-workdays  from actigraphy\n",
      "      avgnnapsallwd5 - Average daily number of naps in weekdays  from actigraphy\n",
      "      avgnnapsallwe5 - Average daily number of naps in weekends  from actigraphy\n",
      "      avgnnapsallwo5 - Average daily number of naps in workdays  from actigraphy\n",
      "    avgnnapssleep155 - Average daily number of naps (>= 15 minutes) in all days  from actigraphy\n",
      "  avgnnapssleep15nw5 - Average daily number of naps (>= 15 minutes) in non-workdays  from actigraphy\n",
      "  avgnnapssleep15wd5 - Average daily number of naps (>= 15 minutes) in weekdays  from actigraphy\n",
      "  avgnnapssleep15we5 - Average daily number of naps (>= 15 minutes) in weekends  from actigraphy\n",
      "  avgnnapssleep15wo5 - Average daily number of naps  (>= 15 minutes) in workdays  from actigraphy\n",
      "      avgnnapssleep5 - Average daily number of naps (with some sleep are counted) in all days  from actigraphy\n",
      "    avgnnapssleepnw5 - Average daily number of naps (with some sleep are counted) in non-workdays  from actigraphy\n",
      "    avgnnapssleepwd5 - Average daily number of naps (with some sleep are counted) in weekdays  from actigraphy\n",
      "    avgnnapssleepwe5 - Average daily number of naps (with some sleep are counted) in weekends  from actigraphy\n",
      "    avgnnapssleepwo5 - Average daily number of naps (with some sleep are counted) in workdays  from actigraphy\n",
      "    avgonsetlatency5 - Average daily sleep onset latency in all days  from actigraphy\n",
      "  avgonsetlatencynw5 - Average daily sleep onset latency in non-workdays  from actigraphy\n",
      "  avgonsetlatencywd5 - Average daily sleep onset latency in weekdays  from actigraphy\n",
      "  avgonsetlatencywe5 - Average daily sleep onset latency in weekends  from actigraphy\n",
      "  avgonsetlatencywo5 - Average daily sleep onset latency in workdays  from actigraphy\n",
      "      avgoutbedtime5 - Average daily end time for rest period in all days  from actigraphy\n",
      "    avgoutbedtimenw5 - Average daily end time for rest period in non-workdays  from actigraphy\n",
      "    avgoutbedtimewd5 - Average daily end time for rest period in weekdays  from actigraphy\n",
      "    avgoutbedtimewe5 - Average daily end time for rest period in weekends  from actigraphy\n",
      "    avgoutbedtimewo5 - Average daily end time for rest period in workdays  from actigraphy\n",
      "         avgredtalt5 - Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\n",
      "       avgredtaltnw5 - Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in non-workdays  from actigraphy\n",
      "       avgredtaltwd5 - Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\n",
      "       avgredtaltwe5 - Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\n",
      "       avgredtaltwo5 - Average red light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\n",
      "    avgrestmidpoint5 - Average daily midpoint for rest period in main sleep in all days  from actigraphy\n",
      "  avgrestmidpointnw5 - Average daily midpoint for rest period in main sleep in non-workdays  from actigraphy\n",
      "  avgrestmidpointwd5 - Average daily midpoint for rest period in main sleep in weekdays  from actigraphy\n",
      "  avgrestmidpointwe5 - Average daily midpoint for rest period in main sleep in weekends  from actigraphy\n",
      "  avgrestmidpointwo5 - Average daily midpoint for rest period in main sleep in workdays  from actigraphy\n",
      "      avgsleepbouts5 - Average daily number of sleep bouts in main sleep in all days  from actigraphy\n",
      "    avgsleepboutsnw5 - Average daily number of sleep bouts in main sleep in non-workdays  from actigraphy\n",
      "    avgsleepboutswd5 - Average daily number of sleep bouts in main sleep in weekdays  from actigraphy\n",
      "    avgsleepboutswe5 - Average daily number of sleep bouts in main sleep in weekends  from actigraphy\n",
      "    avgsleepboutswo5 - Average daily number of sleep bouts in main sleep in workdays  from actigraphy\n",
      "   avgsleepmidpoint5 - Average daily midpoint for sleep period in all days  from actigraphy\n",
      " avgsleepmidpointnw5 - Average daily midpoint for sleep period in non-workdays  from actigraphy\n",
      " avgsleepmidpointwd5 - Average daily midpoint for sleep period in weekdays  from actigraphy\n",
      " avgsleepmidpointwe5 - Average daily midpoint for sleep period in weekends  from actigraphy\n",
      " avgsleepmidpointwo5 - Average daily midpoint for sleep period in workdays  from actigraphy\n",
      " avgsleepnapdaily155 - Average daily total sleep duration in naps (>= 15 minutes) in all days  from actigraphy\n",
      "avgsleepnapdaily15nw5 - Average daily total sleep duration in naps (>= 15 minutes) in non-workdays  from actigraphy\n",
      "avgsleepnapdaily15wd5 - Average daily total sleep duration in naps (>= 15 minutes) in weekdays  from actigraphy\n",
      "avgsleepnapdaily15we5 - Average daily total sleep duration in naps (>= 15 minutes) in all weekends  from actigraphy\n",
      "avgsleepnapdaily15wo5 - Average daily total sleep duration in naps (>= 15 minutes) in workdays  from actigraphy\n",
      "   avgsleepnapdaily5 - Average daily total sleep duration in naps (with some sleep are counted) in all days  from actigraphy\n",
      " avgsleepnapdailyrd5 - Average daily total sleep duration in naps (with some sleep are counted) in non-workdays  from actigraphy\n",
      " avgsleepnapdailywd5 - Average daily total sleep duration in naps (with some sleep are counted) in weekdays  from actigraphy\n",
      " avgsleepnapdailywe5 - Average daily total sleep duration in naps (with some sleep are counted) in all weekends  from actigraphy\n",
      " avgsleepnapdailywo5 - Average daily total sleep duration in naps (with some sleep are counted) in workdays  from actigraphy\n",
      "    avgsleepnapsall5 - Average sleep duration per nap in all days  from actigraphy\n",
      "  avgsleepnapsallnw5 - Average sleep duration per nap in non-workdays  from actigraphy\n",
      "  avgsleepnapsallwd5 - Average sleep duration per nap in weekdays  from actigraphy\n",
      "  avgsleepnapsallwe5 - Average sleep duration per nap in weekends  from actigraphy\n",
      "  avgsleepnapsallwo5 - Average sleep duration per nap in workdays  from actigraphy\n",
      "avgsleepnapssleep155 - Average sleep duration per nap (>= 15 minutes) in all days  from actigraphy\n",
      "avgsleepnapssleep15nw5 - Average sleep duration per nap (>= 15 minutes) in non-workdays  from actigraphy\n",
      "avgsleepnapssleep15wd5 - Average sleep duration per nap (>= 15 minutes) in weekdays  from actigraphy\n",
      "avgsleepnapssleep15we5 - Average sleep duration per nap (>= 15 minutes) in weekends  from actigraphy\n",
      "avgsleepnapssleep15wo5 - Average sleep duration per nap (>= 15 minutes) in workdays  from actigraphy\n",
      "  avgsleepnapssleep5 - Average sleep duration per nap (with some sleep are counted) in all days  from actigraphy\n",
      "avgsleepnapssleepnw5 - Average sleep duration per nap (with some sleep are counted) in non-workdays  from actigraphy\n",
      "avgsleepnapssleepwd5 - Average sleep duration per nap (with some sleep are counted) in weekdays  from actigraphy\n",
      "avgsleepnapssleepwe5 - Average sleep duration per nap (with some sleep are counted) in weekends  from actigraphy\n",
      "avgsleepnapssleepwo5 - Average sleep duration per nap (with some sleep are counted) in workdays  from actigraphy\n",
      " avgsleepoffsettime5 - Average daily sleep offset time in all days  from actigraphy\n",
      "avgsleepoffsettimenw5 - Average daily sleep offset time in non-workdays  from actigraphy\n",
      "avgsleepoffsettimewd5 - Average daily sleep offset time in weekdays  from actigraphy\n",
      "avgsleepoffsettimewe5 - Average daily sleep offset time in weekends  from actigraphy\n",
      "avgsleepoffsettimewo5 - Average daily sleep offset time in workdays  from actigraphy\n",
      "  avgsleeponsettime5 - Average daily sleep onset time in all days  from actigraphy\n",
      "avgsleeponsettimenw5 - Average daily sleep onset time in non-workdays  from actigraphy\n",
      "avgsleeponsettimewd5 - Average daily sleep onset time in weekdays  from actigraphy\n",
      "avgsleeponsettimewe5 - Average daily sleep onset time in weekends  from actigraphy\n",
      "avgsleeponsettimewo5 - Average daily sleep onset time in workdays  from actigraphy\n",
      "avgsleepperiodduration5 - Average daily sleep period in all days  from actigraphy\n",
      "avgsleepperioddurationnw5 - Average daily sleep period in non-workdays  from actigraphy\n",
      "avgsleepperioddurationwd5 - Average daily sleep period in weekdays  from actigraphy\n",
      "avgsleepperioddurationwe5 - Average daily sleep period in weekends  from actigraphy\n",
      "avgsleepperioddurationwo5 - Average daily sleep period in workdays  from actigraphy\n",
      "          avgsnooze5 - Average daily duration of wake after sleep offset in all days  from actigraphy\n",
      "        avgsnoozenw5 - Average daily duration of wake after sleep offset in non-workdays  from actigraphy\n",
      "        avgsnoozewd5 - Average daily duration of wake after sleep offset in weekdays  from actigraphy\n",
      "        avgsnoozewe5 - Average daily duration of wake after sleep offset in weekends  from actigraphy\n",
      "        avgsnoozewo5 - Average daily duration of wake after sleep offset in workdays  from actigraphy\n",
      "       avgwakebouts5 - Average daily number of wake bouts in main sleep in all days  from actigraphy\n",
      "     avgwakeboutsnw5 - Average daily number of wake bouts in main sleep in non-workdays  from actigraphy\n",
      "     avgwakeboutswd5 - Average daily number of wake bouts in main sleep in weekdays  from actigraphy\n",
      "     avgwakeboutswe5 - Average daily number of wake bouts in main sleep in weekends  from actigraphy\n",
      "     avgwakeboutswo5 - Average daily number of wake bouts in main sleep in workdays  from actigraphy\n",
      "            avgwaso5 - Average daily duration of wake after sleep onset (waso) in all days  from actigraphy\n",
      "          avgwasonw5 - Average daily duration of wake after sleep onset (waso) in non-workdays  from actigraphy\n",
      "          avgwasowd5 - Average daily duration of wake after sleep onset (waso) in weekdays  from actigraphy\n",
      "          avgwasowe5 - Average daily duration of wake after sleep onset (waso) in weekends  from actigraphy\n",
      "          avgwasowo5 - Average daily duration of wake after sleep onset (waso) in workdays  from actigraphy\n",
      "       avgwhitetalt5 - Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in all days  from actigraphy\n",
      "     avgwhitetaltnw5 - Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in non-workdays  from actigraphy\n",
      "     avgwhitetaltwd5 - Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekdays  from actigraphy\n",
      "     avgwhitetaltwe5 - Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in weekends  from actigraphy\n",
      "     avgwhitetaltwo5 - Average whte light time above 1,000 microwatts per square centimeter threshold over 24-hour periods in workdays  from actigraphy\n",
      "      diarycomplete5 - Actigraphy QS: Diary Completeness\n",
      "       diarypresent5 - Actigraphy QS: Diary Present\n",
      "         dstoverlap5 - Study Overlaps With Daylight Saving Time Start (March) Or End (November)\n",
      "        epochlength5 - Original Epoch Length For Processed Actigraphy Study  (Seconds)\n",
      "              ndays5 - Total number of days with sleep data in the entire actigraphy recording period in all days  from actigraphy\n",
      "       ndaysnapsall5 - Total number of days with naps in the entire actigraphy recording period in all days  from actigraphy\n",
      "     ndaysnapsallnw5 - Total number of days with naps in the entire actigraphy recording period in non-workdays  from actigraphy\n",
      "     ndaysnapsallwd5 - Total number of days with naps in the entire actigraphy recording period in weekdays  from actigraphy\n",
      "     ndaysnapsallwe5 - Total number of days with naps in the entire actigraphy recording period in weekends  from actigraphy\n",
      "     ndaysnapsallwo5 - Total number of days with naps in the entire actigraphy recording period in workdays  from actigraphy\n",
      "   ndaysnapssleep155 - Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in all days  from actigraphy\n",
      " ndaysnapssleep15nw5 - Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in non-workdays  from actigraphy\n",
      " ndaysnapssleep15wd5 - Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in weekdays  from actigraphy\n",
      " ndaysnapssleep15we5 - Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in weekends  from actigraphy\n",
      " ndaysnapssleep15wo5 - Total number of days with naps (>= 15 minutes) in the entire actigraphy recording period in workdays  from actigraphy\n",
      "     ndaysnapssleep5 - Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in all days  from actigraphy\n",
      "   ndaysnapssleepnw5 - Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in non-workdays  from actigraphy\n",
      "   ndaysnapssleepwd5 - Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in weekdays  from actigraphy\n",
      "   ndaysnapssleepwe5 - Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in weekends  from actigraphy\n",
      "   ndaysnapssleepwo5 - Total number of days with naps (with some sleep are counted) in the entire actigraphy recording period in workdays  from actigraphy\n",
      "            ndaysnw5 - Total number of days with sleep data in the entire actigraphy recording period in non-workdays  from actigraphy\n",
      "            ndayswd5 - Total number of days with sleep data in the entire actigraphy recording period in weekdays  from actigraphy\n",
      "            ndayswe5 - Total number of days with sleep data in the entire actigraphy recording period in weekends  from actigraphy\n",
      "            ndayswo5 - Total number of days with sleep data in the entire actigraphy recording period in workdays  from actigraphy\n",
      "      nightsinvalid5 - Actigraphy QS: # of Invalid Nights\n",
      "          nightsrec5 - Actigraphy QS: # of Nights Recorded\n",
      "        nightsvalid5 - Actigraphy QS: # of Valid Nights\n",
      "        overallqual5 - Actigraphy QS: Overall Quality Grading (QS)\n",
      "        sd24hrsleep5 - Standard deviation of daily total sleep duration in main sleep and naps combined in all days  from actigraphy\n",
      "      sd24hrsleepnw5 - Standard deviation of daily total sleep duration in main sleep and naps combined in non-workdays  from actigraphy\n",
      "      sd24hrsleepwd5 - Standard deviation of daily total sleep duration in main sleep and naps combined in weekdays  from actigraphy\n",
      "      sd24hrsleepwe5 - Standard deviation of daily total sleep duration in main sleep and naps combined in weekends  from actigraphy\n",
      "      sd24hrsleepwo5 - Standard deviation of daily total sleep duration in main sleep and naps combined in workdays  from actigraphy\n",
      "       sdefficiency5 - Standard deviation of the daily sleep efficiency in all days  from actigraphy\n",
      "     sdefficiencynw5 - Standard deviation of the daily sleep efficiency in non-workdays  from actigraphy\n",
      "     sdefficiencywd5 - Standard deviation of the daily sleep efficiency in weekdays  from actigraphy\n",
      "     sdefficiencywe5 - Standard deviation of the daily sleep efficiency in weekends  from actigraphy\n",
      "     sdefficiencywo5 - Standard deviation of the daily sleep efficiency in workdays  from actigraphy\n",
      "    sdinbedduration5 - Standard deviation of daily rest period in all days  from actigraphy\n",
      "  sdinbeddurationnw5 - Standard deviation of daily rest period in non-workdays  from actigraphy\n",
      "  sdinbeddurationwd5 - Standard deviation of daily rest period in weekdays  from actigraphy\n",
      "  sdinbeddurationwe5 - Standard deviation of daily rest period in weekends  from actigraphy\n",
      "  sdinbeddurationwo5 - Standard deviation of daily rest period in workdays  from actigraphy\n",
      "        sdinbedtime5 - Standard deviation of the daily start time for rest period in all days  from actigraphy\n",
      "      sdinbedtimenw5 - Standard deviation of the daily start time for rest period in non-workdays  from actigraphy\n",
      "      sdinbedtimewd5 - Standard deviation of the daily start time for rest period in weekdays  from actigraphy\n",
      "      sdinbedtimewe5 - Standard deviation of the daily start time for rest period in weekends  from actigraphy\n",
      "      sdinbedtimewo5 - Standard deviation of the daily start time for rest period in workdays  from actigraphy\n",
      "        sdmainsleep5 - Standard deviation of daily total sleep duration in main sleep in all days  from actigraphy\n",
      "      sdmainsleepnw5 - Standard deviation of daily total sleep duration in main sleep in non-workdays  from actigraphy\n",
      "      sdmainsleepwd5 - Standard deviation of daily total sleep duration in main sleep in weekdays  from actigraphy\n",
      "      sdmainsleepwe5 - Standard deviation of daily total sleep duration in main sleep in weekends  from actigraphy\n",
      "      sdmainsleepwo5 - Standard deviation of daily total sleep duration in main sleep in workdays  from actigraphy\n",
      "         sdmainteff5 - Standard deviation of the daily sleep maintenance efficiency in all days  from actigraphy\n",
      "       sdmainteffnw5 - Standard deviation of the daily sleep maintenance efficiency in non-workdays  from actigraphy\n",
      "       sdmainteffwd5 - Standard deviation of the daily sleep maintenance efficiency in weekdays  from actigraphy\n",
      "       sdmainteffwe5 - Standard deviation of the daily sleep maintenance efficiency in weekends  from actigraphy\n",
      "       sdmainteffwo5 - Standard deviation of the daily sleep maintenance efficiency in workdays  from actigraphy\n",
      "       sdoutbedtime5 - Standard deviation of the daily end time for rest period in all days  from actigraphy\n",
      "     sdoutbedtimenw5 - Standard deviation of the daily end time for rest period in non-workdays  from actigraphy\n",
      "     sdoutbedtimewd5 - Standard deviation of the daily end time for rest period in weekdays  from actigraphy\n",
      "     sdoutbedtimewe5 - Standard deviation of the daily end time for rest period in weekends  from actigraphy\n",
      "     sdoutbedtimewo5 - Standard deviation of the daily end time for rest period in workdays  from actigraphy\n",
      "     sdrestmidpoint5 - Standard deviation of the daily midpoint for rest period in main sleep in all days  from actigraphy\n",
      "   sdrestmidpointnw5 - Standard deviation of the daily midpoint for rest period in main sleep in non-workdays  from actigraphy\n",
      "   sdrestmidpointwd5 - Standard deviation of the daily midpoint for rest period in main sleep in weekdays  from actigraphy\n",
      "   sdrestmidpointwe5 - Standard deviation of the daily midpoint for rest period in main sleep in weekends  from actigraphy\n",
      "   sdrestmidpointwo5 - Standard deviation of the daily midpoint for rest period in main sleep in workdays  from actigraphy\n",
      "    sdsleepmidpoint5 - Standard deviation of the daily midpoint for sleep period in all days  from actigraphy\n",
      "  sdsleepmidpointnw5 - Standard deviation of the daily midpoint for sleep period in non-workdays  from actigraphy\n",
      "  sdsleepmidpointwd5 - Standard deviation of the daily midpoint for sleep period in weekdays  from actigraphy\n",
      "  sdsleepmidpointwe5 - Standard deviation of the daily midpoint for sleep period in weekends  from actigraphy\n",
      "  sdsleepmidpointwo5 - Standard deviation of the daily midpoint for sleep period in workdays  from actigraphy\n",
      "  sdsleepoffsettime5 - Standard deviation of daily sleep offset time in all days  from actigraphy\n",
      "sdsleepoffsettimenw5 - Standard deviation of daily sleep offset time in non-workdays  from actigraphy\n",
      "sdsleepoffsettimewd5 - Standard deviation of daily sleep offset time in weekdays  from actigraphy\n",
      "sdsleepoffsettimewe5 - Standard deviation of daily sleep offset time in weekends  from actigraphy\n",
      "sdsleepoffsettimewo5 - Standard deviation of daily sleep offset time in workdays  from actigraphy\n",
      "   sdsleeponsettime5 - Standard deviation of the daily sleep onset time in all days  from actigraphy\n",
      " sdsleeponsettimenw5 - Standard deviation of the daily sleep onset time in non-workdays  from actigraphy\n",
      " sdsleeponsettimewd5 - Standard deviation of the daily sleep onset time in weekdays  from actigraphy\n",
      " sdsleeponsettimewe5 - Standard deviation of the daily sleep onset time in weekends  from actigraphy\n",
      " sdsleeponsettimewo5 - Standard deviation of the daily sleep onset time in workdays  from actigraphy\n",
      "sdsleepperiodduration5 - Standard deviation of daily sleep period in all days  from actigraphy\n",
      "sdsleepperioddurationnw5 - Standard deviation of daily sleep period in non-workdays  from actigraphy\n",
      "sdsleepperioddurationwd5 - Standard deviation of daily sleep period in weekdays  from actigraphy\n",
      "sdsleepperioddurationwe5 - Standard deviation of daily sleep period in weekends  from actigraphy\n",
      "sdsleepperioddurationwo5 - Standard deviation of daily sleep period in workdays  from actigraphy\n",
      "       sleepjournal5 - Actigraphy QS: Sleep Journal Received\n",
      "           stdyady5c - Actigraphy QS: Days From Exam 5 To Study Date\n",
      "            timeend5 - Actigraphy QS: Data Collection End Time\n",
      "          timestart5 - Actigraphy QS: Data Collection Start Time\n",
      "            haveact5 - MESA Sleep: Has Actigraphy Data (5+ Valid Nights) from type II polysomnography\n",
      "            havepsg5 - MESA Sleep: Has PSG Data (Passed Overnight Study) from type II polysomnography\n",
      "              match5 - MESA Sleep: PSG/Actigraphy Start Dates Match (I.E. No Failures; Tests Were Concurrent) from type II polysomnography\n",
      "           scorerid5 - PSG Report: Scorer ID from type II polysomnography\n",
      "           stdypdy5c - PSG QS: Days From Exam 5 To Study Date from type II polysomnography\n",
      "         ahi4p_nrem5 - Apnea-Hypopnea Index (NREM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of NREM sleep from type II polysomnography\n",
      "         ahi4p_nsup5 - Apnea-Hypopnea Index (Non-Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\n",
      "          ahi4p_rem5 - Apnea-Hypopnea Index (REM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of REM sleep from type II polysomnography\n",
      "          ahi4p_sup5 - Apnea-Hypopnea Index (Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in supine position from type II polysomnography\n",
      "        ahi4pa_nrem5 - Apnea-Hypopnea Index (NREM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of NREM sleep from type II polysomnography\n",
      "        ahi4pa_nsup5 - Apnea-Hypopnea Index (Non-Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in non-supine position from type II polysomnography\n",
      "         ahi4pa_rem5 - Apnea-Hypopnea Index (REM): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of REM sleep from type II polysomnography\n",
      "         ahi4pa_sup5 - Apnea-Hypopnea Index (Supine): (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in supine position from type II polysomnography\n",
      "            ahi_a0h3 - Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "           ahi_a0h3a - Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "            ahi_a0h4 - Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "           ahi_a0h4a - Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "            ahi_c0h3 - Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "           ahi_c0h3a - Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "            ahi_c0h4 - Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "           ahi_c0h4a - Central Apnea-Hypopnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "            ahi_o0h3 - Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "           ahi_o0h3a - Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "            ahi_o0h4 - Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "           ahi_o0h4a - Obstructive Apnea-Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "              ahiu35 - Apnea-Hypopnea Index: (Apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "              cai0p5 - Central Apnea Index: (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep from type II polysomnography\n",
      "         cai0p_nrem5 - Central Apnea Index (NREM): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep from type II polysomnography\n",
      "         cai0p_nsup5 - Central Apnea Index (Non-Supine): (Central apeneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\n",
      "          cai0p_rem5 - Central Apnea Index (REM): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep from type II polysomnography\n",
      "          cai0p_sup5 - Central Apnea Index (Supine): (Central apeneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep in supine position from type II polysomnography\n",
      "              cai4p5 - Central Apnea Index: (Central apneas with >= 4% oxygen desaturation threshold used and with or without arousal) / hour of sleep  from type II polysomnography\n",
      "             cai4pa5 - Central Apnea Index: (Central apneas with >= 4% oxygen desaturation threshold used or with arousal) / hour of sleep  from type II polysomnography\n",
      "           cardnba35 - Central Apnea Index (NREM, Supine): (Central apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "            cardnba5 - Central Apnea Index (NREM, Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "            cardnbp5 - Central Apnea Index (NREM, Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "           cardnoa35 - Central Apnea Index (NREM, Non-Supine): (Central apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "            cardnoa5 - Central Apnea Index (NREM, Non-Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "            cardnop5 - Central Apnea Index (NREM, Non-Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "           cardrba35 - Central Apnea Index (REM, Supine): (Central apneas with >= 3% oxygen desaturation threshold or with arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "            cardrba5 - Central Apnea Index (REM, Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "            cardrbp5 - Central Apnea Index (REM, Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "           cardroa35 - Central Apnea Index (REM, Non-Supine): (Central apneas with >= 3% oxygen desaturation or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "            cardroa5 - Central Apnea Index (REM, Non-Supine): (Central apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "            cardrop5 - Central Apnea Index (REM, Non-Supine): (Central apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "             hunrbp5 - Hypopnea Index (NREM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "           hunrbpa35 - Hypopnea Index (NREM, Supine): (Hypopneas with > 50% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "            hunrbpa5 - Hypopnea Index (NREM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "             hunrop5 - Hypopnea Index (NREM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "           hunropa35 - Hypopnea Index (NREM, Non-Supine): (Hypopneas with > 50% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "            hunropa5 - Hypopnea Index (NREM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "             hurbp25 - Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and >= 2% oxygen desaturation and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "              hurbp5 - Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "            hurbpa35 - Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "             hurbpa5 - Hypopnea Index (REM, Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "              hurop5 - Hypopnea Index (REM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "            huropa35 - Hypopnea Index (REM, Non-Supine): (Hypopneas with > 50% flow reduction and >= 3%oxygen desaturation or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "             huropa5 - Hypopnea Index (REM, Non-Supine): (Hypopneas with > 50% flow reduction and no oxygen desaturation threshold used or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "              oahi35 - Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and no oxygen desaturation threshold used and with or without arousal) / hour of sleep from type II polysomnography\n",
      "         oahi3_nrem5 - Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of NREM sleep from type II polysomnography\n",
      "         oahi3_nsup5 - Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\n",
      "          oahi3_rem5 - Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of REM sleep from type II polysomnography\n",
      "          oahi3_sup5 - Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation and with or without arousal) / hour of sleep in supine position from type II polysomnography\n",
      "            oahi3pa5 - Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "       oahi3pa_nrem5 - Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of NREM sleep from type II polysomnography\n",
      "       oahi3pa_nsup5 - Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep in non-supine position from type II polysomnography\n",
      "        oahi3pa_rem5 - Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of REM sleep from type II polysomnography\n",
      "        oahi3pa_sup5 - Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 3% oxygen desaturation or with arousal) / hour of sleep in supine position from type II polysomnography\n",
      "              oahi45 - Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "         oahi4_nrem5 - Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of NREM sleep from type II polysomnography\n",
      "         oahi4_nsup5 - Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in non-supine position from type II polysomnography\n",
      "          oahi4_rem5 - Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of REM sleep from type II polysomnography\n",
      "          oahi4_sup5 - Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation and with or without arousal) / hour of sleep in supine position from type II polysomnography\n",
      "            oahi4pa5 - Obstructive Apnea Hypopnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep from type II polysomnography\n",
      "       oahi4pa_nrem5 - Obstructive Apnea Hypopnea Index (NREM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of NREM sleep from type II polysomnography\n",
      "       oahi4pa_nsup5 - Obstructive Apnea Hypopnea Index (Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in non-supine position from type II polysomnography\n",
      "        oahi4pa_rem5 - Obstructive Apnea Hypopnea Index (REM): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of REM sleep from type II polysomnography\n",
      "        oahi4pa_sup5 - Obstructive Apnea Hypopnea Index (Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with > 30% flow reduction and >= 4% oxygen desaturation or with arousal) / hour of sleep in supine position from type II polysomnography\n",
      "              oai0p5 - Obstructive Apnea Index: (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of sleep from type II polysomnography\n",
      "              oai4p5 - Obstructive Apnea Index: (Obstructive apneas with >= 4% oxygen desaturation and with or without arousal) / hour of sleep from type II polysomnography\n",
      "           oardnba35 - Obstructive Apnea Index (NREM, Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "            oardnba5 - Obstructive Apnea Index (NREM, Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "            oardnbp5 - Obstructive Apnea Index (NREM, Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in supine position from type II polysomnography\n",
      "           oardnoa35 - Obstructive Apnea Index (NREM, Non-Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "            oardnoa5 - Obstructive Apnea Index (NREM, Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "            oardnop5 - Obstructive Apnea Index (NREM, Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of NREM sleep in non-supine position from type II polysomnography\n",
      "           oardrba35 - Obstructive Apnea Index (REM, Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "            oardrba5 - Obstructive Apnea Index (REM, Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "            oardrbp5 - Obstructive Apnea Index (REM, Supine): (obstructive apneas with no oxygen desaturation threshold used and with or without arousal) / hour of REM sleep in supine position from type II polysomnography\n",
      "           oardroa35 - Obstructive Apnea Index (REM, Non-Supine): (Obstructive apneas with >= 3% oxygen desaturation or with arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "            oardroa5 - Obstructive Apnea Index (REM, Non-Supine): (Obstructive apneas with no oxygen desaturation threshold used only with arousal) / hour of REM sleep in non-supine position from type II polysomnography\n",
      "           ahnrembp5 - Arousal Index (NREM, Supine): Number of arousals per hour of NREM sleep in supine position from type II polysomnography\n",
      "           ahnremop5 - Arousal Index (NREM, Non-Supine): Number of arousals per hour of NREM sleep in non-supine position from type II polysomnography\n",
      "            ahrembp5 - Arousal Index (REM, Supine): Number of arousals per hour of REM sleep in supine position from type II polysomnography\n",
      "            ahremop5 - Arousal Index (REM, Non-Supine): Number of arousals per hour of REM sleep in non-supine position from type II polysomnography\n",
      "             ai_all5 - Arousal Index: Number of arousals per hour of sleep from type II polysomnography\n",
      "            ai_nrem5 - Arousal Index (NREM): Number of arousals per hour of NREM sleep from type II polysomnography\n",
      "             ai_rem5 - Arousal Index (REM): Number of arousals per hour of REM sleep from type II polysomnography\n",
      "           arnrembp5 - Total number of arousals during NREM sleep in supine position from type II polysomnography\n",
      "           arnremop5 - Total number of arousals during NREM sleep in non-supine position from type II polysomnography\n",
      "            arrembp5 - Total number of arousals during REM sleep in supine position from type II polysomnography\n",
      "            arremop5 - Total number of arousals during REM sleep in non-supine position from type II polysomnography\n",
      "             bpmavg5 - Average heart rate during total sleep duration from type II polysomnography\n",
      "             bpmmax5 - Maximum heart rate during total sleep duration from type II polysomnography\n",
      "             bpmmin5 - Minimum heart rate during total sleep duration from type II polysomnography\n",
      "            avgnplm5 - Number of periodic limb movements per hour of NREM sleep from type II polysomnography\n",
      "             avgplm5 - Number of periodic limb movements per hour of sleep from type II polysomnography\n",
      "            avgplma5 - Number of periodic limb movements with arousals per hour of sleep from type II polysomnography\n",
      "            avgrplm5 - Number of periodic limb movements per hour of REM sleep from type II polysomnography\n",
      "              noplm5 - Total number of periodic limb movements during total sleep duration from type II polysomnography\n",
      "            plmaslp5 - Number of periodic limb movements with arousal during total sleep duration from type II polysomnography\n",
      "             avdnbp5 - Average level of oxygen desaturation during NREM sleep in supine position from type II polysomnography\n",
      "             avdnop5 - Average level of oxygen desaturation during NREM sleep in non-supine position from type II polysomnography\n",
      "             avdrbp5 - Average level of oxygen desaturation during REM sleep in supine position from type II polysomnography\n",
      "             avdrop5 - Average level of oxygen desaturation during REM sleep in non-supine position from type II polysomnography\n",
      "             avgsat5 - Average level of oxygen saturation during total sleep duration from type II polysomnography\n",
      "           avsao2nh5 - Average level of oxygen saturation during NREM sleep from type II polysomnography\n",
      "           avsao2rh5 - Average level of oxygen saturation during REM sleep from type II polysomnography\n",
      "              dsnr25 - Number of oxygen desaturations with >= 2% desat per hour of NREM sleep from type II polysomnography\n",
      "              dsnr35 - Number of oxygen desaturations with >= 3% desat per hour of NREM sleep from type II polysomnography\n",
      "              dsnr45 - Number of oxygen desaturations with >= 4% desat per hour of NREM sleep from type II polysomnography\n",
      "              dsnr55 - Number of oxygen desaturations with >= 5% desat per hour of NREM sleep from type II polysomnography\n",
      "             dsrem25 - Number of oxygen desaturations with >= 2% desat per hour of REM sleep from type II polysomnography\n",
      "             dsrem35 - Number of oxygen desaturations with >= 3% desat per hour of REM sleep from type II polysomnography\n",
      "             dsrem45 - Number of oxygen desaturations with >= 4% desat per hour of REM sleep from type II polysomnography\n",
      "             dsrem55 - Number of oxygen desaturations with >= 5% desat per hour of REM sleep from type II polysomnography\n",
      "            dssao905 - Total number of oxygen desaturations with < 90% desat during total sleep duration from type II polysomnography\n",
      "             minsat5 - Minimum oxygen saturation during total sleep duration from type II polysomnography\n",
      "             mndnbp5 - Minimum oxygen saturation during NREM sleep in supine position from type II polysomnography\n",
      "             mndnop5 - Minimum oxygen saturation during NREM sleep in non-supine position from type II polysomnography\n",
      "             mndrbp5 - Minimum oxygen saturation during REM sleep in supine position from type II polysomnography\n",
      "             mndrop5 - Minimum oxygen saturation during REM sleep in non-supine position from type II polysomnography\n",
      "           mnsao2nh5 - Minimum oxygen saturation during NREM sleep from type II polysomnography\n",
      "           mnsao2rh5 - Minimum oxygen saturation during REM sleep from type II polysomnography\n",
      "             mxdnbp5 - Maximum oxygen desaturation during NREM sleep in supine position from type II polysomnography\n",
      "             mxdnop5 - Maximum oxygen desaturation during NREM sleep in non-supine position from type II polysomnography\n",
      "             mxdrbp5 - Maximum oxygen desaturation during REM sleep in supine position from type II polysomnography\n",
      "             mxdrop5 - Maximum oxygen desaturation during REM sleep in non-supine position from type II polysomnography\n",
      "           mxsao2nh5 - Maximum oxygen saturation during NREM sleep from type II polysomnography\n",
      "           mxsao2rh5 - Maximum oxygen saturation during REM sleep from type II polysomnography\n",
      "            ndes2ph5 - Total number of oxygen desaturations with >= 2% desat during total sleep duration from type II polysomnography\n",
      "            ndes3ph5 - Total number of oxygen desaturations with >= 3% desat during total sleep duration from type II polysomnography\n",
      "            ndes4ph5 - Total number of oxygen desaturations with >= 4% desat during total sleep duration from type II polysomnography\n",
      "            ndes5ph5 - Total number of oxygen desaturations with >= 5% desat during total sleep duration from type II polysomnography\n",
      "               odi35 - Oxygen Desaturation Index: Oxygen desaturation with >= 3% desat per hour of sleep from type II polysomnography\n",
      "               odi45 - Oxygen Desaturation Index: Oxygen desaturation with >= 4% desat per hour of sleep from type II polysomnography\n",
      "            pctle925 - Percent of total sleep duration with < 92% oxygen saturation from type II polysomnography\n",
      "            pctlt755 - Percent total sleep duration with below 75% oxygen saturation from type II polysomnography\n",
      "            pctlt805 - Percent total sleep duration with below 80% oxygen saturation from type II polysomnography\n",
      "            pctlt855 - Percent total sleep duration with below 85% oxygen saturation from type II polysomnography\n",
      "            pctlt905 - Percent total sleep duration with below 90% oxygen saturation from type II polysomnography\n",
      "           pctsa80h5 - Percent total sleep duration with below 80% oxygen saturation from type II polysomnography\n",
      "           pctsa85h5 - Percent total sleep duration with below 85% oxygen saturation from type II polysomnography\n",
      "           pctsa90h5 - Percent total sleep duration with below 90% oxygen saturation from type II polysomnography\n",
      "           pctsa95h5 - Percent total sleep duration with below 95% oxygen saturation from type II polysomnography\n",
      "           sao2nrem5 - Average level of oxygen saturation during NREM sleep from type II polysomnography\n",
      "            sao2rem5 - Average level of oxygen saturation during REM sleep from type II polysomnography\n",
      "                 lgn - Overall instability (NREM)\n",
      "             apnea35 - Total number of apneas with >= 3% oxygen desaturation and with or without arousal during sleep from type II polysomnography\n",
      "      cent_obs_ratio - Ratio of the number of central apneas with no oxygen desaturation threshold used and with or without arousal to the number of obstructive apneas with no oxygen desaturation threshold used and with or without arousal from type II polysomnography\n",
      "     cent_obs_ratioa - Ratio of the number of central apneas with no oxygen desaturation threshold used or without arousal to the number of obstructive apneas with no oxygen desaturation threshold used or with arousal from type II polysomnography\n",
      "              oarop5 - Total number of obstructive apneas with no oxygen desaturation threshold used and with or without arousal during REM sleep in non-supine position from type II polysomnography\n",
      "           apavgdur5 - Average length of apnea with no oxygen desaturation threshold used and with or without arousal during sleep from type II polysomnography\n",
      "            cavgdur5 - Average length of central apneas with no oxygen desaturation threshold used and with or without arousal during sleep from type II polysomnography\n",
      "            havgdur5 - Average length of hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\n",
      "           hbavgdur5 - Average length of hypopneas with > 30% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\n",
      "             longap5 - Maximum length of apneas with no oxygen desaturation threshold used an with or without arousal from type II polysomnography\n",
      "            longhyp5 - Maximum length of hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\n",
      "           longhypb5 - Maximun length of hypopneas with > 30% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\n",
      "            oavgdur5 - Average length of obstructive apneas with no oxygen desaturation threshold and with or without arousal from type II polysomnography\n",
      "          pcohb3slp5 - Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal + hypopneas with > 30% flow reduction and > 3% oxygen desaturation and with or without arousal) from type II polysomnography\n",
      "        pcohb3waslp5 - Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal + hypopneas with > 30% flow reduction and > 3% oxygen desaturation or with arousal) from type II polysomnography\n",
      "         pcohbwaslp5 - Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal + hypopneas with > 30% flow reduction and with no oxygen desaturation threhold or with arousal) from type II polysomnography\n",
      "             pcoslp5 - Percentage of total sleep duration with apneas with no oxygen desaturation threshold used and with or without arousal from type II polysomnography\n",
      "           pcstah3d5 - Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with 30 - 50% flow reduction and >= 3% oxygen desaturation and with or without arousal) from type II polysomnography\n",
      "           pcstahar5 - Percent total sleep duration with apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used or with arousal from type II polysomnography\n",
      "           pcstahda5 - Percentage of total sleep duration: (apneas with no oxygen desaturation threshold used and with or without arousal+ hypopneas with 30 - 50% flow reduction and >= 3% oxygen desaturation or with arousal) from type II polysomnography\n",
      "           pctsthyp5 - Percentage of total sleep duration with hypopneas with 30 - 50% flow reduction and no oxygen desaturation threshold used and with or without arousal from type II polysomnography\n",
      "             phbslp5 - Percentage of total sleep duration with hypopneas with > 30% flow reduction and with no oxygen desaturation threhold or with arousal from type II polysomnography\n",
      "            abdodur5 - Abdo Signal Duration (Hours) from type II polysomnography\n",
      "           abnoreeg5 - Abnormal Awake EEG from type II polysomnography\n",
      "            ahiov505 - Abnormal Referral - AHI> 50 from type II polysomnography\n",
      "             airdur5 - Airflow Signal Duration (Hours) from type II polysomnography\n",
      "             alpdel5 - Physiologic Alpha Intrusion from type II polysomnography\n",
      "           apnhyppr5 - Scoring Apnea/Hypopnea Unreliable from type II polysomnography\n",
      "            arsl3ou5 - Arousal Index < 3 Verified from type II polysomnography\n",
      "            arunrel5 - Scoring Arousals Unreliable from type II polysomnography\n",
      "              c4dur5 - Cz-Oz Signal Duration (Hours)  EEG from type II polysomnography\n",
      "            casndur5 - Cannula Snore Signal Duration (Hours) from type II polysomnography\n",
      "           chestdur5 - Chest Signal Duration (Hours) from type II polysomnography\n",
      "            chindur5 - Chin (Lchin-Cchin)  Signal Duration (Hours) from type II polysomnography\n",
      "              e1dur5 - E1 (Eogl) Signal Duration (Hours) from type II polysomnography\n",
      "              e2dur5 - E2 (Eogr) Signal Duration (Hours) from type II polysomnography\n",
      "             ecgdur5 - ECG Signal Duration (Hours) from type II polysomnography\n",
      "                fpz5 - Signal Quality Issues Found On Fpz Signal from type II polysomnography\n",
      "            fzm1dur5 - Fz-Cz  Signal Duration (Hours)   EEG from type II polysomnography\n",
      "        inhomepsgyn5 - PSG: Test Was Conducted In-Home  1=Yes from type II polysomnography\n",
      "          lagbreath5 - Periodic Large Breaths from type II polysomnography\n",
      "            lighoff5 - PSG QS: Participant Reported Time To Bed from type II polysomnography\n",
      "            limbdur5 - Limb Signal Duration (Hours) from type II polysomnography\n",
      "             losbeg5 - Data Lost At Beginning Of Study from type II polysomnography\n",
      "             losend5 - Data Lost At End Of Study from type II polysomnography\n",
      "             losoth5 - Data Lost During Study from type II polysomnography\n",
      "                 m15 - Signal Quality Issues Found On M1 Signal from type II polysomnography\n",
      "           maxresou5 - Long Respiratory Events Verified from type II polysomnography\n",
      "             npflow5 - Flow Limitation from type II polysomnography\n",
      "            o2m1dur5 - C4-M1 Signal Duration (Hours)  EEG from type II polysomnography\n",
      "            overall5 - Overall Study Quality Grade from type II polysomnography\n",
      "            oximdur5 - Spo2 Signal Duration (Hours) from type II polysomnography\n",
      "             period5 - Periodic Breathing >=10 Min from type II polysomnography\n",
      "           plethdur5 - Pleth Signal Duration (Hours) from type II polysomnography\n",
      "              plmou5 - PLM > 100 Verified from type II polysomnography\n",
      "            plmwake5 - Leg Movements In Wake from type II polysomnography\n",
      "               posn5 - Signal Quality Issues Found On Position Signal from type II polysomnography\n",
      "             quabdo5 - Abdo Signal Quality from type II polysomnography\n",
      "              quair5 - Airflow Signal Quality from type II polysomnography\n",
      "               quc45 - Cz-Oz Signal Quality-EEG Mismatched Variable Name And Label. Confirmed As \"Cz-Oz\" Signal from type II polysomnography\n",
      "             qucasn5 - Cannula Snore Signal Quality from type II polysomnography\n",
      "            quchest5 - Chest Signal Quality from type II polysomnography\n",
      "             quchin5 - Chin Signal Quality from type II polysomnography\n",
      "               que15 - E1 Signal Quality from type II polysomnography\n",
      "               que25 - E2 Signal Quality from type II polysomnography\n",
      "              quecg5 - ECG Signal Quality from type II polysomnography\n",
      "             qufzm15 - Fz-Cz Signal Quality - EEG -  Mismatched Variable Name And Label. Confirmed As \"Fz-Cz\" Signal from type II polysomnography\n",
      "             qulimb5 - Limb Signal Quality from type II polysomnography\n",
      "             quo2m15 - C4-M1 Signal Quality-EEG Mismatched Variable Name And Label. Confirmed As \"C4-M1\" Signal from type II polysomnography\n",
      "             quoxim5 - Spo2 Signal Quality from type II polysomnography\n",
      "            qupleth5 - Pleth Signal Quality from type II polysomnography\n",
      "            quxflow5 - Cannula Flow Signal Quality from type II polysomnography\n",
      "            recbeaw5 - Data Lost - Recording Ended Before Wake from type II polysomnography\n",
      "                ref5 - Signal Quality Issues Found On Reference / Ground Signal from type II polysomnography\n",
      "         remarunrel5 - Scoring Arousals In REM (Only) Unreliable from type II polysomnography\n",
      "          remnrempr5 - Scoring REM/NREM Unreliable from type II polysomnography\n",
      "           respevpr5 - Scoring Respiratory Events (RDI) Unreliable from type II polysomnography\n",
      "              rsnco5 - Reason For Study Failure from type II polysomnography\n",
      "           sao2lt855 - Urgent Referral - O2sat < 85% For >10% Total Sleep Time from type II polysomnography\n",
      "             scorid5 - PSG QS: Scorer ID from type II polysomnography\n",
      "            slewake5 - Study Scored Sleep / Wake Only (All Sleep Scored As N2 And No Arousals Scored Due To Poor Quality EEG) from type II polysomnography\n",
      "         status_psg5 - Pass/Fail Status from type II polysomnography\n",
      "         stg1stg2pr5 - Scoring Stage1/Stage2 Unreliable from type II polysomnography\n",
      "         stg2stg3pr5 - Scoring Stage2/Deep Sleep Unreliable from type II polysomnography\n",
      "            svpulse5 - Manual Pulse At Time Of Hookup From Sv Form from type II polysomnography\n",
      "             svspo25 - Spo2 From Signal Verification Form - Reading At Time Of Hookup from type II polysomnography\n",
      "          unuhrou4a5 - Urgent Referral - Unusual HR: 2nd Or 3rd Degree Block from type II polysomnography\n",
      "          unuhrou4b5 - Urgent Referral - Unusual HR: Acute St Segment from type II polysomnography\n",
      "          unuhrou4c5 - Urgent Referral - Unusual HR: Nsvt 3-Beat Run from type II polysomnography\n",
      "          unuhrou4d5 - Urgent Referral - Unusual HR: HR Above 150 BPM For >= 2 Min from type II polysomnography\n",
      "          unuhrou4e5 - Urgent Referral - Unusual HR: HR < 30 BPM For >= 2 Min from type II polysomnography\n",
      "          unuhrou4f5 - Urgent Referral - Unusual HR: Other from type II polysomnography\n",
      "            unuhrou5 - Urgent Referral - Unusual HR/ECG (Categorical) from type II polysomnography\n",
      "           unustgou5 - Unusual Staging from type II polysomnography\n",
      "           wakslepr5 - Scoring Stage Wake/Sleep Unreliable from type II polysomnography\n",
      "           xflowdur5 - Cannula Flow Signal Duration (Hours) from type II polysomnography\n",
      "           nsupinep5 - Percentage of total sleep duration in non-supine position from type II polysomnography\n",
      "           rem_lat15 - REM Latency I: the interval between sleep onset and first REM (including wake) from type II polysomnography\n",
      "           remlaiip5 - REM Latency II: the interval between sleep onset and first REM while asleep (excluding wake) from type II polysomnography\n",
      "            slp_eff5 - Sleep Efficiency: the proportion of total sleep duration in in-bed period from type II polysomnography\n",
      "            slp_lat5 - Sleep Latency: the interval between lights-out/in-bed time and sleep onset time from type II polysomnography\n",
      "      slp_maint_eff5 - Sleep Maintenance Efficiency: the proportion of sleep duration in sleep period  from type II polysomnography\n",
      "            slpprdp5 - Total Sleep Duration: the interval between sleep onset and sleep offset while the participant is asleep from type II polysomnography\n",
      "             stdurm5 - Total Recording Period: the interval between recording start and end time from type II polysomnography\n",
      "             stendp5 - Clock time when the recording (study) ends from type II polysomnography\n",
      "             stlonp5 - Clock time when the participant is out of bed or lights are on from type II polysomnography\n",
      "            stloutp5 - Clock time when the participant is in bed or lights are out from type II polysomnography\n",
      "           stonsetp5 - Sleep onset time from type II polysomnography\n",
      "           ststartp5 - Clock time when the recording (study) begins from type II polysomnography\n",
      "            supinep5 - Percentage of total sleep duration in supine position from type II polysomnography\n",
      "           time_bed5 - Total In-bed Period: the interval between lights out/in-bed time and lights off/out-bed time from type II polysomnography\n",
      "            timerem5 - Total duration of REM sleep from type II polysomnography\n",
      "           timeremp5 - Percentage of total sleep duration in REM from type II polysomnography\n",
      "           times34p5 - Percentage of total sleep duration in Stage 3 and 4 from type II polysomnography\n",
      "            timest15 - Total duration of Stage 1 sleep from type II polysomnography\n",
      "           timest1p5 - Percentage of total sleep duration in Stage 1 from type II polysomnography\n",
      "            timest25 - Total duration of Stage 2 sleep from type II polysomnography\n",
      "           timest2p5 - Percentage of total sleep duration in Stage 2 from type II polysomnography\n",
      "           timest345 - Total duration of Stage 3 and 4 sleep from type II polysomnography\n",
      "               waso5 - Wake after Sleep Onset: the total duration between sleep onset and sleep offset time while being awake from type II polysomnography\n",
      "        feelngbstpk5 - Horne-Ostberg Morningness-Eveningness Questionnaire: Time of day reaching \"feeling best\" peak\n",
      "         feelngbstr5 - Horne-Ostberg Morningness-Eveningness Questionnaire: Ideal scheduled wake time\n",
      "          hoostmeq5c - Modified Horne-Ostberg Morningness-Eveningness Questionnaire (MEQ) Score\n",
      "          mosttired4 - Horne-Ostberg Morningness-Eveningness Questionnaire: Time of evening you need sleep\n",
      "              tired5 - Horne-Ostberg Morningness-Eveningness Questionnaire: Tiredness during first half-hour after waking\n",
      "              types5 - Horne-Ostberg Morningness-Eveningness Questionnaire: Morning or evening type\n",
      "                car5 - Epworth Sleepiness Scale: Chance of dozing while in a car, while stopped for a few minutes in traffic\n",
      "            lyngdwn5 - Epworth Sleepiness Scale: Chance of dozing while lying down in the afternoon when circumstances permit\n",
      "            quietly5 - Epworth Sleepiness Scale: Chance of dozing while sitting quietly after lunch without alcohol\n",
      "             readng5 - Epworth Sleepiness Scale: Chance of dozing while sitting and reading\n",
      "             riding5 - Epworth Sleepiness Scale: Chance of dozing as a passenger in a car for an hour without a break\n",
      "             sittng5 - Epworth Sleepiness Scale: Chance of dozing while sitting, inactive in a public place\n",
      "             talkng5 - Epworth Sleepiness Scale: Chance of dozing while sitting and talking to someone\n",
      "                 tv5 - Epworth Sleepiness Scale: Chance of dozing while watching TV\n",
      "             dinner5 - Chance of dozing while at dinner table\n",
      "            driving5 - Chance of dozing while driving\n",
      "          epslpscl5c - Epworth Sleepiness Scale: Total score\n",
      "             sleepy5 - Frequency of excessive sleepiness during the day in the last 4 weeks\n",
      "        legsdscmfrt5 - Experience desire to move legs because of discomfort or disagreeable sensations in legs\n",
      "          rubbnglgs5 - Feel need to move to relieve discomfort by walking or rub legs\n",
      "            wrseltr5 - Symptoms worse later in day or night\n",
      "           wrserest5 - Symptoms worse when at rest with temporary relief by activity\n",
      "            insmnia5 - Insomnia: Self-reported diagnosis by a physician\n",
      "         rstlesslgs5 - Restless Legs: Self-reported diagnosis by a physician\n",
      "           slpapnea5 - Sleep Apnea: Self-reported diagnosis by a physician\n",
      "             snored5 - Frequency of snoring in the past 4 weeks\n",
      "          stpbrthng5 - Frequency of breathing-stop during sleep in the past 4 weeks\n",
      "           bcksleep5 - Women's Health Initiative Insomnia Rating Scale: Trouble getting back to sleep after waking too early\n",
      "         trbleslpng5 - Women's Health Initiative Insomnia Rating Scale: Trouble falling asleep\n",
      "         typicalslp5 - Women's Health Initiative Insomnia Rating Scale: Typical night sleep\n",
      "          wakeearly5 - Women's Health Initiative Insomnia Rating Scale: Wake earlier than planned\n",
      "             wakeup5 - Women's Health Initiative Insomnia Rating Scale: Wake several times at night\n",
      "          irritable5 - Frequency of irritability due to sleep difficulties in the last 4 weeks\n",
      "         slpngpills5 - Frequency of taking sleeping pills to help with sleep in the last 4 weeks\n",
      "            whiirs5c - Women's Health Initiative Insomnia Rating Scale: Total score\n",
      "        bedtmwkday5c - Self-reported start time of the in-bed period on weekdays in 24-hour format\n",
      "        bedtmwkend5c - Self-reported start time of the in-bed period on weekends in 24-hour format\n",
      "                nap5 - Typical number of naps in a usual week from survey questionnaires\n",
      "       waketmwkday5c - Self-reported end time of the in-bed period on weekdays in 24-hour format from survey questionnaires\n",
      "       waketmwkend5c - Self-reported end time of the in-bed period on weekends in 24-hour format from survey questionnaires\n",
      "     wkdaysleepdur5c - Self-reported daily sleep duration on weekdays from survey questionnaires\n",
      "     wkdaysleepdur5t - Self-reported daily sleep duration on weekdays from survey questionnaires\n",
      "     wkendsleepdur5c - Self-reported daily sleep duration on weekends from survey questionnaires\n",
      "     wkendsleepdur5t - Self-reported daily sleep duration on weekends from survey questionnaires\n",
      "               cpap5 - CPAP or BiPAP Machine for Sleep Apnea: Self-reported\n",
      "            dntaldv5 - Dental (Oral) Device for Sleep Apnea: Self-reported\n",
      "              uvula5 - Throat/Uvula Surgery for Sleep Apnea: Self-reported\n"
     ]
    }
   ],
   "source": [
    "for _, row in variables.iterrows():\n",
    "    id_name = row.loc['id']\n",
    "    display_name = row.loc['display_name']\n",
    "    print(f'{id_name:>20} - {display_name}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Variables\n",
      "648\n",
      "Dataset\n",
      "['mesaid', 'examnumber', 'race1c', 'gender1', 'cucmcn1c', 'sleepage5c', 'site5c', 'htcm5', 'wtlb5', 'bmi5c', 'smkstat5', 'cursmk5', 'bedtmwkday5c', 'waketmwkday5c', 'wkdaysleepdur5c', 'wkdaysleepdur5t', 'bedtmwkend5c', 'waketmwkend5c', 'wkendsleepdur5c', 'wkendsleepdur5t', 'nap5', 'trbleslpng5', 'wakeup5', 'wakeearly5', 'bcksleep5', 'slpngpills5', 'irritable5', 'sleepy5', 'typicalslp5', 'readng5', 'tv5', 'sittng5', 'riding5', 'lyngdwn5', 'talkng5', 'quietly5', 'car5', 'dinner5', 'driving5', 'snored5', 'stpbrthng5', 'legsdscmfrt5', 'rubbnglgs5', 'wrserest5', 'wrseltr5', 'feelngbstr5', 'tired5', 'mosttired4', 'feelngbstpk5', 'types5', 'slpapnea5', 'cpap5', 'dntaldv5', 'uvula5', 'insmnia5', 'rstlesslgs5', 'wrksched5', 'extrahrs5', 'sleepqsid', 'whiirs5c', 'epslpscl5c', 'hoostmeq5c', 'havepsg5', 'haveact5', 'match5', 'stdypdy5c', 'status_psg5', 'rsnco5', 'scorerid5', 'inhomepsgyn5', 'e1dur5', 'e2dur5', 'chindur5', 'fzm1dur5', 'c4dur5', 'o2m1dur5', 'ecgdur5', 'limbdur5', 'airdur5', 'xflowdur5', 'chestdur5', 'abdodur5', 'oximdur5', 'plethdur5', 'casndur5', 'que15', 'que25', 'quchin5', 'qufzm15', 'quc45', 'quo2m15', 'quecg5', 'qulimb5', 'quair5', 'quxflow5', 'quchest5', 'quabdo5', 'quoxim5', 'qupleth5', 'qucasn5', 'm15', 'fpz5', 'ref5', 'posn5', 'overall5', 'slewake5', 'ahiov505', 'sao2lt855', 'unuhrou5', 'unuhrou4a5', 'unuhrou4b5', 'unuhrou4c5', 'unuhrou4d5', 'unuhrou4e5', 'unuhrou4f5', 'recbeaw5', 'losbeg5', 'losend5', 'losoth5', 'wakslepr5', 'stg1stg2pr5', 'stg2stg3pr5', 'remnrempr5', 'arunrel5', 'remarunrel5', 'respevpr5', 'apnhyppr5', 'abnoreeg5', 'alpdel5', 'period5', 'lagbreath5', 'npflow5', 'plmwake5', 'unustgou5', 'arsl3ou5', 'maxresou5', 'plmou5', 'scorid5', 'lighoff5', 'stloutp5', 'stonsetp5', 'remlaiip5', 'slpprdp5', 'ststartp5', 'stendp5', 'stdurm5', 'stlonp5', 'time_bed5', 'slp_eff5', 'rem_lat15', 'slp_maint_eff5', 'arrembp5', 'arremop5', 'arnrembp5', 'arnremop5', 'ahrembp5', 'ahremop5', 'ahnrembp5', 'ahnremop5', 'ai_all5', 'ai_rem5', 'ai_nrem5', 'waso5', 'timest1p5', 'timest15', 'timest2p5', 'timest25', 'times34p5', 'timest345', 'timeremp5', 'timerem5', 'svpulse5', 'bpmavg5', 'bpmmin5', 'bpmmax5', 'apnea35', 'ahiu35', 'cardrbp5', 'cardrop5', 'cardnbp5', 'cardnop5', 'oardrbp5', 'oarop5', 'oardnbp5', 'oardnop5', 'mxdrbp5', 'mxdrop5', 'mxdnbp5', 'mxdnop5', 'avdrbp5', 'avdrop5', 'avdnbp5', 'avdnop5', 'cardrba5', 'cardroa5', 'cardnba5', 'cardnoa5', 'oardrba5', 'oardroa5', 'oardnba5', 'oardnoa5', 'cardrba35', 'cardroa35', 'cardnba35', 'cardnoa35', 'oardrba35', 'oardroa35', 'oardnba35', 'oardnoa35', 'pctsthyp5', 'pcstahar5', 'pcstah3d5', 'pcstahda5', 'longap5', 'longhyp5', 'cavgdur5', 'oavgdur5', 'apavgdur5', 'havgdur5', 'hurbp5', 'hurop5', 'hunrbp5', 'hunrop5', 'hurbpa5', 'huropa5', 'hunrbpa5', 'hunropa5', 'hurbp25', 'hurbpa35', 'huropa35', 'hunrbpa35', 'hunropa35', 'oahi35', 'oai0p5', 'cai0p5', 'longhypb5', 'pcoslp5', 'phbslp5', 'pcohbwaslp5', 'pcohb3slp5', 'pcohb3waslp5', 'hbavgdur5', 'svspo25', 'mndrbp5', 'mndrop5', 'mndnbp5', 'mndnop5', 'ndes2ph5', 'ndes3ph5', 'ndes4ph5', 'ndes5ph5', 'pctsa95h5', 'pctsa90h5', 'pctsa85h5', 'pctsa80h5', 'avsao2rh5', 'avsao2nh5', 'mnsao2rh5', 'mnsao2nh5', 'mxsao2rh5', 'mxsao2nh5', 'dsrem25', 'dsrem35', 'dsrem45', 'dsrem55', 'dsnr25', 'dsnr35', 'dsnr45', 'dsnr55', 'dssao905', 'pctlt905', 'pctlt855', 'pctlt805', 'pctlt755', 'sao2rem5', 'sao2nrem5', 'avgsat5', 'minsat5', 'odi35', 'odi45', 'supinep5', 'nsupinep5', 'avgplm5', 'avgnplm5', 'avgrplm5', 'noplm5', 'plmaslp5', 'oahi45', 'oai4p5', 'cai4p5', 'cai4pa5', 'pctle925', 'oahi3pa5', 'oahi4pa5', 'avgplma5', 'oahi3_rem5', 'oahi3_nrem5', 'oahi3_sup5', 'oahi3_nsup5', 'oahi3pa_rem5', 'oahi3pa_nrem5', 'oahi3pa_sup5', 'oahi3pa_nsup5', 'oahi4_rem5', 'oahi4_nrem5', 'oahi4_sup5', 'oahi4_nsup5', 'oahi4pa_rem5', 'oahi4pa_nrem5', 'oahi4pa_sup5', 'oahi4pa_nsup5', 'ahi4pa_rem5', 'ahi4pa_nrem5', 'ahi4pa_sup5', 'ahi4pa_nsup5', 'ahi4p_rem5', 'ahi4p_nrem5', 'ahi4p_sup5', 'ahi4p_nsup5', 'cai0p_rem5', 'cai0p_nrem5', 'cai0p_sup5', 'cai0p_nsup5', 'slp_lat5', 'ahi_a0h3', 'ahi_a0h4', 'ahi_a0h3a', 'ahi_a0h4a', 'ahi_o0h3', 'ahi_o0h4', 'ahi_o0h3a', 'ahi_o0h4a', 'ahi_c0h3', 'ahi_c0h4', 'ahi_c0h3a', 'ahi_c0h4a', 'cent_obs_ratio', 'cent_obs_ratioa', 'nn_rr_fn5', 'avnn_fn5', 'ihr_fn5', 'sdnn_fn5', 'sdann_fn5', 'sdnnidx_fn5', 'rmssd_fn5', 'pnn10_fn5', 'pnn20_fn5', 'pnn30_fn5', 'pnn40_fn5', 'pnn50_fn5', 'totpwr_fn5', 'ulf_fn5', 'vlf_fn5', 'lf_fn5', 'hf_fn5', 'lf_hf_fn5', 'lfn_fn5', 'hfn_fn5', 'nn_rr_5m5', 'avnn_5m5', 'ihr_5m5', 'sdnn_5m5', 'rmssd_5m5', 'pnn10_5m5', 'pnn20_5m5', 'pnn30_5m5', 'pnn40_5m5', 'pnn50_5m5', 'totpwr_5m5', 'vlf_5m5', 'lf_5m5', 'hf_5m5', 'lf_hf_5m5', 'lfn_5m5', 'hfn_5m5', 'stdyady5c', 'sleepjournal5', 'timestart5', 'timeend5', 'nightsrec5', 'nightsvalid5', 'nightsinvalid5', 'diarypresent5', 'diarycomplete5', 'overallqual5', 'ndays5', 'avg24hrsleep5', 'sd24hrsleep5', 'avginbedduration5', 'sdinbedduration5', 'avgsleepperiodduration5', 'sdsleepperiodduration5', 'avgmainsleep5', 'sdmainsleep5', 'avgonsetlatency5', 'avgwaso5', 'avgsnooze5', 'avginbedwake5', 'avgefficiency5', 'sdefficiency5', 'avgmainteff5', 'sdmainteff5', 'avgfragmentation5', 'avgsleepbouts5', 'avgwakebouts5', 'ndaysnapsall5', 'ndaysnapssleep5', 'ndaysnapssleep155', 'avgnnapsall5', 'avgnnapssleep5', 'avgnnapssleep155', 'avgsleepnapsall5', 'avgsleepnapssleep5', 'avgsleepnapssleep155', 'avgsleepnapdaily5', 'avgsleepnapdaily155', 'avginbedtime5', 'sdinbedtime5', 'avgsleeponsettime5', 'sdsleeponsettime5', 'avgsleepoffsettime5', 'sdsleepoffsettime5', 'avgoutbedtime5', 'sdoutbedtime5', 'avgrestmidpoint5', 'sdrestmidpoint5', 'avgsleepmidpoint5', 'sdsleepmidpoint5', 'avgwhitetalt5', 'avgbluetalt5', 'avggreentalt5', 'avgredtalt5', 'ndayswd5', 'avg24hrsleepwd5', 'sd24hrsleepwd5', 'avginbeddurationwd5', 'sdinbeddurationwd5', 'avgsleepperioddurationwd5', 'sdsleepperioddurationwd5', 'avgmainsleepwd5', 'sdmainsleepwd5', 'avgonsetlatencywd5', 'avgwasowd5', 'avgsnoozewd5', 'avginbedwakewd5', 'avgefficiencywd5', 'sdefficiencywd5', 'avgmainteffwd5', 'sdmainteffwd5', 'avgfragmentationwd5', 'avgsleepboutswd5', 'avgwakeboutswd5', 'ndaysnapsallwd5', 'ndaysnapssleepwd5', 'ndaysnapssleep15wd5', 'avgnnapsallwd5', 'avgnnapssleepwd5', 'avgnnapssleep15wd5', 'avgsleepnapsallwd5', 'avgsleepnapssleepwd5', 'avgsleepnapssleep15wd5', 'avgsleepnapdailywd5', 'avgsleepnapdaily15wd5', 'avginbedtimewd5', 'sdinbedtimewd5', 'avgsleeponsettimewd5', 'sdsleeponsettimewd5', 'avgsleepoffsettimewd5', 'sdsleepoffsettimewd5', 'avgoutbedtimewd5', 'sdoutbedtimewd5', 'avgrestmidpointwd5', 'sdrestmidpointwd5', 'avgsleepmidpointwd5', 'sdsleepmidpointwd5', 'avgwhitetaltwd5', 'avgbluetaltwd5', 'avggreentaltwd5', 'avgredtaltwd5', 'ndayswe5', 'avg24hrsleepwe5', 'sd24hrsleepwe5', 'avginbeddurationwe5', 'sdinbeddurationwe5', 'avgsleepperioddurationwe5', 'sdsleepperioddurationwe5', 'avgmainsleepwe5', 'sdmainsleepwe5', 'avgonsetlatencywe5', 'avgwasowe5', 'avgsnoozewe5', 'avginbedwakewe5', 'avgefficiencywe5', 'sdefficiencywe5', 'avgmainteffwe5', 'sdmainteffwe5', 'avgfragmentationwe5', 'avgsleepboutswe5', 'avgwakeboutswe5', 'ndaysnapsallwe5', 'ndaysnapssleepwe5', 'ndaysnapssleep15we5', 'avgnnapsallwe5', 'avgnnapssleepwe5', 'avgnnapssleep15we5', 'avgsleepnapsallwe5', 'avgsleepnapssleepwe5', 'avgsleepnapssleep15we5', 'avgsleepnapdailywe5', 'avgsleepnapdaily15we5', 'avginbedtimewe5', 'sdinbedtimewe5', 'avgsleeponsettimewe5', 'sdsleeponsettimewe5', 'avgsleepoffsettimewe5', 'sdsleepoffsettimewe5', 'avgoutbedtimewe5', 'sdoutbedtimewe5', 'avgrestmidpointwe5', 'sdrestmidpointwe5', 'avgsleepmidpointwe5', 'sdsleepmidpointwe5', 'avgwhitetaltwe5', 'avgbluetaltwe5', 'avggreentaltwe5', 'avgredtaltwe5', 'ndayswo5', 'avg24hrsleepwo5', 'sd24hrsleepwo5', 'avginbeddurationwo5', 'sdinbeddurationwo5', 'avgsleepperioddurationwo5', 'sdsleepperioddurationwo5', 'avgmainsleepwo5', 'sdmainsleepwo5', 'avgonsetlatencywo5', 'avgwasowo5', 'avgsnoozewo5', 'avginbedwakewo5', 'avgefficiencywo5', 'sdefficiencywo5', 'avgmainteffwo5', 'sdmainteffwo5', 'avgfragmentationwo5', 'avgsleepboutswo5', 'avgwakeboutswo5', 'ndaysnapsallwo5', 'ndaysnapssleepwo5', 'ndaysnapssleep15wo5', 'avgnnapsallwo5', 'avgnnapssleepwo5', 'avgnnapssleep15wo5', 'avgsleepnapsallwo5', 'avgsleepnapssleepwo5', 'avgsleepnapssleep15wo5', 'avgsleepnapdailywo5', 'avgsleepnapdaily15wo5', 'avginbedtimewo5', 'sdinbedtimewo5', 'avgsleeponsettimewo5', 'sdsleeponsettimewo5', 'avgsleepoffsettimewo5', 'sdsleepoffsettimewo5', 'avgoutbedtimewo5', 'sdoutbedtimewo5', 'avgrestmidpointwo5', 'sdrestmidpointwo5', 'avgsleepmidpointwo5', 'sdsleepmidpointwo5', 'avgwhitetaltwo5', 'avgbluetaltwo5', 'avggreentaltwo5', 'avgredtaltwo5', 'ndaysnw5', 'avg24hrsleepnw5', 'sd24hrsleepnw5', 'avginbeddurationnw5', 'sdinbeddurationnw5', 'avgsleepperioddurationnw5', 'sdsleepperioddurationnw5', 'avgmainsleepnw5', 'sdmainsleepnw5', 'avgonsetlatencynw5', 'avgwasonw5', 'avgsnoozenw5', 'avginbedwakenw5', 'avgefficiencynw5', 'sdefficiencynw5', 'avgmainteffnw5', 'sdmainteffnw5', 'avgfragmentationnw5', 'avgsleepboutsnw5', 'avgwakeboutsnw5', 'ndaysnapsallnw5', 'ndaysnapssleepnw5', 'ndaysnapssleep15nw5', 'avgnnapsallnw5', 'avgnnapssleepnw5', 'avgnnapssleep15nw5', 'avgsleepnapsallnw5', 'avgsleepnapssleepnw5', 'avgsleepnapssleep15nw5', 'avgsleepnapdaily15nw5', 'avginbedtimenw5', 'sdinbedtimenw5', 'avgsleeponsettimenw5', 'sdsleeponsettimenw5', 'avgsleepoffsettimenw5', 'sdsleepoffsettimenw5', 'avgoutbedtimenw5', 'sdoutbedtimenw5', 'avgrestmidpointnw5', 'sdrestmidpointnw5', 'avgsleepmidpointnw5', 'sdsleepmidpointnw5', 'avgwhitetaltnw5', 'avgbluetaltnw5', 'avggreentaltnw5', 'avgredtaltnw5', 'avgsleepnapdailyrd5', 'dstoverlap5', 'epochlength5', 'lgn']\n",
      "(2237, 623)\n",
      "Harmonized Dataset\n",
      "['mesaid', 'examnumber', 'nsrr_age', 'nsrr_bmi', 'nsrr_age_gt89', 'nsrr_sex', 'nsrr_race', 'nsrr_current_smoker', 'nsrr_ever_smoker', 'nsrr_ahi_hp3u', 'nsrr_ahi_hp3r_aasm15', 'nsrr_ahi_hp4u_aasm15', 'nsrr_ahi_hp4r', 'nsrr_tst_f1', 'nsrr_phrnumar_f1', 'nsrr_flag_spsw', 'nsrr_ttleffsp_f1', 'nsrr_ttlmefsp_f1', 'nsrr_ttllatsp_f1', 'nsrr_ttlprdsp_s1sr', 'nsrr_ttldursp_s1sr', 'nsrr_waso_f1', 'nsrr_pctdursp_s1', 'nsrr_pctdursp_s2', 'nsrr_pctdursp_s3', 'nsrr_pctdursp_sr', 'nsrr_tib_f1']\n",
      "(2237, 27)\n"
     ]
    }
   ],
   "source": [
    "print('Variables')\n",
    "print(len(variables))\n",
    "\n",
    "print('Dataset')\n",
    "print(list(dataset.keys()))\n",
    "print(dataset.shape)\n",
    "\n",
    "print('Harmonized Dataset')\n",
    "print(list(harm_data.keys()))\n",
    "print(harm_data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table id=\"itables_f168bdd9_7189_430a_9563_6d66c874b689\" class=\"display nowrap\" data-quarto-disable-processing=\"true\" style=\"table-layout:auto;width:auto;margin:auto;caption-side:bottom\">\n",
       "<thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      \n",
       "      <th>mesaid</th>\n",
       "      <th>examnumber</th>\n",
       "      <th>nsrr_age</th>\n",
       "      <th>nsrr_bmi</th>\n",
       "      <th>nsrr_age_gt89</th>\n",
       "      <th>nsrr_sex</th>\n",
       "      <th>nsrr_race</th>\n",
       "      <th>nsrr_current_smoker</th>\n",
       "      <th>nsrr_ever_smoker</th>\n",
       "      <th>nsrr_ahi_hp3u</th>\n",
       "      <th>nsrr_ahi_hp3r_aasm15</th>\n",
       "      <th>nsrr_ahi_hp4u_aasm15</th>\n",
       "      <th>nsrr_ahi_hp4r</th>\n",
       "      <th>nsrr_tst_f1</th>\n",
       "      <th>nsrr_phrnumar_f1</th>\n",
       "      <th>nsrr_flag_spsw</th>\n",
       "      <th>nsrr_ttleffsp_f1</th>\n",
       "      <th>nsrr_ttlmefsp_f1</th>\n",
       "      <th>nsrr_ttllatsp_f1</th>\n",
       "      <th>nsrr_ttlprdsp_s1sr</th>\n",
       "      <th>nsrr_ttldursp_s1sr</th>\n",
       "      <th>nsrr_waso_f1</th>\n",
       "      <th>nsrr_pctdursp_s1</th>\n",
       "      <th>nsrr_pctdursp_s2</th>\n",
       "      <th>nsrr_pctdursp_s3</th>\n",
       "      <th>nsrr_pctdursp_sr</th>\n",
       "      <th>nsrr_tib_f1</th>\n",
       "    </tr>\n",
       "  </thead><tbody><tr>\n",
       "<td style=\"vertical-align:middle; text-align:left\">\n",
       "<div style=\"float:left; margin-right: 10px;\">\n",
       "<a href=https://mwouts.github.io/itables/><svg class=\"main-svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
       "width=\"64\" viewBox=\"0 0 500 400\" style=\"font-family: 'Droid Sans', sans-serif;\">\n",
       "    <g style=\"fill:#d9d7fc\">\n",
       "        <path d=\"M100,400H500V357H100Z\" />\n",
       "        <path d=\"M100,300H400V257H100Z\" />\n",
       "        <path d=\"M0,200H400V157H0Z\" />\n",
       "        <path d=\"M100,100H500V57H100Z\" />\n",
       "        <path d=\"M100,350H500V307H100Z\" />\n",
       "        <path d=\"M100,250H400V207H100Z\" />\n",
       "        <path d=\"M0,150H400V107H0Z\" />\n",
       "        <path d=\"M100,50H500V7H100Z\" />\n",
       "    </g>\n",
       "    <g style=\"fill:#1a1366;stroke:#1a1366;\">\n",
       "   <rect x=\"100\" y=\"7\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"0\" y=\"107\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"0;0;400\"\n",
       "      dur=\"3.5s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"207\" width=\"300\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;300;0\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "    <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;400\"\n",
       "      dur=\"3s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <rect x=\"100\" y=\"307\" width=\"400\" height=\"43\">\n",
       "    <animate\n",
       "      attributeName=\"width\"\n",
       "      values=\"0;400;0\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "      <animate\n",
       "      attributeName=\"x\"\n",
       "      values=\"100;100;500\"\n",
       "      dur=\"4s\"\n",
       "      repeatCount=\"indefinite\" />\n",
       "  </rect>\n",
       "        <g style=\"fill:transparent;stroke-width:8; stroke-linejoin:round\" rx=\"5\">\n",
       "            <g transform=\"translate(45 50) rotate(-45)\">\n",
       "                <circle r=\"33\" cx=\"0\" cy=\"0\" />\n",
       "                <rect x=\"-8\" y=\"32\" width=\"16\" height=\"30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(450 152)\">\n",
       "                <polyline points=\"-15,-20 -35,-20 -35,40 25,40 25,20\" />\n",
       "                <rect x=\"-15\" y=\"-40\" width=\"60\" height=\"60\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(50 352)\">\n",
       "                <polygon points=\"-35,-5 0,-40 35,-5\" />\n",
       "                <polygon points=\"-35,10 0,45 35,10\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(75 250)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "\n",
       "            <g transform=\"translate(425 250) rotate(180)\">\n",
       "                <polyline points=\"-30,30 -60,0 -30,-30\" />\n",
       "                <polyline points=\"0,30 -30,0 0,-30\" />\n",
       "            </g>\n",
       "        </g>\n",
       "    </g>\n",
       "</svg>\n",
       "</a>\n",
       "</div>\n",
       "<div>\n",
       "Loading ITables v2.2.2 from the <code>init_notebook_mode</code> cell...\n",
       "(need <a href=https://mwouts.github.io/itables/troubleshooting.html>help</a>?)</td>\n",
       "</div>\n",
       "</tr></tbody>\n",
       "\n",
       "</table>\n",
       "<script type=\"module\">\n",
       "    const { DataTable, jQuery: $ } = await import(window._datatables_src_for_itables_2_2_2);\n",
       "\n",
       "    document.querySelectorAll(\"#itables_f168bdd9_7189_430a_9563_6d66c874b689:not(.dataTable)\").forEach(table => {\n",
       "        if (!(table instanceof HTMLTableElement))\n",
       "            return;\n",
       "\n",
       "        // Define the table data\n",
       "        const data = [[1, 5, 70.0, 22.01, \"no\", \"female\", \"white\", \"no\", \"yes\", 18.14, 27.56, 9.94, 23.02, 344.0, 27.03, \"full scoring\", 59.83, 62.66, 26.0, 124.0, 67.0, 205.5, 19.7, 66.2, 2.77, 11.4, 575.0], [2, 5, 83.0, 21.9, \"no\", \"female\", \"white\", \"not reported\", \"no\", 8.34, 10.75, 3.85, 7.38, 374.0, 24.55, \"full scoring\", 86.37, 86.37, NaN, 67.0, 54.0, 59.0, 6.55, 48.4, 20.9, 24.2, 433.0], [6, 5, 57.0, 56.01, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 62.51, 67.21, 51.12, 58.32, 358.0, 21.79, \"full scoring\", 72.03, 72.03, NaN, 78.0, 21.0, 139.0, 19.7, 53.1, 10.5, 16.6, 497.0], [10, 5, 57.0, 19.84, \"no\", \"male\", \"white\", \"not reported\", \"no\", 40.91, 48.0, 32.18, 45.27, 110.0, 46.91, \"full scoring\", 55.28, 55.28, NaN, 0.0, 0.0, 89.0, 9.13, 57.5, 33.3, 0.0, 199.0], [12, 5, 80.0, 27.77, \"no\", \"male\", \"white\", \"not reported\", \"no\", 27.47, 33.63, 20.22, 29.89, 273.0, 28.79, \"full scoring\", 46.83, 47.81, 12.0, 416.0, 138.0, 298.0, 15.6, 69.0, 2.94, 12.5, 583.0], [14, 5, 60.0, 31.45, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 11.37, 12.94, 6.54, 9.24, 422.0, 11.23, \"full scoring\", 84.4, 85.08, 4.0, 61.0, 57.0, 73.5, 2.61, 45.2, 31.1, 21.1, 500.0], [16, 5, 57.0, 23.65, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 2.7, 4.41, 1.42, 3.7, 422.0, 14.93, \"full scoring\", 91.54, 91.54, NaN, 60.0, 43.0, 38.0, 8.53, 60.5, 4.62, 26.3, 461.0], [21, 5, 78.0, 22.77, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 19.28, 25.91, 12.51, 21.06, 470.0, 29.36, \"full scoring\", 87.2, 87.2, NaN, 218.0, 184.0, 69.0, 23.1, 54.5, 14.2, 8.2, 539.0], [27, 5, 72.0, 20.21, \"no\", \"female\", \"white\", \"not reported\", \"no\", 10.0, 12.93, 5.37, 8.54, 492.0, 13.17, \"full scoring\", 95.16, 95.16, NaN, 48.0, 45.0, 24.5, 13.2, 65.1, 2.44, 19.2, 517.0], [28, 5, 60.0, 32.73, \"no\", \"female\", \"white\", \"yes\", \"yes\", 21.87, 27.47, 17.89, 24.58, 332.0, 29.82, \"full scoring\", 89.01, 89.01, NaN, 43.0, 33.0, 40.5, 10.5, 56.2, 10.8, 22.4, 373.0], [29, 5, 77.0, 23.59, \"no\", \"male\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [33, 5, 77.0, 28.83, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 70.48, 73.61, 66.69, 71.82, 269.0, 59.33, \"full scoring\", 56.04, 56.04, NaN, 173.0, 34.0, 210.5, 20.1, 61.2, 0.0, 18.8, 480.0], [35, 5, 67.0, 23.02, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 4.89, 11.13, 2.71, 10.05, 221.0, 18.46, \"full scoring\", 48.36, 48.36, NaN, 264.0, 69.0, 235.5, 12.0, 53.4, 9.5, 25.1, 457.0], [36, 5, 75.0, 33.04, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 12.0, 18.75, 6.25, 14.25, 240.0, 24.5, \"full scoring\", 65.4, 65.4, NaN, 3.0, 3.0, 126.5, 16.0, 47.9, 16.0, 20.0, 367.0], [38, 5, 63.0, 31.76, \"no\", \"male\", \"white\", \"not reported\", \"no\", 7.33, 8.32, 3.56, 4.95, 303.0, 7.52, \"full scoring\", 98.38, 98.38, NaN, 55.0, 55.0, 4.5, 4.63, 55.9, 18.0, 21.5, 308.0], [46, 5, 79.0, 26.7, \"no\", \"female\", \"white\", \"no\", \"yes\", 23.41, 24.81, 19.69, 22.48, 387.0, 15.19, \"full scoring\", 76.63, 76.63, NaN, 186.0, 92.0, 118.0, 14.1, 42.7, 27.7, 15.5, 505.0], [48, 5, 82.0, 27.28, \"no\", \"female\", \"white\", \"not reported\", \"no\", 8.12, 9.28, 4.31, 5.97, 362.0, 18.4, \"full scoring\", 70.02, 70.29, 2.0, 44.0, 32.0, 152.5, 7.88, 57.4, 13.3, 21.4, 517.0], [50, 5, 68.0, 25.62, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 8.92, 9.97, 5.59, 7.1, 397.0, 11.49, \"full scoring\", 82.37, 82.37, NaN, 27.0, 27.0, 84.5, 3.4, 66.9, 8.69, 21.0, 482.0], [52, 5, 56.0, 26.66, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 8.29, 10.76, 3.88, 7.24, 340.0, 14.82, \"full scoring\", 77.63, 77.63, NaN, 86.0, 80.0, 97.5, 10.4, 62.8, 0.74, 26.0, 438.0], [54, 5, 61.0, 30.13, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 27.27, 33.12, 20.45, 27.66, 308.0, 32.14, \"full scoring\", 64.84, 64.84, NaN, 118.0, 98.0, 166.5, 10.7, 66.2, 10.2, 12.8, 475.0], [56, 5, 63.0, 22.62, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 4.39, 5.03, 1.55, 2.45, 465.0, 11.23, \"full scoring\", 83.63, 85.16, 10.0, 74.0, 61.0, 81.0, 8.93, 62.3, 8.18, 20.6, 556.0], [64, 5, 58.0, 32.96, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 43.7, 46.42, 35.77, 40.98, 265.0, 28.3, \"full scoring\", 66.75, 66.75, NaN, 155.0, 71.0, 131.5, 22.1, 61.5, 5.28, 11.1, 397.0], [70, 5, 59.0, 50.03, \"no\", \"female\", \"white\", \"no\", \"yes\", 8.97, 9.21, 4.36, 4.73, 495.0, 10.06, \"full scoring\", 92.87, 92.87, NaN, 424.0, 389.0, 38.0, 4.45, 64.3, 23.6, 7.68, 533.0], [74, 5, 75.0, 28.87, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 17.44, 22.46, 11.08, 18.92, 406.0, 20.39, \"full scoring\", 70.86, 70.86, NaN, 149.0, 107.0, 167.0, 9.74, 71.1, 6.29, 12.8, 573.0], [77, 5, 61.0, 28.53, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 4.55, 6.34, 2.76, 4.97, 435.0, 11.59, \"full scoring\", 90.06, 90.06, NaN, 65.0, 61.0, 48.0, 5.87, 68.8, 0.12, 25.2, 483.0], [79, 5, 74.0, 26.79, \"no\", \"female\", \"white\", \"no\", \"yes\", 27.22, 30.4, 19.56, 25.64, 227.0, 28.55, \"full scoring\", 57.76, 64.67, 42.0, 195.0, 80.0, 123.5, 9.93, 32.0, 39.1, 19.0, 393.0], [81, 5, 80.0, 29.74, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 41.66, 46.11, 38.1, 44.69, 337.0, 37.74, \"full scoring\", 75.9, 84.67, 46.0, 55.0, 48.0, 61.5, 19.7, 42.3, 15.4, 22.6, 444.0], [84, 5, 58.0, 30.0, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.67, 8.41, 4.35, 7.1, 414.0, 18.26, \"full scoring\", 85.71, 85.71, NaN, 78.0, 54.0, 68.5, 7.38, 60.8, 12.7, 19.1, 483.0], [85, 5, 60.0, 26.15, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 4.96, 12.46, 3.31, 10.93, 472.0, 13.73, \"full scoring\", 78.15, 88.89, 73.0, 85.0, 61.0, 58.5, 10.3, 46.7, 14.9, 28.1, 604.0], [87, 5, 75.0, 33.58, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 11.91, 12.63, 7.46, 8.61, 418.0, 8.04, \"full scoring\", 95.65, 95.65, NaN, 16.0, 16.0, 18.5, 4.55, 55.0, 14.2, 26.2, 437.0], [93, 5, 79.0, 26.67, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [99, 5, 71.0, 30.54, \"no\", \"male\", \"white\", \"no\", \"yes\", 24.4, 26.54, 16.98, 21.76, 364.0, 22.09, \"full scoring\", 79.3, 79.3, NaN, 48.0, 43.0, 95.0, 14.9, 52.5, 8.53, 24.1, 459.0], [101, 5, 63.0, 32.57, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.14, 7.67, 2.92, 5.06, 391.0, 12.89, \"full scoring\", 84.82, 84.82, NaN, 9.0, 8.0, 69.5, 4.74, 40.3, 33.9, 21.0, 461.0], [105, 5, 68.0, 38.38, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 19.72, 21.07, 14.66, 17.02, 356.0, 11.29, \"full scoring\", 78.24, 78.24, NaN, 119.0, 57.0, 98.5, 9.13, 46.6, 21.9, 22.3, 455.0], [107, 5, 82.0, 33.82, \"no\", \"male\", \"white\", \"no\", \"yes\", 52.57, 58.83, 49.96, 56.61, 460.0, 23.74, \"full scoring\", 93.69, 93.69, NaN, 138.0, 130.0, 31.0, 14.5, 59.7, 11.5, 14.3, 491.0], [109, 5, 66.0, 27.0, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 16.03, 23.02, 8.73, 17.3, 378.0, 26.67, \"full scoring\", 82.35, 82.35, NaN, 125.0, 84.0, 80.5, 19.3, 54.8, 4.5, 21.4, 459.0], [110, 5, 60.0, 29.11, \"no\", \"male\", \"white\", \"no\", \"no\", 36.23, 39.46, 27.46, 33.23, 260.0, 17.31, \"full scoring\", 75.36, 83.07, 32.0, 84.0, 63.0, 53.0, 10.0, 67.7, 13.8, 8.46, 345.0], [111, 5, 77.0, 20.1, \"no\", \"female\", \"white\", \"not reported\", \"no\", 0.0, 0.0, 0.0, 0.0, 231.0, 18.18, \"full scoring\", 51.22, 59.69, 64.0, 82.0, 44.0, 155.5, 18.7, 38.0, 12.1, 31.2, 451.0], [113, 5, 61.0, 22.22, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 1.96, 3.27, 0.33, 2.29, 367.0, 12.26, \"full scoring\", 85.55, 93.62, 37.0, 95.0, 91.0, 24.5, 7.77, 60.9, 12.9, 18.4, 429.0], [117, 5, 65.0, 28.67, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [118, 5, 56.0, 28.69, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 12.87, 13.59, 7.95, 9.69, 415.0, 17.49, \"full scoring\", 86.64, 87.92, 7.0, 109.0, 94.0, 57.0, 6.27, 53.7, 24.1, 15.9, 479.0], [120, 5, 60.0, 30.38, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 8.21, 18.37, 4.89, 16.61, 307.0, 23.84, \"full scoring\", 60.08, 68.68, 64.0, 123.0, 59.0, 140.0, 19.9, 55.1, 1.79, 23.2, 511.0], [121, 5, 58.0, 29.29, \"no\", \"male\", \"white\", \"yes\", \"yes\", 13.9, 18.12, 8.62, 14.25, 341.0, 30.09, \"full scoring\", 86.33, 86.33, NaN, 60.0, 54.0, 54.0, 21.4, 40.5, 17.4, 20.7, 395.0], [125, 5, 82.0, 22.22, \"no\", \"male\", \"white\", \"not reported\", \"no\", 43.72, 46.65, 38.14, 41.66, 409.0, 19.8, \"full scoring\", 77.32, 77.32, NaN, 130.0, 117.0, 120.0, 22.0, 68.3, 0.73, 8.92, 529.0], [128, 5, 62.0, 36.03, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [132, 5, 62.0, 31.16, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 4.55, 6.83, 1.25, 4.21, 527.0, 23.11, \"full scoring\", 88.42, 88.42, NaN, 86.0, 84.0, 69.0, 13.7, 70.2, 1.8, 14.3, 596.0], [133, 5, 84.0, 26.64, \"no\", \"male\", \"white\", \"not reported\", \"no\", 22.09, 26.61, 14.09, 20.35, 345.0, 25.39, \"full scoring\", 73.09, 81.37, 48.0, 86.0, 77.0, 79.0, 15.5, 62.6, 0.0, 21.9, 472.0], [134, 5, 89.0, 21.61, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [138, 5, 63.0, 26.55, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 30.47, 30.94, 24.33, 25.98, 254.0, 21.73, \"full scoring\", 95.13, 95.13, NaN, 4.0, 4.0, 13.0, 14.8, 62.5, 1.18, 21.5, 267.0], [139, 5, 65.0, 30.18, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [140, 5, 67.0, 32.97, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 43.98, 50.12, 36.89, 44.72, 322.0, 35.59, \"full scoring\", 73.68, 73.68, NaN, 53.0, 48.0, 115.0, 23.3, 54.0, 3.73, 19.0, 437.0], [144, 5, 67.0, 36.05, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 16.61, 20.95, 9.42, 15.25, 484.0, 18.84, \"full scoring\", 85.36, 87.84, 16.0, 75.0, 68.0, 66.5, 8.27, 54.3, 7.86, 29.6, 567.0], [149, 5, 81.0, 30.65, \"no\", \"female\", \"white\", \"no\", \"yes\", 15.41, 20.55, 9.04, 15.21, 292.0, 17.47, \"full scoring\", 57.82, 69.86, 87.0, 126.0, 74.0, 125.5, 16.1, 51.9, 14.2, 17.8, 505.0], [152, 5, 80.0, 26.97, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 7.06, 10.82, 1.41, 6.59, 255.0, 17.65, \"full scoring\", 62.2, 84.72, 109.0, 199.0, 176.0, 46.0, 6.08, 86.5, 5.69, 1.76, 410.0], [155, 5, 76.0, 29.21, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 29.55, 34.9, 25.84, 31.63, 404.0, 12.03, \"full scoring\", 75.8, 75.8, NaN, 31.0, 30.0, 128.5, 12.5, 65.7, 1.36, 20.4, 533.0], [159, 5, 58.0, 27.9, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 1.37, 4.1, 0.68, 3.42, 439.0, 15.17, \"full scoring\", 79.24, 87.1, 50.0, 176.0, 130.0, 65.5, 5.59, 59.9, 18.1, 16.4, 554.0], [167, 5, 59.0, 19.82, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 0.45, 3.17, 0.0, 2.94, 265.0, 18.57, \"full scoring\", 55.32, 94.31, 198.0, 33.0, 32.0, 16.0, 5.28, 47.5, 25.5, 21.7, 479.0], [168, 5, 63.0, 21.9, \"no\", \"female\", \"white\", \"yes\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [169, 5, 71.0, 30.35, \"no\", \"male\", \"white\", \"no\", \"yes\", 43.93, 45.76, 38.03, 40.68, 295.0, 33.97, \"full scoring\", 64.84, 64.84, NaN, 125.0, 74.0, 160.0, 39.5, 39.5, 0.68, 20.3, 455.0], [171, 5, 59.0, 38.26, \"no\", \"female\", \"white\", \"not reported\", \"no\", 5.92, 6.74, 2.48, 3.85, 436.0, 13.49, \"full scoring\", 85.16, 85.16, NaN, 243.0, 209.0, 75.5, 11.8, 73.5, 2.18, 12.5, 512.0], [179, 5, 75.0, 34.32, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [182, 5, 72.0, 24.72, \"no\", \"male\", \"black or african american\", \"yes\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [183, 5, 65.0, 34.27, \"no\", \"male\", \"black or african american\", \"yes\", \"yes\", 38.66, 39.93, 32.75, 34.86, 284.0, 18.59, \"full scoring\", 84.52, 84.52, NaN, 81.0, 77.0, 52.0, 14.4, 58.1, 15.3, 12.1, 336.0], [187, 5, 62.0, 34.47, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 14.85, 16.39, 9.31, 12.02, 509.0, 9.31, \"full scoring\", 93.22, 97.32, 23.0, 78.0, 77.0, 14.0, 5.51, 68.0, 14.6, 11.9, 546.0], [188, 5, 71.0, 24.37, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 20.84, 31.44, 15.27, 30.36, 334.0, 31.44, \"full scoring\", 70.91, 70.91, NaN, 77.0, 48.0, 136.5, 16.0, 59.3, 14.1, 10.6, 471.0], [193, 5, 89.0, 24.62, \"no\", \"male\", \"white\", \"not reported\", \"no\", 17.54, 20.05, 13.23, 16.98, 431.0, 19.07, \"full scoring\", 74.31, 74.31, NaN, 82.0, 45.0, 148.5, 18.6, 46.2, 6.85, 28.3, 580.0], [194, 5, 57.0, 27.03, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 8.02, 11.89, 5.12, 9.4, 434.0, 11.75, \"full scoring\", 84.11, 94.97, 59.0, 37.0, 36.0, 23.0, 8.54, 55.2, 3.46, 32.8, 516.0], [195, 5, 84.0, 22.97, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.46, 18.28, 4.98, 17.72, 325.0, 26.03, \"full scoring\", 72.22, 72.22, NaN, 164.0, 83.0, 125.0, 23.0, 47.8, 14.3, 14.9, 450.0], [196, 5, 75.0, 27.42, \"no\", \"male\", \"white\", \"not reported\", \"no\", 51.58, 54.04, 34.74, 39.3, 171.0, 20.7, \"full scoring\", 62.41, 91.44, 87.0, 81.0, 73.0, 16.0, 20.2, 42.5, 21.4, 15.8, 274.0], [197, 5, 67.0, 41.54, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 27.33, 29.04, 18.79, 21.14, 281.0, 11.74, \"full scoring\", 60.95, 60.95, NaN, 73.0, 60.0, 180.0, 12.1, 60.7, 3.38, 23.8, 461.0], [199, 5, 90.0, 24.28, \"yes\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [204, 5, 75.0, 22.69, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 2.17, 6.36, 0.62, 5.12, 387.0, 16.9, \"full scoring\", 80.79, 83.05, 13.0, 47.0, 43.0, 79.0, 5.94, 64.3, 10.2, 19.5, 479.0], [209, 5, 82.0, 18.88, \"no\", \"male\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [211, 5, 61.0, 28.45, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 14.33, 14.87, 9.13, 11.1, 335.0, 22.57, \"full scoring\", 75.11, 75.11, NaN, 65.0, 27.0, 110.5, 13.9, 47.3, 13.1, 25.7, 446.0], [214, 5, 88.0, 47.0, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [219, 5, 68.0, 21.31, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 21.37, 24.46, 13.65, 17.77, 233.0, 13.39, \"full scoring\", 76.9, 85.35, 30.0, 91.0, 65.0, 40.0, 8.17, 36.6, 29.0, 26.2, 303.0], [220, 5, 81.0, 23.17, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 39.21, 40.0, 33.82, 34.74, 456.0, 22.5, \"full scoring\", 78.35, 78.35, NaN, 107.0, 66.0, 125.5, 18.6, 44.0, 14.3, 23.1, 582.0], [225, 5, 63.0, 26.11, \"no\", \"female\", \"white\", \"yes\", \"yes\", 1.96, 2.27, 1.21, 1.51, 397.0, 5.44, \"full scoring\", 85.75, 85.75, NaN, 116.0, 62.0, 66.0, 5.04, 46.7, 26.2, 22.1, 463.0], [236, 5, 75.0, 31.34, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 19.92, 29.38, 9.96, 21.91, 241.0, 22.66, \"full scoring\", 68.08, 68.08, NaN, 164.0, 92.0, 113.0, 12.4, 72.2, 0.62, 14.7, 354.0], [241, 5, 79.0, 29.93, \"no\", \"female\", \"white\", \"not reported\", \"no\", 9.68, 12.62, 4.25, 8.36, 409.0, 21.86, \"full scoring\", 74.77, 85.74, 70.0, 72.0, 70.0, 67.5, 9.18, 70.0, 8.45, 12.4, 547.0], [248, 5, 69.0, 29.9, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 26.74, 34.42, 15.81, 26.74, 258.0, 37.21, \"full scoring\", 55.6, 55.6, NaN, 218.0, 98.0, 205.5, 19.2, 59.6, 5.83, 15.3, 464.0], [251, 5, 73.0, 32.67, \"no\", \"female\", \"black or african american\", \"not reported\", \"not reported\", 4.59, 5.7, 2.06, 3.8, 379.0, 20.58, \"full scoring\", 85.94, 85.94, NaN, 0.0, 0.0, 61.5, 10.7, 59.9, 4.62, 24.8, 441.0], [255, 5, 61.0, 33.62, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [258, 5, 64.0, 22.87, \"no\", \"female\", \"white\", \"not reported\", \"no\", 1.55, 2.25, 0.85, 1.69, 426.0, 8.31, \"full scoring\", 79.48, 79.48, NaN, 169.0, 71.0, 109.5, 3.64, 64.3, 9.98, 22.1, 536.0], [269, 5, 80.0, 28.98, \"no\", \"male\", \"white\", \"no\", \"yes\", 29.59, 36.77, 22.12, 32.63, 217.0, 40.92, \"full scoring\", 48.98, 48.98, NaN, 234.0, 89.0, 225.5, 11.1, 62.9, 15.2, 10.8, 443.0], [271, 5, 56.0, 30.94, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 18.45, 19.01, 14.79, 15.63, 426.0, 8.73, \"full scoring\", 93.63, 93.63, NaN, 109.0, 91.0, 29.0, 5.99, 73.1, 5.76, 15.2, 455.0], [275, 5, 59.0, 21.87, \"no\", \"male\", \"white\", \"no\", \"yes\", 3.93, 5.97, 3.64, 5.68, 412.0, 13.98, \"full scoring\", 86.92, 96.26, 46.0, 262.0, 257.0, 16.0, 2.67, 41.0, 33.3, 23.1, 474.0], [282, 5, 68.0, 27.81, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 17.98, 19.88, 11.41, 14.01, 347.0, 18.5, \"full scoring\", 79.22, 79.22, NaN, 117.0, 43.0, 91.0, 9.94, 39.9, 21.8, 28.4, 438.0], [284, 5, 60.0, 27.61, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 1.96, 5.61, 0.98, 5.05, 428.0, 26.07, \"full scoring\", 88.61, 91.85, 17.0, 105.0, 91.0, 38.5, 4.09, 53.4, 26.6, 15.9, 483.0], [285, 5, 70.0, 30.6, \"no\", \"male\", \"white\", \"no\", \"not reported\", 20.71, 24.56, 15.8, 20.5, 281.0, 18.79, \"full scoring\", 85.15, 85.15, NaN, 64.0, 59.0, 49.0, 8.38, 57.0, 23.0, 11.6, 330.0], [286, 5, 68.0, 26.84, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 78.83, 81.93, 69.69, 73.99, 446.0, 48.3, \"full scoring\", 91.39, 91.39, NaN, 225.0, 201.0, 42.0, 40.1, 38.1, 9.08, 12.7, 488.0], [288, 5, 64.0, 21.87, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 5.31, 5.78, 2.34, 3.28, 384.0, 12.19, \"full scoring\", 86.88, 86.88, NaN, 76.0, 65.0, 57.5, 5.08, 59.3, 3.26, 32.3, 442.0], [292, 5, 57.0, 28.67, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 1.12, 1.44, 0.96, 1.44, 374.0, 6.26, \"full scoring\", 69.65, 76.8, 50.0, 128.0, 119.0, 113.5, 6.95, 72.6, 0.0, 20.5, 537.0], [295, 5, 62.0, 24.14, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.0, 0.12, 0.0, 0.12, 490.0, 16.04, \"full scoring\", 89.91, 89.91, NaN, 81.0, 74.0, 55.0, 10.7, 67.1, 0.0, 22.1, 545.0], [299, 5, 74.0, 30.5, \"no\", \"male\", \"white\", \"no\", \"yes\", 11.84, 16.44, 5.59, 13.97, 365.0, 43.73, \"full scoring\", 61.14, 61.14, NaN, 84.0, 64.0, 231.5, 21.3, 59.8, 0.27, 18.7, 597.0], [301, 5, 63.0, 31.38, \"no\", \"male\", \"white\", \"not reported\", \"no\", 18.81, 22.07, 12.59, 17.25, 386.0, 19.27, \"full scoring\", 86.55, 86.55, NaN, 102.0, 87.0, 60.0, 20.1, 56.5, 0.0, 23.3, 446.0], [303, 5, 64.0, 19.83, \"no\", \"female\", \"white\", \"yes\", \"yes\", 7.18, 12.68, 3.38, 9.51, 284.0, 13.31, \"full scoring\", 76.96, 92.81, 63.0, 46.0, 45.0, 21.5, 8.99, 47.1, 9.7, 34.2, 369.0], [306, 5, 77.0, 26.6, \"no\", \"male\", \"white\", \"no\", \"yes\", 29.81, 32.83, 16.79, 22.45, 318.0, 19.25, \"full scoring\", 68.39, 68.39, NaN, 63.0, 57.0, 147.0, 6.92, 64.0, 20.1, 8.96, 465.0], [310, 5, 57.0, 46.8, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 24.71, 30.13, 18.24, 24.85, 454.0, 30.0, \"full scoring\", 84.86, 87.64, 17.0, 96.0, 90.0, 64.0, 10.7, 55.2, 11.2, 22.8, 535.0], [312, 5, 75.0, 28.31, \"no\", \"male\", \"hispanic\", \"yes\", \"yes\", 31.97, 39.84, 24.84, 36.89, 244.0, 41.31, \"full scoring\", 49.49, 49.49, NaN, 343.0, 155.0, 249.0, 25.4, 64.5, 0.41, 9.63, 493.0], [314, 5, 77.0, 24.65, \"no\", \"male\", \"white\", \"not reported\", \"no\", 16.28, 19.18, 13.61, 17.4, 269.0, 20.52, \"full scoring\", 56.16, 72.12, 106.0, 66.0, 57.0, 104.5, 21.9, 49.6, 11.3, 17.1, 479.0], [318, 5, 75.0, 29.51, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 8.53, 13.87, 4.27, 10.93, 225.0, 40.8, \"full scoring\", 46.97, 58.9, 97.0, 200.0, 88.0, 157.0, 12.4, 55.3, 18.7, 13.6, 479.0], [319, 5, 75.0, 28.23, \"no\", \"female\", \"white\", \"not reported\", \"no\", 27.83, 35.92, 18.95, 30.59, 304.0, 27.63, \"full scoring\", 84.68, 92.4, 30.0, 276.0, 252.0, 25.0, 15.5, 44.6, 22.9, 17.1, 359.0], [320, 5, 61.0, 23.99, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [323, 5, 79.0, 23.7, \"no\", \"male\", \"white\", \"no\", \"yes\", 2.46, 6.32, 1.4, 5.26, 171.0, 11.23, \"full scoring\", 43.62, 44.42, 7.0, 198.0, 68.0, 214.0, 9.06, 63.5, 20.5, 7.02, 392.0], [328, 5, 73.0, 26.19, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 17.23, 18.0, 11.03, 12.58, 310.0, 20.13, \"full scoring\", 60.19, 60.19, NaN, 147.0, 98.0, 205.0, 14.0, 74.0, 0.0, 11.9, 515.0], [329, 5, 61.0, 26.4, \"no\", \"male\", \"white\", \"not reported\", \"no\", 9.13, 36.74, 1.74, 35.65, 276.0, 46.96, \"full scoring\", 55.42, 55.42, NaN, 127.0, 29.0, 221.5, 36.4, 45.8, 0.36, 17.4, 498.0], [332, 5, 74.0, 28.83, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 42.36, 52.53, 37.73, 50.09, 466.0, 49.44, \"full scoring\", 60.52, 60.52, NaN, 141.0, 55.0, 303.5, 42.7, 43.6, 0.0, 13.6, 770.0], [337, 5, 78.0, 32.2, \"no\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [338, 5, 56.0, 34.57, \"no\", \"male\", \"white\", \"no\", \"yes\", 75.23, 78.02, 71.89, 76.72, 323.0, 70.22, \"full scoring\", 71.3, 90.48, 96.0, 141.0, 127.0, 34.5, 70.6, 19.5, 0.0, 9.91, 453.0], [339, 5, 86.0, 24.9, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.96, 5.11, 0.0, 4.47, 188.0, 37.98, \"full scoring\", 46.65, 87.85, 189.0, 130.0, 116.0, 26.5, 13.6, 73.9, 5.87, 6.67, 403.0], [344, 5, 69.0, 27.52, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 11.91, 12.34, 8.09, 9.5, 423.0, 8.51, \"full scoring\", 82.78, 82.78, NaN, 77.0, 34.0, 88.0, 9.11, 63.6, 6.51, 20.8, 511.0], [345, 5, 58.0, 20.59, \"no\", \"male\", \"white\", \"not reported\", \"no\", 8.2, 10.65, 2.59, 6.33, 417.0, 11.37, \"full scoring\", 87.61, 92.67, NaN, 59.0, 55.0, 33.5, 7.67, 46.5, 19.7, 26.1, 476.0], [346, 5, 65.0, 24.98, \"no\", \"male\", \"hispanic\", \"yes\", \"yes\", 69.76, 69.76, 66.6, 67.46, 209.0, 37.89, \"full scoring\", 37.19, 48.38, 130.0, 94.0, 89.0, 222.5, 29.7, 59.7, 4.32, 6.24, 562.0], [347, 5, 84.0, 27.06, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 15.22, 18.27, 10.39, 14.15, 335.0, 24.54, \"full scoring\", 67.68, 69.65, 14.0, 153.0, 78.0, 146.0, 6.87, 57.2, 23.0, 13.0, 495.0], [350, 5, 71.0, 33.4, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 19.63, 22.06, 12.02, 15.66, 544.0, 13.35, \"full scoring\", 86.76, 86.76, NaN, 99.0, 84.0, 83.0, 8.82, 54.1, 17.0, 20.0, 627.0], [359, 5, 56.0, 29.28, \"no\", \"male\", \"hispanic\", \"yes\", \"yes\", 14.92, 16.79, 9.17, 11.81, 386.0, 17.56, \"full scoring\", 81.61, 92.34, 55.0, 143.0, 119.0, 32.0, 9.86, 61.9, 8.3, 20.0, 473.0], [363, 5, 64.0, 41.09, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 22.85, 23.47, 18.03, 19.12, 386.0, 15.39, \"full scoring\", 73.66, 76.59, 20.0, 236.0, 133.0, 118.0, 12.3, 70.2, 0.52, 17.0, 524.0], [368, 5, 82.0, 24.4, \"no\", \"male\", \"white\", \"no\", \"not reported\", 12.0, 22.29, 3.43, 16.29, 70.0, 27.43, \"full scoring\", 27.24, 61.4, 143.0, 0.0, 0.0, 44.0, 9.35, 82.7, 7.91, 0.0, 257.0], [372, 5, 57.0, 39.51, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 10.86, 11.84, 6.65, 8.27, 370.0, 14.43, \"full scoring\", 77.89, 79.57, 10.0, 63.0, 59.0, 95.5, 8.53, 62.7, 9.74, 19.1, 475.0], [374, 5, 76.0, 32.13, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 58.73, 60.64, 54.91, 58.89, 377.0, 41.06, \"full scoring\", 80.21, 80.21, NaN, 147.0, 113.0, 93.0, 46.8, 39.3, 0.0, 13.9, 470.0], [380, 5, 58.0, 33.87, \"no\", \"male\", \"white\", \"no\", \"yes\", 38.2, 40.9, 34.83, 38.43, 267.0, 30.34, \"full scoring\", 75.85, 86.69, 44.0, 52.0, 49.0, 40.5, 25.7, 49.9, 3.19, 21.2, 352.0], [381, 5, 77.0, 27.88, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 27.58, 34.33, 15.99, 25.23, 409.0, 23.62, \"full scoring\", 90.69, 90.69, NaN, 54.0, 51.0, 42.0, 6.6, 60.3, 10.3, 22.9, 451.0], [382, 5, 61.0, 32.33, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 8.53, 9.45, 3.81, 5.12, 457.0, 6.7, \"full scoring\", 90.14, 90.14, NaN, 152.0, 141.0, 50.0, 5.91, 55.0, 24.4, 14.7, 507.0], [384, 5, 73.0, 24.23, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 7.86, 8.86, 4.37, 5.86, 481.0, 15.34, \"full scoring\", 91.27, 92.32, 6.0, 51.0, 46.0, 39.5, 10.7, 70.3, 0.1, 18.9, 527.0], [385, 5, 63.0, 37.22, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 1.68, 2.05, 1.12, 1.68, 322.0, 9.13, \"full scoring\", 70.0, 77.78, 46.0, 201.0, 121.0, 91.5, 7.62, 67.8, 3.27, 21.3, 460.0], [386, 5, 87.0, 27.29, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 63.71, 64.5, 58.15, 59.74, 453.0, 18.15, \"full scoring\", 73.66, 73.66, NaN, 139.0, 103.0, 161.5, 12.5, 74.3, 8.18, 5.08, 615.0], [388, 5, 82.0, 22.9, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 9.32, 12.52, 3.79, 7.57, 206.0, 12.23, \"full scoring\", 58.03, 58.03, NaN, 15.0, 15.0, 148.5, 6.31, 71.1, 6.07, 16.5, 355.0], [392, 5, 84.0, 23.1, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 16.08, 17.34, 9.79, 12.45, 429.0, 14.55, \"full scoring\", 82.18, 82.18, NaN, 141.0, 92.0, 93.0, 16.2, 56.9, 5.36, 21.6, 522.0], [393, 5, 82.0, 22.24, \"no\", \"female\", \"white\", \"no\", \"yes\", 0.91, 2.57, 0.6, 2.27, 397.0, 16.32, \"full scoring\", 66.5, 66.72, 2.0, 107.0, 64.0, 198.5, 11.1, 63.8, 8.95, 16.1, 597.0], [399, 5, 62.0, 39.56, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 63.91, 67.23, 48.08, 54.72, 307.0, 26.19, \"full scoring\", 75.62, 79.33, 19.0, 83.0, 78.0, 80.0, 9.61, 60.9, 13.8, 15.6, 406.0], [402, 5, 78.0, 27.52, \"no\", \"male\", \"white\", \"not reported\", \"no\", 40.29, 44.67, 37.45, 43.14, 274.0, 36.79, \"full scoring\", 68.16, 85.09, 80.0, 38.0, 38.0, 48.0, 18.2, 50.0, 17.3, 14.4, 402.0], [403, 5, 77.0, 32.82, \"no\", \"female\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [405, 5, 78.0, 26.73, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 41.13, 43.4, 37.36, 41.89, 318.0, 30.19, \"full scoring\", 70.67, 71.3, 4.0, 41.0, 26.0, 127.5, 38.6, 46.0, 0.0, 15.4, 450.0], [407, 5, 77.0, 35.66, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 26.29, 28.39, 21.13, 23.71, 372.0, 16.13, \"full scoring\", 77.5, 77.5, NaN, 56.0, 34.0, 107.5, 21.1, 53.0, 0.0, 25.9, 480.0], [408, 5, 62.0, 21.53, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 1.37, 8.24, 0.98, 8.24, 306.0, 22.16, \"full scoring\", 56.77, 78.46, 149.0, 167.0, 122.0, 84.0, 20.5, 47.1, 9.66, 22.7, 539.0], [414, 5, 65.0, 17.08, \"no\", \"female\", \"white\", \"yes\", \"yes\", 4.09, 7.33, 0.51, 4.94, 352.0, 24.72, \"full scoring\", 75.54, 82.24, 38.0, 120.0, 81.0, 76.5, 13.6, 49.1, 7.24, 30.0, 466.0], [415, 5, 75.0, 21.4, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 1.0, 4.99, 0.57, 4.85, 421.0, 30.21, \"full scoring\", 77.39, 77.68, 2.0, 156.0, 65.0, 121.0, 3.21, 59.3, 25.9, 11.5, 544.0], [416, 5, 58.0, 21.77, \"no\", \"male\", \"white\", \"not reported\", \"no\", 2.16, 11.35, 2.16, 11.35, 222.0, 18.38, \"full scoring\", 88.1, 88.1, NaN, 60.0, 60.0, 30.0, 11.3, 66.2, 6.31, 16.2, 252.0], [419, 5, 69.0, 23.15, \"no\", \"female\", \"white\", \"not reported\", \"no\", 4.16, 6.98, 1.78, 5.94, 404.0, 10.1, \"full scoring\", 71.89, 75.37, 26.0, 79.0, 70.0, 132.0, 10.0, 63.6, 5.58, 20.8, 562.0], [423, 5, 61.0, 35.46, \"no\", \"male\", \"white\", \"not reported\", \"no\", 21.71, 22.44, 17.56, 18.54, 246.0, 21.22, \"full scoring\", 57.88, 68.72, 67.0, 69.0, 68.0, 112.5, 19.1, 62.9, 0.0, 17.9, 425.0], [427, 5, 56.0, 32.31, \"no\", \"female\", \"white\", \"not reported\", \"no\", 0.59, 0.74, 0.0, 0.15, 406.0, 12.71, \"full scoring\", 92.91, 92.91, NaN, 227.0, 210.0, 31.0, 7.77, 66.6, 16.2, 9.49, 437.0], [435, 5, 69.0, 31.16, \"no\", \"male\", \"white\", \"no\", \"yes\", 44.03, 47.58, 39.03, 44.68, 372.0, 34.03, \"full scoring\", 81.58, 81.58, NaN, 93.0, 87.0, 83.5, 15.5, 58.7, 12.4, 13.4, 456.0], [439, 5, 61.0, 26.31, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [440, 5, 73.0, 30.46, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 6.37, 12.03, 3.68, 10.61, 424.0, 33.25, \"full scoring\", 78.66, 92.37, 80.0, 88.0, 78.0, 35.0, 24.1, 58.3, 1.3, 16.3, 539.0], [443, 5, 64.0, 23.44, \"no\", \"male\", \"white\", \"not reported\", \"no\", 14.22, 24.05, 8.53, 22.24, 464.0, 39.57, \"full scoring\", 69.88, 77.33, 64.0, 49.0, 40.0, 136.5, 36.1, 40.3, 1.4, 22.1, 664.0], [445, 5, 56.0, 26.9, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 2.07, 2.26, 1.69, 1.88, 319.0, 9.97, \"full scoring\", 53.17, 65.5, 113.0, 232.0, 89.0, 167.5, 8.48, 59.3, 19.8, 12.4, 600.0], [446, 5, 73.0, 24.43, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [452, 5, 73.0, 34.52, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 7.18, 8.77, 3.99, 5.78, 301.0, 9.97, \"full scoring\", 65.58, 73.96, 52.0, 54.0, 42.0, 105.5, 6.31, 54.2, 18.8, 20.8, 459.0], [457, 5, 58.0, 32.94, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 12.73, 13.76, 5.56, 7.17, 410.0, 7.46, \"full scoring\", 69.02, 69.02, NaN, 242.0, 76.0, 183.5, 3.05, 66.8, 14.0, 16.1, 594.0], [458, 5, 57.0, 23.18, \"no\", \"female\", \"white\", \"not reported\", \"no\", 4.4, 6.13, 2.2, 4.4, 382.0, 13.98, \"full scoring\", 95.02, 95.02, NaN, 127.0, 124.0, 19.5, 2.49, 42.1, 35.5, 19.9, 402.0], [459, 5, 63.0, 35.18, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 30.53, 34.13, 23.32, 28.41, 283.0, 22.26, \"full scoring\", 91.29, 91.29, NaN, 63.0, 59.0, 27.0, 12.7, 46.7, 19.8, 20.7, 310.0], [6337, 5, 56.0, 22.13, \"no\", \"male\", \"white\", \"yes\", \"yes\", 0.72, 4.31, 0.36, 4.31, 334.0, 23.71, \"full scoring\", 77.49, 78.22, 4.0, 109.0, 90.0, 93.5, 12.1, 69.5, 6.14, 12.3, 431.0], [6340, 5, 63.0, 29.57, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 5.37, 11.94, 3.58, 10.6, 402.0, 12.39, \"full scoring\", 81.38, 81.38, NaN, 122.0, 50.0, 91.5, 5.1, 54.1, 19.5, 21.3, 494.0], [6350, 5, 65.0, 35.27, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 75.16, 79.35, 65.48, 70.0, 186.0, 25.16, \"full scoring\", 69.4, NaN, 48.0, 74.0, 61.0, 34.0, 13.2, 67.9, 1.62, 17.3, 268.0], [6351, 5, 62.0, 32.44, \"no\", \"female\", \"white\", \"no\", \"yes\", 27.68, 28.18, 21.42, 22.42, 479.0, 5.76, \"full scoring\", 79.57, 82.59, 22.0, 196.0, 128.0, 101.5, 2.82, 69.0, 15.0, 13.2, 602.0], [6353, 5, 65.0, 26.99, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 8.25, 10.65, 5.25, 8.55, 400.0, 15.9, \"full scoring\", 91.32, 91.32, NaN, 78.0, 76.0, 37.5, 8.25, 50.3, 18.8, 22.8, 438.0], [6354, 5, 57.0, 29.65, \"no\", \"female\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6362, 5, 89.0, 21.33, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 11.25, 16.88, 7.5, 16.88, 32.0, 35.63, \"full scoring\", 10.6, 10.6, NaN, 0.0, 0.0, 269.5, 42.9, 54.0, 3.17, 0.0, 302.0], [6366, 5, 62.0, 30.09, \"no\", \"male\", \"white\", \"no\", \"yes\", 31.98, 33.01, 23.91, 26.26, 409.0, 21.56, \"full scoring\", 95.12, 95.12, NaN, 19.0, 18.0, 20.5, 9.55, 58.4, 12.5, 19.6, 430.0], [6367, 5, 67.0, 29.46, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 25.94, 27.1, 19.16, 20.32, 310.0, 13.35, \"full scoring\", 80.1, 90.12, 43.0, 50.0, 50.0, 34.0, 6.29, 56.1, 7.1, 30.5, 387.0], [6370, 5, 59.0, 22.61, \"no\", \"female\", \"white\", \"not reported\", \"no\", 0.65, 6.77, 0.16, 6.45, 372.0, 30.0, \"full scoring\", 76.7, 76.7, NaN, 90.0, 77.0, 113.0, 17.1, 37.6, 19.7, 25.7, 485.0], [6372, 5, 67.0, 25.71, \"no\", \"male\", \"white\", \"yes\", \"yes\", 24.23, 32.83, 16.08, 28.3, 265.0, 39.85, \"full scoring\", 63.25, 65.11, 12.0, 115.0, 75.0, 142.0, 32.7, 53.3, 0.0, 14.0, 419.0], [6374, 5, 79.0, 21.69, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 4.4, 5.38, 3.42, 4.4, 368.0, 20.05, \"full scoring\", 80.7, 82.33, 9.0, 88.0, 67.0, 79.0, 13.7, 49.9, 16.5, 19.9, 456.0], [6376, 5, 80.0, 26.12, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 10.43, 12.71, 4.14, 8.43, 420.0, 17.29, \"full scoring\", 67.52, 67.52, NaN, 284.0, 112.0, 201.5, 12.4, 55.4, 7.62, 24.6, 622.0], [6382, 5, 57.0, 34.27, \"no\", \"male\", \"white\", \"not reported\", \"no\", 31.21, 34.48, 21.21, 27.24, 348.0, 21.38, \"full scoring\", 71.9, NaN, 50.0, 111.0, 94.0, 86.0, 11.5, 73.3, 2.44, 12.8, 484.0], [6383, 5, 62.0, 23.97, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 6.15, 9.17, 3.95, 7.89, 517.0, 19.15, \"full scoring\", 89.91, 89.91, NaN, 142.0, 128.0, 57.5, 15.2, 55.9, 9.48, 19.4, 575.0], [6384, 5, 68.0, 22.48, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 5.77, 11.17, 4.05, 9.94, 489.0, 18.77, \"full scoring\", 81.5, 81.5, NaN, 94.0, 90.0, 110.5, 10.4, 68.9, 0.0, 20.7, 600.0], [6385, 5, 59.0, 25.94, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 38.87, 46.59, 27.49, 39.82, 443.0, 36.03, \"full scoring\", 76.51, 76.51, NaN, 183.0, 109.0, 136.0, 26.6, 57.3, 0.0, 16.2, 579.0], [6390, 5, 88.0, 24.38, \"no\", \"male\", \"white\", \"not reported\", \"no\", 31.49, 36.93, 14.9, 24.1, 463.0, 24.23, \"full scoring\", 89.21, 89.21, NaN, 60.0, 43.0, 56.0, 19.3, 58.3, 1.84, 20.5, 519.0], [6396, 5, 77.0, 29.41, \"no\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6401, 5, 83.0, 23.56, \"no\", \"female\", \"white\", \"not reported\", \"no\", 18.68, 23.8, 10.41, 18.51, 363.0, 18.35, \"full scoring\", 82.13, 83.07, 5.0, 79.0, 48.0, 73.5, 14.5, 33.9, 27.7, 23.9, 442.0], [6402, 5, 72.0, 36.2, \"no\", \"female\", \"white\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6408, 5, 90.0, 21.82, \"yes\", \"male\", \"black or african american\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6410, 5, 62.0, 25.46, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 0.73, 1.02, 0.73, 1.02, 410.0, 4.68, \"full scoring\", 82.33, 84.54, 13.0, 53.0, 42.0, 75.0, 5.85, 66.2, 2.68, 25.2, 498.0], [6413, 5, 65.0, 31.53, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 62.86, 66.43, 54.76, 60.24, 252.0, 31.9, \"full scoring\", 52.72, 77.06, 151.0, 66.0, 61.0, 75.0, 15.9, 70.0, 0.6, 13.5, 478.0], [6414, 5, 77.0, 25.16, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 3.86, 5.43, 1.86, 3.86, 420.0, 22.86, \"full scoring\", 87.68, 89.17, 8.0, 72.0, 70.0, 51.0, 11.3, 55.3, 16.1, 17.3, 479.0], [6415, 5, 78.0, 25.45, \"no\", \"male\", \"white\", \"no\", \"yes\", 10.62, 13.6, 5.4, 9.5, 322.0, 15.65, \"full scoring\", 65.85, 70.0, 29.0, 97.0, 44.0, 137.5, 10.9, 61.6, 0.31, 27.2, 489.0], [6416, 5, 74.0, 25.86, \"no\", \"male\", \"white\", \"not reported\", \"no\", 7.75, 10.77, 5.02, 8.76, 418.0, 24.11, \"full scoring\", 87.45, 88.0, 3.0, 50.0, 45.0, 56.5, 14.7, 61.6, 1.2, 22.5, 478.0], [6417, 5, 81.0, 26.31, \"no\", \"male\", \"white\", \"not reported\", \"no\", 25.86, 36.65, 16.26, 30.3, 406.0, 31.33, \"full scoring\", 74.77, 76.89, 15.0, 58.0, 43.0, 121.5, 27.1, 40.3, 0.74, 31.8, 543.0], [6419, 5, 73.0, 22.74, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 3.84, 6.06, 1.77, 4.58, 406.0, 19.51, \"full scoring\", 86.94, 86.94, NaN, 68.0, 61.0, 61.0, 7.14, 64.5, 16.6, 11.7, 467.0], [6422, 5, 81.0, 24.87, \"no\", \"female\", \"white\", \"no\", \"yes\", 11.28, 15.31, 5.15, 10.86, 431.0, 16.15, \"full scoring\", 84.34, 84.34, NaN, 59.0, 55.0, 80.0, 11.3, 62.4, 2.44, 23.9, 511.0], [6424, 5, 69.0, 28.0, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 15.2, 18.02, 10.97, 13.94, 383.0, 11.91, \"full scoring\", 70.15, 70.15, NaN, 160.0, 79.0, 163.0, 10.7, 64.4, 0.26, 24.7, 546.0], [6430, 5, 58.0, 30.39, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 0.36, 1.42, 0.36, 1.42, 337.0, 6.05, \"full scoring\", 94.93, 94.93, NaN, 65.0, 59.0, 17.5, 4.9, 70.2, 1.19, 23.7, 355.0], [6431, 5, 67.0, 24.12, \"no\", \"male\", \"asian\", \"no\", \"yes\", 15.29, 19.61, 8.14, 14.63, 361.0, 13.96, \"full scoring\", 77.3, 89.8, 65.0, 95.0, 89.0, 41.0, 11.9, 63.2, 1.11, 23.7, 467.0], [6432, 5, 60.0, 44.35, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 92.88, 94.32, 74.64, 79.92, 250.0, 45.6, \"full scoring\", 65.96, 65.96, NaN, 268.0, 148.0, 128.5, 42.0, 48.4, 2.0, 7.6, 379.0], [6433, 5, 76.0, 38.2, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 12.3, 15.19, 7.44, 11.7, 395.0, 17.77, \"full scoring\", 73.15, 78.53, 37.0, 241.0, 171.0, 108.0, 17.6, 59.4, 8.11, 14.8, 540.0], [6435, 5, 70.0, 29.4, \"no\", \"female\", \"white\", \"no\", \"yes\", 2.92, 3.51, 0.97, 2.14, 308.0, 10.91, \"full scoring\", 84.85, 84.85, NaN, 231.0, 183.0, 55.0, 10.1, 59.2, 12.7, 18.0, 363.0], [6438, 5, 61.0, 40.44, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 4.48, 5.84, 0.97, 2.92, 308.0, 19.68, \"full scoring\", 71.96, 73.33, 8.0, 190.0, 162.0, 112.0, 10.9, 75.0, 5.36, 8.77, 428.0], [6440, 5, 85.0, 28.65, \"no\", \"male\", \"white\", \"no\", \"yes\", 29.18, 33.08, 17.36, 23.4, 477.0, 23.9, \"full scoring\", 81.68, 81.68, NaN, 89.0, 61.0, 106.5, 11.8, 61.8, 10.2, 16.1, 584.0], [6442, 5, 88.0, 23.93, \"no\", \"male\", \"white\", \"no\", \"yes\", 22.82, 23.85, 15.13, 17.95, 468.0, 14.36, \"full scoring\", 83.72, 83.72, NaN, 67.0, 49.0, 90.5, 10.1, 69.3, 3.31, 17.2, 559.0], [6444, 5, 63.0, 32.02, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 39.76, 42.93, 33.41, 38.54, 246.0, 26.83, \"full scoring\", 41.48, 55.28, 148.0, 243.0, 54.0, 199.0, 11.4, 37.9, 28.1, 22.6, 593.0], [6445, 5, 60.0, 45.31, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 11.67, 15.5, 9.48, 14.04, 329.0, 14.04, \"full scoring\", 95.92, 95.92, NaN, 48.0, 44.0, 12.5, 4.86, 53.6, 21.3, 20.2, 343.0], [6447, 5, 69.0, 32.57, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.33, 1.66, 0.17, 1.49, 362.0, 25.19, \"full scoring\", 67.16, 81.17, 93.0, 51.0, 51.0, 84.5, 9.25, 66.4, 8.7, 15.6, 539.0], [6450, 5, 67.0, 23.97, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 4.29, 10.22, 1.98, 8.9, 182.0, 17.14, \"full scoring\", 85.85, 85.85, NaN, 83.0, 59.0, 30.0, 10.2, 34.3, 26.4, 29.1, 212.0], [6452, 5, 75.0, 29.67, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 9.33, 16.57, 5.95, 14.64, 373.0, 28.47, \"full scoring\", 74.6, 74.6, NaN, 94.0, 50.0, 127.0, 17.3, 56.6, 6.57, 19.6, 500.0], [6454, 5, 65.0, 26.27, \"no\", \"male\", \"white\", \"not reported\", \"no\", 6.25, 7.81, 2.34, 5.16, 384.0, 19.06, \"full scoring\", 88.28, 89.51, 6.0, 71.0, 55.0, 44.5, 7.03, 65.1, 3.26, 24.6, 435.0], [6460, 5, 57.0, 29.76, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 1.03, 1.2, 0.34, 0.51, 350.0, 12.17, \"full scoring\", 94.85, 94.85, NaN, 82.0, 74.0, 18.5, 11.0, 61.2, 5.44, 22.3, 369.0], [6462, 5, 58.0, 29.0, \"no\", \"female\", \"white\", \"no\", \"yes\", 35.1, 37.87, 29.05, 33.72, 347.0, 30.26, \"full scoring\", 77.28, 88.52, 57.0, 64.0, 61.0, 45.5, 20.6, 38.8, 16.3, 24.4, 449.0], [6467, 5, 60.0, 26.65, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 10.98, 12.79, 5.25, 7.54, 366.0, 9.84, \"full scoring\", 76.41, 92.19, 82.0, 232.0, 224.0, 31.0, 8.07, 74.1, 0.0, 17.8, 479.0], [6471, 5, 62.0, 32.28, \"no\", \"female\", \"white\", \"no\", \"yes\", 9.74, 20.41, 5.88, 17.47, 388.0, 22.11, \"full scoring\", 87.78, 90.23, 12.0, 116.0, 102.0, 42.0, 22.9, 63.5, 0.64, 12.9, 442.0], [6475, 5, 63.0, 25.95, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 18.49, 27.15, 12.59, 24.2, 305.0, 31.67, \"full scoring\", 63.67, NaN, 4.0, 70.0, 59.0, 170.0, 12.3, 68.0, 3.28, 16.4, 479.0], [6476, 5, 83.0, 21.87, \"no\", \"female\", \"white\", \"no\", \"yes\", 0.6, 2.53, 0.15, 2.08, 403.0, 18.61, \"full scoring\", 89.96, 89.96, NaN, 104.0, 91.0, 44.5, 7.32, 58.6, 18.9, 15.3, 448.0], [6477, 5, 57.0, 41.1, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 45.35, 61.23, 33.16, 54.6, 389.0, 50.13, \"full scoring\", 81.04, 81.04, NaN, 135.0, 106.0, 90.5, 30.3, 58.4, 0.0, 11.3, 480.0], [6479, 5, 61.0, 28.65, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6482, 5, 72.0, 29.8, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 20.98, 22.78, 13.98, 18.95, 266.0, 22.56, \"full scoring\", 84.71, 94.66, 33.0, 92.0, 88.0, 15.5, 11.3, 55.8, 16.5, 16.4, 314.0], [6485, 5, 71.0, 29.62, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 64.16, 70.1, 56.14, 64.75, 202.0, 44.26, \"full scoring\", 46.87, 46.87, NaN, 125.0, 59.0, 229.0, 41.6, 43.6, 0.74, 14.1, 431.0], [6491, 5, 64.0, 26.46, \"no\", \"male\", \"white\", \"no\", \"yes\", 1.56, 8.91, 0.78, 8.59, 384.0, 23.13, \"full scoring\", 83.84, 83.84, NaN, 104.0, 66.0, 74.0, 7.16, 69.9, 2.99, 19.9, 458.0], [6492, 5, 88.0, 33.15, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 52.57, 53.94, 48.08, 50.42, 307.0, 28.34, \"full scoring\", 62.65, 62.65, NaN, 166.0, 102.0, 182.5, 32.9, 59.0, 0.0, 8.14, 490.0], [6493, 5, 61.0, 28.16, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 11.88, 15.84, 7.92, 13.1, 197.0, 25.89, \"full scoring\", 41.13, 43.11, 22.0, 53.0, 37.0, 259.5, 20.3, 59.6, 1.78, 18.3, 479.0], [6500, 5, 67.0, 20.16, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 1.1, 3.29, 1.1, 3.29, 492.0, 19.02, \"full scoring\", 76.16, 76.16, NaN, 194.0, 82.0, 153.5, 14.0, 62.0, 5.9, 18.1, 646.0], [6501, 5, 64.0, 30.13, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 4.19, 5.9, 1.71, 4.19, 315.0, 7.43, \"full scoring\", 63.0, 64.81, 14.0, 74.0, 65.0, 171.0, 6.67, 74.9, 1.9, 16.5, 500.0], [6502, 5, 74.0, 18.97, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 5.93, 8.44, 4.13, 7.01, 334.0, 22.63, \"full scoring\", 69.73, 83.08, 77.0, 81.0, 48.0, 68.0, 8.25, 59.7, 12.1, 19.9, 479.0], [6503, 5, 60.0, 22.03, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 4.5, 5.67, 2.0, 3.33, 360.0, 11.5, \"full scoring\", 75.16, 87.38, 67.0, 53.0, 53.0, 52.5, 3.61, 49.3, 19.9, 27.2, 479.0], [6505, 5, 63.0, 26.32, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 0.0, 6.83, 0.0, 6.83, 202.0, 31.78, \"full scoring\", 62.54, 76.52, 59.0, 95.0, 77.0, 61.5, 20.5, 64.9, 1.98, 12.6, 323.0], [6506, 5, 64.0, 31.54, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 85.95, 94.05, 74.59, 84.32, 37.0, 66.49, \"full scoring\", 9.02, 15.74, 175.0, 0.0, 0.0, 197.5, 28.4, 71.6, 0.0, 0.0, 410.0], [6509, 5, 76.0, 21.7, \"no\", \"female\", \"white\", \"not reported\", \"no\", 6.62, 10.03, 6.62, 10.03, 317.0, 17.41, \"full scoring\", 66.88, 72.21, 35.0, 166.0, 122.0, 122.5, 22.3, 64.6, 0.95, 12.2, 474.0], [6514, 5, 76.0, 26.15, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 7.52, 9.26, 4.24, 6.17, 311.0, 7.91, \"full scoring\", 90.14, 90.14, NaN, 0.0, 0.0, 33.5, 17.6, 82.0, 0.48, 0.0, 345.0], [6516, 5, 80.0, 26.58, \"no\", \"male\", \"white\", \"not reported\", \"no\", 25.67, 27.61, 15.37, 17.91, 402.0, 14.18, \"full scoring\", 75.0, 76.43, 10.0, 89.0, 76.0, 123.5, 7.46, 45.0, 23.4, 24.1, 536.0], [6521, 5, 76.0, 38.69, \"no\", \"male\", \"white\", \"not reported\", \"no\", 61.27, 63.02, 46.67, 49.37, 378.0, 20.16, \"full scoring\", 76.21, 76.21, NaN, 166.0, 153.0, 117.5, 15.1, 72.5, 0.0, 12.5, 496.0], [6527, 5, 59.0, 20.37, \"no\", \"female\", \"white\", \"no\", \"yes\", 1.11, 3.47, 0.16, 2.84, 380.0, 11.37, \"full scoring\", 71.83, 84.82, 81.0, 60.0, 55.0, 67.5, 10.5, 55.7, 12.9, 20.8, 529.0], [6528, 5, 60.0, 39.44, \"no\", \"female\", \"white\", \"no\", \"yes\", 29.5, 32.0, 11.0, 16.25, 240.0, 18.0, \"full scoring\", 42.18, 45.54, 42.0, 409.0, 126.0, 287.0, 19.2, 62.9, 7.92, 10.0, 569.0], [6538, 5, 82.0, 27.64, \"no\", \"male\", \"white\", \"no\", \"yes\", 77.72, 82.03, 65.06, 75.95, 237.0, 57.72, \"full scoring\", 41.51, 53.74, 130.0, 221.0, 112.0, 203.5, 24.5, 54.1, 11.2, 10.1, 571.0], [6549, 5, 65.0, 30.04, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 44.69, 48.91, 33.78, 40.65, 341.0, 33.26, \"full scoring\", 82.57, 86.99, 21.0, 48.0, 43.0, 51.0, 13.5, 52.6, 18.9, 15.0, 413.0], [6550, 5, 63.0, 25.18, \"no\", \"male\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6557, 5, 58.0, 31.77, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 22.33, 33.36, 16.68, 30.67, 223.0, 30.67, \"full scoring\", 86.43, 86.43, NaN, 72.0, 50.0, 34.5, 8.31, 58.4, 13.9, 19.3, 258.0], [6566, 5, 77.0, 42.64, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 17.12, 22.98, 5.85, 15.37, 410.0, 30.88, \"full scoring\", 78.54, 78.54, NaN, 81.0, 64.0, 112.0, 7.33, 65.3, 13.4, 13.9, 522.0], [6567, 5, 70.0, 36.42, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 18.82, 24.9, 12.94, 22.16, 306.0, 46.67, \"full scoring\", 56.88, 70.83, 106.0, 191.0, 134.0, 126.0, 13.1, 81.7, 0.33, 4.91, 538.0], [6568, 5, 58.0, 39.63, \"no\", \"female\", \"white\", \"not reported\", \"no\", 21.13, 24.05, 15.55, 19.19, 247.0, 17.25, \"full scoring\", 70.98, 86.06, 61.0, 78.0, 77.0, 40.0, 6.07, 44.1, 35.4, 14.4, 348.0], [6569, 5, 76.0, 21.39, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6575, 5, 80.0, 21.7, \"no\", \"female\", \"white\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6577, 5, 71.0, 27.58, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 28.89, 34.29, 18.25, 27.62, 378.0, 32.7, \"full scoring\", 70.52, 74.7, 30.0, 8.0, 6.0, 127.5, 22.8, 55.2, 6.09, 15.9, 536.0], [6582, 5, 78.0, 24.8, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 19.39, 23.7, 12.43, 18.73, 362.0, 24.86, \"full scoring\", 82.09, 82.09, NaN, 115.0, 64.0, 79.0, 3.04, 47.6, 37.3, 12.0, 441.0], [6583, 5, 78.0, 28.64, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 15.86, 16.34, 12.72, 13.35, 382.0, 5.34, \"full scoring\", 89.46, 89.46, NaN, 109.0, 88.0, 44.5, 9.44, 65.5, 0.39, 24.6, 427.0], [6593, 5, 58.0, 27.38, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 3.38, 4.46, 1.85, 3.38, 390.0, 8.31, \"full scoring\", 86.28, 89.24, 15.0, 74.0, 69.0, 48.5, 8.34, 63.3, 8.22, 20.2, 452.0], [6599, 5, 68.0, 24.47, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 9.74, 10.74, 7.73, 9.02, 419.0, 22.34, \"full scoring\", 77.59, 77.59, NaN, 29.0, 23.0, 120.5, 24.5, 50.9, 2.39, 22.2, 540.0], [6607, 5, 70.0, 22.67, \"no\", \"female\", \"asian\", \"not reported\", \"no\", 4.73, 8.8, 2.76, 7.48, 457.0, 20.09, \"full scoring\", 91.77, 91.77, NaN, 41.0, 29.0, 41.0, 5.04, 41.2, 33.4, 20.4, 498.0], [6610, 5, 74.0, 37.06, \"no\", \"female\", \"white\", \"no\", \"yes\", 24.09, 34.19, 6.67, 23.66, 279.0, 34.19, \"full scoring\", 52.84, 65.19, 100.0, 182.0, 100.0, 149.5, 7.35, 49.1, 23.1, 20.4, 528.0], [6614, 5, 77.0, 23.52, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 11.53, 16.36, 6.86, 13.09, 385.0, 18.86, \"full scoring\", 73.61, 73.61, NaN, 58.0, 55.0, 137.5, 16.5, 43.7, 25.0, 14.8, 523.0], [6616, 5, 74.0, 23.69, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 56.64, 57.52, 56.5, 57.37, 411.0, 15.18, \"full scoring\", 79.5, 84.22, 29.0, 114.0, 95.0, 77.0, 17.3, 60.0, 4.14, 18.6, 517.0], [6618, 5, 72.0, 27.0, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6619, 5, 69.0, 33.41, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 15.96, 21.27, 8.64, 15.46, 361.0, 24.93, \"full scoring\", 66.73, 70.51, 29.0, 97.0, 40.0, 151.0, 10.7, 53.0, 8.74, 27.6, 541.0], [6621, 5, 58.0, 23.3, \"no\", \"female\", \"white\", \"no\", \"yes\", 1.74, 3.84, 0.62, 3.1, 484.0, 14.63, \"full scoring\", 84.62, 93.08, 52.0, 53.0, 48.0, 35.5, 6.31, 55.5, 10.9, 27.3, 572.0], [6622, 5, 82.0, 31.72, \"no\", \"female\", \"white\", \"no\", \"yes\", 15.52, 21.2, 4.73, 12.11, 317.0, 25.93, \"full scoring\", 71.88, 71.88, NaN, 237.0, 118.0, 124.0, 13.9, 58.0, 9.95, 18.2, 441.0], [6625, 5, 80.0, 26.03, \"no\", \"male\", \"asian\", \"not reported\", \"no\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6627, 5, 64.0, 38.69, \"no\", \"female\", \"white\", \"not reported\", \"no\", 9.56, 22.89, 8.22, 22.44, 270.0, 30.44, \"full scoring\", 83.33, 95.74, 42.0, 132.0, 126.0, 12.0, 21.3, 54.4, 3.71, 20.6, 324.0], [6629, 5, 78.0, 29.86, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 31.62, 32.65, 27.5, 28.97, 408.0, 15.0, \"full scoring\", 73.25, 73.25, NaN, 97.0, 67.0, 149.0, 7.48, 44.4, 23.1, 25.0, 557.0], [6630, 5, 77.0, 21.07, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 22.84, 28.84, 15.48, 24.97, 310.0, 24.19, \"full scoring\", 63.52, 63.52, NaN, 74.0, 61.0, 178.0, 7.26, 54.0, 11.5, 27.3, 488.0], [6632, 5, 83.0, 26.56, \"no\", \"female\", \"white\", \"no\", \"yes\", 36.8, 39.36, 27.04, 31.2, 375.0, 23.84, \"full scoring\", 81.52, 81.52, NaN, 88.0, 82.0, 84.5, 18.9, 56.8, 1.47, 22.8, 460.0], [6641, 5, 87.0, 29.11, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 16.96, 22.36, 12.3, 19.19, 322.0, 19.75, \"full scoring\", 67.51, 73.68, 40.0, 168.0, 106.0, 115.0, 17.4, 42.5, 20.2, 19.9, 477.0], [6646, 5, 73.0, 26.45, \"no\", \"male\", \"asian\", \"no\", \"yes\", 31.87, 34.45, 19.23, 23.83, 209.0, 21.53, \"full scoring\", 57.73, 57.73, NaN, 22.0, 21.0, 153.0, 20.6, 60.3, 5.02, 14.1, 362.0], [6648, 5, 66.0, 27.39, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 24.61, 28.47, 16.57, 21.88, 373.0, 13.35, \"full scoring\", 70.51, 81.09, 69.0, 50.0, 42.0, 87.5, 8.04, 51.9, 13.1, 26.9, 529.0], [6653, 5, 61.0, 27.93, \"no\", \"male\", \"white\", \"no\", \"yes\", 35.23, 37.16, 24.61, 29.12, 373.0, 22.04, \"full scoring\", 77.07, 80.04, 18.0, 332.0, 251.0, 93.5, 14.6, 74.0, 4.56, 6.85, 484.0], [6655, 5, 74.0, 39.52, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 40.88, 45.88, 26.47, 35.88, 204.0, 27.06, \"full scoring\", 44.84, 44.84, NaN, 33.0, 19.0, 250.5, 35.4, 46.4, 0.0, 18.2, 455.0], [6656, 5, 65.0, 25.08, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 36.74, 41.74, 24.78, 33.7, 276.0, 28.26, \"full scoring\", 64.94, 70.23, 32.0, 136.0, 95.0, 117.0, 19.2, 72.1, 0.54, 8.15, 425.0], [6657, 5, 57.0, 30.15, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 7.65, 22.71, 2.39, 18.88, 251.0, 32.27, \"full scoring\", 60.92, 74.04, NaN, 70.0, 66.0, 88.0, 13.9, 64.9, 3.78, 17.3, 412.0], [6663, 5, 68.0, 31.47, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 5.55, 11.32, 2.35, 9.61, 281.0, 17.08, \"full scoring\", 77.41, 77.41, NaN, 108.0, 64.0, 82.0, 15.3, 64.5, 4.1, 16.0, 363.0], [6671, 5, 58.0, 33.35, \"no\", \"male\", \"black or african american\", \"not reported\", \"no\", 14.12, 18.66, 7.06, 14.45, 357.0, 25.71, \"full scoring\", 84.8, NaN, NaN, 93.0, 72.0, 64.0, 12.9, 45.9, 12.9, 28.3, 421.0], [6672, 5, 90.0, 24.59, \"yes\", \"male\", \"white\", \"not reported\", \"no\", 29.09, 34.34, 19.19, 27.07, 297.0, 20.81, \"full scoring\", 54.9, 54.9, NaN, 155.0, 74.0, 243.5, 17.2, 60.5, 10.8, 11.5, 541.0], [6680, 5, 69.0, 31.98, \"no\", \"female\", \"black or african american\", \"yes\", \"yes\", 14.17, 15.46, 9.57, 11.96, 326.0, 16.2, \"full scoring\", 84.24, 88.83, 20.0, 65.0, 57.0, 41.0, 7.36, 44.9, 21.9, 25.8, 387.0], [6682, 5, 70.0, 23.11, \"no\", \"male\", \"white\", \"no\", \"yes\", 16.88, 20.94, 11.46, 18.23, 487.0, 25.26, \"full scoring\", 80.63, 80.63, NaN, 47.0, 39.0, 117.0, 16.0, 40.2, 23.8, 19.9, 604.0], [6685, 5, 69.0, 33.86, \"no\", \"male\", \"white\", \"no\", \"yes\", 24.63, 26.57, 21.82, 24.63, 341.0, 16.54, \"full scoring\", 63.27, 63.27, NaN, 179.0, 119.0, 198.0, 15.4, 65.1, 10.1, 9.4, 539.0], [6686, 5, 74.0, 34.14, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 22.63, 26.06, 7.54, 14.57, 350.0, 26.4, \"full scoring\", 80.83, 85.78, 25.0, 118.0, 104.0, 58.5, 15.7, 73.2, 1.57, 9.44, 433.0], [6693, 5, 62.0, 42.35, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 21.0, 22.42, 13.58, 15.16, 380.0, 9.63, \"full scoring\", 89.41, 89.41, NaN, 161.0, 140.0, 45.0, 5.8, 76.5, 1.58, 16.1, 425.0], [6695, 5, 55.0, 30.7, \"no\", \"male\", \"white\", \"not reported\", \"no\", 50.6, 55.55, 40.38, 48.13, 364.0, 33.46, \"full scoring\", 80.71, NaN, 18.0, 270.0, 208.0, 69.0, 10.9, 67.7, 9.35, 12.1, 451.0], [6697, 5, 65.0, 38.38, \"no\", \"male\", \"white\", \"not reported\", \"no\", 34.52, 38.06, 26.29, 32.58, 372.0, 26.29, \"full scoring\", 76.23, 83.97, 45.0, 134.0, 110.0, 71.0, 7.26, 47.4, 20.2, 25.1, 488.0], [6699, 5, 76.0, 36.68, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", NaN, NaN, NaN, NaN, NaN, NaN, \"unknown\", NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN], [6704, 5, 86.0, 21.74, \"no\", \"male\", \"white\", \"not reported\", \"no\", 77.33, 81.23, 71.7, 78.41, 277.0, 52.42, \"full scoring\", 48.94, 48.94, NaN, 235.0, 95.0, 289.0, 31.5, 63.5, 0.0, 5.06, 566.0], [6707, 5, 82.0, 24.55, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 13.69, 17.3, 11.89, 16.4, 333.0, 24.32, \"full scoring\", 61.78, 72.55, 80.0, 112.0, 45.0, 126.5, 23.3, 71.6, 0.15, 4.96, 539.0], [6709, 5, 85.0, 35.68, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 25.88, 29.54, 21.07, 26.79, 262.0, 21.98, \"full scoring\", 83.97, 83.97, NaN, 56.0, 54.0, 49.5, 18.5, 61.5, 0.76, 19.3, 312.0], [6722, 5, 61.0, 33.1, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 8.26, 10.71, 4.65, 8.65, 465.0, 17.16, \"full scoring\", 89.94, 93.75, 21.0, 64.0, 56.0, 30.5, 9.04, 52.5, 14.4, 24.0, 517.0], [6723, 5, 58.0, 33.93, \"no\", \"male\", \"white\", \"not reported\", \"no\", 3.84, 7.9, 0.64, 5.98, 281.0, 24.77, \"full scoring\", 59.53, 76.57, 105.0, 68.0, 43.0, 86.5, 19.6, 55.5, 7.83, 17.1, 472.0], [6726, 5, 63.0, 43.24, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 80.62, 84.89, 74.86, 81.73, 323.0, 68.17, \"full scoring\", 78.97, 78.97, NaN, 59.0, 49.0, 85.5, 25.2, 51.1, 14.1, 9.6, 409.0], [6727, 5, 71.0, 28.55, \"no\", \"female\", \"white\", \"not reported\", \"no\", 8.86, 12.12, 4.82, 8.39, 386.0, 10.57, \"full scoring\", 71.88, 81.09, 61.0, 74.0, 70.0, 90.0, 5.44, 54.4, 19.9, 20.2, 537.0], [6730, 5, 60.0, 23.18, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 0.29, 0.71, 0.14, 0.57, 421.0, 13.68, \"full scoring\", 85.92, 85.92, NaN, 59.0, 31.0, 69.0, 10.6, 46.4, 25.8, 17.2, 490.0], [6734, 5, 61.0, 44.79, \"no\", \"female\", \"white\", \"no\", \"yes\", 79.76, 93.41, 61.62, 81.74, 334.0, 62.51, \"full scoring\", 74.39, 74.39, NaN, 222.0, 137.0, 114.5, 14.7, 73.5, 0.3, 11.5, 449.0], [6737, 5, 62.0, 24.18, \"no\", \"male\", \"white\", \"not reported\", \"no\", 10.02, 10.98, 3.71, 5.08, 437.0, 4.26, \"full scoring\", 91.23, 91.23, NaN, 57.0, 52.0, 42.0, 10.2, 63.7, 2.52, 23.6, 479.0], [6739, 5, 77.0, 21.01, \"no\", \"female\", \"white\", \"not reported\", \"no\", 11.59, 13.24, 8.28, 10.07, 435.0, 9.52, \"full scoring\", 86.14, 86.14, NaN, 28.0, 28.0, 70.0, 13.0, 64.5, 0.8, 21.7, 505.0], [6741, 5, 81.0, 21.79, \"no\", \"male\", \"asian\", \"not reported\", \"no\", 44.1, 47.44, 40.26, 46.15, 234.0, 38.46, \"full scoring\", 48.85, 51.66, 26.0, 166.0, 69.0, 218.5, 50.3, 35.8, 0.0, 13.9, 479.0], [6746, 5, 71.0, 27.84, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 2.91, 3.25, 0.68, 1.37, 351.0, NaN, \"sleep/wake only\", 81.44, 81.44, NaN, NaN, NaN, 80.0, NaN, NaN, NaN, NaN, 431.0], [6751, 5, 68.0, 27.17, \"no\", \"male\", \"white\", \"no\", \"yes\", 9.5, 17.5, 2.88, 12.88, 480.0, 21.38, \"full scoring\", 88.07, 88.07, NaN, 208.0, 176.0, 65.0, 17.4, 62.5, 2.09, 18.0, 545.0], [6754, 5, 62.0, 30.35, \"no\", \"male\", \"white\", \"no\", \"yes\", 5.26, 12.92, 0.66, 8.76, 274.0, 23.21, \"full scoring\", 71.17, 75.9, 24.0, 133.0, 84.0, 87.0, 14.3, 51.7, 8.41, 25.6, 385.0], [6755, 5, 63.0, 25.21, \"no\", \"female\", \"white\", \"yes\", \"yes\", 18.47, 28.82, 10.79, 23.65, 406.0, 29.85, \"full scoring\", 84.76, 91.86, 37.0, 68.0, 67.0, 36.5, 23.8, 53.4, 4.8, 18.0, 479.0], [6756, 5, 71.0, 32.73, \"no\", \"female\", \"white\", \"no\", \"yes\", 39.77, 43.67, 32.79, 39.21, 430.0, 39.91, \"full scoring\", 78.32, 78.32, NaN, 147.0, 127.0, 119.0, 25.7, 48.3, 3.84, 22.2, 549.0], [6757, 5, 73.0, 33.98, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 3.64, 7.79, 1.82, 6.23, 231.0, 15.32, \"full scoring\", 74.28, 95.45, 69.0, 58.0, 56.0, 10.5, 12.1, 70.1, 4.12, 13.7, 311.0], [6759, 5, 63.0, 30.32, \"no\", \"female\", \"hispanic\", \"not reported\", \"no\", 4.42, 5.21, 2.21, 3.32, 380.0, 12.0, \"full scoring\", 74.07, 74.07, NaN, 123.0, 62.0, 133.0, 3.42, 70.3, 12.5, 13.8, 513.0], [6773, 5, 60.0, 28.69, \"no\", \"female\", \"hispanic\", \"no\", \"yes\", 1.65, 3.29, 0.47, 2.35, 255.0, 10.82, \"full scoring\", 79.94, 89.47, 34.0, 30.0, 16.0, 30.0, 15.1, 60.8, 0.0, 24.1, 319.0], [6781, 5, 66.0, 29.02, \"no\", \"male\", \"hispanic\", \"not reported\", \"no\", 24.54, 37.47, 16.51, 33.9, 269.0, 33.01, \"full scoring\", 56.16, 65.61, 69.0, 61.0, 57.0, 141.0, 11.2, 53.3, 15.3, 20.3, 479.0], [6783, 5, 85.0, 20.0, \"no\", \"female\", \"white\", \"not reported\", \"no\", 7.42, 12.33, 4.4, 10.69, 477.0, 23.77, \"full scoring\", 80.85, 89.49, 57.0, 136.0, 126.0, 56.0, 10.2, 60.2, 11.6, 17.9, 590.0], [6784, 5, 78.0, 25.94, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 16.52, 18.08, 12.62, 14.96, 385.0, 17.92, \"full scoring\", 83.15, 83.15, NaN, 82.0, 77.0, 77.5, 9.23, 59.7, 13.7, 17.4, 463.0], [6786, 5, 60.0, 34.7, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 13.35, 14.74, 9.36, 11.1, 346.0, 10.75, \"full scoring\", 77.75, 77.75, NaN, 84.0, 45.0, 99.0, 7.38, 68.9, 7.67, 16.1, 445.0], [6788, 5, 59.0, 42.28, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 8.16, 8.41, 4.52, 5.02, 478.0, 5.27, \"full scoring\", 75.75, 75.75, NaN, 100.0, 54.0, 153.0, 2.62, 45.0, 36.6, 15.7, 631.0], [6789, 5, 74.0, 29.9, \"no\", \"male\", \"black or african american\", \"no\", \"yes\", 21.38, 23.44, 15.94, 20.44, 320.0, 28.13, \"full scoring\", 65.71, 65.71, NaN, 137.0, 48.0, 167.0, 8.75, 70.3, 2.66, 18.3, 487.0], [6790, 5, 72.0, 28.07, \"no\", \"male\", \"white\", \"not reported\", \"no\", 22.12, 22.6, 14.32, 16.07, 377.0, 16.23, \"full scoring\", 70.07, NaN, NaN, 208.0, 177.0, 161.0, 12.2, 58.0, 9.03, 20.7, 538.0], [6792, 5, 62.0, 29.9, \"no\", \"male\", \"white\", \"no\", \"yes\", 30.75, 39.69, 21.8, 35.4, 322.0, 34.47, \"full scoring\", 72.52, 75.94, 20.0, 76.0, 57.0, 102.0, 41.1, 31.3, 2.33, 25.3, 444.0], [6795, 5, 63.0, 29.07, \"no\", \"female\", \"white\", \"not reported\", \"no\", 7.48, 9.2, 3.83, 6.33, 313.0, 10.73, \"full scoring\", 73.47, 90.99, 82.0, 86.0, 79.0, 30.5, 13.7, 52.4, 12.5, 21.4, 426.0], [6796, 5, 55.0, 28.7, \"no\", \"female\", \"black or african american\", \"no\", \"yes\", 8.52, 11.53, 3.93, 7.73, 458.0, 21.09, \"full scoring\", 90.34, 90.34, NaN, 70.0, 56.0, 49.0, 7.1, 69.8, 10.3, 12.9, 507.0], [6802, 5, 65.0, 43.31, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 9.58, 13.65, 6.83, 11.68, 457.0, 21.27, \"full scoring\", 88.05, 91.04, 17.0, 116.0, 97.0, 44.5, 10.5, 67.0, 7.77, 14.8, 519.0], [6804, 5, 77.0, 24.32, \"no\", \"female\", \"black or african american\", \"not reported\", \"no\", 34.02, 35.77, 25.23, 28.37, 478.0, 18.2, \"full scoring\", 89.68, 92.1, 14.0, 84.0, 78.0, 41.5, 18.4, 60.9, 1.47, 19.2, 533.0], [6807, 5, 60.0, 28.32, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 48.24, 49.6, 43.42, 46.58, 398.0, 30.75, \"full scoring\", 79.28, 79.28, NaN, 192.0, 148.0, 103.5, 22.4, 60.6, 4.27, 12.8, 502.0], [6810, 5, 77.0, 30.47, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 25.84, 30.44, 15.58, 21.95, 339.0, 20.35, \"full scoring\", 67.53, 67.53, NaN, 79.0, 51.0, 163.0, 21.7, 57.6, 0.0, 20.7, 502.0], [6811, 5, 79.0, 27.73, \"no\", \"male\", \"hispanic\", \"no\", \"yes\", 34.24, 45.33, 29.18, 43.53, 368.0, 58.04, \"full scoring\", 69.57, 69.57, NaN, 152.0, 130.0, 161.0, 50.9, 33.7, 0.82, 14.6, 529.0], [6812, 5, 68.0, 27.02, \"no\", \"female\", \"hispanic\", \"yes\", \"yes\", 5.89, 11.16, 2.32, 9.26, 285.0, 18.53, \"full scoring\", 59.5, 76.41, 106.0, 120.0, 55.0, 87.5, 11.2, 59.4, 7.38, 22.0, 479.0]];\n",
       "\n",
       "        // Define the dt_args\n",
       "        let dt_args = {\"layout\": {\"topStart\": \"pageLength\", \"topEnd\": \"search\", \"bottomStart\": \"info\", \"bottomEnd\": \"paging\"}, \"order\": [], \"warn_on_selected_rows_not_rendered\": true, \"filtered_row_count\": 1934, \"fnInfoCallback\": function (oSettings, iStart, iEnd, iMax, iTotal, sPre) { return sPre + ' (<a href=\"https://mwouts.github.io/itables/downsampling.html\">downsampled</a> from 2,237x27 to 303x27 as maxBytes=64KB)'; }};\n",
       "        dt_args[\"data\"] = data;\n",
       "\n",
       "        \n",
       "        new DataTable(table, dt_args);\n",
       "    });\n",
       "</script>\n"
      ],
      "text/plain": [
       "      mesaid  examnumber  nsrr_age  nsrr_bmi nsrr_age_gt89 nsrr_sex  \\\n",
       "0          1           5      70.0     22.01            no   female   \n",
       "1          2           5      83.0     21.90            no   female   \n",
       "2          6           5      57.0     56.01            no   female   \n",
       "3         10           5      57.0     19.84            no     male   \n",
       "4         12           5      80.0     27.77            no     male   \n",
       "...      ...         ...       ...       ...           ...      ...   \n",
       "2232    6804           5      77.0     24.32            no   female   \n",
       "2233    6807           5      60.0     28.32            no     male   \n",
       "2234    6810           5      77.0     30.47            no     male   \n",
       "2235    6811           5      79.0     27.73            no     male   \n",
       "2236    6812           5      68.0     27.02            no   female   \n",
       "\n",
       "                      nsrr_race nsrr_current_smoker nsrr_ever_smoker  \\\n",
       "0                         white                  no              yes   \n",
       "1                         white        not reported               no   \n",
       "2                      hispanic                  no              yes   \n",
       "3                         white        not reported               no   \n",
       "4                         white        not reported               no   \n",
       "...                         ...                 ...              ...   \n",
       "2232  black or african american        not reported               no   \n",
       "2233                   hispanic                  no              yes   \n",
       "2234                   hispanic                  no              yes   \n",
       "2235                   hispanic                  no              yes   \n",
       "2236                   hispanic                 yes              yes   \n",
       "\n",
       "      nsrr_ahi_hp3u  ...  nsrr_ttlmefsp_f1  nsrr_ttllatsp_f1  \\\n",
       "0             18.14  ...             62.66              26.0   \n",
       "1              8.34  ...             86.37               NaN   \n",
       "2             62.51  ...             72.03               NaN   \n",
       "3             40.91  ...             55.28               NaN   \n",
       "4             27.47  ...             47.81              12.0   \n",
       "...             ...  ...               ...               ...   \n",
       "2232          34.02  ...             92.10              14.0   \n",
       "2233          48.24  ...             79.28               NaN   \n",
       "2234          25.84  ...             67.53               NaN   \n",
       "2235          34.24  ...             69.57               NaN   \n",
       "2236           5.89  ...             76.41             106.0   \n",
       "\n",
       "      nsrr_ttlprdsp_s1sr  nsrr_ttldursp_s1sr  nsrr_waso_f1 nsrr_pctdursp_s1  \\\n",
       "0                  124.0                67.0         205.5            19.70   \n",
       "1                   67.0                54.0          59.0             6.55   \n",
       "2                   78.0                21.0         139.0            19.70   \n",
       "3                    0.0                 0.0          89.0             9.13   \n",
       "4                  416.0               138.0         298.0            15.60   \n",
       "...                  ...                 ...           ...              ...   \n",
       "2232                84.0                78.0          41.5            18.40   \n",
       "2233               192.0               148.0         103.5            22.40   \n",
       "2234                79.0                51.0         163.0            21.70   \n",
       "2235               152.0               130.0         161.0            50.90   \n",
       "2236               120.0                55.0          87.5            11.20   \n",
       "\n",
       "      nsrr_pctdursp_s2  nsrr_pctdursp_s3  nsrr_pctdursp_sr  nsrr_tib_f1  \n",
       "0                 66.2              2.77              11.4        575.0  \n",
       "1                 48.4             20.90              24.2        433.0  \n",
       "2                 53.1             10.50              16.6        497.0  \n",
       "3                 57.5             33.30               0.0        199.0  \n",
       "4                 69.0              2.94              12.5        583.0  \n",
       "...                ...               ...               ...          ...  \n",
       "2232              60.9              1.47              19.2        533.0  \n",
       "2233              60.6              4.27              12.8        502.0  \n",
       "2234              57.6              0.00              20.7        502.0  \n",
       "2235              33.7              0.82              14.6        529.0  \n",
       "2236              59.4              7.38              22.0        479.0  \n",
       "\n",
       "[2237 rows x 27 columns]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "harm_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "harm_data.set_index('mesaid', inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(80.0)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "harm_data.loc[12].loc['nsrr_age']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "master",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}