Location Analysis -checkpoint.ipynb 364 KB
Newer Older
wx002's avatar
wx002 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# The Story told By Your Location Data\n",
    "\n",
    "**By: Corrine, Brad, and Ben**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introduction\n",
    "With modern technology, there are various applications that utilize location to enhance user experience. While many of these uses could be considered to be very beneficial, there is also another question to consider, how do we keep this data anonymous? Given how frequently online services keep track of personal location data, is it possible to identify individuals based on “anonymous” location data? Would these location data collecting features allow inference of personal information such as gender, name, location, or even unique identity? This project aims to explore such questions and determine if location data should be considered a major privacy infringement, and question whether or not it should be publicly available.\n",
    "\n",
    "# Overview\n",
    "We will start off with a small dataset, looking a the location history of an android phone over a month during 2014. Without any prior knowledge, our goal is to find out as much as possible about this particular individual carrying this phone. Then we will move forward looking at two distinct social network data sets and see how location data can be exploited when is within a group of users.\n",
    "\n",
    "# Android Phone Data \n",
    "We will start off with doing some basic task to get some understanding of the data set. Due to the original source of the dataset is JSON format, we have converted into text file format to make it easier to work with Python. Below are some basic info about this dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "      <th>Lat</th>\n",
       "      <th>Long</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2014-11-03 21:51:52.187</td>\n",
       "      <td>40.421279</td>\n",
       "      <td>-3.628637</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2014-11-03 21:50:50.228</td>\n",
       "      <td>40.421265</td>\n",
       "      <td>-3.628646</td>\n",
       "      <td>35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2014-11-03 21:49:50.132</td>\n",
       "      <td>40.421271</td>\n",
       "      <td>-3.628650</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2014-11-03 21:48:50.127</td>\n",
       "      <td>40.421274</td>\n",
       "      <td>-3.628639</td>\n",
       "      <td>34</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2014-11-03 21:47:49.271</td>\n",
       "      <td>40.421286</td>\n",
       "      <td>-3.628635</td>\n",
       "      <td>33</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    Dates        Lat      Long  Accuracy\n",
       "0 2014-11-03 21:51:52.187  40.421279 -3.628637        34\n",
       "1 2014-11-03 21:50:50.228  40.421265 -3.628646        35\n",
       "2 2014-11-03 21:49:50.132  40.421271 -3.628650        34\n",
       "3 2014-11-03 21:48:50.127  40.421274 -3.628639        34\n",
       "4 2014-11-03 21:47:49.271  40.421286 -3.628635        33"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import datetime\n",
    "\n",
    "phone_df = pd.read_csv('Datasets/phone_data.txt', parse_dates=['Dates'], sep='\\t')\n",
    "phone_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The dataset consist of time, latitude and longtitude. First, we want to combine latitude and longtitude into one single column."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>Location</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2014-11-03 21:51:52.187</td>\n",
       "      <td>34</td>\n",
       "      <td>(40.421279399999996, -3.6286372000000005)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2014-11-03 21:50:50.228</td>\n",
       "      <td>35</td>\n",
       "      <td>(40.4212652, -3.6286462999999998)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2014-11-03 21:49:50.132</td>\n",
       "      <td>34</td>\n",
       "      <td>(40.421271000000004, -3.6286498999999997)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2014-11-03 21:48:50.127</td>\n",
       "      <td>34</td>\n",
       "      <td>(40.4212744, -3.6286388)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2014-11-03 21:47:49.271</td>\n",
       "      <td>33</td>\n",
       "      <td>(40.421286200000004, -3.6286354)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    Dates  Accuracy                                   Location\n",
       "0 2014-11-03 21:51:52.187        34  (40.421279399999996, -3.6286372000000005)\n",
       "1 2014-11-03 21:50:50.228        35          (40.4212652, -3.6286462999999998)\n",
       "2 2014-11-03 21:49:50.132        34  (40.421271000000004, -3.6286498999999997)\n",
       "3 2014-11-03 21:48:50.127        34                   (40.4212744, -3.6286388)\n",
       "4 2014-11-03 21:47:49.271        33           (40.421286200000004, -3.6286354)"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "phone_df['Location'] = tuple(phone_df[['Lat','Long']].values)\n",
    "phone_df = phone_df.drop(columns = ['Lat', 'Long'])\n",
    "phone_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The next thing we want to do is looking at the location data more closely. To do this, we need to group them by dates after sorting it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "      <th>Accuracy</th>\n",
       "      <th>Location</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>43780</th>\n",
       "      <td>2014-09-30 21:54:03.688</td>\n",
       "      <td>27</td>\n",
       "      <td>(40.4212446, -3.6286241)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43779</th>\n",
       "      <td>2014-09-30 21:55:03.956</td>\n",
       "      <td>21</td>\n",
       "      <td>(40.4212787, -3.6285733999999996)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43778</th>\n",
       "      <td>2014-09-30 21:56:03.888</td>\n",
       "      <td>26</td>\n",
       "      <td>(40.421249200000005, -3.6286188999999998)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43777</th>\n",
       "      <td>2014-09-30 21:57:03.784</td>\n",
       "      <td>35</td>\n",
       "      <td>(40.421282, -3.6286157)</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43776</th>\n",
       "      <td>2014-09-30 21:58:03.933</td>\n",
       "      <td>37</td>\n",
       "      <td>(40.4212636, -3.6286042000000003)</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        Dates  Accuracy  \\\n",
       "43780 2014-09-30 21:54:03.688        27   \n",
       "43779 2014-09-30 21:55:03.956        21   \n",
       "43778 2014-09-30 21:56:03.888        26   \n",
       "43777 2014-09-30 21:57:03.784        35   \n",
       "43776 2014-09-30 21:58:03.933        37   \n",
       "\n",
       "                                        Location  \n",
       "43780                   (40.4212446, -3.6286241)  \n",
       "43779          (40.4212787, -3.6285733999999996)  \n",
       "43778  (40.421249200000005, -3.6286188999999998)  \n",
       "43777                    (40.421282, -3.6286157)  \n",
       "43776          (40.4212636, -3.6286042000000003)  "
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = phone_df.sort_values('Dates')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Specifically, we are interested in the following questions:\n",
    "1. How often does the android phone keep track of location data?\n",
    "2. What are some common places that the person go to?\n",
    "3. What info can be interpret based on our previous answers?\n",
    "4. How likely can we identify this individual?\n",
    "\n",
    "In order to do this, we first need to seperate the date and time."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['Time'] = df['Dates'].dt.time\n",
    "df['Dates'] = df['Dates'].dt.date\n",
    "df = df[['Dates', 'Time', 'Location', 'Accuracy']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "      <th>Time</th>\n",
       "      <th>Location</th>\n",
       "      <th>Accuracy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>43780</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:54:03.688000</td>\n",
       "      <td>(40.4212446, -3.6286241)</td>\n",
       "      <td>27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43779</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:55:03.956000</td>\n",
       "      <td>(40.4212787, -3.6285733999999996)</td>\n",
       "      <td>21</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43778</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:56:03.888000</td>\n",
       "      <td>(40.421249200000005, -3.6286188999999998)</td>\n",
       "      <td>26</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43777</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:57:03.784000</td>\n",
       "      <td>(40.421282, -3.6286157)</td>\n",
       "      <td>35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43776</th>\n",
       "      <td>2014-09-30</td>\n",
       "      <td>21:58:03.933000</td>\n",
       "      <td>(40.4212636, -3.6286042000000003)</td>\n",
       "      <td>37</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Dates             Time                                   Location  \\\n",
       "43780  2014-09-30  21:54:03.688000                   (40.4212446, -3.6286241)   \n",
       "43779  2014-09-30  21:55:03.956000          (40.4212787, -3.6285733999999996)   \n",
       "43778  2014-09-30  21:56:03.888000  (40.421249200000005, -3.6286188999999998)   \n",
       "43777  2014-09-30  21:57:03.784000                    (40.421282, -3.6286157)   \n",
       "43776  2014-09-30  21:58:03.933000          (40.4212636, -3.6286042000000003)   \n",
       "\n",
       "       Accuracy  \n",
       "43780        27  \n",
       "43779        21  \n",
       "43778        26  \n",
       "43777        35  \n",
       "43776        37  "
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 370,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Location</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Dates</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014-09-30</th>\n",
       "      <td>126</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-01</th>\n",
       "      <td>1307</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-02</th>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-03</th>\n",
       "      <td>1372</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-10-04</th>\n",
       "      <td>1413</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            Location\n",
       "Dates               \n",
       "2014-09-30       126\n",
       "2014-10-01      1307\n",
       "2014-10-02      1349\n",
       "2014-10-03      1372\n",
       "2014-10-04      1413"
      ]
     },
     "execution_count": 370,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Now we check distinct places per day.\n",
    "df_day = df[['Dates', 'Location']]\n",
    "df_freq = df_day.groupby(['Dates']).count()\n",
    "df_freq.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Max Location count: 126\n",
      "Min Location Count: 1429\n"
     ]
    }
   ],
   "source": [
    "m = max(df_freq['Location'])\n",
    "M = min(df_freq['Location'])\n",
    "print('Max Location count: {}\\nMin Location Count: {}'.format(M,m))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By this, we already can see that the android phone keep track of your location at least 126 times within a day. \n",
    "Next, we will look at specific locations. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Location</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(39.847814, -5.6267378)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.8596804, -5.613139)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.871458399999995, -5.582563200000001)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.871547, -5.5995402)</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(39.8723041, -5.5697503)</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                          Dates\n",
       "Location                                       \n",
       "(39.847814, -5.6267378)                       1\n",
       "(39.8596804, -5.613139)                       1\n",
       "(39.871458399999995, -5.582563200000001)      1\n",
       "(39.871547, -5.5995402)                       1\n",
       "(39.8723041, -5.5697503)                      2"
      ]
     },
     "execution_count": 172,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_loc = df_day.groupby('Location').count()\n",
    "df_loc.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We group locations and did a count on how many times it had been visited over the month. We will generate the results of the most frequent ones below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 252,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Dates</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Location</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>(40.4202487, -3.6303093)</th>\n",
       "      <td>1013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.115815399999995, -5.949015)</th>\n",
       "      <td>913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.4207664, -3.6332066)</th>\n",
       "      <td>754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.419880799999994, -3.630936)</th>\n",
       "      <td>675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>(40.4207763, -3.6332088)</th>\n",
       "      <td>655</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                 Dates\n",
       "Location                              \n",
       "(40.4202487, -3.6303093)          1013\n",
       "(40.115815399999995, -5.949015)    913\n",
       "(40.4207664, -3.6332066)           754\n",
       "(40.419880799999994, -3.630936)    675\n",
       "(40.4207763, -3.6332088)           655"
      ]
     },
     "execution_count": 252,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_locations = df_loc.sort_values('Dates', ascending=False)\n",
    "df_locations.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we can see, there are quite a few places that this phone travels to, so we will be primarily focusing on these since it provides the most infomation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 261,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Location</th>\n",
       "      <th>Dates</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(40.4202487, -3.6303093)</td>\n",
       "      <td>1013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(40.115815399999995, -5.949015)</td>\n",
       "      <td>913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(40.4207664, -3.6332066)</td>\n",
       "      <td>754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(40.419880799999994, -3.630936)</td>\n",
       "      <td>675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(40.4207763, -3.6332088)</td>\n",
       "      <td>655</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          Location  Dates\n",
       "0         (40.4202487, -3.6303093)   1013\n",
       "1  (40.115815399999995, -5.949015)    913\n",
       "2         (40.4207664, -3.6332066)    754\n",
       "3  (40.419880799999994, -3.630936)    675\n",
       "4         (40.4207763, -3.6332088)    655"
      ]
     },
     "execution_count": 261,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_new = df_locations.reset_index()\n",
    "df_new[df_new['Dates'] > 10].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The above consist of locations that had been visited more than 10 times. We will feed this into an reverse geocoding API to get better insights of the location itself."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 324,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "296\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Location</th>\n",
       "      <th>Count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(40.4202487, -3.6303093)</td>\n",
       "      <td>1013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(40.115815399999995, -5.949015)</td>\n",
       "      <td>913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(40.4207664, -3.6332066)</td>\n",
       "      <td>754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(40.419880799999994, -3.630936)</td>\n",
       "      <td>675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(40.4207763, -3.6332088)</td>\n",
       "      <td>655</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          Location  Count\n",
       "0         (40.4202487, -3.6303093)   1013\n",
       "1  (40.115815399999995, -5.949015)    913\n",
       "2         (40.4207664, -3.6332066)    754\n",
       "3  (40.419880799999994, -3.630936)    675\n",
       "4         (40.4207763, -3.6332088)    655"
      ]
     },
     "execution_count": 324,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "freq_locations = df_new[df_new['Dates']>10]\n",
    "freq_locations = freq_locations.rename(index=str, columns={'Dates':'Count'})\n",
    "print(len(freq_locations))\n",
    "freq_locations.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Below are the code to generate the readable addresses using Bing API and save it into a text file to preserve API usage."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 334,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"\\nimport geocoder\\nbing_key = 'AiEfap-qUoZalL1qK8ollM-SwVdoJFemh60tHo0EeraVYP8V4WPJXAVD2YjqzgA1'\\ncoordinates = freq_locations['Location']\\naddr_file = open('Datasets/phone_address_new.txt', 'w+', encoding='utf-8')\\nfor cord in coordinates:\\n    cord_list = list(cord)\\n    g = geocoder.bing(cord_list, method = 'reverse', key = bing_key)\\n    for r in g:\\n        line_str = r.address + ',' + r.city + ',' + r.country + '\\n'\\n        addr_file.write(str(cord_list) + ' : ' + line_str)\\n        print('{} : {}'.format(cord_list, line_str))\\naddr_file.close()\\nprint('finish address!')\\n\""
      ]
     },
     "execution_count": 334,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "import geocoder\n",
    "bing_key = 'AiEfap-qUoZalL1qK8ollM-SwVdoJFemh60tHo0EeraVYP8V4WPJXAVD2YjqzgA1'\n",
    "coordinates = freq_locations['Location']\n",
    "addr_file = open('Datasets/phone_address_new.txt', 'w+', encoding='utf-8')\n",
    "for cord in coordinates:\n",
    "    cord_list = list(cord)\n",
    "    g = geocoder.bing(cord_list, method = 'reverse', key = bing_key)\n",
    "    for r in g:\n",
    "        line_str = r.address + ',' + r.city + ',' + r.country + '\\n'\n",
    "        addr_file.write(str(cord_list) + ' : ' + line_str)\n",
    "        print('{} : {}'.format(cord_list, line_str))\n",
    "addr_file.close()\n",
    "print('finish address!')\n",
    "'''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After checking references of coordinates to address, it seems like because of how precise the location data is being keep track of, there are different coordinates that represents the same general area, so we have to do another parse to reduce the redundency of our results. Because of this, we have reduce the number places to 152."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 409,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Most frequent visted places: 152\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Count</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Address</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Calle de Nicolás Salmerón, 7, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>2971</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Autovía del Norte, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>1661</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de Villasilos, 8B, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>1451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de Nicolás Salmerón, 17, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>1429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Avenida de Bruselas, 37, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>1147</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de Matamorosa, 3, 28017 Madrid (Madrid),Madrid,Spain</th>\n",
       "      <td>1013</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>CC-51, 10617 El Torno (Cáceres),El Torno,Spain</th>\n",
       "      <td>913</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Avenida Bruselas, 31, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>768</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Calle de la Caléndula, 87, 28109 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>574</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Avenida de Fuencarral, 18, 28108 Alcobendas (Madrid),Alcobendas,Spain</th>\n",
       "      <td>567</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                    Count\n",
       "Address                                                  \n",
       " Calle de Nicolás Salmerón, 7, 28017 Madrid (Ma...   2971\n",
       " Autovía del Norte, 28108 Alcobendas (Madrid),A...   1661\n",
       " Calle de Villasilos, 8B, 28017 Madrid (Madrid)...   1451\n",
       " Calle de Nicolás Salmerón, 17, 28017 Madrid (M...   1429\n",
       " Avenida de Bruselas, 37, 28108 Alcobendas (Mad...   1147\n",
       " Calle de Matamorosa, 3, 28017 Madrid (Madrid),...   1013\n",
       " CC-51, 10617 El Torno (Cáceres),El Torno,Spain       913\n",
       " Avenida Bruselas, 31, 28108 Alcobendas (Madrid...    768\n",
       " Calle de la Caléndula, 87, 28109 Alcobendas (M...    574\n",
       " Avenida de Fuencarral, 18, 28108 Alcobendas (M...    567"
      ]
     },
     "execution_count": 409,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "address = pd.read_csv('Datasets\\phone_address_new.txt', sep=':', header = None)\n",
    "freq_locations['Address'] = address[1].values\n",
    "freq = freq_locations.groupby(['Address']).sum().sort_values('Count', ascending=False)\n",
    "print('Most frequent visted places: {}'.format(len(freq)))\n",
    "freq[:10]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Below is the map of the precise traveling locations of the phone on geo coordinates. This represents the general traveling locations of the person."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 411,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHNjcmlwdD5MX1BSRUZFUl9DQU5WQVM9ZmFsc2U7IExfTk9fVE9VQ0g9ZmFsc2U7IExfRElTQUJMRV8zRD1mYWxzZTs8L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJodHRwczovL2NvZGUuanF1ZXJ5LmNvbS9qcXVlcnktMS4xMi40Lm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvanMvYm9vdHN0cmFwLm1pbi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvTGVhZmxldC5hd2Vzb21lLW1hcmtlcnMvMi4wLjIvbGVhZmxldC5hd2Vzb21lLW1hcmtlcnMuanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2xlYWZsZXRAMS40LjAvZGlzdC9sZWFmbGV0LmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjIuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9tYXhjZG4uYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4yLjAvY3NzL2Jvb3RzdHJhcC10aGVtZS5taW4uY3NzIi8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vZm9udC1hd2Vzb21lLzQuNi4zL2Nzcy9mb250LWF3ZXNvbWUubWluLmNzcyIvPgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9MZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy8yLjAuMi9sZWFmbGV0LmF3ZXNvbWUtbWFya2Vycy5jc3MiLz4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9yYXdjZG4uZ2l0aGFjay5jb20vcHl0aG9uLXZpc3VhbGl6YXRpb24vZm9saXVtL21hc3Rlci9mb2xpdW0vdGVtcGxhdGVzL2xlYWZsZXQuYXdlc29tZS5yb3RhdGUuY3NzIi8+CiAgICA8c3R5bGU+aHRtbCwgYm9keSB7d2lkdGg6IDEwMCU7aGVpZ2h0OiAxMDAlO21hcmdpbjogMDtwYWRkaW5nOiAwO308L3N0eWxlPgogICAgPHN0eWxlPiNtYXAge3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO3JpZ2h0OjA7bGVmdDowO308L3N0eWxlPgogICAgCiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLAogICAgICAgIGluaXRpYWwtc2NhbGU9MS4wLCBtYXhpbXVtLXNjYWxlPTEuMCwgdXNlci1zY2FsYWJsZT1ubyIgLz4KICAgIDxzdHlsZT4jbWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDEwMC4wJTsKICAgICAgICBoZWlnaHQ6IDEwMC4wJTsKICAgICAgICBsZWZ0OiAwLjAlOwogICAgICAgIHRvcDogMC4wJTsKICAgICAgICB9CiAgICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIAogICAgPGRpdiBjbGFzcz0iZm9saXVtLW1hcCIgaWQ9Im1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYiIgPjwvZGl2Pgo8L2JvZHk+CjxzY3JpcHQ+ICAgIAogICAgCiAgICAKICAgICAgICB2YXIgYm91bmRzID0gbnVsbDsKICAgIAoKICAgIHZhciBtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIgPSBMLm1hcCgKICAgICAgICAnbWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiJywgewogICAgICAgIGNlbnRlcjogWzQwLjQyMDI0ODcsIC0zLjYzMDMwOTNdLAogICAgICAgIHpvb206IDEwLAogICAgICAgIG1heEJvdW5kczogYm91bmRzLAogICAgICAgIGxheWVyczogW10sCiAgICAgICAgd29ybGRDb3B5SnVtcDogZmFsc2UsCiAgICAgICAgY3JzOiBMLkNSUy5FUFNHMzg1NywKICAgICAgICB6b29tQ29udHJvbDogdHJ1ZSwKICAgICAgICB9KTsKCgogICAgCiAgICB2YXIgdGlsZV9sYXllcl82ZGRmOWYyOTAwZWY0NDc5OTYzYjU2YTg4Y2E3MTBlNiA9IEwudGlsZUxheWVyKAogICAgICAgICdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgewogICAgICAgICJhdHRyaWJ1dGlvbiI6IG51bGwsCiAgICAgICAgImRldGVjdFJldGluYSI6IGZhbHNlLAogICAgICAgICJtYXhOYXRpdmVab29tIjogMTgsCiAgICAgICAgIm1heFpvb20iOiAxOCwKICAgICAgICAibWluWm9vbSI6IDAsCiAgICAgICAgIm5vV3JhcCI6IGZhbHNlLAogICAgICAgICJvcGFjaXR5IjogMSwKICAgICAgICAic3ViZG9tYWlucyI6ICJhYmMiLAogICAgICAgICJ0bXMiOiBmYWxzZQp9KS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jZTk2OTY5OTdjNGE0YTM1OWQ2NzgyNTRlYzQ2MTBhMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIwMjQ4NywgLTMuNjMwMzA5M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmMjYyOGUzMDZjNDRiNmM5NmVmZDA3YmU0M2Y5M2JkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE3OGE5ZTQxYjMzYjQ2OGRiMmMyZGI2NmRiZmNlNzYxID0gJChgPGRpdiBpZD0iaHRtbF8xNzhhOWU0MWIzM2I0NjhkYjJjMmRiNjZkYmZjZTc2MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDI0ODcsIC0zLjYzMDMwOTNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hZjI2MjhlMzA2YzQ0YjZjOTZlZmQwN2JlNDNmOTNiZC5zZXRDb250ZW50KGh0bWxfMTc4YTllNDFiMzNiNDY4ZGIyYzJkYjY2ZGJmY2U3NjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZTk2OTY5OTdjNGE0YTM1OWQ2NzgyNTRlYzQ2MTBhMS5iaW5kUG9wdXAocG9wdXBfYWYyNjI4ZTMwNmM0NGI2Yzk2ZWZkMDdiZTQzZjkzYmQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wNThmNGMwODkzZmQ0YTk5OWJkYWMzYWZmNjQxNTBlYiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMTE1ODE1Mzk5OTk5OTk1LCAtNS45NDkwMTVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YWZhZDQ0MDdlYjU0NGNlOGExY2Q4ODdhODk5Yjc4MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YTRkNDYzODUxZmE0Y2QyYWMwYjI0YjVhNzlmYzQ1NiA9ICQoYDxkaXYgaWQ9Imh0bWxfNmE0ZDQ2Mzg1MWZhNGNkMmFjMGIyNGI1YTc5ZmM0NTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4xMTU4MTUzOTk5OTk5OTUsIC01Ljk0OTAxNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhZmFkNDQwN2ViNTQ0Y2U4YTFjZDg4N2E4OTliNzgwLnNldENvbnRlbnQoaHRtbF82YTRkNDYzODUxZmE0Y2QyYWMwYjI0YjVhNzlmYzQ1Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA1OGY0YzA4OTNmZDRhOTk5YmRhYzNhZmY2NDE1MGViLmJpbmRQb3B1cChwb3B1cF81YWZhZDQ0MDdlYjU0NGNlOGExY2Q4ODdhODk5Yjc4MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzY1NjliODRhNGU5NTQ4YmY4MDE1YTFiOTdjMmI1OWZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3NjY0LCAtMy42MzMyMDY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTM5YTczNTlhMTBmNDE1MDhjNzZkYzRhYjQ3YWRjMTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGMyNmI3NzcwYjBiNGMxMWE0ZjU0NWM1NWMzZTAwMDAgPSAkKGA8ZGl2IGlkPSJodG1sX2RjMjZiNzc3MGIwYjRjMTFhNGY1NDVjNTVjM2UwMDAwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzY2NCwgLTMuNjMzMjA2Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UzOWE3MzU5YTEwZjQxNTA4Yzc2ZGM0YWI0N2FkYzE2LnNldENvbnRlbnQoaHRtbF9kYzI2Yjc3NzBiMGI0YzExYTRmNTQ1YzU1YzNlMDAwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY1NjliODRhNGU5NTQ4YmY4MDE1YTFiOTdjMmI1OWZhLmJpbmRQb3B1cChwb3B1cF9lMzlhNzM1OWExMGY0MTUwOGM3NmRjNGFiNDdhZGMxNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzJjZmUxZWQyZDI5NjRkM2U5NDMzMzc5NTg2ZWQ5NjEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTk4ODA3OTk5OTk5OTQsIC0zLjYzMDkzNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4NDg3NmNmODdlNDRiMmI4MzIyZjAyOTc0NTYyYTJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRjOGJkOTczMmFiMDQyZTY4Zjc4ODY3OTI2NzM4ZDJiID0gJChgPGRpdiBpZD0iaHRtbF80YzhiZDk3MzJhYjA0MmU2OGY3ODg2NzkyNjczOGQyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTg4MDc5OTk5OTk5NCwgLTMuNjMwOTM2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjg0ODc2Y2Y4N2U0NGIyYjgzMjJmMDI5NzQ1NjJhMmIuc2V0Q29udGVudChodG1sXzRjOGJkOTczMmFiMDQyZTY4Zjc4ODY3OTI2NzM4ZDJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmNmZTFlZDJkMjk2NGQzZTk0MzMzNzk1ODZlZDk2MTMuYmluZFBvcHVwKHBvcHVwXzI4NDg3NmNmODdlNDRiMmI4MzIyZjAyOTc0NTYyYTJiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOTYzNzY2ZjA2ODg0NGNiMmE0YTZlM2Q5NjY2ZjIyNzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc3NjMsIC0zLjYzMzIwODhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZWVhZWYxNzNiMjY0NGNjOGM0Mzk3ZDAzMzA5ZTQxNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zMmFmZjQ5YzkwODQ0ZGI4ODVjZGZkODAzOTdjMGY1MyA9ICQoYDxkaXYgaWQ9Imh0bWxfMzJhZmY0OWM5MDg0NGRiODg1Y2RmZDgwMzk3YzBmNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3NzYzLCAtMy42MzMyMDg4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWVlYWVmMTczYjI2NDRjYzhjNDM5N2QwMzMwOWU0MTYuc2V0Q29udGVudChodG1sXzMyYWZmNDljOTA4NDRkYjg4NWNkZmQ4MDM5N2MwZjUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTYzNzY2ZjA2ODg0NGNiMmE0YTZlM2Q5NjY2ZjIyNzUuYmluZFBvcHVwKHBvcHVwX2VlZWFlZjE3M2IyNjQ0Y2M4YzQzOTdkMDMzMDllNDE2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmVmMWZhZDI2YjJhNDZhYmFlOGFmZTIwMTA4M2U0YTYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI1NTgsIC0zLjYyODYzMzI5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MGVlZjUwOThiZjI0ZTJhYjNmMWNhZjdlOTVmMWFlZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZGYyN2JlZDRkMWI0MDE5YTE0ZjIxMzYxYWYwYjlhZiA9ICQoYDxkaXYgaWQ9Imh0bWxfYWRmMjdiZWQ0ZDFiNDAxOWExNGYyMTM2MWFmMGI5YWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjEyNTU4LCAtMy42Mjg2MzMyOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODBlZWY1MDk4YmYyNGUyYWIzZjFjYWY3ZTk1ZjFhZWYuc2V0Q29udGVudChodG1sX2FkZjI3YmVkNGQxYjQwMTlhMTRmMjEzNjFhZjBiOWFmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmVmMWZhZDI2YjJhNDZhYmFlOGFmZTIwMTA4M2U0YTYuYmluZFBvcHVwKHBvcHVwXzgwZWVmNTA5OGJmMjRlMmFiM2YxY2FmN2U5NWYxYWVmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMDUwYTI4NGIzOGQ1NDExMGFiNzM0YjMzYzc5NWU4NzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI1MywgLTMuNjI4NjQxMV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJhNGVkMWQ5Y2YwNjQ4OTVhODJjYzY2NTUwYjllMjYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RkYzA5Zjk2NTg1NDQwZjdiMjVkMWExOWEzNDk0YzM5ID0gJChgPGRpdiBpZD0iaHRtbF9kZGMwOWY5NjU4NTQ0MGY3YjI1ZDFhMTlhMzQ5NGMzOSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI1MywgLTMuNjI4NjQxMV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJhNGVkMWQ5Y2YwNjQ4OTVhODJjYzY2NTUwYjllMjYxLnNldENvbnRlbnQoaHRtbF9kZGMwOWY5NjU4NTQ0MGY3YjI1ZDFhMTlhMzQ5NGMzOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA1MGEyODRiMzhkNTQxMTBhYjczNGIzM2M3OTVlODc3LmJpbmRQb3B1cChwb3B1cF8yYTRlZDFkOWNmMDY0ODk1YTgyY2M2NjU1MGI5ZTI2MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzBmMTI4OGQxOTU3YzQ4Yjc5NzJlOGQ3MzVlY2ZhODdlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzQxNzQ3OTk5OTk5OTUsIC0zLjY0MzY0ODNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zNWY3NTE5ZjA2ODg0NzhkYjY0ZjcwNDgxNjQwNThkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mYzBiMWRmYTlkMmM0MGRkYjQ5OTE4Y2EwNzBkNWVjYSA9ICQoYDxkaXYgaWQ9Imh0bWxfZmMwYjFkZmE5ZDJjNDBkZGI0OTkxOGNhMDcwZDVlY2EiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzQxNzQ3OTk5OTk5OTUsIC0zLjY0MzY0ODNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zNWY3NTE5ZjA2ODg0NzhkYjY0ZjcwNDgxNjQwNThkYy5zZXRDb250ZW50KGh0bWxfZmMwYjFkZmE5ZDJjNDBkZGI0OTkxOGNhMDcwZDVlY2EpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wZjEyODhkMTk1N2M0OGI3OTcyZThkNzM1ZWNmYTg3ZS5iaW5kUG9wdXAocG9wdXBfMzVmNzUxOWYwNjg4NDc4ZGI2NGY3MDQ4MTY0MDU4ZGMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kNGFkNjgwYjlmMjA0ZTY4ODg0ODEwOGM0ZDY4YmRiMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIzNjQ0NSwgLTMuNjI4MDE2Nzk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM4NTcwYWU2ODc2MTQ3NjM5MGQ2MDMxMWU0MTI1ODcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzZhZWQwMzRmYmZjYzQ0ZDM5ZmQ0ZGRjMTJlOTUyMmZmID0gJChgPGRpdiBpZD0iaHRtbF82YWVkMDM0ZmJmY2M0NGQzOWZkNGRkYzEyZTk1MjJmZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMzY0NDUsIC0zLjYyODAxNjc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODU3MGFlNjg3NjE0NzYzOTBkNjAzMTFlNDEyNTg3Mi5zZXRDb250ZW50KGh0bWxfNmFlZDAzNGZiZmNjNDRkMzlmZDRkZGMxMmU5NTIyZmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNGFkNjgwYjlmMjA0ZTY4ODg0ODEwOGM0ZDY4YmRiMS5iaW5kUG9wdXAocG9wdXBfMzg1NzBhZTY4NzYxNDc2MzkwZDYwMzExZTQxMjU4NzIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9hNjRmZjBhN2RjYjU0ODZjYWFhMzM0NWE3ZmNiNWNjOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5OTA0Mjk5OTk5OTksIC0zLjYzMDkyMzM5OTk5OTk5OTVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lYjVmOTM5ZjIwZGM0YWQxYmY2ZTVjZjViNGQ1ZWFhOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMjRiZjJjOWIyZTU0YzNmOGJhZmQyOTAwZDc3NjQ4NSA9ICQoYDxkaXYgaWQ9Imh0bWxfYTI0YmYyYzliMmU1NGMzZjhiYWZkMjkwMGQ3NzY0ODUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTk5MDQyOTk5OTk5OSwgLTMuNjMwOTIzMzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViNWY5MzlmMjBkYzRhZDFiZjZlNWNmNWI0ZDVlYWE5LnNldENvbnRlbnQoaHRtbF9hMjRiZjJjOWIyZTU0YzNmOGJhZmQyOTAwZDc3NjQ4NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E2NGZmMGE3ZGNiNTQ4NmNhYWEzMzQ1YTdmY2I1Y2M4LmJpbmRQb3B1cChwb3B1cF9lYjVmOTM5ZjIwZGM0YWQxYmY2ZTVjZjViNGQ1ZWFhOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzlkNWVhY2Q2ZjRhMDQzZjhhZTFjNGU4MDhkZTM3YTE0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3OTk5LCAtMy42MzMxODA3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGU4ZjdmZjllOWYwNDY1YzgwMTA2ZmJjYmI3ZTFiZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTc2ODdmNjAyMjE1NGViNGJiZTYwZDI5YmE2YzQwYzIgPSAkKGA8ZGl2IGlkPSJodG1sXzU3Njg3ZjYwMjIxNTRlYjRiYmU2MGQyOWJhNmM0MGMyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzk5OSwgLTMuNjMzMTgwN108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlOGY3ZmY5ZTlmMDQ2NWM4MDEwNmZiY2JiN2UxYmUzLnNldENvbnRlbnQoaHRtbF81NzY4N2Y2MDIyMTU0ZWI0YmJlNjBkMjliYTZjNDBjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlkNWVhY2Q2ZjRhMDQzZjhhZTFjNGU4MDhkZTM3YTE0LmJpbmRQb3B1cChwb3B1cF80ZThmN2ZmOWU5ZjA0NjVjODAxMDZmYmNiYjdlMWJlMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQ1YmMyMGM0MjU3MzQ3Yzg4OTgwMTI5ZTdlODFiOWRmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkwMTM1LCAtMy42NDE3MzAyMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmVhZDM2NWI5Mzg0NDE4YmFmZmIzZTkxNTAxYzYyOGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTUxOTkyMjBlMjA5NDFlYzg0OTc2MWY5OWM5MDc4OTAgPSAkKGA8ZGl2IGlkPSJodG1sX2U1MTk5MjIwZTIwOTQxZWM4NDk3NjFmOTljOTA3ODkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5MDEzNSwgLTMuNjQxNzMwMjAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZlYWQzNjViOTM4NDQxOGJhZmZiM2U5MTUwMWM2MjhjLnNldENvbnRlbnQoaHRtbF9lNTE5OTIyMGUyMDk0MWVjODQ5NzYxZjk5YzkwNzg5MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ1YmMyMGM0MjU3MzQ3Yzg4OTgwMTI5ZTdlODFiOWRmLmJpbmRQb3B1cChwb3B1cF9mZWFkMzY1YjkzODQ0MThiYWZmYjNlOTE1MDFjNjI4YykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzk3ZGQzZDIzNmM2MjRlZTViOTYxYjQ5YzI4ZWM5YmE3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3OTksIC0zLjYzMzE4NTEwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NjUwZTc0OWIyMTc0MDk0YmJlZWY5ZWM1OTA4OTIwOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MWRkNzk3ZmJlYTA0YjQzOTlhMzVhZWJlNzExNGExZiA9ICQoYDxkaXYgaWQ9Imh0bWxfNDFkZDc5N2ZiZWEwNGI0Mzk5YTM1YWViZTcxMTRhMWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3OTksIC0zLjYzMzE4NTEwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NjUwZTc0OWIyMTc0MDk0YmJlZWY5ZWM1OTA4OTIwOS5zZXRDb250ZW50KGh0bWxfNDFkZDc5N2ZiZWEwNGI0Mzk5YTM1YWViZTcxMTRhMWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85N2RkM2QyMzZjNjI0ZWU1Yjk2MWI0OWMyOGVjOWJhNy5iaW5kUG9wdXAocG9wdXBfOTY1MGU3NDliMjE3NDA5NGJiZWVmOWVjNTkwODkyMDkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iMjFjNWMxMzkyYmE0MzJlOGUzOWZkOTQ0ZWQ3MTg0OCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTE3MTQzNCwgLTMuNjQxMDU4N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzJkZTUwYWYyMmQwZTRkZWI4YWY2NjhiOTY1NjFjOGE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJkMzExZjY4MmYzZDQ1MzVhYWY3YjczZDllYTRhZmUxID0gJChgPGRpdiBpZD0iaHRtbF8yZDMxMWY2ODJmM2Q0NTM1YWFmN2I3M2Q5ZWE0YWZlMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUxNzE0MzQsIC0zLjY0MTA1ODddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZGU1MGFmMjJkMGU0ZGViOGFmNjY4Yjk2NTYxYzhhNi5zZXRDb250ZW50KGh0bWxfMmQzMTFmNjgyZjNkNDUzNWFhZjdiNzNkOWVhNGFmZTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMjFjNWMxMzkyYmE0MzJlOGUzOWZkOTQ0ZWQ3MTg0OC5iaW5kUG9wdXAocG9wdXBfMmRlNTBhZjIyZDBlNGRlYjhhZjY2OGI5NjU2MWM4YTYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85YmYwNzk4NDhlNzE0NGQxYWFiOTM4YmZlMGU1NGZiYiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI1NDgzMywgLTMuNjQ0NjE3Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI1NDg1ODA1Mjg4NDRjMjBiNmQyNjJjNzNjYzkxMzQxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY2ZmI4MGQzZjNhODRiNzE5NmY0YzM3NmU4YTM0YWRiID0gJChgPGRpdiBpZD0iaHRtbF82NmZiODBkM2YzYTg0YjcxOTZmNGMzNzZlOGEzNGFkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNTQ4MzMsIC0zLjY0NDYxNzZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNTQ4NTgwNTI4ODQ0YzIwYjZkMjYyYzczY2M5MTM0MS5zZXRDb250ZW50KGh0bWxfNjZmYjgwZDNmM2E4NGI3MTk2ZjRjMzc2ZThhMzRhZGIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85YmYwNzk4NDhlNzE0NGQxYWFiOTM4YmZlMGU1NGZiYi5iaW5kUG9wdXAocG9wdXBfMjU0ODU4MDUyODg0NGMyMGI2ZDI2MmM3M2NjOTEzNDEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kMTIwYWYyMzk4N2Y0MThhYTdlODU5YzI5YWE3ODkyMiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NTY0LCAtMy42NDQ2NzkxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGVlY2UyNDRlNDUzNGUyYWFhZGI1OTM4ZGZhOTIyNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjc1M2ZjNGNiZjJiNGNlMmEzMTc1N2FjMTBlMzA2NWMgPSAkKGA8ZGl2IGlkPSJodG1sX2I3NTNmYzRjYmYyYjRjZTJhMzE3NTdhYzEwZTMwNjVjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTY0LCAtMy42NDQ2NzkxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGVlY2UyNDRlNDUzNGUyYWFhZGI1OTM4ZGZhOTIyNmUuc2V0Q29udGVudChodG1sX2I3NTNmYzRjYmYyYjRjZTJhMzE3NTdhYzEwZTMwNjVjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDEyMGFmMjM5ODdmNDE4YWE3ZTg1OWMyOWFhNzg5MjIuYmluZFBvcHVwKHBvcHVwXzRlZWNlMjQ0ZTQ1MzRlMmFhYWRiNTkzOGRmYTkyMjZlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzU1NTkxZjQ0NGI2NGNmMWEwNGM4M2YwNTZhNDJkNjggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODEwNTksIC0zLjY0MzQzNzRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NjdlMGQ1YmMzNTk0NGIxODA4ZGYwMTA2NTEzNjU5MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MzQ0YjJlYzc4OTE0NjlkOGYzMjcwMzc0MDY2Nzk2NSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDM0NGIyZWM3ODkxNDY5ZDhmMzI3MDM3NDA2Njc5NjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjgxMDU5LCAtMy42NDM0Mzc0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTY3ZTBkNWJjMzU5NDRiMTgwOGRmMDEwNjUxMzY1OTEuc2V0Q29udGVudChodG1sXzQzNDRiMmVjNzg5MTQ2OWQ4ZjMyNzAzNzQwNjY3OTY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzU1NTkxZjQ0NGI2NGNmMWEwNGM4M2YwNTZhNDJkNjguYmluZFBvcHVwKHBvcHVwXzk2N2UwZDViYzM1OTQ0YjE4MDhkZjAxMDY1MTM2NTkxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfY2M5M2M5MTZmNjRlNGM0YThkZWY3YjQzOWQyYjc5OTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODU0NDEsIC0zLjY0MjU1NzRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OTBkYzI0MTYyOTc0MmNhOWU5MmNkZDAyNDIwYjZlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83MGQxMmNjNTBjNTc0MGEzODJjNDdjODk2ZDkxYzMzZSA9ICQoYDxkaXYgaWQ9Imh0bWxfNzBkMTJjYzUwYzU3NDBhMzgyYzQ3Yzg5NmQ5MWMzM2UiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1NDQxLCAtMy42NDI1NTc0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzkwZGMyNDE2Mjk3NDJjYTllOTJjZGQwMjQyMGI2ZTYuc2V0Q29udGVudChodG1sXzcwZDEyY2M1MGM1NzQwYTM4MmM0N2M4OTZkOTFjMzNlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2M5M2M5MTZmNjRlNGM0YThkZWY3YjQzOWQyYjc5OTAuYmluZFBvcHVwKHBvcHVwXzc5MGRjMjQxNjI5NzQyY2E5ZTkyY2RkMDI0MjBiNmU2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNTVlZTViYjVkZTdjNDBmMGJhYTUwMGFjMzI4N2E3YjggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjE3NzYxMzYsIC01LjgzMDg1MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NlMzI1ZGEyMzY2ODRlZGJhNWMzZjMyYTY3NDgyZGJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM5ZTVkNjViZDEyYzQ2YTZhODgxY2QzNzA2Yzc4YzAwID0gJChgPGRpdiBpZD0iaHRtbF8zOWU1ZDY1YmQxMmM0NmE2YTg4MWNkMzcwNmM3OGMwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjE3NzYxMzYsIC01LjgzMDg1MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlMzI1ZGEyMzY2ODRlZGJhNWMzZjMyYTY3NDgyZGJiLnNldENvbnRlbnQoaHRtbF8zOWU1ZDY1YmQxMmM0NmE2YTg4MWNkMzcwNmM3OGMwMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU1ZWU1YmI1ZGU3YzQwZjBiYWE1MDBhYzMyODdhN2I4LmJpbmRQb3B1cChwb3B1cF9jZTMyNWRhMjM2Njg0ZWRiYTVjM2YzMmE2NzQ4MmRiYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzdlZjZjNjMzZWUwNTRjN2NiYTVkMmUzZDYwMjQ4OTg0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MjI3LCAtMy42NDUzNzY1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjExMWUyMWM1NjVjNGViNmE4MGZhZGE5ZTlkNTliMDYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWIzMmU5Y2RkOTFjNDRlOTkyYTZmZGRlZGZkY2QwMDIgPSAkKGA8ZGl2IGlkPSJodG1sX2ViMzJlOWNkZDkxYzQ0ZTk5MmE2ZmRkZWRmZGNkMDAyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjIyNywgLTMuNjQ1Mzc2NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxMTFlMjFjNTY1YzRlYjZhODBmYWRhOWU5ZDU5YjA2LnNldENvbnRlbnQoaHRtbF9lYjMyZTljZGQ5MWM0NGU5OTJhNmZkZGVkZmRjZDAwMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdlZjZjNjMzZWUwNTRjN2NiYTVkMmUzZDYwMjQ4OTg0LmJpbmRQb3B1cChwb3B1cF9iMTExZTIxYzU2NWM0ZWI2YTgwZmFkYTllOWQ1OWIwNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQzZjNiYWM0MWU3NDQ2ZTE5Y2FjYzI0YjNiNTZiYWZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MTc5LCAtMy42NDUzNzk0OTk5OTk5OTk4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2U0N2I4MDczNDA3NGFhMmJjOTIyOGQ1MTljYmIyNjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWQ5NjVkMDY4Yzk5NDYzODhiOTllYWNhYTZmZmM1MGIgPSAkKGA8ZGl2IGlkPSJodG1sXzFkOTY1ZDA2OGM5OTQ2Mzg4Yjk5ZWFjYWE2ZmZjNTBiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjE3OSwgLTMuNjQ1Mzc5NDk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdlNDdiODA3MzQwNzRhYTJiYzkyMjhkNTE5Y2JiMjY3LnNldENvbnRlbnQoaHRtbF8xZDk2NWQwNjhjOTk0NjM4OGI5OWVhY2FhNmZmYzUwYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQzZjNiYWM0MWU3NDQ2ZTE5Y2FjYzI0YjNiNTZiYWZlLmJpbmRQb3B1cChwb3B1cF83ZTQ3YjgwNzM0MDc0YWEyYmM5MjI4ZDUxOWNiYjI2NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NmM2U2NDkyNjQ3OTQ5ZWU4ZjNiNzk1NjUxZjliOWFjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjg1MTE5LCAtMy42NDMxODAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTQ1ZWFkODJlNzUyNGRjMTkzYjY0NjI0ZGZlZmFiZTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGRiOGExYmVhNmYyNGQwNTg2ZDAyNzA3MmU0NzYwNWYgPSAkKGA8ZGl2IGlkPSJodG1sXzBkYjhhMWJlYTZmMjRkMDU4NmQwMjcwNzJlNDc2MDVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4NTExOSwgLTMuNjQzMTgwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU0NWVhZDgyZTc1MjRkYzE5M2I2NDYyNGRmZWZhYmU0LnNldENvbnRlbnQoaHRtbF8wZGI4YTFiZWE2ZjI0ZDA1ODZkMDI3MDcyZTQ3NjA1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NmM2U2NDkyNjQ3OTQ5ZWU4ZjNiNzk1NjUxZjliOWFjLmJpbmRQb3B1cChwb3B1cF81NDVlYWQ4MmU3NTI0ZGMxOTNiNjQ2MjRkZmVmYWJlNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA0YjgzZWZmMTExYzRjMzBhMzYyNDNiNTljNDZmYjFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjg3Nzc3LCAtMy42NDIyNTAxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTM4MGE5N2ViODJlNDYxODliYWMyYjU0M2UzMmVhNGMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmQ1ZGY4ZjYxNzAwNDkzMTk5ZTNiNWNmOTY1ZTMxZDEgPSAkKGA8ZGl2IGlkPSJodG1sX2ZkNWRmOGY2MTcwMDQ5MzE5OWUzYjVjZjk2NWUzMWQxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4Nzc3NywgLTMuNjQyMjUwMTAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2EzODBhOTdlYjgyZTQ2MTg5YmFjMmI1NDNlMzJlYTRjLnNldENvbnRlbnQoaHRtbF9mZDVkZjhmNjE3MDA0OTMxOTllM2I1Y2Y5NjVlMzFkMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA0YjgzZWZmMTExYzRjMzBhMzYyNDNiNTljNDZmYjFhLmJpbmRQb3B1cChwb3B1cF9hMzgwYTk3ZWI4MmU0NjE4OWJhYzJiNTQzZTMyZWE0YykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I5OTZlOWM0NDcyMTQ3MWVhOWFjNTJiZmFjMTg4ZDM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3OTc3LCAtMy42MzMxNTc4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTc1ZjZlYzVmMjhmNDIwNzgyOTRiMzQyOGRlNDUzZDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzlhNzQzMTM0NjhmNGY3ZTg4NjA1MzNhZjdlYjBhZTMgPSAkKGA8ZGl2IGlkPSJodG1sXzc5YTc0MzEzNDY4ZjRmN2U4ODYwNTMzYWY3ZWIwYWUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzk3NywgLTMuNjMzMTU3OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk3NWY2ZWM1ZjI4ZjQyMDc4Mjk0YjM0MjhkZTQ1M2Q3LnNldENvbnRlbnQoaHRtbF83OWE3NDMxMzQ2OGY0ZjdlODg2MDUzM2FmN2ViMGFlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I5OTZlOWM0NDcyMTQ3MWVhOWFjNTJiZmFjMTg4ZDM3LmJpbmRQb3B1cChwb3B1cF85NzVmNmVjNWYyOGY0MjA3ODI5NGIzNDI4ZGU0NTNkNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RjNWRiNmFkMDg4YzQ1ZGM4ZmJjYjdmMGI4NGM5ZjRmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3NjkyLCAtMy42MzMyMjY1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDg4Nzc0ZDI4ZmMyNGM4ZmI2ZDI5MjRmODU2ODhmOTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzNiNjlmY2Q2ZGY0NDJhMTljNjYyZTc5MzNlOWJmZTcgPSAkKGA8ZGl2IGlkPSJodG1sXzczYjY5ZmNkNmRmNDQyYTE5YzY2MmU3OTMzZTliZmU3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNzY5MiwgLTMuNjMzMjI2NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4ODc3NGQyOGZjMjRjOGZiNmQyOTI0Zjg1Njg4Zjk5LnNldENvbnRlbnQoaHRtbF83M2I2OWZjZDZkZjQ0MmExOWM2NjJlNzkzM2U5YmZlNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RjNWRiNmFkMDg4YzQ1ZGM4ZmJjYjdmMGI4NGM5ZjRmLmJpbmRQb3B1cChwb3B1cF9kODg3NzRkMjhmYzI0YzhmYjZkMjkyNGY4NTY4OGY5OSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2MyODIwYzVmNzZiZDRmMmViNzRmNGZlMmY0OTcxNzgzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkyNDEyOTk5OTk5OTUsIC0zLjY0MDY5NTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMmRmNzc3NTQzMDY0MTVlOTRmZTBhM2RmN2EyMjRkZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNWFjZjY3NDU4NDY0MjQ0OTZmMTFlNDc3OGQ5ZmEwMiA9ICQoYDxkaXYgaWQ9Imh0bWxfYzVhY2Y2NzQ1ODQ2NDI0NDk2ZjExZTQ3NzhkOWZhMDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNDEyOTk5OTk5OTUsIC0zLjY0MDY5NTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMmRmNzc3NTQzMDY0MTVlOTRmZTBhM2RmN2EyMjRkZi5zZXRDb250ZW50KGh0bWxfYzVhY2Y2NzQ1ODQ2NDI0NDk2ZjExZTQ3NzhkOWZhMDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jMjgyMGM1Zjc2YmQ0ZjJlYjc0ZjRmZTJmNDk3MTc4My5iaW5kUG9wdXAocG9wdXBfZDJkZjc3NzU0MzA2NDE1ZTk0ZmUwYTNkZjdhMjI0ZGYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yZDM5MTVkNjY5ZTc0NThjOTYxZjY1YmEwMDliZDUxNiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NDk0NywgLTMuNjQyNjM5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3OWIzYzA3MWJiOTRjZWQ5YTM5YjhiNTE3Mzg0NjcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2YTkzOWU1MDIyNTQ1MGViMzVkZGZhY2JhNGU2OTc0ID0gJChgPGRpdiBpZD0iaHRtbF80NmE5MzllNTAyMjU0NTBlYjM1ZGRmYWNiYTRlNjk3NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODQ5NDcsIC0zLjY0MjYzOTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kNzliM2MwNzFiYjk0Y2VkOWEzOWI4YjUxNzM4NDY3Mi5zZXRDb250ZW50KGh0bWxfNDZhOTM5ZTUwMjI1NDUwZWIzNWRkZmFjYmE0ZTY5NzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yZDM5MTVkNjY5ZTc0NThjOTYxZjY1YmEwMDliZDUxNi5iaW5kUG9wdXAocG9wdXBfZDc5YjNjMDcxYmI5NGNlZDlhMzliOGI1MTczODQ2NzIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85OTEyNmY5NTA3ZjY0YjNmOWYxMzBmZDRkMWViMTNmZiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NTE5NiwgLTMuNjQzMTk1OTAwMDAwMDAwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzgxNjU0OTc2ZTUwYzQyZmI4Y2YzMTEwOGVjNGY0NDE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM2NTM0N2RjMjM0MTQxNWY5ZDFmOGVhYzE3ZTcxZDAxID0gJChgPGRpdiBpZD0iaHRtbF8zNjUzNDdkYzIzNDE0MTVmOWQxZjhlYWMxN2U3MWQwMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxOTYsIC0zLjY0MzE5NTkwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MTY1NDk3NmU1MGM0MmZiOGNmMzExMDhlYzRmNDQxNC5zZXRDb250ZW50KGh0bWxfMzY1MzQ3ZGMyMzQxNDE1ZjlkMWY4ZWFjMTdlNzFkMDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85OTEyNmY5NTA3ZjY0YjNmOWYxMzBmZDRkMWViMTNmZi5iaW5kUG9wdXAocG9wdXBfODE2NTQ5NzZlNTBjNDJmYjhjZjMxMTA4ZWM0ZjQ0MTQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9hZTY0ZDY2N2VmMjU0NGNhYTU3YmYxMmNhNGMwM2FhNCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5ODkyMjk5OTk5OTk0LCAtMy42MzA5MzI5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmExZDNlMjEwMjgxNGQwYzhiOTNlNmNlMmI4MTFiNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGI5MjU4NWM3MjZiNDljYTgzYzBmMzgyMmRmZWQ1ZTUgPSAkKGA8ZGl2IGlkPSJodG1sXzhiOTI1ODVjNzI2YjQ5Y2E4M2MwZjM4MjJkZmVkNWU1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5ODkyMjk5OTk5OTk0LCAtMy42MzA5MzI5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmExZDNlMjEwMjgxNGQwYzhiOTNlNmNlMmI4MTFiNWUuc2V0Q29udGVudChodG1sXzhiOTI1ODVjNzI2YjQ5Y2E4M2MwZjM4MjJkZmVkNWU1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWU2NGQ2NjdlZjI1NDRjYWE1N2JmMTJjYTRjMDNhYTQuYmluZFBvcHVwKHBvcHVwX2JhMWQzZTIxMDI4MTRkMGM4YjkzZTZjZTJiODExYjVlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTk1MWE4ZmJkYWJlNGU5MDgyNzZhZDZjMWI1ZjliMDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMzQzMywgLTMuNjI3NjA2Mjk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4NzAxZTc3NmYyZTQ1Njk5YmI0MjYxNWQzOTE5NzM4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q2Y2NiYzZhZTIwODRlNmU4Y2MyMTEyMGEwZGFmNjk1ID0gJChgPGRpdiBpZD0iaHRtbF9kNmNjYmM2YWUyMDg0ZTZlOGNjMjExMjBhMGRhZjY5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMzQzMywgLTMuNjI3NjA2Mjk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y4NzAxZTc3NmYyZTQ1Njk5YmI0MjYxNWQzOTE5NzM4LnNldENvbnRlbnQoaHRtbF9kNmNjYmM2YWUyMDg0ZTZlOGNjMjExMjBhMGRhZjY5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE5NTFhOGZiZGFiZTRlOTA4Mjc2YWQ2YzFiNWY5YjA5LmJpbmRQb3B1cChwb3B1cF9mODcwMWU3NzZmMmU0NTY5OWJiNDI2MTVkMzkxOTczOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NlZTI5ZDBiM2RjNDRjNGM4YmM3MGYyMjkzNDNlYjk2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTcxMzQzLCAtMy43MDg3NTg2MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWFjM2M0YTI5M2RkNGIxOTkxNDVkYTA4M2EyYzRjYTIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWM2MDMwY2FjY2Y4NGY2ZjgyZTAxOTBmNWY2N2VlOWYgPSAkKGA8ZGl2IGlkPSJodG1sX2FjNjAzMGNhY2NmODRmNmY4MmUwMTkwZjVmNjdlZTlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk3MTM0MywgLTMuNzA4NzU4NjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhYzNjNGEyOTNkZDRiMTk5MTQ1ZGEwODNhMmM0Y2EyLnNldENvbnRlbnQoaHRtbF9hYzYwMzBjYWNjZjg0ZjZmODJlMDE5MGY1ZjY3ZWU5Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NlZTI5ZDBiM2RjNDRjNGM4YmM3MGYyMjkzNDNlYjk2LmJpbmRQb3B1cChwb3B1cF9hYWMzYzRhMjkzZGQ0YjE5OTE0NWRhMDgzYTJjNGNhMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2YyYWZmYWY0NWNkMDRhY2RiYzc4NGNhNGJhMWQwM2Y3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTEwMDI1LCAtMy42Mjg4NDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84ZTljNmE2YWNjMzQ0YmUwODI4MjM4ZmMzNjNjNTMyYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MzkxN2M4Y2JjZDk0ZWUxOWQyYTRmOTM5MTY5YzdhYiA9ICQoYDxkaXYgaWQ9Imh0bWxfNDM5MTdjOGNiY2Q5NGVlMTlkMmE0ZjkzOTE2OWM3YWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTEwMDI1LCAtMy42Mjg4NDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTljNmE2YWNjMzQ0YmUwODI4MjM4ZmMzNjNjNTMyYy5zZXRDb250ZW50KGh0bWxfNDM5MTdjOGNiY2Q5NGVlMTlkMmE0ZjkzOTE2OWM3YWIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMmFmZmFmNDVjZDA0YWNkYmM3ODRjYTRiYTFkMDNmNy5iaW5kUG9wdXAocG9wdXBfOGU5YzZhNmFjYzM0NGJlMDgyODIzOGZjMzYzYzUzMmMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85NjllN2EyMzJjNGU0MTMzYTMwNjRmZDMzNTNmNDY2MCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNDg1Nzk5OTk5OTk0LCAtMy42NDU1MjExMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDA0MWY4OTE0OThmNDcxNzk1NzdmNzcwODYwMGMxNzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzUxOTllNjhhYmYxNGJmMjg1MjY3M2M0MzEzMDFiODMgPSAkKGA8ZGl2IGlkPSJodG1sXzM1MTk5ZTY4YWJmMTRiZjI4NTI2NzNjNDMxMzAxYjgzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNDg1Nzk5OTk5OTk0LCAtMy42NDU1MjExMDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDA0MWY4OTE0OThmNDcxNzk1NzdmNzcwODYwMGMxNzMuc2V0Q29udGVudChodG1sXzM1MTk5ZTY4YWJmMTRiZjI4NTI2NzNjNDMxMzAxYjgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTY5ZTdhMjMyYzRlNDEzM2EzMDY0ZmQzMzUzZjQ2NjAuYmluZFBvcHVwKHBvcHVwXzQwNDFmODkxNDk4ZjQ3MTc5NTc3Zjc3MDg2MDBjMTczKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWUxYThiZjQyYWY3NGUxOGIyNjZhODFhMzMxYjg0ZGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzUzNzQsIC0zLjY0NDc1MTVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jMzQzMzUwYjA2NmU0M2I3OGI4OTQ3YTljNjYyYTVkZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lZWFmOWUzNTE5OGY0NDA1OGY4NTM4OGRkMTY3YzA4OSA9ICQoYDxkaXYgaWQ9Imh0bWxfZWVhZjllMzUxOThmNDQwNThmODUzODhkZDE2N2MwODkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc1Mzc0LCAtMy42NDQ3NTE1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzM0MzM1MGIwNjZlNDNiNzhiODk0N2E5YzY2MmE1ZGUuc2V0Q29udGVudChodG1sX2VlYWY5ZTM1MTk4ZjQ0MDU4Zjg1Mzg4ZGQxNjdjMDg5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWUxYThiZjQyYWY3NGUxOGIyNjZhODFhMzMxYjg0ZGUuYmluZFBvcHVwKHBvcHVwX2MzNDMzNTBiMDY2ZTQzYjc4Yjg5NDdhOWM2NjJhNWRlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNzBjNWMwNjBmNGM0NDMyZjhhMWE4MjEyY2EzNzRlMDggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyOTIzMTgsIC0zLjY0MDY4ODFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMjZmNGY0MGNjNzE0Y2QwOGI4MWQ3YTMyMzU1Y2ZmYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTM1NGRmYWE0YmM0OWFkYjlmOWQ3YjEyZWYxMTZlZSA9ICQoYDxkaXYgaWQ9Imh0bWxfYTEzNTRkZmFhNGJjNDlhZGI5ZjlkN2IxMmVmMTE2ZWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyMzE4LCAtMy42NDA2ODgxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTI2ZjRmNDBjYzcxNGNkMDhiODFkN2EzMjM1NWNmZmMuc2V0Q29udGVudChodG1sX2ExMzU0ZGZhYTRiYzQ5YWRiOWY5ZDdiMTJlZjExNmVlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzBjNWMwNjBmNGM0NDMyZjhhMWE4MjEyY2EzNzRlMDguYmluZFBvcHVwKHBvcHVwX2EyNmY0ZjQwY2M3MTRjZDA4YjgxZDdhMzIzNTVjZmZjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZWE1ZTU1NjhlMzcxNGRhZjkxODExNmExMmI2OTM3YTMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNDU4ODcsIC0zLjY0NjIyOTFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mMGIyNDkyY2VmNGI0OTI1YTM0Njk5NmU2NzlmNGZkYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83YjkwNzM5NGEzMzk0MzQyYjBlOTllNTg2Y2ZhMjc3NiA9ICQoYDxkaXYgaWQ9Imh0bWxfN2I5MDczOTRhMzM5NDM0MmIwZTk5ZTU4NmNmYTI3NzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjQ1ODg3LCAtMy42NDYyMjkxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZjBiMjQ5MmNlZjRiNDkyNWEzNDY5OTZlNjc5ZjRmZGMuc2V0Q29udGVudChodG1sXzdiOTA3Mzk0YTMzOTQzNDJiMGU5OWU1ODZjZmEyNzc2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWE1ZTU1NjhlMzcxNGRhZjkxODExNmExMmI2OTM3YTMuYmluZFBvcHVwKHBvcHVwX2YwYjI0OTJjZWY0YjQ5MjVhMzQ2OTk2ZTY3OWY0ZmRjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZWMyOTAzZDBjZjhjNDA0MThiMDI5NzA1MzNmNmRiYjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc5MjksIC0zLjYzMzIwOTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YTAwMjY2MjliYmY0MjllOGJiN2M4NmVjMTIzZjNhYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YjIyNmY3MDU1YmU0MWI5Yjg2NGU3NWJkYzZkNTE0NiA9ICQoYDxkaXYgaWQ9Imh0bWxfOWIyMjZmNzA1NWJlNDFiOWI4NjRlNzViZGM2ZDUxNDYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3OTI5LCAtMy42MzMyMDk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmEwMDI2NjI5YmJmNDI5ZThiYjdjODZlYzEyM2YzYWIuc2V0Q29udGVudChodG1sXzliMjI2ZjcwNTViZTQxYjliODY0ZTc1YmRjNmQ1MTQ2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWMyOTAzZDBjZjhjNDA0MThiMDI5NzA1MzNmNmRiYjMuYmluZFBvcHVwKHBvcHVwXzZhMDAyNjYyOWJiZjQyOWU4YmI3Yzg2ZWMxMjNmM2FiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYjQxMWM5ZjNjNjk5NDgwZjg4OTkzYTZlZDkyNzMzM2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc5MDk5OTk5OTk5NCwgLTMuNjMzMjA5M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QwYWRkOTk0OGMwMDQyNjRiMTBkYThkMmUwZjg4NjQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA4NWRlMDBhZjIxODRjNGNiZDVmYjIwNWJkYjExNjQxID0gJChgPGRpdiBpZD0iaHRtbF8wODVkZTAwYWYyMTg0YzRjYmQ1ZmIyMDViZGIxMTY0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDc5MDk5OTk5OTk5NCwgLTMuNjMzMjA5M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QwYWRkOTk0OGMwMDQyNjRiMTBkYThkMmUwZjg4NjQwLnNldENvbnRlbnQoaHRtbF8wODVkZTAwYWYyMTg0YzRjYmQ1ZmIyMDViZGIxMTY0MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I0MTFjOWYzYzY5OTQ4MGY4ODk5M2E2ZWQ5MjczMzNhLmJpbmRQb3B1cChwb3B1cF9kMGFkZDk5NDhjMDA0MjY0YjEwZGE4ZDJlMGY4ODY0MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzM3MmRjNWQ5NDAxNzRlYzk5N2U4MmM0MThhZjViMjc0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTI0NDMxMDAwMDAwMDQsIC0zLjcwNDQ3MDc5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NTEyOWZmNmI5MmE0Y2EzOTM1NTExODk3OGJmZWU5NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mNWIzZTE2MjE0ODI0ZWUyYjIxNjJkNThlNGE3YjZjMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZjViM2UxNjIxNDgyNGVlMmIyMTYyZDU4ZTRhN2I2YzEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTI0NDMxMDAwMDAwMDQsIC0zLjcwNDQ3MDc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80NTEyOWZmNmI5MmE0Y2EzOTM1NTExODk3OGJmZWU5NS5zZXRDb250ZW50KGh0bWxfZjViM2UxNjIxNDgyNGVlMmIyMTYyZDU4ZTRhN2I2YzEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNzJkYzVkOTQwMTc0ZWM5OTdlODJjNDE4YWY1YjI3NC5iaW5kUG9wdXAocG9wdXBfNDUxMjlmZjZiOTJhNGNhMzkzNTUxMTg5NzhiZmVlOTUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85ZDBlN2RlMDVlMWI0OWMwOTVkNWM1YmE3MDdiODE4YiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE1MjE0NiwgLTMuNjUxMDQ3MjAwMDAwMDAwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JkNmEwNWRjYTVlNzRlYjViZDEwYmNkOGVhZTM3MzZlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3YmQ0NjA4YTNlMTQ3NzM5N2E2OGRiYTUxNjBjMzQwID0gJChgPGRpdiBpZD0iaHRtbF8zN2JkNDYwOGEzZTE0NzczOTdhNjhkYmE1MTYwYzM0MCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTIxNDYsIC0zLjY1MTA0NzIwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9iZDZhMDVkY2E1ZTc0ZWI1YmQxMGJjZDhlYWUzNzM2ZS5zZXRDb250ZW50KGh0bWxfMzdiZDQ2MDhhM2UxNDc3Mzk3YTY4ZGJhNTE2MGMzNDApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZDBlN2RlMDVlMWI0OWMwOTVkNWM1YmE3MDdiODE4Yi5iaW5kUG9wdXAocG9wdXBfYmQ2YTA1ZGNhNWU3NGViNWJkMTBiY2Q4ZWFlMzczNmUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9hOWQ4YWVjYjVlMTE0YjkwYTc1OTRlYWQ2ZTY3MjUyMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk0NTA5ODk5OTk5OTk2LCAtMy43MDEwOTY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzFmNGNmOTJmNWQzNDBjNDg5YTM5YmQxODNmNWUxN2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWNiYTQwYTk3MDhjNDY3ZjkwYmRlNDEwOGVjYTQ1ZTQgPSAkKGA8ZGl2IGlkPSJodG1sXzljYmE0MGE5NzA4YzQ2N2Y5MGJkZTQxMDhlY2E0NWU0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk0NTA5ODk5OTk5OTk2LCAtMy43MDEwOTY2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzFmNGNmOTJmNWQzNDBjNDg5YTM5YmQxODNmNWUxN2Yuc2V0Q29udGVudChodG1sXzljYmE0MGE5NzA4YzQ2N2Y5MGJkZTQxMDhlY2E0NWU0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTlkOGFlY2I1ZTExNGI5MGE3NTk0ZWFkNmU2NzI1MjEuYmluZFBvcHVwKHBvcHVwX2MxZjRjZjkyZjVkMzQwYzQ4OWEzOWJkMTgzZjVlMTdmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzNhOTIzYTFhN2MyNDIyNzg2MDgwY2Q4ZjBlODYzOTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUwNDksIC0zLjY0MzI1ODYwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZDJlZWRhNDIwMGM0MzdmODU3MTUwMzYwMmQ3NmUxYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80Zjg1Y2ZiY2E5ODg0MmZhOWZiN2E3ZDYxYWY3YzkwMyA9ICQoYDxkaXYgaWQ9Imh0bWxfNGY4NWNmYmNhOTg4NDJmYTlmYjdhN2Q2MWFmN2M5MDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1MDQ5LCAtMy42NDMyNTg2MDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWQyZWVkYTQyMDBjNDM3Zjg1NzE1MDM2MDJkNzZlMWIuc2V0Q29udGVudChodG1sXzRmODVjZmJjYTk4ODQyZmE5ZmI3YTdkNjFhZjdjOTAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzNhOTIzYTFhN2MyNDIyNzg2MDgwY2Q4ZjBlODYzOTUuYmluZFBvcHVwKHBvcHVwXzFkMmVlZGE0MjAwYzQzN2Y4NTcxNTAzNjAyZDc2ZTFiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzQ1OGQ1N2IyYTM5NDY0ZGIzOGVkYjQyYTM1MzI4YmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM1MzkwMzQsIC0zLjgxODgwNTIwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YWY3NmQ3Njc2ZDU0OTMzOGFmZWUxZGQ1YWE4NmMxNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ODcxMjI4ZmE2ZDI0Y2RjYTY2ODc2NTJkMmY5ZGExNyA9ICQoYDxkaXYgaWQ9Imh0bWxfODg3MTIyOGZhNmQyNGNkY2E2Njg3NjUyZDJmOWRhMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zNTM5MDM0LCAtMy44MTg4MDUyMDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWFmNzZkNzY3NmQ1NDkzMzhhZmVlMWRkNWFhODZjMTcuc2V0Q29udGVudChodG1sXzg4NzEyMjhmYTZkMjRjZGNhNjY4NzY1MmQyZjlkYTE3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzQ1OGQ1N2IyYTM5NDY0ZGIzOGVkYjQyYTM1MzI4YmQuYmluZFBvcHVwKHBvcHVwXzVhZjc2ZDc2NzZkNTQ5MzM4YWZlZTFkZDVhYTg2YzE3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmE5M2NhNGQ1MjRlNDVhMmFmYzBlODFlNmY0ODA5YzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUwNywgLTMuNjQzMjY0NzAwMDAwMDAwNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlmZTZhNzM4MjNlZjQzNWJiYmI4OTZiZjI0MzgzYTA1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZlYTg0YzNiOWUzMzQ3YmE5MWE0NGUxNzRkNjM1ODg4ID0gJChgPGRpdiBpZD0iaHRtbF9mZWE4NGMzYjllMzM0N2JhOTFhNDRlMTc0ZDYzNTg4OCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUwNywgLTMuNjQzMjY0NzAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzlmZTZhNzM4MjNlZjQzNWJiYmI4OTZiZjI0MzgzYTA1LnNldENvbnRlbnQoaHRtbF9mZWE4NGMzYjllMzM0N2JhOTFhNDRlMTc0ZDYzNTg4OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhOTNjYTRkNTI0ZTQ1YTJhZmMwZTgxZTZmNDgwOWMxLmJpbmRQb3B1cChwb3B1cF85ZmU2YTczODIzZWY0MzViYmJiODk2YmYyNDM4M2EwNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzYxYzU0ZjNjYzIxMjQ3MGNiN2FlODIwN2M3Zjk3YWQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA4MDAyLCAtMy42MzMxODU4OTk5OTk5OTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2JhMDI1NjkxNjIxNDUxOGI2ZjcxZGVhMjc4MzIwMjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWUyMTNiYTFiNWU1NGZhNWJkZTFlYzFhMTQwY2RjZTAgPSAkKGA8ZGl2IGlkPSJodG1sX2VlMjEzYmExYjVlNTRmYTViZGUxZWMxYTE0MGNkY2UwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwODAwMiwgLTMuNjMzMTg1ODk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiYTAyNTY5MTYyMTQ1MThiNmY3MWRlYTI3ODMyMDI3LnNldENvbnRlbnQoaHRtbF9lZTIxM2JhMWI1ZTU0ZmE1YmRlMWVjMWExNDBjZGNlMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzYxYzU0ZjNjYzIxMjQ3MGNiN2FlODIwN2M3Zjk3YWQzLmJpbmRQb3B1cChwb3B1cF9jYmEwMjU2OTE2MjE0NTE4YjZmNzFkZWEyNzgzMjAyNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI4ZjZkM2M4NzY5MzQ1NjdiOTBhM2U4NWI2M2E4N2RmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjcwMTkzOTk5OTk5OSwgLTMuNjQ2NDQ0Mjk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3NmQ2MDFkZWEzZDQ2YjliYzI3NzI0MzZjYjcxMWQwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJhZDk3M2FjN2FmMDQ2MDFhOTMyYmJmNjk5MDg5NjZjID0gJChgPGRpdiBpZD0iaHRtbF8yYWQ5NzNhYzdhZjA0NjAxYTkzMmJiZjY5OTA4OTY2YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzAxOTM5OTk5OTk5LCAtMy42NDY0NDQyOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODc2ZDYwMWRlYTNkNDZiOWJjMjc3MjQzNmNiNzExZDAuc2V0Q29udGVudChodG1sXzJhZDk3M2FjN2FmMDQ2MDFhOTMyYmJmNjk5MDg5NjZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjhmNmQzYzg3NjkzNDU2N2I5MGEzZTg1YjYzYTg3ZGYuYmluZFBvcHVwKHBvcHVwXzg3NmQ2MDFkZWEzZDQ2YjliYzI3NzI0MzZjYjcxMWQwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODcyMTNhYjEyZjllNGYzMjhmMzc2ZDFiMTE3NzM2NDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI4OTksIC0zLjYyODU2NTQwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MjUzOTE3Nzk1M2E0ODEwOGZhOGM2Njc2ODEzMjdiZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xZWMzZjE2NjRjZjQ0Y2EwYWIyZjYxYjJmYmE4ZDNhYyA9ICQoYDxkaXYgaWQ9Imh0bWxfMWVjM2YxNjY0Y2Y0NGNhMGFiMmY2MWIyZmJhOGQzYWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjEyODk5LCAtMy42Mjg1NjU0MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjI1MzkxNzc5NTNhNDgxMDhmYThjNjY3NjgxMzI3YmYuc2V0Q29udGVudChodG1sXzFlYzNmMTY2NGNmNDRjYTBhYjJmNjFiMmZiYThkM2FjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODcyMTNhYjEyZjllNGYzMjhmMzc2ZDFiMTE3NzM2NDYuYmluZFBvcHVwKHBvcHVwXzYyNTM5MTc3OTUzYTQ4MTA4ZmE4YzY2NzY4MTMyN2JmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZWYxMTcyZDMyZDgzNGZiYTg1ODZlMThkMWVkYjZjMzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyOTIzNzQsIC0zLjY0MDczMDkwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NzhmNmI4ZTQ3NzA0OTg5YjFmMmZhNGIzNmM4NTg3OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81OTRlNThiNGJhODM0ODhiOTNjOWQ1ODUxZjhiMTc2MyA9ICQoYDxkaXYgaWQ9Imh0bWxfNTk0ZTU4YjRiYTgzNDg4YjkzYzlkNTg1MWY4YjE3NjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyMzc0LCAtMy42NDA3MzA5MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzc4ZjZiOGU0NzcwNDk4OWIxZjJmYTRiMzZjODU4Nzkuc2V0Q29udGVudChodG1sXzU5NGU1OGI0YmE4MzQ4OGI5M2M5ZDU4NTFmOGIxNzYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWYxMTcyZDMyZDgzNGZiYTg1ODZlMThkMWVkYjZjMzUuYmluZFBvcHVwKHBvcHVwXzc3OGY2YjhlNDc3MDQ5ODliMWYyZmE0YjM2Yzg1ODc5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYTU3YTA2MmM4Y2Y4NDgzYmEwYTU3NDdjNTE2YWY4ZTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUyMzc5OTk5OTk5NSwgLTMuNjQzMjQxMzk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2UxNTRlYWM4NDBmMjQxY2FhNmYxMGJkNDllOGZmZWJhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IxYTRjOGZhMmUyODQ5M2Q4MjhkYzJhN2M4YmEzM2JiID0gJChgPGRpdiBpZD0iaHRtbF9iMWE0YzhmYTJlMjg0OTNkODI4ZGMyYTdjOGJhMzNiYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUyMzc5OTk5OTk5NSwgLTMuNjQzMjQxMzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxNTRlYWM4NDBmMjQxY2FhNmYxMGJkNDllOGZmZWJhLnNldENvbnRlbnQoaHRtbF9iMWE0YzhmYTJlMjg0OTNkODI4ZGMyYTdjOGJhMzNiYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E1N2EwNjJjOGNmODQ4M2JhMGE1NzQ3YzUxNmFmOGUyLmJpbmRQb3B1cChwb3B1cF9lMTU0ZWFjODQwZjI0MWNhYTZmMTBiZDQ5ZThmZmViYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I2Yjg1NTYxNTYxYzQ0MTlhMDE0N2Q1NjBmYTcxODNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3MzYxLCAtMy42MTYzNzA1MDAwMDAwMDA0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNThkOWY3NzNlNGQ2NGY2OWJjZDY0NDY5ZWZjODRkYWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmIzOTM5MjA1NGY2NGE3YmE2NDczZDA0NzYxYjgzYWIgPSAkKGA8ZGl2IGlkPSJodG1sXzJiMzkzOTIwNTRmNjRhN2JhNjQ3M2QwNDc2MWI4M2FiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM1NzM2MSwgLTMuNjE2MzcwNTAwMDAwMDAwNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzU4ZDlmNzczZTRkNjRmNjliY2Q2NDQ2OWVmYzg0ZGFlLnNldENvbnRlbnQoaHRtbF8yYjM5MzkyMDU0ZjY0YTdiYTY0NzNkMDQ3NjFiODNhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I2Yjg1NTYxNTYxYzQ0MTlhMDE0N2Q1NjBmYTcxODNjLmJpbmRQb3B1cChwb3B1cF81OGQ5Zjc3M2U0ZDY0ZjY5YmNkNjQ0NjllZmM4NGRhZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzAyMmJkOWUxOTU5MDQ1MDliZDc0NDgwZjgwMGViMzMwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NDkxNTc2LCAtMy42OTYwMjU4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZGNiMWQ3NDQ2OGQzNDc3NGIwYTM1ZjJhMzVlYmNmMGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzBkMzUwYzljNGI2NDI3NmFjOTgzODU2OGQ3NzhkMDggPSAkKGA8ZGl2IGlkPSJodG1sX2MwZDM1MGM5YzRiNjQyNzZhYzk4Mzg1NjhkNzc4ZDA4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDQ5MTU3NiwgLTMuNjk2MDI1OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2RjYjFkNzQ0NjhkMzQ3NzRiMGEzNWYyYTM1ZWJjZjBhLnNldENvbnRlbnQoaHRtbF9jMGQzNTBjOWM0YjY0Mjc2YWM5ODM4NTY4ZDc3OGQwOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAyMmJkOWUxOTU5MDQ1MDliZDc0NDgwZjgwMGViMzMwLmJpbmRQb3B1cChwb3B1cF9kY2IxZDc0NDY4ZDM0Nzc0YjBhMzVmMmEzNWViY2YwYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2E1NTZmNTYwOThjZTRjYmFiZDY4Y2Y3MzQ4MTM5MThiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA3Njg1OTk5OTk5OTUsIC0zLjYzMzIxNjRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMjFlN2VkY2U0MWU0NjFkOTQ4YmY5Y2ZmMzlhYTE4NCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NDU5ZWNhNDk0NjI0MWJhYWE4YTI4ZTVkZjFiODczYiA9ICQoYDxkaXYgaWQ9Imh0bWxfNzQ1OWVjYTQ5NDYyNDFiYWFhOGEyOGU1ZGYxYjg3M2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA3Njg1OTk5OTk5OTUsIC0zLjYzMzIxNjRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lMjFlN2VkY2U0MWU0NjFkOTQ4YmY5Y2ZmMzlhYTE4NC5zZXRDb250ZW50KGh0bWxfNzQ1OWVjYTQ5NDYyNDFiYWFhOGEyOGU1ZGYxYjg3M2IpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hNTU2ZjU2MDk4Y2U0Y2JhYmQ2OGNmNzM0ODEzOTE4Yi5iaW5kUG9wdXAocG9wdXBfZTIxZTdlZGNlNDFlNDYxZDk0OGJmOWNmZjM5YWExODQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xZWI0NDk3OWFlMmQ0Nzc4OTk0NDBiMjUyMzAwY2FiMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNjM4Mzk5OTk5OTk0LCAtMy42NDUzNzIyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmEzMTdmM2ViOGQwNGNlM2EyNzQwNmY3MzFkY2FmMjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWVjOGQ3ZjZjNTc4NGNmMTg2MTM3MTVkOGNiNDEzMmUgPSAkKGA8ZGl2IGlkPSJodG1sXzFlYzhkN2Y2YzU3ODRjZjE4NjEzNzE1ZDhjYjQxMzJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjM4Mzk5OTk5OTk0LCAtMy42NDUzNzIyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZmEzMTdmM2ViOGQwNGNlM2EyNzQwNmY3MzFkY2FmMjIuc2V0Q29udGVudChodG1sXzFlYzhkN2Y2YzU3ODRjZjE4NjEzNzE1ZDhjYjQxMzJlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMWViNDQ5NzlhZTJkNDc3ODk5NDQwYjI1MjMwMGNhYjEuYmluZFBvcHVwKHBvcHVwX2ZhMzE3ZjNlYjhkMDRjZTNhMjc0MDZmNzMxZGNhZjIyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmEwNmExY2JjYTE0NDg1NjgxODEzNmY5ODA0NjA1NjYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjAzNTM2MDIsIC02LjA3OTkwNTIwMDAwMDAwMV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVhMWUzMmU0NjA0NDQ2YzZiNDdlY2Q0Y2U4MTcxMmE1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE0NjI5NjIzZDc0ZDRhYjlhOWZjN2NhNmNlNDFlZGRiID0gJChgPGRpdiBpZD0iaHRtbF8xNDYyOTYyM2Q3NGQ0YWI5YTlmYzdjYTZjZTQxZWRkYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjAzNTM2MDIsIC02LjA3OTkwNTIwMDAwMDAwMV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVhMWUzMmU0NjA0NDQ2YzZiNDdlY2Q0Y2U4MTcxMmE1LnNldENvbnRlbnQoaHRtbF8xNDYyOTYyM2Q3NGQ0YWI5YTlmYzdjYTZjZTQxZWRkYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JhMDZhMWNiY2ExNDQ4NTY4MTgxMzZmOTgwNDYwNTY2LmJpbmRQb3B1cChwb3B1cF81YTFlMzJlNDYwNDQ0NmM2YjQ3ZWNkNGNlODE3MTJhNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzk4YmI0YzkyMDI1YjQwZjRhZWU1MTJkNzE3NDBlYWFmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2Mzc4OTk5OTk5OTUsIC0zLjY0NTM2OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZTcxNGVkZGFiMTg0NGI1YmFiMGU1OGM1Mzc1NDdiNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82MGVmZjVkMGFmZmI0NGMyYjUwMmY1NjllMTNjN2U5YyA9ICQoYDxkaXYgaWQ9Imh0bWxfNjBlZmY1ZDBhZmZiNDRjMmI1MDJmNTY5ZTEzYzdlOWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2Mzc4OTk5OTk5OTUsIC0zLjY0NTM2OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZTcxNGVkZGFiMTg0NGI1YmFiMGU1OGM1Mzc1NDdiNy5zZXRDb250ZW50KGh0bWxfNjBlZmY1ZDBhZmZiNDRjMmI1MDJmNTY5ZTEzYzdlOWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85OGJiNGM5MjAyNWI0MGY0YWVlNTEyZDcxNzQwZWFhZi5iaW5kUG9wdXAocG9wdXBfMmU3MTRlZGRhYjE4NDRiNWJhYjBlNThjNTM3NTQ3YjcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wM2I2ZjgwMzJhOTE0NzhhYmUwYmQ4ZmFjYTA5MmViOSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5MjMyNSwgLTMuNjQwNjg3Mzk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ3ZWMyYzkzNGE0MDRmZDJhMWE2MzEwOTg5YWRiOTNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzg0YzdiN2EyOTQ1ZDQ1ZWI5YmM4OTUxNGJiNTVkMzBhID0gJChgPGRpdiBpZD0iaHRtbF84NGM3YjdhMjk0NWQ0NWViOWJjODk1MTRiYjU1ZDMwYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyOTIzMjUsIC0zLjY0MDY4NzM5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80N2VjMmM5MzRhNDA0ZmQyYTFhNjMxMDk4OWFkYjkzYy5zZXRDb250ZW50KGh0bWxfODRjN2I3YTI5NDVkNDVlYjliYzg5NTE0YmI1NWQzMGEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wM2I2ZjgwMzJhOTE0NzhhYmUwYmQ4ZmFjYTA5MmViOS5iaW5kUG9wdXAocG9wdXBfNDdlYzJjOTM0YTQwNGZkMmExYTYzMTA5ODlhZGI5M2MpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83ODQyNWFiNGRiZWM0OThjODc0MDU0MjZiYmFlNDk2MiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMDg4MDEwMTAwMDAwMDA1LCAtNS45ODM5ODAxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDUzZDc4NmI2MDBkNGYwM2I0MWEwYTQ2OGRhODk1NTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTI2MThiMGNjMDJlNDY2ZmFlZmYwOThjMjhjZmJlYmQgPSAkKGA8ZGl2IGlkPSJodG1sXzEyNjE4YjBjYzAyZTQ2NmZhZWZmMDk4YzI4Y2ZiZWJkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMDg4MDEwMTAwMDAwMDA1LCAtNS45ODM5ODAxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDUzZDc4NmI2MDBkNGYwM2I0MWEwYTQ2OGRhODk1NTcuc2V0Q29udGVudChodG1sXzEyNjE4YjBjYzAyZTQ2NmZhZWZmMDk4YzI4Y2ZiZWJkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzg0MjVhYjRkYmVjNDk4Yzg3NDA1NDI2YmJhZTQ5NjIuYmluZFBvcHVwKHBvcHVwXzQ1M2Q3ODZiNjAwZDRmMDNiNDFhMGE0NjhkYTg5NTU3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmFjZGJiYjUwYWM5NGE5NDkwOGEyOTRmMWFkNGY0ODUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNDUyMDMsIC0zLjY0NjE2NjFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lNzU2ZTJhNmY4NTY0OTlkODg5MDAyMmNmNzdmMGUyYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYWZmZTZjYmQwMTI0NjNkOTc1MTZkZjQwMTEzZWFmZSA9ICQoYDxkaXYgaWQ9Imh0bWxfMWFmZmU2Y2JkMDEyNDYzZDk3NTE2ZGY0MDExM2VhZmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjQ1MjAzLCAtMy42NDYxNjYxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTc1NmUyYTZmODU2NDk5ZDg4OTAwMjJjZjc3ZjBlMmEuc2V0Q29udGVudChodG1sXzFhZmZlNmNiZDAxMjQ2M2Q5NzUxNmRmNDAxMTNlYWZlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmFjZGJiYjUwYWM5NGE5NDkwOGEyOTRmMWFkNGY0ODUuYmluZFBvcHVwKHBvcHVwX2U3NTZlMmE2Zjg1NjQ5OWQ4ODkwMDIyY2Y3N2YwZTJhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMDZhYjQ2NzJhNmVhNDUwMDlhOWU5ZTkzMWFjNjdkZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDU4ODYsIC0zLjc5OTEzMzNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80MmFhNzlhZDNmNDA0MTBhYTEwMmM5OWM2Nzk3OWI2MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85YmRhYWQwYzI1OTM0MjkwOTg0ZjEwZDQwYmFkYzc2YyA9ICQoYDxkaXYgaWQ9Imh0bWxfOWJkYWFkMGMyNTkzNDI5MDk4NGYxMGQ0MGJhZGM3NmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA1ODg2LCAtMy43OTkxMzMzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDJhYTc5YWQzZjQwNDEwYWExMDJjOTljNjc5NzliNjMuc2V0Q29udGVudChodG1sXzliZGFhZDBjMjU5MzQyOTA5ODRmMTBkNDBiYWRjNzZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDZhYjQ2NzJhNmVhNDUwMDlhOWU5ZTkzMWFjNjdkZjIuYmluZFBvcHVwKHBvcHVwXzQyYWE3OWFkM2Y0MDQxMGFhMTAyYzk5YzY3OTc5YjYzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNTY2NjY0ZmMyYTUwNDEzMmIxMmMyMWUwNGE5NDI2NTUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjkxMzQsIC0zLjY0NzA3NThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iYTZmNWU3ZGZlYzE0MTNlYTllZjMzYjBlYWRmNjdlMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MmY4YzhjY2UyMGI0YmZiOTY5MGY1NjhjNjYyMzNiNyA9ICQoYDxkaXYgaWQ9Imh0bWxfODJmOGM4Y2NlMjBiNGJmYjk2OTBmNTY4YzY2MjMzYjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY5MTM0LCAtMy42NDcwNzU4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYmE2ZjVlN2RmZWMxNDEzZWE5ZWYzM2IwZWFkZjY3ZTAuc2V0Q29udGVudChodG1sXzgyZjhjOGNjZTIwYjRiZmI5NjkwZjU2OGM2NjIzM2I3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTY2NjY0ZmMyYTUwNDEzMmIxMmMyMWUwNGE5NDI2NTUuYmluZFBvcHVwKHBvcHVwX2JhNmY1ZTdkZmVjMTQxM2VhOWVmMzNiMGVhZGY2N2UwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmYwYjEyMWM2ZTljNGJjYTg3YWJlODMxNjMwMTdlMWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI3NzIwMDAwMDAwNiwgLTMuNjI4NjE5OTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ5OThmMmNlN2FkNjQ1MGVhMGZhOWI5MTkxMzFjNDY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2YTdmYzNmM2YwZDQ1Y2M4ZjZkNWE4MmM0ZTU2MjcyID0gJChgPGRpdiBpZD0iaHRtbF8yNmE3ZmMzZjNmMGQ0NWNjOGY2ZDVhODJjNGU1NjI3MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI3NzIwMDAwMDAwNiwgLTMuNjI4NjE5OTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ5OThmMmNlN2FkNjQ1MGVhMGZhOWI5MTkxMzFjNDY1LnNldENvbnRlbnQoaHRtbF8yNmE3ZmMzZjNmMGQ0NWNjOGY2ZDVhODJjNGU1NjI3Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJmMGIxMjFjNmU5YzRiY2E4N2FiZTgzMTYzMDE3ZTFiLmJpbmRQb3B1cChwb3B1cF80OTk4ZjJjZTdhZDY0NTBlYTBmYTliOTE5MTMxYzQ2NSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2FlY2ExNzJlMzlhMTQ2ODY5NjdlYWNjMTVmZTUyOTk5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTQ3MzI3LCAtMy43MDA3ODQzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTk4MDVmY2UzNzA1NDVjOTg2MDk2OTc2NzM0NDFmYjkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmNmNTBlMmM5Y2VmNDQxNzkzOTkyYjUyZTRkMWIyYWQgPSAkKGA8ZGl2IGlkPSJodG1sXzZjZjUwZTJjOWNlZjQ0MTc5Mzk5MmI1MmU0ZDFiMmFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE0NzMyNywgLTMuNzAwNzg0M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2E5ODA1ZmNlMzcwNTQ1Yzk4NjA5Njk3NjczNDQxZmI5LnNldENvbnRlbnQoaHRtbF82Y2Y1MGUyYzljZWY0NDE3OTM5OTJiNTJlNGQxYjJhZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FlY2ExNzJlMzlhMTQ2ODY5NjdlYWNjMTVmZTUyOTk5LmJpbmRQb3B1cChwb3B1cF9hOTgwNWZjZTM3MDU0NWM5ODYwOTY5NzY3MzQ0MWZiOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2QwNWU4MWYwMGQ4NDQ4MWY5ZjMxMGUzZmQzYTFjZTI0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkyNDEyLCAtMy42NDA2OTU1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2I4MmJjMzBhM2MxNDRjYmJlOTZlYTMyYmVlYjUzMzMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjkyOTZjNWZlY2M0NDVlZGJhMzcxOWM0YWMyYmU4NjUgPSAkKGA8ZGl2IGlkPSJodG1sX2Y5Mjk2YzVmZWNjNDQ1ZWRiYTM3MTljNGFjMmJlODY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5MjQxMiwgLTMuNjQwNjk1NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NiODJiYzMwYTNjMTQ0Y2JiZTk2ZWEzMmJlZWI1MzMzLnNldENvbnRlbnQoaHRtbF9mOTI5NmM1ZmVjYzQ0NWVkYmEzNzE5YzRhYzJiZTg2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QwNWU4MWYwMGQ4NDQ4MWY5ZjMxMGUzZmQzYTFjZTI0LmJpbmRQb3B1cChwb3B1cF9jYjgyYmMzMGEzYzE0NGNiYmU5NmVhMzJiZWViNTMzMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NkM2Q2OWRkNmM0ODRmYjBiNDdjODI5MmIwZDlhODZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0ODAxMDAwMDAwMDUsIC0zLjY0NjA2NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2NWU5NjgxZGU2ZDQzMWViMDhiOTRmMjgwNDM0NWZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y2ZDQ0MjQ0ODI5MTRhODliZGE1NmM2Njc4NzUyZGM1ID0gJChgPGRpdiBpZD0iaHRtbF9mNmQ0NDI0NDgyOTE0YTg5YmRhNTZjNjY3ODc1MmRjNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ4MDEwMDAwMDAwNSwgLTMuNjQ2MDY1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTY1ZTk2ODFkZTZkNDMxZWIwOGI5NGYyODA0MzQ1ZmYuc2V0Q29udGVudChodG1sX2Y2ZDQ0MjQ0ODI5MTRhODliZGE1NmM2Njc4NzUyZGM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2QzZDY5ZGQ2YzQ4NGZiMGI0N2M4MjkyYjBkOWE4NmQuYmluZFBvcHVwKHBvcHVwXzU2NWU5NjgxZGU2ZDQzMWViMDhiOTRmMjgwNDM0NWZmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfN2FjYmQ2ODc3NmY5NGQ3ZTg0NTcwZTEwODg2ZmZkODYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ4ODUwMDAwMDAwNCwgLTMuNjQ1NTE5MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M5NmRiM2IwNjYyODQ0ZjJhYjIzNWFiMjA3MDE3YjNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFlMzE1NTc5YzEwZDRlMDc4ZGVmNWU5OGMzNjJmZTI0ID0gJChgPGRpdiBpZD0iaHRtbF8xZTMxNTU3OWMxMGQ0ZTA3OGRlZjVlOThjMzYyZmUyNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDQ4ODUwMDAwMDAwNCwgLTMuNjQ1NTE5MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M5NmRiM2IwNjYyODQ0ZjJhYjIzNWFiMjA3MDE3YjNkLnNldENvbnRlbnQoaHRtbF8xZTMxNTU3OWMxMGQ0ZTA3OGRlZjVlOThjMzYyZmUyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdhY2JkNjg3NzZmOTRkN2U4NDU3MGUxMDg4NmZmZDg2LmJpbmRQb3B1cChwb3B1cF9jOTZkYjNiMDY2Mjg0NGYyYWIyMzVhYjIwNzAxN2IzZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzYxNDhjZTU0YTRmZjQ2NTBhMzIzZGI3ZTY5MWZiM2RhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTkyNzU1LCAtMy42NjI4NTcxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjdjNjhmMTM4ZWViNDVjOGJlYmE5YTQ4NjMyMTYwMmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmNkZWRlMjY4MDc0NGU4MjgwMTU2MmU1N2M2NzVlNGEgPSAkKGA8ZGl2IGlkPSJodG1sX2JjZGVkZTI2ODA3NDRlODI4MDE1NjJlNTdjNjc1ZTRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk5Mjc1NSwgLTMuNjYyODU3MTAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3YzY4ZjEzOGVlYjQ1YzhiZWJhOWE0ODYzMjE2MDJlLnNldENvbnRlbnQoaHRtbF9iY2RlZGUyNjgwNzQ0ZTgyODAxNTYyZTU3YzY3NWU0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzYxNDhjZTU0YTRmZjQ2NTBhMzIzZGI3ZTY5MWZiM2RhLmJpbmRQb3B1cChwb3B1cF9mN2M2OGYxMzhlZWI0NWM4YmViYTlhNDg2MzIxNjAyZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Q5MGY2OWRhOGJlMjQ3MDJhZmQ4NWE4NGU2ZGY1MmYxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MzcyOTk5OTk5OTUsIC0zLjY0NTM3MjldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9mYjQ5ZjAxMTNiYzk0MjA4YWUzZWY5N2MxZmFjOGUzYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83ZDAwZTJhMzE4Mjc0Yzk5YTIwMjBiMGUxYjQwNjQ2OCA9ICQoYDxkaXYgaWQ9Imh0bWxfN2QwMGUyYTMxODI3NGM5OWEyMDIwYjBlMWI0MDY0NjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2MzcyOTk5OTk5OTUsIC0zLjY0NTM3MjldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYjQ5ZjAxMTNiYzk0MjA4YWUzZWY5N2MxZmFjOGUzYy5zZXRDb250ZW50KGh0bWxfN2QwMGUyYTMxODI3NGM5OWEyMDIwYjBlMWI0MDY0NjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kOTBmNjlkYThiZTI0NzAyYWZkODVhODRlNmRmNTJmMS5iaW5kUG9wdXAocG9wdXBfZmI0OWYwMTEzYmM5NDIwOGFlM2VmOTdjMWZhYzhlM2MpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81ZTgxMDk3ODY5YTQ0OWEzYmM0YjY4YmQ5NDNjZDc5OSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NTI3Mjk5OTk5OTk2LCAtMy42NDQ3NTk5MDAwMDAwMDA0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2RhMGRkYzk1YmI1NGQ3MGE2YzI4NjdiOTc3NTM1ZWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2VlZTI5YzI4YmFhNDM3YzliNGFmMWQxYTZkZjg0MGMgPSAkKGA8ZGl2IGlkPSJodG1sXzdlZWUyOWMyOGJhYTQzN2M5YjRhZjFkMWE2ZGY4NDBjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTI3Mjk5OTk5OTk2LCAtMy42NDQ3NTk5MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2RhMGRkYzk1YmI1NGQ3MGE2YzI4NjdiOTc3NTM1ZWUuc2V0Q29udGVudChodG1sXzdlZWUyOWMyOGJhYTQzN2M5YjRhZjFkMWE2ZGY4NDBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNWU4MTA5Nzg2OWE0NDlhM2JjNGI2OGJkOTQzY2Q3OTkuYmluZFBvcHVwKHBvcHVwXzdkYTBkZGM5NWJiNTRkNzBhNmMyODY3Yjk3NzUzNWVlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTNjYjUyMGJhOThhNDA3YmFmNTEzOWFkMmMwOTg3YjkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODU5NDYsIC0zLjY0NTgyMTEwMDAwMDAwMDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81OGE5YTVhOWM0MzY0N2M4YWVlMTc5MjlkM2QzY2FmNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80ZDBjNmFjZmMwMDM0YjIxODIzYzQyNjk2NDE3N2I5MiA9ICQoYDxkaXYgaWQ9Imh0bWxfNGQwYzZhY2ZjMDAzNGIyMTgyM2M0MjY5NjQxNzdiOTIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1OTQ2LCAtMy42NDU4MjExMDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNThhOWE1YTljNDM2NDdjOGFlZTE3OTI5ZDNkM2NhZjYuc2V0Q29udGVudChodG1sXzRkMGM2YWNmYzAwMzRiMjE4MjNjNDI2OTY0MTc3YjkyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTNjYjUyMGJhOThhNDA3YmFmNTEzOWFkMmMwOTg3YjkuYmluZFBvcHVwKHBvcHVwXzU4YTlhNWE5YzQzNjQ3YzhhZWUxNzkyOWQzZDNjYWY2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZDBhYjBhYzhhNzA5NGJhMThhMjRjZmE0NjcyMTJmZGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ5MDcsIC0zLjY0NTUxNzZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YWUyYzhkOGIxMjg0YzhjYmIxMWY2MWVlN2ZjNGQ5OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Y2JiYzUwNTI4MmQ0YmI2OGZmZTcxYzg4Njk1YjAzMCA9ICQoYDxkaXYgaWQ9Imh0bWxfN2NiYmM1MDUyODJkNGJiNjhmZmU3MWM4ODY5NWIwMzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA0OTA3LCAtMy42NDU1MTc2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGFlMmM4ZDhiMTI4NGM4Y2JiMTFmNjFlZTdmYzRkOTguc2V0Q29udGVudChodG1sXzdjYmJjNTA1MjgyZDRiYjY4ZmZlNzFjODg2OTViMDMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZDBhYjBhYzhhNzA5NGJhMThhMjRjZmE0NjcyMTJmZGEuYmluZFBvcHVwKHBvcHVwXzRhZTJjOGQ4YjEyODRjOGNiYjExZjYxZWU3ZmM0ZDk4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYjM1NzY5YzdmMzgyNDc5ZWI3MDNiMDFhNmYyMGNmOWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDMzNzcwMDAwMDAwNSwgLTMuNjcyNzI1Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI5ZDdmMTFmODdhNjQyM2NhYWU0M2EzZjVkYjM3NGY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNhMzc0ZmMyMzBjYzQ4NTk5ZjJhMzU3Y2UzNDMwNjIxID0gJChgPGRpdiBpZD0iaHRtbF8zYTM3NGZjMjMwY2M0ODU5OWYyYTM1N2NlMzQzMDYyMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDMzNzcwMDAwMDAwNSwgLTMuNjcyNzI1Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI5ZDdmMTFmODdhNjQyM2NhYWU0M2EzZjVkYjM3NGY5LnNldENvbnRlbnQoaHRtbF8zYTM3NGZjMjMwY2M0ODU5OWYyYTM1N2NlMzQzMDYyMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2IzNTc2OWM3ZjM4MjQ3OWViNzAzYjAxYTZmMjBjZjliLmJpbmRQb3B1cChwb3B1cF8yOWQ3ZjExZjg3YTY0MjNjYWFlNDNhM2Y1ZGIzNzRmOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I5YzRhNjk5MDA2MDQyODY5ODQyMjFhYWM2NjU5MDU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkyNjM2LCAtMy42MzUyODAzOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmY4YjNhMTJhMzA4NDNmMDg4MWM2YmY0MDA0ZDI2MDIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTgzOGY2ODNkYWI3NDA5OTlmYTI4YTI5NzBkMGMwNjYgPSAkKGA8ZGl2IGlkPSJodG1sX2U4MzhmNjgzZGFiNzQwOTk5ZmEyOGEyOTcwZDBjMDY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MjYzNiwgLTMuNjM1MjgwMzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmOGIzYTEyYTMwODQzZjA4ODFjNmJmNDAwNGQyNjAyLnNldENvbnRlbnQoaHRtbF9lODM4ZjY4M2RhYjc0MDk5OWZhMjhhMjk3MGQwYzA2Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I5YzRhNjk5MDA2MDQyODY5ODQyMjFhYWM2NjU5MDU5LmJpbmRQb3B1cChwb3B1cF9mZjhiM2ExMmEzMDg0M2YwODgxYzZiZjQwMDRkMjYwMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzczZGE1MzI5Y2Q2MTRkN2Q4MTM5NDM0ZjE5MTM5NjU0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3NjY4LCAtMy42MTYyNTU1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDVkMzAyZDYyNTZhNDRlYWJiNWRiYWNjM2M1MWZmZjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjY5MTk0MTY4MTZjNDgzZWJjNTkyMmZjZjVhZWFmNGYgPSAkKGA8ZGl2IGlkPSJodG1sXzY2OTE5NDE2ODE2YzQ4M2ViYzU5MjJmY2Y1YWVhZjRmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM1NzY2OCwgLTMuNjE2MjU1NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q1ZDMwMmQ2MjU2YTQ0ZWFiYjVkYmFjYzNjNTFmZmY3LnNldENvbnRlbnQoaHRtbF82NjkxOTQxNjgxNmM0ODNlYmM1OTIyZmNmNWFlYWY0Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzczZGE1MzI5Y2Q2MTRkN2Q4MTM5NDM0ZjE5MTM5NjU0LmJpbmRQb3B1cChwb3B1cF9kNWQzMDJkNjI1NmE0NGVhYmI1ZGJhY2MzYzUxZmZmNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2ZjYjIwMDMyMGViMzRjMWQ4OWI1NmM4ZmYzYjhhOGY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2MzI3MDAwMDAwMDUsIC0zLjY0NTM2OTk5OTk5OTk5OThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hYTA4OTdjNGQwYWQ0YjFjOWMwZGI1OTEzMzA1NWVhNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85MTVmMDUwOGFlMmU0YzA1OWI2NWJhMTZjZmY3M2ViYiA9ICQoYDxkaXYgaWQ9Imh0bWxfOTE1ZjA1MDhhZTJlNGMwNTliNjViYTE2Y2ZmNzNlYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2MzI3MDAwMDAwMDUsIC0zLjY0NTM2OTk5OTk5OTk5OThdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYTA4OTdjNGQwYWQ0YjFjOWMwZGI1OTEzMzA1NWVhNy5zZXRDb250ZW50KGh0bWxfOTE1ZjA1MDhhZTJlNGMwNTliNjViYTE2Y2ZmNzNlYmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mY2IyMDAzMjBlYjM0YzFkODliNTZjOGZmM2I4YThmOC5iaW5kUG9wdXAocG9wdXBfYWEwODk3YzRkMGFkNGIxYzljMGRiNTkxMzMwNTVlYTcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xYmM3ODcyZTZjNTc0ZTJjYTJiMDhiOWJhMGI2NmYyZiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE0OTY2NywgLTMuNjE0NzY4Nzk5OTk5OTk5M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NkNzZjOWViYjY4YTRiOWFhNjdhMWY0YWZiNTJjZDUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YyZjYxY2MzNTNmNjQxODU5YmVmMWY1MjQyMWRmN2U1ID0gJChgPGRpdiBpZD0iaHRtbF9mMmY2MWNjMzUzZjY0MTg1OWJlZjFmNTI0MjFkZjdlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNDk2NjcsIC0zLjYxNDc2ODc5OTk5OTk5OTNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZDc2YzllYmI2OGE0YjlhYTY3YTFmNGFmYjUyY2Q1MS5zZXRDb250ZW50KGh0bWxfZjJmNjFjYzM1M2Y2NDE4NTliZWYxZjUyNDIxZGY3ZTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xYmM3ODcyZTZjNTc0ZTJjYTJiMDhiOWJhMGI2NmYyZi5iaW5kUG9wdXAocG9wdXBfY2Q3NmM5ZWJiNjhhNGI5YWE2N2ExZjRhZmI1MmNkNTEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wOWUxNWI5NWRiZTM0NzdmYTUxMDIzYjQxMjJkOWRjYSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5MjQsIC0zLjY0MDY3NjYwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDY3OGQxNzQ2OGE0NGRmODExMzFmYmZiNDA2OGM1NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84MzliOWQ0N2NlMmQ0YTIzOTZkMWRhNDc1OWZkY2Q1ZiA9ICQoYDxkaXYgaWQ9Imh0bWxfODM5YjlkNDdjZTJkNGEyMzk2ZDFkYTQ3NTlmZGNkNWYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNCwgLTMuNjQwNjc2NjAwMDAwMDAwNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M0Njc4ZDE3NDY4YTQ0ZGY4MTEzMWZiZmI0MDY4YzU2LnNldENvbnRlbnQoaHRtbF84MzliOWQ0N2NlMmQ0YTIzOTZkMWRhNDc1OWZkY2Q1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA5ZTE1Yjk1ZGJlMzQ3N2ZhNTEwMjNiNDEyMmQ5ZGNhLmJpbmRQb3B1cChwb3B1cF9jNDY3OGQxNzQ2OGE0NGRmODExMzFmYmZiNDA2OGM1NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzVlZGZmMmNlYjE3NzRhM2Q4MDc1MTVhOGIzNjcyODgxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjQ2MzM2LCAtMy42Mjk4MDE3OTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTlkMjdkNzYyZDlhNDUyZTkwODAyNmY4NjAwMzc3ZWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTVmZGM4ZmE4ZTI0NDA5Y2I2MGZhYzJmMzkyMzQyMTUgPSAkKGA8ZGl2IGlkPSJodG1sXzU1ZmRjOGZhOGUyNDQwOWNiNjBmYWMyZjM5MjM0MjE1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDI0NjMzNiwgLTMuNjI5ODAxNzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5ZDI3ZDc2MmQ5YTQ1MmU5MDgwMjZmODYwMDM3N2VhLnNldENvbnRlbnQoaHRtbF81NWZkYzhmYThlMjQ0MDljYjYwZmFjMmYzOTIzNDIxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVlZGZmMmNlYjE3NzRhM2Q4MDc1MTVhOGIzNjcyODgxLmJpbmRQb3B1cChwb3B1cF85OWQyN2Q3NjJkOWE0NTJlOTA4MDI2Zjg2MDAzNzdlYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzkzMzFmNzFmOTM3NzQ3OWY4NjJjN2FjZmExMzBiODFlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTQ2OTU5LCAtMy43MDEyNDY0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMTk4NTM1NWNhYzBjNDAxYWFkZGVkZTVhMzZmODM5NzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2Q4Nzg0MmJkNmMzNGU5ZWE3NjllOTQ1YjcyOTMxNDkgPSAkKGA8ZGl2IGlkPSJodG1sXzdkODc4NDJiZDZjMzRlOWVhNzY5ZTk0NWI3MjkzMTQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE0Njk1OSwgLTMuNzAxMjQ2NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE5ODUzNTVjYWMwYzQwMWFhZGRlZGU1YTM2ZjgzOTcxLnNldENvbnRlbnQoaHRtbF83ZDg3ODQyYmQ2YzM0ZTllYTc2OWU5NDViNzI5MzE0OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkzMzFmNzFmOTM3NzQ3OWY4NjJjN2FjZmExMzBiODFlLmJpbmRQb3B1cChwb3B1cF8xOTg1MzU1Y2FjMGM0MDFhYWRkZWRlNWEzNmY4Mzk3MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NiMTRjMTU5OTUwZjRmMGU4MzhhNWU1N2UzYTQ2NjRiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MTgxMTk4LCAtMy42NDM4MTI5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTkwMmY0MzczNWJiNGFhNzkzYWYzZjQ1MjAyOWY0NmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmE0NmE2YTY1MzcwNGM0YTkyNzc3MWU4ZmE1MTAyNGIgPSAkKGA8ZGl2IGlkPSJodG1sX2JhNDZhNmE2NTM3MDRjNGE5Mjc3NzFlOGZhNTEwMjRiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTE4MTE5OCwgLTMuNjQzODEyOV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5MDJmNDM3MzViYjRhYTc5M2FmM2Y0NTIwMjlmNDZmLnNldENvbnRlbnQoaHRtbF9iYTQ2YTZhNjUzNzA0YzRhOTI3NzcxZThmYTUxMDI0Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NiMTRjMTU5OTUwZjRmMGU4MzhhNWU1N2UzYTQ2NjRiLmJpbmRQb3B1cChwb3B1cF85OTAyZjQzNzM1YmI0YWE3OTNhZjNmNDUyMDI5ZjQ2ZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2E2OTFiMDlmMWNiZjQ4NWE5MDNjZjgwYjg2MGU4MDY4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NTQ1NzEsIC0zLjYwODQ2MTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NTk5ZGE2NTk4MTE0NGNiYTllMjliZjQ2ODhiZDI4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xYWY3OGYzOGM3MzE0OTVmYTRjNmU0N2Q2MThlZGRmNyA9ICQoYDxkaXYgaWQ9Imh0bWxfMWFmNzhmMzhjNzMxNDk1ZmE0YzZlNDdkNjE4ZWRkZjciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NTQ1NzEsIC0zLjYwODQ2MTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NTk5ZGE2NTk4MTE0NGNiYTllMjliZjQ2ODhiZDI4OC5zZXRDb250ZW50KGh0bWxfMWFmNzhmMzhjNzMxNDk1ZmE0YzZlNDdkNjE4ZWRkZjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hNjkxYjA5ZjFjYmY0ODVhOTAzY2Y4MGI4NjBlODA2OC5iaW5kUG9wdXAocG9wdXBfNzU5OWRhNjU5ODExNDRjYmE5ZTI5YmY0Njg4YmQyODgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82YTRlM2IyZjc4OWU0N2EyYmY2MWZkM2U2MzZmYWI5MSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2NjI2NzAwMDAwMDEsIC0zLjY0MDM4Njg5OTk5OTk5OThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xOGEwOGI3YjRiZmU0MTM1YjlkY2Y2ZTY5ZmFjNGZkMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jMWQyZmY3OWEzNWY0YTJlYmZhN2E0NWI2NGIxZmNhYiA9ICQoYDxkaXYgaWQ9Imh0bWxfYzFkMmZmNzlhMzVmNGEyZWJmYTdhNDViNjRiMWZjYWIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY2MjY3MDAwMDAwMSwgLTMuNjQwMzg2ODk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE4YTA4YjdiNGJmZTQxMzViOWRjZjZlNjlmYWM0ZmQzLnNldENvbnRlbnQoaHRtbF9jMWQyZmY3OWEzNWY0YTJlYmZhN2E0NWI2NGIxZmNhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZhNGUzYjJmNzg5ZTQ3YTJiZjYxZmQzZTYzNmZhYjkxLmJpbmRQb3B1cChwb3B1cF8xOGEwOGI3YjRiZmU0MTM1YjlkY2Y2ZTY5ZmFjNGZkMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2IzMzBhNTBhNTE2YzQyZWQ5YmRhYjNiYmU2NzQzNmRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjUyODc3MDAwMDAwMSwgLTMuNjQ1NTk3OV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2QxYzAzZjVjNjRkMDQ1Yzc5YTdlZWIwZDFiZmM4OTU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2FhZjQ3NmFkM2U2NTQzMDJhNjA0MzY1ZmMwMTA1ZWIyID0gJChgPGRpdiBpZD0iaHRtbF9hYWY0NzZhZDNlNjU0MzAyYTYwNDM2NWZjMDEwNWViMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNTI4NzcwMDAwMDAxLCAtMy42NDU1OTc5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDFjMDNmNWM2NGQwNDVjNzlhN2VlYjBkMWJmYzg5NTcuc2V0Q29udGVudChodG1sX2FhZjQ3NmFkM2U2NTQzMDJhNjA0MzY1ZmMwMTA1ZWIyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjMzMGE1MGE1MTZjNDJlZDliZGFiM2JiZTY3NDM2ZGMuYmluZFBvcHVwKHBvcHVwX2QxYzAzZjVjNjRkMDQ1Yzc5YTdlZWIwZDFiZmM4OTU3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfODRmODM3YTBmNGYyNDE4Njg1NDg2OTQ0ZTkxNThlNzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNTQ0OTcsIC0zLjY0NDY3MTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMmVlNDAzNWFmYjQ0MmU1YWQ5YjBmY2YwZmUwNzYyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzUwNDM0YTZiZTk0YmUyYjJjYzhmM2ZlZTRkM2Y0MCA9ICQoYDxkaXYgaWQ9Imh0bWxfZDc1MDQzNGE2YmU5NGJlMmIyY2M4ZjNmZWU0ZDNmNDAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjU0NDk3LCAtMy42NDQ2NzE2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTJlZTQwMzVhZmI0NDJlNWFkOWIwZmNmMGZlMDc2MmQuc2V0Q29udGVudChodG1sX2Q3NTA0MzRhNmJlOTRiZTJiMmNjOGYzZmVlNGQzZjQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfODRmODM3YTBmNGYyNDE4Njg1NDg2OTQ0ZTkxNThlNzUuYmluZFBvcHVwKHBvcHVwXzEyZWU0MDM1YWZiNDQyZTVhZDliMGZjZjBmZTA3NjJkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZDUxYTc1Y2QwMTQ4NDhhMjkwYTUzOGEzZjY0ODAzMTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjU0MDA5Mzc5OTk5OTk5NCwgLTMuNjI4MzI2N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdmZjk4MzA1YWY3ZDQ4NDY5MTNjMmYxNDEzNDQyYWQ0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MzZDYyNDUwZDZkYzRjYmY4MWNkOWNjNTc3YTBhOWZlID0gJChgPGRpdiBpZD0iaHRtbF9jM2Q2MjQ1MGQ2ZGM0Y2JmODFjZDljYzU3N2EwYTlmZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjU0MDA5Mzc5OTk5OTk5NCwgLTMuNjI4MzI2N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmZjk4MzA1YWY3ZDQ4NDY5MTNjMmYxNDEzNDQyYWQ0LnNldENvbnRlbnQoaHRtbF9jM2Q2MjQ1MGQ2ZGM0Y2JmODFjZDljYzU3N2EwYTlmZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q1MWE3NWNkMDE0ODQ4YTI5MGE1MzhhM2Y2NDgwMzEwLmJpbmRQb3B1cChwb3B1cF83ZmY5ODMwNWFmN2Q0ODQ2OTEzYzJmMTQxMzQ0MmFkNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzM2NjJkOGNmYjJmZjRmYjQ4NzAxMTgyY2EzYTAwMmE5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY1Mzk0LCAtMy42NDQwOTQxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDU3MzY2ZDAzNjEwNDFlOTk3NmM5YmVjMDZjMTgxYWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWU0NWE0MmYyZGQ5NDZhYzljZDNkNmU5MTlmYWU4MjAgPSAkKGA8ZGl2IGlkPSJodG1sX2FlNDVhNDJmMmRkOTQ2YWM5Y2QzZDZlOTE5ZmFlODIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2NTM5NCwgLTMuNjQ0MDk0MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ1NzM2NmQwMzYxMDQxZTk5NzZjOWJlYzA2YzE4MWFjLnNldENvbnRlbnQoaHRtbF9hZTQ1YTQyZjJkZDk0NmFjOWNkM2Q2ZTkxOWZhZTgyMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM2NjJkOGNmYjJmZjRmYjQ4NzAxMTgyY2EzYTAwMmE5LmJpbmRQb3B1cChwb3B1cF80NTczNjZkMDM2MTA0MWU5OTc2YzliZWMwNmMxODFhYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y3N2E3YWZlYWY0OTQzNmU5ZWIzYjFjYzAxMTE2OGYzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NTU4LCAtMy42NDYxMzM1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWY1YjlhOWY0ODYyNDA1Y2FhODY3MDAzNzA3ZmFiMzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmVmOGZhZWE3OWFmNGVkNWJiMWIwM2RmNGE4NDU5M2MgPSAkKGA8ZGl2IGlkPSJodG1sX2JlZjhmYWVhNzlhZjRlZDViYjFiMDNkZjRhODQ1OTNjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDU1OCwgLTMuNjQ2MTMzNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VmNWI5YTlmNDg2MjQwNWNhYTg2NzAwMzcwN2ZhYjM0LnNldENvbnRlbnQoaHRtbF9iZWY4ZmFlYTc5YWY0ZWQ1YmIxYjAzZGY0YTg0NTkzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3N2E3YWZlYWY0OTQzNmU5ZWIzYjFjYzAxMTE2OGYzLmJpbmRQb3B1cChwb3B1cF9lZjViOWE5ZjQ4NjI0MDVjYWE4NjcwMDM3MDdmYWIzNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzczMjA4ZGM0ZTE0MDQyOGJhNzVkNDI1ZWFlNmZkMmNjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzY4NjE2LCAtMy42MTc4Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYzYWEwNzk2YmQwZDQwNTg4ODcxMDgzOTg4YzMyNGU3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2ZjYjgyNWQ3M2VkNDQyYmZhYzI1MzU4MmU0YTUwNTM3ID0gJChgPGRpdiBpZD0iaHRtbF9mY2I4MjVkNzNlZDQ0MmJmYWMyNTM1ODJlNGE1MDUzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzNjg2MTYsIC0zLjYxNzg2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjNhYTA3OTZiZDBkNDA1ODg4NzEwODM5ODhjMzI0ZTcuc2V0Q29udGVudChodG1sX2ZjYjgyNWQ3M2VkNDQyYmZhYzI1MzU4MmU0YTUwNTM3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzMyMDhkYzRlMTQwNDI4YmE3NWQ0MjVlYWU2ZmQyY2MuYmluZFBvcHVwKHBvcHVwXzYzYWEwNzk2YmQwZDQwNTg4ODcxMDgzOTg4YzMyNGU3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfY2NlYjE0MWU0YTdjNDA5NGFhYjNiOWQwNTYxYzI0ZDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ4ODg5OTk5OTk5NSwgLTMuNjQ1NTE4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzZmOTYyMDVhMDBlNGY3NDkyMWNhOTdlMWFhYzQwNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTI0MzJhYzBhOWQ3NGM2OWE2ZWUwMzQxMTlmYjYyMzggPSAkKGA8ZGl2IGlkPSJodG1sX2UyNDMyYWMwYTlkNzRjNjlhNmVlMDM0MTE5ZmI2MjM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNDg4ODk5OTk5OTk1LCAtMy42NDU1MThdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83NmY5NjIwNWEwMGU0Zjc0OTIxY2E5N2UxYWFjNDA1YS5zZXRDb250ZW50KGh0bWxfZTI0MzJhYzBhOWQ3NGM2OWE2ZWUwMzQxMTlmYjYyMzgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jY2ViMTQxZTRhN2M0MDk0YWFiM2I5ZDA1NjFjMjRkNi5iaW5kUG9wdXAocG9wdXBfNzZmOTYyMDVhMDBlNGY3NDkyMWNhOTdlMWFhYzQwNWEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80ODdkZmIwN2UwYjY0NjQ5YmVmM2RlYzhhNGU0ODg2MSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNDkwNywgLTMuNjQ1NTMyNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzIzMzQ2N2Y4M2E1YzQ1NTI5Yzg4NTlhZDFiZTI3M2NlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QwNzA1YzM4YTE2YjQyZWY4ZmU1OTgyZDc1M2E1OGRlID0gJChgPGRpdiBpZD0iaHRtbF9kMDcwNWMzOGExNmI0MmVmOGZlNTk4MmQ3NTNhNThkZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDQ5MDcsIC0zLjY0NTUzMjVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yMzM0NjdmODNhNWM0NTUyOWM4ODU5YWQxYmUyNzNjZS5zZXRDb250ZW50KGh0bWxfZDA3MDVjMzhhMTZiNDJlZjhmZTU5ODJkNzUzYTU4ZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80ODdkZmIwN2UwYjY0NjQ5YmVmM2RlYzhhNGU0ODg2MS5iaW5kUG9wdXAocG9wdXBfMjMzNDY3ZjgzYTVjNDU1MjljODg1OWFkMWJlMjczY2UpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wNmQ0ZDVhOWNiMzA0ZWUwODlmZThhMmIwYTU3NDA4MCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIwODAyLCAtMy42MzMxMzczXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWY0ZjU3M2NhN2NjNDhlMTg0MjcyNDhjZjE5ZTczYTcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYmIwNTc3Mjk5NzNmNDhmMmJlNDBjMGYwMzg2NGNiOWYgPSAkKGA8ZGl2IGlkPSJodG1sX2JiMDU3NzI5OTczZjQ4ZjJiZTQwYzBmMDM4NjRjYjlmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwODAyLCAtMy42MzMxMzczXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWY0ZjU3M2NhN2NjNDhlMTg0MjcyNDhjZjE5ZTczYTcuc2V0Q29udGVudChodG1sX2JiMDU3NzI5OTczZjQ4ZjJiZTQwYzBmMDM4NjRjYjlmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMDZkNGQ1YTljYjMwNGVlMDg5ZmU4YTJiMGE1NzQwODAuYmluZFBvcHVwKHBvcHVwXzFmNGY1NzNjYTdjYzQ4ZTE4NDI3MjQ4Y2YxOWU3M2E3KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzE2ZjFhNmRkOTAxNGM4OGExNmE2OTYwYzRmZDE4ZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQzMzE2MTYwMDAwMDAwNSwgLTMuNjM0NjUwOV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk5Yzc1ODE4NzQ0NjQyYTU5MzJhZjJjMzZlODE5MTBhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY4MDA5OTdlNjVmMjQ1YjM5NTZkMmQzMDg1MmM0NDNjID0gJChgPGRpdiBpZD0iaHRtbF82ODAwOTk3ZTY1ZjI0NWIzOTU2ZDJkMzA4NTJjNDQzYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQzMzE2MTYwMDAwMDAwNSwgLTMuNjM0NjUwOV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk5Yzc1ODE4NzQ0NjQyYTU5MzJhZjJjMzZlODE5MTBhLnNldENvbnRlbnQoaHRtbF82ODAwOTk3ZTY1ZjI0NWIzOTU2ZDJkMzA4NTJjNDQzYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzMxNmYxYTZkZDkwMTRjODhhMTZhNjk2MGM0ZmQxOGYyLmJpbmRQb3B1cChwb3B1cF85OWM3NTgxODc0NDY0MmE1OTMyYWYyYzM2ZTgxOTEwYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2QyZGM4MDZjODk2NzRhODlhZmY0ZjY4MDI2NTcxMzY1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0ODA0LCAtMy42NDYwNTQwOTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWM5OGI5YWVmODAxNDQ1MzhmNzliOTlkOWJmMDMxMTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmJjOTZiZDczMzJiNGViZGFhMWNmNTk5NzNiOTZmMWQgPSAkKGA8ZGl2IGlkPSJodG1sX2ZiYzk2YmQ3MzMyYjRlYmRhYTFjZjU5OTczYjk2ZjFkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDgwNCwgLTMuNjQ2MDU0MDk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FjOThiOWFlZjgwMTQ0NTM4Zjc5Yjk5ZDliZjAzMTEwLnNldENvbnRlbnQoaHRtbF9mYmM5NmJkNzMzMmI0ZWJkYWExY2Y1OTk3M2I5NmYxZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QyZGM4MDZjODk2NzRhODlhZmY0ZjY4MDI2NTcxMzY1LmJpbmRQb3B1cChwb3B1cF9hYzk4YjlhZWY4MDE0NDUzOGY3OWI5OWQ5YmYwMzExMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y3NTU0YTZjYTMwMDRmOWVhMjMwN2RkMTU5YTcyZjZlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3NTI2LCAtMy42MTYyOTc3OTk5OTk5OTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjZjMTFlNDNjZmY0NDI3N2I2YTE3NGVmMTU2ZjQwM2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNThkNGIyOWJmNjZmNDdiZjk1OTQ1NjJhZTIyNmIyMzQgPSAkKGA8ZGl2IGlkPSJodG1sXzU4ZDRiMjliZjY2ZjQ3YmY5NTk0NTYyYWUyMjZiMjM0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM1NzUyNiwgLTMuNjE2Mjk3Nzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2YzExZTQzY2ZmNDQyNzdiNmExNzRlZjE1NmY0MDNlLnNldENvbnRlbnQoaHRtbF81OGQ0YjI5YmY2NmY0N2JmOTU5NDU2MmFlMjI2YjIzNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3NTU0YTZjYTMwMDRmOWVhMjMwN2RkMTU5YTcyZjZlLmJpbmRQb3B1cChwb3B1cF9iNmMxMWU0M2NmZjQ0Mjc3YjZhMTc0ZWYxNTZmNDAzZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Q3YmY2ZjgxOWUzMDQ2NGM5MDhiNjliOGRhNmY2ZDYyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc1NzAzLCAtMy42NDQ3MTg3MDAwMDAwMDA4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGI4MjE3MjVkNTcwNGRiZThmZWQ2YmFhMDZjMjgzNjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJlM2E3MTIwYWIwNGRmYjgyNTYyOWM5ZjllOTI5NWYgPSAkKGA8ZGl2IGlkPSJodG1sXzJiZTNhNzEyMGFiMDRkZmI4MjU2MjljOWY5ZTkyOTVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTcwMywgLTMuNjQ0NzE4NzAwMDAwMDAwOF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiODIxNzI1ZDU3MDRkYmU4ZmVkNmJhYTA2YzI4MzY1LnNldENvbnRlbnQoaHRtbF8yYmUzYTcxMjBhYjA0ZGZiODI1NjI5YzlmOWU5Mjk1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q3YmY2ZjgxOWUzMDQ2NGM5MDhiNjliOGRhNmY2ZDYyLmJpbmRQb3B1cChwb3B1cF80YjgyMTcyNWQ1NzA0ZGJlOGZlZDZiYWEwNmMyODM2NSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzY2NjRmYzEzZDU4ZDRkZTQ5ZjkxMzFjMjdhNjM1YWNhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MTcyMTU3LCAtMy42NTQ1MzkyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDE5YmFhYzc1OGNlNDYxNjliMDE5N2MwY2ZhYjBkYjUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmI5MDc2OWYzNDI3NDkwOGE3YTNjZTAxY2VhNzkwNzAgPSAkKGA8ZGl2IGlkPSJodG1sXzZiOTA3NjlmMzQyNzQ5MDhhN2EzY2UwMWNlYTc5MDcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTE3MjE1NywgLTMuNjU0NTM5Ml08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQxOWJhYWM3NThjZTQ2MTY5YjAxOTdjMGNmYWIwZGI1LnNldENvbnRlbnQoaHRtbF82YjkwNzY5ZjM0Mjc0OTA4YTdhM2NlMDFjZWE3OTA3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY2NjRmYzEzZDU4ZDRkZTQ5ZjkxMzFjMjdhNjM1YWNhLmJpbmRQb3B1cChwb3B1cF80MTliYWFjNzU4Y2U0NjE2OWIwMTk3YzBjZmFiMGRiNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzgzZDJhOGI1Mzc3MzQ0MjFhZTdjNjVmMmVkMzE1OTgwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjQ2MjM5LCAtMy42NDYxODQzMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOGVkMGUyNGQ5Y2I3NGVmYTg4NzA1Y2YxMGE0ODJkOWMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzZiYmNlNTU0ZGIwNDY5YmI1YjY5YWYxZjk4NGI1YzAgPSAkKGA8ZGl2IGlkPSJodG1sXzc2YmJjZTU1NGRiMDQ2OWJiNWI2OWFmMWY5ODRiNWMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI0NjIzOSwgLTMuNjQ2MTg0MzAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzhlZDBlMjRkOWNiNzRlZmE4ODcwNWNmMTBhNDgyZDljLnNldENvbnRlbnQoaHRtbF83NmJiY2U1NTRkYjA0NjliYjViNjlhZjFmOTg0YjVjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgzZDJhOGI1Mzc3MzQ0MjFhZTdjNjVmMmVkMzE1OTgwLmJpbmRQb3B1cChwb3B1cF84ZWQwZTI0ZDljYjc0ZWZhODg3MDVjZjEwYTQ4MmQ5YykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzU2YmNlOWVlZDY1NTQyYjJiOWU0ODllNmM2YjgxNzE1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkzNDIxLCAtMy42MzU3MTI5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTFkYzQ3YmYzZjcyNDVkNmFiNGNjZjQ0NjI4MjQ0NmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTI5MTQwMzJjZTdkNGNmYWJiYzVjOTU2NzdkYWY3ZTIgPSAkKGA8ZGl2IGlkPSJodG1sXzUyOTE0MDMyY2U3ZDRjZmFiYmM1Yzk1Njc3ZGFmN2UyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MzQyMSwgLTMuNjM1NzEyOV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UxZGM0N2JmM2Y3MjQ1ZDZhYjRjY2Y0NDYyODI0NDZiLnNldENvbnRlbnQoaHRtbF81MjkxNDAzMmNlN2Q0Y2ZhYmJjNWM5NTY3N2RhZjdlMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU2YmNlOWVlZDY1NTQyYjJiOWU0ODllNmM2YjgxNzE1LmJpbmRQb3B1cChwb3B1cF9lMWRjNDdiZjNmNzI0NWQ2YWI0Y2NmNDQ2MjgyNDQ2YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2ZlMjI4OWZmODQyNDQyOGFiZWU1ZjdhNmNjNTNmMjc2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTUyNjI3MDAwMDAwMSwgLTMuNjUxMTU4NDAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkYjUwNTkxZDcyZjQyMmZiMjcyZWJmNWI5NmZhZjUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5MTdjNWM2OWJlYzQxMDdhZDE4NWExZGY4N2UzZDA2ID0gJChgPGRpdiBpZD0iaHRtbF8xOTE3YzVjNjliZWM0MTA3YWQxODVhMWRmODdlM2QwNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTI2MjcwMDAwMDAxLCAtMy42NTExNTg0MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWRiNTA1OTFkNzJmNDIyZmIyNzJlYmY1Yjk2ZmFmNTMuc2V0Q29udGVudChodG1sXzE5MTdjNWM2OWJlYzQxMDdhZDE4NWExZGY4N2UzZDA2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmUyMjg5ZmY4NDI0NDI4YWJlZTVmN2E2Y2M1M2YyNzYuYmluZFBvcHVwKHBvcHVwX2VkYjUwNTkxZDcyZjQyMmZiMjcyZWJmNWI5NmZhZjUzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOWU3ODNmM2MyZGFkNDdmMGI0ZTliOGFhMjE1YzY3ODEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjU0NTcyNzgsIC0zLjY0MzczODFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zMzY1NzBmNWEzMWU0MTVlYjM5OTlmMDQ3OTY5YjA3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNmYxYzVhNGUzN2U0MjY0YWQ2YzQ2YjgzMmUyNWIxZSA9ICQoYDxkaXYgaWQ9Imh0bWxfYzZmMWM1YTRlMzdlNDI2NGFkNmM0NmI4MzJlMjViMWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41NDU3Mjc4LCAtMy42NDM3MzgxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzM2NTcwZjVhMzFlNDE1ZWIzOTk5ZjA0Nzk2OWIwNzAuc2V0Q29udGVudChodG1sX2M2ZjFjNWE0ZTM3ZTQyNjRhZDZjNDZiODMyZTI1YjFlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOWU3ODNmM2MyZGFkNDdmMGI0ZTliOGFhMjE1YzY3ODEuYmluZFBvcHVwKHBvcHVwXzMzNjU3MGY1YTMxZTQxNWViMzk5OWYwNDc5NjliMDcwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjYxNzljOGZmYzQ5NGZiOWEzYzIyZTllYzc0NjZmZjUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDYyNDcwMDAwMDAwNCwgLTMuNjQ1MzczNzk5OTk5OTk5OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JlMzM5MWU2NDEzYjRmOTlhYmMzNWQyNDM0NDZjOWUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2OGQ5NTFkYWMwNTQzYzViMGRmZGM2YmE1NGIxOTRlID0gJChgPGRpdiBpZD0iaHRtbF81NjhkOTUxZGFjMDU0M2M1YjBkZmRjNmJhNTRiMTk0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDYyNDcwMDAwMDAwNCwgLTMuNjQ1MzczNzk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JlMzM5MWU2NDEzYjRmOTlhYmMzNWQyNDM0NDZjOWUzLnNldENvbnRlbnQoaHRtbF81NjhkOTUxZGFjMDU0M2M1YjBkZmRjNmJhNTRiMTk0ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y2MTc5YzhmZmM0OTRmYjlhM2MyMmU5ZWM3NDY2ZmY1LmJpbmRQb3B1cChwb3B1cF9iZTMzOTFlNjQxM2I0Zjk5YWJjMzVkMjQzNDQ2YzllMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzkyMGI1ZTZhODNhNjQ5N2Q5NzZkNTVkMjk5NzFiNjIzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkzMDgxLCAtMy42MzUyNDEzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzJhNjg0YzAwNjU2NDk0ZDg4NzM2ZWUzODljMjM5MTQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWM4YjA2YzhjZWNiNDZkN2E2ZmFkZmU4NTMxODJmMjQgPSAkKGA8ZGl2IGlkPSJodG1sXzFjOGIwNmM4Y2VjYjQ2ZDdhNmZhZGZlODUzMTgyZjI0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MzA4MSwgLTMuNjM1MjQxM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcyYTY4NGMwMDY1NjQ5NGQ4ODczNmVlMzg5YzIzOTE0LnNldENvbnRlbnQoaHRtbF8xYzhiMDZjOGNlY2I0NmQ3YTZmYWRmZTg1MzE4MmYyNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzkyMGI1ZTZhODNhNjQ5N2Q5NzZkNTVkMjk5NzFiNjIzLmJpbmRQb3B1cChwb3B1cF83MmE2ODRjMDA2NTY0OTRkODg3MzZlZTM4OWMyMzkxNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzhmYTA3NzFjODJlOTQ4OWE5ZGY1ZjU1MTAwZmVjMTEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjA0MzYzLCAtMy42MzI3ODI4OTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzBiNjE1NGNlMmI1NDE2ODliNGRiZTMzZDQxOGFjNmMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTU3N2VkMTEyYzIyNDQxMmExY2NmNTg3N2ZjNzRjMDcgPSAkKGA8ZGl2IGlkPSJodG1sX2U1NzdlZDExMmMyMjQ0MTJhMWNjZjU4NzdmYzc0YzA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIwNDM2MywgLTMuNjMyNzgyODk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzcwYjYxNTRjZTJiNTQxNjg5YjRkYmUzM2Q0MThhYzZjLnNldENvbnRlbnQoaHRtbF9lNTc3ZWQxMTJjMjI0NDEyYTFjY2Y1ODc3ZmM3NGMwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzhmYTA3NzFjODJlOTQ4OWE5ZGY1ZjU1MTAwZmVjMTEwLmJpbmRQb3B1cChwb3B1cF83MGI2MTU0Y2UyYjU0MTY4OWI0ZGJlMzNkNDE4YWM2YykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA1NjBiZjY3NjI3OTQ1ZjNhMGEwMjhiMTY2OTU2ZjRhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjA5LCAtMy42NDYxMTY5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWQyYjYwMWNmNDQ0NGY4MWFiMWY3YWU2MGNhMGYwZDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTY1MzcyODA5YjhhNDE5ZTk0MGExZjIwZDBmNWNmOTkgPSAkKGA8ZGl2IGlkPSJodG1sXzk2NTM3MjgwOWI4YTQxOWU5NDBhMWYyMGQwZjVjZjk5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDYwOSwgLTMuNjQ2MTE2OV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FkMmI2MDFjZjQ0NDRmODFhYjFmN2FlNjBjYTBmMGQ0LnNldENvbnRlbnQoaHRtbF85NjUzNzI4MDliOGE0MTllOTQwYTFmMjBkMGY1Y2Y5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA1NjBiZjY3NjI3OTQ1ZjNhMGEwMjhiMTY2OTU2ZjRhLmJpbmRQb3B1cChwb3B1cF9hZDJiNjAxY2Y0NDQ0ZjgxYWIxZjdhZTYwY2EwZjBkNCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2ZiYTk5NDc0YWI2YzQxMmNhYjk3OWMyNWNiZTQ0YjVhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4yMDQ1MTkyOTk5OTk5OTQsIC01Ljc4NTU2OTRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lZTcxNzcxZGM1OTM0NzY2YmMwMjc4MDMxODA3NmZjMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80N2RkMzI5ZGYzYmQ0MGY4OGYwYzI5ZWRhMGEzNmFjMCA9ICQoYDxkaXYgaWQ9Imh0bWxfNDdkZDMyOWRmM2JkNDBmODhmMGMyOWVkYTBhMzZhYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4yMDQ1MTkyOTk5OTk5OTQsIC01Ljc4NTU2OTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZTcxNzcxZGM1OTM0NzY2YmMwMjc4MDMxODA3NmZjMC5zZXRDb250ZW50KGh0bWxfNDdkZDMyOWRmM2JkNDBmODhmMGMyOWVkYTBhMzZhYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYmE5OTQ3NGFiNmM0MTJjYWI5NzljMjVjYmU0NGI1YS5iaW5kUG9wdXAocG9wdXBfZWU3MTc3MWRjNTkzNDc2NmJjMDI3ODAzMTgwNzZmYzApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85Yjg5ODhhMTJkN2M0OThmYjg3MjBjZWJhYTg3ODhkZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIyNDMzNiwgLTMuODA0MTQ0Mzk5OTk5OTk5OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzZmYTNhMjc0ODFkYTRkOTY4YzAzNmNhNWM0YjQzMmFmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzOWQ5MzFlYjFjMDQ3MTI5MWY5ZmJkNjcxNzIxMjJhID0gJChgPGRpdiBpZD0iaHRtbF9hMzlkOTMxZWIxYzA0NzEyOTFmOWZiZDY3MTcyMTIyYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMjQzMzYsIC0zLjgwNDE0NDM5OTk5OTk5OThdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZmEzYTI3NDgxZGE0ZDk2OGMwMzZjYTVjNGI0MzJhZi5zZXRDb250ZW50KGh0bWxfYTM5ZDkzMWViMWMwNDcxMjkxZjlmYmQ2NzE3MjEyMmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85Yjg5ODhhMTJkN2M0OThmYjg3MjBjZWJhYTg3ODhkZS5iaW5kUG9wdXAocG9wdXBfNmZhM2EyNzQ4MWRhNGQ5NjhjMDM2Y2E1YzRiNDMyYWYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mYmIxZmU0ODY4YWQ0MjMxOWZlZTUwMTMyMjg0ZTFmYSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk1Njc5MywgLTMuNjk5MjUxMjAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzMwMGYyYWRkOWRiMjRmOTM5NTMxYWQ2OWFmZDQxZjE0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzljZDFlMmZjOGZjZTRmNjE4ZTNiMzljODk5Mzk1NTJiID0gJChgPGRpdiBpZD0iaHRtbF85Y2QxZTJmYzhmY2U0ZjYxOGUzYjM5Yzg5OTM5NTUyYiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NTY3OTMsIC0zLjY5OTI1MTIwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zMDBmMmFkZDlkYjI0ZjkzOTUzMWFkNjlhZmQ0MWYxNC5zZXRDb250ZW50KGh0bWxfOWNkMWUyZmM4ZmNlNGY2MThlM2IzOWM4OTkzOTU1MmIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYmIxZmU0ODY4YWQ0MjMxOWZlZTUwMTMyMjg0ZTFmYS5iaW5kUG9wdXAocG9wdXBfMzAwZjJhZGQ5ZGIyNGY5Mzk1MzFhZDY5YWZkNDFmMTQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mNjI0MmI5OWQ3Y2Q0ZTY0YWY1NjMwMmM1NzU4ZjJiMSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3MDc5NiwgLTMuNjQ2NDU5Nzk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzdhYzEyOTJkMzE3NTQ2MmFiOWQxYmU1NDJmNThlODUzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzA0NDc4NDhhZGU5MjQ1ZDVhNWM3YWYyNGM5NjA5MDZmID0gJChgPGRpdiBpZD0iaHRtbF8wNDQ3ODQ4YWRlOTI0NWQ1YTVjN2FmMjRjOTYwOTA2ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzA3OTYsIC0zLjY0NjQ1OTc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83YWMxMjkyZDMxNzU0NjJhYjlkMWJlNTQyZjU4ZTg1My5zZXRDb250ZW50KGh0bWxfMDQ0Nzg0OGFkZTkyNDVkNWE1YzdhZjI0Yzk2MDkwNmYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mNjI0MmI5OWQ3Y2Q0ZTY0YWY1NjMwMmM1NzU4ZjJiMS5iaW5kUG9wdXAocG9wdXBfN2FjMTI5MmQzMTc1NDYyYWI5ZDFiZTU0MmY1OGU4NTMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jYWRkOWI0NmUxMDE0YmYwODA1YzEyZjVkNjU1MmY0NSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE4OTI5MiwgLTMuODAxNjA3NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzM5ZWU0NDQyMGY2YTQyMzlhODA2OTM4OTU0ZGYxOTcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAxZTkzYzQ2MDYwMTQ3NDc5MTY4YjUzMjgxMGExMWZhID0gJChgPGRpdiBpZD0iaHRtbF8wMWU5M2M0NjA2MDE0NzQ3OTE2OGI1MzI4MTBhMTFmYSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxODkyOTIsIC0zLjgwMTYwNzRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zOWVlNDQ0MjBmNmE0MjM5YTgwNjkzODk1NGRmMTk3Mi5zZXRDb250ZW50KGh0bWxfMDFlOTNjNDYwNjAxNDc0NzkxNjhiNTMyODEwYTExZmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jYWRkOWI0NmUxMDE0YmYwODA1YzEyZjVkNjU1MmY0NS5iaW5kUG9wdXAocG9wdXBfMzllZTQ0NDIwZjZhNDIzOWE4MDY5Mzg5NTRkZjE5NzIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85ZmY1ODVkYTk1NWY0MDgyOThiNjlhOTY4YzMxNjY1NSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE1MjIzNCwgLTMuNjUxMDY5MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y4MTFiNjllZTRkMDQ2ZGVhM2MyYTM4MDAzNjQxNjJiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzc1MTRlZDJmNmM2NDQwZjhiYTQzMWJmMTk1MTk0MWIxID0gJChgPGRpdiBpZD0iaHRtbF83NTE0ZWQyZjZjNjQ0MGY4YmE0MzFiZjE5NTE5NDFiMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTIyMzQsIC0zLjY1MTA2OTFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mODExYjY5ZWU0ZDA0NmRlYTNjMmEzODAwMzY0MTYyYi5zZXRDb250ZW50KGh0bWxfNzUxNGVkMmY2YzY0NDBmOGJhNDMxYmYxOTUxOTQxYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZmY1ODVkYTk1NWY0MDgyOThiNjlhOTY4YzMxNjY1NS5iaW5kUG9wdXAocG9wdXBfZjgxMWI2OWVlNGQwNDZkZWEzYzJhMzgwMDM2NDE2MmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82ZTZmM2YwZGQ3Mzg0NzFiYmQ5MzIxYmYwNjViYjNmYyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI0OTIxMjk5OTk5OTk1LCAtMy42NDM0MTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzg3ZGExYjVjNWUxNDIxNmE0NDIwNWNmOWExYThjNWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGY3ZjM3ZDJkMzE5NDRjM2IzYzQxZjdmYjU2YmQ4N2UgPSAkKGA8ZGl2IGlkPSJodG1sX2RmN2YzN2QyZDMxOTQ0YzNiM2M0MWY3ZmI1NmJkODdlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI0OTIxMjk5OTk5OTk1LCAtMy42NDM0MTk1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzg3ZGExYjVjNWUxNDIxNmE0NDIwNWNmOWExYThjNWUuc2V0Q29udGVudChodG1sX2RmN2YzN2QyZDMxOTQ0YzNiM2M0MWY3ZmI1NmJkODdlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNmU2ZjNmMGRkNzM4NDcxYmJkOTMyMWJmMDY1YmIzZmMuYmluZFBvcHVwKHBvcHVwX2M4N2RhMWI1YzVlMTQyMTZhNDQyMDVjZjlhMWE4YzVlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmMxMTY3YjkwOTg0NGRkMmFlNmE5NjFlZTJhZGI0OTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NDc1ODQsIC0zLjY2NjQ3NDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NjJkYTdmNjQ1NTI0ZmViOTFhYzU3MTdiZmE4OTIzOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80YzVlNDA5YjEwNzE0ZTNkOTFlZDEzMGU3MGU1NGVmMyA9ICQoYDxkaXYgaWQ9Imh0bWxfNGM1ZTQwOWIxMDcxNGUzZDkxZWQxMzBlNzBlNTRlZjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zOTQ3NTg0LCAtMy42NjY0NzQ0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzYyZGE3ZjY0NTUyNGZlYjkxYWM1NzE3YmZhODkyMzkuc2V0Q29udGVudChodG1sXzRjNWU0MDliMTA3MTRlM2Q5MWVkMTMwZTcwZTU0ZWYzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmMxMTY3YjkwOTg0NGRkMmFlNmE5NjFlZTJhZGI0OTQuYmluZFBvcHVwKHBvcHVwXzc2MmRhN2Y2NDU1MjRmZWI5MWFjNTcxN2JmYTg5MjM5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmY1Yzc2ZWU4ODMzNGJiM2FkMThiZGFjZTViNmEzMGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ1OSwgLTMuNjQ2MTIwNTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2U4ZjM3ZGQ0OTAxZjRlZGY4N2QzZTllY2Q0NjNiZTY0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzMyYmUzOWIzMWZiNDRkYjY5MjQ2MjRjYmQ4M2JiMjRhID0gJChgPGRpdiBpZD0iaHRtbF8zMmJlMzliMzFmYjQ0ZGI2OTI0NjI0Y2JkODNiYjI0YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ1OSwgLTMuNjQ2MTIwNTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4ZjM3ZGQ0OTAxZjRlZGY4N2QzZTllY2Q0NjNiZTY0LnNldENvbnRlbnQoaHRtbF8zMmJlMzliMzFmYjQ0ZGI2OTI0NjI0Y2JkODNiYjI0YSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JmNWM3NmVlODgzMzRiYjNhZDE4YmRhY2U1YjZhMzBlLmJpbmRQb3B1cChwb3B1cF9lOGYzN2RkNDkwMWY0ZWRmODdkM2U5ZWNkNDYzYmU2NCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I2ZTNjNmNlMmNhOTQ3ZjFhOTkxYzEzMTEzNzMxNmMyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA0NzUzOTk5OTk5OSwgLTMuNjQ1NTE5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2EzNTBmYTVlNTIzZjQ4ZDdhMDAwMDBhOGNhZjU2MDBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkxNjExMTU4ZWRkZDQ3ODlhYWJjNmYwODQxMzBmOGQwID0gJChgPGRpdiBpZD0iaHRtbF85MTYxMTE1OGVkZGQ0Nzg5YWFiYzZmMDg0MTMwZjhkMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDQ3NTM5OTk5OTk5LCAtMy42NDU1MTk1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTM1MGZhNWU1MjNmNDhkN2EwMDAwMGE4Y2FmNTYwMGQuc2V0Q29udGVudChodG1sXzkxNjExMTU4ZWRkZDQ3ODlhYWJjNmYwODQxMzBmOGQwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjZlM2M2Y2UyY2E5NDdmMWE5OTFjMTMxMTM3MzE2YzIuYmluZFBvcHVwKHBvcHVwX2EzNTBmYTVlNTIzZjQ4ZDdhMDAwMDBhOGNhZjU2MDBkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmFkZDgwNjM2OGNlNDI0Yzg4ZDNkMDVmNjc1M2Q1ZjQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQwMDAxOTQsIC0zLjYwMjkzODddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80ODJjYWVjYzhmZDE0OWIzOWUxZDQzMGQ0ZmYyMGMwYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYTljY2JiN2U1ZjE0ZWUzOGRmYWI5ZTI4NmQ5MDJlZCA9ICQoYDxkaXYgaWQ9Imh0bWxfYmE5Y2NiYjdlNWYxNGVlMzhkZmFiOWUyODZkOTAyZWQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MDAwMTk0LCAtMy42MDI5Mzg3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDgyY2FlY2M4ZmQxNDliMzllMWQ0MzBkNGZmMjBjMGMuc2V0Q29udGVudChodG1sX2JhOWNjYmI3ZTVmMTRlZTM4ZGZhYjllMjg2ZDkwMmVkKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmFkZDgwNjM2OGNlNDI0Yzg4ZDNkMDVmNjc1M2Q1ZjQuYmluZFBvcHVwKHBvcHVwXzQ4MmNhZWNjOGZkMTQ5YjM5ZTFkNDMwZDRmZjIwYzBjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNjI3OWExOWI5YTQyNDFkZTlhNWQ1N2IyM2M2ZjkwMDIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ5MjYsIC0zLjY0NDc5NThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lOTg3ZmExMWY5MTc0NjgzYTNlZTczMGUzM2Q2MmJmZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNTBkMDA0YjczM2M0MjU3YTAxMjExODM5YWRlZmJmYiA9ICQoYDxkaXYgaWQ9Imh0bWxfMzUwZDAwNGI3MzNjNDI1N2EwMTIxMTgzOWFkZWZiZmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0OTI2LCAtMy42NDQ3OTU4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTk4N2ZhMTFmOTE3NDY4M2EzZWU3MzBlMzNkNjJiZmQuc2V0Q29udGVudChodG1sXzM1MGQwMDRiNzMzYzQyNTdhMDEyMTE4MzlhZGVmYmZiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNjI3OWExOWI5YTQyNDFkZTlhNWQ1N2IyM2M2ZjkwMDIuYmluZFBvcHVwKHBvcHVwX2U5ODdmYTExZjkxNzQ2ODNhM2VlNzMwZTMzZDYyYmZkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjM3ZTg0OTE4MzE2NDI0ZWE3MzRiYWMxMWI5MWE4ZWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDYyNzQsIC0zLjY0NTM3MjQ5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83ZTMxOWIwYzQxMzc0MjZmYTViZWEwODk4ZDEwZTI2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iOTkyYjYzNmNiMjQ0ODJjYThiM2U2NGU2OGZkMTNkYSA9ICQoYDxkaXYgaWQ9Imh0bWxfYjk5MmI2MzZjYjI0NDgyY2E4YjNlNjRlNjhmZDEzZGEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA2Mjc0LCAtMy42NDUzNzI0OTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfN2UzMTliMGM0MTM3NDI2ZmE1YmVhMDg5OGQxMGUyNmEuc2V0Q29udGVudChodG1sX2I5OTJiNjM2Y2IyNDQ4MmNhOGIzZTY0ZTY4ZmQxM2RhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjM3ZTg0OTE4MzE2NDI0ZWE3MzRiYWMxMWI5MWE4ZWMuYmluZFBvcHVwKHBvcHVwXzdlMzE5YjBjNDEzNzQyNmZhNWJlYTA4OThkMTBlMjZhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYWJjNDI1ZTJjMWY0NDc3MThlNzgxMDk2NWYxOWM4MzQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ2MzQ3NzEsIC0zLjYxMjc4MjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZjZkMjAxMjI3MDQ0YWQwODcwNmRhOTg4Y2I2MzM1OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82YmUzOGU4ZTcxNzc0MDA5YTViNjEwOTA5YzhmNjE2NSA9ICQoYDxkaXYgaWQ9Imh0bWxfNmJlMzhlOGU3MTc3NDAwOWE1YjYxMDkwOWM4ZjYxNjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NjM0NzcxLCAtMy42MTI3ODI1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2Y2ZDIwMTIyNzA0NGFkMDg3MDZkYTk4OGNiNjMzNTkuc2V0Q29udGVudChodG1sXzZiZTM4ZThlNzE3NzQwMDlhNWI2MTA5MDljOGY2MTY1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWJjNDI1ZTJjMWY0NDc3MThlNzgxMDk2NWYxOWM4MzQuYmluZFBvcHVwKHBvcHVwX2NmNmQyMDEyMjcwNDRhZDA4NzA2ZGE5ODhjYjYzMzU5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZmM5YWQ0NzgzOGY1NDc1ZWIxZTkwNzIyMjMyMTI1ZTQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNjI2OTIsIC0zLjYyMzY5NzVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83NmRkMDcwNjc5M2E0ODQ0YTBjYmM2ZjViMGU1MDA4MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8xMjg1NDZjNDQ4ZTY0YWY1OWE3YzI3YWI2MDQ0MjQ3YiA9ICQoYDxkaXYgaWQ9Imh0bWxfMTI4NTQ2YzQ0OGU2NGFmNTlhN2MyN2FiNjA0NDI0N2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTYyNjkyLCAtMy42MjM2OTc1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzZkZDA3MDY3OTNhNDg0NGEwY2JjNmY1YjBlNTAwODAuc2V0Q29udGVudChodG1sXzEyODU0NmM0NDhlNjRhZjU5YTdjMjdhYjYwNDQyNDdiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmM5YWQ0NzgzOGY1NDc1ZWIxZTkwNzIyMjMyMTI1ZTQuYmluZFBvcHVwKHBvcHVwXzc2ZGQwNzA2NzkzYTQ4NDRhMGNiYzZmNWIwZTUwMDgwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNGFjNjQ2ZTdkMDgxNGRiM2JkODFmZTBmYjQ0YjBkYmUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDQ2NzYsIC0zLjYzMjkwMzZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81YzE3ZmY2NzFlNDI0NGFhODVkNzMzNGVkYjM3YTNkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83Y2JiYmQ1NzYwNWQ0MGFkODJhODNlYzMwOGQ1MjhjYiA9ICQoYDxkaXYgaWQ9Imh0bWxfN2NiYmJkNTc2MDVkNDBhZDgyYTgzZWMzMDhkNTI4Y2IiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjA0Njc2LCAtMy42MzI5MDM2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNWMxN2ZmNjcxZTQyNDRhYTg1ZDczMzRlZGIzN2EzZDYuc2V0Q29udGVudChodG1sXzdjYmJiZDU3NjA1ZDQwYWQ4MmE4M2VjMzA4ZDUyOGNiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGFjNjQ2ZTdkMDgxNGRiM2JkODFmZTBmYjQ0YjBkYmUuYmluZFBvcHVwKHBvcHVwXzVjMTdmZjY3MWU0MjQ0YWE4NWQ3MzM0ZWRiMzdhM2Q2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjA3ODc3ZmQyNGMzNGFlYzg0ZmE5ZTBmMjBjOTNmMzEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ5NTYsIC0zLjY0NDc5MDYwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yM2ZmNmRhNmQ3MWI0OTRiYTc2YTZmM2VlMGFlMTRhMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOTE2YzFkNWE3MmE0MDA3Yjk1YWM1Y2I3OWE5M2Y4MyA9ICQoYDxkaXYgaWQ9Imh0bWxfMjkxNmMxZDVhNzJhNDAwN2I5NWFjNWNiNzlhOTNmODMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0OTU2LCAtMy42NDQ3OTA2MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjNmZjZkYTZkNzFiNDk0YmE3NmE2ZjNlZTBhZTE0YTAuc2V0Q29udGVudChodG1sXzI5MTZjMWQ1YTcyYTQwMDdiOTVhYzVjYjc5YTkzZjgzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjA3ODc3ZmQyNGMzNGFlYzg0ZmE5ZTBmMjBjOTNmMzEuYmluZFBvcHVwKHBvcHVwXzIzZmY2ZGE2ZDcxYjQ5NGJhNzZhNmYzZWUwYWUxNGEwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDQ4NzA2OGY5NzE2NGU2NzkwOTVhNzFkNzVlMmM2MDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzIwMjgsIC0zLjY0NjU5NjcwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wOTVkZjk2NDRiNWI0ODhlOTZhNjViODJiZjIyOGMwMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yOWIwOGMyZGM5ZmM0Y2RhYjM0MmM2NTU1MzgyMzUxNCA9ICQoYDxkaXYgaWQ9Imh0bWxfMjliMDhjMmRjOWZjNGNkYWIzNDJjNjU1NTM4MjM1MTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjcyMDI4LCAtMy42NDY1OTY3MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDk1ZGY5NjQ0YjViNDg4ZTk2YTY1YjgyYmYyMjhjMDMuc2V0Q29udGVudChodG1sXzI5YjA4YzJkYzlmYzRjZGFiMzQyYzY1NTUzODIzNTE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDQ4NzA2OGY5NzE2NGU2NzkwOTVhNzFkNzVlMmM2MDYuYmluZFBvcHVwKHBvcHVwXzA5NWRmOTY0NGI1YjQ4OGU5NmE2NWI4MmJmMjI4YzAzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNTkxYTg0ZWQ5MGQ0NGM0OTgwNDRmNzE3ZTExOWMxNzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjE3NzY0MDQsIC01LjgzMDgxMTRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YzU3MjgyM2FkMTA0MjU4YTM5MWQwNzAyMTQzZGQ4OCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84NDNlMmNmZDliZjE0YWZjOThiYzE2ZGIwMDEzN2MwYiA9ICQoYDxkaXYgaWQ9Imh0bWxfODQzZTJjZmQ5YmYxNGFmYzk4YmMxNmRiMDAxMzdjMGIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4xNzc2NDA0LCAtNS44MzA4MTE0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGM1NzI4MjNhZDEwNDI1OGEzOTFkMDcwMjE0M2RkODguc2V0Q29udGVudChodG1sXzg0M2UyY2ZkOWJmMTRhZmM5OGJjMTZkYjAwMTM3YzBiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTkxYTg0ZWQ5MGQ0NGM0OTgwNDRmNzE3ZTExOWMxNzcuYmluZFBvcHVwKHBvcHVwXzhjNTcyODIzYWQxMDQyNThhMzkxZDA3MDIxNDNkZDg4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYmJiMTI3NTBlNzExNGNmNGE1NjIzZTBlZTAwY2ZiYTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTMyNzM5OTk5OTk5NiwgLTMuNjI4Njk5ODk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FmMzhiNWMwYmRmMzRjZDViNmQyNTRmYmU3ZTk0NDNjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM4ZDg4ZWRlM2ZkODQ3YTE5OWI4MDc1ZTcwNDEzMjE3ID0gJChgPGRpdiBpZD0iaHRtbF8zOGQ4OGVkZTNmZDg0N2ExOTliODA3NWU3MDQxMzIxNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTMyNzM5OTk5OTk5NiwgLTMuNjI4Njk5ODk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FmMzhiNWMwYmRmMzRjZDViNmQyNTRmYmU3ZTk0NDNjLnNldENvbnRlbnQoaHRtbF8zOGQ4OGVkZTNmZDg0N2ExOTliODA3NWU3MDQxMzIxNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JiYjEyNzUwZTcxMTRjZjRhNTYyM2UwZWUwMGNmYmEyLmJpbmRQb3B1cChwb3B1cF9hZjM4YjVjMGJkZjM0Y2Q1YjZkMjU0ZmJlN2U5NDQzYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA1ZGQyODA2ZGRlMzQ5NmM4NmE3ODVmMmUyNTRlMDZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjgzMTEzLCAtMy42NDgwMDAyMDAwMDAwMDAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjljZjg4Mjg4YmYzNDViNzkwNTQ2ZjNmMjMzNzhhNGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZThmY2VlMTMwZjM2NGMyNThlNjhjNDQ4ZjE2Yjc1ZjYgPSAkKGA8ZGl2IGlkPSJodG1sX2U4ZmNlZTEzMGYzNjRjMjU4ZTY4YzQ0OGYxNmI3NWY2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4MzExMywgLTMuNjQ4MDAwMjAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY5Y2Y4ODI4OGJmMzQ1Yjc5MDU0NmYzZjIzMzc4YTRhLnNldENvbnRlbnQoaHRtbF9lOGZjZWUxMzBmMzY0YzI1OGU2OGM0NDhmMTZiNzVmNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA1ZGQyODA2ZGRlMzQ5NmM4NmE3ODVmMmUyNTRlMDZhLmJpbmRQb3B1cChwb3B1cF82OWNmODgyODhiZjM0NWI3OTA1NDZmM2YyMzM3OGE0YSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2YzZTMzMTE5MjY5MTQ5ZDdhZGQ1NDk4YmMwZjdiZmZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTIxOTQyLCAtMy42Mjg4NjM3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzYyYmIzODVkYTJjNDJlMGE4YWY3MjBkY2Y3NzU0MmIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDJmYWRjNDZlMDM1NDY4ZTlhMTRlYjZkN2Q1ZDdjNDIgPSAkKGA8ZGl2IGlkPSJodG1sX2QyZmFkYzQ2ZTAzNTQ2OGU5YTE0ZWI2ZDdkNWQ3YzQyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDEyMTk0MiwgLTMuNjI4ODYzN108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2MmJiMzg1ZGEyYzQyZTBhOGFmNzIwZGNmNzc1NDJiLnNldENvbnRlbnQoaHRtbF9kMmZhZGM0NmUwMzU0NjhlOWExNGViNmQ3ZDVkN2M0Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2YzZTMzMTE5MjY5MTQ5ZDdhZGQ1NDk4YmMwZjdiZmZhLmJpbmRQb3B1cChwb3B1cF8zNjJiYjM4NWRhMmM0MmUwYThhZjcyMGRjZjc3NTQyYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzNmM2MwODM5MTExNjQyMTNiZGJiNzVhZjVhY2Q5ODRlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzcxOTE2LCAtMy42MTc5ODE2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZDE0OGJiN2U3MjlkNDIyZjgwYzE5ZjU2NTg0NDBhMjggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJkYzYxMWYyODNjNDZmN2I5YWU0MzBiYjllNTBiMmYgPSAkKGA8ZGl2IGlkPSJodG1sXzJiZGM2MTFmMjgzYzQ2ZjdiOWFlNDMwYmI5ZTUwYjJmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM3MTkxNiwgLTMuNjE3OTgxNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2QxNDhiYjdlNzI5ZDQyMmY4MGMxOWY1NjU4NDQwYTI4LnNldENvbnRlbnQoaHRtbF8yYmRjNjExZjI4M2M0NmY3YjlhZTQzMGJiOWU1MGIyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNmM2MwODM5MTExNjQyMTNiZGJiNzVhZjVhY2Q5ODRlLmJpbmRQb3B1cChwb3B1cF9kMTQ4YmI3ZTcyOWQ0MjJmODBjMTlmNTY1ODQ0MGEyOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzc4YWIzYTMzNGYxODQ3OGFhNmY4NGNmZTJkMGE1NTExID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTkzLCAtMy42MzUyMzgxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODBmZGY3ODM2OTcwNGU5ZmEzYjViN2NjZjQ4NzhmZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzY1YTQ5N2I2N2RjNDBjYjkwNzM5Yjg0NjFlOTU1NjQgPSAkKGA8ZGl2IGlkPSJodG1sXzc2NWE0OTdiNjdkYzQwY2I5MDczOWI4NDYxZTk1NTY0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5MywgLTMuNjM1MjM4MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzgwZmRmNzgzNjk3MDRlOWZhM2I1YjdjY2Y0ODc4ZmRhLnNldENvbnRlbnQoaHRtbF83NjVhNDk3YjY3ZGM0MGNiOTA3MzliODQ2MWU5NTU2NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc4YWIzYTMzNGYxODQ3OGFhNmY4NGNmZTJkMGE1NTExLmJpbmRQb3B1cChwb3B1cF84MGZkZjc4MzY5NzA0ZTlmYTNiNWI3Y2NmNDg3OGZkYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2M3ODI4ZGE0NTAyMjQxYTFhMGRlM2E5OGMyODgwOTYwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTYwNDE2LCAtMy42NjM1MTMzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDNkYTA4Mzg5YzQ1NGM0YmFmNjc4MDdmYWQwZWFhYjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjlhZWMwY2FkY2YyNDU3OGIwNzQ4YTE4NGE5Yjg3NDYgPSAkKGA8ZGl2IGlkPSJodG1sXzY5YWVjMGNhZGNmMjQ1NzhiMDc0OGExODRhOWI4NzQ2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE2MDQxNiwgLTMuNjYzNTEzM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQzZGEwODM4OWM0NTRjNGJhZjY3ODA3ZmFkMGVhYWIxLnNldENvbnRlbnQoaHRtbF82OWFlYzBjYWRjZjI0NTc4YjA3NDhhMTg0YTliODc0Nik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M3ODI4ZGE0NTAyMjQxYTFhMGRlM2E5OGMyODgwOTYwLmJpbmRQb3B1cChwb3B1cF80M2RhMDgzODljNDU0YzRiYWY2NzgwN2ZhZDBlYWFiMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzhkYmQ5ZjljY2I4YTRiOThiMmJhNjQ0MTZjMGVlNWFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzIwODk1MDAwMDAwMDUsIC0zLjYzOTQ2ODRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YjVmY2VkOTgzNGI0ZjVjYjRmMGQzZTA1ZjYyYzJiNyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNTNlMGIyZDY4NzA0NWE3OTk1MWE1YjVkYzY5M2RjMCA9ICQoYDxkaXYgaWQ9Imh0bWxfMDUzZTBiMmQ2ODcwNDVhNzk5NTFhNWI1ZGM2OTNkYzAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzIwODk1MDAwMDAwMDUsIC0zLjYzOTQ2ODRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84YjVmY2VkOTgzNGI0ZjVjYjRmMGQzZTA1ZjYyYzJiNy5zZXRDb250ZW50KGh0bWxfMDUzZTBiMmQ2ODcwNDVhNzk5NTFhNWI1ZGM2OTNkYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ZGJkOWY5Y2NiOGE0Yjk4YjJiYTY0NDE2YzBlZTVhYS5iaW5kUG9wdXAocG9wdXBfOGI1ZmNlZDk4MzRiNGY1Y2I0ZjBkM2UwNWY2MmMyYjcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85NjBkMWM5NjhhZjQ0NTU5YWRiY2EwMTY3MDkzZTk4YiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwNDg2NzAwMDAwMDA0LCAtMy42NDU1MjEyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGU4MDNhZmExNGIzNDNkYmJjODYwNzNjMzEyMzYyZWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2MyNjU1ZTdlOTBlNGIxNmE2Mjc4NjViNWFmNTExNDkgPSAkKGA8ZGl2IGlkPSJodG1sX2NjMjY1NWU3ZTkwZTRiMTZhNjI3ODY1YjVhZjUxMTQ5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNDg2NzAwMDAwMDA0LCAtMy42NDU1MjEyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMGU4MDNhZmExNGIzNDNkYmJjODYwNzNjMzEyMzYyZWQuc2V0Q29udGVudChodG1sX2NjMjY1NWU3ZTkwZTRiMTZhNjI3ODY1YjVhZjUxMTQ5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTYwZDFjOTY4YWY0NDU1OWFkYmNhMDE2NzA5M2U5OGIuYmluZFBvcHVwKHBvcHVwXzBlODAzYWZhMTRiMzQzZGJiYzg2MDczYzMxMjM2MmVkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNWNlMmY0YWYzMGUxNDk5ZTk4ODc5M2UyZDFkNDY4NjEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQwMTM4MzMsIC0zLjY2ODAxNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQyNjc2ZjkxY2ZiZDQ2YmZhNjZkYWYwMDBiZDUxMzBkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFkNTM2ZjVlYjZhZjRlMGQ5MzMwZjk4ZjQ2YzYzOTJmID0gJChgPGRpdiBpZD0iaHRtbF8xZDUzNmY1ZWI2YWY0ZTBkOTMzMGY5OGY0NmM2MzkyZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQwMTM4MzMsIC0zLjY2ODAxNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQyNjc2ZjkxY2ZiZDQ2YmZhNjZkYWYwMDBiZDUxMzBkLnNldENvbnRlbnQoaHRtbF8xZDUzNmY1ZWI2YWY0ZTBkOTMzMGY5OGY0NmM2MzkyZik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVjZTJmNGFmMzBlMTQ5OWU5ODg3OTNlMmQxZDQ2ODYxLmJpbmRQb3B1cChwb3B1cF80MjY3NmY5MWNmYmQ0NmJmYTY2ZGFmMDAwYmQ1MTMwZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y1MjA1YmU1NWUzYTQ4ZjNhODMyYmE5NGRiNTgyN2Y4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU2ODk4OTk5OTk5OTQsIC0zLjYxNjUyNDI5OTk5OTk5OTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNDdhN2VmMDdiZTU0ODVjOTc0MzIxNDkxZDkxNWY0NSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hZDM0YTc2NzQwODM0ZGRmYjM5Y2U0ZWVhMTg4OGUyMyA9ICQoYDxkaXYgaWQ9Imh0bWxfYWQzNGE3Njc0MDgzNGRkZmIzOWNlNGVlYTE4ODhlMjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU2ODk4OTk5OTk5OTQsIC0zLjYxNjUyNDI5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNDdhN2VmMDdiZTU0ODVjOTc0MzIxNDkxZDkxNWY0NS5zZXRDb250ZW50KGh0bWxfYWQzNGE3Njc0MDgzNGRkZmIzOWNlNGVlYTE4ODhlMjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mNTIwNWJlNTVlM2E0OGYzYTgzMmJhOTRkYjU4MjdmOC5iaW5kUG9wdXAocG9wdXBfMjQ3YTdlZjA3YmU1NDg1Yzk3NDMyMTQ5MWQ5MTVmNDUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xMmJjMjUxOWNiYmI0MjY4YTU4NzM5MjExNWQ5YmI5ZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NDIzMiwgLTMuNjQ0ODcwMjAwMDAwMDAwNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5YzcwY2I2NmNjMjRhNGQ5ZDg0ZTMxYTVlMDY3NzVjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzE5YjU4Y2RjNzI2ZTQ2Mjg5ZjBhYjBiNTBjMGM2NTZhID0gJChgPGRpdiBpZD0iaHRtbF8xOWI1OGNkYzcyNmU0NjI4OWYwYWIwYjUwYzBjNjU2YSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQyMzIsIC0zLjY0NDg3MDIwMDAwMDAwMDZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OWM3MGNiNjZjYzI0YTRkOWQ4NGUzMWE1ZTA2Nzc1Yy5zZXRDb250ZW50KGh0bWxfMTliNThjZGM3MjZlNDYyODlmMGFiMGI1MGMwYzY1NmEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8xMmJjMjUxOWNiYmI0MjY4YTU4NzM5MjExNWQ5YmI5ZC5iaW5kUG9wdXAocG9wdXBfODljNzBjYjY2Y2MyNGE0ZDlkODRlMzFhNWUwNjc3NWMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kNjIxODFmYjRmYzU0MWE3YThmN2Y2Y2NkYWUzMWE1OCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5ODgwNSwgLTMuNjMwOTM1MTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU3ZjQyNmY3NzBjMjQ3NjFiYTRkOTU4MGFhN2NkZjNmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzgxMjNjZmZhMGQ5NzRiYmFiNjA0ODYzNzU3MzU0ZTYyID0gJChgPGRpdiBpZD0iaHRtbF84MTIzY2ZmYTBkOTc0YmJhYjYwNDg2Mzc1NzM1NGU2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTg4MDUsIC0zLjYzMDkzNTE5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81N2Y0MjZmNzcwYzI0NzYxYmE0ZDk1ODBhYTdjZGYzZi5zZXRDb250ZW50KGh0bWxfODEyM2NmZmEwZDk3NGJiYWI2MDQ4NjM3NTczNTRlNjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kNjIxODFmYjRmYzU0MWE3YThmN2Y2Y2NkYWUzMWE1OC5iaW5kUG9wdXAocG9wdXBfNTdmNDI2Zjc3MGMyNDc2MWJhNGQ5NTgwYWE3Y2RmM2YpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jOTBkYzM5ZDlmODE0N2U3YmQ1YzU5NGViNmIxYjNhZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTE1NzUzMTAwMDAwMDA1LCAtMy42MzU2ODQ4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNDI5ZDMzODBhYzNiNGM3ZDkzNjViNTNkZWQ2NTA3MzkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjBiOWQ4NWM1NmRkNDU3MzljMTY5OGY2YmRjYTc1YWMgPSAkKGA8ZGl2IGlkPSJodG1sX2YwYjlkODVjNTZkZDQ1NzM5YzE2OThmNmJkY2E3NWFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTE1NzUzMTAwMDAwMDA1LCAtMy42MzU2ODQ4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDI5ZDMzODBhYzNiNGM3ZDkzNjViNTNkZWQ2NTA3Mzkuc2V0Q29udGVudChodG1sX2YwYjlkODVjNTZkZDQ1NzM5YzE2OThmNmJkY2E3NWFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzkwZGMzOWQ5ZjgxNDdlN2JkNWM1OTRlYjZiMWIzYWUuYmluZFBvcHVwKHBvcHVwXzQyOWQzMzgwYWMzYjRjN2Q5MzY1YjUzZGVkNjUwNzM5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTc1YzIxNzZmYjFhNGY0Y2FmMTVmN2NlNGIwZGZjMzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUxODIyNDEwMDAwMDAwNSwgLTMuNjUzMzQyMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2YxZDRmMDM5MWRmNDRkMzY5MWVmZWMxYzc0NmQ4ZjcyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVhYmUwMjhmMDhjNDQ4NDQ4MDRkYTcwYmZjZmI3OTllID0gJChgPGRpdiBpZD0iaHRtbF81YWJlMDI4ZjA4YzQ0ODQ0ODA0ZGE3MGJmY2ZiNzk5ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUxODIyNDEwMDAwMDAwNSwgLTMuNjUzMzQyMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxZDRmMDM5MWRmNDRkMzY5MWVmZWMxYzc0NmQ4ZjcyLnNldENvbnRlbnQoaHRtbF81YWJlMDI4ZjA4YzQ0ODQ0ODA0ZGE3MGJmY2ZiNzk5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE3NWMyMTc2ZmIxYTRmNGNhZjE1ZjdjZTRiMGRmYzM1LmJpbmRQb3B1cChwb3B1cF9mMWQ0ZjAzOTFkZjQ0ZDM2OTFlZmVjMWM3NDZkOGY3MikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzlhZGM4OTY1MDRjNzRmOTE4NWE3YTBkMTAxMDk3YjU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTUzMDA2LCAtMy42NjA1Mjc1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzQ1ZGI5OGIyNjFiNDBjYmExM2NiYzViNjk2MDkzNWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODY2NTA2MTNmZTQ2NDU0YTg1ZWJlM2M5M2FmZTQ2NDggPSAkKGA8ZGl2IGlkPSJodG1sXzg2NjUwNjEzZmU0NjQ1NGE4NWViZTNjOTNhZmU0NjQ4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE1MzAwNiwgLTMuNjYwNTI3NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0NWRiOThiMjYxYjQwY2JhMTNjYmM1YjY5NjA5MzVkLnNldENvbnRlbnQoaHRtbF84NjY1MDYxM2ZlNDY0NTRhODVlYmUzYzkzYWZlNDY0OCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzlhZGM4OTY1MDRjNzRmOTE4NWE3YTBkMTAxMDk3YjU2LmJpbmRQb3B1cChwb3B1cF83NDVkYjk4YjI2MWI0MGNiYTEzY2JjNWI2OTYwOTM1ZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzNlYzRjZjRmODZhMDRiZGU5MTg0Yjc0NmNhNWY0MzY5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc1NzQ5LCAtMy42NDQ2NzMwMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjc4ZTU1Y2QxY2FkNGQ2MjkzMzI1ZmUwY2U2ZDg0OTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWZmZTc5MDQwODliNGM4MTlmZWQyMGEyYmQ2MzI0MWMgPSAkKGA8ZGl2IGlkPSJodG1sX2FmZmU3OTA0MDg5YjRjODE5ZmVkMjBhMmJkNjMyNDFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NTc0OSwgLTMuNjQ0NjczMDAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI3OGU1NWNkMWNhZDRkNjI5MzMyNWZlMGNlNmQ4NDkzLnNldENvbnRlbnQoaHRtbF9hZmZlNzkwNDA4OWI0YzgxOWZlZDIwYTJiZDYzMjQxYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzNlYzRjZjRmODZhMDRiZGU5MTg0Yjc0NmNhNWY0MzY5LmJpbmRQb3B1cChwb3B1cF8yNzhlNTVjZDFjYWQ0ZDYyOTMzMjVmZTBjZTZkODQ5MykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2U5MGE5NDE0NjM5NzRiMTliOWUzZDdlNThkMTlkMDQzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41NDU4MDk4LCAtMy42NDM4MzA4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjcxZTVlN2Q2M2VlNGNiMmFjMzEwYzEyYjY1NjM0MWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfN2EwNTYwMmIyNDQwNDllNzg5YWRkM2I1ZTI4YjBkYTQgPSAkKGA8ZGl2IGlkPSJodG1sXzdhMDU2MDJiMjQ0MDQ5ZTc4OWFkZDNiNWUyOGIwZGE0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTQ1ODA5OCwgLTMuNjQzODMwOF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY3MWU1ZTdkNjNlZTRjYjJhYzMxMGMxMmI2NTYzNDFkLnNldENvbnRlbnQoaHRtbF83YTA1NjAyYjI0NDA0OWU3ODlhZGQzYjVlMjhiMGRhNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U5MGE5NDE0NjM5NzRiMTliOWUzZDdlNThkMTlkMDQzLmJpbmRQb3B1cChwb3B1cF82NzFlNWU3ZDYzZWU0Y2IyYWMzMTBjMTJiNjU2MzQxZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzk1YzNjNGI5MzYxODRlYjY4ZmIwYWQ0ZGNiZDU0ZWEzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzYzNjM2LCAtMy42MTQ1MzY2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTFhMTEzYmVhYTQ1NGE5M2E4M2Q3NmEwNDgxZDVhMDUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzg2ZDkzOWM3MzVmNDc1ZjlmZDYzZGJkN2Q2MDYxZWUgPSAkKGA8ZGl2IGlkPSJodG1sXzM4NmQ5MzljNzM1ZjQ3NWY5ZmQ2M2RiZDdkNjA2MWVlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTM2MzYzNiwgLTMuNjE0NTM2Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzkxYTExM2JlYWE0NTRhOTNhODNkNzZhMDQ4MWQ1YTA1LnNldENvbnRlbnQoaHRtbF8zODZkOTM5YzczNWY0NzVmOWZkNjNkYmQ3ZDYwNjFlZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk1YzNjNGI5MzYxODRlYjY4ZmIwYWQ0ZGNiZDU0ZWEzLmJpbmRQb3B1cChwb3B1cF85MWExMTNiZWFhNDU0YTkzYTgzZDc2YTA0ODFkNWEwNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y3YmFkNzkxZjQ0MjQyMmJiNzA0ZDc4ODc1ZDJjNDQyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjM4LCAtMy42NDYwOTg3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMDk2YjE0ZDE4NjNkNDAxMDliYmQ4ZDU0YjE2MTAwMmQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmZlZmExZTM0ZDE1NDFkNDg2MGRmNTcxMjkyZTlkM2QgPSAkKGA8ZGl2IGlkPSJodG1sXzJmZWZhMWUzNGQxNTQxZDQ4NjBkZjU3MTI5MmU5ZDNkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDYzOCwgLTMuNjQ2MDk4N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzA5NmIxNGQxODYzZDQwMTA5YmJkOGQ1NGIxNjEwMDJkLnNldENvbnRlbnQoaHRtbF8yZmVmYTFlMzRkMTU0MWQ0ODYwZGY1NzEyOTJlOWQzZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3YmFkNzkxZjQ0MjQyMmJiNzA0ZDc4ODc1ZDJjNDQyLmJpbmRQb3B1cChwb3B1cF8wOTZiMTRkMTg2M2Q0MDEwOWJiZDhkNTRiMTYxMDAyZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzIwYWRiOWI3MGQ0OTQ1NjZhMGJlZTIxNTg0NGQ2NWQwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjkyNDEsIC0zLjY0MDY5NjRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNzMzYjVmZjY1YWY0YjMxOWUyZTI4NGFjNWZiNWM2YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hMTY2OTg4ZWIyOWU0NzBjOTBkMjE0MjAzNWRiOWIyZSA9ICQoYDxkaXYgaWQ9Imh0bWxfYTE2Njk4OGViMjllNDcwYzkwZDIxNDIwMzVkYjliMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNDEsIC0zLjY0MDY5NjRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yNzMzYjVmZjY1YWY0YjMxOWUyZTI4NGFjNWZiNWM2YS5zZXRDb250ZW50KGh0bWxfYTE2Njk4OGViMjllNDcwYzkwZDIxNDIwMzVkYjliMmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yMGFkYjliNzBkNDk0NTY2YTBiZWUyMTU4NDRkNjVkMC5iaW5kUG9wdXAocG9wdXBfMjczM2I1ZmY2NWFmNGIzMTllMmUyODRhYzVmYjVjNmEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yYmRjYmIwYWU1NGU0ODI3OTFhNDI2ZmJjNTk2M2I0MiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2NDEzMjk5OTk5OTk0LCAtMy42NDQxNTg1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzE1Zjk2NGQ1ZWY5NGQ1NWFjYmUxYmIyOTdlZTYwMGIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDI2ZTZmMGM4NDU4NGU4YmE4ZDk3ZDQ2NTJiYTZjNjggPSAkKGA8ZGl2IGlkPSJodG1sX2QyNmU2ZjBjODQ1ODRlOGJhOGQ5N2Q0NjUyYmE2YzY4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2NDEzMjk5OTk5OTk0LCAtMy42NDQxNTg1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzE1Zjk2NGQ1ZWY5NGQ1NWFjYmUxYmIyOTdlZTYwMGIuc2V0Q29udGVudChodG1sX2QyNmU2ZjBjODQ1ODRlOGJhOGQ5N2Q0NjUyYmE2YzY4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmJkY2JiMGFlNTRlNDgyNzkxYTQyNmZiYzU5NjNiNDIuYmluZFBvcHVwKHBvcHVwXzcxNWY5NjRkNWVmOTRkNTVhY2JlMWJiMjk3ZWU2MDBiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNjQxNzAzMGFlNWE0NDg1MTg2OWE5N2EyYmJmYjFhNGMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ2Mjk0MDEwMDAwMDAwNCwgLTMuNjYwMzQyMjk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg3ZDcwMzQ1YTgxNjRkMTQ4MGYzNTEzNWE3YjZmOTMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3Nzg3YmFiOWY5NzQ5Yzc4N2RjNThlZmE3YmM3MDY1ID0gJChgPGRpdiBpZD0iaHRtbF9kNzc4N2JhYjlmOTc0OWM3ODdkYzU4ZWZhN2JjNzA2NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ2Mjk0MDEwMDAwMDAwNCwgLTMuNjYwMzQyMjk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg3ZDcwMzQ1YTgxNjRkMTQ4MGYzNTEzNWE3YjZmOTMwLnNldENvbnRlbnQoaHRtbF9kNzc4N2JhYjlmOTc0OWM3ODdkYzU4ZWZhN2JjNzA2NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY0MTcwMzBhZTVhNDQ4NTE4NjlhOTdhMmJiZmIxYTRjLmJpbmRQb3B1cChwb3B1cF84N2Q3MDM0NWE4MTY0ZDE0ODBmMzUxMzVhN2I2ZjkzMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Q0ZGY1ODYyODY1MDRlNmY5MDcxNjRjZmY1MjRmMDUzID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU4NjcyLCAtMy42NjQzMjA4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNzNmMDAzZTMyNmRkNDk1OGFmYmM1OGQ4NWNhYmQ1MzggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTlkN2ExNmNkOWMxNDQyYThiYWFiYjcxNTRiNjAxN2QgPSAkKGA8ZGl2IGlkPSJodG1sXzU5ZDdhMTZjZDljMTQ0MmE4YmFhYmI3MTU0YjYwMTdkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE1ODY3MiwgLTMuNjY0MzIwOF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzczZjAwM2UzMjZkZDQ5NThhZmJjNThkODVjYWJkNTM4LnNldENvbnRlbnQoaHRtbF81OWQ3YTE2Y2Q5YzE0NDJhOGJhYWJiNzE1NGI2MDE3ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q0ZGY1ODYyODY1MDRlNmY5MDcxNjRjZmY1MjRmMDUzLmJpbmRQb3B1cChwb3B1cF83M2YwMDNlMzI2ZGQ0OTU4YWZiYzU4ZDg1Y2FiZDUzOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2FiYjZjZjUwMjYyOTQ3MTE4MWY4ZTFhMmM1YTZmZDBlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NzAzLCAtMy42NDYwODg1OTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzY5OGRiMGU2NzNiNDNiYzhjZDk5YWU1M2NkMjFhNDQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTI1ZDU0M2QwYmEyNDIyYzgxYzE0MmUwODU2ZmNlZTYgPSAkKGA8ZGl2IGlkPSJodG1sX2UyNWQ1NDNkMGJhMjQyMmM4MWMxNDJlMDg1NmZjZWU2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDcwMywgLTMuNjQ2MDg4NTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzM2OThkYjBlNjczYjQzYmM4Y2Q5OWFlNTNjZDIxYTQ0LnNldENvbnRlbnQoaHRtbF9lMjVkNTQzZDBiYTI0MjJjODFjMTQyZTA4NTZmY2VlNik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2FiYjZjZjUwMjYyOTQ3MTE4MWY4ZTFhMmM1YTZmZDBlLmJpbmRQb3B1cChwb3B1cF8zNjk4ZGIwZTY3M2I0M2JjOGNkOTlhZTUzY2QyMWE0NCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQ5OGZmNGE0NTViYzQxMDZhMTNkZmFkNmU3YzdkNTM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjM4OTk5OTk5OTQsIC0zLjY0NjEyMDFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jODhkNjRlNTM1ZDQ0OTA1ODAxOTQ1MjRkOGNjZTdhNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZGVmMjJkZDk4YTg0ZGQ3ODYxYjViNGFiN2U0MDhlYyA9ICQoYDxkaXYgaWQ9Imh0bWxfMGRlZjIyZGQ5OGE4NGRkNzg2MWI1YjRhYjdlNDA4ZWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0NjM4OTk5OTk5OTQsIC0zLjY0NjEyMDFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jODhkNjRlNTM1ZDQ0OTA1ODAxOTQ1MjRkOGNjZTdhNC5zZXRDb250ZW50KGh0bWxfMGRlZjIyZGQ5OGE4NGRkNzg2MWI1YjRhYjdlNDA4ZWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80OThmZjRhNDU1YmM0MTA2YTEzZGZhZDZlN2M3ZDUzNy5iaW5kUG9wdXAocG9wdXBfYzg4ZDY0ZTUzNWQ0NDkwNTgwMTk0NTI0ZDhjY2U3YTQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mM2MyNWU0YTdkYTQ0OTAxYTNlNzMxMGY2M2UzNWVkOSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2OTE0MSwgLTMuNjQ3MDcxMTAwMDAwMDAwMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQxMTkyYzFlZjg0NDQxZmQ5YTY4YjUxZmY1ZWNkM2I3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlkOWIyZmU3Y2RlZTQ5YjVhNDlmMWQzM2YxNzc2MDEyID0gJChgPGRpdiBpZD0iaHRtbF85ZDliMmZlN2NkZWU0OWI1YTQ5ZjFkMzNmMTc3NjAxMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjkxNDEsIC0zLjY0NzA3MTEwMDAwMDAwMDJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MTE5MmMxZWY4NDQ0MWZkOWE2OGI1MWZmNWVjZDNiNy5zZXRDb250ZW50KGh0bWxfOWQ5YjJmZTdjZGVlNDliNWE0OWYxZDMzZjE3NzYwMTIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mM2MyNWU0YTdkYTQ0OTAxYTNlNzMxMGY2M2UzNWVkOS5iaW5kUG9wdXAocG9wdXBfNDExOTJjMWVmODQ0NDFmZDlhNjhiNTFmZjVlY2QzYjcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wOGM4ZjNkMDQ2NzQ0OTMxOWQzMDViMzNlODgwYmZkMCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4MDUzNCwgLTMuNjQ0MDI3OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg5MDlmNzRkNmUwMTRlOTM4ZDhhY2Y1NmYxMWE0M2YzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2JiMzFkOWExMDAxYjQwMDJiZmMxNTRkODQ1MzRkNDM0ID0gJChgPGRpdiBpZD0iaHRtbF9iYjMxZDlhMTAwMWI0MDAyYmZjMTU0ZDg0NTM0ZDQzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODA1MzQsIC0zLjY0NDAyNzhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84OTA5Zjc0ZDZlMDE0ZTkzOGQ4YWNmNTZmMTFhNDNmMy5zZXRDb250ZW50KGh0bWxfYmIzMWQ5YTEwMDFiNDAwMmJmYzE1NGQ4NDUzNGQ0MzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wOGM4ZjNkMDQ2NzQ0OTMxOWQzMDViMzNlODgwYmZkMC5iaW5kUG9wdXAocG9wdXBfODkwOWY3NGQ2ZTAxNGU5MzhkOGFjZjU2ZjExYTQzZjMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mODI1NmJiZjZkMjE0YTE3ODEwYWZlOWI5ZmJlN2IyMyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMyOTg3Mjk5OTk5OTk1LCAtMy42Mzg5OTYyOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTVhMTJjZDk2YjE2NDgyNDg4Njk5ODZkZDY2MGI0NDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTM3ZDdlMDRmODkxNGFjYzgzYTRjNjNjOWZiMjM2OGEgPSAkKGA8ZGl2IGlkPSJodG1sXzUzN2Q3ZTA0Zjg5MTRhY2M4M2E0YzYzYzlmYjIzNjhhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMyOTg3Mjk5OTk5OTk1LCAtMy42Mzg5OTYyOTk5OTk5OTk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTVhMTJjZDk2YjE2NDgyNDg4Njk5ODZkZDY2MGI0NDEuc2V0Q29udGVudChodG1sXzUzN2Q3ZTA0Zjg5MTRhY2M4M2E0YzYzYzlmYjIzNjhhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjgyNTZiYmY2ZDIxNGExNzgxMGFmZTliOWZiZTdiMjMuYmluZFBvcHVwKHBvcHVwX2E1YTEyY2Q5NmIxNjQ4MjQ4ODY5OTg2ZGQ2NjBiNDQxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfN2Y2ZWJlODYzODU2NGRlMThhYTg0M2FiY2ZjYzU1N2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDQ4NDEsIC0zLjY0NTUyMTldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NGFhZWZlOTA3MzU0MTBmYTVjNmUxMTQ2MWJmNGEyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNzc5NTA2OGQwNWQ0YWU0ODgwYTRlNGU3ZmU4NmFmOSA9ICQoYDxkaXYgaWQ9Imh0bWxfZDc3OTUwNjhkMDVkNGFlNDg4MGE0ZTRlN2ZlODZhZjkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA0ODQxLCAtMy42NDU1MjE5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOTRhYWVmZTkwNzM1NDEwZmE1YzZlMTE0NjFiZjRhMmQuc2V0Q29udGVudChodG1sX2Q3Nzk1MDY4ZDA1ZDRhZTQ4ODBhNGU0ZTdmZTg2YWY5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2Y2ZWJlODYzODU2NGRlMThhYTg0M2FiY2ZjYzU1N2IuYmluZFBvcHVwKHBvcHVwXzk0YWFlZmU5MDczNTQxMGZhNWM2ZTExNDYxYmY0YTJkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZWFmNGNkZDJhMzgxNDc3MGIzZDVhYjlkNTFhZGM4N2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzNTc2NjUsIC0zLjYxNjI2MjA5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xNTAxNDM0NTc0YWI0ZDYxOWYxNTY3MTFlOTE5NWE2MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mOTIxNmZjMmExMTc0ZTgwYmIzNjQzODQ5NjFjZjc5NyA9ICQoYDxkaXYgaWQ9Imh0bWxfZjkyMTZmYzJhMTE3NGU4MGJiMzY0Mzg0OTYxY2Y3OTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU3NjY1LCAtMy42MTYyNjIwOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTUwMTQzNDU3NGFiNGQ2MTlmMTU2NzExZTkxOTVhNjEuc2V0Q29udGVudChodG1sX2Y5MjE2ZmMyYTExNzRlODBiYjM2NDM4NDk2MWNmNzk3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZWFmNGNkZDJhMzgxNDc3MGIzZDVhYjlkNTFhZGM4N2IuYmluZFBvcHVwKHBvcHVwXzE1MDE0MzQ1NzRhYjRkNjE5ZjE1NjcxMWU5MTk1YTYxKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTk4ZDdmN2NkOWJjNDk2Mzk0YmM4ZWUxZDYyNWZiYjMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjAzNzc0NTYsIC02LjA3OTAyNDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NGI3ZDQzY2IxYjk0ZWM1OTM1NjhiOGU2MTRhOGIzYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZThjYzNmZDNmNDk0OTJiODIxYmFjNTAzNmI4N2NkNSA9ICQoYDxkaXYgaWQ9Imh0bWxfZGU4Y2MzZmQzZjQ5NDkyYjgyMWJhYzUwMzZiODdjZDUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4wMzc3NDU2LCAtNi4wNzkwMjQ1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODRiN2Q0M2NiMWI5NGVjNTkzNTY4YjhlNjE0YThiM2Muc2V0Q29udGVudChodG1sX2RlOGNjM2ZkM2Y0OTQ5MmI4MjFiYWM1MDM2Yjg3Y2Q1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTk4ZDdmN2NkOWJjNDk2Mzk0YmM4ZWUxZDYyNWZiYjMuYmluZFBvcHVwKHBvcHVwXzg0YjdkNDNjYjFiOTRlYzU5MzU2OGI4ZTYxNGE4YjNjKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYTk2MDU0Y2RlZWZkNDFmZjgxZGRkYWE0MjFmZDczYmYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMDc3ODAwMDAwMDAwNiwgLTMuNjMzMjIxMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q4MWM1MjhkNjg5MDRkZDI5OGE4YzkwZTYzNDI0YmExID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYxOTY3YzU5NDFjMjQ0ZTFhZGVkNmJkNGE3ZjkyN2Y0ID0gJChgPGRpdiBpZD0iaHRtbF82MTk2N2M1OTQxYzI0NGUxYWRlZDZiZDRhN2Y5MjdmNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMDc3ODAwMDAwMDAwNiwgLTMuNjMzMjIxMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q4MWM1MjhkNjg5MDRkZDI5OGE4YzkwZTYzNDI0YmExLnNldENvbnRlbnQoaHRtbF82MTk2N2M1OTQxYzI0NGUxYWRlZDZiZDRhN2Y5MjdmNCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E5NjA1NGNkZWVmZDQxZmY4MWRkZGFhNDIxZmQ3M2JmLmJpbmRQb3B1cChwb3B1cF9kODFjNTI4ZDY4OTA0ZGQyOThhOGM5MGU2MzQyNGJhMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRmMWQzYzgxZWM0MTQ0YjE5NTliYWI0YTc5ZjdhMGNmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY0ODU1LCAtMy42NDQyMzYxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTAwNzU4Nzg2NGMzNDU0NWI3ZTBlMmRiZmU4ZDRlNjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfODQzNmY2Y2QzNjYyNDIzYjg1OGE2Y2JkZWI5YjJlYjcgPSAkKGA8ZGl2IGlkPSJodG1sXzg0MzZmNmNkMzY2MjQyM2I4NThhNmNiZGViOWIyZWI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2NDg1NSwgLTMuNjQ0MjM2MTAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2UwMDc1ODc4NjRjMzQ1NDViN2UwZTJkYmZlOGQ0ZTYzLnNldENvbnRlbnQoaHRtbF84NDM2ZjZjZDM2NjI0MjNiODU4YTZjYmRlYjliMmViNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzRmMWQzYzgxZWM0MTQ0YjE5NTliYWI0YTc5ZjdhMGNmLmJpbmRQb3B1cChwb3B1cF9lMDA3NTg3ODY0YzM0NTQ1YjdlMGUyZGJmZThkNGU2MykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA1OWYxZGMxZjYwZTRlYWE5NDAxYWZhZDNlNDRhYjdlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY5MTcyOTk5OTk5OTQsIC0zLjY0NzA4MzVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hMTMwZjQ2ZDg5NTQ0NzgzOWYxODcyYTdlODJkYWY1YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NjJiODQ1OTAyZmQ0YWY2YmE5MGY2ZDAyZWU0ZmQxNyA9ICQoYDxkaXYgaWQ9Imh0bWxfNjYyYjg0NTkwMmZkNGFmNmJhOTBmNmQwMmVlNGZkMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY5MTcyOTk5OTk5OTQsIC0zLjY0NzA4MzVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMTMwZjQ2ZDg5NTQ0NzgzOWYxODcyYTdlODJkYWY1Yi5zZXRDb250ZW50KGh0bWxfNjYyYjg0NTkwMmZkNGFmNmJhOTBmNmQwMmVlNGZkMTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNTlmMWRjMWY2MGU0ZWFhOTQwMWFmYWQzZTQ0YWI3ZS5iaW5kUG9wdXAocG9wdXBfYTEzMGY0NmQ4OTU0NDc4MzlmMTg3MmE3ZTgyZGFmNWIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yZmUzYzNjNGMzZTI0OWMyYWNkNGNlNDI2NjhkZjI4YSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk5MjY0NiwgLTMuNjYyNTcwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5YzczNDc0OTI1ZTRhYTliZjExMzBmY2U4YmI4NmNkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM0YTc2YmU3OGNiYzRiNzQ5YjUyNDJlNGNiMjE0ZjFjID0gJChgPGRpdiBpZD0iaHRtbF8zNGE3NmJlNzhjYmM0Yjc0OWI1MjQyZTRjYjIxNGYxYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTI2NDYsIC0zLjY2MjU3MDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOWM3MzQ3NDkyNWU0YWE5YmYxMTMwZmNlOGJiODZjZC5zZXRDb250ZW50KGh0bWxfMzRhNzZiZTc4Y2JjNGI3NDliNTI0MmU0Y2IyMTRmMWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yZmUzYzNjNGMzZTI0OWMyYWNkNGNlNDI2NjhkZjI4YS5iaW5kUG9wdXAocG9wdXBfYTljNzM0NzQ5MjVlNGFhOWJmMTEzMGZjZThiYjg2Y2QpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xNjBlZmM1ODU1Nzg0MGY3YTI2NjFhYzA2YmQ0MGEzYiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NzM2MywgLTMuNjQyMzQzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWE1N2VjMDU3MmUzNGFlZTgzNTUzOWNlMjA1ZjlhY2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWJlMDUwZDg2OTg2NDg2NmI3Y2NlMDM0N2FjMTRkODYgPSAkKGA8ZGl2IGlkPSJodG1sXzFiZTA1MGQ4Njk4NjQ4NjZiN2NjZTAzNDdhYzE0ZDg2IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4NzM2MywgLTMuNjQyMzQzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZWE1N2VjMDU3MmUzNGFlZTgzNTUzOWNlMjA1ZjlhY2Euc2V0Q29udGVudChodG1sXzFiZTA1MGQ4Njk4NjQ4NjZiN2NjZTAzNDdhYzE0ZDg2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTYwZWZjNTg1NTc4NDBmN2EyNjYxYWMwNmJkNDBhM2IuYmluZFBvcHVwKHBvcHVwX2VhNTdlYzA1NzJlMzRhZWU4MzU1MzljZTIwNWY5YWNhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjgxNTJiMDRlOTIwNDNjNmIwNGJlMmVjZjE5MTMwMWIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzE5NzQsIC0zLjY0NjU3ODYwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xZjUyMmRkNDM5ODE0MGMwOGEwMDlhZGE2NmQwNDc4YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iYzYxMTY3OGZiM2M0YmEyYmI4MTFmN2U5MTQ2NDAzNiA9ICQoYDxkaXYgaWQ9Imh0bWxfYmM2MTE2NzhmYjNjNGJhMmJiODExZjdlOTE0NjQwMzYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjcxOTc0LCAtMy42NDY1Nzg2MDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMWY1MjJkZDQzOTgxNDBjMDhhMDA5YWRhNjZkMDQ3OGEuc2V0Q29udGVudChodG1sX2JjNjExNjc4ZmIzYzRiYTJiYjgxMWY3ZTkxNDY0MDM2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjgxNTJiMDRlOTIwNDNjNmIwNGJlMmVjZjE5MTMwMWIuYmluZFBvcHVwKHBvcHVwXzFmNTIyZGQ0Mzk4MTQwYzA4YTAwOWFkYTY2ZDA0NzhhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZThkYjQxMmRhYjU1NGUyMjhmMDJmZDAxNWY4ZTQ2MWUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjU0NTE1MzcsIC0zLjY0MzM0MjEwMDAwMDAwMDRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YjljMDgyNDBhYWI0ZDdjOGFlY2RlYzA1ZmZhMjQyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9iMTZlYjQwYzgxZDA0MDc0ODRmYWYwNzY0MWYzMTVlMyA9ICQoYDxkaXYgaWQ9Imh0bWxfYjE2ZWI0MGM4MWQwNDA3NDg0ZmFmMDc2NDFmMzE1ZTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41NDUxNTM3LCAtMy42NDMzNDIxMDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmI5YzA4MjQwYWFiNGQ3YzhhZWNkZWMwNWZmYTI0MmQuc2V0Q29udGVudChodG1sX2IxNmViNDBjODFkMDQwNzQ4NGZhZjA3NjQxZjMxNWUzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZThkYjQxMmRhYjU1NGUyMjhmMDJmZDAxNWY4ZTQ2MWUuYmluZFBvcHVwKHBvcHVwXzZiOWMwODI0MGFhYjRkN2M4YWVjZGVjMDVmZmEyNDJkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfN2I2MGZkM2Q1M2U1NDc5NWJiMmVjMTM4ZGI3OWU1ODkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzE5ODc5OTk5OTk5NCwgLTMuNjQ2NTgyNzAwMDAwMDAwNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg4ZGFhZTk0MDJlNDQ1MmY5NGYyODVkMTQ1ZDk4MjRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjOTFjNjMwMjlkOTRhY2Q5NmNmYTU4NmY4MjY0YTExID0gJChgPGRpdiBpZD0iaHRtbF8xYzkxYzYzMDI5ZDk0YWNkOTZjZmE1ODZmODI2NGExMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzE5ODc5OTk5OTk5NCwgLTMuNjQ2NTgyNzAwMDAwMDAwNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg4ZGFhZTk0MDJlNDQ1MmY5NGYyODVkMTQ1ZDk4MjRlLnNldENvbnRlbnQoaHRtbF8xYzkxYzYzMDI5ZDk0YWNkOTZjZmE1ODZmODI2NGExMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzdiNjBmZDNkNTNlNTQ3OTViYjJlYzEzOGRiNzllNTg5LmJpbmRQb3B1cChwb3B1cF84OGRhYWU5NDAyZTQ0NTJmOTRmMjg1ZDE0NWQ5ODI0ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI5MTc4NGM0MDRiMjQwYjhiNTMwNGQ1YTNmMmZlMzFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NzQyOTk5OTk5OTQsIC0zLjY0NDgwMjldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kZWI1NjM0Y2FkZWM0NTY2YjI3Y2NhYjJhMzE3YWZjOCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNzM1MmY5ZThmN2E0MGQ5OWY1ZjQzZTc2YmRiODg5NSA9ICQoYDxkaXYgaWQ9Imh0bWxfMDczNTJmOWU4ZjdhNDBkOTlmNWY0M2U3NmJkYjg4OTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc0NzQyOTk5OTk5OTQsIC0zLjY0NDgwMjldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kZWI1NjM0Y2FkZWM0NTY2YjI3Y2NhYjJhMzE3YWZjOC5zZXRDb250ZW50KGh0bWxfMDczNTJmOWU4ZjdhNDBkOTlmNWY0M2U3NmJkYjg4OTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yOTE3ODRjNDA0YjI0MGI4YjUzMDRkNWEzZjJmZTMxZC5iaW5kUG9wdXAocG9wdXBfZGViNTYzNGNhZGVjNDU2NmIyN2NjYWIyYTMxN2FmYzgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yYjg0NzA5MzcxMWI0YjQwYmY3ZjZkZGIyYTYzMzBhMCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMjUzNSwgLTMuNzkzODEzNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FjMTRlNTEwNWM0YTRkMDZiZTdkMmI1OGY1YTkyMWI1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzNkZmRlYmEwMWE0YzQ2Mjc5NjVkNzAzMWNiNTQxYmMwID0gJChgPGRpdiBpZD0iaHRtbF8zZGZkZWJhMDFhNGM0NjI3OTY1ZDcwMzFjYjU0MWJjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI1MzUsIC0zLjc5MzgxMzVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hYzE0ZTUxMDVjNGE0ZDA2YmU3ZDJiNThmNWE5MjFiNS5zZXRDb250ZW50KGh0bWxfM2RmZGViYTAxYTRjNDYyNzk2NWQ3MDMxY2I1NDFiYzApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yYjg0NzA5MzcxMWI0YjQwYmY3ZjZkZGIyYTYzMzBhMC5iaW5kUG9wdXAocG9wdXBfYWMxNGU1MTA1YzRhNGQwNmJlN2QyYjU4ZjVhOTIxYjUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mYTc1MTRlM2UzOTc0Y2NiOTEwYmYzOGQ1YWEzNzNiMyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk5MjU2NSwgLTMuNjYyNTg5Mjk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzMDc4MTExNzY0OTQzNWFiN2JiNjA5Y2ZjMDM4ZGRlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VkOGQzMDI2YTYxODQ0NzQ4YWRmNTdiNmY5MGRlMTA1ID0gJChgPGRpdiBpZD0iaHRtbF9lZDhkMzAyNmE2MTg0NDc0OGFkZjU3YjZmOTBkZTEwNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTI1NjUsIC0zLjY2MjU4OTI5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jMzA3ODExMTc2NDk0MzVhYjdiYjYwOWNmYzAzOGRkZS5zZXRDb250ZW50KGh0bWxfZWQ4ZDMwMjZhNjE4NDQ3NDhhZGY1N2I2ZjkwZGUxMDUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mYTc1MTRlM2UzOTc0Y2NiOTEwYmYzOGQ1YWEzNzNiMy5iaW5kUG9wdXAocG9wdXBfYzMwNzgxMTE3NjQ5NDM1YWI3YmI2MDljZmMwMzhkZGUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mMjAxNTc5ODcxNWY0NWZkYmVjNTcxZWVmZjdlODdkMCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3MjAwNiwgLTMuNjQ2NTk3Nzk5OTk5OTk5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0YTU2YzBjZjY0NTQ3OWI4MjFlY2VhOWJhMmE4ZDIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzYyNTI1M2E5OThjMjRjZWViYTkzODEyYjc0YzM2MDI2ID0gJChgPGRpdiBpZD0iaHRtbF82MjUyNTNhOTk4YzI0Y2VlYmE5MzgxMmI3NGMzNjAyNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzIwMDYsIC0zLjY0NjU5Nzc5OTk5OTk5OTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jNGE1NmMwY2Y2NDU0NzliODIxZWNlYTliYTJhOGQyMC5zZXRDb250ZW50KGh0bWxfNjI1MjUzYTk5OGMyNGNlZWJhOTM4MTJiNzRjMzYwMjYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9mMjAxNTc5ODcxNWY0NWZkYmVjNTcxZWVmZjdlODdkMC5iaW5kUG9wdXAocG9wdXBfYzRhNTZjMGNmNjQ1NDc5YjgyMWVjZWE5YmEyYThkMjApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yN2ZhNmQ2MjQyMjU0YzM1YjYzMzY1ZGZiZDdiNThlYiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzkyMTAyNywgLTMuNzAxMDIyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzE1Y2ZiOTliZDY5NGY0MDgyZWM5ZTA3MzM1OGRmNTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTE4ODdjNjcyYjZlNDFmYTk4MGJmZGZjNWE2YjRlMWMgPSAkKGA8ZGl2IGlkPSJodG1sXzUxODg3YzY3MmI2ZTQxZmE5ODBiZmRmYzVhNmI0ZTFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzkyMTAyNywgLTMuNzAxMDIyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzE1Y2ZiOTliZDY5NGY0MDgyZWM5ZTA3MzM1OGRmNTkuc2V0Q29udGVudChodG1sXzUxODg3YzY3MmI2ZTQxZmE5ODBiZmRmYzVhNmI0ZTFjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjdmYTZkNjI0MjI1NGMzNWI2MzM2NWRmYmQ3YjU4ZWIuYmluZFBvcHVwKHBvcHVwXzMxNWNmYjk5YmQ2OTRmNDA4MmVjOWUwNzMzNThkZjU5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYTRkYTIwYzZlNTU5NDk0MTg4ZTQxYThjY2MyMmFmNzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNzQ3NiwgLTMuNjQ2MDcyNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmMDEwNDI3NmYyZjRmYWI4NjI5NDI1MzQxMTNmZjI5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQ2NDU4M2ZiMzY5MjQwMjdhZTFkODYzYjc0NzE1OTk1ID0gJChgPGRpdiBpZD0iaHRtbF80NjQ1ODNmYjM2OTI0MDI3YWUxZDg2M2I3NDcxNTk5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ3NiwgLTMuNjQ2MDcyNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NmMDEwNDI3NmYyZjRmYWI4NjI5NDI1MzQxMTNmZjI5LnNldENvbnRlbnQoaHRtbF80NjQ1ODNmYjM2OTI0MDI3YWUxZDg2M2I3NDcxNTk5NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2E0ZGEyMGM2ZTU1OTQ5NDE4OGU0MWE4Y2NjMjJhZjc5LmJpbmRQb3B1cChwb3B1cF9jZjAxMDQyNzZmMmY0ZmFiODYyOTQyNTM0MTEzZmYyOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI4NjQ5Njc5OWU2ZjQ1OGM4MWRjNWNkYzdlMjQ4ZjRmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzU3MjA4OTk5OTk5OTQsIC0zLjYxNjQ3NzIwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MGZkNGRmNjAwOTc0YTEyOTM5ZDU2YjBkNzdhMmZlNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Y2ViMThjOGRlNzU0ZmFhOWQ3NTE1YTNiYjdjOTVjNSA9ICQoYDxkaXYgaWQ9Imh0bWxfNmNlYjE4YzhkZTc1NGZhYTlkNzUxNWEzYmI3Yzk1YzUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU3MjA4OTk5OTk5OTQsIC0zLjYxNjQ3NzIwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84MGZkNGRmNjAwOTc0YTEyOTM5ZDU2YjBkNzdhMmZlNi5zZXRDb250ZW50KGh0bWxfNmNlYjE4YzhkZTc1NGZhYTlkNzUxNWEzYmI3Yzk1YzUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yODY0OTY3OTllNmY0NThjODFkYzVjZGM3ZTI0OGY0Zi5iaW5kUG9wdXAocG9wdXBfODBmZDRkZjYwMDk3NGExMjkzOWQ1NmIwZDc3YTJmZTYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82N2ZkMjhjZjRjZDA0OWI2OTEzZDc5Zjc5MTg1NTU3ZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE1MTA0NywgLTMuNjE1Mzg5NzAwMDAwMDAwNl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzExOGZiMWY3MWExYzQ0Y2RiZTNkNzM4NzEzMjA5OWE5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2EzNjMwY2IwY2ZlMjQzZTdiMDVmYWI3OGQ1MThjZTZlID0gJChgPGRpdiBpZD0iaHRtbF9hMzYzMGNiMGNmZTI0M2U3YjA1ZmFiNzhkNTE4Y2U2ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTEwNDcsIC0zLjYxNTM4OTcwMDAwMDAwMDZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMThmYjFmNzFhMWM0NGNkYmUzZDczODcxMzIwOTlhOS5zZXRDb250ZW50KGh0bWxfYTM2MzBjYjBjZmUyNDNlN2IwNWZhYjc4ZDUxOGNlNmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82N2ZkMjhjZjRjZDA0OWI2OTEzZDc5Zjc5MTg1NTU3ZC5iaW5kUG9wdXAocG9wdXBfMTE4ZmIxZjcxYTFjNDRjZGJlM2Q3Mzg3MTMyMDk5YTkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9lZWIwZDQxZGI4ODI0N2FiYTc2ZDI4YjlhODAyZWMzNSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NTAzMSwgLTMuNjQzMjY5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjODBiNTdiZDc3NDQ2ZTdiODk2YzAxYTMwOThmZGVlID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVkYzE2ZTA4YzRjMjRiZjY4NmNiYzJhZjYwM2U5MDQxID0gJChgPGRpdiBpZD0iaHRtbF81ZGMxNmUwOGM0YzI0YmY2ODZjYmMyYWY2MDNlOTA0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUwMzEsIC0zLjY0MzI2OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8wYzgwYjU3YmQ3NzQ0NmU3Yjg5NmMwMWEzMDk4ZmRlZS5zZXRDb250ZW50KGh0bWxfNWRjMTZlMDhjNGMyNGJmNjg2Y2JjMmFmNjAzZTkwNDEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lZWIwZDQxZGI4ODI0N2FiYTc2ZDI4YjlhODAyZWMzNS5iaW5kUG9wdXAocG9wdXBfMGM4MGI1N2JkNzc0NDZlN2I4OTZjMDFhMzA5OGZkZWUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl84YmY3ZDhhZmNiMjE0YjA3OWVjN2E0MDhhMGMxYzFmOSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3MDgxNCwgLTMuNjQ2NDQ4MDAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzk0ZDdmMjA3YWZmNTRjZGFhNmExMTQ3M2I4MjM5NTk3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAyYTNlNDlkYmFkNjQwZWVhMmE3ODRjYWJiZjM4NjM3ID0gJChgPGRpdiBpZD0iaHRtbF8wMmEzZTQ5ZGJhZDY0MGVlYTJhNzg0Y2FiYmYzODYzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzA4MTQsIC0zLjY0NjQ0ODAwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NGQ3ZjIwN2FmZjU0Y2RhYTZhMTE0NzNiODIzOTU5Ny5zZXRDb250ZW50KGh0bWxfMDJhM2U0OWRiYWQ2NDBlZWEyYTc4NGNhYmJmMzg2MzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84YmY3ZDhhZmNiMjE0YjA3OWVjN2E0MDhhMGMxYzFmOS5iaW5kUG9wdXAocG9wdXBfOTRkN2YyMDdhZmY1NGNkYWE2YTExNDczYjgyMzk1OTcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iMDdkODkwNTk2YzU0YWU2YWRiMDRmYmFjM2M0YWZhNiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIyMDI0NSwgLTMuODA0NjExNzk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2E5MDljYmJjYWRjNjQwNjdhNTgyMDNiNWFkZWYxNDIyID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmMzhhN2IwNDE3MzRmODhiNTJkODVmNDlmYTc3YzAzID0gJChgPGRpdiBpZD0iaHRtbF9lZjM4YTdiMDQxNzM0Zjg4YjUyZDg1ZjQ5ZmE3N2MwMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMjAyNDUsIC0zLjgwNDYxMTc5OTk5OTk5OTVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hOTA5Y2JiY2FkYzY0MDY3YTU4MjAzYjVhZGVmMTQyMi5zZXRDb250ZW50KGh0bWxfZWYzOGE3YjA0MTczNGY4OGI1MmQ4NWY0OWZhNzdjMDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iMDdkODkwNTk2YzU0YWU2YWRiMDRmYmFjM2M0YWZhNi5iaW5kUG9wdXAocG9wdXBfYTkwOWNiYmNhZGM2NDA2N2E1ODIwM2I1YWRlZjE0MjIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9hNDA3NzI0Y2MzMzM0ZGUwODliYThmZDQwZWYxMjE5OSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI1Mzg4Nzk5OTk5OTk1LCAtMy42NDQ3MDY1MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNjNhNzFiZWJjZGIwNDQ5MTg1OGUwNzg5NzgwNmU1NjQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYWY2YWVhYWY1NDM5NGYzMjlkYzZlMzliODcyODYwZGEgPSAkKGA8ZGl2IGlkPSJodG1sX2FmNmFlYWFmNTQzOTRmMzI5ZGM2ZTM5Yjg3Mjg2MGRhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI1Mzg4Nzk5OTk5OTk1LCAtMy42NDQ3MDY1MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjNhNzFiZWJjZGIwNDQ5MTg1OGUwNzg5NzgwNmU1NjQuc2V0Q29udGVudChodG1sX2FmNmFlYWFmNTQzOTRmMzI5ZGM2ZTM5Yjg3Mjg2MGRhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTQwNzcyNGNjMzMzNGRlMDg5YmE4ZmQ0MGVmMTIxOTkuYmluZFBvcHVwKHBvcHVwXzYzYTcxYmViY2RiMDQ0OTE4NThlMDc4OTc4MDZlNTY0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzgzN2UyMzNmNGQ1NDU4NzlkY2M3ZDBiOGMzZWIyODkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjkyNjksIC0zLjY0NzA2NDhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lMTFiY2I4NWE1MTM0ZWNkOWVmOWU5ZjI0Zjg3MTE0MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jNjRkMzVjOTUxYzU0MDhjYTA3ZmZiNDk0ZTk1NWZmMSA9ICQoYDxkaXYgaWQ9Imh0bWxfYzY0ZDM1Yzk1MWM1NDA4Y2EwN2ZmYjQ5NGU5NTVmZjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY5MjY5LCAtMy42NDcwNjQ4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZTExYmNiODVhNTEzNGVjZDllZjllOWYyNGY4NzExNDAuc2V0Q29udGVudChodG1sX2M2NGQzNWM5NTFjNTQwOGNhMDdmZmI0OTRlOTU1ZmYxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzgzN2UyMzNmNGQ1NDU4NzlkY2M3ZDBiOGMzZWIyODkuYmluZFBvcHVwKHBvcHVwX2UxMWJjYjg1YTUxMzRlY2Q5ZWY5ZTlmMjRmODcxMTQwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfN2Y2ZmI5YTUzOTNkNDI4MmI2YTYwOWI3MmViYWYzMmIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ0NzMzNDMsIC0zLjY2MDY2NDcwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZGY4Nzk1YjYwMzA0MWRjYTAwZThjMTRkZDdlMWEyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9mMWRlMDY0MDI2MWE0MmUxYTQzOGU1ZDNjZjAxMGI1NiA9ICQoYDxkaXYgaWQ9Imh0bWxfZjFkZTA2NDAyNjFhNDJlMWE0MzhlNWQzY2YwMTBiNTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NDczMzQzLCAtMy42NjA2NjQ3MDAwMDAwMDAzXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmRmODc5NWI2MDMwNDFkY2EwMGU4YzE0ZGQ3ZTFhMjYuc2V0Q29udGVudChodG1sX2YxZGUwNjQwMjYxYTQyZTFhNDM4ZTVkM2NmMDEwYjU2KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2Y2ZmI5YTUzOTNkNDI4MmI2YTYwOWI3MmViYWYzMmIuYmluZFBvcHVwKHBvcHVwXzZkZjg3OTViNjAzMDQxZGNhMDBlOGMxNGRkN2UxYTI2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNjgzOTgyMGJlYmQyNGZhYWIzNjk3YmZiNDc4MzEwOTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjk0Nzc5OTk5OTk5NSwgLTMuNjQ0NjAxMjAwMDAwMDAwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI0M2IwNmM5OWUxYjQzODZiNDdhZDFjM2QyZDkwMWUxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VmODVhNjBkZWZlMDQxMThhZTMwYjBmYTc5YTgwZTMxID0gJChgPGRpdiBpZD0iaHRtbF9lZjg1YTYwZGVmZTA0MTE4YWUzMGIwZmE3OWE4MGUzMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjk0Nzc5OTk5OTk5NSwgLTMuNjQ0NjAxMjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI0M2IwNmM5OWUxYjQzODZiNDdhZDFjM2QyZDkwMWUxLnNldENvbnRlbnQoaHRtbF9lZjg1YTYwZGVmZTA0MTE4YWUzMGIwZmE3OWE4MGUzMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY4Mzk4MjBiZWJkMjRmYWFiMzY5N2JmYjQ3ODMxMDkyLmJpbmRQb3B1cChwb3B1cF8yNDNiMDZjOTllMWI0Mzg2YjQ3YWQxYzNkMmQ5MDFlMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2UxNGQ1OGY1OTExMjRmNDlhYmNhYTgzMzk4NWNlNjAyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTk5MzU3LCAtMy42NjQ0Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2FhMDJjOGQwYjExMzQ5NzM4YTA4YzYxNTJmMTY4MGJkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzM3NTBiY2NhOGJmZTRkODdhMWJlYzY4NTkxNTFlZTgyID0gJChgPGRpdiBpZD0iaHRtbF8zNzUwYmNjYThiZmU0ZDg3YTFiZWM2ODU5MTUxZWU4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTkzNTcsIC0zLjY2NDQ2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYWEwMmM4ZDBiMTEzNDk3MzhhMDhjNjE1MmYxNjgwYmQuc2V0Q29udGVudChodG1sXzM3NTBiY2NhOGJmZTRkODdhMWJlYzY4NTkxNTFlZTgyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTE0ZDU4ZjU5MTEyNGY0OWFiY2FhODMzOTg1Y2U2MDIuYmluZFBvcHVwKHBvcHVwX2FhMDJjOGQwYjExMzQ5NzM4YTA4YzYxNTJmMTY4MGJkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTZiZWJjNTJjNzQxNGI0YTgwZTY4YTg5MWVhZjRlODUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUxNTAwMDAwMDAwNiwgLTMuNjQzMjA1Nzk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3OGJmYmZlN2NmNjQwMDM4YWY5ZGQ4MjhmNGZhOTk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBlZTU0NjU2YTY4OTRiOGY5YTk3ODQzZGYwMmI2MGJjID0gJChgPGRpdiBpZD0iaHRtbF8wZWU1NDY1NmE2ODk0YjhmOWE5Nzg0M2RmMDJiNjBiYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxNTAwMDAwMDAwNiwgLTMuNjQzMjA1Nzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3OGJmYmZlN2NmNjQwMDM4YWY5ZGQ4MjhmNGZhOTk2LnNldENvbnRlbnQoaHRtbF8wZWU1NDY1NmE2ODk0YjhmOWE5Nzg0M2RmMDJiNjBiYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U2YmViYzUyYzc0MTRiNGE4MGU2OGE4OTFlYWY0ZTg1LmJpbmRQb3B1cChwb3B1cF9mNzhiZmJmZTdjZjY0MDAzOGFmOWRkODI4ZjRmYTk5NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2MyNzY1ODgyOTdiMTRkMjY5MTM5NTA5ZWYyYmRmYTFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjEzNDAyLCAtMy42Mjg1OTM0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmVhMTI2ZjIyZGEwNGU2YzlhNzFjMDQ3M2ExNDVlZTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZTFkNDQ3NWI2OTM2NDhlOTljYTJhMmExMmU2MGY5ZjUgPSAkKGA8ZGl2IGlkPSJodG1sX2UxZDQ0NzViNjkzNjQ4ZTk5Y2EyYTJhMTJlNjBmOWY1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxMzQwMiwgLTMuNjI4NTkzNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJlYTEyNmYyMmRhMDRlNmM5YTcxYzA0NzNhMTQ1ZWUzLnNldENvbnRlbnQoaHRtbF9lMWQ0NDc1YjY5MzY0OGU5OWNhMmEyYTEyZTYwZjlmNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MyNzY1ODgyOTdiMTRkMjY5MTM5NTA5ZWYyYmRmYTFhLmJpbmRQb3B1cChwb3B1cF8yZWExMjZmMjJkYTA0ZTZjOWE3MWMwNDczYTE0NWVlMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I0MTdkYWFkNDdkOTQ2NTZhMDIzZTFmYjdjOGNiYTFhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA5NTIsIC0zLjY0MTIyOTJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xYmRhMjAwODdkYTA0YjFmOGNjMTBmOWVlMTlhYTAyMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzdhNmM5OWZlYTk0MTkzYmNhMDRiZTc4ZmFlZTRhNiA9ICQoYDxkaXYgaWQ9Imh0bWxfYWM3YTZjOTlmZWE5NDE5M2JjYTA0YmU3OGZhZWU0YTYiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzA5NTIsIC0zLjY0MTIyOTJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xYmRhMjAwODdkYTA0YjFmOGNjMTBmOWVlMTlhYTAyMC5zZXRDb250ZW50KGh0bWxfYWM3YTZjOTlmZWE5NDE5M2JjYTA0YmU3OGZhZWU0YTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iNDE3ZGFhZDQ3ZDk0NjU2YTAyM2UxZmI3YzhjYmExYS5iaW5kUG9wdXAocG9wdXBfMWJkYTIwMDg3ZGEwNGIxZjhjYzEwZjllZTE5YWEwMjApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9hMGUxMjM5ZWVkMTA0YmViOTc4M2NjZGQ5NDVhNzc2MyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzg4NTcwNiwgLTMuNjA4ODI2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmQ0OGFiNDNjZGIzNDg2ZGI2NTVlYmZjYTNlNTVlMGYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGIyNTM5YjEyOWQ5NDBlZWJiMThjYjFhOGMzMWM2YjcgPSAkKGA8ZGl2IGlkPSJodG1sXzBiMjUzOWIxMjlkOTQwZWViYjE4Y2IxYThjMzFjNmI3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzg4NTcwNiwgLTMuNjA4ODI2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMmQ0OGFiNDNjZGIzNDg2ZGI2NTVlYmZjYTNlNTVlMGYuc2V0Q29udGVudChodG1sXzBiMjUzOWIxMjlkOTQwZWViYjE4Y2IxYThjMzFjNmI3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYTBlMTIzOWVlZDEwNGJlYjk3ODNjY2RkOTQ1YTc3NjMuYmluZFBvcHVwKHBvcHVwXzJkNDhhYjQzY2RiMzQ4NmRiNjU1ZWJmY2EzZTU1ZTBmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZTU1OWFjODljYjQ2NDU3NWEzZmQ2MjJlMjlhNjZjOTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjI5Nzk0ODYwMDAwMDAwNSwgLTMuOTUxNTA5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3OTU4OGY4ZjNiMTQ5ZTRhNzg3OTljMTNkOWRiOWZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Y4ZDU4MGQ5NjUwNTQ0MDBhYWIwYzhlNmNiMmU1NzgyID0gJChgPGRpdiBpZD0iaHRtbF9mOGQ1ODBkOTY1MDU0NDAwYWFiMGM4ZTZjYjJlNTc4MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjI5Nzk0ODYwMDAwMDAwNSwgLTMuOTUxNTA5NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3OTU4OGY4ZjNiMTQ5ZTRhNzg3OTljMTNkOWRiOWZiLnNldENvbnRlbnQoaHRtbF9mOGQ1ODBkOTY1MDU0NDAwYWFiMGM4ZTZjYjJlNTc4Mik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U1NTlhYzg5Y2I0NjQ1NzVhM2ZkNjIyZTI5YTY2Yzk3LmJpbmRQb3B1cChwb3B1cF9kNzk1ODhmOGYzYjE0OWU0YTc4Nzk5YzEzZDlkYjlmYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NmNTJkZGI1ODc4OTQ5NjI5MzljOTg5OGJhYzZmOGFkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjU2ODE4OTk5OTk5OTQsIC0zLjc5ODAzODhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZmEzMmI4OGI0Njk0ZDI4YWJiNDA2NzJhNTM1M2FiZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NzMzMDI3NTNjNTk0YWUwOGMwMDg2MjFlN2ZmNGM0MiA9ICQoYDxkaXYgaWQ9Imh0bWxfOTczMzAyNzUzYzU5NGFlMDhjMDA4NjIxZTdmZjRjNDIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjU2ODE4OTk5OTk5OTQsIC0zLjc5ODAzODhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZmEzMmI4OGI0Njk0ZDI4YWJiNDA2NzJhNTM1M2FiZS5zZXRDb250ZW50KGh0bWxfOTczMzAyNzUzYzU5NGFlMDhjMDA4NjIxZTdmZjRjNDIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZjUyZGRiNTg3ODk0OTYyOTM5Yzk4OThiYWM2ZjhhZC5iaW5kUG9wdXAocG9wdXBfNmZhMzJiODhiNDY5NGQyOGFiYjQwNjcyYTUzNTNhYmUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81ODQ5NTI1NGMxZGI0YTRhYTBiNDBhNjIxYmM4Mjg4OCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4MTA1Mjk5OTk5OTksIC0zLjY0MzQzNTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NDVjZWNlMTBjMjg0Y2EwYjJlZGU2NTNhODhkNTVkMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85NzVjMjNkOGE5YWQ0ODU5YTcwZDI3Zjc4Y2JkMThjOSA9ICQoYDxkaXYgaWQ9Imh0bWxfOTc1YzIzZDhhOWFkNDg1OWE3MGQyN2Y3OGNiZDE4YzkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjgxMDUyOTk5OTk5OSwgLTMuNjQzNDM1Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0NWNlY2UxMGMyODRjYTBiMmVkZTY1M2E4OGQ1NWQwLnNldENvbnRlbnQoaHRtbF85NzVjMjNkOGE5YWQ0ODU5YTcwZDI3Zjc4Y2JkMThjOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU4NDk1MjU0YzFkYjRhNGFhMGI0MGE2MjFiYzgyODg4LmJpbmRQb3B1cChwb3B1cF85NDVjZWNlMTBjMjg0Y2EwYjJlZGU2NTNhODhkNTVkMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VmNDAyOWQ4OTc4MjRhMzlhOTc0OTRlNDFkMGM0ZmU1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjE5OTU5LCAtMy44MDM2MDA4OTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjEwMjI2YTY4Y2M0NDJhMGIwNDlmYjdiMzM5Y2UxMDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzUyZjc0OTU5NzZmNDQxOGJkMDQ0ZGNhNTRmZmRmOGQgPSAkKGA8ZGl2IGlkPSJodG1sX2M1MmY3NDk1OTc2ZjQ0MThiZDA0NGRjYTU0ZmZkZjhkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxOTk1OSwgLTMuODAzNjAwODk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2YxMDIyNmE2OGNjNDQyYTBiMDQ5ZmI3YjMzOWNlMTAzLnNldENvbnRlbnQoaHRtbF9jNTJmNzQ5NTk3NmY0NDE4YmQwNDRkY2E1NGZmZGY4ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VmNDAyOWQ4OTc4MjRhMzlhOTc0OTRlNDFkMGM0ZmU1LmJpbmRQb3B1cChwb3B1cF9mMTAyMjZhNjhjYzQ0MmEwYjA0OWZiN2IzMzljZTEwMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2I2YzZmZTU0NDg3MTQwNDY5MTdkZjY1ZDcxYjBlMTFlID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTQ0OTI2LCAtMy42NjUxNTM0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMjBhZTVkOGZlYjQ3NDFlOWFkZGIxZjkyNTU0Y2E2MDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzUzY2FmNDJjNjhhNDhjNmI2ZWY4ZjcxNGYyOWM1YmUgPSAkKGA8ZGl2IGlkPSJodG1sXzM1M2NhZjQyYzY4YTQ4YzZiNmVmOGY3MTRmMjljNWJlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE0NDkyNiwgLTMuNjY1MTUzNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzIwYWU1ZDhmZWI0NzQxZTlhZGRiMWY5MjU1NGNhNjA4LnNldENvbnRlbnQoaHRtbF8zNTNjYWY0MmM2OGE0OGM2YjZlZjhmNzE0ZjI5YzViZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2I2YzZmZTU0NDg3MTQwNDY5MTdkZjY1ZDcxYjBlMTFlLmJpbmRQb3B1cChwb3B1cF8yMGFlNWQ4ZmViNDc0MWU5YWRkYjFmOTI1NTRjYTYwOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2M3MDEwYTczOGU0OTRlNzRiYmM1MWY1ZDRkMmUxYzM0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFszOS45NjE4NjkxLCAtNC44MjMyNTA0OTk5OTk5OTldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMjMxOTRiZDYwY2Y0NmU3OWY3YjA3MDM1OTEyOGQ1MSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yNDBjYjM5OWU0Zjc0OWVmOGU1MmZmNjFlNGVkNzA2ZSA9ICQoYDxkaXYgaWQ9Imh0bWxfMjQwY2IzOTllNGY3NDllZjhlNTJmZjYxZTRlZDcwNmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlszOS45NjE4NjkxLCAtNC44MjMyNTA0OTk5OTk5OTldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8xMjMxOTRiZDYwY2Y0NmU3OWY3YjA3MDM1OTEyOGQ1MS5zZXRDb250ZW50KGh0bWxfMjQwY2IzOTllNGY3NDllZjhlNTJmZjYxZTRlZDcwNmUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jNzAxMGE3MzhlNDk0ZTc0YmJjNTFmNWQ0ZDJlMWMzNC5iaW5kUG9wdXAocG9wdXBfMTIzMTk0YmQ2MGNmNDZlNzlmN2IwNzAzNTkxMjhkNTEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zODZhZWRjZTE3NjU0YzNjOWZjNGI2ZDA0ZTlhNGU3ZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI3NDU4NiwgLTMuNjQ2MTExNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQ5OTU3N2RkZjIzZDQyMzhiNWJjNGVmNGU5MDUzN2M5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhhMWM4YjYxMzg2MDQ0NDk4ZjY4YmRiNDkwZmZjMjg1ID0gJChgPGRpdiBpZD0iaHRtbF84YTFjOGI2MTM4NjA0NDQ5OGY2OGJkYjQ5MGZmYzI4NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzQ1ODYsIC0zLjY0NjExMTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80OTk1NzdkZGYyM2Q0MjM4YjViYzRlZjRlOTA1MzdjOS5zZXRDb250ZW50KGh0bWxfOGExYzhiNjEzODYwNDQ0OThmNjhiZGI0OTBmZmMyODUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zODZhZWRjZTE3NjU0YzNjOWZjNGI2ZDA0ZTlhNGU3ZC5iaW5kUG9wdXAocG9wdXBfNDk5NTc3ZGRmMjNkNDIzOGI1YmM0ZWY0ZTkwNTM3YzkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl82ZTlkMjBiZTEyODM0ZGRmYmRjNTNjOWIwMWUxNDg0YyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk0MjYwNiwgLTMuNzAxMDgxNTk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzRiN2QzNGYyYjBlZDQ0Mjk5NDg2Zjg5NWUzOTUxYWM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzNGRlNDk5ZDIxYzQyNGY4MDI3YjM4Yjg4OGIxOGM2ID0gJChgPGRpdiBpZD0iaHRtbF8wMzRkZTQ5OWQyMWM0MjRmODAyN2IzOGI4ODhiMThjNiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NDI2MDYsIC0zLjcwMTA4MTU5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80YjdkMzRmMmIwZWQ0NDI5OTQ4NmY4OTVlMzk1MWFjNy5zZXRDb250ZW50KGh0bWxfMDM0ZGU0OTlkMjFjNDI0ZjgwMjdiMzhiODg4YjE4YzYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl82ZTlkMjBiZTEyODM0ZGRmYmRjNTNjOWIwMWUxNDg0Yy5iaW5kUG9wdXAocG9wdXBfNGI3ZDM0ZjJiMGVkNDQyOTk0ODZmODk1ZTM5NTFhYzcpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iZTQxOTgxZDBlMWQ0OWY2YTIxNjFkMmEyYjQ1YmY4NCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTM3MTg1LCAtMy42MTgwMjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xN2FiNDFjMmU3YTI0YjdhYTVmZDAzNGY2NjhhM2Q0YiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZWVhMmFkNmU1YWU0ZWE0OGQ0MDFjZDY2MTc4ZTZhYyA9ICQoYDxkaXYgaWQ9Imh0bWxfOWVlYTJhZDZlNWFlNGVhNDhkNDAxY2Q2NjE3OGU2YWMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzcxODUsIC0zLjYxODAyNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzE3YWI0MWMyZTdhMjRiN2FhNWZkMDM0ZjY2OGEzZDRiLnNldENvbnRlbnQoaHRtbF85ZWVhMmFkNmU1YWU0ZWE0OGQ0MDFjZDY2MTc4ZTZhYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JlNDE5ODFkMGUxZDQ5ZjZhMjE2MWQyYTJiNDViZjg0LmJpbmRQb3B1cChwb3B1cF8xN2FiNDFjMmU3YTI0YjdhYTVmZDAzNGY2NjhhM2Q0YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzI0NzMwZGI1MzBlNDQ2M2RiMzg5ODE0ZTNmNDIwMTU5ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTI5NzY3OTk5OTk5OTYsIC0zLjYyNDQzNjZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9lM2Q1ZjQyNzliY2E0YWYyODQzM2E5ZTlkZDAyNjJkYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZmFhZTcxZGZkNDM0OTg4OTg0ODUyODI3MDA4YWY4ZCA9ICQoYDxkaXYgaWQ9Imh0bWxfNmZhYWU3MWRmZDQzNDk4ODk4NDg1MjgyNzAwOGFmOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTI5NzY3OTk5OTk5OTYsIC0zLjYyNDQzNjZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lM2Q1ZjQyNzliY2E0YWYyODQzM2E5ZTlkZDAyNjJkYS5zZXRDb250ZW50KGh0bWxfNmZhYWU3MWRmZDQzNDk4ODk4NDg1MjgyNzAwOGFmOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8yNDczMGRiNTMwZTQ0NjNkYjM4OTgxNGUzZjQyMDE1OS5iaW5kUG9wdXAocG9wdXBfZTNkNWY0Mjc5YmNhNGFmMjg0MzNhOWU5ZGQwMjYyZGEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83MjEzZjRiODE4ZWY0NGVlOGIxZTMzOGEwZTY4N2QxZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIyNDY5Nzk5OTk5OTk1LCAtMy44MDQwNzk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTI3NDMwMDIwYzQ4NDAxZGJkNzg0NjZmNGVjNzJlNDggPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZGE4ZDU2NjI3MTJhNGFkNzk0NzVhNTk4ZDcwZTBhMzAgPSAkKGA8ZGl2IGlkPSJodG1sX2RhOGQ1NjYyNzEyYTRhZDc5NDc1YTU5OGQ3MGUwYTMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIyNDY5Nzk5OTk5OTk1LCAtMy44MDQwNzk1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTI3NDMwMDIwYzQ4NDAxZGJkNzg0NjZmNGVjNzJlNDguc2V0Q29udGVudChodG1sX2RhOGQ1NjYyNzEyYTRhZDc5NDc1YTU5OGQ3MGUwYTMwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzIxM2Y0YjgxOGVmNDRlZThiMWUzMzhhMGU2ODdkMWUuYmluZFBvcHVwKHBvcHVwX2EyNzQzMDAyMGM0ODQwMWRiZDc4NDY2ZjRlYzcyZTQ4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMTYzNDFmODdjYWRjNDdlZGE3NmFmYjU2MmM3ZDIxNGUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUxNzQsIC0zLjY0MzE3NTcwMDAwMDAwMDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kNDM3MDBmYzI3NDA0Mjk5Yjg3NjNkNzA3YWE5ZjUxOSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kZDIyNzM3ZWM5YmU0YTcyYjdmMjJlMDllYmRiZjQ2YyA9ICQoYDxkaXYgaWQ9Imh0bWxfZGQyMjczN2VjOWJlNGE3MmI3ZjIyZTA5ZWJkYmY0NmMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1MTc0LCAtMy42NDMxNzU3MDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDQzNzAwZmMyNzQwNDI5OWI4NzYzZDcwN2FhOWY1MTkuc2V0Q29udGVudChodG1sX2RkMjI3MzdlYzliZTRhNzJiN2YyMmUwOWViZGJmNDZjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTYzNDFmODdjYWRjNDdlZGE3NmFmYjU2MmM3ZDIxNGUuYmluZFBvcHVwKHBvcHVwX2Q0MzcwMGZjMjc0MDQyOTliODc2M2Q3MDdhYTlmNTE5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzc1N2Q4OTgzOGY4NDFlZDhkOTE0Y2QyYTY4Y2VkODAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUxNywgLTMuNjQzMTc2MV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkZTkzZmJmYjdkYTQ3OTE4NTI5ZWFhOTQ0OGQ4ZmVkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2VlMDViOGE5ZDZiNzQ3OTM4MTA0N2IwMzRhYWY4YjVlID0gJChgPGRpdiBpZD0iaHRtbF9lZTA1YjhhOWQ2Yjc0NzkzODEwNDdiMDM0YWFmOGI1ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxNywgLTMuNjQzMTc2MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkZTkzZmJmYjdkYTQ3OTE4NTI5ZWFhOTQ0OGQ4ZmVkLnNldENvbnRlbnQoaHRtbF9lZTA1YjhhOWQ2Yjc0NzkzODEwNDdiMDM0YWFmOGI1ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M3NTdkODk4MzhmODQxZWQ4ZDkxNGNkMmE2OGNlZDgwLmJpbmRQb3B1cChwb3B1cF9lZGU5M2ZiZmI3ZGE0NzkxODUyOWVhYTk0NDhkOGZlZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2FiY2Y4NGM4Y2FkNzQ2NWFhZjg3NzUyMzUyMGRjN2RjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjM1ODE3OTk5OTk5OTQsIC0zLjYyNzMyOTQ5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85NGExY2Q3OGNkZWU0ZTZjYTZjMTBkZGUxMzI4NDUxNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMDkwZTBjMjdlNWQ0ZWRiYWU0ZWM4OTY2NjE0MWE1MyA9ICQoYDxkaXYgaWQ9Imh0bWxfZTA5MGUwYzI3ZTVkNGVkYmFlNGVjODk2NjYxNDFhNTMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MjM1ODE3OTk5OTk5OTQsIC0zLjYyNzMyOTQ5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85NGExY2Q3OGNkZWU0ZTZjYTZjMTBkZGUxMzI4NDUxNC5zZXRDb250ZW50KGh0bWxfZTA5MGUwYzI3ZTVkNGVkYmFlNGVjODk2NjYxNDFhNTMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hYmNmODRjOGNhZDc0NjVhYWY4Nzc1MjM1MjBkYzdkYy5iaW5kUG9wdXAocG9wdXBfOTRhMWNkNzhjZGVlNGU2Y2E2YzEwZGRlMTMyODQ1MTQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kMWJhMjkzMDFmZDU0YzgzOGExOTQ5OTMwNDUyZmVjOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDAzODE0MywgLTMuNjYyMzE4MTAwMDAwMDAwMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwZjMwZTkxN2EyYTQ1OWViZGUwZTA3ZTg3ZjkyY2UwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzRlMjZmMDU2MWMzOTRkMjE4ZWE4Y2I3MTFhZDI0MjI3ID0gJChgPGRpdiBpZD0iaHRtbF80ZTI2ZjA1NjFjMzk0ZDIxOGVhOGNiNzExYWQyNDIyNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQwMzgxNDMsIC0zLjY2MjMxODEwMDAwMDAwMDJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MGYzMGU5MTdhMmE0NTllYmRlMGUwN2U4N2Y5MmNlMC5zZXRDb250ZW50KGh0bWxfNGUyNmYwNTYxYzM5NGQyMThlYThjYjcxMWFkMjQyMjcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMWJhMjkzMDFmZDU0YzgzOGExOTQ5OTMwNDUyZmVjOC5iaW5kUG9wdXAocG9wdXBfNTBmMzBlOTE3YTJhNDU5ZWJkZTBlMDdlODdmOTJjZTApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kYjQwODEyZDBlOGQ0ZTBmYmRhZThiZmUxYzA3OGQzNSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI2NjI2NSwgLTMuNjM5MzcyOV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzQwOGEyYzU2NGI0ZjRkODJiMjRmYTBhZjliMTEzZDU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0NjA1M2U5OTI4NTQ0NjE4ZWFiMmQ1NDFiYjJlNDVjID0gJChgPGRpdiBpZD0iaHRtbF81NDYwNTNlOTkyODU0NDYxOGVhYjJkNTQxYmIyZTQ1YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjYyNjUsIC0zLjYzOTM3MjldPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF80MDhhMmM1NjRiNGY0ZDgyYjI0ZmEwYWY5YjExM2Q1NS5zZXRDb250ZW50KGh0bWxfNTQ2MDUzZTk5Mjg1NDQ2MThlYWIyZDU0MWJiMmU0NWMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYjQwODEyZDBlOGQ0ZTBmYmRhZThiZmUxYzA3OGQzNS5iaW5kUG9wdXAocG9wdXBfNDA4YTJjNTY0YjRmNGQ4MmIyNGZhMGFmOWIxMTNkNTUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl85ZTkyOGZhNDI0MmE0YWQ1YmI3ODU1YTBmZDIwYTZmZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTE4MzA2NSwgLTMuNjUzMzQyNzAwMDAwMDAwNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Y3MTVjZTFkZTkzMTQ4MDRiNTQ5NTBiOTZiOTU4ODE4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RiOTExOTZkZTAyMjRjNTk5M2VhYThkMjg3YWViN2U1ID0gJChgPGRpdiBpZD0iaHRtbF9kYjkxMTk2ZGUwMjI0YzU5OTNlYWE4ZDI4N2FlYjdlNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUxODMwNjUsIC0zLjY1MzM0MjcwMDAwMDAwMDVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mNzE1Y2UxZGU5MzE0ODA0YjU0OTUwYjk2Yjk1ODgxOC5zZXRDb250ZW50KGh0bWxfZGI5MTE5NmRlMDIyNGM1OTkzZWFhOGQyODdhZWI3ZTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85ZTkyOGZhNDI0MmE0YWQ1YmI3ODU1YTBmZDIwYTZmZC5iaW5kUG9wdXAocG9wdXBfZjcxNWNlMWRlOTMxNDgwNGI1NDk1MGI5NmI5NTg4MTgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kZDg5ZWM1ZDQ5NDU0YzU1OTFhZDY1YjgxODI1YmMyZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDExOTEyNiwgLTMuODIwMDgxNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ExYThjN2M5ZmE4YzQ4NTg4ZTU1YTM1M2JmOWUyZjM0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzhiZTA2Yjk1NTM2MDQzNDdhZDg2YTA3NTliZjgzMTkxID0gJChgPGRpdiBpZD0iaHRtbF84YmUwNmI5NTUzNjA0MzQ3YWQ4NmEwNzU5YmY4MzE5MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxMTkxMjYsIC0zLjgyMDA4MTRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9hMWE4YzdjOWZhOGM0ODU4OGU1NWEzNTNiZjllMmYzNC5zZXRDb250ZW50KGh0bWxfOGJlMDZiOTU1MzYwNDM0N2FkODZhMDc1OWJmODMxOTEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kZDg5ZWM1ZDQ5NDU0YzU1OTFhZDY1YjgxODI1YmMyZS5iaW5kUG9wdXAocG9wdXBfYTFhOGM3YzlmYThjNDg1ODhlNTVhMzUzYmY5ZTJmMzQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zYzkxYmZhOTM3M2Q0M2ZjYWVhYWNkMDg5OGUwNzJjMiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4NTE1MiwgLTMuNjQzMjAxMDAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzlhMjAwYWJhODM3ZjRjMjZiZmU3NjE0OTM2NDExMzc4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YzMThmMmJjOTNhZjQ0OTNhYWJkNGNiOTFjOGYyODM0ID0gJChgPGRpdiBpZD0iaHRtbF9mMzE4ZjJiYzkzYWY0NDkzYWFiZDRjYjkxYzhmMjgzNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyODUxNTIsIC0zLjY0MzIwMTAwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85YTIwMGFiYTgzN2Y0YzI2YmZlNzYxNDkzNjQxMTM3OC5zZXRDb250ZW50KGh0bWxfZjMxOGYyYmM5M2FmNDQ5M2FhYmQ0Y2I5MWM4ZjI4MzQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zYzkxYmZhOTM3M2Q0M2ZjYWVhYWNkMDg5OGUwNzJjMi5iaW5kUG9wdXAocG9wdXBfOWEyMDBhYmE4MzdmNGMyNmJmZTc2MTQ5MzY0MTEzNzgpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wNTNjY2FkMmYzYjI0NjMyOGQ0MzQ0MWM2MTQ5ZGI0NyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzk3MDY2NSwgLTMuNjYxNTA3ODk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwMmVlYTM4MzI2MzQwYzQ5N2YxYjM2NzE4YjkzZTZmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2NiNDgzYTQyOTMwMDQ2N2RhNzFlMWU2NzQ2NTAxNjIyID0gJChgPGRpdiBpZD0iaHRtbF9jYjQ4M2E0MjkzMDA0NjdkYTcxZTFlNjc0NjUwMTYyMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NzA2NjUsIC0zLjY2MTUwNzg5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MDJlZWEzODMyNjM0MGM0OTdmMWIzNjcxOGI5M2U2Zi5zZXRDb250ZW50KGh0bWxfY2I0ODNhNDI5MzAwNDY3ZGE3MWUxZTY3NDY1MDE2MjIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wNTNjY2FkMmYzYjI0NjMyOGQ0MzQ0MWM2MTQ5ZGI0Ny5iaW5kUG9wdXAocG9wdXBfNzAyZWVhMzgzMjYzNDBjNDk3ZjFiMzY3MThiOTNlNmYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8wMzhmNTA5ZjBiYzA0ZTcwYTRhNDA2MjQwMDU2MmM4MCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5MjQyMjk5OTk5OTksIC0zLjY0MDY4NDM5OTk5OTk5OTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NjkzYzNlZjA5OGM0MjgwYTQwN2U1OGY4ZTMxYWVlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lMTRjMTc3N2UyMjc0MDYyODYyMWU4NTg2YWNmMjMyZSA9ICQoYDxkaXYgaWQ9Imh0bWxfZTE0YzE3NzdlMjI3NDA2Mjg2MjFlODU4NmFjZjIzMmUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjkyNDIyOTk5OTk5OSwgLTMuNjQwNjg0Mzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzQ2OTNjM2VmMDk4YzQyODBhNDA3ZTU4ZjhlMzFhZWVhLnNldENvbnRlbnQoaHRtbF9lMTRjMTc3N2UyMjc0MDYyODYyMWU4NTg2YWNmMjMyZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAzOGY1MDlmMGJjMDRlNzBhNGE0MDYyNDAwNTYyYzgwLmJpbmRQb3B1cChwb3B1cF80NjkzYzNlZjA5OGM0MjgwYTQwN2U1OGY4ZTMxYWVlYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzA1ZTM1YmMzNmI3ZTRlM2I4NzZiYzE3MjA3Y2ZkNWUwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTY1MDE0LCAtMy42NjQxMzMyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzVjMGUzZGIxOTBhNDYxODlkN2JkYzE3YzlmNGFkNWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNTIxNDNiYTZlMWQ3NGU3YzlmZjViNDEzNDE4ZDlkNjEgPSAkKGA8ZGl2IGlkPSJodG1sXzUyMTQzYmE2ZTFkNzRlN2M5ZmY1YjQxMzQxOGQ5ZDYxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk2NTAxNCwgLTMuNjY0MTMzMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M1YzBlM2RiMTkwYTQ2MTg5ZDdiZGMxN2M5ZjRhZDVhLnNldENvbnRlbnQoaHRtbF81MjE0M2JhNmUxZDc0ZTdjOWZmNWI0MTM0MThkOWQ2MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA1ZTM1YmMzNmI3ZTRlM2I4NzZiYzE3MjA3Y2ZkNWUwLmJpbmRQb3B1cChwb3B1cF9jNWMwZTNkYjE5MGE0NjE4OWQ3YmRjMTdjOWY0YWQ1YSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRmMDc3MzIzYWUxOTQ4NmY4NGQ5ODNhYjkyMzYwMzhkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4xNzkyMjcwMDAwMDAwMDQsIC00LjEzODM4Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYyMWZjM2RhNDRhYTQyZTZhOWFiNjllYzAxYmJkNjk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwNTNlMzJhNmZlYTQ0ZDhhN2QwOWQwNGE5ZmVlYTAwID0gJChgPGRpdiBpZD0iaHRtbF80MDUzZTMyYTZmZWE0NGQ4YTdkMDlkMDRhOWZlZWEwMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjE3OTIyNzAwMDAwMDAwNCwgLTQuMTM4Mzg2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjIxZmMzZGE0NGFhNDJlNmE5YWI2OWVjMDFiYmQ2OTYuc2V0Q29udGVudChodG1sXzQwNTNlMzJhNmZlYTQ0ZDhhN2QwOWQwNGE5ZmVlYTAwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGYwNzczMjNhZTE5NDg2Zjg0ZDk4M2FiOTIzNjAzOGQuYmluZFBvcHVwKHBvcHVwXzYyMWZjM2RhNDRhYTQyZTZhOWFiNjllYzAxYmJkNjk2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYjcxZDJhNjZhNzgzNDY5N2FjNDllMjk1NzdiYjVjZDYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODQ3NzQsIC0zLjY0MzI4NjddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80NWEzY2ZhYmUxMWU0MzI3OGE2ZmFkMzBmNjI3N2Q5NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNGY4YWJlMTVmZGI0MjZjYTk0Zjg0NDFkOTljOTkyMCA9ICQoYDxkaXYgaWQ9Imh0bWxfZTRmOGFiZTE1ZmRiNDI2Y2E5NGY4NDQxZDk5Yzk5MjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg0Nzc0LCAtMy42NDMyODY3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNDVhM2NmYWJlMTFlNDMyNzhhNmZhZDMwZjYyNzdkOTYuc2V0Q29udGVudChodG1sX2U0ZjhhYmUxNWZkYjQyNmNhOTRmODQ0MWQ5OWM5OTIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYjcxZDJhNjZhNzgzNDY5N2FjNDllMjk1NzdiYjVjZDYuYmluZFBvcHVwKHBvcHVwXzQ1YTNjZmFiZTExZTQzMjc4YTZmYWQzMGY2Mjc3ZDk2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNTlkMjkxODdlZTZhNDFkZDkyMzE2YmViYmQyYWFkMzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxMzcxMTc5OTk5OTk5NCwgLTMuNjUxNTk0Mjk5OTk5OTk5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3NTgyZDI0MTNhZTQ3ZWRiZTQ1NjRjYThjNWYwMmU4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2Q3OTRjMGJlNWY0YTQwZjQ4ZDgyNjkxZDJmMjI3MmMwID0gJChgPGRpdiBpZD0iaHRtbF9kNzk0YzBiZTVmNGE0MGY0OGQ4MjY5MWQyZjIyNzJjMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxMzcxMTc5OTk5OTk5NCwgLTMuNjUxNTk0Mjk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q3NTgyZDI0MTNhZTQ3ZWRiZTQ1NjRjYThjNWYwMmU4LnNldENvbnRlbnQoaHRtbF9kNzk0YzBiZTVmNGE0MGY0OGQ4MjY5MWQyZjIyNzJjMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU5ZDI5MTg3ZWU2YTQxZGQ5MjMxNmJlYmJkMmFhZDM3LmJpbmRQb3B1cChwb3B1cF9kNzU4MmQyNDEzYWU0N2VkYmU0NTY0Y2E4YzVmMDJlOCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzkwOTE3ZTU4MjY2YjRkMjNhNjcwNDk2N2JkMmFjNTU2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MDg1MDg4LCAtMy42NzU3ODhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84NjhlYTdmMmYzZTg0MGQ1OTBjNjhmOTUzMGJhMWU1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9jZDMzZGU0NTVjZDk0N2YzOWZkMGY0NmNhYWI1ZmQ4ZCA9ICQoYDxkaXYgaWQ9Imh0bWxfY2QzM2RlNDU1Y2Q5NDdmMzlmZDBmNDZjYWFiNWZkOGQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MDg1MDg4LCAtMy42NzU3ODhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjhlYTdmMmYzZTg0MGQ1OTBjNjhmOTUzMGJhMWU1MC5zZXRDb250ZW50KGh0bWxfY2QzM2RlNDU1Y2Q5NDdmMzlmZDBmNDZjYWFiNWZkOGQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl85MDkxN2U1ODI2NmI0ZDIzYTY3MDQ5NjdiZDJhYzU1Ni5iaW5kUG9wdXAocG9wdXBfODY4ZWE3ZjJmM2U4NDBkNTkwYzY4Zjk1MzBiYTFlNTApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9mZTY2NjcwMzQ3MTY0YTgzOTY3OTc1MGExNmI5MTdjZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMzAzLCAtMy42Mjg1NTcxMDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjQ4YWE2MWI4OGYyNDg3Nzg3MDc0ZDM5YzZmNDYzODAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTdmYTZkZDgyM2M3NGRkNzg5NGFlZWJjODRjZWVjMmEgPSAkKGA8ZGl2IGlkPSJodG1sXzE3ZmE2ZGQ4MjNjNzRkZDc4OTRhZWViYzg0Y2VlYzJhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxMzAzLCAtMy42Mjg1NTcxMDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYjQ4YWE2MWI4OGYyNDg3Nzg3MDc0ZDM5YzZmNDYzODAuc2V0Q29udGVudChodG1sXzE3ZmE2ZGQ4MjNjNzRkZDc4OTRhZWViYzg0Y2VlYzJhKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmU2NjY3MDM0NzE2NGE4Mzk2Nzk3NTBhMTZiOTE3Y2UuYmluZFBvcHVwKHBvcHVwX2I0OGFhNjFiODhmMjQ4Nzc4NzA3NGQzOWM2ZjQ2MzgwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMWFjMTQ5OWNjMzI4NDhmYjkzYWJhYmFiMzc3ZDU4NzkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ0OTE3NzI5OTk5OTk5NSwgLTMuNjk2MzkwN10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI5NjQ1NDUwZGFmMTQ3OWQ4NjIzMTAzNDMwYmNjNTg3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E5NzU0NWUzOTAyZTRiODM4MDVlODRiOTVhYTcwMWYxID0gJChgPGRpdiBpZD0iaHRtbF9hOTc1NDVlMzkwMmU0YjgzODA1ZTg0Yjk1YWE3MDFmMSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ0OTE3NzI5OTk5OTk5NSwgLTMuNjk2MzkwN108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI5NjQ1NDUwZGFmMTQ3OWQ4NjIzMTAzNDMwYmNjNTg3LnNldENvbnRlbnQoaHRtbF9hOTc1NDVlMzkwMmU0YjgzODA1ZTg0Yjk1YWE3MDFmMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFhYzE0OTljYzMyODQ4ZmI5M2FiYWJhYjM3N2Q1ODc5LmJpbmRQb3B1cChwb3B1cF8yOTY0NTQ1MGRhZjE0NzlkODYyMzEwMzQzMGJjYzU4NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzU3ZDQzMmZkZTk4NzQxNjg4ODlmMTYwYmRjYmIzNDdhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU0ODk5LCAtMy42NjQ0NjUwMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYmFmMjU3ZjBkOTZjNDBiMGFhZTQzYWRjYmVjMzUyMjcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTRlOTgxM2E3NjFjNDgwZmE4NDIyMzE0MGQ3NjM3MjUgPSAkKGA8ZGl2IGlkPSJodG1sXzE0ZTk4MTNhNzYxYzQ4MGZhODQyMjMxNDBkNzYzNzI1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE1NDg5OSwgLTMuNjY0NDY1MDAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JhZjI1N2YwZDk2YzQwYjBhYWU0M2FkY2JlYzM1MjI3LnNldENvbnRlbnQoaHRtbF8xNGU5ODEzYTc2MWM0ODBmYTg0MjIzMTQwZDc2MzcyNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzU3ZDQzMmZkZTk4NzQxNjg4ODlmMTYwYmRjYmIzNDdhLmJpbmRQb3B1cChwb3B1cF9iYWYyNTdmMGQ5NmM0MGIwYWFlNDNhZGNiZWMzNTIyNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2U5NjgzZjQzMjVkNDRiOGQ5NGMzMTRlN2VjYzUwZTA2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjM1ODg2LCAtMy42MjczMjQxXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGUzYjgwNjU3ZmZhNGI4NDkwZWIxNzA2ZjI2N2QwNjMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNzk3OWJjNzJiYjk1NDM4NTg5NWQ0Mzc5YTQ2ZDI5YzAgPSAkKGA8ZGl2IGlkPSJodG1sXzc5NzliYzcyYmI5NTQzODU4OTVkNDM3OWE0NmQyOWMwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIzNTg4NiwgLTMuNjI3MzI0MV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRlM2I4MDY1N2ZmYTRiODQ5MGViMTcwNmYyNjdkMDYzLnNldENvbnRlbnQoaHRtbF83OTc5YmM3MmJiOTU0Mzg1ODk1ZDQzNzlhNDZkMjljMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U5NjgzZjQzMjVkNDRiOGQ5NGMzMTRlN2VjYzUwZTA2LmJpbmRQb3B1cChwb3B1cF80ZTNiODA2NTdmZmE0Yjg0OTBlYjE3MDZmMjY3ZDA2MykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2QxZWZiZjIxOTgyZjQyNGY5MDc2MTM5NmJkMGJhMTZhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NTQ4ODI2LCAtMy42NTQ1MTcyOTk5OTk5OTkzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjliMzE5MmM4YzI3NDQ0Yzg5NzRmMDBlZmZkZjk4ZjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWUxNjhjODlmZjEwNDlmOGIxMmFlOGY2YmZiMThhOTQgPSAkKGA8ZGl2IGlkPSJodG1sX2VlMTY4Yzg5ZmYxMDQ5ZjhiMTJhZThmNmJmYjE4YTk0IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDU0ODgyNiwgLTMuNjU0NTE3Mjk5OTk5OTk5M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I5YjMxOTJjOGMyNzQ0NGM4OTc0ZjAwZWZmZGY5OGYxLnNldENvbnRlbnQoaHRtbF9lZTE2OGM4OWZmMTA0OWY4YjEyYWU4ZjZiZmIxOGE5NCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2QxZWZiZjIxOTgyZjQyNGY5MDc2MTM5NmJkMGJhMTZhLmJpbmRQb3B1cChwb3B1cF9iOWIzMTkyYzhjMjc0NDRjODk3NGYwMGVmZmRmOThmMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RlZGIwZjc1ZDU4MjRiOGQ5NWQ2MDExOTBkZWJkODZkID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTg4NzI5LCAtMy42Njg5ODE4OTk5OTk5OTk1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2Y1NzBjYjcwZTJiNGYxY2FlMzE1MTk4NjJhYjMzOWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZWZhOGZhYzAxZDFiNDMwNzk5YzQzN2E0YTgzZGQzMDcgPSAkKGA8ZGl2IGlkPSJodG1sX2VmYThmYWMwMWQxYjQzMDc5OWM0MzdhNGE4M2RkMzA3IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk4ODcyOSwgLTMuNjY4OTgxODk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdmNTcwY2I3MGUyYjRmMWNhZTMxNTE5ODYyYWIzMzlhLnNldENvbnRlbnQoaHRtbF9lZmE4ZmFjMDFkMWI0MzA3OTljNDM3YTRhODNkZDMwNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RlZGIwZjc1ZDU4MjRiOGQ5NWQ2MDExOTBkZWJkODZkLmJpbmRQb3B1cChwb3B1cF83ZjU3MGNiNzBlMmI0ZjFjYWUzMTUxOTg2MmFiMzM5YSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2VjYzY5Mjc3NzY5YzRmMGFhNDkwYzI1YTExNjA4YTAwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjY5MDM5LCAtMy42MzgyNzg4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWJmMjM3MDk0NzgyNGE4ZGE1YmRkN2E1MjVmOTJkMWQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDVjNjJmZTc0ZTRhNDM1OTljZDhmZDJlYTM3ODlmMzggPSAkKGA8ZGl2IGlkPSJodG1sXzQ1YzYyZmU3NGU0YTQzNTk5Y2Q4ZmQyZWEzNzg5ZjM4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI2OTAzOSwgLTMuNjM4Mjc4OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzliZjIzNzA5NDc4MjRhOGRhNWJkZDdhNTI1ZjkyZDFkLnNldENvbnRlbnQoaHRtbF80NWM2MmZlNzRlNGE0MzU5OWNkOGZkMmVhMzc4OWYzOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2VjYzY5Mjc3NzY5YzRmMGFhNDkwYzI1YTExNjA4YTAwLmJpbmRQb3B1cChwb3B1cF85YmYyMzcwOTQ3ODI0YThkYTViZGQ3YTUyNWY5MmQxZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzhkZmRlM2ZmN2M0MTQzOGFhMjIzNzk2NzgyY2EzODEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41NDUxNjMyMDAwMDAwMDUsIC0zLjY1MTQ5NzY5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82ZmZhMWUwOTA4ZGQ0OGNjYmIzOWQwMzYzZDZjZDg5MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZjY2MDlhZGNjMjQ0ZjFlOTMzZWRmZmY2MGFmZjRmOCA9ICQoYDxkaXYgaWQ9Imh0bWxfNmY2NjA5YWRjYzI0NGYxZTkzM2VkZmZmNjBhZmY0ZjgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41NDUxNjMyMDAwMDAwMDUsIC0zLjY1MTQ5NzY5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82ZmZhMWUwOTA4ZGQ0OGNjYmIzOWQwMzYzZDZjZDg5Mi5zZXRDb250ZW50KGh0bWxfNmY2NjA5YWRjYzI0NGYxZTkzM2VkZmZmNjBhZmY0ZjgpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl84ZGZkZTNmZjdjNDE0MzhhYTIyMzc5Njc4MmNhMzgxMC5iaW5kUG9wdXAocG9wdXBfNmZmYTFlMDkwOGRkNDhjY2JiMzlkMDM2M2Q2Y2Q4OTIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9lMTA2OTZlNDdkNzU0ODY4YmE2MmU5ZjFjYmI2YmYxYyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI0OTE4NSwgLTMuNjQzNDcyMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2VkYTgxNjM2NmRmNjRmOTI5MTc1Mjc2Yjg5MTgyNDAxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxYzlhZDJmMTczYzQ3ODg5NGNjNmZjNGM4NWY0YTU2ID0gJChgPGRpdiBpZD0iaHRtbF9mMWM5YWQyZjE3M2M0Nzg4OTRjYzZmYzRjODVmNGE1NiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNDkxODUsIC0zLjY0MzQ3MjJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9lZGE4MTYzNjZkZjY0ZjkyOTE3NTI3NmI4OTE4MjQwMS5zZXRDb250ZW50KGh0bWxfZjFjOWFkMmYxNzNjNDc4ODk0Y2M2ZmM0Yzg1ZjRhNTYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lMTA2OTZlNDdkNzU0ODY4YmE2MmU5ZjFjYmI2YmYxYy5iaW5kUG9wdXAocG9wdXBfZWRhODE2MzY2ZGY2NGY5MjkxNzUyNzZiODkxODI0MDEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iYjYxZDczNTZhNGU0MjIyOWJkZDIxYTM5YzVkYzljMyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMyNDAxMSwgLTMuNjM5NTAzMV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2OTI5MDk4ZWQ3NTRiMGJhMGYyZDAyNWEyNTI5MzY1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2MGUwZjVmOTAzODQ3ODZiZDRiNjUxM2FjYWU3YjQ0ID0gJChgPGRpdiBpZD0iaHRtbF81NjBlMGY1ZjkwMzg0Nzg2YmQ0YjY1MTNhY2FlN2I0NCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMjQwMTEsIC0zLjYzOTUwMzFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjkyOTA5OGVkNzU0YjBiYTBmMmQwMjVhMjUyOTM2NS5zZXRDb250ZW50KGh0bWxfNTYwZTBmNWY5MDM4NDc4NmJkNGI2NTEzYWNhZTdiNDQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9iYjYxZDczNTZhNGU0MjIyOWJkZDIxYTM5YzVkYzljMy5iaW5kUG9wdXAocG9wdXBfODY5MjkwOThlZDc1NGIwYmEwZjJkMDI1YTI1MjkzNjUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81NDAwYjVmZGE2MmE0N2Y5YTAzY2NmZGEwMjQ5ZWYyMyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI4OTc0NjAwMDAwMDA1LCAtMy42NDcxNTYzOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfODM4YTlmYTNmZjE5NGIwNGE0ZDQ0N2NiYzZjYzYxNWIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzNhMGFkNTc3M2E2NDAzYWFkYWNiNzY4ZGM4NGUyNGUgPSAkKGA8ZGl2IGlkPSJodG1sX2MzYTBhZDU3NzNhNjQwM2FhZGFjYjc2OGRjODRlMjRlIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI4OTc0NjAwMDAwMDA1LCAtMy42NDcxNTYzOTk5OTk5OTk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODM4YTlmYTNmZjE5NGIwNGE0ZDQ0N2NiYzZjYzYxNWIuc2V0Q29udGVudChodG1sX2MzYTBhZDU3NzNhNjQwM2FhZGFjYjc2OGRjODRlMjRlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNTQwMGI1ZmRhNjJhNDdmOWEwM2NjZmRhMDI0OWVmMjMuYmluZFBvcHVwKHBvcHVwXzgzOGE5ZmEzZmYxOTRiMDRhNGQ0NDdjYmM2Y2M2MTViKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjljNjAwZWYxYzVhNGJlODgzYjA5ZTljZDkxNmNlZDMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMjk2MjgsIC0zLjYzOTAxMTJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF80YWFiZjNjNzRiNWI0NDE4ODkyMzQwZTA3YTQ2MzU4OSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82ZDdiZDY3ZWQ5NTQ0MjNhOGM5NjNkZjMyYzNmMmFiYiA9ICQoYDxkaXYgaWQ9Imh0bWxfNmQ3YmQ2N2VkOTU0NDIzYThjOTYzZGYzMmMzZjJhYmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzI5NjI4LCAtMy42MzkwMTEyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNGFhYmYzYzc0YjViNDQxODg5MjM0MGUwN2E0NjM1ODkuc2V0Q29udGVudChodG1sXzZkN2JkNjdlZDk1NDQyM2E4Yzk2M2RmMzJjM2YyYWJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjljNjAwZWYxYzVhNGJlODgzYjA5ZTljZDkxNmNlZDMuYmluZFBvcHVwKHBvcHVwXzRhYWJmM2M3NGI1YjQ0MTg4OTIzNDBlMDdhNDYzNTg5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNmMzOGFkZDg4NzA4NDVjOGJmMjgyNTM0MmVhNjAzN2QgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxOTk0MzIwMDAwMDAwNiwgLTMuNjMwOTAwMjk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg0NmY1NGQ3NzNjOTQ3NjE4ZTk5MjAxODAzNDk5YWZkID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU2ZjJjNmI0MTU1ZDQxNWI5Mzg0YTQzMTg0OWI1MTk5ID0gJChgPGRpdiBpZD0iaHRtbF81NmYyYzZiNDE1NWQ0MTViOTM4NGE0MzE4NDliNTE5OSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTk0MzIwMDAwMDAwNiwgLTMuNjMwOTAwMjk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzg0NmY1NGQ3NzNjOTQ3NjE4ZTk5MjAxODAzNDk5YWZkLnNldENvbnRlbnQoaHRtbF81NmYyYzZiNDE1NWQ0MTViOTM4NGE0MzE4NDliNTE5OSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZjMzhhZGQ4ODcwODQ1YzhiZjI4MjUzNDJlYTYwMzdkLmJpbmRQb3B1cChwb3B1cF84NDZmNTRkNzczYzk0NzYxOGU5OTIwMTgwMzQ5OWFmZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzRjNDg5OGNiZjRkZDQ3Njk5NDQwMTZmMTI4OWMwNTA4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4xODg1NTEzOTk5OTk5OTQsIC00LjEyODcwNjZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF85MWY3OTY4MGE5Y2Y0Y2JmYmFhNDgwMDUyM2U2MzYxZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNmI5YjA3YjllZDk0ZGU0ODEwZDhiZWVmZTNkZGExNyA9ICQoYDxkaXYgaWQ9Imh0bWxfMzZiOWIwN2I5ZWQ5NGRlNDgxMGQ4YmVlZmUzZGRhMTciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4xODg1NTEzOTk5OTk5OTQsIC00LjEyODcwNjZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF85MWY3OTY4MGE5Y2Y0Y2JmYmFhNDgwMDUyM2U2MzYxZS5zZXRDb250ZW50KGh0bWxfMzZiOWIwN2I5ZWQ5NGRlNDgxMGQ4YmVlZmUzZGRhMTcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80YzQ4OThjYmY0ZGQ0NzY5OTQ0MDE2ZjEyODljMDUwOC5iaW5kUG9wdXAocG9wdXBfOTFmNzk2ODBhOWNmNGNiZmJhYTQ4MDA1MjNlNjM2MWUpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl80MzM3ZTAxYzRkYjU0MjRmYjRhN2I1OGI3ZjZmNjdmZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuMzU2MzIxLCAtMy44MTAyODg2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWFkNmY4YjM0ZjMwNDllM2IxZWQyM2FkYjE4N2RmYzQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDI1NmExZTM4MWFhNGQ1OGEwMmE4MjkzYjgzNmY3OWMgPSAkKGA8ZGl2IGlkPSJodG1sX2QyNTZhMWUzODFhYTRkNThhMDJhODI5M2I4MzZmNzljIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzU2MzIxLCAtMy44MTAyODg2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWFkNmY4YjM0ZjMwNDllM2IxZWQyM2FkYjE4N2RmYzQuc2V0Q29udGVudChodG1sX2QyNTZhMWUzODFhYTRkNThhMDJhODI5M2I4MzZmNzljKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDMzN2UwMWM0ZGI1NDI0ZmI0YTdiNThiN2Y2ZjY3ZmQuYmluZFBvcHVwKHBvcHVwXzlhZDZmOGIzNGYzMDQ5ZTNiMWVkMjNhZGIxODdkZmM0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMmJkNTFiMmRhM2ZjNDNlYTlhYjNkZDc5NmJjZmFiMTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NDQ5MDAwMDAwMDAwNSwgLTMuNzAxMDk2Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MwNjhiMjVjMTA2YTRlZTJiMzk5MTU5YTE3MTFlMmIxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E0MWQ1ZWQ1YjMzNTQyOWM4YmZlMWRhYWIyZjBhZmYyID0gJChgPGRpdiBpZD0iaHRtbF9hNDFkNWVkNWIzMzU0MjljOGJmZTFkYWFiMmYwYWZmMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NDQ5MDAwMDAwMDAwNSwgLTMuNzAxMDk2Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MwNjhiMjVjMTA2YTRlZTJiMzk5MTU5YTE3MTFlMmIxLnNldENvbnRlbnQoaHRtbF9hNDFkNWVkNWIzMzU0MjljOGJmZTFkYWFiMmYwYWZmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzJiZDUxYjJkYTNmYzQzZWE5YWIzZGQ3OTZiY2ZhYjEyLmJpbmRQb3B1cChwb3B1cF9jMDY4YjI1YzEwNmE0ZWUyYjM5OTE1OWExNzExZTJiMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzk2NDc3YzA3MDVlYzQyMTE5MzAxZTE2ZjhkMjNmZDIwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU0OTU3MDAwMDAwMSwgLTMuNjY0NDEyNzk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzU2MjdlMmJhOWY2ZTRkZTc5ZDU2MGFhNWI4ODRjNDRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0MTlkOTg5ZWI5NTRiNmRhNmUwMzRiNjYzMTNmNTIwID0gJChgPGRpdiBpZD0iaHRtbF81NDE5ZDk4OWViOTU0YjZkYTZlMDM0YjY2MzEzZjUyMCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxNTQ5NTcwMDAwMDAxLCAtMy42NjQ0MTI3OTk5OTk5OTk2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNTYyN2UyYmE5ZjZlNGRlNzlkNTYwYWE1Yjg4NGM0NGIuc2V0Q29udGVudChodG1sXzU0MTlkOTg5ZWI5NTRiNmRhNmUwMzRiNjYzMTNmNTIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTY0NzdjMDcwNWVjNDIxMTkzMDFlMTZmOGQyM2ZkMjAuYmluZFBvcHVwKHBvcHVwXzU2MjdlMmJhOWY2ZTRkZTc5ZDU2MGFhNWI4ODRjNDRiKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzUzYzEwMjQwYWQyNDNlMWJhMTk4NGZhMDQwNmJjY2IgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjg3MDksIC0zLjY0NzA3Ml0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2MzYzdhZTk2OWFjMTRjZDQ4YmM0NzQ5MDgyMWMyNGJmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2IyMzNiYTQ1NmNlMDQwYzJhZWY1Zjk0OWI2MWVhZmIyID0gJChgPGRpdiBpZD0iaHRtbF9iMjMzYmE0NTZjZTA0MGMyYWVmNWY5NDliNjFlYWZiMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNjg3MDksIC0zLjY0NzA3Ml08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2MzYzdhZTk2OWFjMTRjZDQ4YmM0NzQ5MDgyMWMyNGJmLnNldENvbnRlbnQoaHRtbF9iMjMzYmE0NTZjZTA0MGMyYWVmNWY5NDliNjFlYWZiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M1M2MxMDI0MGFkMjQzZTFiYTE5ODRmYTA0MDZiY2NiLmJpbmRQb3B1cChwb3B1cF9jM2M3YWU5NjlhYzE0Y2Q0OGJjNDc0OTA4MjFjMjRiZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzFlYWZhODcyZTUwZDRjNmFhMWQ3ZTYyOGE1OTdlZDdjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NTE3MjE4LCAtMy42NTI2OTU4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmYzNzI5MWRmZmU5NDYyMjgxZTRkOGZlMWZjZjA3OTYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMWI0ODU4YzE1NTNmNGE2MjhlYjgyZDFmYzc0OGFiY2EgPSAkKGA8ZGl2IGlkPSJodG1sXzFiNDg1OGMxNTUzZjRhNjI4ZWI4MmQxZmM3NDhhYmNhIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDUxNzIxOCwgLTMuNjUyNjk1OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZmMzcyOTFkZmZlOTQ2MjI4MWU0ZDhmZTFmY2YwNzk2LnNldENvbnRlbnQoaHRtbF8xYjQ4NThjMTU1M2Y0YTYyOGViODJkMWZjNzQ4YWJjYSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzFlYWZhODcyZTUwZDRjNmFhMWQ3ZTYyOGE1OTdlZDdjLmJpbmRQb3B1cChwb3B1cF9mZjM3MjkxZGZmZTk0NjIyODFlNGQ4ZmUxZmNmMDc5NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NmZDI4MGQyNzkyZDQ2Nzk5NmE1OGM1NTIwNGQ2YmRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTU2MzY2MDAwMDAwMDYsIC0zLjY2NDA1NTAwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OGM2MGYwZWJjYmI0ZDhiOTg5OTAwMGU1OGViNmY0YSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82NDg0MzkyOGY2NDc0OTM2OGVmOGRkODljMGQwYWY3MiA9ICQoYDxkaXYgaWQ9Imh0bWxfNjQ4NDM5MjhmNjQ3NDkzNjhlZjhkZDg5YzBkMGFmNzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTU2MzY2MDAwMDAwMDYsIC0zLjY2NDA1NTAwMDAwMDAwMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83OGM2MGYwZWJjYmI0ZDhiOTg5OTAwMGU1OGViNmY0YS5zZXRDb250ZW50KGh0bWxfNjQ4NDM5MjhmNjQ3NDkzNjhlZjhkZDg5YzBkMGFmNzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZmQyODBkMjc5MmQ0Njc5OTZhNThjNTUyMDRkNmJkYy5iaW5kUG9wdXAocG9wdXBfNzhjNjBmMGViY2JiNGQ4Yjk4OTkwMDBlNThlYjZmNGEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9lNTc2YTljMzNkMDc0OTUyOWMzNTVjZWRiMGE2ZDE2ZSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDE5MzEwOSwgLTMuNjM1MjU2Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q3YzY5ZDBjYTZkYTQ2YzY5MDhiNTliMzQwNTA2YjYxID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2QxMWMzZGMyZDBkYjQ2Zjk5YWM5N2EyMmU3MWVkOWMyID0gJChgPGRpdiBpZD0iaHRtbF9kMTFjM2RjMmQwZGI0NmY5OWFjOTdhMjJlNzFlZDljMiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTMxMDksIC0zLjYzNTI1NjZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kN2M2OWQwY2E2ZGE0NmM2OTA4YjU5YjM0MDUwNmI2MS5zZXRDb250ZW50KGh0bWxfZDExYzNkYzJkMGRiNDZmOTlhYzk3YTIyZTcxZWQ5YzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9lNTc2YTljMzNkMDc0OTUyOWMzNTVjZWRiMGE2ZDE2ZS5iaW5kUG9wdXAocG9wdXBfZDdjNjlkMGNhNmRhNDZjNjkwOGI1OWIzNDA1MDZiNjEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kYzVjN2E1Nzg3N2I0YTA0ODllMTE2OTM3OGM0Y2M1MCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTMwMTAzMiwgLTMuNjQyOTIwM10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2ZiYWRjMWVjYzJkMzRmZmY5ZWE5YmE3ZDQ1MjkzYjRmID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQyNzJkYmRjMTIzYzRmZjQ5NDE1Yzc2NTU1ODRhZjk1ID0gJChgPGRpdiBpZD0iaHRtbF80MjcyZGJkYzEyM2M0ZmY0OTQxNWM3NjU1NTg0YWY5NSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDEwMzIsIC0zLjY0MjkyMDNdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9mYmFkYzFlY2MyZDM0ZmZmOWVhOWJhN2Q0NTI5M2I0Zi5zZXRDb250ZW50KGh0bWxfNDI3MmRiZGMxMjNjNGZmNDk0MTVjNzY1NTU4NGFmOTUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYzVjN2E1Nzg3N2I0YTA0ODllMTE2OTM3OGM0Y2M1MC5iaW5kUG9wdXAocG9wdXBfZmJhZGMxZWNjMmQzNGZmZjllYTliYTdkNDUyOTNiNGYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8zNTE1Yjc2Njc5NDQ0NjdkOWRjNzY5ODg4YmFhYjQzYSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDI2OTAxNiwgLTMuNjU5ODc2NjAwMDAwMDAwNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2NmZGUzMDM1ODM5OTRiMjBiOGRmYmE3MDQ0YTk2MTA5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzI2YmQ3NzI0NGQ5MjQ2ZjU5MGJkYzkyMTU4ZTNkOWIzID0gJChgPGRpdiBpZD0iaHRtbF8yNmJkNzcyNDRkOTI0NmY1OTBiZGM5MjE1OGUzZDliMyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyNjkwMTYsIC0zLjY1OTg3NjYwMDAwMDAwMDVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZmRlMzAzNTgzOTk0YjIwYjhkZmJhNzA0NGE5NjEwOS5zZXRDb250ZW50KGh0bWxfMjZiZDc3MjQ0ZDkyNDZmNTkwYmRjOTIxNThlM2Q5YjMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNTE1Yjc2Njc5NDQ0NjdkOWRjNzY5ODg4YmFhYjQzYS5iaW5kUG9wdXAocG9wdXBfY2ZkZTMwMzU4Mzk5NGIyMGI4ZGZiYTcwNDRhOTYxMDkpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9jYTc4NzEzZWVjYzg0MDVkODU2YzA3NDY2M2ZmNThkMCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDEzNzM4LCAtMy42NTE3NDczXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMzlmNGEzMzNhYzU3NDkyOWI0ODk2N2JmMzM0ZjBjY2EgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDg0MTMxMmFlMzZkNDU2NjhkMjdkYzAzMTQ5MzJhOTAgPSAkKGA8ZGl2IGlkPSJodG1sXzA4NDEzMTJhZTM2ZDQ1NjY4ZDI3ZGMwMzE0OTMyYTkwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDEzNzM4LCAtMy42NTE3NDczXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMzlmNGEzMzNhYzU3NDkyOWI0ODk2N2JmMzM0ZjBjY2Euc2V0Q29udGVudChodG1sXzA4NDEzMTJhZTM2ZDQ1NjY4ZDI3ZGMwMzE0OTMyYTkwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfY2E3ODcxM2VlY2M4NDA1ZDg1NmMwNzQ2NjNmZjU4ZDAuYmluZFBvcHVwKHBvcHVwXzM5ZjRhMzMzYWM1NzQ5MjliNDg5NjdiZjMzNGYwY2NhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYWYxZTM3MTQ3MDMwNDk3Mjk4NWYzZmQyYWZjMzIzMTcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NzIyMDksIC0zLjY2Mjg0ODYwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84Yzg2MWQ5YjU3MTA0ODNmYmExMjQ4NjEwMjg4ZWMwNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF83NmZiMWJmNzc4ZjM0ZmU5OTYyNGY3ZjczZThjODUyMyA9ICQoYDxkaXYgaWQ9Imh0bWxfNzZmYjFiZjc3OGYzNGZlOTk2MjRmN2Y3M2U4Yzg1MjMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zOTcyMjA5LCAtMy42NjI4NDg2MDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGM4NjFkOWI1NzEwNDgzZmJhMTI0ODYxMDI4OGVjMDYuc2V0Q29udGVudChodG1sXzc2ZmIxYmY3NzhmMzRmZTk5NjI0ZjdmNzNlOGM4NTIzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYWYxZTM3MTQ3MDMwNDk3Mjk4NWYzZmQyYWZjMzIzMTcuYmluZFBvcHVwKHBvcHVwXzhjODYxZDliNTcxMDQ4M2ZiYTEyNDg2MTAyODhlYzA2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzVkMjIyZGJhNzRiNGI2YTkyYTg5ZjM2MTQ5ODJjOTAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxMzc1MTgsIC0zLjY1MTc4M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzVmNDhlYjY0MjQyYjQyYmM5OWNjZGU0ZjY0Mjk0MTk2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhMzUxZWMxY2UwODQ2NmZhNTQ5Nzg0YTRlM2ZhZjlkID0gJChgPGRpdiBpZD0iaHRtbF9kYTM1MWVjMWNlMDg0NjZmYTU0OTc4NGE0ZTNmYWY5ZCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxMzc1MTgsIC0zLjY1MTc4M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzVmNDhlYjY0MjQyYjQyYmM5OWNjZGU0ZjY0Mjk0MTk2LnNldENvbnRlbnQoaHRtbF9kYTM1MWVjMWNlMDg0NjZmYTU0OTc4NGE0ZTNmYWY5ZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM1ZDIyMmRiYTc0YjRiNmE5MmE4OWYzNjE0OTgyYzkwLmJpbmRQb3B1cChwb3B1cF81ZjQ4ZWI2NDI0MmI0MmJjOTljY2RlNGY2NDI5NDE5NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzUxM2Q1YjQzNTQ4MDRiODY4MWI2YzJmYjM4MDM4YzAxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjU0MDc5LCAtMy42NDQ3MDMyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGM0N2NmNjg4OWMyNDQ3NjlkMmQzYWNiNDE2NTA2Y2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTQ5MGE4NmNmYTM0NGY3ZGE5NDhmNzZlOGU3MmI5YWIgPSAkKGA8ZGl2IGlkPSJodG1sXzk0OTBhODZjZmEzNDRmN2RhOTQ4Zjc2ZThlNzJiOWFiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI1NDA3OSwgLTMuNjQ0NzAzMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjNDdjZjY4ODljMjQ0NzY5ZDJkM2FjYjQxNjUwNmNlLnNldENvbnRlbnQoaHRtbF85NDkwYTg2Y2ZhMzQ0ZjdkYTk0OGY3NmU4ZTcyYjlhYik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUxM2Q1YjQzNTQ4MDRiODY4MWI2YzJmYjM4MDM4YzAxLmJpbmRQb3B1cChwb3B1cF8wYzQ3Y2Y2ODg5YzI0NDc2OWQyZDNhY2I0MTY1MDZjZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzM2ZThlMWEzZDVkYTQxOGRhZWNlZGQ1MzRhZDRjNDJmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zNTU4MzY3MDAwMDAwMDUsIC0zLjgxMjM1MDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yZjU1NzQzMjJlNTM0NTQ0YWJkMmI0ZjRmYTIyYWRlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYjZkMzFmMzgxMjc0YWQ1YTg1NzVhOGE3MTJiOWJiMSA9ICQoYDxkaXYgaWQ9Imh0bWxfZGI2ZDMxZjM4MTI3NGFkNWE4NTc1YThhNzEyYjliYjEiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zNTU4MzY3MDAwMDAwMDUsIC0zLjgxMjM1MDJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8yZjU1NzQzMjJlNTM0NTQ0YWJkMmI0ZjRmYTIyYWRlZC5zZXRDb250ZW50KGh0bWxfZGI2ZDMxZjM4MTI3NGFkNWE4NTc1YThhNzEyYjliYjEpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8zNmU4ZTFhM2Q1ZGE0MThkYWVjZWRkNTM0YWQ0YzQyZi5iaW5kUG9wdXAocG9wdXBfMmY1NTc0MzIyZTUzNDU0NGFiZDJiNGY0ZmEyMmFkZWQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83N2MyYWI1MDAwOTM0N2I3OTkyOGFiOWM1NjhjN2YxNCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI0OTIxNTAwMDAwMDA1LCAtMy42NDM0MjE2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTc1ODkzMGQxYzdmNGI5YjliOWQ3ZmUwN2ZlMTdlYmYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmY5OTI4YTVlYWZkNDEyM2FlYTMxZmRkMTY2YTg1YzEgPSAkKGA8ZGl2IGlkPSJodG1sX2ZmOTkyOGE1ZWFmZDQxMjNhZWEzMWZkZDE2NmE4NWMxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI0OTIxNTAwMDAwMDA1LCAtMy42NDM0MjE2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTc1ODkzMGQxYzdmNGI5YjliOWQ3ZmUwN2ZlMTdlYmYuc2V0Q29udGVudChodG1sX2ZmOTkyOGE1ZWFmZDQxMjNhZWEzMWZkZDE2NmE4NWMxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzdjMmFiNTAwMDkzNDdiNzk5MjhhYjljNTY4YzdmMTQuYmluZFBvcHVwKHBvcHVwX2E3NTg5MzBkMWM3ZjRiOWI5YjlkN2ZlMDdmZTE3ZWJmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjRkNTk4MzhhNzU1NDNlNGEwZjA3OWE0NzNlZjYyMWMgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxOTI4NzcwMDAwMDAwNSwgLTMuNjM1MjY4Nzk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzYwYWU3Njc1YjAwMDQ5Njg4ZGNjOTU5OWE2MTc4ZWU1ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzdjZjlmMDMzMWViYzQ2NTA4NzM2ODc4N2VhMGMwODQzID0gJChgPGRpdiBpZD0iaHRtbF83Y2Y5ZjAzMzFlYmM0NjUwODczNjg3ODdlYTBjMDg0MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTI4NzcwMDAwMDAwNSwgLTMuNjM1MjY4Nzk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzYwYWU3Njc1YjAwMDQ5Njg4ZGNjOTU5OWE2MTc4ZWU1LnNldENvbnRlbnQoaHRtbF83Y2Y5ZjAzMzFlYmM0NjUwODczNjg3ODdlYTBjMDg0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzI0ZDU5ODM4YTc1NTQzZTRhMGYwNzlhNDczZWY2MjFjLmJpbmRQb3B1cChwb3B1cF82MGFlNzY3NWIwMDA0OTY4OGRjYzk1OTlhNjE3OGVlNSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQ0MmZmMzNkN2Q3MTQxMjhiYmU0ZGRmNGM2NTExMTEwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zNjM1Njk4LCAtMy43MTI4MjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF81NjUxYTg5MzAxZTU0NDhmOTViNTQ5YjYzMjNmNjA3MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF84ZjYzYzU4ZDM4ZDQ0YzZmODEzYzYwNGVlNTFlOThmMCA9ICQoYDxkaXYgaWQ9Imh0bWxfOGY2M2M1OGQzOGQ0NGM2ZjgxM2M2MDRlZTUxZTk4ZjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4zNjM1Njk4LCAtMy43MTI4MjVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81NjUxYTg5MzAxZTU0NDhmOTViNTQ5YjYzMjNmNjA3MC5zZXRDb250ZW50KGh0bWxfOGY2M2M1OGQzOGQ0NGM2ZjgxM2M2MDRlZTUxZTk4ZjApOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl80NDJmZjMzZDdkNzE0MTI4YmJlNGRkZjRjNjUxMTExMC5iaW5kUG9wdXAocG9wdXBfNTY1MWE4OTMwMWU1NDQ4Zjk1YjU0OWI2MzIzZjYwNzApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9kMmU3OWI4MThjOGQ0ZTE2ODEzOGViMTg5MTM4OTViYiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMzExNSwgLTMuNjI4NzE5MjAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzg2MDUxYmNlODUyNzQ4MGQ4NGQ2MTQ0MDcxNGZmYTRhID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YwNTFiMmNhMDJlZjQ0NzE5YWJjY2QxYTBlYzIyMDRlID0gJChgPGRpdiBpZD0iaHRtbF9mMDUxYjJjYTAyZWY0NDcxOWFiY2NkMWEwZWMyMjA0ZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTMxMTUsIC0zLjYyODcxOTIwMDAwMDAwMDRdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84NjA1MWJjZTg1Mjc0ODBkODRkNjE0NDA3MTRmZmE0YS5zZXRDb250ZW50KGh0bWxfZjA1MWIyY2EwMmVmNDQ3MTlhYmNjZDFhMGVjMjIwNGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kMmU3OWI4MThjOGQ0ZTE2ODEzOGViMTg5MTM4OTViYi5iaW5kUG9wdXAocG9wdXBfODYwNTFiY2U4NTI3NDgwZDg0ZDYxNDQwNzE0ZmZhNGEpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9iZDM3OWRmODgwMzc0MjcwODhkODk2ZjMwNTZmYWFiOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDEzNjc2MjAwMDAwMDA1LCAtMy42NTE1NTNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iMTM1NmUxMzIzNTc0ZWUxYTc4OGZlYWEzNmExMjFlYyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hOGU5OTA3YmMxM2Y0NzYyYjAzYTRjMTc0Njg3YjhkNyA9ICQoYDxkaXYgaWQ9Imh0bWxfYThlOTkwN2JjMTNmNDc2MmIwM2E0YzE3NDY4N2I4ZDciIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTM2NzYyMDAwMDAwMDUsIC0zLjY1MTU1M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2IxMzU2ZTEzMjM1NzRlZTFhNzg4ZmVhYTM2YTEyMWVjLnNldENvbnRlbnQoaHRtbF9hOGU5OTA3YmMxM2Y0NzYyYjAzYTRjMTc0Njg3YjhkNyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2JkMzc5ZGY4ODAzNzQyNzA4OGQ4OTZmMzA1NmZhYWI4LmJpbmRQb3B1cChwb3B1cF9iMTM1NmUxMzIzNTc0ZWUxYTc4OGZlYWEzNmExMjFlYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzE0Y2Y2ODc3MWIyNTQ3NzViMjcxYmI2NDBhYjcxZjZmID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTkxMjE2LCAtMy43NjgzMjMzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTQyNjhlZmM1NzRkNDY5NWFiYjk5ZjA3MjgxNTg1NDcgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMDNjNTg2MTM0MDI0NDdkZThmMGE5OTQ3Mzk1NjM1OWUgPSAkKGA8ZGl2IGlkPSJodG1sXzAzYzU4NjEzNDAyNDQ3ZGU4ZjBhOTk0NzM5NTYzNTllIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk5MTIxNiwgLTMuNzY4MzIzM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk0MjY4ZWZjNTc0ZDQ2OTVhYmI5OWYwNzI4MTU4NTQ3LnNldENvbnRlbnQoaHRtbF8wM2M1ODYxMzQwMjQ0N2RlOGYwYTk5NDczOTU2MzU5ZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE0Y2Y2ODc3MWIyNTQ3NzViMjcxYmI2NDBhYjcxZjZmLmJpbmRQb3B1cChwb3B1cF85NDI2OGVmYzU3NGQ0Njk1YWJiOTlmMDcyODE1ODU0NykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzcyMDZkNzFmZDE0ZDQxNTI4YzJmYzg3YmYyMjA3NzBiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzAxMjc3LCAtMy42NDI4NzI2MDAwMDAwMDA1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYWFlY2EzMzI1OWYyNDQ1MDhlNGUxMDY3Y2VkOGIyYzEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWI0MWJkMDViMjIzNDM3M2EzZjEyMmM3NTFmZDNkZjIgPSAkKGA8ZGl2IGlkPSJodG1sXzliNDFiZDA1YjIyMzQzNzNhM2YxMjJjNzUxZmQzZGYyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwMTI3NywgLTMuNjQyODcyNjAwMDAwMDAwNV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2FhZWNhMzMyNTlmMjQ0NTA4ZTRlMTA2N2NlZDhiMmMxLnNldENvbnRlbnQoaHRtbF85YjQxYmQwNWIyMjM0MzczYTNmMTIyYzc1MWZkM2RmMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyMDZkNzFmZDE0ZDQxNTI4YzJmYzg3YmYyMjA3NzBiLmJpbmRQb3B1cChwb3B1cF9hYWVjYTMzMjU5ZjI0NDUwOGU0ZTEwNjdjZWQ4YjJjMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzhkYjA4ZTA5NGMzMDQyMWZiN2U4NGVmMzA2ZGRjNzc4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MjcyNDU3MDAwMDAwMSwgLTMuNjQ2NjA5N10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q5ZWE5MTRlODk4OTRlMjZiMzM3MmEyOWMwNjQzNTY5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2YxNmVhZWYyOGZhZDQxMDI4YWQwZjZkMTNiNjk0NTdmID0gJChgPGRpdiBpZD0iaHRtbF9mMTZlYWVmMjhmYWQ0MTAyOGFkMGY2ZDEzYjY5NDU3ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUyNzI0NTcwMDAwMDAxLCAtMy42NDY2MDk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDllYTkxNGU4OTg5NGUyNmIzMzcyYTI5YzA2NDM1Njkuc2V0Q29udGVudChodG1sX2YxNmVhZWYyOGZhZDQxMDI4YWQwZjZkMTNiNjk0NTdmKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGRiMDhlMDk0YzMwNDIxZmI3ZTg0ZWYzMDZkZGM3NzguYmluZFBvcHVwKHBvcHVwX2Q5ZWE5MTRlODk4OTRlMjZiMzM3MmEyOWMwNjQzNTY5KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZmRjZjNkMjQ0NjhjNGVhNGFiMzRkZDE1YjdhNGYzZTkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyODUyOTIsIC0zLjY0MzE5MTMwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82YzU2MTdlMWQyNTQ0Y2I5YjU1ZTAwMWZlOWIyOTE5ZiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80OWZhZmJkYWFmNDQ0Yzk2OWM3MTU3NzBkZTg3NDcxOSA9ICQoYDxkaXYgaWQ9Imh0bWxfNDlmYWZiZGFhZjQ0NGM5NjljNzE1NzcwZGU4NzQ3MTkiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjg1MjkyLCAtMy42NDMxOTEzMDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmM1NjE3ZTFkMjU0NGNiOWI1NWUwMDFmZTliMjkxOWYuc2V0Q29udGVudChodG1sXzQ5ZmFmYmRhYWY0NDRjOTY5YzcxNTc3MGRlODc0NzE5KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZmRjZjNkMjQ0NjhjNGVhNGFiMzRkZDE1YjdhNGYzZTkuYmluZFBvcHVwKHBvcHVwXzZjNTYxN2UxZDI1NDRjYjliNTVlMDAxZmU5YjI5MTlmKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjY4YThhNzVjN2Y1NDhjMGJkMTdjMjQ0MTUzZWE2YzcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQyMTI1MTcwMDAwMDAwNiwgLTMuNjYwOTY2NTAwMDAwMDAwMl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzEwOGMyYmI0MTE0NjRhMzdiOWJiZTg3YjkxMmYwYmM3ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzJmNDQ3MWFkMjQ1OTRhZjBhODgzOGU4Y2QwY2E1ZGFjID0gJChgPGRpdiBpZD0iaHRtbF8yZjQ0NzFhZDI0NTk0YWYwYTg4MzhlOGNkMGNhNWRhYyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQyMTI1MTcwMDAwMDAwNiwgLTMuNjYwOTY2NTAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzEwOGMyYmI0MTE0NjRhMzdiOWJiZTg3YjkxMmYwYmM3LnNldENvbnRlbnQoaHRtbF8yZjQ0NzFhZDI0NTk0YWYwYTg4MzhlOGNkMGNhNWRhYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y2OGE4YTc1YzdmNTQ4YzBiZDE3YzI0NDE1M2VhNmM3LmJpbmRQb3B1cChwb3B1cF8xMDhjMmJiNDExNDY0YTM3YjliYmU4N2I5MTJmMGJjNykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NkNGNmNjZlYTIyZDRjZGFiNjZlNmYxZmI0NGM0MGQ2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc4OTY1MDAwMDAwMDQsIC0zLjYzNjMyNTJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8zODdmMjA3MzU5MWU0YWFkOWVjNTc4YTU4ZDlhZTE1MCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zNjM0OGQ0ZjM2Y2I0YTQ2OTdkYTFlZGQ0YTkwZWRjMiA9ICQoYDxkaXYgaWQ9Imh0bWxfMzYzNDhkNGYzNmNiNGE0Njk3ZGExZWRkNGE5MGVkYzIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41Mjc4OTY1MDAwMDAwMDQsIC0zLjYzNjMyNTJdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF8zODdmMjA3MzU5MWU0YWFkOWVjNTc4YTU4ZDlhZTE1MC5zZXRDb250ZW50KGh0bWxfMzYzNDhkNGYzNmNiNGE0Njk3ZGExZWRkNGE5MGVkYzIpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9jZDRjZjY2ZWEyMmQ0Y2RhYjY2ZTZmMWZiNDRjNDBkNi5iaW5kUG9wdXAocG9wdXBfMzg3ZjIwNzM1OTFlNGFhZDllYzU3OGE1OGQ5YWUxNTApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83MGJjZGYzNDYzNzY0OWY3YjhlMzZlMWNlM2I2NDkxYyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDQ1OTg5OSwgLTMuNjYxMjQ2ODk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUwY2YxMDVmZDk1ZDRhNzg5YTEzMmY2N2JjZTJiMjIwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzk1MGJlNGVhMzE5ZDQ1OTBiMDcwODgyNWYwMjBmYzM3ID0gJChgPGRpdiBpZD0iaHRtbF85NTBiZTRlYTMxOWQ0NTkwYjA3MDg4MjVmMDIwZmMzNyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ0NTk4OTksIC0zLjY2MTI0Njg5OTk5OTk5OTZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MGNmMTA1ZmQ5NWQ0YTc4OWExMzJmNjdiY2UyYjIyMC5zZXRDb250ZW50KGh0bWxfOTUwYmU0ZWEzMTlkNDU5MGIwNzA4ODI1ZjAyMGZjMzcpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83MGJjZGYzNDYzNzY0OWY3YjhlMzZlMWNlM2I2NDkxYy5iaW5kUG9wdXAocG9wdXBfNTBjZjEwNWZkOTVkNGE3ODlhMTMyZjY3YmNlMmIyMjApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8xODA0ZDgxOGFlZDk0ZWJkOTNlNmU3MWRlODk2MDkyOCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTIwNTg1Nzk5OTk5OTksIC0zLjY1NTI1NDIwMDAwMDAwMDNdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NjUyNDA2NGYxYjY0NGE2YTAzYmM2MzZiMDEyZDI4NiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wYjA2MjA0NDRhZmQ0Y2JlODNmNmU2NzYyOTJkMTFiMiA9ICQoYDxkaXYgaWQ9Imh0bWxfMGIwNjIwNDQ0YWZkNGNiZTgzZjZlNjc2MjkyZDExYjIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjA1ODU3OTk5OTk5OSwgLTMuNjU1MjU0MjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzY2NTI0MDY0ZjFiNjQ0YTZhMDNiYzYzNmIwMTJkMjg2LnNldENvbnRlbnQoaHRtbF8wYjA2MjA0NDRhZmQ0Y2JlODNmNmU2NzYyOTJkMTFiMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzE4MDRkODE4YWVkOTRlYmQ5M2U2ZTcxZGU4OTYwOTI4LmJpbmRQb3B1cChwb3B1cF82NjUyNDA2NGYxYjY0NGE2YTAzYmM2MzZiMDEyZDI4NikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzBhMDhkNmUwODIxMTRlYjZhNjc3NTM0YzE1Mzk3YjY0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4wMDczMjU2LCAtNi4xMjc1NTM0MDAwMDAwMDFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jZjFkMThmMGUwYWQ0N2M2OTA5ZmI0NzYyYzg3ZTRkNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wZDgwYjFlOTA0N2E0YzU2YmM0MWQ5YjZkZDExNDNkZSA9ICQoYDxkaXYgaWQ9Imh0bWxfMGQ4MGIxZTkwNDdhNGM1NmJjNDFkOWI2ZGQxMTQzZGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC4wMDczMjU2LCAtNi4xMjc1NTM0MDAwMDAwMDFdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9jZjFkMThmMGUwYWQ0N2M2OTA5ZmI0NzYyYzg3ZTRkNi5zZXRDb250ZW50KGh0bWxfMGQ4MGIxZTkwNDdhNGM1NmJjNDFkOWI2ZGQxMTQzZGUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl8wYTA4ZDZlMDgyMTE0ZWI2YTY3NzUzNGMxNTM5N2I2NC5iaW5kUG9wdXAocG9wdXBfY2YxZDE4ZjBlMGFkNDdjNjkwOWZiNDc2MmM4N2U0ZDYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81MWI1MTBiZDZiM2M0OTY3YjgzMzA3YTBhZmM3ZmRlZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTM1NjIsIC0zLjYxNjM0MDIwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9iNjAxMDQyYzFhZmY0MzM3YTExZTRiYjQ0Zjc1YTQ3ZSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF81MTY5NjE2N2M0MDE0NDMxYTVhNmE2MzZhMmY5MmY1NSA9ICQoYDxkaXYgaWQ9Imh0bWxfNTE2OTYxNjdjNDAxNDQzMWE1YTZhNjM2YTJmOTJmNTUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MzU2MiwgLTMuNjE2MzQwMjAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I2MDEwNDJjMWFmZjQzMzdhMTFlNGJiNDRmNzVhNDdlLnNldENvbnRlbnQoaHRtbF81MTY5NjE2N2M0MDE0NDMxYTVhNmE2MzZhMmY5MmY1NSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzUxYjUxMGJkNmIzYzQ5NjdiODMzMDdhMGFmYzdmZGVkLmJpbmRQb3B1cChwb3B1cF9iNjAxMDQyYzFhZmY0MzM3YTExZTRiYjQ0Zjc1YTQ3ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2E0OTE2OGIwODJhZTRlNjliZGY3ZDVlYjA4NmU1MjQxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MzMyMDIsIC0zLjYzNTIzMjVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9kMjVhMGJkZDJhZmY0NTdlYWY4MDA4ZjY4OWZkMjY3MyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9hYzQwMTJlMzcxMTg0NjZkOTdhM2YwZDg1Mjk1YjY5ZSA9ICQoYDxkaXYgaWQ9Imh0bWxfYWM0MDEyZTM3MTE4NDY2ZDk3YTNmMGQ4NTI5NWI2OWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MzMyMDIsIC0zLjYzNTIzMjVdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF9kMjVhMGJkZDJhZmY0NTdlYWY4MDA4ZjY4OWZkMjY3My5zZXRDb250ZW50KGh0bWxfYWM0MDEyZTM3MTE4NDY2ZDk3YTNmMGQ4NTI5NWI2OWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9hNDkxNjhiMDgyYWU0ZTY5YmRmN2Q1ZWIwODZlNTI0MS5iaW5kUG9wdXAocG9wdXBfZDI1YTBiZGQyYWZmNDU3ZWFmODAwOGY2ODlmZDI2NzMpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl9lMmE4Zjg3MGYzMDQ0MmUzOWM1ZDdiOGRjOWUyYWI3OSA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDY5MjE3Nzk5OTk5OTk2LCAtMy42MjM5MzM2MDAwMDAwMDA0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYTAxMDM5MThmZTYxNGE5YmJiMGFhZjdmY2M4ZTNiMWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjJkNjFiZGRkMDVlNDcwYmIzNmM5ZjA5MjkxMzkxYzUgPSAkKGA8ZGl2IGlkPSJodG1sX2IyZDYxYmRkZDA1ZTQ3MGJiMzZjOWYwOTI5MTM5MWM1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDY5MjE3Nzk5OTk5OTk2LCAtMy42MjM5MzM2MDAwMDAwMDA0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTAxMDM5MThmZTYxNGE5YmJiMGFhZjdmY2M4ZTNiMWUuc2V0Q29udGVudChodG1sX2IyZDYxYmRkZDA1ZTQ3MGJiMzZjOWYwOTI5MTM5MWM1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZTJhOGY4NzBmMzA0NDJlMzljNWQ3YjhkYzllMmFiNzkuYmluZFBvcHVwKHBvcHVwX2EwMTAzOTE4ZmU2MTRhOWJiYjBhYWY3ZmNjOGUzYjFlKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzY0ZDNkMDg2ZDMwNGJjYWEwM2M3OGRjMjFjYWEyZGEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNzYyNjYsIC0zLjgwMDQ4MTZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8wMjZmMDAyNDI0NGQ0NmQxYWZmNWUxYjYxYTk2YmRiNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zZjcwNDMwODU3ODI0NzZjYWNhZGY4M2FkZmY5NWYwMyA9ICQoYDxkaXYgaWQ9Imh0bWxfM2Y3MDQzMDg1NzgyNDc2Y2FjYWRmODNhZGZmOTVmMDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTc2MjY2LCAtMy44MDA0ODE2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMDI2ZjAwMjQyNDRkNDZkMWFmZjVlMWI2MWE5NmJkYjQuc2V0Q29udGVudChodG1sXzNmNzA0MzA4NTc4MjQ3NmNhY2FkZjgzYWRmZjk1ZjAzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfYzY0ZDNkMDg2ZDMwNGJjYWEwM2M3OGRjMjFjYWEyZGEuYmluZFBvcHVwKHBvcHVwXzAyNmYwMDI0MjQ0ZDQ2ZDFhZmY1ZTFiNjFhOTZiZGI0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOTU5YTlkMmE0NTE1NGU2MDhiYzE0YWM0MzQ2ZGE3ODAgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ2MDUwMDM5OTk5OTk5NCwgLTMuNjYwNTg1Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0YzA4OGIzNmU5NTRhZjE5MGY1NmYwODc0NWY5MTc5ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E2MjcyZjQzZTI2MjQ0MWViMGZlMmFjNjc0NTViZjBlID0gJChgPGRpdiBpZD0iaHRtbF9hNjI3MmY0M2UyNjI0NDFlYjBmZTJhYzY3NDU1YmYwZSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ2MDUwMDM5OTk5OTk5NCwgLTMuNjYwNTg1Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0YzA4OGIzNmU5NTRhZjE5MGY1NmYwODc0NWY5MTc5LnNldENvbnRlbnQoaHRtbF9hNjI3MmY0M2UyNjI0NDFlYjBmZTJhYzY3NDU1YmYwZSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk1OWE5ZDJhNDUxNTRlNjA4YmMxNGFjNDM0NmRhNzgwLmJpbmRQb3B1cChwb3B1cF83NGMwODhiMzZlOTU0YWYxOTBmNTZmMDg3NDVmOTE3OSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzY2NzU4OWZjMTZlMzQ4MDY4YWM1MjZkMDQ4ZTA1N2Q0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NjM0Mjg2LCAtMy42MTI3NjE0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTgxZmUzZjQzM2FkNDUzMDk5NDViMzA4YWExMDQ1YTkgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGIxZmJmMWIzYmVlNGE2Mjg1NTUxYzM4NGFhMDA3ZGQgPSAkKGA8ZGl2IGlkPSJodG1sXzRiMWZiZjFiM2JlZTRhNjI4NTU1MWMzODRhYTAwN2RkIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDYzNDI4NiwgLTMuNjEyNzYxNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4MWZlM2Y0MzNhZDQ1MzA5OTQ1YjMwOGFhMTA0NWE5LnNldENvbnRlbnQoaHRtbF80YjFmYmYxYjNiZWU0YTYyODU1NTFjMzg0YWEwMDdkZCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY2NzU4OWZjMTZlMzQ4MDY4YWM1MjZkMDQ4ZTA1N2Q0LmJpbmRQb3B1cChwb3B1cF9lODFmZTNmNDMzYWQ0NTMwOTk0NWIzMDhhYTEwNDVhOSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzcyNmVhZDQ3NThmMTRhZDNhYTNiNjlhYmU2MDlhNWM0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NzkxLCAtMy42NDYwNTI3OTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNTIzMmIzM2Y0MTkzNGU3NDhlOWZmMDE4YjBmOWQwOTAgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDg1NTJjZWRmZTkzNGU4ZTg0ZjYxMGRmNmQ2YjYzZTUgPSAkKGA8ZGl2IGlkPSJodG1sXzQ4NTUyY2VkZmU5MzRlOGU4NGY2MTBkZjZkNmI2M2U1IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDc5MSwgLTMuNjQ2MDUyNzk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzUyMzJiMzNmNDE5MzRlNzQ4ZTlmZjAxOGIwZjlkMDkwLnNldENvbnRlbnQoaHRtbF80ODU1MmNlZGZlOTM0ZThlODRmNjEwZGY2ZDZiNjNlNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzcyNmVhZDQ3NThmMTRhZDNhYTNiNjlhYmU2MDlhNWM0LmJpbmRQb3B1cChwb3B1cF81MjMyYjMzZjQxOTM0ZTc0OGU5ZmYwMThiMGY5ZDA5MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzM2OWUyY2Q4N2QwMzRiMzQ4M2E4YTI5ZTY5YjI2OWNhID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzE1OTI1LCAtMy42Mzg2MzQzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMWQ2ZTY5OWVlZjAyNGI5YmEzN2UyYzQ3NTQyODcwN2UgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZjY2MzU0YzFjM2I5NDkzM2FiOTk2Nzc0NTZkMTAwNDMgPSAkKGA8ZGl2IGlkPSJodG1sX2Y2NjM1NGMxYzNiOTQ5MzNhYjk5Njc3NDU2ZDEwMDQzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMxNTkyNSwgLTMuNjM4NjM0M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzFkNmU2OTllZWYwMjRiOWJhMzdlMmM0NzU0Mjg3MDdlLnNldENvbnRlbnQoaHRtbF9mNjYzNTRjMWMzYjk0OTMzYWI5OTY3NzQ1NmQxMDA0Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM2OWUyY2Q4N2QwMzRiMzQ4M2E4YTI5ZTY5YjI2OWNhLmJpbmRQb3B1cChwb3B1cF8xZDZlNjk5ZWVmMDI0YjliYTM3ZTJjNDc1NDI4NzA3ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzgwOTIxNGIzODlkNjQwNWZiZWUwNWY3YWMyNmMyMzg2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTkxMzg2LCAtMy43MDgzNTM1MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMGY1NTIwNGZkZTJmNDcyMDk5ZDMzODZiY2Y2MDRiYTMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMTJiYWU3NTYzYTY5NGYxOTlhNThkOWZkYmE4M2UwZTMgPSAkKGA8ZGl2IGlkPSJodG1sXzEyYmFlNzU2M2E2OTRmMTk5YTU4ZDlmZGJhODNlMGUzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk5MTM4NiwgLTMuNzA4MzUzNTAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmNTUyMDRmZGUyZjQ3MjA5OWQzMzg2YmNmNjA0YmEzLnNldENvbnRlbnQoaHRtbF8xMmJhZTc1NjNhNjk0ZjE5OWE1OGQ5ZmRiYTgzZTBlMyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzgwOTIxNGIzODlkNjQwNWZiZWUwNWY3YWMyNmMyMzg2LmJpbmRQb3B1cChwb3B1cF8wZjU1MjA0ZmRlMmY0NzIwOTlkMzM4NmJjZjYwNGJhMykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2NhNGUwMDZmY2RiMTQ0NmY5MmY3YWE1ZTQzY2Y5ZmU0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MzgwNzE3LCAtMy42MjE0NDUyMDAwMDAwMDA2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfN2IwMjIxN2EwOTdhNDA0MDk5MTk2YzIzMzQyMjM5Y2QgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMGJiMGEwYTY3ZDBiNDIzZmI1NDkyYTYzYTQxNTE0ZTggPSAkKGA8ZGl2IGlkPSJodG1sXzBiYjBhMGE2N2QwYjQyM2ZiNTQ5MmE2M2E0MTUxNGU4IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDM4MDcxNywgLTMuNjIxNDQ1MjAwMDAwMDAwNl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzdiMDIyMTdhMDk3YTQwNDA5OTE5NmMyMzM0MjIzOWNkLnNldENvbnRlbnQoaHRtbF8wYmIwYTBhNjdkMGI0MjNmYjU0OTJhNjNhNDE1MTRlOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2NhNGUwMDZmY2RiMTQ0NmY5MmY3YWE1ZTQzY2Y5ZmU0LmJpbmRQb3B1cChwb3B1cF83YjAyMjE3YTA5N2E0MDQwOTkxOTZjMjMzNDIyMzljZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzZkZmNkYTFhOThmMjRjYzZhMDhiYTcyNmY0ZGNmZWI2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NjkxNjE3LCAtMy42MTAwODEyOTk5OTk5OTk2XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZmFlYTk5NzU0MWZjNDUzMzhiZWU4ZGM1NDIzMzRjYWEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOWQ2MDU0ZmE4YzQxNDJhYWJmYjQxMTBlNjA3ZDZjYzIgPSAkKGA8ZGl2IGlkPSJodG1sXzlkNjA1NGZhOGM0MTQyYWFiZmI0MTEwZTYwN2Q2Y2MyIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDY5MTYxNywgLTMuNjEwMDgxMjk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ZhZWE5OTc1NDFmYzQ1MzM4YmVlOGRjNTQyMzM0Y2FhLnNldENvbnRlbnQoaHRtbF85ZDYwNTRmYThjNDE0MmFhYmZiNDExMGU2MDdkNmNjMik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzZkZmNkYTFhOThmMjRjYzZhMDhiYTcyNmY0ZGNmZWI2LmJpbmRQb3B1cChwb3B1cF9mYWVhOTk3NTQxZmM0NTMzOGJlZThkYzU0MjMzNGNhYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RjOTI2YmMwOGFkMDRhMjE5YTY5MGM1ZTU2NmEwNjFiID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFszOS45NTk5NTU5MDAwMDAwMDQsIC00LjgyNDg4MjhdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82NDM5ZDI4ZDJhZTE0MWQ5OTVlNzVhNTRmNjcxMjcyZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lYTFjNjhiYTY3MmI0ZDM2OTRjZmRmYWM1ZDRmYzRhZSA9ICQoYDxkaXYgaWQ9Imh0bWxfZWExYzY4YmE2NzJiNGQzNjk0Y2ZkZmFjNWQ0ZmM0YWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPlszOS45NTk5NTU5MDAwMDAwMDQsIC00LjgyNDg4MjhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF82NDM5ZDI4ZDJhZTE0MWQ5OTVlNzVhNTRmNjcxMjcyZC5zZXRDb250ZW50KGh0bWxfZWExYzY4YmE2NzJiNGQzNjk0Y2ZkZmFjNWQ0ZmM0YWUpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl9kYzkyNmJjMDhhZDA0YTIxOWE2OTBjNWU1NjZhMDYxYi5iaW5kUG9wdXAocG9wdXBfNjQzOWQyOGQyYWUxNDFkOTk1ZTc1YTU0ZjY3MTI3MmQpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl83ZWM4ZTZkYzk5N2M0NzRmYjQwYzU2ZDJlYmJkYzNiNiA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDA5MDM2MSwgLTMuNjY3NjE4Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzUxYTRkOTI3NjY1OTQxMzNhYTE5OWU2NWJlYzk3ZGMwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzlhZTE5NTY5Y2Y3MTQzZGQ4MmY2ZDYyNDg1MjQ4M2VmID0gJChgPGRpdiBpZD0iaHRtbF85YWUxOTU2OWNmNzE0M2RkODJmNmQ2MjQ4NTI0ODNlZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQwOTAzNjEsIC0zLjY2NzYxODZdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF81MWE0ZDkyNzY2NTk0MTMzYWExOTllNjViZWM5N2RjMC5zZXRDb250ZW50KGh0bWxfOWFlMTk1NjljZjcxNDNkZDgyZjZkNjI0ODUyNDgzZWYpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl83ZWM4ZTZkYzk5N2M0NzRmYjQwYzU2ZDJlYmJkYzNiNi5iaW5kUG9wdXAocG9wdXBfNTFhNGQ5Mjc2NjU5NDEzM2FhMTk5ZTY1YmVjOTdkYzApCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl81MjM3MGZiZGIxODk0NDdlODI2ZGI2ZTQ2YTU1ZDlhNyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDY2ODkwMiwgLTMuNjY4MTYzOF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzhlMzhmOGNhMmJkYTQ1ZTliYzBiMzcyMjQ3YWYyZTY2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2RhMDg3YzlmZGY5NTQ2ZWM4ZmJmNmU5ZGIxNDAyNzE0ID0gJChgPGRpdiBpZD0iaHRtbF9kYTA4N2M5ZmRmOTU0NmVjOGZiZjZlOWRiMTQwMjcxNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQ2Njg5MDIsIC0zLjY2ODE2MzhdPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF84ZTM4ZjhjYTJiZGE0NWU5YmMwYjM3MjI0N2FmMmU2Ni5zZXRDb250ZW50KGh0bWxfZGEwODdjOWZkZjk1NDZlYzhmYmY2ZTlkYjE0MDI3MTQpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81MjM3MGZiZGIxODk0NDdlODI2ZGI2ZTQ2YTU1ZDlhNy5iaW5kUG9wdXAocG9wdXBfOGUzOGY4Y2EyYmRhNDVlOWJjMGIzNzIyNDdhZjJlNjYpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl8yYmYwOGM0OTRiNjk0NWQ5YmJiYmFlMDZkMDNjYjdiMyA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNDIxMzI5ODk5OTk5OTk2LCAtMy42Mjg1NzIyMDAwMDAwMDAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOWMyN2Y2ZjI2NDNkNDY2M2ExNTZiMTJiYWY5NzBmODIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNjc4YWM1YzcyMTkxNDFiZGE1YWRhYjllY2NiMjU1OTMgPSAkKGA8ZGl2IGlkPSJodG1sXzY3OGFjNWM3MjE5MTQxYmRhNWFkYWI5ZWNjYjI1NTkzIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxMzI5ODk5OTk5OTk2LCAtMy42Mjg1NzIyMDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWMyN2Y2ZjI2NDNkNDY2M2ExNTZiMTJiYWY5NzBmODIuc2V0Q29udGVudChodG1sXzY3OGFjNWM3MjE5MTQxYmRhNWFkYWI5ZWNjYjI1NTkzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMmJmMDhjNDk0YjY5NDVkOWJiYmJhZTA2ZDAzY2I3YjMuYmluZFBvcHVwKHBvcHVwXzljMjdmNmYyNjQzZDQ2NjNhMTU2YjEyYmFmOTcwZjgyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMGMwODMzOWQ5MzkyNGJjYWJlODE0NTdlOTIxMWI2ZTggPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNTQ5NDYsIC0zLjY2NDQ1NTYwMDAwMDAwMDZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jNDA5Zjk2M2U2MGY0ZjcxYTM3MDc1Mjk4NmRlMjMyNiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF80MzY2MWViZDFkMDI0ZmNkOGM0MDJkMGU0ODM5NmYyYiA9ICQoYDxkaXYgaWQ9Imh0bWxfNDM2NjFlYmQxZDAyNGZjZDhjNDAyZDBlNDgzOTZmMmIiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTU0OTQ2LCAtMy42NjQ0NTU2MDAwMDAwMDA2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzQwOWY5NjNlNjBmNGY3MWEzNzA3NTI5ODZkZTIzMjYuc2V0Q29udGVudChodG1sXzQzNjYxZWJkMWQwMjRmY2Q4YzQwMmQwZTQ4Mzk2ZjJiKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMGMwODMzOWQ5MzkyNGJjYWJlODE0NTdlOTIxMWI2ZTguYmluZFBvcHVwKHBvcHVwX2M0MDlmOTYzZTYwZjRmNzFhMzcwNzUyOTg2ZGUyMzI2KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfYzk3ZjRkMGMyNjVkNDM4MGFiY2U1YzM0YWI2M2U0ZDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM2NDQ0MywgLTMuNzEwMzk3M10sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBmNzU3NzUzNmY0MTQxNWZiMTcyYTUyNWY1OTUyM2ZiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2MwYTA2MWRjMjU2ZjQyN2NiNmYyMjE0NTZjNTlmZThjID0gJChgPGRpdiBpZD0iaHRtbF9jMGEwNjFkYzI1NmY0MjdjYjZmMjIxNDU2YzU5ZmU4YyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM2NDQ0MywgLTMuNzEwMzk3M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBmNzU3NzUzNmY0MTQxNWZiMTcyYTUyNWY1OTUyM2ZiLnNldENvbnRlbnQoaHRtbF9jMGEwNjFkYzI1NmY0MjdjYjZmMjIxNDU2YzU5ZmU4Yyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2M5N2Y0ZDBjMjY1ZDQzODBhYmNlNWMzNGFiNjNlNGQ3LmJpbmRQb3B1cChwb3B1cF8wZjc1Nzc1MzZmNDE0MTVmYjE3MmE1MjVmNTk1MjNmYikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2U0Yzg0YzA4ZjI1MDQyN2FiOTgzNzYyMmNjZGUwMTM4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjc0NjQ1LCAtMy42NDYxMTgzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYzdlNmU4ZjIyYzRhNDE2ZWE3MjIxMTc4M2IyOGUxNmUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNDBiZmQ4ODQ1NzRlNGYzZTgxZjRmZGM2YWI1NDc3NmIgPSAkKGA8ZGl2IGlkPSJodG1sXzQwYmZkODg0NTc0ZTRmM2U4MWY0ZmRjNmFiNTQ3NzZiIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI3NDY0NSwgLTMuNjQ2MTE4M108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2M3ZTZlOGYyMmM0YTQxNmVhNzIyMTE3ODNiMjhlMTZlLnNldENvbnRlbnQoaHRtbF80MGJmZDg4NDU3NGU0ZjNlODFmNGZkYzZhYjU0Nzc2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2U0Yzg0YzA4ZjI1MDQyN2FiOTgzNzYyMmNjZGUwMTM4LmJpbmRQb3B1cChwb3B1cF9jN2U2ZThmMjJjNGE0MTZlYTcyMjExNzgzYjI4ZTE2ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzQ2MDJkMWFiYzJkYzQ4ZjFiYWM2ODM5MTFmYWEyMjg0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTk5NDc2LCAtMy42MzA4OTM2MDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfMmI4YjQ1MDI5NDI4NGVmMGJiMjE0YjJlZDIyMjQ0MjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNGUyMjI2YmM4OTZiNDRhOThjNGQ4YTAyYTMwY2ExNzAgPSAkKGA8ZGl2IGlkPSJodG1sXzRlMjIyNmJjODk2YjQ0YTk4YzRkOGEwMmEzMGNhMTcwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5OTQ3NiwgLTMuNjMwODkzNjAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzJiOGI0NTAyOTQyODRlZjBiYjIxNGIyZWQyMjI0NDIyLnNldENvbnRlbnQoaHRtbF80ZTIyMjZiYzg5NmI0NGE5OGM0ZDhhMDJhMzBjYTE3MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzQ2MDJkMWFiYzJkYzQ4ZjFiYWM2ODM5MTFmYWEyMjg0LmJpbmRQb3B1cChwb3B1cF8yYjhiNDUwMjk0Mjg0ZWYwYmIyMTRiMmVkMjIyNDQyMikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzEyZmIwZThhYWJjNzQ3YmM4ZTNjZDdhMTNiMmRlNWU0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MjE0Njc1LCAtMy42Mjg2OTEzOTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWI3ODliMzYwMWUzNDcyNWI2MTJkNmE3NmIyYWQ3NjIgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYzQ3MzQ2ZDkyNzBmNDY1MjhmNmI5OWQ1N2RiOTIyNWYgPSAkKGA8ZGl2IGlkPSJodG1sX2M0NzM0NmQ5MjcwZjQ2NTI4ZjZiOTlkNTdkYjkyMjVmIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDIxNDY3NSwgLTMuNjI4NjkxMzk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2ViNzg5YjM2MDFlMzQ3MjViNjEyZDZhNzZiMmFkNzYyLnNldENvbnRlbnQoaHRtbF9jNDczNDZkOTI3MGY0NjUyOGY2Yjk5ZDU3ZGI5MjI1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzEyZmIwZThhYWJjNzQ3YmM4ZTNjZDdhMTNiMmRlNWU0LmJpbmRQb3B1cChwb3B1cF9lYjc4OWIzNjAxZTM0NzI1YjYxMmQ2YTc2YjJhZDc2MikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzE1NWFhNDY4NWI2MDQ3MjFiYWFhMzQ4MjgxZjBlZmUxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zNjY1ODE3MDAwMDAwMDUsIC0zLjcxMDkyNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q2MWNkY2NhMDhlNTQ5ZmI5OTk5OGU4MTFlN2ExOTQ4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzQwZDQ4NWJkZWI2NjQ3ZDg5MDdhOWQzODQ4ZGViMmQ0ID0gJChgPGRpdiBpZD0iaHRtbF80MGQ0ODViZGViNjY0N2Q4OTA3YTlkMzg0OGRlYjJkNCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM2NjU4MTcwMDAwMDAwNSwgLTMuNzEwOTI1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfZDYxY2RjY2EwOGU1NDlmYjk5OTk4ZTgxMWU3YTE5NDguc2V0Q29udGVudChodG1sXzQwZDQ4NWJkZWI2NjQ3ZDg5MDdhOWQzODQ4ZGViMmQ0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMTU1YWE0Njg1YjYwNDcyMWJhYWEzNDgyODFmMGVmZTEuYmluZFBvcHVwKHBvcHVwX2Q2MWNkY2NhMDhlNTQ5ZmI5OTk5OGU4MTFlN2ExOTQ4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNjYzMmRmN2M4MDNhNGI4ZmJkZDUxZjY4ZWJkZGI0OTIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxODk0MDUwMDAwMDAwNSwgLTMuODAxNjE3NzAwMDAwMDAwNF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2Q0MTY4YmUyOWMzODRkZjNhNDJiNjc4MjkxNWFhZDRiID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzU0NTA3NzZhZDI2YzQ3ODZiNzU4MGU2NGEzMzZjOTZiID0gJChgPGRpdiBpZD0iaHRtbF81NDUwNzc2YWQyNmM0Nzg2Yjc1ODBlNjRhMzM2Yzk2YiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxODk0MDUwMDAwMDAwNSwgLTMuODAxNjE3NzAwMDAwMDAwNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Q0MTY4YmUyOWMzODRkZjNhNDJiNjc4MjkxNWFhZDRiLnNldENvbnRlbnQoaHRtbF81NDUwNzc2YWQyNmM0Nzg2Yjc1ODBlNjRhMzM2Yzk2Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY2MzJkZjdjODAzYTRiOGZiZGQ1MWY2OGViZGRiNDkyLmJpbmRQb3B1cChwb3B1cF9kNDE2OGJlMjljMzg0ZGYzYTQyYjY3ODI5MTVhYWQ0YikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RlN2M5ZTY3ZDFmNjQ5YTQ5MzYzYzAzMjZmODUwYzA2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzIxNDkxMDAwMDAwMDUsIC0zLjYzOTUzNV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2M0NDk5ZmI2ZDA4MTRmMjc5ZTllZWU5MDk4NTQ2YTU0ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sX2E3MzVmN2NhODgzMjRiOTZiZGQ3ZmViMjcwMWI5ZjYyID0gJChgPGRpdiBpZD0iaHRtbF9hNzM1ZjdjYTg4MzI0Yjk2YmRkN2ZlYjI3MDFiOWY2MiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMjE0OTEwMDAwMDAwNSwgLTMuNjM5NTM1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYzQ0OTlmYjZkMDgxNGYyNzllOWVlZTkwOTg1NDZhNTQuc2V0Q29udGVudChodG1sX2E3MzVmN2NhODgzMjRiOTZiZGQ3ZmViMjcwMWI5ZjYyKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZGU3YzllNjdkMWY2NDlhNDkzNjNjMDMyNmY4NTBjMDYuYmluZFBvcHVwKHBvcHVwX2M0NDk5ZmI2ZDA4MTRmMjc5ZTllZWU5MDk4NTQ2YTU0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMzliMDEzYWRkM2YzNGQzNzljNWI4NmNiOTU5NWFjZmQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQ3MTMwMTUsIC0zLjYwNzg1MDcwMDAwMDAwMDZdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9hN2M3OGM0ZTQzMjA0OGY1OGY0YzU4ZDdhZDBmOGY0MiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wNTQyZjRmY2Q1Mjk0ZTZlOTNmODljMWNjNjRhYzUwYyA9ICQoYDxkaXYgaWQ9Imh0bWxfMDU0MmY0ZmNkNTI5NGU2ZTkzZjg5YzFjYzY0YWM1MGMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40NzEzMDE1LCAtMy42MDc4NTA3MDAwMDAwMDA2XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfYTdjNzhjNGU0MzIwNDhmNThmNGM1OGQ3YWQwZjhmNDIuc2V0Q29udGVudChodG1sXzA1NDJmNGZjZDUyOTRlNmU5M2Y4OWMxY2M2NGFjNTBjKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMzliMDEzYWRkM2YzNGQzNzljNWI4NmNiOTU5NWFjZmQuYmluZFBvcHVwKHBvcHVwX2E3Yzc4YzRlNDMyMDQ4ZjU4ZjRjNThkN2FkMGY4ZjQyKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfN2YxMmJkZDJkYzU4NGIzYTljMWQ0M2UxY2MzMWYzMDcgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUxODI5NjcsIC0zLjY1MzM5NTFdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF82MGJlNjAxZWJmNWQ0MGQwYWMxNDcwMzBjZWIwZmRmNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8wMmNiYzUwYWMzNDI0MWNhYmQ2YzA4YTM1ODdhN2UyNSA9ICQoYDxkaXYgaWQ9Imh0bWxfMDJjYmM1MGFjMzQyNDFjYWJkNmMwOGEzNTg3YTdlMjUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MTgyOTY3LCAtMy42NTMzOTUxXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNjBiZTYwMWViZjVkNDBkMGFjMTQ3MDMwY2ViMGZkZjQuc2V0Q29udGVudChodG1sXzAyY2JjNTBhYzM0MjQxY2FiZDZjMDhhMzU4N2E3ZTI1KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfN2YxMmJkZDJkYzU4NGIzYTljMWQ0M2UxY2MzMWYzMDcuYmluZFBvcHVwKHBvcHVwXzYwYmU2MDFlYmY1ZDQwZDBhYzE0NzAzMGNlYjBmZGY0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMDk4YjExNDM4MTMzNDk2YWE4M2VlZjQ4YjE1YTdjZGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5MzAzMiwgLTMuNzAxMDA4Nzk5OTk5OTk5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwX2JiODFlYjk1MmQxMzQ0OGE4MDkyYjkyMGY2ZmYwYjE2ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzFjNTM4NGQ3YjBmYjRkNjdhOGQyM2I1NDU4NzJlZjUzID0gJChgPGRpdiBpZD0iaHRtbF8xYzUzODRkN2IwZmI0ZDY3YThkMjNiNTQ1ODcyZWY1MyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5MzAzMiwgLTMuNzAxMDA4Nzk5OTk5OTk5NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2JiODFlYjk1MmQxMzQ0OGE4MDkyYjkyMGY2ZmYwYjE2LnNldENvbnRlbnQoaHRtbF8xYzUzODRkN2IwZmI0ZDY3YThkMjNiNTQ1ODcyZWY1Myk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzA5OGIxMTQzODEzMzQ5NmFhODNlZWY0OGIxNWE3Y2RkLmJpbmRQb3B1cChwb3B1cF9iYjgxZWI5NTJkMTM0NDhhODA5MmI5MjBmNmZmMGIxNikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzNiY2MxNGJmOWJjYzRiZDNiNGJkYWI1MTI5NDgxMTgxID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTk5NjcxMDAwMDAwMDUsIC0zLjY2NDY2OF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzcwMWJhYTJkZjQzYTRjOTA5NjM0Y2I2ODgzODc3YjI4ID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzBmNGQyN2E2YzEwNTRjZjRiZDQ1NzBhNjFlMjNiMTQxID0gJChgPGRpdiBpZD0iaHRtbF8wZjRkMjdhNmMxMDU0Y2Y0YmQ0NTcwYTYxZTIzYjE0MSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5OTk2NzEwMDAwMDAwNSwgLTMuNjY0NjY4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzAxYmFhMmRmNDNhNGM5MDk2MzRjYjY4ODM4NzdiMjguc2V0Q29udGVudChodG1sXzBmNGQyN2E2YzEwNTRjZjRiZDQ1NzBhNjFlMjNiMTQxKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfM2JjYzE0YmY5YmNjNGJkM2I0YmRhYjUxMjk0ODExODEuYmluZFBvcHVwKHBvcHVwXzcwMWJhYTJkZjQzYTRjOTA5NjM0Y2I2ODgzODc3YjI4KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNGZkMzIyMGQ4YjI4NDM5NmExNDFkZjM0MTk4OTNmZjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUyNjg5MDEsIC0zLjY0NDg2MTRdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8xMzkwMGEwMGViOTM0ODIwODFiZTBiYjhjNzMxNmJjNCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kYmU0ODgyYzMwZjQ0MGNkYmE5Nzc0NDE0YzBjNmUxNCA9ICQoYDxkaXYgaWQ9Imh0bWxfZGJlNDg4MmMzMGY0NDBjZGJhOTc3NDQxNGMwYzZlMTQiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC41MjY4OTAxLCAtMy42NDQ4NjE0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMTM5MDBhMDBlYjkzNDgyMDgxYmUwYmI4YzczMTZiYzQuc2V0Q29udGVudChodG1sX2RiZTQ4ODJjMzBmNDQwY2RiYTk3NzQ0MTRjMGM2ZTE0KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNGZkMzIyMGQ4YjI4NDM5NmExNDFkZjM0MTk4OTNmZjIuYmluZFBvcHVwKHBvcHVwXzEzOTAwYTAwZWI5MzQ4MjA4MWJlMGJiOGM3MzE2YmM0KQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfOTRhMDFkMWJkNWM4NGU2ZWJmMzcyOWM2NWU3N2E2ZGYgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxMzcwOTEsIC0zLjY1MTU5NDI5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF8yNTlkYWU4Yzc1MDA0ZjhmYTNjNTIzOWYwN2U4ODNlYSA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF85ZGVlZmIzODVhMzI0MjAwYTE5Yzg1ZWQzNDcwNjAwZSA9ICQoYDxkaXYgaWQ9Imh0bWxfOWRlZWZiMzg1YTMyNDIwMGExOWM4NWVkMzQ3MDYwMGUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTM3MDkxLCAtMy42NTE1OTQyOTk5OTk5OTk3XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfMjU5ZGFlOGM3NTAwNGY4ZmEzYzUyMzlmMDdlODgzZWEuc2V0Q29udGVudChodG1sXzlkZWVmYjM4NWEzMjQyMDBhMTljODVlZDM0NzA2MDBlKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOTRhMDFkMWJkNWM4NGU2ZWJmMzcyOWM2NWU3N2E2ZGYuYmluZFBvcHVwKHBvcHVwXzI1OWRhZThjNzUwMDRmOGZhM2M1MjM5ZjA3ZTg4M2VhKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMjcyNzQ4ZDk1ZGY5NDFjODlmZTkxMGMyZjZiNzJkMzUgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQzOTQ0MjEsIC0zLjYyMTA3NjM5OTk5OTk5OThdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84MWIwOTYyNDI5YTc0MzFkYWJhYTgyMDQwY2MyY2E0ZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9kNmFiZDc2MzM4ZDU0YmZkODIyMDI2ZGY1MzEwZDdjMyA9ICQoYDxkaXYgaWQ9Imh0bWxfZDZhYmQ3NjMzOGQ1NGJmZDgyMjAyNmRmNTMxMGQ3YzMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40Mzk0NDIxLCAtMy42MjEwNzYzOTk5OTk5OTk4XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfODFiMDk2MjQyOWE3NDMxZGFiYWE4MjA0MGNjMmNhNGQuc2V0Q29udGVudChodG1sX2Q2YWJkNzYzMzhkNTRiZmQ4MjIwMjZkZjUzMTBkN2MzKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjcyNzQ4ZDk1ZGY5NDFjODlmZTkxMGMyZjZiNzJkMzUuYmluZFBvcHVwKHBvcHVwXzgxYjA5NjI0MjlhNzQzMWRhYmFhODIwNDBjYzJjYTRkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNDc2NTQ3MWU0MWVlNDc5Mjk4NTM1NmNiYTg3YTVmMjIgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNjI2NjIsIC0zLjYyMzkwNDldLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83OTlkZDQyNjc5ZTI0NDkwYmVkNDQ4MzgwYzQxMzBlZCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8yMWFmNWM4OTBlNzg0ODBmODZlNzQxZmZhYWRhN2FiMCA9ICQoYDxkaXYgaWQ9Imh0bWxfMjFhZjVjODkwZTc4NDgwZjg2ZTc0MWZmYWFkYTdhYjAiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTYyNjYyLCAtMy42MjM5MDQ5XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNzk5ZGQ0MjY3OWUyNDQ5MGJlZDQ0ODM4MGM0MTMwZWQuc2V0Q29udGVudChodG1sXzIxYWY1Yzg5MGU3ODQ4MGY4NmU3NDFmZmFhZGE3YWIwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNDc2NTQ3MWU0MWVlNDc5Mjk4NTM1NmNiYTg3YTVmMjIuYmluZFBvcHVwKHBvcHVwXzc5OWRkNDI2NzllMjQ0OTBiZWQ0NDgzODBjNDEzMGVkKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNjYzNWUzYzc5NjZjNGYyMWE5YmMwNmI4NzQ3OGM4NDkgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjM5NjUzNjEwMDAwMDAwNiwgLTMuNjYyMDM2Mjk5OTk5OTk5Nl0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzc0OTA0NWI4NjQ3ODRmMTJiZjAxYWYxZTBkNjBiMmZjID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzAzYjFmZGNkNWJjMjQ0YzhiZGIxZWVlYmZlOTA2NjE1ID0gJChgPGRpdiBpZD0iaHRtbF8wM2IxZmRjZDViYzI0NGM4YmRiMWVlZWJmZTkwNjYxNSIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjM5NjUzNjEwMDAwMDAwNiwgLTMuNjYyMDM2Mjk5OTk5OTk5Nl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzc0OTA0NWI4NjQ3ODRmMTJiZjAxYWYxZTBkNjBiMmZjLnNldENvbnRlbnQoaHRtbF8wM2IxZmRjZDViYzI0NGM4YmRiMWVlZWJmZTkwNjYxNSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzY2MzVlM2M3OTY2YzRmMjFhOWJjMDZiODc0NzhjODQ5LmJpbmRQb3B1cChwb3B1cF83NDkwNDViODY0Nzg0ZjEyYmYwMWFmMWUwZDYwYjJmYykKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2MwNGViNzhlZjEyZDRlNTA5N2E2Mzc4YzE3ZmVjNmM3ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTM4NjE2LCAtMy43MDA5NjY1OTk5OTk5OTk3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2U0MTU2ZjQ0YjEyNGMzOTkxOTdiZGM1YmVhOWJhOWUgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOTgyOTlmMWYwOTNkNDU1M2JlMzU1MWY0NTgxMjY0YWMgPSAkKGA8ZGl2IGlkPSJodG1sXzk4Mjk5ZjFmMDkzZDQ1NTNiZTM1NTFmNDU4MTI2NGFjIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzkzODYxNiwgLTMuNzAwOTY2NTk5OTk5OTk5N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlNDE1NmY0NGIxMjRjMzk5MTk3YmRjNWJlYTliYTllLnNldENvbnRlbnQoaHRtbF85ODI5OWYxZjA5M2Q0NTUzYmUzNTUxZjQ1ODEyNjRhYyk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2MwNGViNzhlZjEyZDRlNTA5N2E2Mzc4YzE3ZmVjNmM3LmJpbmRQb3B1cChwb3B1cF9jZTQxNTZmNDRiMTI0YzM5OTE5N2JkYzViZWE5YmE5ZSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzVjNjI1NGYyODIzZjQzNzk5ODE1MWQ5OTk0NDM2ZTc4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTM3MDcyMDAwMDAwMDUsIC0zLjY1MTY0Nzc5OTk5OTk5OTddLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF83MjkyNWYwZTIxNzQ0ODM5OWQ3MjYwYThkOTQ1Y2RiYiA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF9lNTg3MDg2MTIyZDQ0MGEzOWJlODJjYTM4MzRiZjBkMyA9ICQoYDxkaXYgaWQ9Imh0bWxfZTU4NzA4NjEyMmQ0NDBhMzliZTgyY2EzODM0YmYwZDMiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTM3MDcyMDAwMDAwMDUsIC0zLjY1MTY0Nzc5OTk5OTk5OTddPC9kaXY+YClbMF07CiAgICAgICAgICAgICAgICBwb3B1cF83MjkyNWYwZTIxNzQ0ODM5OWQ3MjYwYThkOTQ1Y2RiYi5zZXRDb250ZW50KGh0bWxfZTU4NzA4NjEyMmQ0NDBhMzliZTgyY2EzODM0YmYwZDMpOwogICAgICAgICAgICAKCiAgICAgICAgICAgIG1hcmtlcl81YzYyNTRmMjgyM2Y0Mzc5OTgxNTFkOTk5NDQzNmU3OC5iaW5kUG9wdXAocG9wdXBfNzI5MjVmMGUyMTc0NDgzOTlkNzI2MGE4ZDk0NWNkYmIpCiAgICAgICAgICAgIDsKCiAgICAgICAgICAgIAogICAgICAgIAogICAgCiAgICAgICAgdmFyIG1hcmtlcl84ZmQ0MWFkYzk2NTI0YWY3YjJlMGYwNzc4YWNkYTQzZCA9IEwubWFya2VyKAogICAgICAgICAgICBbNDAuNTI5ODEwOTk5OTk5OTk1LCAtMy42NDc2NzQyOTk5OTk5OTk0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNmYzOWMxZThkMjQzNDI5MTg1YTNmYTkyZGMyMTU1MDMgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMmJjMzI5YTZlMTRkNDhhMmJiZWNmYzJlM2Y2NjU3YjAgPSAkKGA8ZGl2IGlkPSJodG1sXzJiYzMyOWE2ZTE0ZDQ4YTJiYmVjZmMyZTNmNjY1N2IwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5ODEwOTk5OTk5OTk1LCAtMy42NDc2NzQyOTk5OTk5OTk0XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfNmYzOWMxZThkMjQzNDI5MTg1YTNmYTkyZGMyMTU1MDMuc2V0Q29udGVudChodG1sXzJiYzMyOWE2ZTE0ZDQ4YTJiYmVjZmMyZTNmNjY1N2IwKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfOGZkNDFhZGM5NjUyNGFmN2IyZTBmMDc3OGFjZGE0M2QuYmluZFBvcHVwKHBvcHVwXzZmMzljMWU4ZDI0MzQyOTE4NWEzZmE5MmRjMjE1NTAzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfMDM3MWFlNTgxNDgzNDUzN2JkYmVhODE2Y2E0ZDA5NmEgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxOTMxMzIwMDAwMDAwNSwgLTMuNjM1MjM3Mzk5OTk5OTk5NF0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzBjNTA5ZWNhMGQwNTRlMWViYmQ5ZDE2MjhkZGM5NTUwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzY3ZDU2MmU5NzBkMzRjNGQ5ZTg1OGEyOWVlZWM0ZTE4ID0gJChgPGRpdiBpZD0iaHRtbF82N2Q1NjJlOTcwZDM0YzRkOWU4NThhMjllZWVjNGUxOCIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQxOTMxMzIwMDAwMDAwNSwgLTMuNjM1MjM3Mzk5OTk5OTk5NF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzBjNTA5ZWNhMGQwNTRlMWViYmQ5ZDE2MjhkZGM5NTUwLnNldENvbnRlbnQoaHRtbF82N2Q1NjJlOTcwZDM0YzRkOWU4NThhMjllZWVjNGUxOCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzAzNzFhZTU4MTQ4MzQ1MzdiZGJlYTgxNmNhNGQwOTZhLmJpbmRQb3B1cChwb3B1cF8wYzUwOWVjYTBkMDU0ZTFlYmJkOWQxNjI4ZGRjOTU1MCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2RkYjc2NDVjMDU0MzQ1YTVhOTY3NWIwMjI3ZTZkNmQ0ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40NjE1NTk5LCAtMy42NTk2MTE0XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfOTU3ZTJmZDM5MDdmNDExMTlmYjU0MzhiZmM3MjVkZGQgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfNmY0MDBlMzRkYTBiNGZiMjg1NGU2ZWJlOTAyNDU0NTEgPSAkKGA8ZGl2IGlkPSJodG1sXzZmNDAwZTM0ZGEwYjRmYjI4NTRlNmViZTkwMjQ1NDUxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDYxNTU5OSwgLTMuNjU5NjExNF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzk1N2UyZmQzOTA3ZjQxMTE5ZmI1NDM4YmZjNzI1ZGRkLnNldENvbnRlbnQoaHRtbF82ZjQwMGUzNGRhMGI0ZmIyODU0ZTZlYmU5MDI0NTQ1MSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2RkYjc2NDVjMDU0MzQ1YTVhOTY3NWIwMjI3ZTZkNmQ0LmJpbmRQb3B1cChwb3B1cF85NTdlMmZkMzkwN2Y0MTExOWZiNTQzOGJmYzcyNWRkZCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzk4ZTExODJhNzk2YzRlYjFhN2M3NWFmOTk5ZWE2ZTcwID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41Mjk4MDYzLCAtMy42NDc2NzU0MDAwMDAwMDAyXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZWQ1OWNjNWY2ZTAyNDczYzg3YWJmYjQ1ODVmNzE2MWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfY2E2YzM1Mjg4MzkwNDUyMWJmNWE4YjVkMmY3ZDAxMTkgPSAkKGA8ZGl2IGlkPSJodG1sX2NhNmMzNTI4ODM5MDQ1MjFiZjVhOGI1ZDJmN2QwMTE5IiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTI5ODA2MywgLTMuNjQ3Njc1NDAwMDAwMDAwMl08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2VkNTljYzVmNmUwMjQ3M2M4N2FiZmI0NTg1ZjcxNjFmLnNldENvbnRlbnQoaHRtbF9jYTZjMzUyODgzOTA0NTIxYmY1YThiNWQyZjdkMDExOSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk4ZTExODJhNzk2YzRlYjFhN2M3NWFmOTk5ZWE2ZTcwLmJpbmRQb3B1cChwb3B1cF9lZDU5Y2M1ZjZlMDI0NzNjODdhYmZiNDU4NWY3MTYxZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzc0ZWJmZTY4Y2IzMDQ0N2E5NTMwNmI1YTk0ZGFmMDIyID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTI1NzY2LCAtMy43OTY1OTc1XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfNGJhNmE4MDcwYmRiNDVhNjliNTNhN2JhMDBjODRjMDEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfMzM3NmRlNTUxMjBiNDY1ZWI4NTFkZmYyZDU0OTc0YjAgPSAkKGA8ZGl2IGlkPSJodG1sXzMzNzZkZTU1MTIwYjQ2NWViODUxZGZmMmQ1NDk3NGIwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDEyNTc2NiwgLTMuNzk2NTk3NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzRiYTZhODA3MGJkYjQ1YTY5YjUzYTdiYTAwYzg0YzAxLnNldENvbnRlbnQoaHRtbF8zMzc2ZGU1NTEyMGI0NjVlYjg1MWRmZjJkNTQ5NzRiMCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzc0ZWJmZTY4Y2IzMDQ0N2E5NTMwNmI1YTk0ZGFmMDIyLmJpbmRQb3B1cChwb3B1cF80YmE2YTgwNzBiZGI0NWE2OWI1M2E3YmEwMGM4NGMwMSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzM3MzIwMDBmODZmMDQ5YjNiMDhmYzlmMjczZGQ3ZTI4ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4zOTcwMjUxLCAtMy42NjEzMDU5XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZTg5OWZiMDc5MWY4NDQyZThjYTNmMGUyNDJhYjAwZGEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfOGY1MGRmMWE2MjVhNGIwMmFmMGVjZjVhZWMxNTY4OWIgPSAkKGA8ZGl2IGlkPSJodG1sXzhmNTBkZjFhNjI1YTRiMDJhZjBlY2Y1YWVjMTU2ODliIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMzk3MDI1MSwgLTMuNjYxMzA1OV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2U4OTlmYjA3OTFmODQ0MmU4Y2EzZjBlMjQyYWIwMGRhLnNldENvbnRlbnQoaHRtbF84ZjUwZGYxYTYyNWE0YjAyYWYwZWNmNWFlYzE1Njg5Yik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzM3MzIwMDBmODZmMDQ5YjNiMDhmYzlmMjczZGQ3ZTI4LmJpbmRQb3B1cChwb3B1cF9lODk5ZmIwNzkxZjg0NDJlOGNhM2YwZTI0MmFiMDBkYSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Q1NTdjMjEyOGQ2YTQ1NGNiZTBhODkxYjk1OWQ0MGRjID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC41MzA2NDUxLCAtMy42NDUzNzM3OTk5OTk5OTk4XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfYjUzMTY1MjI1ZjFmNDE2MGJiOGMyOGE3OGQ4MGM0ZWYgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfYjgzZDQ0ZDIxMTA3NDdjNjgyMWVmNjY3YTczMzA3NDAgPSAkKGA8ZGl2IGlkPSJodG1sX2I4M2Q0NGQyMTEwNzQ3YzY4MjFlZjY2N2E3MzMwNzQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNTMwNjQ1MSwgLTMuNjQ1MzczNzk5OTk5OTk5OF08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2I1MzE2NTIyNWYxZjQxNjBiYjhjMjhhNzhkODBjNGVmLnNldENvbnRlbnQoaHRtbF9iODNkNDRkMjExMDc0N2M2ODIxZWY2NjdhNzMzMDc0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Q1NTdjMjEyOGQ2YTQ1NGNiZTBhODkxYjk1OWQ0MGRjLmJpbmRQb3B1cChwb3B1cF9iNTMxNjUyMjVmMWY0MTYwYmI4YzI4YTc4ZDgwYzRlZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyX2Y3YmFiZDhhNjM5ZDQ3ZjRiNzk2OWRhZTc3YmQyZDc2ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MTk2MjMxLCAtMy42MzMzMTgxMDAwMDAwMDAzXSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfZjc3YWIwMWUzZDhhNDlkZWE2NTZhYTcyMzg4MzhlNjEgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZmNhMTkxMDg2OTgxNDkyZjk0ZDhjMjJkYjJmNmQ2NDAgPSAkKGA8ZGl2IGlkPSJodG1sX2ZjYTE5MTA4Njk4MTQ5MmY5NGQ4YzIyZGIyZjZkNjQwIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuNDE5NjIzMSwgLTMuNjMzMzE4MTAwMDAwMDAwM108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2Y3N2FiMDFlM2Q4YTQ5ZGVhNjU2YWE3MjM4ODM4ZTYxLnNldENvbnRlbnQoaHRtbF9mY2ExOTEwODY5ODE0OTJmOTRkOGMyMmRiMmY2ZDY0MCk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyX2Y3YmFiZDhhNjM5ZDQ3ZjRiNzk2OWRhZTc3YmQyZDc2LmJpbmRQb3B1cChwb3B1cF9mNzdhYjAxZTNkOGE0OWRlYTY1NmFhNzIzODgzOGU2MSkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzk4MzI3ZGQxNDg5ZDQxOTlhYzMyOTNjMDE5MWY1OWViID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC4xOTU5ODQ5LCAtNC4xMTUyMjY3XSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWNvbjogbmV3IEwuSWNvbi5EZWZhdWx0KCksCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkuYWRkVG8obWFwX2JlZGNlZTg2ZTQ1MjRiZGM4NzI1ZmE3ZWU5ZWIzYTBiKTsKICAgICAgICAKICAgIAogICAgICAgICAgICB2YXIgcG9wdXBfY2U3MzZlYzY1YWZjNGJmMzg5NzUyOWJlZDNlN2IzM2YgPSBMLnBvcHVwKHttYXhXaWR0aDogJzEwMCUnCiAgICAgICAgICAgIAogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgdmFyIGh0bWxfZDZkNTJmNTg3MTQzNDE5ZWFjYWY0YjI0MDZjZDBlYjEgPSAkKGA8ZGl2IGlkPSJodG1sX2Q2ZDUyZjU4NzE0MzQxOWVhY2FmNGIyNDA2Y2QwZWIxIiBzdHlsZT0id2lkdGg6IDEwMC4wJTsgaGVpZ2h0OiAxMDAuMCU7Ij5bNDAuMTk1OTg0OSwgLTQuMTE1MjI2N108L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwX2NlNzM2ZWM2NWFmYzRiZjM4OTc1MjliZWQzZTdiMzNmLnNldENvbnRlbnQoaHRtbF9kNmQ1MmY1ODcxNDM0MTllYWNhZjRiMjQwNmNkMGViMSk7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzk4MzI3ZGQxNDg5ZDQxOTlhYzMyOTNjMDE5MWY1OWViLmJpbmRQb3B1cChwb3B1cF9jZTczNmVjNjVhZmM0YmYzODk3NTI5YmVkM2U3YjMzZikKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCiAgICAKICAgICAgICB2YXIgbWFya2VyXzIwNWE1OTkxMDA3YzQ2MGRiOWQwNzFiOWYwNmFkNzc1ID0gTC5tYXJrZXIoCiAgICAgICAgICAgIFs0MC40MzQ1MDQ3OTk5OTk5OSwgLTMuNjAzODk4NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzliYmY0YjJiYjFkNjRjOWY4MjQ0Y2YwZmEyMjllNGIzID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzkzYzk2M2M1NjRlODRkMTk4ZWU1YmY0ZmFjNGZmNTc3ID0gJChgPGRpdiBpZD0iaHRtbF85M2M5NjNjNTY0ZTg0ZDE5OGVlNWJmNGZhYzRmZjU3NyIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjQzNDUwNDc5OTk5OTk5LCAtMy42MDM4OTg1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOWJiZjRiMmJiMWQ2NGM5ZjgyNDRjZjBmYTIyOWU0YjMuc2V0Q29udGVudChodG1sXzkzYzk2M2M1NjRlODRkMTk4ZWU1YmY0ZmFjNGZmNTc3KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfMjA1YTU5OTEwMDdjNDYwZGI5ZDA3MWI5ZjA2YWQ3NzUuYmluZFBvcHVwKHBvcHVwXzliYmY0YjJiYjFkNjRjOWY4MjQ0Y2YwZmEyMjllNGIzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNzRlYjI3YzgxOTJjNDFmM2I4ZjgxMzcxY2E0YzkyY2EgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxODQwMzcsIC0zLjYyMTg3MDIwMDAwMDAwMDVdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF9jYzQ2Mjc3NTQwMDE0YTVkYTcwMTE3MGNjZDA4MDlmMCA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF8zYzA2MTFlMThhNzQ0NDhmOTFjMmI2OTZmOTEwMWI5ZSA9ICQoYDxkaXYgaWQ9Imh0bWxfM2MwNjExZTE4YTc0NDQ4ZjkxYzJiNjk2ZjkxMDFiOWUiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTg0MDM3LCAtMy42MjE4NzAyMDAwMDAwMDA1XTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfY2M0NjI3NzU0MDAxNGE1ZGE3MDExNzBjY2QwODA5ZjAuc2V0Q29udGVudChodG1sXzNjMDYxMWUxOGE3NDQ0OGY5MWMyYjY5NmY5MTAxYjllKTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfNzRlYjI3YzgxOTJjNDFmM2I4ZjgxMzcxY2E0YzkyY2EuYmluZFBvcHVwKHBvcHVwX2NjNDYyNzc1NDAwMTRhNWRhNzAxMTcwY2NkMDgwOWYwKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfZjE0OTdiNTIxODZkNGUzMjhkMmRiZGJmY2Y5NDVkNGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjQxNTE5NzUsIC0zLjY1MTA1MDIwMDAwMDAwMDJdLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpY29uOiBuZXcgTC5JY29uLkRlZmF1bHQoKSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKS5hZGRUbyhtYXBfYmVkY2VlODZlNDUyNGJkYzg3MjVmYTdlZTllYjNhMGIpOwogICAgICAgIAogICAgCiAgICAgICAgICAgIHZhciBwb3B1cF84YTY4MGYxOGJhNzQ0Y2JhYTYzMjBlMWVhMjkzYmZjMyA9IEwucG9wdXAoe21heFdpZHRoOiAnMTAwJScKICAgICAgICAgICAgCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2YXIgaHRtbF82Y2I4YmYxY2Y0MDg0MTg1OGNkMGQ0OTI2ZTkyMTVlOCA9ICQoYDxkaXYgaWQ9Imh0bWxfNmNiOGJmMWNmNDA4NDE4NThjZDBkNDkyNmU5MjE1ZTgiIHN0eWxlPSJ3aWR0aDogMTAwLjAlOyBoZWlnaHQ6IDEwMC4wJTsiPls0MC40MTUxOTc1LCAtMy42NTEwNTAyMDAwMDAwMDAyXTwvZGl2PmApWzBdOwogICAgICAgICAgICAgICAgcG9wdXBfOGE2ODBmMThiYTc0NGNiYWE2MzIwZTFlYTI5M2JmYzMuc2V0Q29udGVudChodG1sXzZjYjhiZjFjZjQwODQxODU4Y2QwZDQ5MjZlOTIxNWU4KTsKICAgICAgICAgICAgCgogICAgICAgICAgICBtYXJrZXJfZjE0OTdiNTIxODZkNGUzMjhkMmRiZGJmY2Y5NDVkNGQuYmluZFBvcHVwKHBvcHVwXzhhNjgwZjE4YmE3NDRjYmFhNjMyMGUxZWEyOTNiZmMzKQogICAgICAgICAgICA7CgogICAgICAgICAgICAKICAgICAgICAKICAgIAogICAgICAgIHZhciBtYXJrZXJfNWNmNGVkMWQzNmYxNDZhZjlhZGE4YTQ0ZjY5NmE0NGQgPSBMLm1hcmtlcigKICAgICAgICAgICAgWzQwLjUzMDIxNTAwMDAwMDAwNSwgLTMuNjQxMDk0OTk5OTk5OTk5NV0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGljb246IG5ldyBMLkljb24uRGVmYXVsdCgpLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApLmFkZFRvKG1hcF9iZWRjZWU4NmU0NTI0YmRjODcyNWZhN2VlOWViM2EwYik7CiAgICAgICAgCiAgICAKICAgICAgICAgICAgdmFyIHBvcHVwXzI4ODA4ZTQ5MzgyZTRjZDhhZWI0MWM2NTVhMzQ4ZDEwID0gTC5wb3B1cCh7bWF4V2lkdGg6ICcxMDAlJwogICAgICAgICAgICAKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZhciBodG1sXzVmYmUyNDBkODlkOTRlMjQ5NjQxYTM0OTNkYjljMzVmID0gJChgPGRpdiBpZD0iaHRtbF81ZmJlMjQwZDg5ZDk0ZTI0OTY0MWEzNDkzZGI5YzM1ZiIgc3R5bGU9IndpZHRoOiAxMDAuMCU7IGhlaWdodDogMTAwLjAlOyI+WzQwLjUzMDIxNTAwMDAwMDAwNSwgLTMuNjQxMDk0OTk5OTk5OTk5NV08L2Rpdj5gKVswXTsKICAgICAgICAgICAgICAgIHBvcHVwXzI4ODA4ZTQ5MzgyZTRjZDhhZWI0MWM2NTVhMzQ4ZDEwLnNldENvbnRlbnQoaHRtbF81ZmJlMjQwZDg5ZDk0ZTI0OTY0MWEzNDkzZGI5YzM1Zik7CiAgICAgICAgICAgIAoKICAgICAgICAgICAgbWFya2VyXzVjZjRlZDFkMzZmMTQ2YWY5YWRhOGE0NGY2OTZhNDRkLmJpbmRQb3B1cChwb3B1cF8yODgwOGU0OTM4MmU0Y2Q4YWViNDFjNjU1YTM0OGQxMCkKICAgICAgICAgICAgOwoKICAgICAgICAgICAgCiAgICAgICAgCjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
      ],
      "text/plain": [
       "<folium.folium.Map at 0x12b859b0>"
      ]
     },
     "execution_count": 411,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import folium\n",
    "# build the location list\n",
    "coordinates = freq_locations['Location'].tolist()\n",
    "m = folium.Map(location=list(coordinates[0]), zoom_start=10)\n",
    "for c in coordinates:\n",
    "    c_list = list(c)\n",
    "    folium.Marker(c_list, popup=str(c_list)).add_to(m)\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With the limitations of API and time constriants, we did not manage to references all the address to notable locations. However, we can do some basic searches to get some ideas of the person by manually lookup the top 10 most visited locations. Our results are as followed:\n",
    "1. Calle de Nicolás Salmerón - Sports Club\n",
    "2. Autovía A-1 - Route\n",
    "3. Shango - Cafe\n",
    "4. Calle de Nicolás Salmerón - Residental Area\n",
    "5. Calle de Nicolás Salmerón - Sports Club\n",
    "6. Avenida de Bruselas - Amusement Center\n",
    "7. Sala Bohemia - Music School\n",
    "8. CC-51 - Route close to Gas Station\n",
    "9. Calle de la Caléndula - School Campus\n",
    "10. Avenida de Fuencarral - Holiday Inn Express Madrid\n",
    "\n",
    "Based on these, it should be safe to inference that the person helps people travel to places and live at Calle de Nicolás Salmerón. There is constant visit of a sports Club, so we can assume is a Male. \n",
    "\n",
    "# Future Invetisgation\n",
    "This is as much as we can do so far with this dataset. For the future, we could consider referencing external datasets, such as history taxi or other means of transportation and see if there are correlation to possibly identify the person. However, this dataset still indicate the following information, which could be consider a breach of privacy.\n",
    "1. Perosnal home address is exposed\n",
    "2. Occupation\n",
    "3. General area mobility\n",
    "4. Habits\n",
    "5. Gender\n",
    "With how frequent the android phone keep track of the location data on a daily basis, the data could have the potential to reavel much more info if it gets larger since this is just a month.\n",
    "\n",
    "Next, we will be looking at social network location datasets and try to see if we can find similar info for group of users rather than individuals."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}